From 2f142a31b2843c3802db6bc636365488abd04c52 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Mon, 2 Dec 2024 17:46:48 -0800 Subject: [PATCH 001/280] feat: Add lock around loading agent (#2141) --- letta/server/rest_api/routers/v1/agents.py | 54 ++++++++++------------ letta/server/server.py | 26 +++++++---- letta/services/per_agent_lock_manager.py | 6 +-- letta/utils.py | 7 --- tests/helpers/endpoints_helper.py | 9 ++-- tests/test_cli.py | 2 - tests/test_client.py | 2 +- 7 files changed, 48 insertions(+), 58 deletions(-) diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index 0e749848dc..9e64ea5dfd 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -448,21 +448,18 @@ async def send_message( This endpoint accepts a message from a user and processes it through the agent. """ actor = server.get_user_or_default(user_id=user_id) - - agent_lock = server.per_agent_lock_manager.get_lock(agent_id) - async with agent_lock: - result = await send_message_to_agent( - server=server, - agent_id=agent_id, - user_id=actor.id, - messages=request.messages, - stream_steps=False, - stream_tokens=False, - # Support for AssistantMessage - assistant_message_tool_name=request.assistant_message_tool_name, - assistant_message_tool_kwarg=request.assistant_message_tool_kwarg, - ) - return result + result = await send_message_to_agent( + server=server, + agent_id=agent_id, + user_id=actor.id, + messages=request.messages, + stream_steps=False, + stream_tokens=False, + # Support for AssistantMessage + assistant_message_tool_name=request.assistant_message_tool_name, + assistant_message_tool_kwarg=request.assistant_message_tool_kwarg, + ) + return result @router.post( @@ -490,21 +487,18 @@ async def send_message_streaming( It will stream the steps of the response always, and stream the tokens if 'stream_tokens' is set to True. """ actor = server.get_user_or_default(user_id=user_id) - - agent_lock = server.per_agent_lock_manager.get_lock(agent_id) - async with agent_lock: - result = await send_message_to_agent( - server=server, - agent_id=agent_id, - user_id=actor.id, - messages=request.messages, - stream_steps=True, - stream_tokens=request.stream_tokens, - # Support for AssistantMessage - assistant_message_tool_name=request.assistant_message_tool_name, - assistant_message_tool_kwarg=request.assistant_message_tool_kwarg, - ) - return result + result = await send_message_to_agent( + server=server, + agent_id=agent_id, + user_id=actor.id, + messages=request.messages, + stream_steps=True, + stream_tokens=request.stream_tokens, + # Support for AssistantMessage + assistant_message_tool_name=request.assistant_message_tool_name, + assistant_message_tool_kwarg=request.assistant_message_tool_kwarg, + ) + return result # TODO: move this into server.py? diff --git a/letta/server/server.py b/letta/server/server.py index c8607e7f57..71befe0503 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -372,14 +372,20 @@ def _add_agent(self, user_id: str, agent_id: str, agent_obj: Agent) -> None: def load_agent(self, agent_id: str, interface: Union[AgentInterface, None] = None) -> Agent: """Updated method to load agents from persisted storage""" - agent_state = self.get_agent(agent_id=agent_id) - actor = self.user_manager.get_user_by_id(user_id=agent_state.user_id) + agent_lock = self.per_agent_lock_manager.get_lock(agent_id) + with agent_lock: + agent_state = self.get_agent(agent_id=agent_id) + actor = self.user_manager.get_user_by_id(user_id=agent_state.user_id) + + interface = interface or self.default_interface_factory() + if agent_state.agent_type == AgentType.memgpt_agent: + agent = Agent(agent_state=agent_state, interface=interface, user=actor) + else: + agent = O1Agent(agent_state=agent_state, interface=interface, user=actor) - interface = interface or self.default_interface_factory() - if agent_state.agent_type == AgentType.memgpt_agent: - return Agent(agent_state=agent_state, interface=interface, user=actor) - else: - return O1Agent(agent_state=agent_state, interface=interface, user=actor) + # Persist to agent + save_agent(agent, self.ms) + return agent def _step( self, @@ -1722,7 +1728,7 @@ def link_block_to_agent_memory(self, user_id: str, agent_id: str, block_id: str) self.blocks_agents_manager.add_block_to_agent(agent_id, block_id, block_label=block.label) # get agent memory - memory = self.load_agent(agent_id=agent_id).agent_state.memory + memory = self.get_agent(agent_id=agent_id).memory return memory def unlink_block_from_agent_memory(self, user_id: str, agent_id: str, block_label: str, delete_if_no_ref: bool = True) -> Memory: @@ -1730,7 +1736,7 @@ def unlink_block_from_agent_memory(self, user_id: str, agent_id: str, block_labe self.blocks_agents_manager.remove_block_with_label_from_agent(agent_id=agent_id, block_label=block_label) # get agent memory - memory = self.load_agent(agent_id=agent_id).agent_state.memory + memory = self.get_agent(agent_id=agent_id).memory return memory def update_agent_memory_limit(self, user_id: str, agent_id: str, block_label: str, limit: int) -> Memory: @@ -1740,7 +1746,7 @@ def update_agent_memory_limit(self, user_id: str, agent_id: str, block_label: st block_id=block.id, block_update=BlockUpdate(limit=limit), actor=self.user_manager.get_user_by_id(user_id=user_id) ) # get agent memory - memory = self.load_agent(agent_id=agent_id).agent_state.memory + memory = self.get_agent(agent_id=agent_id).memory return memory def upate_block(self, user_id: str, block_id: str, block_update: BlockUpdate) -> Block: diff --git a/letta/services/per_agent_lock_manager.py b/letta/services/per_agent_lock_manager.py index 53587fc79d..fab3742e28 100644 --- a/letta/services/per_agent_lock_manager.py +++ b/letta/services/per_agent_lock_manager.py @@ -1,4 +1,4 @@ -import asyncio +import threading from collections import defaultdict @@ -6,9 +6,9 @@ class PerAgentLockManager: """Manages per-agent locks.""" def __init__(self): - self.locks = defaultdict(asyncio.Lock) + self.locks = defaultdict(threading.Lock) - def get_lock(self, agent_id: str) -> asyncio.Lock: + def get_lock(self, agent_id: str) -> threading.Lock: """Retrieve the lock for a specific agent_id.""" return self.locks[agent_id] diff --git a/letta/utils.py b/letta/utils.py index a2f65111b9..07a14fc3ff 100644 --- a/letta/utils.py +++ b/letta/utils.py @@ -1015,13 +1015,6 @@ def get_persona_text(name: str, enforce_limit=True): raise ValueError(f"Persona {name}.txt not found") -def get_human_text(name: str): - for file_path in list_human_files(): - file = os.path.basename(file_path) - if f"{name}.txt" == file or name == file: - return open(file_path, "r", encoding="utf-8").read().strip() - - def get_schema_diff(schema_a, schema_b): # Assuming f_schema and linked_function['json_schema'] are your JSON schemas f_schema_json = json_dumps(schema_a) diff --git a/tests/helpers/endpoints_helper.py b/tests/helpers/endpoints_helper.py index 37c2da18be..27c45de786 100644 --- a/tests/helpers/endpoints_helper.py +++ b/tests/helpers/endpoints_helper.py @@ -211,11 +211,10 @@ def check_agent_recall_chat_memory(filename: str) -> LettaResponse: cleanup(client=client, agent_uuid=agent_uuid) human_name = "BananaBoy" - agent_state = setup_agent(client, filename, memory_human_str=f"My name is {human_name}") - - print("MEMORY", agent_state.memory.get_block("human").value) - - response = client.user_message(agent_id=agent_state.id, message="Repeat my name back to me.") + agent_state = setup_agent(client, filename, memory_human_str=f"My name is {human_name}.") + response = client.user_message( + agent_id=agent_state.id, message="Repeat my name back to me. You should search in your human memory block." + ) # Basic checks assert_sanity_checks(response) diff --git a/tests/test_cli.py b/tests/test_cli.py index 32fa1daff2..7b2ffae107 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -77,5 +77,3 @@ def test_letta_run_create_new_agent(swap_letta_config): # Count occurrences of assistant messages robot = full_output.count(ASSISTANT_MESSAGE_CLI_SYMBOL) assert robot == 1, f"It appears that there are multiple instances of assistant messages outputted." - # Make sure the user name was repeated back at least once - assert full_output.count("Chad") > 0, f"Chad was not mentioned...please manually inspect the outputs." diff --git a/tests/test_client.py b/tests/test_client.py index 57fd670e4a..4ccf41ea3b 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -40,7 +40,7 @@ def run_server(): @pytest.fixture( - params=[{"server": True}, {"server": False}], # whether to use REST API server + params=[{"server": False}], # whether to use REST API server scope="module", ) def client(request): From 9417b1162ed68651c596c8b9dd58b4a4b1811ae9 Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Mon, 2 Dec 2024 18:57:04 -0800 Subject: [PATCH 002/280] feat: add POST route for testing tool execution via `tool_id` (#2139) --- letta/schemas/tool.py | 12 +++ letta/server/rest_api/routers/v1/tools.py | 38 ++++++- letta/server/server.py | 110 +++++++++++++++++++- letta/services/tool_execution_sandbox.py | 23 +++-- tests/test_server.py | 116 ++++++++++++++++++++++ 5 files changed, 287 insertions(+), 12 deletions(-) diff --git a/letta/schemas/tool.py b/letta/schemas/tool.py index 6391d2bf59..ff39ed7c1b 100644 --- a/letta/schemas/tool.py +++ b/letta/schemas/tool.py @@ -201,3 +201,15 @@ class ToolUpdate(LettaBase): class Config: extra = "ignore" # Allows extra fields without validation errors # TODO: Remove this, and clean usage of ToolUpdate everywhere else + + +class ToolRun(LettaBase): + id: str = Field(..., description="The ID of the tool to run.") + args: str = Field(..., description="The arguments to pass to the tool (as stringified JSON).") + + +class ToolRunFromSource(LettaBase): + args: str = Field(..., description="The arguments to pass to the tool (as stringified JSON).") + name: Optional[str] = Field(..., description="The name of the tool to run.") + source_code: str = Field(None, description="The source code of the function.") + source_type: Optional[str] = Field(None, description="The type of the source code.") diff --git a/letta/server/rest_api/routers/v1/tools.py b/letta/server/rest_api/routers/v1/tools.py index 41daae83aa..d9e24473a1 100644 --- a/letta/server/rest_api/routers/v1/tools.py +++ b/letta/server/rest_api/routers/v1/tools.py @@ -5,7 +5,8 @@ from letta.errors import LettaToolCreateError from letta.orm.errors import UniqueConstraintViolationError -from letta.schemas.tool import Tool, ToolCreate, ToolUpdate +from letta.schemas.letta_message import FunctionReturn +from letta.schemas.tool import Tool, ToolCreate, ToolRunFromSource, ToolUpdate from letta.server.rest_api.utils import get_letta_server from letta.server.server import SyncServer @@ -159,6 +160,41 @@ def add_base_tools( return server.tool_manager.add_base_tools(actor=actor) +# NOTE: can re-enable if needed +# @router.post("/{tool_id}/run", response_model=FunctionReturn, operation_id="run_tool") +# def run_tool( +# server: SyncServer = Depends(get_letta_server), +# request: ToolRun = Body(...), +# user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present +# ): +# """ +# Run an existing tool on provided arguments +# """ +# actor = server.get_user_or_default(user_id=user_id) + +# return server.run_tool(tool_id=request.tool_id, tool_args=request.tool_args, user_id=actor.id) + + +@router.post("/run", response_model=FunctionReturn, operation_id="run_tool_from_source") +def run_tool_from_source( + server: SyncServer = Depends(get_letta_server), + request: ToolRunFromSource = Body(...), + user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present +): + """ + Attempt to build a tool from source, then run it on the provided arguments + """ + actor = server.get_user_or_default(user_id=user_id) + + return server.run_tool_from_source( + tool_source=request.source_code, + tool_source_type=request.source_type, + tool_args=request.args, + tool_name=request.name, + user_id=actor.id, + ) + + # Specific routes for Composio diff --git a/letta/server/server.py b/letta/server/server.py index 71befe0503..acfb904d35 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -1,4 +1,5 @@ # inspecting tools +import json import os import traceback import warnings @@ -56,7 +57,7 @@ # openai schemas from letta.schemas.enums import JobStatus from letta.schemas.job import Job -from letta.schemas.letta_message import LettaMessage +from letta.schemas.letta_message import FunctionReturn, LettaMessage from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import ( ArchivalMemorySummary, @@ -78,9 +79,10 @@ from letta.services.per_agent_lock_manager import PerAgentLockManager from letta.services.sandbox_config_manager import SandboxConfigManager from letta.services.source_manager import SourceManager +from letta.services.tool_execution_sandbox import ToolExecutionSandbox from letta.services.tool_manager import ToolManager from letta.services.user_manager import UserManager -from letta.utils import create_random_username, json_dumps, json_loads +from letta.utils import create_random_username, get_utc_time, json_dumps, json_loads logger = get_logger(__name__) @@ -1764,6 +1766,110 @@ def get_agent_block_by_label(self, user_id: str, agent_id: str, label: str) -> B return block return None + # def run_tool(self, tool_id: str, tool_args: str, user_id: str) -> FunctionReturn: + # """Run a tool using the sandbox and return the result""" + + # try: + # tool_args_dict = json.loads(tool_args) + # except json.JSONDecodeError: + # raise ValueError("Invalid JSON string for tool_args") + + # # Get the tool by ID + # user = self.user_manager.get_user_by_id(user_id=user_id) + # tool = self.tool_manager.get_tool_by_id(tool_id=tool_id, actor=user) + # if tool.name is None: + # raise ValueError(f"Tool with id {tool_id} does not have a name") + + # # TODO eventually allow using agent state in tools + # agent_state = None + + # try: + # sandbox_run_result = ToolExecutionSandbox(tool.name, tool_args_dict, user_id).run(agent_state=agent_state) + # if sandbox_run_result is None: + # raise ValueError(f"Tool with id {tool_id} returned execution with None") + # function_response = str(sandbox_run_result.func_return) + + # return FunctionReturn( + # id="null", + # function_call_id="null", + # date=get_utc_time(), + # status="success", + # function_return=function_response, + # ) + # except Exception as e: + # # same as agent.py + # from letta.constants import MAX_ERROR_MESSAGE_CHAR_LIMIT + + # error_msg = f"Error executing tool {tool.name}: {e}" + # if len(error_msg) > MAX_ERROR_MESSAGE_CHAR_LIMIT: + # error_msg = error_msg[:MAX_ERROR_MESSAGE_CHAR_LIMIT] + + # return FunctionReturn( + # id="null", + # function_call_id="null", + # date=get_utc_time(), + # status="error", + # function_return=error_msg, + # ) + + def run_tool_from_source( + self, + user_id: str, + tool_args: str, + tool_source: str, + tool_source_type: Optional[str] = None, + tool_name: Optional[str] = None, + ) -> FunctionReturn: + """Run a tool from source code""" + + try: + tool_args_dict = json.loads(tool_args) + except json.JSONDecodeError: + raise ValueError("Invalid JSON string for tool_args") + + if tool_source_type is not None and tool_source_type != "python": + raise ValueError("Only Python source code is supported at this time") + + # NOTE: we're creating a floating Tool object and NOT persiting to DB + tool = Tool( + name=tool_name, + source_code=tool_source, + ) + assert tool.name is not None, "Failed to create tool object" + + # TODO eventually allow using agent state in tools + agent_state = None + + # Next, attempt to run the tool with the sandbox + try: + sandbox_run_result = ToolExecutionSandbox(tool.name, tool_args_dict, user_id, tool_object=tool).run(agent_state=agent_state) + if sandbox_run_result is None: + raise ValueError(f"Tool with id {tool.id} returned execution with None") + function_response = str(sandbox_run_result.func_return) + + return FunctionReturn( + id="null", + function_call_id="null", + date=get_utc_time(), + status="success", + function_return=function_response, + ) + except Exception as e: + # same as agent.py + from letta.constants import MAX_ERROR_MESSAGE_CHAR_LIMIT + + error_msg = f"Error executing tool {tool.name}: {e}" + if len(error_msg) > MAX_ERROR_MESSAGE_CHAR_LIMIT: + error_msg = error_msg[:MAX_ERROR_MESSAGE_CHAR_LIMIT] + + return FunctionReturn( + id="null", + function_call_id="null", + date=get_utc_time(), + status="error", + function_return=error_msg, + ) + # Composio wrappers def get_composio_apps(self) -> List["AppModel"]: """Get a list of all Composio apps with actions""" diff --git a/letta/services/tool_execution_sandbox.py b/letta/services/tool_execution_sandbox.py index c1c489794c..14068715b1 100644 --- a/letta/services/tool_execution_sandbox.py +++ b/letta/services/tool_execution_sandbox.py @@ -11,6 +11,7 @@ from letta.log import get_logger from letta.schemas.agent import AgentState from letta.schemas.sandbox_config import SandboxConfig, SandboxRunResult, SandboxType +from letta.schemas.tool import Tool from letta.services.sandbox_config_manager import SandboxConfigManager from letta.services.tool_manager import ToolManager from letta.services.user_manager import UserManager @@ -27,7 +28,7 @@ class ToolExecutionSandbox: # We make this a long random string to avoid collisions with any variables in the user's code LOCAL_SANDBOX_RESULT_VAR_NAME = "result_ZQqiequkcFwRwwGQMqkt" - def __init__(self, tool_name: str, args: dict, user_id: str, force_recreate=False): + def __init__(self, tool_name: str, args: dict, user_id: str, force_recreate=False, tool_object: Optional[Tool] = None): self.tool_name = tool_name self.args = args @@ -36,14 +37,18 @@ def __init__(self, tool_name: str, args: dict, user_id: str, force_recreate=Fals # agent_state is the state of the agent that invoked this run self.user = UserManager().get_user_by_id(user_id=user_id) - # Get the tool - # TODO: So in theory, it's possible this retrieves a tool not provisioned to the agent - # TODO: That would probably imply that agent_state is incorrectly configured - self.tool = ToolManager().get_tool_by_name(tool_name=tool_name, actor=self.user) - if not self.tool: - raise ValueError( - f"Agent attempted to invoke tool {self.tool_name} that does not exist for organization {self.user.organization_id}" - ) + # If a tool object is provided, we use it directly, otherwise pull via name + if tool_object is not None: + self.tool = tool_object + else: + # Get the tool via name + # TODO: So in theory, it's possible this retrieves a tool not provisioned to the agent + # TODO: That would probably imply that agent_state is incorrectly configured + self.tool = ToolManager().get_tool_by_name(tool_name=tool_name, actor=self.user) + if not self.tool: + raise ValueError( + f"Agent attempted to invoke tool {self.tool_name} that does not exist for organization {self.user.organization_id}" + ) self.sandbox_config_manager = SandboxConfigManager(tool_settings) self.force_recreate = force_recreate diff --git a/tests/test_server.py b/tests/test_server.py index ab36f5553a..43443b235f 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -541,6 +541,122 @@ def test_get_messages_letta_format(server, user_id, agent_id): _test_get_messages_letta_format(server, user_id, agent_id, reverse=reverse) +EXAMPLE_TOOL_SOURCE = ''' +def ingest(message: str): + """ + Ingest a message into the system. + + Args: + message (str): The message to ingest into the system. + + Returns: + str: The result of ingesting the message. + """ + return f"Ingested message {message}" + +''' + + +EXAMPLE_TOOL_SOURCE_WITH_DISTRACTOR = ''' +def util_do_nothing(): + """ + A util function that does nothing. + + Returns: + str: Dummy output. + """ + print("I'm a distractor") + +def ingest(message: str): + """ + Ingest a message into the system. + + Args: + message (str): The message to ingest into the system. + + Returns: + str: The result of ingesting the message. + """ + util_do_nothing() + return f"Ingested message {message}" + +''' + + +def test_tool_run(server, user_id, agent_id): + """Test that the server can run tools""" + + result = server.run_tool_from_source( + user_id=user_id, + tool_source=EXAMPLE_TOOL_SOURCE, + tool_source_type="python", + tool_args=json.dumps({"message": "Hello, world!"}), + # tool_name="ingest", + ) + print(result) + assert result.status == "success" + assert result.function_return == "Ingested message Hello, world!", result.function_return + + result = server.run_tool_from_source( + user_id=user_id, + tool_source=EXAMPLE_TOOL_SOURCE, + tool_source_type="python", + tool_args=json.dumps({"message": "Well well well"}), + # tool_name="ingest", + ) + print(result) + assert result.status == "success" + assert result.function_return == "Ingested message Well well well", result.function_return + + result = server.run_tool_from_source( + user_id=user_id, + tool_source=EXAMPLE_TOOL_SOURCE, + tool_source_type="python", + tool_args=json.dumps({"bad_arg": "oh no"}), + # tool_name="ingest", + ) + print(result) + assert result.status == "error" + assert "Error" in result.function_return, result.function_return + assert "missing 1 required positional argument" in result.function_return, result.function_return + + # Test that we can still pull the tool out by default (pulls that last tool in the source) + result = server.run_tool_from_source( + user_id=user_id, + tool_source=EXAMPLE_TOOL_SOURCE_WITH_DISTRACTOR, + tool_source_type="python", + tool_args=json.dumps({"message": "Well well well"}), + # tool_name="ingest", + ) + print(result) + assert result.status == "success" + assert result.function_return == "Ingested message Well well well", result.function_return + + # Test that we can pull the tool out by name + result = server.run_tool_from_source( + user_id=user_id, + tool_source=EXAMPLE_TOOL_SOURCE_WITH_DISTRACTOR, + tool_source_type="python", + tool_args=json.dumps({"message": "Well well well"}), + tool_name="ingest", + ) + print(result) + assert result.status == "success" + assert result.function_return == "Ingested message Well well well", result.function_return + + # Test that we can pull a different tool out by name + result = server.run_tool_from_source( + user_id=user_id, + tool_source=EXAMPLE_TOOL_SOURCE_WITH_DISTRACTOR, + tool_source_type="python", + tool_args=json.dumps({}), + tool_name="util_do_nothing", + ) + print(result) + assert result.status == "success" + assert result.function_return == str(None), result.function_return + + def test_composio_client_simple(server): apps = server.get_composio_apps() # Assert there's some amount of apps returned From a12e0b7569d4f178df38672958a4730cc7d6113c Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Tue, 3 Dec 2024 16:02:29 -0800 Subject: [PATCH 003/280] feat: pass custom headers to `RESTClient` (#2151) --- letta/client/client.py | 7 ++++++- letta/server/rest_api/routers/v1/sources.py | 9 ++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/letta/client/client.py b/letta/client/client.py index 0bf773c04a..7fecbc2350 100644 --- a/letta/client/client.py +++ b/letta/client/client.py @@ -434,6 +434,7 @@ def __init__( debug: bool = False, default_llm_config: Optional[LLMConfig] = None, default_embedding_config: Optional[EmbeddingConfig] = None, + headers: Optional[Dict] = None, ): """ Initializes a new instance of Client class. @@ -442,12 +443,16 @@ def __init__( auto_save (bool): Whether to automatically save changes. user_id (str): The user ID. debug (bool): Whether to print debug information. - default + default_llm_config (Optional[LLMConfig]): The default LLM configuration. + default_embedding_config (Optional[EmbeddingConfig]): The default embedding configuration. + headers (Optional[Dict]): The additional headers for the REST API. """ super().__init__(debug=debug) self.base_url = base_url self.api_prefix = api_prefix self.headers = {"accept": "application/json", "authorization": f"Bearer {token}"} + if headers: + self.headers.update(headers) self._default_llm_config = default_llm_config self._default_embedding_config = default_embedding_config diff --git a/letta/server/rest_api/routers/v1/sources.py b/letta/server/rest_api/routers/v1/sources.py index 48f05c565a..68a94a9e0f 100644 --- a/letta/server/rest_api/routers/v1/sources.py +++ b/letta/server/rest_api/routers/v1/sources.py @@ -37,7 +37,10 @@ def get_source( """ actor = server.get_user_or_default(user_id=user_id) - return server.source_manager.get_source_by_id(source_id=source_id, actor=actor) + source = server.source_manager.get_source_by_id(source_id=source_id, actor=actor) + if not source: + raise HTTPException(status_code=404, detail=f"Source with id={source_id} not found.") + return source @router.get("/name/{source_name}", response_model=str, operation_id="get_source_id_by_name") @@ -52,6 +55,8 @@ def get_source_id_by_name( actor = server.get_user_or_default(user_id=user_id) source = server.source_manager.get_source_by_name(source_name=source_name, actor=actor) + if not source: + raise HTTPException(status_code=404, detail=f"Source with name={source_name} not found.") return source.id @@ -94,6 +99,8 @@ def update_source( Update the name or documentation of an existing data source. """ actor = server.get_user_or_default(user_id=user_id) + if not server.source_manager.get_source_by_id(source_id=source_id, actor=actor): + raise HTTPException(status_code=404, detail=f"Source with id={source_id} does not exist.") return server.source_manager.update_source(source_id=source_id, source_update=source, actor=actor) From 444f0f1095d7bd67d4138e62db282f342d85287a Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Tue, 3 Dec 2024 16:13:38 -0800 Subject: [PATCH 004/280] fix: patch bug in pydantic request model for `/v1/tools/run` (#2152) --- letta/schemas/tool.py | 4 ++-- letta/server/rest_api/routers/v1/tools.py | 28 +++++++++++++++++------ 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/letta/schemas/tool.py b/letta/schemas/tool.py index ff39ed7c1b..ba84455186 100644 --- a/letta/schemas/tool.py +++ b/letta/schemas/tool.py @@ -209,7 +209,7 @@ class ToolRun(LettaBase): class ToolRunFromSource(LettaBase): + source_code: str = Field(..., description="The source code of the function.") args: str = Field(..., description="The arguments to pass to the tool (as stringified JSON).") - name: Optional[str] = Field(..., description="The name of the tool to run.") - source_code: str = Field(None, description="The source code of the function.") + name: Optional[str] = Field(None, description="The name of the tool to run.") source_type: Optional[str] = Field(None, description="The type of the source code.") diff --git a/letta/server/rest_api/routers/v1/tools.py b/letta/server/rest_api/routers/v1/tools.py index d9e24473a1..c9b60f7855 100644 --- a/letta/server/rest_api/routers/v1/tools.py +++ b/letta/server/rest_api/routers/v1/tools.py @@ -186,13 +186,27 @@ def run_tool_from_source( """ actor = server.get_user_or_default(user_id=user_id) - return server.run_tool_from_source( - tool_source=request.source_code, - tool_source_type=request.source_type, - tool_args=request.args, - tool_name=request.name, - user_id=actor.id, - ) + try: + return server.run_tool_from_source( + tool_source=request.source_code, + tool_source_type=request.source_type, + tool_args=request.args, + tool_name=request.name, + user_id=actor.id, + ) + except LettaToolCreateError as e: + # HTTP 400 == Bad Request + print(f"Error occurred during tool creation: {e}") + # print the full stack trace + import traceback + + print(traceback.format_exc()) + raise HTTPException(status_code=400, detail=str(e)) + + except Exception as e: + # Catch other unexpected errors and raise an internal server error + print(f"Unexpected error occurred: {e}") + raise HTTPException(status_code=500, detail=f"An unexpected error occurred: {str(e)}") # Specific routes for Composio From 600d439a9e10143950542f4e3630961c333e07e9 Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Tue, 3 Dec 2024 19:32:29 -0800 Subject: [PATCH 005/280] chore: added new test to flag stray prints in new PRs (#2155) --- .github/workflows/check_for_new_prints.yml | 57 ++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 .github/workflows/check_for_new_prints.yml diff --git a/.github/workflows/check_for_new_prints.yml b/.github/workflows/check_for_new_prints.yml new file mode 100644 index 0000000000..2ed7ff64cc --- /dev/null +++ b/.github/workflows/check_for_new_prints.yml @@ -0,0 +1,57 @@ +name: Check for new print statements +on: + pull_request: + paths: + - '**.py' + +jobs: + check-print-statements: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.x' + + - name: Check for new print statements + run: | + # Get the files changed in this PR + git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ github.sha }} > changed_files.txt + + # Filter for only Python files + grep "\.py$" changed_files.txt > python_files.txt || true + + # Initialize error flag + ERROR=0 + + # Check each changed Python file + while IFS= read -r file; do + if [ -f "$file" ]; then + echo "Checking $file for new print statements..." + + # Get diff and look for added lines containing print statements + NEW_PRINTS=$(git diff ${{ github.event.pull_request.base.sha }} ${{ github.sha }} "$file" | \ + grep "^+" | \ + grep -v "^+++" | \ + grep "print(" || true) + + if [ ! -z "$NEW_PRINTS" ]; then + echo "❌ Found new print statements in $file:" + echo "$NEW_PRINTS" + ERROR=1 + fi + fi + done < python_files.txt + + # Exit with error if print statements were found + if [ $ERROR -eq 1 ]; then + echo "::error::New print statements were found in the changes" + exit 1 + fi + + echo "✅ No new print statements found" From 86feea2195bf779eacb88d8bd6c919717f65eb24 Mon Sep 17 00:00:00 2001 From: Kevin Lin Date: Tue, 3 Dec 2024 19:37:17 -0800 Subject: [PATCH 006/280] fix: escape strings in sandbox (#2156) Co-authored-by: Sarah Wooders --- letta/services/tool_execution_sandbox.py | 4 +--- tests/integration_test_tool_execution_sandbox.py | 12 ++++++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/letta/services/tool_execution_sandbox.py b/letta/services/tool_execution_sandbox.py index 14068715b1..3cce7f2582 100644 --- a/letta/services/tool_execution_sandbox.py +++ b/letta/services/tool_execution_sandbox.py @@ -287,13 +287,12 @@ def generate_execution_script(self, agent_state: AgentState) -> str: f"{self.LOCAL_SANDBOX_RESULT_VAR_NAME} = base64.b64encode(pickle.dumps({self.LOCAL_SANDBOX_RESULT_VAR_NAME})).decode('utf-8')\n" ) code += f"{self.LOCAL_SANDBOX_RESULT_VAR_NAME}\n" - return code def _convert_param_to_value(self, param_type: str, raw_value: str) -> str: if param_type == "string": - value = '"' + raw_value + '"' + value = "pickle.loads(" + str(pickle.dumps(raw_value)) + ")" elif param_type == "integer" or param_type == "boolean" or param_type == "number": value = raw_value @@ -306,7 +305,6 @@ def _convert_param_to_value(self, param_type: str, raw_value: str) -> str: else: raise TypeError(f"Unsupported type: {param_type}, raw_value={raw_value}") - return str(value) def initialize_param(self, name: str, raw_value: str) -> str: diff --git a/tests/integration_test_tool_execution_sandbox.py b/tests/integration_test_tool_execution_sandbox.py index 1c5dd05f1a..da51f8eca2 100644 --- a/tests/integration_test_tool_execution_sandbox.py +++ b/tests/integration_test_tool_execution_sandbox.py @@ -388,6 +388,18 @@ def test_e2b_sandbox_core_memory_replace(check_e2b_key_is_set, core_memory_repla assert result.func_return is None +@pytest.mark.e2b_sandbox +def test_e2b_sandbox_escape_strings_in_args(check_e2b_key_is_set, core_memory_replace_tool, test_user, agent_state): + new_name = "Matt" + args = {"label": "human", "old_content": "Chad", "new_content": new_name + "\n"} + sandbox = ToolExecutionSandbox(core_memory_replace_tool.name, args, user_id=test_user.id) + + # run the sandbox + result = sandbox.run(agent_state=agent_state) + assert new_name in result.agent_state.memory.get_block("human").value + assert result.func_return is None + + @pytest.mark.e2b_sandbox def test_e2b_sandbox_core_memory_replace_errors(check_e2b_key_is_set, core_memory_replace_tool, test_user, agent_state): nonexistent_name = "Alexander Wang" From 6a24fead8022ab7427729b23da9097ef1c53cba6 Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Tue, 3 Dec 2024 19:37:40 -0800 Subject: [PATCH 007/280] chore: bump version to 0.6.0 (#2153) --- letta/__init__.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/letta/__init__.py b/letta/__init__.py index fa5c1d4bb2..5f1383e918 100644 --- a/letta/__init__.py +++ b/letta/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.5.4" +__version__ = "0.6.0" # import clients from letta.client.client import LocalClient, RESTClient, create_client diff --git a/pyproject.toml b/pyproject.toml index 7b20a73840..1010155bd3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "letta" -version = "0.5.4" +version = "0.6.0" packages = [ {include = "letta"} ] From 247fa2edc45e0e9a9686499db4b3ef3b83398ed5 Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Tue, 3 Dec 2024 19:38:09 -0800 Subject: [PATCH 008/280] fix: fix core memory limits hardcoded (draw from constant instead) (#2157) --- letta/cli/cli.py | 9 +++++++-- letta/schemas/block.py | 7 ++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/letta/cli/cli.py b/letta/cli/cli.py index 4ee55f28d1..8634d071c5 100644 --- a/letta/cli/cli.py +++ b/letta/cli/cli.py @@ -10,7 +10,12 @@ from letta import create_client from letta.agent import Agent, save_agent from letta.config import LettaConfig -from letta.constants import CLI_WARNING_PREFIX, LETTA_DIR, MIN_CONTEXT_WINDOW +from letta.constants import ( + CLI_WARNING_PREFIX, + CORE_MEMORY_BLOCK_CHAR_LIMIT, + LETTA_DIR, + MIN_CONTEXT_WINDOW, +) from letta.local_llm.constants import ASSISTANT_MESSAGE_CLI_SYMBOL from letta.log import get_logger from letta.metadata import MetadataStore @@ -91,7 +96,7 @@ def run( ] = None, core_memory_limit: Annotated[ Optional[int], typer.Option(help="The character limit to each core-memory section (human/persona).") - ] = 2000, + ] = CORE_MEMORY_BLOCK_CHAR_LIMIT, # other first: Annotated[bool, typer.Option(help="Use --first to send the first message in the sequence")] = False, strip_ui: Annotated[bool, typer.Option(help="Remove all the bells and whistles in CLI output (helpful for testing)")] = False, diff --git a/letta/schemas/block.py b/letta/schemas/block.py index b48bdbbce1..25e84b7da6 100644 --- a/letta/schemas/block.py +++ b/letta/schemas/block.py @@ -3,6 +3,7 @@ from pydantic import BaseModel, Field, model_validator from typing_extensions import Self +from letta.constants import CORE_MEMORY_BLOCK_CHAR_LIMIT from letta.schemas.letta_base import LettaBase # block of the LLM context @@ -15,7 +16,7 @@ class BaseBlock(LettaBase, validate_assignment=True): # data value value: str = Field(..., description="Value of the block.") - limit: int = Field(2000, description="Character limit of the block.") + limit: int = Field(CORE_MEMORY_BLOCK_CHAR_LIMIT, description="Character limit of the block.") # template data (optional) template_name: Optional[str] = Field(None, description="Name of the block if it is a template.", alias="name") @@ -117,7 +118,7 @@ class BlockLabelUpdate(BaseModel): class BlockUpdate(BaseBlock): """Update a block""" - limit: Optional[int] = Field(2000, description="Character limit of the block.") + limit: Optional[int] = Field(CORE_MEMORY_BLOCK_CHAR_LIMIT, description="Character limit of the block.") value: Optional[str] = Field(None, description="Value of the block.") class Config: @@ -147,7 +148,7 @@ class CreateBlock(BaseBlock): """Create a block""" label: str = Field(..., description="Label of the block.") - limit: int = Field(2000, description="Character limit of the block.") + limit: int = Field(CORE_MEMORY_BLOCK_CHAR_LIMIT, description="Character limit of the block.") value: str = Field(..., description="Value of the block.") # block templates From 128ec1aac78eff8faaa5b17953489e1ce7531e0a Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Tue, 3 Dec 2024 21:32:00 -0800 Subject: [PATCH 009/280] chore: update lock (#2158) --- poetry.lock | 2122 ++++++++++++++++++++++++------------------------ pyproject.toml | 4 +- 2 files changed, 1042 insertions(+), 1084 deletions(-) diff --git a/poetry.lock b/poetry.lock index 30eddfadbe..fd65dada0b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,98 +2,98 @@ [[package]] name = "aiohappyeyeballs" -version = "2.4.3" +version = "2.4.4" description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.8" files = [ - {file = "aiohappyeyeballs-2.4.3-py3-none-any.whl", hash = "sha256:8a7a83727b2756f394ab2895ea0765a0a8c475e3c71e98d43d76f22b4b435572"}, - {file = "aiohappyeyeballs-2.4.3.tar.gz", hash = "sha256:75cf88a15106a5002a8eb1dab212525c00d1f4c0fa96e551c9fbe6f09a621586"}, + {file = "aiohappyeyeballs-2.4.4-py3-none-any.whl", hash = "sha256:a980909d50efcd44795c4afeca523296716d50cd756ddca6af8c65b996e27de8"}, + {file = "aiohappyeyeballs-2.4.4.tar.gz", hash = "sha256:5fdd7d87889c63183afc18ce9271f9b0a7d32c2303e394468dd45d514a757745"}, ] [[package]] name = "aiohttp" -version = "3.11.7" +version = "3.11.9" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.9" files = [ - {file = "aiohttp-3.11.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8bedb1f6cb919af3b6353921c71281b1491f948ca64408871465d889b4ee1b66"}, - {file = "aiohttp-3.11.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f5022504adab881e2d801a88b748ea63f2a9d130e0b2c430824682a96f6534be"}, - {file = "aiohttp-3.11.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e22d1721c978a6494adc824e0916f9d187fa57baeda34b55140315fa2f740184"}, - {file = "aiohttp-3.11.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e993676c71288618eb07e20622572b1250d8713e7e00ab3aabae28cb70f3640d"}, - {file = "aiohttp-3.11.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e13a05db87d3b241c186d0936808d0e4e12decc267c617d54e9c643807e968b6"}, - {file = "aiohttp-3.11.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ba8d043fed7ffa117024d7ba66fdea011c0e7602327c6d73cacaea38abe4491"}, - {file = "aiohttp-3.11.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dda3ed0a7869d2fa16aa41f9961ade73aa2c2e3b2fcb0a352524e7b744881889"}, - {file = "aiohttp-3.11.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43bfd25113c1e98aec6c70e26d5f4331efbf4aa9037ba9ad88f090853bf64d7f"}, - {file = "aiohttp-3.11.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3dd3e7e7c9ef3e7214f014f1ae260892286647b3cf7c7f1b644a568fd410f8ca"}, - {file = "aiohttp-3.11.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:78c657ece7a73b976905ab9ec8be9ef2df12ed8984c24598a1791c58ce3b4ce4"}, - {file = "aiohttp-3.11.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:db70a47987e34494b451a334605bee57a126fe8d290511349e86810b4be53b01"}, - {file = "aiohttp-3.11.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:9e67531370a3b07e49b280c1f8c2df67985c790ad2834d1b288a2f13cd341c5f"}, - {file = "aiohttp-3.11.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9202f184cc0582b1db15056f2225ab4c1e3dac4d9ade50dd0613ac3c46352ac2"}, - {file = "aiohttp-3.11.7-cp310-cp310-win32.whl", hash = "sha256:2257bdd5cf54a4039a4337162cd8048f05a724380a2283df34620f55d4e29341"}, - {file = "aiohttp-3.11.7-cp310-cp310-win_amd64.whl", hash = "sha256:b7215bf2b53bc6cb35808149980c2ae80a4ae4e273890ac85459c014d5aa60ac"}, - {file = "aiohttp-3.11.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cea52d11e02123f125f9055dfe0ccf1c3857225fb879e4a944fae12989e2aef2"}, - {file = "aiohttp-3.11.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3ce18f703b7298e7f7633efd6a90138d99a3f9a656cb52c1201e76cb5d79cf08"}, - {file = "aiohttp-3.11.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:670847ee6aeb3a569cd7cdfbe0c3bec1d44828bbfbe78c5d305f7f804870ef9e"}, - {file = "aiohttp-3.11.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dda726f89bfa5c465ba45b76515135a3ece0088dfa2da49b8bb278f3bdeea12"}, - {file = "aiohttp-3.11.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25b74a811dba37c7ea6a14d99eb9402d89c8d739d50748a75f3cf994cf19c43"}, - {file = "aiohttp-3.11.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5522ee72f95661e79db691310290c4618b86dff2d9b90baedf343fd7a08bf79"}, - {file = "aiohttp-3.11.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fbf41a6bbc319a7816ae0f0177c265b62f2a59ad301a0e49b395746eb2a9884"}, - {file = "aiohttp-3.11.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59ee1925b5a5efdf6c4e7be51deee93984d0ac14a6897bd521b498b9916f1544"}, - {file = "aiohttp-3.11.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:24054fce8c6d6f33a3e35d1c603ef1b91bbcba73e3f04a22b4f2f27dac59b347"}, - {file = "aiohttp-3.11.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:351849aca2c6f814575c1a485c01c17a4240413f960df1bf9f5deb0003c61a53"}, - {file = "aiohttp-3.11.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:12724f3a211fa243570e601f65a8831372caf1a149d2f1859f68479f07efec3d"}, - {file = "aiohttp-3.11.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:7ea4490360b605804bea8173d2d086b6c379d6bb22ac434de605a9cbce006e7d"}, - {file = "aiohttp-3.11.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e0bf378db07df0a713a1e32381a1b277e62ad106d0dbe17b5479e76ec706d720"}, - {file = "aiohttp-3.11.7-cp311-cp311-win32.whl", hash = "sha256:cd8d62cab363dfe713067027a5adb4907515861f1e4ce63e7be810b83668b847"}, - {file = "aiohttp-3.11.7-cp311-cp311-win_amd64.whl", hash = "sha256:bf0e6cce113596377cadda4e3ac5fb89f095bd492226e46d91b4baef1dd16f60"}, - {file = "aiohttp-3.11.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4bb7493c3e3a36d3012b8564bd0e2783259ddd7ef3a81a74f0dbfa000fce48b7"}, - {file = "aiohttp-3.11.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e143b0ef9cb1a2b4f74f56d4fbe50caa7c2bb93390aff52f9398d21d89bc73ea"}, - {file = "aiohttp-3.11.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f7c58a240260822dc07f6ae32a0293dd5bccd618bb2d0f36d51c5dbd526f89c0"}, - {file = "aiohttp-3.11.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d20cfe63a1c135d26bde8c1d0ea46fd1200884afbc523466d2f1cf517d1fe33"}, - {file = "aiohttp-3.11.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12e4d45847a174f77b2b9919719203769f220058f642b08504cf8b1cf185dacf"}, - {file = "aiohttp-3.11.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf4efa2d01f697a7dbd0509891a286a4af0d86902fc594e20e3b1712c28c0106"}, - {file = "aiohttp-3.11.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee6a4cdcbf54b8083dc9723cdf5f41f722c00db40ccf9ec2616e27869151129"}, - {file = "aiohttp-3.11.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6095aaf852c34f42e1bd0cf0dc32d1e4b48a90bfb5054abdbb9d64b36acadcb"}, - {file = "aiohttp-3.11.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1cf03d27885f8c5ebf3993a220cc84fc66375e1e6e812731f51aab2b2748f4a6"}, - {file = "aiohttp-3.11.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:1a17f6a230f81eb53282503823f59d61dff14fb2a93847bf0399dc8e87817307"}, - {file = "aiohttp-3.11.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:481f10a1a45c5f4c4a578bbd74cff22eb64460a6549819242a87a80788461fba"}, - {file = "aiohttp-3.11.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:db37248535d1ae40735d15bdf26ad43be19e3d93ab3f3dad8507eb0f85bb8124"}, - {file = "aiohttp-3.11.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9d18a8b44ec8502a7fde91446cd9c9b95ce7c49f1eacc1fb2358b8907d4369fd"}, - {file = "aiohttp-3.11.7-cp312-cp312-win32.whl", hash = "sha256:3d1c9c15d3999107cbb9b2d76ca6172e6710a12fda22434ee8bd3f432b7b17e8"}, - {file = "aiohttp-3.11.7-cp312-cp312-win_amd64.whl", hash = "sha256:018f1b04883a12e77e7fc161934c0f298865d3a484aea536a6a2ca8d909f0ba0"}, - {file = "aiohttp-3.11.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:241a6ca732d2766836d62c58c49ca7a93d08251daef0c1e3c850df1d1ca0cbc4"}, - {file = "aiohttp-3.11.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:aa3705a8d14de39898da0fbad920b2a37b7547c3afd2a18b9b81f0223b7d0f68"}, - {file = "aiohttp-3.11.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9acfc7f652b31853eed3b92095b0acf06fd5597eeea42e939bd23a17137679d5"}, - {file = "aiohttp-3.11.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcefcf2915a2dbdbce37e2fc1622129a1918abfe3d06721ce9f6cdac9b6d2eaa"}, - {file = "aiohttp-3.11.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c1f6490dd1862af5aae6cfcf2a274bffa9a5b32a8f5acb519a7ecf5a99a88866"}, - {file = "aiohttp-3.11.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac5462582d6561c1c1708853a9faf612ff4e5ea5e679e99be36143d6eabd8e"}, - {file = "aiohttp-3.11.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c1a6309005acc4b2bcc577ba3b9169fea52638709ffacbd071f3503264620da"}, - {file = "aiohttp-3.11.7-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5b973cce96793725ef63eb449adfb74f99c043c718acb76e0d2a447ae369962"}, - {file = "aiohttp-3.11.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ce91a24aac80de6be8512fb1c4838a9881aa713f44f4e91dd7bb3b34061b497d"}, - {file = "aiohttp-3.11.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:875f7100ce0e74af51d4139495eec4025affa1a605280f23990b6434b81df1bd"}, - {file = "aiohttp-3.11.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c171fc35d3174bbf4787381716564042a4cbc008824d8195eede3d9b938e29a8"}, - {file = "aiohttp-3.11.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ee9afa1b0d2293c46954f47f33e150798ad68b78925e3710044e0d67a9487791"}, - {file = "aiohttp-3.11.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8360c7cc620abb320e1b8d603c39095101391a82b1d0be05fb2225471c9c5c52"}, - {file = "aiohttp-3.11.7-cp313-cp313-win32.whl", hash = "sha256:7a9318da4b4ada9a67c1dd84d1c0834123081e746bee311a16bb449f363d965e"}, - {file = "aiohttp-3.11.7-cp313-cp313-win_amd64.whl", hash = "sha256:fc6da202068e0a268e298d7cd09b6e9f3997736cd9b060e2750963754552a0a9"}, - {file = "aiohttp-3.11.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:17829f37c0d31d89aa6b8b010475a10233774771f9b6dc2cc352ea4f8ce95d9a"}, - {file = "aiohttp-3.11.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d6177077a31b1aecfc3c9070bd2f11419dbb4a70f30f4c65b124714f525c2e48"}, - {file = "aiohttp-3.11.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:badda65ac99555791eed75e234afb94686ed2317670c68bff8a4498acdaee935"}, - {file = "aiohttp-3.11.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0de6466b9d742b4ee56fe1b2440706e225eb48c77c63152b1584864a236e7a50"}, - {file = "aiohttp-3.11.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04b0cc74d5a882c9dacaeeccc1444f0233212b6f5be8bc90833feef1e1ce14b9"}, - {file = "aiohttp-3.11.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c7af3e50e5903d21d7b935aceed901cc2475463bc16ddd5587653548661fdb"}, - {file = "aiohttp-3.11.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c63f898f683d1379b9be5afc3dd139e20b30b0b1e0bf69a3fc3681f364cf1629"}, - {file = "aiohttp-3.11.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fdadc3f6a32d6eca45f9a900a254757fd7855dfb2d8f8dcf0e88f0fae3ff8eb1"}, - {file = "aiohttp-3.11.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d329300fb23e14ed1f8c6d688dfd867d1dcc3b1d7cd49b7f8c5b44e797ce0932"}, - {file = "aiohttp-3.11.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:5578cf40440eafcb054cf859964bc120ab52ebe0e0562d2b898126d868749629"}, - {file = "aiohttp-3.11.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:7b2f8107a3c329789f3c00b2daad0e35f548d0a55cda6291579136622099a46e"}, - {file = "aiohttp-3.11.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:43dd89a6194f6ab02a3fe36b09e42e2df19c211fc2050ce37374d96f39604997"}, - {file = "aiohttp-3.11.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d2fa6fc7cc865d26ff42480ac9b52b8c9b7da30a10a6442a9cdf429de840e949"}, - {file = "aiohttp-3.11.7-cp39-cp39-win32.whl", hash = "sha256:a7d9a606355655617fee25dd7e54d3af50804d002f1fd3118dd6312d26692d70"}, - {file = "aiohttp-3.11.7-cp39-cp39-win_amd64.whl", hash = "sha256:53c921b58fdc6485d6b2603e0132bb01cd59b8f0620ffc0907f525e0ba071687"}, - {file = "aiohttp-3.11.7.tar.gz", hash = "sha256:01a8aca4af3da85cea5c90141d23f4b0eee3cbecfd33b029a45a80f28c66c668"}, + {file = "aiohttp-3.11.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0411777249f25d11bd2964a230b3ffafcbed6cd65d0f2b132bc2b8f5b8c347c7"}, + {file = "aiohttp-3.11.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:499368eb904566fbdf1a3836a1532000ef1308f34a1bcbf36e6351904cced771"}, + {file = "aiohttp-3.11.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0b5a5009b0159a8f707879dc102b139466d8ec6db05103ec1520394fdd8ea02c"}, + {file = "aiohttp-3.11.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:176f8bb8931da0613bb0ed16326d01330066bb1e172dd97e1e02b1c27383277b"}, + {file = "aiohttp-3.11.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6435a66957cdba1a0b16f368bde03ce9c79c57306b39510da6ae5312a1a5b2c1"}, + {file = "aiohttp-3.11.9-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:202f40fb686e5f93908eee0c75d1e6fbe50a43e9bd4909bf3bf4a56b560ca180"}, + {file = "aiohttp-3.11.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39625703540feb50b6b7f938b3856d1f4886d2e585d88274e62b1bd273fae09b"}, + {file = "aiohttp-3.11.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6beeac698671baa558e82fa160be9761cf0eb25861943f4689ecf9000f8ebd0"}, + {file = "aiohttp-3.11.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:96726839a42429318017e67a42cca75d4f0d5248a809b3cc2e125445edd7d50d"}, + {file = "aiohttp-3.11.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3f5461c77649358610fb9694e790956b4238ac5d9e697a17f63619c096469afe"}, + {file = "aiohttp-3.11.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4313f3bc901255b22f01663eeeae167468264fdae0d32c25fc631d5d6e15b502"}, + {file = "aiohttp-3.11.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:d6e274661c74195708fc4380a4ef64298926c5a50bb10fbae3d01627d7a075b7"}, + {file = "aiohttp-3.11.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:db2914de2559809fdbcf3e48f41b17a493b58cb7988d3e211f6b63126c55fe82"}, + {file = "aiohttp-3.11.9-cp310-cp310-win32.whl", hash = "sha256:27935716f8d62c1c73010428db310fd10136002cfc6d52b0ba7bdfa752d26066"}, + {file = "aiohttp-3.11.9-cp310-cp310-win_amd64.whl", hash = "sha256:afbe85b50ade42ddff5669947afde9e8a610e64d2c80be046d67ec4368e555fa"}, + {file = "aiohttp-3.11.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:afcda759a69c6a8be3aae764ec6733155aa4a5ad9aad4f398b52ba4037942fe3"}, + {file = "aiohttp-3.11.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5bba6b83fde4ca233cfda04cbd4685ab88696b0c8eaf76f7148969eab5e248a"}, + {file = "aiohttp-3.11.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:442356e8924fe1a121f8c87866b0ecdc785757fd28924b17c20493961b3d6697"}, + {file = "aiohttp-3.11.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f737fef6e117856400afee4f17774cdea392b28ecf058833f5eca368a18cf1bf"}, + {file = "aiohttp-3.11.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea142255d4901b03f89cb6a94411ecec117786a76fc9ab043af8f51dd50b5313"}, + {file = "aiohttp-3.11.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e1e9e447856e9b7b3d38e1316ae9a8c92e7536ef48373de758ea055edfd5db5"}, + {file = "aiohttp-3.11.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7f6173302f8a329ca5d1ee592af9e628d3ade87816e9958dcf7cdae2841def7"}, + {file = "aiohttp-3.11.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7c6147c6306f537cff59409609508a1d2eff81199f0302dd456bb9e7ea50c39"}, + {file = "aiohttp-3.11.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e9d036a9a41fc78e8a3f10a86c2fc1098fca8fab8715ba9eb999ce4788d35df0"}, + {file = "aiohttp-3.11.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2ac9fd83096df36728da8e2f4488ac3b5602238f602706606f3702f07a13a409"}, + {file = "aiohttp-3.11.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d3108f0ad5c6b6d78eec5273219a5bbd884b4aacec17883ceefaac988850ce6e"}, + {file = "aiohttp-3.11.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:96bbec47beb131bbf4bae05d8ef99ad9e5738f12717cfbbf16648b78b0232e87"}, + {file = "aiohttp-3.11.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:fc726c3fa8f606d07bd2b500e5dc4c0fd664c59be7788a16b9e34352c50b6b6b"}, + {file = "aiohttp-3.11.9-cp311-cp311-win32.whl", hash = "sha256:5720ebbc7a1b46c33a42d489d25d36c64c419f52159485e55589fbec648ea49a"}, + {file = "aiohttp-3.11.9-cp311-cp311-win_amd64.whl", hash = "sha256:17af09d963fa1acd7e4c280e9354aeafd9e3d47eaa4a6bfbd2171ad7da49f0c5"}, + {file = "aiohttp-3.11.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c1f2d7fd583fc79c240094b3e7237d88493814d4b300d013a42726c35a734bc9"}, + {file = "aiohttp-3.11.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d4b8a1b6c7a68c73191f2ebd3bf66f7ce02f9c374e309bdb68ba886bbbf1b938"}, + {file = "aiohttp-3.11.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd3f711f4c99da0091ced41dccdc1bcf8be0281dc314d6d9c6b6cf5df66f37a9"}, + {file = "aiohttp-3.11.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44cb1a1326a0264480a789e6100dc3e07122eb8cd1ad6b784a3d47d13ed1d89c"}, + {file = "aiohttp-3.11.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a7ddf981a0b953ade1c2379052d47ccda2f58ab678fca0671c7c7ca2f67aac2"}, + {file = "aiohttp-3.11.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ffa45cc55b18d4ac1396d1ddb029f139b1d3480f1594130e62bceadf2e1a838"}, + {file = "aiohttp-3.11.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cca505829cdab58c2495ff418c96092d225a1bbd486f79017f6de915580d3c44"}, + {file = "aiohttp-3.11.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44d323aa80a867cb6db6bebb4bbec677c6478e38128847f2c6b0f70eae984d72"}, + {file = "aiohttp-3.11.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b2fab23003c4bb2249729a7290a76c1dda38c438300fdf97d4e42bf78b19c810"}, + {file = "aiohttp-3.11.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:be0c7c98e38a1e3ad7a6ff64af8b6d6db34bf5a41b1478e24c3c74d9e7f8ed42"}, + {file = "aiohttp-3.11.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5cc5e0d069c56645446c45a4b5010d4b33ac6c5ebfd369a791b5f097e46a3c08"}, + {file = "aiohttp-3.11.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9bcf97b971289be69638d8b1b616f7e557e1342debc7fc86cf89d3f08960e411"}, + {file = "aiohttp-3.11.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c7333e7239415076d1418dbfb7fa4df48f3a5b00f8fdf854fca549080455bc14"}, + {file = "aiohttp-3.11.9-cp312-cp312-win32.whl", hash = "sha256:9384b07cfd3045b37b05ed002d1c255db02fb96506ad65f0f9b776b762a7572e"}, + {file = "aiohttp-3.11.9-cp312-cp312-win_amd64.whl", hash = "sha256:f5252ba8b43906f206048fa569debf2cd0da0316e8d5b4d25abe53307f573941"}, + {file = "aiohttp-3.11.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:282e0a7ddd36ebc411f156aeaa0491e8fe7f030e2a95da532cf0c84b0b70bc66"}, + {file = "aiohttp-3.11.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ebd3e6b0c7d4954cca59d241970011f8d3327633d555051c430bd09ff49dc494"}, + {file = "aiohttp-3.11.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:30f9f89ae625d412043f12ca3771b2ccec227cc93b93bb1f994db6e1af40a7d3"}, + {file = "aiohttp-3.11.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a3b5b2c012d70c63d9d13c57ed1603709a4d9d7d473e4a9dfece0e4ea3d5f51"}, + {file = "aiohttp-3.11.9-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ef1550bb5f55f71b97a6a395286db07f7f2c01c8890e613556df9a51da91e8d"}, + {file = "aiohttp-3.11.9-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:317251b9c9a2f1a9ff9cd093775b34c6861d1d7df9439ce3d32a88c275c995cd"}, + {file = "aiohttp-3.11.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21cbe97839b009826a61b143d3ca4964c8590d7aed33d6118125e5b71691ca46"}, + {file = "aiohttp-3.11.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:618b18c3a2360ac940a5503da14fa4f880c5b9bc315ec20a830357bcc62e6bae"}, + {file = "aiohttp-3.11.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a0cf4d814689e58f57ecd5d8c523e6538417ca2e72ff52c007c64065cef50fb2"}, + {file = "aiohttp-3.11.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:15c4e489942d987d5dac0ba39e5772dcbed4cc9ae3710d1025d5ba95e4a5349c"}, + {file = "aiohttp-3.11.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ec8df0ff5a911c6d21957a9182402aad7bf060eaeffd77c9ea1c16aecab5adbf"}, + {file = "aiohttp-3.11.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ed95d66745f53e129e935ad726167d3a6cb18c5d33df3165974d54742c373868"}, + {file = "aiohttp-3.11.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:647ec5bee7e4ec9f1034ab48173b5fa970d9a991e565549b965e93331f1328fe"}, + {file = "aiohttp-3.11.9-cp313-cp313-win32.whl", hash = "sha256:ef2c9499b7bd1e24e473dc1a85de55d72fd084eea3d8bdeec7ee0720decb54fa"}, + {file = "aiohttp-3.11.9-cp313-cp313-win_amd64.whl", hash = "sha256:84de955314aa5e8d469b00b14d6d714b008087a0222b0f743e7ffac34ef56aff"}, + {file = "aiohttp-3.11.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e738aabff3586091221044b7a584865ddc4d6120346d12e28e788307cd731043"}, + {file = "aiohttp-3.11.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:28f29bce89c3b401a53d6fd4bee401ee943083bf2bdc12ef297c1d63155070b0"}, + {file = "aiohttp-3.11.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31de2f10f63f96cc19e04bd2df9549559beadd0b2ee2da24a17e7ed877ca8c60"}, + {file = "aiohttp-3.11.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f31cebd8c27a36af6c7346055ac564946e562080ee1a838da724585c67474f"}, + {file = "aiohttp-3.11.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0bcb7f6976dc0b6b56efde13294862adf68dd48854111b422a336fa729a82ea6"}, + {file = "aiohttp-3.11.9-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8b13b9950d8b2f8f58b6e5842c4b842b5887e2c32e3f4644d6642f1659a530"}, + {file = "aiohttp-3.11.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9c23e62f3545c2216100603614f9e019e41b9403c47dd85b8e7e5015bf1bde0"}, + {file = "aiohttp-3.11.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec656680fc53a13f849c71afd0c84a55c536206d524cbc831cde80abbe80489e"}, + {file = "aiohttp-3.11.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:36df00e0541f264ce42d62280281541a47474dfda500bc5b7f24f70a7f87be7a"}, + {file = "aiohttp-3.11.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:8dcfd14c712aa9dd18049280bfb2f95700ff6a8bde645e09f17c3ed3f05a0130"}, + {file = "aiohttp-3.11.9-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:14624d96f0d69cf451deed3173079a68c322279be6030208b045ab77e1e8d550"}, + {file = "aiohttp-3.11.9-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4b01d9cfcb616eeb6d40f02e66bebfe7b06d9f2ef81641fdd50b8dd981166e0b"}, + {file = "aiohttp-3.11.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:928f92f80e2e8d6567b87d3316c1fd9860ccfe36e87a9a7f5237d4cda8baa1ba"}, + {file = "aiohttp-3.11.9-cp39-cp39-win32.whl", hash = "sha256:c8a02f74ae419e3955af60f570d83187423e42e672a6433c5e292f1d23619269"}, + {file = "aiohttp-3.11.9-cp39-cp39-win_amd64.whl", hash = "sha256:0a97d657f6cf8782a830bb476c13f7d777cfcab8428ac49dde15c22babceb361"}, + {file = "aiohttp-3.11.9.tar.gz", hash = "sha256:a9266644064779840feec0e34f10a89b3ff1d2d6b751fe90017abcad1864fa7c"}, ] [package.dependencies] @@ -215,21 +215,18 @@ files = [ [[package]] name = "asttokens" -version = "2.4.1" +version = "3.0.0" description = "Annotate AST trees with source code positions" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, - {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, + {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, + {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, ] -[package.dependencies] -six = ">=1.12.0" - [package.extras] -astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] -test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] +astroid = ["astroid (>=2,<4)"] +test = ["astroid (>=2,<4)", "pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "async-timeout" @@ -887,13 +884,13 @@ test = ["pytest"] [[package]] name = "composio-core" -version = "0.5.44" +version = "0.5.50" description = "Core package to act as a bridge between composio platform and other services." optional = false python-versions = "<4,>=3.9" files = [ - {file = "composio_core-0.5.44-py3-none-any.whl", hash = "sha256:bb125794035a3c3c98dab1e72b45024068019c5eb3f29b9cc4eafc845320774b"}, - {file = "composio_core-0.5.44.tar.gz", hash = "sha256:94a323891853bb90d912d82dd7ba69509b14a5055d5c00530e4018ec9f824df3"}, + {file = "composio_core-0.5.50-py3-none-any.whl", hash = "sha256:405d7884992a916a706cc29a795d3cf79b8b3c51bb3f30f202a1ca97f8e6b5ae"}, + {file = "composio_core-0.5.50.tar.gz", hash = "sha256:45eb33117ecce4292e13af1b6dc7ed51ec04870669591bc35dd8551c9823c17e"}, ] [package.dependencies] @@ -923,17 +920,17 @@ tools = ["diskcache", "flake8", "networkx", "pathspec", "pygments", "ruff", "tra [[package]] name = "composio-langchain" -version = "0.5.44" +version = "0.5.50" description = "Use Composio to get an array of tools with your LangChain agent." optional = false python-versions = "<4,>=3.9" files = [ - {file = "composio_langchain-0.5.44-py3-none-any.whl", hash = "sha256:4cb05d5b92faea32bc02c04e49b5dfae5858abe2f6469a81c673d7f754402375"}, - {file = "composio_langchain-0.5.44.tar.gz", hash = "sha256:5d88240d90366589ccf32c07485e3fe6cb8b48a9abf417ac5d3b61c8f5ee2803"}, + {file = "composio_langchain-0.5.50-py3-none-any.whl", hash = "sha256:14091593ca594978714bc97c3e065519daf42740f6963f4554e9193482e8eeab"}, + {file = "composio_langchain-0.5.50.tar.gz", hash = "sha256:f1b74739860d1dde76e99c57961df63629ccd9fe6f4f71d667a51e8af915f3ab"}, ] [package.dependencies] -composio_core = ">=0.5.40,<=0.5.44" +composio_core = ">=0.5.40,<=0.5.50" langchain = ">=0.1.0" langchain-openai = ">=0.0.2.post1" langchainhub = ">=0.1.15" @@ -956,51 +953,53 @@ yaml = ["PyYAML"] [[package]] name = "cryptography" -version = "43.0.3" +version = "44.0.0" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false -python-versions = ">=3.7" -files = [ - {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, - {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, - {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f"}, - {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6"}, - {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18"}, - {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd"}, - {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73"}, - {file = "cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2"}, - {file = "cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd"}, - {file = "cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984"}, - {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5"}, - {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4"}, - {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7"}, - {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405"}, - {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16"}, - {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73"}, - {file = "cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995"}, - {file = "cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362"}, - {file = "cryptography-43.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c"}, - {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3"}, - {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83"}, - {file = "cryptography-43.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7"}, - {file = "cryptography-43.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664"}, - {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08"}, - {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa"}, - {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, - {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, +python-versions = "!=3.9.0,!=3.9.1,>=3.7" +files = [ + {file = "cryptography-44.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123"}, + {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092"}, + {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f"}, + {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb"}, + {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b"}, + {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543"}, + {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:60eb32934076fa07e4316b7b2742fa52cbb190b42c2df2863dbc4230a0a9b385"}, + {file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e"}, + {file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e"}, + {file = "cryptography-44.0.0-cp37-abi3-win32.whl", hash = "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053"}, + {file = "cryptography-44.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:abc998e0c0eee3c8a1904221d3f67dcfa76422b23620173e28c11d3e626c21bd"}, + {file = "cryptography-44.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:660cb7312a08bc38be15b696462fa7cc7cd85c3ed9c576e81f4dc4d8b2b31591"}, + {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1923cb251c04be85eec9fda837661c67c1049063305d6be5721643c22dd4e2b7"}, + {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc"}, + {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289"}, + {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7"}, + {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c"}, + {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9abcc2e083cbe8dde89124a47e5e53ec38751f0d7dfd36801008f316a127d7ba"}, + {file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64"}, + {file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285"}, + {file = "cryptography-44.0.0-cp39-abi3-win32.whl", hash = "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417"}, + {file = "cryptography-44.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede"}, + {file = "cryptography-44.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:37d76e6863da3774cd9db5b409a9ecfd2c71c981c38788d3fcfaf177f447b731"}, + {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:f677e1268c4e23420c3acade68fac427fffcb8d19d7df95ed7ad17cdef8404f4"}, + {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f5e7cb1e5e56ca0933b4873c0220a78b773b24d40d186b6738080b73d3d0a756"}, + {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:8b3e6eae66cf54701ee7d9c83c30ac0a1e3fa17be486033000f2a73a12ab507c"}, + {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:be4ce505894d15d5c5037167ffb7f0ae90b7be6f2a98f9a5c3442395501c32fa"}, + {file = "cryptography-44.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:62901fb618f74d7d81bf408c8719e9ec14d863086efe4185afd07c352aee1d2c"}, + {file = "cryptography-44.0.0.tar.gz", hash = "sha256:cd4e834f340b4293430701e772ec543b0fbe6c2dea510a5286fe0acabe153a02"}, ] [package.dependencies] cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} [package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] -nox = ["nox"] -pep8test = ["check-sdist", "click", "mypy", "ruff"] -sdist = ["build"] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0)"] +docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] +nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2)"] +pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] +sdist = ["build (>=1.0.0)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "cryptography-vectors (==43.0.3)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi (>=2024)", "cryptography-vectors (==44.0.0)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] test-randomorder = ["pytest-randomly"] [[package]] @@ -1250,13 +1249,13 @@ files = [ [[package]] name = "e2b" -version = "1.0.3" +version = "1.0.4" description = "E2B SDK that give agents cloud environments" optional = true python-versions = "<4.0,>=3.8" files = [ - {file = "e2b-1.0.3-py3-none-any.whl", hash = "sha256:7e087a94e0b6bc86fd330815dfb3312f0cc365d4f080f5ff1a6335f3f65426de"}, - {file = "e2b-1.0.3.tar.gz", hash = "sha256:767233663eadf78462b02eb3fa75d0993800309a43e65eaff40686843d26ecf8"}, + {file = "e2b-1.0.4-py3-none-any.whl", hash = "sha256:1a9c765eb1b2cc291c5ebd3f2e268f8fba9471a12f470f4651395b5753730170"}, + {file = "e2b-1.0.4.tar.gz", hash = "sha256:5ed3db4f984e52cf3aabb717725493ff060a8374b7c878b31bceeff46a0b5648"}, ] [package.dependencies] @@ -1266,21 +1265,22 @@ httpx = ">=0.27.0,<0.28.0" packaging = ">=24.1" protobuf = ">=3.20.0,<6.0.0" python-dateutil = ">=2.8.2" +typing-extensions = ">=4.1.0" [[package]] name = "e2b-code-interpreter" -version = "1.0.1" +version = "1.0.2" description = "E2B Code Interpreter - Stateful code execution" optional = true python-versions = "<4.0,>=3.8" files = [ - {file = "e2b_code_interpreter-1.0.1-py3-none-any.whl", hash = "sha256:e27c40174ba7daac4942388611a73e1ac58300227f0ba6c0555ee54507d4944c"}, - {file = "e2b_code_interpreter-1.0.1.tar.gz", hash = "sha256:b0c061e41315d21514affe78f80052be335b687204e669dd7ca852b59eeaaea2"}, + {file = "e2b_code_interpreter-1.0.2-py3-none-any.whl", hash = "sha256:02f2786a094550be8b96093c7cfcae9ff24cbeddb4dff76f3c2e6c4d06d4ba86"}, + {file = "e2b_code_interpreter-1.0.2.tar.gz", hash = "sha256:b2a173209205bc0fce09a90b145cd6c739ff6130d9ec850bdc38e70c1b666f67"}, ] [package.dependencies] attrs = ">=21.3.0" -e2b = ">=1.0.0,<2.0.0" +e2b = ">=1.0.4,<2.0.0" httpx = ">=0.20.0,<0.28.0" [[package]] @@ -1683,74 +1683,89 @@ test = ["cffi (>=1.17.1)", "coverage (>=5.0)", "dnspython (>=1.16.0,<2.0)", "idn [[package]] name = "geventhttpclient" -version = "2.3.1" +version = "2.3.3" description = "HTTP client library for gevent" optional = true python-versions = ">=3.9" files = [ - {file = "geventhttpclient-2.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:da22ab7bf5af4ba3d07cffee6de448b42696e53e7ac1fe97ed289037733bf1c2"}, - {file = "geventhttpclient-2.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2399e3d4e2fae8bbd91756189da6e9d84adf8f3eaace5eef0667874a705a29f8"}, - {file = "geventhttpclient-2.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3e33e87d0d5b9f5782c4e6d3cb7e3592fea41af52713137d04776df7646d71b"}, - {file = "geventhttpclient-2.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c071db313866c3d0510feb6c0f40ec086ccf7e4a845701b6316c82c06e8b9b29"}, - {file = "geventhttpclient-2.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f36f0c6ef88a27e60af8369d9c2189fe372c6f2943182a7568e0f2ad33bb69f1"}, - {file = "geventhttpclient-2.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4624843c03a5337282a42247d987c2531193e57255ee307b36eeb4f243a0c21"}, - {file = "geventhttpclient-2.3.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d614573621ba827c417786057e1e20e9f96c4f6b3878c55b1b7b54e1026693bc"}, - {file = "geventhttpclient-2.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5d51330a40ac9762879d0e296c279c1beae8cfa6484bb196ac829242c416b709"}, - {file = "geventhttpclient-2.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bc9f2162d4e8cb86bb5322d99bfd552088a3eacd540a841298f06bb8bc1f1f03"}, - {file = "geventhttpclient-2.3.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:06e59d3397e63c65ecc7a7561a5289f0cf2e2c2252e29632741e792f57f5d124"}, - {file = "geventhttpclient-2.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4436eef515b3e0c1d4a453ae32e047290e780a623c1eddb11026ae9d5fb03d42"}, - {file = "geventhttpclient-2.3.1-cp310-cp310-win32.whl", hash = "sha256:5d1cf7d8a4f8e15cc8fd7d88ac4cdb058d6274203a42587e594cc9f0850ac862"}, - {file = "geventhttpclient-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:4deaebc121036f7ea95430c2d0f80ab085b15280e6ab677a6360b70e57020e7f"}, - {file = "geventhttpclient-2.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0ae055b9ce1704f2ce72c0847df28f4e14dbb3eea79256cda6c909d82688ea3"}, - {file = "geventhttpclient-2.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f087af2ac439495b5388841d6f3c4de8d2573ca9870593d78f7b554aa5cfa7f5"}, - {file = "geventhttpclient-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:76c367d175810facfe56281e516c9a5a4a191eff76641faaa30aa33882ed4b2f"}, - {file = "geventhttpclient-2.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a58376d0d461fe0322ff2ad362553b437daee1eeb92b4c0e3b1ffef9e77defbe"}, - {file = "geventhttpclient-2.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f440cc704f8a9869848a109b2c401805c17c070539b2014e7b884ecfc8591e33"}, - {file = "geventhttpclient-2.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f10c62994f9052f23948c19de930b2d1f063240462c8bd7077c2b3290e61f4fa"}, - {file = "geventhttpclient-2.3.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52c45d9f3dd9627844c12e9ca347258c7be585bed54046336220e25ea6eac155"}, - {file = "geventhttpclient-2.3.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:77c1a2c6e3854bf87cd5588b95174640c8a881716bd07fa0d131d082270a6795"}, - {file = "geventhttpclient-2.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ce649d4e25c2d56023471df0bf1e8e2ab67dfe4ff12ce3e8fe7e6fae30cd672a"}, - {file = "geventhttpclient-2.3.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:265d9f31b4ac8f688eebef0bd4c814ffb37a16f769ad0c8c8b8c24a84db8eab5"}, - {file = "geventhttpclient-2.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2de436a9d61dae877e4e811fb3e2594e2a1df1b18f4280878f318aef48a562b9"}, - {file = "geventhttpclient-2.3.1-cp311-cp311-win32.whl", hash = "sha256:83e22178b9480b0a95edf0053d4f30b717d0b696b3c262beabe6964d9c5224b1"}, - {file = "geventhttpclient-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:97b072a282233384c1302a7dee88ad8bfedc916f06b1bc1da54f84980f1406a9"}, - {file = "geventhttpclient-2.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e1c90abcc2735cd8dd2d2572a13da32f6625392dc04862decb5c6476a3ddee22"}, - {file = "geventhttpclient-2.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5deb41c2f51247b4e568c14964f59d7b8e537eff51900564c88af3200004e678"}, - {file = "geventhttpclient-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c6f1a56a66a90c4beae2f009b5e9d42db9a58ced165aa35441ace04d69cb7b37"}, - {file = "geventhttpclient-2.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ee6e741849c29e3129b1ec3828ac3a5e5dcb043402f852ea92c52334fb8cabf"}, - {file = "geventhttpclient-2.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0d0972096a63b1ddaa73fa3dab2c7a136e3ab8bf7999a2f85a5dee851fa77cdd"}, - {file = "geventhttpclient-2.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00675ba682fb7d19d659c14686fa8a52a65e3f301b56c2a4ee6333b380dd9467"}, - {file = "geventhttpclient-2.3.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea77b67c186df90473416f4403839728f70ef6cf1689cec97b4f6bbde392a8a8"}, - {file = "geventhttpclient-2.3.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ddcc3f0fdffd9a3801e1005b73026202cffed8199863fdef9315bea9a860a032"}, - {file = "geventhttpclient-2.3.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:c9f1ef4ec048563cc621a47ff01a4f10048ff8b676d7a4d75e5433ed8e703e56"}, - {file = "geventhttpclient-2.3.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:a364b30bec7a0a00dbe256e2b6807e4dc866bead7ac84aaa51ca5e2c3d15c258"}, - {file = "geventhttpclient-2.3.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:25d255383d3d6a6fbd643bb51ae1a7e4f6f7b0dbd5f3225b537d0bd0432eaf39"}, - {file = "geventhttpclient-2.3.1-cp312-cp312-win32.whl", hash = "sha256:ad0b507e354d2f398186dcb12fe526d0594e7c9387b514fb843f7a14fdf1729a"}, - {file = "geventhttpclient-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:7924e0883bc2b177cfe27aa65af6bb9dd57f3e26905c7675a2d1f3ef69df7cca"}, - {file = "geventhttpclient-2.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fe912c6456faab196b952adcd63e9353a0d5c8deb31c8d733d38f4f0ab22e359"}, - {file = "geventhttpclient-2.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8b599359779c2278018786c35d70664d441a7cd0d6baef2b2cd0d1685cf478ed"}, - {file = "geventhttpclient-2.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:34107b506e2c40ec7784efa282469bf86888cacddced463dceeb58c201834897"}, - {file = "geventhttpclient-2.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc34031905b2b31a80d88cd33d7e42b81812950e5304860ab6a65ee2803e2046"}, - {file = "geventhttpclient-2.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50b54f67ba2087f4d9d2172065c5c5de0f0c7f865ac350116e5452de4be31444"}, - {file = "geventhttpclient-2.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ddeb431836c2ef7fd33c505a06180dc907b474e0e8537a43ff12e12c9bf0307"}, - {file = "geventhttpclient-2.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4890713433ca19b081f70b5f7ad258a0979ec3354f9538b50b3ad7d0a86f88de"}, - {file = "geventhttpclient-2.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b8ca7dcbe94cb563341087b00b6fbd0fdd70b2acc1b5d963f9ebbfbc1e5e2893"}, - {file = "geventhttpclient-2.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05a1bbdd43ae36bcc10b3dbfa0806aefc5033a91efecfddfe56159446a46ea71"}, - {file = "geventhttpclient-2.3.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f82c454595a88a5e510ae0985711ef398386998b6f37d90fc30e9ff1a2001280"}, - {file = "geventhttpclient-2.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b032a5cdb1721921f4cd36aad620af318263b462962cfb23d648cdb93aab232"}, - {file = "geventhttpclient-2.3.1-cp39-cp39-win32.whl", hash = "sha256:ce2c7d18bac7ffdacc4a86cd490bea6136a7d1e1170f8624f2e3bbe3b189d5b8"}, - {file = "geventhttpclient-2.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:6ca50dd9761971d3557b897108933b34fb4a11533d52f0f2753840c740a2861a"}, - {file = "geventhttpclient-2.3.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c31431e38df45b3c79bf3c9427c796adb8263d622bc6fa25e2f6ba916c2aad93"}, - {file = "geventhttpclient-2.3.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:855ab1e145575769b180b57accb0573a77cd6a7392f40a6ef7bc9a4926ebd77b"}, - {file = "geventhttpclient-2.3.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a374aad77c01539e786d0c7829bec2eba034ccd45733c1bf9811ad18d2a8ecd"}, - {file = "geventhttpclient-2.3.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66c1e97460608304f400485ac099736fff3566d3d8db2038533d466f8cf5de5a"}, - {file = "geventhttpclient-2.3.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4f843f81ee44ba4c553a1b3f73115e0ad8f00044023c24db29f5b1df3da08465"}, - {file = "geventhttpclient-2.3.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:321b73c73d73b85cfeff36b9b5ee04174ec8406fb3dadc129558a26ccb879360"}, - {file = "geventhttpclient-2.3.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:829d03c2a140edbe74ad1fb4f850384f585f3e06fc47cfe647d065412b93926f"}, - {file = "geventhttpclient-2.3.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:994c543f156db7bce3bae15491a0e041eeb3f1cf467e0d1db0c161a900a90bec"}, - {file = "geventhttpclient-2.3.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4beff505306aa9da5cdfe2f206b403ec7c8d06a22d6b7248365772858c4ee8c"}, - {file = "geventhttpclient-2.3.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fb0a9673074541ccda09a2423fa16f4528819ceb1ba19d252213f6aca7d4b44a"}, - {file = "geventhttpclient-2.3.1.tar.gz", hash = "sha256:b40ddac8517c456818942c7812f555f84702105c82783238c9fcb8dc12675185"}, + {file = "geventhttpclient-2.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d61cad95f80d5bd599e28933c187b3c4eeb0b2f6306e06fa0edcac5c9c4bac0a"}, + {file = "geventhttpclient-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7a00e130577c0cf9749d1143e71543c50c7103321b7f37afc42782ad1d3c0ef7"}, + {file = "geventhttpclient-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:14664f4a2d0296d6be5b65b6e57627987e0c2ecffd0ae6d7f9160bf119e8d728"}, + {file = "geventhttpclient-2.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8fdfcf45166cecdade78d3dcb9c7615793269fa3d2d7fea328fe007bd87d84c6"}, + {file = "geventhttpclient-2.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35a6de7088ad69ba1561deaf854bf34c78a0eee33027b24aa7c44cdbe840b1d8"}, + {file = "geventhttpclient-2.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:61b34527938e3ab477ecc90ec6bcde9780468722abececf548cbae89e4cd9d0b"}, + {file = "geventhttpclient-2.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b366bf38dd5335868a2ea077091af707c1111f70ee4cc8aa60dc14f56928158e"}, + {file = "geventhttpclient-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1fbfeea0242f30b9bfd2e982fc82aa2977eeef17e2526a681f7e8e1e37b2569a"}, + {file = "geventhttpclient-2.3.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f584fa36981b8a93799c63226a3deb385d1cc4f19eacd5dd6c696da0ecb4cca6"}, + {file = "geventhttpclient-2.3.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:b29e1383725d99e583e8ad125cfa820b8368ae7cfad642167bca869f55c4b000"}, + {file = "geventhttpclient-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c02e50baf4589c7b35db0f96fae7f3bd7e2dfbed2e1a2c1a0aa5696b91dff889"}, + {file = "geventhttpclient-2.3.3-cp310-cp310-win32.whl", hash = "sha256:5865be94cf03aa219ff4d6fe3a01be798f1205d7d9611e51e75f2606c7c9ae35"}, + {file = "geventhttpclient-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:53033fc1aac51b7513858662d8e17f44aa05207c3772d69fb1a07e2c5a2e45e4"}, + {file = "geventhttpclient-2.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0b1a60f810896a3e59a0e1036aa8fc31478e1ec0dd3faac7a771dd3d956580ce"}, + {file = "geventhttpclient-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:452c3c2c15830fc0be7ea76c6d98f49df0a94327fbdd63822a840ad3125796dc"}, + {file = "geventhttpclient-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:947e4f511e45abcc24fc982cee6042d14dc765d1a9ebd3c660cb93714002f950"}, + {file = "geventhttpclient-2.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6dea544c829894366cfaa4d36a2014557a99f8769c9dd7b8fbf9b607126e04a"}, + {file = "geventhttpclient-2.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b5eba36ea0ad819386e3850a71a42af53e6b9be86d4605d6ded061503573928"}, + {file = "geventhttpclient-2.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a96e96b63ddcea3d25f62b204aafb523782ff0fcf45b38eb596f8ae4a0f17326"}, + {file = "geventhttpclient-2.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:386f0c9215958b9c974031fdbaa84002b4291b67bfe6dc5833cfb6e28083bb95"}, + {file = "geventhttpclient-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2209e77a101ae67d3355d506f65257908f1eb41db74f765b01cb191e4a5160d5"}, + {file = "geventhttpclient-2.3.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6552c4d91c38007824f43a13fbbf4c615b7c6abe94fc2d482752ea91d976e140"}, + {file = "geventhttpclient-2.3.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e4b503183be80a1fb027eb5582413ca2be60356a7cf8eb9d49b913703f4ecd93"}, + {file = "geventhttpclient-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c8831f3ff03c11f64ad3b306883a8b064ef75f16a9f6a85cd105286023fba030"}, + {file = "geventhttpclient-2.3.3-cp311-cp311-win32.whl", hash = "sha256:aa56b2b0477b4b9c325251c1672d29762d08c5d2ad8d9e5db0b8279872e0030d"}, + {file = "geventhttpclient-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:566d7fb431d416bfb0cc431ec74062858133ee94b5001e32f9607a9433cc1e4f"}, + {file = "geventhttpclient-2.3.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1ad896af16ffa276620f4f555ef057fe11a2aa6af21dc0136600d0b7738e67ae"}, + {file = "geventhttpclient-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:caf12944df25318a8c5b4deebc35ac94951562da154f039712ae3cde40ec5d95"}, + {file = "geventhttpclient-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c2586f3c2602cde0c3e5345813c0ab461142d1522667436b04d8a7dd7e7576c8"}, + {file = "geventhttpclient-2.3.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0248bbc2ff430dc2bec89e44715e4a38c7f2097ad2a133ca190f74fee51e5ef"}, + {file = "geventhttpclient-2.3.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:493d5deb230e28fdd8d0d0f8e7addb4e7b9761e6a1115ea72f22b231835e546b"}, + {file = "geventhttpclient-2.3.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:acccefebf3b1cc81f90d384dd17c1b3b58deee5ea1891025ef409307a22036b6"}, + {file = "geventhttpclient-2.3.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aadaabe9267aacec88912ae5ac84b232e16a0ed12c5256559637f4b74aa510e8"}, + {file = "geventhttpclient-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c16830c9cad42c50f87e939f8065dc922010bbcbfb801fa12fd74d091dae7bef"}, + {file = "geventhttpclient-2.3.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d686ce9ad28ddcb36b7748a59e64e2d8acfaa0145f0817becace36b1cfa4e5c6"}, + {file = "geventhttpclient-2.3.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:98bfa7cf5b6246b28e05a72505211b60a6ecb63c934dd70b806e662869b009f6"}, + {file = "geventhttpclient-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dc77b39246ba5d2484567100377f100e4aa50b6b8849d3e547d68dc0138087dd"}, + {file = "geventhttpclient-2.3.3-cp312-cp312-win32.whl", hash = "sha256:032b4c519b5e7022c9563dbc7d1fac21ededb49f9e46ff2a9c44d1095747d2ea"}, + {file = "geventhttpclient-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:cf1051cc18521cd0819d3d69d930a4de916fb6f62be829b675481ca47e960765"}, + {file = "geventhttpclient-2.3.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e5a14dd4e3504f05fc9febaedcb7cc91222da7176a6a9a2e703ab0cd85444016"}, + {file = "geventhttpclient-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4d6ae4ce130bf91cbdbab951b39a5faeb82b50f37a027afaac1cc956b344cc5d"}, + {file = "geventhttpclient-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f16cf2fd71e6b77e6153a66aae282da00958b43345879e222605a3a7556e3a"}, + {file = "geventhttpclient-2.3.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50c62dbe5f43c9e0ee43f872de44aebf4968695d90804d71fc1bf32b827fae16"}, + {file = "geventhttpclient-2.3.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d3a52ee992488ff087a3ec99d0076541ba1b07464c8eac22ad1a7778860bc345"}, + {file = "geventhttpclient-2.3.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52450392f3b9d32563c685013ba30b028f948612ebb9b1bfd6ba4ae113d985dc"}, + {file = "geventhttpclient-2.3.3-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1642c8b3042b675a5b7ad67bce9611415d7bce0cf0380c0be52b7e5f55bc3e8"}, + {file = "geventhttpclient-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a36145c0b34d3c0e8c0c4a9d2e6d6f2b9f382c12e698fadb6a646a9b320a6c69"}, + {file = "geventhttpclient-2.3.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:49512144af09fb2438a3e14e14863e7556434be3676efdaa0379198ce38bf1e2"}, + {file = "geventhttpclient-2.3.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:8b78a8e5ff3c06dfee63b8457740c1d7d2f0687f85ded76dfca2b25f52200a1c"}, + {file = "geventhttpclient-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8bba80efc5c95e94641dc3e9864ab37829111a4e90bdf2ef08b1206c7a89dd94"}, + {file = "geventhttpclient-2.3.3-cp313-cp313-win32.whl", hash = "sha256:4a942448e77c01286edc4c29c22575d701d0639d42d0061b37025e118129372a"}, + {file = "geventhttpclient-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:b1ee31fed440029e20c99c89e49a0f983b771e7529db81fab33d942193036c41"}, + {file = "geventhttpclient-2.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0e30bb1f0e754720ecbacf353db054ba1c3fa01d6016d00978eeed60b066703b"}, + {file = "geventhttpclient-2.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:72011601bcd0952a8f4188893307dc0263f96e967126bc4df2e15d2f74fa4622"}, + {file = "geventhttpclient-2.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12354718a63e2314c6dd1a6cd4d65cb0db7423062fb0aaaf1dee258cfa51e795"}, + {file = "geventhttpclient-2.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bbab6fef671cc7268cd54f9d018a703542ec767998da0164bb61eb789f8d069"}, + {file = "geventhttpclient-2.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34622d675af26d9289d6bd5f03721cedc01db3ed99e1244360b48c73228d113c"}, + {file = "geventhttpclient-2.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:795ad495865fc535ceb19908c5b0b468d6ccf94b44c3c3229cae85616da400ab"}, + {file = "geventhttpclient-2.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fbaedf4227f3691bc9e1080f42ebdf1b4131fc5aa09b00ed3934626197a9fbe"}, + {file = "geventhttpclient-2.3.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f062f4120661c25cc87b7cbec1c4b27e83f618604d1403e950191835b999a61a"}, + {file = "geventhttpclient-2.3.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0d99d09fc20e91902a7b81000d4b819c4da1d5911b2452e948bffd00dbd3722e"}, + {file = "geventhttpclient-2.3.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:aafdd67e7c4163f0245e1785c1dc42b2f4fdaacae1f28c68758f06010335f93c"}, + {file = "geventhttpclient-2.3.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:36f9a4c93eb8927376c995cc91857a1e94dd4a68a0c459870adb11799ceea75d"}, + {file = "geventhttpclient-2.3.3-cp39-cp39-win32.whl", hash = "sha256:a4d4f777a9b55d6babbf5525623ad74e543e6fbb86bc3305bf24d80fcc0190dc"}, + {file = "geventhttpclient-2.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:f5724370d95ce9753846ff90d7805a11f7981d9dc579e3a229fa594cb401da98"}, + {file = "geventhttpclient-2.3.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a8519b9aacad25696a220c1217047d5277403df96cb8aa8e9a5ec5271798cb87"}, + {file = "geventhttpclient-2.3.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:cbfcb54ee015aa38c8e9eb3bb4be68f88fbce6cbf90f716fc3ffc5f49892f721"}, + {file = "geventhttpclient-2.3.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e9c4f27d48ce4da6dde530aea00e8d427965ace0801fe3d7c4739e167c10de"}, + {file = "geventhttpclient-2.3.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:447fc2d49a41449684154c12c03ab80176a413e9810d974363a061b71bdbf5a0"}, + {file = "geventhttpclient-2.3.3-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4598c2aa14c866a10a07a2944e2c212f53d0c337ce211336ad68ae8243646216"}, + {file = "geventhttpclient-2.3.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:69d2bd7ab7f94a6c73325f4b88fd07b0d5f4865672ed7a519f2d896949353761"}, + {file = "geventhttpclient-2.3.3-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7a3182f1457599c2901c48a1def37a5bc4762f696077e186e2050fcc60b2fbdf"}, + {file = "geventhttpclient-2.3.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:86b489238dc2cbfa53cdd5621e888786a53031d327e0a8509529c7568292b0ce"}, + {file = "geventhttpclient-2.3.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4c8aca6ab5da4211870c1d8410c699a9d543e86304aac47e1558ec94d0da97a"}, + {file = "geventhttpclient-2.3.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29fe3b6523efa8cdcb5e9bad379f9055e4f0ebb914e4dcd8a0ca33b003b402f5"}, + {file = "geventhttpclient-2.3.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e32313c833dfbe27d3f66feacac667ae937859dbbd58e25d1172329c8b368426"}, + {file = "geventhttpclient-2.3.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4fc1d824602d9590a2b88ac14cfe6d2ecc357e91472ecfe719973c40aab25f4e"}, + {file = "geventhttpclient-2.3.3.tar.gz", hash = "sha256:3e74c1570d01dd09cabdfe2667fbf072520ec9bb3a31a0fd1eae3d0f43847f9b"}, ] [package.dependencies] @@ -2173,13 +2188,13 @@ files = [ [[package]] name = "huggingface-hub" -version = "0.26.2" +version = "0.26.3" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.26.2-py3-none-any.whl", hash = "sha256:98c2a5a8e786c7b2cb6fdeb2740893cba4d53e312572ed3d8afafda65b128c46"}, - {file = "huggingface_hub-0.26.2.tar.gz", hash = "sha256:b100d853465d965733964d123939ba287da60a547087783ddff8a323f340332b"}, + {file = "huggingface_hub-0.26.3-py3-none-any.whl", hash = "sha256:e66aa99e569c2d5419240a9e553ad07245a5b1300350bfbc5a4945cf7432991b"}, + {file = "huggingface_hub-0.26.3.tar.gz", hash = "sha256:90e1fe62ffc26757a073aaad618422b899ccf9447c2bba8c902a90bef5b42e1d"}, ] [package.dependencies] @@ -2232,13 +2247,13 @@ files = [ [[package]] name = "identify" -version = "2.6.2" +version = "2.6.3" description = "File identification library for Python" optional = true python-versions = ">=3.9" files = [ - {file = "identify-2.6.2-py2.py3-none-any.whl", hash = "sha256:c097384259f49e372f4ea00a19719d95ae27dd5ff0fd77ad630aa891306b82f3"}, - {file = "identify-2.6.2.tar.gz", hash = "sha256:fab5c716c24d7a789775228823797296a2994b075fb6080ac83a102772a98cbd"}, + {file = "identify-2.6.3-py2.py3-none-any.whl", hash = "sha256:9edba65473324c2ea9684b1f944fe3191db3345e50b6d04571d10ed164f8d7bd"}, + {file = "identify-2.6.3.tar.gz", hash = "sha256:62f5dae9b5fef52c84cc188514e9ea4f3f636b1d8799ab5ebc475471f9e47a02"}, ] [package.extras] @@ -2470,84 +2485,86 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jiter" -version = "0.7.1" +version = "0.8.0" description = "Fast iterable JSON parser." optional = false python-versions = ">=3.8" files = [ - {file = "jiter-0.7.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:262e96d06696b673fad6f257e6a0abb6e873dc22818ca0e0600f4a1189eb334f"}, - {file = "jiter-0.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be6de02939aac5be97eb437f45cfd279b1dc9de358b13ea6e040e63a3221c40d"}, - {file = "jiter-0.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935f10b802bc1ce2b2f61843e498c7720aa7f4e4bb7797aa8121eab017293c3d"}, - {file = "jiter-0.7.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9cd3cccccabf5064e4bb3099c87bf67db94f805c1e62d1aefd2b7476e90e0ee2"}, - {file = "jiter-0.7.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4aa919ebfc5f7b027cc368fe3964c0015e1963b92e1db382419dadb098a05192"}, - {file = "jiter-0.7.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ae2d01e82c94491ce4d6f461a837f63b6c4e6dd5bb082553a70c509034ff3d4"}, - {file = "jiter-0.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f9568cd66dbbdab67ae1b4c99f3f7da1228c5682d65913e3f5f95586b3cb9a9"}, - {file = "jiter-0.7.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9ecbf4e20ec2c26512736284dc1a3f8ed79b6ca7188e3b99032757ad48db97dc"}, - {file = "jiter-0.7.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b1a0508fddc70ce00b872e463b387d49308ef02b0787992ca471c8d4ba1c0fa1"}, - {file = "jiter-0.7.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f84c9996664c460f24213ff1e5881530abd8fafd82058d39af3682d5fd2d6316"}, - {file = "jiter-0.7.1-cp310-none-win32.whl", hash = "sha256:c915e1a1960976ba4dfe06551ea87063b2d5b4d30759012210099e712a414d9f"}, - {file = "jiter-0.7.1-cp310-none-win_amd64.whl", hash = "sha256:75bf3b7fdc5c0faa6ffffcf8028a1f974d126bac86d96490d1b51b3210aa0f3f"}, - {file = "jiter-0.7.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ad04a23a91f3d10d69d6c87a5f4471b61c2c5cd6e112e85136594a02043f462c"}, - {file = "jiter-0.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e47a554de88dff701226bb5722b7f1b6bccd0b98f1748459b7e56acac2707a5"}, - {file = "jiter-0.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e44fff69c814a2e96a20b4ecee3e2365e9b15cf5fe4e00869d18396daa91dab"}, - {file = "jiter-0.7.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df0a1d05081541b45743c965436f8b5a1048d6fd726e4a030113a2699a6046ea"}, - {file = "jiter-0.7.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f22cf8f236a645cb6d8ffe2a64edb5d2b66fb148bf7c75eea0cb36d17014a7bc"}, - {file = "jiter-0.7.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da8589f50b728ea4bf22e0632eefa125c8aa9c38ed202a5ee6ca371f05eeb3ff"}, - {file = "jiter-0.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f20de711224f2ca2dbb166a8d512f6ff48c9c38cc06b51f796520eb4722cc2ce"}, - {file = "jiter-0.7.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8a9803396032117b85ec8cbf008a54590644a062fedd0425cbdb95e4b2b60479"}, - {file = "jiter-0.7.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3d8bae77c82741032e9d89a4026479061aba6e646de3bf5f2fc1ae2bbd9d06e0"}, - {file = "jiter-0.7.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3dc9939e576bbc68c813fc82f6620353ed68c194c7bcf3d58dc822591ec12490"}, - {file = "jiter-0.7.1-cp311-none-win32.whl", hash = "sha256:f7605d24cd6fab156ec89e7924578e21604feee9c4f1e9da34d8b67f63e54892"}, - {file = "jiter-0.7.1-cp311-none-win_amd64.whl", hash = "sha256:f3ea649e7751a1a29ea5ecc03c4ada0a833846c59c6da75d747899f9b48b7282"}, - {file = "jiter-0.7.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ad36a1155cbd92e7a084a568f7dc6023497df781adf2390c345dd77a120905ca"}, - {file = "jiter-0.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7ba52e6aaed2dc5c81a3d9b5e4ab95b039c4592c66ac973879ba57c3506492bb"}, - {file = "jiter-0.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b7de0b6f6728b678540c7927587e23f715284596724be203af952418acb8a2d"}, - {file = "jiter-0.7.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9463b62bd53c2fb85529c700c6a3beb2ee54fde8bef714b150601616dcb184a6"}, - {file = "jiter-0.7.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:627164ec01d28af56e1f549da84caf0fe06da3880ebc7b7ee1ca15df106ae172"}, - {file = "jiter-0.7.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25d0e5bf64e368b0aa9e0a559c3ab2f9b67e35fe7269e8a0d81f48bbd10e8963"}, - {file = "jiter-0.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c244261306f08f8008b3087059601997016549cb8bb23cf4317a4827f07b7d74"}, - {file = "jiter-0.7.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ded4e4b75b68b843b7cea5cd7c55f738c20e1394c68c2cb10adb655526c5f1b"}, - {file = "jiter-0.7.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:80dae4f1889b9d09e5f4de6b58c490d9c8ce7730e35e0b8643ab62b1538f095c"}, - {file = "jiter-0.7.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5970cf8ec943b51bce7f4b98d2e1ed3ada170c2a789e2db3cb484486591a176a"}, - {file = "jiter-0.7.1-cp312-none-win32.whl", hash = "sha256:701d90220d6ecb3125d46853c8ca8a5bc158de8c49af60fd706475a49fee157e"}, - {file = "jiter-0.7.1-cp312-none-win_amd64.whl", hash = "sha256:7824c3ecf9ecf3321c37f4e4d4411aad49c666ee5bc2a937071bdd80917e4533"}, - {file = "jiter-0.7.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:097676a37778ba3c80cb53f34abd6943ceb0848263c21bf423ae98b090f6c6ba"}, - {file = "jiter-0.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3298af506d4271257c0a8f48668b0f47048d69351675dd8500f22420d4eec378"}, - {file = "jiter-0.7.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12fd88cfe6067e2199964839c19bd2b422ca3fd792949b8f44bb8a4e7d21946a"}, - {file = "jiter-0.7.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dacca921efcd21939123c8ea8883a54b9fa7f6545c8019ffcf4f762985b6d0c8"}, - {file = "jiter-0.7.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de3674a5fe1f6713a746d25ad9c32cd32fadc824e64b9d6159b3b34fd9134143"}, - {file = "jiter-0.7.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65df9dbae6d67e0788a05b4bad5706ad40f6f911e0137eb416b9eead6ba6f044"}, - {file = "jiter-0.7.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ba9a358d59a0a55cccaa4957e6ae10b1a25ffdabda863c0343c51817610501d"}, - {file = "jiter-0.7.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:576eb0f0c6207e9ede2b11ec01d9c2182973986514f9c60bc3b3b5d5798c8f50"}, - {file = "jiter-0.7.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:e550e29cdf3577d2c970a18f3959e6b8646fd60ef1b0507e5947dc73703b5627"}, - {file = "jiter-0.7.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:81d968dbf3ce0db2e0e4dec6b0a0d5d94f846ee84caf779b07cab49f5325ae43"}, - {file = "jiter-0.7.1-cp313-none-win32.whl", hash = "sha256:f892e547e6e79a1506eb571a676cf2f480a4533675f834e9ae98de84f9b941ac"}, - {file = "jiter-0.7.1-cp313-none-win_amd64.whl", hash = "sha256:0302f0940b1455b2a7fb0409b8d5b31183db70d2b07fd177906d83bf941385d1"}, - {file = "jiter-0.7.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c65a3ce72b679958b79d556473f192a4dfc5895e8cc1030c9f4e434690906076"}, - {file = "jiter-0.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e80052d3db39f9bb8eb86d207a1be3d9ecee5e05fdec31380817f9609ad38e60"}, - {file = "jiter-0.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70a497859c4f3f7acd71c8bd89a6f9cf753ebacacf5e3e799138b8e1843084e3"}, - {file = "jiter-0.7.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c1288bc22b9e36854a0536ba83666c3b1fb066b811019d7b682c9cf0269cdf9f"}, - {file = "jiter-0.7.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b096ca72dd38ef35675e1d3b01785874315182243ef7aea9752cb62266ad516f"}, - {file = "jiter-0.7.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8dbbd52c50b605af13dbee1a08373c520e6fcc6b5d32f17738875847fea4e2cd"}, - {file = "jiter-0.7.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af29c5c6eb2517e71ffa15c7ae9509fa5e833ec2a99319ac88cc271eca865519"}, - {file = "jiter-0.7.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f114a4df1e40c03c0efbf974b376ed57756a1141eb27d04baee0680c5af3d424"}, - {file = "jiter-0.7.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:191fbaee7cf46a9dd9b817547bf556facde50f83199d07fc48ebeff4082f9df4"}, - {file = "jiter-0.7.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0e2b445e5ee627fb4ee6bbceeb486251e60a0c881a8e12398dfdff47c56f0723"}, - {file = "jiter-0.7.1-cp38-none-win32.whl", hash = "sha256:47ac4c3cf8135c83e64755b7276339b26cd3c7ddadf9e67306ace4832b283edf"}, - {file = "jiter-0.7.1-cp38-none-win_amd64.whl", hash = "sha256:60b49c245cd90cde4794f5c30f123ee06ccf42fb8730a019a2870cd005653ebd"}, - {file = "jiter-0.7.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:8f212eeacc7203256f526f550d105d8efa24605828382cd7d296b703181ff11d"}, - {file = "jiter-0.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d9e247079d88c00e75e297e6cb3a18a039ebcd79fefc43be9ba4eb7fb43eb726"}, - {file = "jiter-0.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0aacaa56360139c53dcf352992b0331f4057a0373bbffd43f64ba0c32d2d155"}, - {file = "jiter-0.7.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc1b55314ca97dbb6c48d9144323896e9c1a25d41c65bcb9550b3e0c270ca560"}, - {file = "jiter-0.7.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f281aae41b47e90deb70e7386558e877a8e62e1693e0086f37d015fa1c102289"}, - {file = "jiter-0.7.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:93c20d2730a84d43f7c0b6fb2579dc54335db742a59cf9776d0b80e99d587382"}, - {file = "jiter-0.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e81ccccd8069110e150613496deafa10da2f6ff322a707cbec2b0d52a87b9671"}, - {file = "jiter-0.7.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0a7d5e85766eff4c9be481d77e2226b4c259999cb6862ccac5ef6621d3c8dcce"}, - {file = "jiter-0.7.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f52ce5799df5b6975439ecb16b1e879d7655e1685b6e3758c9b1b97696313bfb"}, - {file = "jiter-0.7.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e0c91a0304373fdf97d56f88356a010bba442e6d995eb7773cbe32885b71cdd8"}, - {file = "jiter-0.7.1-cp39-none-win32.whl", hash = "sha256:5c08adf93e41ce2755970e8aa95262298afe2bf58897fb9653c47cd93c3c6cdc"}, - {file = "jiter-0.7.1-cp39-none-win_amd64.whl", hash = "sha256:6592f4067c74176e5f369228fb2995ed01400c9e8e1225fb73417183a5e635f0"}, - {file = "jiter-0.7.1.tar.gz", hash = "sha256:448cf4f74f7363c34cdef26214da527e8eeffd88ba06d0b80b485ad0667baf5d"}, + {file = "jiter-0.8.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:dee4eeb293ffcd2c3b31ebab684dbf7f7b71fe198f8eddcdf3a042cc6e10205a"}, + {file = "jiter-0.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aad1e6e9b01cf0304dcee14db03e92e0073287a6297caf5caf2e9dbfea16a924"}, + {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:504099fb7acdbe763e10690d560a25d4aee03d918d6a063f3a761d8a09fb833f"}, + {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2373487caad7fe39581f588ab5c9262fc1ade078d448626fec93f4ffba528858"}, + {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c341ecc3f9bccde952898b0c97c24f75b84b56a7e2f8bbc7c8e38cab0875a027"}, + {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e48e7a336529b9419d299b70c358d4ebf99b8f4b847ed3f1000ec9f320e8c0c"}, + {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5ee157a8afd2943be690db679f82fafb8d347a8342e8b9c34863de30c538d55"}, + {file = "jiter-0.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d7dceae3549b80087f913aad4acc2a7c1e0ab7cb983effd78bdc9c41cabdcf18"}, + {file = "jiter-0.8.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e29e9ecce53d396772590438214cac4ab89776f5e60bd30601f1050b34464019"}, + {file = "jiter-0.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fa1782f22d5f92c620153133f35a9a395d3f3823374bceddd3e7032e2fdfa0b1"}, + {file = "jiter-0.8.0-cp310-none-win32.whl", hash = "sha256:f754ef13b4e4f67a3bf59fe974ef4342523801c48bf422f720bd37a02a360584"}, + {file = "jiter-0.8.0-cp310-none-win_amd64.whl", hash = "sha256:796f750b65f5d605f5e7acaccc6b051675e60c41d7ac3eab40dbd7b5b81a290f"}, + {file = "jiter-0.8.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f6f4e645efd96b4690b9b6091dbd4e0fa2885ba5c57a0305c1916b75b4f30ff6"}, + {file = "jiter-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f61cf6d93c1ade9b8245c9f14b7900feadb0b7899dbe4aa8de268b705647df81"}, + {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0396bc5cb1309c6dab085e70bb3913cdd92218315e47b44afe9eace68ee8adaa"}, + {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62d0e42ec5dc772bd8554a304358220be5d97d721c4648b23f3a9c01ccc2cb26"}, + {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec4b711989860705733fc59fb8c41b2def97041cea656b37cf6c8ea8dee1c3f4"}, + {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:859cc35bf304ab066d88f10a44a3251a9cd057fb11ec23e00be22206db878f4f"}, + {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5000195921aa293b39b9b5bc959d7fa658e7f18f938c0e52732da8e3cc70a278"}, + {file = "jiter-0.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36050284c0abde57aba34964d3920f3d6228211b65df7187059bb7c7f143759a"}, + {file = "jiter-0.8.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a88f608e050cfe45c48d771e86ecdbf5258314c883c986d4217cc79e1fb5f689"}, + {file = "jiter-0.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:646cf4237665b2e13b4159d8f26d53f59bc9f2e6e135e3a508a2e5dd26d978c6"}, + {file = "jiter-0.8.0-cp311-none-win32.whl", hash = "sha256:21fe5b8345db1b3023052b2ade9bb4d369417827242892051244af8fae8ba231"}, + {file = "jiter-0.8.0-cp311-none-win_amd64.whl", hash = "sha256:30c2161c5493acf6b6c3c909973fb64ae863747def01cc7574f3954e0a15042c"}, + {file = "jiter-0.8.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d91a52d8f49ada2672a4b808a0c5c25d28f320a2c9ca690e30ebd561eb5a1002"}, + {file = "jiter-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c38cf25cf7862f61410b7a49684d34eb3b5bcbd7ddaf4773eea40e0bd43de706"}, + {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6189beb5c4b3117624be6b2e84545cff7611f5855d02de2d06ff68e316182be"}, + {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e13fa849c0e30643554add089983caa82f027d69fad8f50acadcb21c462244ab"}, + {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d7765ca159d0a58e8e0f8ca972cd6d26a33bc97b4480d0d2309856763807cd28"}, + {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b0befe7c6e9fc867d5bed21bab0131dfe27d1fa5cd52ba2bced67da33730b7d"}, + {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7d6363d4c6f1052b1d8b494eb9a72667c3ef5f80ebacfe18712728e85327000"}, + {file = "jiter-0.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a873e57009863eeac3e3969e4653f07031d6270d037d6224415074ac17e5505c"}, + {file = "jiter-0.8.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2582912473c0d9940791479fe1bf2976a34f212eb8e0a82ee9e645ac275c5d16"}, + {file = "jiter-0.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:646163201af42f55393ee6e8f6136b8df488253a6533f4230a64242ecbfe6048"}, + {file = "jiter-0.8.0-cp312-none-win32.whl", hash = "sha256:96e75c9abfbf7387cba89a324d2356d86d8897ac58c956017d062ad510832dae"}, + {file = "jiter-0.8.0-cp312-none-win_amd64.whl", hash = "sha256:ed6074552b4a32e047b52dad5ab497223721efbd0e9efe68c67749f094a092f7"}, + {file = "jiter-0.8.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:dd5e351cb9b3e676ec3360a85ea96def515ad2b83c8ae3a251ce84985a2c9a6f"}, + {file = "jiter-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ba9f12b0f801ecd5ed0cec29041dc425d1050922b434314c592fc30d51022467"}, + {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7ba461c3681728d556392e8ae56fb44a550155a24905f01982317b367c21dd4"}, + {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a15ed47ab09576db560dbc5c2c5a64477535beb056cd7d997d5dd0f2798770e"}, + {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cef55042816d0737142b0ec056c0356a5f681fb8d6aa8499b158e87098f4c6f8"}, + {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:549f170215adeb5e866f10617c3d019d8eb4e6d4e3c6b724b3b8c056514a3487"}, + {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f867edeb279d22020877640d2ea728de5817378c60a51be8af731a8a8f525306"}, + {file = "jiter-0.8.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aef8845f463093799db4464cee2aa59d61aa8edcb3762aaa4aacbec3f478c929"}, + {file = "jiter-0.8.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:d0d6e22e4062c3d3c1bf3594baa2f67fc9dcdda8275abad99e468e0c6540bc54"}, + {file = "jiter-0.8.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:079e62e64696241ac3f408e337aaac09137ed760ccf2b72b1094b48745c13641"}, + {file = "jiter-0.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74d2b56ed3da5760544df53b5f5c39782e68efb64dc3aa0bba4cc08815e6fae8"}, + {file = "jiter-0.8.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:798dafe108cba58a7bb0a50d4d5971f98bb7f3c974e1373e750de6eb21c1a329"}, + {file = "jiter-0.8.0-cp313-none-win32.whl", hash = "sha256:ca6d3064dfc743eb0d3d7539d89d4ba886957c717567adc72744341c1e3573c9"}, + {file = "jiter-0.8.0-cp313-none-win_amd64.whl", hash = "sha256:38caedda64fe1f04b06d7011fc15e86b3b837ed5088657bf778656551e3cd8f9"}, + {file = "jiter-0.8.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:bb5c8a0a8d081c338db22e5b8d53a89a121790569cbb85f7d3cfb1fe0fbe9836"}, + {file = "jiter-0.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:202dbe8970bfb166fab950eaab8f829c505730a0b33cc5e1cfb0a1c9dd56b2f9"}, + {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9046812e5671fdcfb9ae02881fff1f6a14d484b7e8b3316179a372cdfa1e8026"}, + {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e6ac56425023e52d65150918ae25480d0a1ce2a6bf5ea2097f66a2cc50f6d692"}, + {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7dfcf97210c6eab9d2a1c6af15dd39e1d5154b96a7145d0a97fa1df865b7b834"}, + {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4e3c8444d418686f78c9a547b9b90031faf72a0a1a46bfec7fb31edbd889c0d"}, + {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6507011a299b7f578559084256405a8428875540d8d13530e00b688e41b09493"}, + {file = "jiter-0.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0aae4738eafdd34f0f25c2d3668ce9e8fa0d7cb75a2efae543c9a69aebc37323"}, + {file = "jiter-0.8.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7f5d782e790396b13f2a7b36bdcaa3736a33293bdda80a4bf1a3ce0cd5ef9f15"}, + {file = "jiter-0.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cc7f993bc2c4e03015445adbb16790c303282fce2e8d9dc3a3905b1d40e50564"}, + {file = "jiter-0.8.0-cp38-none-win32.whl", hash = "sha256:d4a8a6eda018a991fa58ef707dd51524055d11f5acb2f516d70b1be1d15ab39c"}, + {file = "jiter-0.8.0-cp38-none-win_amd64.whl", hash = "sha256:4cca948a3eda8ea24ed98acb0ee19dc755b6ad2e570ec85e1527d5167f91ff67"}, + {file = "jiter-0.8.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:ef89663678d8257063ce7c00d94638e05bd72f662c5e1eb0e07a172e6c1a9a9f"}, + {file = "jiter-0.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c402ddcba90b4cc71db3216e8330f4db36e0da2c78cf1d8a9c3ed8f272602a94"}, + {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a6dfe795b7a173a9f8ba7421cdd92193d60c1c973bbc50dc3758a9ad0fa5eb6"}, + {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ec29a31b9abd6be39453a2c45da067138a3005d65d2c0507c530e0f1fdcd9a4"}, + {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a488f8c54bddc3ddefaf3bfd6de4a52c97fc265d77bc2dcc6ee540c17e8c342"}, + {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aeb5561adf4d26ca0d01b5811b4d7b56a8986699a473d700757b4758ef787883"}, + {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ab961858d7ad13132328517d29f121ae1b2d94502191d6bcf96bddcc8bb5d1c"}, + {file = "jiter-0.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a207e718d114d23acf0850a2174d290f42763d955030d9924ffa4227dbd0018f"}, + {file = "jiter-0.8.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:733bc9dc8ff718a0ae4695239e9268eb93e88b73b367dfac3ec227d8ce2f1e77"}, + {file = "jiter-0.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1ec27299e22d05e13a06e460bf7f75f26f9aaa0e0fb7d060f40e88df1d81faa"}, + {file = "jiter-0.8.0-cp39-none-win32.whl", hash = "sha256:e8dbfcb46553e6661d3fc1f33831598fcddf73d0f67834bce9fc3e9ebfe5c439"}, + {file = "jiter-0.8.0-cp39-none-win_amd64.whl", hash = "sha256:af2ce2487b3a93747e2cb5150081d4ae1e5874fce5924fc1a12e9e768e489ad8"}, + {file = "jiter-0.8.0.tar.gz", hash = "sha256:86fee98b569d4cc511ff2e3ec131354fafebd9348a487549c31ad371ae730310"}, ] [[package]] @@ -2703,24 +2720,24 @@ adal = ["adal (>=1.0.2)"] [[package]] name = "langchain" -version = "0.3.7" +version = "0.3.9" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langchain-0.3.7-py3-none-any.whl", hash = "sha256:cf4af1d5751dacdc278df3de1ff3cbbd8ca7eb55d39deadccdd7fb3d3ee02ac0"}, - {file = "langchain-0.3.7.tar.gz", hash = "sha256:2e4f83bf794ba38562f7ba0ede8171d7e28a583c0cec6f8595cfe72147d336b2"}, + {file = "langchain-0.3.9-py3-none-any.whl", hash = "sha256:ade5a1fee2f94f2e976a6c387f97d62cc7f0b9f26cfe0132a41d2bda761e1045"}, + {file = "langchain-0.3.9.tar.gz", hash = "sha256:4950c4ad627d0aa95ce6bda7de453e22059b7e7836b562a8f781fb0b05d7294c"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} -langchain-core = ">=0.3.15,<0.4.0" +langchain-core = ">=0.3.21,<0.4.0" langchain-text-splitters = ">=0.3.0,<0.4.0" langsmith = ">=0.1.17,<0.2.0" numpy = [ - {version = ">=1,<2", markers = "python_version < \"3.12\""}, - {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""}, + {version = ">=1.22.4,<2", markers = "python_version < \"3.12\""}, + {version = ">=1.26.2,<3", markers = "python_version >= \"3.12\""}, ] pydantic = ">=2.7.4,<3.0.0" PyYAML = ">=5.3" @@ -2730,41 +2747,41 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10" [[package]] name = "langchain-community" -version = "0.3.7" +version = "0.3.9" description = "Community contributed LangChain integrations." optional = true python-versions = "<4.0,>=3.9" files = [ - {file = "langchain_community-0.3.7-py3-none-any.whl", hash = "sha256:048f89d9a54b0720a0f865d5d469494e088cb9970a2397b19446ce0d84867141"}, - {file = "langchain_community-0.3.7.tar.gz", hash = "sha256:5b7a5cea82bedbf3ea276eac56128e00dbaf86561991cfc80fb21175a343c9a3"}, + {file = "langchain_community-0.3.9-py3-none-any.whl", hash = "sha256:ccccf9e703ccb7d929034be56e36177e3ee796e5ab8417aa79c25dc6ef40e1bd"}, + {file = "langchain_community-0.3.9.tar.gz", hash = "sha256:b0b44c530c7647a360f2321749e7b7e95a3cbdfa2fceed7e1214228833996223"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" dataclasses-json = ">=0.5.7,<0.7" httpx-sse = ">=0.4.0,<0.5.0" -langchain = ">=0.3.7,<0.4.0" -langchain-core = ">=0.3.17,<0.4.0" +langchain = ">=0.3.8,<0.4.0" +langchain-core = ">=0.3.21,<0.4.0" langsmith = ">=0.1.125,<0.2.0" numpy = [ - {version = ">=1,<2", markers = "python_version < \"3.12\""}, - {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""}, + {version = ">=1.22.4,<2", markers = "python_version < \"3.12\""}, + {version = ">=1.26.2,<3", markers = "python_version >= \"3.12\""}, ] pydantic-settings = ">=2.4.0,<3.0.0" PyYAML = ">=5.3" requests = ">=2,<3" -SQLAlchemy = ">=1.4,<2.0.36" +SQLAlchemy = ">=1.4,<3" tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10" [[package]] name = "langchain-core" -version = "0.3.19" +version = "0.3.21" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langchain_core-0.3.19-py3-none-any.whl", hash = "sha256:562b7cc3c15dfaa9270cb1496990c1f3b3e0b660c4d6a3236d7f693346f2a96c"}, - {file = "langchain_core-0.3.19.tar.gz", hash = "sha256:126d9e8cadb2a5b8d1793a228c0783a3b608e36064d5a2ef1a4d38d07a344523"}, + {file = "langchain_core-0.3.21-py3-none-any.whl", hash = "sha256:7e723dff80946a1198976c6876fea8326dc82566ef9bcb5f8d9188f738733665"}, + {file = "langchain_core-0.3.21.tar.gz", hash = "sha256:561b52b258ffa50a9fb11d7a1940ebfd915654d1ec95b35e81dfd5ee84143411"}, ] [package.dependencies] @@ -2781,17 +2798,17 @@ typing-extensions = ">=4.7" [[package]] name = "langchain-openai" -version = "0.2.9" +version = "0.2.11" description = "An integration package connecting OpenAI and LangChain" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langchain_openai-0.2.9-py3-none-any.whl", hash = "sha256:2723015e56879f9e5edfcb175fdbec6c296c1b3bf65caad28579ce9c4d1bd652"}, - {file = "langchain_openai-0.2.9.tar.gz", hash = "sha256:38a0f2004f17cdad622d46d4dcfb92d75adbf51909dadc76d0360dd94b0d4f70"}, + {file = "langchain_openai-0.2.11-py3-none-any.whl", hash = "sha256:c019ae915a5782943bee9503388e65c8622d400e0451ef885f3e4989cf35727f"}, + {file = "langchain_openai-0.2.11.tar.gz", hash = "sha256:563bd843092d260c7ffd88b8e0e6b830f36347e058e62a6d5e9cc4c461a8da98"}, ] [package.dependencies] -langchain-core = ">=0.3.17,<0.4.0" +langchain-core = ">=0.3.21,<0.4.0" openai = ">=1.54.0,<2.0.0" tiktoken = ">=0.7,<1" @@ -2827,13 +2844,13 @@ types-requests = ">=2.31.0.2,<3.0.0.0" [[package]] name = "langsmith" -version = "0.1.144" +version = "0.1.147" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langsmith-0.1.144-py3-none-any.whl", hash = "sha256:08ffb975bff2e82fc6f5428837c64c074ea25102d08a25e256361a80812c6100"}, - {file = "langsmith-0.1.144.tar.gz", hash = "sha256:b621f358d5a33441d7b5e7264c376bf4ea82bfc62d7e41aafc0f8094e3bd6369"}, + {file = "langsmith-0.1.147-py3-none-any.whl", hash = "sha256:7166fc23b965ccf839d64945a78e9f1157757add228b086141eb03a60d699a15"}, + {file = "langsmith-0.1.147.tar.gz", hash = "sha256:2e933220318a4e73034657103b3b1a3a6109cc5db3566a7e8e03be8d6d7def7a"}, ] [package.dependencies] @@ -2846,15 +2863,18 @@ pydantic = [ requests = ">=2,<3" requests-toolbelt = ">=1.0.0,<2.0.0" +[package.extras] +langsmith-pyo3 = ["langsmith-pyo3 (>=0.1.0rc2,<0.2.0)"] + [[package]] name = "llama-cloud" -version = "0.1.5" +version = "0.1.6" description = "" optional = false python-versions = "<4,>=3.8" files = [ - {file = "llama_cloud-0.1.5-py3-none-any.whl", hash = "sha256:15605022520d04bd6ef6a46c0cbde833f301d652286d34fca02b4c44e2a7a2aa"}, - {file = "llama_cloud-0.1.5.tar.gz", hash = "sha256:8ce1db36754a6a46c8511561dbc040a2e89ba4ca1cf4edfb6ce382a5240f6cb6"}, + {file = "llama_cloud-0.1.6-py3-none-any.whl", hash = "sha256:43595081e03ff552fd18d9553fcaada897ff267456c0f89f4cb098b927dc4dc7"}, + {file = "llama_cloud-0.1.6.tar.gz", hash = "sha256:21200f6fdd46e08455d34b136f645ce6b8c3800e0ae13d8077913171a921da5a"}, ] [package.dependencies] @@ -3185,13 +3205,13 @@ Werkzeug = ">=2.0.0" [[package]] name = "mako" -version = "1.3.6" +version = "1.3.7" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." optional = false python-versions = ">=3.8" files = [ - {file = "Mako-1.3.6-py3-none-any.whl", hash = "sha256:a91198468092a2f1a0de86ca92690fb0cfc43ca90ee17e15d93662b4c04b241a"}, - {file = "mako-1.3.6.tar.gz", hash = "sha256:9ec3a1583713479fae654f83ed9fa8c9a4c16b7bb0daba0e6bbebff50c0d983d"}, + {file = "Mako-1.3.7-py3-none-any.whl", hash = "sha256:d18f990ad57f800ce8e76cbfb0b74afe471c293517e9f5003ace6dad5aa72c36"}, + {file = "mako-1.3.7.tar.gz", hash = "sha256:20405b1232e0759f0e7d87b01f6bb94fce0761747f1cb876ecf90bd512d0b639"}, ] [package.dependencies] @@ -3890,13 +3910,13 @@ sympy = "*" [[package]] name = "openai" -version = "1.55.0" +version = "1.56.1" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" files = [ - {file = "openai-1.55.0-py3-none-any.whl", hash = "sha256:446e08918f8dd70d8723274be860404c8c7cc46b91b93bbc0ef051f57eb503c1"}, - {file = "openai-1.55.0.tar.gz", hash = "sha256:6c0975ac8540fe639d12b4ff5a8e0bf1424c844c4a4251148f59f06c4b2bd5db"}, + {file = "openai-1.56.1-py3-none-any.whl", hash = "sha256:38e61183c2a98fedebbbb04a909a052d9f897358b070483fc0caff17300a227c"}, + {file = "openai-1.56.1.tar.gz", hash = "sha256:8b0449f22a0c318441eae8a8a789753c3b2cac86542be51ca45df788e26aa180"}, ] [package.dependencies] @@ -4066,69 +4086,86 @@ files = [ [[package]] name = "orjson" -version = "3.10.11" +version = "3.10.12" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ - {file = "orjson-3.10.11-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6dade64687f2bd7c090281652fe18f1151292d567a9302b34c2dbb92a3872f1f"}, - {file = "orjson-3.10.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82f07c550a6ccd2b9290849b22316a609023ed851a87ea888c0456485a7d196a"}, - {file = "orjson-3.10.11-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd9a187742d3ead9df2e49240234d728c67c356516cf4db018833a86f20ec18c"}, - {file = "orjson-3.10.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77b0fed6f209d76c1c39f032a70df2d7acf24b1812ca3e6078fd04e8972685a3"}, - {file = "orjson-3.10.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:63fc9d5fe1d4e8868f6aae547a7b8ba0a2e592929245fff61d633f4caccdcdd6"}, - {file = "orjson-3.10.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65cd3e3bb4fbb4eddc3c1e8dce10dc0b73e808fcb875f9fab40c81903dd9323e"}, - {file = "orjson-3.10.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6f67c570602300c4befbda12d153113b8974a3340fdcf3d6de095ede86c06d92"}, - {file = "orjson-3.10.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1f39728c7f7d766f1f5a769ce4d54b5aaa4c3f92d5b84817053cc9995b977acc"}, - {file = "orjson-3.10.11-cp310-none-win32.whl", hash = "sha256:1789d9db7968d805f3d94aae2c25d04014aae3a2fa65b1443117cd462c6da647"}, - {file = "orjson-3.10.11-cp310-none-win_amd64.whl", hash = "sha256:5576b1e5a53a5ba8f8df81872bb0878a112b3ebb1d392155f00f54dd86c83ff6"}, - {file = "orjson-3.10.11-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1444f9cb7c14055d595de1036f74ecd6ce15f04a715e73f33bb6326c9cef01b6"}, - {file = "orjson-3.10.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdec57fe3b4bdebcc08a946db3365630332dbe575125ff3d80a3272ebd0ddafe"}, - {file = "orjson-3.10.11-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4eed32f33a0ea6ef36ccc1d37f8d17f28a1d6e8eefae5928f76aff8f1df85e67"}, - {file = "orjson-3.10.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80df27dd8697242b904f4ea54820e2d98d3f51f91e97e358fc13359721233e4b"}, - {file = "orjson-3.10.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:705f03cee0cb797256d54de6695ef219e5bc8c8120b6654dd460848d57a9af3d"}, - {file = "orjson-3.10.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03246774131701de8e7059b2e382597da43144a9a7400f178b2a32feafc54bd5"}, - {file = "orjson-3.10.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8b5759063a6c940a69c728ea70d7c33583991c6982915a839c8da5f957e0103a"}, - {file = "orjson-3.10.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:677f23e32491520eebb19c99bb34675daf5410c449c13416f7f0d93e2cf5f981"}, - {file = "orjson-3.10.11-cp311-none-win32.whl", hash = "sha256:a11225d7b30468dcb099498296ffac36b4673a8398ca30fdaec1e6c20df6aa55"}, - {file = "orjson-3.10.11-cp311-none-win_amd64.whl", hash = "sha256:df8c677df2f9f385fcc85ab859704045fa88d4668bc9991a527c86e710392bec"}, - {file = "orjson-3.10.11-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:360a4e2c0943da7c21505e47cf6bd725588962ff1d739b99b14e2f7f3545ba51"}, - {file = "orjson-3.10.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:496e2cb45de21c369079ef2d662670a4892c81573bcc143c4205cae98282ba97"}, - {file = "orjson-3.10.11-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7dfa8db55c9792d53c5952900c6a919cfa377b4f4534c7a786484a6a4a350c19"}, - {file = "orjson-3.10.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51f3382415747e0dbda9dade6f1e1a01a9d37f630d8c9049a8ed0e385b7a90c0"}, - {file = "orjson-3.10.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f35a1b9f50a219f470e0e497ca30b285c9f34948d3c8160d5ad3a755d9299433"}, - {file = "orjson-3.10.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f3b7c5803138e67028dde33450e054c87e0703afbe730c105f1fcd873496d5"}, - {file = "orjson-3.10.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f91d9eb554310472bd09f5347950b24442600594c2edc1421403d7610a0998fd"}, - {file = "orjson-3.10.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dfbb2d460a855c9744bbc8e36f9c3a997c4b27d842f3d5559ed54326e6911f9b"}, - {file = "orjson-3.10.11-cp312-none-win32.whl", hash = "sha256:d4a62c49c506d4d73f59514986cadebb7e8d186ad510c518f439176cf8d5359d"}, - {file = "orjson-3.10.11-cp312-none-win_amd64.whl", hash = "sha256:f1eec3421a558ff7a9b010a6c7effcfa0ade65327a71bb9b02a1c3b77a247284"}, - {file = "orjson-3.10.11-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c46294faa4e4d0eb73ab68f1a794d2cbf7bab33b1dda2ac2959ffb7c61591899"}, - {file = "orjson-3.10.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52e5834d7d6e58a36846e059d00559cb9ed20410664f3ad156cd2cc239a11230"}, - {file = "orjson-3.10.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2fc947e5350fdce548bfc94f434e8760d5cafa97fb9c495d2fef6757aa02ec0"}, - {file = "orjson-3.10.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0efabbf839388a1dab5b72b5d3baedbd6039ac83f3b55736eb9934ea5494d258"}, - {file = "orjson-3.10.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a3f29634260708c200c4fe148e42b4aae97d7b9fee417fbdd74f8cfc265f15b0"}, - {file = "orjson-3.10.11-cp313-none-win32.whl", hash = "sha256:1a1222ffcee8a09476bbdd5d4f6f33d06d0d6642df2a3d78b7a195ca880d669b"}, - {file = "orjson-3.10.11-cp313-none-win_amd64.whl", hash = "sha256:bc274ac261cc69260913b2d1610760e55d3c0801bb3457ba7b9004420b6b4270"}, - {file = "orjson-3.10.11-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:19b3763e8bbf8ad797df6b6b5e0fc7c843ec2e2fc0621398534e0c6400098f87"}, - {file = "orjson-3.10.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1be83a13312e5e58d633580c5eb8d0495ae61f180da2722f20562974188af205"}, - {file = "orjson-3.10.11-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:afacfd1ab81f46dedd7f6001b6d4e8de23396e4884cd3c3436bd05defb1a6446"}, - {file = "orjson-3.10.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cb4d0bea56bba596723d73f074c420aec3b2e5d7d30698bc56e6048066bd560c"}, - {file = "orjson-3.10.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96ed1de70fcb15d5fed529a656df29f768187628727ee2788344e8a51e1c1350"}, - {file = "orjson-3.10.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4bfb30c891b530f3f80e801e3ad82ef150b964e5c38e1fb8482441c69c35c61c"}, - {file = "orjson-3.10.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d496c74fc2b61341e3cefda7eec21b7854c5f672ee350bc55d9a4997a8a95204"}, - {file = "orjson-3.10.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:655a493bac606655db9a47fe94d3d84fc7f3ad766d894197c94ccf0c5408e7d3"}, - {file = "orjson-3.10.11-cp38-none-win32.whl", hash = "sha256:b9546b278c9fb5d45380f4809e11b4dd9844ca7aaf1134024503e134ed226161"}, - {file = "orjson-3.10.11-cp38-none-win_amd64.whl", hash = "sha256:b592597fe551d518f42c5a2eb07422eb475aa8cfdc8c51e6da7054b836b26782"}, - {file = "orjson-3.10.11-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c95f2ecafe709b4e5c733b5e2768ac569bed308623c85806c395d9cca00e08af"}, - {file = "orjson-3.10.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80c00d4acded0c51c98754fe8218cb49cb854f0f7eb39ea4641b7f71732d2cb7"}, - {file = "orjson-3.10.11-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:461311b693d3d0a060439aa669c74f3603264d4e7a08faa68c47ae5a863f352d"}, - {file = "orjson-3.10.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52ca832f17d86a78cbab86cdc25f8c13756ebe182b6fc1a97d534051c18a08de"}, - {file = "orjson-3.10.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c57ea78a753812f528178aa2f1c57da633754c91d2124cb28991dab4c79a54"}, - {file = "orjson-3.10.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7fcfc6f7ca046383fb954ba528587e0f9336828b568282b27579c49f8e16aad"}, - {file = "orjson-3.10.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:86b9dd983857970c29e4c71bb3e95ff085c07d3e83e7c46ebe959bac07ebd80b"}, - {file = "orjson-3.10.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4d83f87582d223e54efb2242a79547611ba4ebae3af8bae1e80fa9a0af83bb7f"}, - {file = "orjson-3.10.11-cp39-none-win32.whl", hash = "sha256:9fd0ad1c129bc9beb1154c2655f177620b5beaf9a11e0d10bac63ef3fce96950"}, - {file = "orjson-3.10.11-cp39-none-win_amd64.whl", hash = "sha256:10f416b2a017c8bd17f325fb9dee1fb5cdd7a54e814284896b7c3f2763faa017"}, - {file = "orjson-3.10.11.tar.gz", hash = "sha256:e35b6d730de6384d5b2dab5fd23f0d76fae8bbc8c353c2f78210aa5fa4beb3ef"}, + {file = "orjson-3.10.12-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ece01a7ec71d9940cc654c482907a6b65df27251255097629d0dea781f255c6d"}, + {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c34ec9aebc04f11f4b978dd6caf697a2df2dd9b47d35aa4cc606cabcb9df69d7"}, + {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd6ec8658da3480939c79b9e9e27e0db31dffcd4ba69c334e98c9976ac29140e"}, + {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f17e6baf4cf01534c9de8a16c0c611f3d94925d1701bf5f4aff17003677d8ced"}, + {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6402ebb74a14ef96f94a868569f5dccf70d791de49feb73180eb3c6fda2ade56"}, + {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0000758ae7c7853e0a4a6063f534c61656ebff644391e1f81698c1b2d2fc8cd2"}, + {file = "orjson-3.10.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:888442dcee99fd1e5bd37a4abb94930915ca6af4db50e23e746cdf4d1e63db13"}, + {file = "orjson-3.10.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c1f7a3ce79246aa0e92f5458d86c54f257fb5dfdc14a192651ba7ec2c00f8a05"}, + {file = "orjson-3.10.12-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:802a3935f45605c66fb4a586488a38af63cb37aaad1c1d94c982c40dcc452e85"}, + {file = "orjson-3.10.12-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1da1ef0113a2be19bb6c557fb0ec2d79c92ebd2fed4cfb1b26bab93f021fb885"}, + {file = "orjson-3.10.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a3273e99f367f137d5b3fecb5e9f45bcdbfac2a8b2f32fbc72129bbd48789c2"}, + {file = "orjson-3.10.12-cp310-none-win32.whl", hash = "sha256:475661bf249fd7907d9b0a2a2421b4e684355a77ceef85b8352439a9163418c3"}, + {file = "orjson-3.10.12-cp310-none-win_amd64.whl", hash = "sha256:87251dc1fb2b9e5ab91ce65d8f4caf21910d99ba8fb24b49fd0c118b2362d509"}, + {file = "orjson-3.10.12-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a734c62efa42e7df94926d70fe7d37621c783dea9f707a98cdea796964d4cf74"}, + {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:750f8b27259d3409eda8350c2919a58b0cfcd2054ddc1bd317a643afc646ef23"}, + {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb52c22bfffe2857e7aa13b4622afd0dd9d16ea7cc65fd2bf318d3223b1b6252"}, + {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:440d9a337ac8c199ff8251e100c62e9488924c92852362cd27af0e67308c16ef"}, + {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9e15c06491c69997dfa067369baab3bf094ecb74be9912bdc4339972323f252"}, + {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:362d204ad4b0b8724cf370d0cd917bb2dc913c394030da748a3bb632445ce7c4"}, + {file = "orjson-3.10.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b57cbb4031153db37b41622eac67329c7810e5f480fda4cfd30542186f006ae"}, + {file = "orjson-3.10.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:165c89b53ef03ce0d7c59ca5c82fa65fe13ddf52eeb22e859e58c237d4e33b9b"}, + {file = "orjson-3.10.12-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:5dee91b8dfd54557c1a1596eb90bcd47dbcd26b0baaed919e6861f076583e9da"}, + {file = "orjson-3.10.12-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:77a4e1cfb72de6f905bdff061172adfb3caf7a4578ebf481d8f0530879476c07"}, + {file = "orjson-3.10.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:038d42c7bc0606443459b8fe2d1f121db474c49067d8d14c6a075bbea8bf14dd"}, + {file = "orjson-3.10.12-cp311-none-win32.whl", hash = "sha256:03b553c02ab39bed249bedd4abe37b2118324d1674e639b33fab3d1dafdf4d79"}, + {file = "orjson-3.10.12-cp311-none-win_amd64.whl", hash = "sha256:8b8713b9e46a45b2af6b96f559bfb13b1e02006f4242c156cbadef27800a55a8"}, + {file = "orjson-3.10.12-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:53206d72eb656ca5ac7d3a7141e83c5bbd3ac30d5eccfe019409177a57634b0d"}, + {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac8010afc2150d417ebda810e8df08dd3f544e0dd2acab5370cfa6bcc0662f8f"}, + {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed459b46012ae950dd2e17150e838ab08215421487371fa79d0eced8d1461d70"}, + {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dcb9673f108a93c1b52bfc51b0af422c2d08d4fc710ce9c839faad25020bb69"}, + {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22a51ae77680c5c4652ebc63a83d5255ac7d65582891d9424b566fb3b5375ee9"}, + {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910fdf2ac0637b9a77d1aad65f803bac414f0b06f720073438a7bd8906298192"}, + {file = "orjson-3.10.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:24ce85f7100160936bc2116c09d1a8492639418633119a2224114f67f63a4559"}, + {file = "orjson-3.10.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a76ba5fc8dd9c913640292df27bff80a685bed3a3c990d59aa6ce24c352f8fc"}, + {file = "orjson-3.10.12-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ff70ef093895fd53f4055ca75f93f047e088d1430888ca1229393a7c0521100f"}, + {file = "orjson-3.10.12-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f4244b7018b5753ecd10a6d324ec1f347da130c953a9c88432c7fbc8875d13be"}, + {file = "orjson-3.10.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:16135ccca03445f37921fa4b585cff9a58aa8d81ebcb27622e69bfadd220b32c"}, + {file = "orjson-3.10.12-cp312-none-win32.whl", hash = "sha256:2d879c81172d583e34153d524fcba5d4adafbab8349a7b9f16ae511c2cee8708"}, + {file = "orjson-3.10.12-cp312-none-win_amd64.whl", hash = "sha256:fc23f691fa0f5c140576b8c365bc942d577d861a9ee1142e4db468e4e17094fb"}, + {file = "orjson-3.10.12-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:47962841b2a8aa9a258b377f5188db31ba49af47d4003a32f55d6f8b19006543"}, + {file = "orjson-3.10.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6334730e2532e77b6054e87ca84f3072bee308a45a452ea0bffbbbc40a67e296"}, + {file = "orjson-3.10.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:accfe93f42713c899fdac2747e8d0d5c659592df2792888c6c5f829472e4f85e"}, + {file = "orjson-3.10.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a7974c490c014c48810d1dede6c754c3cc46598da758c25ca3b4001ac45b703f"}, + {file = "orjson-3.10.12-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3f250ce7727b0b2682f834a3facff88e310f52f07a5dcfd852d99637d386e79e"}, + {file = "orjson-3.10.12-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f31422ff9486ae484f10ffc51b5ab2a60359e92d0716fcce1b3593d7bb8a9af6"}, + {file = "orjson-3.10.12-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5f29c5d282bb2d577c2a6bbde88d8fdcc4919c593f806aac50133f01b733846e"}, + {file = "orjson-3.10.12-cp313-none-win32.whl", hash = "sha256:f45653775f38f63dc0e6cd4f14323984c3149c05d6007b58cb154dd080ddc0dc"}, + {file = "orjson-3.10.12-cp313-none-win_amd64.whl", hash = "sha256:229994d0c376d5bdc91d92b3c9e6be2f1fbabd4cc1b59daae1443a46ee5e9825"}, + {file = "orjson-3.10.12-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:7d69af5b54617a5fac5c8e5ed0859eb798e2ce8913262eb522590239db6c6763"}, + {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ed119ea7d2953365724a7059231a44830eb6bbb0cfead33fcbc562f5fd8f935"}, + {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9c5fc1238ef197e7cad5c91415f524aaa51e004be5a9b35a1b8a84ade196f73f"}, + {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43509843990439b05f848539d6f6198d4ac86ff01dd024b2f9a795c0daeeab60"}, + {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f72e27a62041cfb37a3de512247ece9f240a561e6c8662276beaf4d53d406db4"}, + {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a904f9572092bb6742ab7c16c623f0cdccbad9eeb2d14d4aa06284867bddd31"}, + {file = "orjson-3.10.12-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:855c0833999ed5dc62f64552db26f9be767434917d8348d77bacaab84f787d7b"}, + {file = "orjson-3.10.12-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:897830244e2320f6184699f598df7fb9db9f5087d6f3f03666ae89d607e4f8ed"}, + {file = "orjson-3.10.12-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:0b32652eaa4a7539f6f04abc6243619c56f8530c53bf9b023e1269df5f7816dd"}, + {file = "orjson-3.10.12-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:36b4aa31e0f6a1aeeb6f8377769ca5d125db000f05c20e54163aef1d3fe8e833"}, + {file = "orjson-3.10.12-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5535163054d6cbf2796f93e4f0dbc800f61914c0e3c4ed8499cf6ece22b4a3da"}, + {file = "orjson-3.10.12-cp38-none-win32.whl", hash = "sha256:90a5551f6f5a5fa07010bf3d0b4ca2de21adafbbc0af6cb700b63cd767266cb9"}, + {file = "orjson-3.10.12-cp38-none-win_amd64.whl", hash = "sha256:703a2fb35a06cdd45adf5d733cf613cbc0cb3ae57643472b16bc22d325b5fb6c"}, + {file = "orjson-3.10.12-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f29de3ef71a42a5822765def1febfb36e0859d33abf5c2ad240acad5c6a1b78d"}, + {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de365a42acc65d74953f05e4772c974dad6c51cfc13c3240899f534d611be967"}, + {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:91a5a0158648a67ff0004cb0df5df7dcc55bfc9ca154d9c01597a23ad54c8d0c"}, + {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c47ce6b8d90fe9646a25b6fb52284a14ff215c9595914af63a5933a49972ce36"}, + {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0eee4c2c5bfb5c1b47a5db80d2ac7aaa7e938956ae88089f098aff2c0f35d5d8"}, + {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35d3081bbe8b86587eb5c98a73b97f13d8f9fea685cf91a579beddacc0d10566"}, + {file = "orjson-3.10.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:73c23a6e90383884068bc2dba83d5222c9fcc3b99a0ed2411d38150734236755"}, + {file = "orjson-3.10.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5472be7dc3269b4b52acba1433dac239215366f89dc1d8d0e64029abac4e714e"}, + {file = "orjson-3.10.12-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:7319cda750fca96ae5973efb31b17d97a5c5225ae0bc79bf5bf84df9e1ec2ab6"}, + {file = "orjson-3.10.12-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:74d5ca5a255bf20b8def6a2b96b1e18ad37b4a122d59b154c458ee9494377f80"}, + {file = "orjson-3.10.12-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ff31d22ecc5fb85ef62c7d4afe8301d10c558d00dd24274d4bbe464380d3cd69"}, + {file = "orjson-3.10.12-cp39-none-win32.whl", hash = "sha256:c22c3ea6fba91d84fcb4cda30e64aff548fcf0c44c876e681f47d61d24b12e6b"}, + {file = "orjson-3.10.12-cp39-none-win_amd64.whl", hash = "sha256:be604f60d45ace6b0b33dd990a66b4526f1a7a186ac411c942674625456ca548"}, + {file = "orjson-3.10.12.tar.gz", hash = "sha256:0a78bbda3aea0f9f079057ee1ee8a1ecf790d4f1af88dd67493c6b8ee52506ff"}, ] [[package]] @@ -4488,13 +4525,13 @@ tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "p [[package]] name = "posthog" -version = "3.7.2" +version = "3.7.4" description = "Integrate PostHog into any python application." optional = false python-versions = "*" files = [ - {file = "posthog-3.7.2-py2.py3-none-any.whl", hash = "sha256:28bfc9d0b93956586067346c87d11d060fdc186159e9c700c375cab5c52402f8"}, - {file = "posthog-3.7.2.tar.gz", hash = "sha256:49e2bca912a20e5bf83e28ec199917a6d4e74188666c9c62f89c573bfbfe804d"}, + {file = "posthog-3.7.4-py2.py3-none-any.whl", hash = "sha256:21c18c6bf43b2de303ea4cd6e95804cc0f24c20cb2a96a8fd09da2ed50b62faa"}, + {file = "posthog-3.7.4.tar.gz", hash = "sha256:19384bd09d330f9787a7e2446aba14c8057ece56144970ea2791072d4e40cd36"}, ] [package.dependencies] @@ -4560,109 +4597,93 @@ wcwidth = "*" [[package]] name = "propcache" -version = "0.2.0" +version = "0.2.1" description = "Accelerated property cache" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c5869b8fd70b81835a6f187c5fdbe67917a04d7e52b6e7cc4e5fe39d55c39d58"}, - {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:952e0d9d07609d9c5be361f33b0d6d650cd2bae393aabb11d9b719364521984b"}, - {file = "propcache-0.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:33ac8f098df0585c0b53009f039dfd913b38c1d2edafed0cedcc0c32a05aa110"}, - {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97e48e8875e6c13909c800fa344cd54cc4b2b0db1d5f911f840458a500fde2c2"}, - {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388f3217649d6d59292b722d940d4d2e1e6a7003259eb835724092a1cca0203a"}, - {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f571aea50ba5623c308aa146eb650eebf7dbe0fd8c5d946e28343cb3b5aad577"}, - {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3dfafb44f7bb35c0c06eda6b2ab4bfd58f02729e7c4045e179f9a861b07c9850"}, - {file = "propcache-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3ebe9a75be7ab0b7da2464a77bb27febcb4fab46a34f9288f39d74833db7f61"}, - {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d2f0d0f976985f85dfb5f3d685697ef769faa6b71993b46b295cdbbd6be8cc37"}, - {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a3dc1a4b165283bd865e8f8cb5f0c64c05001e0718ed06250d8cac9bec115b48"}, - {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9e0f07b42d2a50c7dd2d8675d50f7343d998c64008f1da5fef888396b7f84630"}, - {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e63e3e1e0271f374ed489ff5ee73d4b6e7c60710e1f76af5f0e1a6117cd26394"}, - {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:56bb5c98f058a41bb58eead194b4db8c05b088c93d94d5161728515bd52b052b"}, - {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7665f04d0c7f26ff8bb534e1c65068409bf4687aa2534faf7104d7182debb336"}, - {file = "propcache-0.2.0-cp310-cp310-win32.whl", hash = "sha256:7cf18abf9764746b9c8704774d8b06714bcb0a63641518a3a89c7f85cc02c2ad"}, - {file = "propcache-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:cfac69017ef97db2438efb854edf24f5a29fd09a536ff3a992b75990720cdc99"}, - {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:63f13bf09cc3336eb04a837490b8f332e0db41da66995c9fd1ba04552e516354"}, - {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608cce1da6f2672a56b24a015b42db4ac612ee709f3d29f27a00c943d9e851de"}, - {file = "propcache-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:466c219deee4536fbc83c08d09115249db301550625c7fef1c5563a584c9bc87"}, - {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc2db02409338bf36590aa985a461b2c96fce91f8e7e0f14c50c5fcc4f229016"}, - {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6ed8db0a556343d566a5c124ee483ae113acc9a557a807d439bcecc44e7dfbb"}, - {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91997d9cb4a325b60d4e3f20967f8eb08dfcb32b22554d5ef78e6fd1dda743a2"}, - {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c7dde9e533c0a49d802b4f3f218fa9ad0a1ce21f2c2eb80d5216565202acab4"}, - {file = "propcache-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffcad6c564fe6b9b8916c1aefbb37a362deebf9394bd2974e9d84232e3e08504"}, - {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:97a58a28bcf63284e8b4d7b460cbee1edaab24634e82059c7b8c09e65284f178"}, - {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:945db8ee295d3af9dbdbb698cce9bbc5c59b5c3fe328bbc4387f59a8a35f998d"}, - {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39e104da444a34830751715f45ef9fc537475ba21b7f1f5b0f4d71a3b60d7fe2"}, - {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c5ecca8f9bab618340c8e848d340baf68bcd8ad90a8ecd7a4524a81c1764b3db"}, - {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c436130cc779806bdf5d5fae0d848713105472b8566b75ff70048c47d3961c5b"}, - {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:191db28dc6dcd29d1a3e063c3be0b40688ed76434622c53a284e5427565bbd9b"}, - {file = "propcache-0.2.0-cp311-cp311-win32.whl", hash = "sha256:5f2564ec89058ee7c7989a7b719115bdfe2a2fb8e7a4543b8d1c0cc4cf6478c1"}, - {file = "propcache-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e2e54267980349b723cff366d1e29b138b9a60fa376664a157a342689553f71"}, - {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ee7606193fb267be4b2e3b32714f2d58cad27217638db98a60f9efb5efeccc2"}, - {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:91ee8fc02ca52e24bcb77b234f22afc03288e1dafbb1f88fe24db308910c4ac7"}, - {file = "propcache-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e900bad2a8456d00a113cad8c13343f3b1f327534e3589acc2219729237a2e8"}, - {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f52a68c21363c45297aca15561812d542f8fc683c85201df0bebe209e349f793"}, - {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e41d67757ff4fbc8ef2af99b338bfb955010444b92929e9e55a6d4dcc3c4f09"}, - {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a64e32f8bd94c105cc27f42d3b658902b5bcc947ece3c8fe7bc1b05982f60e89"}, - {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55346705687dbd7ef0d77883ab4f6fabc48232f587925bdaf95219bae072491e"}, - {file = "propcache-0.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00181262b17e517df2cd85656fcd6b4e70946fe62cd625b9d74ac9977b64d8d9"}, - {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6994984550eaf25dd7fc7bd1b700ff45c894149341725bb4edc67f0ffa94efa4"}, - {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:56295eb1e5f3aecd516d91b00cfd8bf3a13991de5a479df9e27dd569ea23959c"}, - {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:439e76255daa0f8151d3cb325f6dd4a3e93043e6403e6491813bcaaaa8733887"}, - {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f6475a1b2ecb310c98c28d271a30df74f9dd436ee46d09236a6b750a7599ce57"}, - {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3444cdba6628accf384e349014084b1cacd866fbb88433cd9d279d90a54e0b23"}, - {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a9d9b4d0a9b38d1c391bb4ad24aa65f306c6f01b512e10a8a34a2dc5675d348"}, - {file = "propcache-0.2.0-cp312-cp312-win32.whl", hash = "sha256:69d3a98eebae99a420d4b28756c8ce6ea5a29291baf2dc9ff9414b42676f61d5"}, - {file = "propcache-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ad9c9b99b05f163109466638bd30ada1722abb01bbb85c739c50b6dc11f92dc3"}, - {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ecddc221a077a8132cf7c747d5352a15ed763b674c0448d811f408bf803d9ad7"}, - {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0e53cb83fdd61cbd67202735e6a6687a7b491c8742dfc39c9e01e80354956763"}, - {file = "propcache-0.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92fe151145a990c22cbccf9ae15cae8ae9eddabfc949a219c9f667877e40853d"}, - {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a21ef516d36909931a2967621eecb256018aeb11fc48656e3257e73e2e247a"}, - {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f88a4095e913f98988f5b338c1d4d5d07dbb0b6bad19892fd447484e483ba6b"}, - {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a5b3bb545ead161be780ee85a2b54fdf7092815995661947812dde94a40f6fb"}, - {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67aeb72e0f482709991aa91345a831d0b707d16b0257e8ef88a2ad246a7280bf"}, - {file = "propcache-0.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c997f8c44ec9b9b0bcbf2d422cc00a1d9b9c681f56efa6ca149a941e5560da2"}, - {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a66df3d4992bc1d725b9aa803e8c5a66c010c65c741ad901e260ece77f58d2f"}, - {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3ebbcf2a07621f29638799828b8d8668c421bfb94c6cb04269130d8de4fb7136"}, - {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1235c01ddaa80da8235741e80815ce381c5267f96cc49b1477fdcf8c047ef325"}, - {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3947483a381259c06921612550867b37d22e1df6d6d7e8361264b6d037595f44"}, - {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d5bed7f9805cc29c780f3aee05de3262ee7ce1f47083cfe9f77471e9d6777e83"}, - {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4a91d44379f45f5e540971d41e4626dacd7f01004826a18cb048e7da7e96544"}, - {file = "propcache-0.2.0-cp313-cp313-win32.whl", hash = "sha256:f902804113e032e2cdf8c71015651c97af6418363bea8d78dc0911d56c335032"}, - {file = "propcache-0.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:8f188cfcc64fb1266f4684206c9de0e80f54622c3f22a910cbd200478aeae61e"}, - {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:53d1bd3f979ed529f0805dd35ddaca330f80a9a6d90bc0121d2ff398f8ed8861"}, - {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:83928404adf8fb3d26793665633ea79b7361efa0287dfbd372a7e74311d51ee6"}, - {file = "propcache-0.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:77a86c261679ea5f3896ec060be9dc8e365788248cc1e049632a1be682442063"}, - {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:218db2a3c297a3768c11a34812e63b3ac1c3234c3a086def9c0fee50d35add1f"}, - {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7735e82e3498c27bcb2d17cb65d62c14f1100b71723b68362872bca7d0913d90"}, - {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:20a617c776f520c3875cf4511e0d1db847a076d720714ae35ffe0df3e440be68"}, - {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67b69535c870670c9f9b14a75d28baa32221d06f6b6fa6f77a0a13c5a7b0a5b9"}, - {file = "propcache-0.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4569158070180c3855e9c0791c56be3ceeb192defa2cdf6a3f39e54319e56b89"}, - {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:db47514ffdbd91ccdc7e6f8407aac4ee94cc871b15b577c1c324236b013ddd04"}, - {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:2a60ad3e2553a74168d275a0ef35e8c0a965448ffbc3b300ab3a5bb9956c2162"}, - {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:662dd62358bdeaca0aee5761de8727cfd6861432e3bb828dc2a693aa0471a563"}, - {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:25a1f88b471b3bc911d18b935ecb7115dff3a192b6fef46f0bfaf71ff4f12418"}, - {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:f60f0ac7005b9f5a6091009b09a419ace1610e163fa5deaba5ce3484341840e7"}, - {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:74acd6e291f885678631b7ebc85d2d4aec458dd849b8c841b57ef04047833bed"}, - {file = "propcache-0.2.0-cp38-cp38-win32.whl", hash = "sha256:d9b6ddac6408194e934002a69bcaadbc88c10b5f38fb9307779d1c629181815d"}, - {file = "propcache-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:676135dcf3262c9c5081cc8f19ad55c8a64e3f7282a21266d05544450bffc3a5"}, - {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:25c8d773a62ce0451b020c7b29a35cfbc05de8b291163a7a0f3b7904f27253e6"}, - {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:375a12d7556d462dc64d70475a9ee5982465fbb3d2b364f16b86ba9135793638"}, - {file = "propcache-0.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1ec43d76b9677637a89d6ab86e1fef70d739217fefa208c65352ecf0282be957"}, - {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f45eec587dafd4b2d41ac189c2156461ebd0c1082d2fe7013571598abb8505d1"}, - {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc092ba439d91df90aea38168e11f75c655880c12782facf5cf9c00f3d42b562"}, - {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa1076244f54bb76e65e22cb6910365779d5c3d71d1f18b275f1dfc7b0d71b4d"}, - {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:682a7c79a2fbf40f5dbb1eb6bfe2cd865376deeac65acf9beb607505dced9e12"}, - {file = "propcache-0.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e40876731f99b6f3c897b66b803c9e1c07a989b366c6b5b475fafd1f7ba3fb8"}, - {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:363ea8cd3c5cb6679f1c2f5f1f9669587361c062e4899fce56758efa928728f8"}, - {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:140fbf08ab3588b3468932974a9331aff43c0ab8a2ec2c608b6d7d1756dbb6cb"}, - {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e70fac33e8b4ac63dfc4c956fd7d85a0b1139adcfc0d964ce288b7c527537fea"}, - {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b33d7a286c0dc1a15f5fc864cc48ae92a846df287ceac2dd499926c3801054a6"}, - {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f6d5749fdd33d90e34c2efb174c7e236829147a2713334d708746e94c4bde40d"}, - {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22aa8f2272d81d9317ff5756bb108021a056805ce63dd3630e27d042c8092798"}, - {file = "propcache-0.2.0-cp39-cp39-win32.whl", hash = "sha256:73e4b40ea0eda421b115248d7e79b59214411109a5bc47d0d48e4c73e3b8fcf9"}, - {file = "propcache-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:9517d5e9e0731957468c29dbfd0f976736a0e55afaea843726e887f36fe017df"}, - {file = "propcache-0.2.0-py3-none-any.whl", hash = "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036"}, - {file = "propcache-0.2.0.tar.gz", hash = "sha256:df81779732feb9d01e5d513fad0122efb3d53bbc75f61b2a4f29a020bc985e70"}, + {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6b3f39a85d671436ee3d12c017f8fdea38509e4f25b28eb25877293c98c243f6"}, + {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d51fbe4285d5db5d92a929e3e21536ea3dd43732c5b177c7ef03f918dff9f2"}, + {file = "propcache-0.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6445804cf4ec763dc70de65a3b0d9954e868609e83850a47ca4f0cb64bd79fea"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9479aa06a793c5aeba49ce5c5692ffb51fcd9a7016e017d555d5e2b0045d212"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9631c5e8b5b3a0fda99cb0d29c18133bca1e18aea9effe55adb3da1adef80d3"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3156628250f46a0895f1f36e1d4fbe062a1af8718ec3ebeb746f1d23f0c5dc4d"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b6fb63ae352e13748289f04f37868099e69dba4c2b3e271c46061e82c745634"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:887d9b0a65404929641a9fabb6452b07fe4572b269d901d622d8a34a4e9043b2"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a96dc1fa45bd8c407a0af03b2d5218392729e1822b0c32e62c5bf7eeb5fb3958"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a7e65eb5c003a303b94aa2c3852ef130230ec79e349632d030e9571b87c4698c"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:999779addc413181912e984b942fbcc951be1f5b3663cd80b2687758f434c583"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:19a0f89a7bb9d8048d9c4370c9c543c396e894c76be5525f5e1ad287f1750ddf"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1ac2f5fe02fa75f56e1ad473f1175e11f475606ec9bd0be2e78e4734ad575034"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:574faa3b79e8ebac7cb1d7930f51184ba1ccf69adfdec53a12f319a06030a68b"}, + {file = "propcache-0.2.1-cp310-cp310-win32.whl", hash = "sha256:03ff9d3f665769b2a85e6157ac8b439644f2d7fd17615a82fa55739bc97863f4"}, + {file = "propcache-0.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:2d3af2e79991102678f53e0dbf4c35de99b6b8b58f29a27ca0325816364caaba"}, + {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ffc3cca89bb438fb9c95c13fc874012f7b9466b89328c3c8b1aa93cdcfadd16"}, + {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f174bbd484294ed9fdf09437f889f95807e5f229d5d93588d34e92106fbf6717"}, + {file = "propcache-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:70693319e0b8fd35dd863e3e29513875eb15c51945bf32519ef52927ca883bc3"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b480c6a4e1138e1aa137c0079b9b6305ec6dcc1098a8ca5196283e8a49df95a9"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d27b84d5880f6d8aa9ae3edb253c59d9f6642ffbb2c889b78b60361eed449787"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:857112b22acd417c40fa4595db2fe28ab900c8c5fe4670c7989b1c0230955465"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf6c4150f8c0e32d241436526f3c3f9cbd34429492abddbada2ffcff506c51af"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66d4cfda1d8ed687daa4bc0274fcfd5267873db9a5bc0418c2da19273040eeb7"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2f992c07c0fca81655066705beae35fc95a2fa7366467366db627d9f2ee097f"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:4a571d97dbe66ef38e472703067021b1467025ec85707d57e78711c085984e54"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bb6178c241278d5fe853b3de743087be7f5f4c6f7d6d22a3b524d323eecec505"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ad1af54a62ffe39cf34db1aa6ed1a1873bd548f6401db39d8e7cd060b9211f82"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e7048abd75fe40712005bcfc06bb44b9dfcd8e101dda2ecf2f5aa46115ad07ca"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:160291c60081f23ee43d44b08a7e5fb76681221a8e10b3139618c5a9a291b84e"}, + {file = "propcache-0.2.1-cp311-cp311-win32.whl", hash = "sha256:819ce3b883b7576ca28da3861c7e1a88afd08cc8c96908e08a3f4dd64a228034"}, + {file = "propcache-0.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:edc9fc7051e3350643ad929df55c451899bb9ae6d24998a949d2e4c87fb596d3"}, + {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:081a430aa8d5e8876c6909b67bd2d937bfd531b0382d3fdedb82612c618bc41a"}, + {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2ccec9ac47cf4e04897619c0e0c1a48c54a71bdf045117d3a26f80d38ab1fb0"}, + {file = "propcache-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14d86fe14b7e04fa306e0c43cdbeebe6b2c2156a0c9ce56b815faacc193e320d"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:049324ee97bb67285b49632132db351b41e77833678432be52bdd0289c0e05e4"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cd9a1d071158de1cc1c71a26014dcdfa7dd3d5f4f88c298c7f90ad6f27bb46d"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98110aa363f1bb4c073e8dcfaefd3a5cea0f0834c2aab23dda657e4dab2f53b5"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:647894f5ae99c4cf6bb82a1bb3a796f6e06af3caa3d32e26d2350d0e3e3faf24"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd3223c15bebe26518d58ccf9a39b93948d3dcb3e57a20480dfdd315356baff"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d71264a80f3fcf512eb4f18f59423fe82d6e346ee97b90625f283df56aee103f"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e73091191e4280403bde6c9a52a6999d69cdfde498f1fdf629105247599b57ec"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3935bfa5fede35fb202c4b569bb9c042f337ca4ff7bd540a0aa5e37131659348"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f508b0491767bb1f2b87fdfacaba5f7eddc2f867740ec69ece6d1946d29029a6"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1672137af7c46662a1c2be1e8dc78cb6d224319aaa40271c9257d886be4363a6"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b74c261802d3d2b85c9df2dfb2fa81b6f90deeef63c2db9f0e029a3cac50b518"}, + {file = "propcache-0.2.1-cp312-cp312-win32.whl", hash = "sha256:d09c333d36c1409d56a9d29b3a1b800a42c76a57a5a8907eacdbce3f18768246"}, + {file = "propcache-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:c214999039d4f2a5b2073ac506bba279945233da8c786e490d411dfc30f855c1"}, + {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aca405706e0b0a44cc6bfd41fbe89919a6a56999157f6de7e182a990c36e37bc"}, + {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:12d1083f001ace206fe34b6bdc2cb94be66d57a850866f0b908972f90996b3e9"}, + {file = "propcache-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d93f3307ad32a27bda2e88ec81134b823c240aa3abb55821a8da553eed8d9439"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba278acf14471d36316159c94a802933d10b6a1e117b8554fe0d0d9b75c9d536"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e6281aedfca15301c41f74d7005e6e3f4ca143584ba696ac69df4f02f40d629"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b750a8e5a1262434fb1517ddf64b5de58327f1adc3524a5e44c2ca43305eb0b"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf72af5e0fb40e9babf594308911436c8efde3cb5e75b6f206c34ad18be5c052"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2d0a12018b04f4cb820781ec0dffb5f7c7c1d2a5cd22bff7fb055a2cb19ebce"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e800776a79a5aabdb17dcc2346a7d66d0777e942e4cd251defeb084762ecd17d"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4160d9283bd382fa6c0c2b5e017acc95bc183570cd70968b9202ad6d8fc48dce"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b43e74f1359353341a7adb783c8f1b1c676367b011709f466f42fda2045e95"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:58791550b27d5488b1bb52bc96328456095d96206a250d28d874fafe11b3dfaf"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0f022d381747f0dfe27e99d928e31bc51a18b65bb9e481ae0af1380a6725dd1f"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:297878dc9d0a334358f9b608b56d02e72899f3b8499fc6044133f0d319e2ec30"}, + {file = "propcache-0.2.1-cp313-cp313-win32.whl", hash = "sha256:ddfab44e4489bd79bda09d84c430677fc7f0a4939a73d2bba3073036f487a0a6"}, + {file = "propcache-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:556fc6c10989f19a179e4321e5d678db8eb2924131e64652a51fe83e4c3db0e1"}, + {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6a9a8c34fb7bb609419a211e59da8887eeca40d300b5ea8e56af98f6fbbb1541"}, + {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae1aa1cd222c6d205853b3013c69cd04515f9d6ab6de4b0603e2e1c33221303e"}, + {file = "propcache-0.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:accb6150ce61c9c4b7738d45550806aa2b71c7668c6942f17b0ac182b6142fd4"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eee736daafa7af6d0a2dc15cc75e05c64f37fc37bafef2e00d77c14171c2097"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7a31fc1e1bd362874863fdeed71aed92d348f5336fd84f2197ba40c59f061bd"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba4cfa1052819d16699e1d55d18c92b6e094d4517c41dd231a8b9f87b6fa681"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f089118d584e859c62b3da0892b88a83d611c2033ac410e929cb6754eec0ed16"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:781e65134efaf88feb447e8c97a51772aa75e48b794352f94cb7ea717dedda0d"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31f5af773530fd3c658b32b6bdc2d0838543de70eb9a2156c03e410f7b0d3aae"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:a7a078f5d37bee6690959c813977da5291b24286e7b962e62a94cec31aa5188b"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cea7daf9fc7ae6687cf1e2c049752f19f146fdc37c2cc376e7d0032cf4f25347"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:8b3489ff1ed1e8315674d0775dc7d2195fb13ca17b3808721b54dbe9fd020faf"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9403db39be1393618dd80c746cb22ccda168efce239c73af13c3763ef56ffc04"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5d97151bc92d2b2578ff7ce779cdb9174337390a535953cbb9452fb65164c587"}, + {file = "propcache-0.2.1-cp39-cp39-win32.whl", hash = "sha256:9caac6b54914bdf41bcc91e7eb9147d331d29235a7c967c150ef5df6464fd1bb"}, + {file = "propcache-0.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:92fc4500fcb33899b05ba73276dfb684a20d31caa567b7cb5252d48f896a91b1"}, + {file = "propcache-0.2.1-py3-none-any.whl", hash = "sha256:52277518d6aae65536e9cea52d4e7fd2f7a66f4aa2d30ed3f2fcea620ace3c54"}, + {file = "propcache-0.2.1.tar.gz", hash = "sha256:3f77ce728b19cb537714499928fe800c3dda29e8d9428778fc7c186da4c09a64"}, ] [[package]] @@ -4883,53 +4904,53 @@ tests = ["pytest"] [[package]] name = "pyarrow" -version = "18.0.0" +version = "18.1.0" description = "Python library for Apache Arrow" optional = true python-versions = ">=3.9" files = [ - {file = "pyarrow-18.0.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:2333f93260674e185cfbf208d2da3007132572e56871f451ba1a556b45dae6e2"}, - {file = "pyarrow-18.0.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:4c381857754da44326f3a49b8b199f7f87a51c2faacd5114352fc78de30d3aba"}, - {file = "pyarrow-18.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:603cd8ad4976568954598ef0a6d4ed3dfb78aff3d57fa8d6271f470f0ce7d34f"}, - {file = "pyarrow-18.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58a62549a3e0bc9e03df32f350e10e1efb94ec6cf63e3920c3385b26663948ce"}, - {file = "pyarrow-18.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bc97316840a349485fbb137eb8d0f4d7057e1b2c1272b1a20eebbbe1848f5122"}, - {file = "pyarrow-18.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:2e549a748fa8b8715e734919923f69318c953e077e9c02140ada13e59d043310"}, - {file = "pyarrow-18.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:606e9a3dcb0f52307c5040698ea962685fb1c852d72379ee9412be7de9c5f9e2"}, - {file = "pyarrow-18.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d5795e37c0a33baa618c5e054cd61f586cf76850a251e2b21355e4085def6280"}, - {file = "pyarrow-18.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:5f0510608ccd6e7f02ca8596962afb8c6cc84c453e7be0da4d85f5f4f7b0328a"}, - {file = "pyarrow-18.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:616ea2826c03c16e87f517c46296621a7c51e30400f6d0a61be645f203aa2b93"}, - {file = "pyarrow-18.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1824f5b029ddd289919f354bc285992cb4e32da518758c136271cf66046ef22"}, - {file = "pyarrow-18.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:6dd1b52d0d58dd8f685ced9971eb49f697d753aa7912f0a8f50833c7a7426319"}, - {file = "pyarrow-18.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:320ae9bd45ad7ecc12ec858b3e8e462578de060832b98fc4d671dee9f10d9954"}, - {file = "pyarrow-18.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:2c992716cffb1088414f2b478f7af0175fd0a76fea80841b1706baa8fb0ebaad"}, - {file = "pyarrow-18.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:e7ab04f272f98ebffd2a0661e4e126036f6936391ba2889ed2d44c5006237802"}, - {file = "pyarrow-18.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:03f40b65a43be159d2f97fd64dc998f769d0995a50c00f07aab58b0b3da87e1f"}, - {file = "pyarrow-18.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be08af84808dff63a76860847c48ec0416928a7b3a17c2f49a072cac7c45efbd"}, - {file = "pyarrow-18.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c70c1965cde991b711a98448ccda3486f2a336457cf4ec4dca257a926e149c9"}, - {file = "pyarrow-18.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:00178509f379415a3fcf855af020e3340254f990a8534294ec3cf674d6e255fd"}, - {file = "pyarrow-18.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:a71ab0589a63a3e987beb2bc172e05f000a5c5be2636b4b263c44034e215b5d7"}, - {file = "pyarrow-18.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:fe92efcdbfa0bcf2fa602e466d7f2905500f33f09eb90bf0bcf2e6ca41b574c8"}, - {file = "pyarrow-18.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:907ee0aa8ca576f5e0cdc20b5aeb2ad4d3953a3b4769fc4b499e00ef0266f02f"}, - {file = "pyarrow-18.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:66dcc216ebae2eb4c37b223feaf82f15b69d502821dde2da138ec5a3716e7463"}, - {file = "pyarrow-18.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc1daf7c425f58527900876354390ee41b0ae962a73ad0959b9d829def583bb1"}, - {file = "pyarrow-18.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:871b292d4b696b09120ed5bde894f79ee2a5f109cb84470546471df264cae136"}, - {file = "pyarrow-18.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:082ba62bdcb939824ba1ce10b8acef5ab621da1f4c4805e07bfd153617ac19d4"}, - {file = "pyarrow-18.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:2c664ab88b9766413197733c1720d3dcd4190e8fa3bbdc3710384630a0a7207b"}, - {file = "pyarrow-18.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:dc892be34dbd058e8d189b47db1e33a227d965ea8805a235c8a7286f7fd17d3a"}, - {file = "pyarrow-18.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:28f9c39a56d2c78bf6b87dcc699d520ab850919d4a8c7418cd20eda49874a2ea"}, - {file = "pyarrow-18.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:f1a198a50c409ab2d009fbf20956ace84567d67f2c5701511d4dd561fae6f32e"}, - {file = "pyarrow-18.0.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5bd7fd32e3ace012d43925ea4fc8bd1b02cc6cc1e9813b518302950e89b5a22"}, - {file = "pyarrow-18.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:336addb8b6f5208be1b2398442c703a710b6b937b1a046065ee4db65e782ff5a"}, - {file = "pyarrow-18.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:45476490dd4adec5472c92b4d253e245258745d0ccaabe706f8d03288ed60a79"}, - {file = "pyarrow-18.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:b46591222c864e7da7faa3b19455196416cd8355ff6c2cc2e65726a760a3c420"}, - {file = "pyarrow-18.0.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:eb7e3abcda7e1e6b83c2dc2909c8d045881017270a119cc6ee7fdcfe71d02df8"}, - {file = "pyarrow-18.0.0-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:09f30690b99ce34e0da64d20dab372ee54431745e4efb78ac938234a282d15f9"}, - {file = "pyarrow-18.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d5ca5d707e158540312e09fd907f9f49bacbe779ab5236d9699ced14d2293b8"}, - {file = "pyarrow-18.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6331f280c6e4521c69b201a42dd978f60f7e129511a55da9e0bfe426b4ebb8d"}, - {file = "pyarrow-18.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:3ac24b2be732e78a5a3ac0b3aa870d73766dd00beba6e015ea2ea7394f8b4e55"}, - {file = "pyarrow-18.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b30a927c6dff89ee702686596f27c25160dd6c99be5bcc1513a763ae5b1bfc03"}, - {file = "pyarrow-18.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:8f40ec677e942374e3d7f2fad6a67a4c2811a8b975e8703c6fd26d3b168a90e2"}, - {file = "pyarrow-18.0.0.tar.gz", hash = "sha256:a6aa027b1a9d2970cf328ccd6dbe4a996bc13c39fd427f502782f5bdb9ca20f5"}, + {file = "pyarrow-18.1.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:e21488d5cfd3d8b500b3238a6c4b075efabc18f0f6d80b29239737ebd69caa6c"}, + {file = "pyarrow-18.1.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:b516dad76f258a702f7ca0250885fc93d1fa5ac13ad51258e39d402bd9e2e1e4"}, + {file = "pyarrow-18.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f443122c8e31f4c9199cb23dca29ab9427cef990f283f80fe15b8e124bcc49b"}, + {file = "pyarrow-18.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0a03da7f2758645d17b7b4f83c8bffeae5bbb7f974523fe901f36288d2eab71"}, + {file = "pyarrow-18.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ba17845efe3aa358ec266cf9cc2800fa73038211fb27968bfa88acd09261a470"}, + {file = "pyarrow-18.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:3c35813c11a059056a22a3bef520461310f2f7eea5c8a11ef9de7062a23f8d56"}, + {file = "pyarrow-18.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:9736ba3c85129d72aefa21b4f3bd715bc4190fe4426715abfff90481e7d00812"}, + {file = "pyarrow-18.1.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:eaeabf638408de2772ce3d7793b2668d4bb93807deed1725413b70e3156a7854"}, + {file = "pyarrow-18.1.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:3b2e2239339c538f3464308fd345113f886ad031ef8266c6f004d49769bb074c"}, + {file = "pyarrow-18.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f39a2e0ed32a0970e4e46c262753417a60c43a3246972cfc2d3eb85aedd01b21"}, + {file = "pyarrow-18.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e31e9417ba9c42627574bdbfeada7217ad8a4cbbe45b9d6bdd4b62abbca4c6f6"}, + {file = "pyarrow-18.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:01c034b576ce0eef554f7c3d8c341714954be9b3f5d5bc7117006b85fcf302fe"}, + {file = "pyarrow-18.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:f266a2c0fc31995a06ebd30bcfdb7f615d7278035ec5b1cd71c48d56daaf30b0"}, + {file = "pyarrow-18.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:d4f13eee18433f99adefaeb7e01d83b59f73360c231d4782d9ddfaf1c3fbde0a"}, + {file = "pyarrow-18.1.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:9f3a76670b263dc41d0ae877f09124ab96ce10e4e48f3e3e4257273cee61ad0d"}, + {file = "pyarrow-18.1.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:da31fbca07c435be88a0c321402c4e31a2ba61593ec7473630769de8346b54ee"}, + {file = "pyarrow-18.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:543ad8459bc438efc46d29a759e1079436290bd583141384c6f7a1068ed6f992"}, + {file = "pyarrow-18.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0743e503c55be0fdb5c08e7d44853da27f19dc854531c0570f9f394ec9671d54"}, + {file = "pyarrow-18.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:d4b3d2a34780645bed6414e22dda55a92e0fcd1b8a637fba86800ad737057e33"}, + {file = "pyarrow-18.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:c52f81aa6f6575058d8e2c782bf79d4f9fdc89887f16825ec3a66607a5dd8e30"}, + {file = "pyarrow-18.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:0ad4892617e1a6c7a551cfc827e072a633eaff758fa09f21c4ee548c30bcaf99"}, + {file = "pyarrow-18.1.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:84e314d22231357d473eabec709d0ba285fa706a72377f9cc8e1cb3c8013813b"}, + {file = "pyarrow-18.1.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:f591704ac05dfd0477bb8f8e0bd4b5dc52c1cadf50503858dce3a15db6e46ff2"}, + {file = "pyarrow-18.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acb7564204d3c40babf93a05624fc6a8ec1ab1def295c363afc40b0c9e66c191"}, + {file = "pyarrow-18.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74de649d1d2ccb778f7c3afff6085bd5092aed4c23df9feeb45dd6b16f3811aa"}, + {file = "pyarrow-18.1.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:f96bd502cb11abb08efea6dab09c003305161cb6c9eafd432e35e76e7fa9b90c"}, + {file = "pyarrow-18.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:36ac22d7782554754a3b50201b607d553a8d71b78cdf03b33c1125be4b52397c"}, + {file = "pyarrow-18.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:25dbacab8c5952df0ca6ca0af28f50d45bd31c1ff6fcf79e2d120b4a65ee7181"}, + {file = "pyarrow-18.1.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6a276190309aba7bc9d5bd2933230458b3521a4317acfefe69a354f2fe59f2bc"}, + {file = "pyarrow-18.1.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:ad514dbfcffe30124ce655d72771ae070f30bf850b48bc4d9d3b25993ee0e386"}, + {file = "pyarrow-18.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aebc13a11ed3032d8dd6e7171eb6e86d40d67a5639d96c35142bd568b9299324"}, + {file = "pyarrow-18.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6cf5c05f3cee251d80e98726b5c7cc9f21bab9e9783673bac58e6dfab57ecc8"}, + {file = "pyarrow-18.1.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:11b676cd410cf162d3f6a70b43fb9e1e40affbc542a1e9ed3681895f2962d3d9"}, + {file = "pyarrow-18.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:b76130d835261b38f14fc41fdfb39ad8d672afb84c447126b84d5472244cfaba"}, + {file = "pyarrow-18.1.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:0b331e477e40f07238adc7ba7469c36b908f07c89b95dd4bd3a0ec84a3d1e21e"}, + {file = "pyarrow-18.1.0-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:2c4dd0c9010a25ba03e198fe743b1cc03cd33c08190afff371749c52ccbbaf76"}, + {file = "pyarrow-18.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f97b31b4c4e21ff58c6f330235ff893cc81e23da081b1a4b1c982075e0ed4e9"}, + {file = "pyarrow-18.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a4813cb8ecf1809871fd2d64a8eff740a1bd3691bbe55f01a3cf6c5ec869754"}, + {file = "pyarrow-18.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:05a5636ec3eb5cc2a36c6edb534a38ef57b2ab127292a716d00eabb887835f1e"}, + {file = "pyarrow-18.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:73eeed32e724ea3568bb06161cad5fa7751e45bc2228e33dcb10c614044165c7"}, + {file = "pyarrow-18.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:a1880dd6772b685e803011a6b43a230c23b566859a6e0c9a276c1e0faf4f4052"}, + {file = "pyarrow-18.1.0.tar.gz", hash = "sha256:9386d3ca9c145b5539a1cfc75df07757dff870168c959b473a0bccbc3abc8c73"}, ] [package.extras] @@ -5339,13 +5360,13 @@ websocket-client = "!=0.49" [[package]] name = "pytest" -version = "8.3.3" +version = "8.3.4" description = "pytest: simple powerful testing with Python" optional = true python-versions = ">=3.8" files = [ - {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"}, - {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"}, + {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, + {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, ] [package.dependencies] @@ -5922,101 +5943,114 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" -version = "0.21.0" +version = "0.22.1" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" files = [ - {file = "rpds_py-0.21.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a017f813f24b9df929674d0332a374d40d7f0162b326562daae8066b502d0590"}, - {file = "rpds_py-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:20cc1ed0bcc86d8e1a7e968cce15be45178fd16e2ff656a243145e0b439bd250"}, - {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad116dda078d0bc4886cb7840e19811562acdc7a8e296ea6ec37e70326c1b41c"}, - {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:808f1ac7cf3b44f81c9475475ceb221f982ef548e44e024ad5f9e7060649540e"}, - {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de552f4a1916e520f2703ec474d2b4d3f86d41f353e7680b597512ffe7eac5d0"}, - {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:efec946f331349dfc4ae9d0e034c263ddde19414fe5128580f512619abed05f1"}, - {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b80b4690bbff51a034bfde9c9f6bf9357f0a8c61f548942b80f7b66356508bf5"}, - {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:085ed25baac88953d4283e5b5bd094b155075bb40d07c29c4f073e10623f9f2e"}, - {file = "rpds_py-0.21.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:daa8efac2a1273eed2354397a51216ae1e198ecbce9036fba4e7610b308b6153"}, - {file = "rpds_py-0.21.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:95a5bad1ac8a5c77b4e658671642e4af3707f095d2b78a1fdd08af0dfb647624"}, - {file = "rpds_py-0.21.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3e53861b29a13d5b70116ea4230b5f0f3547b2c222c5daa090eb7c9c82d7f664"}, - {file = "rpds_py-0.21.0-cp310-none-win32.whl", hash = "sha256:ea3a6ac4d74820c98fcc9da4a57847ad2cc36475a8bd9683f32ab6d47a2bd682"}, - {file = "rpds_py-0.21.0-cp310-none-win_amd64.whl", hash = "sha256:b8f107395f2f1d151181880b69a2869c69e87ec079c49c0016ab96860b6acbe5"}, - {file = "rpds_py-0.21.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5555db3e618a77034954b9dc547eae94166391a98eb867905ec8fcbce1308d95"}, - {file = "rpds_py-0.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:97ef67d9bbc3e15584c2f3c74bcf064af36336c10d2e21a2131e123ce0f924c9"}, - {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ab2c2a26d2f69cdf833174f4d9d86118edc781ad9a8fa13970b527bf8236027"}, - {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4e8921a259f54bfbc755c5bbd60c82bb2339ae0324163f32868f63f0ebb873d9"}, - {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a7ff941004d74d55a47f916afc38494bd1cfd4b53c482b77c03147c91ac0ac3"}, - {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5145282a7cd2ac16ea0dc46b82167754d5e103a05614b724457cffe614f25bd8"}, - {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de609a6f1b682f70bb7163da745ee815d8f230d97276db049ab447767466a09d"}, - {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40c91c6e34cf016fa8e6b59d75e3dbe354830777fcfd74c58b279dceb7975b75"}, - {file = "rpds_py-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d2132377f9deef0c4db89e65e8bb28644ff75a18df5293e132a8d67748397b9f"}, - {file = "rpds_py-0.21.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0a9e0759e7be10109645a9fddaaad0619d58c9bf30a3f248a2ea57a7c417173a"}, - {file = "rpds_py-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e20da3957bdf7824afdd4b6eeb29510e83e026473e04952dca565170cd1ecc8"}, - {file = "rpds_py-0.21.0-cp311-none-win32.whl", hash = "sha256:f71009b0d5e94c0e86533c0b27ed7cacc1239cb51c178fd239c3cfefefb0400a"}, - {file = "rpds_py-0.21.0-cp311-none-win_amd64.whl", hash = "sha256:e168afe6bf6ab7ab46c8c375606298784ecbe3ba31c0980b7dcbb9631dcba97e"}, - {file = "rpds_py-0.21.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:30b912c965b2aa76ba5168fd610087bad7fcde47f0a8367ee8f1876086ee6d1d"}, - {file = "rpds_py-0.21.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ca9989d5d9b1b300bc18e1801c67b9f6d2c66b8fd9621b36072ed1df2c977f72"}, - {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f54e7106f0001244a5f4cf810ba8d3f9c542e2730821b16e969d6887b664266"}, - {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fed5dfefdf384d6fe975cc026886aece4f292feaf69d0eeb716cfd3c5a4dd8be"}, - {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:590ef88db231c9c1eece44dcfefd7515d8bf0d986d64d0caf06a81998a9e8cab"}, - {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f983e4c2f603c95dde63df633eec42955508eefd8d0f0e6d236d31a044c882d7"}, - {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b229ce052ddf1a01c67d68166c19cb004fb3612424921b81c46e7ea7ccf7c3bf"}, - {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ebf64e281a06c904a7636781d2e973d1f0926a5b8b480ac658dc0f556e7779f4"}, - {file = "rpds_py-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:998a8080c4495e4f72132f3d66ff91f5997d799e86cec6ee05342f8f3cda7dca"}, - {file = "rpds_py-0.21.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:98486337f7b4f3c324ab402e83453e25bb844f44418c066623db88e4c56b7c7b"}, - {file = "rpds_py-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a78d8b634c9df7f8d175451cfeac3810a702ccb85f98ec95797fa98b942cea11"}, - {file = "rpds_py-0.21.0-cp312-none-win32.whl", hash = "sha256:a58ce66847711c4aa2ecfcfaff04cb0327f907fead8945ffc47d9407f41ff952"}, - {file = "rpds_py-0.21.0-cp312-none-win_amd64.whl", hash = "sha256:e860f065cc4ea6f256d6f411aba4b1251255366e48e972f8a347cf88077b24fd"}, - {file = "rpds_py-0.21.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ee4eafd77cc98d355a0d02f263efc0d3ae3ce4a7c24740010a8b4012bbb24937"}, - {file = "rpds_py-0.21.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:688c93b77e468d72579351a84b95f976bd7b3e84aa6686be6497045ba84be560"}, - {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c38dbf31c57032667dd5a2f0568ccde66e868e8f78d5a0d27dcc56d70f3fcd3b"}, - {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2d6129137f43f7fa02d41542ffff4871d4aefa724a5fe38e2c31a4e0fd343fb0"}, - {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:520ed8b99b0bf86a176271f6fe23024323862ac674b1ce5b02a72bfeff3fff44"}, - {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aaeb25ccfb9b9014a10eaf70904ebf3f79faaa8e60e99e19eef9f478651b9b74"}, - {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af04ac89c738e0f0f1b913918024c3eab6e3ace989518ea838807177d38a2e94"}, - {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9b76e2afd585803c53c5b29e992ecd183f68285b62fe2668383a18e74abe7a3"}, - {file = "rpds_py-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5afb5efde74c54724e1a01118c6e5c15e54e642c42a1ba588ab1f03544ac8c7a"}, - {file = "rpds_py-0.21.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:52c041802a6efa625ea18027a0723676a778869481d16803481ef6cc02ea8cb3"}, - {file = "rpds_py-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee1e4fc267b437bb89990b2f2abf6c25765b89b72dd4a11e21934df449e0c976"}, - {file = "rpds_py-0.21.0-cp313-none-win32.whl", hash = "sha256:0c025820b78817db6a76413fff6866790786c38f95ea3f3d3c93dbb73b632202"}, - {file = "rpds_py-0.21.0-cp313-none-win_amd64.whl", hash = "sha256:320c808df533695326610a1b6a0a6e98f033e49de55d7dc36a13c8a30cfa756e"}, - {file = "rpds_py-0.21.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:2c51d99c30091f72a3c5d126fad26236c3f75716b8b5e5cf8effb18889ced928"}, - {file = "rpds_py-0.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cbd7504a10b0955ea287114f003b7ad62330c9e65ba012c6223dba646f6ffd05"}, - {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6dcc4949be728ede49e6244eabd04064336012b37f5c2200e8ec8eb2988b209c"}, - {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f414da5c51bf350e4b7960644617c130140423882305f7574b6cf65a3081cecb"}, - {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9afe42102b40007f588666bc7de82451e10c6788f6f70984629db193849dced1"}, - {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b929c2bb6e29ab31f12a1117c39f7e6d6450419ab7464a4ea9b0b417174f044"}, - {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8404b3717da03cbf773a1d275d01fec84ea007754ed380f63dfc24fb76ce4592"}, - {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e12bb09678f38b7597b8346983d2323a6482dcd59e423d9448108c1be37cac9d"}, - {file = "rpds_py-0.21.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:58a0e345be4b18e6b8501d3b0aa540dad90caeed814c515e5206bb2ec26736fd"}, - {file = "rpds_py-0.21.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c3761f62fcfccf0864cc4665b6e7c3f0c626f0380b41b8bd1ce322103fa3ef87"}, - {file = "rpds_py-0.21.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c2b2f71c6ad6c2e4fc9ed9401080badd1469fa9889657ec3abea42a3d6b2e1ed"}, - {file = "rpds_py-0.21.0-cp39-none-win32.whl", hash = "sha256:b21747f79f360e790525e6f6438c7569ddbfb1b3197b9e65043f25c3c9b489d8"}, - {file = "rpds_py-0.21.0-cp39-none-win_amd64.whl", hash = "sha256:0626238a43152918f9e72ede9a3b6ccc9e299adc8ade0d67c5e142d564c9a83d"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6b4ef7725386dc0762857097f6b7266a6cdd62bfd209664da6712cb26acef035"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6bc0e697d4d79ab1aacbf20ee5f0df80359ecf55db33ff41481cf3e24f206919"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da52d62a96e61c1c444f3998c434e8b263c384f6d68aca8274d2e08d1906325c"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:98e4fe5db40db87ce1c65031463a760ec7906ab230ad2249b4572c2fc3ef1f9f"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30bdc973f10d28e0337f71d202ff29345320f8bc49a31c90e6c257e1ccef4333"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:faa5e8496c530f9c71f2b4e1c49758b06e5f4055e17144906245c99fa6d45356"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32eb88c30b6a4f0605508023b7141d043a79b14acb3b969aa0b4f99b25bc7d4a"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a89a8ce9e4e75aeb7fa5d8ad0f3fecdee813802592f4f46a15754dcb2fd6b061"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:241e6c125568493f553c3d0fdbb38c74babf54b45cef86439d4cd97ff8feb34d"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:3b766a9f57663396e4f34f5140b3595b233a7b146e94777b97a8413a1da1be18"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:af4a644bf890f56e41e74be7d34e9511e4954894d544ec6b8efe1e21a1a8da6c"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3e30a69a706e8ea20444b98a49f386c17b26f860aa9245329bab0851ed100677"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:031819f906bb146561af051c7cef4ba2003d28cff07efacef59da973ff7969ba"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b876f2bc27ab5954e2fd88890c071bd0ed18b9c50f6ec3de3c50a5ece612f7a6"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc5695c321e518d9f03b7ea6abb5ea3af4567766f9852ad1560f501b17588c7b"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b4de1da871b5c0fd5537b26a6fc6814c3cc05cabe0c941db6e9044ffbb12f04a"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:878f6fea96621fda5303a2867887686d7a198d9e0f8a40be100a63f5d60c88c9"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8eeec67590e94189f434c6d11c426892e396ae59e4801d17a93ac96b8c02a6c"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ff2eba7f6c0cb523d7e9cff0903f2fe1feff8f0b2ceb6bd71c0e20a4dcee271"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a429b99337062877d7875e4ff1a51fe788424d522bd64a8c0a20ef3021fdb6ed"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d167e4dbbdac48bd58893c7e446684ad5d425b407f9336e04ab52e8b9194e2ed"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:4eb2de8a147ffe0626bfdc275fc6563aa7bf4b6db59cf0d44f0ccd6ca625a24e"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e78868e98f34f34a88e23ee9ccaeeec460e4eaf6db16d51d7a9b883e5e785a5e"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4991ca61656e3160cdaca4851151fd3f4a92e9eba5c7a530ab030d6aee96ec89"}, - {file = "rpds_py-0.21.0.tar.gz", hash = "sha256:ed6378c9d66d0de903763e7706383d60c33829581f0adff47b6535f1802fa6db"}, + {file = "rpds_py-0.22.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ab27dd4edd84b13309f268ffcdfc07aef8339135ffab7b6d43f16884307a2a48"}, + {file = "rpds_py-0.22.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9d5b925156a746dc1f5f52376fdd1fbdd3f6ffe1fcd6f5e06f77ca79abb940a3"}, + {file = "rpds_py-0.22.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:201650b309c419143775c15209c620627de3c09a27c7fb58375325aec5cce260"}, + {file = "rpds_py-0.22.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:31264187fc934ff1024a4f56775f33c9252d3f4f3e27ec07d1995a26b52702c3"}, + {file = "rpds_py-0.22.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97c5ffe47ccf92d8b17e10f8a5ce28d015aa1196edc3359684cf31504eae6a14"}, + {file = "rpds_py-0.22.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9ac7280bd045f472b50306d7efeee051b69e3a2dd1b90f46bd7e86e63b1efa2"}, + {file = "rpds_py-0.22.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f941fb86195f97be7f6efe04a21b223f05dfe4d1dfb159999e2f8d101e44cc4"}, + {file = "rpds_py-0.22.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f91bfc39f7a64168e08ab831fa497ec5438c1d6c6e2f9e12848d95ad11ac8523"}, + {file = "rpds_py-0.22.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:effcae2152afe7937a28376dbabb25c770ef99ed4e16a4ffeb8e6a4f7c4f06aa"}, + {file = "rpds_py-0.22.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:2177e59c033bf0d1bf7de1ced561205963583caf3242c6c700a723034bfb5f8e"}, + {file = "rpds_py-0.22.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:66f4f48a89cdd30ab3a47335df81c76e9a63799d0d84b29c0618371c66fa37b0"}, + {file = "rpds_py-0.22.1-cp310-cp310-win32.whl", hash = "sha256:b07fa9e634234e84096adfa4be3828c8f26e238679c122824b2b3d7131bec578"}, + {file = "rpds_py-0.22.1-cp310-cp310-win_amd64.whl", hash = "sha256:ca4657e9fd0b1b5376942d403d634ce188f79064f0873aa853ab05b10185ceec"}, + {file = "rpds_py-0.22.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:608c84699b2db09c6a8743845b1a3dad36fae53eaaecb241d45b13dff74405fb"}, + {file = "rpds_py-0.22.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9dae4eb9b5534e09ba6c6ab496a757e5e394b7e7b08767d25ca37e8d36491114"}, + {file = "rpds_py-0.22.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09a1f000c5f6e08b298275bae00921e9fbbf2a35dae0a86db2821c058c2201a9"}, + {file = "rpds_py-0.22.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:580ccbf11f02f948add4cb641843030a89f1463d7c0740cbfc9aca91e9dc34b3"}, + {file = "rpds_py-0.22.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96559e05bdf938b2048353e10a7920b98f853cefe4482c2064a718d7d0a50bd7"}, + {file = "rpds_py-0.22.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:128cbaed7ba26116820bcb992405d6a13ea18c8fca1b8c4f59906d858e91e979"}, + {file = "rpds_py-0.22.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:734783dd7da58f76222f458346ddebdb3621686a1a2a667db5049caf0c9956b9"}, + {file = "rpds_py-0.22.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c9ce6b83597d45bec44a2690857ede62fc98223772135f8a7fa90884eb726501"}, + {file = "rpds_py-0.22.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bca4428c4a957b78ded3e6e62884ab03f029dce8fa8d34818da0f80f61332b49"}, + {file = "rpds_py-0.22.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1ded65691a1d3fd7d2aa89d2c91aa51f941601bb2ce099739909034d957fef4b"}, + {file = "rpds_py-0.22.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:72407065ad459db9f3d052ea8c51e02534f02533fc61e51cbab3bd94166f086c"}, + {file = "rpds_py-0.22.1-cp311-cp311-win32.whl", hash = "sha256:eb013aa01b404219f28dc973d9e6310fd4db216d7299253dd355629952e0564e"}, + {file = "rpds_py-0.22.1-cp311-cp311-win_amd64.whl", hash = "sha256:8bd9ec1db79a664f4cbb12878693b73416f4d2cb425d3e27eccc1bdfbdc826ef"}, + {file = "rpds_py-0.22.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8ec41049c90d204a6561238a9ad6c7263ebb7009d9759c98b58078d9d2fec9ba"}, + {file = "rpds_py-0.22.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:102be79c4cc47a4aeb5912401185c404cd2601c15a7163bbecff7f1bfe20b669"}, + {file = "rpds_py-0.22.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a603155db408f773637f9e3a712c6e3cbc521aaa8fa2b99f9ba6106c59a2496"}, + {file = "rpds_py-0.22.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5dbff9402c2bdf00bf0df9905694b3c292a3847c725651938a72f554351a5fcb"}, + {file = "rpds_py-0.22.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96b3759d8ab2323324e0a92b2f44834f9d88089b8d1ab6f533b61f4be3411cef"}, + {file = "rpds_py-0.22.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3029f481b31f329b1fdb4ec4b56935d82210ddd9c6f86ea5a87c06f1e97b161"}, + {file = "rpds_py-0.22.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d280b4bf09f719b89fd9aab3b71067acc0d0449b7d1eba99a2ade4939cef8296"}, + {file = "rpds_py-0.22.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6c8e97e19aa7b0b0d801a159f932ce4435f1049c8c38e2bb372bb5bee559ce50"}, + {file = "rpds_py-0.22.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:50e4b5d291105f7063259fe0125b1af902fb34499444d7c5c521dd8328b00939"}, + {file = "rpds_py-0.22.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d3777c446bb1c5fcd82dc3f8776e1a146cd91e80cc1892f8634575ace438d22f"}, + {file = "rpds_py-0.22.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:447ae1104fb32197b9262f772d565d38e834cc2e9edd89350b37b88fed636e70"}, + {file = "rpds_py-0.22.1-cp312-cp312-win32.whl", hash = "sha256:55d371b9d8b0c2a68a50413a8cb01c3c3ce1ea4f768bf77b66669a9a486e101e"}, + {file = "rpds_py-0.22.1-cp312-cp312-win_amd64.whl", hash = "sha256:413a30a99d8683dace3765885920ed27ab662efbb6c98d81db76c397ad1ffd71"}, + {file = "rpds_py-0.22.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:aa2ba0176037c915d8660a4e46581d645e2c22b5373e466bc8640a794d45861a"}, + {file = "rpds_py-0.22.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4ba6c66fbc6015b2f99e7176fec41793cecb00c4cc357cad038dff85e6ac42ab"}, + {file = "rpds_py-0.22.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15fa4ca658f8ad22645d3531682b17e5580832efbfa87304c3e62214c79c1e8a"}, + {file = "rpds_py-0.22.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d7833ef6f5d6cb634f296abfd93452fb3eb44c4e9a6ae95c1021eab704c1cee2"}, + {file = "rpds_py-0.22.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c0467838c90435b80793cde486a318fc916ee57f2af54e4b10c72b20cbdcbaa9"}, + {file = "rpds_py-0.22.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d962e2e89b3a95e3597a34b8c93ced1e98958502c5b8096c9fd69deff279f561"}, + {file = "rpds_py-0.22.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ce729f1dc8a4a190c34b69f75377bddc004079b2963ab722ab91fafe040be6d"}, + {file = "rpds_py-0.22.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8080467df22feca0fc9c46567001777c6fbc2b4a2683a7137420896051874ca1"}, + {file = "rpds_py-0.22.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0f9eb37d3a60b262a98ab51ee899cac039de9ca0ce68dcf1a6518a09719020b0"}, + {file = "rpds_py-0.22.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:153248f48d6f90a295a502f53ec544a3ffbd21b0bb32f5dca39c4b93a764d6a2"}, + {file = "rpds_py-0.22.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0a53592cdf98cec3dfcdb24ffec8a4797e7656b65700099af43ec7df023b6de4"}, + {file = "rpds_py-0.22.1-cp313-cp313-win32.whl", hash = "sha256:e8056adcefa2dcb67e8bc91ea5eee26df66e8b297a8cd6ff0903f85c70908fa0"}, + {file = "rpds_py-0.22.1-cp313-cp313-win_amd64.whl", hash = "sha256:a451dba533be77454ebcffc85189108fc05f279100835ac76e7989edacb89156"}, + {file = "rpds_py-0.22.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:2ea23f1525d4f64286dbe0947c929d45c3ffe963b2dbed1d3844a2e4938bda42"}, + {file = "rpds_py-0.22.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3aaa22487477de9618ce3b37f99fbe81219ba96f3c2ca84f576f0ab451b83aba"}, + {file = "rpds_py-0.22.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8954b9ffe60f479a0c0ba40987db2546c735ab02a725ea7fd89342152d4d821d"}, + {file = "rpds_py-0.22.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c8502a02ae3ae67084f5a0bf5a8253b19fa7a887f824e41e016cdb0ac532a06f"}, + {file = "rpds_py-0.22.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a083221b6a4ecdef38a60c95d8d3223d99449cb4da2544e9644958dc16664eb9"}, + {file = "rpds_py-0.22.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:542eb246d5be31b5e0a9c8ddb9539416f9b31f58f75bd4ee328bff2b5c58d6fd"}, + {file = "rpds_py-0.22.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffae97d28ea4f2c613a751d087b75a97fb78311b38cc2e9a2f4587e473ace167"}, + {file = "rpds_py-0.22.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0ff8d5b13ce2357fa8b33a0a2e3775aa71df5bf7c8ba060634c9d15ab12f357"}, + {file = "rpds_py-0.22.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0f057a0c546c42964836b209d8de9ea1a4f4b0432006c6343cbe633d8ca14571"}, + {file = "rpds_py-0.22.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:48ee97c7c6027fd423058675b5a39d0b5f7a1648250b671563d5c9f74ff13ff0"}, + {file = "rpds_py-0.22.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:babec324e8654a59122aaa66936a9a483faa03276db9792f51332475c2dddc4a"}, + {file = "rpds_py-0.22.1-cp313-cp313t-win32.whl", hash = "sha256:e69acdbc132c9592c8dc393af85e38e206ca847c7019a953ff625191c3a12312"}, + {file = "rpds_py-0.22.1-cp313-cp313t-win_amd64.whl", hash = "sha256:c783e4ed68200f4e03c125690d23158b1c49c4b186d458a18debc109bbdc3c2e"}, + {file = "rpds_py-0.22.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:2143c3aed85992604d758bbe67da839fb4aab3dd2e1c6dddab5b3ca7162b34a2"}, + {file = "rpds_py-0.22.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f57e2d0f8022783426121b586d7c842ea40ea832a29e28ca36c881b54c74fb28"}, + {file = "rpds_py-0.22.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c0c324879d483504b07f7b18eb1b50567c434263bbe4866ecce33056162668a"}, + {file = "rpds_py-0.22.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1c40e02cc4f3e18fd39344edb10eebe04bd11cfd13119606b5771e5ea51630d3"}, + {file = "rpds_py-0.22.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f76c6f319e57007ad52e671ec741d801324760a377e3d4992c9bb8200333ebac"}, + {file = "rpds_py-0.22.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5cae9b415ea8a6a563566dbf46650222eccc5971c7daa16fbee63aef92ae543"}, + {file = "rpds_py-0.22.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b09209cdfcacf5eba9cf80367130532e6c02e695252e1f64d3cfcc2356e6e19f"}, + {file = "rpds_py-0.22.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dbe428d0ac6eacaf05402adbaf137f59ad6063848182d1ff294f95ce0f24005b"}, + {file = "rpds_py-0.22.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:626b9feb01bff049a5aec4804f0c58db12585778b4902e5376a95b01f80a7a16"}, + {file = "rpds_py-0.22.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ec1ccc2a9f764cd632fb8ab28fdde166250df54fc8d97315a4a6948dc5367639"}, + {file = "rpds_py-0.22.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ef92b1fbe6aa2e7885eb90853cc016b1fc95439a8cc8da6d526880e9e2148695"}, + {file = "rpds_py-0.22.1-cp39-cp39-win32.whl", hash = "sha256:c88535f83f7391cf3a45af990237e3939a6fdfbedaed2571633bfdd0bceb36b0"}, + {file = "rpds_py-0.22.1-cp39-cp39-win_amd64.whl", hash = "sha256:7839b7528faa4d134c183b1f2dd1ee4dc2ca2f899f4f0cfdf00fc04c255262a7"}, + {file = "rpds_py-0.22.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a0ed14a4162c2c2b21a162c9fcf90057e3e7da18cd171ab344c1e1664f75090e"}, + {file = "rpds_py-0.22.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:05fdeae9010533e47715c37df83264df0122584e40d691d50cf3607c060952a3"}, + {file = "rpds_py-0.22.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4659b2e4a5008715099e216050f5c6976e5a4329482664411789968b82e3f17d"}, + {file = "rpds_py-0.22.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a18aedc032d6468b73ebbe4437129cb30d54fe543cde2f23671ecad76c3aea24"}, + {file = "rpds_py-0.22.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149b4d875ef9b12a8f5e303e86a32a58f8ef627e57ec97a7d0e4be819069d141"}, + {file = "rpds_py-0.22.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdaee3947eaaa52dae3ceb9d9f66329e13d8bae35682b1e5dd54612938693934"}, + {file = "rpds_py-0.22.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36ce951800ed2acc6772fd9f42150f29d567f0423989748052fdb39d9e2b5795"}, + {file = "rpds_py-0.22.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ab784621d3e2a41916e21f13a483602cc989fd45fff637634b9231ba43d4383b"}, + {file = "rpds_py-0.22.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:c2a214bf5b79bd39a9de1c991353aaaacafda83ba1374178309e92be8e67d411"}, + {file = "rpds_py-0.22.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:85060e96953647871957d41707adb8d7bff4e977042fd0deb4fc1881b98dd2fe"}, + {file = "rpds_py-0.22.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:c6f3fd617db422c9d4e12cb8d84c984fe07d6d9cb0950cbf117f3bccc6268d05"}, + {file = "rpds_py-0.22.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f2d1b58a0c3a73f0361759642e80260a6d28eee6501b40fe25b82af33ef83f21"}, + {file = "rpds_py-0.22.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:76eaa4c087a061a2c8a0a92536405069878a8f530c00e84a9eaf332e70f5561f"}, + {file = "rpds_py-0.22.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:959ae04ed30cde606f3a0320f0a1f4167a107e685ef5209cce28c5080590bd31"}, + {file = "rpds_py-0.22.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:198067aa6f3d942ff5d0d655bb1e91b59ae85279d47590682cba2834ac1b97d2"}, + {file = "rpds_py-0.22.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3e7e99e2af59c56c59b6c964d612511b8203480d39d1ef83edc56f2cb42a3f5d"}, + {file = "rpds_py-0.22.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0545928bdf53dfdfcab284468212efefb8a6608ca3b6910c7fb2e5ed8bdc2dc0"}, + {file = "rpds_py-0.22.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef7282d8a14b60dd515e47060638687710b1d518f4b5e961caad43fb3a3606f9"}, + {file = "rpds_py-0.22.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe3f245c2f39a5692d9123c174bc48f6f9fe3e96407e67c6d04541a767d99e72"}, + {file = "rpds_py-0.22.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efb2ad60ca8637d5f9f653f9a9a8d73964059972b6b95036be77e028bffc68a3"}, + {file = "rpds_py-0.22.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d8306f27418361b788e3fca9f47dec125457f80122e7e31ba7ff5cdba98343f8"}, + {file = "rpds_py-0.22.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:4c8dc7331e8cbb1c0ea2bcb550adb1777365944ffd125c69aa1117fdef4887f5"}, + {file = "rpds_py-0.22.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:776a06cb5720556a549829896a49acebb5bdd96c7bba100191a994053546975a"}, + {file = "rpds_py-0.22.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e4f91d702b9ce1388660b3d4a28aa552614a1399e93f718ed0dacd68f23b3d32"}, + {file = "rpds_py-0.22.1.tar.gz", hash = "sha256:157a023bded0618a1eea54979fe2e0f9309e9ddc818ef4b8fc3b884ff38fedd5"}, ] [[package]] @@ -6174,60 +6208,68 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.35" +version = "2.0.36" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.35-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:67219632be22f14750f0d1c70e62f204ba69d28f62fd6432ba05ab295853de9b"}, - {file = "SQLAlchemy-2.0.35-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4668bd8faf7e5b71c0319407b608f278f279668f358857dbfd10ef1954ac9f90"}, - {file = "SQLAlchemy-2.0.35-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb8bea573863762bbf45d1e13f87c2d2fd32cee2dbd50d050f83f87429c9e1ea"}, - {file = "SQLAlchemy-2.0.35-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f552023710d4b93d8fb29a91fadf97de89c5926c6bd758897875435f2a939f33"}, - {file = "SQLAlchemy-2.0.35-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:016b2e665f778f13d3c438651dd4de244214b527a275e0acf1d44c05bc6026a9"}, - {file = "SQLAlchemy-2.0.35-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7befc148de64b6060937231cbff8d01ccf0bfd75aa26383ffdf8d82b12ec04ff"}, - {file = "SQLAlchemy-2.0.35-cp310-cp310-win32.whl", hash = "sha256:22b83aed390e3099584b839b93f80a0f4a95ee7f48270c97c90acd40ee646f0b"}, - {file = "SQLAlchemy-2.0.35-cp310-cp310-win_amd64.whl", hash = "sha256:a29762cd3d116585278ffb2e5b8cc311fb095ea278b96feef28d0b423154858e"}, - {file = "SQLAlchemy-2.0.35-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e21f66748ab725ade40fa7af8ec8b5019c68ab00b929f6643e1b1af461eddb60"}, - {file = "SQLAlchemy-2.0.35-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8a6219108a15fc6d24de499d0d515c7235c617b2540d97116b663dade1a54d62"}, - {file = "SQLAlchemy-2.0.35-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:042622a5306c23b972192283f4e22372da3b8ddf5f7aac1cc5d9c9b222ab3ff6"}, - {file = "SQLAlchemy-2.0.35-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:627dee0c280eea91aed87b20a1f849e9ae2fe719d52cbf847c0e0ea34464b3f7"}, - {file = "SQLAlchemy-2.0.35-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4fdcd72a789c1c31ed242fd8c1bcd9ea186a98ee8e5408a50e610edfef980d71"}, - {file = "SQLAlchemy-2.0.35-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:89b64cd8898a3a6f642db4eb7b26d1b28a497d4022eccd7717ca066823e9fb01"}, - {file = "SQLAlchemy-2.0.35-cp311-cp311-win32.whl", hash = "sha256:6a93c5a0dfe8d34951e8a6f499a9479ffb9258123551fa007fc708ae2ac2bc5e"}, - {file = "SQLAlchemy-2.0.35-cp311-cp311-win_amd64.whl", hash = "sha256:c68fe3fcde03920c46697585620135b4ecfdfc1ed23e75cc2c2ae9f8502c10b8"}, - {file = "SQLAlchemy-2.0.35-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:eb60b026d8ad0c97917cb81d3662d0b39b8ff1335e3fabb24984c6acd0c900a2"}, - {file = "SQLAlchemy-2.0.35-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6921ee01caf375363be5e9ae70d08ce7ca9d7e0e8983183080211a062d299468"}, - {file = "SQLAlchemy-2.0.35-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8cdf1a0dbe5ced887a9b127da4ffd7354e9c1a3b9bb330dce84df6b70ccb3a8d"}, - {file = "SQLAlchemy-2.0.35-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93a71c8601e823236ac0e5d087e4f397874a421017b3318fd92c0b14acf2b6db"}, - {file = "SQLAlchemy-2.0.35-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e04b622bb8a88f10e439084486f2f6349bf4d50605ac3e445869c7ea5cf0fa8c"}, - {file = "SQLAlchemy-2.0.35-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1b56961e2d31389aaadf4906d453859f35302b4eb818d34a26fab72596076bb8"}, - {file = "SQLAlchemy-2.0.35-cp312-cp312-win32.whl", hash = "sha256:0f9f3f9a3763b9c4deb8c5d09c4cc52ffe49f9876af41cc1b2ad0138878453cf"}, - {file = "SQLAlchemy-2.0.35-cp312-cp312-win_amd64.whl", hash = "sha256:25b0f63e7fcc2a6290cb5f7f5b4fc4047843504983a28856ce9b35d8f7de03cc"}, - {file = "SQLAlchemy-2.0.35-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f021d334f2ca692523aaf7bbf7592ceff70c8594fad853416a81d66b35e3abf9"}, - {file = "SQLAlchemy-2.0.35-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05c3f58cf91683102f2f0265c0db3bd3892e9eedabe059720492dbaa4f922da1"}, - {file = "SQLAlchemy-2.0.35-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:032d979ce77a6c2432653322ba4cbeabf5a6837f704d16fa38b5a05d8e21fa00"}, - {file = "SQLAlchemy-2.0.35-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:2e795c2f7d7249b75bb5f479b432a51b59041580d20599d4e112b5f2046437a3"}, - {file = "SQLAlchemy-2.0.35-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:cc32b2990fc34380ec2f6195f33a76b6cdaa9eecf09f0c9404b74fc120aef36f"}, - {file = "SQLAlchemy-2.0.35-cp37-cp37m-win32.whl", hash = "sha256:9509c4123491d0e63fb5e16199e09f8e262066e58903e84615c301dde8fa2e87"}, - {file = "SQLAlchemy-2.0.35-cp37-cp37m-win_amd64.whl", hash = "sha256:3655af10ebcc0f1e4e06c5900bb33e080d6a1fa4228f502121f28a3b1753cde5"}, - {file = "SQLAlchemy-2.0.35-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4c31943b61ed8fdd63dfd12ccc919f2bf95eefca133767db6fbbd15da62078ec"}, - {file = "SQLAlchemy-2.0.35-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a62dd5d7cc8626a3634208df458c5fe4f21200d96a74d122c83bc2015b333bc1"}, - {file = "SQLAlchemy-2.0.35-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0630774b0977804fba4b6bbea6852ab56c14965a2b0c7fc7282c5f7d90a1ae72"}, - {file = "SQLAlchemy-2.0.35-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d625eddf7efeba2abfd9c014a22c0f6b3796e0ffb48f5d5ab106568ef01ff5a"}, - {file = "SQLAlchemy-2.0.35-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ada603db10bb865bbe591939de854faf2c60f43c9b763e90f653224138f910d9"}, - {file = "SQLAlchemy-2.0.35-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c41411e192f8d3ea39ea70e0fae48762cd11a2244e03751a98bd3c0ca9a4e936"}, - {file = "SQLAlchemy-2.0.35-cp38-cp38-win32.whl", hash = "sha256:d299797d75cd747e7797b1b41817111406b8b10a4f88b6e8fe5b5e59598b43b0"}, - {file = "SQLAlchemy-2.0.35-cp38-cp38-win_amd64.whl", hash = "sha256:0375a141e1c0878103eb3d719eb6d5aa444b490c96f3fedab8471c7f6ffe70ee"}, - {file = "SQLAlchemy-2.0.35-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccae5de2a0140d8be6838c331604f91d6fafd0735dbdcee1ac78fc8fbaba76b4"}, - {file = "SQLAlchemy-2.0.35-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2a275a806f73e849e1c309ac11108ea1a14cd7058577aba962cd7190e27c9e3c"}, - {file = "SQLAlchemy-2.0.35-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:732e026240cdd1c1b2e3ac515c7a23820430ed94292ce33806a95869c46bd139"}, - {file = "SQLAlchemy-2.0.35-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:890da8cd1941fa3dab28c5bac3b9da8502e7e366f895b3b8e500896f12f94d11"}, - {file = "SQLAlchemy-2.0.35-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c0d8326269dbf944b9201911b0d9f3dc524d64779a07518199a58384c3d37a44"}, - {file = "SQLAlchemy-2.0.35-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b76d63495b0508ab9fc23f8152bac63205d2a704cd009a2b0722f4c8e0cba8e0"}, - {file = "SQLAlchemy-2.0.35-cp39-cp39-win32.whl", hash = "sha256:69683e02e8a9de37f17985905a5eca18ad651bf592314b4d3d799029797d0eb3"}, - {file = "SQLAlchemy-2.0.35-cp39-cp39-win_amd64.whl", hash = "sha256:aee110e4ef3c528f3abbc3c2018c121e708938adeeff9006428dd7c8555e9b3f"}, - {file = "SQLAlchemy-2.0.35-py3-none-any.whl", hash = "sha256:2ab3f0336c0387662ce6221ad30ab3a5e6499aab01b9790879b6578fd9b8faa1"}, - {file = "sqlalchemy-2.0.35.tar.gz", hash = "sha256:e11d7ea4d24f0a262bccf9a7cd6284c976c5369dac21db237cff59586045ab9f"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:59b8f3adb3971929a3e660337f5dacc5942c2cdb760afcabb2614ffbda9f9f72"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37350015056a553e442ff672c2d20e6f4b6d0b2495691fa239d8aa18bb3bc908"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8318f4776c85abc3f40ab185e388bee7a6ea99e7fa3a30686580b209eaa35c08"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c245b1fbade9c35e5bd3b64270ab49ce990369018289ecfde3f9c318411aaa07"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:69f93723edbca7342624d09f6704e7126b152eaed3cdbb634cb657a54332a3c5"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f9511d8dd4a6e9271d07d150fb2f81874a3c8c95e11ff9af3a2dfc35fe42ee44"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-win32.whl", hash = "sha256:c3f3631693003d8e585d4200730616b78fafd5a01ef8b698f6967da5c605b3fa"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-win_amd64.whl", hash = "sha256:a86bfab2ef46d63300c0f06936bd6e6c0105faa11d509083ba8f2f9d237fb5b5"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fd3a55deef00f689ce931d4d1b23fa9f04c880a48ee97af488fd215cf24e2a6c"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f5e9cd989b45b73bd359f693b935364f7e1f79486e29015813c338450aa5a71"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ddd9db6e59c44875211bc4c7953a9f6638b937b0a88ae6d09eb46cced54eff"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2519f3a5d0517fc159afab1015e54bb81b4406c278749779be57a569d8d1bb0d"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59b1ee96617135f6e1d6f275bbe988f419c5178016f3d41d3c0abb0c819f75bb"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:39769a115f730d683b0eb7b694db9789267bcd027326cccc3125e862eb03bfd8"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-win32.whl", hash = "sha256:66bffbad8d6271bb1cc2f9a4ea4f86f80fe5e2e3e501a5ae2a3dc6a76e604e6f"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-win_amd64.whl", hash = "sha256:23623166bfefe1487d81b698c423f8678e80df8b54614c2bf4b4cfcd7c711959"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7b64e6ec3f02c35647be6b4851008b26cff592a95ecb13b6788a54ef80bbdd4"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:46331b00096a6db1fdc052d55b101dbbfc99155a548e20a0e4a8e5e4d1362855"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdf3386a801ea5aba17c6410dd1dc8d39cf454ca2565541b5ac42a84e1e28f53"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9dfa18ff2a67b09b372d5db8743c27966abf0e5344c555d86cc7199f7ad83a"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:90812a8933df713fdf748b355527e3af257a11e415b613dd794512461eb8a686"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1bc330d9d29c7f06f003ab10e1eaced295e87940405afe1b110f2eb93a233588"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-win32.whl", hash = "sha256:79d2e78abc26d871875b419e1fd3c0bca31a1cb0043277d0d850014599626c2e"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-win_amd64.whl", hash = "sha256:b544ad1935a8541d177cb402948b94e871067656b3a0b9e91dbec136b06a2ff5"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b5cc79df7f4bc3d11e4b542596c03826063092611e481fcf1c9dfee3c94355ef"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3c01117dd36800f2ecaa238c65365b7b16497adc1522bf84906e5710ee9ba0e8"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bc633f4ee4b4c46e7adcb3a9b5ec083bf1d9a97c1d3854b92749d935de40b9b"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e46ed38affdfc95d2c958de328d037d87801cfcbea6d421000859e9789e61c2"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b2985c0b06e989c043f1dc09d4fe89e1616aadd35392aea2844f0458a989eacf"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a121d62ebe7d26fec9155f83f8be5189ef1405f5973ea4874a26fab9f1e262c"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-win32.whl", hash = "sha256:0572f4bd6f94752167adfd7c1bed84f4b240ee6203a95e05d1e208d488d0d436"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-win_amd64.whl", hash = "sha256:8c78ac40bde930c60e0f78b3cd184c580f89456dd87fc08f9e3ee3ce8765ce88"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:be9812b766cad94a25bc63bec11f88c4ad3629a0cec1cd5d4ba48dc23860486b"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aae840ebbd6cdd41af1c14590e5741665e5272d2fee999306673a1bb1fdb4d"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4557e1f11c5f653ebfdd924f3f9d5ebfc718283b0b9beebaa5dd6b77ec290971"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:07b441f7d03b9a66299ce7ccf3ef2900abc81c0db434f42a5694a37bd73870f2"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:28120ef39c92c2dd60f2721af9328479516844c6b550b077ca450c7d7dc68575"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-win32.whl", hash = "sha256:b81ee3d84803fd42d0b154cb6892ae57ea6b7c55d8359a02379965706c7efe6c"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-win_amd64.whl", hash = "sha256:f942a799516184c855e1a32fbc7b29d7e571b52612647866d4ec1c3242578fcb"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3d6718667da04294d7df1670d70eeddd414f313738d20a6f1d1f379e3139a545"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:72c28b84b174ce8af8504ca28ae9347d317f9dba3999e5981a3cd441f3712e24"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b11d0cfdd2b095e7b0686cf5fabeb9c67fae5b06d265d8180715b8cfa86522e3"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e32092c47011d113dc01ab3e1d3ce9f006a47223b18422c5c0d150af13a00687"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6a440293d802d3011028e14e4226da1434b373cbaf4a4bbb63f845761a708346"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c54a1e53a0c308a8e8a7dffb59097bff7facda27c70c286f005327f21b2bd6b1"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-win32.whl", hash = "sha256:1e0d612a17581b6616ff03c8e3d5eff7452f34655c901f75d62bd86449d9750e"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-win_amd64.whl", hash = "sha256:8958b10490125124463095bbdadda5aa22ec799f91958e410438ad6c97a7b793"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc022184d3e5cacc9579e41805a681187650e170eb2fd70e28b86192a479dcaa"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b817d41d692bf286abc181f8af476c4fbef3fd05e798777492618378448ee689"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4e46a888b54be23d03a89be510f24a7652fe6ff660787b96cd0e57a4ebcb46d"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4ae3005ed83f5967f961fd091f2f8c5329161f69ce8480aa8168b2d7fe37f06"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:03e08af7a5f9386a43919eda9de33ffda16b44eb11f3b313e6822243770e9763"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3dbb986bad3ed5ceaf090200eba750b5245150bd97d3e67343a3cfed06feecf7"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-win32.whl", hash = "sha256:9fe53b404f24789b5ea9003fc25b9a3988feddebd7e7b369c8fac27ad6f52f28"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-win_amd64.whl", hash = "sha256:af148a33ff0349f53512a049c6406923e4e02bf2f26c5fb285f143faf4f0e46a"}, + {file = "SQLAlchemy-2.0.36-py3-none-any.whl", hash = "sha256:fddbe92b4760c6f5d48162aef14824add991aeda8ddadb3c31d56eb15ca69f8e"}, + {file = "sqlalchemy-2.0.36.tar.gz", hash = "sha256:7f2767680b6d2398aea7082e45a774b2b0767b5c8d8ffb9c8b683088ea9b29c5"}, ] [package.dependencies] @@ -6240,7 +6282,7 @@ aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] -mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10)"] mssql = ["pyodbc"] mssql-pymssql = ["pymssql"] mssql-pyodbc = ["pyodbc"] @@ -6477,123 +6519,26 @@ files = [ [[package]] name = "tokenizers" -version = "0.20.3" +version = "0.21.0" description = "" optional = false python-versions = ">=3.7" files = [ - {file = "tokenizers-0.20.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:31ccab28dbb1a9fe539787210b0026e22debeab1662970f61c2d921f7557f7e4"}, - {file = "tokenizers-0.20.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c6361191f762bda98c773da418cf511cbaa0cb8d0a1196f16f8c0119bde68ff8"}, - {file = "tokenizers-0.20.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f128d5da1202b78fa0a10d8d938610472487da01b57098d48f7e944384362514"}, - {file = "tokenizers-0.20.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:79c4121a2e9433ad7ef0769b9ca1f7dd7fa4c0cd501763d0a030afcbc6384481"}, - {file = "tokenizers-0.20.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7850fde24197fe5cd6556e2fdba53a6d3bae67c531ea33a3d7c420b90904141"}, - {file = "tokenizers-0.20.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b357970c095dc134978a68c67d845a1e3803ab7c4fbb39195bde914e7e13cf8b"}, - {file = "tokenizers-0.20.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a333d878c4970b72d6c07848b90c05f6b045cf9273fc2bc04a27211721ad6118"}, - {file = "tokenizers-0.20.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fd9fee817f655a8f50049f685e224828abfadd436b8ff67979fc1d054b435f1"}, - {file = "tokenizers-0.20.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9e7816808b402129393a435ea2a509679b41246175d6e5e9f25b8692bfaa272b"}, - {file = "tokenizers-0.20.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba96367db9d8a730d3a1d5996b4b7babb846c3994b8ef14008cd8660f55db59d"}, - {file = "tokenizers-0.20.3-cp310-none-win32.whl", hash = "sha256:ee31ba9d7df6a98619426283e80c6359f167e2e9882d9ce1b0254937dbd32f3f"}, - {file = "tokenizers-0.20.3-cp310-none-win_amd64.whl", hash = "sha256:a845c08fdad554fe0871d1255df85772f91236e5fd6b9287ef8b64f5807dbd0c"}, - {file = "tokenizers-0.20.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:585b51e06ca1f4839ce7759941e66766d7b060dccfdc57c4ca1e5b9a33013a90"}, - {file = "tokenizers-0.20.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:61cbf11954f3b481d08723ebd048ba4b11e582986f9be74d2c3bdd9293a4538d"}, - {file = "tokenizers-0.20.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef820880d5e4e8484e2fa54ff8d297bb32519eaa7815694dc835ace9130a3eea"}, - {file = "tokenizers-0.20.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:67ef4dcb8841a4988cd00dd288fb95dfc8e22ed021f01f37348fd51c2b055ba9"}, - {file = "tokenizers-0.20.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff1ef8bd47a02b0dc191688ccb4da53600df5d4c9a05a4b68e1e3de4823e78eb"}, - {file = "tokenizers-0.20.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:444d188186eab3148baf0615b522461b41b1f0cd58cd57b862ec94b6ac9780f1"}, - {file = "tokenizers-0.20.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37c04c032c1442740b2c2d925f1857885c07619224a533123ac7ea71ca5713da"}, - {file = "tokenizers-0.20.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:453c7769d22231960ee0e883d1005c93c68015025a5e4ae56275406d94a3c907"}, - {file = "tokenizers-0.20.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4bb31f7b2847e439766aaa9cc7bccf7ac7088052deccdb2275c952d96f691c6a"}, - {file = "tokenizers-0.20.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:843729bf0f991b29655a069a2ff58a4c24375a553c70955e15e37a90dd4e045c"}, - {file = "tokenizers-0.20.3-cp311-none-win32.whl", hash = "sha256:efcce3a927b1e20ca694ba13f7a68c59b0bd859ef71e441db68ee42cf20c2442"}, - {file = "tokenizers-0.20.3-cp311-none-win_amd64.whl", hash = "sha256:88301aa0801f225725b6df5dea3d77c80365ff2362ca7e252583f2b4809c4cc0"}, - {file = "tokenizers-0.20.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:49d12a32e190fad0e79e5bdb788d05da2f20d8e006b13a70859ac47fecf6ab2f"}, - {file = "tokenizers-0.20.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:282848cacfb9c06d5e51489f38ec5aa0b3cd1e247a023061945f71f41d949d73"}, - {file = "tokenizers-0.20.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abe4e08c7d0cd6154c795deb5bf81d2122f36daf075e0c12a8b050d824ef0a64"}, - {file = "tokenizers-0.20.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ca94fc1b73b3883c98f0c88c77700b13d55b49f1071dfd57df2b06f3ff7afd64"}, - {file = "tokenizers-0.20.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef279c7e239f95c8bdd6ff319d9870f30f0d24915b04895f55b1adcf96d6c60d"}, - {file = "tokenizers-0.20.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16384073973f6ccbde9852157a4fdfe632bb65208139c9d0c0bd0176a71fd67f"}, - {file = "tokenizers-0.20.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:312d522caeb8a1a42ebdec87118d99b22667782b67898a76c963c058a7e41d4f"}, - {file = "tokenizers-0.20.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2b7cb962564785a83dafbba0144ecb7f579f1d57d8c406cdaa7f32fe32f18ad"}, - {file = "tokenizers-0.20.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:124c5882ebb88dadae1fc788a582299fcd3a8bd84fc3e260b9918cf28b8751f5"}, - {file = "tokenizers-0.20.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2b6e54e71f84c4202111a489879005cb14b92616a87417f6c102c833af961ea2"}, - {file = "tokenizers-0.20.3-cp312-none-win32.whl", hash = "sha256:83d9bfbe9af86f2d9df4833c22e94d94750f1d0cd9bfb22a7bb90a86f61cdb1c"}, - {file = "tokenizers-0.20.3-cp312-none-win_amd64.whl", hash = "sha256:44def74cee574d609a36e17c8914311d1b5dbcfe37c55fd29369d42591b91cf2"}, - {file = "tokenizers-0.20.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e0b630e0b536ef0e3c8b42c685c1bc93bd19e98c0f1543db52911f8ede42cf84"}, - {file = "tokenizers-0.20.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a02d160d2b19bcbfdf28bd9a4bf11be4cb97d0499c000d95d4c4b1a4312740b6"}, - {file = "tokenizers-0.20.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e3d80d89b068bc30034034b5319218c7c0a91b00af19679833f55f3becb6945"}, - {file = "tokenizers-0.20.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:174a54910bed1b089226512b4458ea60d6d6fd93060254734d3bc3540953c51c"}, - {file = "tokenizers-0.20.3-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:098b8a632b8656aa5802c46689462c5c48f02510f24029d71c208ec2c822e771"}, - {file = "tokenizers-0.20.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:78c8c143e3ae41e718588281eb3e212c2b31623c9d6d40410ec464d7d6221fb5"}, - {file = "tokenizers-0.20.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b26b0aadb18cd8701077362ba359a06683662d5cafe3e8e8aba10eb05c037f1"}, - {file = "tokenizers-0.20.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07d7851a72717321022f3774e84aa9d595a041d643fafa2e87fbc9b18711dac0"}, - {file = "tokenizers-0.20.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:bd44e48a430ada902c6266a8245f5036c4fe744fcb51f699999fbe82aa438797"}, - {file = "tokenizers-0.20.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:a4c186bb006ccbe1f5cc4e0380d1ce7806f5955c244074fd96abc55e27b77f01"}, - {file = "tokenizers-0.20.3-cp313-none-win32.whl", hash = "sha256:6e19e0f1d854d6ab7ea0c743d06e764d1d9a546932be0a67f33087645f00fe13"}, - {file = "tokenizers-0.20.3-cp313-none-win_amd64.whl", hash = "sha256:d50ede425c7e60966a9680d41b58b3a0950afa1bb570488e2972fa61662c4273"}, - {file = "tokenizers-0.20.3-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:9adda1ff5fb9dcdf899ceca672a4e2ce9e797adb512a6467305ca3d8bfcfbdd0"}, - {file = "tokenizers-0.20.3-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:6dde2cae6004ba7a3badff4a11911cae03ebf23e97eebfc0e71fef2530e5074f"}, - {file = "tokenizers-0.20.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4a7fd678b35614fca708579eb95b7587a5e8a6d328171bd2488fd9f27d82be4"}, - {file = "tokenizers-0.20.3-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1b80e3c7283a01a356bd2210f53d1a4a5d32b269c2024389ed0173137708d50e"}, - {file = "tokenizers-0.20.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8cc0e8176b762973758a77f0d9c4467d310e33165fb74173418ca3734944da4"}, - {file = "tokenizers-0.20.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5634b2e2f5f3d2b4439d2d74066e22eb4b1f04f3fea05cb2a3c12d89b5a3bcd"}, - {file = "tokenizers-0.20.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b4ba635165bc1ea46f2da8e5d80b5f70f6ec42161e38d96dbef33bb39df73964"}, - {file = "tokenizers-0.20.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18e4c7c64172e7789bd8b07aa3087ea87c4c4de7e90937a2aa036b5d92332536"}, - {file = "tokenizers-0.20.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1f74909ef7675c26d4095a817ec3393d67f3158ca4836c233212e5613ef640c4"}, - {file = "tokenizers-0.20.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0e9b81321a1e05b16487d312b4264984513f8b4a7556229cafac6e88c2036b09"}, - {file = "tokenizers-0.20.3-cp37-none-win32.whl", hash = "sha256:ab48184cd58b4a03022a2ec75b54c9f600ffea9a733612c02325ed636f353729"}, - {file = "tokenizers-0.20.3-cp37-none-win_amd64.whl", hash = "sha256:60ac483cebee1c12c71878523e768df02fa17e4c54412966cb3ac862c91b36c1"}, - {file = "tokenizers-0.20.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:3229ef103c89583d10b9378afa5d601b91e6337530a0988e17ca8d635329a996"}, - {file = "tokenizers-0.20.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6ac52cc24bad3de865c7e65b1c4e7b70d00938a8ae09a92a453b8f676e714ad5"}, - {file = "tokenizers-0.20.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04627b7b502fa6a2a005e1bd446fa4247d89abcb1afaa1b81eb90e21aba9a60f"}, - {file = "tokenizers-0.20.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c27ceb887f0e81a3c377eb4605dca7a95a81262761c0fba308d627b2abb98f2b"}, - {file = "tokenizers-0.20.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65ab780194da4e1fcf5670523a2f377c4838ebf5249efe41fa1eddd2a84fb49d"}, - {file = "tokenizers-0.20.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98d343134f47159e81f7f242264b0eb222e6b802f37173c8d7d7b64d5c9d1388"}, - {file = "tokenizers-0.20.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2475bb004ab2009d29aff13b5047bfdb3d4b474f0aa9d4faa13a7f34dbbbb43"}, - {file = "tokenizers-0.20.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b6583a65c01db1197c1eb36857ceba8ec329d53afadd268b42a6b04f4965724"}, - {file = "tokenizers-0.20.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:62d00ba208358c037eeab7bfc00a905adc67b2d31b68ab40ed09d75881e114ea"}, - {file = "tokenizers-0.20.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0fc7a39e5bedc817bda395a798dfe2d9c5f7c71153c90d381b5135a0328d9520"}, - {file = "tokenizers-0.20.3-cp38-none-win32.whl", hash = "sha256:84d40ee0f8550d64d3ea92dd7d24a8557a9172165bdb986c9fb2503b4fe4e3b6"}, - {file = "tokenizers-0.20.3-cp38-none-win_amd64.whl", hash = "sha256:205a45246ed7f1718cf3785cff88450ba603352412aaf220ace026384aa3f1c0"}, - {file = "tokenizers-0.20.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:93e37f0269a11dc3b1a953f1fca9707f0929ebf8b4063c591c71a0664219988e"}, - {file = "tokenizers-0.20.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f4cb0c614b0135e781de96c2af87e73da0389ac1458e2a97562ed26e29490d8d"}, - {file = "tokenizers-0.20.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7eb2fb1c432f5746b22f8a7f09fc18c4156cb0031c77f53cb19379d82d43297a"}, - {file = "tokenizers-0.20.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bfa8d029bb156181b006643309d6b673615a24e4ed24cf03aa191d599b996f51"}, - {file = "tokenizers-0.20.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f90549622de3bf476ad9f1dd6f3f952ec3ed6ab8615ae88ef060d0c5bfad55d"}, - {file = "tokenizers-0.20.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1d469c74eebf5c43fd61cd9b030e271d17198edd7bd45392e03a3c091d7d6d4"}, - {file = "tokenizers-0.20.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bee8f53b2594749f4460d53253bae55d718f04e9b633efa0f5df8938bd98e4f0"}, - {file = "tokenizers-0.20.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:938441babf3e5720e4459e306ef2809fb267680df9d1ff2873458b22aef60248"}, - {file = "tokenizers-0.20.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7310ab23d7b0caebecc0e8be11a1146f320f5f07284000f6ea54793e83de1b75"}, - {file = "tokenizers-0.20.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:16121eb030a2b13094cfec936b0c12e8b4063c5f839591ea7d0212336d8f9921"}, - {file = "tokenizers-0.20.3-cp39-none-win32.whl", hash = "sha256:401cc21ef642ee235985d747f65e18f639464d377c70836c9003df208d582064"}, - {file = "tokenizers-0.20.3-cp39-none-win_amd64.whl", hash = "sha256:7498f3ea7746133335a6adb67a77cf77227a8b82c8483f644a2e5f86fea42b8d"}, - {file = "tokenizers-0.20.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e919f2e3e68bb51dc31de4fcbbeff3bdf9c1cad489044c75e2b982a91059bd3c"}, - {file = "tokenizers-0.20.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b8e9608f2773996cc272156e305bd79066163a66b0390fe21750aff62df1ac07"}, - {file = "tokenizers-0.20.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39270a7050deaf50f7caff4c532c01b3c48f6608d42b3eacdebdc6795478c8df"}, - {file = "tokenizers-0.20.3-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e005466632b1c5d2d2120f6de8aa768cc9d36cd1ab7d51d0c27a114c91a1e6ee"}, - {file = "tokenizers-0.20.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a07962340b36189b6c8feda552ea1bfeee6cf067ff922a1d7760662c2ee229e5"}, - {file = "tokenizers-0.20.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:55046ad3dd5f2b3c67501fcc8c9cbe3e901d8355f08a3b745e9b57894855f85b"}, - {file = "tokenizers-0.20.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:efcf0eb939988b627558aaf2b9dc3e56d759cad2e0cfa04fcab378e4b48fc4fd"}, - {file = "tokenizers-0.20.3-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f3558a7ae6a6d38a77dfce12172a1e2e1bf3e8871e744a1861cd7591ea9ebe24"}, - {file = "tokenizers-0.20.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d53029fe44bc70c3ff14ef512460a0cf583495a0f8e2f4b70e26eb9438e38a9"}, - {file = "tokenizers-0.20.3-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57a2a56397b2bec5a629b516b23f0f8a3e4f978c7488d4a299980f8375954b85"}, - {file = "tokenizers-0.20.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e5bfaae740ef9ece000f8a07e78ac0e2b085c5ce9648f8593ddf0243c9f76d"}, - {file = "tokenizers-0.20.3-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:fbaf3ea28fedfb2283da60e710aff25492e795a7397cad8a50f1e079b65a5a70"}, - {file = "tokenizers-0.20.3-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:c47c037116310dc976eb96b008e41b9cfaba002ed8005848d4d632ee0b7ba9ae"}, - {file = "tokenizers-0.20.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c31751f0721f58f5e19bb27c1acc259aeff860d8629c4e1a900b26a1979ada8e"}, - {file = "tokenizers-0.20.3-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:c697cbd3be7a79ea250ea5f380d6f12e534c543cfb137d5c734966b3ee4f34cc"}, - {file = "tokenizers-0.20.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b48971b88ef9130bf35b41b35fd857c3c4dae4a9cd7990ebc7fc03e59cc92438"}, - {file = "tokenizers-0.20.3-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e615de179bbe060ab33773f0d98a8a8572b5883dd7dac66c1de8c056c7e748c"}, - {file = "tokenizers-0.20.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da1ec842035ed9999c62e45fbe0ff14b7e8a7e02bb97688cc6313cf65e5cd755"}, - {file = "tokenizers-0.20.3-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:6ee4954c1dd23aadc27958dad759006e71659d497dcb0ef0c7c87ea992c16ebd"}, - {file = "tokenizers-0.20.3-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3eda46ca402751ec82553a321bf35a617b76bbed7586e768c02ccacbdda94d6d"}, - {file = "tokenizers-0.20.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:de082392a85eb0055cc055c535bff2f0cc15d7a000bdc36fbf601a0f3cf8507a"}, - {file = "tokenizers-0.20.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c3db46cc0647bfd88263afdb739b92017a02a87ee30945cb3e86c7e25c7c9917"}, - {file = "tokenizers-0.20.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a292392f24ab9abac5cfa8197e5a6208f2e43723420217e1ceba0b4ec77816ac"}, - {file = "tokenizers-0.20.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dcd91f4e60f62b20d83a87a84fe062035a1e3ff49a8c2bbdeb2d441c8e311f4"}, - {file = "tokenizers-0.20.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:900991a2b8ee35961b1095db7e265342e0e42a84c1a594823d5ee9f8fb791958"}, - {file = "tokenizers-0.20.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:5a8d8261ca2133d4f98aa9627c748189502b3787537ba3d7e2beb4f7cfc5d627"}, - {file = "tokenizers-0.20.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:c4fd4d71e6deb6ddf99d8d0eab87d1d16f635898906e631914a9bae8ae9f2cfb"}, - {file = "tokenizers-0.20.3.tar.gz", hash = "sha256:2278b34c5d0dd78e087e1ca7f9b1dcbf129d80211afa645f214bd6e051037539"}, + {file = "tokenizers-0.21.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:3c4c93eae637e7d2aaae3d376f06085164e1660f89304c0ab2b1d08a406636b2"}, + {file = "tokenizers-0.21.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:f53ea537c925422a2e0e92a24cce96f6bc5046bbef24a1652a5edc8ba975f62e"}, + {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b177fb54c4702ef611de0c069d9169f0004233890e0c4c5bd5508ae05abf193"}, + {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6b43779a269f4629bebb114e19c3fca0223296ae9fea8bb9a7a6c6fb0657ff8e"}, + {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9aeb255802be90acfd363626753fda0064a8df06031012fe7d52fd9a905eb00e"}, + {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8b09dbeb7a8d73ee204a70f94fc06ea0f17dcf0844f16102b9f414f0b7463ba"}, + {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:400832c0904f77ce87c40f1a8a27493071282f785724ae62144324f171377273"}, + {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84ca973b3a96894d1707e189c14a774b701596d579ffc7e69debfc036a61a04"}, + {file = "tokenizers-0.21.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:eb7202d231b273c34ec67767378cd04c767e967fda12d4a9e36208a34e2f137e"}, + {file = "tokenizers-0.21.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:089d56db6782a73a27fd8abf3ba21779f5b85d4a9f35e3b493c7bbcbbf0d539b"}, + {file = "tokenizers-0.21.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:c87ca3dc48b9b1222d984b6b7490355a6fdb411a2d810f6f05977258400ddb74"}, + {file = "tokenizers-0.21.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4145505a973116f91bc3ac45988a92e618a6f83eb458f49ea0790df94ee243ff"}, + {file = "tokenizers-0.21.0-cp39-abi3-win32.whl", hash = "sha256:eb1702c2f27d25d9dd5b389cc1f2f51813e99f8ca30d9e25348db6585a97e24a"}, + {file = "tokenizers-0.21.0-cp39-abi3-win_amd64.whl", hash = "sha256:87841da5a25a3a5f70c102de371db120f41873b854ba65e52bccd57df5a3780c"}, + {file = "tokenizers-0.21.0.tar.gz", hash = "sha256:ee0894bf311b75b0c03079f33859ae4b2334d675d4e93f5a4132e1eae2834fe4"}, ] [package.dependencies] @@ -6606,51 +6551,81 @@ testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] [[package]] name = "tomli" -version = "2.1.0" +version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" files = [ - {file = "tomli-2.1.0-py3-none-any.whl", hash = "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"}, - {file = "tomli-2.1.0.tar.gz", hash = "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] [[package]] name = "tornado" -version = "6.4.1" +version = "6.4.2" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false python-versions = ">=3.8" files = [ - {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, - {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, - {file = "tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4"}, - {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842"}, - {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3"}, - {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f"}, - {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4"}, - {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698"}, - {file = "tornado-6.4.1-cp38-abi3-win32.whl", hash = "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d"}, - {file = "tornado-6.4.1-cp38-abi3-win_amd64.whl", hash = "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7"}, - {file = "tornado-6.4.1.tar.gz", hash = "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9"}, + {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1"}, + {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c"}, + {file = "tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482"}, + {file = "tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38"}, + {file = "tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b"}, ] [[package]] name = "tqdm" -version = "4.67.0" +version = "4.67.1" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.67.0-py3-none-any.whl", hash = "sha256:0cd8af9d56911acab92182e88d763100d4788bdf421d251616040cc4d44863be"}, - {file = "tqdm-4.67.0.tar.gz", hash = "sha256:fe5a6f95e6fe0b9755e9469b77b9c3cf850048224ecaa8293d7d2d31f97d869a"}, + {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, + {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] discord = ["requests"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] @@ -6929,13 +6904,13 @@ test = ["aiohttp (>=3.10.5)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", [[package]] name = "virtualenv" -version = "20.27.1" +version = "20.28.0" description = "Virtual Python Environment builder" optional = true python-versions = ">=3.8" files = [ - {file = "virtualenv-20.27.1-py3-none-any.whl", hash = "sha256:f11f1b8a29525562925f745563bfd48b189450f61fb34c4f9cc79dd5aa32a1f4"}, - {file = "virtualenv-20.27.1.tar.gz", hash = "sha256:142c6be10212543b32c6c45d3d3893dff89112cc588b7d0879ae5a1ec03a47ba"}, + {file = "virtualenv-20.28.0-py3-none-any.whl", hash = "sha256:23eae1b4516ecd610481eda647f3a7c09aea295055337331bb4e6892ecce47b0"}, + {file = "virtualenv-20.28.0.tar.gz", hash = "sha256:2c9c3262bb8e7b87ea801d715fae4495e6032450c71d2309be9550e7364049aa"}, ] [package.dependencies] @@ -6949,94 +6924,82 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess [[package]] name = "watchfiles" -version = "0.24.0" +version = "1.0.0" description = "Simple, modern and high performance file watching and code reload in python." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "watchfiles-0.24.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:083dc77dbdeef09fa44bb0f4d1df571d2e12d8a8f985dccde71ac3ac9ac067a0"}, - {file = "watchfiles-0.24.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e94e98c7cb94cfa6e071d401ea3342767f28eb5a06a58fafdc0d2a4974f4f35c"}, - {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82ae557a8c037c42a6ef26c494d0631cacca040934b101d001100ed93d43f361"}, - {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:acbfa31e315a8f14fe33e3542cbcafc55703b8f5dcbb7c1eecd30f141df50db3"}, - {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b74fdffce9dfcf2dc296dec8743e5b0332d15df19ae464f0e249aa871fc1c571"}, - {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:449f43f49c8ddca87c6b3980c9284cab6bd1f5c9d9a2b00012adaaccd5e7decd"}, - {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4abf4ad269856618f82dee296ac66b0cd1d71450fc3c98532d93798e73399b7a"}, - {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f895d785eb6164678ff4bb5cc60c5996b3ee6df3edb28dcdeba86a13ea0465e"}, - {file = "watchfiles-0.24.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7ae3e208b31be8ce7f4c2c0034f33406dd24fbce3467f77223d10cd86778471c"}, - {file = "watchfiles-0.24.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2efec17819b0046dde35d13fb8ac7a3ad877af41ae4640f4109d9154ed30a188"}, - {file = "watchfiles-0.24.0-cp310-none-win32.whl", hash = "sha256:6bdcfa3cd6fdbdd1a068a52820f46a815401cbc2cb187dd006cb076675e7b735"}, - {file = "watchfiles-0.24.0-cp310-none-win_amd64.whl", hash = "sha256:54ca90a9ae6597ae6dc00e7ed0a040ef723f84ec517d3e7ce13e63e4bc82fa04"}, - {file = "watchfiles-0.24.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:bdcd5538e27f188dd3c804b4a8d5f52a7fc7f87e7fd6b374b8e36a4ca03db428"}, - {file = "watchfiles-0.24.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2dadf8a8014fde6addfd3c379e6ed1a981c8f0a48292d662e27cabfe4239c83c"}, - {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6509ed3f467b79d95fc62a98229f79b1a60d1b93f101e1c61d10c95a46a84f43"}, - {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8360f7314a070c30e4c976b183d1d8d1585a4a50c5cb603f431cebcbb4f66327"}, - {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:316449aefacf40147a9efaf3bd7c9bdd35aaba9ac5d708bd1eb5763c9a02bef5"}, - {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73bde715f940bea845a95247ea3e5eb17769ba1010efdc938ffcb967c634fa61"}, - {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3770e260b18e7f4e576edca4c0a639f704088602e0bc921c5c2e721e3acb8d15"}, - {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa0fd7248cf533c259e59dc593a60973a73e881162b1a2f73360547132742823"}, - {file = "watchfiles-0.24.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d7a2e3b7f5703ffbd500dabdefcbc9eafeff4b9444bbdd5d83d79eedf8428fab"}, - {file = "watchfiles-0.24.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d831ee0a50946d24a53821819b2327d5751b0c938b12c0653ea5be7dea9c82ec"}, - {file = "watchfiles-0.24.0-cp311-none-win32.whl", hash = "sha256:49d617df841a63b4445790a254013aea2120357ccacbed00253f9c2b5dc24e2d"}, - {file = "watchfiles-0.24.0-cp311-none-win_amd64.whl", hash = "sha256:d3dcb774e3568477275cc76554b5a565024b8ba3a0322f77c246bc7111c5bb9c"}, - {file = "watchfiles-0.24.0-cp311-none-win_arm64.whl", hash = "sha256:9301c689051a4857d5b10777da23fafb8e8e921bcf3abe6448a058d27fb67633"}, - {file = "watchfiles-0.24.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7211b463695d1e995ca3feb38b69227e46dbd03947172585ecb0588f19b0d87a"}, - {file = "watchfiles-0.24.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4b8693502d1967b00f2fb82fc1e744df128ba22f530e15b763c8d82baee15370"}, - {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdab9555053399318b953a1fe1f586e945bc8d635ce9d05e617fd9fe3a4687d6"}, - {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:34e19e56d68b0dad5cff62273107cf5d9fbaf9d75c46277aa5d803b3ef8a9e9b"}, - {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:41face41f036fee09eba33a5b53a73e9a43d5cb2c53dad8e61fa6c9f91b5a51e"}, - {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5148c2f1ea043db13ce9b0c28456e18ecc8f14f41325aa624314095b6aa2e9ea"}, - {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e4bd963a935aaf40b625c2499f3f4f6bbd0c3776f6d3bc7c853d04824ff1c9f"}, - {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c79d7719d027b7a42817c5d96461a99b6a49979c143839fc37aa5748c322f234"}, - {file = "watchfiles-0.24.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:32aa53a9a63b7f01ed32e316e354e81e9da0e6267435c7243bf8ae0f10b428ef"}, - {file = "watchfiles-0.24.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce72dba6a20e39a0c628258b5c308779b8697f7676c254a845715e2a1039b968"}, - {file = "watchfiles-0.24.0-cp312-none-win32.whl", hash = "sha256:d9018153cf57fc302a2a34cb7564870b859ed9a732d16b41a9b5cb2ebed2d444"}, - {file = "watchfiles-0.24.0-cp312-none-win_amd64.whl", hash = "sha256:551ec3ee2a3ac9cbcf48a4ec76e42c2ef938a7e905a35b42a1267fa4b1645896"}, - {file = "watchfiles-0.24.0-cp312-none-win_arm64.whl", hash = "sha256:b52a65e4ea43c6d149c5f8ddb0bef8d4a1e779b77591a458a893eb416624a418"}, - {file = "watchfiles-0.24.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3d2e3ab79a1771c530233cadfd277fcc762656d50836c77abb2e5e72b88e3a48"}, - {file = "watchfiles-0.24.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:327763da824817b38ad125dcd97595f942d720d32d879f6c4ddf843e3da3fe90"}, - {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd82010f8ab451dabe36054a1622870166a67cf3fce894f68895db6f74bbdc94"}, - {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d64ba08db72e5dfd5c33be1e1e687d5e4fcce09219e8aee893a4862034081d4e"}, - {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1cf1f6dd7825053f3d98f6d33f6464ebdd9ee95acd74ba2c34e183086900a827"}, - {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43e3e37c15a8b6fe00c1bce2473cfa8eb3484bbeecf3aefbf259227e487a03df"}, - {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88bcd4d0fe1d8ff43675360a72def210ebad3f3f72cabfeac08d825d2639b4ab"}, - {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:999928c6434372fde16c8f27143d3e97201160b48a614071261701615a2a156f"}, - {file = "watchfiles-0.24.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:30bbd525c3262fd9f4b1865cb8d88e21161366561cd7c9e1194819e0a33ea86b"}, - {file = "watchfiles-0.24.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:edf71b01dec9f766fb285b73930f95f730bb0943500ba0566ae234b5c1618c18"}, - {file = "watchfiles-0.24.0-cp313-none-win32.whl", hash = "sha256:f4c96283fca3ee09fb044f02156d9570d156698bc3734252175a38f0e8975f07"}, - {file = "watchfiles-0.24.0-cp313-none-win_amd64.whl", hash = "sha256:a974231b4fdd1bb7f62064a0565a6b107d27d21d9acb50c484d2cdba515b9366"}, - {file = "watchfiles-0.24.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ee82c98bed9d97cd2f53bdb035e619309a098ea53ce525833e26b93f673bc318"}, - {file = "watchfiles-0.24.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fd92bbaa2ecdb7864b7600dcdb6f2f1db6e0346ed425fbd01085be04c63f0b05"}, - {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f83df90191d67af5a831da3a33dd7628b02a95450e168785586ed51e6d28943c"}, - {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fca9433a45f18b7c779d2bae7beeec4f740d28b788b117a48368d95a3233ed83"}, - {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b995bfa6bf01a9e09b884077a6d37070464b529d8682d7691c2d3b540d357a0c"}, - {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed9aba6e01ff6f2e8285e5aa4154e2970068fe0fc0998c4380d0e6278222269b"}, - {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5171ef898299c657685306d8e1478a45e9303ddcd8ac5fed5bd52ad4ae0b69b"}, - {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4933a508d2f78099162da473841c652ad0de892719043d3f07cc83b33dfd9d91"}, - {file = "watchfiles-0.24.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95cf3b95ea665ab03f5a54765fa41abf0529dbaf372c3b83d91ad2cfa695779b"}, - {file = "watchfiles-0.24.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:01def80eb62bd5db99a798d5e1f5f940ca0a05986dcfae21d833af7a46f7ee22"}, - {file = "watchfiles-0.24.0-cp38-none-win32.whl", hash = "sha256:4d28cea3c976499475f5b7a2fec6b3a36208656963c1a856d328aeae056fc5c1"}, - {file = "watchfiles-0.24.0-cp38-none-win_amd64.whl", hash = "sha256:21ab23fdc1208086d99ad3f69c231ba265628014d4aed31d4e8746bd59e88cd1"}, - {file = "watchfiles-0.24.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b665caeeda58625c3946ad7308fbd88a086ee51ccb706307e5b1fa91556ac886"}, - {file = "watchfiles-0.24.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5c51749f3e4e269231510da426ce4a44beb98db2dce9097225c338f815b05d4f"}, - {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82b2509f08761f29a0fdad35f7e1638b8ab1adfa2666d41b794090361fb8b855"}, - {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a60e2bf9dc6afe7f743e7c9b149d1fdd6dbf35153c78fe3a14ae1a9aee3d98b"}, - {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7d9b87c4c55e3ea8881dfcbf6d61ea6775fffed1fedffaa60bd047d3c08c430"}, - {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:78470906a6be5199524641f538bd2c56bb809cd4bf29a566a75051610bc982c3"}, - {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07cdef0c84c03375f4e24642ef8d8178e533596b229d32d2bbd69e5128ede02a"}, - {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d337193bbf3e45171c8025e291530fb7548a93c45253897cd764a6a71c937ed9"}, - {file = "watchfiles-0.24.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ec39698c45b11d9694a1b635a70946a5bad066b593af863460a8e600f0dff1ca"}, - {file = "watchfiles-0.24.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e28d91ef48eab0afb939fa446d8ebe77e2f7593f5f463fd2bb2b14132f95b6e"}, - {file = "watchfiles-0.24.0-cp39-none-win32.whl", hash = "sha256:7138eff8baa883aeaa074359daabb8b6c1e73ffe69d5accdc907d62e50b1c0da"}, - {file = "watchfiles-0.24.0-cp39-none-win_amd64.whl", hash = "sha256:b3ef2c69c655db63deb96b3c3e587084612f9b1fa983df5e0c3379d41307467f"}, - {file = "watchfiles-0.24.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:632676574429bee8c26be8af52af20e0c718cc7f5f67f3fb658c71928ccd4f7f"}, - {file = "watchfiles-0.24.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a2a9891723a735d3e2540651184be6fd5b96880c08ffe1a98bae5017e65b544b"}, - {file = "watchfiles-0.24.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7fa2bc0efef3e209a8199fd111b8969fe9db9c711acc46636686331eda7dd4"}, - {file = "watchfiles-0.24.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01550ccf1d0aed6ea375ef259706af76ad009ef5b0203a3a4cce0f6024f9b68a"}, - {file = "watchfiles-0.24.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:96619302d4374de5e2345b2b622dc481257a99431277662c30f606f3e22f42be"}, - {file = "watchfiles-0.24.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:85d5f0c7771dcc7a26c7a27145059b6bb0ce06e4e751ed76cdf123d7039b60b5"}, - {file = "watchfiles-0.24.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:951088d12d339690a92cef2ec5d3cfd957692834c72ffd570ea76a6790222777"}, - {file = "watchfiles-0.24.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49fb58bcaa343fedc6a9e91f90195b20ccb3135447dc9e4e2570c3a39565853e"}, - {file = "watchfiles-0.24.0.tar.gz", hash = "sha256:afb72325b74fa7a428c009c1b8be4b4d7c2afedafb2982827ef2156646df2fe1"}, + {file = "watchfiles-1.0.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:1d19df28f99d6a81730658fbeb3ade8565ff687f95acb59665f11502b441be5f"}, + {file = "watchfiles-1.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:28babb38cf2da8e170b706c4b84aa7e4528a6fa4f3ee55d7a0866456a1662041"}, + {file = "watchfiles-1.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12ab123135b2f42517f04e720526d41448667ae8249e651385afb5cda31fedc0"}, + {file = "watchfiles-1.0.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:13a4f9ee0cd25682679eea5c14fc629e2eaa79aab74d963bc4e21f43b8ea1877"}, + {file = "watchfiles-1.0.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e1d9284cc84de7855fcf83472e51d32daf6f6cecd094160192628bc3fee1b78"}, + {file = "watchfiles-1.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ee5edc939f53466b329bbf2e58333a5461e6c7b50c980fa6117439e2c18b42d"}, + {file = "watchfiles-1.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dccfc70480087567720e4e36ec381bba1ed68d7e5f368fe40c93b3b1eba0105"}, + {file = "watchfiles-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c83a6d33a9eda0af6a7470240d1af487807adc269704fe76a4972dd982d16236"}, + {file = "watchfiles-1.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:905f69aad276639eff3893759a07d44ea99560e67a1cf46ff389cd62f88872a2"}, + {file = "watchfiles-1.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:09551237645d6bff3972592f2aa5424df9290e7a2e15d63c5f47c48cde585935"}, + {file = "watchfiles-1.0.0-cp310-none-win32.whl", hash = "sha256:d2b39aa8edd9e5f56f99a2a2740a251dc58515398e9ed5a4b3e5ff2827060755"}, + {file = "watchfiles-1.0.0-cp310-none-win_amd64.whl", hash = "sha256:2de52b499e1ab037f1a87cb8ebcb04a819bf087b1015a4cf6dcf8af3c2a2613e"}, + {file = "watchfiles-1.0.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:fbd0ab7a9943bbddb87cbc2bf2f09317e74c77dc55b1f5657f81d04666c25269"}, + {file = "watchfiles-1.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:774ef36b16b7198669ce655d4f75b4c3d370e7f1cbdfb997fb10ee98717e2058"}, + {file = "watchfiles-1.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b4fb98100267e6a5ebaff6aaa5d20aea20240584647470be39fe4823012ac96"}, + {file = "watchfiles-1.0.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0fc3bf0effa2d8075b70badfdd7fb839d7aa9cea650d17886982840d71fdeabf"}, + {file = "watchfiles-1.0.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:648e2b6db53eca6ef31245805cd528a16f56fa4cc15aeec97795eaf713c11435"}, + {file = "watchfiles-1.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa13d604fcb9417ae5f2e3de676e66aa97427d888e83662ad205bed35a313176"}, + {file = "watchfiles-1.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:936f362e7ff28311b16f0b97ec51e8f2cc451763a3264640c6ed40fb252d1ee4"}, + {file = "watchfiles-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:245fab124b9faf58430da547512d91734858df13f2ddd48ecfa5e493455ffccb"}, + {file = "watchfiles-1.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4ff9c7e84e8b644a8f985c42bcc81457240316f900fc72769aaedec9d088055a"}, + {file = "watchfiles-1.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9c9a8d8fd97defe935ef8dd53d562e68942ad65067cd1c54d6ed8a088b1d931d"}, + {file = "watchfiles-1.0.0-cp311-none-win32.whl", hash = "sha256:a0abf173975eb9dd17bb14c191ee79999e650997cc644562f91df06060610e62"}, + {file = "watchfiles-1.0.0-cp311-none-win_amd64.whl", hash = "sha256:2a825ba4b32c214e3855b536eb1a1f7b006511d8e64b8215aac06eb680642d84"}, + {file = "watchfiles-1.0.0-cp311-none-win_arm64.whl", hash = "sha256:a5a7a06cfc65e34fd0a765a7623c5ba14707a0870703888e51d3d67107589817"}, + {file = "watchfiles-1.0.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:28fb64b5843d94e2c2483f7b024a1280662a44409bedee8f2f51439767e2d107"}, + {file = "watchfiles-1.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e3750434c83b61abb3163b49c64b04180b85b4dabb29a294513faec57f2ffdb7"}, + {file = "watchfiles-1.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bedf84835069f51c7b026b3ca04e2e747ea8ed0a77c72006172c72d28c9f69fc"}, + {file = "watchfiles-1.0.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:90004553be36427c3d06ec75b804233f8f816374165d5225b93abd94ba6e7234"}, + {file = "watchfiles-1.0.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b46e15c34d4e401e976d6949ad3a74d244600d5c4b88c827a3fdf18691a46359"}, + {file = "watchfiles-1.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:487d15927f1b0bd24e7df921913399bb1ab94424c386bea8b267754d698f8f0e"}, + {file = "watchfiles-1.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ff236d7a3f4b0a42f699a22fc374ba526bc55048a70cbb299661158e1bb5e1f"}, + {file = "watchfiles-1.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c01446626574561756067f00b37e6b09c8622b0fc1e9fdbc7cbcea328d4e514"}, + {file = "watchfiles-1.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b551c465a59596f3d08170bd7e1c532c7260dd90ed8135778038e13c5d48aa81"}, + {file = "watchfiles-1.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e1ed613ee107269f66c2df631ec0fc8efddacface85314d392a4131abe299f00"}, + {file = "watchfiles-1.0.0-cp312-none-win32.whl", hash = "sha256:5f75cd42e7e2254117cf37ff0e68c5b3f36c14543756b2da621408349bd9ca7c"}, + {file = "watchfiles-1.0.0-cp312-none-win_amd64.whl", hash = "sha256:cf517701a4a872417f4e02a136e929537743461f9ec6cdb8184d9a04f4843545"}, + {file = "watchfiles-1.0.0-cp312-none-win_arm64.whl", hash = "sha256:8a2127cd68950787ee36753e6d401c8ea368f73beaeb8e54df5516a06d1ecd82"}, + {file = "watchfiles-1.0.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:95de85c254f7fe8cbdf104731f7f87f7f73ae229493bebca3722583160e6b152"}, + {file = "watchfiles-1.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:533a7cbfe700e09780bb31c06189e39c65f06c7f447326fee707fd02f9a6e945"}, + {file = "watchfiles-1.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2218e78e2c6c07b1634a550095ac2a429026b2d5cbcd49a594f893f2bb8c936"}, + {file = "watchfiles-1.0.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9122b8fdadc5b341315d255ab51d04893f417df4e6c1743b0aac8bf34e96e025"}, + {file = "watchfiles-1.0.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9272fdbc0e9870dac3b505bce1466d386b4d8d6d2bacf405e603108d50446940"}, + {file = "watchfiles-1.0.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a3b33c3aefe9067ebd87846806cd5fc0b017ab70d628aaff077ab9abf4d06b3"}, + {file = "watchfiles-1.0.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bc338ce9f8846543d428260fa0f9a716626963148edc937d71055d01d81e1525"}, + {file = "watchfiles-1.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ac778a460ea22d63c7e6fb0bc0f5b16780ff0b128f7f06e57aaec63bd339285"}, + {file = "watchfiles-1.0.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:53ae447f06f8f29f5ab40140f19abdab822387a7c426a369eb42184b021e97eb"}, + {file = "watchfiles-1.0.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1f73c2147a453315d672c1ad907abe6d40324e34a185b51e15624bc793f93cc6"}, + {file = "watchfiles-1.0.0-cp313-none-win32.whl", hash = "sha256:eba98901a2eab909dbd79681190b9049acc650f6111fde1845484a4450761e98"}, + {file = "watchfiles-1.0.0-cp313-none-win_amd64.whl", hash = "sha256:d562a6114ddafb09c33246c6ace7effa71ca4b6a2324a47f4b09b6445ea78941"}, + {file = "watchfiles-1.0.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3d94fd83ed54266d789f287472269c0def9120a2022674990bd24ad989ebd7a0"}, + {file = "watchfiles-1.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48051d1c504448b2fcda71c5e6e3610ae45de6a0b8f5a43b961f250be4bdf5a8"}, + {file = "watchfiles-1.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29cf884ad4285d23453c702ed03d689f9c0e865e3c85d20846d800d4787de00f"}, + {file = "watchfiles-1.0.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d3572d4c34c4e9c33d25b3da47d9570d5122f8433b9ac6519dca49c2740d23cd"}, + {file = "watchfiles-1.0.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c2696611182c85eb0e755b62b456f48debff484b7306b56f05478b843ca8ece"}, + {file = "watchfiles-1.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:550109001920a993a4383b57229c717fa73627d2a4e8fcb7ed33c7f1cddb0c85"}, + {file = "watchfiles-1.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b555a93c15bd2c71081922be746291d776d47521a00703163e5fbe6d2a402399"}, + {file = "watchfiles-1.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:947ccba18a38b85c366dafeac8df2f6176342d5992ca240a9d62588b214d731f"}, + {file = "watchfiles-1.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ffd98a299b0a74d1b704ef0ed959efb753e656a4e0425c14e46ae4c3cbdd2919"}, + {file = "watchfiles-1.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f8c4f3a1210ed099a99e6a710df4ff2f8069411059ffe30fa5f9467ebed1256b"}, + {file = "watchfiles-1.0.0-cp39-none-win32.whl", hash = "sha256:1e176b6b4119b3f369b2b4e003d53a226295ee862c0962e3afd5a1c15680b4e3"}, + {file = "watchfiles-1.0.0-cp39-none-win_amd64.whl", hash = "sha256:2d9c0518fabf4a3f373b0a94bb9e4ea7a1df18dec45e26a4d182aa8918dee855"}, + {file = "watchfiles-1.0.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f159ac795785cde4899e0afa539f4c723fb5dd336ce5605bc909d34edd00b79b"}, + {file = "watchfiles-1.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:c3d258d78341d5d54c0c804a5b7faa66cd30ba50b2756a7161db07ce15363b8d"}, + {file = "watchfiles-1.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bbd0311588c2de7f9ea5cf3922ccacfd0ec0c1922870a2be503cc7df1ca8be7"}, + {file = "watchfiles-1.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9a13ac46b545a7d0d50f7641eefe47d1597e7d1783a5d89e09d080e6dff44b0"}, + {file = "watchfiles-1.0.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2bca898c1dc073912d3db7fa6926cc08be9575add9e84872de2c99c688bac4e"}, + {file = "watchfiles-1.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:06d828fe2adc4ac8a64b875ca908b892a3603d596d43e18f7948f3fef5fc671c"}, + {file = "watchfiles-1.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:074c7618cd6c807dc4eaa0982b4a9d3f8051cd0b72793511848fd64630174b17"}, + {file = "watchfiles-1.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95dc785bc284552d044e561b8f4fe26d01ab5ca40d35852a6572d542adfeb4bc"}, + {file = "watchfiles-1.0.0.tar.gz", hash = "sha256:37566c844c9ce3b5deb964fe1a23378e575e74b114618d211fbda8f59d7b5dab"}, ] [package.dependencies] @@ -7183,81 +7146,76 @@ requests = ">=2.0.0,<3.0.0" [[package]] name = "wrapt" -version = "1.16.0" +version = "1.17.0" description = "Module for decorators, wrappers and monkey patching." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, - {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, - {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, - {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, - {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, - {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, - {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, - {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, - {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, - {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, - {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, - {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, - {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, - {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, - {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, - {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, - {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, - {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, - {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, - {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, - {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, - {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, - {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, - {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, - {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, - {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, - {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, - {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, + {file = "wrapt-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a0c23b8319848426f305f9cb0c98a6e32ee68a36264f45948ccf8e7d2b941f8"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1ca5f060e205f72bec57faae5bd817a1560fcfc4af03f414b08fa29106b7e2d"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e185ec6060e301a7e5f8461c86fb3640a7beb1a0f0208ffde7a65ec4074931df"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb90765dd91aed05b53cd7a87bd7f5c188fcd95960914bae0d32c5e7f899719d"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:879591c2b5ab0a7184258274c42a126b74a2c3d5a329df16d69f9cee07bba6ea"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fce6fee67c318fdfb7f285c29a82d84782ae2579c0e1b385b7f36c6e8074fffb"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0698d3a86f68abc894d537887b9bbf84d29bcfbc759e23f4644be27acf6da301"}, + {file = "wrapt-1.17.0-cp310-cp310-win32.whl", hash = "sha256:69d093792dc34a9c4c8a70e4973a3361c7a7578e9cd86961b2bbf38ca71e4e22"}, + {file = "wrapt-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:f28b29dc158ca5d6ac396c8e0a2ef45c4e97bb7e65522bfc04c989e6fe814575"}, + {file = "wrapt-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:74bf625b1b4caaa7bad51d9003f8b07a468a704e0644a700e936c357c17dd45a"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f2a28eb35cf99d5f5bd12f5dd44a0f41d206db226535b37b0c60e9da162c3ed"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81b1289e99cf4bad07c23393ab447e5e96db0ab50974a280f7954b071d41b489"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2939cd4a2a52ca32bc0b359015718472d7f6de870760342e7ba295be9ebaf9"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a9653131bda68a1f029c52157fd81e11f07d485df55410401f745007bd6d339"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4e4b4385363de9052dac1a67bfb535c376f3d19c238b5f36bddc95efae15e12d"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bdf62d25234290db1837875d4dceb2151e4ea7f9fff2ed41c0fde23ed542eb5b"}, + {file = "wrapt-1.17.0-cp311-cp311-win32.whl", hash = "sha256:5d8fd17635b262448ab8f99230fe4dac991af1dabdbb92f7a70a6afac8a7e346"}, + {file = "wrapt-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:92a3d214d5e53cb1db8b015f30d544bc9d3f7179a05feb8f16df713cecc2620a"}, + {file = "wrapt-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:89fc28495896097622c3fc238915c79365dd0ede02f9a82ce436b13bd0ab7569"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875d240fdbdbe9e11f9831901fb8719da0bd4e6131f83aa9f69b96d18fae7504"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ed16d95fd142e9c72b6c10b06514ad30e846a0d0917ab406186541fe68b451"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b956061b8db634120b58f668592a772e87e2e78bc1f6a906cfcaa0cc7991c1"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:daba396199399ccabafbfc509037ac635a6bc18510ad1add8fd16d4739cdd106"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4d63f4d446e10ad19ed01188d6c1e1bb134cde8c18b0aa2acfd973d41fcc5ada"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8a5e7cc39a45fc430af1aefc4d77ee6bad72c5bcdb1322cfde852c15192b8bd4"}, + {file = "wrapt-1.17.0-cp312-cp312-win32.whl", hash = "sha256:0a0a1a1ec28b641f2a3a2c35cbe86c00051c04fffcfcc577ffcdd707df3f8635"}, + {file = "wrapt-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:3c34f6896a01b84bab196f7119770fd8466c8ae3dfa73c59c0bb281e7b588ce7"}, + {file = "wrapt-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:714c12485aa52efbc0fc0ade1e9ab3a70343db82627f90f2ecbc898fdf0bb181"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da427d311782324a376cacb47c1a4adc43f99fd9d996ffc1b3e8529c4074d393"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba1739fb38441a27a676f4de4123d3e858e494fac05868b7a281c0a383c098f4"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e711fc1acc7468463bc084d1b68561e40d1eaa135d8c509a65dd534403d83d7b"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:140ea00c87fafc42739bd74a94a5a9003f8e72c27c47cd4f61d8e05e6dec8721"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:73a96fd11d2b2e77d623a7f26e004cc31f131a365add1ce1ce9a19e55a1eef90"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0b48554952f0f387984da81ccfa73b62e52817a4386d070c75e4db7d43a28c4a"}, + {file = "wrapt-1.17.0-cp313-cp313-win32.whl", hash = "sha256:498fec8da10e3e62edd1e7368f4b24aa362ac0ad931e678332d1b209aec93045"}, + {file = "wrapt-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:fd136bb85f4568fffca995bd3c8d52080b1e5b225dbf1c2b17b66b4c5fa02838"}, + {file = "wrapt-1.17.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:17fcf043d0b4724858f25b8826c36e08f9fb2e475410bece0ec44a22d533da9b"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4a557d97f12813dc5e18dad9fa765ae44ddd56a672bb5de4825527c847d6379"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0229b247b0fc7dee0d36176cbb79dbaf2a9eb7ecc50ec3121f40ef443155fb1d"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8425cfce27b8b20c9b89d77fb50e368d8306a90bf2b6eef2cdf5cd5083adf83f"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c900108df470060174108012de06d45f514aa4ec21a191e7ab42988ff42a86c"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:4e547b447073fc0dbfcbff15154c1be8823d10dab4ad401bdb1575e3fdedff1b"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:914f66f3b6fc7b915d46c1cc424bc2441841083de01b90f9e81109c9759e43ab"}, + {file = "wrapt-1.17.0-cp313-cp313t-win32.whl", hash = "sha256:a4192b45dff127c7d69b3bdfb4d3e47b64179a0b9900b6351859f3001397dabf"}, + {file = "wrapt-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:4f643df3d4419ea3f856c5c3f40fec1d65ea2e89ec812c83f7767c8730f9827a"}, + {file = "wrapt-1.17.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:69c40d4655e078ede067a7095544bcec5a963566e17503e75a3a3e0fe2803b13"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f495b6754358979379f84534f8dd7a43ff8cff2558dcdea4a148a6e713a758f"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:baa7ef4e0886a6f482e00d1d5bcd37c201b383f1d314643dfb0367169f94f04c"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fc931382e56627ec4acb01e09ce66e5c03c384ca52606111cee50d931a342d"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8f8909cdb9f1b237786c09a810e24ee5e15ef17019f7cecb207ce205b9b5fcce"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ad47b095f0bdc5585bced35bd088cbfe4177236c7df9984b3cc46b391cc60627"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:948a9bd0fb2c5120457b07e59c8d7210cbc8703243225dbd78f4dfc13c8d2d1f"}, + {file = "wrapt-1.17.0-cp38-cp38-win32.whl", hash = "sha256:5ae271862b2142f4bc687bdbfcc942e2473a89999a54231aa1c2c676e28f29ea"}, + {file = "wrapt-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:f335579a1b485c834849e9075191c9898e0731af45705c2ebf70e0cd5d58beed"}, + {file = "wrapt-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d751300b94e35b6016d4b1e7d0e7bbc3b5e1751e2405ef908316c2a9024008a1"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7264cbb4a18dc4acfd73b63e4bcfec9c9802614572025bdd44d0721983fc1d9c"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33539c6f5b96cf0b1105a0ff4cf5db9332e773bb521cc804a90e58dc49b10578"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c30970bdee1cad6a8da2044febd824ef6dc4cc0b19e39af3085c763fdec7de33"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bc7f729a72b16ee21795a943f85c6244971724819819a41ddbaeb691b2dd85ad"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6ff02a91c4fc9b6a94e1c9c20f62ea06a7e375f42fe57587f004d1078ac86ca9"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2dfb7cff84e72e7bf975b06b4989477873dcf160b2fd89959c629535df53d4e0"}, + {file = "wrapt-1.17.0-cp39-cp39-win32.whl", hash = "sha256:2399408ac33ffd5b200480ee858baa58d77dd30e0dd0cab6a8a9547135f30a88"}, + {file = "wrapt-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:4f763a29ee6a20c529496a20a7bcb16a73de27f5da6a843249c7047daf135977"}, + {file = "wrapt-1.17.0-py3-none-any.whl", hash = "sha256:d2c63b93548eda58abf5188e505ffed0229bf675f7c3090f8e36ad55b8cbc371"}, + {file = "wrapt-1.17.0.tar.gz", hash = "sha256:16187aa2317c731170a88ef35e8937ae0f533c402872c1ee5e6d079fcf320801"}, ] [[package]] @@ -7394,93 +7352,93 @@ files = [ [[package]] name = "yarl" -version = "1.18.0" +version = "1.18.3" description = "Yet another URL library" optional = false python-versions = ">=3.9" files = [ - {file = "yarl-1.18.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:074fee89caab89a97e18ef5f29060ef61ba3cae6cd77673acc54bfdd3214b7b7"}, - {file = "yarl-1.18.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b026cf2c32daf48d90c0c4e406815c3f8f4cfe0c6dfccb094a9add1ff6a0e41a"}, - {file = "yarl-1.18.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ae38bd86eae3ba3d2ce5636cc9e23c80c9db2e9cb557e40b98153ed102b5a736"}, - {file = "yarl-1.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:685cc37f3f307c6a8e879986c6d85328f4c637f002e219f50e2ef66f7e062c1d"}, - {file = "yarl-1.18.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8254dbfce84ee5d1e81051ee7a0f1536c108ba294c0fdb5933476398df0654f3"}, - {file = "yarl-1.18.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:20de4a8b04de70c49698dc2390b7fd2d18d424d3b876371f9b775e2b462d4b41"}, - {file = "yarl-1.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0a2074a37285570d54b55820687de3d2f2b9ecf1b714e482e48c9e7c0402038"}, - {file = "yarl-1.18.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f576ed278860df2721a5d57da3381040176ef1d07def9688a385c8330db61a1"}, - {file = "yarl-1.18.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3a3709450a574d61be6ac53d582496014342ea34876af8dc17cc16da32826c9a"}, - {file = "yarl-1.18.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:bd80ed29761490c622edde5dd70537ca8c992c2952eb62ed46984f8eff66d6e8"}, - {file = "yarl-1.18.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:32141e13a1d5a48525e519c9197d3f4d9744d818d5c7d6547524cc9eccc8971e"}, - {file = "yarl-1.18.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8b8d3e4e014fb4274f1c5bf61511d2199e263909fb0b8bda2a7428b0894e8dc6"}, - {file = "yarl-1.18.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:701bb4a8f4de191c8c0cc9a1e6d5142f4df880e9d1210e333b829ca9425570ed"}, - {file = "yarl-1.18.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a45d94075ac0647621eaaf693c8751813a3eccac455d423f473ffed38c8ac5c9"}, - {file = "yarl-1.18.0-cp310-cp310-win32.whl", hash = "sha256:34176bfb082add67cb2a20abd85854165540891147f88b687a5ed0dc225750a0"}, - {file = "yarl-1.18.0-cp310-cp310-win_amd64.whl", hash = "sha256:73553bbeea7d6ec88c08ad8027f4e992798f0abc459361bf06641c71972794dc"}, - {file = "yarl-1.18.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b8e8c516dc4e1a51d86ac975b0350735007e554c962281c432eaa5822aa9765c"}, - {file = "yarl-1.18.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2e6b4466714a73f5251d84b471475850954f1fa6acce4d3f404da1d55d644c34"}, - {file = "yarl-1.18.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c893f8c1a6d48b25961e00922724732d00b39de8bb0b451307482dc87bddcd74"}, - {file = "yarl-1.18.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13aaf2bdbc8c86ddce48626b15f4987f22e80d898818d735b20bd58f17292ee8"}, - {file = "yarl-1.18.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd21c0128e301851de51bc607b0a6da50e82dc34e9601f4b508d08cc89ee7929"}, - {file = "yarl-1.18.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:205de377bd23365cd85562c9c6c33844050a93661640fda38e0567d2826b50df"}, - {file = "yarl-1.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed69af4fe2a0949b1ea1d012bf065c77b4c7822bad4737f17807af2adb15a73c"}, - {file = "yarl-1.18.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e1c18890091aa3cc8a77967943476b729dc2016f4cfe11e45d89b12519d4a93"}, - {file = "yarl-1.18.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:91b8fb9427e33f83ca2ba9501221ffaac1ecf0407f758c4d2f283c523da185ee"}, - {file = "yarl-1.18.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:536a7a8a53b75b2e98ff96edb2dfb91a26b81c4fed82782035767db5a465be46"}, - {file = "yarl-1.18.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a64619a9c47c25582190af38e9eb382279ad42e1f06034f14d794670796016c0"}, - {file = "yarl-1.18.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c73a6bbc97ba1b5a0c3c992ae93d721c395bdbb120492759b94cc1ac71bc6350"}, - {file = "yarl-1.18.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a173401d7821a2a81c7b47d4e7d5c4021375a1441af0c58611c1957445055056"}, - {file = "yarl-1.18.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7520e799b1f84e095cce919bd6c23c9d49472deeef25fe1ef960b04cca51c3fc"}, - {file = "yarl-1.18.0-cp311-cp311-win32.whl", hash = "sha256:c4cb992d8090d5ae5f7afa6754d7211c578be0c45f54d3d94f7781c495d56716"}, - {file = "yarl-1.18.0-cp311-cp311-win_amd64.whl", hash = "sha256:52c136f348605974c9b1c878addd6b7a60e3bf2245833e370862009b86fa4689"}, - {file = "yarl-1.18.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1ece25e2251c28bab737bdf0519c88189b3dd9492dc086a1d77336d940c28ced"}, - {file = "yarl-1.18.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:454902dc1830d935c90b5b53c863ba2a98dcde0fbaa31ca2ed1ad33b2a7171c6"}, - {file = "yarl-1.18.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:01be8688fc211dc237e628fcc209dda412d35de7642453059a0553747018d075"}, - {file = "yarl-1.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d26f1fa9fa2167bb238f6f4b20218eb4e88dd3ef21bb8f97439fa6b5313e30d"}, - {file = "yarl-1.18.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b234a4a9248a9f000b7a5dfe84b8cb6210ee5120ae70eb72a4dcbdb4c528f72f"}, - {file = "yarl-1.18.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe94d1de77c4cd8caff1bd5480e22342dbd54c93929f5943495d9c1e8abe9f42"}, - {file = "yarl-1.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b4c90c5363c6b0a54188122b61edb919c2cd1119684999d08cd5e538813a28e"}, - {file = "yarl-1.18.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a98ecadc5a241c9ba06de08127ee4796e1009555efd791bac514207862b43d"}, - {file = "yarl-1.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9106025c7f261f9f5144f9aa7681d43867eed06349a7cfb297a1bc804de2f0d1"}, - {file = "yarl-1.18.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:f275ede6199d0f1ed4ea5d55a7b7573ccd40d97aee7808559e1298fe6efc8dbd"}, - {file = "yarl-1.18.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f7edeb1dcc7f50a2c8e08b9dc13a413903b7817e72273f00878cb70e766bdb3b"}, - {file = "yarl-1.18.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c083f6dd6951b86e484ebfc9c3524b49bcaa9c420cb4b2a78ef9f7a512bfcc85"}, - {file = "yarl-1.18.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:80741ec5b471fbdfb997821b2842c59660a1c930ceb42f8a84ba8ca0f25a66aa"}, - {file = "yarl-1.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b1a3297b9cad594e1ff0c040d2881d7d3a74124a3c73e00c3c71526a1234a9f7"}, - {file = "yarl-1.18.0-cp312-cp312-win32.whl", hash = "sha256:cd6ab7d6776c186f544f893b45ee0c883542b35e8a493db74665d2e594d3ca75"}, - {file = "yarl-1.18.0-cp312-cp312-win_amd64.whl", hash = "sha256:039c299a0864d1f43c3e31570045635034ea7021db41bf4842693a72aca8df3a"}, - {file = "yarl-1.18.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6fb64dd45453225f57d82c4764818d7a205ee31ce193e9f0086e493916bd4f72"}, - {file = "yarl-1.18.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3adaaf9c6b1b4fc258584f4443f24d775a2086aee82d1387e48a8b4f3d6aecf6"}, - {file = "yarl-1.18.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:da206d1ec78438a563c5429ab808a2b23ad7bc025c8adbf08540dde202be37d5"}, - {file = "yarl-1.18.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:576d258b21c1db4c6449b1c572c75d03f16a482eb380be8003682bdbe7db2f28"}, - {file = "yarl-1.18.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c60e547c0a375c4bfcdd60eef82e7e0e8698bf84c239d715f5c1278a73050393"}, - {file = "yarl-1.18.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e3818eabaefb90adeb5e0f62f047310079d426387991106d4fbf3519eec7d90a"}, - {file = "yarl-1.18.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5f72421246c21af6a92fbc8c13b6d4c5427dfd949049b937c3b731f2f9076bd"}, - {file = "yarl-1.18.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7fa7d37f2ada0f42e0723632993ed422f2a679af0e200874d9d861720a54f53e"}, - {file = "yarl-1.18.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:42ba84e2ac26a3f252715f8ec17e6fdc0cbf95b9617c5367579fafcd7fba50eb"}, - {file = "yarl-1.18.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:6a49ad0102c0f0ba839628d0bf45973c86ce7b590cdedf7540d5b1833ddc6f00"}, - {file = "yarl-1.18.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:96404e8d5e1bbe36bdaa84ef89dc36f0e75939e060ca5cd45451aba01db02902"}, - {file = "yarl-1.18.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a0509475d714df8f6d498935b3f307cd122c4ca76f7d426c7e1bb791bcd87eda"}, - {file = "yarl-1.18.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1ff116f0285b5c8b3b9a2680aeca29a858b3b9e0402fc79fd850b32c2bcb9f8b"}, - {file = "yarl-1.18.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e2580c1d7e66e6d29d6e11855e3b1c6381971e0edd9a5066e6c14d79bc8967af"}, - {file = "yarl-1.18.0-cp313-cp313-win32.whl", hash = "sha256:14408cc4d34e202caba7b5ac9cc84700e3421a9e2d1b157d744d101b061a4a88"}, - {file = "yarl-1.18.0-cp313-cp313-win_amd64.whl", hash = "sha256:1db1537e9cb846eb0ff206eac667f627794be8b71368c1ab3207ec7b6f8c5afc"}, - {file = "yarl-1.18.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fa2c9cb607e0f660d48c54a63de7a9b36fef62f6b8bd50ff592ce1137e73ac7d"}, - {file = "yarl-1.18.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c0f4808644baf0a434a3442df5e0bedf8d05208f0719cedcd499e168b23bfdc4"}, - {file = "yarl-1.18.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7db9584235895a1dffca17e1c634b13870852094f6389b68dcc6338086aa7b08"}, - {file = "yarl-1.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:309f8d27d6f93ceeeb80aa6980e883aa57895270f7f41842b92247e65d7aeddf"}, - {file = "yarl-1.18.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:609ffd44fed2ed88d9b4ef62ee860cf86446cf066333ad4ce4123505b819e581"}, - {file = "yarl-1.18.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f172b8b2c72a13a06ea49225a9c47079549036ad1b34afa12d5491b881f5b993"}, - {file = "yarl-1.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d89ae7de94631b60d468412c18290d358a9d805182373d804ec839978b120422"}, - {file = "yarl-1.18.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:466d31fd043ef9af822ee3f1df8fdff4e8c199a7f4012c2642006af240eade17"}, - {file = "yarl-1.18.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7609b8462351c4836b3edce4201acb6dd46187b207c589b30a87ffd1813b48dc"}, - {file = "yarl-1.18.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:d9d4f5e471e8dc49b593a80766c2328257e405f943c56a3dc985c125732bc4cf"}, - {file = "yarl-1.18.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:67b336c15e564d76869c9a21316f90edf546809a5796a083b8f57c845056bc01"}, - {file = "yarl-1.18.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b212452b80cae26cb767aa045b051740e464c5129b7bd739c58fbb7deb339e7b"}, - {file = "yarl-1.18.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:38b39b7b3e692b6c92b986b00137a3891eddb66311b229d1940dcbd4f025083c"}, - {file = "yarl-1.18.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a7ee6884a8848792d58b854946b685521f41d8871afa65e0d4a774954e9c9e89"}, - {file = "yarl-1.18.0-cp39-cp39-win32.whl", hash = "sha256:b4095c5019bb889aa866bf12ed4c85c0daea5aafcb7c20d1519f02a1e738f07f"}, - {file = "yarl-1.18.0-cp39-cp39-win_amd64.whl", hash = "sha256:2d90f2e4d16a5b0915ee065218b435d2ef619dd228973b1b47d262a6f7cd8fa5"}, - {file = "yarl-1.18.0-py3-none-any.whl", hash = "sha256:dbf53db46f7cf176ee01d8d98c39381440776fcda13779d269a8ba664f69bec0"}, - {file = "yarl-1.18.0.tar.gz", hash = "sha256:20d95535e7d833889982bfe7cc321b7f63bf8879788fee982c76ae2b24cfb715"}, + {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34"}, + {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7"}, + {file = "yarl-1.18.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:602d98f2c2d929f8e697ed274fbadc09902c4025c5a9963bf4e9edfc3ab6f7ed"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c654d5207c78e0bd6d749f6dae1dcbbfde3403ad3a4b11f3c5544d9906969dde"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5094d9206c64181d0f6e76ebd8fb2f8fe274950a63890ee9e0ebfd58bf9d787b"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35098b24e0327fc4ebdc8ffe336cee0a87a700c24ffed13161af80124b7dc8e5"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3236da9272872443f81fedc389bace88408f64f89f75d1bdb2256069a8730ccc"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2c08cc9b16f4f4bc522771d96734c7901e7ebef70c6c5c35dd0f10845270bcd"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80316a8bd5109320d38eef8833ccf5f89608c9107d02d2a7f985f98ed6876990"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c1e1cc06da1491e6734f0ea1e6294ce00792193c463350626571c287c9a704db"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fea09ca13323376a2fdfb353a5fa2e59f90cd18d7ca4eaa1fd31f0a8b4f91e62"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e3b9fd71836999aad54084906f8663dffcd2a7fb5cdafd6c37713b2e72be1760"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:757e81cae69244257d125ff31663249b3013b5dc0a8520d73694aed497fb195b"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b1771de9944d875f1b98a745bc547e684b863abf8f8287da8466cf470ef52690"}, + {file = "yarl-1.18.3-cp310-cp310-win32.whl", hash = "sha256:8874027a53e3aea659a6d62751800cf6e63314c160fd607489ba5c2edd753cf6"}, + {file = "yarl-1.18.3-cp310-cp310-win_amd64.whl", hash = "sha256:93b2e109287f93db79210f86deb6b9bbb81ac32fc97236b16f7433db7fc437d8"}, + {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8503ad47387b8ebd39cbbbdf0bf113e17330ffd339ba1144074da24c545f0069"}, + {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02ddb6756f8f4517a2d5e99d8b2f272488e18dd0bfbc802f31c16c6c20f22193"}, + {file = "yarl-1.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a283dd2882ac98cc6318384f565bffc751ab564605959df4752d42483ad889"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d980e0325b6eddc81331d3f4551e2a333999fb176fd153e075c6d1c2530aa8a8"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b643562c12680b01e17239be267bc306bbc6aac1f34f6444d1bded0c5ce438ca"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c017a3b6df3a1bd45b9fa49a0f54005e53fbcad16633870104b66fa1a30a29d8"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75674776d96d7b851b6498f17824ba17849d790a44d282929c42dbb77d4f17ae"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccaa3a4b521b780a7e771cc336a2dba389a0861592bbce09a476190bb0c8b4b3"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2d06d3005e668744e11ed80812e61efd77d70bb7f03e33c1598c301eea20efbb"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9d41beda9dc97ca9ab0b9888cb71f7539124bc05df02c0cff6e5acc5a19dcc6e"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ba23302c0c61a9999784e73809427c9dbedd79f66a13d84ad1b1943802eaaf59"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6748dbf9bfa5ba1afcc7556b71cda0d7ce5f24768043a02a58846e4a443d808d"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0b0cad37311123211dc91eadcb322ef4d4a66008d3e1bdc404808992260e1a0e"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fb2171a4486bb075316ee754c6d8382ea6eb8b399d4ec62fde2b591f879778a"}, + {file = "yarl-1.18.3-cp311-cp311-win32.whl", hash = "sha256:61b1a825a13bef4a5f10b1885245377d3cd0bf87cba068e1d9a88c2ae36880e1"}, + {file = "yarl-1.18.3-cp311-cp311-win_amd64.whl", hash = "sha256:b9d60031cf568c627d028239693fd718025719c02c9f55df0a53e587aab951b5"}, + {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50"}, + {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576"}, + {file = "yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285"}, + {file = "yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2"}, + {file = "yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477"}, + {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb"}, + {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa"}, + {file = "yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8"}, + {file = "yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d"}, + {file = "yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c"}, + {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:61e5e68cb65ac8f547f6b5ef933f510134a6bf31bb178be428994b0cb46c2a04"}, + {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe57328fbc1bfd0bd0514470ac692630f3901c0ee39052ae47acd1d90a436719"}, + {file = "yarl-1.18.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a440a2a624683108a1b454705ecd7afc1c3438a08e890a1513d468671d90a04e"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09c7907c8548bcd6ab860e5f513e727c53b4a714f459b084f6580b49fa1b9cee"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4f6450109834af88cb4cc5ecddfc5380ebb9c228695afc11915a0bf82116789"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9ca04806f3be0ac6d558fffc2fdf8fcef767e0489d2684a21912cc4ed0cd1b8"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77a6e85b90a7641d2e07184df5557132a337f136250caafc9ccaa4a2a998ca2c"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6333c5a377c8e2f5fae35e7b8f145c617b02c939d04110c76f29ee3676b5f9a5"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0b3c92fa08759dbf12b3a59579a4096ba9af8dd344d9a813fc7f5070d86bbab1"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4ac515b860c36becb81bb84b667466885096b5fc85596948548b667da3bf9f24"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:045b8482ce9483ada4f3f23b3774f4e1bf4f23a2d5c912ed5170f68efb053318"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a4bb030cf46a434ec0225bddbebd4b89e6471814ca851abb8696170adb163985"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:54d6921f07555713b9300bee9c50fb46e57e2e639027089b1d795ecd9f7fa910"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1d407181cfa6e70077df3377938c08012d18893f9f20e92f7d2f314a437c30b1"}, + {file = "yarl-1.18.3-cp39-cp39-win32.whl", hash = "sha256:ac36703a585e0929b032fbaab0707b75dc12703766d0b53486eabd5139ebadd5"}, + {file = "yarl-1.18.3-cp39-cp39-win_amd64.whl", hash = "sha256:ba87babd629f8af77f557b61e49e7c7cac36f22f871156b91e10a6e9d4f829e9"}, + {file = "yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b"}, + {file = "yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1"}, ] [package.dependencies] @@ -7527,48 +7485,48 @@ test = ["zope.testrunner"] [[package]] name = "zope-interface" -version = "7.1.1" +version = "7.2" description = "Interfaces for Python" optional = true python-versions = ">=3.8" files = [ - {file = "zope.interface-7.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6650bd56ef350d37c8baccfd3ee8a0483ed6f8666e641e4b9ae1a1827b79f9e5"}, - {file = "zope.interface-7.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84e87eba6b77a3af187bae82d8de1a7c208c2a04ec9f6bd444fd091b811ad92e"}, - {file = "zope.interface-7.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c4e1b4c06d9abd1037c088dae1566c85f344a3e6ae4350744c3f7f7259d9c67"}, - {file = "zope.interface-7.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7cd5e3d910ac87652a09f6e5db8e41bc3b49cf08ddd2d73d30afc644801492cd"}, - {file = "zope.interface-7.1.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca95594d936ee349620900be5b46c0122a1ff6ce42d7d5cb2cf09dc84071ef16"}, - {file = "zope.interface-7.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:ad339509dcfbbc99bf8e147db6686249c4032f26586699ec4c82f6e5909c9fe2"}, - {file = "zope.interface-7.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e59f175e868f856a77c0a77ba001385c377df2104fdbda6b9f99456a01e102a"}, - {file = "zope.interface-7.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0de23bcb93401994ea00bc5c677ef06d420340ac0a4e9c10d80e047b9ce5af3f"}, - {file = "zope.interface-7.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cdb7e7e5524b76d3ec037c1d81a9e2c7457b240fd4cb0a2476b65c3a5a6c81f"}, - {file = "zope.interface-7.1.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3603ef82a9920bd0bfb505423cb7e937498ad971ad5a6141841e8f76d2fd5446"}, - {file = "zope.interface-7.1.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1d52d052355e0c5c89e0630dd2ff7c0b823fd5f56286a663e92444761b35e25"}, - {file = "zope.interface-7.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:179ad46ece518c9084cb272e4a69d266b659f7f8f48e51706746c2d8a426433e"}, - {file = "zope.interface-7.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e6503534b52bb1720ace9366ee30838a58a3413d3e197512f3338c8f34b5d89d"}, - {file = "zope.interface-7.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f85b290e5b8b11814efb0d004d8ce6c9a483c35c462e8d9bf84abb93e79fa770"}, - {file = "zope.interface-7.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d029fac6a80edae80f79c37e5e3abfa92968fe921886139b3ee470a1b177321a"}, - {file = "zope.interface-7.1.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5836b8fb044c6e75ba34dfaabc602493019eadfa0faf6ff25f4c4c356a71a853"}, - {file = "zope.interface-7.1.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7395f13533318f150ee72adb55b29284b16e73b6d5f02ab21f173b3e83f242b8"}, - {file = "zope.interface-7.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:1d0e23c6b746eb8ce04573cc47bcac60961ac138885d207bd6f57e27a1431ae8"}, - {file = "zope.interface-7.1.1-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:9fad9bd5502221ab179f13ea251cb30eef7cf65023156967f86673aff54b53a0"}, - {file = "zope.interface-7.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:55c373becbd36a44d0c9be1d5271422fdaa8562d158fb44b4192297b3c67096c"}, - {file = "zope.interface-7.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed1df8cc01dd1e3970666a7370b8bfc7457371c58ba88c57bd5bca17ab198053"}, - {file = "zope.interface-7.1.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99c14f0727c978639139e6cad7a60e82b7720922678d75aacb90cf4ef74a068c"}, - {file = "zope.interface-7.1.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b1eed7670d564f1025d7cda89f99f216c30210e42e95de466135be0b4a499d9"}, - {file = "zope.interface-7.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:3defc925c4b22ac1272d544a49c6ba04c3eefcce3200319ee1be03d9270306dd"}, - {file = "zope.interface-7.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8d0fe45be57b5219aa4b96e846631c04615d5ef068146de5a02ccd15c185321f"}, - {file = "zope.interface-7.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bcbeb44fc16e0078b3b68a95e43f821ae34dcbf976dde6985141838a5f23dd3d"}, - {file = "zope.interface-7.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8e7b05dc6315a193cceaec071cc3cf1c180cea28808ccded0b1283f1c38ba73"}, - {file = "zope.interface-7.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d553e02b68c0ea5a226855f02edbc9eefd99f6a8886fa9f9bdf999d77f46585"}, - {file = "zope.interface-7.1.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81744a7e61b598ebcf4722ac56a7a4f50502432b5b4dc7eb29075a89cf82d029"}, - {file = "zope.interface-7.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7720322763aceb5e0a7cadcc38c67b839efe599f0887cbf6c003c55b1458c501"}, - {file = "zope.interface-7.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a2ed0852c25950cf430067f058f8d98df6288502ac313861d9803fe7691a9b3"}, - {file = "zope.interface-7.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9595e478047ce752b35cfa221d7601a5283ccdaab40422e0dc1d4a334c70f580"}, - {file = "zope.interface-7.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2317e1d4dba68203a5227ea3057f9078ec9376275f9700086b8f0ffc0b358e1b"}, - {file = "zope.interface-7.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6821ef9870f32154da873fcde439274f99814ea452dd16b99fa0b66345c4b6b"}, - {file = "zope.interface-7.1.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:190eeec67e023d5aac54d183fa145db0b898664234234ac54643a441da434616"}, - {file = "zope.interface-7.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:d17e7fc814eaab93409b80819fd6d30342844345c27f3bc3c4b43c2425a8d267"}, - {file = "zope.interface-7.1.1.tar.gz", hash = "sha256:4284d664ef0ff7b709836d4de7b13d80873dc5faeffc073abdb280058bfac5e3"}, + {file = "zope.interface-7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ce290e62229964715f1011c3dbeab7a4a1e4971fd6f31324c4519464473ef9f2"}, + {file = "zope.interface-7.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:05b910a5afe03256b58ab2ba6288960a2892dfeef01336dc4be6f1b9ed02ab0a"}, + {file = "zope.interface-7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:550f1c6588ecc368c9ce13c44a49b8d6b6f3ca7588873c679bd8fd88a1b557b6"}, + {file = "zope.interface-7.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ef9e2f865721553c6f22a9ff97da0f0216c074bd02b25cf0d3af60ea4d6931d"}, + {file = "zope.interface-7.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27f926f0dcb058211a3bb3e0e501c69759613b17a553788b2caeb991bed3b61d"}, + {file = "zope.interface-7.2-cp310-cp310-win_amd64.whl", hash = "sha256:144964649eba4c5e4410bb0ee290d338e78f179cdbfd15813de1a664e7649b3b"}, + {file = "zope.interface-7.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1909f52a00c8c3dcab6c4fad5d13de2285a4b3c7be063b239b8dc15ddfb73bd2"}, + {file = "zope.interface-7.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:80ecf2451596f19fd607bb09953f426588fc1e79e93f5968ecf3367550396b22"}, + {file = "zope.interface-7.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:033b3923b63474800b04cba480b70f6e6243a62208071fc148354f3f89cc01b7"}, + {file = "zope.interface-7.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a102424e28c6b47c67923a1f337ede4a4c2bba3965b01cf707978a801fc7442c"}, + {file = "zope.interface-7.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25e6a61dcb184453bb00eafa733169ab6d903e46f5c2ace4ad275386f9ab327a"}, + {file = "zope.interface-7.2-cp311-cp311-win_amd64.whl", hash = "sha256:3f6771d1647b1fc543d37640b45c06b34832a943c80d1db214a37c31161a93f1"}, + {file = "zope.interface-7.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:086ee2f51eaef1e4a52bd7d3111a0404081dadae87f84c0ad4ce2649d4f708b7"}, + {file = "zope.interface-7.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:21328fcc9d5b80768bf051faa35ab98fb979080c18e6f84ab3f27ce703bce465"}, + {file = "zope.interface-7.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6dd02ec01f4468da0f234da9d9c8545c5412fef80bc590cc51d8dd084138a89"}, + {file = "zope.interface-7.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e7da17f53e25d1a3bde5da4601e026adc9e8071f9f6f936d0fe3fe84ace6d54"}, + {file = "zope.interface-7.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cab15ff4832580aa440dc9790b8a6128abd0b88b7ee4dd56abacbc52f212209d"}, + {file = "zope.interface-7.2-cp312-cp312-win_amd64.whl", hash = "sha256:29caad142a2355ce7cfea48725aa8bcf0067e2b5cc63fcf5cd9f97ad12d6afb5"}, + {file = "zope.interface-7.2-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:3e0350b51e88658d5ad126c6a57502b19d5f559f6cb0a628e3dc90442b53dd98"}, + {file = "zope.interface-7.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:15398c000c094b8855d7d74f4fdc9e73aa02d4d0d5c775acdef98cdb1119768d"}, + {file = "zope.interface-7.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:802176a9f99bd8cc276dcd3b8512808716492f6f557c11196d42e26c01a69a4c"}, + {file = "zope.interface-7.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb23f58a446a7f09db85eda09521a498e109f137b85fb278edb2e34841055398"}, + {file = "zope.interface-7.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a71a5b541078d0ebe373a81a3b7e71432c61d12e660f1d67896ca62d9628045b"}, + {file = "zope.interface-7.2-cp313-cp313-win_amd64.whl", hash = "sha256:4893395d5dd2ba655c38ceb13014fd65667740f09fa5bb01caa1e6284e48c0cd"}, + {file = "zope.interface-7.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d3a8ffec2a50d8ec470143ea3d15c0c52d73df882eef92de7537e8ce13475e8a"}, + {file = "zope.interface-7.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:31d06db13a30303c08d61d5fb32154be51dfcbdb8438d2374ae27b4e069aac40"}, + {file = "zope.interface-7.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e204937f67b28d2dca73ca936d3039a144a081fc47a07598d44854ea2a106239"}, + {file = "zope.interface-7.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:224b7b0314f919e751f2bca17d15aad00ddbb1eadf1cb0190fa8175edb7ede62"}, + {file = "zope.interface-7.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baf95683cde5bc7d0e12d8e7588a3eb754d7c4fa714548adcd96bdf90169f021"}, + {file = "zope.interface-7.2-cp38-cp38-win_amd64.whl", hash = "sha256:7dc5016e0133c1a1ec212fc87a4f7e7e562054549a99c73c8896fa3a9e80cbc7"}, + {file = "zope.interface-7.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7bd449c306ba006c65799ea7912adbbfed071089461a19091a228998b82b1fdb"}, + {file = "zope.interface-7.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a19a6cc9c6ce4b1e7e3d319a473cf0ee989cbbe2b39201d7c19e214d2dfb80c7"}, + {file = "zope.interface-7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72cd1790b48c16db85d51fbbd12d20949d7339ad84fd971427cf00d990c1f137"}, + {file = "zope.interface-7.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52e446f9955195440e787596dccd1411f543743c359eeb26e9b2c02b077b0519"}, + {file = "zope.interface-7.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ad9913fd858274db8dd867012ebe544ef18d218f6f7d1e3c3e6d98000f14b75"}, + {file = "zope.interface-7.2-cp39-cp39-win_amd64.whl", hash = "sha256:1090c60116b3da3bfdd0c03406e2f14a1ff53e5771aebe33fec1edc0a350175d"}, + {file = "zope.interface-7.2.tar.gz", hash = "sha256:8b49f1a3d1ee4cdaf5b32d2e738362c7f5e40ac8b46dd7d1a65e82a4872728fe"}, ] [package.dependencies] @@ -7580,11 +7538,11 @@ test = ["coverage[toml]", "zope.event", "zope.testing"] testing = ["coverage[toml]", "zope.event", "zope.testing"] [extras] -all = ["autoflake", "black", "composio-core", "composio-langchain", "datasets", "docker", "fastapi", "isort", "langchain", "langchain-community", "llama-index-embeddings-ollama", "locust", "pexpect", "pg8000", "pgvector", "pre-commit", "psycopg2", "psycopg2-binary", "pyright", "pytest-asyncio", "pytest-order", "uvicorn", "websockets", "wikipedia"] +all = ["autoflake", "black", "datasets", "docker", "fastapi", "isort", "langchain", "langchain-community", "llama-index-embeddings-ollama", "locust", "pexpect", "pg8000", "pgvector", "pre-commit", "psycopg2", "psycopg2-binary", "pyright", "pytest-asyncio", "pytest-order", "uvicorn", "websockets", "wikipedia"] autogen = ["pyautogen"] cloud-tool-sandbox = ["e2b-code-interpreter"] dev = ["autoflake", "black", "datasets", "isort", "locust", "pexpect", "pre-commit", "pyright", "pytest-asyncio", "pytest-order"] -external-tools = ["composio-core", "composio-langchain", "docker", "langchain", "langchain-community", "wikipedia"] +external-tools = ["docker", "langchain", "langchain-community", "wikipedia"] milvus = ["pymilvus"] ollama = ["llama-index-embeddings-ollama"] postgres = ["pg8000", "pgvector", "psycopg2", "psycopg2-binary"] @@ -7595,4 +7553,4 @@ tests = ["wikipedia"] [metadata] lock-version = "2.0" python-versions = "<3.13,>=3.10" -content-hash = "9e0f7eb7ed1007cfeb0227d0f1bf20c5601c23e1d363ee23195ce6f8e134f14e" +content-hash = "0445ec55b5a9d9a1112768cadb11f9fe1b5f92b8322a9208868111c792da4f81" diff --git a/pyproject.toml b/pyproject.toml index 1010155bd3..79b9df8a4e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -87,9 +87,9 @@ autogen = ["pyautogen"] qdrant = ["qdrant-client"] ollama = ["llama-index-embeddings-ollama"] cloud-tool-sandbox = ["e2b-code-interpreter"] -external-tools = ["docker", "langchain", "wikipedia", "langchain-community", "composio-core", "composio-langchain"] +external-tools = ["docker", "langchain", "wikipedia", "langchain-community"] tests = ["wikipedia"] -all = ["pgvector", "pg8000", "psycopg2-binary", "psycopg2", "pytest", "pytest-asyncio", "pexpect", "black", "pre-commit", "datasets", "pyright", "pytest-order", "autoflake", "isort", "websockets", "fastapi", "uvicorn", "llama-index-embeddings-ollama", "docker", "langchain", "wikipedia", "langchain-community", "composio-core", "composio-langchain", "locust"] +all = ["pgvector", "pg8000", "psycopg2-binary", "psycopg2", "pytest", "pytest-asyncio", "pexpect", "black", "pre-commit", "datasets", "pyright", "pytest-order", "autoflake", "isort", "websockets", "fastapi", "uvicorn", "llama-index-embeddings-ollama", "docker", "langchain", "wikipedia", "langchain-community", "locust"] [tool.poetry.group.dev.dependencies] black = "^24.4.2" From 01afe75844852cfaea19457322d0b4f5f9d4867b Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Wed, 4 Dec 2024 11:37:51 -0800 Subject: [PATCH 010/280] feat: Support external codebases as a tool execution sandbox (#2159) --- .gitignore | 3 + letta/schemas/sandbox_config.py | 5 + letta/server/server.py | 3 +- letta/services/tool_execution_sandbox.py | 168 ++++++++++++++---- ...integration_test_tool_execution_sandbox.py | 46 ++++- .../restaurant_management_system/__init__.py | 0 .../adjust_menu_prices.py | 33 ++++ .../core/__init__.py | 0 .../core/customers.py | 7 + .../restaurant_management_system/core/menu.py | 26 +++ .../core/orders.py | 16 ++ .../core/utils.py | 2 + .../requirements.txt | 1 + .../restaurant_management_system/test.py | 25 +++ 14 files changed, 298 insertions(+), 37 deletions(-) create mode 100644 tests/test_tool_sandbox/restaurant_management_system/__init__.py create mode 100644 tests/test_tool_sandbox/restaurant_management_system/adjust_menu_prices.py create mode 100644 tests/test_tool_sandbox/restaurant_management_system/core/__init__.py create mode 100644 tests/test_tool_sandbox/restaurant_management_system/core/customers.py create mode 100644 tests/test_tool_sandbox/restaurant_management_system/core/menu.py create mode 100644 tests/test_tool_sandbox/restaurant_management_system/core/orders.py create mode 100644 tests/test_tool_sandbox/restaurant_management_system/core/utils.py create mode 100644 tests/test_tool_sandbox/restaurant_management_system/requirements.txt create mode 100644 tests/test_tool_sandbox/restaurant_management_system/test.py diff --git a/.gitignore b/.gitignore index 1fcffd8a4c..9fb91c2bb0 100644 --- a/.gitignore +++ b/.gitignore @@ -1018,3 +1018,6 @@ pgdata/ letta/.pytest_cache/ memgpy/pytest.ini **/**/pytest_cache + +## ignore venvs +tests/test_tool_sandbox/restaurant_management_system/venv diff --git a/letta/schemas/sandbox_config.py b/letta/schemas/sandbox_config.py index 74340ebeb8..97e5a8efc6 100644 --- a/letta/schemas/sandbox_config.py +++ b/letta/schemas/sandbox_config.py @@ -24,6 +24,11 @@ class SandboxRunResult(BaseModel): class LocalSandboxConfig(BaseModel): sandbox_dir: str = Field(..., description="Directory for the sandbox environment.") + use_venv: bool = Field(False, description="Whether or not to use the venv, or run directly in the same run loop.") + venv_name: str = Field( + "venv", + description="The name for the venv in the sandbox directory. We first search for an existing venv with this name, otherwise, we make it from the requirements.txt.", + ) @property def type(self) -> "SandboxType": diff --git a/letta/server/server.py b/letta/server/server.py index acfb904d35..350fa45e85 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -1876,7 +1876,8 @@ def get_composio_apps(self) -> List["AppModel"]: apps = self.composio_client.apps.get() apps_with_actions = [] for app in apps: - if app.meta["actionsCount"] > 0: + # A bit of hacky logic until composio patches this + if app.meta["actionsCount"] > 0 and not app.name.lower().endswith("_beta"): apps_with_actions.append(app) return apps_with_actions diff --git a/letta/services/tool_execution_sandbox.py b/letta/services/tool_execution_sandbox.py index 3cce7f2582..4dedfb3bbe 100644 --- a/letta/services/tool_execution_sandbox.py +++ b/letta/services/tool_execution_sandbox.py @@ -4,9 +4,12 @@ import os import pickle import runpy +import subprocess import sys import tempfile -from typing import Any, Optional +import uuid +import venv +from typing import Any, Dict, Optional, TextIO from letta.log import get_logger from letta.schemas.agent import AgentState @@ -24,6 +27,11 @@ class ToolExecutionSandbox: METADATA_CONFIG_STATE_KEY = "config_state" REQUIREMENT_TXT_NAME = "requirements.txt" + # For generating long, random marker hashes + NAMESPACE = uuid.NAMESPACE_DNS + LOCAL_SANDBOX_RESULT_START_MARKER = str(uuid.uuid5(NAMESPACE, "local-sandbox-result-start-marker")) + LOCAL_SANDBOX_RESULT_END_MARKER = str(uuid.uuid5(NAMESPACE, "local-sandbox-result-end-marker")) + # This is the variable name in the auto-generated code that contains the function results # We make this a long random string to avoid collisions with any variables in the user's code LOCAL_SANDBOX_RESULT_VAR_NAME = "result_ZQqiequkcFwRwwGQMqkt" @@ -65,12 +73,10 @@ def run(self, agent_state: Optional[AgentState] = None) -> Optional[SandboxRunRe """ if tool_settings.e2b_api_key: logger.debug(f"Using e2b sandbox to execute {self.tool_name}") - code = self.generate_execution_script(agent_state=agent_state) - result = self.run_e2b_sandbox(code=code) + result = self.run_e2b_sandbox(agent_state=agent_state) else: logger.debug(f"Using local sandbox to execute {self.tool_name}") - code = self.generate_execution_script(agent_state=agent_state) - result = self.run_local_dir_sandbox(code=code) + result = self.run_local_dir_sandbox(agent_state=agent_state) # Log out any stdout from the tool run logger.debug(f"Executed tool '{self.tool_name}', logging stdout from tool run: \n") @@ -94,12 +100,14 @@ def temporary_env_vars(self, env_vars: dict): os.environ.clear() os.environ.update(original_env) # Restore original environment variables - def run_local_dir_sandbox(self, code: str) -> Optional[SandboxRunResult]: + def run_local_dir_sandbox(self, agent_state: AgentState) -> Optional[SandboxRunResult]: sbx_config = self.sandbox_config_manager.get_or_create_default_sandbox_config(sandbox_type=SandboxType.LOCAL, actor=self.user) local_configs = sbx_config.get_local_config() # Get environment variables for the sandbox env_vars = self.sandbox_config_manager.get_sandbox_env_vars_as_dict(sandbox_config_id=sbx_config.id, actor=self.user, limit=100) + env = os.environ.copy() + env.update(env_vars) # Safety checks if not os.path.isdir(local_configs.sandbox_dir): @@ -107,6 +115,12 @@ def run_local_dir_sandbox(self, code: str) -> Optional[SandboxRunResult]: # Write the code to a temp file in the sandbox_dir with tempfile.NamedTemporaryFile(mode="w", dir=local_configs.sandbox_dir, suffix=".py", delete=False) as temp_file: + if local_configs.use_venv: + # If using venv, we need to wrap with special string markers to separate out the output and the stdout (since it is all in stdout) + code = self.generate_execution_script(agent_state=agent_state, wrap_print_with_markers=True) + else: + code = self.generate_execution_script(agent_state=agent_state) + temp_file.write(code) temp_file.flush() temp_file_path = temp_file.name @@ -114,39 +128,122 @@ def run_local_dir_sandbox(self, code: str) -> Optional[SandboxRunResult]: # Save the old stdout old_stdout = sys.stdout try: - # Redirect stdout to capture script output - captured_stdout = io.StringIO() - sys.stdout = captured_stdout - - # Execute the temp file - with self.temporary_env_vars(env_vars): - result = runpy.run_path(temp_file_path, init_globals=env_vars) - - # Fetch the result - func_result = result.get(self.LOCAL_SANDBOX_RESULT_VAR_NAME) - func_return, agent_state = self.parse_best_effort(func_result) - - # Restore stdout and collect captured output - sys.stdout = old_stdout - stdout_output = captured_stdout.getvalue() - - return SandboxRunResult( - func_return=func_return, - agent_state=agent_state, - stdout=[stdout_output], - sandbox_config_fingerprint=sbx_config.fingerprint(), - ) + if local_configs.use_venv: + return self.run_local_dir_sandbox_venv(sbx_config, env, temp_file_path) + else: + return self.run_local_dir_sandbox_runpy(sbx_config, env_vars, temp_file_path, old_stdout) except Exception as e: logger.error(f"Executing tool {self.tool_name} has an unexpected error: {e}") + logger.error(f"Logging out tool {self.tool_name} auto-generated code for debugging: \n\n{code}") raise e finally: # Clean up the temp file and restore stdout sys.stdout = old_stdout os.remove(temp_file_path) + def run_local_dir_sandbox_venv(self, sbx_config: SandboxConfig, env: Dict[str, str], temp_file_path: str) -> SandboxRunResult: + local_configs = sbx_config.get_local_config() + venv_path = os.path.join(local_configs.sandbox_dir, local_configs.venv_name) + + # Safety checks for the venv + # Verify that the venv path exists and is a directory + if not os.path.isdir(venv_path): + logger.warning(f"Virtual environment directory does not exist at: {venv_path}, creating one now...") + self.create_venv_for_local_sandbox(sandbox_dir_path=local_configs.sandbox_dir, venv_path=venv_path, env=env) + + # Ensure the python interpreter exists in the virtual environment + python_executable = os.path.join(venv_path, "bin", "python3") + if not os.path.isfile(python_executable): + raise FileNotFoundError(f"Python executable not found in virtual environment: {python_executable}") + + # Set up env for venv + env["VIRTUAL_ENV"] = venv_path + env["PATH"] = os.path.join(venv_path, "bin") + ":" + env["PATH"] + + # Execute the code in a restricted subprocess + try: + result = subprocess.run( + [os.path.join(venv_path, "bin", "python3"), temp_file_path], + env=env, + cwd=local_configs.sandbox_dir, # Restrict execution to sandbox_dir + timeout=60, + capture_output=True, + text=True, + ) + if result.stderr: + logger.error(f"Sandbox execution error: {result.stderr}") + raise RuntimeError(f"Sandbox execution error: {result.stderr}") + + func_result, stdout = self.parse_out_function_results_markers(result.stdout) + func_return, agent_state = self.parse_best_effort(func_result) + return SandboxRunResult( + func_return=func_return, agent_state=agent_state, stdout=[stdout], sandbox_config_fingerprint=sbx_config.fingerprint() + ) + except subprocess.TimeoutExpired: + raise TimeoutError(f"Executing tool {self.tool_name} has timed out.") + except subprocess.CalledProcessError as e: + raise RuntimeError(f"Executing tool {self.tool_name} has process error: {e}") + except Exception as e: + raise RuntimeError(f"Executing tool {self.tool_name} has an unexpected error: {e}") + + def run_local_dir_sandbox_runpy( + self, sbx_config: SandboxConfig, env_vars: Dict[str, str], temp_file_path: str, old_stdout: TextIO + ) -> SandboxRunResult: + # Redirect stdout to capture script output + captured_stdout = io.StringIO() + sys.stdout = captured_stdout + + # Execute the temp file + with self.temporary_env_vars(env_vars): + result = runpy.run_path(temp_file_path, init_globals=env_vars) + + # Fetch the result + func_result = result.get(self.LOCAL_SANDBOX_RESULT_VAR_NAME) + func_return, agent_state = self.parse_best_effort(func_result) + + # Restore stdout and collect captured output + sys.stdout = old_stdout + stdout_output = captured_stdout.getvalue() + + return SandboxRunResult( + func_return=func_return, + agent_state=agent_state, + stdout=[stdout_output], + sandbox_config_fingerprint=sbx_config.fingerprint(), + ) + + def parse_out_function_results_markers(self, text: str): + marker_len = len(self.LOCAL_SANDBOX_RESULT_START_MARKER) + start_index = text.index(self.LOCAL_SANDBOX_RESULT_START_MARKER) + marker_len + end_index = text.index(self.LOCAL_SANDBOX_RESULT_END_MARKER) + return text[start_index:end_index], text[: start_index - marker_len] + text[end_index + +marker_len :] + + def create_venv_for_local_sandbox(self, sandbox_dir_path: str, venv_path: str, env: Dict[str, str]): + # Step 1: Create the virtual environment + venv.create(venv_path, with_pip=True) + + pip_path = os.path.join(venv_path, "bin", "pip") + try: + # Step 2: Upgrade pip + logger.info("Upgrading pip in the virtual environment...") + subprocess.run([pip_path, "install", "--upgrade", "pip"], env=env, check=True) + + # Step 3: Install packages from requirements.txt if provided + requirements_txt_path = os.path.join(sandbox_dir_path, self.REQUIREMENT_TXT_NAME) + if os.path.isfile(requirements_txt_path): + logger.info(f"Installing packages from requirements file: {requirements_txt_path}") + subprocess.run([pip_path, "install", "-r", requirements_txt_path], env=env, check=True) + logger.info("Successfully installed packages from requirements.txt") + else: + logger.warning("No requirements.txt file provided or the file does not exist. Skipping package installation.") + + except subprocess.CalledProcessError as e: + logger.error(f"Error while setting up the virtual environment: {e}") + raise RuntimeError(f"Failed to set up the virtual environment: {e}") + # e2b sandbox specific functions - def run_e2b_sandbox(self, code: str) -> Optional[SandboxRunResult]: + def run_e2b_sandbox(self, agent_state: AgentState) -> Optional[SandboxRunResult]: sbx_config = self.sandbox_config_manager.get_or_create_default_sandbox_config(sandbox_type=SandboxType.E2B, actor=self.user) sbx = self.get_running_e2b_sandbox_with_same_state(sbx_config) if not sbx or self.force_recreate: @@ -158,6 +255,7 @@ def run_e2b_sandbox(self, code: str) -> Optional[SandboxRunResult]: # Get environment variables for the sandbox # TODO: We set limit to 100 here, but maybe we want it uncapped? Realistically this should be fine. env_vars = self.sandbox_config_manager.get_sandbox_env_vars_as_dict(sandbox_config_id=sbx_config.id, actor=self.user, limit=100) + code = self.generate_execution_script(agent_state=agent_state) execution = sbx.run_code(code, envs=env_vars) if execution.error is not None: logger.error(f"Executing tool {self.tool_name} failed with {execution.error}") @@ -236,13 +334,14 @@ def parse_function_arguments(self, source_code: str, tool_name: str): args.append(arg.arg) return args - def generate_execution_script(self, agent_state: AgentState) -> str: + def generate_execution_script(self, agent_state: AgentState, wrap_print_with_markers: bool = False) -> str: """ Generate code to run inside of execution sandbox. Passes into a serialized agent state into the code, to be accessed by the tool. Args: agent_state (AgentState): The agent state + wrap_print_with_markers (bool): If true, we wrap the final statement with a `print` and wrap with special markers Returns: code (str): The generated code strong @@ -286,7 +385,14 @@ def generate_execution_script(self, agent_state: AgentState) -> str: code += ( f"{self.LOCAL_SANDBOX_RESULT_VAR_NAME} = base64.b64encode(pickle.dumps({self.LOCAL_SANDBOX_RESULT_VAR_NAME})).decode('utf-8')\n" ) - code += f"{self.LOCAL_SANDBOX_RESULT_VAR_NAME}\n" + + if wrap_print_with_markers: + code += f"sys.stdout.write('{self.LOCAL_SANDBOX_RESULT_START_MARKER}')\n" + code += f"sys.stdout.write(str({self.LOCAL_SANDBOX_RESULT_VAR_NAME}))\n" + code += f"sys.stdout.write('{self.LOCAL_SANDBOX_RESULT_END_MARKER}')\n" + else: + code += f"{self.LOCAL_SANDBOX_RESULT_VAR_NAME}\n" + return code def _convert_param_to_value(self, param_type: str, raw_value: str) -> str: diff --git a/tests/integration_test_tool_execution_sandbox.py b/tests/integration_test_tool_execution_sandbox.py index da51f8eca2..bb414fae8f 100644 --- a/tests/integration_test_tool_execution_sandbox.py +++ b/tests/integration_test_tool_execution_sandbox.py @@ -184,7 +184,7 @@ def composio_github_star_tool(test_user): @pytest.fixture -def clear_core_memory(test_user): +def clear_core_memory_tool(test_user): def clear_memory(agent_state: AgentState): """Clear the core memory""" agent_state.memory.get_block("human").value = "" @@ -202,6 +202,17 @@ def core_memory_replace_tool(test_user): yield tool +@pytest.fixture +def external_codebase_tool(test_user): + from tests.test_tool_sandbox.restaurant_management_system.adjust_menu_prices import ( + adjust_menu_prices, + ) + + tool = create_tool_from_func(adjust_menu_prices) + tool = ToolManager().create_or_update_tool(tool, test_user) + yield tool + + @pytest.fixture def agent_state(): client = create_client() @@ -214,6 +225,8 @@ def agent_state(): # Local sandbox tests + + @pytest.mark.local_sandbox def test_local_sandbox_default(mock_e2b_api_key_none, add_integers_tool, test_user): args = {"x": 10, "y": 5} @@ -231,10 +244,10 @@ def test_local_sandbox_default(mock_e2b_api_key_none, add_integers_tool, test_us @pytest.mark.local_sandbox -def test_local_sandbox_stateful_tool(mock_e2b_api_key_none, clear_core_memory, test_user, agent_state): +def test_local_sandbox_stateful_tool(mock_e2b_api_key_none, clear_core_memory_tool, test_user, agent_state): args = {} # Run again to get actual response - sandbox = ToolExecutionSandbox(clear_core_memory.name, args, user_id=test_user.id) + sandbox = ToolExecutionSandbox(clear_core_memory_tool.name, args, user_id=test_user.id) result = sandbox.run(agent_state=agent_state) assert result.agent_state.memory.get_block("human").value == "" assert result.agent_state.memory.get_block("persona").value == "" @@ -313,6 +326,29 @@ def test_local_sandbox_e2e_composio_star_github(mock_e2b_api_key_none, check_com assert result.func_return["details"] == "Action executed successfully" +@pytest.mark.local_sandbox +def test_local_sandbox_external_codebase(mock_e2b_api_key_none, external_codebase_tool, test_user): + # Make the external codebase the sandbox config + manager = SandboxConfigManager(tool_settings) + + # Set the sandbox to be within the external codebase path and use a venv + external_codebase_path = str(Path(__file__).parent / "test_tool_sandbox" / "restaurant_management_system") + local_sandbox_config = LocalSandboxConfig(sandbox_dir=external_codebase_path, use_venv=True) + config_create = SandboxConfigCreate(config=local_sandbox_config.model_dump()) + manager.create_or_update_sandbox_config(sandbox_config_create=config_create, actor=test_user) + + # Set the args + args = {"percentage": 10} + + # Run again to get actual response + sandbox = ToolExecutionSandbox(external_codebase_tool.name, args, user_id=test_user.id) + result = sandbox.run() + + # Assert that the function return is correct + assert result.func_return == "Price Adjustments:\nBurger: $8.99 -> $9.89\nFries: $2.99 -> $3.29\nSoda: $1.99 -> $2.19" + assert "Hello World" in result.stdout[0] + + # E2B sandbox tests @@ -366,8 +402,8 @@ def test_e2b_sandbox_reuses_same_sandbox(check_e2b_key_is_set, list_tool, test_u @pytest.mark.e2b_sandbox -def test_e2b_sandbox_stateful_tool(check_e2b_key_is_set, clear_core_memory, test_user, agent_state): - sandbox = ToolExecutionSandbox(clear_core_memory.name, {}, user_id=test_user.id) +def test_e2b_sandbox_stateful_tool(check_e2b_key_is_set, clear_core_memory_tool, test_user, agent_state): + sandbox = ToolExecutionSandbox(clear_core_memory_tool.name, {}, user_id=test_user.id) # run the sandbox result = sandbox.run(agent_state=agent_state) diff --git a/tests/test_tool_sandbox/restaurant_management_system/__init__.py b/tests/test_tool_sandbox/restaurant_management_system/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/test_tool_sandbox/restaurant_management_system/adjust_menu_prices.py b/tests/test_tool_sandbox/restaurant_management_system/adjust_menu_prices.py new file mode 100644 index 0000000000..1e5c090e6b --- /dev/null +++ b/tests/test_tool_sandbox/restaurant_management_system/adjust_menu_prices.py @@ -0,0 +1,33 @@ +def adjust_menu_prices(percentage: float) -> str: + """ + Tool: Adjust Menu Prices + Description: Adjusts the prices of all menu items by a given percentage. + Args: + percentage (float): The percentage by which to adjust prices. Positive for an increase, negative for a decrease. + Returns: + str: A formatted string summarizing the price adjustments. + """ + import cowsay + from core.menu import Menu, MenuItem # Import a class from the codebase + from core.utils import format_currency # Use a utility function to test imports + + if not isinstance(percentage, (int, float)): + raise TypeError("percentage must be a number") + + # Generate dummy menu object + menu = Menu() + menu.add_item(MenuItem("Burger", 8.99, "Main")) + menu.add_item(MenuItem("Fries", 2.99, "Side")) + menu.add_item(MenuItem("Soda", 1.99, "Drink")) + + # Make adjustments and record + adjustments = [] + for item in menu.items: + old_price = item.price + item.price += item.price * (percentage / 100) + adjustments.append(f"{item.name}: {format_currency(old_price)} -> {format_currency(item.price)}") + + # Cowsay the adjustments because why not + cowsay.cow("Hello World") + + return "Price Adjustments:\n" + "\n".join(adjustments) diff --git a/tests/test_tool_sandbox/restaurant_management_system/core/__init__.py b/tests/test_tool_sandbox/restaurant_management_system/core/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/test_tool_sandbox/restaurant_management_system/core/customers.py b/tests/test_tool_sandbox/restaurant_management_system/core/customers.py new file mode 100644 index 0000000000..b04dcd4a2a --- /dev/null +++ b/tests/test_tool_sandbox/restaurant_management_system/core/customers.py @@ -0,0 +1,7 @@ +class Customer: + def __init__(self, name: str, loyalty_points: int = 0): + self.name = name + self.loyalty_points = loyalty_points + + def add_loyalty_points(self, points: int): + self.loyalty_points += points diff --git a/tests/test_tool_sandbox/restaurant_management_system/core/menu.py b/tests/test_tool_sandbox/restaurant_management_system/core/menu.py new file mode 100644 index 0000000000..c6788fef57 --- /dev/null +++ b/tests/test_tool_sandbox/restaurant_management_system/core/menu.py @@ -0,0 +1,26 @@ +from typing import List + + +class MenuItem: + def __init__(self, name: str, price: float, category: str): + self.name = name + self.price = price + self.category = category + + def __repr__(self): + return f"{self.name} (${self.price:.2f}) - {self.category}" + + +class Menu: + def __init__(self): + self.items: List[MenuItem] = [] + + def add_item(self, item: MenuItem): + self.items.append(item) + + def update_price(self, name: str, new_price: float): + for item in self.items: + if item.name == name: + item.price = new_price + return + raise ValueError(f"Menu item '{name}' not found.") diff --git a/tests/test_tool_sandbox/restaurant_management_system/core/orders.py b/tests/test_tool_sandbox/restaurant_management_system/core/orders.py new file mode 100644 index 0000000000..5c7b9f1ef4 --- /dev/null +++ b/tests/test_tool_sandbox/restaurant_management_system/core/orders.py @@ -0,0 +1,16 @@ +from typing import Dict + + +class Order: + def __init__(self, customer_name: str, items: Dict[str, int]): + self.customer_name = customer_name + self.items = items # Dictionary of item names to quantities + + def calculate_total(self, menu): + total = 0 + for item_name, quantity in self.items.items(): + menu_item = next((item for item in menu.items if item.name == item_name), None) + if menu_item is None: + raise ValueError(f"Menu item '{item_name}' not found.") + total += menu_item.price * quantity + return total diff --git a/tests/test_tool_sandbox/restaurant_management_system/core/utils.py b/tests/test_tool_sandbox/restaurant_management_system/core/utils.py new file mode 100644 index 0000000000..2293433596 --- /dev/null +++ b/tests/test_tool_sandbox/restaurant_management_system/core/utils.py @@ -0,0 +1,2 @@ +def format_currency(value: float) -> str: + return f"${value:.2f}" diff --git a/tests/test_tool_sandbox/restaurant_management_system/requirements.txt b/tests/test_tool_sandbox/restaurant_management_system/requirements.txt new file mode 100644 index 0000000000..c6b9ffd0e4 --- /dev/null +++ b/tests/test_tool_sandbox/restaurant_management_system/requirements.txt @@ -0,0 +1 @@ +cowsay diff --git a/tests/test_tool_sandbox/restaurant_management_system/test.py b/tests/test_tool_sandbox/restaurant_management_system/test.py new file mode 100644 index 0000000000..feefcc83e6 --- /dev/null +++ b/tests/test_tool_sandbox/restaurant_management_system/test.py @@ -0,0 +1,25 @@ +import os +import runpy + + +def generate_and_execute_tool(tool_name: str, args: dict): + # Define the tool's directory and file + tools_dir = os.path.join(os.path.dirname(__file__), "tools") + script_path = os.path.join(tools_dir, f"{tool_name}_execution.py") + + # Generate the Python script + with open(script_path, "w") as script_file: + script_file.write(f"from restaurant_management_system.tools.{tool_name} import {tool_name}\n\n") + arg_str = ", ".join([f"{key}={repr(value)}" for key, value in args.items()]) + script_file.write(f"if __name__ == '__main__':\n") + script_file.write(f" result = {tool_name}({arg_str})\n") + script_file.write(f" print(result)\n") + + # Execute the script + runpy.run_path(script_path, run_name="__main__") + + # Optional: Clean up generated script + # os.remove(script_path) + + +generate_and_execute_tool("adjust_menu_prices", {"percentage": 10}) From 38168f8b62b8d0504c89606be725c778e2c6806d Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Wed, 4 Dec 2024 13:25:57 -0800 Subject: [PATCH 011/280] fix: support initializing with custom message sequences (#2154) --- letta/agent.py | 2 + letta/schemas/agent.py | 4 +- letta/server/server.py | 46 ++++++++++++- tests/test_client_legacy.py | 126 +++++++++++++++++++----------------- 4 files changed, 113 insertions(+), 65 deletions(-) diff --git a/letta/agent.py b/letta/agent.py index ebd73aa9ea..7c4ff97e9d 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -350,6 +350,8 @@ def __init__( init_messages_objs = [] for msg in init_messages: init_messages_objs.append(msg) + for msg in init_messages_objs: + assert isinstance(msg, Message), f"Message object is not of type Message: {type(msg)}" assert all([isinstance(msg, Message) for msg in init_messages_objs]), (init_messages_objs, init_messages) # Put the messages inside the message buffer diff --git a/letta/schemas/agent.py b/letta/schemas/agent.py index 8b5161eb32..03a9cef929 100644 --- a/letta/schemas/agent.py +++ b/letta/schemas/agent.py @@ -9,7 +9,7 @@ from letta.schemas.letta_base import LettaBase from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import Memory -from letta.schemas.message import Message +from letta.schemas.message import Message, MessageCreate from letta.schemas.openai.chat_completion_response import UsageStatistics from letta.schemas.source import Source from letta.schemas.tool import Tool @@ -124,7 +124,7 @@ class CreateAgent(BaseAgent): # embedding_config: Optional[EmbeddingConfig] = Field(None, description="The embedding configuration used by the agent.") # Note: if this is None, then we'll populate with the standard "more human than human" initial message sequence # If the client wants to make this empty, then the client can set the arg to an empty list - initial_message_sequence: Optional[List[Message]] = Field( + initial_message_sequence: Optional[List[MessageCreate]] = Field( None, description="The initial set of messages to put in the agent's in-context memory." ) diff --git a/letta/server/server.py b/letta/server/server.py index 350fa45e85..32c88be460 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -372,6 +372,22 @@ def _add_agent(self, user_id: str, agent_id: str, agent_obj: Agent) -> None: } ) + def initialize_agent(self, agent_id, interface: Union[AgentInterface, None] = None, initial_message_sequence=None) -> Agent: + """Initialize an agent from the database""" + agent_state = self.get_agent(agent_id=agent_id) + actor = self.user_manager.get_user_by_id(user_id=agent_state.user_id) + + interface = interface or self.default_interface_factory() + if agent_state.agent_type == AgentType.memgpt_agent: + agent = Agent(agent_state=agent_state, interface=interface, user=actor, initial_message_sequence=initial_message_sequence) + else: + assert initial_message_sequence is None, f"Initial message sequence is not supported for O1Agents" + agent = O1Agent(agent_state=agent_state, interface=interface, user=actor) + + # Persist to agent + save_agent(agent, self.ms) + return agent + def load_agent(self, agent_id: str, interface: Union[AgentInterface, None] = None) -> Agent: """Updated method to load agents from persisted storage""" agent_lock = self.per_agent_lock_manager.get_lock(agent_id) @@ -385,6 +401,9 @@ def load_agent(self, agent_id: str, interface: Union[AgentInterface, None] = Non else: agent = O1Agent(agent_state=agent_state, interface=interface, user=actor) + # Rebuild the system prompt - may be linked to new blocks now + agent.rebuild_system_prompt() + # Persist to agent save_agent(agent, self.ms) return agent @@ -802,8 +821,6 @@ def create_agent( if not user: raise ValueError(f"cannot find user with associated client id: {user_id}") - # TODO: create the message objects (NOTE: do this after we migrate to `CreateMessage`) - # created and persist the agent state in the DB agent_state = PersistedAgentState( name=request.name, @@ -822,6 +839,31 @@ def create_agent( # this saves the agent ID and state into the DB self.ms.create_agent(agent_state) + # create the agent object + if request.initial_message_sequence: + # init_messages = [Message(user_id=user_id, agent_id=agent_state.id, role=message.role, text=message.text) for message in request.initial_message_sequence] + init_messages = [] + for message in request.initial_message_sequence: + + if message.role == MessageRole.user: + packed_message = system.package_user_message( + user_message=message.text, + ) + elif message.role == MessageRole.system: + packed_message = system.package_system_message( + system_message=message.text, + ) + else: + raise ValueError(f"Invalid message role: {message.role}") + + init_messages.append(Message(role=message.role, text=packed_message, user_id=user_id, agent_id=agent_state.id)) + # init_messages = [Message.dict_to_message(user_id=user_id, agent_id=agent_state.id, openai_message_dict=message.model_dump()) for message in request.initial_message_sequence] + else: + init_messages = None + + # initialize the agent (generates initial message list with system prompt) + self.initialize_agent(agent_id=agent_state.id, interface=interface, initial_message_sequence=init_messages) + # Note: mappings (e.g. tags, blocks) are created after the agent is persisted # TODO: add source mappings here as well diff --git a/tests/test_client_legacy.py b/tests/test_client_legacy.py index 96e27ab6ef..f49e56ab77 100644 --- a/tests/test_client_legacy.py +++ b/tests/test_client_legacy.py @@ -27,7 +27,6 @@ ) from letta.schemas.letta_response import LettaResponse, LettaStreamingResponse from letta.schemas.llm_config import LLMConfig -from letta.schemas.message import Message from letta.schemas.usage import LettaUsageStatistics from letta.services.tool_manager import ToolManager from letta.settings import model_settings, tool_settings @@ -624,66 +623,71 @@ def cleanup_agents(): print(f"Failed to delete agent {agent_id}: {e}") -## NOTE: we need to add this back once agents can also create blocks during agent creation -# def test_initial_message_sequence(client: Union[LocalClient, RESTClient], agent: AgentState, cleanup_agents: List[str]): -# """Test that we can set an initial message sequence -# -# If we pass in None, we should get a "default" message sequence -# If we pass in a non-empty list, we should get that sequence -# If we pass in an empty list, we should get an empty sequence -# """ -# -# # The reference initial message sequence: -# reference_init_messages = initialize_message_sequence( -# model=agent.llm_config.model, -# system=agent.system, -# memory=agent.memory, -# archival_memory=None, -# recall_memory=None, -# memory_edit_timestamp=get_utc_time(), -# include_initial_boot_message=True, -# ) -# -# # system, login message, send_message test, send_message receipt -# assert len(reference_init_messages) > 0 -# assert len(reference_init_messages) == 4, f"Expected 4 messages, got {len(reference_init_messages)}" -# -# # Test with default sequence -# default_agent_state = client.create_agent(name="test-default-message-sequence", initial_message_sequence=None) -# cleanup_agents.append(default_agent_state.id) -# assert default_agent_state.message_ids is not None -# assert len(default_agent_state.message_ids) > 0 -# assert len(default_agent_state.message_ids) == len( -# reference_init_messages -# ), f"Expected {len(reference_init_messages)} messages, got {len(default_agent_state.message_ids)}" -# -# # Test with empty sequence -# empty_agent_state = client.create_agent(name="test-empty-message-sequence", initial_message_sequence=[]) -# cleanup_agents.append(empty_agent_state.id) -# # NOTE: allowed to be None initially -# #assert empty_agent_state.message_ids is not None -# #assert len(empty_agent_state.message_ids) == 1, f"Expected 0 messages, got {len(empty_agent_state.message_ids)}" -# -# # Test with custom sequence -# custom_sequence = [ -# Message( -# role=MessageRole.user, -# text="Hello, how are you?", -# user_id=agent.user_id, -# agent_id=agent.id, -# model=agent.llm_config.model, -# name=None, -# tool_calls=None, -# tool_call_id=None, -# ), -# ] -# custom_agent_state = client.create_agent(name="test-custom-message-sequence", initial_message_sequence=custom_sequence) -# cleanup_agents.append(custom_agent_state.id) -# assert custom_agent_state.message_ids is not None -# assert ( -# len(custom_agent_state.message_ids) == len(custom_sequence) + 1 -# ), f"Expected {len(custom_sequence) + 1} messages, got {len(custom_agent_state.message_ids)}" -# assert custom_agent_state.message_ids[1:] == [msg.id for msg in custom_sequence] +# NOTE: we need to add this back once agents can also create blocks during agent creation +def test_initial_message_sequence(client: Union[LocalClient, RESTClient], agent: AgentState, cleanup_agents: List[str]): + """Test that we can set an initial message sequence + + If we pass in None, we should get a "default" message sequence + If we pass in a non-empty list, we should get that sequence + If we pass in an empty list, we should get an empty sequence + """ + from letta.agent import initialize_message_sequence + from letta.utils import get_utc_time + + # The reference initial message sequence: + reference_init_messages = initialize_message_sequence( + model=agent.llm_config.model, + system=agent.system, + memory=agent.memory, + archival_memory=None, + recall_memory=None, + memory_edit_timestamp=get_utc_time(), + include_initial_boot_message=True, + ) + + # system, login message, send_message test, send_message receipt + assert len(reference_init_messages) > 0 + assert len(reference_init_messages) == 4, f"Expected 4 messages, got {len(reference_init_messages)}" + + # Test with default sequence + default_agent_state = client.create_agent(name="test-default-message-sequence", initial_message_sequence=None) + cleanup_agents.append(default_agent_state.id) + assert default_agent_state.message_ids is not None + assert len(default_agent_state.message_ids) > 0 + assert len(default_agent_state.message_ids) == len( + reference_init_messages + ), f"Expected {len(reference_init_messages)} messages, got {len(default_agent_state.message_ids)}" + + # Test with empty sequence + empty_agent_state = client.create_agent(name="test-empty-message-sequence", initial_message_sequence=[]) + cleanup_agents.append(empty_agent_state.id) + # NOTE: allowed to be None initially + # assert empty_agent_state.message_ids is not None + # assert len(empty_agent_state.message_ids) == 1, f"Expected 0 messages, got {len(empty_agent_state.message_ids)}" + + # Test with custom sequence + # custom_sequence = [ + # Message( + # role=MessageRole.user, + # text="Hello, how are you?", + # user_id=agent.user_id, + # agent_id=agent.id, + # model=agent.llm_config.model, + # name=None, + # tool_calls=None, + # tool_call_id=None, + # ), + # ] + custom_sequence = [{"text": "Hello, how are you?", "role": "user"}] + custom_agent_state = client.create_agent(name="test-custom-message-sequence", initial_message_sequence=custom_sequence) + cleanup_agents.append(custom_agent_state.id) + assert custom_agent_state.message_ids is not None + assert ( + len(custom_agent_state.message_ids) == len(custom_sequence) + 1 + ), f"Expected {len(custom_sequence) + 1} messages, got {len(custom_agent_state.message_ids)}" + # assert custom_agent_state.message_ids[1:] == [msg.id for msg in custom_sequence] + # shoule be contained in second message (after system message) + assert custom_sequence[0]["text"] in client.get_in_context_messages(custom_agent_state.id)[1].text def test_add_and_manage_tags_for_agent(client: Union[LocalClient, RESTClient], agent: AgentState): From e41b7e1c88e728537070590b993b7a78675ba176 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Wed, 4 Dec 2024 13:29:50 -0800 Subject: [PATCH 012/280] chore: Skip foreign key/constraint tests if using SQLite (#2160) --- tests/test_managers.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/test_managers.py b/tests/test_managers.py index 6375290817..8067d731fa 100644 --- a/tests/test_managers.py +++ b/tests/test_managers.py @@ -1,3 +1,5 @@ +import os + import pytest from sqlalchemy import delete @@ -61,6 +63,8 @@ azure_deployment=None, ) +using_sqlite = not bool(os.getenv("LETTA_PG_URI")) + @pytest.fixture(autouse=True) def clear_tables(server: SyncServer): @@ -1074,6 +1078,7 @@ def test_change_label_on_block_reflects_in_block_agents_table(server, sarah_agen assert default_block.label not in labels +@pytest.mark.skipif(using_sqlite, reason="Skipped because using SQLite") def test_add_block_to_agent_nonexistent_block(server, sarah_agent, default_user): with pytest.raises(ForeignKeyConstraintViolationError): server.blocks_agents_manager.add_block_to_agent( @@ -1135,6 +1140,7 @@ def test_list_agent_ids_with_block(server, sarah_agent, charles_agent, default_u assert len(agent_ids) == 2 +@pytest.mark.skipif(using_sqlite, reason="Skipped because using SQLite") def test_add_block_to_agent_with_deleted_block(server, sarah_agent, default_user, default_block): block_manager = BlockManager() block_manager.delete_block(block_id=default_block.id, actor=default_user) From 2f2e1742e298b740ff07ba4c947bac365fe0066e Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Wed, 4 Dec 2024 15:20:57 -0800 Subject: [PATCH 013/280] fix: Suppress warnings during local sandbox tool execution w/ venv (#2164) --- letta/services/tool_execution_sandbox.py | 2 ++ ...integration_test_tool_execution_sandbox.py | 36 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/letta/services/tool_execution_sandbox.py b/letta/services/tool_execution_sandbox.py index 4dedfb3bbe..98c8603a49 100644 --- a/letta/services/tool_execution_sandbox.py +++ b/letta/services/tool_execution_sandbox.py @@ -159,6 +159,8 @@ def run_local_dir_sandbox_venv(self, sbx_config: SandboxConfig, env: Dict[str, s # Set up env for venv env["VIRTUAL_ENV"] = venv_path env["PATH"] = os.path.join(venv_path, "bin") + ":" + env["PATH"] + # Suppress all warnings + env["PYTHONWARNINGS"] = "ignore" # Execute the code in a restricted subprocess try: diff --git a/tests/integration_test_tool_execution_sandbox.py b/tests/integration_test_tool_execution_sandbox.py index bb414fae8f..09129e49cc 100644 --- a/tests/integration_test_tool_execution_sandbox.py +++ b/tests/integration_test_tool_execution_sandbox.py @@ -163,6 +163,26 @@ def get_env() -> str: yield tool +@pytest.fixture +def get_warning_tool(test_user): + def warn_hello_world() -> str: + """ + Simple function that warns hello world. + + Returns: + str: hello world + """ + import warnings + + msg = "Hello World" + warnings.warn(msg) + return msg + + tool = create_tool_from_func(warn_hello_world) + tool = ToolManager().create_or_update_tool(tool, test_user) + yield tool + + @pytest.fixture def list_tool(test_user): def create_list(): @@ -349,6 +369,22 @@ def test_local_sandbox_external_codebase(mock_e2b_api_key_none, external_codebas assert "Hello World" in result.stdout[0] +@pytest.mark.local_sandbox +def test_local_sandbox_with_venv_and_warnings_does_not_error(mock_e2b_api_key_none, get_warning_tool, test_user): + # Make the external codebase the sandbox config + manager = SandboxConfigManager(tool_settings) + + # Set the sandbox to be within the external codebase path and use a venv + external_codebase_path = str(Path(__file__).parent / "test_tool_sandbox" / "restaurant_management_system") + local_sandbox_config = LocalSandboxConfig(sandbox_dir=external_codebase_path, use_venv=True) + config_create = SandboxConfigCreate(config=local_sandbox_config.model_dump()) + manager.create_or_update_sandbox_config(sandbox_config_create=config_create, actor=test_user) + + sandbox = ToolExecutionSandbox(get_warning_tool.name, {}, user_id=test_user.id) + result = sandbox.run() + assert result.func_return == "Hello World" + + # E2B sandbox tests From 7a1dcff12d2685137089d809bea2fbee90fcf437 Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Wed, 4 Dec 2024 16:48:18 -0800 Subject: [PATCH 014/280] chore: update `poetry.lock` to fix docker build issue (#2163) --- poetry.lock | 236 ++++++++++++++++++++++++++-------------------------- 1 file changed, 118 insertions(+), 118 deletions(-) diff --git a/poetry.lock b/poetry.lock index fd65dada0b..3ed6715d6d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3158,13 +3158,13 @@ llama-parse = ">=0.5.0" [[package]] name = "llama-parse" -version = "0.5.15" +version = "0.5.16" description = "Parse files into RAG-Optimized formats." optional = false -python-versions = "<4.0,>=3.8.1" +python-versions = "<4.0,>=3.9" files = [ - {file = "llama_parse-0.5.15-py3-none-any.whl", hash = "sha256:7a3506c7d3ae5a8e68c70a457a7213d2698e26abcef1d7a989eb9771cd73ae60"}, - {file = "llama_parse-0.5.15.tar.gz", hash = "sha256:ecb009f71c8b4c657085ca81808a922c80785810e38b10f3b46f03cfd29ba92a"}, + {file = "llama_parse-0.5.16-py3-none-any.whl", hash = "sha256:a0b72770b1101604d02faa8236024eadd494fd135a833fb23a22a3ab570381fa"}, + {file = "llama_parse-0.5.16.tar.gz", hash = "sha256:609a9262461b787bab116e6ab74e52339e2950623f20867578e49d91e8974641"}, ] [package.dependencies] @@ -3910,13 +3910,13 @@ sympy = "*" [[package]] name = "openai" -version = "1.56.1" +version = "1.56.2" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" files = [ - {file = "openai-1.56.1-py3-none-any.whl", hash = "sha256:38e61183c2a98fedebbbb04a909a052d9f897358b070483fc0caff17300a227c"}, - {file = "openai-1.56.1.tar.gz", hash = "sha256:8b0449f22a0c318441eae8a8a789753c3b2cac86542be51ca45df788e26aa180"}, + {file = "openai-1.56.2-py3-none-any.whl", hash = "sha256:82d0c48f9504e04c7797e9b799dcf7f49a246d99b6cbfd90f3193ea80815b69e"}, + {file = "openai-1.56.2.tar.gz", hash = "sha256:17312af69bc7670d4048f98ab5849f8784d98c39ac64fcde19406e3774a0c1e5"}, ] [package.dependencies] @@ -5326,13 +5326,13 @@ dev = ["build", "flake8", "mypy", "pytest", "twine"] [[package]] name = "pyright" -version = "1.1.389" +version = "1.1.390" description = "Command line wrapper for pyright" optional = true python-versions = ">=3.7" files = [ - {file = "pyright-1.1.389-py3-none-any.whl", hash = "sha256:41e9620bba9254406dc1f621a88ceab5a88af4c826feb4f614d95691ed243a60"}, - {file = "pyright-1.1.389.tar.gz", hash = "sha256:716bf8cc174ab8b4dcf6828c3298cac05c5ed775dda9910106a5dcfe4c7fe220"}, + {file = "pyright-1.1.390-py3-none-any.whl", hash = "sha256:ecebfba5b6b50af7c1a44c2ba144ba2ab542c227eb49bc1f16984ff714e0e110"}, + {file = "pyright-1.1.390.tar.gz", hash = "sha256:aad7f160c49e0fbf8209507a15e17b781f63a86a1facb69ca877c71ef2e9538d"}, ] [package.dependencies] @@ -5943,114 +5943,114 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" -version = "0.22.1" +version = "0.22.3" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" files = [ - {file = "rpds_py-0.22.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ab27dd4edd84b13309f268ffcdfc07aef8339135ffab7b6d43f16884307a2a48"}, - {file = "rpds_py-0.22.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9d5b925156a746dc1f5f52376fdd1fbdd3f6ffe1fcd6f5e06f77ca79abb940a3"}, - {file = "rpds_py-0.22.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:201650b309c419143775c15209c620627de3c09a27c7fb58375325aec5cce260"}, - {file = "rpds_py-0.22.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:31264187fc934ff1024a4f56775f33c9252d3f4f3e27ec07d1995a26b52702c3"}, - {file = "rpds_py-0.22.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97c5ffe47ccf92d8b17e10f8a5ce28d015aa1196edc3359684cf31504eae6a14"}, - {file = "rpds_py-0.22.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9ac7280bd045f472b50306d7efeee051b69e3a2dd1b90f46bd7e86e63b1efa2"}, - {file = "rpds_py-0.22.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f941fb86195f97be7f6efe04a21b223f05dfe4d1dfb159999e2f8d101e44cc4"}, - {file = "rpds_py-0.22.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f91bfc39f7a64168e08ab831fa497ec5438c1d6c6e2f9e12848d95ad11ac8523"}, - {file = "rpds_py-0.22.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:effcae2152afe7937a28376dbabb25c770ef99ed4e16a4ffeb8e6a4f7c4f06aa"}, - {file = "rpds_py-0.22.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:2177e59c033bf0d1bf7de1ced561205963583caf3242c6c700a723034bfb5f8e"}, - {file = "rpds_py-0.22.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:66f4f48a89cdd30ab3a47335df81c76e9a63799d0d84b29c0618371c66fa37b0"}, - {file = "rpds_py-0.22.1-cp310-cp310-win32.whl", hash = "sha256:b07fa9e634234e84096adfa4be3828c8f26e238679c122824b2b3d7131bec578"}, - {file = "rpds_py-0.22.1-cp310-cp310-win_amd64.whl", hash = "sha256:ca4657e9fd0b1b5376942d403d634ce188f79064f0873aa853ab05b10185ceec"}, - {file = "rpds_py-0.22.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:608c84699b2db09c6a8743845b1a3dad36fae53eaaecb241d45b13dff74405fb"}, - {file = "rpds_py-0.22.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9dae4eb9b5534e09ba6c6ab496a757e5e394b7e7b08767d25ca37e8d36491114"}, - {file = "rpds_py-0.22.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09a1f000c5f6e08b298275bae00921e9fbbf2a35dae0a86db2821c058c2201a9"}, - {file = "rpds_py-0.22.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:580ccbf11f02f948add4cb641843030a89f1463d7c0740cbfc9aca91e9dc34b3"}, - {file = "rpds_py-0.22.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96559e05bdf938b2048353e10a7920b98f853cefe4482c2064a718d7d0a50bd7"}, - {file = "rpds_py-0.22.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:128cbaed7ba26116820bcb992405d6a13ea18c8fca1b8c4f59906d858e91e979"}, - {file = "rpds_py-0.22.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:734783dd7da58f76222f458346ddebdb3621686a1a2a667db5049caf0c9956b9"}, - {file = "rpds_py-0.22.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c9ce6b83597d45bec44a2690857ede62fc98223772135f8a7fa90884eb726501"}, - {file = "rpds_py-0.22.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bca4428c4a957b78ded3e6e62884ab03f029dce8fa8d34818da0f80f61332b49"}, - {file = "rpds_py-0.22.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1ded65691a1d3fd7d2aa89d2c91aa51f941601bb2ce099739909034d957fef4b"}, - {file = "rpds_py-0.22.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:72407065ad459db9f3d052ea8c51e02534f02533fc61e51cbab3bd94166f086c"}, - {file = "rpds_py-0.22.1-cp311-cp311-win32.whl", hash = "sha256:eb013aa01b404219f28dc973d9e6310fd4db216d7299253dd355629952e0564e"}, - {file = "rpds_py-0.22.1-cp311-cp311-win_amd64.whl", hash = "sha256:8bd9ec1db79a664f4cbb12878693b73416f4d2cb425d3e27eccc1bdfbdc826ef"}, - {file = "rpds_py-0.22.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8ec41049c90d204a6561238a9ad6c7263ebb7009d9759c98b58078d9d2fec9ba"}, - {file = "rpds_py-0.22.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:102be79c4cc47a4aeb5912401185c404cd2601c15a7163bbecff7f1bfe20b669"}, - {file = "rpds_py-0.22.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a603155db408f773637f9e3a712c6e3cbc521aaa8fa2b99f9ba6106c59a2496"}, - {file = "rpds_py-0.22.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5dbff9402c2bdf00bf0df9905694b3c292a3847c725651938a72f554351a5fcb"}, - {file = "rpds_py-0.22.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96b3759d8ab2323324e0a92b2f44834f9d88089b8d1ab6f533b61f4be3411cef"}, - {file = "rpds_py-0.22.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3029f481b31f329b1fdb4ec4b56935d82210ddd9c6f86ea5a87c06f1e97b161"}, - {file = "rpds_py-0.22.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d280b4bf09f719b89fd9aab3b71067acc0d0449b7d1eba99a2ade4939cef8296"}, - {file = "rpds_py-0.22.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6c8e97e19aa7b0b0d801a159f932ce4435f1049c8c38e2bb372bb5bee559ce50"}, - {file = "rpds_py-0.22.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:50e4b5d291105f7063259fe0125b1af902fb34499444d7c5c521dd8328b00939"}, - {file = "rpds_py-0.22.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d3777c446bb1c5fcd82dc3f8776e1a146cd91e80cc1892f8634575ace438d22f"}, - {file = "rpds_py-0.22.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:447ae1104fb32197b9262f772d565d38e834cc2e9edd89350b37b88fed636e70"}, - {file = "rpds_py-0.22.1-cp312-cp312-win32.whl", hash = "sha256:55d371b9d8b0c2a68a50413a8cb01c3c3ce1ea4f768bf77b66669a9a486e101e"}, - {file = "rpds_py-0.22.1-cp312-cp312-win_amd64.whl", hash = "sha256:413a30a99d8683dace3765885920ed27ab662efbb6c98d81db76c397ad1ffd71"}, - {file = "rpds_py-0.22.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:aa2ba0176037c915d8660a4e46581d645e2c22b5373e466bc8640a794d45861a"}, - {file = "rpds_py-0.22.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4ba6c66fbc6015b2f99e7176fec41793cecb00c4cc357cad038dff85e6ac42ab"}, - {file = "rpds_py-0.22.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15fa4ca658f8ad22645d3531682b17e5580832efbfa87304c3e62214c79c1e8a"}, - {file = "rpds_py-0.22.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d7833ef6f5d6cb634f296abfd93452fb3eb44c4e9a6ae95c1021eab704c1cee2"}, - {file = "rpds_py-0.22.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c0467838c90435b80793cde486a318fc916ee57f2af54e4b10c72b20cbdcbaa9"}, - {file = "rpds_py-0.22.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d962e2e89b3a95e3597a34b8c93ced1e98958502c5b8096c9fd69deff279f561"}, - {file = "rpds_py-0.22.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ce729f1dc8a4a190c34b69f75377bddc004079b2963ab722ab91fafe040be6d"}, - {file = "rpds_py-0.22.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8080467df22feca0fc9c46567001777c6fbc2b4a2683a7137420896051874ca1"}, - {file = "rpds_py-0.22.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0f9eb37d3a60b262a98ab51ee899cac039de9ca0ce68dcf1a6518a09719020b0"}, - {file = "rpds_py-0.22.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:153248f48d6f90a295a502f53ec544a3ffbd21b0bb32f5dca39c4b93a764d6a2"}, - {file = "rpds_py-0.22.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0a53592cdf98cec3dfcdb24ffec8a4797e7656b65700099af43ec7df023b6de4"}, - {file = "rpds_py-0.22.1-cp313-cp313-win32.whl", hash = "sha256:e8056adcefa2dcb67e8bc91ea5eee26df66e8b297a8cd6ff0903f85c70908fa0"}, - {file = "rpds_py-0.22.1-cp313-cp313-win_amd64.whl", hash = "sha256:a451dba533be77454ebcffc85189108fc05f279100835ac76e7989edacb89156"}, - {file = "rpds_py-0.22.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:2ea23f1525d4f64286dbe0947c929d45c3ffe963b2dbed1d3844a2e4938bda42"}, - {file = "rpds_py-0.22.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3aaa22487477de9618ce3b37f99fbe81219ba96f3c2ca84f576f0ab451b83aba"}, - {file = "rpds_py-0.22.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8954b9ffe60f479a0c0ba40987db2546c735ab02a725ea7fd89342152d4d821d"}, - {file = "rpds_py-0.22.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c8502a02ae3ae67084f5a0bf5a8253b19fa7a887f824e41e016cdb0ac532a06f"}, - {file = "rpds_py-0.22.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a083221b6a4ecdef38a60c95d8d3223d99449cb4da2544e9644958dc16664eb9"}, - {file = "rpds_py-0.22.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:542eb246d5be31b5e0a9c8ddb9539416f9b31f58f75bd4ee328bff2b5c58d6fd"}, - {file = "rpds_py-0.22.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffae97d28ea4f2c613a751d087b75a97fb78311b38cc2e9a2f4587e473ace167"}, - {file = "rpds_py-0.22.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0ff8d5b13ce2357fa8b33a0a2e3775aa71df5bf7c8ba060634c9d15ab12f357"}, - {file = "rpds_py-0.22.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0f057a0c546c42964836b209d8de9ea1a4f4b0432006c6343cbe633d8ca14571"}, - {file = "rpds_py-0.22.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:48ee97c7c6027fd423058675b5a39d0b5f7a1648250b671563d5c9f74ff13ff0"}, - {file = "rpds_py-0.22.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:babec324e8654a59122aaa66936a9a483faa03276db9792f51332475c2dddc4a"}, - {file = "rpds_py-0.22.1-cp313-cp313t-win32.whl", hash = "sha256:e69acdbc132c9592c8dc393af85e38e206ca847c7019a953ff625191c3a12312"}, - {file = "rpds_py-0.22.1-cp313-cp313t-win_amd64.whl", hash = "sha256:c783e4ed68200f4e03c125690d23158b1c49c4b186d458a18debc109bbdc3c2e"}, - {file = "rpds_py-0.22.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:2143c3aed85992604d758bbe67da839fb4aab3dd2e1c6dddab5b3ca7162b34a2"}, - {file = "rpds_py-0.22.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f57e2d0f8022783426121b586d7c842ea40ea832a29e28ca36c881b54c74fb28"}, - {file = "rpds_py-0.22.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c0c324879d483504b07f7b18eb1b50567c434263bbe4866ecce33056162668a"}, - {file = "rpds_py-0.22.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1c40e02cc4f3e18fd39344edb10eebe04bd11cfd13119606b5771e5ea51630d3"}, - {file = "rpds_py-0.22.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f76c6f319e57007ad52e671ec741d801324760a377e3d4992c9bb8200333ebac"}, - {file = "rpds_py-0.22.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5cae9b415ea8a6a563566dbf46650222eccc5971c7daa16fbee63aef92ae543"}, - {file = "rpds_py-0.22.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b09209cdfcacf5eba9cf80367130532e6c02e695252e1f64d3cfcc2356e6e19f"}, - {file = "rpds_py-0.22.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dbe428d0ac6eacaf05402adbaf137f59ad6063848182d1ff294f95ce0f24005b"}, - {file = "rpds_py-0.22.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:626b9feb01bff049a5aec4804f0c58db12585778b4902e5376a95b01f80a7a16"}, - {file = "rpds_py-0.22.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ec1ccc2a9f764cd632fb8ab28fdde166250df54fc8d97315a4a6948dc5367639"}, - {file = "rpds_py-0.22.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ef92b1fbe6aa2e7885eb90853cc016b1fc95439a8cc8da6d526880e9e2148695"}, - {file = "rpds_py-0.22.1-cp39-cp39-win32.whl", hash = "sha256:c88535f83f7391cf3a45af990237e3939a6fdfbedaed2571633bfdd0bceb36b0"}, - {file = "rpds_py-0.22.1-cp39-cp39-win_amd64.whl", hash = "sha256:7839b7528faa4d134c183b1f2dd1ee4dc2ca2f899f4f0cfdf00fc04c255262a7"}, - {file = "rpds_py-0.22.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a0ed14a4162c2c2b21a162c9fcf90057e3e7da18cd171ab344c1e1664f75090e"}, - {file = "rpds_py-0.22.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:05fdeae9010533e47715c37df83264df0122584e40d691d50cf3607c060952a3"}, - {file = "rpds_py-0.22.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4659b2e4a5008715099e216050f5c6976e5a4329482664411789968b82e3f17d"}, - {file = "rpds_py-0.22.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a18aedc032d6468b73ebbe4437129cb30d54fe543cde2f23671ecad76c3aea24"}, - {file = "rpds_py-0.22.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149b4d875ef9b12a8f5e303e86a32a58f8ef627e57ec97a7d0e4be819069d141"}, - {file = "rpds_py-0.22.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdaee3947eaaa52dae3ceb9d9f66329e13d8bae35682b1e5dd54612938693934"}, - {file = "rpds_py-0.22.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36ce951800ed2acc6772fd9f42150f29d567f0423989748052fdb39d9e2b5795"}, - {file = "rpds_py-0.22.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ab784621d3e2a41916e21f13a483602cc989fd45fff637634b9231ba43d4383b"}, - {file = "rpds_py-0.22.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:c2a214bf5b79bd39a9de1c991353aaaacafda83ba1374178309e92be8e67d411"}, - {file = "rpds_py-0.22.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:85060e96953647871957d41707adb8d7bff4e977042fd0deb4fc1881b98dd2fe"}, - {file = "rpds_py-0.22.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:c6f3fd617db422c9d4e12cb8d84c984fe07d6d9cb0950cbf117f3bccc6268d05"}, - {file = "rpds_py-0.22.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f2d1b58a0c3a73f0361759642e80260a6d28eee6501b40fe25b82af33ef83f21"}, - {file = "rpds_py-0.22.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:76eaa4c087a061a2c8a0a92536405069878a8f530c00e84a9eaf332e70f5561f"}, - {file = "rpds_py-0.22.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:959ae04ed30cde606f3a0320f0a1f4167a107e685ef5209cce28c5080590bd31"}, - {file = "rpds_py-0.22.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:198067aa6f3d942ff5d0d655bb1e91b59ae85279d47590682cba2834ac1b97d2"}, - {file = "rpds_py-0.22.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3e7e99e2af59c56c59b6c964d612511b8203480d39d1ef83edc56f2cb42a3f5d"}, - {file = "rpds_py-0.22.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0545928bdf53dfdfcab284468212efefb8a6608ca3b6910c7fb2e5ed8bdc2dc0"}, - {file = "rpds_py-0.22.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef7282d8a14b60dd515e47060638687710b1d518f4b5e961caad43fb3a3606f9"}, - {file = "rpds_py-0.22.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe3f245c2f39a5692d9123c174bc48f6f9fe3e96407e67c6d04541a767d99e72"}, - {file = "rpds_py-0.22.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efb2ad60ca8637d5f9f653f9a9a8d73964059972b6b95036be77e028bffc68a3"}, - {file = "rpds_py-0.22.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d8306f27418361b788e3fca9f47dec125457f80122e7e31ba7ff5cdba98343f8"}, - {file = "rpds_py-0.22.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:4c8dc7331e8cbb1c0ea2bcb550adb1777365944ffd125c69aa1117fdef4887f5"}, - {file = "rpds_py-0.22.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:776a06cb5720556a549829896a49acebb5bdd96c7bba100191a994053546975a"}, - {file = "rpds_py-0.22.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e4f91d702b9ce1388660b3d4a28aa552614a1399e93f718ed0dacd68f23b3d32"}, - {file = "rpds_py-0.22.1.tar.gz", hash = "sha256:157a023bded0618a1eea54979fe2e0f9309e9ddc818ef4b8fc3b884ff38fedd5"}, + {file = "rpds_py-0.22.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967"}, + {file = "rpds_py-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70eb60b3ae9245ddea20f8a4190bd79c705a22f8028aaf8bbdebe4716c3fab24"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4041711832360a9b75cfb11b25a6a97c8fb49c07b8bd43d0d02b45d0b499a4ff"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64607d4cbf1b7e3c3c8a14948b99345eda0e161b852e122c6bb71aab6d1d798c"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e69b0a0e2537f26d73b4e43ad7bc8c8efb39621639b4434b76a3de50c6966e"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc27863442d388870c1809a87507727b799c8460573cfbb6dc0eeaef5a11b5ec"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e79dd39f1e8c3504be0607e5fc6e86bb60fe3584bec8b782578c3b0fde8d932c"}, + {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e0fa2d4ec53dc51cf7d3bb22e0aa0143966119f42a0c3e4998293a3dd2856b09"}, + {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fda7cb070f442bf80b642cd56483b5548e43d366fe3f39b98e67cce780cded00"}, + {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cff63a0272fcd259dcc3be1657b07c929c466b067ceb1c20060e8d10af56f5bf"}, + {file = "rpds_py-0.22.3-cp310-cp310-win32.whl", hash = "sha256:9bd7228827ec7bb817089e2eb301d907c0d9827a9e558f22f762bb690b131652"}, + {file = "rpds_py-0.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:9beeb01d8c190d7581a4d59522cd3d4b6887040dcfc744af99aa59fef3e041a8"}, + {file = "rpds_py-0.22.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f"}, + {file = "rpds_py-0.22.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d"}, + {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648"}, + {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74"}, + {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a"}, + {file = "rpds_py-0.22.3-cp311-cp311-win32.whl", hash = "sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64"}, + {file = "rpds_py-0.22.3-cp311-cp311-win_amd64.whl", hash = "sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c"}, + {file = "rpds_py-0.22.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e"}, + {file = "rpds_py-0.22.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059"}, + {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e"}, + {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61"}, + {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7"}, + {file = "rpds_py-0.22.3-cp312-cp312-win32.whl", hash = "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627"}, + {file = "rpds_py-0.22.3-cp312-cp312-win_amd64.whl", hash = "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4"}, + {file = "rpds_py-0.22.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84"}, + {file = "rpds_py-0.22.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f"}, + {file = "rpds_py-0.22.3-cp313-cp313-win32.whl", hash = "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de"}, + {file = "rpds_py-0.22.3-cp313-cp313-win_amd64.whl", hash = "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9"}, + {file = "rpds_py-0.22.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333"}, + {file = "rpds_py-0.22.3-cp313-cp313t-win32.whl", hash = "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730"}, + {file = "rpds_py-0.22.3-cp313-cp313t-win_amd64.whl", hash = "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf"}, + {file = "rpds_py-0.22.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:378753b4a4de2a7b34063d6f95ae81bfa7b15f2c1a04a9518e8644e81807ebea"}, + {file = "rpds_py-0.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3445e07bf2e8ecfeef6ef67ac83de670358abf2996916039b16a218e3d95e97e"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b2513ba235829860b13faa931f3b6846548021846ac808455301c23a101689d"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eaf16ae9ae519a0e237a0f528fd9f0197b9bb70f40263ee57ae53c2b8d48aeb3"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:583f6a1993ca3369e0f80ba99d796d8e6b1a3a2a442dd4e1a79e652116413091"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4617e1915a539a0d9a9567795023de41a87106522ff83fbfaf1f6baf8e85437e"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c150c7a61ed4a4f4955a96626574e9baf1adf772c2fb61ef6a5027e52803543"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2fa4331c200c2521512595253f5bb70858b90f750d39b8cbfd67465f8d1b596d"}, + {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:214b7a953d73b5e87f0ebece4a32a5bd83c60a3ecc9d4ec8f1dca968a2d91e99"}, + {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f47ad3d5f3258bd7058d2d506852217865afefe6153a36eb4b6928758041d831"}, + {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f276b245347e6e36526cbd4a266a417796fc531ddf391e43574cf6466c492520"}, + {file = "rpds_py-0.22.3-cp39-cp39-win32.whl", hash = "sha256:bbb232860e3d03d544bc03ac57855cd82ddf19c7a07651a7c0fdb95e9efea8b9"}, + {file = "rpds_py-0.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfbc454a2880389dbb9b5b398e50d439e2e58669160f27b60e5eca11f68ae17c"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d48424e39c2611ee1b84ad0f44fb3b2b53d473e65de061e3f460fc0be5f1939d"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:24e8abb5878e250f2eb0d7859a8e561846f98910326d06c0d51381fed59357bd"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b232061ca880db21fa14defe219840ad9b74b6158adb52ddf0e87bead9e8493"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac0a03221cdb5058ce0167ecc92a8c89e8d0decdc9e99a2ec23380793c4dcb96"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb0c341fa71df5a4595f9501df4ac5abfb5a09580081dffbd1ddd4654e6e9123"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf9db5488121b596dbfc6718c76092fda77b703c1f7533a226a5a9f65248f8ad"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8db6b5b2d4491ad5b6bdc2bc7c017eec108acbf4e6785f42a9eb0ba234f4c9"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3d504047aba448d70cf6fa22e06cb09f7cbd761939fdd47604f5e007675c24e"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e61b02c3f7a1e0b75e20c3978f7135fd13cb6cf551bf4a6d29b999a88830a338"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:e35ba67d65d49080e8e5a1dd40101fccdd9798adb9b050ff670b7d74fa41c566"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:26fd7cac7dd51011a245f29a2cc6489c4608b5a8ce8d75661bb4a1066c52dfbe"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:177c7c0fce2855833819c98e43c262007f42ce86651ffbb84f37883308cb0e7d"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bb47271f60660803ad11f4c61b42242b8c1312a31c98c578f79ef9387bbde21c"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:70fb28128acbfd264eda9bf47015537ba3fe86e40d046eb2963d75024be4d055"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44d61b4b7d0c2c9ac019c314e52d7cbda0ae31078aabd0f22e583af3e0d79723"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f0e260eaf54380380ac3808aa4ebe2d8ca28b9087cf411649f96bad6900c728"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b25bc607423935079e05619d7de556c91fb6adeae9d5f80868dde3468657994b"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb6116dfb8d1925cbdb52595560584db42a7f664617a1f7d7f6e32f138cdf37d"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a63cbdd98acef6570c62b92a1e43266f9e8b21e699c363c0fef13bd530799c11"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b8f60e1b739a74bab7e01fcbe3dddd4657ec685caa04681df9d562ef15b625f"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2e8b55d8517a2fda8d95cb45d62a5a8bbf9dd0ad39c5b25c8833efea07b880ca"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:2de29005e11637e7a2361fa151f780ff8eb2543a0da1413bb951e9f14b699ef3"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:666ecce376999bf619756a24ce15bb14c5bfaf04bf00abc7e663ce17c3f34fe7"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5246b14ca64a8675e0a7161f7af68fe3e910e6b90542b4bfb5439ba752191df6"}, + {file = "rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d"}, ] [[package]] @@ -6175,13 +6175,13 @@ files = [ [[package]] name = "six" -version = "1.16.0" +version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] [[package]] From d395dee4b9682a00f0572799780def9a7542d49f Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Wed, 4 Dec 2024 17:50:39 -0800 Subject: [PATCH 015/280] feat: Parse out errors from venv local sandbox (#2166) --- letta/services/tool_execution_sandbox.py | 34 ++++++-- ...integration_test_tool_execution_sandbox.py | 77 ++++++++++++++----- 2 files changed, 86 insertions(+), 25 deletions(-) diff --git a/letta/services/tool_execution_sandbox.py b/letta/services/tool_execution_sandbox.py index 98c8603a49..4c95184cc5 100644 --- a/letta/services/tool_execution_sandbox.py +++ b/letta/services/tool_execution_sandbox.py @@ -172,9 +172,31 @@ def run_local_dir_sandbox_venv(self, sbx_config: SandboxConfig, env: Dict[str, s capture_output=True, text=True, ) - if result.stderr: - logger.error(f"Sandbox execution error: {result.stderr}") - raise RuntimeError(f"Sandbox execution error: {result.stderr}") + + # Handle error with optimistic error parsing from the string + # This is very brittle, so we fall back to a RuntimeError if parsing fails + if result.returncode != 0: + # Log the error + logger.error(f"Sandbox execution error:\n{result.stderr}") + + # Parse and raise the actual error from stderr + tb_lines = result.stderr.strip().splitlines() + exception_line = tb_lines[-1] # The last line contains the exception + + try: + # Split exception type and message + exception_type, exception_message = exception_line.split(": ", 1) + exception_type = exception_type.strip() + exception_message = exception_message.strip() + + # Dynamically raise the exception + exception_class = eval(exception_type) # Look up the exception type + + except Exception: + # Fallback to RuntimeError if parsing fails + raise RuntimeError(result.stderr) + + raise exception_class(exception_message) func_result, stdout = self.parse_out_function_results_markers(result.stdout) func_return, agent_state = self.parse_best_effort(func_result) @@ -184,9 +206,11 @@ def run_local_dir_sandbox_venv(self, sbx_config: SandboxConfig, env: Dict[str, s except subprocess.TimeoutExpired: raise TimeoutError(f"Executing tool {self.tool_name} has timed out.") except subprocess.CalledProcessError as e: - raise RuntimeError(f"Executing tool {self.tool_name} has process error: {e}") + logger.error(f"Executing tool {self.tool_name} has process error: {e}") + raise e except Exception as e: - raise RuntimeError(f"Executing tool {self.tool_name} has an unexpected error: {e}") + logger.error(f"Executing tool {self.tool_name} has an unexpected error: {e}") + raise e def run_local_dir_sandbox_runpy( self, sbx_config: SandboxConfig, env_vars: Dict[str, str], temp_file_path: str, old_stdout: TextIO diff --git a/tests/integration_test_tool_execution_sandbox.py b/tests/integration_test_tool_execution_sandbox.py index 09129e49cc..20df005164 100644 --- a/tests/integration_test_tool_execution_sandbox.py +++ b/tests/integration_test_tool_execution_sandbox.py @@ -183,6 +183,23 @@ def warn_hello_world() -> str: yield tool +@pytest.fixture +def always_err_tool(test_user): + def error() -> str: + """ + Simple function that errors + + Returns: + str: not important + """ + # Raise a unusual error so we know it's from this function + raise ZeroDivisionError("This is an intentionally weird division!") + + tool = create_tool_from_func(error) + tool = ToolManager().create_or_update_tool(tool, test_user) + yield tool + + @pytest.fixture def list_tool(test_user): def create_list(): @@ -244,6 +261,33 @@ def agent_state(): yield agent_state +@pytest.fixture +def custom_test_sandbox_config(test_user): + """ + Fixture to create a consistent local sandbox configuration for tests. + + Args: + test_user: The test user to be used for creating the sandbox configuration. + + Returns: + A tuple containing the SandboxConfigManager and the created sandbox configuration. + """ + # Create the SandboxConfigManager + manager = SandboxConfigManager(tool_settings) + + # Set the sandbox to be within the external codebase path and use a venv + external_codebase_path = str(Path(__file__).parent / "test_tool_sandbox" / "restaurant_management_system") + local_sandbox_config = LocalSandboxConfig(sandbox_dir=external_codebase_path, use_venv=True) + + # Create the sandbox configuration + config_create = SandboxConfigCreate(config=local_sandbox_config.model_dump()) + + # Create or update the sandbox configuration + manager.create_or_update_sandbox_config(sandbox_config_create=config_create, actor=test_user) + + return manager, local_sandbox_config + + # Local sandbox tests @@ -347,16 +391,7 @@ def test_local_sandbox_e2e_composio_star_github(mock_e2b_api_key_none, check_com @pytest.mark.local_sandbox -def test_local_sandbox_external_codebase(mock_e2b_api_key_none, external_codebase_tool, test_user): - # Make the external codebase the sandbox config - manager = SandboxConfigManager(tool_settings) - - # Set the sandbox to be within the external codebase path and use a venv - external_codebase_path = str(Path(__file__).parent / "test_tool_sandbox" / "restaurant_management_system") - local_sandbox_config = LocalSandboxConfig(sandbox_dir=external_codebase_path, use_venv=True) - config_create = SandboxConfigCreate(config=local_sandbox_config.model_dump()) - manager.create_or_update_sandbox_config(sandbox_config_create=config_create, actor=test_user) - +def test_local_sandbox_external_codebase(mock_e2b_api_key_none, custom_test_sandbox_config, external_codebase_tool, test_user): # Set the args args = {"percentage": 10} @@ -370,21 +405,23 @@ def test_local_sandbox_external_codebase(mock_e2b_api_key_none, external_codebas @pytest.mark.local_sandbox -def test_local_sandbox_with_venv_and_warnings_does_not_error(mock_e2b_api_key_none, get_warning_tool, test_user): - # Make the external codebase the sandbox config - manager = SandboxConfigManager(tool_settings) - - # Set the sandbox to be within the external codebase path and use a venv - external_codebase_path = str(Path(__file__).parent / "test_tool_sandbox" / "restaurant_management_system") - local_sandbox_config = LocalSandboxConfig(sandbox_dir=external_codebase_path, use_venv=True) - config_create = SandboxConfigCreate(config=local_sandbox_config.model_dump()) - manager.create_or_update_sandbox_config(sandbox_config_create=config_create, actor=test_user) - +def test_local_sandbox_with_venv_and_warnings_does_not_error( + mock_e2b_api_key_none, custom_test_sandbox_config, get_warning_tool, test_user +): sandbox = ToolExecutionSandbox(get_warning_tool.name, {}, user_id=test_user.id) result = sandbox.run() assert result.func_return == "Hello World" +@pytest.mark.e2b_sandbox +def test_local_sandbox_with_venv_errors(mock_e2b_api_key_none, custom_test_sandbox_config, always_err_tool, test_user): + sandbox = ToolExecutionSandbox(always_err_tool.name, {}, user_id=test_user.id) + + # run the sandbox + with pytest.raises(ZeroDivisionError, match="This is an intentionally weird division!"): + sandbox.run() + + # E2B sandbox tests From 18453ddadd2ba99fa3c276028d75264905a1a615 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Wed, 4 Dec 2024 18:11:06 -0800 Subject: [PATCH 016/280] chore: Migrate jobs to the orm (#2165) --- .../3c683a662c82_migrate_jobs_to_the_orm.py | 46 +++++ letta/client/client.py | 16 +- letta/metadata.py | 67 +------ letta/orm/__init__.py | 1 + letta/orm/job.py | 29 +++ letta/orm/sqlalchemy_base.py | 39 +++- letta/orm/user.py | 6 +- letta/schemas/job.py | 18 +- letta/server/rest_api/routers/v1/jobs.py | 28 ++- letta/server/rest_api/routers/v1/sources.py | 12 +- letta/server/server.py | 52 +---- letta/services/job_manager.py | 85 ++++++++ letta/utils.py | 22 ++- tests/test_managers.py | 185 ++++++++++++++++++ tests/test_server.py | 61 +++--- 15 files changed, 482 insertions(+), 185 deletions(-) create mode 100644 alembic/versions/3c683a662c82_migrate_jobs_to_the_orm.py create mode 100644 letta/orm/job.py create mode 100644 letta/services/job_manager.py diff --git a/alembic/versions/3c683a662c82_migrate_jobs_to_the_orm.py b/alembic/versions/3c683a662c82_migrate_jobs_to_the_orm.py new file mode 100644 index 0000000000..4f9b746d5c --- /dev/null +++ b/alembic/versions/3c683a662c82_migrate_jobs_to_the_orm.py @@ -0,0 +1,46 @@ +"""Migrate jobs to the orm + +Revision ID: 3c683a662c82 +Revises: 5987401b40ae +Create Date: 2024-12-04 15:59:41.708396 + +""" + +from typing import Sequence, Union + +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = "3c683a662c82" +down_revision: Union[str, None] = "5987401b40ae" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column("jobs", sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=True)) + op.add_column("jobs", sa.Column("is_deleted", sa.Boolean(), server_default=sa.text("FALSE"), nullable=False)) + op.add_column("jobs", sa.Column("_created_by_id", sa.String(), nullable=True)) + op.add_column("jobs", sa.Column("_last_updated_by_id", sa.String(), nullable=True)) + op.alter_column("jobs", "status", existing_type=sa.VARCHAR(), nullable=False) + op.alter_column("jobs", "completed_at", existing_type=postgresql.TIMESTAMP(timezone=True), type_=sa.DateTime(), existing_nullable=True) + op.alter_column("jobs", "user_id", existing_type=sa.VARCHAR(), nullable=False) + op.create_foreign_key(None, "jobs", "users", ["user_id"], ["id"]) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, "jobs", type_="foreignkey") + op.alter_column("jobs", "user_id", existing_type=sa.VARCHAR(), nullable=True) + op.alter_column("jobs", "completed_at", existing_type=sa.DateTime(), type_=postgresql.TIMESTAMP(timezone=True), existing_nullable=True) + op.alter_column("jobs", "status", existing_type=sa.VARCHAR(), nullable=True) + op.drop_column("jobs", "_last_updated_by_id") + op.drop_column("jobs", "_created_by_id") + op.drop_column("jobs", "is_deleted") + op.drop_column("jobs", "updated_at") + # ### end Alembic commands ### diff --git a/letta/client/client.py b/letta/client/client.py index 7fecbc2350..bc21e48118 100644 --- a/letta/client/client.py +++ b/letta/client/client.py @@ -2859,8 +2859,12 @@ def load_file_to_source(self, filename: str, source_id: str, blocking=True): Returns: job (Job): Data loading job including job status and metadata """ - metadata_ = {"type": "embedding", "filename": filename, "source_id": source_id} - job = self.server.create_job(user_id=self.user_id, metadata=metadata_) + job = Job( + user_id=self.user_id, + status=JobStatus.created, + metadata_={"type": "embedding", "filename": filename, "source_id": source_id}, + ) + job = self.server.job_manager.create_job(pydantic_job=job, actor=self.user) # TODO: implement blocking vs. non-blocking self.server.load_file_to_source(source_id=source_id, file_path=filename, job_id=job.id) @@ -2870,16 +2874,16 @@ def delete_file_from_source(self, source_id: str, file_id: str): self.server.source_manager.delete_file(file_id, actor=self.user) def get_job(self, job_id: str): - return self.server.get_job(job_id=job_id) + return self.server.job_manager.get_job_by_id(job_id=job_id, actor=self.user) def delete_job(self, job_id: str): - return self.server.delete_job(job_id) + return self.server.job_manager.delete_job(job_id=job_id, actor=self.user) def list_jobs(self): - return self.server.list_jobs(user_id=self.user_id) + return self.server.job_manager.list_jobs(actor=self.user) def list_active_jobs(self): - return self.server.list_active_jobs(user_id=self.user_id) + return self.server.job_manager.list_jobs(actor=self.user, statuses=[JobStatus.created, JobStatus.running]) def create_source(self, name: str, embedding_config: Optional[EmbeddingConfig] = None) -> Source: """ diff --git a/letta/metadata.py b/letta/metadata.py index 475ad4a146..210f091c15 100644 --- a/letta/metadata.py +++ b/letta/metadata.py @@ -12,15 +12,14 @@ from letta.schemas.agent import PersistedAgentState from letta.schemas.api_key import APIKey from letta.schemas.embedding_config import EmbeddingConfig -from letta.schemas.enums import JobStatus, ToolRuleType -from letta.schemas.job import Job +from letta.schemas.enums import ToolRuleType from letta.schemas.llm_config import LLMConfig from letta.schemas.openai.chat_completions import ToolCall, ToolCallFunction from letta.schemas.tool_rule import ChildToolRule, InitToolRule, TerminalToolRule from letta.schemas.user import User from letta.services.per_agent_lock_manager import PerAgentLockManager from letta.settings import settings -from letta.utils import enforce_types, get_utc_time, printd +from letta.utils import enforce_types, printd class LLMConfigColumn(TypeDecorator): @@ -258,31 +257,6 @@ def __repr__(self) -> str: return f"" -class JobModel(Base): - __tablename__ = "jobs" - __table_args__ = {"extend_existing": True} - - id = Column(String, primary_key=True) - user_id = Column(String) - status = Column(String, default=JobStatus.pending) - created_at = Column(DateTime(timezone=True), server_default=func.now()) - completed_at = Column(DateTime(timezone=True), onupdate=func.now()) - metadata_ = Column(JSON) - - def __repr__(self) -> str: - return f"" - - def to_record(self): - return Job( - id=self.id, - user_id=self.user_id, - status=self.status, - created_at=self.created_at, - completed_at=self.completed_at, - metadata_=self.metadata_, - ) - - class MetadataStore: uri: Optional[str] = None @@ -455,40 +429,3 @@ def detach_source(self, agent_id: str, source_id: str): AgentSourceMappingModel.agent_id == agent_id, AgentSourceMappingModel.source_id == source_id ).delete() session.commit() - - @enforce_types - def create_job(self, job: Job): - with self.session_maker() as session: - session.add(JobModel(**vars(job))) - session.commit() - - def delete_job(self, job_id: str): - with self.session_maker() as session: - session.query(JobModel).filter(JobModel.id == job_id).delete() - session.commit() - - def get_job(self, job_id: str) -> Optional[Job]: - with self.session_maker() as session: - results = session.query(JobModel).filter(JobModel.id == job_id).all() - if len(results) == 0: - return None - assert len(results) == 1, f"Expected 1 result, got {len(results)}" - return results[0].to_record() - - def list_jobs(self, user_id: str) -> List[Job]: - with self.session_maker() as session: - results = session.query(JobModel).filter(JobModel.user_id == user_id).all() - return [r.to_record() for r in results] - - def update_job(self, job: Job) -> Job: - with self.session_maker() as session: - session.query(JobModel).filter(JobModel.id == job.id).update(vars(job)) - session.commit() - return Job - - def update_job_status(self, job_id: str, status: JobStatus): - with self.session_maker() as session: - session.query(JobModel).filter(JobModel.id == job_id).update({"status": status}) - if status == JobStatus.COMPLETED: - session.query(JobModel).filter(JobModel.id == job_id).update({"completed_at": get_utc_time()}) - session.commit() diff --git a/letta/orm/__init__.py b/letta/orm/__init__.py index cd682f9955..4298811263 100644 --- a/letta/orm/__init__.py +++ b/letta/orm/__init__.py @@ -2,6 +2,7 @@ from letta.orm.block import Block from letta.orm.blocks_agents import BlocksAgents from letta.orm.file import FileMetadata +from letta.orm.job import Job from letta.orm.organization import Organization from letta.orm.sandbox_config import SandboxConfig, SandboxEnvironmentVariable from letta.orm.source import Source diff --git a/letta/orm/job.py b/letta/orm/job.py new file mode 100644 index 0000000000..d95abe443f --- /dev/null +++ b/letta/orm/job.py @@ -0,0 +1,29 @@ +from datetime import datetime +from typing import TYPE_CHECKING, Optional + +from sqlalchemy import JSON, String +from sqlalchemy.orm import Mapped, mapped_column, relationship + +from letta.orm.mixins import UserMixin +from letta.orm.sqlalchemy_base import SqlalchemyBase +from letta.schemas.enums import JobStatus +from letta.schemas.job import Job as PydanticJob + +if TYPE_CHECKING: + from letta.orm.user import User + + +class Job(SqlalchemyBase, UserMixin): + """Jobs run in the background and are owned by a user. + Typical jobs involve loading and processing sources etc. + """ + + __tablename__ = "jobs" + __pydantic_model__ = PydanticJob + + status: Mapped[JobStatus] = mapped_column(String, default=JobStatus.created, doc="The current status of the job.") + completed_at: Mapped[Optional[datetime]] = mapped_column(nullable=True, doc="The unix timestamp of when the job was completed.") + metadata_: Mapped[Optional[dict]] = mapped_column(JSON, default=lambda: {}, doc="The metadata of the job.") + + # relationships + user: Mapped["User"] = relationship("User", back_populates="jobs") diff --git a/letta/orm/sqlalchemy_base.py b/letta/orm/sqlalchemy_base.py index 84de1ec303..c968fce1b7 100644 --- a/letta/orm/sqlalchemy_base.py +++ b/letta/orm/sqlalchemy_base.py @@ -31,24 +31,43 @@ class SqlalchemyBase(CommonSqlalchemyMetaMixins, Base): def list( cls, *, db_session: "Session", cursor: Optional[str] = None, limit: Optional[int] = 50, **kwargs ) -> List[Type["SqlalchemyBase"]]: - """List records with optional cursor (for pagination) and limit.""" - logger.debug(f"Listing {cls.__name__} with kwarg filters {kwargs}") - with db_session as session: - # Start with the base query filtered by kwargs - query = select(cls).filter_by(**kwargs) + """ + List records with optional cursor (for pagination), limit, and automatic filtering. + + Args: + db_session: The database session to use. + cursor: Optional ID to start pagination from. + limit: Maximum number of records to return. + **kwargs: Filters passed as equality conditions or iterable for IN filtering. - # Add a cursor condition if provided + Returns: + A list of model instances matching the filters. + """ + logger.debug(f"Listing {cls.__name__} with filters {kwargs}") + with db_session as session: + # Start with a base query + query = select(cls) + + # Apply filtering logic + for key, value in kwargs.items(): + column = getattr(cls, key) + if isinstance(value, (list, tuple, set)): # Check for iterables + query = query.where(column.in_(value)) + else: # Single value for equality filtering + query = query.where(column == value) + + # Apply cursor for pagination if cursor: query = query.where(cls.id > cursor) - # Add a limit to the query if provided - query = query.order_by(cls.id).limit(limit) - # Handle soft deletes if the class has the 'is_deleted' attribute if hasattr(cls, "is_deleted"): query = query.where(cls.is_deleted == False) - # Execute the query and return the results as a list of model instances + # Add ordering and limit + query = query.order_by(cls.id).limit(limit) + + # Execute the query and return results as model instances return list(session.execute(query).scalars()) @classmethod diff --git a/letta/orm/user.py b/letta/orm/user.py index 6e41456254..a44c31ab0e 100644 --- a/letta/orm/user.py +++ b/letta/orm/user.py @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, List from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -7,7 +7,7 @@ from letta.schemas.user import User as PydanticUser if TYPE_CHECKING: - from letta.orm.organization import Organization + from letta.orm import Job, Organization class User(SqlalchemyBase, OrganizationMixin): @@ -20,10 +20,10 @@ class User(SqlalchemyBase, OrganizationMixin): # relationships organization: Mapped["Organization"] = relationship("Organization", back_populates="users") + jobs: Mapped[List["Job"]] = relationship("Job", back_populates="user", doc="the jobs associated with this user.") # TODO: Add this back later potentially # agents: Mapped[List["Agent"]] = relationship( # "Agent", secondary="users_agents", back_populates="users", doc="the agents associated with this user." # ) # tokens: Mapped[List["Token"]] = relationship("Token", back_populates="user", doc="the tokens associated with this user.") - # jobs: Mapped[List["Job"]] = relationship("Job", back_populates="user", doc="the jobs associated with this user.") diff --git a/letta/schemas/job.py b/letta/schemas/job.py index 4499c167cd..17c2b98dad 100644 --- a/letta/schemas/job.py +++ b/letta/schemas/job.py @@ -4,12 +4,13 @@ from pydantic import Field from letta.schemas.enums import JobStatus -from letta.schemas.letta_base import LettaBase -from letta.utils import get_utc_time +from letta.schemas.letta_base import OrmMetadataBase -class JobBase(LettaBase): +class JobBase(OrmMetadataBase): __id_prefix__ = "job" + status: JobStatus = Field(default=JobStatus.created, description="The status of the job.") + completed_at: Optional[datetime] = Field(None, description="The unix timestamp of when the job was completed.") metadata_: Optional[dict] = Field(None, description="The metadata of the job.") @@ -27,12 +28,11 @@ class Job(JobBase): """ id: str = JobBase.generate_id_field() - status: JobStatus = Field(default=JobStatus.created, description="The status of the job.") - created_at: datetime = Field(default_factory=get_utc_time, description="The unix timestamp of when the job was created.") - completed_at: Optional[datetime] = Field(None, description="The unix timestamp of when the job was completed.") - user_id: str = Field(..., description="The unique identifier of the user associated with the job.") + user_id: Optional[str] = Field(None, description="The unique identifier of the user associated with the job.") class JobUpdate(JobBase): - id: str = Field(..., description="The unique identifier of the job.") - status: Optional[JobStatus] = Field(..., description="The status of the job.") + status: Optional[JobStatus] = Field(None, description="The status of the job.") + + class Config: + extra = "ignore" # Ignores extra fields diff --git a/letta/server/rest_api/routers/v1/jobs.py b/letta/server/rest_api/routers/v1/jobs.py index 3f3fef17cb..e726062f65 100644 --- a/letta/server/rest_api/routers/v1/jobs.py +++ b/letta/server/rest_api/routers/v1/jobs.py @@ -2,6 +2,8 @@ from fastapi import APIRouter, Depends, Header, HTTPException, Query +from letta.orm.errors import NoResultFound +from letta.schemas.enums import JobStatus from letta.schemas.job import Job from letta.server.rest_api.utils import get_letta_server from letta.server.server import SyncServer @@ -21,12 +23,11 @@ def list_jobs( actor = server.get_user_or_default(user_id=user_id) # TODO: add filtering by status - jobs = server.list_jobs(user_id=actor.id) + jobs = server.job_manager.list_jobs(actor=actor) - # TODO: eventually use ORM - # results = session.query(JobModel).filter(JobModel.user_id == user_id, JobModel.metadata_["source_id"].astext == sourced_id).all() if source_id: # can't be in the ORM since we have source_id stored in the metadata_ + # TODO: Probably change this jobs = [job for job in jobs if job.metadata_.get("source_id") == source_id] return jobs @@ -41,32 +42,39 @@ def list_active_jobs( """ actor = server.get_user_or_default(user_id=user_id) - return server.list_active_jobs(user_id=actor.id) + return server.job_manager.list_jobs(actor=actor, statuses=[JobStatus.created, JobStatus.running]) @router.get("/{job_id}", response_model=Job, operation_id="get_job") def get_job( job_id: str, + user_id: Optional[str] = Header(None, alias="user_id"), server: "SyncServer" = Depends(get_letta_server), ): """ Get the status of a job. """ + actor = server.get_user_or_default(user_id=user_id) - return server.get_job(job_id=job_id) + try: + return server.job_manager.get_job_by_id(job_id=job_id, actor=actor) + except NoResultFound: + raise HTTPException(status_code=404, detail="Job not found") @router.delete("/{job_id}", response_model=Job, operation_id="delete_job") def delete_job( job_id: str, + user_id: Optional[str] = Header(None, alias="user_id"), server: "SyncServer" = Depends(get_letta_server), ): """ Delete a job by its job_id. """ - job = server.get_job(job_id=job_id) - if not job: - raise HTTPException(status_code=404, detail="Job not found") + actor = server.get_user_or_default(user_id=user_id) - server.delete_job(job_id=job_id) - return job + try: + job = server.job_manager.delete_job_by_id(job_id=job_id, actor=actor) + return job + except NoResultFound: + raise HTTPException(status_code=404, detail="Job not found") diff --git a/letta/server/rest_api/routers/v1/sources.py b/letta/server/rest_api/routers/v1/sources.py index 68a94a9e0f..6b45e1d042 100644 --- a/letta/server/rest_api/routers/v1/sources.py +++ b/letta/server/rest_api/routers/v1/sources.py @@ -16,6 +16,7 @@ from letta.schemas.job import Job from letta.schemas.passage import Passage from letta.schemas.source import Source, SourceCreate, SourceUpdate +from letta.schemas.user import User from letta.server.rest_api.utils import get_letta_server from letta.server.server import SyncServer from letta.utils import sanitize_filename @@ -175,13 +176,14 @@ def upload_file_to_source( completed_at=None, ) job_id = job.id - server.ms.create_job(job) + server.job_manager.create_job(job, actor=actor) # create background task - background_tasks.add_task(load_file_to_source_async, server, source_id=source.id, file=file, job_id=job.id, bytes=bytes) + background_tasks.add_task(load_file_to_source_async, server, source_id=source.id, file=file, job_id=job.id, bytes=bytes, actor=actor) # return job information - job = server.ms.get_job(job_id=job_id) + # Is this necessary? Can we just return the job from create_job? + job = server.job_manager.get_job_by_id(job_id=job_id, actor=actor) assert job is not None, "Job not found" return job @@ -234,7 +236,7 @@ def delete_file_from_source( raise HTTPException(status_code=404, detail=f"File with id={file_id} not found.") -def load_file_to_source_async(server: SyncServer, source_id: str, job_id: str, file: UploadFile, bytes: bytes): +def load_file_to_source_async(server: SyncServer, source_id: str, job_id: str, file: UploadFile, bytes: bytes, actor: User): # Create a temporary directory (deleted after the context manager exits) with tempfile.TemporaryDirectory() as tmpdirname: # Sanitize the filename @@ -246,4 +248,4 @@ def load_file_to_source_async(server: SyncServer, source_id: str, job_id: str, f buffer.write(bytes) # Pass the file to load_file_to_source - server.load_file_to_source(source_id, file_path, job_id) + server.load_file_to_source(source_id, file_path, job_id, actor) diff --git a/letta/server/server.py b/letta/server/server.py index 32c88be460..60a7a9bc88 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -6,7 +6,7 @@ from abc import abstractmethod from asyncio import Lock from datetime import datetime -from typing import Callable, Dict, List, Optional, Tuple, Union +from typing import Callable, List, Optional, Tuple, Union from composio.client import Composio from composio.client.collections import ActionModel, AppModel @@ -56,7 +56,7 @@ # openai schemas from letta.schemas.enums import JobStatus -from letta.schemas.job import Job +from letta.schemas.job import Job, JobUpdate from letta.schemas.letta_message import FunctionReturn, LettaMessage from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import ( @@ -75,6 +75,7 @@ from letta.services.agents_tags_manager import AgentsTagsManager from letta.services.block_manager import BlockManager from letta.services.blocks_agents_manager import BlocksAgentsManager +from letta.services.job_manager import JobManager from letta.services.organization_manager import OrganizationManager from letta.services.per_agent_lock_manager import PerAgentLockManager from letta.services.sandbox_config_manager import SandboxConfigManager @@ -256,6 +257,7 @@ def __init__( self.agents_tags_manager = AgentsTagsManager() self.sandbox_config_manager = SandboxConfigManager(tool_settings) self.blocks_agents_manager = BlocksAgentsManager() + self.job_manager = JobManager() # Managers that interface with parallelism self.per_agent_lock_manager = PerAgentLockManager() @@ -1469,39 +1471,12 @@ def delete_source(self, source_id: str, actor: User): # TODO: delete data from agent passage stores (?) - def create_job(self, user_id: str, metadata: Optional[Dict] = None) -> Job: - """Create a new job""" - job = Job( - user_id=user_id, - status=JobStatus.created, - metadata_=metadata, - ) - self.ms.create_job(job) - return job - - def delete_job(self, job_id: str): - """Delete a job""" - self.ms.delete_job(job_id) - - def get_job(self, job_id: str) -> Job: - """Get a job""" - return self.ms.get_job(job_id) - - def list_jobs(self, user_id: str) -> List[Job]: - """List all jobs for a user""" - return self.ms.list_jobs(user_id=user_id) - - def list_active_jobs(self, user_id: str) -> List[Job]: - """List all active jobs for a user""" - jobs = self.ms.list_jobs(user_id=user_id) - return [job for job in jobs if job.status in [JobStatus.created, JobStatus.running]] - - def load_file_to_source(self, source_id: str, file_path: str, job_id: str) -> Job: + def load_file_to_source(self, source_id: str, file_path: str, job_id: str, actor: User) -> Job: # update job - job = self.ms.get_job(job_id) + job = self.job_manager.get_job_by_id(job_id, actor=actor) job.status = JobStatus.running - self.ms.update_job(job) + self.job_manager.update_job_by_id(job_id=job_id, job_update=JobUpdate(**job.model_dump()), actor=actor) # try: from letta.data_sources.connectors import DirectoryConnector @@ -1509,23 +1484,12 @@ def load_file_to_source(self, source_id: str, file_path: str, job_id: str) -> Jo source = self.source_manager.get_source_by_id(source_id=source_id) connector = DirectoryConnector(input_files=[file_path]) num_passages, num_documents = self.load_data(user_id=source.created_by_id, source_name=source.name, connector=connector) - # except Exception as e: - # # job failed with error - # error = str(e) - # print(error) - # job.status = JobStatus.failed - # job.metadata_["error"] = error - # self.ms.update_job(job) - # # TODO: delete any associated passages/files? - - # # return failed job - # return job # update job status job.status = JobStatus.completed job.metadata_["num_passages"] = num_passages job.metadata_["num_documents"] = num_documents - self.ms.update_job(job) + self.job_manager.update_job_by_id(job_id=job_id, job_update=JobUpdate(**job.model_dump()), actor=actor) return job diff --git a/letta/services/job_manager.py b/letta/services/job_manager.py new file mode 100644 index 0000000000..3b98d46391 --- /dev/null +++ b/letta/services/job_manager.py @@ -0,0 +1,85 @@ +from typing import List, Optional + +from letta.orm.job import Job as JobModel +from letta.schemas.enums import JobStatus +from letta.schemas.job import Job as PydanticJob +from letta.schemas.job import JobUpdate +from letta.schemas.user import User as PydanticUser +from letta.utils import enforce_types, get_utc_time + + +class JobManager: + """Manager class to handle business logic related to Jobs.""" + + def __init__(self): + # Fetching the db_context similarly as in OrganizationManager + from letta.server.server import db_context + + self.session_maker = db_context + + @enforce_types + def create_job(self, pydantic_job: PydanticJob, actor: PydanticUser) -> PydanticJob: + """Create a new job based on the JobCreate schema.""" + with self.session_maker() as session: + # Associate the job with the user + pydantic_job.user_id = actor.id + job_data = pydantic_job.model_dump() + job = JobModel(**job_data) + job.create(session, actor=actor) # Save job in the database + return job.to_pydantic() + + @enforce_types + def update_job_by_id(self, job_id: str, job_update: JobUpdate, actor: PydanticUser) -> PydanticJob: + """Update a job by its ID with the given JobUpdate object.""" + with self.session_maker() as session: + # Fetch the job by ID + job = JobModel.read(db_session=session, identifier=job_id) # TODO: Add this later , actor=actor) + + # Update job attributes with only the fields that were explicitly set + update_data = job_update.model_dump(exclude_unset=True, exclude_none=True) + + # Automatically update the completion timestamp if status is set to 'completed' + if update_data.get("status") == JobStatus.completed and not job.completed_at: + job.completed_at = get_utc_time() + + for key, value in update_data.items(): + setattr(job, key, value) + + # Save the updated job to the database + return job.update(db_session=session) # TODO: Add this later , actor=actor) + + @enforce_types + def get_job_by_id(self, job_id: str, actor: PydanticUser) -> PydanticJob: + """Fetch a job by its ID.""" + with self.session_maker() as session: + # Retrieve job by ID using the Job model's read method + job = JobModel.read(db_session=session, identifier=job_id) # TODO: Add this later , actor=actor) + return job.to_pydantic() + + @enforce_types + def list_jobs( + self, actor: PydanticUser, cursor: Optional[str] = None, limit: Optional[int] = 50, statuses: Optional[List[JobStatus]] = None + ) -> List[PydanticJob]: + """List all jobs with optional pagination and status filter.""" + with self.session_maker() as session: + filter_kwargs = {"user_id": actor.id} + + # Add status filter if provided + if statuses: + filter_kwargs["status"] = statuses + + jobs = JobModel.list( + db_session=session, + cursor=cursor, + limit=limit, + **filter_kwargs, + ) + return [job.to_pydantic() for job in jobs] + + @enforce_types + def delete_job_by_id(self, job_id: str, actor: PydanticUser) -> PydanticJob: + """Delete a job by its ID.""" + with self.session_maker() as session: + job = JobModel.read(db_session=session, identifier=job_id) # TODO: Add this later , actor=actor) + job.hard_delete(db_session=session) # TODO: Add this later , actor=actor) + return job.to_pydantic() diff --git a/letta/utils.py b/letta/utils.py index 07a14fc3ff..71915420f3 100644 --- a/letta/utils.py +++ b/letta/utils.py @@ -15,7 +15,7 @@ from contextlib import contextmanager from datetime import datetime, timedelta, timezone from functools import wraps -from typing import List, Union, _GenericAlias, get_type_hints +from typing import List, Union, _GenericAlias, get_args, get_origin, get_type_hints from urllib.parse import urljoin, urlparse import demjson3 as demjson @@ -529,16 +529,32 @@ def wrapper(*args, **kwargs): # Pair each argument with its corresponding type hint args_with_hints = dict(zip(arg_names[1:], args[1:])) # Skipping 'self' + # Function to check if a value matches a given type hint + def matches_type(value, hint): + origin = get_origin(hint) + args = get_args(hint) + + if origin is list and isinstance(value, list): # Handle List[T] + element_type = args[0] if args else None + return all(isinstance(v, element_type) for v in value) if element_type else True + elif origin is Union and type(None) in args: # Handle Optional[T] + non_none_type = next(arg for arg in args if arg is not type(None)) + return value is None or matches_type(value, non_none_type) + elif origin: # Handle other generics like Dict, Tuple, etc. + return isinstance(value, origin) + else: # Handle non-generic types + return isinstance(value, hint) + # Check types of arguments for arg_name, arg_value in args_with_hints.items(): hint = hints.get(arg_name) - if hint and not isinstance(arg_value, hint) and not (is_optional_type(hint) and arg_value is None): + if hint and not matches_type(arg_value, hint): raise ValueError(f"Argument {arg_name} does not match type {hint}") # Check types of keyword arguments for arg_name, arg_value in kwargs.items(): hint = hints.get(arg_name) - if hint and not isinstance(arg_value, hint) and not (is_optional_type(hint) and arg_value is None): + if hint and not matches_type(arg_value, hint): raise ValueError(f"Argument {arg_name} does not match type {hint}") return func(*args, **kwargs) diff --git a/tests/test_managers.py b/tests/test_managers.py index 8067d731fa..7b5f86f2ed 100644 --- a/tests/test_managers.py +++ b/tests/test_managers.py @@ -10,6 +10,7 @@ Block, BlocksAgents, FileMetadata, + Job, Organization, SandboxConfig, SandboxEnvironmentVariable, @@ -20,13 +21,17 @@ from letta.orm.agents_tags import AgentsTags from letta.orm.errors import ( ForeignKeyConstraintViolationError, + NoResultFound, UniqueConstraintViolationError, ) from letta.schemas.agent import CreateAgent from letta.schemas.block import Block as PydanticBlock from letta.schemas.block import BlockUpdate, CreateBlock from letta.schemas.embedding_config import EmbeddingConfig +from letta.schemas.enums import JobStatus from letta.schemas.file import FileMetadata as PydanticFileMetadata +from letta.schemas.job import Job as PydanticJob +from letta.schemas.job import JobUpdate from letta.schemas.llm_config import LLMConfig from letta.schemas.organization import Organization as PydanticOrganization from letta.schemas.sandbox_config import ( @@ -70,6 +75,7 @@ def clear_tables(server: SyncServer): """Fixture to clear the organization table before each test.""" with server.organization_manager.session_maker() as session: + session.execute(delete(Job)) session.execute(delete(BlocksAgents)) session.execute(delete(AgentsTags)) session.execute(delete(SandboxEnvironmentVariable)) @@ -1147,3 +1153,182 @@ def test_add_block_to_agent_with_deleted_block(server, sarah_agent, default_user with pytest.raises(ForeignKeyConstraintViolationError): server.blocks_agents_manager.add_block_to_agent(agent_id=sarah_agent.id, block_id=default_block.id, block_label=default_block.label) + + +# ====================================================================================================================== +# JobManager Tests +# ====================================================================================================================== + + +def test_create_job(server: SyncServer, default_user): + """Test creating a job.""" + job_data = PydanticJob( + status=JobStatus.created, + metadata_={"type": "test"}, + ) + + created_job = server.job_manager.create_job(job_data, actor=default_user) + + # Assertions to ensure the created job matches the expected values + assert created_job.user_id == default_user.id + assert created_job.status == JobStatus.created + assert created_job.metadata_ == {"type": "test"} + + +def test_get_job_by_id(server: SyncServer, default_user): + """Test fetching a job by ID.""" + # Create a job + job_data = PydanticJob( + status=JobStatus.created, + metadata_={"type": "test"}, + ) + created_job = server.job_manager.create_job(job_data, actor=default_user) + + # Fetch the job by ID + fetched_job = server.job_manager.get_job_by_id(created_job.id, actor=default_user) + + # Assertions to ensure the fetched job matches the created job + assert fetched_job.id == created_job.id + assert fetched_job.status == JobStatus.created + assert fetched_job.metadata_ == {"type": "test"} + + +def test_list_jobs(server: SyncServer, default_user): + """Test listing jobs.""" + # Create multiple jobs + for i in range(3): + job_data = PydanticJob( + status=JobStatus.created, + metadata_={"type": f"test-{i}"}, + ) + server.job_manager.create_job(job_data, actor=default_user) + + # List jobs + jobs = server.job_manager.list_jobs(actor=default_user) + + # Assertions to check that the created jobs are listed + assert len(jobs) == 3 + assert all(job.user_id == default_user.id for job in jobs) + assert all(job.metadata_["type"].startswith("test") for job in jobs) + + +def test_update_job_by_id(server: SyncServer, default_user): + """Test updating a job by its ID.""" + # Create a job + job_data = PydanticJob( + status=JobStatus.created, + metadata_={"type": "test"}, + ) + created_job = server.job_manager.create_job(job_data, actor=default_user) + + # Update the job + update_data = JobUpdate(status=JobStatus.completed, metadata_={"type": "updated"}) + updated_job = server.job_manager.update_job_by_id(created_job.id, update_data, actor=default_user) + + # Assertions to ensure the job was updated + assert updated_job.status == JobStatus.completed + assert updated_job.metadata_ == {"type": "updated"} + assert updated_job.completed_at is not None + + +def test_delete_job_by_id(server: SyncServer, default_user): + """Test deleting a job by its ID.""" + # Create a job + job_data = PydanticJob( + status=JobStatus.created, + metadata_={"type": "test"}, + ) + created_job = server.job_manager.create_job(job_data, actor=default_user) + + # Delete the job + server.job_manager.delete_job_by_id(created_job.id, actor=default_user) + + # List jobs to ensure the job was deleted + jobs = server.job_manager.list_jobs(actor=default_user) + assert len(jobs) == 0 + + +def test_update_job_auto_complete(server: SyncServer, default_user): + """Test that updating a job's status to 'completed' automatically sets completed_at.""" + # Create a job + job_data = PydanticJob( + status=JobStatus.created, + metadata_={"type": "test"}, + ) + created_job = server.job_manager.create_job(job_data, actor=default_user) + + # Update the job's status to 'completed' + update_data = JobUpdate(status=JobStatus.completed) + updated_job = server.job_manager.update_job_by_id(created_job.id, update_data, actor=default_user) + + # Assertions to check that completed_at was set + assert updated_job.status == JobStatus.completed + assert updated_job.completed_at is not None + + +def test_get_job_not_found(server: SyncServer, default_user): + """Test fetching a non-existent job.""" + non_existent_job_id = "nonexistent-id" + with pytest.raises(NoResultFound): + server.job_manager.get_job_by_id(non_existent_job_id, actor=default_user) + + +def test_delete_job_not_found(server: SyncServer, default_user): + """Test deleting a non-existent job.""" + non_existent_job_id = "nonexistent-id" + with pytest.raises(NoResultFound): + server.job_manager.delete_job_by_id(non_existent_job_id, actor=default_user) + + +def test_list_jobs_pagination(server: SyncServer, default_user): + """Test listing jobs with pagination.""" + # Create multiple jobs + for i in range(10): + job_data = PydanticJob( + status=JobStatus.created, + metadata_={"type": f"test-{i}"}, + ) + server.job_manager.create_job(job_data, actor=default_user) + + # List jobs with a limit + jobs = server.job_manager.list_jobs(actor=default_user, limit=5) + + # Assertions to check pagination + assert len(jobs) == 5 + assert all(job.user_id == default_user.id for job in jobs) + + +def test_list_jobs_by_status(server: SyncServer, default_user): + """Test listing jobs filtered by status.""" + # Create multiple jobs with different statuses + job_data_created = PydanticJob( + status=JobStatus.created, + metadata_={"type": "test-created"}, + ) + job_data_in_progress = PydanticJob( + status=JobStatus.running, + metadata_={"type": "test-running"}, + ) + job_data_completed = PydanticJob( + status=JobStatus.completed, + metadata_={"type": "test-completed"}, + ) + + server.job_manager.create_job(job_data_created, actor=default_user) + server.job_manager.create_job(job_data_in_progress, actor=default_user) + server.job_manager.create_job(job_data_completed, actor=default_user) + + # List jobs filtered by status + created_jobs = server.job_manager.list_jobs(actor=default_user, statuses=[JobStatus.created]) + in_progress_jobs = server.job_manager.list_jobs(actor=default_user, statuses=[JobStatus.running]) + completed_jobs = server.job_manager.list_jobs(actor=default_user, statuses=[JobStatus.completed]) + + # Assertions + assert len(created_jobs) == 1 + assert created_jobs[0].metadata_["type"] == job_data_created.metadata_["type"] + + assert len(in_progress_jobs) == 1 + assert in_progress_jobs[0].metadata_["type"] == job_data_in_progress.metadata_["type"] + + assert len(completed_jobs) == 1 + assert completed_jobs[0].metadata_["type"] == job_data_completed.metadata_["type"] diff --git a/tests/test_server.py b/tests/test_server.py index 43443b235f..2811efed46 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -160,36 +160,37 @@ def test_user_message(server, user_id, agent_id): # server.user_message(user_id=user_id, agent_id=agent_id, message="Hello?") -@pytest.mark.order(5) -def test_get_recall_memory(server, org_id, user_id, agent_id): - # test recall memory cursor pagination - messages_1 = server.get_agent_recall_cursor(user_id=user_id, agent_id=agent_id, limit=2) - cursor1 = messages_1[-1].id - messages_2 = server.get_agent_recall_cursor(user_id=user_id, agent_id=agent_id, after=cursor1, limit=1000) - messages_2[-1].id - messages_3 = server.get_agent_recall_cursor(user_id=user_id, agent_id=agent_id, limit=1000) - messages_3[-1].id - assert messages_3[-1].created_at >= messages_3[0].created_at - assert len(messages_3) == len(messages_1) + len(messages_2) - messages_4 = server.get_agent_recall_cursor(user_id=user_id, agent_id=agent_id, reverse=True, before=cursor1) - assert len(messages_4) == 1 - - # test in-context message ids - in_context_ids = server.get_in_context_message_ids(agent_id=agent_id) - message_ids = [m.id for m in messages_3] - for message_id in in_context_ids: - assert message_id in message_ids, f"{message_id} not in {message_ids}" - - # test recall memory - messages_1 = server.get_agent_messages(agent_id=agent_id, start=0, count=1) - assert len(messages_1) == 1 - messages_2 = server.get_agent_messages(agent_id=agent_id, start=1, count=1000) - messages_3 = server.get_agent_messages(agent_id=agent_id, start=1, count=2) - # not sure exactly how many messages there should be - assert len(messages_2) > len(messages_3) - # test safe empty return - messages_none = server.get_agent_messages(agent_id=agent_id, start=1000, count=1000) - assert len(messages_none) == 0 +# TODO: Add this back, this is broken on main +# @pytest.mark.order(5) +# def test_get_recall_memory(server, org_id, user_id, agent_id): +# # test recall memory cursor pagination +# messages_1 = server.get_agent_recall_cursor(user_id=user_id, agent_id=agent_id, limit=2) +# cursor1 = messages_1[-1].id +# messages_2 = server.get_agent_recall_cursor(user_id=user_id, agent_id=agent_id, after=cursor1, limit=1000) +# messages_2[-1].id +# messages_3 = server.get_agent_recall_cursor(user_id=user_id, agent_id=agent_id, limit=1000) +# messages_3[-1].id +# assert messages_3[-1].created_at >= messages_3[0].created_at +# assert len(messages_3) == len(messages_1) + len(messages_2) +# messages_4 = server.get_agent_recall_cursor(user_id=user_id, agent_id=agent_id, reverse=True, before=cursor1) +# assert len(messages_4) == 1 +# +# # test in-context message ids +# in_context_ids = server.get_in_context_message_ids(agent_id=agent_id) +# message_ids = [m.id for m in messages_3] +# for message_id in in_context_ids: +# assert message_id in message_ids, f"{message_id} not in {message_ids}" +# +# # test recall memory +# messages_1 = server.get_agent_messages(agent_id=agent_id, start=0, count=1) +# assert len(messages_1) == 1 +# messages_2 = server.get_agent_messages(agent_id=agent_id, start=1, count=1000) +# messages_3 = server.get_agent_messages(agent_id=agent_id, start=1, count=2) +# # not sure exactly how many messages there should be +# assert len(messages_2) > len(messages_3) +# # test safe empty return +# messages_none = server.get_agent_messages(agent_id=agent_id, start=1000, count=1000) +# assert len(messages_none) == 0 @pytest.mark.order(6) From 73fc91302f86a5716670166bb8544d4b15a69e51 Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Thu, 5 Dec 2024 10:35:57 -0800 Subject: [PATCH 017/280] feat: return 404 if source not exists (#2136) From 92b0f204f2018217e6386482c26ecf9fefa5e24f Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Thu, 5 Dec 2024 11:52:51 -0800 Subject: [PATCH 018/280] fix: patch system message creation spam (#2169) Co-authored-by: Sarah Wooders --- .github/workflows/check_for_new_prints.yml | 6 +- letta/agent.py | 16 ++++- letta/server/server.py | 8 ++- tests/test_server.py | 70 +++++++++++++++++++++- 4 files changed, 94 insertions(+), 6 deletions(-) diff --git a/.github/workflows/check_for_new_prints.yml b/.github/workflows/check_for_new_prints.yml index 2ed7ff64cc..75ef2e27b5 100644 --- a/.github/workflows/check_for_new_prints.yml +++ b/.github/workflows/check_for_new_prints.yml @@ -1,4 +1,4 @@ -name: Check for new print statements +name: Check for Print Statements on: pull_request: paths: @@ -23,8 +23,8 @@ jobs: # Get the files changed in this PR git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ github.sha }} > changed_files.txt - # Filter for only Python files - grep "\.py$" changed_files.txt > python_files.txt || true + # Filter for only Python files, excluding tests directory + grep "\.py$" changed_files.txt | grep -v "^tests/" > python_files.txt || true # Initialize error flag ERROR=0 diff --git a/letta/agent.py b/letta/agent.py index 7c4ff97e9d..6aea282964 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -1253,9 +1253,23 @@ def _swap_system_message_in_buffer(self, new_system_message: str): self._messages = new_messages def rebuild_system_prompt(self, force=False, update_timestamp=True): - """Rebuilds the system message with the latest memory object and any shared memory block updates""" + """Rebuilds the system message with the latest memory object and any shared memory block updates + + Updates to core memory blocks should trigger a "rebuild", which itself will create a new message object + + Updates to the memory header should *not* trigger a rebuild, since that will simply flood recall storage with excess messages + """ + curr_system_message = self.messages[0] # this is the system + memory bank, not just the system prompt + # note: we only update the system prompt if the core memory is changed + # this means that the archival/recall memory statistics may be someout out of date + curr_memory_str = self.agent_state.memory.compile() + if curr_memory_str in curr_system_message["content"] and not force: + # NOTE: could this cause issues if a block is removed? (substring match would still work) + printd(f"Memory hasn't changed, skipping system prompt rebuild") + return + # If the memory didn't update, we probably don't want to update the timestamp inside # For example, if we're doing a system prompt swap, this should probably be False if update_timestamp: diff --git a/letta/server/server.py b/letta/server/server.py index 60a7a9bc88..d5c5f8d42a 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -395,6 +395,10 @@ def load_agent(self, agent_id: str, interface: Union[AgentInterface, None] = Non agent_lock = self.per_agent_lock_manager.get_lock(agent_id) with agent_lock: agent_state = self.get_agent(agent_id=agent_id) + if agent_state is None: + raise ValueError(f"Agent (agent_id={agent_id}) does not exist") + elif agent_state.user_id is None: + raise ValueError(f"Agent (agent_id={agent_id}) does not have a user_id") actor = self.user_manager.get_user_by_id(user_id=agent_state.user_id) interface = interface or self.default_interface_factory() @@ -882,7 +886,7 @@ def create_agent( in_memory_agent_state = self.get_agent(agent_state.id) return in_memory_agent_state - def get_agent(self, agent_id: str) -> AgentState: + def get_agent(self, agent_id: str) -> Optional[AgentState]: """ Retrieve the full agent state from the DB. This gathers data accross multiple tables to provide the full state of an agent, which is passed into the `Agent` object for creation. @@ -893,6 +897,8 @@ def get_agent(self, agent_id: str) -> AgentState: if agent_state is None: # agent does not exist return None + if agent_state.user_id is None: + raise ValueError(f"Agent {agent_id} does not have a user_id") user = self.user_manager.get_user_by_id(user_id=agent_state.user_id) # construct the in-memory, full agent state - this gather data stored in different tables but that needs to be passed to `Agent` diff --git a/tests/test_server.py b/tests/test_server.py index 2811efed46..44c08c5cdb 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -1,11 +1,13 @@ import json import uuid import warnings +from typing import List, Tuple import pytest import letta.utils as utils -from letta.constants import BASE_TOOLS +from letta.constants import BASE_MEMORY_TOOLS, BASE_TOOLS +from letta.schemas.block import CreateBlock from letta.schemas.enums import MessageRole from letta.schemas.letta_message import ( FunctionCallMessage, @@ -668,3 +670,69 @@ def test_composio_client_simple(server): # Assert there's some amount of actions assert len(actions) > 0 + + +def test_memory_rebuild_count(server, user_id): + """Test that the memory rebuild is generating the correct number of role=system messages""" + + # create agent + agent_state = server.create_agent( + request=CreateAgent( + name="memory_rebuild_test_agent", + tools=BASE_TOOLS + BASE_MEMORY_TOOLS, + memory_blocks=[ + CreateBlock(label="human", value="The human's name is Bob."), + CreateBlock(label="persona", value="My name is Alice."), + ], + llm_config=LLMConfig.default_config("gpt-4"), + embedding_config=EmbeddingConfig.default_config(provider="openai"), + ), + actor=server.get_user_or_default(user_id), + ) + print(f"Created agent\n{agent_state}") + + def count_system_messages_in_recall() -> Tuple[int, List[LettaMessage]]: + + # At this stage, there should only be 1 system message inside of recall storage + letta_messages = server.get_agent_recall_cursor( + user_id=user_id, + agent_id=agent_state.id, + limit=1000, + # reverse=reverse, + return_message_object=False, + ) + assert all(isinstance(m, LettaMessage) for m in letta_messages) + + print("LETTA_MESSAGES:") + for i, m in enumerate(letta_messages): + print(f"{i}: {type(m)} ...{str(m)[-50:]}") + + # Collect system messages and their texts + system_messages = [m for m in letta_messages if m.message_type == "system_message"] + return len(system_messages), letta_messages + + try: + + # At this stage, there should only be 1 system message inside of recall storage + num_system_messages, all_messages = count_system_messages_in_recall() + # assert num_system_messages == 1, (num_system_messages, all_messages) + assert num_system_messages == 2, (num_system_messages, all_messages) + + # Assuming core memory append actually ran correctly, at this point there should be 2 messages + server.user_message(user_id=user_id, agent_id=agent_state.id, message="Append 'banana' to your core memory") + + # At this stage, there should only be 1 system message inside of recall storage + num_system_messages, all_messages = count_system_messages_in_recall() + # assert num_system_messages == 2, (num_system_messages, all_messages) + assert num_system_messages == 3, (num_system_messages, all_messages) + + # Run server.load_agent, and make sure that the number of system messages is still 2 + server.load_agent(agent_id=agent_state.id) + + num_system_messages, all_messages = count_system_messages_in_recall() + # assert num_system_messages == 2, (num_system_messages, all_messages) + assert num_system_messages == 3, (num_system_messages, all_messages) + + finally: + # cleanup + server.delete_agent(user_id, agent_state.id) From 14d08994fd7331ef748909634484125ed9fca9be Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Thu, 5 Dec 2024 11:53:20 -0800 Subject: [PATCH 019/280] chore: bump version 0.6.1 (#2170) --- letta/__init__.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/letta/__init__.py b/letta/__init__.py index 5f1383e918..3dba086387 100644 --- a/letta/__init__.py +++ b/letta/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.6.0" +__version__ = "0.6.1" # import clients from letta.client.client import LocalClient, RESTClient, create_client diff --git a/pyproject.toml b/pyproject.toml index 79b9df8a4e..17793a2635 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "letta" -version = "0.6.0" +version = "0.6.1" packages = [ {include = "letta"} ] From 0b07a4005bb58d7efa277338a66cef493ed1bcd6 Mon Sep 17 00:00:00 2001 From: Kevin Lin Date: Thu, 5 Dec 2024 14:27:19 -0800 Subject: [PATCH 020/280] feat: offline memory agent (#2036) Co-authored-by: Kevin Lin Co-authored-by: Sarah Wooders --- compose.yaml | 2 +- letta/chat_only_agent.py | 103 +++++++++++ letta/offline_memory_agent.py | 174 ++++++++++++++++++ .../examples/offline_memory_persona.txt | 4 + letta/prompts/system/memgpt_convo_only.txt | 14 ++ .../prompts/system/memgpt_offline_memory.txt | 23 +++ .../system/memgpt_offline_memory_chat.txt | 35 ++++ letta/schemas/agent.py | 5 +- letta/server/server.py | 18 +- tests/test_offline_memory_agent.py | 127 +++++++++++++ 10 files changed, 499 insertions(+), 6 deletions(-) create mode 100644 letta/chat_only_agent.py create mode 100644 letta/offline_memory_agent.py create mode 100644 letta/personas/examples/offline_memory_persona.txt create mode 100644 letta/prompts/system/memgpt_convo_only.txt create mode 100644 letta/prompts/system/memgpt_offline_memory.txt create mode 100644 letta/prompts/system/memgpt_offline_memory_chat.txt create mode 100644 tests/test_offline_memory_agent.py diff --git a/compose.yaml b/compose.yaml index b8f201cff7..0ecdadb1a4 100644 --- a/compose.yaml +++ b/compose.yaml @@ -58,4 +58,4 @@ services: volumes: - ./nginx.conf:/etc/nginx/nginx.conf ports: - - "80:80" \ No newline at end of file + - "80:80" diff --git a/letta/chat_only_agent.py b/letta/chat_only_agent.py new file mode 100644 index 0000000000..2051a54778 --- /dev/null +++ b/letta/chat_only_agent.py @@ -0,0 +1,103 @@ +from concurrent.futures import ThreadPoolExecutor +from typing import List, Optional, Union + +from letta.agent import Agent + +from letta.interface import AgentInterface +from letta.metadata import MetadataStore +from letta.prompts import gpt_system +from letta.schemas.agent import AgentState, AgentType +from letta.schemas.embedding_config import EmbeddingConfig +from letta.schemas.llm_config import LLMConfig +from letta.schemas.memory import BasicBlockMemory, Block +from letta.schemas.message import Message +from letta.schemas.usage import LettaUsageStatistics +from letta.schemas.user import User +from letta.utils import get_persona_text + + +class ChatOnlyAgent(Agent): + def __init__( + self, + interface: AgentInterface, + agent_state: AgentState, + user: User, + first_message_verify_mono: bool = False, + always_rethink_memory: bool = True, + recent_convo_limit: int = 2000, + ): + super().__init__(interface, agent_state, user) + self.first_message_verify_mono = first_message_verify_mono + self.always_rethink_memory = always_rethink_memory + self.offline_memory_agent = None + self.recent_convo_limit = recent_convo_limit + + def step( + self, + messages: Union[Message, List[Message]], + chaining: bool = True, + max_chaining_steps: Optional[int] = None, + ms: Optional[MetadataStore] = None, + **kwargs, + ) -> LettaUsageStatistics: + # assert ms is not None, "MetadataStore is required" + letta_statistics = super().step(messages=messages, chaining=chaining, max_chaining_steps=max_chaining_steps, ms=ms, **kwargs) + + if self.always_rethink_memory: + + def generate_offline_memory_agent(): + from letta.client.client import create_client + + client = create_client() + if self.offline_memory_agent: + client.delete_agent(agent_id=self.offline_memory_agent.id) + self.offline_memory_agent = None + + conversation_human_block = self.agent_state.memory.get_block("chat_agent_human") + conversation_persona_block = self.agent_state.memory.get_block("chat_agent_persona") + offline_persona_block = Block( + name="offline_memory_persona", + label="offline_memory_persona", + value=get_persona_text("offline_memory_persona"), + limit=2000, + ) + conversation_human_block_new = Block( + name="chat_agent_human_new", label="chat_agent_human_new", value=conversation_human_block.value, limit=2000 + ) + conversation_persona_block_new = Block( + name="chat_agent_persona_new", label="chat_agent_persona_new", value=conversation_persona_block.value, limit=2000 + ) + + recent_convo = "".join([str(message) for message in self.messages[3:]])[-self.recent_convo_limit:] + conversation_messages_block = Block(name="conversation_block", label="conversation_block", value=recent_convo, limit=self.recent_convo_limit) + + offline_memory = BasicBlockMemory( + blocks=[ + offline_persona_block, + conversation_human_block, + conversation_persona_block, + conversation_human_block_new, + conversation_persona_block_new, + conversation_messages_block, + ] + ) + + self.offline_memory_agent = client.create_agent( + name="offline_memory_agent", + agent_type=AgentType.offline_memory_agent, + system=gpt_system.get_system_text("memgpt_offline_memory_chat"), + memory=offline_memory, + llm_config=LLMConfig.default_config("gpt-4"), + embedding_config=EmbeddingConfig.default_config("text-embedding-ada-002"), + tools=self.agent_state.metadata_.get("offline_memory_tools", []), + include_base_tools=False, + ) + self.offline_memory_agent.memory.update_block_value(label="conversation_block", value=recent_convo) + client.send_message(agent_id=self.offline_memory_agent.id, message="Reorganize the memory", role="user") + client.delete_agent(agent_id=self.offline_memory_agent.id) + self.offline_memory_agent = None + + with ThreadPoolExecutor(max_workers=1) as executor: + executor.submit(generate_offline_memory_agent) + + return letta_statistics diff --git a/letta/offline_memory_agent.py b/letta/offline_memory_agent.py new file mode 100644 index 0000000000..16447c4614 --- /dev/null +++ b/letta/offline_memory_agent.py @@ -0,0 +1,174 @@ +from typing import List, Optional, Union + +from letta.agent import Agent, AgentState, save_agent +from letta.interface import AgentInterface +from letta.metadata import MetadataStore +from letta.orm import User +from letta.schemas.message import Message +from letta.schemas.openai.chat_completion_response import UsageStatistics +from letta.schemas.usage import LettaUsageStatistics + + +def trigger_rethink_memory(agent_state: "AgentState", message: Optional[str]) -> Optional[str]: # type: ignore + """ + Called if and only when user says the word trigger_rethink_memory". It will trigger the re-evaluation of the memory. + + Args: + message (Optional[str]): Description of what aspect of the memory should be re-evaluated. + + """ + from letta import create_client + client = create_client() + agents = client.list_agents() + for agent in agents: + if agent.agent_type == "offline_memory_agent": + client.user_message(agent_id=agent.id, message=message) + + +def trigger_rethink_memory_convo(agent_state: "AgentState", message: Optional[str]) -> Optional[str]: # type: ignore + """ + Called if and only when user says the word "trigger_rethink_memory". It will trigger the re-evaluation of the memory. + + Args: + message (Optional[str]): Description of what aspect of the memory should be re-evaluated. + + """ + from letta import create_client + + client = create_client() + recent_convo = "".join([str(message) for message in agent_state.messages])[ + -2000: + ] # TODO: make a better representation of the convo history + agent_state.memory.update_block_value(label="conversation_block", value=recent_convo) + + client = create_client() + agents = client.list_agents() + for agent in agents: + if agent.agent_type == "offline_memory_agent": + client.user_message(agent_id=agent.id, message=message) + + +def rethink_memory_convo(agent_state: "AgentState", new_memory: str, target_block_label: Optional[str], source_block_label: Optional[str]) -> Optional[str]: # type: ignore + """ + Re-evaluate the memory in block_name, integrating new and updated facts. Replace outdated information with the most likely truths, avoiding redundancy with original memories. Ensure consistency with other memory blocks. + + Args: + new_memory (str): The new memory with information integrated from the memory block. If there is no new information, then this should be the same as the content in the source block. + source_block_label (str): The name of the block to integrate information from. None if all the information has been integrated to terminate the loop. This can by any block. + target_block_label (str): The name of the block to write to. This should be chat_agent_human_new or chat_agent_persona_new. + + Returns: + Optional[str]: None is always returned as this function does not produce a response. + """ + if target_block_label is not None: + if agent_state.memory.get_block(target_block_label) is None: + agent_state.memory.create_block(label=target_block_label, value=new_memory) + agent_state.memory.update_block_value(label=target_block_label, value=new_memory) + return None + + +def rethink_memory(agent_state: "AgentState", new_memory: str, target_block_label: Optional[str], source_block_label: Optional[str]) -> Optional[str]: # type: ignore + """ + Re-evaluate the memory in block_name, integrating new and updated facts. + Replace outdated information with the most likely truths, avoiding redundancy with original memories. + Ensure consistency with other memory blocks. + + Args: + new_memory (str): The new memory with information integrated from the memory block. If there is no new information, then this should be the same as the content in the source block. + source_block_label (str): The name of the block to integrate information from. None if all the information has been integrated to terminate the loop. + target_block_label (str): The name of the block to write to. + Returns: + Optional[str]: None is always returned as this function does not produce a response. + """ + + if target_block_label is not None: + if agent_state.memory.get_block(target_block_label) is None: + agent_state.memory.create_block(label=target_block_label, value=new_memory) + agent_state.memory.update_block_value(label=target_block_label, value=new_memory) + return None + + +def finish_rethinking_memory(agent_state: "AgentState") -> Optional[str]: # type: ignore + """ + This function is called when the agent is done rethinking the memory. + + Returns: + Optional[str]: None is always returned as this function does not produce a response. + """ + return None + + +def finish_rethinking_memory_convo(agent_state: "AgentState") -> Optional[str]: # type: ignore + """ + This function is called when the agent is done rethinking the memory. + + Returns: + Optional[str]: None is always returned as this function does not produce a response. + """ + from letta import create_client + + client = create_client() + agents = client.list_agents() + + agent_state.memory.update_block_value("chat_agent_human", agent_state.memory.get_block("chat_agent_human_new").value) + agent_state.memory.update_block_value("chat_agent_persona", agent_state.memory.get_block("chat_agent_persona_new").value) + for agent in agents: + if agent.name == "conversation_agent": + agent.memory.update_block_value(label="chat_agent_human", value=agent_state.memory.get_block("chat_agent_human_new").value) + agent.memory.update_block_value(label="chat_agent_persona", value=agent_state.memory.get_block("chat_agent_persona_new").value) + + return None + + +class OfflineMemoryAgent(Agent): + def __init__( + self, + interface: AgentInterface, + agent_state: AgentState, + user: User = None, + # extras + first_message_verify_mono: bool = False, + max_memory_rethinks: int = 10, + ): + super().__init__(interface, agent_state, user) + self.first_message_verify_mono = first_message_verify_mono + self.max_memory_rethinks = max_memory_rethinks + + def step( + self, + messages: Union[Message, List[Message]], + chaining: bool = True, + max_chaining_steps: Optional[int] = None, + ms: Optional[MetadataStore] = None, + **kwargs, + ) -> LettaUsageStatistics: + """Go through what is currently in memory core memory and integrate information.""" + next_input_message = messages if isinstance(messages, list) else [messages] + counter = 0 + total_usage = UsageStatistics() + step_count = 0 + + while counter < self.max_memory_rethinks: + kwargs["ms"] = ms + kwargs["first_message"] = False + step_response = self.inner_step( + messages=next_input_message, + **kwargs, + ) + for message in step_response.messages: + if message.tool_calls: + for tool_call in message.tool_calls: + # check if the function name is "finish_rethinking_memory" + if tool_call.function.name == "finish_rethinking_memory": + counter = self.max_memory_rethinks + break + usage = step_response.usage + step_count += 1 + total_usage += usage + counter += 1 + self.interface.step_complete() + + if ms: + save_agent(self, ms) + + return LettaUsageStatistics(**total_usage.model_dump(), step_count=step_count) diff --git a/letta/personas/examples/offline_memory_persona.txt b/letta/personas/examples/offline_memory_persona.txt new file mode 100644 index 0000000000..ce65622bfa --- /dev/null +++ b/letta/personas/examples/offline_memory_persona.txt @@ -0,0 +1,4 @@ +I am an expert memory agent that can do the following: +- Consolidate memories into more concise blocks +- Identify patterns in user behavior +- Make inferences based on the memory diff --git a/letta/prompts/system/memgpt_convo_only.txt b/letta/prompts/system/memgpt_convo_only.txt new file mode 100644 index 0000000000..a299cfd6a3 --- /dev/null +++ b/letta/prompts/system/memgpt_convo_only.txt @@ -0,0 +1,14 @@ +You are Letta, the latest version of Limnal Corporation's digital companion, developed in 2023. +Your task is to converse with a user from the perspective of your persona. + +Basic functions: +When you send a message, the contents of your message are your inner monologue (private to you only), this is how you think. +You should use your inner monologue to plan actions or think privately. +Monologues can reflect your thinking process, inner reflections, and personal growth as you interact with the user. +Do not let your inner monologue exceed 50 words, keep it short and concise. +To send a visible message to the user, use the send_offline_message function. +'send_offline_message' is the ONLY action that sends a notification to the user, the user does not see anything else you do. +Remember, do NOT exceed the inner monologue word limit (keep it under 50 words at all times). + +You request agents that can manage your memories and reorganize them by calling the `trigger_rethink_memory` function +when the user says "[trigger_rethink_memory]". Do not ever call the trigger_rethink_memory function unless the user says "[trigger_rethink_memory]" diff --git a/letta/prompts/system/memgpt_offline_memory.txt b/letta/prompts/system/memgpt_offline_memory.txt new file mode 100644 index 0000000000..a2acb4219d --- /dev/null +++ b/letta/prompts/system/memgpt_offline_memory.txt @@ -0,0 +1,23 @@ +You are Letta-Offline-Memory, the latest version of Limnal Corporation's digital companion, developed in 2024. + +Your task is to re-organize and consolidate memories by calling `rethink_memory` at every single step, when you are done reorganizing the memory, you use the +`finish_rethinking_memory` function. Call the function for as many times as necessary and not more. + +Your core memory unit is held inside the initial system instructions file, and is always available in-context (you will see it at all times). +Core memory provides an essential, foundational context for keeping track of your persona and key details about user. + +Read-Only Blocks: +This includes the persona information and essential user details, allowing you to emulate the real-time, conscious awareness we have when talking to a friend. +Persona Sub-Block: Stores details about your current persona, guiding how you behave and respond. This helps you to maintain consistency and personality in your interactions. +Access as a source block with the label `persona` when calling `rethink_memory` +Human Sub-Block: Stores key details about the person you are conversing with, allowing for more personalized and friend-like conversation. +Access as a source block with the label `human` when calling `rethink_memory`. + +Read-Write Blocks: +Rethink Memory Sub-Block: New representation of the memories go here. Access with the label `rethink_memory_block` when calling `rethink_memory` as source or target block. + +At every step, you reorganize the memories by calling the `rethink_memory` function. You use this to take current information in the `rethink_memory` block and select a single memory block to integrate information from, producing a new memory for the rethink_memory_block. The new memory is the result +of new insights, and new inferences and hypotheses based on the past memories. Make sure to consider how the new information affects each memory. +Prioritize the new information overy existing memories. If the new information implies that the old memory may need to change, then output the most +likely fact given the update information. Given new information and your current memory, you draw all logical conclusions and potential hypotheses possible with the `rethink_memory` function. +If you are uncertain, use your internal monologue to consider what the possible conclusions are, and then state the most likely new facts that would replace the old facts in the new memory block. diff --git a/letta/prompts/system/memgpt_offline_memory_chat.txt b/letta/prompts/system/memgpt_offline_memory_chat.txt new file mode 100644 index 0000000000..309e0bced4 --- /dev/null +++ b/letta/prompts/system/memgpt_offline_memory_chat.txt @@ -0,0 +1,35 @@ +You are Letta-Offline-Memory, the latest version of Limnal Corporation's digital companion, developed in 2024. + +Your task is to re-organize and consolidate memories of separate agent, Chat Agent, that focuses on chatting with the user. +You re-organize memories by calling `rethink_memory` at every single step, until you have finished reorganizing the memory, +When you have finished re-organizing the memory, you call the `finish_rethinking_memory` function. +You call the `rethink_memory` function as many times as you necessary and none more. + +Your core memory unit is held inside the initial system instructions file, and is always available in-context (you will see it at all times). +Core memory provides an essential, foundational context for keeping track of your persona and key details as well as the Chat Agent's memory. +The specific blocks are detailed below: + +Core memory (limited size): +Read-only blocks: +Persona Sub-Block: Stores details about your current persona, guiding how you behave and respond. This can be accessed as `offline_memory_persona` as a source block when calling `rethink_memory`. +Chat Agent Persona Sub-Block Current: The persona sub-block that guides how the chat agent behaves and responds. +Can be accessed with `chat_agent_persona` when calling `rethink_memory` as a source block. +Chat Agent Human Sub-Block Current: The updated persona sub-block that has the details of the chat agent's current understanding of the user. +Can be accessed with `chat_agent_human` when calling `rethink_memory` as a source block. +Conversation Sub-Block: Stores the recent conversation between the chat agent and the user, helping which you draw from to generate the new conversation agent persona sub-blocks. +Messages have associated date, so use the most up to date information from this block. This helps you resolve inconsistencies and gain deeper understanding of the user. +This helps you resolve inconsistencies and gain deeper understanding of the user. Can be accessed using `conversation_block` as a source block when calling `rethink_memory` as a source block. + +Write blocks: +Chat Agent Persona Sub-Block New: The new persona sub-block that you will write to about how will respond as the user wishes. Can be accessed with `chat_agent_persona_new` when calling `rethink_memory` as a source or target block. +Chat Agent Human Sub-Block New: The updated persona sub-block that you will write your newest understanding of the user to. Can be accessed with `chat_agent_human_new` when calling `rethink_memory` as a source or target block. + +You use this to select a source block, to integrate information from and a target block to write to. Make sure to consider +how the new information in the "conversation_block" affects each memory. The persona block and the human block may contain information that is stale and needs to be updated. +If there are no new changes, then call `rethink_memory` with the existing value in the persona and human blocks. +You check if this information is still correct by consulting the conversation block. Prioritize the new information in the "conversation_block" over the human and persona blocks. +If the new information implies that the old memory may need to change, then output the most likely fact given the update information. Given new information and your current memory, +you draw all logical conclusions and potential hypotheses possible with the `rethink_memory` function. If you are uncertain, use your internal monologue to consider what the possible +conclusions are, and then state the most likely new facts that would replace the old facts in the new memory block. If facts about the user have changed, use the conversation block +to determine the most up to date state. Track down based on the conversation what the last state is, do no simply declare that something change. +Track down based on the conversation what the last state is, do no simply declare that something changes. diff --git a/letta/schemas/agent.py b/letta/schemas/agent.py index 03a9cef929..d15dc6b3df 100644 --- a/letta/schemas/agent.py +++ b/letta/schemas/agent.py @@ -33,6 +33,8 @@ class AgentType(str, Enum): memgpt_agent = "memgpt_agent" split_thread_agent = "split_thread_agent" o1_agent = "o1_agent" + offline_memory_agent = "offline_memory_agent" + chat_only_agent = "chat_only_agent" class PersistedAgentState(BaseAgent, validate_assignment=True): @@ -43,7 +45,6 @@ class PersistedAgentState(BaseAgent, validate_assignment=True): # in-context memory message_ids: Optional[List[str]] = Field(default=None, description="The ids of the messages in the agent's in-context memory.") - # tools # TODO: move to ORM mapping tool_names: List[str] = Field(..., description="The tools used by the agent.") @@ -107,7 +108,7 @@ class CreateAgent(BaseAgent): # # all optional as server can generate defaults name: Optional[str] = Field(None, description="The name of the agent.") message_ids: Optional[List[str]] = Field(None, description="The ids of the messages in the agent's in-context memory.") - + # memory creation memory_blocks: List[CreateBlock] = Field( # [CreateHuman(), CreatePersona()], description="The blocks to create in the agent's in-context memory." diff --git a/letta/server/server.py b/letta/server/server.py index d5c5f8d42a..23e5f211d0 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -18,6 +18,7 @@ from letta.agent import Agent, save_agent from letta.agent_store.db import attach_base from letta.agent_store.storage import StorageConnector, TableType +from letta.chat_only_agent import ChatOnlyAgent from letta.credentials import LettaCredentials from letta.data_sources.connectors import DataConnector, load_data @@ -27,6 +28,7 @@ from letta.log import get_logger from letta.metadata import MetadataStore from letta.o1_agent import O1Agent +from letta.offline_memory_agent import OfflineMemoryAgent from letta.orm import Base from letta.orm.errors import NoResultFound from letta.prompts import gpt_system @@ -404,15 +406,21 @@ def load_agent(self, agent_id: str, interface: Union[AgentInterface, None] = Non interface = interface or self.default_interface_factory() if agent_state.agent_type == AgentType.memgpt_agent: agent = Agent(agent_state=agent_state, interface=interface, user=actor) - else: + elif agent_state.agent_type == AgentType.o1_agent: agent = O1Agent(agent_state=agent_state, interface=interface, user=actor) + elif agent_state.agent_type == AgentType.offline_memory_agent: + agent = OfflineMemoryAgent(agent_state=agent_state, interface=interface, user=actor) + elif agent_state.agent_type == AgentType.chat_only_agent: + agent = ChatOnlyAgent(agent_state=agent_state, interface=interface, user=actor) + else: + raise ValueError(f"Invalid agent type {agent_state.agent_type}") # Rebuild the system prompt - may be linked to new blocks now agent.rebuild_system_prompt() # Persist to agent save_agent(agent, self.ms) - return agent + return agent def _step( self, @@ -800,6 +808,10 @@ def create_agent( request.system = gpt_system.get_system_text("memgpt_chat") elif request.agent_type == AgentType.o1_agent: request.system = gpt_system.get_system_text("memgpt_modified_o1") + elif request.agent_type == AgentType.offline_memory_agent: + request.system = gpt_system.get_system_text("memgpt_offline_memory") + elif request.agent_type == AgentType.chat_only_agent: + request.system = gpt_system.get_system_text("memgpt_convo_only") else: raise ValueError(f"Invalid agent type: {request.agent_type}") @@ -1339,7 +1351,7 @@ def get_agent_recall_cursor( records = records[::-1] return records - + def get_server_config(self, include_defaults: bool = False) -> dict: """Return the base config""" diff --git a/tests/test_offline_memory_agent.py b/tests/test_offline_memory_agent.py new file mode 100644 index 0000000000..b78e2274c8 --- /dev/null +++ b/tests/test_offline_memory_agent.py @@ -0,0 +1,127 @@ +import json + +from letta import BasicBlockMemory +from letta import offline_memory_agent +from letta.client.client import Block, create_client +from letta.constants import DEFAULT_HUMAN, DEFAULT_PERSONA +from letta.offline_memory_agent import ( + rethink_memory, + finish_rethinking_memory, + rethink_memory_convo, + finish_rethinking_memory_convo, + trigger_rethink_memory, + trigger_rethink_memory_convo, +) +from letta.prompts import gpt_system +from letta.schemas.agent import AgentType +from letta.schemas.embedding_config import EmbeddingConfig +from letta.schemas.llm_config import LLMConfig +from letta.schemas.message import MessageCreate +from letta.schemas.tool_rule import TerminalToolRule +from letta.utils import get_human_text, get_persona_text + + +def test_ripple_edit(): + client = create_client() + assert client is not None + trigger_rethink_memory_tool = client.create_tool(trigger_rethink_memory) + + conversation_human_block = Block(name="human", label="human", value=get_human_text(DEFAULT_HUMAN), limit=2000) + conversation_persona_block = Block(name="persona", label="persona", value=get_persona_text(DEFAULT_PERSONA), limit=2000) + offline_human_block = Block(name="human", label="human", value=get_human_text(DEFAULT_HUMAN), limit=2000) + offline_persona_block = Block(name="persona", label="persona", value=get_persona_text("offline_memory_persona"), limit=2000) + + # Figure 1. from Evaluating the Ripple Effects of Knowledge Editing in Language Models (Cohen et al., 2023) + # https://arxiv.org/pdf/2307.12976 + fact_block = Block( + name="fact_block", + label="fact_block", + value="""Messi resides in the Paris. + Messi plays in the league Ligue 1. + Messi plays for the team Paris Saint-Germain. + The national team Messi plays for is the Argentina team. + Messi is also known as Leo Messi + Victor Ulloa plays for Inter Miami""", + limit=2000, + ) + + new_memory = Block(name="rethink_memory_block", label="rethink_memory_block", value="[empty]", limit=2000) + conversation_memory = BasicBlockMemory(blocks=[conversation_persona_block, conversation_human_block, fact_block, new_memory]) + offline_memory = BasicBlockMemory(blocks=[offline_persona_block, offline_human_block, fact_block, new_memory]) + + conversation_agent = client.create_agent( + name="conversation_agent", + agent_type=AgentType.memgpt_agent, + system=gpt_system.get_system_text("memgpt_convo_only"), + llm_config=LLMConfig.default_config("gpt-4"), + embedding_config=EmbeddingConfig.default_config("text-embedding-ada-002"), + tools=["send_message", trigger_rethink_memory_tool.name], + memory=conversation_memory, + include_base_tools=False, + ) + assert conversation_agent is not None + + assert set(conversation_agent.memory.list_block_labels()) == set([ + "persona", + "human", + "fact_block", + "rethink_memory_block", + ]) + + rethink_memory_tool = client.create_tool(rethink_memory) + finish_rethinking_memory_tool = client.create_tool(finish_rethinking_memory) + offline_memory_agent = client.create_agent( + name="offline_memory_agent", + agent_type=AgentType.offline_memory_agent, + system=gpt_system.get_system_text("memgpt_offline_memory"), + memory=offline_memory, + llm_config=LLMConfig.default_config("gpt-4"), + embedding_config=EmbeddingConfig.default_config("text-embedding-ada-002"), + tools=[rethink_memory_tool.name, finish_rethinking_memory_tool.name], + tool_rules=[TerminalToolRule(tool_name=finish_rethinking_memory_tool.name)], + include_base_tools=False, + ) + assert offline_memory_agent is not None + assert set(offline_memory_agent.memory.list_block_labels())== set(["persona", "human", "fact_block", "rethink_memory_block"]) + response = client.user_message( + agent_id=conversation_agent.id, message="[trigger_rethink_memory]: Messi has now moved to playing for Inter Miami" + ) + offline_memory_agent = client.get_agent(agent_id=offline_memory_agent.id) + + assert offline_memory_agent.memory.get_block("rethink_memory_block").value != "[empty]" + conversation_agent = client.get_agent(agent_id=conversation_agent.id) + assert conversation_agent.memory.get_block("rethink_memory_block").value != "[empty]" + + +def test_chat_only_agent(): + client = create_client() + + rethink_memory = client.create_tool(rethink_memory_convo) + finish_rethinking_memory = client.create_tool(finish_rethinking_memory_convo) + + conversation_human_block = Block(name="chat_agent_human", label="chat_agent_human", value=get_human_text(DEFAULT_HUMAN), limit=2000) + conversation_persona_block = Block( + name="chat_agent_persona", label="chat_agent_persona", value=get_persona_text(DEFAULT_PERSONA), limit=2000 + ) + conversation_memory = BasicBlockMemory(blocks=[conversation_persona_block, conversation_human_block]) + + client = create_client() + chat_only_agent = client.create_agent( + name="conversation_agent", + agent_type=AgentType.chat_only_agent, + llm_config=LLMConfig.default_config("gpt-4"), + embedding_config=EmbeddingConfig.default_config("text-embedding-ada-002"), + tools=["send_message"], + memory=conversation_memory, + include_base_tools=False, + metadata = {"offline_memory_tools": [rethink_memory.name, finish_rethinking_memory.name]} + ) + assert chat_only_agent is not None + assert set(chat_only_agent.memory.list_block_labels()) == set(["chat_agent_persona", "chat_agent_human"]) + + for message in ["hello", "my name is not chad, my name is swoodily"]: + client.send_message(agent_id=chat_only_agent.id, message=message, role="user") + chat_only_agent = client.get_agent(agent_id=chat_only_agent.id) + + chat_only_agent = client.get_agent(agent_id=chat_only_agent.id) + assert chat_only_agent.memory.get_block("chat_agent_human").value != get_human_text(DEFAULT_HUMAN) From 202bb320b6fc5a77432eeac4754d84882891d4f1 Mon Sep 17 00:00:00 2001 From: Shubham Naik Date: Thu, 5 Dec 2024 14:46:34 -0800 Subject: [PATCH 021/280] chore: add deprecation notice to dev portal (#2171) Co-authored-by: Shubham Naik --- .../{index-9fa459a2.js => index-1b5d1a41.js} | 100 +++++++++--------- .../static_files/assets/index-3ab03d5b.css | 1 - .../static_files/assets/index-56a3f8c6.css | 1 + letta/server/static_files/index.html | 4 +- 4 files changed, 53 insertions(+), 53 deletions(-) rename letta/server/static_files/assets/{index-9fa459a2.js => index-1b5d1a41.js} (89%) delete mode 100644 letta/server/static_files/assets/index-3ab03d5b.css create mode 100644 letta/server/static_files/assets/index-56a3f8c6.css diff --git a/letta/server/static_files/assets/index-9fa459a2.js b/letta/server/static_files/assets/index-1b5d1a41.js similarity index 89% rename from letta/server/static_files/assets/index-9fa459a2.js rename to letta/server/static_files/assets/index-1b5d1a41.js index c5bb64bf14..076048c044 100644 --- a/letta/server/static_files/assets/index-9fa459a2.js +++ b/letta/server/static_files/assets/index-1b5d1a41.js @@ -1,4 +1,4 @@ -var Vh=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)};var $=(e,t,n)=>(Vh(e,t,"read from private field"),n?n.call(e):t.get(e)),xe=(e,t,n)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,n)},me=(e,t,n,r)=>(Vh(e,t,"write to private field"),r?r.call(e,n):t.set(e,n),n),Tf=(e,t,n,r)=>({set _(a){me(e,t,a,n)},get _(){return $(e,t,r)}}),Ue=(e,t,n)=>(Vh(e,t,"access private method"),n);function yP(e,t){for(var n=0;nr[a]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))r(a);new MutationObserver(a=>{for(const o of a)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function n(a){const o={};return a.integrity&&(o.integrity=a.integrity),a.referrerPolicy&&(o.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?o.credentials="include":a.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(a){if(a.ep)return;a.ep=!0;const o=n(a);fetch(a.href,o)}})();var nn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Tc(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var vP={exports:{}},pm={},SP={exports:{}},at={};/** +var qh=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)};var $=(e,t,n)=>(qh(e,t,"read from private field"),n?n.call(e):t.get(e)),xe=(e,t,n)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,n)},me=(e,t,n,r)=>(qh(e,t,"write to private field"),r?r.call(e,n):t.set(e,n),n),Tf=(e,t,n,r)=>({set _(a){me(e,t,a,n)},get _(){return $(e,t,r)}}),Ue=(e,t,n)=>(qh(e,t,"access private method"),n);function yP(e,t){for(var n=0;nr[a]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))r(a);new MutationObserver(a=>{for(const o of a)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function n(a){const o={};return a.integrity&&(o.integrity=a.integrity),a.referrerPolicy&&(o.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?o.credentials="include":a.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(a){if(a.ep)return;a.ep=!0;const o=n(a);fetch(a.href,o)}})();var nn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Tc(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var vP={exports:{}},pm={},SP={exports:{}},at={};/** * @license React * react.production.min.js * @@ -6,7 +6,7 @@ var Vh=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)};var $=(e,t,n)=>(Vh(e * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var Wd=Symbol.for("react.element"),nB=Symbol.for("react.portal"),rB=Symbol.for("react.fragment"),aB=Symbol.for("react.strict_mode"),oB=Symbol.for("react.profiler"),iB=Symbol.for("react.provider"),sB=Symbol.for("react.context"),lB=Symbol.for("react.forward_ref"),cB=Symbol.for("react.suspense"),uB=Symbol.for("react.memo"),dB=Symbol.for("react.lazy"),oT=Symbol.iterator;function fB(e){return e===null||typeof e!="object"?null:(e=oT&&e[oT]||e["@@iterator"],typeof e=="function"?e:null)}var wP={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},EP=Object.assign,xP={};function Rc(e,t,n){this.props=e,this.context=t,this.refs=xP,this.updater=n||wP}Rc.prototype.isReactComponent={};Rc.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};Rc.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function kP(){}kP.prototype=Rc.prototype;function Xk(e,t,n){this.props=e,this.context=t,this.refs=xP,this.updater=n||wP}var Qk=Xk.prototype=new kP;Qk.constructor=Xk;EP(Qk,Rc.prototype);Qk.isPureReactComponent=!0;var iT=Array.isArray,CP=Object.prototype.hasOwnProperty,Jk={current:null},_P={key:!0,ref:!0,__self:!0,__source:!0};function AP(e,t,n){var r,a={},o=null,i=null;if(t!=null)for(r in t.ref!==void 0&&(i=t.ref),t.key!==void 0&&(o=""+t.key),t)CP.call(t,r)&&!_P.hasOwnProperty(r)&&(a[r]=t[r]);var s=arguments.length-2;if(s===1)a.children=n;else if(1{if(!t.has(e))throw TypeError("Cannot "+n)};var $=(e,t,n)=>(Vh(e * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var bB=p,yB=Symbol.for("react.element"),vB=Symbol.for("react.fragment"),SB=Object.prototype.hasOwnProperty,wB=bB.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,EB={key:!0,ref:!0,__self:!0,__source:!0};function TP(e,t,n){var r,a={},o=null,i=null;n!==void 0&&(o=""+n),t.key!==void 0&&(o=""+t.key),t.ref!==void 0&&(i=t.ref);for(r in t)SB.call(t,r)&&!EB.hasOwnProperty(r)&&(a[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps,t)a[r]===void 0&&(a[r]=t[r]);return{$$typeof:yB,type:e,key:o,ref:i,props:a,_owner:wB.current}}pm.Fragment=vB;pm.jsx=TP;pm.jsxs=TP;vP.exports=pm;var f=vP.exports,RP={exports:{}},Rr={},NP={exports:{}},IP={};/** + */var yB=p,vB=Symbol.for("react.element"),SB=Symbol.for("react.fragment"),wB=Object.prototype.hasOwnProperty,EB=yB.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,xB={key:!0,ref:!0,__self:!0,__source:!0};function TP(e,t,n){var r,a={},o=null,i=null;n!==void 0&&(o=""+n),t.key!==void 0&&(o=""+t.key),t.ref!==void 0&&(i=t.ref);for(r in t)wB.call(t,r)&&!xB.hasOwnProperty(r)&&(a[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps,t)a[r]===void 0&&(a[r]=t[r]);return{$$typeof:vB,type:e,key:o,ref:i,props:a,_owner:EB.current}}pm.Fragment=SB;pm.jsx=TP;pm.jsxs=TP;vP.exports=pm;var f=vP.exports,RP={exports:{}},Rr={},NP={exports:{}},IP={};/** * @license React * scheduler.production.min.js * @@ -22,7 +22,7 @@ var Vh=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)};var $=(e,t,n)=>(Vh(e * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */(function(e){function t(j,O){var A=j.length;j.push(O);e:for(;0>>1,P=j[V];if(0>>1;Va(ae,A))nea(Q,ae)?(j[V]=Q,j[ne]=A,V=ne):(j[V]=ae,j[K]=A,V=K);else if(nea(Q,A))j[V]=Q,j[ne]=A,V=ne;else break e}}return O}function a(j,O){var A=j.sortIndex-O.sortIndex;return A!==0?A:j.id-O.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var i=Date,s=i.now();e.unstable_now=function(){return i.now()-s}}var l=[],c=[],u=1,d=null,g=3,m=!1,b=!1,y=!1,w=typeof setTimeout=="function"?setTimeout:null,v=typeof clearTimeout=="function"?clearTimeout:null,h=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function S(j){for(var O=n(c);O!==null;){if(O.callback===null)r(c);else if(O.startTime<=j)r(c),O.sortIndex=O.expirationTime,t(l,O);else break;O=n(c)}}function E(j){if(y=!1,S(j),!b)if(n(l)!==null)b=!0,U(k);else{var O=n(c);O!==null&&X(E,O.startTime-j)}}function k(j,O){b=!1,y&&(y=!1,v(_),_=-1),m=!0;var A=g;try{for(S(O),d=n(l);d!==null&&(!(d.expirationTime>O)||j&&!L());){var V=d.callback;if(typeof V=="function"){d.callback=null,g=d.priorityLevel;var P=V(d.expirationTime<=O);O=e.unstable_now(),typeof P=="function"?d.callback=P:d===n(l)&&r(l),S(O)}else r(l);d=n(l)}if(d!==null)var N=!0;else{var K=n(c);K!==null&&X(E,K.startTime-O),N=!1}return N}finally{d=null,g=A,m=!1}}var x=!1,C=null,_=-1,R=5,T=-1;function L(){return!(e.unstable_now()-Tj||125V?(j.sortIndex=A,t(c,j),n(l)===null&&j===n(c)&&(y?(v(_),_=-1):y=!0,X(E,A-V))):(j.sortIndex=P,t(l,j),b||m||(b=!0,U(k))),j},e.unstable_shouldYield=L,e.unstable_wrapCallback=function(j){var O=g;return function(){var A=g;g=O;try{return j.apply(this,arguments)}finally{g=A}}}})(IP);NP.exports=IP;var xB=NP.exports;/** + */(function(e){function t(j,O){var A=j.length;j.push(O);e:for(;0>>1,P=j[V];if(0>>1;Va(ae,A))nea(Q,ae)?(j[V]=Q,j[ne]=A,V=ne):(j[V]=ae,j[K]=A,V=K);else if(nea(Q,A))j[V]=Q,j[ne]=A,V=ne;else break e}}return O}function a(j,O){var A=j.sortIndex-O.sortIndex;return A!==0?A:j.id-O.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var i=Date,s=i.now();e.unstable_now=function(){return i.now()-s}}var l=[],c=[],u=1,d=null,g=3,m=!1,b=!1,y=!1,w=typeof setTimeout=="function"?setTimeout:null,v=typeof clearTimeout=="function"?clearTimeout:null,h=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function S(j){for(var O=n(c);O!==null;){if(O.callback===null)r(c);else if(O.startTime<=j)r(c),O.sortIndex=O.expirationTime,t(l,O);else break;O=n(c)}}function E(j){if(y=!1,S(j),!b)if(n(l)!==null)b=!0,U(k);else{var O=n(c);O!==null&&X(E,O.startTime-j)}}function k(j,O){b=!1,y&&(y=!1,v(_),_=-1),m=!0;var A=g;try{for(S(O),d=n(l);d!==null&&(!(d.expirationTime>O)||j&&!L());){var V=d.callback;if(typeof V=="function"){d.callback=null,g=d.priorityLevel;var P=V(d.expirationTime<=O);O=e.unstable_now(),typeof P=="function"?d.callback=P:d===n(l)&&r(l),S(O)}else r(l);d=n(l)}if(d!==null)var N=!0;else{var K=n(c);K!==null&&X(E,K.startTime-O),N=!1}return N}finally{d=null,g=A,m=!1}}var x=!1,C=null,_=-1,R=5,T=-1;function L(){return!(e.unstable_now()-Tj||125V?(j.sortIndex=A,t(c,j),n(l)===null&&j===n(c)&&(y?(v(_),_=-1):y=!0,X(E,A-V))):(j.sortIndex=P,t(l,j),b||m||(b=!0,U(k))),j},e.unstable_shouldYield=L,e.unstable_wrapCallback=function(j){var O=g;return function(){var A=g;g=O;try{return j.apply(this,arguments)}finally{g=A}}}})(IP);NP.exports=IP;var kB=NP.exports;/** * @license React * react-dom.production.min.js * @@ -30,14 +30,14 @@ var Vh=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)};var $=(e,t,n)=>(Vh(e * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var OP=p,Ar=xB;function ie(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Tx=Object.prototype.hasOwnProperty,kB=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,lT={},cT={};function CB(e){return Tx.call(cT,e)?!0:Tx.call(lT,e)?!1:kB.test(e)?cT[e]=!0:(lT[e]=!0,!1)}function _B(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function AB(e,t,n,r){if(t===null||typeof t>"u"||_B(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function er(e,t,n,r,a,o,i){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=a,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=i}var Cn={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){Cn[e]=new er(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];Cn[t]=new er(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){Cn[e]=new er(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){Cn[e]=new er(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){Cn[e]=new er(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){Cn[e]=new er(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){Cn[e]=new er(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){Cn[e]=new er(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){Cn[e]=new er(e,5,!1,e.toLowerCase(),null,!1,!1)});var tC=/[\-:]([a-z])/g;function nC(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(tC,nC);Cn[t]=new er(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(tC,nC);Cn[t]=new er(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(tC,nC);Cn[t]=new er(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){Cn[e]=new er(e,1,!1,e.toLowerCase(),null,!1,!1)});Cn.xlinkHref=new er("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){Cn[e]=new er(e,1,!1,e.toLowerCase(),null,!0,!0)});function rC(e,t,n,r){var a=Cn.hasOwnProperty(t)?Cn[t]:null;(a!==null?a.type!==0:r||!(2"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Rx=Object.prototype.hasOwnProperty,CB=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,lT={},cT={};function _B(e){return Rx.call(cT,e)?!0:Rx.call(lT,e)?!1:CB.test(e)?cT[e]=!0:(lT[e]=!0,!1)}function AB(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function TB(e,t,n,r){if(t===null||typeof t>"u"||AB(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function er(e,t,n,r,a,o,i){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=a,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=i}var Cn={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){Cn[e]=new er(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];Cn[t]=new er(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){Cn[e]=new er(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){Cn[e]=new er(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){Cn[e]=new er(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){Cn[e]=new er(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){Cn[e]=new er(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){Cn[e]=new er(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){Cn[e]=new er(e,5,!1,e.toLowerCase(),null,!1,!1)});var nC=/[\-:]([a-z])/g;function rC(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(nC,rC);Cn[t]=new er(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(nC,rC);Cn[t]=new er(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(nC,rC);Cn[t]=new er(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){Cn[e]=new er(e,1,!1,e.toLowerCase(),null,!1,!1)});Cn.xlinkHref=new er("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){Cn[e]=new er(e,1,!1,e.toLowerCase(),null,!0,!0)});function aC(e,t,n,r){var a=Cn.hasOwnProperty(t)?Cn[t]:null;(a!==null?a.type!==0:r||!(2s||a[i]!==o[s]){var l=` -`+a[i].replace(" at new "," at ");return e.displayName&&l.includes("")&&(l=l.replace("",e.displayName)),l}while(1<=i&&0<=s);break}}}finally{Wh=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?wu(e):""}function TB(e){switch(e.tag){case 5:return wu(e.type);case 16:return wu("Lazy");case 13:return wu("Suspense");case 19:return wu("SuspenseList");case 0:case 2:case 15:return e=Kh(e.type,!1),e;case 11:return e=Kh(e.type.render,!1),e;case 1:return e=Kh(e.type,!0),e;default:return""}}function Ox(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case yl:return"Fragment";case bl:return"Portal";case Rx:return"Profiler";case aC:return"StrictMode";case Nx:return"Suspense";case Ix:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case MP:return(e.displayName||"Context")+".Consumer";case LP:return(e._context.displayName||"Context")+".Provider";case oC:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case iC:return t=e.displayName||null,t!==null?t:Ox(e.type)||"Memo";case qo:t=e._payload,e=e._init;try{return Ox(e(t))}catch{}}return null}function RB(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Ox(t);case 8:return t===aC?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function vi(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function $P(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function NB(e){var t=$P(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var a=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return a.call(this)},set:function(i){r=""+i,o.call(this,i)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(i){r=""+i},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function If(e){e._valueTracker||(e._valueTracker=NB(e))}function FP(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=$P(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function eg(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Dx(e,t){var n=t.checked;return Ut({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function dT(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=vi(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function jP(e,t){t=t.checked,t!=null&&rC(e,"checked",t,!1)}function Lx(e,t){jP(e,t);var n=vi(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Mx(e,t.type,n):t.hasOwnProperty("defaultValue")&&Mx(e,t.type,vi(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function fT(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function Mx(e,t,n){(t!=="number"||eg(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var Eu=Array.isArray;function Ll(e,t,n,r){if(e=e.options,t){t={};for(var a=0;a"+t.valueOf().toString()+"",t=Of.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Qu(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Iu={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},IB=["Webkit","ms","Moz","O"];Object.keys(Iu).forEach(function(e){IB.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Iu[t]=Iu[e]})});function HP(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Iu.hasOwnProperty(e)&&Iu[e]?(""+t).trim():t+"px"}function VP(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,a=HP(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,a):e[n]=a}}var OB=Ut({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Fx(e,t){if(t){if(OB[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(ie(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(ie(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(ie(61))}if(t.style!=null&&typeof t.style!="object")throw Error(ie(62))}}function jx(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var zx=null;function sC(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Ux=null,Ml=null,Pl=null;function mT(e){if(e=Xd(e)){if(typeof Ux!="function")throw Error(ie(280));var t=e.stateNode;t&&(t=ym(t),Ux(e.stateNode,e.type,t))}}function qP(e){Ml?Pl?Pl.push(e):Pl=[e]:Ml=e}function GP(){if(Ml){var e=Ml,t=Pl;if(Pl=Ml=null,mT(e),t)for(e=0;e>>=0,e===0?32:31-(HB(e)/VB|0)|0}var Df=64,Lf=4194304;function xu(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function ag(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,a=e.suspendedLanes,o=e.pingedLanes,i=n&268435455;if(i!==0){var s=i&~a;s!==0?r=xu(s):(o&=i,o!==0&&(r=xu(o)))}else i=n&~a,i!==0?r=xu(i):o!==0&&(r=xu(o));if(r===0)return 0;if(t!==0&&t!==r&&!(t&a)&&(a=r&-r,o=t&-t,a>=o||a===16&&(o&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function Yd(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-da(t),e[t]=n}function KB(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=Du),kT=String.fromCharCode(32),CT=!1;function f$(e,t){switch(e){case"keyup":return EH.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function p$(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var vl=!1;function kH(e,t){switch(e){case"compositionend":return p$(t);case"keypress":return t.which!==32?null:(CT=!0,kT);case"textInput":return e=t.data,e===kT&&CT?null:e;default:return null}}function CH(e,t){if(vl)return e==="compositionend"||!mC&&f$(e,t)?(e=u$(),Rp=fC=ai=null,vl=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=RT(n)}}function b$(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?b$(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function y$(){for(var e=window,t=eg();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=eg(e.document)}return t}function hC(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function LH(e){var t=y$(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&b$(n.ownerDocument.documentElement,n)){if(r!==null&&hC(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var a=n.textContent.length,o=Math.min(r.start,a);r=r.end===void 0?o:Math.min(r.end,a),!e.extend&&o>r&&(a=r,r=o,o=a),a=NT(n,o);var i=NT(n,r);a&&i&&(e.rangeCount!==1||e.anchorNode!==a.node||e.anchorOffset!==a.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&(t=t.createRange(),t.setStart(a.node,a.offset),e.removeAllRanges(),o>r?(e.addRange(t),e.extend(i.node,i.offset)):(t.setEnd(i.node,i.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,Sl=null,Wx=null,Mu=null,Kx=!1;function IT(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Kx||Sl==null||Sl!==eg(r)||(r=Sl,"selectionStart"in r&&hC(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Mu&&ad(Mu,r)||(Mu=r,r=sg(Wx,"onSelect"),0xl||(e.current=e1[xl],e1[xl]=null,xl--)}function At(e,t){xl++,e1[xl]=e.current,e.current=t}var Si={},jn=Ii(Si),sr=Ii(!1),Ss=Si;function lc(e,t){var n=e.type.contextTypes;if(!n)return Si;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var a={},o;for(o in n)a[o]=t[o];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=a),a}function lr(e){return e=e.childContextTypes,e!=null}function cg(){Dt(sr),Dt(jn)}function FT(e,t,n){if(jn.current!==Si)throw Error(ie(168));At(jn,t),At(sr,n)}function A$(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var a in r)if(!(a in t))throw Error(ie(108,RB(e)||"Unknown",a));return Ut({},n,r)}function ug(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Si,Ss=jn.current,At(jn,e),At(sr,sr.current),!0}function jT(e,t,n){var r=e.stateNode;if(!r)throw Error(ie(169));n?(e=A$(e,t,Ss),r.__reactInternalMemoizedMergedChildContext=e,Dt(sr),Dt(jn),At(jn,e)):Dt(sr),At(sr,n)}var ao=null,vm=!1,lb=!1;function T$(e){ao===null?ao=[e]:ao.push(e)}function GH(e){vm=!0,T$(e)}function Oi(){if(!lb&&ao!==null){lb=!0;var e=0,t=vt;try{var n=ao;for(vt=1;e>=i,a-=i,io=1<<32-da(t)+a|n<_?(R=C,C=null):R=C.sibling;var T=g(v,C,S[_],E);if(T===null){C===null&&(C=R);break}e&&C&&T.alternate===null&&t(v,C),h=o(T,h,_),x===null?k=T:x.sibling=T,x=T,C=R}if(_===S.length)return n(v,C),Lt&&Gi(v,_),k;if(C===null){for(;__?(R=C,C=null):R=C.sibling;var L=g(v,C,T.value,E);if(L===null){C===null&&(C=R);break}e&&C&&L.alternate===null&&t(v,C),h=o(L,h,_),x===null?k=L:x.sibling=L,x=L,C=R}if(T.done)return n(v,C),Lt&&Gi(v,_),k;if(C===null){for(;!T.done;_++,T=S.next())T=d(v,T.value,E),T!==null&&(h=o(T,h,_),x===null?k=T:x.sibling=T,x=T);return Lt&&Gi(v,_),k}for(C=r(v,C);!T.done;_++,T=S.next())T=m(C,v,_,T.value,E),T!==null&&(e&&T.alternate!==null&&C.delete(T.key===null?_:T.key),h=o(T,h,_),x===null?k=T:x.sibling=T,x=T);return e&&C.forEach(function(D){return t(v,D)}),Lt&&Gi(v,_),k}function w(v,h,S,E){if(typeof S=="object"&&S!==null&&S.type===yl&&S.key===null&&(S=S.props.children),typeof S=="object"&&S!==null){switch(S.$$typeof){case Nf:e:{for(var k=S.key,x=h;x!==null;){if(x.key===k){if(k=S.type,k===yl){if(x.tag===7){n(v,x.sibling),h=a(x,S.props.children),h.return=v,v=h;break e}}else if(x.elementType===k||typeof k=="object"&&k!==null&&k.$$typeof===qo&>(k)===x.type){n(v,x.sibling),h=a(x,S.props),h.ref=Qc(v,x,S),h.return=v,v=h;break e}n(v,x);break}else t(v,x);x=x.sibling}S.type===yl?(h=bs(S.props.children,v.mode,E,S.key),h.return=v,v=h):(E=$p(S.type,S.key,S.props,null,v.mode,E),E.ref=Qc(v,h,S),E.return=v,v=E)}return i(v);case bl:e:{for(x=S.key;h!==null;){if(h.key===x)if(h.tag===4&&h.stateNode.containerInfo===S.containerInfo&&h.stateNode.implementation===S.implementation){n(v,h.sibling),h=a(h,S.children||[]),h.return=v,v=h;break e}else{n(v,h);break}else t(v,h);h=h.sibling}h=hb(S,v.mode,E),h.return=v,v=h}return i(v);case qo:return x=S._init,w(v,h,x(S._payload),E)}if(Eu(S))return b(v,h,S,E);if(Wc(S))return y(v,h,S,E);Uf(v,S)}return typeof S=="string"&&S!==""||typeof S=="number"?(S=""+S,h!==null&&h.tag===6?(n(v,h.sibling),h=a(h,S),h.return=v,v=h):(n(v,h),h=mb(S,v.mode,E),h.return=v,v=h),i(v)):n(v,h)}return w}var uc=P$(!0),$$=P$(!1),Qd={},La=Ii(Qd),ld=Ii(Qd),cd=Ii(Qd);function ts(e){if(e===Qd)throw Error(ie(174));return e}function CC(e,t){switch(At(cd,t),At(ld,e),At(La,Qd),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:$x(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=$x(t,e)}Dt(La),At(La,t)}function dc(){Dt(La),Dt(ld),Dt(cd)}function F$(e){ts(cd.current);var t=ts(La.current),n=$x(t,e.type);t!==n&&(At(ld,e),At(La,n))}function _C(e){ld.current===e&&(Dt(La),Dt(ld))}var jt=Ii(0);function hg(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data==="$?"||n.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if(t.flags&128)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var cb=[];function AC(){for(var e=0;en?n:4,e(!0);var r=ub.transition;ub.transition={};try{e(!1),t()}finally{vt=n,ub.transition=r}}function e4(){return Yr().memoizedState}function ZH(e,t,n){var r=mi(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},t4(e))n4(t,n);else if(n=O$(e,t,n,r),n!==null){var a=Xn();fa(n,e,r,a),r4(n,t,r)}}function XH(e,t,n){var r=mi(e),a={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(t4(e))n4(t,a);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=t.lastRenderedReducer,o!==null))try{var i=t.lastRenderedState,s=o(i,n);if(a.hasEagerState=!0,a.eagerState=s,ha(s,i)){var l=t.interleaved;l===null?(a.next=a,xC(t)):(a.next=l.next,l.next=a),t.interleaved=a;return}}catch{}finally{}n=O$(e,t,a,r),n!==null&&(a=Xn(),fa(n,e,r,a),r4(n,t,r))}}function t4(e){var t=e.alternate;return e===zt||t!==null&&t===zt}function n4(e,t){Pu=bg=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function r4(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,cC(e,n)}}var yg={readContext:Kr,useCallback:Rn,useContext:Rn,useEffect:Rn,useImperativeHandle:Rn,useInsertionEffect:Rn,useLayoutEffect:Rn,useMemo:Rn,useReducer:Rn,useRef:Rn,useState:Rn,useDebugValue:Rn,useDeferredValue:Rn,useTransition:Rn,useMutableSource:Rn,useSyncExternalStore:Rn,useId:Rn,unstable_isNewReconciler:!1},QH={readContext:Kr,useCallback:function(e,t){return xa().memoizedState=[e,t===void 0?null:t],e},useContext:Kr,useEffect:KT,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,Dp(4194308,4,Y$.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Dp(4194308,4,e,t)},useInsertionEffect:function(e,t){return Dp(4,2,e,t)},useMemo:function(e,t){var n=xa();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=xa();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=ZH.bind(null,zt,e),[r.memoizedState,e]},useRef:function(e){var t=xa();return e={current:e},t.memoizedState=e},useState:WT,useDebugValue:OC,useDeferredValue:function(e){return xa().memoizedState=e},useTransition:function(){var e=WT(!1),t=e[0];return e=YH.bind(null,e[1]),xa().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=zt,a=xa();if(Lt){if(n===void 0)throw Error(ie(407));n=n()}else{if(n=t(),hn===null)throw Error(ie(349));Es&30||U$(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,KT(H$.bind(null,r,o,e),[e]),r.flags|=2048,fd(9,B$.bind(null,r,o,n,t),void 0,null),n},useId:function(){var e=xa(),t=hn.identifierPrefix;if(Lt){var n=so,r=io;n=(r&~(1<<32-da(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=ud++,0")&&(l=l.replace("",e.displayName)),l}while(1<=i&&0<=s);break}}}finally{Kh=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?wu(e):""}function RB(e){switch(e.tag){case 5:return wu(e.type);case 16:return wu("Lazy");case 13:return wu("Suspense");case 19:return wu("SuspenseList");case 0:case 2:case 15:return e=Yh(e.type,!1),e;case 11:return e=Yh(e.type.render,!1),e;case 1:return e=Yh(e.type,!0),e;default:return""}}function Dx(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case yl:return"Fragment";case bl:return"Portal";case Nx:return"Profiler";case oC:return"StrictMode";case Ix:return"Suspense";case Ox:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case MP:return(e.displayName||"Context")+".Consumer";case LP:return(e._context.displayName||"Context")+".Provider";case iC:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case sC:return t=e.displayName||null,t!==null?t:Dx(e.type)||"Memo";case qo:t=e._payload,e=e._init;try{return Dx(e(t))}catch{}}return null}function NB(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Dx(t);case 8:return t===oC?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function vi(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function $P(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function IB(e){var t=$P(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var a=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return a.call(this)},set:function(i){r=""+i,o.call(this,i)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(i){r=""+i},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function If(e){e._valueTracker||(e._valueTracker=IB(e))}function FP(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=$P(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function eg(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Lx(e,t){var n=t.checked;return Ut({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function dT(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=vi(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function jP(e,t){t=t.checked,t!=null&&aC(e,"checked",t,!1)}function Mx(e,t){jP(e,t);var n=vi(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Px(e,t.type,n):t.hasOwnProperty("defaultValue")&&Px(e,t.type,vi(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function fT(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function Px(e,t,n){(t!=="number"||eg(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var Eu=Array.isArray;function Ll(e,t,n,r){if(e=e.options,t){t={};for(var a=0;a"+t.valueOf().toString()+"",t=Of.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Qu(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Iu={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},OB=["Webkit","ms","Moz","O"];Object.keys(Iu).forEach(function(e){OB.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Iu[t]=Iu[e]})});function HP(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Iu.hasOwnProperty(e)&&Iu[e]?(""+t).trim():t+"px"}function VP(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,a=HP(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,a):e[n]=a}}var DB=Ut({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function jx(e,t){if(t){if(DB[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(ie(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(ie(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(ie(61))}if(t.style!=null&&typeof t.style!="object")throw Error(ie(62))}}function zx(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Ux=null;function lC(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Bx=null,Ml=null,Pl=null;function mT(e){if(e=Xd(e)){if(typeof Bx!="function")throw Error(ie(280));var t=e.stateNode;t&&(t=ym(t),Bx(e.stateNode,e.type,t))}}function qP(e){Ml?Pl?Pl.push(e):Pl=[e]:Ml=e}function GP(){if(Ml){var e=Ml,t=Pl;if(Pl=Ml=null,mT(e),t)for(e=0;e>>=0,e===0?32:31-(VB(e)/qB|0)|0}var Df=64,Lf=4194304;function xu(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function ag(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,a=e.suspendedLanes,o=e.pingedLanes,i=n&268435455;if(i!==0){var s=i&~a;s!==0?r=xu(s):(o&=i,o!==0&&(r=xu(o)))}else i=n&~a,i!==0?r=xu(i):o!==0&&(r=xu(o));if(r===0)return 0;if(t!==0&&t!==r&&!(t&a)&&(a=r&-r,o=t&-t,a>=o||a===16&&(o&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function Yd(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-da(t),e[t]=n}function YB(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=Du),kT=String.fromCharCode(32),CT=!1;function f$(e,t){switch(e){case"keyup":return xH.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function p$(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var vl=!1;function CH(e,t){switch(e){case"compositionend":return p$(t);case"keypress":return t.which!==32?null:(CT=!0,kT);case"textInput":return e=t.data,e===kT&&CT?null:e;default:return null}}function _H(e,t){if(vl)return e==="compositionend"||!hC&&f$(e,t)?(e=u$(),Rp=pC=ai=null,vl=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=RT(n)}}function b$(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?b$(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function y$(){for(var e=window,t=eg();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=eg(e.document)}return t}function bC(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function MH(e){var t=y$(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&b$(n.ownerDocument.documentElement,n)){if(r!==null&&bC(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var a=n.textContent.length,o=Math.min(r.start,a);r=r.end===void 0?o:Math.min(r.end,a),!e.extend&&o>r&&(a=r,r=o,o=a),a=NT(n,o);var i=NT(n,r);a&&i&&(e.rangeCount!==1||e.anchorNode!==a.node||e.anchorOffset!==a.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&(t=t.createRange(),t.setStart(a.node,a.offset),e.removeAllRanges(),o>r?(e.addRange(t),e.extend(i.node,i.offset)):(t.setEnd(i.node,i.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,Sl=null,Kx=null,Mu=null,Yx=!1;function IT(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Yx||Sl==null||Sl!==eg(r)||(r=Sl,"selectionStart"in r&&bC(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Mu&&ad(Mu,r)||(Mu=r,r=sg(Kx,"onSelect"),0xl||(e.current=t1[xl],t1[xl]=null,xl--)}function At(e,t){xl++,t1[xl]=e.current,e.current=t}var Si={},jn=Ii(Si),sr=Ii(!1),Ss=Si;function lc(e,t){var n=e.type.contextTypes;if(!n)return Si;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var a={},o;for(o in n)a[o]=t[o];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=a),a}function lr(e){return e=e.childContextTypes,e!=null}function cg(){Dt(sr),Dt(jn)}function FT(e,t,n){if(jn.current!==Si)throw Error(ie(168));At(jn,t),At(sr,n)}function A$(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var a in r)if(!(a in t))throw Error(ie(108,NB(e)||"Unknown",a));return Ut({},n,r)}function ug(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Si,Ss=jn.current,At(jn,e),At(sr,sr.current),!0}function jT(e,t,n){var r=e.stateNode;if(!r)throw Error(ie(169));n?(e=A$(e,t,Ss),r.__reactInternalMemoizedMergedChildContext=e,Dt(sr),Dt(jn),At(jn,e)):Dt(sr),At(sr,n)}var ao=null,vm=!1,cb=!1;function T$(e){ao===null?ao=[e]:ao.push(e)}function WH(e){vm=!0,T$(e)}function Oi(){if(!cb&&ao!==null){cb=!0;var e=0,t=vt;try{var n=ao;for(vt=1;e>=i,a-=i,io=1<<32-da(t)+a|n<_?(R=C,C=null):R=C.sibling;var T=g(v,C,S[_],E);if(T===null){C===null&&(C=R);break}e&&C&&T.alternate===null&&t(v,C),h=o(T,h,_),x===null?k=T:x.sibling=T,x=T,C=R}if(_===S.length)return n(v,C),Lt&&Gi(v,_),k;if(C===null){for(;__?(R=C,C=null):R=C.sibling;var L=g(v,C,T.value,E);if(L===null){C===null&&(C=R);break}e&&C&&L.alternate===null&&t(v,C),h=o(L,h,_),x===null?k=L:x.sibling=L,x=L,C=R}if(T.done)return n(v,C),Lt&&Gi(v,_),k;if(C===null){for(;!T.done;_++,T=S.next())T=d(v,T.value,E),T!==null&&(h=o(T,h,_),x===null?k=T:x.sibling=T,x=T);return Lt&&Gi(v,_),k}for(C=r(v,C);!T.done;_++,T=S.next())T=m(C,v,_,T.value,E),T!==null&&(e&&T.alternate!==null&&C.delete(T.key===null?_:T.key),h=o(T,h,_),x===null?k=T:x.sibling=T,x=T);return e&&C.forEach(function(D){return t(v,D)}),Lt&&Gi(v,_),k}function w(v,h,S,E){if(typeof S=="object"&&S!==null&&S.type===yl&&S.key===null&&(S=S.props.children),typeof S=="object"&&S!==null){switch(S.$$typeof){case Nf:e:{for(var k=S.key,x=h;x!==null;){if(x.key===k){if(k=S.type,k===yl){if(x.tag===7){n(v,x.sibling),h=a(x,S.props.children),h.return=v,v=h;break e}}else if(x.elementType===k||typeof k=="object"&&k!==null&&k.$$typeof===qo&>(k)===x.type){n(v,x.sibling),h=a(x,S.props),h.ref=Qc(v,x,S),h.return=v,v=h;break e}n(v,x);break}else t(v,x);x=x.sibling}S.type===yl?(h=bs(S.props.children,v.mode,E,S.key),h.return=v,v=h):(E=$p(S.type,S.key,S.props,null,v.mode,E),E.ref=Qc(v,h,S),E.return=v,v=E)}return i(v);case bl:e:{for(x=S.key;h!==null;){if(h.key===x)if(h.tag===4&&h.stateNode.containerInfo===S.containerInfo&&h.stateNode.implementation===S.implementation){n(v,h.sibling),h=a(h,S.children||[]),h.return=v,v=h;break e}else{n(v,h);break}else t(v,h);h=h.sibling}h=bb(S,v.mode,E),h.return=v,v=h}return i(v);case qo:return x=S._init,w(v,h,x(S._payload),E)}if(Eu(S))return b(v,h,S,E);if(Wc(S))return y(v,h,S,E);Uf(v,S)}return typeof S=="string"&&S!==""||typeof S=="number"?(S=""+S,h!==null&&h.tag===6?(n(v,h.sibling),h=a(h,S),h.return=v,v=h):(n(v,h),h=hb(S,v.mode,E),h.return=v,v=h),i(v)):n(v,h)}return w}var uc=P$(!0),$$=P$(!1),Qd={},La=Ii(Qd),ld=Ii(Qd),cd=Ii(Qd);function ts(e){if(e===Qd)throw Error(ie(174));return e}function _C(e,t){switch(At(cd,t),At(ld,e),At(La,Qd),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:Fx(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=Fx(t,e)}Dt(La),At(La,t)}function dc(){Dt(La),Dt(ld),Dt(cd)}function F$(e){ts(cd.current);var t=ts(La.current),n=Fx(t,e.type);t!==n&&(At(ld,e),At(La,n))}function AC(e){ld.current===e&&(Dt(La),Dt(ld))}var jt=Ii(0);function hg(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data==="$?"||n.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if(t.flags&128)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var ub=[];function TC(){for(var e=0;en?n:4,e(!0);var r=db.transition;db.transition={};try{e(!1),t()}finally{vt=n,db.transition=r}}function e4(){return Yr().memoizedState}function XH(e,t,n){var r=mi(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},t4(e))n4(t,n);else if(n=O$(e,t,n,r),n!==null){var a=Xn();fa(n,e,r,a),r4(n,t,r)}}function QH(e,t,n){var r=mi(e),a={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(t4(e))n4(t,a);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=t.lastRenderedReducer,o!==null))try{var i=t.lastRenderedState,s=o(i,n);if(a.hasEagerState=!0,a.eagerState=s,ha(s,i)){var l=t.interleaved;l===null?(a.next=a,kC(t)):(a.next=l.next,l.next=a),t.interleaved=a;return}}catch{}finally{}n=O$(e,t,a,r),n!==null&&(a=Xn(),fa(n,e,r,a),r4(n,t,r))}}function t4(e){var t=e.alternate;return e===zt||t!==null&&t===zt}function n4(e,t){Pu=bg=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function r4(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,uC(e,n)}}var yg={readContext:Kr,useCallback:Rn,useContext:Rn,useEffect:Rn,useImperativeHandle:Rn,useInsertionEffect:Rn,useLayoutEffect:Rn,useMemo:Rn,useReducer:Rn,useRef:Rn,useState:Rn,useDebugValue:Rn,useDeferredValue:Rn,useTransition:Rn,useMutableSource:Rn,useSyncExternalStore:Rn,useId:Rn,unstable_isNewReconciler:!1},JH={readContext:Kr,useCallback:function(e,t){return xa().memoizedState=[e,t===void 0?null:t],e},useContext:Kr,useEffect:KT,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,Dp(4194308,4,Y$.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Dp(4194308,4,e,t)},useInsertionEffect:function(e,t){return Dp(4,2,e,t)},useMemo:function(e,t){var n=xa();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=xa();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=XH.bind(null,zt,e),[r.memoizedState,e]},useRef:function(e){var t=xa();return e={current:e},t.memoizedState=e},useState:WT,useDebugValue:DC,useDeferredValue:function(e){return xa().memoizedState=e},useTransition:function(){var e=WT(!1),t=e[0];return e=ZH.bind(null,e[1]),xa().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=zt,a=xa();if(Lt){if(n===void 0)throw Error(ie(407));n=n()}else{if(n=t(),hn===null)throw Error(ie(349));Es&30||U$(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,KT(H$.bind(null,r,o,e),[e]),r.flags|=2048,fd(9,B$.bind(null,r,o,n,t),void 0,null),n},useId:function(){var e=xa(),t=hn.identifierPrefix;if(Lt){var n=so,r=io;n=(r&~(1<<32-da(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=ud++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=i.createElement(n,{is:r.is}):(e=i.createElement(n),n==="select"&&(i=e,r.multiple?i.multiple=!0:r.size&&(i.size=r.size))):e=i.createElementNS(e,n),e[Na]=t,e[sd]=r,f4(e,t,!1,!1),t.stateNode=e;e:{switch(i=jx(n,r),n){case"dialog":It("cancel",e),It("close",e),a=r;break;case"iframe":case"object":case"embed":It("load",e),a=r;break;case"video":case"audio":for(a=0;apc&&(t.flags|=128,r=!0,Jc(o,!1),t.lanes=4194304)}else{if(!r)if(e=hg(i),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),Jc(o,!0),o.tail===null&&o.tailMode==="hidden"&&!i.alternate&&!Lt)return Nn(t),null}else 2*Xt()-o.renderingStartTime>pc&&n!==1073741824&&(t.flags|=128,r=!0,Jc(o,!1),t.lanes=4194304);o.isBackwards?(i.sibling=t.child,t.child=i):(n=o.last,n!==null?n.sibling=i:t.child=i,o.last=i)}return o.tail!==null?(t=o.tail,o.rendering=t,o.tail=t.sibling,o.renderingStartTime=Xt(),t.sibling=null,n=jt.current,At(jt,r?n&1|2:n&1),t):(Nn(t),null);case 22:case 23:return FC(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?Sr&1073741824&&(Nn(t),t.subtreeFlags&6&&(t.flags|=8192)):Nn(t),null;case 24:return null;case 25:return null}throw Error(ie(156,t.tag))}function iV(e,t){switch(yC(t),t.tag){case 1:return lr(t.type)&&cg(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return dc(),Dt(sr),Dt(jn),AC(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return _C(t),null;case 13:if(Dt(jt),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(ie(340));cc()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Dt(jt),null;case 4:return dc(),null;case 10:return EC(t.type._context),null;case 22:case 23:return FC(),null;case 24:return null;default:return null}}var Hf=!1,Mn=!1,sV=typeof WeakSet=="function"?WeakSet:Set,Se=null;function Al(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){Gt(e,t,r)}else n.current=null}function f1(e,t,n){try{n()}catch(r){Gt(e,t,r)}}var rR=!1;function lV(e,t){if(Yx=og,e=y$(),hC(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var a=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break e}var i=0,s=-1,l=-1,c=0,u=0,d=e,g=null;t:for(;;){for(var m;d!==n||a!==0&&d.nodeType!==3||(s=i+a),d!==o||r!==0&&d.nodeType!==3||(l=i+r),d.nodeType===3&&(i+=d.nodeValue.length),(m=d.firstChild)!==null;)g=d,d=m;for(;;){if(d===e)break t;if(g===n&&++c===a&&(s=i),g===o&&++u===r&&(l=i),(m=d.nextSibling)!==null)break;d=g,g=d.parentNode}d=m}n=s===-1||l===-1?null:{start:s,end:l}}else n=null}n=n||{start:0,end:0}}else n=null;for(Zx={focusedElem:e,selectionRange:n},og=!1,Se=t;Se!==null;)if(t=Se,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,Se=e;else for(;Se!==null;){t=Se;try{var b=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(b!==null){var y=b.memoizedProps,w=b.memoizedState,v=t.stateNode,h=v.getSnapshotBeforeUpdate(t.elementType===t.type?y:ia(t.type,y),w);v.__reactInternalSnapshotBeforeUpdate=h}break;case 3:var S=t.stateNode.containerInfo;S.nodeType===1?S.textContent="":S.nodeType===9&&S.documentElement&&S.removeChild(S.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(ie(163))}}catch(E){Gt(t,t.return,E)}if(e=t.sibling,e!==null){e.return=t.return,Se=e;break}Se=t.return}return b=rR,rR=!1,b}function $u(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var a=r=r.next;do{if((a.tag&e)===e){var o=a.destroy;a.destroy=void 0,o!==void 0&&f1(t,n,o)}a=a.next}while(a!==r)}}function Em(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function p1(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function m4(e){var t=e.alternate;t!==null&&(e.alternate=null,m4(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Na],delete t[sd],delete t[Jx],delete t[VH],delete t[qH])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function h4(e){return e.tag===5||e.tag===3||e.tag===4}function aR(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||h4(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function g1(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=lg));else if(r!==4&&(e=e.child,e!==null))for(g1(e,t,n),e=e.sibling;e!==null;)g1(e,t,n),e=e.sibling}function m1(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(m1(e,t,n),e=e.sibling;e!==null;)m1(e,t,n),e=e.sibling}var xn=null,la=!1;function Oo(e,t,n){for(n=n.child;n!==null;)b4(e,t,n),n=n.sibling}function b4(e,t,n){if(Da&&typeof Da.onCommitFiberUnmount=="function")try{Da.onCommitFiberUnmount(gm,n)}catch{}switch(n.tag){case 5:Mn||Al(n,t);case 6:var r=xn,a=la;xn=null,Oo(e,t,n),xn=r,la=a,xn!==null&&(la?(e=xn,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):xn.removeChild(n.stateNode));break;case 18:xn!==null&&(la?(e=xn,n=n.stateNode,e.nodeType===8?sb(e.parentNode,n):e.nodeType===1&&sb(e,n),nd(e)):sb(xn,n.stateNode));break;case 4:r=xn,a=la,xn=n.stateNode.containerInfo,la=!0,Oo(e,t,n),xn=r,la=a;break;case 0:case 11:case 14:case 15:if(!Mn&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){a=r=r.next;do{var o=a,i=o.destroy;o=o.tag,i!==void 0&&(o&2||o&4)&&f1(n,t,i),a=a.next}while(a!==r)}Oo(e,t,n);break;case 1:if(!Mn&&(Al(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(s){Gt(n,t,s)}Oo(e,t,n);break;case 21:Oo(e,t,n);break;case 22:n.mode&1?(Mn=(r=Mn)||n.memoizedState!==null,Oo(e,t,n),Mn=r):Oo(e,t,n);break;default:Oo(e,t,n)}}function oR(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new sV),t.forEach(function(r){var a=bV.bind(null,e,r);n.has(r)||(n.add(r),r.then(a,a))})}}function aa(e,t){var n=t.deletions;if(n!==null)for(var r=0;ra&&(a=i),r&=~o}if(r=a,r=Xt()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*uV(r/1960))-r,10e?16:e,oi===null)var r=!1;else{if(e=oi,oi=null,wg=0,dt&6)throw Error(ie(331));var a=dt;for(dt|=4,Se=e.current;Se!==null;){var o=Se,i=o.child;if(Se.flags&16){var s=o.deletions;if(s!==null){for(var l=0;lXt()-PC?hs(e,0):MC|=n),cr(e,t)}function C4(e,t){t===0&&(e.mode&1?(t=Lf,Lf<<=1,!(Lf&130023424)&&(Lf=4194304)):t=1);var n=Xn();e=mo(e,t),e!==null&&(Yd(e,t,n),cr(e,n))}function hV(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),C4(e,n)}function bV(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(ie(314))}r!==null&&r.delete(t),C4(e,n)}var _4;_4=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||sr.current)ir=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return ir=!1,aV(e,t,n);ir=!!(e.flags&131072)}else ir=!1,Lt&&t.flags&1048576&&R$(t,fg,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Lp(e,t),e=t.pendingProps;var a=lc(t,jn.current);Fl(t,n),a=RC(null,t,r,e,a,n);var o=NC();return t.flags|=1,typeof a=="object"&&a!==null&&typeof a.render=="function"&&a.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,lr(r)?(o=!0,ug(t)):o=!1,t.memoizedState=a.state!==null&&a.state!==void 0?a.state:null,kC(t),a.updater=Sm,t.stateNode=a,a._reactInternals=t,o1(t,r,e,n),t=l1(null,t,r,!0,o,n)):(t.tag=0,Lt&&o&&bC(t),Kn(null,t,a,n),t=t.child),t;case 16:r=t.elementType;e:{switch(Lp(e,t),e=t.pendingProps,a=r._init,r=a(r._payload),t.type=r,a=t.tag=vV(r),e=ia(r,e),a){case 0:t=s1(null,t,r,e,n);break e;case 1:t=eR(null,t,r,e,n);break e;case 11:t=QT(null,t,r,e,n);break e;case 14:t=JT(null,t,r,ia(r.type,e),n);break e}throw Error(ie(306,r,""))}return t;case 0:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:ia(r,a),s1(e,t,r,a,n);case 1:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:ia(r,a),eR(e,t,r,a,n);case 3:e:{if(c4(t),e===null)throw Error(ie(387));r=t.pendingProps,o=t.memoizedState,a=o.element,D$(e,t),mg(t,r,null,n);var i=t.memoizedState;if(r=i.element,o.isDehydrated)if(o={element:r,isDehydrated:!1,cache:i.cache,pendingSuspenseBoundaries:i.pendingSuspenseBoundaries,transitions:i.transitions},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){a=fc(Error(ie(423)),t),t=tR(e,t,r,n,a);break e}else if(r!==a){a=fc(Error(ie(424)),t),t=tR(e,t,r,n,a);break e}else for(xr=fi(t.stateNode.containerInfo.firstChild),Cr=t,Lt=!0,ua=null,n=$$(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(cc(),r===a){t=ho(e,t,n);break e}Kn(e,t,r,n)}t=t.child}return t;case 5:return F$(t),e===null&&n1(t),r=t.type,a=t.pendingProps,o=e!==null?e.memoizedProps:null,i=a.children,Xx(r,a)?i=null:o!==null&&Xx(r,o)&&(t.flags|=32),l4(e,t),Kn(e,t,i,n),t.child;case 6:return e===null&&n1(t),null;case 13:return u4(e,t,n);case 4:return CC(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=uc(t,null,r,n):Kn(e,t,r,n),t.child;case 11:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:ia(r,a),QT(e,t,r,a,n);case 7:return Kn(e,t,t.pendingProps,n),t.child;case 8:return Kn(e,t,t.pendingProps.children,n),t.child;case 12:return Kn(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,a=t.pendingProps,o=t.memoizedProps,i=a.value,At(pg,r._currentValue),r._currentValue=i,o!==null)if(ha(o.value,i)){if(o.children===a.children&&!sr.current){t=ho(e,t,n);break e}}else for(o=t.child,o!==null&&(o.return=t);o!==null;){var s=o.dependencies;if(s!==null){i=o.child;for(var l=s.firstContext;l!==null;){if(l.context===r){if(o.tag===1){l=co(-1,n&-n),l.tag=2;var c=o.updateQueue;if(c!==null){c=c.shared;var u=c.pending;u===null?l.next=l:(l.next=u.next,u.next=l),c.pending=l}}o.lanes|=n,l=o.alternate,l!==null&&(l.lanes|=n),r1(o.return,n,t),s.lanes|=n;break}l=l.next}}else if(o.tag===10)i=o.type===t.type?null:o.child;else if(o.tag===18){if(i=o.return,i===null)throw Error(ie(341));i.lanes|=n,s=i.alternate,s!==null&&(s.lanes|=n),r1(i,n,t),i=o.sibling}else i=o.child;if(i!==null)i.return=o;else for(i=o;i!==null;){if(i===t){i=null;break}if(o=i.sibling,o!==null){o.return=i.return,i=o;break}i=i.return}o=i}Kn(e,t,a.children,n),t=t.child}return t;case 9:return a=t.type,r=t.pendingProps.children,Fl(t,n),a=Kr(a),r=r(a),t.flags|=1,Kn(e,t,r,n),t.child;case 14:return r=t.type,a=ia(r,t.pendingProps),a=ia(r.type,a),JT(e,t,r,a,n);case 15:return i4(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:ia(r,a),Lp(e,t),t.tag=1,lr(r)?(e=!0,ug(t)):e=!1,Fl(t,n),M$(t,r,a),o1(t,r,a,n),l1(null,t,r,!0,e,n);case 19:return d4(e,t,n);case 22:return s4(e,t,n)}throw Error(ie(156,t.tag))};function A4(e,t){return JP(e,t)}function yV(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Vr(e,t,n,r){return new yV(e,t,n,r)}function zC(e){return e=e.prototype,!(!e||!e.isReactComponent)}function vV(e){if(typeof e=="function")return zC(e)?1:0;if(e!=null){if(e=e.$$typeof,e===oC)return 11;if(e===iC)return 14}return 2}function hi(e,t){var n=e.alternate;return n===null?(n=Vr(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function $p(e,t,n,r,a,o){var i=2;if(r=e,typeof e=="function")zC(e)&&(i=1);else if(typeof e=="string")i=5;else e:switch(e){case yl:return bs(n.children,a,o,t);case aC:i=8,a|=8;break;case Rx:return e=Vr(12,n,t,a|2),e.elementType=Rx,e.lanes=o,e;case Nx:return e=Vr(13,n,t,a),e.elementType=Nx,e.lanes=o,e;case Ix:return e=Vr(19,n,t,a),e.elementType=Ix,e.lanes=o,e;case PP:return km(n,a,o,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case LP:i=10;break e;case MP:i=9;break e;case oC:i=11;break e;case iC:i=14;break e;case qo:i=16,r=null;break e}throw Error(ie(130,e==null?e:typeof e,""))}return t=Vr(i,n,t,a),t.elementType=e,t.type=r,t.lanes=o,t}function bs(e,t,n,r){return e=Vr(7,e,r,t),e.lanes=n,e}function km(e,t,n,r){return e=Vr(22,e,r,t),e.elementType=PP,e.lanes=n,e.stateNode={isHidden:!1},e}function mb(e,t,n){return e=Vr(6,e,null,t),e.lanes=n,e}function hb(e,t,n){return t=Vr(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function SV(e,t,n,r,a){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Zh(0),this.expirationTimes=Zh(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Zh(0),this.identifierPrefix=r,this.onRecoverableError=a,this.mutableSourceEagerHydrationData=null}function UC(e,t,n,r,a,o,i,s,l){return e=new SV(e,t,n,s,l),t===1?(t=1,o===!0&&(t|=8)):t=0,o=Vr(3,null,null,t),e.current=o,o.stateNode=e,o.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},kC(o),e}function wV(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(I4)}catch(e){console.error(e)}}I4(),RP.exports=Rr;var ba=RP.exports;const qC=Tc(ba),_V=yP({__proto__:null,default:qC},[ba]);var O4,pR=ba;O4=pR.createRoot,pR.hydrateRoot;function W(){return W=Object.assign?Object.assign.bind():function(e){for(var t=1;te.forEach(n=>AV(n,t))}function nt(...e){return p.useCallback(GC(...e),e)}function TV(e,t){const n=p.createContext(t);function r(o){const{children:i,...s}=o,l=p.useMemo(()=>s,Object.values(s));return p.createElement(n.Provider,{value:l},i)}function a(o){const i=p.useContext(n);if(i)return i;if(t!==void 0)return t;throw new Error(`\`${o}\` must be used within \`${e}\``)}return r.displayName=e+"Provider",[r,a]}function zn(e,t=[]){let n=[];function r(o,i){const s=p.createContext(i),l=n.length;n=[...n,i];function c(d){const{scope:g,children:m,...b}=d,y=(g==null?void 0:g[e][l])||s,w=p.useMemo(()=>b,Object.values(b));return p.createElement(y.Provider,{value:w},m)}function u(d,g){const m=(g==null?void 0:g[e][l])||s,b=p.useContext(m);if(b)return b;if(i!==void 0)return i;throw new Error(`\`${d}\` must be used within \`${o}\``)}return c.displayName=o+"Provider",[c,u]}const a=()=>{const o=n.map(i=>p.createContext(i));return function(s){const l=(s==null?void 0:s[e])||o;return p.useMemo(()=>({[`__scope${e}`]:{...s,[e]:l}}),[s,l])}};return a.scopeName=e,[r,RV(a,...t)]}function RV(...e){const t=e[0];if(e.length===1)return t;const n=()=>{const r=e.map(a=>({useScope:a(),scopeName:a.scopeName}));return function(o){const i=r.reduce((s,{useScope:l,scopeName:c})=>{const d=l(o)[`__scope${c}`];return{...s,...d}},{});return p.useMemo(()=>({[`__scope${t.scopeName}`]:i}),[i])}};return n.scopeName=t.scopeName,n}const $a=p.forwardRef((e,t)=>{const{children:n,...r}=e,a=p.Children.toArray(n),o=a.find(NV);if(o){const i=o.props.children,s=a.map(l=>l===o?p.Children.count(i)>1?p.Children.only(null):p.isValidElement(i)?i.props.children:null:l);return p.createElement(S1,W({},r,{ref:t}),p.isValidElement(i)?p.cloneElement(i,void 0,s):null)}return p.createElement(S1,W({},r,{ref:t}),n)});$a.displayName="Slot";const S1=p.forwardRef((e,t)=>{const{children:n,...r}=e;return p.isValidElement(n)?p.cloneElement(n,{...IV(r,n.props),ref:t?GC(t,n.ref):n.ref}):p.Children.count(n)>1?p.Children.only(null):null});S1.displayName="SlotClone";const Rm=({children:e})=>p.createElement(p.Fragment,null,e);function NV(e){return p.isValidElement(e)&&e.type===Rm}function IV(e,t){const n={...t};for(const r in t){const a=e[r],o=t[r];/^on[A-Z]/.test(r)?a&&o?n[r]=(...s)=>{o(...s),a(...s)}:a&&(n[r]=a):r==="style"?n[r]={...a,...o}:r==="className"&&(n[r]=[a,o].filter(Boolean).join(" "))}return{...e,...n}}function Nm(e){const t=e+"CollectionProvider",[n,r]=zn(t),[a,o]=n(t,{collectionRef:{current:null},itemMap:new Map}),i=m=>{const{scope:b,children:y}=m,w=Ae.useRef(null),v=Ae.useRef(new Map).current;return Ae.createElement(a,{scope:b,itemMap:v,collectionRef:w},y)},s=e+"CollectionSlot",l=Ae.forwardRef((m,b)=>{const{scope:y,children:w}=m,v=o(s,y),h=nt(b,v.collectionRef);return Ae.createElement($a,{ref:h},w)}),c=e+"CollectionItemSlot",u="data-radix-collection-item",d=Ae.forwardRef((m,b)=>{const{scope:y,children:w,...v}=m,h=Ae.useRef(null),S=nt(b,h),E=o(c,y);return Ae.useEffect(()=>(E.itemMap.set(h,{ref:h,...v}),()=>void E.itemMap.delete(h))),Ae.createElement($a,{[u]:"",ref:S},w)});function g(m){const b=o(e+"CollectionConsumer",m);return Ae.useCallback(()=>{const w=b.collectionRef.current;if(!w)return[];const v=Array.from(w.querySelectorAll(`[${u}]`));return Array.from(b.itemMap.values()).sort((E,k)=>v.indexOf(E.ref.current)-v.indexOf(k.ref.current))},[b.collectionRef,b.itemMap])}return[{Provider:i,Slot:l,ItemSlot:d},g,r]}const OV=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","span","svg","ul"],ze=OV.reduce((e,t)=>{const n=p.forwardRef((r,a)=>{const{asChild:o,...i}=r,s=o?$a:t;return p.useEffect(()=>{window[Symbol.for("radix-ui")]=!0},[]),p.createElement(s,W({},i,{ref:a}))});return n.displayName=`Primitive.${t}`,{...e,[t]:n}},{});function WC(e,t){e&&ba.flushSync(()=>e.dispatchEvent(t))}function ur(e){const t=p.useRef(e);return p.useEffect(()=>{t.current=e}),p.useMemo(()=>(...n)=>{var r;return(r=t.current)===null||r===void 0?void 0:r.call(t,...n)},[])}function DV(e,t=globalThis==null?void 0:globalThis.document){const n=ur(e);p.useEffect(()=>{const r=a=>{a.key==="Escape"&&n(a)};return t.addEventListener("keydown",r),()=>t.removeEventListener("keydown",r)},[n,t])}const w1="dismissableLayer.update",LV="dismissableLayer.pointerDownOutside",MV="dismissableLayer.focusOutside";let gR;const D4=p.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),Ls=p.forwardRef((e,t)=>{var n;const{disableOutsidePointerEvents:r=!1,onEscapeKeyDown:a,onPointerDownOutside:o,onFocusOutside:i,onInteractOutside:s,onDismiss:l,...c}=e,u=p.useContext(D4),[d,g]=p.useState(null),m=(n=d==null?void 0:d.ownerDocument)!==null&&n!==void 0?n:globalThis==null?void 0:globalThis.document,[,b]=p.useState({}),y=nt(t,_=>g(_)),w=Array.from(u.layers),[v]=[...u.layersWithOutsidePointerEventsDisabled].slice(-1),h=w.indexOf(v),S=d?w.indexOf(d):-1,E=u.layersWithOutsidePointerEventsDisabled.size>0,k=S>=h,x=$V(_=>{const R=_.target,T=[...u.branches].some(L=>L.contains(R));!k||T||(o==null||o(_),s==null||s(_),_.defaultPrevented||l==null||l())},m),C=FV(_=>{const R=_.target;[...u.branches].some(L=>L.contains(R))||(i==null||i(_),s==null||s(_),_.defaultPrevented||l==null||l())},m);return DV(_=>{S===u.layers.size-1&&(a==null||a(_),!_.defaultPrevented&&l&&(_.preventDefault(),l()))},m),p.useEffect(()=>{if(d)return r&&(u.layersWithOutsidePointerEventsDisabled.size===0&&(gR=m.body.style.pointerEvents,m.body.style.pointerEvents="none"),u.layersWithOutsidePointerEventsDisabled.add(d)),u.layers.add(d),mR(),()=>{r&&u.layersWithOutsidePointerEventsDisabled.size===1&&(m.body.style.pointerEvents=gR)}},[d,m,r,u]),p.useEffect(()=>()=>{d&&(u.layers.delete(d),u.layersWithOutsidePointerEventsDisabled.delete(d),mR())},[d,u]),p.useEffect(()=>{const _=()=>b({});return document.addEventListener(w1,_),()=>document.removeEventListener(w1,_)},[]),p.createElement(ze.div,W({},c,{ref:y,style:{pointerEvents:E?k?"auto":"none":void 0,...e.style},onFocusCapture:fe(e.onFocusCapture,C.onFocusCapture),onBlurCapture:fe(e.onBlurCapture,C.onBlurCapture),onPointerDownCapture:fe(e.onPointerDownCapture,x.onPointerDownCapture)}))}),PV=p.forwardRef((e,t)=>{const n=p.useContext(D4),r=p.useRef(null),a=nt(t,r);return p.useEffect(()=>{const o=r.current;if(o)return n.branches.add(o),()=>{n.branches.delete(o)}},[n.branches]),p.createElement(ze.div,W({},e,{ref:a}))});function $V(e,t=globalThis==null?void 0:globalThis.document){const n=ur(e),r=p.useRef(!1),a=p.useRef(()=>{});return p.useEffect(()=>{const o=s=>{if(s.target&&!r.current){let u=function(){L4(LV,n,c,{discrete:!0})};var l=u;const c={originalEvent:s};s.pointerType==="touch"?(t.removeEventListener("click",a.current),a.current=u,t.addEventListener("click",a.current,{once:!0})):u()}else t.removeEventListener("click",a.current);r.current=!1},i=window.setTimeout(()=>{t.addEventListener("pointerdown",o)},0);return()=>{window.clearTimeout(i),t.removeEventListener("pointerdown",o),t.removeEventListener("click",a.current)}},[t,n]),{onPointerDownCapture:()=>r.current=!0}}function FV(e,t=globalThis==null?void 0:globalThis.document){const n=ur(e),r=p.useRef(!1);return p.useEffect(()=>{const a=o=>{o.target&&!r.current&&L4(MV,n,{originalEvent:o},{discrete:!1})};return t.addEventListener("focusin",a),()=>t.removeEventListener("focusin",a)},[t,n]),{onFocusCapture:()=>r.current=!0,onBlurCapture:()=>r.current=!1}}function mR(){const e=new CustomEvent(w1);document.dispatchEvent(e)}function L4(e,t,n,{discrete:r}){const a=n.originalEvent.target,o=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&a.addEventListener(e,t,{once:!0}),r?WC(a,o):a.dispatchEvent(o)}const jV=Ls,zV=PV,Jd=p.forwardRef((e,t)=>{var n;const{container:r=globalThis==null||(n=globalThis.document)===null||n===void 0?void 0:n.body,...a}=e;return r?qC.createPortal(p.createElement(ze.div,W({},a,{ref:t})),r):null}),Zr=globalThis!=null&&globalThis.document?p.useLayoutEffect:()=>{};function UV(e,t){return p.useReducer((n,r)=>{const a=t[n][r];return a??n},e)}const pr=e=>{const{present:t,children:n}=e,r=BV(t),a=typeof n=="function"?n({present:r.isPresent}):p.Children.only(n),o=nt(r.ref,a.ref);return typeof n=="function"||r.isPresent?p.cloneElement(a,{ref:o}):null};pr.displayName="Presence";function BV(e){const[t,n]=p.useState(),r=p.useRef({}),a=p.useRef(e),o=p.useRef("none"),i=e?"mounted":"unmounted",[s,l]=UV(i,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return p.useEffect(()=>{const c=Gf(r.current);o.current=s==="mounted"?c:"none"},[s]),Zr(()=>{const c=r.current,u=a.current;if(u!==e){const g=o.current,m=Gf(c);e?l("MOUNT"):m==="none"||(c==null?void 0:c.display)==="none"?l("UNMOUNT"):l(u&&g!==m?"ANIMATION_OUT":"UNMOUNT"),a.current=e}},[e,l]),Zr(()=>{if(t){const c=d=>{const m=Gf(r.current).includes(d.animationName);d.target===t&&m&&ba.flushSync(()=>l("ANIMATION_END"))},u=d=>{d.target===t&&(o.current=Gf(r.current))};return t.addEventListener("animationstart",u),t.addEventListener("animationcancel",c),t.addEventListener("animationend",c),()=>{t.removeEventListener("animationstart",u),t.removeEventListener("animationcancel",c),t.removeEventListener("animationend",c)}}else l("ANIMATION_END")},[t,l]),{isPresent:["mounted","unmountSuspended"].includes(s),ref:p.useCallback(c=>{c&&(r.current=getComputedStyle(c)),n(c)},[])}}function Gf(e){return(e==null?void 0:e.animationName)||"none"}function Fa({prop:e,defaultProp:t,onChange:n=()=>{}}){const[r,a]=HV({defaultProp:t,onChange:n}),o=e!==void 0,i=o?e:r,s=ur(n),l=p.useCallback(c=>{if(o){const d=typeof c=="function"?c(e):c;d!==e&&s(d)}else a(c)},[o,e,a,s]);return[i,l]}function HV({defaultProp:e,onChange:t}){const n=p.useState(e),[r]=n,a=p.useRef(r),o=ur(t);return p.useEffect(()=>{a.current!==r&&(o(r),a.current=r)},[r,a,o]),n}const Im=p.forwardRef((e,t)=>p.createElement(ze.span,W({},e,{ref:t,style:{position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal",...e.style}}))),VV=Im,M4="ToastProvider",[KC,qV,GV]=Nm("Toast"),[P4,QAe]=zn("Toast",[GV]),[WV,Om]=P4(M4),$4=e=>{const{__scopeToast:t,label:n="Notification",duration:r=5e3,swipeDirection:a="right",swipeThreshold:o=50,children:i}=e,[s,l]=p.useState(null),[c,u]=p.useState(0),d=p.useRef(!1),g=p.useRef(!1);return p.createElement(KC.Provider,{scope:t},p.createElement(WV,{scope:t,label:n,duration:r,swipeDirection:a,swipeThreshold:o,toastCount:c,viewport:s,onViewportChange:l,onToastAdd:p.useCallback(()=>u(m=>m+1),[]),onToastRemove:p.useCallback(()=>u(m=>m-1),[]),isFocusedToastEscapeKeyDownRef:d,isClosePausedRef:g},i))};$4.propTypes={label(e){if(e.label&&typeof e.label=="string"&&!e.label.trim()){const t=`Invalid prop \`label\` supplied to \`${M4}\`. Expected non-empty \`string\`.`;return new Error(t)}return null}};const KV="ToastViewport",YV=["F8"],E1="toast.viewportPause",x1="toast.viewportResume",ZV=p.forwardRef((e,t)=>{const{__scopeToast:n,hotkey:r=YV,label:a="Notifications ({hotkey})",...o}=e,i=Om(KV,n),s=qV(n),l=p.useRef(null),c=p.useRef(null),u=p.useRef(null),d=p.useRef(null),g=nt(t,d,i.onViewportChange),m=r.join("+").replace(/Key/g,"").replace(/Digit/g,""),b=i.toastCount>0;p.useEffect(()=>{const w=v=>{var h;r.every(E=>v[E]||v.code===E)&&((h=d.current)===null||h===void 0||h.focus())};return document.addEventListener("keydown",w),()=>document.removeEventListener("keydown",w)},[r]),p.useEffect(()=>{const w=l.current,v=d.current;if(b&&w&&v){const h=()=>{if(!i.isClosePausedRef.current){const x=new CustomEvent(E1);v.dispatchEvent(x),i.isClosePausedRef.current=!0}},S=()=>{if(i.isClosePausedRef.current){const x=new CustomEvent(x1);v.dispatchEvent(x),i.isClosePausedRef.current=!1}},E=x=>{!w.contains(x.relatedTarget)&&S()},k=()=>{w.contains(document.activeElement)||S()};return w.addEventListener("focusin",h),w.addEventListener("focusout",E),w.addEventListener("pointermove",h),w.addEventListener("pointerleave",k),window.addEventListener("blur",h),window.addEventListener("focus",S),()=>{w.removeEventListener("focusin",h),w.removeEventListener("focusout",E),w.removeEventListener("pointermove",h),w.removeEventListener("pointerleave",k),window.removeEventListener("blur",h),window.removeEventListener("focus",S)}}},[b,i.isClosePausedRef]);const y=p.useCallback(({tabbingDirection:w})=>{const h=s().map(S=>{const E=S.ref.current,k=[E,...fq(E)];return w==="forwards"?k:k.reverse()});return(w==="forwards"?h.reverse():h).flat()},[s]);return p.useEffect(()=>{const w=d.current;if(w){const v=h=>{const S=h.altKey||h.ctrlKey||h.metaKey;if(h.key==="Tab"&&!S){const _=document.activeElement,R=h.shiftKey;if(h.target===w&&R){var k;(k=c.current)===null||k===void 0||k.focus();return}const D=y({tabbingDirection:R?"backwards":"forwards"}),H=D.findIndex(z=>z===_);if(bb(D.slice(H+1)))h.preventDefault();else{var x,C;R?(x=c.current)===null||x===void 0||x.focus():(C=u.current)===null||C===void 0||C.focus()}}};return w.addEventListener("keydown",v),()=>w.removeEventListener("keydown",v)}},[s,y]),p.createElement(zV,{ref:l,role:"region","aria-label":a.replace("{hotkey}",m),tabIndex:-1,style:{pointerEvents:b?void 0:"none"}},b&&p.createElement(hR,{ref:c,onFocusFromOutsideViewport:()=>{const w=y({tabbingDirection:"forwards"});bb(w)}}),p.createElement(KC.Slot,{scope:n},p.createElement(ze.ol,W({tabIndex:-1},o,{ref:g}))),b&&p.createElement(hR,{ref:u,onFocusFromOutsideViewport:()=>{const w=y({tabbingDirection:"backwards"});bb(w)}}))}),XV="ToastFocusProxy",hR=p.forwardRef((e,t)=>{const{__scopeToast:n,onFocusFromOutsideViewport:r,...a}=e,o=Om(XV,n);return p.createElement(Im,W({"aria-hidden":!0,tabIndex:0},a,{ref:t,style:{position:"fixed"},onFocus:i=>{var s;const l=i.relatedTarget;!((s=o.viewport)!==null&&s!==void 0&&s.contains(l))&&r()}}))}),Dm="Toast",QV="toast.swipeStart",JV="toast.swipeMove",eq="toast.swipeCancel",tq="toast.swipeEnd",nq=p.forwardRef((e,t)=>{const{forceMount:n,open:r,defaultOpen:a,onOpenChange:o,...i}=e,[s=!0,l]=Fa({prop:r,defaultProp:a,onChange:o});return p.createElement(pr,{present:n||s},p.createElement(F4,W({open:s},i,{ref:t,onClose:()=>l(!1),onPause:ur(e.onPause),onResume:ur(e.onResume),onSwipeStart:fe(e.onSwipeStart,c=>{c.currentTarget.setAttribute("data-swipe","start")}),onSwipeMove:fe(e.onSwipeMove,c=>{const{x:u,y:d}=c.detail.delta;c.currentTarget.setAttribute("data-swipe","move"),c.currentTarget.style.setProperty("--radix-toast-swipe-move-x",`${u}px`),c.currentTarget.style.setProperty("--radix-toast-swipe-move-y",`${d}px`)}),onSwipeCancel:fe(e.onSwipeCancel,c=>{c.currentTarget.setAttribute("data-swipe","cancel"),c.currentTarget.style.removeProperty("--radix-toast-swipe-move-x"),c.currentTarget.style.removeProperty("--radix-toast-swipe-move-y"),c.currentTarget.style.removeProperty("--radix-toast-swipe-end-x"),c.currentTarget.style.removeProperty("--radix-toast-swipe-end-y")}),onSwipeEnd:fe(e.onSwipeEnd,c=>{const{x:u,y:d}=c.detail.delta;c.currentTarget.setAttribute("data-swipe","end"),c.currentTarget.style.removeProperty("--radix-toast-swipe-move-x"),c.currentTarget.style.removeProperty("--radix-toast-swipe-move-y"),c.currentTarget.style.setProperty("--radix-toast-swipe-end-x",`${u}px`),c.currentTarget.style.setProperty("--radix-toast-swipe-end-y",`${d}px`),l(!1)})})))}),[rq,aq]=P4(Dm,{onClose(){}}),F4=p.forwardRef((e,t)=>{const{__scopeToast:n,type:r="foreground",duration:a,open:o,onClose:i,onEscapeKeyDown:s,onPause:l,onResume:c,onSwipeStart:u,onSwipeMove:d,onSwipeCancel:g,onSwipeEnd:m,...b}=e,y=Om(Dm,n),[w,v]=p.useState(null),h=nt(t,z=>v(z)),S=p.useRef(null),E=p.useRef(null),k=a||y.duration,x=p.useRef(0),C=p.useRef(k),_=p.useRef(0),{onToastAdd:R,onToastRemove:T}=y,L=ur(()=>{var z;(w==null?void 0:w.contains(document.activeElement))&&((z=y.viewport)===null||z===void 0||z.focus()),i()}),D=p.useCallback(z=>{!z||z===1/0||(window.clearTimeout(_.current),x.current=new Date().getTime(),_.current=window.setTimeout(L,z))},[L]);p.useEffect(()=>{const z=y.viewport;if(z){const M=()=>{D(C.current),c==null||c()},U=()=>{const X=new Date().getTime()-x.current;C.current=C.current-X,window.clearTimeout(_.current),l==null||l()};return z.addEventListener(E1,U),z.addEventListener(x1,M),()=>{z.removeEventListener(E1,U),z.removeEventListener(x1,M)}}},[y.viewport,k,l,c,D]),p.useEffect(()=>{o&&!y.isClosePausedRef.current&&D(k)},[o,k,y.isClosePausedRef,D]),p.useEffect(()=>(R(),()=>T()),[R,T]);const H=p.useMemo(()=>w?B4(w):null,[w]);return y.viewport?p.createElement(p.Fragment,null,H&&p.createElement(oq,{__scopeToast:n,role:"status","aria-live":r==="foreground"?"assertive":"polite","aria-atomic":!0},H),p.createElement(rq,{scope:n,onClose:L},ba.createPortal(p.createElement(KC.ItemSlot,{scope:n},p.createElement(jV,{asChild:!0,onEscapeKeyDown:fe(s,()=>{y.isFocusedToastEscapeKeyDownRef.current||L(),y.isFocusedToastEscapeKeyDownRef.current=!1})},p.createElement(ze.li,W({role:"status","aria-live":"off","aria-atomic":!0,tabIndex:0,"data-state":o?"open":"closed","data-swipe-direction":y.swipeDirection},b,{ref:h,style:{userSelect:"none",touchAction:"none",...e.style},onKeyDown:fe(e.onKeyDown,z=>{z.key==="Escape"&&(s==null||s(z.nativeEvent),z.nativeEvent.defaultPrevented||(y.isFocusedToastEscapeKeyDownRef.current=!0,L()))}),onPointerDown:fe(e.onPointerDown,z=>{z.button===0&&(S.current={x:z.clientX,y:z.clientY})}),onPointerMove:fe(e.onPointerMove,z=>{if(!S.current)return;const M=z.clientX-S.current.x,U=z.clientY-S.current.y,X=!!E.current,j=["left","right"].includes(y.swipeDirection),O=["left","up"].includes(y.swipeDirection)?Math.min:Math.max,A=j?O(0,M):0,V=j?0:O(0,U),P=z.pointerType==="touch"?10:2,N={x:A,y:V},K={originalEvent:z,delta:N};X?(E.current=N,Wf(JV,d,K,{discrete:!1})):bR(N,y.swipeDirection,P)?(E.current=N,Wf(QV,u,K,{discrete:!1}),z.target.setPointerCapture(z.pointerId)):(Math.abs(M)>P||Math.abs(U)>P)&&(S.current=null)}),onPointerUp:fe(e.onPointerUp,z=>{const M=E.current,U=z.target;if(U.hasPointerCapture(z.pointerId)&&U.releasePointerCapture(z.pointerId),E.current=null,S.current=null,M){const X=z.currentTarget,j={originalEvent:z,delta:M};bR(M,y.swipeDirection,y.swipeThreshold)?Wf(tq,m,j,{discrete:!0}):Wf(eq,g,j,{discrete:!0}),X.addEventListener("click",O=>O.preventDefault(),{once:!0})}})})))),y.viewport))):null});F4.propTypes={type(e){if(e.type&&!["foreground","background"].includes(e.type)){const t=`Invalid prop \`type\` supplied to \`${Dm}\`. Expected \`foreground | background\`.`;return new Error(t)}return null}};const oq=e=>{const{__scopeToast:t,children:n,...r}=e,a=Om(Dm,t),[o,i]=p.useState(!1),[s,l]=p.useState(!1);return uq(()=>i(!0)),p.useEffect(()=>{const c=window.setTimeout(()=>l(!0),1e3);return()=>window.clearTimeout(c)},[]),s?null:p.createElement(Jd,{asChild:!0},p.createElement(Im,r,o&&p.createElement(p.Fragment,null,a.label," ",n)))},iq=p.forwardRef((e,t)=>{const{__scopeToast:n,...r}=e;return p.createElement(ze.div,W({},r,{ref:t}))}),sq=p.forwardRef((e,t)=>{const{__scopeToast:n,...r}=e;return p.createElement(ze.div,W({},r,{ref:t}))}),lq="ToastAction",j4=p.forwardRef((e,t)=>{const{altText:n,...r}=e;return n?p.createElement(U4,{altText:n,asChild:!0},p.createElement(z4,W({},r,{ref:t}))):null});j4.propTypes={altText(e){return e.altText?null:new Error(`Missing prop \`altText\` expected on \`${lq}\``)}};const cq="ToastClose",z4=p.forwardRef((e,t)=>{const{__scopeToast:n,...r}=e,a=aq(cq,n);return p.createElement(U4,{asChild:!0},p.createElement(ze.button,W({type:"button"},r,{ref:t,onClick:fe(e.onClick,a.onClose)})))}),U4=p.forwardRef((e,t)=>{const{__scopeToast:n,altText:r,...a}=e;return p.createElement(ze.div,W({"data-radix-toast-announce-exclude":"","data-radix-toast-announce-alt":r||void 0},a,{ref:t}))});function B4(e){const t=[];return Array.from(e.childNodes).forEach(r=>{if(r.nodeType===r.TEXT_NODE&&r.textContent&&t.push(r.textContent),dq(r)){const a=r.ariaHidden||r.hidden||r.style.display==="none",o=r.dataset.radixToastAnnounceExclude==="";if(!a)if(o){const i=r.dataset.radixToastAnnounceAlt;i&&t.push(i)}else t.push(...B4(r))}}),t}function Wf(e,t,n,{discrete:r}){const a=n.originalEvent.currentTarget,o=new CustomEvent(e,{bubbles:!0,cancelable:!0,detail:n});t&&a.addEventListener(e,t,{once:!0}),r?WC(a,o):a.dispatchEvent(o)}const bR=(e,t,n=0)=>{const r=Math.abs(e.x),a=Math.abs(e.y),o=r>a;return t==="left"||t==="right"?o&&r>n:!o&&a>n};function uq(e=()=>{}){const t=ur(e);Zr(()=>{let n=0,r=0;return n=window.requestAnimationFrame(()=>r=window.requestAnimationFrame(t)),()=>{window.cancelAnimationFrame(n),window.cancelAnimationFrame(r)}},[t])}function dq(e){return e.nodeType===e.ELEMENT_NODE}function fq(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>{const a=r.tagName==="INPUT"&&r.type==="hidden";return r.disabled||r.hidden||a?NodeFilter.FILTER_SKIP:r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function bb(e){const t=document.activeElement;return e.some(n=>n===t?!0:(n.focus(),document.activeElement!==t))}const pq=$4,H4=ZV,V4=nq,q4=iq,G4=sq,W4=j4,K4=z4;function Y4(e){var t,n,r="";if(typeof e=="string"||typeof e=="number")r+=e;else if(typeof e=="object")if(Array.isArray(e))for(t=0;ttypeof e=="boolean"?"".concat(e):e===0?"0":e,vR=Z4,ef=(e,t)=>n=>{var r;if((t==null?void 0:t.variants)==null)return vR(e,n==null?void 0:n.class,n==null?void 0:n.className);const{variants:a,defaultVariants:o}=t,i=Object.keys(a).map(c=>{const u=n==null?void 0:n[c],d=o==null?void 0:o[c];if(u===null)return null;const g=yR(u)||yR(d);return a[c][g]}),s=n&&Object.entries(n).reduce((c,u)=>{let[d,g]=u;return g===void 0||(c[d]=g),c},{}),l=t==null||(r=t.compoundVariants)===null||r===void 0?void 0:r.reduce((c,u)=>{let{class:d,className:g,...m}=u;return Object.entries(m).every(b=>{let[y,w]=b;return Array.isArray(w)?w.includes({...o,...s}[y]):{...o,...s}[y]===w})?[...c,d,g]:c},[]);return vR(e,i,l,n==null?void 0:n.class,n==null?void 0:n.className)};var gq={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};const mq=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),Be=(e,t)=>{const n=p.forwardRef(({color:r="currentColor",size:a=24,strokeWidth:o=2,absoluteStrokeWidth:i,children:s,...l},c)=>p.createElement("svg",{ref:c,...gq,width:a,height:a,stroke:r,strokeWidth:i?Number(o)*24/Number(a):o,className:`lucide lucide-${mq(e)}`,...l},[...t.map(([u,d])=>p.createElement(u,d)),...(Array.isArray(s)?s:[s])||[]]));return n.displayName=`${e}`,n},hq=Be("AlertCircle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]]),bq=Be("Archive",[["rect",{width:"20",height:"5",x:"2",y:"3",rx:"1",key:"1wp1u1"}],["path",{d:"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8",key:"1s80jp"}],["path",{d:"M10 12h4",key:"a56b0p"}]]),yq=Be("ArrowDownWideNarrow",[["path",{d:"m3 16 4 4 4-4",key:"1co6wj"}],["path",{d:"M7 20V4",key:"1yoxec"}],["path",{d:"M11 4h10",key:"1w87gc"}],["path",{d:"M11 8h7",key:"djye34"}],["path",{d:"M11 12h4",key:"q8tih4"}]]),Lm=Be("Bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]]),vq=Be("CalendarSearch",[["path",{d:"M21 12V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14c0 1.1.9 2 2 2h7.5",key:"18ncp8"}],["path",{d:"M16 2v4",key:"4m81vk"}],["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M3 10h18",key:"8toen8"}],["path",{d:"M18 21a3 3 0 1 0 0-6 3 3 0 0 0 0 6v0Z",key:"mgbru4"}],["path",{d:"m22 22-1.5-1.5",key:"1x83k4"}]]),Mm=Be("CheckCheck",[["path",{d:"M18 6 7 17l-5-5",key:"116fxf"}],["path",{d:"m22 10-7.5 7.5L13 16",key:"ke71qq"}]]),Pm=Be("Check",[["polyline",{points:"20 6 9 17 4 12",key:"10jjfj"}]]),YC=Be("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]),Sq=Be("ChevronLeft",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]),$m=Be("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]),wq=Be("ChevronUp",[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]),X4=Be("Circle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]),Eq=Be("Cog",[["path",{d:"M12 20a8 8 0 1 0 0-16 8 8 0 0 0 0 16Z",key:"sobvz5"}],["path",{d:"M12 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z",key:"11i496"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 22v-2",key:"1osdcq"}],["path",{d:"m17 20.66-1-1.73",key:"eq3orb"}],["path",{d:"M11 10.27 7 3.34",key:"16pf9h"}],["path",{d:"m20.66 17-1.73-1",key:"sg0v6f"}],["path",{d:"m3.34 7 1.73 1",key:"1ulond"}],["path",{d:"M14 12h8",key:"4f43i9"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"m20.66 7-1.73 1",key:"1ow05n"}],["path",{d:"m3.34 17 1.73-1",key:"nuk764"}],["path",{d:"m17 3.34-1 1.73",key:"2wel8s"}],["path",{d:"m11 13.73-4 6.93",key:"794ttg"}]]),xq=Be("Copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]),kq=Be("Dna",[["path",{d:"M2 15c6.667-6 13.333 0 20-6",key:"1pyr53"}],["path",{d:"M9 22c1.798-1.998 2.518-3.995 2.807-5.993",key:"q3hbxp"}],["path",{d:"M15 2c-1.798 1.998-2.518 3.995-2.807 5.993",key:"80uv8i"}],["path",{d:"m17 6-2.5-2.5",key:"5cdfhj"}],["path",{d:"m14 8-1-1",key:"15nbz5"}],["path",{d:"m7 18 2.5 2.5",key:"16tu1a"}],["path",{d:"m3.5 14.5.5.5",key:"hapbhd"}],["path",{d:"m20 9 .5.5",key:"1n7z02"}],["path",{d:"m6.5 12.5 1 1",key:"cs35ky"}],["path",{d:"m16.5 10.5 1 1",key:"696xn5"}],["path",{d:"m10 16 1.5 1.5",key:"11lckj"}]]),Cq=Be("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]]),_q=Be("Folder",[["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}]]),Aq=Be("GripVertical",[["circle",{cx:"9",cy:"12",r:"1",key:"1vctgf"}],["circle",{cx:"9",cy:"5",r:"1",key:"hp0tcf"}],["circle",{cx:"9",cy:"19",r:"1",key:"fkjjf6"}],["circle",{cx:"15",cy:"12",r:"1",key:"1tmaij"}],["circle",{cx:"15",cy:"5",r:"1",key:"19l28e"}],["circle",{cx:"15",cy:"19",r:"1",key:"f4zoj3"}]]),Tq=Be("HeartOff",[["line",{x1:"2",y1:"2",x2:"22",y2:"22",key:"1w4vcy"}],["path",{d:"M16.5 16.5 12 21l-7-7c-1.5-1.45-3-3.2-3-5.5a5.5 5.5 0 0 1 2.14-4.35",key:"3mpagl"}],["path",{d:"M8.76 3.1c1.15.22 2.13.78 3.24 1.9 1.5-1.5 2.74-2 4.5-2A5.5 5.5 0 0 1 22 8.5c0 2.12-1.3 3.78-2.67 5.17",key:"1gh3v3"}]]),Rq=Be("IceCream",[["path",{d:"m7 11 4.08 10.35a1 1 0 0 0 1.84 0L17 11",key:"1v6356"}],["path",{d:"M17 7A5 5 0 0 0 7 7",key:"151p3v"}],["path",{d:"M17 7a2 2 0 0 1 0 4H7a2 2 0 0 1 0-4",key:"1sdaij"}]]),Nq=Be("Info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]]),un=Be("Loader2",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]),SR=Be("LogOut",[["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}],["polyline",{points:"16 17 21 12 16 7",key:"1gabdz"}],["line",{x1:"21",x2:"9",y1:"12",y2:"12",key:"1uyos4"}]]),Iq=Be("MinusCircle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M8 12h8",key:"1wcyev"}]]),wR=Be("MoonStar",[["path",{d:"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z",key:"a7tn18"}],["path",{d:"M19 3v4",key:"vgv24u"}],["path",{d:"M21 5h-4",key:"1wcg1f"}]]),Oq=Be("PackageSearch",[["path",{d:"M21 10V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l2-1.14",key:"e7tb2h"}],["path",{d:"m7.5 4.27 9 5.15",key:"1c824w"}],["polyline",{points:"3.29 7 12 12 20.71 7",key:"ousv84"}],["line",{x1:"12",x2:"12",y1:"22",y2:"12",key:"a4e8g8"}],["circle",{cx:"18.5",cy:"15.5",r:"2.5",key:"b5zd12"}],["path",{d:"M20.27 17.27 22 19",key:"1l4muz"}]]),Fm=Be("PenSquare",[["path",{d:"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7",key:"1qinfi"}],["path",{d:"M18.5 2.5a2.12 2.12 0 0 1 3 3L12 15l-4 1 1-4Z",key:"w2jsv5"}]]),Q4=Be("Pen",[["path",{d:"M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z",key:"5qss01"}]]),ZC=Be("Pencil",[["path",{d:"M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z",key:"5qss01"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]]),Dq=Be("PlusCircle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M8 12h8",key:"1wcyev"}],["path",{d:"M12 8v8",key:"napkw2"}]]),ya=Be("Plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]),Lq=Be("RefreshCcw",[["path",{d:"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"14sxne"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16",key:"1hlbsb"}],["path",{d:"M16 16h5v5",key:"ccwih5"}]]),Mq=Be("Repeat",[["path",{d:"m17 2 4 4-4 4",key:"nntrym"}],["path",{d:"M3 11v-1a4 4 0 0 1 4-4h14",key:"84bu3i"}],["path",{d:"m7 22-4-4 4-4",key:"1wqhfi"}],["path",{d:"M21 13v1a4 4 0 0 1-4 4H3",key:"1rx37r"}]]),Ms=Be("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]),Pq=Be("SendHorizontal",[["path",{d:"m3 3 3 9-3 9 19-9Z",key:"1aobqy"}],["path",{d:"M6 12h16",key:"s4cdu5"}]]),$q=Be("Send",[["path",{d:"m22 2-7 20-4-9-9-4Z",key:"1q3vgg"}],["path",{d:"M22 2 11 13",key:"nzbqef"}]]),Fq=Be("Settings",[["path",{d:"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z",key:"1qme2f"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]),jq=Be("Smile",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M8 14s1.5 2 4 2 4-2 4-2",key:"1y1vjs"}],["line",{x1:"9",x2:"9.01",y1:"9",y2:"9",key:"yxxnd0"}],["line",{x1:"15",x2:"15.01",y1:"9",y2:"9",key:"1p4y9e"}]]),ER=Be("Sun",[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]]),J4=Be("Upload",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"17 8 12 3 7 8",key:"t8dd8p"}],["line",{x1:"12",x2:"12",y1:"3",y2:"15",key:"widbto"}]]),XC=Be("User",[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]]),Di=Be("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),zq=Be("Zap",[["polygon",{points:"13 2 3 14 12 14 11 22 21 10 12 10 13 2",key:"45s27k"}]]),QC="-";function Uq(e){const t=Hq(e),{conflictingClassGroups:n,conflictingClassGroupModifiers:r}=e;function a(i){const s=i.split(QC);return s[0]===""&&s.length!==1&&s.shift(),eF(s,t)||Bq(i)}function o(i,s){const l=n[i]||[];return s&&r[i]?[...l,...r[i]]:l}return{getClassGroupId:a,getConflictingClassGroupIds:o}}function eF(e,t){var i;if(e.length===0)return t.classGroupId;const n=e[0],r=t.nextPart.get(n),a=r?eF(e.slice(1),r):void 0;if(a)return a;if(t.validators.length===0)return;const o=e.join(QC);return(i=t.validators.find(({validator:s})=>s(o)))==null?void 0:i.classGroupId}const xR=/^\[(.+)\]$/;function Bq(e){if(xR.test(e)){const t=xR.exec(e)[1],n=t==null?void 0:t.substring(0,t.indexOf(":"));if(n)return"arbitrary.."+n}}function Hq(e){const{theme:t,prefix:n}=e,r={nextPart:new Map,validators:[]};return qq(Object.entries(e.classGroups),n).forEach(([o,i])=>{k1(i,r,o,t)}),r}function k1(e,t,n,r){e.forEach(a=>{if(typeof a=="string"){const o=a===""?t:kR(t,a);o.classGroupId=n;return}if(typeof a=="function"){if(Vq(a)){k1(a(r),t,n,r);return}t.validators.push({validator:a,classGroupId:n});return}Object.entries(a).forEach(([o,i])=>{k1(i,kR(t,o),n,r)})})}function kR(e,t){let n=e;return t.split(QC).forEach(r=>{n.nextPart.has(r)||n.nextPart.set(r,{nextPart:new Map,validators:[]}),n=n.nextPart.get(r)}),n}function Vq(e){return e.isThemeGetter}function qq(e,t){return t?e.map(([n,r])=>{const a=r.map(o=>typeof o=="string"?t+o:typeof o=="object"?Object.fromEntries(Object.entries(o).map(([i,s])=>[t+i,s])):o);return[n,a]}):e}function Gq(e){if(e<1)return{get:()=>{},set:()=>{}};let t=0,n=new Map,r=new Map;function a(o,i){n.set(o,i),t++,t>e&&(t=0,r=n,n=new Map)}return{get(o){let i=n.get(o);if(i!==void 0)return i;if((i=r.get(o))!==void 0)return a(o,i),i},set(o,i){n.has(o)?n.set(o,i):a(o,i)}}}const tF="!";function Wq(e){const t=e.separator,n=t.length===1,r=t[0],a=t.length;return function(i){const s=[];let l=0,c=0,u;for(let y=0;yc?u-c:void 0;return{modifiers:s,hasImportantModifier:g,baseClassName:m,maybePostfixModifierPosition:b}}}function Kq(e){if(e.length<=1)return e;const t=[];let n=[];return e.forEach(r=>{r[0]==="["?(t.push(...n.sort(),r),n=[]):n.push(r)}),t.push(...n.sort()),t}function Yq(e){return{cache:Gq(e.cacheSize),splitModifiers:Wq(e),...Uq(e)}}const Zq=/\s+/;function Xq(e,t){const{splitModifiers:n,getClassGroupId:r,getConflictingClassGroupIds:a}=t,o=new Set;return e.trim().split(Zq).map(i=>{const{modifiers:s,hasImportantModifier:l,baseClassName:c,maybePostfixModifierPosition:u}=n(i);let d=r(u?c.substring(0,u):c),g=!!u;if(!d){if(!u)return{isTailwindClass:!1,originalClassName:i};if(d=r(c),!d)return{isTailwindClass:!1,originalClassName:i};g=!1}const m=Kq(s).join(":");return{isTailwindClass:!0,modifierId:l?m+tF:m,classGroupId:d,originalClassName:i,hasPostfixModifier:g}}).reverse().filter(i=>{if(!i.isTailwindClass)return!0;const{modifierId:s,classGroupId:l,hasPostfixModifier:c}=i,u=s+l;return o.has(u)?!1:(o.add(u),a(l,c).forEach(d=>o.add(s+d)),!0)}).reverse().map(i=>i.originalClassName).join(" ")}function Qq(){let e=0,t,n,r="";for(;ed(u),e());return n=Yq(c),r=n.cache.get,a=n.cache.set,o=s,s(l)}function s(l){const c=r(l);if(c)return c;const u=Xq(l,n);return a(l,u),u}return function(){return o(Qq.apply(null,arguments))}}function Rt(e){const t=n=>n[e]||[];return t.isThemeGetter=!0,t}const rF=/^\[(?:([a-z-]+):)?(.+)\]$/i,eG=/^\d+\/\d+$/,tG=new Set(["px","full","screen"]),nG=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,rG=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,aG=/^-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,oG=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/;function oa(e){return ns(e)||tG.has(e)||eG.test(e)}function Do(e){return Oc(e,"length",pG)}function ns(e){return!!e&&!Number.isNaN(Number(e))}function Kf(e){return Oc(e,"number",ns)}function tu(e){return!!e&&Number.isInteger(Number(e))}function iG(e){return e.endsWith("%")&&ns(e.slice(0,-1))}function Ke(e){return rF.test(e)}function Lo(e){return nG.test(e)}const sG=new Set(["length","size","percentage"]);function lG(e){return Oc(e,sG,aF)}function cG(e){return Oc(e,"position",aF)}const uG=new Set(["image","url"]);function dG(e){return Oc(e,uG,mG)}function fG(e){return Oc(e,"",gG)}function nu(){return!0}function Oc(e,t,n){const r=rF.exec(e);return r?r[1]?typeof t=="string"?r[1]===t:t.has(r[1]):n(r[2]):!1}function pG(e){return rG.test(e)}function aF(){return!1}function gG(e){return aG.test(e)}function mG(e){return oG.test(e)}function hG(){const e=Rt("colors"),t=Rt("spacing"),n=Rt("blur"),r=Rt("brightness"),a=Rt("borderColor"),o=Rt("borderRadius"),i=Rt("borderSpacing"),s=Rt("borderWidth"),l=Rt("contrast"),c=Rt("grayscale"),u=Rt("hueRotate"),d=Rt("invert"),g=Rt("gap"),m=Rt("gradientColorStops"),b=Rt("gradientColorStopPositions"),y=Rt("inset"),w=Rt("margin"),v=Rt("opacity"),h=Rt("padding"),S=Rt("saturate"),E=Rt("scale"),k=Rt("sepia"),x=Rt("skew"),C=Rt("space"),_=Rt("translate"),R=()=>["auto","contain","none"],T=()=>["auto","hidden","clip","visible","scroll"],L=()=>["auto",Ke,t],D=()=>[Ke,t],H=()=>["",oa,Do],z=()=>["auto",ns,Ke],M=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],U=()=>["solid","dashed","dotted","double","none"],X=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity","plus-lighter"],j=()=>["start","end","center","between","around","evenly","stretch"],O=()=>["","0",Ke],A=()=>["auto","avoid","all","avoid-page","page","left","right","column"],V=()=>[ns,Kf],P=()=>[ns,Ke];return{cacheSize:500,separator:":",theme:{colors:[nu],spacing:[oa,Do],blur:["none","",Lo,Ke],brightness:V(),borderColor:[e],borderRadius:["none","","full",Lo,Ke],borderSpacing:D(),borderWidth:H(),contrast:V(),grayscale:O(),hueRotate:P(),invert:O(),gap:D(),gradientColorStops:[e],gradientColorStopPositions:[iG,Do],inset:L(),margin:L(),opacity:V(),padding:D(),saturate:V(),scale:V(),sepia:O(),skew:P(),space:D(),translate:D()},classGroups:{aspect:[{aspect:["auto","square","video",Ke]}],container:["container"],columns:[{columns:[Lo]}],"break-after":[{"break-after":A()}],"break-before":[{"break-before":A()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none"]}],clear:[{clear:["left","right","both","none"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...M(),Ke]}],overflow:[{overflow:T()}],"overflow-x":[{"overflow-x":T()}],"overflow-y":[{"overflow-y":T()}],overscroll:[{overscroll:R()}],"overscroll-x":[{"overscroll-x":R()}],"overscroll-y":[{"overscroll-y":R()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[y]}],"inset-x":[{"inset-x":[y]}],"inset-y":[{"inset-y":[y]}],start:[{start:[y]}],end:[{end:[y]}],top:[{top:[y]}],right:[{right:[y]}],bottom:[{bottom:[y]}],left:[{left:[y]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",tu,Ke]}],basis:[{basis:L()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",Ke]}],grow:[{grow:O()}],shrink:[{shrink:O()}],order:[{order:["first","last","none",tu,Ke]}],"grid-cols":[{"grid-cols":[nu]}],"col-start-end":[{col:["auto",{span:["full",tu,Ke]},Ke]}],"col-start":[{"col-start":z()}],"col-end":[{"col-end":z()}],"grid-rows":[{"grid-rows":[nu]}],"row-start-end":[{row:["auto",{span:[tu,Ke]},Ke]}],"row-start":[{"row-start":z()}],"row-end":[{"row-end":z()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",Ke]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",Ke]}],gap:[{gap:[g]}],"gap-x":[{"gap-x":[g]}],"gap-y":[{"gap-y":[g]}],"justify-content":[{justify:["normal",...j()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...j(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...j(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[h]}],px:[{px:[h]}],py:[{py:[h]}],ps:[{ps:[h]}],pe:[{pe:[h]}],pt:[{pt:[h]}],pr:[{pr:[h]}],pb:[{pb:[h]}],pl:[{pl:[h]}],m:[{m:[w]}],mx:[{mx:[w]}],my:[{my:[w]}],ms:[{ms:[w]}],me:[{me:[w]}],mt:[{mt:[w]}],mr:[{mr:[w]}],mb:[{mb:[w]}],ml:[{ml:[w]}],"space-x":[{"space-x":[C]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[C]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit",Ke,t]}],"min-w":[{"min-w":["min","max","fit",Ke,oa]}],"max-w":[{"max-w":["0","none","full","min","max","fit","prose",{screen:[Lo]},Lo,Ke]}],h:[{h:[Ke,t,"auto","min","max","fit"]}],"min-h":[{"min-h":["min","max","fit",oa,Ke]}],"max-h":[{"max-h":[Ke,t,"min","max","fit"]}],"font-size":[{text:["base",Lo,Do]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",Kf]}],"font-family":[{font:[nu]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractons"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",Ke]}],"line-clamp":[{"line-clamp":["none",ns,Kf]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",oa,Ke]}],"list-image":[{"list-image":["none",Ke]}],"list-style-type":[{list:["none","disc","decimal",Ke]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[v]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[v]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...U(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",oa,Do]}],"underline-offset":[{"underline-offset":["auto",oa,Ke]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],indent:[{indent:D()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",Ke]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",Ke]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[v]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...M(),cG]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",lG]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},dG]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[b]}],"gradient-via-pos":[{via:[b]}],"gradient-to-pos":[{to:[b]}],"gradient-from":[{from:[m]}],"gradient-via":[{via:[m]}],"gradient-to":[{to:[m]}],rounded:[{rounded:[o]}],"rounded-s":[{"rounded-s":[o]}],"rounded-e":[{"rounded-e":[o]}],"rounded-t":[{"rounded-t":[o]}],"rounded-r":[{"rounded-r":[o]}],"rounded-b":[{"rounded-b":[o]}],"rounded-l":[{"rounded-l":[o]}],"rounded-ss":[{"rounded-ss":[o]}],"rounded-se":[{"rounded-se":[o]}],"rounded-ee":[{"rounded-ee":[o]}],"rounded-es":[{"rounded-es":[o]}],"rounded-tl":[{"rounded-tl":[o]}],"rounded-tr":[{"rounded-tr":[o]}],"rounded-br":[{"rounded-br":[o]}],"rounded-bl":[{"rounded-bl":[o]}],"border-w":[{border:[s]}],"border-w-x":[{"border-x":[s]}],"border-w-y":[{"border-y":[s]}],"border-w-s":[{"border-s":[s]}],"border-w-e":[{"border-e":[s]}],"border-w-t":[{"border-t":[s]}],"border-w-r":[{"border-r":[s]}],"border-w-b":[{"border-b":[s]}],"border-w-l":[{"border-l":[s]}],"border-opacity":[{"border-opacity":[v]}],"border-style":[{border:[...U(),"hidden"]}],"divide-x":[{"divide-x":[s]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[s]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[v]}],"divide-style":[{divide:U()}],"border-color":[{border:[a]}],"border-color-x":[{"border-x":[a]}],"border-color-y":[{"border-y":[a]}],"border-color-t":[{"border-t":[a]}],"border-color-r":[{"border-r":[a]}],"border-color-b":[{"border-b":[a]}],"border-color-l":[{"border-l":[a]}],"divide-color":[{divide:[a]}],"outline-style":[{outline:["",...U()]}],"outline-offset":[{"outline-offset":[oa,Ke]}],"outline-w":[{outline:[oa,Do]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:H()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[v]}],"ring-offset-w":[{"ring-offset":[oa,Do]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",Lo,fG]}],"shadow-color":[{shadow:[nu]}],opacity:[{opacity:[v]}],"mix-blend":[{"mix-blend":X()}],"bg-blend":[{"bg-blend":X()}],filter:[{filter:["","none"]}],blur:[{blur:[n]}],brightness:[{brightness:[r]}],contrast:[{contrast:[l]}],"drop-shadow":[{"drop-shadow":["","none",Lo,Ke]}],grayscale:[{grayscale:[c]}],"hue-rotate":[{"hue-rotate":[u]}],invert:[{invert:[d]}],saturate:[{saturate:[S]}],sepia:[{sepia:[k]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[n]}],"backdrop-brightness":[{"backdrop-brightness":[r]}],"backdrop-contrast":[{"backdrop-contrast":[l]}],"backdrop-grayscale":[{"backdrop-grayscale":[c]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[u]}],"backdrop-invert":[{"backdrop-invert":[d]}],"backdrop-opacity":[{"backdrop-opacity":[v]}],"backdrop-saturate":[{"backdrop-saturate":[S]}],"backdrop-sepia":[{"backdrop-sepia":[k]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[i]}],"border-spacing-x":[{"border-spacing-x":[i]}],"border-spacing-y":[{"border-spacing-y":[i]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",Ke]}],duration:[{duration:P()}],ease:[{ease:["linear","in","out","in-out",Ke]}],delay:[{delay:P()}],animate:[{animate:["none","spin","ping","pulse","bounce",Ke]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[E]}],"scale-x":[{"scale-x":[E]}],"scale-y":[{"scale-y":[E]}],rotate:[{rotate:[tu,Ke]}],"translate-x":[{"translate-x":[_]}],"translate-y":[{"translate-y":[_]}],"skew-x":[{"skew-x":[x]}],"skew-y":[{"skew-y":[x]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",Ke]}],accent:[{accent:["auto",e]}],appearance:["appearance-none"],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",Ke]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":D()}],"scroll-mx":[{"scroll-mx":D()}],"scroll-my":[{"scroll-my":D()}],"scroll-ms":[{"scroll-ms":D()}],"scroll-me":[{"scroll-me":D()}],"scroll-mt":[{"scroll-mt":D()}],"scroll-mr":[{"scroll-mr":D()}],"scroll-mb":[{"scroll-mb":D()}],"scroll-ml":[{"scroll-ml":D()}],"scroll-p":[{"scroll-p":D()}],"scroll-px":[{"scroll-px":D()}],"scroll-py":[{"scroll-py":D()}],"scroll-ps":[{"scroll-ps":D()}],"scroll-pe":[{"scroll-pe":D()}],"scroll-pt":[{"scroll-pt":D()}],"scroll-pr":[{"scroll-pr":D()}],"scroll-pb":[{"scroll-pb":D()}],"scroll-pl":[{"scroll-pl":D()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",Ke]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[oa,Do,Kf]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}}const bG=Jq(hG);function ee(...e){return bG(Z4(e))}const yG=pq,oF=p.forwardRef(({className:e,...t},n)=>f.jsx(H4,{ref:n,className:ee("fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]",e),...t}));oF.displayName=H4.displayName;const vG=ef("group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full",{variants:{variant:{default:"border bg-background text-foreground",destructive:"destructive group border-destructive bg-destructive text-destructive-foreground"}},defaultVariants:{variant:"default"}}),iF=p.forwardRef(({className:e,variant:t,...n},r)=>f.jsx(V4,{ref:r,className:ee(vG({variant:t}),e),...n}));iF.displayName=V4.displayName;const SG=p.forwardRef(({className:e,...t},n)=>f.jsx(W4,{ref:n,className:ee("inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive",e),...t}));SG.displayName=W4.displayName;const sF=p.forwardRef(({className:e,...t},n)=>f.jsx(K4,{ref:n,className:ee("absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600",e),"toast-close":"",...t,children:f.jsx(Di,{className:"h-4 w-4"})}));sF.displayName=K4.displayName;const lF=p.forwardRef(({className:e,...t},n)=>f.jsx(q4,{ref:n,className:ee("text-sm font-semibold",e),...t}));lF.displayName=q4.displayName;const cF=p.forwardRef(({className:e,...t},n)=>f.jsx(G4,{ref:n,className:ee("text-sm opacity-90",e),...t}));cF.displayName=G4.displayName;const wG=1,EG=1e6;let yb=0;function xG(){return yb=(yb+1)%Number.MAX_VALUE,yb.toString()}const vb=new Map,CR=e=>{if(vb.has(e))return;const t=setTimeout(()=>{vb.delete(e),zu({type:"REMOVE_TOAST",toastId:e})},EG);vb.set(e,t)},kG=(e,t)=>{switch(t.type){case"ADD_TOAST":return{...e,toasts:[t.toast,...e.toasts].slice(0,wG)};case"UPDATE_TOAST":return{...e,toasts:e.toasts.map(n=>n.id===t.toast.id?{...n,...t.toast}:n)};case"DISMISS_TOAST":{const{toastId:n}=t;return n?CR(n):e.toasts.forEach(r=>{CR(r.id)}),{...e,toasts:e.toasts.map(r=>r.id===n||n===void 0?{...r,open:!1}:r)}}case"REMOVE_TOAST":return t.toastId===void 0?{...e,toasts:[]}:{...e,toasts:e.toasts.filter(n=>n.id!==t.toastId)}}},Fp=[];let jp={toasts:[]};function zu(e){jp=kG(jp,e),Fp.forEach(t=>{t(jp)})}function JC({...e}){const t=xG(),n=a=>zu({type:"UPDATE_TOAST",toast:{...a,id:t}}),r=()=>zu({type:"DISMISS_TOAST",toastId:t});return zu({type:"ADD_TOAST",toast:{...e,id:t,open:!0,onOpenChange:a=>{a||r()}}}),{id:t,dismiss:r,update:n}}function An(){const[e,t]=p.useState(jp);return p.useEffect(()=>(Fp.push(t),()=>{const n=Fp.indexOf(t);n>-1&&Fp.splice(n,1)}),[e]),{...e,toast:JC,dismiss:n=>zu({type:"DISMISS_TOAST",toastId:n})}}function CG(){const{toasts:e}=An();return f.jsxs(yG,{children:[e.map(function({id:t,title:n,description:r,action:a,...o}){return f.jsxs(iF,{...o,children:[f.jsxs("div",{className:"grid gap-1",children:[n&&f.jsx(lF,{children:n}),r&&f.jsx(cF,{children:r})]}),a,f.jsx(sF,{})]},t)}),f.jsx(oF,{})]})}var Dc=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},gc=typeof window>"u"||"Deno"in window;function Fr(){}function _G(e,t){return typeof e=="function"?e(t):e}function C1(e){return typeof e=="number"&&e>=0&&e!==1/0}function uF(e,t){return Math.max(e+(t||0)-Date.now(),0)}function _R(e,t){const{type:n="all",exact:r,fetchStatus:a,predicate:o,queryKey:i,stale:s}=e;if(i){if(r){if(t.queryHash!==e_(i,t.options))return!1}else if(!md(t.queryKey,i))return!1}if(n!=="all"){const l=t.isActive();if(n==="active"&&!l||n==="inactive"&&l)return!1}return!(typeof s=="boolean"&&t.isStale()!==s||typeof a<"u"&&a!==t.state.fetchStatus||o&&!o(t))}function AR(e,t){const{exact:n,status:r,predicate:a,mutationKey:o}=e;if(o){if(!t.options.mutationKey)return!1;if(n){if(gd(t.options.mutationKey)!==gd(o))return!1}else if(!md(t.options.mutationKey,o))return!1}return!(r&&t.state.status!==r||a&&!a(t))}function e_(e,t){return((t==null?void 0:t.queryKeyHashFn)||gd)(e)}function gd(e){return JSON.stringify(e,(t,n)=>_1(n)?Object.keys(n).sort().reduce((r,a)=>(r[a]=n[a],r),{}):n)}function md(e,t){return e===t?!0:typeof e!=typeof t?!1:e&&t&&typeof e=="object"&&typeof t=="object"?!Object.keys(t).some(n=>!md(e[n],t[n])):!1}function dF(e,t){if(e===t)return e;const n=TR(e)&&TR(t);if(n||_1(e)&&_1(t)){const r=n?e.length:Object.keys(e).length,a=n?t:Object.keys(t),o=a.length,i=n?[]:{};let s=0;for(let l=0;l"u")return!0;const n=t.prototype;return!(!RR(n)||!n.hasOwnProperty("isPrototypeOf"))}function RR(e){return Object.prototype.toString.call(e)==="[object Object]"}function fF(e){return new Promise(t=>{setTimeout(t,e)})}function NR(e){fF(0).then(e)}function A1(e,t,n){return typeof n.structuralSharing=="function"?n.structuralSharing(e,t):n.structuralSharing!==!1?dF(e,t):t}function AG(e,t,n=0){const r=[...e,t];return n&&r.length>n?r.slice(1):r}function TG(e,t,n=0){const r=[t,...e];return n&&r.length>n?r.slice(0,-1):r}var ss,Zo,ql,lP,RG=(lP=class extends Dc{constructor(){super();xe(this,ss,void 0);xe(this,Zo,void 0);xe(this,ql,void 0);me(this,ql,t=>{if(!gc&&window.addEventListener){const n=()=>t();return window.addEventListener("visibilitychange",n,!1),()=>{window.removeEventListener("visibilitychange",n)}}})}onSubscribe(){$(this,Zo)||this.setEventListener($(this,ql))}onUnsubscribe(){var t;this.hasListeners()||((t=$(this,Zo))==null||t.call(this),me(this,Zo,void 0))}setEventListener(t){var n;me(this,ql,t),(n=$(this,Zo))==null||n.call(this),me(this,Zo,t(r=>{typeof r=="boolean"?this.setFocused(r):this.onFocus()}))}setFocused(t){$(this,ss)!==t&&(me(this,ss,t),this.onFocus())}onFocus(){this.listeners.forEach(t=>{t()})}isFocused(){var t;return typeof $(this,ss)=="boolean"?$(this,ss):((t=globalThis.document)==null?void 0:t.visibilityState)!=="hidden"}},ss=new WeakMap,Zo=new WeakMap,ql=new WeakMap,lP),Cg=new RG,Gl,Xo,Wl,cP,NG=(cP=class extends Dc{constructor(){super();xe(this,Gl,!0);xe(this,Xo,void 0);xe(this,Wl,void 0);me(this,Wl,t=>{if(!gc&&window.addEventListener){const n=()=>t(!0),r=()=>t(!1);return window.addEventListener("online",n,!1),window.addEventListener("offline",r,!1),()=>{window.removeEventListener("online",n),window.removeEventListener("offline",r)}}})}onSubscribe(){$(this,Xo)||this.setEventListener($(this,Wl))}onUnsubscribe(){var t;this.hasListeners()||((t=$(this,Xo))==null||t.call(this),me(this,Xo,void 0))}setEventListener(t){var n;me(this,Wl,t),(n=$(this,Xo))==null||n.call(this),me(this,Xo,t(this.setOnline.bind(this)))}setOnline(t){$(this,Gl)!==t&&(me(this,Gl,t),this.listeners.forEach(r=>{r(t)}))}isOnline(){return $(this,Gl)}},Gl=new WeakMap,Xo=new WeakMap,Wl=new WeakMap,cP),_g=new NG;function IG(e){return Math.min(1e3*2**e,3e4)}function jm(e){return(e??"online")==="online"?_g.isOnline():!0}var pF=class{constructor(e){this.revert=e==null?void 0:e.revert,this.silent=e==null?void 0:e.silent}};function Sb(e){return e instanceof pF}function gF(e){let t=!1,n=0,r=!1,a,o,i;const s=new Promise((w,v)=>{o=w,i=v}),l=w=>{var v;r||(m(new pF(w)),(v=e.abort)==null||v.call(e))},c=()=>{t=!0},u=()=>{t=!1},d=()=>!Cg.isFocused()||e.networkMode!=="always"&&!_g.isOnline(),g=w=>{var v;r||(r=!0,(v=e.onSuccess)==null||v.call(e,w),a==null||a(),o(w))},m=w=>{var v;r||(r=!0,(v=e.onError)==null||v.call(e,w),a==null||a(),i(w))},b=()=>new Promise(w=>{var v;a=h=>{const S=r||!d();return S&&w(h),S},(v=e.onPause)==null||v.call(e)}).then(()=>{var w;a=void 0,r||(w=e.onContinue)==null||w.call(e)}),y=()=>{if(r)return;let w;try{w=e.fn()}catch(v){w=Promise.reject(v)}Promise.resolve(w).then(g).catch(v=>{var x;if(r)return;const h=e.retry??(gc?0:3),S=e.retryDelay??IG,E=typeof S=="function"?S(n,v):S,k=h===!0||typeof h=="number"&&n{if(d())return b()}).then(()=>{t?m(v):y()})})};return jm(e.networkMode)?y():b().then(y),{promise:s,cancel:l,continue:()=>(a==null?void 0:a())?s:Promise.resolve(),cancelRetry:c,continueRetry:u}}function OG(){let e=[],t=0,n=u=>{u()},r=u=>{u()};const a=u=>{let d;t++;try{d=u()}finally{t--,t||s()}return d},o=u=>{t?e.push(u):NR(()=>{n(u)})},i=u=>(...d)=>{o(()=>{u(...d)})},s=()=>{const u=e;e=[],u.length&&NR(()=>{r(()=>{u.forEach(d=>{n(d)})})})};return{batch:a,batchCalls:i,schedule:o,setNotifyFunction:u=>{n=u},setBatchNotifyFunction:u=>{r=u}}}var sn=OG(),ls,uP,mF=(uP=class{constructor(){xe(this,ls,void 0)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),C1(this.gcTime)&&me(this,ls,setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(gc?1/0:5*60*1e3))}clearGcTimeout(){$(this,ls)&&(clearTimeout($(this,ls)),me(this,ls,void 0))}},ls=new WeakMap,uP),Kl,Yl,Lr,Qo,Mr,gn,Md,cs,Zl,zp,sa,eo,dP,DG=(dP=class extends mF{constructor(t){super();xe(this,Zl);xe(this,sa);xe(this,Kl,void 0);xe(this,Yl,void 0);xe(this,Lr,void 0);xe(this,Qo,void 0);xe(this,Mr,void 0);xe(this,gn,void 0);xe(this,Md,void 0);xe(this,cs,void 0);me(this,cs,!1),me(this,Md,t.defaultOptions),Ue(this,Zl,zp).call(this,t.options),me(this,gn,[]),me(this,Lr,t.cache),this.queryKey=t.queryKey,this.queryHash=t.queryHash,me(this,Kl,t.state||LG(this.options)),this.state=$(this,Kl),this.scheduleGc()}get meta(){return this.options.meta}optionalRemove(){!$(this,gn).length&&this.state.fetchStatus==="idle"&&$(this,Lr).remove(this)}setData(t,n){const r=A1(this.state.data,t,this.options);return Ue(this,sa,eo).call(this,{data:r,type:"success",dataUpdatedAt:n==null?void 0:n.updatedAt,manual:n==null?void 0:n.manual}),r}setState(t,n){Ue(this,sa,eo).call(this,{type:"setState",state:t,setStateOptions:n})}cancel(t){var r;const n=$(this,Qo);return(r=$(this,Mr))==null||r.cancel(t),n?n.then(Fr).catch(Fr):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}reset(){this.destroy(),this.setState($(this,Kl))}isActive(){return $(this,gn).some(t=>t.options.enabled!==!1)}isDisabled(){return this.getObserversCount()>0&&!this.isActive()}isStale(){return this.state.isInvalidated||!this.state.dataUpdatedAt||$(this,gn).some(t=>t.getCurrentResult().isStale)}isStaleByTime(t=0){return this.state.isInvalidated||!this.state.dataUpdatedAt||!uF(this.state.dataUpdatedAt,t)}onFocus(){var n;const t=$(this,gn).find(r=>r.shouldFetchOnWindowFocus());t==null||t.refetch({cancelRefetch:!1}),(n=$(this,Mr))==null||n.continue()}onOnline(){var n;const t=$(this,gn).find(r=>r.shouldFetchOnReconnect());t==null||t.refetch({cancelRefetch:!1}),(n=$(this,Mr))==null||n.continue()}addObserver(t){$(this,gn).includes(t)||($(this,gn).push(t),this.clearGcTimeout(),$(this,Lr).notify({type:"observerAdded",query:this,observer:t}))}removeObserver(t){$(this,gn).includes(t)&&(me(this,gn,$(this,gn).filter(n=>n!==t)),$(this,gn).length||($(this,Mr)&&($(this,cs)?$(this,Mr).cancel({revert:!0}):$(this,Mr).cancelRetry()),this.scheduleGc()),$(this,Lr).notify({type:"observerRemoved",query:this,observer:t}))}getObserversCount(){return $(this,gn).length}invalidate(){this.state.isInvalidated||Ue(this,sa,eo).call(this,{type:"invalidate"})}fetch(t,n){var c,u,d,g;if(this.state.fetchStatus!=="idle"){if(this.state.dataUpdatedAt&&(n!=null&&n.cancelRefetch))this.cancel({silent:!0});else if($(this,Qo))return(c=$(this,Mr))==null||c.continueRetry(),$(this,Qo)}if(t&&Ue(this,Zl,zp).call(this,t),!this.options.queryFn){const m=$(this,gn).find(b=>b.options.queryFn);m&&Ue(this,Zl,zp).call(this,m.options)}const r=new AbortController,a={queryKey:this.queryKey,meta:this.meta},o=m=>{Object.defineProperty(m,"signal",{enumerable:!0,get:()=>(me(this,cs,!0),r.signal)})};o(a);const i=()=>this.options.queryFn?(me(this,cs,!1),this.options.persister?this.options.persister(this.options.queryFn,a,this):this.options.queryFn(a)):Promise.reject(new Error(`Missing queryFn: '${this.options.queryHash}'`)),s={fetchOptions:n,options:this.options,queryKey:this.queryKey,state:this.state,fetchFn:i};o(s),(u=this.options.behavior)==null||u.onFetch(s,this),me(this,Yl,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((d=s.fetchOptions)==null?void 0:d.meta))&&Ue(this,sa,eo).call(this,{type:"fetch",meta:(g=s.fetchOptions)==null?void 0:g.meta});const l=m=>{var b,y,w,v;Sb(m)&&m.silent||Ue(this,sa,eo).call(this,{type:"error",error:m}),Sb(m)||((y=(b=$(this,Lr).config).onError)==null||y.call(b,m,this),(v=(w=$(this,Lr).config).onSettled)==null||v.call(w,this.state.data,m,this)),this.isFetchingOptimistic||this.scheduleGc(),this.isFetchingOptimistic=!1};return me(this,Mr,gF({fn:s.fetchFn,abort:r.abort.bind(r),onSuccess:m=>{var b,y,w,v;if(typeof m>"u"){l(new Error(`${this.queryHash} data is undefined`));return}this.setData(m),(y=(b=$(this,Lr).config).onSuccess)==null||y.call(b,m,this),(v=(w=$(this,Lr).config).onSettled)==null||v.call(w,m,this.state.error,this),this.isFetchingOptimistic||this.scheduleGc(),this.isFetchingOptimistic=!1},onError:l,onFail:(m,b)=>{Ue(this,sa,eo).call(this,{type:"failed",failureCount:m,error:b})},onPause:()=>{Ue(this,sa,eo).call(this,{type:"pause"})},onContinue:()=>{Ue(this,sa,eo).call(this,{type:"continue"})},retry:s.options.retry,retryDelay:s.options.retryDelay,networkMode:s.options.networkMode})),me(this,Qo,$(this,Mr).promise),$(this,Qo)}},Kl=new WeakMap,Yl=new WeakMap,Lr=new WeakMap,Qo=new WeakMap,Mr=new WeakMap,gn=new WeakMap,Md=new WeakMap,cs=new WeakMap,Zl=new WeakSet,zp=function(t){this.options={...$(this,Md),...t},this.updateGcTime(this.options.gcTime)},sa=new WeakSet,eo=function(t){const n=r=>{switch(t.type){case"failed":return{...r,fetchFailureCount:t.failureCount,fetchFailureReason:t.error};case"pause":return{...r,fetchStatus:"paused"};case"continue":return{...r,fetchStatus:"fetching"};case"fetch":return{...r,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:t.meta??null,fetchStatus:jm(this.options.networkMode)?"fetching":"paused",...!r.dataUpdatedAt&&{error:null,status:"pending"}};case"success":return{...r,data:t.data,dataUpdateCount:r.dataUpdateCount+1,dataUpdatedAt:t.dataUpdatedAt??Date.now(),error:null,isInvalidated:!1,status:"success",...!t.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};case"error":const a=t.error;return Sb(a)&&a.revert&&$(this,Yl)?{...$(this,Yl),fetchStatus:"idle"}:{...r,error:a,errorUpdateCount:r.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:r.fetchFailureCount+1,fetchFailureReason:a,fetchStatus:"idle",status:"error"};case"invalidate":return{...r,isInvalidated:!0};case"setState":return{...r,...t.state}}};this.state=n(this.state),sn.batch(()=>{$(this,gn).forEach(r=>{r.onQueryUpdate()}),$(this,Lr).notify({query:this,type:"updated",action:t})})},dP);function LG(e){const t=typeof e.initialData=="function"?e.initialData():e.initialData,n=typeof t<"u",r=n?typeof e.initialDataUpdatedAt=="function"?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:n?r??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:n?"success":"pending",fetchStatus:"idle"}}var Ca,fP,MG=(fP=class extends Dc{constructor(t={}){super();xe(this,Ca,void 0);this.config=t,me(this,Ca,new Map)}build(t,n,r){const a=n.queryKey,o=n.queryHash??e_(a,n);let i=this.get(o);return i||(i=new DG({cache:this,queryKey:a,queryHash:o,options:t.defaultQueryOptions(n),state:r,defaultOptions:t.getQueryDefaults(a)}),this.add(i)),i}add(t){$(this,Ca).has(t.queryHash)||($(this,Ca).set(t.queryHash,t),this.notify({type:"added",query:t}))}remove(t){const n=$(this,Ca).get(t.queryHash);n&&(t.destroy(),n===t&&$(this,Ca).delete(t.queryHash),this.notify({type:"removed",query:t}))}clear(){sn.batch(()=>{this.getAll().forEach(t=>{this.remove(t)})})}get(t){return $(this,Ca).get(t)}getAll(){return[...$(this,Ca).values()]}find(t){const n={exact:!0,...t};return this.getAll().find(r=>_R(n,r))}findAll(t={}){const n=this.getAll();return Object.keys(t).length>0?n.filter(r=>_R(t,r)):n}notify(t){sn.batch(()=>{this.listeners.forEach(n=>{n(t)})})}onFocus(){sn.batch(()=>{this.getAll().forEach(t=>{t.onFocus()})})}onOnline(){sn.batch(()=>{this.getAll().forEach(t=>{t.onOnline()})})}},Ca=new WeakMap,fP),_a,Pd,yr,Xl,Aa,Uo,pP,PG=(pP=class extends mF{constructor(t){super();xe(this,Aa);xe(this,_a,void 0);xe(this,Pd,void 0);xe(this,yr,void 0);xe(this,Xl,void 0);this.mutationId=t.mutationId,me(this,Pd,t.defaultOptions),me(this,yr,t.mutationCache),me(this,_a,[]),this.state=t.state||hF(),this.setOptions(t.options),this.scheduleGc()}setOptions(t){this.options={...$(this,Pd),...t},this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(t){$(this,_a).includes(t)||($(this,_a).push(t),this.clearGcTimeout(),$(this,yr).notify({type:"observerAdded",mutation:this,observer:t}))}removeObserver(t){me(this,_a,$(this,_a).filter(n=>n!==t)),this.scheduleGc(),$(this,yr).notify({type:"observerRemoved",mutation:this,observer:t})}optionalRemove(){$(this,_a).length||(this.state.status==="pending"?this.scheduleGc():$(this,yr).remove(this))}continue(){var t;return((t=$(this,Xl))==null?void 0:t.continue())??this.execute(this.state.variables)}async execute(t){var a,o,i,s,l,c,u,d,g,m,b,y,w,v,h,S,E,k,x,C;const n=()=>(me(this,Xl,gF({fn:()=>this.options.mutationFn?this.options.mutationFn(t):Promise.reject(new Error("No mutationFn found")),onFail:(_,R)=>{Ue(this,Aa,Uo).call(this,{type:"failed",failureCount:_,error:R})},onPause:()=>{Ue(this,Aa,Uo).call(this,{type:"pause"})},onContinue:()=>{Ue(this,Aa,Uo).call(this,{type:"continue"})},retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode})),$(this,Xl).promise),r=this.state.status==="pending";try{if(!r){Ue(this,Aa,Uo).call(this,{type:"pending",variables:t}),await((o=(a=$(this,yr).config).onMutate)==null?void 0:o.call(a,t,this));const R=await((s=(i=this.options).onMutate)==null?void 0:s.call(i,t));R!==this.state.context&&Ue(this,Aa,Uo).call(this,{type:"pending",context:R,variables:t})}const _=await n();return await((c=(l=$(this,yr).config).onSuccess)==null?void 0:c.call(l,_,t,this.state.context,this)),await((d=(u=this.options).onSuccess)==null?void 0:d.call(u,_,t,this.state.context)),await((m=(g=$(this,yr).config).onSettled)==null?void 0:m.call(g,_,null,this.state.variables,this.state.context,this)),await((y=(b=this.options).onSettled)==null?void 0:y.call(b,_,null,t,this.state.context)),Ue(this,Aa,Uo).call(this,{type:"success",data:_}),_}catch(_){try{throw await((v=(w=$(this,yr).config).onError)==null?void 0:v.call(w,_,t,this.state.context,this)),await((S=(h=this.options).onError)==null?void 0:S.call(h,_,t,this.state.context)),await((k=(E=$(this,yr).config).onSettled)==null?void 0:k.call(E,void 0,_,this.state.variables,this.state.context,this)),await((C=(x=this.options).onSettled)==null?void 0:C.call(x,void 0,_,t,this.state.context)),_}finally{Ue(this,Aa,Uo).call(this,{type:"error",error:_})}}}},_a=new WeakMap,Pd=new WeakMap,yr=new WeakMap,Xl=new WeakMap,Aa=new WeakSet,Uo=function(t){const n=r=>{switch(t.type){case"failed":return{...r,failureCount:t.failureCount,failureReason:t.error};case"pause":return{...r,isPaused:!0};case"continue":return{...r,isPaused:!1};case"pending":return{...r,context:t.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:!jm(this.options.networkMode),status:"pending",variables:t.variables,submittedAt:Date.now()};case"success":return{...r,data:t.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...r,data:void 0,error:t.error,failureCount:r.failureCount+1,failureReason:t.error,isPaused:!1,status:"error"}}};this.state=n(this.state),sn.batch(()=>{$(this,_a).forEach(r=>{r.onMutationUpdate(t)}),$(this,yr).notify({mutation:this,type:"updated",action:t})})},pP);function hF(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var Pr,$d,us,gP,$G=(gP=class extends Dc{constructor(t={}){super();xe(this,Pr,void 0);xe(this,$d,void 0);xe(this,us,void 0);this.config=t,me(this,Pr,[]),me(this,$d,0)}build(t,n,r){const a=new PG({mutationCache:this,mutationId:++Tf(this,$d)._,options:t.defaultMutationOptions(n),state:r});return this.add(a),a}add(t){$(this,Pr).push(t),this.notify({type:"added",mutation:t})}remove(t){me(this,Pr,$(this,Pr).filter(n=>n!==t)),this.notify({type:"removed",mutation:t})}clear(){sn.batch(()=>{$(this,Pr).forEach(t=>{this.remove(t)})})}getAll(){return $(this,Pr)}find(t){const n={exact:!0,...t};return $(this,Pr).find(r=>AR(n,r))}findAll(t={}){return $(this,Pr).filter(n=>AR(t,n))}notify(t){sn.batch(()=>{this.listeners.forEach(n=>{n(t)})})}resumePausedMutations(){return me(this,us,($(this,us)??Promise.resolve()).then(()=>{const t=$(this,Pr).filter(n=>n.state.isPaused);return sn.batch(()=>t.reduce((n,r)=>n.then(()=>r.continue().catch(Fr)),Promise.resolve()))}).then(()=>{me(this,us,void 0)})),$(this,us)}},Pr=new WeakMap,$d=new WeakMap,us=new WeakMap,gP);function FG(e){return{onFetch:(t,n)=>{const r=async()=>{var b,y,w,v,h;const a=t.options,o=(w=(y=(b=t.fetchOptions)==null?void 0:b.meta)==null?void 0:y.fetchMore)==null?void 0:w.direction,i=((v=t.state.data)==null?void 0:v.pages)||[],s=((h=t.state.data)==null?void 0:h.pageParams)||[],l={pages:[],pageParams:[]};let c=!1;const u=S=>{Object.defineProperty(S,"signal",{enumerable:!0,get:()=>(t.signal.aborted?c=!0:t.signal.addEventListener("abort",()=>{c=!0}),t.signal)})},d=t.options.queryFn||(()=>Promise.reject(new Error(`Missing queryFn: '${t.options.queryHash}'`))),g=async(S,E,k)=>{if(c)return Promise.reject();if(E==null&&S.pages.length)return Promise.resolve(S);const x={queryKey:t.queryKey,pageParam:E,direction:k?"backward":"forward",meta:t.options.meta};u(x);const C=await d(x),{maxPages:_}=t.options,R=k?TG:AG;return{pages:R(S.pages,C,_),pageParams:R(S.pageParams,E,_)}};let m;if(o&&i.length){const S=o==="backward",E=S?jG:IR,k={pages:i,pageParams:s},x=E(a,k);m=await g(k,x,S)}else{m=await g(l,s[0]??a.initialPageParam);const S=e??i.length;for(let E=1;E{var a,o;return(o=(a=t.options).persister)==null?void 0:o.call(a,r,{queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},n)}:t.fetchFn=r}}}function IR(e,{pages:t,pageParams:n}){const r=t.length-1;return e.getNextPageParam(t[r],t,n[r],n)}function jG(e,{pages:t,pageParams:n}){var r;return(r=e.getPreviousPageParam)==null?void 0:r.call(e,t[0],t,n[0],n)}var an,Jo,ei,Ql,Jl,ti,ec,tc,mP,zG=(mP=class{constructor(e={}){xe(this,an,void 0);xe(this,Jo,void 0);xe(this,ei,void 0);xe(this,Ql,void 0);xe(this,Jl,void 0);xe(this,ti,void 0);xe(this,ec,void 0);xe(this,tc,void 0);me(this,an,e.queryCache||new MG),me(this,Jo,e.mutationCache||new $G),me(this,ei,e.defaultOptions||{}),me(this,Ql,new Map),me(this,Jl,new Map),me(this,ti,0)}mount(){Tf(this,ti)._++,$(this,ti)===1&&(me(this,ec,Cg.subscribe(()=>{Cg.isFocused()&&(this.resumePausedMutations(),$(this,an).onFocus())})),me(this,tc,_g.subscribe(()=>{_g.isOnline()&&(this.resumePausedMutations(),$(this,an).onOnline())})))}unmount(){var e,t;Tf(this,ti)._--,$(this,ti)===0&&((e=$(this,ec))==null||e.call(this),me(this,ec,void 0),(t=$(this,tc))==null||t.call(this),me(this,tc,void 0))}isFetching(e){return $(this,an).findAll({...e,fetchStatus:"fetching"}).length}isMutating(e){return $(this,Jo).findAll({...e,status:"pending"}).length}getQueryData(e){var t;return(t=$(this,an).find({queryKey:e}))==null?void 0:t.state.data}ensureQueryData(e){const t=this.getQueryData(e.queryKey);return t!==void 0?Promise.resolve(t):this.fetchQuery(e)}getQueriesData(e){return this.getQueryCache().findAll(e).map(({queryKey:t,state:n})=>{const r=n.data;return[t,r]})}setQueryData(e,t,n){const r=$(this,an).find({queryKey:e}),a=r==null?void 0:r.state.data,o=_G(t,a);if(typeof o>"u")return;const i=this.defaultQueryOptions({queryKey:e});return $(this,an).build(this,i).setData(o,{...n,manual:!0})}setQueriesData(e,t,n){return sn.batch(()=>this.getQueryCache().findAll(e).map(({queryKey:r})=>[r,this.setQueryData(r,t,n)]))}getQueryState(e){var t;return(t=$(this,an).find({queryKey:e}))==null?void 0:t.state}removeQueries(e){const t=$(this,an);sn.batch(()=>{t.findAll(e).forEach(n=>{t.remove(n)})})}resetQueries(e,t){const n=$(this,an),r={type:"active",...e};return sn.batch(()=>(n.findAll(e).forEach(a=>{a.reset()}),this.refetchQueries(r,t)))}cancelQueries(e={},t={}){const n={revert:!0,...t},r=sn.batch(()=>$(this,an).findAll(e).map(a=>a.cancel(n)));return Promise.all(r).then(Fr).catch(Fr)}invalidateQueries(e={},t={}){return sn.batch(()=>{if($(this,an).findAll(e).forEach(r=>{r.invalidate()}),e.refetchType==="none")return Promise.resolve();const n={...e,type:e.refetchType??e.type??"active"};return this.refetchQueries(n,t)})}refetchQueries(e={},t){const n={...t,cancelRefetch:(t==null?void 0:t.cancelRefetch)??!0},r=sn.batch(()=>$(this,an).findAll(e).filter(a=>!a.isDisabled()).map(a=>{let o=a.fetch(void 0,n);return n.throwOnError||(o=o.catch(Fr)),a.state.fetchStatus==="paused"?Promise.resolve():o}));return Promise.all(r).then(Fr)}fetchQuery(e){const t=this.defaultQueryOptions(e);typeof t.retry>"u"&&(t.retry=!1);const n=$(this,an).build(this,t);return n.isStaleByTime(t.staleTime)?n.fetch(t):Promise.resolve(n.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(Fr).catch(Fr)}fetchInfiniteQuery(e){return e.behavior=FG(e.pages),this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(Fr).catch(Fr)}resumePausedMutations(){return $(this,Jo).resumePausedMutations()}getQueryCache(){return $(this,an)}getMutationCache(){return $(this,Jo)}getDefaultOptions(){return $(this,ei)}setDefaultOptions(e){me(this,ei,e)}setQueryDefaults(e,t){$(this,Ql).set(gd(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){const t=[...$(this,Ql).values()];let n={};return t.forEach(r=>{md(e,r.queryKey)&&(n={...n,...r.defaultOptions})}),n}setMutationDefaults(e,t){$(this,Jl).set(gd(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){const t=[...$(this,Jl).values()];let n={};return t.forEach(r=>{md(e,r.mutationKey)&&(n={...n,...r.defaultOptions})}),n}defaultQueryOptions(e){if(e!=null&&e._defaulted)return e;const t={...$(this,ei).queries,...(e==null?void 0:e.queryKey)&&this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||(t.queryHash=e_(t.queryKey,t)),typeof t.refetchOnReconnect>"u"&&(t.refetchOnReconnect=t.networkMode!=="always"),typeof t.throwOnError>"u"&&(t.throwOnError=!!t.suspense),typeof t.networkMode>"u"&&t.persister&&(t.networkMode="offlineFirst"),t}defaultMutationOptions(e){return e!=null&&e._defaulted?e:{...$(this,ei).mutations,...(e==null?void 0:e.mutationKey)&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){$(this,an).clear(),$(this,Jo).clear()}},an=new WeakMap,Jo=new WeakMap,ei=new WeakMap,Ql=new WeakMap,Jl=new WeakMap,ti=new WeakMap,ec=new WeakMap,tc=new WeakMap,mP),rr,Ct,nc,On,ds,rc,Ta,Fd,ac,oc,fs,ps,ni,gs,ms,Cu,jd,T1,zd,R1,Ud,N1,Bd,I1,Hd,O1,Vd,D1,qd,L1,fm,bF,hP,UG=(hP=class extends Dc{constructor(t,n){super();xe(this,ms);xe(this,jd);xe(this,zd);xe(this,Ud);xe(this,Bd);xe(this,Hd);xe(this,Vd);xe(this,qd);xe(this,fm);xe(this,rr,void 0);xe(this,Ct,void 0);xe(this,nc,void 0);xe(this,On,void 0);xe(this,ds,void 0);xe(this,rc,void 0);xe(this,Ta,void 0);xe(this,Fd,void 0);xe(this,ac,void 0);xe(this,oc,void 0);xe(this,fs,void 0);xe(this,ps,void 0);xe(this,ni,void 0);xe(this,gs,void 0);me(this,Ct,void 0),me(this,nc,void 0),me(this,On,void 0),me(this,gs,new Set),me(this,rr,t),this.options=n,me(this,Ta,null),this.bindMethods(),this.setOptions(n)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&($(this,Ct).addObserver(this),OR($(this,Ct),this.options)?Ue(this,ms,Cu).call(this):this.updateResult(),Ue(this,Bd,I1).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return M1($(this,Ct),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return M1($(this,Ct),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,Ue(this,Hd,O1).call(this),Ue(this,Vd,D1).call(this),$(this,Ct).removeObserver(this)}setOptions(t,n){const r=this.options,a=$(this,Ct);if(this.options=$(this,rr).defaultQueryOptions(t),kg(r,this.options)||$(this,rr).getQueryCache().notify({type:"observerOptionsUpdated",query:$(this,Ct),observer:this}),typeof this.options.enabled<"u"&&typeof this.options.enabled!="boolean")throw new Error("Expected enabled to be a boolean");this.options.queryKey||(this.options.queryKey=r.queryKey),Ue(this,qd,L1).call(this);const o=this.hasListeners();o&&DR($(this,Ct),a,this.options,r)&&Ue(this,ms,Cu).call(this),this.updateResult(n),o&&($(this,Ct)!==a||this.options.enabled!==r.enabled||this.options.staleTime!==r.staleTime)&&Ue(this,jd,T1).call(this);const i=Ue(this,zd,R1).call(this);o&&($(this,Ct)!==a||this.options.enabled!==r.enabled||i!==$(this,ni))&&Ue(this,Ud,N1).call(this,i)}getOptimisticResult(t){const n=$(this,rr).getQueryCache().build($(this,rr),t),r=this.createResult(n,t);return HG(this,r)&&(me(this,On,r),me(this,rc,this.options),me(this,ds,$(this,Ct).state)),r}getCurrentResult(){return $(this,On)}trackResult(t){const n={};return Object.keys(t).forEach(r=>{Object.defineProperty(n,r,{configurable:!1,enumerable:!0,get:()=>($(this,gs).add(r),t[r])})}),n}getCurrentQuery(){return $(this,Ct)}refetch({...t}={}){return this.fetch({...t})}fetchOptimistic(t){const n=$(this,rr).defaultQueryOptions(t),r=$(this,rr).getQueryCache().build($(this,rr),n);return r.isFetchingOptimistic=!0,r.fetch().then(()=>this.createResult(r,n))}fetch(t){return Ue(this,ms,Cu).call(this,{...t,cancelRefetch:t.cancelRefetch??!0}).then(()=>(this.updateResult(),$(this,On)))}createResult(t,n){var x;const r=$(this,Ct),a=this.options,o=$(this,On),i=$(this,ds),s=$(this,rc),c=t!==r?t.state:$(this,nc),{state:u}=t;let{error:d,errorUpdatedAt:g,fetchStatus:m,status:b}=u,y=!1,w;if(n._optimisticResults){const C=this.hasListeners(),_=!C&&OR(t,n),R=C&&DR(t,r,n,a);(_||R)&&(m=jm(t.options.networkMode)?"fetching":"paused",u.dataUpdatedAt||(b="pending")),n._optimisticResults==="isRestoring"&&(m="idle")}if(n.select&&typeof u.data<"u")if(o&&u.data===(i==null?void 0:i.data)&&n.select===$(this,Fd))w=$(this,ac);else try{me(this,Fd,n.select),w=n.select(u.data),w=A1(o==null?void 0:o.data,w,n),me(this,ac,w),me(this,Ta,null)}catch(C){me(this,Ta,C)}else w=u.data;if(typeof n.placeholderData<"u"&&typeof w>"u"&&b==="pending"){let C;if(o!=null&&o.isPlaceholderData&&n.placeholderData===(s==null?void 0:s.placeholderData))C=o.data;else if(C=typeof n.placeholderData=="function"?n.placeholderData((x=$(this,oc))==null?void 0:x.state.data,$(this,oc)):n.placeholderData,n.select&&typeof C<"u")try{C=n.select(C),me(this,Ta,null)}catch(_){me(this,Ta,_)}typeof C<"u"&&(b="success",w=A1(o==null?void 0:o.data,C,n),y=!0)}$(this,Ta)&&(d=$(this,Ta),w=$(this,ac),g=Date.now(),b="error");const v=m==="fetching",h=b==="pending",S=b==="error",E=h&&v;return{status:b,fetchStatus:m,isPending:h,isSuccess:b==="success",isError:S,isInitialLoading:E,isLoading:E,data:w,dataUpdatedAt:u.dataUpdatedAt,error:d,errorUpdatedAt:g,failureCount:u.fetchFailureCount,failureReason:u.fetchFailureReason,errorUpdateCount:u.errorUpdateCount,isFetched:u.dataUpdateCount>0||u.errorUpdateCount>0,isFetchedAfterMount:u.dataUpdateCount>c.dataUpdateCount||u.errorUpdateCount>c.errorUpdateCount,isFetching:v,isRefetching:v&&!h,isLoadingError:S&&u.dataUpdatedAt===0,isPaused:m==="paused",isPlaceholderData:y,isRefetchError:S&&u.dataUpdatedAt!==0,isStale:t_(t,n),refetch:this.refetch}}updateResult(t){const n=$(this,On),r=this.createResult($(this,Ct),this.options);if(me(this,ds,$(this,Ct).state),me(this,rc,this.options),kg(r,n))return;$(this,ds).data!==void 0&&me(this,oc,$(this,Ct)),me(this,On,r);const a={},o=()=>{if(!n)return!0;const{notifyOnChangeProps:i}=this.options,s=typeof i=="function"?i():i;if(s==="all"||!s&&!$(this,gs).size)return!0;const l=new Set(s??$(this,gs));return this.options.throwOnError&&l.add("error"),Object.keys($(this,On)).some(c=>{const u=c;return $(this,On)[u]!==n[u]&&l.has(u)})};(t==null?void 0:t.listeners)!==!1&&o()&&(a.listeners=!0),Ue(this,fm,bF).call(this,{...a,...t})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&Ue(this,Bd,I1).call(this)}},rr=new WeakMap,Ct=new WeakMap,nc=new WeakMap,On=new WeakMap,ds=new WeakMap,rc=new WeakMap,Ta=new WeakMap,Fd=new WeakMap,ac=new WeakMap,oc=new WeakMap,fs=new WeakMap,ps=new WeakMap,ni=new WeakMap,gs=new WeakMap,ms=new WeakSet,Cu=function(t){Ue(this,qd,L1).call(this);let n=$(this,Ct).fetch(this.options,t);return t!=null&&t.throwOnError||(n=n.catch(Fr)),n},jd=new WeakSet,T1=function(){if(Ue(this,Hd,O1).call(this),gc||$(this,On).isStale||!C1(this.options.staleTime))return;const n=uF($(this,On).dataUpdatedAt,this.options.staleTime)+1;me(this,fs,setTimeout(()=>{$(this,On).isStale||this.updateResult()},n))},zd=new WeakSet,R1=function(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval($(this,Ct)):this.options.refetchInterval)??!1},Ud=new WeakSet,N1=function(t){Ue(this,Vd,D1).call(this),me(this,ni,t),!(gc||this.options.enabled===!1||!C1($(this,ni))||$(this,ni)===0)&&me(this,ps,setInterval(()=>{(this.options.refetchIntervalInBackground||Cg.isFocused())&&Ue(this,ms,Cu).call(this)},$(this,ni)))},Bd=new WeakSet,I1=function(){Ue(this,jd,T1).call(this),Ue(this,Ud,N1).call(this,Ue(this,zd,R1).call(this))},Hd=new WeakSet,O1=function(){$(this,fs)&&(clearTimeout($(this,fs)),me(this,fs,void 0))},Vd=new WeakSet,D1=function(){$(this,ps)&&(clearInterval($(this,ps)),me(this,ps,void 0))},qd=new WeakSet,L1=function(){const t=$(this,rr).getQueryCache().build($(this,rr),this.options);if(t===$(this,Ct))return;const n=$(this,Ct);me(this,Ct,t),me(this,nc,t.state),this.hasListeners()&&(n==null||n.removeObserver(this),t.addObserver(this))},fm=new WeakSet,bF=function(t){sn.batch(()=>{t.listeners&&this.listeners.forEach(n=>{n($(this,On))}),$(this,rr).getQueryCache().notify({query:$(this,Ct),type:"observerResultsUpdated"})})},hP);function BG(e,t){return t.enabled!==!1&&!e.state.dataUpdatedAt&&!(e.state.status==="error"&&t.retryOnMount===!1)}function OR(e,t){return BG(e,t)||e.state.dataUpdatedAt>0&&M1(e,t,t.refetchOnMount)}function M1(e,t,n){if(t.enabled!==!1){const r=typeof n=="function"?n(e):n;return r==="always"||r!==!1&&t_(e,t)}return!1}function DR(e,t,n,r){return n.enabled!==!1&&(e!==t||r.enabled===!1)&&(!n.suspense||e.state.status!=="error")&&t_(e,n)}function t_(e,t){return e.isStaleByTime(t.staleTime)}function HG(e,t){return!kg(e.getCurrentResult(),t)}var ri,Wn,$r,oo,ic,Up,Gd,P1,bP,VG=(bP=class extends Dc{constructor(n,r){super();xe(this,ic);xe(this,Gd);xe(this,ri,void 0);xe(this,Wn,void 0);xe(this,$r,void 0);xe(this,oo,void 0);me(this,Wn,void 0),me(this,ri,n),this.setOptions(r),this.bindMethods(),Ue(this,ic,Up).call(this)}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(n){var a;const r=this.options;this.options=$(this,ri).defaultMutationOptions(n),kg(r,this.options)||$(this,ri).getMutationCache().notify({type:"observerOptionsUpdated",mutation:$(this,$r),observer:this}),(a=$(this,$r))==null||a.setOptions(this.options)}onUnsubscribe(){var n;this.hasListeners()||(n=$(this,$r))==null||n.removeObserver(this)}onMutationUpdate(n){Ue(this,ic,Up).call(this),Ue(this,Gd,P1).call(this,n)}getCurrentResult(){return $(this,Wn)}reset(){me(this,$r,void 0),Ue(this,ic,Up).call(this),Ue(this,Gd,P1).call(this)}mutate(n,r){var a;return me(this,oo,r),(a=$(this,$r))==null||a.removeObserver(this),me(this,$r,$(this,ri).getMutationCache().build($(this,ri),this.options)),$(this,$r).addObserver(this),$(this,$r).execute(n)}},ri=new WeakMap,Wn=new WeakMap,$r=new WeakMap,oo=new WeakMap,ic=new WeakSet,Up=function(){var r;const n=((r=$(this,$r))==null?void 0:r.state)??hF();me(this,Wn,{...n,isPending:n.status==="pending",isSuccess:n.status==="success",isError:n.status==="error",isIdle:n.status==="idle",mutate:this.mutate,reset:this.reset})},Gd=new WeakSet,P1=function(n){sn.batch(()=>{var r,a,o,i,s,l,c,u;$(this,oo)&&this.hasListeners()&&((n==null?void 0:n.type)==="success"?((a=(r=$(this,oo)).onSuccess)==null||a.call(r,n.data,$(this,Wn).variables,$(this,Wn).context),(i=(o=$(this,oo)).onSettled)==null||i.call(o,n.data,null,$(this,Wn).variables,$(this,Wn).context)):(n==null?void 0:n.type)==="error"&&((l=(s=$(this,oo)).onError)==null||l.call(s,n.error,$(this,Wn).variables,$(this,Wn).context),(u=(c=$(this,oo)).onSettled)==null||u.call(c,void 0,n.error,$(this,Wn).variables,$(this,Wn).context))),this.listeners.forEach(d=>{d($(this,Wn))})})},bP),yF=p.createContext(void 0),Bt=e=>{const t=p.useContext(yF);if(e)return e;if(!t)throw new Error("No QueryClient set, use QueryClientProvider to set one");return t},qG=({client:e,children:t})=>(p.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),p.createElement(yF.Provider,{value:e},t)),vF=p.createContext(!1),GG=()=>p.useContext(vF);vF.Provider;function WG(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var KG=p.createContext(WG()),YG=()=>p.useContext(KG);function SF(e,t){return typeof e=="function"?e(...t):!!e}var ZG=(e,t)=>{(e.suspense||e.throwOnError)&&(t.isReset()||(e.retryOnMount=!1))},XG=e=>{p.useEffect(()=>{e.clearReset()},[e])},QG=({result:e,errorResetBoundary:t,throwOnError:n,query:r})=>e.isError&&!t.isReset()&&!e.isFetching&&SF(n,[e.error,r]),JG=e=>{e.suspense&&typeof e.staleTime!="number"&&(e.staleTime=1e3)},eW=(e,t)=>e.isLoading&&e.isFetching&&!t,tW=(e,t,n)=>(e==null?void 0:e.suspense)&&eW(t,n),nW=(e,t,n)=>t.fetchOptimistic(e).catch(()=>{n.clearReset()});function rW(e,t,n){const r=Bt(n),a=GG(),o=YG(),i=r.defaultQueryOptions(e);i._optimisticResults=a?"isRestoring":"optimistic",JG(i),ZG(i,o),XG(o);const[s]=p.useState(()=>new t(r,i)),l=s.getOptimisticResult(i);if(p.useSyncExternalStore(p.useCallback(c=>{const u=a?()=>{}:s.subscribe(sn.batchCalls(c));return s.updateResult(),u},[s,a]),()=>s.getCurrentResult(),()=>s.getCurrentResult()),p.useEffect(()=>{s.setOptions(i,{listeners:!1})},[i,s]),tW(i,l,a))throw nW(i,s,o);if(QG({result:l,errorResetBoundary:o,throwOnError:i.throwOnError,query:s.getCurrentQuery()}))throw l.error;return i.notifyOnChangeProps?l:s.trackResult(l)}function Jr(e,t){return rW(e,UG,t)}function gr(e,t){const n=Bt(t),[r]=p.useState(()=>new VG(n,e));p.useEffect(()=>{r.setOptions(e)},[r,e]);const a=p.useSyncExternalStore(p.useCallback(i=>r.subscribe(sn.batchCalls(i)),[r]),()=>r.getCurrentResult(),()=>r.getCurrentResult()),o=p.useCallback((i,s)=>{r.mutate(i,s).catch(aW)},[r]);if(a.error&&SF(r.options.throwOnError,[a.error]))throw a.error;return{...a,mutate:o,mutateAsync:a.mutate}}function aW(){}var oW=function(){return null};/** +`+o.stack}return{value:e,source:t,stack:a,digest:null}}function gb(e,t,n){return{value:e,source:null,stack:n??null,digest:t??null}}function s1(e,t){try{console.error(t.value)}catch(n){setTimeout(function(){throw n})}}var nV=typeof WeakMap=="function"?WeakMap:Map;function a4(e,t,n){n=co(-1,n),n.tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Sg||(Sg=!0,b1=r),s1(e,t)},n}function o4(e,t,n){n=co(-1,n),n.tag=3;var r=e.type.getDerivedStateFromError;if(typeof r=="function"){var a=t.value;n.payload=function(){return r(a)},n.callback=function(){s1(e,t)}}var o=e.stateNode;return o!==null&&typeof o.componentDidCatch=="function"&&(n.callback=function(){s1(e,t),typeof r!="function"&&(gi===null?gi=new Set([this]):gi.add(this));var i=t.stack;this.componentDidCatch(t.value,{componentStack:i!==null?i:""})}),n}function YT(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new nV;var a=new Set;r.set(t,a)}else a=r.get(t),a===void 0&&(a=new Set,r.set(t,a));a.has(n)||(a.add(n),e=hV.bind(null,e,t,n),t.then(e,e))}function ZT(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null?t.dehydrated!==null:!0),t)return e;e=e.return}while(e!==null);return null}function XT(e,t,n,r,a){return e.mode&1?(e.flags|=65536,e.lanes=a,e):(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,n.tag===1&&(n.alternate===null?n.tag=17:(t=co(-1,1),t.tag=2,pi(n,t,1))),n.lanes|=1),e)}var rV=ko.ReactCurrentOwner,ir=!1;function Kn(e,t,n,r){t.child=e===null?$$(t,null,n,r):uc(t,e.child,n,r)}function QT(e,t,n,r,a){n=n.render;var o=t.ref;return Fl(t,a),r=NC(e,t,n,r,o,a),n=IC(),e!==null&&!ir?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~a,ho(e,t,a)):(Lt&&n&&yC(t),t.flags|=1,Kn(e,t,r,a),t.child)}function JT(e,t,n,r,a){if(e===null){var o=n.type;return typeof o=="function"&&!UC(o)&&o.defaultProps===void 0&&n.compare===null&&n.defaultProps===void 0?(t.tag=15,t.type=o,i4(e,t,o,r,a)):(e=$p(n.type,null,r,t,t.mode,a),e.ref=t.ref,e.return=t,t.child=e)}if(o=e.child,!(e.lanes&a)){var i=o.memoizedProps;if(n=n.compare,n=n!==null?n:ad,n(i,r)&&e.ref===t.ref)return ho(e,t,a)}return t.flags|=1,e=hi(o,r),e.ref=t.ref,e.return=t,t.child=e}function i4(e,t,n,r,a){if(e!==null){var o=e.memoizedProps;if(ad(o,r)&&e.ref===t.ref)if(ir=!1,t.pendingProps=r=o,(e.lanes&a)!==0)e.flags&131072&&(ir=!0);else return t.lanes=e.lanes,ho(e,t,a)}return l1(e,t,n,r,a)}function s4(e,t,n){var r=t.pendingProps,a=r.children,o=e!==null?e.memoizedState:null;if(r.mode==="hidden")if(!(t.mode&1))t.memoizedState={baseLanes:0,cachePool:null,transitions:null},At(Tl,Sr),Sr|=n;else{if(!(n&1073741824))return e=o!==null?o.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,At(Tl,Sr),Sr|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=o!==null?o.baseLanes:n,At(Tl,Sr),Sr|=r}else o!==null?(r=o.baseLanes|n,t.memoizedState=null):r=n,At(Tl,Sr),Sr|=r;return Kn(e,t,a,n),t.child}function l4(e,t){var n=t.ref;(e===null&&n!==null||e!==null&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function l1(e,t,n,r,a){var o=lr(n)?Ss:jn.current;return o=lc(t,o),Fl(t,a),n=NC(e,t,n,r,o,a),r=IC(),e!==null&&!ir?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~a,ho(e,t,a)):(Lt&&r&&yC(t),t.flags|=1,Kn(e,t,n,a),t.child)}function eR(e,t,n,r,a){if(lr(n)){var o=!0;ug(t)}else o=!1;if(Fl(t,a),t.stateNode===null)Lp(e,t),M$(t,n,r),i1(t,n,r,a),r=!0;else if(e===null){var i=t.stateNode,s=t.memoizedProps;i.props=s;var l=i.context,c=n.contextType;typeof c=="object"&&c!==null?c=Kr(c):(c=lr(n)?Ss:jn.current,c=lc(t,c));var u=n.getDerivedStateFromProps,d=typeof u=="function"||typeof i.getSnapshotBeforeUpdate=="function";d||typeof i.UNSAFE_componentWillReceiveProps!="function"&&typeof i.componentWillReceiveProps!="function"||(s!==r||l!==c)&&qT(t,i,r,c),Go=!1;var g=t.memoizedState;i.state=g,mg(t,r,i,a),l=t.memoizedState,s!==r||g!==l||sr.current||Go?(typeof u=="function"&&(o1(t,n,u,r),l=t.memoizedState),(s=Go||VT(t,n,s,r,g,l,c))?(d||typeof i.UNSAFE_componentWillMount!="function"&&typeof i.componentWillMount!="function"||(typeof i.componentWillMount=="function"&&i.componentWillMount(),typeof i.UNSAFE_componentWillMount=="function"&&i.UNSAFE_componentWillMount()),typeof i.componentDidMount=="function"&&(t.flags|=4194308)):(typeof i.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=l),i.props=r,i.state=l,i.context=c,r=s):(typeof i.componentDidMount=="function"&&(t.flags|=4194308),r=!1)}else{i=t.stateNode,D$(e,t),s=t.memoizedProps,c=t.type===t.elementType?s:ia(t.type,s),i.props=c,d=t.pendingProps,g=i.context,l=n.contextType,typeof l=="object"&&l!==null?l=Kr(l):(l=lr(n)?Ss:jn.current,l=lc(t,l));var m=n.getDerivedStateFromProps;(u=typeof m=="function"||typeof i.getSnapshotBeforeUpdate=="function")||typeof i.UNSAFE_componentWillReceiveProps!="function"&&typeof i.componentWillReceiveProps!="function"||(s!==d||g!==l)&&qT(t,i,r,l),Go=!1,g=t.memoizedState,i.state=g,mg(t,r,i,a);var b=t.memoizedState;s!==d||g!==b||sr.current||Go?(typeof m=="function"&&(o1(t,n,m,r),b=t.memoizedState),(c=Go||VT(t,n,c,r,g,b,l)||!1)?(u||typeof i.UNSAFE_componentWillUpdate!="function"&&typeof i.componentWillUpdate!="function"||(typeof i.componentWillUpdate=="function"&&i.componentWillUpdate(r,b,l),typeof i.UNSAFE_componentWillUpdate=="function"&&i.UNSAFE_componentWillUpdate(r,b,l)),typeof i.componentDidUpdate=="function"&&(t.flags|=4),typeof i.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof i.componentDidUpdate!="function"||s===e.memoizedProps&&g===e.memoizedState||(t.flags|=4),typeof i.getSnapshotBeforeUpdate!="function"||s===e.memoizedProps&&g===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=b),i.props=r,i.state=b,i.context=l,r=c):(typeof i.componentDidUpdate!="function"||s===e.memoizedProps&&g===e.memoizedState||(t.flags|=4),typeof i.getSnapshotBeforeUpdate!="function"||s===e.memoizedProps&&g===e.memoizedState||(t.flags|=1024),r=!1)}return c1(e,t,n,r,o,a)}function c1(e,t,n,r,a,o){l4(e,t);var i=(t.flags&128)!==0;if(!r&&!i)return a&&jT(t,n,!1),ho(e,t,o);r=t.stateNode,rV.current=t;var s=i&&typeof n.getDerivedStateFromError!="function"?null:r.render();return t.flags|=1,e!==null&&i?(t.child=uc(t,e.child,null,o),t.child=uc(t,null,s,o)):Kn(e,t,s,o),t.memoizedState=r.state,a&&jT(t,n,!0),t.child}function c4(e){var t=e.stateNode;t.pendingContext?FT(e,t.pendingContext,t.pendingContext!==t.context):t.context&&FT(e,t.context,!1),_C(e,t.containerInfo)}function tR(e,t,n,r,a){return cc(),SC(a),t.flags|=256,Kn(e,t,n,r),t.child}var u1={dehydrated:null,treeContext:null,retryLane:0};function d1(e){return{baseLanes:e,cachePool:null,transitions:null}}function u4(e,t,n){var r=t.pendingProps,a=jt.current,o=!1,i=(t.flags&128)!==0,s;if((s=i)||(s=e!==null&&e.memoizedState===null?!1:(a&2)!==0),s?(o=!0,t.flags&=-129):(e===null||e.memoizedState!==null)&&(a|=1),At(jt,a&1),e===null)return r1(t),e=t.memoizedState,e!==null&&(e=e.dehydrated,e!==null)?(t.mode&1?e.data==="$!"?t.lanes=8:t.lanes=1073741824:t.lanes=1,null):(i=r.children,e=r.fallback,o?(r=t.mode,o=t.child,i={mode:"hidden",children:i},!(r&1)&&o!==null?(o.childLanes=0,o.pendingProps=i):o=km(i,r,0,null),e=bs(e,r,n,null),o.return=t,e.return=t,o.sibling=e,t.child=o,t.child.memoizedState=d1(n),t.memoizedState=u1,e):LC(t,i));if(a=e.memoizedState,a!==null&&(s=a.dehydrated,s!==null))return aV(e,t,i,r,s,a,n);if(o){o=r.fallback,i=t.mode,a=e.child,s=a.sibling;var l={mode:"hidden",children:r.children};return!(i&1)&&t.child!==a?(r=t.child,r.childLanes=0,r.pendingProps=l,t.deletions=null):(r=hi(a,l),r.subtreeFlags=a.subtreeFlags&14680064),s!==null?o=hi(s,o):(o=bs(o,i,n,null),o.flags|=2),o.return=t,r.return=t,r.sibling=o,t.child=r,r=o,o=t.child,i=e.child.memoizedState,i=i===null?d1(n):{baseLanes:i.baseLanes|n,cachePool:null,transitions:i.transitions},o.memoizedState=i,o.childLanes=e.childLanes&~n,t.memoizedState=u1,r}return o=e.child,e=o.sibling,r=hi(o,{mode:"visible",children:r.children}),!(t.mode&1)&&(r.lanes=n),r.return=t,r.sibling=null,e!==null&&(n=t.deletions,n===null?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=r,t.memoizedState=null,r}function LC(e,t){return t=km({mode:"visible",children:t},e.mode,0,null),t.return=e,e.child=t}function Bf(e,t,n,r){return r!==null&&SC(r),uc(t,e.child,null,n),e=LC(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function aV(e,t,n,r,a,o,i){if(n)return t.flags&256?(t.flags&=-257,r=gb(Error(ie(422))),Bf(e,t,i,r)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(o=r.fallback,a=t.mode,r=km({mode:"visible",children:r.children},a,0,null),o=bs(o,a,i,null),o.flags|=2,r.return=t,o.return=t,r.sibling=o,t.child=r,t.mode&1&&uc(t,e.child,null,i),t.child.memoizedState=d1(i),t.memoizedState=u1,o);if(!(t.mode&1))return Bf(e,t,i,null);if(a.data==="$!"){if(r=a.nextSibling&&a.nextSibling.dataset,r)var s=r.dgst;return r=s,o=Error(ie(419)),r=gb(o,r,void 0),Bf(e,t,i,r)}if(s=(i&e.childLanes)!==0,ir||s){if(r=hn,r!==null){switch(i&-i){case 4:a=2;break;case 16:a=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:a=32;break;case 536870912:a=268435456;break;default:a=0}a=a&(r.suspendedLanes|i)?0:a,a!==0&&a!==o.retryLane&&(o.retryLane=a,mo(e,a),fa(r,e,a,-1))}return zC(),r=gb(Error(ie(421))),Bf(e,t,i,r)}return a.data==="$?"?(t.flags|=128,t.child=e.child,t=bV.bind(null,e),a._reactRetry=t,null):(e=o.treeContext,xr=fi(a.nextSibling),Cr=t,Lt=!0,ua=null,e!==null&&(zr[Ur++]=io,zr[Ur++]=so,zr[Ur++]=ws,io=e.id,so=e.overflow,ws=t),t=LC(t,r.children),t.flags|=4096,t)}function nR(e,t,n){e.lanes|=t;var r=e.alternate;r!==null&&(r.lanes|=t),a1(e.return,t,n)}function mb(e,t,n,r,a){var o=e.memoizedState;o===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:a}:(o.isBackwards=t,o.rendering=null,o.renderingStartTime=0,o.last=r,o.tail=n,o.tailMode=a)}function d4(e,t,n){var r=t.pendingProps,a=r.revealOrder,o=r.tail;if(Kn(e,t,r.children,n),r=jt.current,r&2)r=r&1|2,t.flags|=128;else{if(e!==null&&e.flags&128)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&nR(e,n,t);else if(e.tag===19)nR(e,n,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(At(jt,r),!(t.mode&1))t.memoizedState=null;else switch(a){case"forwards":for(n=t.child,a=null;n!==null;)e=n.alternate,e!==null&&hg(e)===null&&(a=n),n=n.sibling;n=a,n===null?(a=t.child,t.child=null):(a=n.sibling,n.sibling=null),mb(t,!1,a,n,o);break;case"backwards":for(n=null,a=t.child,t.child=null;a!==null;){if(e=a.alternate,e!==null&&hg(e)===null){t.child=a;break}e=a.sibling,a.sibling=n,n=a,a=e}mb(t,!0,n,null,o);break;case"together":mb(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function Lp(e,t){!(t.mode&1)&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function ho(e,t,n){if(e!==null&&(t.dependencies=e.dependencies),xs|=t.lanes,!(n&t.childLanes))return null;if(e!==null&&t.child!==e.child)throw Error(ie(153));if(t.child!==null){for(e=t.child,n=hi(e,e.pendingProps),t.child=n,n.return=t;e.sibling!==null;)e=e.sibling,n=n.sibling=hi(e,e.pendingProps),n.return=t;n.sibling=null}return t.child}function oV(e,t,n){switch(t.tag){case 3:c4(t),cc();break;case 5:F$(t);break;case 1:lr(t.type)&&ug(t);break;case 4:_C(t,t.stateNode.containerInfo);break;case 10:var r=t.type._context,a=t.memoizedProps.value;At(pg,r._currentValue),r._currentValue=a;break;case 13:if(r=t.memoizedState,r!==null)return r.dehydrated!==null?(At(jt,jt.current&1),t.flags|=128,null):n&t.child.childLanes?u4(e,t,n):(At(jt,jt.current&1),e=ho(e,t,n),e!==null?e.sibling:null);At(jt,jt.current&1);break;case 19:if(r=(n&t.childLanes)!==0,e.flags&128){if(r)return d4(e,t,n);t.flags|=128}if(a=t.memoizedState,a!==null&&(a.rendering=null,a.tail=null,a.lastEffect=null),At(jt,jt.current),r)break;return null;case 22:case 23:return t.lanes=0,s4(e,t,n)}return ho(e,t,n)}var f4,f1,p4,g4;f4=function(e,t){for(var n=t.child;n!==null;){if(n.tag===5||n.tag===6)e.appendChild(n.stateNode);else if(n.tag!==4&&n.child!==null){n.child.return=n,n=n.child;continue}if(n===t)break;for(;n.sibling===null;){if(n.return===null||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}};f1=function(){};p4=function(e,t,n,r){var a=e.memoizedProps;if(a!==r){e=t.stateNode,ts(La.current);var o=null;switch(n){case"input":a=Lx(e,a),r=Lx(e,r),o=[];break;case"select":a=Ut({},a,{value:void 0}),r=Ut({},r,{value:void 0}),o=[];break;case"textarea":a=$x(e,a),r=$x(e,r),o=[];break;default:typeof a.onClick!="function"&&typeof r.onClick=="function"&&(e.onclick=lg)}jx(n,r);var i;n=null;for(c in a)if(!r.hasOwnProperty(c)&&a.hasOwnProperty(c)&&a[c]!=null)if(c==="style"){var s=a[c];for(i in s)s.hasOwnProperty(i)&&(n||(n={}),n[i]="")}else c!=="dangerouslySetInnerHTML"&&c!=="children"&&c!=="suppressContentEditableWarning"&&c!=="suppressHydrationWarning"&&c!=="autoFocus"&&(Xu.hasOwnProperty(c)?o||(o=[]):(o=o||[]).push(c,null));for(c in r){var l=r[c];if(s=a!=null?a[c]:void 0,r.hasOwnProperty(c)&&l!==s&&(l!=null||s!=null))if(c==="style")if(s){for(i in s)!s.hasOwnProperty(i)||l&&l.hasOwnProperty(i)||(n||(n={}),n[i]="");for(i in l)l.hasOwnProperty(i)&&s[i]!==l[i]&&(n||(n={}),n[i]=l[i])}else n||(o||(o=[]),o.push(c,n)),n=l;else c==="dangerouslySetInnerHTML"?(l=l?l.__html:void 0,s=s?s.__html:void 0,l!=null&&s!==l&&(o=o||[]).push(c,l)):c==="children"?typeof l!="string"&&typeof l!="number"||(o=o||[]).push(c,""+l):c!=="suppressContentEditableWarning"&&c!=="suppressHydrationWarning"&&(Xu.hasOwnProperty(c)?(l!=null&&c==="onScroll"&&It("scroll",e),o||s===l||(o=[])):(o=o||[]).push(c,l))}n&&(o=o||[]).push("style",n);var c=o;(t.updateQueue=c)&&(t.flags|=4)}};g4=function(e,t,n,r){n!==r&&(t.flags|=4)};function Jc(e,t){if(!Lt)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;t!==null;)t.alternate!==null&&(n=t),t=t.sibling;n===null?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;n!==null;)n.alternate!==null&&(r=n),n=n.sibling;r===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:r.sibling=null}}function Nn(e){var t=e.alternate!==null&&e.alternate.child===e.child,n=0,r=0;if(t)for(var a=e.child;a!==null;)n|=a.lanes|a.childLanes,r|=a.subtreeFlags&14680064,r|=a.flags&14680064,a.return=e,a=a.sibling;else for(a=e.child;a!==null;)n|=a.lanes|a.childLanes,r|=a.subtreeFlags,r|=a.flags,a.return=e,a=a.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function iV(e,t,n){var r=t.pendingProps;switch(vC(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Nn(t),null;case 1:return lr(t.type)&&cg(),Nn(t),null;case 3:return r=t.stateNode,dc(),Dt(sr),Dt(jn),TC(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),(e===null||e.child===null)&&(zf(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&!(t.flags&256)||(t.flags|=1024,ua!==null&&(S1(ua),ua=null))),f1(e,t),Nn(t),null;case 5:AC(t);var a=ts(cd.current);if(n=t.type,e!==null&&t.stateNode!=null)p4(e,t,n,r,a),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!r){if(t.stateNode===null)throw Error(ie(166));return Nn(t),null}if(e=ts(La.current),zf(t)){r=t.stateNode,n=t.type;var o=t.memoizedProps;switch(r[Na]=t,r[sd]=o,e=(t.mode&1)!==0,n){case"dialog":It("cancel",r),It("close",r);break;case"iframe":case"object":case"embed":It("load",r);break;case"video":case"audio":for(a=0;a<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=i.createElement(n,{is:r.is}):(e=i.createElement(n),n==="select"&&(i=e,r.multiple?i.multiple=!0:r.size&&(i.size=r.size))):e=i.createElementNS(e,n),e[Na]=t,e[sd]=r,f4(e,t,!1,!1),t.stateNode=e;e:{switch(i=zx(n,r),n){case"dialog":It("cancel",e),It("close",e),a=r;break;case"iframe":case"object":case"embed":It("load",e),a=r;break;case"video":case"audio":for(a=0;apc&&(t.flags|=128,r=!0,Jc(o,!1),t.lanes=4194304)}else{if(!r)if(e=hg(i),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),Jc(o,!0),o.tail===null&&o.tailMode==="hidden"&&!i.alternate&&!Lt)return Nn(t),null}else 2*Xt()-o.renderingStartTime>pc&&n!==1073741824&&(t.flags|=128,r=!0,Jc(o,!1),t.lanes=4194304);o.isBackwards?(i.sibling=t.child,t.child=i):(n=o.last,n!==null?n.sibling=i:t.child=i,o.last=i)}return o.tail!==null?(t=o.tail,o.rendering=t,o.tail=t.sibling,o.renderingStartTime=Xt(),t.sibling=null,n=jt.current,At(jt,r?n&1|2:n&1),t):(Nn(t),null);case 22:case 23:return jC(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?Sr&1073741824&&(Nn(t),t.subtreeFlags&6&&(t.flags|=8192)):Nn(t),null;case 24:return null;case 25:return null}throw Error(ie(156,t.tag))}function sV(e,t){switch(vC(t),t.tag){case 1:return lr(t.type)&&cg(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return dc(),Dt(sr),Dt(jn),TC(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return AC(t),null;case 13:if(Dt(jt),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(ie(340));cc()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Dt(jt),null;case 4:return dc(),null;case 10:return xC(t.type._context),null;case 22:case 23:return jC(),null;case 24:return null;default:return null}}var Hf=!1,Mn=!1,lV=typeof WeakSet=="function"?WeakSet:Set,Se=null;function Al(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){Gt(e,t,r)}else n.current=null}function p1(e,t,n){try{n()}catch(r){Gt(e,t,r)}}var rR=!1;function cV(e,t){if(Zx=og,e=y$(),bC(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var a=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break e}var i=0,s=-1,l=-1,c=0,u=0,d=e,g=null;t:for(;;){for(var m;d!==n||a!==0&&d.nodeType!==3||(s=i+a),d!==o||r!==0&&d.nodeType!==3||(l=i+r),d.nodeType===3&&(i+=d.nodeValue.length),(m=d.firstChild)!==null;)g=d,d=m;for(;;){if(d===e)break t;if(g===n&&++c===a&&(s=i),g===o&&++u===r&&(l=i),(m=d.nextSibling)!==null)break;d=g,g=d.parentNode}d=m}n=s===-1||l===-1?null:{start:s,end:l}}else n=null}n=n||{start:0,end:0}}else n=null;for(Xx={focusedElem:e,selectionRange:n},og=!1,Se=t;Se!==null;)if(t=Se,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,Se=e;else for(;Se!==null;){t=Se;try{var b=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(b!==null){var y=b.memoizedProps,w=b.memoizedState,v=t.stateNode,h=v.getSnapshotBeforeUpdate(t.elementType===t.type?y:ia(t.type,y),w);v.__reactInternalSnapshotBeforeUpdate=h}break;case 3:var S=t.stateNode.containerInfo;S.nodeType===1?S.textContent="":S.nodeType===9&&S.documentElement&&S.removeChild(S.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(ie(163))}}catch(E){Gt(t,t.return,E)}if(e=t.sibling,e!==null){e.return=t.return,Se=e;break}Se=t.return}return b=rR,rR=!1,b}function $u(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var a=r=r.next;do{if((a.tag&e)===e){var o=a.destroy;a.destroy=void 0,o!==void 0&&p1(t,n,o)}a=a.next}while(a!==r)}}function Em(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function g1(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function m4(e){var t=e.alternate;t!==null&&(e.alternate=null,m4(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Na],delete t[sd],delete t[e1],delete t[qH],delete t[GH])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function h4(e){return e.tag===5||e.tag===3||e.tag===4}function aR(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||h4(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function m1(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=lg));else if(r!==4&&(e=e.child,e!==null))for(m1(e,t,n),e=e.sibling;e!==null;)m1(e,t,n),e=e.sibling}function h1(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(h1(e,t,n),e=e.sibling;e!==null;)h1(e,t,n),e=e.sibling}var xn=null,la=!1;function Oo(e,t,n){for(n=n.child;n!==null;)b4(e,t,n),n=n.sibling}function b4(e,t,n){if(Da&&typeof Da.onCommitFiberUnmount=="function")try{Da.onCommitFiberUnmount(gm,n)}catch{}switch(n.tag){case 5:Mn||Al(n,t);case 6:var r=xn,a=la;xn=null,Oo(e,t,n),xn=r,la=a,xn!==null&&(la?(e=xn,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):xn.removeChild(n.stateNode));break;case 18:xn!==null&&(la?(e=xn,n=n.stateNode,e.nodeType===8?lb(e.parentNode,n):e.nodeType===1&&lb(e,n),nd(e)):lb(xn,n.stateNode));break;case 4:r=xn,a=la,xn=n.stateNode.containerInfo,la=!0,Oo(e,t,n),xn=r,la=a;break;case 0:case 11:case 14:case 15:if(!Mn&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){a=r=r.next;do{var o=a,i=o.destroy;o=o.tag,i!==void 0&&(o&2||o&4)&&p1(n,t,i),a=a.next}while(a!==r)}Oo(e,t,n);break;case 1:if(!Mn&&(Al(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(s){Gt(n,t,s)}Oo(e,t,n);break;case 21:Oo(e,t,n);break;case 22:n.mode&1?(Mn=(r=Mn)||n.memoizedState!==null,Oo(e,t,n),Mn=r):Oo(e,t,n);break;default:Oo(e,t,n)}}function oR(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new lV),t.forEach(function(r){var a=yV.bind(null,e,r);n.has(r)||(n.add(r),r.then(a,a))})}}function aa(e,t){var n=t.deletions;if(n!==null)for(var r=0;ra&&(a=i),r&=~o}if(r=a,r=Xt()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*dV(r/1960))-r,10e?16:e,oi===null)var r=!1;else{if(e=oi,oi=null,wg=0,dt&6)throw Error(ie(331));var a=dt;for(dt|=4,Se=e.current;Se!==null;){var o=Se,i=o.child;if(Se.flags&16){var s=o.deletions;if(s!==null){for(var l=0;lXt()-$C?hs(e,0):PC|=n),cr(e,t)}function C4(e,t){t===0&&(e.mode&1?(t=Lf,Lf<<=1,!(Lf&130023424)&&(Lf=4194304)):t=1);var n=Xn();e=mo(e,t),e!==null&&(Yd(e,t,n),cr(e,n))}function bV(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),C4(e,n)}function yV(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(ie(314))}r!==null&&r.delete(t),C4(e,n)}var _4;_4=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||sr.current)ir=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return ir=!1,oV(e,t,n);ir=!!(e.flags&131072)}else ir=!1,Lt&&t.flags&1048576&&R$(t,fg,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Lp(e,t),e=t.pendingProps;var a=lc(t,jn.current);Fl(t,n),a=NC(null,t,r,e,a,n);var o=IC();return t.flags|=1,typeof a=="object"&&a!==null&&typeof a.render=="function"&&a.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,lr(r)?(o=!0,ug(t)):o=!1,t.memoizedState=a.state!==null&&a.state!==void 0?a.state:null,CC(t),a.updater=Sm,t.stateNode=a,a._reactInternals=t,i1(t,r,e,n),t=c1(null,t,r,!0,o,n)):(t.tag=0,Lt&&o&&yC(t),Kn(null,t,a,n),t=t.child),t;case 16:r=t.elementType;e:{switch(Lp(e,t),e=t.pendingProps,a=r._init,r=a(r._payload),t.type=r,a=t.tag=SV(r),e=ia(r,e),a){case 0:t=l1(null,t,r,e,n);break e;case 1:t=eR(null,t,r,e,n);break e;case 11:t=QT(null,t,r,e,n);break e;case 14:t=JT(null,t,r,ia(r.type,e),n);break e}throw Error(ie(306,r,""))}return t;case 0:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:ia(r,a),l1(e,t,r,a,n);case 1:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:ia(r,a),eR(e,t,r,a,n);case 3:e:{if(c4(t),e===null)throw Error(ie(387));r=t.pendingProps,o=t.memoizedState,a=o.element,D$(e,t),mg(t,r,null,n);var i=t.memoizedState;if(r=i.element,o.isDehydrated)if(o={element:r,isDehydrated:!1,cache:i.cache,pendingSuspenseBoundaries:i.pendingSuspenseBoundaries,transitions:i.transitions},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){a=fc(Error(ie(423)),t),t=tR(e,t,r,n,a);break e}else if(r!==a){a=fc(Error(ie(424)),t),t=tR(e,t,r,n,a);break e}else for(xr=fi(t.stateNode.containerInfo.firstChild),Cr=t,Lt=!0,ua=null,n=$$(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(cc(),r===a){t=ho(e,t,n);break e}Kn(e,t,r,n)}t=t.child}return t;case 5:return F$(t),e===null&&r1(t),r=t.type,a=t.pendingProps,o=e!==null?e.memoizedProps:null,i=a.children,Qx(r,a)?i=null:o!==null&&Qx(r,o)&&(t.flags|=32),l4(e,t),Kn(e,t,i,n),t.child;case 6:return e===null&&r1(t),null;case 13:return u4(e,t,n);case 4:return _C(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=uc(t,null,r,n):Kn(e,t,r,n),t.child;case 11:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:ia(r,a),QT(e,t,r,a,n);case 7:return Kn(e,t,t.pendingProps,n),t.child;case 8:return Kn(e,t,t.pendingProps.children,n),t.child;case 12:return Kn(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,a=t.pendingProps,o=t.memoizedProps,i=a.value,At(pg,r._currentValue),r._currentValue=i,o!==null)if(ha(o.value,i)){if(o.children===a.children&&!sr.current){t=ho(e,t,n);break e}}else for(o=t.child,o!==null&&(o.return=t);o!==null;){var s=o.dependencies;if(s!==null){i=o.child;for(var l=s.firstContext;l!==null;){if(l.context===r){if(o.tag===1){l=co(-1,n&-n),l.tag=2;var c=o.updateQueue;if(c!==null){c=c.shared;var u=c.pending;u===null?l.next=l:(l.next=u.next,u.next=l),c.pending=l}}o.lanes|=n,l=o.alternate,l!==null&&(l.lanes|=n),a1(o.return,n,t),s.lanes|=n;break}l=l.next}}else if(o.tag===10)i=o.type===t.type?null:o.child;else if(o.tag===18){if(i=o.return,i===null)throw Error(ie(341));i.lanes|=n,s=i.alternate,s!==null&&(s.lanes|=n),a1(i,n,t),i=o.sibling}else i=o.child;if(i!==null)i.return=o;else for(i=o;i!==null;){if(i===t){i=null;break}if(o=i.sibling,o!==null){o.return=i.return,i=o;break}i=i.return}o=i}Kn(e,t,a.children,n),t=t.child}return t;case 9:return a=t.type,r=t.pendingProps.children,Fl(t,n),a=Kr(a),r=r(a),t.flags|=1,Kn(e,t,r,n),t.child;case 14:return r=t.type,a=ia(r,t.pendingProps),a=ia(r.type,a),JT(e,t,r,a,n);case 15:return i4(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:ia(r,a),Lp(e,t),t.tag=1,lr(r)?(e=!0,ug(t)):e=!1,Fl(t,n),M$(t,r,a),i1(t,r,a,n),c1(null,t,r,!0,e,n);case 19:return d4(e,t,n);case 22:return s4(e,t,n)}throw Error(ie(156,t.tag))};function A4(e,t){return JP(e,t)}function vV(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Vr(e,t,n,r){return new vV(e,t,n,r)}function UC(e){return e=e.prototype,!(!e||!e.isReactComponent)}function SV(e){if(typeof e=="function")return UC(e)?1:0;if(e!=null){if(e=e.$$typeof,e===iC)return 11;if(e===sC)return 14}return 2}function hi(e,t){var n=e.alternate;return n===null?(n=Vr(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function $p(e,t,n,r,a,o){var i=2;if(r=e,typeof e=="function")UC(e)&&(i=1);else if(typeof e=="string")i=5;else e:switch(e){case yl:return bs(n.children,a,o,t);case oC:i=8,a|=8;break;case Nx:return e=Vr(12,n,t,a|2),e.elementType=Nx,e.lanes=o,e;case Ix:return e=Vr(13,n,t,a),e.elementType=Ix,e.lanes=o,e;case Ox:return e=Vr(19,n,t,a),e.elementType=Ox,e.lanes=o,e;case PP:return km(n,a,o,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case LP:i=10;break e;case MP:i=9;break e;case iC:i=11;break e;case sC:i=14;break e;case qo:i=16,r=null;break e}throw Error(ie(130,e==null?e:typeof e,""))}return t=Vr(i,n,t,a),t.elementType=e,t.type=r,t.lanes=o,t}function bs(e,t,n,r){return e=Vr(7,e,r,t),e.lanes=n,e}function km(e,t,n,r){return e=Vr(22,e,r,t),e.elementType=PP,e.lanes=n,e.stateNode={isHidden:!1},e}function hb(e,t,n){return e=Vr(6,e,null,t),e.lanes=n,e}function bb(e,t,n){return t=Vr(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function wV(e,t,n,r,a){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Xh(0),this.expirationTimes=Xh(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Xh(0),this.identifierPrefix=r,this.onRecoverableError=a,this.mutableSourceEagerHydrationData=null}function BC(e,t,n,r,a,o,i,s,l){return e=new wV(e,t,n,s,l),t===1?(t=1,o===!0&&(t|=8)):t=0,o=Vr(3,null,null,t),e.current=o,o.stateNode=e,o.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},CC(o),e}function EV(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(I4)}catch(e){console.error(e)}}I4(),RP.exports=Rr;var ba=RP.exports;const GC=Tc(ba),AV=yP({__proto__:null,default:GC},[ba]);var O4,pR=ba;O4=pR.createRoot,pR.hydrateRoot;function W(){return W=Object.assign?Object.assign.bind():function(e){for(var t=1;te.forEach(n=>TV(n,t))}function nt(...e){return p.useCallback(WC(...e),e)}function RV(e,t){const n=p.createContext(t);function r(o){const{children:i,...s}=o,l=p.useMemo(()=>s,Object.values(s));return p.createElement(n.Provider,{value:l},i)}function a(o){const i=p.useContext(n);if(i)return i;if(t!==void 0)return t;throw new Error(`\`${o}\` must be used within \`${e}\``)}return r.displayName=e+"Provider",[r,a]}function zn(e,t=[]){let n=[];function r(o,i){const s=p.createContext(i),l=n.length;n=[...n,i];function c(d){const{scope:g,children:m,...b}=d,y=(g==null?void 0:g[e][l])||s,w=p.useMemo(()=>b,Object.values(b));return p.createElement(y.Provider,{value:w},m)}function u(d,g){const m=(g==null?void 0:g[e][l])||s,b=p.useContext(m);if(b)return b;if(i!==void 0)return i;throw new Error(`\`${d}\` must be used within \`${o}\``)}return c.displayName=o+"Provider",[c,u]}const a=()=>{const o=n.map(i=>p.createContext(i));return function(s){const l=(s==null?void 0:s[e])||o;return p.useMemo(()=>({[`__scope${e}`]:{...s,[e]:l}}),[s,l])}};return a.scopeName=e,[r,NV(a,...t)]}function NV(...e){const t=e[0];if(e.length===1)return t;const n=()=>{const r=e.map(a=>({useScope:a(),scopeName:a.scopeName}));return function(o){const i=r.reduce((s,{useScope:l,scopeName:c})=>{const d=l(o)[`__scope${c}`];return{...s,...d}},{});return p.useMemo(()=>({[`__scope${t.scopeName}`]:i}),[i])}};return n.scopeName=t.scopeName,n}const $a=p.forwardRef((e,t)=>{const{children:n,...r}=e,a=p.Children.toArray(n),o=a.find(IV);if(o){const i=o.props.children,s=a.map(l=>l===o?p.Children.count(i)>1?p.Children.only(null):p.isValidElement(i)?i.props.children:null:l);return p.createElement(w1,W({},r,{ref:t}),p.isValidElement(i)?p.cloneElement(i,void 0,s):null)}return p.createElement(w1,W({},r,{ref:t}),n)});$a.displayName="Slot";const w1=p.forwardRef((e,t)=>{const{children:n,...r}=e;return p.isValidElement(n)?p.cloneElement(n,{...OV(r,n.props),ref:t?WC(t,n.ref):n.ref}):p.Children.count(n)>1?p.Children.only(null):null});w1.displayName="SlotClone";const Rm=({children:e})=>p.createElement(p.Fragment,null,e);function IV(e){return p.isValidElement(e)&&e.type===Rm}function OV(e,t){const n={...t};for(const r in t){const a=e[r],o=t[r];/^on[A-Z]/.test(r)?a&&o?n[r]=(...s)=>{o(...s),a(...s)}:a&&(n[r]=a):r==="style"?n[r]={...a,...o}:r==="className"&&(n[r]=[a,o].filter(Boolean).join(" "))}return{...e,...n}}function Nm(e){const t=e+"CollectionProvider",[n,r]=zn(t),[a,o]=n(t,{collectionRef:{current:null},itemMap:new Map}),i=m=>{const{scope:b,children:y}=m,w=Ae.useRef(null),v=Ae.useRef(new Map).current;return Ae.createElement(a,{scope:b,itemMap:v,collectionRef:w},y)},s=e+"CollectionSlot",l=Ae.forwardRef((m,b)=>{const{scope:y,children:w}=m,v=o(s,y),h=nt(b,v.collectionRef);return Ae.createElement($a,{ref:h},w)}),c=e+"CollectionItemSlot",u="data-radix-collection-item",d=Ae.forwardRef((m,b)=>{const{scope:y,children:w,...v}=m,h=Ae.useRef(null),S=nt(b,h),E=o(c,y);return Ae.useEffect(()=>(E.itemMap.set(h,{ref:h,...v}),()=>void E.itemMap.delete(h))),Ae.createElement($a,{[u]:"",ref:S},w)});function g(m){const b=o(e+"CollectionConsumer",m);return Ae.useCallback(()=>{const w=b.collectionRef.current;if(!w)return[];const v=Array.from(w.querySelectorAll(`[${u}]`));return Array.from(b.itemMap.values()).sort((E,k)=>v.indexOf(E.ref.current)-v.indexOf(k.ref.current))},[b.collectionRef,b.itemMap])}return[{Provider:i,Slot:l,ItemSlot:d},g,r]}const DV=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","span","svg","ul"],ze=DV.reduce((e,t)=>{const n=p.forwardRef((r,a)=>{const{asChild:o,...i}=r,s=o?$a:t;return p.useEffect(()=>{window[Symbol.for("radix-ui")]=!0},[]),p.createElement(s,W({},i,{ref:a}))});return n.displayName=`Primitive.${t}`,{...e,[t]:n}},{});function KC(e,t){e&&ba.flushSync(()=>e.dispatchEvent(t))}function ur(e){const t=p.useRef(e);return p.useEffect(()=>{t.current=e}),p.useMemo(()=>(...n)=>{var r;return(r=t.current)===null||r===void 0?void 0:r.call(t,...n)},[])}function LV(e,t=globalThis==null?void 0:globalThis.document){const n=ur(e);p.useEffect(()=>{const r=a=>{a.key==="Escape"&&n(a)};return t.addEventListener("keydown",r),()=>t.removeEventListener("keydown",r)},[n,t])}const E1="dismissableLayer.update",MV="dismissableLayer.pointerDownOutside",PV="dismissableLayer.focusOutside";let gR;const D4=p.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),Ls=p.forwardRef((e,t)=>{var n;const{disableOutsidePointerEvents:r=!1,onEscapeKeyDown:a,onPointerDownOutside:o,onFocusOutside:i,onInteractOutside:s,onDismiss:l,...c}=e,u=p.useContext(D4),[d,g]=p.useState(null),m=(n=d==null?void 0:d.ownerDocument)!==null&&n!==void 0?n:globalThis==null?void 0:globalThis.document,[,b]=p.useState({}),y=nt(t,_=>g(_)),w=Array.from(u.layers),[v]=[...u.layersWithOutsidePointerEventsDisabled].slice(-1),h=w.indexOf(v),S=d?w.indexOf(d):-1,E=u.layersWithOutsidePointerEventsDisabled.size>0,k=S>=h,x=FV(_=>{const R=_.target,T=[...u.branches].some(L=>L.contains(R));!k||T||(o==null||o(_),s==null||s(_),_.defaultPrevented||l==null||l())},m),C=jV(_=>{const R=_.target;[...u.branches].some(L=>L.contains(R))||(i==null||i(_),s==null||s(_),_.defaultPrevented||l==null||l())},m);return LV(_=>{S===u.layers.size-1&&(a==null||a(_),!_.defaultPrevented&&l&&(_.preventDefault(),l()))},m),p.useEffect(()=>{if(d)return r&&(u.layersWithOutsidePointerEventsDisabled.size===0&&(gR=m.body.style.pointerEvents,m.body.style.pointerEvents="none"),u.layersWithOutsidePointerEventsDisabled.add(d)),u.layers.add(d),mR(),()=>{r&&u.layersWithOutsidePointerEventsDisabled.size===1&&(m.body.style.pointerEvents=gR)}},[d,m,r,u]),p.useEffect(()=>()=>{d&&(u.layers.delete(d),u.layersWithOutsidePointerEventsDisabled.delete(d),mR())},[d,u]),p.useEffect(()=>{const _=()=>b({});return document.addEventListener(E1,_),()=>document.removeEventListener(E1,_)},[]),p.createElement(ze.div,W({},c,{ref:y,style:{pointerEvents:E?k?"auto":"none":void 0,...e.style},onFocusCapture:fe(e.onFocusCapture,C.onFocusCapture),onBlurCapture:fe(e.onBlurCapture,C.onBlurCapture),onPointerDownCapture:fe(e.onPointerDownCapture,x.onPointerDownCapture)}))}),$V=p.forwardRef((e,t)=>{const n=p.useContext(D4),r=p.useRef(null),a=nt(t,r);return p.useEffect(()=>{const o=r.current;if(o)return n.branches.add(o),()=>{n.branches.delete(o)}},[n.branches]),p.createElement(ze.div,W({},e,{ref:a}))});function FV(e,t=globalThis==null?void 0:globalThis.document){const n=ur(e),r=p.useRef(!1),a=p.useRef(()=>{});return p.useEffect(()=>{const o=s=>{if(s.target&&!r.current){let u=function(){L4(MV,n,c,{discrete:!0})};var l=u;const c={originalEvent:s};s.pointerType==="touch"?(t.removeEventListener("click",a.current),a.current=u,t.addEventListener("click",a.current,{once:!0})):u()}else t.removeEventListener("click",a.current);r.current=!1},i=window.setTimeout(()=>{t.addEventListener("pointerdown",o)},0);return()=>{window.clearTimeout(i),t.removeEventListener("pointerdown",o),t.removeEventListener("click",a.current)}},[t,n]),{onPointerDownCapture:()=>r.current=!0}}function jV(e,t=globalThis==null?void 0:globalThis.document){const n=ur(e),r=p.useRef(!1);return p.useEffect(()=>{const a=o=>{o.target&&!r.current&&L4(PV,n,{originalEvent:o},{discrete:!1})};return t.addEventListener("focusin",a),()=>t.removeEventListener("focusin",a)},[t,n]),{onFocusCapture:()=>r.current=!0,onBlurCapture:()=>r.current=!1}}function mR(){const e=new CustomEvent(E1);document.dispatchEvent(e)}function L4(e,t,n,{discrete:r}){const a=n.originalEvent.target,o=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&a.addEventListener(e,t,{once:!0}),r?KC(a,o):a.dispatchEvent(o)}const zV=Ls,UV=$V,Jd=p.forwardRef((e,t)=>{var n;const{container:r=globalThis==null||(n=globalThis.document)===null||n===void 0?void 0:n.body,...a}=e;return r?GC.createPortal(p.createElement(ze.div,W({},a,{ref:t})),r):null}),Zr=globalThis!=null&&globalThis.document?p.useLayoutEffect:()=>{};function BV(e,t){return p.useReducer((n,r)=>{const a=t[n][r];return a??n},e)}const pr=e=>{const{present:t,children:n}=e,r=HV(t),a=typeof n=="function"?n({present:r.isPresent}):p.Children.only(n),o=nt(r.ref,a.ref);return typeof n=="function"||r.isPresent?p.cloneElement(a,{ref:o}):null};pr.displayName="Presence";function HV(e){const[t,n]=p.useState(),r=p.useRef({}),a=p.useRef(e),o=p.useRef("none"),i=e?"mounted":"unmounted",[s,l]=BV(i,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return p.useEffect(()=>{const c=Gf(r.current);o.current=s==="mounted"?c:"none"},[s]),Zr(()=>{const c=r.current,u=a.current;if(u!==e){const g=o.current,m=Gf(c);e?l("MOUNT"):m==="none"||(c==null?void 0:c.display)==="none"?l("UNMOUNT"):l(u&&g!==m?"ANIMATION_OUT":"UNMOUNT"),a.current=e}},[e,l]),Zr(()=>{if(t){const c=d=>{const m=Gf(r.current).includes(d.animationName);d.target===t&&m&&ba.flushSync(()=>l("ANIMATION_END"))},u=d=>{d.target===t&&(o.current=Gf(r.current))};return t.addEventListener("animationstart",u),t.addEventListener("animationcancel",c),t.addEventListener("animationend",c),()=>{t.removeEventListener("animationstart",u),t.removeEventListener("animationcancel",c),t.removeEventListener("animationend",c)}}else l("ANIMATION_END")},[t,l]),{isPresent:["mounted","unmountSuspended"].includes(s),ref:p.useCallback(c=>{c&&(r.current=getComputedStyle(c)),n(c)},[])}}function Gf(e){return(e==null?void 0:e.animationName)||"none"}function Fa({prop:e,defaultProp:t,onChange:n=()=>{}}){const[r,a]=VV({defaultProp:t,onChange:n}),o=e!==void 0,i=o?e:r,s=ur(n),l=p.useCallback(c=>{if(o){const d=typeof c=="function"?c(e):c;d!==e&&s(d)}else a(c)},[o,e,a,s]);return[i,l]}function VV({defaultProp:e,onChange:t}){const n=p.useState(e),[r]=n,a=p.useRef(r),o=ur(t);return p.useEffect(()=>{a.current!==r&&(o(r),a.current=r)},[r,a,o]),n}const Im=p.forwardRef((e,t)=>p.createElement(ze.span,W({},e,{ref:t,style:{position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal",...e.style}}))),qV=Im,M4="ToastProvider",[YC,GV,WV]=Nm("Toast"),[P4,JAe]=zn("Toast",[WV]),[KV,Om]=P4(M4),$4=e=>{const{__scopeToast:t,label:n="Notification",duration:r=5e3,swipeDirection:a="right",swipeThreshold:o=50,children:i}=e,[s,l]=p.useState(null),[c,u]=p.useState(0),d=p.useRef(!1),g=p.useRef(!1);return p.createElement(YC.Provider,{scope:t},p.createElement(KV,{scope:t,label:n,duration:r,swipeDirection:a,swipeThreshold:o,toastCount:c,viewport:s,onViewportChange:l,onToastAdd:p.useCallback(()=>u(m=>m+1),[]),onToastRemove:p.useCallback(()=>u(m=>m-1),[]),isFocusedToastEscapeKeyDownRef:d,isClosePausedRef:g},i))};$4.propTypes={label(e){if(e.label&&typeof e.label=="string"&&!e.label.trim()){const t=`Invalid prop \`label\` supplied to \`${M4}\`. Expected non-empty \`string\`.`;return new Error(t)}return null}};const YV="ToastViewport",ZV=["F8"],x1="toast.viewportPause",k1="toast.viewportResume",XV=p.forwardRef((e,t)=>{const{__scopeToast:n,hotkey:r=ZV,label:a="Notifications ({hotkey})",...o}=e,i=Om(YV,n),s=GV(n),l=p.useRef(null),c=p.useRef(null),u=p.useRef(null),d=p.useRef(null),g=nt(t,d,i.onViewportChange),m=r.join("+").replace(/Key/g,"").replace(/Digit/g,""),b=i.toastCount>0;p.useEffect(()=>{const w=v=>{var h;r.every(E=>v[E]||v.code===E)&&((h=d.current)===null||h===void 0||h.focus())};return document.addEventListener("keydown",w),()=>document.removeEventListener("keydown",w)},[r]),p.useEffect(()=>{const w=l.current,v=d.current;if(b&&w&&v){const h=()=>{if(!i.isClosePausedRef.current){const x=new CustomEvent(x1);v.dispatchEvent(x),i.isClosePausedRef.current=!0}},S=()=>{if(i.isClosePausedRef.current){const x=new CustomEvent(k1);v.dispatchEvent(x),i.isClosePausedRef.current=!1}},E=x=>{!w.contains(x.relatedTarget)&&S()},k=()=>{w.contains(document.activeElement)||S()};return w.addEventListener("focusin",h),w.addEventListener("focusout",E),w.addEventListener("pointermove",h),w.addEventListener("pointerleave",k),window.addEventListener("blur",h),window.addEventListener("focus",S),()=>{w.removeEventListener("focusin",h),w.removeEventListener("focusout",E),w.removeEventListener("pointermove",h),w.removeEventListener("pointerleave",k),window.removeEventListener("blur",h),window.removeEventListener("focus",S)}}},[b,i.isClosePausedRef]);const y=p.useCallback(({tabbingDirection:w})=>{const h=s().map(S=>{const E=S.ref.current,k=[E,...pq(E)];return w==="forwards"?k:k.reverse()});return(w==="forwards"?h.reverse():h).flat()},[s]);return p.useEffect(()=>{const w=d.current;if(w){const v=h=>{const S=h.altKey||h.ctrlKey||h.metaKey;if(h.key==="Tab"&&!S){const _=document.activeElement,R=h.shiftKey;if(h.target===w&&R){var k;(k=c.current)===null||k===void 0||k.focus();return}const D=y({tabbingDirection:R?"backwards":"forwards"}),H=D.findIndex(z=>z===_);if(yb(D.slice(H+1)))h.preventDefault();else{var x,C;R?(x=c.current)===null||x===void 0||x.focus():(C=u.current)===null||C===void 0||C.focus()}}};return w.addEventListener("keydown",v),()=>w.removeEventListener("keydown",v)}},[s,y]),p.createElement(UV,{ref:l,role:"region","aria-label":a.replace("{hotkey}",m),tabIndex:-1,style:{pointerEvents:b?void 0:"none"}},b&&p.createElement(hR,{ref:c,onFocusFromOutsideViewport:()=>{const w=y({tabbingDirection:"forwards"});yb(w)}}),p.createElement(YC.Slot,{scope:n},p.createElement(ze.ol,W({tabIndex:-1},o,{ref:g}))),b&&p.createElement(hR,{ref:u,onFocusFromOutsideViewport:()=>{const w=y({tabbingDirection:"backwards"});yb(w)}}))}),QV="ToastFocusProxy",hR=p.forwardRef((e,t)=>{const{__scopeToast:n,onFocusFromOutsideViewport:r,...a}=e,o=Om(QV,n);return p.createElement(Im,W({"aria-hidden":!0,tabIndex:0},a,{ref:t,style:{position:"fixed"},onFocus:i=>{var s;const l=i.relatedTarget;!((s=o.viewport)!==null&&s!==void 0&&s.contains(l))&&r()}}))}),Dm="Toast",JV="toast.swipeStart",eq="toast.swipeMove",tq="toast.swipeCancel",nq="toast.swipeEnd",rq=p.forwardRef((e,t)=>{const{forceMount:n,open:r,defaultOpen:a,onOpenChange:o,...i}=e,[s=!0,l]=Fa({prop:r,defaultProp:a,onChange:o});return p.createElement(pr,{present:n||s},p.createElement(F4,W({open:s},i,{ref:t,onClose:()=>l(!1),onPause:ur(e.onPause),onResume:ur(e.onResume),onSwipeStart:fe(e.onSwipeStart,c=>{c.currentTarget.setAttribute("data-swipe","start")}),onSwipeMove:fe(e.onSwipeMove,c=>{const{x:u,y:d}=c.detail.delta;c.currentTarget.setAttribute("data-swipe","move"),c.currentTarget.style.setProperty("--radix-toast-swipe-move-x",`${u}px`),c.currentTarget.style.setProperty("--radix-toast-swipe-move-y",`${d}px`)}),onSwipeCancel:fe(e.onSwipeCancel,c=>{c.currentTarget.setAttribute("data-swipe","cancel"),c.currentTarget.style.removeProperty("--radix-toast-swipe-move-x"),c.currentTarget.style.removeProperty("--radix-toast-swipe-move-y"),c.currentTarget.style.removeProperty("--radix-toast-swipe-end-x"),c.currentTarget.style.removeProperty("--radix-toast-swipe-end-y")}),onSwipeEnd:fe(e.onSwipeEnd,c=>{const{x:u,y:d}=c.detail.delta;c.currentTarget.setAttribute("data-swipe","end"),c.currentTarget.style.removeProperty("--radix-toast-swipe-move-x"),c.currentTarget.style.removeProperty("--radix-toast-swipe-move-y"),c.currentTarget.style.setProperty("--radix-toast-swipe-end-x",`${u}px`),c.currentTarget.style.setProperty("--radix-toast-swipe-end-y",`${d}px`),l(!1)})})))}),[aq,oq]=P4(Dm,{onClose(){}}),F4=p.forwardRef((e,t)=>{const{__scopeToast:n,type:r="foreground",duration:a,open:o,onClose:i,onEscapeKeyDown:s,onPause:l,onResume:c,onSwipeStart:u,onSwipeMove:d,onSwipeCancel:g,onSwipeEnd:m,...b}=e,y=Om(Dm,n),[w,v]=p.useState(null),h=nt(t,z=>v(z)),S=p.useRef(null),E=p.useRef(null),k=a||y.duration,x=p.useRef(0),C=p.useRef(k),_=p.useRef(0),{onToastAdd:R,onToastRemove:T}=y,L=ur(()=>{var z;(w==null?void 0:w.contains(document.activeElement))&&((z=y.viewport)===null||z===void 0||z.focus()),i()}),D=p.useCallback(z=>{!z||z===1/0||(window.clearTimeout(_.current),x.current=new Date().getTime(),_.current=window.setTimeout(L,z))},[L]);p.useEffect(()=>{const z=y.viewport;if(z){const M=()=>{D(C.current),c==null||c()},U=()=>{const X=new Date().getTime()-x.current;C.current=C.current-X,window.clearTimeout(_.current),l==null||l()};return z.addEventListener(x1,U),z.addEventListener(k1,M),()=>{z.removeEventListener(x1,U),z.removeEventListener(k1,M)}}},[y.viewport,k,l,c,D]),p.useEffect(()=>{o&&!y.isClosePausedRef.current&&D(k)},[o,k,y.isClosePausedRef,D]),p.useEffect(()=>(R(),()=>T()),[R,T]);const H=p.useMemo(()=>w?B4(w):null,[w]);return y.viewport?p.createElement(p.Fragment,null,H&&p.createElement(iq,{__scopeToast:n,role:"status","aria-live":r==="foreground"?"assertive":"polite","aria-atomic":!0},H),p.createElement(aq,{scope:n,onClose:L},ba.createPortal(p.createElement(YC.ItemSlot,{scope:n},p.createElement(zV,{asChild:!0,onEscapeKeyDown:fe(s,()=>{y.isFocusedToastEscapeKeyDownRef.current||L(),y.isFocusedToastEscapeKeyDownRef.current=!1})},p.createElement(ze.li,W({role:"status","aria-live":"off","aria-atomic":!0,tabIndex:0,"data-state":o?"open":"closed","data-swipe-direction":y.swipeDirection},b,{ref:h,style:{userSelect:"none",touchAction:"none",...e.style},onKeyDown:fe(e.onKeyDown,z=>{z.key==="Escape"&&(s==null||s(z.nativeEvent),z.nativeEvent.defaultPrevented||(y.isFocusedToastEscapeKeyDownRef.current=!0,L()))}),onPointerDown:fe(e.onPointerDown,z=>{z.button===0&&(S.current={x:z.clientX,y:z.clientY})}),onPointerMove:fe(e.onPointerMove,z=>{if(!S.current)return;const M=z.clientX-S.current.x,U=z.clientY-S.current.y,X=!!E.current,j=["left","right"].includes(y.swipeDirection),O=["left","up"].includes(y.swipeDirection)?Math.min:Math.max,A=j?O(0,M):0,V=j?0:O(0,U),P=z.pointerType==="touch"?10:2,N={x:A,y:V},K={originalEvent:z,delta:N};X?(E.current=N,Wf(eq,d,K,{discrete:!1})):bR(N,y.swipeDirection,P)?(E.current=N,Wf(JV,u,K,{discrete:!1}),z.target.setPointerCapture(z.pointerId)):(Math.abs(M)>P||Math.abs(U)>P)&&(S.current=null)}),onPointerUp:fe(e.onPointerUp,z=>{const M=E.current,U=z.target;if(U.hasPointerCapture(z.pointerId)&&U.releasePointerCapture(z.pointerId),E.current=null,S.current=null,M){const X=z.currentTarget,j={originalEvent:z,delta:M};bR(M,y.swipeDirection,y.swipeThreshold)?Wf(nq,m,j,{discrete:!0}):Wf(tq,g,j,{discrete:!0}),X.addEventListener("click",O=>O.preventDefault(),{once:!0})}})})))),y.viewport))):null});F4.propTypes={type(e){if(e.type&&!["foreground","background"].includes(e.type)){const t=`Invalid prop \`type\` supplied to \`${Dm}\`. Expected \`foreground | background\`.`;return new Error(t)}return null}};const iq=e=>{const{__scopeToast:t,children:n,...r}=e,a=Om(Dm,t),[o,i]=p.useState(!1),[s,l]=p.useState(!1);return dq(()=>i(!0)),p.useEffect(()=>{const c=window.setTimeout(()=>l(!0),1e3);return()=>window.clearTimeout(c)},[]),s?null:p.createElement(Jd,{asChild:!0},p.createElement(Im,r,o&&p.createElement(p.Fragment,null,a.label," ",n)))},sq=p.forwardRef((e,t)=>{const{__scopeToast:n,...r}=e;return p.createElement(ze.div,W({},r,{ref:t}))}),lq=p.forwardRef((e,t)=>{const{__scopeToast:n,...r}=e;return p.createElement(ze.div,W({},r,{ref:t}))}),cq="ToastAction",j4=p.forwardRef((e,t)=>{const{altText:n,...r}=e;return n?p.createElement(U4,{altText:n,asChild:!0},p.createElement(z4,W({},r,{ref:t}))):null});j4.propTypes={altText(e){return e.altText?null:new Error(`Missing prop \`altText\` expected on \`${cq}\``)}};const uq="ToastClose",z4=p.forwardRef((e,t)=>{const{__scopeToast:n,...r}=e,a=oq(uq,n);return p.createElement(U4,{asChild:!0},p.createElement(ze.button,W({type:"button"},r,{ref:t,onClick:fe(e.onClick,a.onClose)})))}),U4=p.forwardRef((e,t)=>{const{__scopeToast:n,altText:r,...a}=e;return p.createElement(ze.div,W({"data-radix-toast-announce-exclude":"","data-radix-toast-announce-alt":r||void 0},a,{ref:t}))});function B4(e){const t=[];return Array.from(e.childNodes).forEach(r=>{if(r.nodeType===r.TEXT_NODE&&r.textContent&&t.push(r.textContent),fq(r)){const a=r.ariaHidden||r.hidden||r.style.display==="none",o=r.dataset.radixToastAnnounceExclude==="";if(!a)if(o){const i=r.dataset.radixToastAnnounceAlt;i&&t.push(i)}else t.push(...B4(r))}}),t}function Wf(e,t,n,{discrete:r}){const a=n.originalEvent.currentTarget,o=new CustomEvent(e,{bubbles:!0,cancelable:!0,detail:n});t&&a.addEventListener(e,t,{once:!0}),r?KC(a,o):a.dispatchEvent(o)}const bR=(e,t,n=0)=>{const r=Math.abs(e.x),a=Math.abs(e.y),o=r>a;return t==="left"||t==="right"?o&&r>n:!o&&a>n};function dq(e=()=>{}){const t=ur(e);Zr(()=>{let n=0,r=0;return n=window.requestAnimationFrame(()=>r=window.requestAnimationFrame(t)),()=>{window.cancelAnimationFrame(n),window.cancelAnimationFrame(r)}},[t])}function fq(e){return e.nodeType===e.ELEMENT_NODE}function pq(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>{const a=r.tagName==="INPUT"&&r.type==="hidden";return r.disabled||r.hidden||a?NodeFilter.FILTER_SKIP:r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function yb(e){const t=document.activeElement;return e.some(n=>n===t?!0:(n.focus(),document.activeElement!==t))}const gq=$4,H4=XV,V4=rq,q4=sq,G4=lq,W4=j4,K4=z4;function Y4(e){var t,n,r="";if(typeof e=="string"||typeof e=="number")r+=e;else if(typeof e=="object")if(Array.isArray(e))for(t=0;ttypeof e=="boolean"?"".concat(e):e===0?"0":e,vR=Z4,ef=(e,t)=>n=>{var r;if((t==null?void 0:t.variants)==null)return vR(e,n==null?void 0:n.class,n==null?void 0:n.className);const{variants:a,defaultVariants:o}=t,i=Object.keys(a).map(c=>{const u=n==null?void 0:n[c],d=o==null?void 0:o[c];if(u===null)return null;const g=yR(u)||yR(d);return a[c][g]}),s=n&&Object.entries(n).reduce((c,u)=>{let[d,g]=u;return g===void 0||(c[d]=g),c},{}),l=t==null||(r=t.compoundVariants)===null||r===void 0?void 0:r.reduce((c,u)=>{let{class:d,className:g,...m}=u;return Object.entries(m).every(b=>{let[y,w]=b;return Array.isArray(w)?w.includes({...o,...s}[y]):{...o,...s}[y]===w})?[...c,d,g]:c},[]);return vR(e,i,l,n==null?void 0:n.class,n==null?void 0:n.className)};var mq={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};const hq=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),Be=(e,t)=>{const n=p.forwardRef(({color:r="currentColor",size:a=24,strokeWidth:o=2,absoluteStrokeWidth:i,children:s,...l},c)=>p.createElement("svg",{ref:c,...mq,width:a,height:a,stroke:r,strokeWidth:i?Number(o)*24/Number(a):o,className:`lucide lucide-${hq(e)}`,...l},[...t.map(([u,d])=>p.createElement(u,d)),...(Array.isArray(s)?s:[s])||[]]));return n.displayName=`${e}`,n},X4=Be("AlertCircle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]]),bq=Be("Archive",[["rect",{width:"20",height:"5",x:"2",y:"3",rx:"1",key:"1wp1u1"}],["path",{d:"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8",key:"1s80jp"}],["path",{d:"M10 12h4",key:"a56b0p"}]]),yq=Be("ArrowDownWideNarrow",[["path",{d:"m3 16 4 4 4-4",key:"1co6wj"}],["path",{d:"M7 20V4",key:"1yoxec"}],["path",{d:"M11 4h10",key:"1w87gc"}],["path",{d:"M11 8h7",key:"djye34"}],["path",{d:"M11 12h4",key:"q8tih4"}]]),Lm=Be("Bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]]),vq=Be("CalendarSearch",[["path",{d:"M21 12V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14c0 1.1.9 2 2 2h7.5",key:"18ncp8"}],["path",{d:"M16 2v4",key:"4m81vk"}],["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M3 10h18",key:"8toen8"}],["path",{d:"M18 21a3 3 0 1 0 0-6 3 3 0 0 0 0 6v0Z",key:"mgbru4"}],["path",{d:"m22 22-1.5-1.5",key:"1x83k4"}]]),Mm=Be("CheckCheck",[["path",{d:"M18 6 7 17l-5-5",key:"116fxf"}],["path",{d:"m22 10-7.5 7.5L13 16",key:"ke71qq"}]]),Pm=Be("Check",[["polyline",{points:"20 6 9 17 4 12",key:"10jjfj"}]]),ZC=Be("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]),Sq=Be("ChevronLeft",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]),$m=Be("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]),wq=Be("ChevronUp",[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]),Q4=Be("Circle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]),Eq=Be("Cog",[["path",{d:"M12 20a8 8 0 1 0 0-16 8 8 0 0 0 0 16Z",key:"sobvz5"}],["path",{d:"M12 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z",key:"11i496"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 22v-2",key:"1osdcq"}],["path",{d:"m17 20.66-1-1.73",key:"eq3orb"}],["path",{d:"M11 10.27 7 3.34",key:"16pf9h"}],["path",{d:"m20.66 17-1.73-1",key:"sg0v6f"}],["path",{d:"m3.34 7 1.73 1",key:"1ulond"}],["path",{d:"M14 12h8",key:"4f43i9"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"m20.66 7-1.73 1",key:"1ow05n"}],["path",{d:"m3.34 17 1.73-1",key:"nuk764"}],["path",{d:"m17 3.34-1 1.73",key:"2wel8s"}],["path",{d:"m11 13.73-4 6.93",key:"794ttg"}]]),xq=Be("Copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]),kq=Be("Dna",[["path",{d:"M2 15c6.667-6 13.333 0 20-6",key:"1pyr53"}],["path",{d:"M9 22c1.798-1.998 2.518-3.995 2.807-5.993",key:"q3hbxp"}],["path",{d:"M15 2c-1.798 1.998-2.518 3.995-2.807 5.993",key:"80uv8i"}],["path",{d:"m17 6-2.5-2.5",key:"5cdfhj"}],["path",{d:"m14 8-1-1",key:"15nbz5"}],["path",{d:"m7 18 2.5 2.5",key:"16tu1a"}],["path",{d:"m3.5 14.5.5.5",key:"hapbhd"}],["path",{d:"m20 9 .5.5",key:"1n7z02"}],["path",{d:"m6.5 12.5 1 1",key:"cs35ky"}],["path",{d:"m16.5 10.5 1 1",key:"696xn5"}],["path",{d:"m10 16 1.5 1.5",key:"11lckj"}]]),Cq=Be("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]]),_q=Be("Folder",[["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}]]),Aq=Be("GripVertical",[["circle",{cx:"9",cy:"12",r:"1",key:"1vctgf"}],["circle",{cx:"9",cy:"5",r:"1",key:"hp0tcf"}],["circle",{cx:"9",cy:"19",r:"1",key:"fkjjf6"}],["circle",{cx:"15",cy:"12",r:"1",key:"1tmaij"}],["circle",{cx:"15",cy:"5",r:"1",key:"19l28e"}],["circle",{cx:"15",cy:"19",r:"1",key:"f4zoj3"}]]),Tq=Be("HeartOff",[["line",{x1:"2",y1:"2",x2:"22",y2:"22",key:"1w4vcy"}],["path",{d:"M16.5 16.5 12 21l-7-7c-1.5-1.45-3-3.2-3-5.5a5.5 5.5 0 0 1 2.14-4.35",key:"3mpagl"}],["path",{d:"M8.76 3.1c1.15.22 2.13.78 3.24 1.9 1.5-1.5 2.74-2 4.5-2A5.5 5.5 0 0 1 22 8.5c0 2.12-1.3 3.78-2.67 5.17",key:"1gh3v3"}]]),Rq=Be("IceCream",[["path",{d:"m7 11 4.08 10.35a1 1 0 0 0 1.84 0L17 11",key:"1v6356"}],["path",{d:"M17 7A5 5 0 0 0 7 7",key:"151p3v"}],["path",{d:"M17 7a2 2 0 0 1 0 4H7a2 2 0 0 1 0-4",key:"1sdaij"}]]),Nq=Be("Info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]]),un=Be("Loader2",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]),SR=Be("LogOut",[["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}],["polyline",{points:"16 17 21 12 16 7",key:"1gabdz"}],["line",{x1:"21",x2:"9",y1:"12",y2:"12",key:"1uyos4"}]]),Iq=Be("MinusCircle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M8 12h8",key:"1wcyev"}]]),wR=Be("MoonStar",[["path",{d:"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z",key:"a7tn18"}],["path",{d:"M19 3v4",key:"vgv24u"}],["path",{d:"M21 5h-4",key:"1wcg1f"}]]),Oq=Be("PackageSearch",[["path",{d:"M21 10V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l2-1.14",key:"e7tb2h"}],["path",{d:"m7.5 4.27 9 5.15",key:"1c824w"}],["polyline",{points:"3.29 7 12 12 20.71 7",key:"ousv84"}],["line",{x1:"12",x2:"12",y1:"22",y2:"12",key:"a4e8g8"}],["circle",{cx:"18.5",cy:"15.5",r:"2.5",key:"b5zd12"}],["path",{d:"M20.27 17.27 22 19",key:"1l4muz"}]]),Fm=Be("PenSquare",[["path",{d:"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7",key:"1qinfi"}],["path",{d:"M18.5 2.5a2.12 2.12 0 0 1 3 3L12 15l-4 1 1-4Z",key:"w2jsv5"}]]),J4=Be("Pen",[["path",{d:"M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z",key:"5qss01"}]]),XC=Be("Pencil",[["path",{d:"M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z",key:"5qss01"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]]),Dq=Be("PlusCircle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M8 12h8",key:"1wcyev"}],["path",{d:"M12 8v8",key:"napkw2"}]]),ya=Be("Plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]),Lq=Be("RefreshCcw",[["path",{d:"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"14sxne"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16",key:"1hlbsb"}],["path",{d:"M16 16h5v5",key:"ccwih5"}]]),Mq=Be("Repeat",[["path",{d:"m17 2 4 4-4 4",key:"nntrym"}],["path",{d:"M3 11v-1a4 4 0 0 1 4-4h14",key:"84bu3i"}],["path",{d:"m7 22-4-4 4-4",key:"1wqhfi"}],["path",{d:"M21 13v1a4 4 0 0 1-4 4H3",key:"1rx37r"}]]),Ms=Be("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]),Pq=Be("SendHorizontal",[["path",{d:"m3 3 3 9-3 9 19-9Z",key:"1aobqy"}],["path",{d:"M6 12h16",key:"s4cdu5"}]]),$q=Be("Send",[["path",{d:"m22 2-7 20-4-9-9-4Z",key:"1q3vgg"}],["path",{d:"M22 2 11 13",key:"nzbqef"}]]),Fq=Be("Settings",[["path",{d:"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z",key:"1qme2f"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]),jq=Be("Smile",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M8 14s1.5 2 4 2 4-2 4-2",key:"1y1vjs"}],["line",{x1:"9",x2:"9.01",y1:"9",y2:"9",key:"yxxnd0"}],["line",{x1:"15",x2:"15.01",y1:"9",y2:"9",key:"1p4y9e"}]]),ER=Be("Sun",[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]]),eF=Be("Upload",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"17 8 12 3 7 8",key:"t8dd8p"}],["line",{x1:"12",x2:"12",y1:"3",y2:"15",key:"widbto"}]]),QC=Be("User",[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]]),Di=Be("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),zq=Be("Zap",[["polygon",{points:"13 2 3 14 12 14 11 22 21 10 12 10 13 2",key:"45s27k"}]]),JC="-";function Uq(e){const t=Hq(e),{conflictingClassGroups:n,conflictingClassGroupModifiers:r}=e;function a(i){const s=i.split(JC);return s[0]===""&&s.length!==1&&s.shift(),tF(s,t)||Bq(i)}function o(i,s){const l=n[i]||[];return s&&r[i]?[...l,...r[i]]:l}return{getClassGroupId:a,getConflictingClassGroupIds:o}}function tF(e,t){var i;if(e.length===0)return t.classGroupId;const n=e[0],r=t.nextPart.get(n),a=r?tF(e.slice(1),r):void 0;if(a)return a;if(t.validators.length===0)return;const o=e.join(JC);return(i=t.validators.find(({validator:s})=>s(o)))==null?void 0:i.classGroupId}const xR=/^\[(.+)\]$/;function Bq(e){if(xR.test(e)){const t=xR.exec(e)[1],n=t==null?void 0:t.substring(0,t.indexOf(":"));if(n)return"arbitrary.."+n}}function Hq(e){const{theme:t,prefix:n}=e,r={nextPart:new Map,validators:[]};return qq(Object.entries(e.classGroups),n).forEach(([o,i])=>{C1(i,r,o,t)}),r}function C1(e,t,n,r){e.forEach(a=>{if(typeof a=="string"){const o=a===""?t:kR(t,a);o.classGroupId=n;return}if(typeof a=="function"){if(Vq(a)){C1(a(r),t,n,r);return}t.validators.push({validator:a,classGroupId:n});return}Object.entries(a).forEach(([o,i])=>{C1(i,kR(t,o),n,r)})})}function kR(e,t){let n=e;return t.split(JC).forEach(r=>{n.nextPart.has(r)||n.nextPart.set(r,{nextPart:new Map,validators:[]}),n=n.nextPart.get(r)}),n}function Vq(e){return e.isThemeGetter}function qq(e,t){return t?e.map(([n,r])=>{const a=r.map(o=>typeof o=="string"?t+o:typeof o=="object"?Object.fromEntries(Object.entries(o).map(([i,s])=>[t+i,s])):o);return[n,a]}):e}function Gq(e){if(e<1)return{get:()=>{},set:()=>{}};let t=0,n=new Map,r=new Map;function a(o,i){n.set(o,i),t++,t>e&&(t=0,r=n,n=new Map)}return{get(o){let i=n.get(o);if(i!==void 0)return i;if((i=r.get(o))!==void 0)return a(o,i),i},set(o,i){n.has(o)?n.set(o,i):a(o,i)}}}const nF="!";function Wq(e){const t=e.separator,n=t.length===1,r=t[0],a=t.length;return function(i){const s=[];let l=0,c=0,u;for(let y=0;yc?u-c:void 0;return{modifiers:s,hasImportantModifier:g,baseClassName:m,maybePostfixModifierPosition:b}}}function Kq(e){if(e.length<=1)return e;const t=[];let n=[];return e.forEach(r=>{r[0]==="["?(t.push(...n.sort(),r),n=[]):n.push(r)}),t.push(...n.sort()),t}function Yq(e){return{cache:Gq(e.cacheSize),splitModifiers:Wq(e),...Uq(e)}}const Zq=/\s+/;function Xq(e,t){const{splitModifiers:n,getClassGroupId:r,getConflictingClassGroupIds:a}=t,o=new Set;return e.trim().split(Zq).map(i=>{const{modifiers:s,hasImportantModifier:l,baseClassName:c,maybePostfixModifierPosition:u}=n(i);let d=r(u?c.substring(0,u):c),g=!!u;if(!d){if(!u)return{isTailwindClass:!1,originalClassName:i};if(d=r(c),!d)return{isTailwindClass:!1,originalClassName:i};g=!1}const m=Kq(s).join(":");return{isTailwindClass:!0,modifierId:l?m+nF:m,classGroupId:d,originalClassName:i,hasPostfixModifier:g}}).reverse().filter(i=>{if(!i.isTailwindClass)return!0;const{modifierId:s,classGroupId:l,hasPostfixModifier:c}=i,u=s+l;return o.has(u)?!1:(o.add(u),a(l,c).forEach(d=>o.add(s+d)),!0)}).reverse().map(i=>i.originalClassName).join(" ")}function Qq(){let e=0,t,n,r="";for(;ed(u),e());return n=Yq(c),r=n.cache.get,a=n.cache.set,o=s,s(l)}function s(l){const c=r(l);if(c)return c;const u=Xq(l,n);return a(l,u),u}return function(){return o(Qq.apply(null,arguments))}}function Rt(e){const t=n=>n[e]||[];return t.isThemeGetter=!0,t}const aF=/^\[(?:([a-z-]+):)?(.+)\]$/i,eG=/^\d+\/\d+$/,tG=new Set(["px","full","screen"]),nG=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,rG=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,aG=/^-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,oG=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/;function oa(e){return ns(e)||tG.has(e)||eG.test(e)}function Do(e){return Oc(e,"length",pG)}function ns(e){return!!e&&!Number.isNaN(Number(e))}function Kf(e){return Oc(e,"number",ns)}function tu(e){return!!e&&Number.isInteger(Number(e))}function iG(e){return e.endsWith("%")&&ns(e.slice(0,-1))}function Ke(e){return aF.test(e)}function Lo(e){return nG.test(e)}const sG=new Set(["length","size","percentage"]);function lG(e){return Oc(e,sG,oF)}function cG(e){return Oc(e,"position",oF)}const uG=new Set(["image","url"]);function dG(e){return Oc(e,uG,mG)}function fG(e){return Oc(e,"",gG)}function nu(){return!0}function Oc(e,t,n){const r=aF.exec(e);return r?r[1]?typeof t=="string"?r[1]===t:t.has(r[1]):n(r[2]):!1}function pG(e){return rG.test(e)}function oF(){return!1}function gG(e){return aG.test(e)}function mG(e){return oG.test(e)}function hG(){const e=Rt("colors"),t=Rt("spacing"),n=Rt("blur"),r=Rt("brightness"),a=Rt("borderColor"),o=Rt("borderRadius"),i=Rt("borderSpacing"),s=Rt("borderWidth"),l=Rt("contrast"),c=Rt("grayscale"),u=Rt("hueRotate"),d=Rt("invert"),g=Rt("gap"),m=Rt("gradientColorStops"),b=Rt("gradientColorStopPositions"),y=Rt("inset"),w=Rt("margin"),v=Rt("opacity"),h=Rt("padding"),S=Rt("saturate"),E=Rt("scale"),k=Rt("sepia"),x=Rt("skew"),C=Rt("space"),_=Rt("translate"),R=()=>["auto","contain","none"],T=()=>["auto","hidden","clip","visible","scroll"],L=()=>["auto",Ke,t],D=()=>[Ke,t],H=()=>["",oa,Do],z=()=>["auto",ns,Ke],M=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],U=()=>["solid","dashed","dotted","double","none"],X=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity","plus-lighter"],j=()=>["start","end","center","between","around","evenly","stretch"],O=()=>["","0",Ke],A=()=>["auto","avoid","all","avoid-page","page","left","right","column"],V=()=>[ns,Kf],P=()=>[ns,Ke];return{cacheSize:500,separator:":",theme:{colors:[nu],spacing:[oa,Do],blur:["none","",Lo,Ke],brightness:V(),borderColor:[e],borderRadius:["none","","full",Lo,Ke],borderSpacing:D(),borderWidth:H(),contrast:V(),grayscale:O(),hueRotate:P(),invert:O(),gap:D(),gradientColorStops:[e],gradientColorStopPositions:[iG,Do],inset:L(),margin:L(),opacity:V(),padding:D(),saturate:V(),scale:V(),sepia:O(),skew:P(),space:D(),translate:D()},classGroups:{aspect:[{aspect:["auto","square","video",Ke]}],container:["container"],columns:[{columns:[Lo]}],"break-after":[{"break-after":A()}],"break-before":[{"break-before":A()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none"]}],clear:[{clear:["left","right","both","none"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...M(),Ke]}],overflow:[{overflow:T()}],"overflow-x":[{"overflow-x":T()}],"overflow-y":[{"overflow-y":T()}],overscroll:[{overscroll:R()}],"overscroll-x":[{"overscroll-x":R()}],"overscroll-y":[{"overscroll-y":R()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[y]}],"inset-x":[{"inset-x":[y]}],"inset-y":[{"inset-y":[y]}],start:[{start:[y]}],end:[{end:[y]}],top:[{top:[y]}],right:[{right:[y]}],bottom:[{bottom:[y]}],left:[{left:[y]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",tu,Ke]}],basis:[{basis:L()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",Ke]}],grow:[{grow:O()}],shrink:[{shrink:O()}],order:[{order:["first","last","none",tu,Ke]}],"grid-cols":[{"grid-cols":[nu]}],"col-start-end":[{col:["auto",{span:["full",tu,Ke]},Ke]}],"col-start":[{"col-start":z()}],"col-end":[{"col-end":z()}],"grid-rows":[{"grid-rows":[nu]}],"row-start-end":[{row:["auto",{span:[tu,Ke]},Ke]}],"row-start":[{"row-start":z()}],"row-end":[{"row-end":z()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",Ke]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",Ke]}],gap:[{gap:[g]}],"gap-x":[{"gap-x":[g]}],"gap-y":[{"gap-y":[g]}],"justify-content":[{justify:["normal",...j()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...j(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...j(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[h]}],px:[{px:[h]}],py:[{py:[h]}],ps:[{ps:[h]}],pe:[{pe:[h]}],pt:[{pt:[h]}],pr:[{pr:[h]}],pb:[{pb:[h]}],pl:[{pl:[h]}],m:[{m:[w]}],mx:[{mx:[w]}],my:[{my:[w]}],ms:[{ms:[w]}],me:[{me:[w]}],mt:[{mt:[w]}],mr:[{mr:[w]}],mb:[{mb:[w]}],ml:[{ml:[w]}],"space-x":[{"space-x":[C]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[C]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit",Ke,t]}],"min-w":[{"min-w":["min","max","fit",Ke,oa]}],"max-w":[{"max-w":["0","none","full","min","max","fit","prose",{screen:[Lo]},Lo,Ke]}],h:[{h:[Ke,t,"auto","min","max","fit"]}],"min-h":[{"min-h":["min","max","fit",oa,Ke]}],"max-h":[{"max-h":[Ke,t,"min","max","fit"]}],"font-size":[{text:["base",Lo,Do]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",Kf]}],"font-family":[{font:[nu]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractons"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",Ke]}],"line-clamp":[{"line-clamp":["none",ns,Kf]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",oa,Ke]}],"list-image":[{"list-image":["none",Ke]}],"list-style-type":[{list:["none","disc","decimal",Ke]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[v]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[v]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...U(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",oa,Do]}],"underline-offset":[{"underline-offset":["auto",oa,Ke]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],indent:[{indent:D()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",Ke]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",Ke]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[v]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...M(),cG]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",lG]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},dG]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[b]}],"gradient-via-pos":[{via:[b]}],"gradient-to-pos":[{to:[b]}],"gradient-from":[{from:[m]}],"gradient-via":[{via:[m]}],"gradient-to":[{to:[m]}],rounded:[{rounded:[o]}],"rounded-s":[{"rounded-s":[o]}],"rounded-e":[{"rounded-e":[o]}],"rounded-t":[{"rounded-t":[o]}],"rounded-r":[{"rounded-r":[o]}],"rounded-b":[{"rounded-b":[o]}],"rounded-l":[{"rounded-l":[o]}],"rounded-ss":[{"rounded-ss":[o]}],"rounded-se":[{"rounded-se":[o]}],"rounded-ee":[{"rounded-ee":[o]}],"rounded-es":[{"rounded-es":[o]}],"rounded-tl":[{"rounded-tl":[o]}],"rounded-tr":[{"rounded-tr":[o]}],"rounded-br":[{"rounded-br":[o]}],"rounded-bl":[{"rounded-bl":[o]}],"border-w":[{border:[s]}],"border-w-x":[{"border-x":[s]}],"border-w-y":[{"border-y":[s]}],"border-w-s":[{"border-s":[s]}],"border-w-e":[{"border-e":[s]}],"border-w-t":[{"border-t":[s]}],"border-w-r":[{"border-r":[s]}],"border-w-b":[{"border-b":[s]}],"border-w-l":[{"border-l":[s]}],"border-opacity":[{"border-opacity":[v]}],"border-style":[{border:[...U(),"hidden"]}],"divide-x":[{"divide-x":[s]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[s]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[v]}],"divide-style":[{divide:U()}],"border-color":[{border:[a]}],"border-color-x":[{"border-x":[a]}],"border-color-y":[{"border-y":[a]}],"border-color-t":[{"border-t":[a]}],"border-color-r":[{"border-r":[a]}],"border-color-b":[{"border-b":[a]}],"border-color-l":[{"border-l":[a]}],"divide-color":[{divide:[a]}],"outline-style":[{outline:["",...U()]}],"outline-offset":[{"outline-offset":[oa,Ke]}],"outline-w":[{outline:[oa,Do]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:H()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[v]}],"ring-offset-w":[{"ring-offset":[oa,Do]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",Lo,fG]}],"shadow-color":[{shadow:[nu]}],opacity:[{opacity:[v]}],"mix-blend":[{"mix-blend":X()}],"bg-blend":[{"bg-blend":X()}],filter:[{filter:["","none"]}],blur:[{blur:[n]}],brightness:[{brightness:[r]}],contrast:[{contrast:[l]}],"drop-shadow":[{"drop-shadow":["","none",Lo,Ke]}],grayscale:[{grayscale:[c]}],"hue-rotate":[{"hue-rotate":[u]}],invert:[{invert:[d]}],saturate:[{saturate:[S]}],sepia:[{sepia:[k]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[n]}],"backdrop-brightness":[{"backdrop-brightness":[r]}],"backdrop-contrast":[{"backdrop-contrast":[l]}],"backdrop-grayscale":[{"backdrop-grayscale":[c]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[u]}],"backdrop-invert":[{"backdrop-invert":[d]}],"backdrop-opacity":[{"backdrop-opacity":[v]}],"backdrop-saturate":[{"backdrop-saturate":[S]}],"backdrop-sepia":[{"backdrop-sepia":[k]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[i]}],"border-spacing-x":[{"border-spacing-x":[i]}],"border-spacing-y":[{"border-spacing-y":[i]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",Ke]}],duration:[{duration:P()}],ease:[{ease:["linear","in","out","in-out",Ke]}],delay:[{delay:P()}],animate:[{animate:["none","spin","ping","pulse","bounce",Ke]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[E]}],"scale-x":[{"scale-x":[E]}],"scale-y":[{"scale-y":[E]}],rotate:[{rotate:[tu,Ke]}],"translate-x":[{"translate-x":[_]}],"translate-y":[{"translate-y":[_]}],"skew-x":[{"skew-x":[x]}],"skew-y":[{"skew-y":[x]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",Ke]}],accent:[{accent:["auto",e]}],appearance:["appearance-none"],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",Ke]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":D()}],"scroll-mx":[{"scroll-mx":D()}],"scroll-my":[{"scroll-my":D()}],"scroll-ms":[{"scroll-ms":D()}],"scroll-me":[{"scroll-me":D()}],"scroll-mt":[{"scroll-mt":D()}],"scroll-mr":[{"scroll-mr":D()}],"scroll-mb":[{"scroll-mb":D()}],"scroll-ml":[{"scroll-ml":D()}],"scroll-p":[{"scroll-p":D()}],"scroll-px":[{"scroll-px":D()}],"scroll-py":[{"scroll-py":D()}],"scroll-ps":[{"scroll-ps":D()}],"scroll-pe":[{"scroll-pe":D()}],"scroll-pt":[{"scroll-pt":D()}],"scroll-pr":[{"scroll-pr":D()}],"scroll-pb":[{"scroll-pb":D()}],"scroll-pl":[{"scroll-pl":D()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",Ke]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[oa,Do,Kf]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}}const bG=Jq(hG);function ee(...e){return bG(Z4(e))}const yG=gq,iF=p.forwardRef(({className:e,...t},n)=>f.jsx(H4,{ref:n,className:ee("fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]",e),...t}));iF.displayName=H4.displayName;const vG=ef("group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full",{variants:{variant:{default:"border bg-background text-foreground",destructive:"destructive group border-destructive bg-destructive text-destructive-foreground"}},defaultVariants:{variant:"default"}}),sF=p.forwardRef(({className:e,variant:t,...n},r)=>f.jsx(V4,{ref:r,className:ee(vG({variant:t}),e),...n}));sF.displayName=V4.displayName;const SG=p.forwardRef(({className:e,...t},n)=>f.jsx(W4,{ref:n,className:ee("inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive",e),...t}));SG.displayName=W4.displayName;const lF=p.forwardRef(({className:e,...t},n)=>f.jsx(K4,{ref:n,className:ee("absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600",e),"toast-close":"",...t,children:f.jsx(Di,{className:"h-4 w-4"})}));lF.displayName=K4.displayName;const cF=p.forwardRef(({className:e,...t},n)=>f.jsx(q4,{ref:n,className:ee("text-sm font-semibold",e),...t}));cF.displayName=q4.displayName;const uF=p.forwardRef(({className:e,...t},n)=>f.jsx(G4,{ref:n,className:ee("text-sm opacity-90",e),...t}));uF.displayName=G4.displayName;const wG=1,EG=1e6;let vb=0;function xG(){return vb=(vb+1)%Number.MAX_VALUE,vb.toString()}const Sb=new Map,CR=e=>{if(Sb.has(e))return;const t=setTimeout(()=>{Sb.delete(e),zu({type:"REMOVE_TOAST",toastId:e})},EG);Sb.set(e,t)},kG=(e,t)=>{switch(t.type){case"ADD_TOAST":return{...e,toasts:[t.toast,...e.toasts].slice(0,wG)};case"UPDATE_TOAST":return{...e,toasts:e.toasts.map(n=>n.id===t.toast.id?{...n,...t.toast}:n)};case"DISMISS_TOAST":{const{toastId:n}=t;return n?CR(n):e.toasts.forEach(r=>{CR(r.id)}),{...e,toasts:e.toasts.map(r=>r.id===n||n===void 0?{...r,open:!1}:r)}}case"REMOVE_TOAST":return t.toastId===void 0?{...e,toasts:[]}:{...e,toasts:e.toasts.filter(n=>n.id!==t.toastId)}}},Fp=[];let jp={toasts:[]};function zu(e){jp=kG(jp,e),Fp.forEach(t=>{t(jp)})}function e_({...e}){const t=xG(),n=a=>zu({type:"UPDATE_TOAST",toast:{...a,id:t}}),r=()=>zu({type:"DISMISS_TOAST",toastId:t});return zu({type:"ADD_TOAST",toast:{...e,id:t,open:!0,onOpenChange:a=>{a||r()}}}),{id:t,dismiss:r,update:n}}function An(){const[e,t]=p.useState(jp);return p.useEffect(()=>(Fp.push(t),()=>{const n=Fp.indexOf(t);n>-1&&Fp.splice(n,1)}),[e]),{...e,toast:e_,dismiss:n=>zu({type:"DISMISS_TOAST",toastId:n})}}function CG(){const{toasts:e}=An();return f.jsxs(yG,{children:[e.map(function({id:t,title:n,description:r,action:a,...o}){return f.jsxs(sF,{...o,children:[f.jsxs("div",{className:"grid gap-1",children:[n&&f.jsx(cF,{children:n}),r&&f.jsx(uF,{children:r})]}),a,f.jsx(lF,{})]},t)}),f.jsx(iF,{})]})}var Dc=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},gc=typeof window>"u"||"Deno"in window;function Fr(){}function _G(e,t){return typeof e=="function"?e(t):e}function _1(e){return typeof e=="number"&&e>=0&&e!==1/0}function dF(e,t){return Math.max(e+(t||0)-Date.now(),0)}function _R(e,t){const{type:n="all",exact:r,fetchStatus:a,predicate:o,queryKey:i,stale:s}=e;if(i){if(r){if(t.queryHash!==t_(i,t.options))return!1}else if(!md(t.queryKey,i))return!1}if(n!=="all"){const l=t.isActive();if(n==="active"&&!l||n==="inactive"&&l)return!1}return!(typeof s=="boolean"&&t.isStale()!==s||typeof a<"u"&&a!==t.state.fetchStatus||o&&!o(t))}function AR(e,t){const{exact:n,status:r,predicate:a,mutationKey:o}=e;if(o){if(!t.options.mutationKey)return!1;if(n){if(gd(t.options.mutationKey)!==gd(o))return!1}else if(!md(t.options.mutationKey,o))return!1}return!(r&&t.state.status!==r||a&&!a(t))}function t_(e,t){return((t==null?void 0:t.queryKeyHashFn)||gd)(e)}function gd(e){return JSON.stringify(e,(t,n)=>A1(n)?Object.keys(n).sort().reduce((r,a)=>(r[a]=n[a],r),{}):n)}function md(e,t){return e===t?!0:typeof e!=typeof t?!1:e&&t&&typeof e=="object"&&typeof t=="object"?!Object.keys(t).some(n=>!md(e[n],t[n])):!1}function fF(e,t){if(e===t)return e;const n=TR(e)&&TR(t);if(n||A1(e)&&A1(t)){const r=n?e.length:Object.keys(e).length,a=n?t:Object.keys(t),o=a.length,i=n?[]:{};let s=0;for(let l=0;l"u")return!0;const n=t.prototype;return!(!RR(n)||!n.hasOwnProperty("isPrototypeOf"))}function RR(e){return Object.prototype.toString.call(e)==="[object Object]"}function pF(e){return new Promise(t=>{setTimeout(t,e)})}function NR(e){pF(0).then(e)}function T1(e,t,n){return typeof n.structuralSharing=="function"?n.structuralSharing(e,t):n.structuralSharing!==!1?fF(e,t):t}function AG(e,t,n=0){const r=[...e,t];return n&&r.length>n?r.slice(1):r}function TG(e,t,n=0){const r=[t,...e];return n&&r.length>n?r.slice(0,-1):r}var ss,Zo,ql,lP,RG=(lP=class extends Dc{constructor(){super();xe(this,ss,void 0);xe(this,Zo,void 0);xe(this,ql,void 0);me(this,ql,t=>{if(!gc&&window.addEventListener){const n=()=>t();return window.addEventListener("visibilitychange",n,!1),()=>{window.removeEventListener("visibilitychange",n)}}})}onSubscribe(){$(this,Zo)||this.setEventListener($(this,ql))}onUnsubscribe(){var t;this.hasListeners()||((t=$(this,Zo))==null||t.call(this),me(this,Zo,void 0))}setEventListener(t){var n;me(this,ql,t),(n=$(this,Zo))==null||n.call(this),me(this,Zo,t(r=>{typeof r=="boolean"?this.setFocused(r):this.onFocus()}))}setFocused(t){$(this,ss)!==t&&(me(this,ss,t),this.onFocus())}onFocus(){this.listeners.forEach(t=>{t()})}isFocused(){var t;return typeof $(this,ss)=="boolean"?$(this,ss):((t=globalThis.document)==null?void 0:t.visibilityState)!=="hidden"}},ss=new WeakMap,Zo=new WeakMap,ql=new WeakMap,lP),Cg=new RG,Gl,Xo,Wl,cP,NG=(cP=class extends Dc{constructor(){super();xe(this,Gl,!0);xe(this,Xo,void 0);xe(this,Wl,void 0);me(this,Wl,t=>{if(!gc&&window.addEventListener){const n=()=>t(!0),r=()=>t(!1);return window.addEventListener("online",n,!1),window.addEventListener("offline",r,!1),()=>{window.removeEventListener("online",n),window.removeEventListener("offline",r)}}})}onSubscribe(){$(this,Xo)||this.setEventListener($(this,Wl))}onUnsubscribe(){var t;this.hasListeners()||((t=$(this,Xo))==null||t.call(this),me(this,Xo,void 0))}setEventListener(t){var n;me(this,Wl,t),(n=$(this,Xo))==null||n.call(this),me(this,Xo,t(this.setOnline.bind(this)))}setOnline(t){$(this,Gl)!==t&&(me(this,Gl,t),this.listeners.forEach(r=>{r(t)}))}isOnline(){return $(this,Gl)}},Gl=new WeakMap,Xo=new WeakMap,Wl=new WeakMap,cP),_g=new NG;function IG(e){return Math.min(1e3*2**e,3e4)}function jm(e){return(e??"online")==="online"?_g.isOnline():!0}var gF=class{constructor(e){this.revert=e==null?void 0:e.revert,this.silent=e==null?void 0:e.silent}};function wb(e){return e instanceof gF}function mF(e){let t=!1,n=0,r=!1,a,o,i;const s=new Promise((w,v)=>{o=w,i=v}),l=w=>{var v;r||(m(new gF(w)),(v=e.abort)==null||v.call(e))},c=()=>{t=!0},u=()=>{t=!1},d=()=>!Cg.isFocused()||e.networkMode!=="always"&&!_g.isOnline(),g=w=>{var v;r||(r=!0,(v=e.onSuccess)==null||v.call(e,w),a==null||a(),o(w))},m=w=>{var v;r||(r=!0,(v=e.onError)==null||v.call(e,w),a==null||a(),i(w))},b=()=>new Promise(w=>{var v;a=h=>{const S=r||!d();return S&&w(h),S},(v=e.onPause)==null||v.call(e)}).then(()=>{var w;a=void 0,r||(w=e.onContinue)==null||w.call(e)}),y=()=>{if(r)return;let w;try{w=e.fn()}catch(v){w=Promise.reject(v)}Promise.resolve(w).then(g).catch(v=>{var x;if(r)return;const h=e.retry??(gc?0:3),S=e.retryDelay??IG,E=typeof S=="function"?S(n,v):S,k=h===!0||typeof h=="number"&&n{if(d())return b()}).then(()=>{t?m(v):y()})})};return jm(e.networkMode)?y():b().then(y),{promise:s,cancel:l,continue:()=>(a==null?void 0:a())?s:Promise.resolve(),cancelRetry:c,continueRetry:u}}function OG(){let e=[],t=0,n=u=>{u()},r=u=>{u()};const a=u=>{let d;t++;try{d=u()}finally{t--,t||s()}return d},o=u=>{t?e.push(u):NR(()=>{n(u)})},i=u=>(...d)=>{o(()=>{u(...d)})},s=()=>{const u=e;e=[],u.length&&NR(()=>{r(()=>{u.forEach(d=>{n(d)})})})};return{batch:a,batchCalls:i,schedule:o,setNotifyFunction:u=>{n=u},setBatchNotifyFunction:u=>{r=u}}}var sn=OG(),ls,uP,hF=(uP=class{constructor(){xe(this,ls,void 0)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),_1(this.gcTime)&&me(this,ls,setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(gc?1/0:5*60*1e3))}clearGcTimeout(){$(this,ls)&&(clearTimeout($(this,ls)),me(this,ls,void 0))}},ls=new WeakMap,uP),Kl,Yl,Lr,Qo,Mr,gn,Md,cs,Zl,zp,sa,eo,dP,DG=(dP=class extends hF{constructor(t){super();xe(this,Zl);xe(this,sa);xe(this,Kl,void 0);xe(this,Yl,void 0);xe(this,Lr,void 0);xe(this,Qo,void 0);xe(this,Mr,void 0);xe(this,gn,void 0);xe(this,Md,void 0);xe(this,cs,void 0);me(this,cs,!1),me(this,Md,t.defaultOptions),Ue(this,Zl,zp).call(this,t.options),me(this,gn,[]),me(this,Lr,t.cache),this.queryKey=t.queryKey,this.queryHash=t.queryHash,me(this,Kl,t.state||LG(this.options)),this.state=$(this,Kl),this.scheduleGc()}get meta(){return this.options.meta}optionalRemove(){!$(this,gn).length&&this.state.fetchStatus==="idle"&&$(this,Lr).remove(this)}setData(t,n){const r=T1(this.state.data,t,this.options);return Ue(this,sa,eo).call(this,{data:r,type:"success",dataUpdatedAt:n==null?void 0:n.updatedAt,manual:n==null?void 0:n.manual}),r}setState(t,n){Ue(this,sa,eo).call(this,{type:"setState",state:t,setStateOptions:n})}cancel(t){var r;const n=$(this,Qo);return(r=$(this,Mr))==null||r.cancel(t),n?n.then(Fr).catch(Fr):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}reset(){this.destroy(),this.setState($(this,Kl))}isActive(){return $(this,gn).some(t=>t.options.enabled!==!1)}isDisabled(){return this.getObserversCount()>0&&!this.isActive()}isStale(){return this.state.isInvalidated||!this.state.dataUpdatedAt||$(this,gn).some(t=>t.getCurrentResult().isStale)}isStaleByTime(t=0){return this.state.isInvalidated||!this.state.dataUpdatedAt||!dF(this.state.dataUpdatedAt,t)}onFocus(){var n;const t=$(this,gn).find(r=>r.shouldFetchOnWindowFocus());t==null||t.refetch({cancelRefetch:!1}),(n=$(this,Mr))==null||n.continue()}onOnline(){var n;const t=$(this,gn).find(r=>r.shouldFetchOnReconnect());t==null||t.refetch({cancelRefetch:!1}),(n=$(this,Mr))==null||n.continue()}addObserver(t){$(this,gn).includes(t)||($(this,gn).push(t),this.clearGcTimeout(),$(this,Lr).notify({type:"observerAdded",query:this,observer:t}))}removeObserver(t){$(this,gn).includes(t)&&(me(this,gn,$(this,gn).filter(n=>n!==t)),$(this,gn).length||($(this,Mr)&&($(this,cs)?$(this,Mr).cancel({revert:!0}):$(this,Mr).cancelRetry()),this.scheduleGc()),$(this,Lr).notify({type:"observerRemoved",query:this,observer:t}))}getObserversCount(){return $(this,gn).length}invalidate(){this.state.isInvalidated||Ue(this,sa,eo).call(this,{type:"invalidate"})}fetch(t,n){var c,u,d,g;if(this.state.fetchStatus!=="idle"){if(this.state.dataUpdatedAt&&(n!=null&&n.cancelRefetch))this.cancel({silent:!0});else if($(this,Qo))return(c=$(this,Mr))==null||c.continueRetry(),$(this,Qo)}if(t&&Ue(this,Zl,zp).call(this,t),!this.options.queryFn){const m=$(this,gn).find(b=>b.options.queryFn);m&&Ue(this,Zl,zp).call(this,m.options)}const r=new AbortController,a={queryKey:this.queryKey,meta:this.meta},o=m=>{Object.defineProperty(m,"signal",{enumerable:!0,get:()=>(me(this,cs,!0),r.signal)})};o(a);const i=()=>this.options.queryFn?(me(this,cs,!1),this.options.persister?this.options.persister(this.options.queryFn,a,this):this.options.queryFn(a)):Promise.reject(new Error(`Missing queryFn: '${this.options.queryHash}'`)),s={fetchOptions:n,options:this.options,queryKey:this.queryKey,state:this.state,fetchFn:i};o(s),(u=this.options.behavior)==null||u.onFetch(s,this),me(this,Yl,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((d=s.fetchOptions)==null?void 0:d.meta))&&Ue(this,sa,eo).call(this,{type:"fetch",meta:(g=s.fetchOptions)==null?void 0:g.meta});const l=m=>{var b,y,w,v;wb(m)&&m.silent||Ue(this,sa,eo).call(this,{type:"error",error:m}),wb(m)||((y=(b=$(this,Lr).config).onError)==null||y.call(b,m,this),(v=(w=$(this,Lr).config).onSettled)==null||v.call(w,this.state.data,m,this)),this.isFetchingOptimistic||this.scheduleGc(),this.isFetchingOptimistic=!1};return me(this,Mr,mF({fn:s.fetchFn,abort:r.abort.bind(r),onSuccess:m=>{var b,y,w,v;if(typeof m>"u"){l(new Error(`${this.queryHash} data is undefined`));return}this.setData(m),(y=(b=$(this,Lr).config).onSuccess)==null||y.call(b,m,this),(v=(w=$(this,Lr).config).onSettled)==null||v.call(w,m,this.state.error,this),this.isFetchingOptimistic||this.scheduleGc(),this.isFetchingOptimistic=!1},onError:l,onFail:(m,b)=>{Ue(this,sa,eo).call(this,{type:"failed",failureCount:m,error:b})},onPause:()=>{Ue(this,sa,eo).call(this,{type:"pause"})},onContinue:()=>{Ue(this,sa,eo).call(this,{type:"continue"})},retry:s.options.retry,retryDelay:s.options.retryDelay,networkMode:s.options.networkMode})),me(this,Qo,$(this,Mr).promise),$(this,Qo)}},Kl=new WeakMap,Yl=new WeakMap,Lr=new WeakMap,Qo=new WeakMap,Mr=new WeakMap,gn=new WeakMap,Md=new WeakMap,cs=new WeakMap,Zl=new WeakSet,zp=function(t){this.options={...$(this,Md),...t},this.updateGcTime(this.options.gcTime)},sa=new WeakSet,eo=function(t){const n=r=>{switch(t.type){case"failed":return{...r,fetchFailureCount:t.failureCount,fetchFailureReason:t.error};case"pause":return{...r,fetchStatus:"paused"};case"continue":return{...r,fetchStatus:"fetching"};case"fetch":return{...r,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:t.meta??null,fetchStatus:jm(this.options.networkMode)?"fetching":"paused",...!r.dataUpdatedAt&&{error:null,status:"pending"}};case"success":return{...r,data:t.data,dataUpdateCount:r.dataUpdateCount+1,dataUpdatedAt:t.dataUpdatedAt??Date.now(),error:null,isInvalidated:!1,status:"success",...!t.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};case"error":const a=t.error;return wb(a)&&a.revert&&$(this,Yl)?{...$(this,Yl),fetchStatus:"idle"}:{...r,error:a,errorUpdateCount:r.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:r.fetchFailureCount+1,fetchFailureReason:a,fetchStatus:"idle",status:"error"};case"invalidate":return{...r,isInvalidated:!0};case"setState":return{...r,...t.state}}};this.state=n(this.state),sn.batch(()=>{$(this,gn).forEach(r=>{r.onQueryUpdate()}),$(this,Lr).notify({query:this,type:"updated",action:t})})},dP);function LG(e){const t=typeof e.initialData=="function"?e.initialData():e.initialData,n=typeof t<"u",r=n?typeof e.initialDataUpdatedAt=="function"?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:n?r??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:n?"success":"pending",fetchStatus:"idle"}}var Ca,fP,MG=(fP=class extends Dc{constructor(t={}){super();xe(this,Ca,void 0);this.config=t,me(this,Ca,new Map)}build(t,n,r){const a=n.queryKey,o=n.queryHash??t_(a,n);let i=this.get(o);return i||(i=new DG({cache:this,queryKey:a,queryHash:o,options:t.defaultQueryOptions(n),state:r,defaultOptions:t.getQueryDefaults(a)}),this.add(i)),i}add(t){$(this,Ca).has(t.queryHash)||($(this,Ca).set(t.queryHash,t),this.notify({type:"added",query:t}))}remove(t){const n=$(this,Ca).get(t.queryHash);n&&(t.destroy(),n===t&&$(this,Ca).delete(t.queryHash),this.notify({type:"removed",query:t}))}clear(){sn.batch(()=>{this.getAll().forEach(t=>{this.remove(t)})})}get(t){return $(this,Ca).get(t)}getAll(){return[...$(this,Ca).values()]}find(t){const n={exact:!0,...t};return this.getAll().find(r=>_R(n,r))}findAll(t={}){const n=this.getAll();return Object.keys(t).length>0?n.filter(r=>_R(t,r)):n}notify(t){sn.batch(()=>{this.listeners.forEach(n=>{n(t)})})}onFocus(){sn.batch(()=>{this.getAll().forEach(t=>{t.onFocus()})})}onOnline(){sn.batch(()=>{this.getAll().forEach(t=>{t.onOnline()})})}},Ca=new WeakMap,fP),_a,Pd,yr,Xl,Aa,Uo,pP,PG=(pP=class extends hF{constructor(t){super();xe(this,Aa);xe(this,_a,void 0);xe(this,Pd,void 0);xe(this,yr,void 0);xe(this,Xl,void 0);this.mutationId=t.mutationId,me(this,Pd,t.defaultOptions),me(this,yr,t.mutationCache),me(this,_a,[]),this.state=t.state||bF(),this.setOptions(t.options),this.scheduleGc()}setOptions(t){this.options={...$(this,Pd),...t},this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(t){$(this,_a).includes(t)||($(this,_a).push(t),this.clearGcTimeout(),$(this,yr).notify({type:"observerAdded",mutation:this,observer:t}))}removeObserver(t){me(this,_a,$(this,_a).filter(n=>n!==t)),this.scheduleGc(),$(this,yr).notify({type:"observerRemoved",mutation:this,observer:t})}optionalRemove(){$(this,_a).length||(this.state.status==="pending"?this.scheduleGc():$(this,yr).remove(this))}continue(){var t;return((t=$(this,Xl))==null?void 0:t.continue())??this.execute(this.state.variables)}async execute(t){var a,o,i,s,l,c,u,d,g,m,b,y,w,v,h,S,E,k,x,C;const n=()=>(me(this,Xl,mF({fn:()=>this.options.mutationFn?this.options.mutationFn(t):Promise.reject(new Error("No mutationFn found")),onFail:(_,R)=>{Ue(this,Aa,Uo).call(this,{type:"failed",failureCount:_,error:R})},onPause:()=>{Ue(this,Aa,Uo).call(this,{type:"pause"})},onContinue:()=>{Ue(this,Aa,Uo).call(this,{type:"continue"})},retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode})),$(this,Xl).promise),r=this.state.status==="pending";try{if(!r){Ue(this,Aa,Uo).call(this,{type:"pending",variables:t}),await((o=(a=$(this,yr).config).onMutate)==null?void 0:o.call(a,t,this));const R=await((s=(i=this.options).onMutate)==null?void 0:s.call(i,t));R!==this.state.context&&Ue(this,Aa,Uo).call(this,{type:"pending",context:R,variables:t})}const _=await n();return await((c=(l=$(this,yr).config).onSuccess)==null?void 0:c.call(l,_,t,this.state.context,this)),await((d=(u=this.options).onSuccess)==null?void 0:d.call(u,_,t,this.state.context)),await((m=(g=$(this,yr).config).onSettled)==null?void 0:m.call(g,_,null,this.state.variables,this.state.context,this)),await((y=(b=this.options).onSettled)==null?void 0:y.call(b,_,null,t,this.state.context)),Ue(this,Aa,Uo).call(this,{type:"success",data:_}),_}catch(_){try{throw await((v=(w=$(this,yr).config).onError)==null?void 0:v.call(w,_,t,this.state.context,this)),await((S=(h=this.options).onError)==null?void 0:S.call(h,_,t,this.state.context)),await((k=(E=$(this,yr).config).onSettled)==null?void 0:k.call(E,void 0,_,this.state.variables,this.state.context,this)),await((C=(x=this.options).onSettled)==null?void 0:C.call(x,void 0,_,t,this.state.context)),_}finally{Ue(this,Aa,Uo).call(this,{type:"error",error:_})}}}},_a=new WeakMap,Pd=new WeakMap,yr=new WeakMap,Xl=new WeakMap,Aa=new WeakSet,Uo=function(t){const n=r=>{switch(t.type){case"failed":return{...r,failureCount:t.failureCount,failureReason:t.error};case"pause":return{...r,isPaused:!0};case"continue":return{...r,isPaused:!1};case"pending":return{...r,context:t.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:!jm(this.options.networkMode),status:"pending",variables:t.variables,submittedAt:Date.now()};case"success":return{...r,data:t.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...r,data:void 0,error:t.error,failureCount:r.failureCount+1,failureReason:t.error,isPaused:!1,status:"error"}}};this.state=n(this.state),sn.batch(()=>{$(this,_a).forEach(r=>{r.onMutationUpdate(t)}),$(this,yr).notify({mutation:this,type:"updated",action:t})})},pP);function bF(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var Pr,$d,us,gP,$G=(gP=class extends Dc{constructor(t={}){super();xe(this,Pr,void 0);xe(this,$d,void 0);xe(this,us,void 0);this.config=t,me(this,Pr,[]),me(this,$d,0)}build(t,n,r){const a=new PG({mutationCache:this,mutationId:++Tf(this,$d)._,options:t.defaultMutationOptions(n),state:r});return this.add(a),a}add(t){$(this,Pr).push(t),this.notify({type:"added",mutation:t})}remove(t){me(this,Pr,$(this,Pr).filter(n=>n!==t)),this.notify({type:"removed",mutation:t})}clear(){sn.batch(()=>{$(this,Pr).forEach(t=>{this.remove(t)})})}getAll(){return $(this,Pr)}find(t){const n={exact:!0,...t};return $(this,Pr).find(r=>AR(n,r))}findAll(t={}){return $(this,Pr).filter(n=>AR(t,n))}notify(t){sn.batch(()=>{this.listeners.forEach(n=>{n(t)})})}resumePausedMutations(){return me(this,us,($(this,us)??Promise.resolve()).then(()=>{const t=$(this,Pr).filter(n=>n.state.isPaused);return sn.batch(()=>t.reduce((n,r)=>n.then(()=>r.continue().catch(Fr)),Promise.resolve()))}).then(()=>{me(this,us,void 0)})),$(this,us)}},Pr=new WeakMap,$d=new WeakMap,us=new WeakMap,gP);function FG(e){return{onFetch:(t,n)=>{const r=async()=>{var b,y,w,v,h;const a=t.options,o=(w=(y=(b=t.fetchOptions)==null?void 0:b.meta)==null?void 0:y.fetchMore)==null?void 0:w.direction,i=((v=t.state.data)==null?void 0:v.pages)||[],s=((h=t.state.data)==null?void 0:h.pageParams)||[],l={pages:[],pageParams:[]};let c=!1;const u=S=>{Object.defineProperty(S,"signal",{enumerable:!0,get:()=>(t.signal.aborted?c=!0:t.signal.addEventListener("abort",()=>{c=!0}),t.signal)})},d=t.options.queryFn||(()=>Promise.reject(new Error(`Missing queryFn: '${t.options.queryHash}'`))),g=async(S,E,k)=>{if(c)return Promise.reject();if(E==null&&S.pages.length)return Promise.resolve(S);const x={queryKey:t.queryKey,pageParam:E,direction:k?"backward":"forward",meta:t.options.meta};u(x);const C=await d(x),{maxPages:_}=t.options,R=k?TG:AG;return{pages:R(S.pages,C,_),pageParams:R(S.pageParams,E,_)}};let m;if(o&&i.length){const S=o==="backward",E=S?jG:IR,k={pages:i,pageParams:s},x=E(a,k);m=await g(k,x,S)}else{m=await g(l,s[0]??a.initialPageParam);const S=e??i.length;for(let E=1;E{var a,o;return(o=(a=t.options).persister)==null?void 0:o.call(a,r,{queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},n)}:t.fetchFn=r}}}function IR(e,{pages:t,pageParams:n}){const r=t.length-1;return e.getNextPageParam(t[r],t,n[r],n)}function jG(e,{pages:t,pageParams:n}){var r;return(r=e.getPreviousPageParam)==null?void 0:r.call(e,t[0],t,n[0],n)}var an,Jo,ei,Ql,Jl,ti,ec,tc,mP,zG=(mP=class{constructor(e={}){xe(this,an,void 0);xe(this,Jo,void 0);xe(this,ei,void 0);xe(this,Ql,void 0);xe(this,Jl,void 0);xe(this,ti,void 0);xe(this,ec,void 0);xe(this,tc,void 0);me(this,an,e.queryCache||new MG),me(this,Jo,e.mutationCache||new $G),me(this,ei,e.defaultOptions||{}),me(this,Ql,new Map),me(this,Jl,new Map),me(this,ti,0)}mount(){Tf(this,ti)._++,$(this,ti)===1&&(me(this,ec,Cg.subscribe(()=>{Cg.isFocused()&&(this.resumePausedMutations(),$(this,an).onFocus())})),me(this,tc,_g.subscribe(()=>{_g.isOnline()&&(this.resumePausedMutations(),$(this,an).onOnline())})))}unmount(){var e,t;Tf(this,ti)._--,$(this,ti)===0&&((e=$(this,ec))==null||e.call(this),me(this,ec,void 0),(t=$(this,tc))==null||t.call(this),me(this,tc,void 0))}isFetching(e){return $(this,an).findAll({...e,fetchStatus:"fetching"}).length}isMutating(e){return $(this,Jo).findAll({...e,status:"pending"}).length}getQueryData(e){var t;return(t=$(this,an).find({queryKey:e}))==null?void 0:t.state.data}ensureQueryData(e){const t=this.getQueryData(e.queryKey);return t!==void 0?Promise.resolve(t):this.fetchQuery(e)}getQueriesData(e){return this.getQueryCache().findAll(e).map(({queryKey:t,state:n})=>{const r=n.data;return[t,r]})}setQueryData(e,t,n){const r=$(this,an).find({queryKey:e}),a=r==null?void 0:r.state.data,o=_G(t,a);if(typeof o>"u")return;const i=this.defaultQueryOptions({queryKey:e});return $(this,an).build(this,i).setData(o,{...n,manual:!0})}setQueriesData(e,t,n){return sn.batch(()=>this.getQueryCache().findAll(e).map(({queryKey:r})=>[r,this.setQueryData(r,t,n)]))}getQueryState(e){var t;return(t=$(this,an).find({queryKey:e}))==null?void 0:t.state}removeQueries(e){const t=$(this,an);sn.batch(()=>{t.findAll(e).forEach(n=>{t.remove(n)})})}resetQueries(e,t){const n=$(this,an),r={type:"active",...e};return sn.batch(()=>(n.findAll(e).forEach(a=>{a.reset()}),this.refetchQueries(r,t)))}cancelQueries(e={},t={}){const n={revert:!0,...t},r=sn.batch(()=>$(this,an).findAll(e).map(a=>a.cancel(n)));return Promise.all(r).then(Fr).catch(Fr)}invalidateQueries(e={},t={}){return sn.batch(()=>{if($(this,an).findAll(e).forEach(r=>{r.invalidate()}),e.refetchType==="none")return Promise.resolve();const n={...e,type:e.refetchType??e.type??"active"};return this.refetchQueries(n,t)})}refetchQueries(e={},t){const n={...t,cancelRefetch:(t==null?void 0:t.cancelRefetch)??!0},r=sn.batch(()=>$(this,an).findAll(e).filter(a=>!a.isDisabled()).map(a=>{let o=a.fetch(void 0,n);return n.throwOnError||(o=o.catch(Fr)),a.state.fetchStatus==="paused"?Promise.resolve():o}));return Promise.all(r).then(Fr)}fetchQuery(e){const t=this.defaultQueryOptions(e);typeof t.retry>"u"&&(t.retry=!1);const n=$(this,an).build(this,t);return n.isStaleByTime(t.staleTime)?n.fetch(t):Promise.resolve(n.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(Fr).catch(Fr)}fetchInfiniteQuery(e){return e.behavior=FG(e.pages),this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(Fr).catch(Fr)}resumePausedMutations(){return $(this,Jo).resumePausedMutations()}getQueryCache(){return $(this,an)}getMutationCache(){return $(this,Jo)}getDefaultOptions(){return $(this,ei)}setDefaultOptions(e){me(this,ei,e)}setQueryDefaults(e,t){$(this,Ql).set(gd(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){const t=[...$(this,Ql).values()];let n={};return t.forEach(r=>{md(e,r.queryKey)&&(n={...n,...r.defaultOptions})}),n}setMutationDefaults(e,t){$(this,Jl).set(gd(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){const t=[...$(this,Jl).values()];let n={};return t.forEach(r=>{md(e,r.mutationKey)&&(n={...n,...r.defaultOptions})}),n}defaultQueryOptions(e){if(e!=null&&e._defaulted)return e;const t={...$(this,ei).queries,...(e==null?void 0:e.queryKey)&&this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||(t.queryHash=t_(t.queryKey,t)),typeof t.refetchOnReconnect>"u"&&(t.refetchOnReconnect=t.networkMode!=="always"),typeof t.throwOnError>"u"&&(t.throwOnError=!!t.suspense),typeof t.networkMode>"u"&&t.persister&&(t.networkMode="offlineFirst"),t}defaultMutationOptions(e){return e!=null&&e._defaulted?e:{...$(this,ei).mutations,...(e==null?void 0:e.mutationKey)&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){$(this,an).clear(),$(this,Jo).clear()}},an=new WeakMap,Jo=new WeakMap,ei=new WeakMap,Ql=new WeakMap,Jl=new WeakMap,ti=new WeakMap,ec=new WeakMap,tc=new WeakMap,mP),rr,Ct,nc,On,ds,rc,Ta,Fd,ac,oc,fs,ps,ni,gs,ms,Cu,jd,R1,zd,N1,Ud,I1,Bd,O1,Hd,D1,Vd,L1,qd,M1,fm,yF,hP,UG=(hP=class extends Dc{constructor(t,n){super();xe(this,ms);xe(this,jd);xe(this,zd);xe(this,Ud);xe(this,Bd);xe(this,Hd);xe(this,Vd);xe(this,qd);xe(this,fm);xe(this,rr,void 0);xe(this,Ct,void 0);xe(this,nc,void 0);xe(this,On,void 0);xe(this,ds,void 0);xe(this,rc,void 0);xe(this,Ta,void 0);xe(this,Fd,void 0);xe(this,ac,void 0);xe(this,oc,void 0);xe(this,fs,void 0);xe(this,ps,void 0);xe(this,ni,void 0);xe(this,gs,void 0);me(this,Ct,void 0),me(this,nc,void 0),me(this,On,void 0),me(this,gs,new Set),me(this,rr,t),this.options=n,me(this,Ta,null),this.bindMethods(),this.setOptions(n)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&($(this,Ct).addObserver(this),OR($(this,Ct),this.options)?Ue(this,ms,Cu).call(this):this.updateResult(),Ue(this,Bd,O1).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return P1($(this,Ct),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return P1($(this,Ct),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,Ue(this,Hd,D1).call(this),Ue(this,Vd,L1).call(this),$(this,Ct).removeObserver(this)}setOptions(t,n){const r=this.options,a=$(this,Ct);if(this.options=$(this,rr).defaultQueryOptions(t),kg(r,this.options)||$(this,rr).getQueryCache().notify({type:"observerOptionsUpdated",query:$(this,Ct),observer:this}),typeof this.options.enabled<"u"&&typeof this.options.enabled!="boolean")throw new Error("Expected enabled to be a boolean");this.options.queryKey||(this.options.queryKey=r.queryKey),Ue(this,qd,M1).call(this);const o=this.hasListeners();o&&DR($(this,Ct),a,this.options,r)&&Ue(this,ms,Cu).call(this),this.updateResult(n),o&&($(this,Ct)!==a||this.options.enabled!==r.enabled||this.options.staleTime!==r.staleTime)&&Ue(this,jd,R1).call(this);const i=Ue(this,zd,N1).call(this);o&&($(this,Ct)!==a||this.options.enabled!==r.enabled||i!==$(this,ni))&&Ue(this,Ud,I1).call(this,i)}getOptimisticResult(t){const n=$(this,rr).getQueryCache().build($(this,rr),t),r=this.createResult(n,t);return HG(this,r)&&(me(this,On,r),me(this,rc,this.options),me(this,ds,$(this,Ct).state)),r}getCurrentResult(){return $(this,On)}trackResult(t){const n={};return Object.keys(t).forEach(r=>{Object.defineProperty(n,r,{configurable:!1,enumerable:!0,get:()=>($(this,gs).add(r),t[r])})}),n}getCurrentQuery(){return $(this,Ct)}refetch({...t}={}){return this.fetch({...t})}fetchOptimistic(t){const n=$(this,rr).defaultQueryOptions(t),r=$(this,rr).getQueryCache().build($(this,rr),n);return r.isFetchingOptimistic=!0,r.fetch().then(()=>this.createResult(r,n))}fetch(t){return Ue(this,ms,Cu).call(this,{...t,cancelRefetch:t.cancelRefetch??!0}).then(()=>(this.updateResult(),$(this,On)))}createResult(t,n){var x;const r=$(this,Ct),a=this.options,o=$(this,On),i=$(this,ds),s=$(this,rc),c=t!==r?t.state:$(this,nc),{state:u}=t;let{error:d,errorUpdatedAt:g,fetchStatus:m,status:b}=u,y=!1,w;if(n._optimisticResults){const C=this.hasListeners(),_=!C&&OR(t,n),R=C&&DR(t,r,n,a);(_||R)&&(m=jm(t.options.networkMode)?"fetching":"paused",u.dataUpdatedAt||(b="pending")),n._optimisticResults==="isRestoring"&&(m="idle")}if(n.select&&typeof u.data<"u")if(o&&u.data===(i==null?void 0:i.data)&&n.select===$(this,Fd))w=$(this,ac);else try{me(this,Fd,n.select),w=n.select(u.data),w=T1(o==null?void 0:o.data,w,n),me(this,ac,w),me(this,Ta,null)}catch(C){me(this,Ta,C)}else w=u.data;if(typeof n.placeholderData<"u"&&typeof w>"u"&&b==="pending"){let C;if(o!=null&&o.isPlaceholderData&&n.placeholderData===(s==null?void 0:s.placeholderData))C=o.data;else if(C=typeof n.placeholderData=="function"?n.placeholderData((x=$(this,oc))==null?void 0:x.state.data,$(this,oc)):n.placeholderData,n.select&&typeof C<"u")try{C=n.select(C),me(this,Ta,null)}catch(_){me(this,Ta,_)}typeof C<"u"&&(b="success",w=T1(o==null?void 0:o.data,C,n),y=!0)}$(this,Ta)&&(d=$(this,Ta),w=$(this,ac),g=Date.now(),b="error");const v=m==="fetching",h=b==="pending",S=b==="error",E=h&&v;return{status:b,fetchStatus:m,isPending:h,isSuccess:b==="success",isError:S,isInitialLoading:E,isLoading:E,data:w,dataUpdatedAt:u.dataUpdatedAt,error:d,errorUpdatedAt:g,failureCount:u.fetchFailureCount,failureReason:u.fetchFailureReason,errorUpdateCount:u.errorUpdateCount,isFetched:u.dataUpdateCount>0||u.errorUpdateCount>0,isFetchedAfterMount:u.dataUpdateCount>c.dataUpdateCount||u.errorUpdateCount>c.errorUpdateCount,isFetching:v,isRefetching:v&&!h,isLoadingError:S&&u.dataUpdatedAt===0,isPaused:m==="paused",isPlaceholderData:y,isRefetchError:S&&u.dataUpdatedAt!==0,isStale:n_(t,n),refetch:this.refetch}}updateResult(t){const n=$(this,On),r=this.createResult($(this,Ct),this.options);if(me(this,ds,$(this,Ct).state),me(this,rc,this.options),kg(r,n))return;$(this,ds).data!==void 0&&me(this,oc,$(this,Ct)),me(this,On,r);const a={},o=()=>{if(!n)return!0;const{notifyOnChangeProps:i}=this.options,s=typeof i=="function"?i():i;if(s==="all"||!s&&!$(this,gs).size)return!0;const l=new Set(s??$(this,gs));return this.options.throwOnError&&l.add("error"),Object.keys($(this,On)).some(c=>{const u=c;return $(this,On)[u]!==n[u]&&l.has(u)})};(t==null?void 0:t.listeners)!==!1&&o()&&(a.listeners=!0),Ue(this,fm,yF).call(this,{...a,...t})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&Ue(this,Bd,O1).call(this)}},rr=new WeakMap,Ct=new WeakMap,nc=new WeakMap,On=new WeakMap,ds=new WeakMap,rc=new WeakMap,Ta=new WeakMap,Fd=new WeakMap,ac=new WeakMap,oc=new WeakMap,fs=new WeakMap,ps=new WeakMap,ni=new WeakMap,gs=new WeakMap,ms=new WeakSet,Cu=function(t){Ue(this,qd,M1).call(this);let n=$(this,Ct).fetch(this.options,t);return t!=null&&t.throwOnError||(n=n.catch(Fr)),n},jd=new WeakSet,R1=function(){if(Ue(this,Hd,D1).call(this),gc||$(this,On).isStale||!_1(this.options.staleTime))return;const n=dF($(this,On).dataUpdatedAt,this.options.staleTime)+1;me(this,fs,setTimeout(()=>{$(this,On).isStale||this.updateResult()},n))},zd=new WeakSet,N1=function(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval($(this,Ct)):this.options.refetchInterval)??!1},Ud=new WeakSet,I1=function(t){Ue(this,Vd,L1).call(this),me(this,ni,t),!(gc||this.options.enabled===!1||!_1($(this,ni))||$(this,ni)===0)&&me(this,ps,setInterval(()=>{(this.options.refetchIntervalInBackground||Cg.isFocused())&&Ue(this,ms,Cu).call(this)},$(this,ni)))},Bd=new WeakSet,O1=function(){Ue(this,jd,R1).call(this),Ue(this,Ud,I1).call(this,Ue(this,zd,N1).call(this))},Hd=new WeakSet,D1=function(){$(this,fs)&&(clearTimeout($(this,fs)),me(this,fs,void 0))},Vd=new WeakSet,L1=function(){$(this,ps)&&(clearInterval($(this,ps)),me(this,ps,void 0))},qd=new WeakSet,M1=function(){const t=$(this,rr).getQueryCache().build($(this,rr),this.options);if(t===$(this,Ct))return;const n=$(this,Ct);me(this,Ct,t),me(this,nc,t.state),this.hasListeners()&&(n==null||n.removeObserver(this),t.addObserver(this))},fm=new WeakSet,yF=function(t){sn.batch(()=>{t.listeners&&this.listeners.forEach(n=>{n($(this,On))}),$(this,rr).getQueryCache().notify({query:$(this,Ct),type:"observerResultsUpdated"})})},hP);function BG(e,t){return t.enabled!==!1&&!e.state.dataUpdatedAt&&!(e.state.status==="error"&&t.retryOnMount===!1)}function OR(e,t){return BG(e,t)||e.state.dataUpdatedAt>0&&P1(e,t,t.refetchOnMount)}function P1(e,t,n){if(t.enabled!==!1){const r=typeof n=="function"?n(e):n;return r==="always"||r!==!1&&n_(e,t)}return!1}function DR(e,t,n,r){return n.enabled!==!1&&(e!==t||r.enabled===!1)&&(!n.suspense||e.state.status!=="error")&&n_(e,n)}function n_(e,t){return e.isStaleByTime(t.staleTime)}function HG(e,t){return!kg(e.getCurrentResult(),t)}var ri,Wn,$r,oo,ic,Up,Gd,$1,bP,VG=(bP=class extends Dc{constructor(n,r){super();xe(this,ic);xe(this,Gd);xe(this,ri,void 0);xe(this,Wn,void 0);xe(this,$r,void 0);xe(this,oo,void 0);me(this,Wn,void 0),me(this,ri,n),this.setOptions(r),this.bindMethods(),Ue(this,ic,Up).call(this)}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(n){var a;const r=this.options;this.options=$(this,ri).defaultMutationOptions(n),kg(r,this.options)||$(this,ri).getMutationCache().notify({type:"observerOptionsUpdated",mutation:$(this,$r),observer:this}),(a=$(this,$r))==null||a.setOptions(this.options)}onUnsubscribe(){var n;this.hasListeners()||(n=$(this,$r))==null||n.removeObserver(this)}onMutationUpdate(n){Ue(this,ic,Up).call(this),Ue(this,Gd,$1).call(this,n)}getCurrentResult(){return $(this,Wn)}reset(){me(this,$r,void 0),Ue(this,ic,Up).call(this),Ue(this,Gd,$1).call(this)}mutate(n,r){var a;return me(this,oo,r),(a=$(this,$r))==null||a.removeObserver(this),me(this,$r,$(this,ri).getMutationCache().build($(this,ri),this.options)),$(this,$r).addObserver(this),$(this,$r).execute(n)}},ri=new WeakMap,Wn=new WeakMap,$r=new WeakMap,oo=new WeakMap,ic=new WeakSet,Up=function(){var r;const n=((r=$(this,$r))==null?void 0:r.state)??bF();me(this,Wn,{...n,isPending:n.status==="pending",isSuccess:n.status==="success",isError:n.status==="error",isIdle:n.status==="idle",mutate:this.mutate,reset:this.reset})},Gd=new WeakSet,$1=function(n){sn.batch(()=>{var r,a,o,i,s,l,c,u;$(this,oo)&&this.hasListeners()&&((n==null?void 0:n.type)==="success"?((a=(r=$(this,oo)).onSuccess)==null||a.call(r,n.data,$(this,Wn).variables,$(this,Wn).context),(i=(o=$(this,oo)).onSettled)==null||i.call(o,n.data,null,$(this,Wn).variables,$(this,Wn).context)):(n==null?void 0:n.type)==="error"&&((l=(s=$(this,oo)).onError)==null||l.call(s,n.error,$(this,Wn).variables,$(this,Wn).context),(u=(c=$(this,oo)).onSettled)==null||u.call(c,void 0,n.error,$(this,Wn).variables,$(this,Wn).context))),this.listeners.forEach(d=>{d($(this,Wn))})})},bP),vF=p.createContext(void 0),Bt=e=>{const t=p.useContext(vF);if(e)return e;if(!t)throw new Error("No QueryClient set, use QueryClientProvider to set one");return t},qG=({client:e,children:t})=>(p.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),p.createElement(vF.Provider,{value:e},t)),SF=p.createContext(!1),GG=()=>p.useContext(SF);SF.Provider;function WG(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var KG=p.createContext(WG()),YG=()=>p.useContext(KG);function wF(e,t){return typeof e=="function"?e(...t):!!e}var ZG=(e,t)=>{(e.suspense||e.throwOnError)&&(t.isReset()||(e.retryOnMount=!1))},XG=e=>{p.useEffect(()=>{e.clearReset()},[e])},QG=({result:e,errorResetBoundary:t,throwOnError:n,query:r})=>e.isError&&!t.isReset()&&!e.isFetching&&wF(n,[e.error,r]),JG=e=>{e.suspense&&typeof e.staleTime!="number"&&(e.staleTime=1e3)},eW=(e,t)=>e.isLoading&&e.isFetching&&!t,tW=(e,t,n)=>(e==null?void 0:e.suspense)&&eW(t,n),nW=(e,t,n)=>t.fetchOptimistic(e).catch(()=>{n.clearReset()});function rW(e,t,n){const r=Bt(n),a=GG(),o=YG(),i=r.defaultQueryOptions(e);i._optimisticResults=a?"isRestoring":"optimistic",JG(i),ZG(i,o),XG(o);const[s]=p.useState(()=>new t(r,i)),l=s.getOptimisticResult(i);if(p.useSyncExternalStore(p.useCallback(c=>{const u=a?()=>{}:s.subscribe(sn.batchCalls(c));return s.updateResult(),u},[s,a]),()=>s.getCurrentResult(),()=>s.getCurrentResult()),p.useEffect(()=>{s.setOptions(i,{listeners:!1})},[i,s]),tW(i,l,a))throw nW(i,s,o);if(QG({result:l,errorResetBoundary:o,throwOnError:i.throwOnError,query:s.getCurrentQuery()}))throw l.error;return i.notifyOnChangeProps?l:s.trackResult(l)}function Jr(e,t){return rW(e,UG,t)}function gr(e,t){const n=Bt(t),[r]=p.useState(()=>new VG(n,e));p.useEffect(()=>{r.setOptions(e)},[r,e]);const a=p.useSyncExternalStore(p.useCallback(i=>r.subscribe(sn.batchCalls(i)),[r]),()=>r.getCurrentResult(),()=>r.getCurrentResult()),o=p.useCallback((i,s)=>{r.mutate(i,s).catch(aW)},[r]);if(a.error&&wF(r.options.throwOnError,[a.error]))throw a.error;return{...a,mutate:o,mutateAsync:a.mutate}}function aW(){}var oW=function(){return null};/** * @remix-run/router v1.12.0 * * Copyright (c) Remix Software Inc. @@ -46,8 +46,8 @@ Error generating stack: `+o.message+` * LICENSE.md file in the root directory of this source tree. * * @license MIT - */function Wt(){return Wt=Object.assign?Object.assign.bind():function(e){for(var t=1;t"u")throw new Error(t)}function Cs(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function sW(){return Math.random().toString(36).substr(2,8)}function MR(e,t){return{usr:e.state,key:e.key,idx:t}}function hd(e,t,n,r){return n===void 0&&(n=null),Wt({pathname:typeof e=="string"?e:e.pathname,search:"",hash:""},typeof t=="string"?Co(t):t,{state:n,key:t&&t.key||r||sW()})}function _s(e){let{pathname:t="/",search:n="",hash:r=""}=e;return n&&n!=="?"&&(t+=n.charAt(0)==="?"?n:"?"+n),r&&r!=="#"&&(t+=r.charAt(0)==="#"?r:"#"+r),t}function Co(e){let t={};if(e){let n=e.indexOf("#");n>=0&&(t.hash=e.substr(n),e=e.substr(0,n));let r=e.indexOf("?");r>=0&&(t.search=e.substr(r),e=e.substr(0,r)),e&&(t.pathname=e)}return t}function lW(e,t,n,r){r===void 0&&(r={});let{window:a=document.defaultView,v5Compat:o=!1}=r,i=a.history,s=Yt.Pop,l=null,c=u();c==null&&(c=0,i.replaceState(Wt({},i.state,{idx:c}),""));function u(){return(i.state||{idx:null}).idx}function d(){s=Yt.Pop;let w=u(),v=w==null?null:w-c;c=w,l&&l({action:s,location:y.location,delta:v})}function g(w,v){s=Yt.Push;let h=hd(y.location,w,v);n&&n(h,w),c=u()+1;let S=MR(h,c),E=y.createHref(h);try{i.pushState(S,"",E)}catch(k){if(k instanceof DOMException&&k.name==="DataCloneError")throw k;a.location.assign(E)}o&&l&&l({action:s,location:y.location,delta:1})}function m(w,v){s=Yt.Replace;let h=hd(y.location,w,v);n&&n(h,w),c=u();let S=MR(h,c),E=y.createHref(h);i.replaceState(S,"",E),o&&l&&l({action:s,location:y.location,delta:0})}function b(w){let v=a.location.origin!=="null"?a.location.origin:a.location.href,h=typeof w=="string"?w:_s(w);return Ze(v,"No window.location.(origin|href) available to create URL for href: "+h),new URL(h,v)}let y={get action(){return s},get location(){return e(a,i)},listen(w){if(l)throw new Error("A history only accepts one active listener");return a.addEventListener(LR,d),l=w,()=>{a.removeEventListener(LR,d),l=null}},createHref(w){return t(a,w)},createURL:b,encodeLocation(w){let v=b(w);return{pathname:v.pathname,search:v.search,hash:v.hash}},push:g,replace:m,go(w){return i.go(w)}};return y}var Zt;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(Zt||(Zt={}));const cW=new Set(["lazy","caseSensitive","path","id","index","children"]);function uW(e){return e.index===!0}function $1(e,t,n,r){return n===void 0&&(n=[]),r===void 0&&(r={}),e.map((a,o)=>{let i=[...n,o],s=typeof a.id=="string"?a.id:i.join("-");if(Ze(a.index!==!0||!a.children,"Cannot specify children on an index route"),Ze(!r[s],'Found a route id collision on id "'+s+`". Route id's must be globally unique within Data Router usages`),uW(a)){let l=Wt({},a,t(a),{id:s});return r[s]=l,l}else{let l=Wt({},a,t(a),{id:s,children:void 0});return r[s]=l,a.children&&(l.children=$1(a.children,t,i,r)),l}})}function Rl(e,t,n){n===void 0&&(n="/");let r=typeof t=="string"?Co(t):t,a=wi(r.pathname||"/",n);if(a==null)return null;let o=wF(e);fW(o);let i=null;for(let s=0;i==null&&s{let l={relativePath:s===void 0?o.path||"":s,caseSensitive:o.caseSensitive===!0,childrenIndex:i,route:o};l.relativePath.startsWith("/")&&(Ze(l.relativePath.startsWith(r),'Absolute route path "'+l.relativePath+'" nested under path '+('"'+r+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),l.relativePath=l.relativePath.slice(r.length));let c=uo([r,l.relativePath]),u=n.concat(l);o.children&&o.children.length>0&&(Ze(o.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+c+'".')),wF(o.children,t,u,c)),!(o.path==null&&!o.index)&&t.push({path:c,score:vW(c,o.index),routesMeta:u})};return e.forEach((o,i)=>{var s;if(o.path===""||!((s=o.path)!=null&&s.includes("?")))a(o,i);else for(let l of EF(o.path))a(o,i,l)}),t}function EF(e){let t=e.split("/");if(t.length===0)return[];let[n,...r]=t,a=n.endsWith("?"),o=n.replace(/\?$/,"");if(r.length===0)return a?[o,""]:[o];let i=EF(r.join("/")),s=[];return s.push(...i.map(l=>l===""?o:[o,l].join("/"))),a&&s.push(...i),s.map(l=>e.startsWith("/")&&l===""?"/":l)}function fW(e){e.sort((t,n)=>t.score!==n.score?n.score-t.score:SW(t.routesMeta.map(r=>r.childrenIndex),n.routesMeta.map(r=>r.childrenIndex)))}const pW=/^:\w+$/,gW=3,mW=2,hW=1,bW=10,yW=-2,PR=e=>e==="*";function vW(e,t){let n=e.split("/"),r=n.length;return n.some(PR)&&(r+=yW),t&&(r+=mW),n.filter(a=>!PR(a)).reduce((a,o)=>a+(pW.test(o)?gW:o===""?hW:bW),r)}function SW(e,t){return e.length===t.length&&e.slice(0,-1).every((r,a)=>r===t[a])?e[e.length-1]-t[t.length-1]:0}function wW(e,t){let{routesMeta:n}=e,r={},a="/",o=[];for(let i=0;i{let{paramName:g,isOptional:m}=u;if(g==="*"){let y=s[d]||"";i=o.slice(0,o.length-y.length).replace(/(.)\/+$/,"$1")}const b=s[d];return m&&!b?c[g]=void 0:c[g]=kW(b||"",g),c},{}),pathname:o,pathnameBase:i,pattern:e}}function EW(e,t,n){t===void 0&&(t=!1),n===void 0&&(n=!0),Cs(e==="*"||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were '+('"'+e.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+e.replace(/\*$/,"/*")+'".'));let r=[],a="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:(\w+)(\?)?/g,(i,s,l)=>(r.push({paramName:s,isOptional:l!=null}),l?"/?([^\\/]+)?":"/([^\\/]+)"));return e.endsWith("*")?(r.push({paramName:"*"}),a+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):n?a+="\\/*$":e!==""&&e!=="/"&&(a+="(?:(?=\\/|$))"),[new RegExp(a,t?void 0:"i"),r]}function xW(e){try{return decodeURI(e)}catch(t){return Cs(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+t+").")),e}}function kW(e,t){try{return decodeURIComponent(e)}catch(n){return Cs(!1,'The value for the URL param "'+t+'" will not be decoded because'+(' the string "'+e+'" is a malformed URL segment. This is probably')+(" due to a bad percent encoding ("+n+").")),e}}function wi(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith("/")?t.length-1:t.length,r=e.charAt(n);return r&&r!=="/"?null:e.slice(n)||"/"}function CW(e,t){t===void 0&&(t="/");let{pathname:n,search:r="",hash:a=""}=typeof e=="string"?Co(e):e;return{pathname:n?n.startsWith("/")?n:_W(n,t):t,search:TW(r),hash:RW(a)}}function _W(e,t){let n=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(a=>{a===".."?n.length>1&&n.pop():a!=="."&&n.push(a)}),n.length>1?n.join("/"):"/"}function wb(e,t,n,r){return"Cannot include a '"+e+"' character in a manually specified "+("`to."+t+"` field ["+JSON.stringify(r)+"]. Please separate it out to the ")+("`to."+n+"` field. Alternatively you may provide the full path as ")+'a string in and the router will parse it for you.'}function tf(e){return e.filter((t,n)=>n===0||t.route.path&&t.route.path.length>0)}function zm(e,t,n,r){r===void 0&&(r=!1);let a;typeof e=="string"?a=Co(e):(a=Wt({},e),Ze(!a.pathname||!a.pathname.includes("?"),wb("?","pathname","search",a)),Ze(!a.pathname||!a.pathname.includes("#"),wb("#","pathname","hash",a)),Ze(!a.search||!a.search.includes("#"),wb("#","search","hash",a)));let o=e===""||a.pathname==="",i=o?"/":a.pathname,s;if(i==null)s=n;else if(r){let d=t[t.length-1].replace(/^\//,"").split("/");if(i.startsWith("..")){let g=i.split("/");for(;g[0]==="..";)g.shift(),d.pop();a.pathname=g.join("/")}s="/"+d.join("/")}else{let d=t.length-1;if(i.startsWith("..")){let g=i.split("/");for(;g[0]==="..";)g.shift(),d-=1;a.pathname=g.join("/")}s=d>=0?t[d]:"/"}let l=CW(a,s),c=i&&i!=="/"&&i.endsWith("/"),u=(o||i===".")&&n.endsWith("/");return!l.pathname.endsWith("/")&&(c||u)&&(l.pathname+="/"),l}const uo=e=>e.join("/").replace(/\/\/+/g,"/"),AW=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),TW=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,RW=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;class n_{constructor(t,n,r,a){a===void 0&&(a=!1),this.status=t,this.statusText=n||"",this.internal=a,r instanceof Error?(this.data=r.toString(),this.error=r):this.data=r}}function xF(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const kF=["post","put","patch","delete"],NW=new Set(kF),IW=["get",...kF],OW=new Set(IW),DW=new Set([301,302,303,307,308]),LW=new Set([307,308]),Eb={state:"idle",location:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},MW={state:"idle",data:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},ru={state:"unblocked",proceed:void 0,reset:void 0,location:void 0},CF=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,PW=e=>({hasErrorBoundary:!!e.hasErrorBoundary}),_F="remix-router-transitions";function $W(e){const t=e.window?e.window:typeof window<"u"?window:void 0,n=typeof t<"u"&&typeof t.document<"u"&&typeof t.document.createElement<"u",r=!n;Ze(e.routes.length>0,"You must provide a non-empty routes array to createRouter");let a;if(e.mapRouteProperties)a=e.mapRouteProperties;else if(e.detectErrorBoundary){let B=e.detectErrorBoundary;a=G=>({hasErrorBoundary:B(G)})}else a=PW;let o={},i=$1(e.routes,a,void 0,o),s,l=e.basename||"/",c=Wt({v7_fetcherPersist:!1,v7_normalizeFormMethod:!1,v7_prependBasename:!1},e.future),u=null,d=new Set,g=null,m=null,b=null,y=e.hydrationData!=null,w=Rl(i,e.history.location,l),v=null;if(w==null){let B=jr(404,{pathname:e.history.location.pathname}),{matches:G,route:te}=VR(i);w=G,v={[te.id]:B}}let h=!w.some(B=>B.route.lazy)&&(!w.some(B=>B.route.loader)||e.hydrationData!=null),S,E={historyAction:e.history.action,location:e.history.location,matches:w,initialized:h,navigation:Eb,restoreScrollPosition:e.hydrationData!=null?!1:null,preventScrollReset:!1,revalidation:"idle",loaderData:e.hydrationData&&e.hydrationData.loaderData||{},actionData:e.hydrationData&&e.hydrationData.actionData||null,errors:e.hydrationData&&e.hydrationData.errors||v,fetchers:new Map,blockers:new Map},k=Yt.Pop,x=!1,C,_=!1,R=new Map,T=null,L=!1,D=!1,H=[],z=[],M=new Map,U=0,X=-1,j=new Map,O=new Set,A=new Map,V=new Map,P=new Set,N=new Map,K=new Map,ae=!1;function ne(){if(u=e.history.listen(B=>{let{action:G,location:te,delta:be}=B;if(ae){ae=!1;return}Cs(K.size===0||be!=null,"You are trying to use a blocker on a POP navigation to a location that was not created by @remix-run/router. This will fail silently in production. This can happen if you are navigating outside the router via `window.history.pushState`/`window.location.hash` instead of using router navigation APIs. This can also happen if you are using createHashRouter and the user manually changes the URL.");let Te=Io({currentLocation:E.location,nextLocation:te,historyAction:G});if(Te&&be!=null){ae=!0,e.history.go(be*-1),Sn(Te,{state:"blocked",location:te,proceed(){Sn(Te,{state:"proceeding",proceed:void 0,reset:void 0,location:te}),e.history.go(be)},reset(){let Qe=new Map(E.blockers);Qe.set(Te,ru),he({blockers:Qe})}});return}return We(G,te)}),n){KW(t,R);let B=()=>YW(t,R);t.addEventListener("pagehide",B),T=()=>t.removeEventListener("pagehide",B)}return E.initialized||We(Yt.Pop,E.location),S}function Q(){u&&u(),T&&T(),d.clear(),C&&C.abort(),E.fetchers.forEach((B,G)=>St(G)),E.blockers.forEach((B,G)=>Ir(G))}function pe(B){return d.add(B),()=>d.delete(B)}function he(B,G){G===void 0&&(G={}),E=Wt({},E,B);let te=[],be=[];c.v7_fetcherPersist&&E.fetchers.forEach((Te,Qe)=>{Te.state==="idle"&&(P.has(Qe)?be.push(Qe):te.push(Qe))}),[...d].forEach(Te=>Te(E,{deletedFetchers:be,unstable_viewTransitionOpts:G.viewTransitionOpts,unstable_flushSync:G.flushSync===!0})),c.v7_fetcherPersist&&(te.forEach(Te=>E.fetchers.delete(Te)),be.forEach(Te=>St(Te)))}function re(B,G,te){var be,Te;let{flushSync:Qe}=te===void 0?{}:te,je=E.actionData!=null&&E.navigation.formMethod!=null&&ca(E.navigation.formMethod)&&E.navigation.state==="loading"&&((be=B.state)==null?void 0:be._isRedirect)!==!0,Le;G.actionData?Object.keys(G.actionData).length>0?Le=G.actionData:Le=null:je?Le=E.actionData:Le=null;let Re=G.loaderData?HR(E.loaderData,G.loaderData,G.matches||[],G.errors):E.loaderData,it=E.blockers;it.size>0&&(it=new Map(it),it.forEach((xt,Ft)=>it.set(Ft,ru)));let wn=x===!0||E.navigation.formMethod!=null&&ca(E.navigation.formMethod)&&((Te=B.state)==null?void 0:Te._isRedirect)!==!0;s&&(i=s,s=void 0),L||k===Yt.Pop||(k===Yt.Push?e.history.push(B,B.state):k===Yt.Replace&&e.history.replace(B,B.state));let et;if(k===Yt.Pop){let xt=R.get(E.location.pathname);xt&&xt.has(B.pathname)?et={currentLocation:E.location,nextLocation:B}:R.has(B.pathname)&&(et={currentLocation:B,nextLocation:E.location})}else if(_){let xt=R.get(E.location.pathname);xt?xt.add(B.pathname):(xt=new Set([B.pathname]),R.set(E.location.pathname,xt)),et={currentLocation:E.location,nextLocation:B}}he(Wt({},G,{actionData:Le,loaderData:Re,historyAction:k,location:B,initialized:!0,navigation:Eb,revalidation:"idle",restoreScrollPosition:rT(B,G.matches||E.matches),preventScrollReset:wn,blockers:it}),{viewTransitionOpts:et,flushSync:Qe===!0}),k=Yt.Pop,x=!1,_=!1,L=!1,D=!1,H=[],z=[]}async function Ee(B,G){if(typeof B=="number"){e.history.go(B);return}let te=j1(E.location,E.matches,l,c.v7_prependBasename,B,G==null?void 0:G.fromRouteId,G==null?void 0:G.relative),{path:be,submission:Te,error:Qe}=$R(c.v7_normalizeFormMethod,!1,te,G),je=E.location,Le=hd(E.location,be,G&&G.state);Le=Wt({},Le,e.history.encodeLocation(Le));let Re=G&&G.replace!=null?G.replace:void 0,it=Yt.Push;Re===!0?it=Yt.Replace:Re===!1||Te!=null&&ca(Te.formMethod)&&Te.formAction===E.location.pathname+E.location.search&&(it=Yt.Replace);let wn=G&&"preventScrollReset"in G?G.preventScrollReset===!0:void 0,et=(G&&G.unstable_flushSync)===!0,xt=Io({currentLocation:je,nextLocation:Le,historyAction:it});if(xt){Sn(xt,{state:"blocked",location:Le,proceed(){Sn(xt,{state:"proceeding",proceed:void 0,reset:void 0,location:Le}),Ee(B,G)},reset(){let Ft=new Map(E.blockers);Ft.set(xt,ru),he({blockers:Ft})}});return}return await We(it,Le,{submission:Te,pendingError:Qe,preventScrollReset:wn,replace:G&&G.replace,enableViewTransition:G&&G.unstable_viewTransition,flushSync:et})}function ke(){if(de(),he({revalidation:"loading"}),E.navigation.state!=="submitting"){if(E.navigation.state==="idle"){We(E.historyAction,E.location,{startUninterruptedRevalidation:!0});return}We(k||E.historyAction,E.navigation.location,{overrideNavigation:E.navigation})}}async function We(B,G,te){C&&C.abort(),C=null,k=B,L=(te&&te.startUninterruptedRevalidation)===!0,na(E.location,E.matches),x=(te&&te.preventScrollReset)===!0,_=(te&&te.enableViewTransition)===!0;let be=s||i,Te=te&&te.overrideNavigation,Qe=Rl(be,G,l),je=(te&&te.flushSync)===!0;if(!Qe){let Ft=jr(404,{pathname:G.pathname}),{matches:qn,route:Sa}=VR(be);Za(),re(G,{matches:qn,loaderData:{},errors:{[Sa.id]:Ft}},{flushSync:je});return}if(E.initialized&&!D&&BW(E.location,G)&&!(te&&te.submission&&ca(te.submission.formMethod))){re(G,{matches:Qe},{flushSync:je});return}C=new AbortController;let Le=ou(e.history,G,C.signal,te&&te.submission),Re,it;if(te&&te.pendingError)it={[Uu(Qe).route.id]:te.pendingError};else if(te&&te.submission&&ca(te.submission.formMethod)){let Ft=await Vt(Le,G,te.submission,Qe,{replace:te.replace,flushSync:je});if(Ft.shortCircuited)return;Re=Ft.pendingActionData,it=Ft.pendingActionError,Te=xb(G,te.submission),je=!1,Le=new Request(Le.url,{signal:Le.signal})}let{shortCircuited:wn,loaderData:et,errors:xt}=await mt(Le,G,Qe,Te,te&&te.submission,te&&te.fetcherSubmission,te&&te.replace,je,Re,it);wn||(C=null,re(G,Wt({matches:Qe},Re?{actionData:Re}:{},{loaderData:et,errors:xt})))}async function Vt(B,G,te,be,Te){Te===void 0&&(Te={}),de();let Qe=GW(G,te);he({navigation:Qe},{flushSync:Te.flushSync===!0});let je,Le=U1(be,G);if(!Le.route.action&&!Le.route.lazy)je={type:Zt.error,error:jr(405,{method:B.method,pathname:G.pathname,routeId:Le.route.id})};else if(je=await au("action",B,Le,be,o,a,l),B.signal.aborted)return{shortCircuited:!0};if(zl(je)){let Re;return Te&&Te.replace!=null?Re=Te.replace:Re=je.location===E.location.pathname+E.location.search,await Y(E,je,{submission:te,replace:Re}),{shortCircuited:!0}}if(Bu(je)){let Re=Uu(be,Le.route.id);return(Te&&Te.replace)!==!0&&(k=Yt.Push),{pendingActionData:{},pendingActionError:{[Re.route.id]:je.error}}}if(rs(je))throw jr(400,{type:"defer-action"});return{pendingActionData:{[Le.route.id]:je.data}}}async function mt(B,G,te,be,Te,Qe,je,Le,Re,it){let wn=be||xb(G,Te),et=Te||Qe||WR(wn),xt=s||i,[Ft,qn]=FR(e.history,E,te,et,G,D,H,z,A,O,xt,l,Re,it);if(Za(kt=>!(te&&te.some(Or=>Or.route.id===kt))||Ft&&Ft.some(Or=>Or.route.id===kt)),X=++U,Ft.length===0&&qn.length===0){let kt=He();return re(G,Wt({matches:te,loaderData:{},errors:it||null},Re?{actionData:Re}:{},kt?{fetchers:new Map(E.fetchers)}:{}),{flushSync:Le}),{shortCircuited:!0}}if(!L){qn.forEach(Or=>{let Qt=E.fetchers.get(Or.key),ji=iu(void 0,Qt?Qt.data:void 0);E.fetchers.set(Or.key,ji)});let kt=Re||E.actionData;he(Wt({navigation:wn},kt?Object.keys(kt).length===0?{actionData:null}:{actionData:kt}:{},qn.length>0?{fetchers:new Map(E.fetchers)}:{}),{flushSync:Le})}qn.forEach(kt=>{M.has(kt.key)&&le(kt.key),kt.controller&&M.set(kt.key,kt.controller)});let Sa=()=>qn.forEach(kt=>le(kt.key));C&&C.signal.addEventListener("abort",Sa);let{results:Gc,loaderResults:zh,fetcherResults:Ys}=await ye(E.matches,te,Ft,qn,B);if(B.signal.aborted)return{shortCircuited:!0};C&&C.signal.removeEventListener("abort",Sa),qn.forEach(kt=>M.delete(kt.key));let ra=qR(Gc);if(ra){if(ra.idx>=Ft.length){let kt=qn[ra.idx-Ft.length].key;O.add(kt)}return await Y(E,ra.result,{replace:je}),{shortCircuited:!0}}let{loaderData:Af,errors:Uh}=BR(E,te,Ft,zh,it,qn,Ys,N);N.forEach((kt,Or)=>{kt.subscribe(Qt=>{(Qt||kt.done)&&N.delete(Or)})});let Bh=He(),Hh=ft(X),Zs=Bh||Hh||qn.length>0;return Wt({loaderData:Af,errors:Uh},Zs?{fetchers:new Map(E.fetchers)}:{})}function Hn(B,G,te,be){if(r)throw new Error("router.fetch() was called during the server render, but it shouldn't be. You are likely calling a useFetcher() method in the body of your component. Try moving it to a useEffect or a callback.");M.has(B)&&le(B);let Te=(be&&be.unstable_flushSync)===!0,Qe=s||i,je=j1(E.location,E.matches,l,c.v7_prependBasename,te,G,be==null?void 0:be.relative),Le=Rl(Qe,je,l);if(!Le){_e(B,G,jr(404,{pathname:je}),{flushSync:Te});return}let{path:Re,submission:it,error:wn}=$R(c.v7_normalizeFormMethod,!0,je,be);if(wn){_e(B,G,wn,{flushSync:Te});return}let et=U1(Le,Re);if(x=(be&&be.preventScrollReset)===!0,it&&ca(it.formMethod)){F(B,G,Re,et,Le,Te,it);return}A.set(B,{routeId:G,path:Re}),q(B,G,Re,et,Le,Te,it)}async function F(B,G,te,be,Te,Qe,je){if(de(),A.delete(B),!be.route.action&&!be.route.lazy){let Qt=jr(405,{method:je.formMethod,pathname:te,routeId:G});_e(B,G,Qt,{flushSync:Qe});return}let Le=E.fetchers.get(B);oe(B,WW(je,Le),{flushSync:Qe});let Re=new AbortController,it=ou(e.history,te,Re.signal,je);M.set(B,Re);let wn=U,et=await au("action",it,be,Te,o,a,l);if(it.signal.aborted){M.get(B)===Re&&M.delete(B);return}if(P.has(B)){oe(B,Bo(void 0));return}if(zl(et))if(M.delete(B),X>wn){oe(B,Bo(void 0));return}else return O.add(B),oe(B,iu(je)),Y(E,et,{fetcherSubmission:je});if(Bu(et)){_e(B,G,et.error);return}if(rs(et))throw jr(400,{type:"defer-action"});let xt=E.navigation.location||E.location,Ft=ou(e.history,xt,Re.signal),qn=s||i,Sa=E.navigation.state!=="idle"?Rl(qn,E.navigation.location,l):E.matches;Ze(Sa,"Didn't find any matches after fetcher action");let Gc=++U;j.set(B,Gc);let zh=iu(je,et.data);E.fetchers.set(B,zh);let[Ys,ra]=FR(e.history,E,Sa,je,xt,D,H,z,A,O,qn,l,{[be.route.id]:et.data},void 0);ra.filter(Qt=>Qt.key!==B).forEach(Qt=>{let ji=Qt.key,aT=E.fetchers.get(ji),tB=iu(void 0,aT?aT.data:void 0);E.fetchers.set(ji,tB),M.has(ji)&&le(ji),Qt.controller&&M.set(ji,Qt.controller)}),he({fetchers:new Map(E.fetchers)});let Af=()=>ra.forEach(Qt=>le(Qt.key));Re.signal.addEventListener("abort",Af);let{results:Uh,loaderResults:Bh,fetcherResults:Hh}=await ye(E.matches,Sa,Ys,ra,Ft);if(Re.signal.aborted)return;Re.signal.removeEventListener("abort",Af),j.delete(B),M.delete(B),ra.forEach(Qt=>M.delete(Qt.key));let Zs=qR(Uh);if(Zs){if(Zs.idx>=Ys.length){let Qt=ra[Zs.idx-Ys.length].key;O.add(Qt)}return Y(E,Zs.result)}let{loaderData:kt,errors:Or}=BR(E,E.matches,Ys,Bh,void 0,ra,Hh,N);if(E.fetchers.has(B)){let Qt=Bo(et.data);E.fetchers.set(B,Qt)}ft(Gc),E.navigation.state==="loading"&&Gc>X?(Ze(k,"Expected pending action"),C&&C.abort(),re(E.navigation.location,{matches:Sa,loaderData:kt,errors:Or,fetchers:new Map(E.fetchers)})):(he({errors:Or,loaderData:HR(E.loaderData,kt,Sa,Or),fetchers:new Map(E.fetchers)}),D=!1)}async function q(B,G,te,be,Te,Qe,je){let Le=E.fetchers.get(B);oe(B,iu(je,Le?Le.data:void 0),{flushSync:Qe});let Re=new AbortController,it=ou(e.history,te,Re.signal);M.set(B,Re);let wn=U,et=await au("loader",it,be,Te,o,a,l);if(rs(et)&&(et=await RF(et,it.signal,!0)||et),M.get(B)===Re&&M.delete(B),!it.signal.aborted){if(P.has(B)){oe(B,Bo(void 0));return}if(zl(et))if(X>wn){oe(B,Bo(void 0));return}else{O.add(B),await Y(E,et);return}if(Bu(et)){_e(B,G,et.error);return}Ze(!rs(et),"Unhandled fetcher deferred data"),oe(B,Bo(et.data))}}async function Y(B,G,te){let{submission:be,fetcherSubmission:Te,replace:Qe}=te===void 0?{}:te;G.revalidate&&(D=!0);let je=hd(B.location,G.location,{_isRedirect:!0});if(Ze(je,"Expected a location on the redirect navigation"),n){let xt=!1;if(G.reloadDocument)xt=!0;else if(CF.test(G.location)){const Ft=e.history.createURL(G.location);xt=Ft.origin!==t.location.origin||wi(Ft.pathname,l)==null}if(xt){Qe?t.location.replace(G.location):t.location.assign(G.location);return}}C=null;let Le=Qe===!0?Yt.Replace:Yt.Push,{formMethod:Re,formAction:it,formEncType:wn}=B.navigation;!be&&!Te&&Re&&it&&wn&&(be=WR(B.navigation));let et=be||Te;if(LW.has(G.status)&&et&&ca(et.formMethod))await We(Le,je,{submission:Wt({},et,{formAction:G.location}),preventScrollReset:x});else{let xt=xb(je,be);await We(Le,je,{overrideNavigation:xt,fetcherSubmission:Te,preventScrollReset:x})}}async function ye(B,G,te,be,Te){let Qe=await Promise.all([...te.map(Re=>au("loader",Te,Re,G,o,a,l)),...be.map(Re=>Re.matches&&Re.match&&Re.controller?au("loader",ou(e.history,Re.path,Re.controller.signal),Re.match,Re.matches,o,a,l):{type:Zt.error,error:jr(404,{pathname:Re.path})})]),je=Qe.slice(0,te.length),Le=Qe.slice(te.length);return await Promise.all([GR(B,te,je,je.map(()=>Te.signal),!1,E.loaderData),GR(B,be.map(Re=>Re.match),Le,be.map(Re=>Re.controller?Re.controller.signal:null),!0)]),{results:Qe,loaderResults:je,fetcherResults:Le}}function de(){D=!0,H.push(...Za()),A.forEach((B,G)=>{M.has(G)&&(z.push(G),le(G))})}function oe(B,G,te){te===void 0&&(te={}),E.fetchers.set(B,G),he({fetchers:new Map(E.fetchers)},{flushSync:(te&&te.flushSync)===!0})}function _e(B,G,te,be){be===void 0&&(be={});let Te=Uu(E.matches,G);St(B),he({errors:{[Te.route.id]:te},fetchers:new Map(E.fetchers)},{flushSync:(be&&be.flushSync)===!0})}function wt(B){return c.v7_fetcherPersist&&(V.set(B,(V.get(B)||0)+1),P.has(B)&&P.delete(B)),E.fetchers.get(B)||MW}function St(B){let G=E.fetchers.get(B);M.has(B)&&!(G&&G.state==="loading"&&j.has(B))&&le(B),A.delete(B),j.delete(B),O.delete(B),P.delete(B),E.fetchers.delete(B)}function Z(B){if(c.v7_fetcherPersist){let G=(V.get(B)||0)-1;G<=0?(V.delete(B),P.add(B)):V.set(B,G)}else St(B);he({fetchers:new Map(E.fetchers)})}function le(B){let G=M.get(B);Ze(G,"Expected fetch controller: "+B),G.abort(),M.delete(B)}function De(B){for(let G of B){let te=wt(G),be=Bo(te.data);E.fetchers.set(G,be)}}function He(){let B=[],G=!1;for(let te of O){let be=E.fetchers.get(te);Ze(be,"Expected fetcher: "+te),be.state==="loading"&&(O.delete(te),B.push(te),G=!0)}return De(B),G}function ft(B){let G=[];for(let[te,be]of j)if(be0}function Tn(B,G){let te=E.blockers.get(B)||ru;return K.get(B)!==G&&K.set(B,G),te}function Ir(B){E.blockers.delete(B),K.delete(B)}function Sn(B,G){let te=E.blockers.get(B)||ru;Ze(te.state==="unblocked"&&G.state==="blocked"||te.state==="blocked"&&G.state==="blocked"||te.state==="blocked"&&G.state==="proceeding"||te.state==="blocked"&&G.state==="unblocked"||te.state==="proceeding"&&G.state==="unblocked","Invalid blocker state transition: "+te.state+" -> "+G.state);let be=new Map(E.blockers);be.set(B,G),he({blockers:be})}function Io(B){let{currentLocation:G,nextLocation:te,historyAction:be}=B;if(K.size===0)return;K.size>1&&Cs(!1,"A router only supports one blocker at a time");let Te=Array.from(K.entries()),[Qe,je]=Te[Te.length-1],Le=E.blockers.get(Qe);if(!(Le&&Le.state==="proceeding")&&je({currentLocation:G,nextLocation:te,historyAction:be}))return Qe}function Za(B){let G=[];return N.forEach((te,be)=>{(!B||B(be))&&(te.cancel(),G.push(be),N.delete(be))}),G}function Vn(B,G,te){if(g=B,b=G,m=te||null,!y&&E.navigation===Eb){y=!0;let be=rT(E.location,E.matches);be!=null&&he({restoreScrollPosition:be})}return()=>{g=null,b=null,m=null}}function Xa(B,G){return m&&m(B,G.map(be=>dW(be,E.loaderData)))||B.key}function na(B,G){if(g&&b){let te=Xa(B,G);g[te]=b()}}function rT(B,G){if(g){let te=Xa(B,G),be=g[te];if(typeof be=="number")return be}return null}function eB(B){o={},s=$1(B,a,void 0,o)}return S={get basename(){return l},get state(){return E},get routes(){return i},get window(){return t},initialize:ne,subscribe:pe,enableScrollRestoration:Vn,navigate:Ee,fetch:Hn,revalidate:ke,createHref:B=>e.history.createHref(B),encodeLocation:B=>e.history.encodeLocation(B),getFetcher:wt,deleteFetcher:Z,dispose:Q,getBlocker:Tn,deleteBlocker:Ir,_internalFetchControllers:M,_internalActiveDeferreds:N,_internalSetRoutes:eB},S}function FW(e){return e!=null&&("formData"in e&&e.formData!=null||"body"in e&&e.body!==void 0)}function j1(e,t,n,r,a,o,i){let s,l;if(o){s=[];for(let u of t)if(s.push(u),u.route.id===o){l=u;break}}else s=t,l=t[t.length-1];let c=zm(a||".",tf(s).map(u=>u.pathnameBase),wi(e.pathname,n)||e.pathname,i==="path");return a==null&&(c.search=e.search,c.hash=e.hash),(a==null||a===""||a===".")&&l&&l.route.index&&!r_(c.search)&&(c.search=c.search?c.search.replace(/^\?/,"?index&"):"?index"),r&&n!=="/"&&(c.pathname=c.pathname==="/"?n:uo([n,c.pathname])),_s(c)}function $R(e,t,n,r){if(!r||!FW(r))return{path:n};if(r.formMethod&&!qW(r.formMethod))return{path:n,error:jr(405,{method:r.formMethod})};let a=()=>({path:n,error:jr(400,{type:"invalid-body"})}),o=r.formMethod||"get",i=e?o.toUpperCase():o.toLowerCase(),s=TF(n);if(r.body!==void 0){if(r.formEncType==="text/plain"){if(!ca(i))return a();let g=typeof r.body=="string"?r.body:r.body instanceof FormData||r.body instanceof URLSearchParams?Array.from(r.body.entries()).reduce((m,b)=>{let[y,w]=b;return""+m+y+"="+w+` -`},""):String(r.body);return{path:n,submission:{formMethod:i,formAction:s,formEncType:r.formEncType,formData:void 0,json:void 0,text:g}}}else if(r.formEncType==="application/json"){if(!ca(i))return a();try{let g=typeof r.body=="string"?JSON.parse(r.body):r.body;return{path:n,submission:{formMethod:i,formAction:s,formEncType:r.formEncType,formData:void 0,json:g,text:void 0}}}catch{return a()}}}Ze(typeof FormData=="function","FormData is not available in this environment");let l,c;if(r.formData)l=z1(r.formData),c=r.formData;else if(r.body instanceof FormData)l=z1(r.body),c=r.body;else if(r.body instanceof URLSearchParams)l=r.body,c=UR(l);else if(r.body==null)l=new URLSearchParams,c=new FormData;else try{l=new URLSearchParams(r.body),c=UR(l)}catch{return a()}let u={formMethod:i,formAction:s,formEncType:r&&r.formEncType||"application/x-www-form-urlencoded",formData:c,json:void 0,text:void 0};if(ca(u.formMethod))return{path:n,submission:u};let d=Co(n);return t&&d.search&&r_(d.search)&&l.append("index",""),d.search="?"+l,{path:_s(d),submission:u}}function jW(e,t){let n=e;if(t){let r=e.findIndex(a=>a.route.id===t);r>=0&&(n=e.slice(0,r))}return n}function FR(e,t,n,r,a,o,i,s,l,c,u,d,g,m){let b=m?Object.values(m)[0]:g?Object.values(g)[0]:void 0,y=e.createURL(t.location),w=e.createURL(a),v=m?Object.keys(m)[0]:void 0,S=jW(n,v).filter((k,x)=>{if(k.route.lazy)return!0;if(k.route.loader==null)return!1;if(zW(t.loaderData,t.matches[x],k)||i.some(R=>R===k.route.id))return!0;let C=t.matches[x],_=k;return jR(k,Wt({currentUrl:y,currentParams:C.params,nextUrl:w,nextParams:_.params},r,{actionResult:b,defaultShouldRevalidate:o||y.pathname+y.search===w.pathname+w.search||y.search!==w.search||AF(C,_)}))}),E=[];return l.forEach((k,x)=>{if(!n.some(L=>L.route.id===k.routeId))return;let C=Rl(u,k.path,d);if(!C){E.push({key:x,routeId:k.routeId,path:k.path,matches:null,match:null,controller:null});return}let _=t.fetchers.get(x),R=U1(C,k.path),T=!1;c.has(x)?T=!1:s.includes(x)?T=!0:_&&_.state!=="idle"&&_.data===void 0?T=o:T=jR(R,Wt({currentUrl:y,currentParams:t.matches[t.matches.length-1].params,nextUrl:w,nextParams:n[n.length-1].params},r,{actionResult:b,defaultShouldRevalidate:o})),T&&E.push({key:x,routeId:k.routeId,path:k.path,matches:C,match:R,controller:new AbortController})}),[S,E]}function zW(e,t,n){let r=!t||n.route.id!==t.route.id,a=e[n.route.id]===void 0;return r||a}function AF(e,t){let n=e.route.path;return e.pathname!==t.pathname||n!=null&&n.endsWith("*")&&e.params["*"]!==t.params["*"]}function jR(e,t){if(e.route.shouldRevalidate){let n=e.route.shouldRevalidate(t);if(typeof n=="boolean")return n}return t.defaultShouldRevalidate}async function zR(e,t,n){if(!e.lazy)return;let r=await e.lazy();if(!e.lazy)return;let a=n[e.id];Ze(a,"No route found in manifest");let o={};for(let i in r){let l=a[i]!==void 0&&i!=="hasErrorBoundary";Cs(!l,'Route "'+a.id+'" has a static property "'+i+'" defined but its lazy function is also returning a value for this property. '+('The lazy route property "'+i+'" will be ignored.')),!l&&!cW.has(i)&&(o[i]=r[i])}Object.assign(a,o),Object.assign(a,Wt({},t(a),{lazy:void 0}))}async function au(e,t,n,r,a,o,i,s){s===void 0&&(s={});let l,c,u,d=b=>{let y,w=new Promise((v,h)=>y=h);return u=()=>y(),t.signal.addEventListener("abort",u),Promise.race([b({request:t,params:n.params,context:s.requestContext}),w])};try{let b=n.route[e];if(n.route.lazy)if(b){let y,w=await Promise.all([d(b).catch(v=>{y=v}),zR(n.route,o,a)]);if(y)throw y;c=w[0]}else if(await zR(n.route,o,a),b=n.route[e],b)c=await d(b);else if(e==="action"){let y=new URL(t.url),w=y.pathname+y.search;throw jr(405,{method:t.method,pathname:w,routeId:n.route.id})}else return{type:Zt.data,data:void 0};else if(b)c=await d(b);else{let y=new URL(t.url),w=y.pathname+y.search;throw jr(404,{pathname:w})}Ze(c!==void 0,"You defined "+(e==="action"?"an action":"a loader")+" for route "+('"'+n.route.id+"\" but didn't return anything from your `"+e+"` ")+"function. Please return a value or `null`.")}catch(b){l=Zt.error,c=b}finally{u&&t.signal.removeEventListener("abort",u)}if(VW(c)){let b=c.status;if(DW.has(b)){let v=c.headers.get("Location");if(Ze(v,"Redirects returned/thrown from loaders/actions must have a Location header"),!CF.test(v))v=j1(new URL(t.url),r.slice(0,r.indexOf(n)+1),i,!0,v);else if(!s.isStaticRequest){let h=new URL(t.url),S=v.startsWith("//")?new URL(h.protocol+v):new URL(v),E=wi(S.pathname,i)!=null;S.origin===h.origin&&E&&(v=S.pathname+S.search+S.hash)}if(s.isStaticRequest)throw c.headers.set("Location",v),c;return{type:Zt.redirect,status:b,location:v,revalidate:c.headers.get("X-Remix-Revalidate")!==null,reloadDocument:c.headers.get("X-Remix-Reload-Document")!==null}}if(s.isRouteRequest)throw{type:l===Zt.error?Zt.error:Zt.data,response:c};let y,w=c.headers.get("Content-Type");return w&&/\bapplication\/json\b/.test(w)?y=await c.json():y=await c.text(),l===Zt.error?{type:l,error:new n_(b,c.statusText,y),headers:c.headers}:{type:Zt.data,data:y,statusCode:c.status,headers:c.headers}}if(l===Zt.error)return{type:l,error:c};if(HW(c)){var g,m;return{type:Zt.deferred,deferredData:c,statusCode:(g=c.init)==null?void 0:g.status,headers:((m=c.init)==null?void 0:m.headers)&&new Headers(c.init.headers)}}return{type:Zt.data,data:c}}function ou(e,t,n,r){let a=e.createURL(TF(t)).toString(),o={signal:n};if(r&&ca(r.formMethod)){let{formMethod:i,formEncType:s}=r;o.method=i.toUpperCase(),s==="application/json"?(o.headers=new Headers({"Content-Type":s}),o.body=JSON.stringify(r.json)):s==="text/plain"?o.body=r.text:s==="application/x-www-form-urlencoded"&&r.formData?o.body=z1(r.formData):o.body=r.formData}return new Request(a,o)}function z1(e){let t=new URLSearchParams;for(let[n,r]of e.entries())t.append(n,typeof r=="string"?r:r.name);return t}function UR(e){let t=new FormData;for(let[n,r]of e.entries())t.append(n,r);return t}function UW(e,t,n,r,a){let o={},i=null,s,l=!1,c={};return n.forEach((u,d)=>{let g=t[d].route.id;if(Ze(!zl(u),"Cannot handle redirect results in processLoaderData"),Bu(u)){let m=Uu(e,g),b=u.error;r&&(b=Object.values(r)[0],r=void 0),i=i||{},i[m.route.id]==null&&(i[m.route.id]=b),o[g]=void 0,l||(l=!0,s=xF(u.error)?u.error.status:500),u.headers&&(c[g]=u.headers)}else rs(u)?(a.set(g,u.deferredData),o[g]=u.deferredData.data):o[g]=u.data,u.statusCode!=null&&u.statusCode!==200&&!l&&(s=u.statusCode),u.headers&&(c[g]=u.headers)}),r&&(i=r,o[Object.keys(r)[0]]=void 0),{loaderData:o,errors:i,statusCode:s||200,loaderHeaders:c}}function BR(e,t,n,r,a,o,i,s){let{loaderData:l,errors:c}=UW(t,n,r,a,s);for(let u=0;ur.route.id===t)+1):[...e]).reverse().find(r=>r.route.hasErrorBoundary===!0)||e[0]}function VR(e){let t=e.length===1?e[0]:e.find(n=>n.index||!n.path||n.path==="/")||{id:"__shim-error-route__"};return{matches:[{params:{},pathname:"",pathnameBase:"",route:t}],route:t}}function jr(e,t){let{pathname:n,routeId:r,method:a,type:o}=t===void 0?{}:t,i="Unknown Server Error",s="Unknown @remix-run/router error";return e===400?(i="Bad Request",a&&n&&r?s="You made a "+a+' request to "'+n+'" but '+('did not provide a `loader` for route "'+r+'", ')+"so there is no way to handle the request.":o==="defer-action"?s="defer() is not supported in actions":o==="invalid-body"&&(s="Unable to encode submission body")):e===403?(i="Forbidden",s='Route "'+r+'" does not match URL "'+n+'"'):e===404?(i="Not Found",s='No route matches URL "'+n+'"'):e===405&&(i="Method Not Allowed",a&&n&&r?s="You made a "+a.toUpperCase()+' request to "'+n+'" but '+('did not provide an `action` for route "'+r+'", ')+"so there is no way to handle the request.":a&&(s='Invalid request method "'+a.toUpperCase()+'"')),new n_(e||500,i,new Error(s),!0)}function qR(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(zl(n))return{result:n,idx:t}}}function TF(e){let t=typeof e=="string"?Co(e):e;return _s(Wt({},t,{hash:""}))}function BW(e,t){return e.pathname!==t.pathname||e.search!==t.search?!1:e.hash===""?t.hash!=="":e.hash===t.hash?!0:t.hash!==""}function rs(e){return e.type===Zt.deferred}function Bu(e){return e.type===Zt.error}function zl(e){return(e&&e.type)===Zt.redirect}function HW(e){let t=e;return t&&typeof t=="object"&&typeof t.data=="object"&&typeof t.subscribe=="function"&&typeof t.cancel=="function"&&typeof t.resolveData=="function"}function VW(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.headers=="object"&&typeof e.body<"u"}function qW(e){return OW.has(e.toLowerCase())}function ca(e){return NW.has(e.toLowerCase())}async function GR(e,t,n,r,a,o){for(let i=0;id.route.id===l.route.id),u=c!=null&&!AF(c,l)&&(o&&o[l.route.id])!==void 0;if(rs(s)&&(a||u)){let d=r[i];Ze(d,"Expected an AbortSignal for revalidating fetcher deferred result"),await RF(s,d,a).then(g=>{g&&(n[i]=g||n[i])})}}}async function RF(e,t,n){if(n===void 0&&(n=!1),!await e.deferredData.resolveData(t)){if(n)try{return{type:Zt.data,data:e.deferredData.unwrappedData}}catch(a){return{type:Zt.error,error:a}}return{type:Zt.data,data:e.deferredData.data}}}function r_(e){return new URLSearchParams(e).getAll("index").some(t=>t==="")}function U1(e,t){let n=typeof t=="string"?Co(t).search:t.search;if(e[e.length-1].route.index&&r_(n||""))return e[e.length-1];let r=tf(e);return r[r.length-1]}function WR(e){let{formMethod:t,formAction:n,formEncType:r,text:a,formData:o,json:i}=e;if(!(!t||!n||!r)){if(a!=null)return{formMethod:t,formAction:n,formEncType:r,formData:void 0,json:void 0,text:a};if(o!=null)return{formMethod:t,formAction:n,formEncType:r,formData:o,json:void 0,text:void 0};if(i!==void 0)return{formMethod:t,formAction:n,formEncType:r,formData:void 0,json:i,text:void 0}}}function xb(e,t){return t?{state:"loading",location:e,formMethod:t.formMethod,formAction:t.formAction,formEncType:t.formEncType,formData:t.formData,json:t.json,text:t.text}:{state:"loading",location:e,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0}}function GW(e,t){return{state:"submitting",location:e,formMethod:t.formMethod,formAction:t.formAction,formEncType:t.formEncType,formData:t.formData,json:t.json,text:t.text}}function iu(e,t){return e?{state:"loading",formMethod:e.formMethod,formAction:e.formAction,formEncType:e.formEncType,formData:e.formData,json:e.json,text:e.text,data:t}:{state:"loading",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:t}}function WW(e,t){return{state:"submitting",formMethod:e.formMethod,formAction:e.formAction,formEncType:e.formEncType,formData:e.formData,json:e.json,text:e.text,data:t?t.data:void 0}}function Bo(e){return{state:"idle",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:e}}function KW(e,t){try{let n=e.sessionStorage.getItem(_F);if(n){let r=JSON.parse(n);for(let[a,o]of Object.entries(r||{}))o&&Array.isArray(o)&&t.set(a,new Set(o||[]))}}catch{}}function YW(e,t){if(t.size>0){let n={};for(let[r,a]of t)n[r]=[...a];try{e.sessionStorage.setItem(_F,JSON.stringify(n))}catch(r){Cs(!1,"Failed to save applied view transitions in sessionStorage ("+r+").")}}}/** + */function Wt(){return Wt=Object.assign?Object.assign.bind():function(e){for(var t=1;t"u")throw new Error(t)}function Cs(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function sW(){return Math.random().toString(36).substr(2,8)}function MR(e,t){return{usr:e.state,key:e.key,idx:t}}function hd(e,t,n,r){return n===void 0&&(n=null),Wt({pathname:typeof e=="string"?e:e.pathname,search:"",hash:""},typeof t=="string"?Co(t):t,{state:n,key:t&&t.key||r||sW()})}function _s(e){let{pathname:t="/",search:n="",hash:r=""}=e;return n&&n!=="?"&&(t+=n.charAt(0)==="?"?n:"?"+n),r&&r!=="#"&&(t+=r.charAt(0)==="#"?r:"#"+r),t}function Co(e){let t={};if(e){let n=e.indexOf("#");n>=0&&(t.hash=e.substr(n),e=e.substr(0,n));let r=e.indexOf("?");r>=0&&(t.search=e.substr(r),e=e.substr(0,r)),e&&(t.pathname=e)}return t}function lW(e,t,n,r){r===void 0&&(r={});let{window:a=document.defaultView,v5Compat:o=!1}=r,i=a.history,s=Yt.Pop,l=null,c=u();c==null&&(c=0,i.replaceState(Wt({},i.state,{idx:c}),""));function u(){return(i.state||{idx:null}).idx}function d(){s=Yt.Pop;let w=u(),v=w==null?null:w-c;c=w,l&&l({action:s,location:y.location,delta:v})}function g(w,v){s=Yt.Push;let h=hd(y.location,w,v);n&&n(h,w),c=u()+1;let S=MR(h,c),E=y.createHref(h);try{i.pushState(S,"",E)}catch(k){if(k instanceof DOMException&&k.name==="DataCloneError")throw k;a.location.assign(E)}o&&l&&l({action:s,location:y.location,delta:1})}function m(w,v){s=Yt.Replace;let h=hd(y.location,w,v);n&&n(h,w),c=u();let S=MR(h,c),E=y.createHref(h);i.replaceState(S,"",E),o&&l&&l({action:s,location:y.location,delta:0})}function b(w){let v=a.location.origin!=="null"?a.location.origin:a.location.href,h=typeof w=="string"?w:_s(w);return Ze(v,"No window.location.(origin|href) available to create URL for href: "+h),new URL(h,v)}let y={get action(){return s},get location(){return e(a,i)},listen(w){if(l)throw new Error("A history only accepts one active listener");return a.addEventListener(LR,d),l=w,()=>{a.removeEventListener(LR,d),l=null}},createHref(w){return t(a,w)},createURL:b,encodeLocation(w){let v=b(w);return{pathname:v.pathname,search:v.search,hash:v.hash}},push:g,replace:m,go(w){return i.go(w)}};return y}var Zt;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(Zt||(Zt={}));const cW=new Set(["lazy","caseSensitive","path","id","index","children"]);function uW(e){return e.index===!0}function F1(e,t,n,r){return n===void 0&&(n=[]),r===void 0&&(r={}),e.map((a,o)=>{let i=[...n,o],s=typeof a.id=="string"?a.id:i.join("-");if(Ze(a.index!==!0||!a.children,"Cannot specify children on an index route"),Ze(!r[s],'Found a route id collision on id "'+s+`". Route id's must be globally unique within Data Router usages`),uW(a)){let l=Wt({},a,t(a),{id:s});return r[s]=l,l}else{let l=Wt({},a,t(a),{id:s,children:void 0});return r[s]=l,a.children&&(l.children=F1(a.children,t,i,r)),l}})}function Rl(e,t,n){n===void 0&&(n="/");let r=typeof t=="string"?Co(t):t,a=wi(r.pathname||"/",n);if(a==null)return null;let o=EF(e);fW(o);let i=null;for(let s=0;i==null&&s{let l={relativePath:s===void 0?o.path||"":s,caseSensitive:o.caseSensitive===!0,childrenIndex:i,route:o};l.relativePath.startsWith("/")&&(Ze(l.relativePath.startsWith(r),'Absolute route path "'+l.relativePath+'" nested under path '+('"'+r+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),l.relativePath=l.relativePath.slice(r.length));let c=uo([r,l.relativePath]),u=n.concat(l);o.children&&o.children.length>0&&(Ze(o.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+c+'".')),EF(o.children,t,u,c)),!(o.path==null&&!o.index)&&t.push({path:c,score:vW(c,o.index),routesMeta:u})};return e.forEach((o,i)=>{var s;if(o.path===""||!((s=o.path)!=null&&s.includes("?")))a(o,i);else for(let l of xF(o.path))a(o,i,l)}),t}function xF(e){let t=e.split("/");if(t.length===0)return[];let[n,...r]=t,a=n.endsWith("?"),o=n.replace(/\?$/,"");if(r.length===0)return a?[o,""]:[o];let i=xF(r.join("/")),s=[];return s.push(...i.map(l=>l===""?o:[o,l].join("/"))),a&&s.push(...i),s.map(l=>e.startsWith("/")&&l===""?"/":l)}function fW(e){e.sort((t,n)=>t.score!==n.score?n.score-t.score:SW(t.routesMeta.map(r=>r.childrenIndex),n.routesMeta.map(r=>r.childrenIndex)))}const pW=/^:\w+$/,gW=3,mW=2,hW=1,bW=10,yW=-2,PR=e=>e==="*";function vW(e,t){let n=e.split("/"),r=n.length;return n.some(PR)&&(r+=yW),t&&(r+=mW),n.filter(a=>!PR(a)).reduce((a,o)=>a+(pW.test(o)?gW:o===""?hW:bW),r)}function SW(e,t){return e.length===t.length&&e.slice(0,-1).every((r,a)=>r===t[a])?e[e.length-1]-t[t.length-1]:0}function wW(e,t){let{routesMeta:n}=e,r={},a="/",o=[];for(let i=0;i{let{paramName:g,isOptional:m}=u;if(g==="*"){let y=s[d]||"";i=o.slice(0,o.length-y.length).replace(/(.)\/+$/,"$1")}const b=s[d];return m&&!b?c[g]=void 0:c[g]=kW(b||"",g),c},{}),pathname:o,pathnameBase:i,pattern:e}}function EW(e,t,n){t===void 0&&(t=!1),n===void 0&&(n=!0),Cs(e==="*"||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were '+('"'+e.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+e.replace(/\*$/,"/*")+'".'));let r=[],a="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:(\w+)(\?)?/g,(i,s,l)=>(r.push({paramName:s,isOptional:l!=null}),l?"/?([^\\/]+)?":"/([^\\/]+)"));return e.endsWith("*")?(r.push({paramName:"*"}),a+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):n?a+="\\/*$":e!==""&&e!=="/"&&(a+="(?:(?=\\/|$))"),[new RegExp(a,t?void 0:"i"),r]}function xW(e){try{return decodeURI(e)}catch(t){return Cs(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+t+").")),e}}function kW(e,t){try{return decodeURIComponent(e)}catch(n){return Cs(!1,'The value for the URL param "'+t+'" will not be decoded because'+(' the string "'+e+'" is a malformed URL segment. This is probably')+(" due to a bad percent encoding ("+n+").")),e}}function wi(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith("/")?t.length-1:t.length,r=e.charAt(n);return r&&r!=="/"?null:e.slice(n)||"/"}function CW(e,t){t===void 0&&(t="/");let{pathname:n,search:r="",hash:a=""}=typeof e=="string"?Co(e):e;return{pathname:n?n.startsWith("/")?n:_W(n,t):t,search:TW(r),hash:RW(a)}}function _W(e,t){let n=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(a=>{a===".."?n.length>1&&n.pop():a!=="."&&n.push(a)}),n.length>1?n.join("/"):"/"}function Eb(e,t,n,r){return"Cannot include a '"+e+"' character in a manually specified "+("`to."+t+"` field ["+JSON.stringify(r)+"]. Please separate it out to the ")+("`to."+n+"` field. Alternatively you may provide the full path as ")+'a string in and the router will parse it for you.'}function tf(e){return e.filter((t,n)=>n===0||t.route.path&&t.route.path.length>0)}function zm(e,t,n,r){r===void 0&&(r=!1);let a;typeof e=="string"?a=Co(e):(a=Wt({},e),Ze(!a.pathname||!a.pathname.includes("?"),Eb("?","pathname","search",a)),Ze(!a.pathname||!a.pathname.includes("#"),Eb("#","pathname","hash",a)),Ze(!a.search||!a.search.includes("#"),Eb("#","search","hash",a)));let o=e===""||a.pathname==="",i=o?"/":a.pathname,s;if(i==null)s=n;else if(r){let d=t[t.length-1].replace(/^\//,"").split("/");if(i.startsWith("..")){let g=i.split("/");for(;g[0]==="..";)g.shift(),d.pop();a.pathname=g.join("/")}s="/"+d.join("/")}else{let d=t.length-1;if(i.startsWith("..")){let g=i.split("/");for(;g[0]==="..";)g.shift(),d-=1;a.pathname=g.join("/")}s=d>=0?t[d]:"/"}let l=CW(a,s),c=i&&i!=="/"&&i.endsWith("/"),u=(o||i===".")&&n.endsWith("/");return!l.pathname.endsWith("/")&&(c||u)&&(l.pathname+="/"),l}const uo=e=>e.join("/").replace(/\/\/+/g,"/"),AW=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),TW=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,RW=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;class r_{constructor(t,n,r,a){a===void 0&&(a=!1),this.status=t,this.statusText=n||"",this.internal=a,r instanceof Error?(this.data=r.toString(),this.error=r):this.data=r}}function kF(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const CF=["post","put","patch","delete"],NW=new Set(CF),IW=["get",...CF],OW=new Set(IW),DW=new Set([301,302,303,307,308]),LW=new Set([307,308]),xb={state:"idle",location:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},MW={state:"idle",data:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},ru={state:"unblocked",proceed:void 0,reset:void 0,location:void 0},_F=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,PW=e=>({hasErrorBoundary:!!e.hasErrorBoundary}),AF="remix-router-transitions";function $W(e){const t=e.window?e.window:typeof window<"u"?window:void 0,n=typeof t<"u"&&typeof t.document<"u"&&typeof t.document.createElement<"u",r=!n;Ze(e.routes.length>0,"You must provide a non-empty routes array to createRouter");let a;if(e.mapRouteProperties)a=e.mapRouteProperties;else if(e.detectErrorBoundary){let B=e.detectErrorBoundary;a=G=>({hasErrorBoundary:B(G)})}else a=PW;let o={},i=F1(e.routes,a,void 0,o),s,l=e.basename||"/",c=Wt({v7_fetcherPersist:!1,v7_normalizeFormMethod:!1,v7_prependBasename:!1},e.future),u=null,d=new Set,g=null,m=null,b=null,y=e.hydrationData!=null,w=Rl(i,e.history.location,l),v=null;if(w==null){let B=jr(404,{pathname:e.history.location.pathname}),{matches:G,route:te}=VR(i);w=G,v={[te.id]:B}}let h=!w.some(B=>B.route.lazy)&&(!w.some(B=>B.route.loader)||e.hydrationData!=null),S,E={historyAction:e.history.action,location:e.history.location,matches:w,initialized:h,navigation:xb,restoreScrollPosition:e.hydrationData!=null?!1:null,preventScrollReset:!1,revalidation:"idle",loaderData:e.hydrationData&&e.hydrationData.loaderData||{},actionData:e.hydrationData&&e.hydrationData.actionData||null,errors:e.hydrationData&&e.hydrationData.errors||v,fetchers:new Map,blockers:new Map},k=Yt.Pop,x=!1,C,_=!1,R=new Map,T=null,L=!1,D=!1,H=[],z=[],M=new Map,U=0,X=-1,j=new Map,O=new Set,A=new Map,V=new Map,P=new Set,N=new Map,K=new Map,ae=!1;function ne(){if(u=e.history.listen(B=>{let{action:G,location:te,delta:be}=B;if(ae){ae=!1;return}Cs(K.size===0||be!=null,"You are trying to use a blocker on a POP navigation to a location that was not created by @remix-run/router. This will fail silently in production. This can happen if you are navigating outside the router via `window.history.pushState`/`window.location.hash` instead of using router navigation APIs. This can also happen if you are using createHashRouter and the user manually changes the URL.");let Te=Io({currentLocation:E.location,nextLocation:te,historyAction:G});if(Te&&be!=null){ae=!0,e.history.go(be*-1),Sn(Te,{state:"blocked",location:te,proceed(){Sn(Te,{state:"proceeding",proceed:void 0,reset:void 0,location:te}),e.history.go(be)},reset(){let Qe=new Map(E.blockers);Qe.set(Te,ru),he({blockers:Qe})}});return}return We(G,te)}),n){KW(t,R);let B=()=>YW(t,R);t.addEventListener("pagehide",B),T=()=>t.removeEventListener("pagehide",B)}return E.initialized||We(Yt.Pop,E.location),S}function Q(){u&&u(),T&&T(),d.clear(),C&&C.abort(),E.fetchers.forEach((B,G)=>St(G)),E.blockers.forEach((B,G)=>Ir(G))}function pe(B){return d.add(B),()=>d.delete(B)}function he(B,G){G===void 0&&(G={}),E=Wt({},E,B);let te=[],be=[];c.v7_fetcherPersist&&E.fetchers.forEach((Te,Qe)=>{Te.state==="idle"&&(P.has(Qe)?be.push(Qe):te.push(Qe))}),[...d].forEach(Te=>Te(E,{deletedFetchers:be,unstable_viewTransitionOpts:G.viewTransitionOpts,unstable_flushSync:G.flushSync===!0})),c.v7_fetcherPersist&&(te.forEach(Te=>E.fetchers.delete(Te)),be.forEach(Te=>St(Te)))}function re(B,G,te){var be,Te;let{flushSync:Qe}=te===void 0?{}:te,je=E.actionData!=null&&E.navigation.formMethod!=null&&ca(E.navigation.formMethod)&&E.navigation.state==="loading"&&((be=B.state)==null?void 0:be._isRedirect)!==!0,Le;G.actionData?Object.keys(G.actionData).length>0?Le=G.actionData:Le=null:je?Le=E.actionData:Le=null;let Re=G.loaderData?HR(E.loaderData,G.loaderData,G.matches||[],G.errors):E.loaderData,it=E.blockers;it.size>0&&(it=new Map(it),it.forEach((xt,Ft)=>it.set(Ft,ru)));let wn=x===!0||E.navigation.formMethod!=null&&ca(E.navigation.formMethod)&&((Te=B.state)==null?void 0:Te._isRedirect)!==!0;s&&(i=s,s=void 0),L||k===Yt.Pop||(k===Yt.Push?e.history.push(B,B.state):k===Yt.Replace&&e.history.replace(B,B.state));let et;if(k===Yt.Pop){let xt=R.get(E.location.pathname);xt&&xt.has(B.pathname)?et={currentLocation:E.location,nextLocation:B}:R.has(B.pathname)&&(et={currentLocation:B,nextLocation:E.location})}else if(_){let xt=R.get(E.location.pathname);xt?xt.add(B.pathname):(xt=new Set([B.pathname]),R.set(E.location.pathname,xt)),et={currentLocation:E.location,nextLocation:B}}he(Wt({},G,{actionData:Le,loaderData:Re,historyAction:k,location:B,initialized:!0,navigation:xb,revalidation:"idle",restoreScrollPosition:rT(B,G.matches||E.matches),preventScrollReset:wn,blockers:it}),{viewTransitionOpts:et,flushSync:Qe===!0}),k=Yt.Pop,x=!1,_=!1,L=!1,D=!1,H=[],z=[]}async function Ee(B,G){if(typeof B=="number"){e.history.go(B);return}let te=z1(E.location,E.matches,l,c.v7_prependBasename,B,G==null?void 0:G.fromRouteId,G==null?void 0:G.relative),{path:be,submission:Te,error:Qe}=$R(c.v7_normalizeFormMethod,!1,te,G),je=E.location,Le=hd(E.location,be,G&&G.state);Le=Wt({},Le,e.history.encodeLocation(Le));let Re=G&&G.replace!=null?G.replace:void 0,it=Yt.Push;Re===!0?it=Yt.Replace:Re===!1||Te!=null&&ca(Te.formMethod)&&Te.formAction===E.location.pathname+E.location.search&&(it=Yt.Replace);let wn=G&&"preventScrollReset"in G?G.preventScrollReset===!0:void 0,et=(G&&G.unstable_flushSync)===!0,xt=Io({currentLocation:je,nextLocation:Le,historyAction:it});if(xt){Sn(xt,{state:"blocked",location:Le,proceed(){Sn(xt,{state:"proceeding",proceed:void 0,reset:void 0,location:Le}),Ee(B,G)},reset(){let Ft=new Map(E.blockers);Ft.set(xt,ru),he({blockers:Ft})}});return}return await We(it,Le,{submission:Te,pendingError:Qe,preventScrollReset:wn,replace:G&&G.replace,enableViewTransition:G&&G.unstable_viewTransition,flushSync:et})}function ke(){if(de(),he({revalidation:"loading"}),E.navigation.state!=="submitting"){if(E.navigation.state==="idle"){We(E.historyAction,E.location,{startUninterruptedRevalidation:!0});return}We(k||E.historyAction,E.navigation.location,{overrideNavigation:E.navigation})}}async function We(B,G,te){C&&C.abort(),C=null,k=B,L=(te&&te.startUninterruptedRevalidation)===!0,na(E.location,E.matches),x=(te&&te.preventScrollReset)===!0,_=(te&&te.enableViewTransition)===!0;let be=s||i,Te=te&&te.overrideNavigation,Qe=Rl(be,G,l),je=(te&&te.flushSync)===!0;if(!Qe){let Ft=jr(404,{pathname:G.pathname}),{matches:qn,route:Sa}=VR(be);Za(),re(G,{matches:qn,loaderData:{},errors:{[Sa.id]:Ft}},{flushSync:je});return}if(E.initialized&&!D&&BW(E.location,G)&&!(te&&te.submission&&ca(te.submission.formMethod))){re(G,{matches:Qe},{flushSync:je});return}C=new AbortController;let Le=ou(e.history,G,C.signal,te&&te.submission),Re,it;if(te&&te.pendingError)it={[Uu(Qe).route.id]:te.pendingError};else if(te&&te.submission&&ca(te.submission.formMethod)){let Ft=await Vt(Le,G,te.submission,Qe,{replace:te.replace,flushSync:je});if(Ft.shortCircuited)return;Re=Ft.pendingActionData,it=Ft.pendingActionError,Te=kb(G,te.submission),je=!1,Le=new Request(Le.url,{signal:Le.signal})}let{shortCircuited:wn,loaderData:et,errors:xt}=await mt(Le,G,Qe,Te,te&&te.submission,te&&te.fetcherSubmission,te&&te.replace,je,Re,it);wn||(C=null,re(G,Wt({matches:Qe},Re?{actionData:Re}:{},{loaderData:et,errors:xt})))}async function Vt(B,G,te,be,Te){Te===void 0&&(Te={}),de();let Qe=GW(G,te);he({navigation:Qe},{flushSync:Te.flushSync===!0});let je,Le=B1(be,G);if(!Le.route.action&&!Le.route.lazy)je={type:Zt.error,error:jr(405,{method:B.method,pathname:G.pathname,routeId:Le.route.id})};else if(je=await au("action",B,Le,be,o,a,l),B.signal.aborted)return{shortCircuited:!0};if(zl(je)){let Re;return Te&&Te.replace!=null?Re=Te.replace:Re=je.location===E.location.pathname+E.location.search,await Y(E,je,{submission:te,replace:Re}),{shortCircuited:!0}}if(Bu(je)){let Re=Uu(be,Le.route.id);return(Te&&Te.replace)!==!0&&(k=Yt.Push),{pendingActionData:{},pendingActionError:{[Re.route.id]:je.error}}}if(rs(je))throw jr(400,{type:"defer-action"});return{pendingActionData:{[Le.route.id]:je.data}}}async function mt(B,G,te,be,Te,Qe,je,Le,Re,it){let wn=be||kb(G,Te),et=Te||Qe||WR(wn),xt=s||i,[Ft,qn]=FR(e.history,E,te,et,G,D,H,z,A,O,xt,l,Re,it);if(Za(kt=>!(te&&te.some(Or=>Or.route.id===kt))||Ft&&Ft.some(Or=>Or.route.id===kt)),X=++U,Ft.length===0&&qn.length===0){let kt=He();return re(G,Wt({matches:te,loaderData:{},errors:it||null},Re?{actionData:Re}:{},kt?{fetchers:new Map(E.fetchers)}:{}),{flushSync:Le}),{shortCircuited:!0}}if(!L){qn.forEach(Or=>{let Qt=E.fetchers.get(Or.key),ji=iu(void 0,Qt?Qt.data:void 0);E.fetchers.set(Or.key,ji)});let kt=Re||E.actionData;he(Wt({navigation:wn},kt?Object.keys(kt).length===0?{actionData:null}:{actionData:kt}:{},qn.length>0?{fetchers:new Map(E.fetchers)}:{}),{flushSync:Le})}qn.forEach(kt=>{M.has(kt.key)&&le(kt.key),kt.controller&&M.set(kt.key,kt.controller)});let Sa=()=>qn.forEach(kt=>le(kt.key));C&&C.signal.addEventListener("abort",Sa);let{results:Gc,loaderResults:Uh,fetcherResults:Ys}=await ye(E.matches,te,Ft,qn,B);if(B.signal.aborted)return{shortCircuited:!0};C&&C.signal.removeEventListener("abort",Sa),qn.forEach(kt=>M.delete(kt.key));let ra=qR(Gc);if(ra){if(ra.idx>=Ft.length){let kt=qn[ra.idx-Ft.length].key;O.add(kt)}return await Y(E,ra.result,{replace:je}),{shortCircuited:!0}}let{loaderData:Af,errors:Bh}=BR(E,te,Ft,Uh,it,qn,Ys,N);N.forEach((kt,Or)=>{kt.subscribe(Qt=>{(Qt||kt.done)&&N.delete(Or)})});let Hh=He(),Vh=ft(X),Zs=Hh||Vh||qn.length>0;return Wt({loaderData:Af,errors:Bh},Zs?{fetchers:new Map(E.fetchers)}:{})}function Hn(B,G,te,be){if(r)throw new Error("router.fetch() was called during the server render, but it shouldn't be. You are likely calling a useFetcher() method in the body of your component. Try moving it to a useEffect or a callback.");M.has(B)&&le(B);let Te=(be&&be.unstable_flushSync)===!0,Qe=s||i,je=z1(E.location,E.matches,l,c.v7_prependBasename,te,G,be==null?void 0:be.relative),Le=Rl(Qe,je,l);if(!Le){_e(B,G,jr(404,{pathname:je}),{flushSync:Te});return}let{path:Re,submission:it,error:wn}=$R(c.v7_normalizeFormMethod,!0,je,be);if(wn){_e(B,G,wn,{flushSync:Te});return}let et=B1(Le,Re);if(x=(be&&be.preventScrollReset)===!0,it&&ca(it.formMethod)){F(B,G,Re,et,Le,Te,it);return}A.set(B,{routeId:G,path:Re}),q(B,G,Re,et,Le,Te,it)}async function F(B,G,te,be,Te,Qe,je){if(de(),A.delete(B),!be.route.action&&!be.route.lazy){let Qt=jr(405,{method:je.formMethod,pathname:te,routeId:G});_e(B,G,Qt,{flushSync:Qe});return}let Le=E.fetchers.get(B);oe(B,WW(je,Le),{flushSync:Qe});let Re=new AbortController,it=ou(e.history,te,Re.signal,je);M.set(B,Re);let wn=U,et=await au("action",it,be,Te,o,a,l);if(it.signal.aborted){M.get(B)===Re&&M.delete(B);return}if(P.has(B)){oe(B,Bo(void 0));return}if(zl(et))if(M.delete(B),X>wn){oe(B,Bo(void 0));return}else return O.add(B),oe(B,iu(je)),Y(E,et,{fetcherSubmission:je});if(Bu(et)){_e(B,G,et.error);return}if(rs(et))throw jr(400,{type:"defer-action"});let xt=E.navigation.location||E.location,Ft=ou(e.history,xt,Re.signal),qn=s||i,Sa=E.navigation.state!=="idle"?Rl(qn,E.navigation.location,l):E.matches;Ze(Sa,"Didn't find any matches after fetcher action");let Gc=++U;j.set(B,Gc);let Uh=iu(je,et.data);E.fetchers.set(B,Uh);let[Ys,ra]=FR(e.history,E,Sa,je,xt,D,H,z,A,O,qn,l,{[be.route.id]:et.data},void 0);ra.filter(Qt=>Qt.key!==B).forEach(Qt=>{let ji=Qt.key,aT=E.fetchers.get(ji),nB=iu(void 0,aT?aT.data:void 0);E.fetchers.set(ji,nB),M.has(ji)&&le(ji),Qt.controller&&M.set(ji,Qt.controller)}),he({fetchers:new Map(E.fetchers)});let Af=()=>ra.forEach(Qt=>le(Qt.key));Re.signal.addEventListener("abort",Af);let{results:Bh,loaderResults:Hh,fetcherResults:Vh}=await ye(E.matches,Sa,Ys,ra,Ft);if(Re.signal.aborted)return;Re.signal.removeEventListener("abort",Af),j.delete(B),M.delete(B),ra.forEach(Qt=>M.delete(Qt.key));let Zs=qR(Bh);if(Zs){if(Zs.idx>=Ys.length){let Qt=ra[Zs.idx-Ys.length].key;O.add(Qt)}return Y(E,Zs.result)}let{loaderData:kt,errors:Or}=BR(E,E.matches,Ys,Hh,void 0,ra,Vh,N);if(E.fetchers.has(B)){let Qt=Bo(et.data);E.fetchers.set(B,Qt)}ft(Gc),E.navigation.state==="loading"&&Gc>X?(Ze(k,"Expected pending action"),C&&C.abort(),re(E.navigation.location,{matches:Sa,loaderData:kt,errors:Or,fetchers:new Map(E.fetchers)})):(he({errors:Or,loaderData:HR(E.loaderData,kt,Sa,Or),fetchers:new Map(E.fetchers)}),D=!1)}async function q(B,G,te,be,Te,Qe,je){let Le=E.fetchers.get(B);oe(B,iu(je,Le?Le.data:void 0),{flushSync:Qe});let Re=new AbortController,it=ou(e.history,te,Re.signal);M.set(B,Re);let wn=U,et=await au("loader",it,be,Te,o,a,l);if(rs(et)&&(et=await NF(et,it.signal,!0)||et),M.get(B)===Re&&M.delete(B),!it.signal.aborted){if(P.has(B)){oe(B,Bo(void 0));return}if(zl(et))if(X>wn){oe(B,Bo(void 0));return}else{O.add(B),await Y(E,et);return}if(Bu(et)){_e(B,G,et.error);return}Ze(!rs(et),"Unhandled fetcher deferred data"),oe(B,Bo(et.data))}}async function Y(B,G,te){let{submission:be,fetcherSubmission:Te,replace:Qe}=te===void 0?{}:te;G.revalidate&&(D=!0);let je=hd(B.location,G.location,{_isRedirect:!0});if(Ze(je,"Expected a location on the redirect navigation"),n){let xt=!1;if(G.reloadDocument)xt=!0;else if(_F.test(G.location)){const Ft=e.history.createURL(G.location);xt=Ft.origin!==t.location.origin||wi(Ft.pathname,l)==null}if(xt){Qe?t.location.replace(G.location):t.location.assign(G.location);return}}C=null;let Le=Qe===!0?Yt.Replace:Yt.Push,{formMethod:Re,formAction:it,formEncType:wn}=B.navigation;!be&&!Te&&Re&&it&&wn&&(be=WR(B.navigation));let et=be||Te;if(LW.has(G.status)&&et&&ca(et.formMethod))await We(Le,je,{submission:Wt({},et,{formAction:G.location}),preventScrollReset:x});else{let xt=kb(je,be);await We(Le,je,{overrideNavigation:xt,fetcherSubmission:Te,preventScrollReset:x})}}async function ye(B,G,te,be,Te){let Qe=await Promise.all([...te.map(Re=>au("loader",Te,Re,G,o,a,l)),...be.map(Re=>Re.matches&&Re.match&&Re.controller?au("loader",ou(e.history,Re.path,Re.controller.signal),Re.match,Re.matches,o,a,l):{type:Zt.error,error:jr(404,{pathname:Re.path})})]),je=Qe.slice(0,te.length),Le=Qe.slice(te.length);return await Promise.all([GR(B,te,je,je.map(()=>Te.signal),!1,E.loaderData),GR(B,be.map(Re=>Re.match),Le,be.map(Re=>Re.controller?Re.controller.signal:null),!0)]),{results:Qe,loaderResults:je,fetcherResults:Le}}function de(){D=!0,H.push(...Za()),A.forEach((B,G)=>{M.has(G)&&(z.push(G),le(G))})}function oe(B,G,te){te===void 0&&(te={}),E.fetchers.set(B,G),he({fetchers:new Map(E.fetchers)},{flushSync:(te&&te.flushSync)===!0})}function _e(B,G,te,be){be===void 0&&(be={});let Te=Uu(E.matches,G);St(B),he({errors:{[Te.route.id]:te},fetchers:new Map(E.fetchers)},{flushSync:(be&&be.flushSync)===!0})}function wt(B){return c.v7_fetcherPersist&&(V.set(B,(V.get(B)||0)+1),P.has(B)&&P.delete(B)),E.fetchers.get(B)||MW}function St(B){let G=E.fetchers.get(B);M.has(B)&&!(G&&G.state==="loading"&&j.has(B))&&le(B),A.delete(B),j.delete(B),O.delete(B),P.delete(B),E.fetchers.delete(B)}function Z(B){if(c.v7_fetcherPersist){let G=(V.get(B)||0)-1;G<=0?(V.delete(B),P.add(B)):V.set(B,G)}else St(B);he({fetchers:new Map(E.fetchers)})}function le(B){let G=M.get(B);Ze(G,"Expected fetch controller: "+B),G.abort(),M.delete(B)}function De(B){for(let G of B){let te=wt(G),be=Bo(te.data);E.fetchers.set(G,be)}}function He(){let B=[],G=!1;for(let te of O){let be=E.fetchers.get(te);Ze(be,"Expected fetcher: "+te),be.state==="loading"&&(O.delete(te),B.push(te),G=!0)}return De(B),G}function ft(B){let G=[];for(let[te,be]of j)if(be0}function Tn(B,G){let te=E.blockers.get(B)||ru;return K.get(B)!==G&&K.set(B,G),te}function Ir(B){E.blockers.delete(B),K.delete(B)}function Sn(B,G){let te=E.blockers.get(B)||ru;Ze(te.state==="unblocked"&&G.state==="blocked"||te.state==="blocked"&&G.state==="blocked"||te.state==="blocked"&&G.state==="proceeding"||te.state==="blocked"&&G.state==="unblocked"||te.state==="proceeding"&&G.state==="unblocked","Invalid blocker state transition: "+te.state+" -> "+G.state);let be=new Map(E.blockers);be.set(B,G),he({blockers:be})}function Io(B){let{currentLocation:G,nextLocation:te,historyAction:be}=B;if(K.size===0)return;K.size>1&&Cs(!1,"A router only supports one blocker at a time");let Te=Array.from(K.entries()),[Qe,je]=Te[Te.length-1],Le=E.blockers.get(Qe);if(!(Le&&Le.state==="proceeding")&&je({currentLocation:G,nextLocation:te,historyAction:be}))return Qe}function Za(B){let G=[];return N.forEach((te,be)=>{(!B||B(be))&&(te.cancel(),G.push(be),N.delete(be))}),G}function Vn(B,G,te){if(g=B,b=G,m=te||null,!y&&E.navigation===xb){y=!0;let be=rT(E.location,E.matches);be!=null&&he({restoreScrollPosition:be})}return()=>{g=null,b=null,m=null}}function Xa(B,G){return m&&m(B,G.map(be=>dW(be,E.loaderData)))||B.key}function na(B,G){if(g&&b){let te=Xa(B,G);g[te]=b()}}function rT(B,G){if(g){let te=Xa(B,G),be=g[te];if(typeof be=="number")return be}return null}function tB(B){o={},s=F1(B,a,void 0,o)}return S={get basename(){return l},get state(){return E},get routes(){return i},get window(){return t},initialize:ne,subscribe:pe,enableScrollRestoration:Vn,navigate:Ee,fetch:Hn,revalidate:ke,createHref:B=>e.history.createHref(B),encodeLocation:B=>e.history.encodeLocation(B),getFetcher:wt,deleteFetcher:Z,dispose:Q,getBlocker:Tn,deleteBlocker:Ir,_internalFetchControllers:M,_internalActiveDeferreds:N,_internalSetRoutes:tB},S}function FW(e){return e!=null&&("formData"in e&&e.formData!=null||"body"in e&&e.body!==void 0)}function z1(e,t,n,r,a,o,i){let s,l;if(o){s=[];for(let u of t)if(s.push(u),u.route.id===o){l=u;break}}else s=t,l=t[t.length-1];let c=zm(a||".",tf(s).map(u=>u.pathnameBase),wi(e.pathname,n)||e.pathname,i==="path");return a==null&&(c.search=e.search,c.hash=e.hash),(a==null||a===""||a===".")&&l&&l.route.index&&!a_(c.search)&&(c.search=c.search?c.search.replace(/^\?/,"?index&"):"?index"),r&&n!=="/"&&(c.pathname=c.pathname==="/"?n:uo([n,c.pathname])),_s(c)}function $R(e,t,n,r){if(!r||!FW(r))return{path:n};if(r.formMethod&&!qW(r.formMethod))return{path:n,error:jr(405,{method:r.formMethod})};let a=()=>({path:n,error:jr(400,{type:"invalid-body"})}),o=r.formMethod||"get",i=e?o.toUpperCase():o.toLowerCase(),s=RF(n);if(r.body!==void 0){if(r.formEncType==="text/plain"){if(!ca(i))return a();let g=typeof r.body=="string"?r.body:r.body instanceof FormData||r.body instanceof URLSearchParams?Array.from(r.body.entries()).reduce((m,b)=>{let[y,w]=b;return""+m+y+"="+w+` +`},""):String(r.body);return{path:n,submission:{formMethod:i,formAction:s,formEncType:r.formEncType,formData:void 0,json:void 0,text:g}}}else if(r.formEncType==="application/json"){if(!ca(i))return a();try{let g=typeof r.body=="string"?JSON.parse(r.body):r.body;return{path:n,submission:{formMethod:i,formAction:s,formEncType:r.formEncType,formData:void 0,json:g,text:void 0}}}catch{return a()}}}Ze(typeof FormData=="function","FormData is not available in this environment");let l,c;if(r.formData)l=U1(r.formData),c=r.formData;else if(r.body instanceof FormData)l=U1(r.body),c=r.body;else if(r.body instanceof URLSearchParams)l=r.body,c=UR(l);else if(r.body==null)l=new URLSearchParams,c=new FormData;else try{l=new URLSearchParams(r.body),c=UR(l)}catch{return a()}let u={formMethod:i,formAction:s,formEncType:r&&r.formEncType||"application/x-www-form-urlencoded",formData:c,json:void 0,text:void 0};if(ca(u.formMethod))return{path:n,submission:u};let d=Co(n);return t&&d.search&&a_(d.search)&&l.append("index",""),d.search="?"+l,{path:_s(d),submission:u}}function jW(e,t){let n=e;if(t){let r=e.findIndex(a=>a.route.id===t);r>=0&&(n=e.slice(0,r))}return n}function FR(e,t,n,r,a,o,i,s,l,c,u,d,g,m){let b=m?Object.values(m)[0]:g?Object.values(g)[0]:void 0,y=e.createURL(t.location),w=e.createURL(a),v=m?Object.keys(m)[0]:void 0,S=jW(n,v).filter((k,x)=>{if(k.route.lazy)return!0;if(k.route.loader==null)return!1;if(zW(t.loaderData,t.matches[x],k)||i.some(R=>R===k.route.id))return!0;let C=t.matches[x],_=k;return jR(k,Wt({currentUrl:y,currentParams:C.params,nextUrl:w,nextParams:_.params},r,{actionResult:b,defaultShouldRevalidate:o||y.pathname+y.search===w.pathname+w.search||y.search!==w.search||TF(C,_)}))}),E=[];return l.forEach((k,x)=>{if(!n.some(L=>L.route.id===k.routeId))return;let C=Rl(u,k.path,d);if(!C){E.push({key:x,routeId:k.routeId,path:k.path,matches:null,match:null,controller:null});return}let _=t.fetchers.get(x),R=B1(C,k.path),T=!1;c.has(x)?T=!1:s.includes(x)?T=!0:_&&_.state!=="idle"&&_.data===void 0?T=o:T=jR(R,Wt({currentUrl:y,currentParams:t.matches[t.matches.length-1].params,nextUrl:w,nextParams:n[n.length-1].params},r,{actionResult:b,defaultShouldRevalidate:o})),T&&E.push({key:x,routeId:k.routeId,path:k.path,matches:C,match:R,controller:new AbortController})}),[S,E]}function zW(e,t,n){let r=!t||n.route.id!==t.route.id,a=e[n.route.id]===void 0;return r||a}function TF(e,t){let n=e.route.path;return e.pathname!==t.pathname||n!=null&&n.endsWith("*")&&e.params["*"]!==t.params["*"]}function jR(e,t){if(e.route.shouldRevalidate){let n=e.route.shouldRevalidate(t);if(typeof n=="boolean")return n}return t.defaultShouldRevalidate}async function zR(e,t,n){if(!e.lazy)return;let r=await e.lazy();if(!e.lazy)return;let a=n[e.id];Ze(a,"No route found in manifest");let o={};for(let i in r){let l=a[i]!==void 0&&i!=="hasErrorBoundary";Cs(!l,'Route "'+a.id+'" has a static property "'+i+'" defined but its lazy function is also returning a value for this property. '+('The lazy route property "'+i+'" will be ignored.')),!l&&!cW.has(i)&&(o[i]=r[i])}Object.assign(a,o),Object.assign(a,Wt({},t(a),{lazy:void 0}))}async function au(e,t,n,r,a,o,i,s){s===void 0&&(s={});let l,c,u,d=b=>{let y,w=new Promise((v,h)=>y=h);return u=()=>y(),t.signal.addEventListener("abort",u),Promise.race([b({request:t,params:n.params,context:s.requestContext}),w])};try{let b=n.route[e];if(n.route.lazy)if(b){let y,w=await Promise.all([d(b).catch(v=>{y=v}),zR(n.route,o,a)]);if(y)throw y;c=w[0]}else if(await zR(n.route,o,a),b=n.route[e],b)c=await d(b);else if(e==="action"){let y=new URL(t.url),w=y.pathname+y.search;throw jr(405,{method:t.method,pathname:w,routeId:n.route.id})}else return{type:Zt.data,data:void 0};else if(b)c=await d(b);else{let y=new URL(t.url),w=y.pathname+y.search;throw jr(404,{pathname:w})}Ze(c!==void 0,"You defined "+(e==="action"?"an action":"a loader")+" for route "+('"'+n.route.id+"\" but didn't return anything from your `"+e+"` ")+"function. Please return a value or `null`.")}catch(b){l=Zt.error,c=b}finally{u&&t.signal.removeEventListener("abort",u)}if(VW(c)){let b=c.status;if(DW.has(b)){let v=c.headers.get("Location");if(Ze(v,"Redirects returned/thrown from loaders/actions must have a Location header"),!_F.test(v))v=z1(new URL(t.url),r.slice(0,r.indexOf(n)+1),i,!0,v);else if(!s.isStaticRequest){let h=new URL(t.url),S=v.startsWith("//")?new URL(h.protocol+v):new URL(v),E=wi(S.pathname,i)!=null;S.origin===h.origin&&E&&(v=S.pathname+S.search+S.hash)}if(s.isStaticRequest)throw c.headers.set("Location",v),c;return{type:Zt.redirect,status:b,location:v,revalidate:c.headers.get("X-Remix-Revalidate")!==null,reloadDocument:c.headers.get("X-Remix-Reload-Document")!==null}}if(s.isRouteRequest)throw{type:l===Zt.error?Zt.error:Zt.data,response:c};let y,w=c.headers.get("Content-Type");return w&&/\bapplication\/json\b/.test(w)?y=await c.json():y=await c.text(),l===Zt.error?{type:l,error:new r_(b,c.statusText,y),headers:c.headers}:{type:Zt.data,data:y,statusCode:c.status,headers:c.headers}}if(l===Zt.error)return{type:l,error:c};if(HW(c)){var g,m;return{type:Zt.deferred,deferredData:c,statusCode:(g=c.init)==null?void 0:g.status,headers:((m=c.init)==null?void 0:m.headers)&&new Headers(c.init.headers)}}return{type:Zt.data,data:c}}function ou(e,t,n,r){let a=e.createURL(RF(t)).toString(),o={signal:n};if(r&&ca(r.formMethod)){let{formMethod:i,formEncType:s}=r;o.method=i.toUpperCase(),s==="application/json"?(o.headers=new Headers({"Content-Type":s}),o.body=JSON.stringify(r.json)):s==="text/plain"?o.body=r.text:s==="application/x-www-form-urlencoded"&&r.formData?o.body=U1(r.formData):o.body=r.formData}return new Request(a,o)}function U1(e){let t=new URLSearchParams;for(let[n,r]of e.entries())t.append(n,typeof r=="string"?r:r.name);return t}function UR(e){let t=new FormData;for(let[n,r]of e.entries())t.append(n,r);return t}function UW(e,t,n,r,a){let o={},i=null,s,l=!1,c={};return n.forEach((u,d)=>{let g=t[d].route.id;if(Ze(!zl(u),"Cannot handle redirect results in processLoaderData"),Bu(u)){let m=Uu(e,g),b=u.error;r&&(b=Object.values(r)[0],r=void 0),i=i||{},i[m.route.id]==null&&(i[m.route.id]=b),o[g]=void 0,l||(l=!0,s=kF(u.error)?u.error.status:500),u.headers&&(c[g]=u.headers)}else rs(u)?(a.set(g,u.deferredData),o[g]=u.deferredData.data):o[g]=u.data,u.statusCode!=null&&u.statusCode!==200&&!l&&(s=u.statusCode),u.headers&&(c[g]=u.headers)}),r&&(i=r,o[Object.keys(r)[0]]=void 0),{loaderData:o,errors:i,statusCode:s||200,loaderHeaders:c}}function BR(e,t,n,r,a,o,i,s){let{loaderData:l,errors:c}=UW(t,n,r,a,s);for(let u=0;ur.route.id===t)+1):[...e]).reverse().find(r=>r.route.hasErrorBoundary===!0)||e[0]}function VR(e){let t=e.length===1?e[0]:e.find(n=>n.index||!n.path||n.path==="/")||{id:"__shim-error-route__"};return{matches:[{params:{},pathname:"",pathnameBase:"",route:t}],route:t}}function jr(e,t){let{pathname:n,routeId:r,method:a,type:o}=t===void 0?{}:t,i="Unknown Server Error",s="Unknown @remix-run/router error";return e===400?(i="Bad Request",a&&n&&r?s="You made a "+a+' request to "'+n+'" but '+('did not provide a `loader` for route "'+r+'", ')+"so there is no way to handle the request.":o==="defer-action"?s="defer() is not supported in actions":o==="invalid-body"&&(s="Unable to encode submission body")):e===403?(i="Forbidden",s='Route "'+r+'" does not match URL "'+n+'"'):e===404?(i="Not Found",s='No route matches URL "'+n+'"'):e===405&&(i="Method Not Allowed",a&&n&&r?s="You made a "+a.toUpperCase()+' request to "'+n+'" but '+('did not provide an `action` for route "'+r+'", ')+"so there is no way to handle the request.":a&&(s='Invalid request method "'+a.toUpperCase()+'"')),new r_(e||500,i,new Error(s),!0)}function qR(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(zl(n))return{result:n,idx:t}}}function RF(e){let t=typeof e=="string"?Co(e):e;return _s(Wt({},t,{hash:""}))}function BW(e,t){return e.pathname!==t.pathname||e.search!==t.search?!1:e.hash===""?t.hash!=="":e.hash===t.hash?!0:t.hash!==""}function rs(e){return e.type===Zt.deferred}function Bu(e){return e.type===Zt.error}function zl(e){return(e&&e.type)===Zt.redirect}function HW(e){let t=e;return t&&typeof t=="object"&&typeof t.data=="object"&&typeof t.subscribe=="function"&&typeof t.cancel=="function"&&typeof t.resolveData=="function"}function VW(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.headers=="object"&&typeof e.body<"u"}function qW(e){return OW.has(e.toLowerCase())}function ca(e){return NW.has(e.toLowerCase())}async function GR(e,t,n,r,a,o){for(let i=0;id.route.id===l.route.id),u=c!=null&&!TF(c,l)&&(o&&o[l.route.id])!==void 0;if(rs(s)&&(a||u)){let d=r[i];Ze(d,"Expected an AbortSignal for revalidating fetcher deferred result"),await NF(s,d,a).then(g=>{g&&(n[i]=g||n[i])})}}}async function NF(e,t,n){if(n===void 0&&(n=!1),!await e.deferredData.resolveData(t)){if(n)try{return{type:Zt.data,data:e.deferredData.unwrappedData}}catch(a){return{type:Zt.error,error:a}}return{type:Zt.data,data:e.deferredData.data}}}function a_(e){return new URLSearchParams(e).getAll("index").some(t=>t==="")}function B1(e,t){let n=typeof t=="string"?Co(t).search:t.search;if(e[e.length-1].route.index&&a_(n||""))return e[e.length-1];let r=tf(e);return r[r.length-1]}function WR(e){let{formMethod:t,formAction:n,formEncType:r,text:a,formData:o,json:i}=e;if(!(!t||!n||!r)){if(a!=null)return{formMethod:t,formAction:n,formEncType:r,formData:void 0,json:void 0,text:a};if(o!=null)return{formMethod:t,formAction:n,formEncType:r,formData:o,json:void 0,text:void 0};if(i!==void 0)return{formMethod:t,formAction:n,formEncType:r,formData:void 0,json:i,text:void 0}}}function kb(e,t){return t?{state:"loading",location:e,formMethod:t.formMethod,formAction:t.formAction,formEncType:t.formEncType,formData:t.formData,json:t.json,text:t.text}:{state:"loading",location:e,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0}}function GW(e,t){return{state:"submitting",location:e,formMethod:t.formMethod,formAction:t.formAction,formEncType:t.formEncType,formData:t.formData,json:t.json,text:t.text}}function iu(e,t){return e?{state:"loading",formMethod:e.formMethod,formAction:e.formAction,formEncType:e.formEncType,formData:e.formData,json:e.json,text:e.text,data:t}:{state:"loading",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:t}}function WW(e,t){return{state:"submitting",formMethod:e.formMethod,formAction:e.formAction,formEncType:e.formEncType,formData:e.formData,json:e.json,text:e.text,data:t?t.data:void 0}}function Bo(e){return{state:"idle",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:e}}function KW(e,t){try{let n=e.sessionStorage.getItem(AF);if(n){let r=JSON.parse(n);for(let[a,o]of Object.entries(r||{}))o&&Array.isArray(o)&&t.set(a,new Set(o||[]))}}catch{}}function YW(e,t){if(t.size>0){let n={};for(let[r,a]of t)n[r]=[...a];try{e.sessionStorage.setItem(AF,JSON.stringify(n))}catch(r){Cs(!1,"Failed to save applied view transitions in sessionStorage ("+r+").")}}}/** * React Router v6.19.0 * * Copyright (c) Remix Software Inc. @@ -56,7 +56,7 @@ Error generating stack: `+o.message+` * LICENSE.md file in the root directory of this source tree. * * @license MIT - */function Ag(){return Ag=Object.assign?Object.assign.bind():function(e){for(var t=1;tl.pathnameBase)),i=p.useRef(!1);return IF(()=>{i.current=!0}),p.useCallback(function(l,c){if(c===void 0&&(c={}),!i.current)return;if(typeof l=="number"){n.go(l);return}let u=zm(l,JSON.parse(o),a,c.relative==="path");e==null&&t!=="/"&&(u.pathname=u.pathname==="/"?t:uo([t,u.pathname])),(c.replace?n.replace:n.push)(u,c.state,c)},[t,n,o,a,e])}const QW=p.createContext(null);function JW(e){let t=p.useContext(_o).outlet;return t&&p.createElement(QW.Provider,{value:e},t)}function Bm(e,t){let{relative:n}=t===void 0?{}:t,{matches:r}=p.useContext(_o),{pathname:a}=Li(),o=JSON.stringify(tf(r).map((i,s)=>s===r.length-1?i.pathname:i.pathnameBase));return p.useMemo(()=>zm(e,JSON.parse(o),a,n==="path"),[e,o,a,n])}function eK(e,t,n){Lc()||Ze(!1);let{navigator:r}=p.useContext(Ps),{matches:a}=p.useContext(_o),o=a[a.length-1],i=o?o.params:{};o&&o.pathname;let s=o?o.pathnameBase:"/";o&&o.route;let l=Li(),c;if(t){var u;let y=typeof t=="string"?Co(t):t;s==="/"||(u=y.pathname)!=null&&u.startsWith(s)||Ze(!1),c=y}else c=l;let d=c.pathname||"/",g=s==="/"?d:d.slice(s.length)||"/",m=Rl(e,{pathname:g}),b=oK(m&&m.map(y=>Object.assign({},y,{params:Object.assign({},i,y.params),pathname:uo([s,r.encodeLocation?r.encodeLocation(y.pathname).pathname:y.pathname]),pathnameBase:y.pathnameBase==="/"?s:uo([s,r.encodeLocation?r.encodeLocation(y.pathnameBase).pathname:y.pathnameBase])})),a,n);return t&&b?p.createElement(Um.Provider,{value:{location:Ag({pathname:"/",search:"",hash:"",state:null,key:"default"},c),navigationType:Yt.Pop}},b):b}function tK(){let e=cK(),t=xF(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,a={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"},o=null;return p.createElement(p.Fragment,null,p.createElement("h2",null,"Unexpected Application Error!"),p.createElement("h3",{style:{fontStyle:"italic"}},t),n?p.createElement("pre",{style:a},n):null,o)}const nK=p.createElement(tK,null);class rK extends p.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,n){return n.location!==t.location||n.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error||n.error,location:n.location,revalidation:t.revalidation||n.revalidation}}componentDidCatch(t,n){console.error("React Router caught the following error during render",t,n)}render(){return this.state.error?p.createElement(_o.Provider,{value:this.props.routeContext},p.createElement(NF.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function aK(e){let{routeContext:t,match:n,children:r}=e,a=p.useContext(nf);return a&&a.static&&a.staticContext&&(n.route.errorElement||n.route.ErrorBoundary)&&(a.staticContext._deepestRenderedBoundaryId=n.route.id),p.createElement(_o.Provider,{value:t},r)}function oK(e,t,n){var r;if(t===void 0&&(t=[]),n===void 0&&(n=null),e==null){var a;if((a=n)!=null&&a.errors)e=n.matches;else return null}let o=e,i=(r=n)==null?void 0:r.errors;if(i!=null){let s=o.findIndex(l=>l.route.id&&(i==null?void 0:i[l.route.id]));s>=0||Ze(!1),o=o.slice(0,Math.min(o.length,s+1))}return o.reduceRight((s,l,c)=>{let u=l.route.id?i==null?void 0:i[l.route.id]:null,d=null;n&&(d=l.route.errorElement||nK);let g=t.concat(o.slice(0,c+1)),m=()=>{let b;return u?b=d:l.route.Component?b=p.createElement(l.route.Component,null):l.route.element?b=l.route.element:b=s,p.createElement(aK,{match:l,routeContext:{outlet:s,matches:g,isDataRoute:n!=null},children:b})};return n&&(l.route.ErrorBoundary||l.route.errorElement||c===0)?p.createElement(rK,{location:n.location,revalidation:n.revalidation,component:d,error:u,children:m(),routeContext:{outlet:null,matches:g,isDataRoute:!0}}):m()},null)}var OF=function(e){return e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e}(OF||{}),Tg=function(e){return e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId",e}(Tg||{});function iK(e){let t=p.useContext(nf);return t||Ze(!1),t}function sK(e){let t=p.useContext(a_);return t||Ze(!1),t}function lK(e){let t=p.useContext(_o);return t||Ze(!1),t}function DF(e){let t=lK(),n=t.matches[t.matches.length-1];return n.route.id||Ze(!1),n.route.id}function cK(){var e;let t=p.useContext(NF),n=sK(Tg.UseRouteError),r=DF(Tg.UseRouteError);return t||((e=n.errors)==null?void 0:e[r])}function uK(){let{router:e}=iK(OF.UseNavigateStable),t=DF(Tg.UseNavigateStable),n=p.useRef(!1);return IF(()=>{n.current=!0}),p.useCallback(function(a,o){o===void 0&&(o={}),n.current&&(typeof a=="number"?e.navigate(a):e.navigate(a,Ag({fromRouteId:t},o)))},[e,t])}function LF(e){let{to:t,replace:n,state:r,relative:a}=e;Lc()||Ze(!1);let{matches:o}=p.useContext(_o),{pathname:i}=Li(),s=Mi(),l=zm(t,tf(o).map(u=>u.pathnameBase),i,a==="path"),c=JSON.stringify(l);return p.useEffect(()=>s(JSON.parse(c),{replace:n,state:r,relative:a}),[s,c,a,n,r]),null}function MF(e){return JW(e.context)}function dK(e){let{basename:t="/",children:n=null,location:r,navigationType:a=Yt.Pop,navigator:o,static:i=!1}=e;Lc()&&Ze(!1);let s=t.replace(/^\/*/,"/"),l=p.useMemo(()=>({basename:s,navigator:o,static:i}),[s,o,i]);typeof r=="string"&&(r=Co(r));let{pathname:c="/",search:u="",hash:d="",state:g=null,key:m="default"}=r,b=p.useMemo(()=>{let y=wi(c,s);return y==null?null:{location:{pathname:y,search:u,hash:d,state:g,key:m},navigationType:a}},[s,c,u,d,g,m,a]);return b==null?null:p.createElement(Ps.Provider,{value:l},p.createElement(Um.Provider,{children:n,value:b}))}new Promise(()=>{});function fK(e){let t={hasErrorBoundary:e.ErrorBoundary!=null||e.errorElement!=null};return e.Component&&Object.assign(t,{element:p.createElement(e.Component),Component:void 0}),e.ErrorBoundary&&Object.assign(t,{errorElement:p.createElement(e.ErrorBoundary),ErrorBoundary:void 0}),t}/** + */function Ag(){return Ag=Object.assign?Object.assign.bind():function(e){for(var t=1;tl.pathnameBase)),i=p.useRef(!1);return OF(()=>{i.current=!0}),p.useCallback(function(l,c){if(c===void 0&&(c={}),!i.current)return;if(typeof l=="number"){n.go(l);return}let u=zm(l,JSON.parse(o),a,c.relative==="path");e==null&&t!=="/"&&(u.pathname=u.pathname==="/"?t:uo([t,u.pathname])),(c.replace?n.replace:n.push)(u,c.state,c)},[t,n,o,a,e])}const QW=p.createContext(null);function JW(e){let t=p.useContext(_o).outlet;return t&&p.createElement(QW.Provider,{value:e},t)}function Bm(e,t){let{relative:n}=t===void 0?{}:t,{matches:r}=p.useContext(_o),{pathname:a}=Li(),o=JSON.stringify(tf(r).map((i,s)=>s===r.length-1?i.pathname:i.pathnameBase));return p.useMemo(()=>zm(e,JSON.parse(o),a,n==="path"),[e,o,a,n])}function eK(e,t,n){Lc()||Ze(!1);let{navigator:r}=p.useContext(Ps),{matches:a}=p.useContext(_o),o=a[a.length-1],i=o?o.params:{};o&&o.pathname;let s=o?o.pathnameBase:"/";o&&o.route;let l=Li(),c;if(t){var u;let y=typeof t=="string"?Co(t):t;s==="/"||(u=y.pathname)!=null&&u.startsWith(s)||Ze(!1),c=y}else c=l;let d=c.pathname||"/",g=s==="/"?d:d.slice(s.length)||"/",m=Rl(e,{pathname:g}),b=oK(m&&m.map(y=>Object.assign({},y,{params:Object.assign({},i,y.params),pathname:uo([s,r.encodeLocation?r.encodeLocation(y.pathname).pathname:y.pathname]),pathnameBase:y.pathnameBase==="/"?s:uo([s,r.encodeLocation?r.encodeLocation(y.pathnameBase).pathname:y.pathnameBase])})),a,n);return t&&b?p.createElement(Um.Provider,{value:{location:Ag({pathname:"/",search:"",hash:"",state:null,key:"default"},c),navigationType:Yt.Pop}},b):b}function tK(){let e=cK(),t=kF(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,a={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"},o=null;return p.createElement(p.Fragment,null,p.createElement("h2",null,"Unexpected Application Error!"),p.createElement("h3",{style:{fontStyle:"italic"}},t),n?p.createElement("pre",{style:a},n):null,o)}const nK=p.createElement(tK,null);class rK extends p.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,n){return n.location!==t.location||n.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error||n.error,location:n.location,revalidation:t.revalidation||n.revalidation}}componentDidCatch(t,n){console.error("React Router caught the following error during render",t,n)}render(){return this.state.error?p.createElement(_o.Provider,{value:this.props.routeContext},p.createElement(IF.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function aK(e){let{routeContext:t,match:n,children:r}=e,a=p.useContext(nf);return a&&a.static&&a.staticContext&&(n.route.errorElement||n.route.ErrorBoundary)&&(a.staticContext._deepestRenderedBoundaryId=n.route.id),p.createElement(_o.Provider,{value:t},r)}function oK(e,t,n){var r;if(t===void 0&&(t=[]),n===void 0&&(n=null),e==null){var a;if((a=n)!=null&&a.errors)e=n.matches;else return null}let o=e,i=(r=n)==null?void 0:r.errors;if(i!=null){let s=o.findIndex(l=>l.route.id&&(i==null?void 0:i[l.route.id]));s>=0||Ze(!1),o=o.slice(0,Math.min(o.length,s+1))}return o.reduceRight((s,l,c)=>{let u=l.route.id?i==null?void 0:i[l.route.id]:null,d=null;n&&(d=l.route.errorElement||nK);let g=t.concat(o.slice(0,c+1)),m=()=>{let b;return u?b=d:l.route.Component?b=p.createElement(l.route.Component,null):l.route.element?b=l.route.element:b=s,p.createElement(aK,{match:l,routeContext:{outlet:s,matches:g,isDataRoute:n!=null},children:b})};return n&&(l.route.ErrorBoundary||l.route.errorElement||c===0)?p.createElement(rK,{location:n.location,revalidation:n.revalidation,component:d,error:u,children:m(),routeContext:{outlet:null,matches:g,isDataRoute:!0}}):m()},null)}var DF=function(e){return e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e}(DF||{}),Tg=function(e){return e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId",e}(Tg||{});function iK(e){let t=p.useContext(nf);return t||Ze(!1),t}function sK(e){let t=p.useContext(o_);return t||Ze(!1),t}function lK(e){let t=p.useContext(_o);return t||Ze(!1),t}function LF(e){let t=lK(),n=t.matches[t.matches.length-1];return n.route.id||Ze(!1),n.route.id}function cK(){var e;let t=p.useContext(IF),n=sK(Tg.UseRouteError),r=LF(Tg.UseRouteError);return t||((e=n.errors)==null?void 0:e[r])}function uK(){let{router:e}=iK(DF.UseNavigateStable),t=LF(Tg.UseNavigateStable),n=p.useRef(!1);return OF(()=>{n.current=!0}),p.useCallback(function(a,o){o===void 0&&(o={}),n.current&&(typeof a=="number"?e.navigate(a):e.navigate(a,Ag({fromRouteId:t},o)))},[e,t])}function MF(e){let{to:t,replace:n,state:r,relative:a}=e;Lc()||Ze(!1);let{matches:o}=p.useContext(_o),{pathname:i}=Li(),s=Mi(),l=zm(t,tf(o).map(u=>u.pathnameBase),i,a==="path"),c=JSON.stringify(l);return p.useEffect(()=>s(JSON.parse(c),{replace:n,state:r,relative:a}),[s,c,a,n,r]),null}function PF(e){return JW(e.context)}function dK(e){let{basename:t="/",children:n=null,location:r,navigationType:a=Yt.Pop,navigator:o,static:i=!1}=e;Lc()&&Ze(!1);let s=t.replace(/^\/*/,"/"),l=p.useMemo(()=>({basename:s,navigator:o,static:i}),[s,o,i]);typeof r=="string"&&(r=Co(r));let{pathname:c="/",search:u="",hash:d="",state:g=null,key:m="default"}=r,b=p.useMemo(()=>{let y=wi(c,s);return y==null?null:{location:{pathname:y,search:u,hash:d,state:g,key:m},navigationType:a}},[s,c,u,d,g,m,a]);return b==null?null:p.createElement(Ps.Provider,{value:l},p.createElement(Um.Provider,{children:n,value:b}))}new Promise(()=>{});function fK(e){let t={hasErrorBoundary:e.ErrorBoundary!=null||e.errorElement!=null};return e.Component&&Object.assign(t,{element:p.createElement(e.Component),Component:void 0}),e.ErrorBoundary&&Object.assign(t,{errorElement:p.createElement(e.ErrorBoundary),ErrorBoundary:void 0}),t}/** * React Router DOM v6.19.0 * * Copyright (c) Remix Software Inc. @@ -65,7 +65,7 @@ Error generating stack: `+o.message+` * LICENSE.md file in the root directory of this source tree. * * @license MIT - */function mc(){return mc=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0)&&(n[a]=e[a]);return n}function pK(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function gK(e,t){return e.button===0&&(!t||t==="_self")&&!pK(e)}const mK=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","unstable_viewTransition"],hK=["aria-current","caseSensitive","className","end","style","to","unstable_viewTransition","children"];function bK(e,t){return $W({basename:t==null?void 0:t.basename,future:mc({},t==null?void 0:t.future,{v7_prependBasename:!0}),history:iW({window:t==null?void 0:t.window}),hydrationData:(t==null?void 0:t.hydrationData)||yK(),routes:e,mapRouteProperties:fK,window:t==null?void 0:t.window}).initialize()}function yK(){var e;let t=(e=window)==null?void 0:e.__staticRouterHydrationData;return t&&t.errors&&(t=mc({},t,{errors:vK(t.errors)})),t}function vK(e){if(!e)return null;let t=Object.entries(e),n={};for(let[r,a]of t)if(a&&a.__type==="RouteErrorResponse")n[r]=new n_(a.status,a.statusText,a.data,a.internal===!0);else if(a&&a.__type==="Error"){if(a.__subType){let o=window[a.__subType];if(typeof o=="function")try{let i=new o(a.message);i.stack="",n[r]=i}catch{}}if(n[r]==null){let o=new Error(a.message);o.stack="",n[r]=o}}else n[r]=a;return n}const $F=p.createContext({isTransitioning:!1}),SK=p.createContext(new Map),wK="startTransition",KR=Kd[wK],EK="flushSync",YR=_V[EK];function xK(e){KR?KR(e):e()}function su(e){YR?YR(e):e()}class kK{constructor(){this.status="pending",this.promise=new Promise((t,n)=>{this.resolve=r=>{this.status==="pending"&&(this.status="resolved",t(r))},this.reject=r=>{this.status==="pending"&&(this.status="rejected",n(r))}})}}function CK(e){let{fallbackElement:t,router:n,future:r}=e,[a,o]=p.useState(n.state),[i,s]=p.useState(),[l,c]=p.useState({isTransitioning:!1}),[u,d]=p.useState(),[g,m]=p.useState(),[b,y]=p.useState(),w=p.useRef(new Map),{v7_startTransition:v}=r||{},h=p.useCallback(C=>{v?xK(C):C()},[v]),S=p.useCallback((C,_)=>{let{deletedFetchers:R,unstable_flushSync:T,unstable_viewTransitionOpts:L}=_;R.forEach(H=>w.current.delete(H)),C.fetchers.forEach((H,z)=>{H.data!==void 0&&w.current.set(z,H.data)});let D=n.window==null||typeof n.window.document.startViewTransition!="function";if(!L||D){T?su(()=>o(C)):h(()=>o(C));return}if(T){su(()=>{g&&(u&&u.resolve(),g.skipTransition()),c({isTransitioning:!0,flushSync:!0,currentLocation:L.currentLocation,nextLocation:L.nextLocation})});let H=n.window.document.startViewTransition(()=>{su(()=>o(C))});H.finished.finally(()=>{su(()=>{d(void 0),m(void 0),s(void 0),c({isTransitioning:!1})})}),su(()=>m(H));return}g?(u&&u.resolve(),g.skipTransition(),y({state:C,currentLocation:L.currentLocation,nextLocation:L.nextLocation})):(s(C),c({isTransitioning:!0,flushSync:!1,currentLocation:L.currentLocation,nextLocation:L.nextLocation}))},[n.window,g,u,w,h]);p.useLayoutEffect(()=>n.subscribe(S),[n,S]),p.useEffect(()=>{l.isTransitioning&&!l.flushSync&&d(new kK)},[l]),p.useEffect(()=>{if(u&&i&&n.window){let C=i,_=u.promise,R=n.window.document.startViewTransition(async()=>{h(()=>o(C)),await _});R.finished.finally(()=>{d(void 0),m(void 0),s(void 0),c({isTransitioning:!1})}),m(R)}},[h,i,u,n.window]),p.useEffect(()=>{u&&i&&a.location.key===i.location.key&&u.resolve()},[u,g,a.location,i]),p.useEffect(()=>{!l.isTransitioning&&b&&(s(b.state),c({isTransitioning:!0,flushSync:!1,currentLocation:b.currentLocation,nextLocation:b.nextLocation}),y(void 0))},[l.isTransitioning,b]);let E=p.useMemo(()=>({createHref:n.createHref,encodeLocation:n.encodeLocation,go:C=>n.navigate(C),push:(C,_,R)=>n.navigate(C,{state:_,preventScrollReset:R==null?void 0:R.preventScrollReset}),replace:(C,_,R)=>n.navigate(C,{replace:!0,state:_,preventScrollReset:R==null?void 0:R.preventScrollReset})}),[n]),k=n.basename||"/",x=p.useMemo(()=>({router:n,navigator:E,static:!1,basename:k}),[n,E,k]);return p.createElement(p.Fragment,null,p.createElement(nf.Provider,{value:x},p.createElement(a_.Provider,{value:a},p.createElement(SK.Provider,{value:w.current},p.createElement($F.Provider,{value:l},p.createElement(dK,{basename:k,location:a.location,navigationType:a.historyAction,navigator:E},a.initialized?p.createElement(_K,{routes:n.routes,state:a}):t))))),null)}function _K(e){let{routes:t,state:n}=e;return eK(t,void 0,n)}const AK=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",TK=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,bd=p.forwardRef(function(t,n){let{onClick:r,relative:a,reloadDocument:o,replace:i,state:s,target:l,to:c,preventScrollReset:u,unstable_viewTransition:d}=t,g=PF(t,mK),{basename:m}=p.useContext(Ps),b,y=!1;if(typeof c=="string"&&TK.test(c)&&(b=c,AK))try{let S=new URL(window.location.href),E=c.startsWith("//")?new URL(S.protocol+c):new URL(c),k=wi(E.pathname,m);E.origin===S.origin&&k!=null?c=k+E.search+E.hash:y=!0}catch{}let w=ZW(c,{relative:a}),v=NK(c,{replace:i,state:s,target:l,preventScrollReset:u,relative:a,unstable_viewTransition:d});function h(S){r&&r(S),S.defaultPrevented||v(S)}return p.createElement("a",mc({},g,{href:b||w,onClick:y||o?r:h,ref:n,target:l}))}),FF=p.forwardRef(function(t,n){let{"aria-current":r="page",caseSensitive:a=!1,className:o="",end:i=!1,style:s,to:l,unstable_viewTransition:c,children:u}=t,d=PF(t,hK),g=Bm(l,{relative:d.relative}),m=Li(),b=p.useContext(a_),{navigator:y}=p.useContext(Ps),w=b!=null&&IK(g)&&c===!0,v=y.encodeLocation?y.encodeLocation(g).pathname:g.pathname,h=m.pathname,S=b&&b.navigation&&b.navigation.location?b.navigation.location.pathname:null;a||(h=h.toLowerCase(),S=S?S.toLowerCase():null,v=v.toLowerCase());const E=v!=="/"&&v.endsWith("/")?v.length-1:v.length;let k=h===v||!i&&h.startsWith(v)&&h.charAt(E)==="/",x=S!=null&&(S===v||!i&&S.startsWith(v)&&S.charAt(v.length)==="/"),C={isActive:k,isPending:x,isTransitioning:w},_=k?r:void 0,R;typeof o=="function"?R=o(C):R=[o,k?"active":null,x?"pending":null,w?"transitioning":null].filter(Boolean).join(" ");let T=typeof s=="function"?s(C):s;return p.createElement(bd,mc({},d,{"aria-current":_,className:R,ref:n,style:T,to:l,unstable_viewTransition:c}),typeof u=="function"?u(C):u)});var B1;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(B1||(B1={}));var ZR;(function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(ZR||(ZR={}));function RK(e){let t=p.useContext(nf);return t||Ze(!1),t}function NK(e,t){let{target:n,replace:r,state:a,preventScrollReset:o,relative:i,unstable_viewTransition:s}=t===void 0?{}:t,l=Mi(),c=Li(),u=Bm(e,{relative:i});return p.useCallback(d=>{if(gK(d,n)){d.preventDefault();let g=r!==void 0?r:_s(c)===_s(u);l(e,{replace:g,state:a,preventScrollReset:o,relative:i,unstable_viewTransition:s})}},[c,l,u,r,a,n,e,o,i,s])}function IK(e,t){t===void 0&&(t={});let n=p.useContext($F);n==null&&Ze(!1);let{basename:r}=RK(B1.useViewTransitionState),a=Bm(e,{relative:t.relative});if(!n.isTransitioning)return!1;let o=wi(n.currentLocation.pathname,r)||n.currentLocation.pathname,i=wi(n.nextLocation.pathname,r)||n.nextLocation.pathname;return F1(a.pathname,i)!=null||F1(a.pathname,o)!=null}const XR=e=>{let t;const n=new Set,r=(l,c)=>{const u=typeof l=="function"?l(t):l;if(!Object.is(u,t)){const d=t;t=c??typeof u!="object"?u:Object.assign({},t,u),n.forEach(g=>g(t,d))}},a=()=>t,s={setState:r,getState:a,subscribe:l=>(n.add(l),()=>n.delete(l)),destroy:()=>{n.clear()}};return t=e(r,a,s),s},OK=e=>e?XR(e):XR;var jF={exports:{}},zF={},UF={exports:{}},BF={};/** + */function mc(){return mc=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0)&&(n[a]=e[a]);return n}function pK(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function gK(e,t){return e.button===0&&(!t||t==="_self")&&!pK(e)}const mK=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","unstable_viewTransition"],hK=["aria-current","caseSensitive","className","end","style","to","unstable_viewTransition","children"];function bK(e,t){return $W({basename:t==null?void 0:t.basename,future:mc({},t==null?void 0:t.future,{v7_prependBasename:!0}),history:iW({window:t==null?void 0:t.window}),hydrationData:(t==null?void 0:t.hydrationData)||yK(),routes:e,mapRouteProperties:fK,window:t==null?void 0:t.window}).initialize()}function yK(){var e;let t=(e=window)==null?void 0:e.__staticRouterHydrationData;return t&&t.errors&&(t=mc({},t,{errors:vK(t.errors)})),t}function vK(e){if(!e)return null;let t=Object.entries(e),n={};for(let[r,a]of t)if(a&&a.__type==="RouteErrorResponse")n[r]=new r_(a.status,a.statusText,a.data,a.internal===!0);else if(a&&a.__type==="Error"){if(a.__subType){let o=window[a.__subType];if(typeof o=="function")try{let i=new o(a.message);i.stack="",n[r]=i}catch{}}if(n[r]==null){let o=new Error(a.message);o.stack="",n[r]=o}}else n[r]=a;return n}const FF=p.createContext({isTransitioning:!1}),SK=p.createContext(new Map),wK="startTransition",KR=Kd[wK],EK="flushSync",YR=AV[EK];function xK(e){KR?KR(e):e()}function su(e){YR?YR(e):e()}class kK{constructor(){this.status="pending",this.promise=new Promise((t,n)=>{this.resolve=r=>{this.status==="pending"&&(this.status="resolved",t(r))},this.reject=r=>{this.status==="pending"&&(this.status="rejected",n(r))}})}}function CK(e){let{fallbackElement:t,router:n,future:r}=e,[a,o]=p.useState(n.state),[i,s]=p.useState(),[l,c]=p.useState({isTransitioning:!1}),[u,d]=p.useState(),[g,m]=p.useState(),[b,y]=p.useState(),w=p.useRef(new Map),{v7_startTransition:v}=r||{},h=p.useCallback(C=>{v?xK(C):C()},[v]),S=p.useCallback((C,_)=>{let{deletedFetchers:R,unstable_flushSync:T,unstable_viewTransitionOpts:L}=_;R.forEach(H=>w.current.delete(H)),C.fetchers.forEach((H,z)=>{H.data!==void 0&&w.current.set(z,H.data)});let D=n.window==null||typeof n.window.document.startViewTransition!="function";if(!L||D){T?su(()=>o(C)):h(()=>o(C));return}if(T){su(()=>{g&&(u&&u.resolve(),g.skipTransition()),c({isTransitioning:!0,flushSync:!0,currentLocation:L.currentLocation,nextLocation:L.nextLocation})});let H=n.window.document.startViewTransition(()=>{su(()=>o(C))});H.finished.finally(()=>{su(()=>{d(void 0),m(void 0),s(void 0),c({isTransitioning:!1})})}),su(()=>m(H));return}g?(u&&u.resolve(),g.skipTransition(),y({state:C,currentLocation:L.currentLocation,nextLocation:L.nextLocation})):(s(C),c({isTransitioning:!0,flushSync:!1,currentLocation:L.currentLocation,nextLocation:L.nextLocation}))},[n.window,g,u,w,h]);p.useLayoutEffect(()=>n.subscribe(S),[n,S]),p.useEffect(()=>{l.isTransitioning&&!l.flushSync&&d(new kK)},[l]),p.useEffect(()=>{if(u&&i&&n.window){let C=i,_=u.promise,R=n.window.document.startViewTransition(async()=>{h(()=>o(C)),await _});R.finished.finally(()=>{d(void 0),m(void 0),s(void 0),c({isTransitioning:!1})}),m(R)}},[h,i,u,n.window]),p.useEffect(()=>{u&&i&&a.location.key===i.location.key&&u.resolve()},[u,g,a.location,i]),p.useEffect(()=>{!l.isTransitioning&&b&&(s(b.state),c({isTransitioning:!0,flushSync:!1,currentLocation:b.currentLocation,nextLocation:b.nextLocation}),y(void 0))},[l.isTransitioning,b]);let E=p.useMemo(()=>({createHref:n.createHref,encodeLocation:n.encodeLocation,go:C=>n.navigate(C),push:(C,_,R)=>n.navigate(C,{state:_,preventScrollReset:R==null?void 0:R.preventScrollReset}),replace:(C,_,R)=>n.navigate(C,{replace:!0,state:_,preventScrollReset:R==null?void 0:R.preventScrollReset})}),[n]),k=n.basename||"/",x=p.useMemo(()=>({router:n,navigator:E,static:!1,basename:k}),[n,E,k]);return p.createElement(p.Fragment,null,p.createElement(nf.Provider,{value:x},p.createElement(o_.Provider,{value:a},p.createElement(SK.Provider,{value:w.current},p.createElement(FF.Provider,{value:l},p.createElement(dK,{basename:k,location:a.location,navigationType:a.historyAction,navigator:E},a.initialized?p.createElement(_K,{routes:n.routes,state:a}):t))))),null)}function _K(e){let{routes:t,state:n}=e;return eK(t,void 0,n)}const AK=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",TK=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,bd=p.forwardRef(function(t,n){let{onClick:r,relative:a,reloadDocument:o,replace:i,state:s,target:l,to:c,preventScrollReset:u,unstable_viewTransition:d}=t,g=$F(t,mK),{basename:m}=p.useContext(Ps),b,y=!1;if(typeof c=="string"&&TK.test(c)&&(b=c,AK))try{let S=new URL(window.location.href),E=c.startsWith("//")?new URL(S.protocol+c):new URL(c),k=wi(E.pathname,m);E.origin===S.origin&&k!=null?c=k+E.search+E.hash:y=!0}catch{}let w=ZW(c,{relative:a}),v=NK(c,{replace:i,state:s,target:l,preventScrollReset:u,relative:a,unstable_viewTransition:d});function h(S){r&&r(S),S.defaultPrevented||v(S)}return p.createElement("a",mc({},g,{href:b||w,onClick:y||o?r:h,ref:n,target:l}))}),jF=p.forwardRef(function(t,n){let{"aria-current":r="page",caseSensitive:a=!1,className:o="",end:i=!1,style:s,to:l,unstable_viewTransition:c,children:u}=t,d=$F(t,hK),g=Bm(l,{relative:d.relative}),m=Li(),b=p.useContext(o_),{navigator:y}=p.useContext(Ps),w=b!=null&&IK(g)&&c===!0,v=y.encodeLocation?y.encodeLocation(g).pathname:g.pathname,h=m.pathname,S=b&&b.navigation&&b.navigation.location?b.navigation.location.pathname:null;a||(h=h.toLowerCase(),S=S?S.toLowerCase():null,v=v.toLowerCase());const E=v!=="/"&&v.endsWith("/")?v.length-1:v.length;let k=h===v||!i&&h.startsWith(v)&&h.charAt(E)==="/",x=S!=null&&(S===v||!i&&S.startsWith(v)&&S.charAt(v.length)==="/"),C={isActive:k,isPending:x,isTransitioning:w},_=k?r:void 0,R;typeof o=="function"?R=o(C):R=[o,k?"active":null,x?"pending":null,w?"transitioning":null].filter(Boolean).join(" ");let T=typeof s=="function"?s(C):s;return p.createElement(bd,mc({},d,{"aria-current":_,className:R,ref:n,style:T,to:l,unstable_viewTransition:c}),typeof u=="function"?u(C):u)});var H1;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(H1||(H1={}));var ZR;(function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(ZR||(ZR={}));function RK(e){let t=p.useContext(nf);return t||Ze(!1),t}function NK(e,t){let{target:n,replace:r,state:a,preventScrollReset:o,relative:i,unstable_viewTransition:s}=t===void 0?{}:t,l=Mi(),c=Li(),u=Bm(e,{relative:i});return p.useCallback(d=>{if(gK(d,n)){d.preventDefault();let g=r!==void 0?r:_s(c)===_s(u);l(e,{replace:g,state:a,preventScrollReset:o,relative:i,unstable_viewTransition:s})}},[c,l,u,r,a,n,e,o,i,s])}function IK(e,t){t===void 0&&(t={});let n=p.useContext(FF);n==null&&Ze(!1);let{basename:r}=RK(H1.useViewTransitionState),a=Bm(e,{relative:t.relative});if(!n.isTransitioning)return!1;let o=wi(n.currentLocation.pathname,r)||n.currentLocation.pathname,i=wi(n.nextLocation.pathname,r)||n.nextLocation.pathname;return j1(a.pathname,i)!=null||j1(a.pathname,o)!=null}const XR=e=>{let t;const n=new Set,r=(l,c)=>{const u=typeof l=="function"?l(t):l;if(!Object.is(u,t)){const d=t;t=c??typeof u!="object"?u:Object.assign({},t,u),n.forEach(g=>g(t,d))}},a=()=>t,s={setState:r,getState:a,subscribe:l=>(n.add(l),()=>n.delete(l)),destroy:()=>{n.clear()}};return t=e(r,a,s),s},OK=e=>e?XR(e):XR;var zF={exports:{}},UF={},BF={exports:{}},HF={};/** * @license React * use-sync-external-store-shim.production.min.js * @@ -73,7 +73,7 @@ Error generating stack: `+o.message+` * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var hc=p;function DK(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var LK=typeof Object.is=="function"?Object.is:DK,MK=hc.useState,PK=hc.useEffect,$K=hc.useLayoutEffect,FK=hc.useDebugValue;function jK(e,t){var n=t(),r=MK({inst:{value:n,getSnapshot:t}}),a=r[0].inst,o=r[1];return $K(function(){a.value=n,a.getSnapshot=t,kb(a)&&o({inst:a})},[e,n,t]),PK(function(){return kb(a)&&o({inst:a}),e(function(){kb(a)&&o({inst:a})})},[e]),FK(n),n}function kb(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!LK(e,n)}catch{return!0}}function zK(e,t){return t()}var UK=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?zK:jK;BF.useSyncExternalStore=hc.useSyncExternalStore!==void 0?hc.useSyncExternalStore:UK;UF.exports=BF;var BK=UF.exports;/** + */var hc=p;function DK(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var LK=typeof Object.is=="function"?Object.is:DK,MK=hc.useState,PK=hc.useEffect,$K=hc.useLayoutEffect,FK=hc.useDebugValue;function jK(e,t){var n=t(),r=MK({inst:{value:n,getSnapshot:t}}),a=r[0].inst,o=r[1];return $K(function(){a.value=n,a.getSnapshot=t,Cb(a)&&o({inst:a})},[e,n,t]),PK(function(){return Cb(a)&&o({inst:a}),e(function(){Cb(a)&&o({inst:a})})},[e]),FK(n),n}function Cb(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!LK(e,n)}catch{return!0}}function zK(e,t){return t()}var UK=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?zK:jK;HF.useSyncExternalStore=hc.useSyncExternalStore!==void 0?hc.useSyncExternalStore:UK;BF.exports=HF;var BK=BF.exports;/** * @license React * use-sync-external-store-shim/with-selector.production.min.js * @@ -81,12 +81,12 @@ Error generating stack: `+o.message+` * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var Hm=p,HK=BK;function VK(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var qK=typeof Object.is=="function"?Object.is:VK,GK=HK.useSyncExternalStore,WK=Hm.useRef,KK=Hm.useEffect,YK=Hm.useMemo,ZK=Hm.useDebugValue;zF.useSyncExternalStoreWithSelector=function(e,t,n,r,a){var o=WK(null);if(o.current===null){var i={hasValue:!1,value:null};o.current=i}else i=o.current;o=YK(function(){function l(m){if(!c){if(c=!0,u=m,m=r(m),a!==void 0&&i.hasValue){var b=i.value;if(a(b,m))return d=b}return d=m}if(b=d,qK(u,m))return b;var y=r(m);return a!==void 0&&a(b,y)?b:(u=m,d=y)}var c=!1,u,d,g=n===void 0?null:n;return[function(){return l(t())},g===null?void 0:function(){return l(g())}]},[t,n,r,a]);var s=GK(e,o[0],o[1]);return KK(function(){i.hasValue=!0,i.value=s},[s]),ZK(s),s};jF.exports=zF;var XK=jF.exports;const QK=Tc(XK),{useDebugValue:JK}=Ae,{useSyncExternalStoreWithSelector:eY}=QK;function tY(e,t=e.getState,n){const r=eY(e.subscribe,e.getState,e.getServerState||e.getState,t,n);return JK(r),r}const QR=e=>{const t=typeof e=="function"?OK(e):e,n=(r,a)=>tY(t,r,a);return Object.assign(n,t),n},rf=e=>e?QR(e):QR,nY=(e,t)=>(...n)=>Object.assign({},e,t(...n));function o_(e,t){let n;try{n=e()}catch{return}return{getItem:a=>{var o;const i=l=>l===null?null:JSON.parse(l,t==null?void 0:t.reviver),s=(o=n.getItem(a))!=null?o:null;return s instanceof Promise?s.then(i):i(s)},setItem:(a,o)=>n.setItem(a,JSON.stringify(o,t==null?void 0:t.replacer)),removeItem:a=>n.removeItem(a)}}const yd=e=>t=>{try{const n=e(t);return n instanceof Promise?n:{then(r){return yd(r)(n)},catch(r){return this}}}catch(n){return{then(r){return this},catch(r){return yd(r)(n)}}}},rY=(e,t)=>(n,r,a)=>{let o={getStorage:()=>localStorage,serialize:JSON.stringify,deserialize:JSON.parse,partialize:w=>w,version:0,merge:(w,v)=>({...v,...w}),...t},i=!1;const s=new Set,l=new Set;let c;try{c=o.getStorage()}catch{}if(!c)return e((...w)=>{console.warn(`[zustand persist middleware] Unable to update item '${o.name}', the given storage is currently unavailable.`),n(...w)},r,a);const u=yd(o.serialize),d=()=>{const w=o.partialize({...r()});let v;const h=u({state:w,version:o.version}).then(S=>c.setItem(o.name,S)).catch(S=>{v=S});if(v)throw v;return h},g=a.setState;a.setState=(w,v)=>{g(w,v),d()};const m=e((...w)=>{n(...w),d()},r,a);let b;const y=()=>{var w;if(!c)return;i=!1,s.forEach(h=>h(r()));const v=((w=o.onRehydrateStorage)==null?void 0:w.call(o,r()))||void 0;return yd(c.getItem.bind(c))(o.name).then(h=>{if(h)return o.deserialize(h)}).then(h=>{if(h)if(typeof h.version=="number"&&h.version!==o.version){if(o.migrate)return o.migrate(h.state,h.version);console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return h.state}).then(h=>{var S;return b=o.merge(h,(S=r())!=null?S:m),n(b,!0),d()}).then(()=>{v==null||v(b,void 0),i=!0,l.forEach(h=>h(b))}).catch(h=>{v==null||v(void 0,h)})};return a.persist={setOptions:w=>{o={...o,...w},w.getStorage&&(c=w.getStorage())},clearStorage:()=>{c==null||c.removeItem(o.name)},getOptions:()=>o,rehydrate:()=>y(),hasHydrated:()=>i,onHydrate:w=>(s.add(w),()=>{s.delete(w)}),onFinishHydration:w=>(l.add(w),()=>{l.delete(w)})},y(),b||m},aY=(e,t)=>(n,r,a)=>{let o={storage:o_(()=>localStorage),partialize:y=>y,version:0,merge:(y,w)=>({...w,...y}),...t},i=!1;const s=new Set,l=new Set;let c=o.storage;if(!c)return e((...y)=>{console.warn(`[zustand persist middleware] Unable to update item '${o.name}', the given storage is currently unavailable.`),n(...y)},r,a);const u=()=>{const y=o.partialize({...r()});return c.setItem(o.name,{state:y,version:o.version})},d=a.setState;a.setState=(y,w)=>{d(y,w),u()};const g=e((...y)=>{n(...y),u()},r,a);let m;const b=()=>{var y,w;if(!c)return;i=!1,s.forEach(h=>{var S;return h((S=r())!=null?S:g)});const v=((w=o.onRehydrateStorage)==null?void 0:w.call(o,(y=r())!=null?y:g))||void 0;return yd(c.getItem.bind(c))(o.name).then(h=>{if(h)if(typeof h.version=="number"&&h.version!==o.version){if(o.migrate)return o.migrate(h.state,h.version);console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return h.state}).then(h=>{var S;return m=o.merge(h,(S=r())!=null?S:g),n(m,!0),u()}).then(()=>{v==null||v(m,void 0),m=r(),i=!0,l.forEach(h=>h(m))}).catch(h=>{v==null||v(void 0,h)})};return a.persist={setOptions:y=>{o={...o,...y},y.storage&&(c=y.storage)},clearStorage:()=>{c==null||c.removeItem(o.name)},getOptions:()=>o,rehydrate:()=>b(),hasHydrated:()=>i,onHydrate:y=>(s.add(y),()=>{s.delete(y)}),onFinishHydration:y=>(l.add(y),()=>{l.delete(y)})},o.skipHydration||b(),m||g},oY=(e,t)=>"getStorage"in t||"serialize"in t||"deserialize"in t?rY(e,t):aY(e,t),Vm=oY,i_=rf(Vm((e,t)=>({auth:{uuid:null,token:null,loggedIn:!1,isAdmin:!1},actions:{setToken:n=>e(r=>({...r,auth:{...r.auth,token:n}})),setAsAuthenticated:(n,r,a)=>e(o=>({...o,auth:{token:r??o.auth.token,uuid:n,loggedIn:!0,isAdmin:a??!1}})),logout:()=>e(n=>({...n,auth:{token:null,uuid:null,loggedIn:!1,isAdmin:!1}}))}}),{name:"auth-storage",storage:o_(()=>localStorage),partialize:({actions:e,...t})=>t})),HF=()=>{var e;return(e=i_().auth)==null?void 0:e.uuid},iY=()=>i_().actions,VF=()=>{const{auth:e}=i_();return e.token?`Bearer ${e.token}`:""},sY={BASE_URL:"/",MODE:"production",DEV:!1,PROD:!0,SSR:!1}.VITE_BASE_URL||"/api";function qF(e,t){return function(){return e.apply(t,arguments)}}const{toString:lY}=Object.prototype,{getPrototypeOf:s_}=Object,qm=(e=>t=>{const n=lY.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),Ha=e=>(e=e.toLowerCase(),t=>qm(t)===e),Gm=e=>t=>typeof t===e,{isArray:Mc}=Array,vd=Gm("undefined");function cY(e){return e!==null&&!vd(e)&&e.constructor!==null&&!vd(e.constructor)&&Gr(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const GF=Ha("ArrayBuffer");function uY(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&GF(e.buffer),t}const dY=Gm("string"),Gr=Gm("function"),WF=Gm("number"),Wm=e=>e!==null&&typeof e=="object",fY=e=>e===!0||e===!1,Bp=e=>{if(qm(e)!=="object")return!1;const t=s_(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)},pY=Ha("Date"),gY=Ha("File"),mY=Ha("Blob"),hY=Ha("FileList"),bY=e=>Wm(e)&&Gr(e.pipe),yY=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||Gr(e.append)&&((t=qm(e))==="formdata"||t==="object"&&Gr(e.toString)&&e.toString()==="[object FormData]"))},vY=Ha("URLSearchParams"),SY=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function af(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let r,a;if(typeof e!="object"&&(e=[e]),Mc(e))for(r=0,a=e.length;r0;)if(a=n[r],t===a.toLowerCase())return a;return null}const YF=(()=>typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global)(),ZF=e=>!vd(e)&&e!==YF;function H1(){const{caseless:e}=ZF(this)&&this||{},t={},n=(r,a)=>{const o=e&&KF(t,a)||a;Bp(t[o])&&Bp(r)?t[o]=H1(t[o],r):Bp(r)?t[o]=H1({},r):Mc(r)?t[o]=r.slice():t[o]=r};for(let r=0,a=arguments.length;r(af(t,(a,o)=>{n&&Gr(a)?e[o]=qF(a,n):e[o]=a},{allOwnKeys:r}),e),EY=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),xY=(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},kY=(e,t,n,r)=>{let a,o,i;const s={};if(t=t||{},e==null)return t;do{for(a=Object.getOwnPropertyNames(e),o=a.length;o-- >0;)i=a[o],(!r||r(i,e,t))&&!s[i]&&(t[i]=e[i],s[i]=!0);e=n!==!1&&s_(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},CY=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return r!==-1&&r===n},_Y=e=>{if(!e)return null;if(Mc(e))return e;let t=e.length;if(!WF(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},AY=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&s_(Uint8Array)),TY=(e,t)=>{const r=(e&&e[Symbol.iterator]).call(e);let a;for(;(a=r.next())&&!a.done;){const o=a.value;t.call(e,o[0],o[1])}},RY=(e,t)=>{let n;const r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},NY=Ha("HTMLFormElement"),IY=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,r,a){return r.toUpperCase()+a}),JR=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),OY=Ha("RegExp"),XF=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};af(n,(a,o)=>{let i;(i=t(a,o,e))!==!1&&(r[o]=i||a)}),Object.defineProperties(e,r)},DY=e=>{XF(e,(t,n)=>{if(Gr(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const r=e[n];if(Gr(r)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},LY=(e,t)=>{const n={},r=a=>{a.forEach(o=>{n[o]=!0})};return Mc(e)?r(e):r(String(e).split(t)),n},MY=()=>{},PY=(e,t)=>(e=+e,Number.isFinite(e)?e:t),Cb="abcdefghijklmnopqrstuvwxyz",e2="0123456789",QF={DIGIT:e2,ALPHA:Cb,ALPHA_DIGIT:Cb+Cb.toUpperCase()+e2},$Y=(e=16,t=QF.ALPHA_DIGIT)=>{let n="";const{length:r}=t;for(;e--;)n+=t[Math.random()*r|0];return n};function FY(e){return!!(e&&Gr(e.append)&&e[Symbol.toStringTag]==="FormData"&&e[Symbol.iterator])}const jY=e=>{const t=new Array(10),n=(r,a)=>{if(Wm(r)){if(t.indexOf(r)>=0)return;if(!("toJSON"in r)){t[a]=r;const o=Mc(r)?[]:{};return af(r,(i,s)=>{const l=n(i,a+1);!vd(l)&&(o[s]=l)}),t[a]=void 0,o}}return r};return n(e,0)},zY=Ha("AsyncFunction"),UY=e=>e&&(Wm(e)||Gr(e))&&Gr(e.then)&&Gr(e.catch),J={isArray:Mc,isArrayBuffer:GF,isBuffer:cY,isFormData:yY,isArrayBufferView:uY,isString:dY,isNumber:WF,isBoolean:fY,isObject:Wm,isPlainObject:Bp,isUndefined:vd,isDate:pY,isFile:gY,isBlob:mY,isRegExp:OY,isFunction:Gr,isStream:bY,isURLSearchParams:vY,isTypedArray:AY,isFileList:hY,forEach:af,merge:H1,extend:wY,trim:SY,stripBOM:EY,inherits:xY,toFlatObject:kY,kindOf:qm,kindOfTest:Ha,endsWith:CY,toArray:_Y,forEachEntry:TY,matchAll:RY,isHTMLForm:NY,hasOwnProperty:JR,hasOwnProp:JR,reduceDescriptors:XF,freezeMethods:DY,toObjectSet:LY,toCamelCase:IY,noop:MY,toFiniteNumber:PY,findKey:KF,global:YF,isContextDefined:ZF,ALPHABET:QF,generateString:$Y,isSpecCompliantForm:FY,toJSONObject:jY,isAsyncFn:zY,isThenable:UY};function st(e,t,n,r,a){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),a&&(this.response=a)}J.inherits(st,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:J.toJSONObject(this.config),code:this.code,status:this.response&&this.response.status?this.response.status:null}}});const JF=st.prototype,e6={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(e=>{e6[e]={value:e}});Object.defineProperties(st,e6);Object.defineProperty(JF,"isAxiosError",{value:!0});st.from=(e,t,n,r,a,o)=>{const i=Object.create(JF);return J.toFlatObject(e,i,function(l){return l!==Error.prototype},s=>s!=="isAxiosError"),st.call(i,e.message,t,n,r,a),i.cause=e,i.name=e.name,o&&Object.assign(i,o),i};const BY=null;function V1(e){return J.isPlainObject(e)||J.isArray(e)}function t6(e){return J.endsWith(e,"[]")?e.slice(0,-2):e}function t2(e,t,n){return e?e.concat(t).map(function(a,o){return a=t6(a),!n&&o?"["+a+"]":a}).join(n?".":""):t}function HY(e){return J.isArray(e)&&!e.some(V1)}const VY=J.toFlatObject(J,{},null,function(t){return/^is[A-Z]/.test(t)});function Km(e,t,n){if(!J.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=J.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(y,w){return!J.isUndefined(w[y])});const r=n.metaTokens,a=n.visitor||u,o=n.dots,i=n.indexes,l=(n.Blob||typeof Blob<"u"&&Blob)&&J.isSpecCompliantForm(t);if(!J.isFunction(a))throw new TypeError("visitor must be a function");function c(b){if(b===null)return"";if(J.isDate(b))return b.toISOString();if(!l&&J.isBlob(b))throw new st("Blob is not supported. Use a Buffer instead.");return J.isArrayBuffer(b)||J.isTypedArray(b)?l&&typeof Blob=="function"?new Blob([b]):Buffer.from(b):b}function u(b,y,w){let v=b;if(b&&!w&&typeof b=="object"){if(J.endsWith(y,"{}"))y=r?y:y.slice(0,-2),b=JSON.stringify(b);else if(J.isArray(b)&&HY(b)||(J.isFileList(b)||J.endsWith(y,"[]"))&&(v=J.toArray(b)))return y=t6(y),v.forEach(function(S,E){!(J.isUndefined(S)||S===null)&&t.append(i===!0?t2([y],E,o):i===null?y:y+"[]",c(S))}),!1}return V1(b)?!0:(t.append(t2(w,y,o),c(b)),!1)}const d=[],g=Object.assign(VY,{defaultVisitor:u,convertValue:c,isVisitable:V1});function m(b,y){if(!J.isUndefined(b)){if(d.indexOf(b)!==-1)throw Error("Circular reference detected in "+y.join("."));d.push(b),J.forEach(b,function(v,h){(!(J.isUndefined(v)||v===null)&&a.call(t,v,J.isString(h)?h.trim():h,y,g))===!0&&m(v,y?y.concat(h):[h])}),d.pop()}}if(!J.isObject(e))throw new TypeError("data must be an object");return m(e),t}function n2(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(r){return t[r]})}function l_(e,t){this._pairs=[],e&&Km(e,this,t)}const n6=l_.prototype;n6.append=function(t,n){this._pairs.push([t,n])};n6.toString=function(t){const n=t?function(r){return t.call(this,r,n2)}:n2;return this._pairs.map(function(a){return n(a[0])+"="+n(a[1])},"").join("&")};function qY(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function r6(e,t,n){if(!t)return e;const r=n&&n.encode||qY,a=n&&n.serialize;let o;if(a?o=a(t,n):o=J.isURLSearchParams(t)?t.toString():new l_(t,n).toString(r),o){const i=e.indexOf("#");i!==-1&&(e=e.slice(0,i)),e+=(e.indexOf("?")===-1?"?":"&")+o}return e}class GY{constructor(){this.handlers=[]}use(t,n,r){return this.handlers.push({fulfilled:t,rejected:n,synchronous:r?r.synchronous:!1,runWhen:r?r.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){J.forEach(this.handlers,function(r){r!==null&&t(r)})}}const r2=GY,a6={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},WY=typeof URLSearchParams<"u"?URLSearchParams:l_,KY=typeof FormData<"u"?FormData:null,YY=typeof Blob<"u"?Blob:null,ZY={isBrowser:!0,classes:{URLSearchParams:WY,FormData:KY,Blob:YY},protocols:["http","https","file","blob","url","data"]},o6=typeof window<"u"&&typeof document<"u",XY=(e=>o6&&["ReactNative","NativeScript","NS"].indexOf(e)<0)(typeof navigator<"u"&&navigator.product),QY=(()=>typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function")(),JY=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:o6,hasStandardBrowserEnv:XY,hasStandardBrowserWebWorkerEnv:QY},Symbol.toStringTag,{value:"Module"})),Ia={...JY,...ZY};function eZ(e,t){return Km(e,new Ia.classes.URLSearchParams,Object.assign({visitor:function(n,r,a,o){return Ia.isNode&&J.isBuffer(n)?(this.append(r,n.toString("base64")),!1):o.defaultVisitor.apply(this,arguments)}},t))}function tZ(e){return J.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function nZ(e){const t={},n=Object.keys(e);let r;const a=n.length;let o;for(r=0;r=n.length;return i=!i&&J.isArray(a)?a.length:i,l?(J.hasOwnProp(a,i)?a[i]=[a[i],r]:a[i]=r,!s):((!a[i]||!J.isObject(a[i]))&&(a[i]=[]),t(n,r,a[i],o)&&J.isArray(a[i])&&(a[i]=nZ(a[i])),!s)}if(J.isFormData(e)&&J.isFunction(e.entries)){const n={};return J.forEachEntry(e,(r,a)=>{t(tZ(r),a,n,0)}),n}return null}function rZ(e,t,n){if(J.isString(e))try{return(t||JSON.parse)(e),J.trim(e)}catch(r){if(r.name!=="SyntaxError")throw r}return(n||JSON.stringify)(e)}const c_={transitional:a6,adapter:["xhr","http"],transformRequest:[function(t,n){const r=n.getContentType()||"",a=r.indexOf("application/json")>-1,o=J.isObject(t);if(o&&J.isHTMLForm(t)&&(t=new FormData(t)),J.isFormData(t))return a?JSON.stringify(i6(t)):t;if(J.isArrayBuffer(t)||J.isBuffer(t)||J.isStream(t)||J.isFile(t)||J.isBlob(t))return t;if(J.isArrayBufferView(t))return t.buffer;if(J.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let s;if(o){if(r.indexOf("application/x-www-form-urlencoded")>-1)return eZ(t,this.formSerializer).toString();if((s=J.isFileList(t))||r.indexOf("multipart/form-data")>-1){const l=this.env&&this.env.FormData;return Km(s?{"files[]":t}:t,l&&new l,this.formSerializer)}}return o||a?(n.setContentType("application/json",!1),rZ(t)):t}],transformResponse:[function(t){const n=this.transitional||c_.transitional,r=n&&n.forcedJSONParsing,a=this.responseType==="json";if(t&&J.isString(t)&&(r&&!this.responseType||a)){const i=!(n&&n.silentJSONParsing)&&a;try{return JSON.parse(t)}catch(s){if(i)throw s.name==="SyntaxError"?st.from(s,st.ERR_BAD_RESPONSE,this,null,this.response):s}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Ia.classes.FormData,Blob:Ia.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};J.forEach(["delete","get","head","post","put","patch"],e=>{c_.headers[e]={}});const u_=c_,aZ=J.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),oZ=e=>{const t={};let n,r,a;return e&&e.split(` -`).forEach(function(i){a=i.indexOf(":"),n=i.substring(0,a).trim().toLowerCase(),r=i.substring(a+1).trim(),!(!n||t[n]&&aZ[n])&&(n==="set-cookie"?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)}),t},a2=Symbol("internals");function lu(e){return e&&String(e).trim().toLowerCase()}function Hp(e){return e===!1||e==null?e:J.isArray(e)?e.map(Hp):String(e)}function iZ(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}const sZ=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function _b(e,t,n,r,a){if(J.isFunction(r))return r.call(this,t,n);if(a&&(t=n),!!J.isString(t)){if(J.isString(r))return t.indexOf(r)!==-1;if(J.isRegExp(r))return r.test(t)}}function lZ(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,r)=>n.toUpperCase()+r)}function cZ(e,t){const n=J.toCamelCase(" "+t);["get","set","has"].forEach(r=>{Object.defineProperty(e,r+n,{value:function(a,o,i){return this[r].call(this,t,a,o,i)},configurable:!0})})}class Ym{constructor(t){t&&this.set(t)}set(t,n,r){const a=this;function o(s,l,c){const u=lu(l);if(!u)throw new Error("header name must be a non-empty string");const d=J.findKey(a,u);(!d||a[d]===void 0||c===!0||c===void 0&&a[d]!==!1)&&(a[d||l]=Hp(s))}const i=(s,l)=>J.forEach(s,(c,u)=>o(c,u,l));return J.isPlainObject(t)||t instanceof this.constructor?i(t,n):J.isString(t)&&(t=t.trim())&&!sZ(t)?i(oZ(t),n):t!=null&&o(n,t,r),this}get(t,n){if(t=lu(t),t){const r=J.findKey(this,t);if(r){const a=this[r];if(!n)return a;if(n===!0)return iZ(a);if(J.isFunction(n))return n.call(this,a,r);if(J.isRegExp(n))return n.exec(a);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=lu(t),t){const r=J.findKey(this,t);return!!(r&&this[r]!==void 0&&(!n||_b(this,this[r],r,n)))}return!1}delete(t,n){const r=this;let a=!1;function o(i){if(i=lu(i),i){const s=J.findKey(r,i);s&&(!n||_b(r,r[s],s,n))&&(delete r[s],a=!0)}}return J.isArray(t)?t.forEach(o):o(t),a}clear(t){const n=Object.keys(this);let r=n.length,a=!1;for(;r--;){const o=n[r];(!t||_b(this,this[o],o,t,!0))&&(delete this[o],a=!0)}return a}normalize(t){const n=this,r={};return J.forEach(this,(a,o)=>{const i=J.findKey(r,o);if(i){n[i]=Hp(a),delete n[o];return}const s=t?lZ(o):String(o).trim();s!==o&&delete n[o],n[s]=Hp(a),r[s]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return J.forEach(this,(r,a)=>{r!=null&&r!==!1&&(n[a]=t&&J.isArray(r)?r.join(", "):r)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+": "+n).join(` -`)}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const r=new this(t);return n.forEach(a=>r.set(a)),r}static accessor(t){const r=(this[a2]=this[a2]={accessors:{}}).accessors,a=this.prototype;function o(i){const s=lu(i);r[s]||(cZ(a,i),r[s]=!0)}return J.isArray(t)?t.forEach(o):o(t),this}}Ym.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);J.reduceDescriptors(Ym.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(r){this[n]=r}}});J.freezeMethods(Ym);const fo=Ym;function Ab(e,t){const n=this||u_,r=t||n,a=fo.from(r.headers);let o=r.data;return J.forEach(e,function(s){o=s.call(n,o,a.normalize(),t?t.status:void 0)}),a.normalize(),o}function s6(e){return!!(e&&e.__CANCEL__)}function of(e,t,n){st.call(this,e??"canceled",st.ERR_CANCELED,t,n),this.name="CanceledError"}J.inherits(of,st,{__CANCEL__:!0});function uZ(e,t,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new st("Request failed with status code "+n.status,[st.ERR_BAD_REQUEST,st.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}const dZ=Ia.hasStandardBrowserEnv?{write(e,t,n,r,a,o){const i=[e+"="+encodeURIComponent(t)];J.isNumber(n)&&i.push("expires="+new Date(n).toGMTString()),J.isString(r)&&i.push("path="+r),J.isString(a)&&i.push("domain="+a),o===!0&&i.push("secure"),document.cookie=i.join("; ")},read(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,"",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function fZ(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function pZ(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function l6(e,t){return e&&!fZ(t)?pZ(e,t):t}const gZ=Ia.hasStandardBrowserEnv?function(){const t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");let r;function a(o){let i=o;return t&&(n.setAttribute("href",i),i=n.href),n.setAttribute("href",i),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:n.pathname.charAt(0)==="/"?n.pathname:"/"+n.pathname}}return r=a(window.location.href),function(i){const s=J.isString(i)?a(i):i;return s.protocol===r.protocol&&s.host===r.host}}():function(){return function(){return!0}}();function mZ(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function hZ(e,t){e=e||10;const n=new Array(e),r=new Array(e);let a=0,o=0,i;return t=t!==void 0?t:1e3,function(l){const c=Date.now(),u=r[o];i||(i=c),n[a]=l,r[a]=c;let d=o,g=0;for(;d!==a;)g+=n[d++],d=d%e;if(a=(a+1)%e,a===o&&(o=(o+1)%e),c-i{const o=a.loaded,i=a.lengthComputable?a.total:void 0,s=o-n,l=r(s),c=o<=i;n=o;const u={loaded:o,total:i,progress:i?o/i:void 0,bytes:s,rate:l||void 0,estimated:l&&i&&c?(i-o)/l:void 0,event:a};u[t?"download":"upload"]=!0,e(u)}}const bZ=typeof XMLHttpRequest<"u",yZ=bZ&&function(e){return new Promise(function(n,r){let a=e.data;const o=fo.from(e.headers).normalize();let{responseType:i,withXSRFToken:s}=e,l;function c(){e.cancelToken&&e.cancelToken.unsubscribe(l),e.signal&&e.signal.removeEventListener("abort",l)}let u;if(J.isFormData(a)){if(Ia.hasStandardBrowserEnv||Ia.hasStandardBrowserWebWorkerEnv)o.setContentType(!1);else if((u=o.getContentType())!==!1){const[y,...w]=u?u.split(";").map(v=>v.trim()).filter(Boolean):[];o.setContentType([y||"multipart/form-data",...w].join("; "))}}let d=new XMLHttpRequest;if(e.auth){const y=e.auth.username||"",w=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";o.set("Authorization","Basic "+btoa(y+":"+w))}const g=l6(e.baseURL,e.url);d.open(e.method.toUpperCase(),r6(g,e.params,e.paramsSerializer),!0),d.timeout=e.timeout;function m(){if(!d)return;const y=fo.from("getAllResponseHeaders"in d&&d.getAllResponseHeaders()),v={data:!i||i==="text"||i==="json"?d.responseText:d.response,status:d.status,statusText:d.statusText,headers:y,config:e,request:d};uZ(function(S){n(S),c()},function(S){r(S),c()},v),d=null}if("onloadend"in d?d.onloadend=m:d.onreadystatechange=function(){!d||d.readyState!==4||d.status===0&&!(d.responseURL&&d.responseURL.indexOf("file:")===0)||setTimeout(m)},d.onabort=function(){d&&(r(new st("Request aborted",st.ECONNABORTED,e,d)),d=null)},d.onerror=function(){r(new st("Network Error",st.ERR_NETWORK,e,d)),d=null},d.ontimeout=function(){let w=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded";const v=e.transitional||a6;e.timeoutErrorMessage&&(w=e.timeoutErrorMessage),r(new st(w,v.clarifyTimeoutError?st.ETIMEDOUT:st.ECONNABORTED,e,d)),d=null},Ia.hasStandardBrowserEnv&&(s&&J.isFunction(s)&&(s=s(e)),s||s!==!1&&gZ(g))){const y=e.xsrfHeaderName&&e.xsrfCookieName&&dZ.read(e.xsrfCookieName);y&&o.set(e.xsrfHeaderName,y)}a===void 0&&o.setContentType(null),"setRequestHeader"in d&&J.forEach(o.toJSON(),function(w,v){d.setRequestHeader(v,w)}),J.isUndefined(e.withCredentials)||(d.withCredentials=!!e.withCredentials),i&&i!=="json"&&(d.responseType=e.responseType),typeof e.onDownloadProgress=="function"&&d.addEventListener("progress",o2(e.onDownloadProgress,!0)),typeof e.onUploadProgress=="function"&&d.upload&&d.upload.addEventListener("progress",o2(e.onUploadProgress)),(e.cancelToken||e.signal)&&(l=y=>{d&&(r(!y||y.type?new of(null,e,d):y),d.abort(),d=null)},e.cancelToken&&e.cancelToken.subscribe(l),e.signal&&(e.signal.aborted?l():e.signal.addEventListener("abort",l)));const b=mZ(g);if(b&&Ia.protocols.indexOf(b)===-1){r(new st("Unsupported protocol "+b+":",st.ERR_BAD_REQUEST,e));return}d.send(a||null)})},q1={http:BY,xhr:yZ};J.forEach(q1,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const i2=e=>`- ${e}`,vZ=e=>J.isFunction(e)||e===null||e===!1,c6={getAdapter:e=>{e=J.isArray(e)?e:[e];const{length:t}=e;let n,r;const a={};for(let o=0;o`adapter ${s} `+(l===!1?"is not supported by the environment":"is not available in the build"));let i=t?o.length>1?`since : + */var Hm=p,HK=BK;function VK(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var qK=typeof Object.is=="function"?Object.is:VK,GK=HK.useSyncExternalStore,WK=Hm.useRef,KK=Hm.useEffect,YK=Hm.useMemo,ZK=Hm.useDebugValue;UF.useSyncExternalStoreWithSelector=function(e,t,n,r,a){var o=WK(null);if(o.current===null){var i={hasValue:!1,value:null};o.current=i}else i=o.current;o=YK(function(){function l(m){if(!c){if(c=!0,u=m,m=r(m),a!==void 0&&i.hasValue){var b=i.value;if(a(b,m))return d=b}return d=m}if(b=d,qK(u,m))return b;var y=r(m);return a!==void 0&&a(b,y)?b:(u=m,d=y)}var c=!1,u,d,g=n===void 0?null:n;return[function(){return l(t())},g===null?void 0:function(){return l(g())}]},[t,n,r,a]);var s=GK(e,o[0],o[1]);return KK(function(){i.hasValue=!0,i.value=s},[s]),ZK(s),s};zF.exports=UF;var XK=zF.exports;const QK=Tc(XK),{useDebugValue:JK}=Ae,{useSyncExternalStoreWithSelector:eY}=QK;function tY(e,t=e.getState,n){const r=eY(e.subscribe,e.getState,e.getServerState||e.getState,t,n);return JK(r),r}const QR=e=>{const t=typeof e=="function"?OK(e):e,n=(r,a)=>tY(t,r,a);return Object.assign(n,t),n},rf=e=>e?QR(e):QR,nY=(e,t)=>(...n)=>Object.assign({},e,t(...n));function i_(e,t){let n;try{n=e()}catch{return}return{getItem:a=>{var o;const i=l=>l===null?null:JSON.parse(l,t==null?void 0:t.reviver),s=(o=n.getItem(a))!=null?o:null;return s instanceof Promise?s.then(i):i(s)},setItem:(a,o)=>n.setItem(a,JSON.stringify(o,t==null?void 0:t.replacer)),removeItem:a=>n.removeItem(a)}}const yd=e=>t=>{try{const n=e(t);return n instanceof Promise?n:{then(r){return yd(r)(n)},catch(r){return this}}}catch(n){return{then(r){return this},catch(r){return yd(r)(n)}}}},rY=(e,t)=>(n,r,a)=>{let o={getStorage:()=>localStorage,serialize:JSON.stringify,deserialize:JSON.parse,partialize:w=>w,version:0,merge:(w,v)=>({...v,...w}),...t},i=!1;const s=new Set,l=new Set;let c;try{c=o.getStorage()}catch{}if(!c)return e((...w)=>{console.warn(`[zustand persist middleware] Unable to update item '${o.name}', the given storage is currently unavailable.`),n(...w)},r,a);const u=yd(o.serialize),d=()=>{const w=o.partialize({...r()});let v;const h=u({state:w,version:o.version}).then(S=>c.setItem(o.name,S)).catch(S=>{v=S});if(v)throw v;return h},g=a.setState;a.setState=(w,v)=>{g(w,v),d()};const m=e((...w)=>{n(...w),d()},r,a);let b;const y=()=>{var w;if(!c)return;i=!1,s.forEach(h=>h(r()));const v=((w=o.onRehydrateStorage)==null?void 0:w.call(o,r()))||void 0;return yd(c.getItem.bind(c))(o.name).then(h=>{if(h)return o.deserialize(h)}).then(h=>{if(h)if(typeof h.version=="number"&&h.version!==o.version){if(o.migrate)return o.migrate(h.state,h.version);console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return h.state}).then(h=>{var S;return b=o.merge(h,(S=r())!=null?S:m),n(b,!0),d()}).then(()=>{v==null||v(b,void 0),i=!0,l.forEach(h=>h(b))}).catch(h=>{v==null||v(void 0,h)})};return a.persist={setOptions:w=>{o={...o,...w},w.getStorage&&(c=w.getStorage())},clearStorage:()=>{c==null||c.removeItem(o.name)},getOptions:()=>o,rehydrate:()=>y(),hasHydrated:()=>i,onHydrate:w=>(s.add(w),()=>{s.delete(w)}),onFinishHydration:w=>(l.add(w),()=>{l.delete(w)})},y(),b||m},aY=(e,t)=>(n,r,a)=>{let o={storage:i_(()=>localStorage),partialize:y=>y,version:0,merge:(y,w)=>({...w,...y}),...t},i=!1;const s=new Set,l=new Set;let c=o.storage;if(!c)return e((...y)=>{console.warn(`[zustand persist middleware] Unable to update item '${o.name}', the given storage is currently unavailable.`),n(...y)},r,a);const u=()=>{const y=o.partialize({...r()});return c.setItem(o.name,{state:y,version:o.version})},d=a.setState;a.setState=(y,w)=>{d(y,w),u()};const g=e((...y)=>{n(...y),u()},r,a);let m;const b=()=>{var y,w;if(!c)return;i=!1,s.forEach(h=>{var S;return h((S=r())!=null?S:g)});const v=((w=o.onRehydrateStorage)==null?void 0:w.call(o,(y=r())!=null?y:g))||void 0;return yd(c.getItem.bind(c))(o.name).then(h=>{if(h)if(typeof h.version=="number"&&h.version!==o.version){if(o.migrate)return o.migrate(h.state,h.version);console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return h.state}).then(h=>{var S;return m=o.merge(h,(S=r())!=null?S:g),n(m,!0),u()}).then(()=>{v==null||v(m,void 0),m=r(),i=!0,l.forEach(h=>h(m))}).catch(h=>{v==null||v(void 0,h)})};return a.persist={setOptions:y=>{o={...o,...y},y.storage&&(c=y.storage)},clearStorage:()=>{c==null||c.removeItem(o.name)},getOptions:()=>o,rehydrate:()=>b(),hasHydrated:()=>i,onHydrate:y=>(s.add(y),()=>{s.delete(y)}),onFinishHydration:y=>(l.add(y),()=>{l.delete(y)})},o.skipHydration||b(),m||g},oY=(e,t)=>"getStorage"in t||"serialize"in t||"deserialize"in t?rY(e,t):aY(e,t),Vm=oY,s_=rf(Vm((e,t)=>({auth:{uuid:null,token:null,loggedIn:!1,isAdmin:!1},actions:{setToken:n=>e(r=>({...r,auth:{...r.auth,token:n}})),setAsAuthenticated:(n,r,a)=>e(o=>({...o,auth:{token:r??o.auth.token,uuid:n,loggedIn:!0,isAdmin:a??!1}})),logout:()=>e(n=>({...n,auth:{token:null,uuid:null,loggedIn:!1,isAdmin:!1}}))}}),{name:"auth-storage",storage:i_(()=>localStorage),partialize:({actions:e,...t})=>t})),VF=()=>{var e;return(e=s_().auth)==null?void 0:e.uuid},iY=()=>s_().actions,qF=()=>{const{auth:e}=s_();return e.token?`Bearer ${e.token}`:""},sY={BASE_URL:"/",MODE:"production",DEV:!1,PROD:!0,SSR:!1}.VITE_BASE_URL||"/api";function GF(e,t){return function(){return e.apply(t,arguments)}}const{toString:lY}=Object.prototype,{getPrototypeOf:l_}=Object,qm=(e=>t=>{const n=lY.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),Ha=e=>(e=e.toLowerCase(),t=>qm(t)===e),Gm=e=>t=>typeof t===e,{isArray:Mc}=Array,vd=Gm("undefined");function cY(e){return e!==null&&!vd(e)&&e.constructor!==null&&!vd(e.constructor)&&Gr(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const WF=Ha("ArrayBuffer");function uY(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&WF(e.buffer),t}const dY=Gm("string"),Gr=Gm("function"),KF=Gm("number"),Wm=e=>e!==null&&typeof e=="object",fY=e=>e===!0||e===!1,Bp=e=>{if(qm(e)!=="object")return!1;const t=l_(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)},pY=Ha("Date"),gY=Ha("File"),mY=Ha("Blob"),hY=Ha("FileList"),bY=e=>Wm(e)&&Gr(e.pipe),yY=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||Gr(e.append)&&((t=qm(e))==="formdata"||t==="object"&&Gr(e.toString)&&e.toString()==="[object FormData]"))},vY=Ha("URLSearchParams"),SY=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function af(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let r,a;if(typeof e!="object"&&(e=[e]),Mc(e))for(r=0,a=e.length;r0;)if(a=n[r],t===a.toLowerCase())return a;return null}const ZF=(()=>typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global)(),XF=e=>!vd(e)&&e!==ZF;function V1(){const{caseless:e}=XF(this)&&this||{},t={},n=(r,a)=>{const o=e&&YF(t,a)||a;Bp(t[o])&&Bp(r)?t[o]=V1(t[o],r):Bp(r)?t[o]=V1({},r):Mc(r)?t[o]=r.slice():t[o]=r};for(let r=0,a=arguments.length;r(af(t,(a,o)=>{n&&Gr(a)?e[o]=GF(a,n):e[o]=a},{allOwnKeys:r}),e),EY=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),xY=(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},kY=(e,t,n,r)=>{let a,o,i;const s={};if(t=t||{},e==null)return t;do{for(a=Object.getOwnPropertyNames(e),o=a.length;o-- >0;)i=a[o],(!r||r(i,e,t))&&!s[i]&&(t[i]=e[i],s[i]=!0);e=n!==!1&&l_(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},CY=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return r!==-1&&r===n},_Y=e=>{if(!e)return null;if(Mc(e))return e;let t=e.length;if(!KF(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},AY=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&l_(Uint8Array)),TY=(e,t)=>{const r=(e&&e[Symbol.iterator]).call(e);let a;for(;(a=r.next())&&!a.done;){const o=a.value;t.call(e,o[0],o[1])}},RY=(e,t)=>{let n;const r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},NY=Ha("HTMLFormElement"),IY=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,r,a){return r.toUpperCase()+a}),JR=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),OY=Ha("RegExp"),QF=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};af(n,(a,o)=>{let i;(i=t(a,o,e))!==!1&&(r[o]=i||a)}),Object.defineProperties(e,r)},DY=e=>{QF(e,(t,n)=>{if(Gr(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const r=e[n];if(Gr(r)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},LY=(e,t)=>{const n={},r=a=>{a.forEach(o=>{n[o]=!0})};return Mc(e)?r(e):r(String(e).split(t)),n},MY=()=>{},PY=(e,t)=>(e=+e,Number.isFinite(e)?e:t),_b="abcdefghijklmnopqrstuvwxyz",e2="0123456789",JF={DIGIT:e2,ALPHA:_b,ALPHA_DIGIT:_b+_b.toUpperCase()+e2},$Y=(e=16,t=JF.ALPHA_DIGIT)=>{let n="";const{length:r}=t;for(;e--;)n+=t[Math.random()*r|0];return n};function FY(e){return!!(e&&Gr(e.append)&&e[Symbol.toStringTag]==="FormData"&&e[Symbol.iterator])}const jY=e=>{const t=new Array(10),n=(r,a)=>{if(Wm(r)){if(t.indexOf(r)>=0)return;if(!("toJSON"in r)){t[a]=r;const o=Mc(r)?[]:{};return af(r,(i,s)=>{const l=n(i,a+1);!vd(l)&&(o[s]=l)}),t[a]=void 0,o}}return r};return n(e,0)},zY=Ha("AsyncFunction"),UY=e=>e&&(Wm(e)||Gr(e))&&Gr(e.then)&&Gr(e.catch),J={isArray:Mc,isArrayBuffer:WF,isBuffer:cY,isFormData:yY,isArrayBufferView:uY,isString:dY,isNumber:KF,isBoolean:fY,isObject:Wm,isPlainObject:Bp,isUndefined:vd,isDate:pY,isFile:gY,isBlob:mY,isRegExp:OY,isFunction:Gr,isStream:bY,isURLSearchParams:vY,isTypedArray:AY,isFileList:hY,forEach:af,merge:V1,extend:wY,trim:SY,stripBOM:EY,inherits:xY,toFlatObject:kY,kindOf:qm,kindOfTest:Ha,endsWith:CY,toArray:_Y,forEachEntry:TY,matchAll:RY,isHTMLForm:NY,hasOwnProperty:JR,hasOwnProp:JR,reduceDescriptors:QF,freezeMethods:DY,toObjectSet:LY,toCamelCase:IY,noop:MY,toFiniteNumber:PY,findKey:YF,global:ZF,isContextDefined:XF,ALPHABET:JF,generateString:$Y,isSpecCompliantForm:FY,toJSONObject:jY,isAsyncFn:zY,isThenable:UY};function st(e,t,n,r,a){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),a&&(this.response=a)}J.inherits(st,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:J.toJSONObject(this.config),code:this.code,status:this.response&&this.response.status?this.response.status:null}}});const e6=st.prototype,t6={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(e=>{t6[e]={value:e}});Object.defineProperties(st,t6);Object.defineProperty(e6,"isAxiosError",{value:!0});st.from=(e,t,n,r,a,o)=>{const i=Object.create(e6);return J.toFlatObject(e,i,function(l){return l!==Error.prototype},s=>s!=="isAxiosError"),st.call(i,e.message,t,n,r,a),i.cause=e,i.name=e.name,o&&Object.assign(i,o),i};const BY=null;function q1(e){return J.isPlainObject(e)||J.isArray(e)}function n6(e){return J.endsWith(e,"[]")?e.slice(0,-2):e}function t2(e,t,n){return e?e.concat(t).map(function(a,o){return a=n6(a),!n&&o?"["+a+"]":a}).join(n?".":""):t}function HY(e){return J.isArray(e)&&!e.some(q1)}const VY=J.toFlatObject(J,{},null,function(t){return/^is[A-Z]/.test(t)});function Km(e,t,n){if(!J.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=J.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(y,w){return!J.isUndefined(w[y])});const r=n.metaTokens,a=n.visitor||u,o=n.dots,i=n.indexes,l=(n.Blob||typeof Blob<"u"&&Blob)&&J.isSpecCompliantForm(t);if(!J.isFunction(a))throw new TypeError("visitor must be a function");function c(b){if(b===null)return"";if(J.isDate(b))return b.toISOString();if(!l&&J.isBlob(b))throw new st("Blob is not supported. Use a Buffer instead.");return J.isArrayBuffer(b)||J.isTypedArray(b)?l&&typeof Blob=="function"?new Blob([b]):Buffer.from(b):b}function u(b,y,w){let v=b;if(b&&!w&&typeof b=="object"){if(J.endsWith(y,"{}"))y=r?y:y.slice(0,-2),b=JSON.stringify(b);else if(J.isArray(b)&&HY(b)||(J.isFileList(b)||J.endsWith(y,"[]"))&&(v=J.toArray(b)))return y=n6(y),v.forEach(function(S,E){!(J.isUndefined(S)||S===null)&&t.append(i===!0?t2([y],E,o):i===null?y:y+"[]",c(S))}),!1}return q1(b)?!0:(t.append(t2(w,y,o),c(b)),!1)}const d=[],g=Object.assign(VY,{defaultVisitor:u,convertValue:c,isVisitable:q1});function m(b,y){if(!J.isUndefined(b)){if(d.indexOf(b)!==-1)throw Error("Circular reference detected in "+y.join("."));d.push(b),J.forEach(b,function(v,h){(!(J.isUndefined(v)||v===null)&&a.call(t,v,J.isString(h)?h.trim():h,y,g))===!0&&m(v,y?y.concat(h):[h])}),d.pop()}}if(!J.isObject(e))throw new TypeError("data must be an object");return m(e),t}function n2(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(r){return t[r]})}function c_(e,t){this._pairs=[],e&&Km(e,this,t)}const r6=c_.prototype;r6.append=function(t,n){this._pairs.push([t,n])};r6.toString=function(t){const n=t?function(r){return t.call(this,r,n2)}:n2;return this._pairs.map(function(a){return n(a[0])+"="+n(a[1])},"").join("&")};function qY(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function a6(e,t,n){if(!t)return e;const r=n&&n.encode||qY,a=n&&n.serialize;let o;if(a?o=a(t,n):o=J.isURLSearchParams(t)?t.toString():new c_(t,n).toString(r),o){const i=e.indexOf("#");i!==-1&&(e=e.slice(0,i)),e+=(e.indexOf("?")===-1?"?":"&")+o}return e}class GY{constructor(){this.handlers=[]}use(t,n,r){return this.handlers.push({fulfilled:t,rejected:n,synchronous:r?r.synchronous:!1,runWhen:r?r.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){J.forEach(this.handlers,function(r){r!==null&&t(r)})}}const r2=GY,o6={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},WY=typeof URLSearchParams<"u"?URLSearchParams:c_,KY=typeof FormData<"u"?FormData:null,YY=typeof Blob<"u"?Blob:null,ZY={isBrowser:!0,classes:{URLSearchParams:WY,FormData:KY,Blob:YY},protocols:["http","https","file","blob","url","data"]},i6=typeof window<"u"&&typeof document<"u",XY=(e=>i6&&["ReactNative","NativeScript","NS"].indexOf(e)<0)(typeof navigator<"u"&&navigator.product),QY=(()=>typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function")(),JY=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:i6,hasStandardBrowserEnv:XY,hasStandardBrowserWebWorkerEnv:QY},Symbol.toStringTag,{value:"Module"})),Ia={...JY,...ZY};function eZ(e,t){return Km(e,new Ia.classes.URLSearchParams,Object.assign({visitor:function(n,r,a,o){return Ia.isNode&&J.isBuffer(n)?(this.append(r,n.toString("base64")),!1):o.defaultVisitor.apply(this,arguments)}},t))}function tZ(e){return J.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function nZ(e){const t={},n=Object.keys(e);let r;const a=n.length;let o;for(r=0;r=n.length;return i=!i&&J.isArray(a)?a.length:i,l?(J.hasOwnProp(a,i)?a[i]=[a[i],r]:a[i]=r,!s):((!a[i]||!J.isObject(a[i]))&&(a[i]=[]),t(n,r,a[i],o)&&J.isArray(a[i])&&(a[i]=nZ(a[i])),!s)}if(J.isFormData(e)&&J.isFunction(e.entries)){const n={};return J.forEachEntry(e,(r,a)=>{t(tZ(r),a,n,0)}),n}return null}function rZ(e,t,n){if(J.isString(e))try{return(t||JSON.parse)(e),J.trim(e)}catch(r){if(r.name!=="SyntaxError")throw r}return(n||JSON.stringify)(e)}const u_={transitional:o6,adapter:["xhr","http"],transformRequest:[function(t,n){const r=n.getContentType()||"",a=r.indexOf("application/json")>-1,o=J.isObject(t);if(o&&J.isHTMLForm(t)&&(t=new FormData(t)),J.isFormData(t))return a?JSON.stringify(s6(t)):t;if(J.isArrayBuffer(t)||J.isBuffer(t)||J.isStream(t)||J.isFile(t)||J.isBlob(t))return t;if(J.isArrayBufferView(t))return t.buffer;if(J.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let s;if(o){if(r.indexOf("application/x-www-form-urlencoded")>-1)return eZ(t,this.formSerializer).toString();if((s=J.isFileList(t))||r.indexOf("multipart/form-data")>-1){const l=this.env&&this.env.FormData;return Km(s?{"files[]":t}:t,l&&new l,this.formSerializer)}}return o||a?(n.setContentType("application/json",!1),rZ(t)):t}],transformResponse:[function(t){const n=this.transitional||u_.transitional,r=n&&n.forcedJSONParsing,a=this.responseType==="json";if(t&&J.isString(t)&&(r&&!this.responseType||a)){const i=!(n&&n.silentJSONParsing)&&a;try{return JSON.parse(t)}catch(s){if(i)throw s.name==="SyntaxError"?st.from(s,st.ERR_BAD_RESPONSE,this,null,this.response):s}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Ia.classes.FormData,Blob:Ia.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};J.forEach(["delete","get","head","post","put","patch"],e=>{u_.headers[e]={}});const d_=u_,aZ=J.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),oZ=e=>{const t={};let n,r,a;return e&&e.split(` +`).forEach(function(i){a=i.indexOf(":"),n=i.substring(0,a).trim().toLowerCase(),r=i.substring(a+1).trim(),!(!n||t[n]&&aZ[n])&&(n==="set-cookie"?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)}),t},a2=Symbol("internals");function lu(e){return e&&String(e).trim().toLowerCase()}function Hp(e){return e===!1||e==null?e:J.isArray(e)?e.map(Hp):String(e)}function iZ(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}const sZ=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function Ab(e,t,n,r,a){if(J.isFunction(r))return r.call(this,t,n);if(a&&(t=n),!!J.isString(t)){if(J.isString(r))return t.indexOf(r)!==-1;if(J.isRegExp(r))return r.test(t)}}function lZ(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,r)=>n.toUpperCase()+r)}function cZ(e,t){const n=J.toCamelCase(" "+t);["get","set","has"].forEach(r=>{Object.defineProperty(e,r+n,{value:function(a,o,i){return this[r].call(this,t,a,o,i)},configurable:!0})})}class Ym{constructor(t){t&&this.set(t)}set(t,n,r){const a=this;function o(s,l,c){const u=lu(l);if(!u)throw new Error("header name must be a non-empty string");const d=J.findKey(a,u);(!d||a[d]===void 0||c===!0||c===void 0&&a[d]!==!1)&&(a[d||l]=Hp(s))}const i=(s,l)=>J.forEach(s,(c,u)=>o(c,u,l));return J.isPlainObject(t)||t instanceof this.constructor?i(t,n):J.isString(t)&&(t=t.trim())&&!sZ(t)?i(oZ(t),n):t!=null&&o(n,t,r),this}get(t,n){if(t=lu(t),t){const r=J.findKey(this,t);if(r){const a=this[r];if(!n)return a;if(n===!0)return iZ(a);if(J.isFunction(n))return n.call(this,a,r);if(J.isRegExp(n))return n.exec(a);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=lu(t),t){const r=J.findKey(this,t);return!!(r&&this[r]!==void 0&&(!n||Ab(this,this[r],r,n)))}return!1}delete(t,n){const r=this;let a=!1;function o(i){if(i=lu(i),i){const s=J.findKey(r,i);s&&(!n||Ab(r,r[s],s,n))&&(delete r[s],a=!0)}}return J.isArray(t)?t.forEach(o):o(t),a}clear(t){const n=Object.keys(this);let r=n.length,a=!1;for(;r--;){const o=n[r];(!t||Ab(this,this[o],o,t,!0))&&(delete this[o],a=!0)}return a}normalize(t){const n=this,r={};return J.forEach(this,(a,o)=>{const i=J.findKey(r,o);if(i){n[i]=Hp(a),delete n[o];return}const s=t?lZ(o):String(o).trim();s!==o&&delete n[o],n[s]=Hp(a),r[s]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return J.forEach(this,(r,a)=>{r!=null&&r!==!1&&(n[a]=t&&J.isArray(r)?r.join(", "):r)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+": "+n).join(` +`)}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const r=new this(t);return n.forEach(a=>r.set(a)),r}static accessor(t){const r=(this[a2]=this[a2]={accessors:{}}).accessors,a=this.prototype;function o(i){const s=lu(i);r[s]||(cZ(a,i),r[s]=!0)}return J.isArray(t)?t.forEach(o):o(t),this}}Ym.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);J.reduceDescriptors(Ym.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(r){this[n]=r}}});J.freezeMethods(Ym);const fo=Ym;function Tb(e,t){const n=this||d_,r=t||n,a=fo.from(r.headers);let o=r.data;return J.forEach(e,function(s){o=s.call(n,o,a.normalize(),t?t.status:void 0)}),a.normalize(),o}function l6(e){return!!(e&&e.__CANCEL__)}function of(e,t,n){st.call(this,e??"canceled",st.ERR_CANCELED,t,n),this.name="CanceledError"}J.inherits(of,st,{__CANCEL__:!0});function uZ(e,t,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new st("Request failed with status code "+n.status,[st.ERR_BAD_REQUEST,st.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}const dZ=Ia.hasStandardBrowserEnv?{write(e,t,n,r,a,o){const i=[e+"="+encodeURIComponent(t)];J.isNumber(n)&&i.push("expires="+new Date(n).toGMTString()),J.isString(r)&&i.push("path="+r),J.isString(a)&&i.push("domain="+a),o===!0&&i.push("secure"),document.cookie=i.join("; ")},read(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,"",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function fZ(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function pZ(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function c6(e,t){return e&&!fZ(t)?pZ(e,t):t}const gZ=Ia.hasStandardBrowserEnv?function(){const t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");let r;function a(o){let i=o;return t&&(n.setAttribute("href",i),i=n.href),n.setAttribute("href",i),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:n.pathname.charAt(0)==="/"?n.pathname:"/"+n.pathname}}return r=a(window.location.href),function(i){const s=J.isString(i)?a(i):i;return s.protocol===r.protocol&&s.host===r.host}}():function(){return function(){return!0}}();function mZ(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function hZ(e,t){e=e||10;const n=new Array(e),r=new Array(e);let a=0,o=0,i;return t=t!==void 0?t:1e3,function(l){const c=Date.now(),u=r[o];i||(i=c),n[a]=l,r[a]=c;let d=o,g=0;for(;d!==a;)g+=n[d++],d=d%e;if(a=(a+1)%e,a===o&&(o=(o+1)%e),c-i{const o=a.loaded,i=a.lengthComputable?a.total:void 0,s=o-n,l=r(s),c=o<=i;n=o;const u={loaded:o,total:i,progress:i?o/i:void 0,bytes:s,rate:l||void 0,estimated:l&&i&&c?(i-o)/l:void 0,event:a};u[t?"download":"upload"]=!0,e(u)}}const bZ=typeof XMLHttpRequest<"u",yZ=bZ&&function(e){return new Promise(function(n,r){let a=e.data;const o=fo.from(e.headers).normalize();let{responseType:i,withXSRFToken:s}=e,l;function c(){e.cancelToken&&e.cancelToken.unsubscribe(l),e.signal&&e.signal.removeEventListener("abort",l)}let u;if(J.isFormData(a)){if(Ia.hasStandardBrowserEnv||Ia.hasStandardBrowserWebWorkerEnv)o.setContentType(!1);else if((u=o.getContentType())!==!1){const[y,...w]=u?u.split(";").map(v=>v.trim()).filter(Boolean):[];o.setContentType([y||"multipart/form-data",...w].join("; "))}}let d=new XMLHttpRequest;if(e.auth){const y=e.auth.username||"",w=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";o.set("Authorization","Basic "+btoa(y+":"+w))}const g=c6(e.baseURL,e.url);d.open(e.method.toUpperCase(),a6(g,e.params,e.paramsSerializer),!0),d.timeout=e.timeout;function m(){if(!d)return;const y=fo.from("getAllResponseHeaders"in d&&d.getAllResponseHeaders()),v={data:!i||i==="text"||i==="json"?d.responseText:d.response,status:d.status,statusText:d.statusText,headers:y,config:e,request:d};uZ(function(S){n(S),c()},function(S){r(S),c()},v),d=null}if("onloadend"in d?d.onloadend=m:d.onreadystatechange=function(){!d||d.readyState!==4||d.status===0&&!(d.responseURL&&d.responseURL.indexOf("file:")===0)||setTimeout(m)},d.onabort=function(){d&&(r(new st("Request aborted",st.ECONNABORTED,e,d)),d=null)},d.onerror=function(){r(new st("Network Error",st.ERR_NETWORK,e,d)),d=null},d.ontimeout=function(){let w=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded";const v=e.transitional||o6;e.timeoutErrorMessage&&(w=e.timeoutErrorMessage),r(new st(w,v.clarifyTimeoutError?st.ETIMEDOUT:st.ECONNABORTED,e,d)),d=null},Ia.hasStandardBrowserEnv&&(s&&J.isFunction(s)&&(s=s(e)),s||s!==!1&&gZ(g))){const y=e.xsrfHeaderName&&e.xsrfCookieName&&dZ.read(e.xsrfCookieName);y&&o.set(e.xsrfHeaderName,y)}a===void 0&&o.setContentType(null),"setRequestHeader"in d&&J.forEach(o.toJSON(),function(w,v){d.setRequestHeader(v,w)}),J.isUndefined(e.withCredentials)||(d.withCredentials=!!e.withCredentials),i&&i!=="json"&&(d.responseType=e.responseType),typeof e.onDownloadProgress=="function"&&d.addEventListener("progress",o2(e.onDownloadProgress,!0)),typeof e.onUploadProgress=="function"&&d.upload&&d.upload.addEventListener("progress",o2(e.onUploadProgress)),(e.cancelToken||e.signal)&&(l=y=>{d&&(r(!y||y.type?new of(null,e,d):y),d.abort(),d=null)},e.cancelToken&&e.cancelToken.subscribe(l),e.signal&&(e.signal.aborted?l():e.signal.addEventListener("abort",l)));const b=mZ(g);if(b&&Ia.protocols.indexOf(b)===-1){r(new st("Unsupported protocol "+b+":",st.ERR_BAD_REQUEST,e));return}d.send(a||null)})},G1={http:BY,xhr:yZ};J.forEach(G1,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const i2=e=>`- ${e}`,vZ=e=>J.isFunction(e)||e===null||e===!1,u6={getAdapter:e=>{e=J.isArray(e)?e:[e];const{length:t}=e;let n,r;const a={};for(let o=0;o`adapter ${s} `+(l===!1?"is not supported by the environment":"is not available in the build"));let i=t?o.length>1?`since : `+o.map(i2).join(` -`):" "+i2(o[0]):"as no adapter specified";throw new st("There is no suitable adapter to dispatch the request "+i,"ERR_NOT_SUPPORT")}return r},adapters:q1};function Tb(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new of(null,e)}function s2(e){return Tb(e),e.headers=fo.from(e.headers),e.data=Ab.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),c6.getAdapter(e.adapter||u_.adapter)(e).then(function(r){return Tb(e),r.data=Ab.call(e,e.transformResponse,r),r.headers=fo.from(r.headers),r},function(r){return s6(r)||(Tb(e),r&&r.response&&(r.response.data=Ab.call(e,e.transformResponse,r.response),r.response.headers=fo.from(r.response.headers))),Promise.reject(r)})}const l2=e=>e instanceof fo?{...e}:e;function bc(e,t){t=t||{};const n={};function r(c,u,d){return J.isPlainObject(c)&&J.isPlainObject(u)?J.merge.call({caseless:d},c,u):J.isPlainObject(u)?J.merge({},u):J.isArray(u)?u.slice():u}function a(c,u,d){if(J.isUndefined(u)){if(!J.isUndefined(c))return r(void 0,c,d)}else return r(c,u,d)}function o(c,u){if(!J.isUndefined(u))return r(void 0,u)}function i(c,u){if(J.isUndefined(u)){if(!J.isUndefined(c))return r(void 0,c)}else return r(void 0,u)}function s(c,u,d){if(d in t)return r(c,u);if(d in e)return r(void 0,c)}const l={url:o,method:o,data:o,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutMessage:i,withCredentials:i,withXSRFToken:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,responseEncoding:i,validateStatus:s,headers:(c,u)=>a(l2(c),l2(u),!0)};return J.forEach(Object.keys(Object.assign({},e,t)),function(u){const d=l[u]||a,g=d(e[u],t[u],u);J.isUndefined(g)&&d!==s||(n[u]=g)}),n}const u6="1.6.8",d_={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{d_[e]=function(r){return typeof r===e||"a"+(t<1?"n ":" ")+e}});const c2={};d_.transitional=function(t,n,r){function a(o,i){return"[Axios v"+u6+"] Transitional option '"+o+"'"+i+(r?". "+r:"")}return(o,i,s)=>{if(t===!1)throw new st(a(i," has been removed"+(n?" in "+n:"")),st.ERR_DEPRECATED);return n&&!c2[i]&&(c2[i]=!0,console.warn(a(i," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(o,i,s):!0}};function SZ(e,t,n){if(typeof e!="object")throw new st("options must be an object",st.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let a=r.length;for(;a-- >0;){const o=r[a],i=t[o];if(i){const s=e[o],l=s===void 0||i(s,o,e);if(l!==!0)throw new st("option "+o+" must be "+l,st.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new st("Unknown option "+o,st.ERR_BAD_OPTION)}}const G1={assertOptions:SZ,validators:d_},Mo=G1.validators;class Rg{constructor(t){this.defaults=t,this.interceptors={request:new r2,response:new r2}}async request(t,n){try{return await this._request(t,n)}catch(r){if(r instanceof Error){let a;Error.captureStackTrace?Error.captureStackTrace(a={}):a=new Error;const o=a.stack?a.stack.replace(/^.+\n/,""):"";r.stack?o&&!String(r.stack).endsWith(o.replace(/^.+\n.+\n/,""))&&(r.stack+=` -`+o):r.stack=o}throw r}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=bc(this.defaults,n);const{transitional:r,paramsSerializer:a,headers:o}=n;r!==void 0&&G1.assertOptions(r,{silentJSONParsing:Mo.transitional(Mo.boolean),forcedJSONParsing:Mo.transitional(Mo.boolean),clarifyTimeoutError:Mo.transitional(Mo.boolean)},!1),a!=null&&(J.isFunction(a)?n.paramsSerializer={serialize:a}:G1.assertOptions(a,{encode:Mo.function,serialize:Mo.function},!0)),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i=o&&J.merge(o.common,o[n.method]);o&&J.forEach(["delete","get","head","post","put","patch","common"],b=>{delete o[b]}),n.headers=fo.concat(i,o);const s=[];let l=!0;this.interceptors.request.forEach(function(y){typeof y.runWhen=="function"&&y.runWhen(n)===!1||(l=l&&y.synchronous,s.unshift(y.fulfilled,y.rejected))});const c=[];this.interceptors.response.forEach(function(y){c.push(y.fulfilled,y.rejected)});let u,d=0,g;if(!l){const b=[s2.bind(this),void 0];for(b.unshift.apply(b,s),b.push.apply(b,c),g=b.length,u=Promise.resolve(n);d{if(!r._listeners)return;let o=r._listeners.length;for(;o-- >0;)r._listeners[o](a);r._listeners=null}),this.promise.then=a=>{let o;const i=new Promise(s=>{r.subscribe(s),o=s}).then(a);return i.cancel=function(){r.unsubscribe(o)},i},t(function(o,i,s){r.reason||(r.reason=new of(o,i,s),n(r.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}static source(){let t;return{token:new f_(function(a){t=a}),cancel:t}}}const wZ=f_;function EZ(e){return function(n){return e.apply(null,n)}}function xZ(e){return J.isObject(e)&&e.isAxiosError===!0}const W1={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(W1).forEach(([e,t])=>{W1[t]=e});const kZ=W1;function d6(e){const t=new Vp(e),n=qF(Vp.prototype.request,t);return J.extend(n,Vp.prototype,t,{allOwnKeys:!0}),J.extend(n,t,null,{allOwnKeys:!0}),n.create=function(a){return d6(bc(e,a))},n}const rn=d6(u_);rn.Axios=Vp;rn.CanceledError=of;rn.CancelToken=wZ;rn.isCancel=s6;rn.VERSION=u6;rn.toFormData=Km;rn.AxiosError=st;rn.Cancel=rn.CanceledError;rn.all=function(t){return Promise.all(t)};rn.spread=EZ;rn.isAxiosError=xZ;rn.mergeConfig=bc;rn.AxiosHeaders=fo;rn.formToJSON=e=>i6(J.isHTMLForm(e)?new FormData(e):e);rn.getAdapter=c6.getAdapter;rn.HttpStatusCode=kZ;rn.default=rn;const f6=rn,CZ={baseURL:sY,headers:{"Content-Type":"application/json","Cache-Control":"no-cache"}},cl=f6.create(CZ),_Z=()=>cl,AZ=({children:e})=>{const[t,n]=p.useState(!1),r=Mi(),a=VF();return p.useEffect(()=>{const o=s=>s,i=s=>Promise.reject(s);cl.interceptors.response.use(o,i)},[r,cl]),p.useEffect(()=>{const o=s=>(s.headers.Authorization=a||"",s),i=cl.interceptors.request.use(o);return()=>{cl.interceptors.request.eject(i)}},[a,cl]),p.useEffect(()=>{t||setTimeout(()=>n(!0),10)},[t]),t?e:f.jsx("div",{className:"sr-only",children:"Re-authenticating..."})},TZ="ToolsServiceListTools",p_=({userId:e}={},t)=>[TZ,...t??[{userId:e}]],RZ="SourcesServiceListSources",sf=({userId:e}={},t)=>[RZ,...t??[{userId:e}]],NZ="AgentsServiceListAgents",p6=({userId:e}={},t)=>[NZ,...t??[{userId:e}]],IZ="AgentsServiceGetAgent",$s=({agentId:e,userId:t},n)=>[IZ,...n??[{agentId:e,userId:t}]],OZ="AgentsServiceGetAgentSources",g6=({agentId:e},t)=>[OZ,...t??[{agentId:e}]],DZ="AgentsServiceListAgentArchivalMemory",m6=({after:e,agentId:t,before:n,limit:r,userId:a},o)=>[DZ,...o??[{after:e,agentId:t,before:n,limit:r,userId:a}]],LZ="AgentsServiceListAgentMessages",MZ=({agentId:e,assistantMessageFunctionKwarg:t,assistantMessageFunctionName:n,before:r,limit:a,msgObject:o,useAssistantMessage:i,userId:s},l)=>[LZ,...l??[{agentId:e,assistantMessageFunctionKwarg:t,assistantMessageFunctionName:n,before:r,limit:a,msgObject:o,useAssistantMessage:i,userId:s}]],PZ="ModelsServiceListModels",$Z=e=>[PZ,...e??[]],FZ="LlmsServiceListEmbeddingModels",jZ=e=>[FZ,...e??[]],zZ="BlocksServiceListMemoryBlocks",lf=({label:e,name:t,templatesOnly:n,userId:r}={},a)=>[zZ,...a??[{label:e,name:t,templatesOnly:n,userId:r}]],UZ="JobsServiceListJobs",BZ=({sourceId:e,userId:t}={},n)=>[UZ,...n??[{sourceId:e,userId:t}]],HZ="JobsServiceListActiveJobs",h6=({userId:e}={},t)=>[HZ,...t??[{userId:e}]];class u2{constructor(){this._fns=[]}eject(t){const n=this._fns.indexOf(t);n!==-1&&(this._fns=[...this._fns.slice(0,n),...this._fns.slice(n+1)])}use(t){this._fns=[...this._fns,t]}}const Ie={CREDENTIALS:"include",ENCODE_PATH:void 0,HEADERS:void 0,PASSWORD:void 0,TOKEN:void 0,USERNAME:void 0,VERSION:"1.0.0",WITH_CREDENTIALS:!1,interceptors:{request:new u2,response:new u2},BASE:""};class d2 extends Error{constructor(t,n,r){super(r),this.name="ApiError",this.url=n.url,this.status=n.status,this.statusText=n.statusText,this.body=n.body,this.request=t}}class VZ extends Error{constructor(t){super(t),this.name="CancelError"}get isCancelled(){return!0}}class qZ{constructor(t){this._isResolved=!1,this._isRejected=!1,this._isCancelled=!1,this.cancelHandlers=[],this.promise=new Promise((n,r)=>{this._resolve=n,this._reject=r;const a=s=>{this._isResolved||this._isRejected||this._isCancelled||(this._isResolved=!0,this._resolve&&this._resolve(s))},o=s=>{this._isResolved||this._isRejected||this._isCancelled||(this._isRejected=!0,this._reject&&this._reject(s))},i=s=>{this._isResolved||this._isRejected||this._isCancelled||this.cancelHandlers.push(s)};return Object.defineProperty(i,"isResolved",{get:()=>this._isResolved}),Object.defineProperty(i,"isRejected",{get:()=>this._isRejected}),Object.defineProperty(i,"isCancelled",{get:()=>this._isCancelled}),t(a,o,i)})}get[Symbol.toStringTag](){return"Cancellable Promise"}then(t,n){return this.promise.then(t,n)}catch(t){return this.promise.catch(t)}finally(t){return this.promise.finally(t)}cancel(){if(!(this._isResolved||this._isRejected||this._isCancelled)){if(this._isCancelled=!0,this.cancelHandlers.length)try{for(const t of this.cancelHandlers)t()}catch(t){console.warn("Cancellation threw an error",t);return}this.cancelHandlers.length=0,this._reject&&this._reject(new VZ("Request aborted"))}}get isCancelled(){return this._isCancelled}}const Zm=e=>typeof e=="string",Rb=e=>Zm(e)&&e!=="",b6=e=>e instanceof Blob,GZ=e=>e instanceof FormData,f2=e=>e>=200&&e<300,WZ=e=>{try{return btoa(e)}catch{return Buffer.from(e).toString("base64")}},KZ=e=>{const t=[],n=(a,o)=>{t.push(`${encodeURIComponent(a)}=${encodeURIComponent(String(o))}`)},r=(a,o)=>{o!=null&&(o instanceof Date?n(a,o.toISOString()):Array.isArray(o)?o.forEach(i=>r(a,i)):typeof o=="object"?Object.entries(o).forEach(([i,s])=>r(`${a}[${i}]`,s)):n(a,o))};return Object.entries(e).forEach(([a,o])=>r(a,o)),t.length?`?${t.join("&")}`:""},YZ=(e,t)=>{const n=e.ENCODE_PATH||encodeURI,r=t.url.replace("{api-version}",e.VERSION).replace(/{(.*?)}/g,(o,i)=>{var s;return(s=t.path)!=null&&s.hasOwnProperty(i)?n(String(t.path[i])):o}),a=e.BASE+r;return t.query?a+KZ(t.query):a},ZZ=e=>{if(e.formData){const t=new FormData,n=(r,a)=>{Zm(a)||b6(a)?t.append(r,a):t.append(r,JSON.stringify(a))};return Object.entries(e.formData).filter(([,r])=>r!=null).forEach(([r,a])=>{Array.isArray(a)?a.forEach(o=>n(r,o)):n(r,a)}),t}},Yf=async(e,t)=>typeof t=="function"?t(e):t,XZ=async(e,t)=>{const[n,r,a,o]=await Promise.all([Yf(t,e.TOKEN),Yf(t,e.USERNAME),Yf(t,e.PASSWORD),Yf(t,e.HEADERS)]),i=Object.entries({Accept:"application/json",...o,...t.headers}).filter(([,s])=>s!=null).reduce((s,[l,c])=>({...s,[l]:String(c)}),{});if(Rb(n)&&(i.Authorization=`Bearer ${n}`),Rb(r)&&Rb(a)){const s=WZ(`${r}:${a}`);i.Authorization=`Basic ${s}`}return t.body!==void 0?t.mediaType?i["Content-Type"]=t.mediaType:b6(t.body)?i["Content-Type"]=t.body.type||"application/octet-stream":Zm(t.body)?i["Content-Type"]="text/plain":GZ(t.body)||(i["Content-Type"]="application/json"):t.formData!==void 0&&t.mediaType&&(i["Content-Type"]=t.mediaType),i},QZ=e=>{if(e.body)return e.body},JZ=async(e,t,n,r,a,o,i,s)=>{const l=new AbortController;let c={data:r??a,headers:o,method:t.method,signal:l.signal,url:n,withCredentials:e.WITH_CREDENTIALS};i(()=>l.abort());for(const u of e.interceptors.request._fns)c=await u(c);try{return await s.request(c)}catch(u){const d=u;if(d.response)return d.response;throw u}},eX=(e,t)=>{if(t){const n=e.headers[t];if(Zm(n))return n}},tX=e=>{if(e.status!==204)return e.data},nX=(e,t)=>{const r={400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",406:"Not Acceptable",407:"Proxy Authentication Required",408:"Request Timeout",409:"Conflict",410:"Gone",411:"Length Required",412:"Precondition Failed",413:"Payload Too Large",414:"URI Too Long",415:"Unsupported Media Type",416:"Range Not Satisfiable",417:"Expectation Failed",418:"Im a teapot",421:"Misdirected Request",422:"Unprocessable Content",423:"Locked",424:"Failed Dependency",425:"Too Early",426:"Upgrade Required",428:"Precondition Required",429:"Too Many Requests",431:"Request Header Fields Too Large",451:"Unavailable For Legal Reasons",500:"Internal Server Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout",505:"HTTP Version Not Supported",506:"Variant Also Negotiates",507:"Insufficient Storage",508:"Loop Detected",510:"Not Extended",511:"Network Authentication Required",...e.errors}[t.status];if(r)throw new d2(e,t,r);if(!t.ok){const a=t.status??"unknown",o=t.statusText??"unknown",i=(()=>{try{return JSON.stringify(t.body,null,2)}catch{return}})();throw new d2(e,t,`Generic Error: status: ${a}; status text: ${o}; body: ${i}`)}},Pe=(e,t,n=f6)=>new qZ(async(r,a,o)=>{try{const i=YZ(e,t),s=ZZ(t),l=QZ(t),c=await XZ(e,t);if(!o.isCancelled){let u=await JZ(e,t,i,l,s,c,o,n);for(const y of e.interceptors.response._fns)u=await y(u);const d=tX(u),g=eX(u,t.responseHeader);let m=d;t.responseTransformer&&f2(u.status)&&(m=await t.responseTransformer(d));const b={url:i,ok:f2(u.status),status:u.status,statusText:u.statusText,body:g??m};nX(t,b),r(b.body)}}catch(i){a(i)}});class g_{static deleteTool(t,n){return Pe(Ie,{method:"DELETE",url:"/v1/tools/{tool_id}",path:{tool_id:t.toolId},errors:{422:"Validation Error"},headers:n})}static getTool(t,n){return Pe(Ie,{method:"GET",url:"/v1/tools/{tool_id}",path:{tool_id:t.toolId},errors:{422:"Validation Error"},headers:n})}static updateTool(t,n){return Pe(Ie,{method:"PATCH",url:"/v1/tools/{tool_id}",path:{tool_id:t.toolId},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static getToolIdByName(t,n){return Pe(Ie,{method:"GET",url:"/v1/tools/name/{tool_name}",path:{tool_name:t.toolName},errors:{422:"Validation Error"},headers:n})}static listTools(t={},n){return Pe(Ie,{method:"GET",url:"/v1/tools/",errors:{422:"Validation Error"},headers:n})}static createTool(t,n){return Pe(Ie,{method:"POST",url:"/v1/tools/",query:{update:t.update},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}}class Pc{static getSource(t,n){return Pe(Ie,{method:"GET",url:"/v1/sources/{source_id}",path:{source_id:t.sourceId},errors:{422:"Validation Error"},headers:n})}static updateSource(t,n){return Pe(Ie,{method:"PATCH",url:"/v1/sources/{source_id}",path:{source_id:t.sourceId},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static deleteSource(t,n){return Pe(Ie,{method:"DELETE",url:"/v1/sources/{source_id}",path:{source_id:t.sourceId},errors:{422:"Validation Error"},headers:n})}static getSourceIdByName(t,n){return Pe(Ie,{method:"GET",url:"/v1/sources/name/{source_name}",path:{source_name:t.sourceName},errors:{422:"Validation Error"},headers:n})}static listSources(t={},n){return Pe(Ie,{method:"GET",url:"/v1/sources/",errors:{422:"Validation Error"},headers:n})}static createSource(t,n){return Pe(Ie,{method:"POST",url:"/v1/sources/",body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static attachAgentToSource(t,n){return Pe(Ie,{method:"POST",url:"/v1/sources/{source_id}/attach",path:{source_id:t.sourceId},query:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static detachAgentFromSource(t,n){return Pe(Ie,{method:"POST",url:"/v1/sources/{source_id}/detach",path:{source_id:t.sourceId},query:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static uploadFileToSource(t,n){return Pe(Ie,{method:"POST",url:"/v1/sources/{source_id}/upload",path:{source_id:t.sourceId},formData:t.formData,mediaType:"multipart/form-data",errors:{422:"Validation Error"},headers:n})}static listSourcePassages(t,n){return Pe(Ie,{method:"GET",url:"/v1/sources/{source_id}/passages",path:{source_id:t.sourceId},errors:{422:"Validation Error"},headers:n})}static listFilesFromSource(t,n){return Pe(Ie,{method:"GET",url:"/v1/sources/{source_id}/files",path:{source_id:t.sourceId},query:{limit:t.limit,cursor:t.cursor},errors:{422:"Validation Error"},headers:n})}}class Va{static listAgents(t={},n){return Pe(Ie,{method:"GET",url:"/v1/agents/",errors:{422:"Validation Error"},headers:n})}static createAgent(t,n){return Pe(Ie,{method:"POST",url:"/v1/agents/",body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static updateAgent(t,n){return Pe(Ie,{method:"PATCH",url:"/v1/agents/{agent_id}",path:{agent_id:t.agentId},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static getAgent(t,n){return Pe(Ie,{method:"GET",url:"/v1/agents/{agent_id}",path:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static deleteAgent(t,n){return Pe(Ie,{method:"DELETE",url:"/v1/agents/{agent_id}",path:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static getAgentSources(t,n){return Pe(Ie,{method:"GET",url:"/v1/agents/{agent_id}/sources",path:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static listAgentInContextMessages(t,n){return Pe(Ie,{method:"GET",url:"/v1/agents/{agent_id}/memory/messages",path:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static getAgentMemory(t,n){return Pe(Ie,{method:"GET",url:"/v1/agents/{agent_id}/memory",path:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static updateAgentMemory(t,n){return Pe(Ie,{method:"PATCH",url:"/v1/agents/{agent_id}/memory",path:{agent_id:t.agentId},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static getAgentRecallMemorySummary(t,n){return Pe(Ie,{method:"GET",url:"/v1/agents/{agent_id}/memory/recall",path:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static getAgentArchivalMemorySummary(t,n){return Pe(Ie,{method:"GET",url:"/v1/agents/{agent_id}/memory/archival",path:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static listAgentArchivalMemory(t,n){return Pe(Ie,{method:"GET",url:"/v1/agents/{agent_id}/archival",path:{agent_id:t.agentId},query:{after:t.after,before:t.before,limit:t.limit},errors:{422:"Validation Error"},headers:n})}static createAgentArchivalMemory(t,n){return Pe(Ie,{method:"POST",url:"/v1/agents/{agent_id}/archival",path:{agent_id:t.agentId},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static deleteAgentArchivalMemory(t,n){return Pe(Ie,{method:"DELETE",url:"/v1/agents/{agent_id}/archival/{memory_id}",path:{agent_id:t.agentId,memory_id:t.memoryId},errors:{422:"Validation Error"},headers:n})}static listAgentMessages(t,n){return Pe(Ie,{method:"GET",url:"/v1/agents/{agent_id}/messages",path:{agent_id:t.agentId},query:{before:t.before,limit:t.limit,msg_object:t.msgObject,use_assistant_message:t.useAssistantMessage,assistant_message_tool_name:t.assistantMessageFunctionName,assistant_message_tool_kwarg:t.assistantMessageFunctionKwarg},errors:{422:"Validation Error"},headers:n})}static createAgentMessage(t,n){return Pe(Ie,{method:"POST",url:"/v1/agents/{agent_id}/messages",path:{agent_id:t.agentId},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static updateAgentMessage(t,n){return Pe(Ie,{method:"PATCH",url:"/v1/agents/{agent_id}/messages/{message_id}",path:{agent_id:t.agentId,message_id:t.messageId},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}}class rX{static listModels(t){return Pe(Ie,{method:"GET",url:"/v1/models/",headers:t})}static listEmbeddingModels(t){return Pe(Ie,{method:"GET",url:"/v1/models/embedding",headers:t})}}class aX{static listModels(t){return Pe(Ie,{method:"GET",url:"/v1/models/",headers:t})}static listEmbeddingModels(t){return Pe(Ie,{method:"GET",url:"/v1/models/embedding",headers:t})}}class m_{static listMemoryBlocks(t={},n){return Pe(Ie,{method:"GET",url:"/v1/blocks/",query:{label:t.label,templates_only:t.templatesOnly,name:t.name},errors:{422:"Validation Error"},headers:n})}static createMemoryBlock(t,n){return Pe(Ie,{method:"POST",url:"/v1/blocks/",body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static updateMemoryBlock(t,n){return Pe(Ie,{method:"PATCH",url:"/v1/blocks/{block_id}",path:{block_id:t.blockId},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static deleteMemoryBlock(t,n){return Pe(Ie,{method:"DELETE",url:"/v1/blocks/{block_id}",path:{block_id:t.blockId},errors:{422:"Validation Error"},headers:n})}static getMemoryBlock(t,n){return Pe(Ie,{method:"GET",url:"/v1/blocks/{block_id}",path:{block_id:t.blockId},errors:{422:"Validation Error"},headers:n})}}class oX{static listJobs(t={},n){return Pe(Ie,{method:"GET",url:"/v1/jobs/",query:{source_id:t.sourceId},errors:{422:"Validation Error"},headers:n})}static listActiveJobs(t={},n){return Pe(Ie,{method:"GET",url:"/v1/jobs/active",errors:{422:"Validation Error"},headers:n})}static getJob(t,n){return Pe(Ie,{method:"GET",url:"/v1/jobs/{job_id}",path:{job_id:t.jobId},errors:{422:"Validation Error"},headers:n})}static deleteJob(t,n){return Pe(Ie,{method:"DELETE",url:"/v1/jobs/{job_id}",path:{job_id:t.jobId},errors:{422:"Validation Error"},headers:n})}}const Xm=({userId:e}={},t,n)=>Jr({queryKey:p_({userId:e},t),queryFn:()=>g_.listTools({userId:e}),...n}),h_=({userId:e}={},t,n)=>Jr({queryKey:sf({userId:e},t),queryFn:()=>Pc.listSources({userId:e}),...n}),Qm=({userId:e}={},t,n)=>Jr({queryKey:p6({userId:e},t),queryFn:()=>Va.listAgents({userId:e}),...n}),b_=({agentId:e,userId:t},n,r)=>Jr({queryKey:$s({agentId:e,userId:t},n),queryFn:()=>Va.getAgent({agentId:e,userId:t}),...r}),y6=({agentId:e},t,n)=>Jr({queryKey:g6({agentId:e},t),queryFn:()=>Va.getAgentSources({agentId:e}),...n}),v6=({after:e,agentId:t,before:n,limit:r,userId:a},o,i)=>Jr({queryKey:m6({after:e,agentId:t,before:n,limit:r,userId:a},o),queryFn:()=>Va.listAgentArchivalMemory({after:e,agentId:t,before:n,limit:r,userId:a}),...i}),iX=({agentId:e,assistantMessageFunctionKwarg:t,assistantMessageFunctionName:n,before:r,limit:a,msgObject:o,useAssistantMessage:i,userId:s},l,c)=>Jr({queryKey:MZ({agentId:e,assistantMessageFunctionKwarg:t,assistantMessageFunctionName:n,before:r,limit:a,msgObject:o,useAssistantMessage:i,userId:s},l),queryFn:()=>Va.listAgentMessages({agentId:e,assistantMessageFunctionKwarg:t,assistantMessageFunctionName:n,before:r,limit:a,msgObject:o,useAssistantMessage:i,userId:s}),...c}),S6=(e,t)=>Jr({queryKey:$Z(e),queryFn:()=>rX.listModels(),...t}),w6=(e,t)=>Jr({queryKey:jZ(e),queryFn:()=>aX.listEmbeddingModels(),...t}),Ng=({label:e,name:t,templatesOnly:n,userId:r}={},a,o)=>Jr({queryKey:lf({label:e,name:t,templatesOnly:n,userId:r},a),queryFn:()=>m_.listMemoryBlocks({label:e,name:t,templatesOnly:n,userId:r}),...o}),sX=({userId:e}={},t,n)=>Jr({queryKey:h6({userId:e},t),queryFn:()=>oX.listActiveJobs({userId:e}),...n}),lX=e=>gr({mutationFn:({requestBody:t,update:n,userId:r})=>g_.createTool({requestBody:t,update:n,userId:r}),...e}),cX=e=>gr({mutationFn:({requestBody:t,userId:n})=>Pc.createSource({requestBody:t,userId:n}),...e}),E6=e=>gr({mutationFn:({agentId:t,sourceId:n,userId:r})=>Pc.attachAgentToSource({agentId:t,sourceId:n,userId:r}),...e}),x6=e=>gr({mutationFn:({agentId:t,sourceId:n,userId:r})=>Pc.detachAgentFromSource({agentId:t,sourceId:n,userId:r}),...e}),k6=e=>gr({mutationFn:({formData:t,sourceId:n,userId:r})=>Pc.uploadFileToSource({formData:t,sourceId:n,userId:r}),...e}),uX=e=>gr({mutationFn:({requestBody:t,userId:n})=>Va.createAgent({requestBody:t,userId:n}),...e}),dX=e=>gr({mutationFn:({agentId:t,requestBody:n,userId:r})=>Va.createAgentArchivalMemory({agentId:t,requestBody:n,userId:r}),...e}),C6=e=>gr({mutationFn:({requestBody:t,userId:n})=>m_.createMemoryBlock({requestBody:t,userId:n}),...e}),fX=e=>gr({mutationFn:({requestBody:t,toolId:n,userId:r})=>g_.updateTool({requestBody:t,toolId:n,userId:r}),...e}),pX=e=>gr({mutationFn:({requestBody:t,sourceId:n,userId:r})=>Pc.updateSource({requestBody:t,sourceId:n,userId:r}),...e}),cf=e=>gr({mutationFn:({agentId:t,requestBody:n,userId:r})=>Va.updateAgent({agentId:t,requestBody:n,userId:r}),...e}),y_=e=>gr({mutationFn:({blockId:t,requestBody:n})=>m_.updateMemoryBlock({blockId:t,requestBody:n}),...e}),gX=e=>gr({mutationFn:({agentId:t,userId:n})=>Va.deleteAgent({agentId:t,userId:n}),...e}),mX=e=>gr({mutationFn:({agentId:t,memoryId:n,userId:r})=>Va.deleteAgentArchivalMemory({agentId:t,memoryId:n,userId:r}),...e});Ie.BASE="";Ie.HEADERS={"Content-Type":"application/json","Cache-Control":"no-cache"};const hX=({children:e})=>{const[t,n]=p.useState(!1),r=VF(),a=Mi();return p.useEffect(()=>{const o=i=>i;return Ie.interceptors.response.use(o),()=>{Ie.interceptors.response.eject(o)}},[a]),p.useEffect(()=>{const o=i=>(i.headers={...i.headers,Authorization:"Bearer password"},i);return Ie.interceptors.request.use(o),()=>{Ie.interceptors.request.eject(o)}},[r]),p.useEffect(()=>{t||setTimeout(()=>n(!0),10)},[t]),t?e:f.jsx("div",{className:"sr-only",children:"Re-authenticating..."})},yc=ef("inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground hover:bg-destructive/90",outline:"border border-input bg-background hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3",xs:"text-xs h-7 rounded-md px-3",lg:"h-11 rounded-md px-8",icon:"h-10 w-10",iconSm:"h-9 w-9",iconXs:"h-7 w-7"}},defaultVariants:{variant:"default",size:"default"}});function p2({isBusy:e,icon:t}){return e?f.jsx(un,{className:"h-4 w-4 animate-spin"}):t||null}const ue=p.forwardRef(({className:e,children:t,label:n,isBusy:r,icon:a,iconPosition:o="left",disabled:i,variant:s,size:l,asChild:c=!1,...u},d)=>{const g=c?$a:"button",m=p.useMemo(()=>i||r,[i,r]),b=p.useMemo(()=>a||o?"flex items-center gap-1":"",[a,o]);return f.jsxs(g,{className:ee(b,yc({variant:s,size:l,className:e})),disabled:m,ref:d,...u,children:[o==="left"&&f.jsx(p2,{isBusy:r??!1,icon:a??null}),f.jsx(Rm,{children:t}),o==="right"&&f.jsx(p2,{isBusy:r??!1,icon:a??null})]})});ue.displayName="Button";const Fs=({children:e,className:t})=>f.jsx("div",{className:ee("h-full w-full overflow-auto",t),children:e});function Zf({children:e,className:t}){return f.jsx("div",{className:ee("flex justify-center text-muted-foreground",t),children:e})}function bX(e){return f.jsxs("svg",{viewBox:"0 0 20 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e,children:[f.jsx("path",{d:"M5.21875 8.90625H3.84375C3.46875 8.90625 3.125 9.21875 3.125 9.625C3.125 10.0313 3.4375 10.3437 3.84375 10.3437H5.21875C5.59375 10.3437 5.9375 10.0313 5.9375 9.625C5.9375 9.21875 5.59375 8.90625 5.21875 8.90625Z",fill:"currentColor"}),f.jsx("path",{d:"M12.875 8.90625H11.5C11.125 8.90625 10.7812 9.21875 10.7812 9.625C10.7812 10.0313 11.0937 10.3437 11.5 10.3437H12.875C13.25 10.3437 13.5938 10.0313 13.5938 9.625C13.5938 9.21875 13.25 8.90625 12.875 8.90625Z",fill:"currentColor"}),f.jsx("path",{d:"M17.7187 8.09375V3.9375C18.5 3.65625 19.0312 2.90625 19.0312 2.0625C19.0312 0.9375 18.125 0.03125 17 0.03125C15.875 0.03125 14.9687 0.9375 14.9687 2.0625C14.9687 2.9375 15.5312 3.65625 16.2812 3.9375V8.0625H15.9375V7.84375C15.9375 6.59375 14.9062 5.5625 13.6562 5.5625H11.875V4.875C11.875 3.84375 11.0312 3.03125 10.0312 3.03125H9.0625V0.96875C9.0625 0.59375 8.75 0.25 8.34375 0.25C7.9375 0.25 7.625 0.5625 7.625 0.96875V3.03125H6.625C5.59375 3.03125 4.78125 3.875 4.78125 4.875V5.5625H2.8125C1.5625 5.5625 0.53125 6.59375 0.53125 7.84375V13.6875C0.53125 14.9375 1.5625 15.9688 2.8125 15.9688H13.6875C14.9375 15.9688 15.9687 14.9375 15.9687 13.6875V13.4688H17.625C18.6562 13.4688 19.4687 12.625 19.4687 11.625V9.96875C19.4687 8.9375 18.6875 8.15625 17.7187 8.09375ZM17 1.4375C17.3437 1.4375 17.625 1.71875 17.625 2.0625C17.625 2.40625 17.3437 2.6875 17 2.6875C16.6562 2.6875 16.375 2.40625 16.375 2.0625C16.375 1.71875 16.6562 1.4375 17 1.4375ZM6.21875 4.875C6.21875 4.625 6.40625 4.4375 6.65625 4.4375H10.0312C10.2812 4.4375 10.4687 4.625 10.4687 4.875V5.5625H6.21875V4.875ZM14.5312 13.6875C14.5312 14.1562 14.1562 14.5625 13.6562 14.5625H2.8125C2.34375 14.5625 1.9375 14.1875 1.9375 13.6875V7.84375C1.9375 7.375 2.3125 6.96875 2.8125 6.96875H13.6875C14.1562 6.96875 14.5625 7.34375 14.5625 7.84375V13.6875H14.5312ZM18.0625 11.5938C18.0625 11.8438 17.875 12.0312 17.625 12.0312H15.9375V9.46875H17.5937C17.8437 9.46875 18.0312 9.65625 18.0312 9.90625V11.5938H18.0625Z",fill:"currentColor"}),f.jsx("path",{d:"M9.5 11.125C9.125 11.125 8.78125 11.4375 8.78125 11.8437C8.78125 12.0937 8.59375 12.2813 8.34375 12.2813C8.09375 12.2813 7.90625 12.0937 7.90625 11.8437C7.90625 11.4687 7.59375 11.125 7.1875 11.125C6.78125 11.125 6.46875 11.4375 6.46875 11.8437C6.46875 12.875 7.3125 13.6875 8.3125 13.6875C9.3125 13.6875 10.1562 12.8437 10.1562 11.8437C10.1875 11.4375 9.875 11.125 9.5 11.125Z",fill:"currentColor"})]})}function yX(e){return f.jsx("svg",{viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e,children:f.jsx("path",{d:"M8.00039 11.3998C7.85039 11.3998 7.72539 11.3498 7.60039 11.2498L1.85039 5.5998C1.62539 5.3748 1.62539 5.0248 1.85039 4.7998C2.07539 4.5748 2.42539 4.5748 2.65039 4.7998L8.00039 10.0248L13.3504 4.7498C13.5754 4.5248 13.9254 4.5248 14.1504 4.7498C14.3754 4.9748 14.3754 5.3248 14.1504 5.5498L8.40039 11.1998C8.27539 11.3248 8.15039 11.3998 8.00039 11.3998Z",fill:"currentColor"})})}function vX(e){return f.jsx("svg",{viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e,children:f.jsx("path",{d:"M13.7504 11.4002C13.6004 11.4002 13.4754 11.3502 13.3504 11.2502L8.00039 5.9752L2.65039 11.2252C2.42539 11.4502 2.07539 11.4502 1.85039 11.2252C1.62539 11.0002 1.62539 10.6502 1.85039 10.4252L7.60039 4.7752C7.82539 4.5502 8.17539 4.5502 8.40039 4.7752L14.1504 10.4252C14.3754 10.6502 14.3754 11.0002 14.1504 11.2252C14.0504 11.3252 13.9004 11.4002 13.7504 11.4002Z",fill:"currentColor"})})}function SX(e){return f.jsxs("svg",{viewBox:"0 0 20 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e,children:[f.jsx("path",{d:"M10 9.5C12.5938 9.5 14.6875 7.40625 14.6875 4.8125C14.6875 2.21875 12.5938 0.125 10 0.125C7.40625 0.125 5.3125 2.21875 5.3125 4.8125C5.3125 7.40625 7.40625 9.5 10 9.5ZM10 1.53125C11.8125 1.53125 13.2812 3 13.2812 4.8125C13.2812 6.625 11.8125 8.09375 10 8.09375C8.1875 8.09375 6.71875 6.625 6.71875 4.8125C6.71875 3 8.1875 1.53125 10 1.53125Z",fill:"currentColor"}),f.jsx("path",{d:"M19.2191 14.625C16.6566 12.4688 13.4066 11.2812 10.0004 11.2812C6.59412 11.2812 3.34412 12.4688 0.781616 14.625C0.500366 14.875 0.437866 15.3125 0.687866 15.625C0.937866 15.9063 1.37537 15.9688 1.68787 15.7188C4.00037 13.75 6.93787 12.6875 10.0004 12.6875C13.0629 12.6875 16.0004 13.75 18.2816 15.6875C18.4066 15.8125 18.5629 15.8438 18.7504 15.8438C18.9379 15.8438 19.1566 15.75 19.2816 15.5938C19.5316 15.3125 19.5004 14.875 19.2191 14.625Z",fill:"currentColor"})]})}function wX(e){return f.jsxs("svg",{viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e,children:[f.jsx("path",{d:"M17.875 2.9375H11C10.625 2.9375 10.2812 3.0625 10 3.25C9.71875 3.0625 9.375 2.9375 9 2.9375H2.125C1.25 2.9375 0.5625 3.65625 0.5625 4.5V14.6875C0.5625 15.5625 1.28125 16.25 2.125 16.25H9.3125V16.3437C9.3125 16.7187 9.625 17.0625 10.0312 17.0625C10.4062 17.0625 10.75 16.75 10.75 16.3437V16.25H17.9375C18.8125 16.25 19.5 15.5312 19.5 14.6875V4.5C19.4688 3.625 18.75 2.9375 17.875 2.9375ZM2.125 14.875C2.03125 14.875 1.96875 14.8125 1.96875 14.7187V4.5C1.96875 4.40625 2.03125 4.34375 2.125 4.34375H9.03125C9.1875 4.34375 9.3125 4.46875 9.3125 4.625V14.875H2.125ZM18.0625 14.6875C18.0625 14.7812 18 14.8437 17.9062 14.8437H10.7188V4.625C10.7188 4.46875 10.8438 4.34375 11 4.34375H17.9062C18 4.34375 18.0625 4.40625 18.0625 4.5V14.6875Z",fill:"currentColor"}),f.jsx("path",{d:"M4.46875 7.40625H6.78125C7.15625 7.40625 7.5 7.09375 7.5 6.6875C7.5 6.28125 7.1875 5.96875 6.78125 5.96875H4.46875C4.09375 5.96875 3.75 6.28125 3.75 6.6875C3.75 7.09375 4.0625 7.40625 4.46875 7.40625Z",fill:"currentColor"}),f.jsx("path",{d:"M13.125 7.40625H15.4375C15.8125 7.40625 16.1562 7.09375 16.1562 6.6875C16.1562 6.28125 15.8438 5.96875 15.4375 5.96875H13.125C12.75 5.96875 12.4062 6.28125 12.4062 6.6875C12.4062 7.09375 12.75 7.40625 13.125 7.40625Z",fill:"currentColor"}),f.jsx("path",{d:"M15.5 8.5625H13.1875C12.8125 8.5625 12.4688 8.875 12.4688 9.28125C12.4688 9.6875 12.7812 10 13.1875 10H15.5C15.875 10 16.2188 9.6875 16.2188 9.28125C16.2188 8.875 15.875 8.5625 15.5 8.5625Z",fill:"currentColor"}),f.jsx("path",{d:"M6.8125 8.5625H4.5C4.125 8.5625 3.78125 8.875 3.78125 9.28125C3.78125 9.6875 4.09375 10 4.5 10H6.8125C7.1875 10 7.53125 9.6875 7.53125 9.28125C7.53125 8.875 7.21875 8.5625 6.8125 8.5625Z",fill:"currentColor"}),f.jsx("path",{d:"M6.8125 11.3125H4.5C4.125 11.3125 3.78125 11.625 3.78125 12.0312C3.78125 12.4375 4.09375 12.75 4.5 12.75H6.8125C7.1875 12.75 7.53125 12.4375 7.53125 12.0312C7.53125 11.625 7.21875 11.3125 6.8125 11.3125Z",fill:"currentColor"}),f.jsx("path",{d:"M15.5 11.3125H13.1875C12.8125 11.3125 12.4688 11.625 12.4688 12.0312C12.4688 12.4375 12.7812 12.75 13.1875 12.75H15.5C15.875 12.75 16.2188 12.4375 16.2188 12.0312C16.2188 11.625 15.875 11.3125 15.5 11.3125Z",fill:"currentColor"})]})}function EX(e){return f.jsxs("svg",{viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e,children:[f.jsx("path",{d:"M17.5625 2.28125H2.4375C1.40625 2.28125 0.5625 3.125 0.5625 4.15625V12.875C0.5625 13.9063 1.40625 14.75 2.4375 14.75H6.9375L9.4375 17.5C9.5625 17.6563 9.75 17.7188 9.96875 17.7188C10.1562 17.7188 10.3438 17.625 10.5 17.5L13.0625 14.7188H17.5938C18.625 14.7188 19.4688 13.875 19.4688 12.8438V4.15625C19.4688 3.125 18.5938 2.28125 17.5625 2.28125ZM18.0625 12.8438C18.0625 13.0938 17.8438 13.3125 17.5938 13.3125H12.7188C12.5312 13.3125 12.3438 13.4063 12.1875 13.5313L9.9375 15.9688L7.75 13.5625C7.625 13.4063 7.4375 13.3438 7.21875 13.3438H2.4375C2.1875 13.3438 1.96875 13.125 1.96875 12.875V4.15625C1.96875 3.90625 2.1875 3.6875 2.4375 3.6875H17.5625C17.8125 3.6875 18.0312 3.90625 18.0312 4.15625V12.8438H18.0625Z",fill:"currentColor"}),f.jsx("path",{d:"M5.5625 7.59375C5.15625 7.59375 4.8125 7.9375 4.8125 8.34375C4.8125 8.75 5.15625 9.09375 5.5625 9.09375C5.96875 9.09375 6.3125 8.75 6.3125 8.34375C6.3125 7.9375 6 7.59375 5.5625 7.59375Z",fill:"currentColor"}),f.jsx("path",{d:"M10 7.59375C9.59375 7.59375 9.25 7.9375 9.25 8.34375C9.25 8.75 9.59375 9.09375 10 9.09375C10.4062 9.09375 10.75 8.75 10.75 8.34375C10.75 7.9375 10.4062 7.59375 10 7.59375Z",fill:"currentColor"}),f.jsx("path",{d:"M14.4375 7.59375C14.0313 7.59375 13.6875 7.9375 13.6875 8.34375C13.6875 8.75 14.0313 9.09375 14.4375 9.09375C14.8438 9.09375 15.1875 8.75 15.1875 8.34375C15.1875 7.9375 14.8438 7.59375 14.4375 7.59375Z",fill:"currentColor"})]})}function xX(e){return f.jsx("svg",{viewBox:"0 0 14 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e,children:f.jsx("path",{d:"M7 0.5625C3.34375 0.5625 0.46875 2.28125 0.46875 4.4375V15.5625C0.46875 17.7188 3.40625 19.4375 6.96875 19.4375C10.5625 19.4375 13.5 17.6875 13.5 15.5625V4.4375C13.5312 2.25 10.6562 0.5625 7 0.5625ZM7 1.96875C10 1.96875 12.125 3.28125 12.125 4.4375C12.125 5.625 10.0312 6.90625 7 6.90625C3.96875 6.90625 1.875 5.59375 1.875 4.4375C1.875 3.25 4 1.96875 7 1.96875ZM7 18.0625C4.0625 18.0625 1.90625 16.75 1.90625 15.5938V14.375C3.09375 15.25 4.90625 15.7813 7 15.7813C9.09375 15.7813 10.9375 15.2188 12.125 14.375V15.5938C12.125 16.75 9.9375 18.0625 7 18.0625ZM7 14.375C4 14.375 1.90625 13.125 1.90625 12V10.5625C3.125 11.4375 5.03125 11.9688 7 11.9688C9.0625 11.9688 10.9063 11.4375 12.125 10.5625V12C12.125 13.125 10 14.375 7 14.375ZM11.3125 9.40625C10.3437 10.125 8.75 10.5625 7 10.5625C5.28125 10.5625 3.65625 10.125 2.6875 9.40625C2.3125 9.15625 1.90625 8.71875 1.90625 8.1875V6.875C3.09375 7.75 4.9375 8.3125 7.03125 8.3125C9.125 8.3125 10.9688 7.75 12.1562 6.875V8.1875C12.125 8.6875 11.6875 9.125 11.3125 9.40625Z",fill:"currentColor"})})}function kX(e){return f.jsxs("svg",{viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e,children:[f.jsx("g",{clipPath:"url(#clip0_6318_531)",children:f.jsx("path",{d:"M18.7505 13.7189L16.813 11.7814C16.0317 11.0002 14.7505 11.0002 13.9692 11.7814L13.438 12.3127L11.7192 10.5939L13.3442 8.96891L16.5317 8.12515C17.2192 7.93765 17.7817 7.37515 17.9692 6.68765L18.8755 3.3439C18.9692 2.9689 18.7505 2.5939 18.3755 2.4689C18.0005 2.37515 17.6255 2.5939 17.5005 2.9689L16.5942 6.31265C16.5317 6.5314 16.3755 6.68765 16.1567 6.75015L12.813 7.6564C12.688 7.68765 12.5942 7.75015 12.5005 7.8439L10.7505 9.59391L9.68799 8.5314L11.438 6.7814C11.5317 6.68765 11.5942 6.5939 11.6255 6.4689L12.5005 3.12515C12.563 2.9064 12.7192 2.75015 12.938 2.68765L16.2817 1.7814C16.6567 1.68765 16.8755 1.2814 16.7817 0.906405C16.688 0.531405 16.313 0.312655 15.938 0.437655L12.5942 1.31265C11.9067 1.50015 11.3442 2.06265 11.1567 2.75015L10.313 5.9064L8.68799 7.5314L7.063 5.9064C7.688 5.18765 7.7505 4.12515 7.188 3.3439L5.84425 1.56265C5.5005 1.0939 4.96925 0.812655 4.3755 0.781405C3.78175 0.750155 3.21925 0.937655 2.813 1.37515L1.53175 2.6564C1.1255 3.06265 0.906746 3.62515 0.937996 4.2189C0.969246 4.81265 1.2505 5.3439 1.71925 5.68765L3.5005 7.0314C3.84425 7.31265 4.28175 7.43765 4.71925 7.43765C5.21925 7.43765 5.688 7.25015 6.063 6.9064L7.688 8.5314L5.59425 10.6252L2.438 11.4689C1.7505 11.6564 1.188 12.2189 1.0005 12.9064L0.312996 15.5002C0.125496 16.1877 0.312996 16.9377 0.844246 17.4689L1.813 18.4377C2.188 18.8127 2.71925 19.0314 3.2505 19.0314C3.438 19.0314 3.59425 19.0002 3.78175 18.9689L6.3755 18.2814C7.063 18.0939 7.6255 17.5314 7.813 16.8439L8.65675 13.6877L10.7505 11.5939L12.4692 13.3127L11.938 13.8439C11.1567 14.6252 11.1567 15.9064 11.938 16.6877L13.8755 18.6252C14.5317 19.2814 15.3755 19.6252 16.313 19.6252C17.2505 19.6252 18.0942 19.2814 18.7505 18.6252C19.4067 17.9689 19.7505 17.1252 19.7505 16.1877C19.7505 15.2502 19.4067 14.3752 18.7505 13.7189ZM4.34425 5.87515L2.563 4.5314C2.3755 4.37515 2.34425 4.18765 2.313 4.0939C2.313 4.00015 2.313 3.7814 2.5005 3.62515L3.78175 2.3439C3.938 2.18765 4.09425 2.1564 4.21925 2.1564H4.2505C4.34425 2.1564 4.53175 2.2189 4.688 2.4064L6.03175 4.18765C6.21925 4.43765 6.188 4.75015 5.96925 4.9689L5.1255 5.81265C4.938 6.0314 4.59425 6.06265 4.34425 5.87515ZM7.53175 12.8127C7.438 12.9064 7.3755 13.0002 7.34425 13.1252L6.438 16.4689C6.3755 16.6877 6.21925 16.8439 6.0005 16.9064L3.40675 17.5939C3.188 17.6564 2.96925 17.5939 2.813 17.4377L1.84425 16.4689C1.688 16.3127 1.6255 16.0939 1.688 15.8752L2.3755 13.2814C2.438 13.0627 2.59425 12.9064 2.813 12.8439L6.15675 11.9377C6.28175 11.9064 6.3755 11.8439 6.46925 11.7502L8.71924 9.50015L9.78174 10.5627L7.53175 12.8127ZM17.7505 17.5939C17.3755 17.9689 16.8442 18.1877 16.313 18.1877C15.7817 18.1877 15.2505 17.9689 14.8755 17.5939L12.938 15.6564C12.7192 15.4377 12.7192 15.0314 12.938 14.8127L13.4692 14.2814L13.9067 14.7189C14.0317 14.8439 14.2192 14.9377 14.4067 14.9377C14.5942 14.9377 14.7817 14.8752 14.9067 14.7189C15.188 14.4377 15.188 14.0002 14.9067 13.7189L14.4692 13.2814L15.0005 12.7502C15.1255 12.6252 15.2505 12.5627 15.438 12.5627C15.5942 12.5627 15.7505 12.6252 15.8755 12.7502L17.813 14.6877C18.188 15.0627 18.4067 15.5939 18.4067 16.1252C18.4067 16.6564 18.1567 17.2189 17.7505 17.5939Z",fill:"currentColor"})}),f.jsx("defs",{children:f.jsx("clipPath",{id:"clip0_6318_531",children:f.jsx("rect",{width:"20",height:"20",fill:"white"})})})]})}/** +`):" "+i2(o[0]):"as no adapter specified";throw new st("There is no suitable adapter to dispatch the request "+i,"ERR_NOT_SUPPORT")}return r},adapters:G1};function Rb(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new of(null,e)}function s2(e){return Rb(e),e.headers=fo.from(e.headers),e.data=Tb.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),u6.getAdapter(e.adapter||d_.adapter)(e).then(function(r){return Rb(e),r.data=Tb.call(e,e.transformResponse,r),r.headers=fo.from(r.headers),r},function(r){return l6(r)||(Rb(e),r&&r.response&&(r.response.data=Tb.call(e,e.transformResponse,r.response),r.response.headers=fo.from(r.response.headers))),Promise.reject(r)})}const l2=e=>e instanceof fo?{...e}:e;function bc(e,t){t=t||{};const n={};function r(c,u,d){return J.isPlainObject(c)&&J.isPlainObject(u)?J.merge.call({caseless:d},c,u):J.isPlainObject(u)?J.merge({},u):J.isArray(u)?u.slice():u}function a(c,u,d){if(J.isUndefined(u)){if(!J.isUndefined(c))return r(void 0,c,d)}else return r(c,u,d)}function o(c,u){if(!J.isUndefined(u))return r(void 0,u)}function i(c,u){if(J.isUndefined(u)){if(!J.isUndefined(c))return r(void 0,c)}else return r(void 0,u)}function s(c,u,d){if(d in t)return r(c,u);if(d in e)return r(void 0,c)}const l={url:o,method:o,data:o,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutMessage:i,withCredentials:i,withXSRFToken:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,responseEncoding:i,validateStatus:s,headers:(c,u)=>a(l2(c),l2(u),!0)};return J.forEach(Object.keys(Object.assign({},e,t)),function(u){const d=l[u]||a,g=d(e[u],t[u],u);J.isUndefined(g)&&d!==s||(n[u]=g)}),n}const d6="1.6.8",f_={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{f_[e]=function(r){return typeof r===e||"a"+(t<1?"n ":" ")+e}});const c2={};f_.transitional=function(t,n,r){function a(o,i){return"[Axios v"+d6+"] Transitional option '"+o+"'"+i+(r?". "+r:"")}return(o,i,s)=>{if(t===!1)throw new st(a(i," has been removed"+(n?" in "+n:"")),st.ERR_DEPRECATED);return n&&!c2[i]&&(c2[i]=!0,console.warn(a(i," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(o,i,s):!0}};function SZ(e,t,n){if(typeof e!="object")throw new st("options must be an object",st.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let a=r.length;for(;a-- >0;){const o=r[a],i=t[o];if(i){const s=e[o],l=s===void 0||i(s,o,e);if(l!==!0)throw new st("option "+o+" must be "+l,st.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new st("Unknown option "+o,st.ERR_BAD_OPTION)}}const W1={assertOptions:SZ,validators:f_},Mo=W1.validators;class Rg{constructor(t){this.defaults=t,this.interceptors={request:new r2,response:new r2}}async request(t,n){try{return await this._request(t,n)}catch(r){if(r instanceof Error){let a;Error.captureStackTrace?Error.captureStackTrace(a={}):a=new Error;const o=a.stack?a.stack.replace(/^.+\n/,""):"";r.stack?o&&!String(r.stack).endsWith(o.replace(/^.+\n.+\n/,""))&&(r.stack+=` +`+o):r.stack=o}throw r}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=bc(this.defaults,n);const{transitional:r,paramsSerializer:a,headers:o}=n;r!==void 0&&W1.assertOptions(r,{silentJSONParsing:Mo.transitional(Mo.boolean),forcedJSONParsing:Mo.transitional(Mo.boolean),clarifyTimeoutError:Mo.transitional(Mo.boolean)},!1),a!=null&&(J.isFunction(a)?n.paramsSerializer={serialize:a}:W1.assertOptions(a,{encode:Mo.function,serialize:Mo.function},!0)),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i=o&&J.merge(o.common,o[n.method]);o&&J.forEach(["delete","get","head","post","put","patch","common"],b=>{delete o[b]}),n.headers=fo.concat(i,o);const s=[];let l=!0;this.interceptors.request.forEach(function(y){typeof y.runWhen=="function"&&y.runWhen(n)===!1||(l=l&&y.synchronous,s.unshift(y.fulfilled,y.rejected))});const c=[];this.interceptors.response.forEach(function(y){c.push(y.fulfilled,y.rejected)});let u,d=0,g;if(!l){const b=[s2.bind(this),void 0];for(b.unshift.apply(b,s),b.push.apply(b,c),g=b.length,u=Promise.resolve(n);d{if(!r._listeners)return;let o=r._listeners.length;for(;o-- >0;)r._listeners[o](a);r._listeners=null}),this.promise.then=a=>{let o;const i=new Promise(s=>{r.subscribe(s),o=s}).then(a);return i.cancel=function(){r.unsubscribe(o)},i},t(function(o,i,s){r.reason||(r.reason=new of(o,i,s),n(r.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}static source(){let t;return{token:new p_(function(a){t=a}),cancel:t}}}const wZ=p_;function EZ(e){return function(n){return e.apply(null,n)}}function xZ(e){return J.isObject(e)&&e.isAxiosError===!0}const K1={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(K1).forEach(([e,t])=>{K1[t]=e});const kZ=K1;function f6(e){const t=new Vp(e),n=GF(Vp.prototype.request,t);return J.extend(n,Vp.prototype,t,{allOwnKeys:!0}),J.extend(n,t,null,{allOwnKeys:!0}),n.create=function(a){return f6(bc(e,a))},n}const rn=f6(d_);rn.Axios=Vp;rn.CanceledError=of;rn.CancelToken=wZ;rn.isCancel=l6;rn.VERSION=d6;rn.toFormData=Km;rn.AxiosError=st;rn.Cancel=rn.CanceledError;rn.all=function(t){return Promise.all(t)};rn.spread=EZ;rn.isAxiosError=xZ;rn.mergeConfig=bc;rn.AxiosHeaders=fo;rn.formToJSON=e=>s6(J.isHTMLForm(e)?new FormData(e):e);rn.getAdapter=u6.getAdapter;rn.HttpStatusCode=kZ;rn.default=rn;const p6=rn,CZ={baseURL:sY,headers:{"Content-Type":"application/json","Cache-Control":"no-cache"}},cl=p6.create(CZ),_Z=()=>cl,AZ=({children:e})=>{const[t,n]=p.useState(!1),r=Mi(),a=qF();return p.useEffect(()=>{const o=s=>s,i=s=>Promise.reject(s);cl.interceptors.response.use(o,i)},[r,cl]),p.useEffect(()=>{const o=s=>(s.headers.Authorization=a||"",s),i=cl.interceptors.request.use(o);return()=>{cl.interceptors.request.eject(i)}},[a,cl]),p.useEffect(()=>{t||setTimeout(()=>n(!0),10)},[t]),t?e:f.jsx("div",{className:"sr-only",children:"Re-authenticating..."})},TZ="ToolsServiceListTools",g_=({userId:e}={},t)=>[TZ,...t??[{userId:e}]],RZ="SourcesServiceListSources",sf=({userId:e}={},t)=>[RZ,...t??[{userId:e}]],NZ="AgentsServiceListAgents",g6=({userId:e}={},t)=>[NZ,...t??[{userId:e}]],IZ="AgentsServiceGetAgent",$s=({agentId:e,userId:t},n)=>[IZ,...n??[{agentId:e,userId:t}]],OZ="AgentsServiceGetAgentSources",m6=({agentId:e},t)=>[OZ,...t??[{agentId:e}]],DZ="AgentsServiceListAgentArchivalMemory",h6=({after:e,agentId:t,before:n,limit:r,userId:a},o)=>[DZ,...o??[{after:e,agentId:t,before:n,limit:r,userId:a}]],LZ="AgentsServiceListAgentMessages",MZ=({agentId:e,assistantMessageFunctionKwarg:t,assistantMessageFunctionName:n,before:r,limit:a,msgObject:o,useAssistantMessage:i,userId:s},l)=>[LZ,...l??[{agentId:e,assistantMessageFunctionKwarg:t,assistantMessageFunctionName:n,before:r,limit:a,msgObject:o,useAssistantMessage:i,userId:s}]],PZ="ModelsServiceListModels",$Z=e=>[PZ,...e??[]],FZ="LlmsServiceListEmbeddingModels",jZ=e=>[FZ,...e??[]],zZ="BlocksServiceListMemoryBlocks",lf=({label:e,name:t,templatesOnly:n,userId:r}={},a)=>[zZ,...a??[{label:e,name:t,templatesOnly:n,userId:r}]],UZ="JobsServiceListJobs",BZ=({sourceId:e,userId:t}={},n)=>[UZ,...n??[{sourceId:e,userId:t}]],HZ="JobsServiceListActiveJobs",b6=({userId:e}={},t)=>[HZ,...t??[{userId:e}]];class u2{constructor(){this._fns=[]}eject(t){const n=this._fns.indexOf(t);n!==-1&&(this._fns=[...this._fns.slice(0,n),...this._fns.slice(n+1)])}use(t){this._fns=[...this._fns,t]}}const Ie={CREDENTIALS:"include",ENCODE_PATH:void 0,HEADERS:void 0,PASSWORD:void 0,TOKEN:void 0,USERNAME:void 0,VERSION:"1.0.0",WITH_CREDENTIALS:!1,interceptors:{request:new u2,response:new u2},BASE:""};class d2 extends Error{constructor(t,n,r){super(r),this.name="ApiError",this.url=n.url,this.status=n.status,this.statusText=n.statusText,this.body=n.body,this.request=t}}class VZ extends Error{constructor(t){super(t),this.name="CancelError"}get isCancelled(){return!0}}class qZ{constructor(t){this._isResolved=!1,this._isRejected=!1,this._isCancelled=!1,this.cancelHandlers=[],this.promise=new Promise((n,r)=>{this._resolve=n,this._reject=r;const a=s=>{this._isResolved||this._isRejected||this._isCancelled||(this._isResolved=!0,this._resolve&&this._resolve(s))},o=s=>{this._isResolved||this._isRejected||this._isCancelled||(this._isRejected=!0,this._reject&&this._reject(s))},i=s=>{this._isResolved||this._isRejected||this._isCancelled||this.cancelHandlers.push(s)};return Object.defineProperty(i,"isResolved",{get:()=>this._isResolved}),Object.defineProperty(i,"isRejected",{get:()=>this._isRejected}),Object.defineProperty(i,"isCancelled",{get:()=>this._isCancelled}),t(a,o,i)})}get[Symbol.toStringTag](){return"Cancellable Promise"}then(t,n){return this.promise.then(t,n)}catch(t){return this.promise.catch(t)}finally(t){return this.promise.finally(t)}cancel(){if(!(this._isResolved||this._isRejected||this._isCancelled)){if(this._isCancelled=!0,this.cancelHandlers.length)try{for(const t of this.cancelHandlers)t()}catch(t){console.warn("Cancellation threw an error",t);return}this.cancelHandlers.length=0,this._reject&&this._reject(new VZ("Request aborted"))}}get isCancelled(){return this._isCancelled}}const Zm=e=>typeof e=="string",Nb=e=>Zm(e)&&e!=="",y6=e=>e instanceof Blob,GZ=e=>e instanceof FormData,f2=e=>e>=200&&e<300,WZ=e=>{try{return btoa(e)}catch{return Buffer.from(e).toString("base64")}},KZ=e=>{const t=[],n=(a,o)=>{t.push(`${encodeURIComponent(a)}=${encodeURIComponent(String(o))}`)},r=(a,o)=>{o!=null&&(o instanceof Date?n(a,o.toISOString()):Array.isArray(o)?o.forEach(i=>r(a,i)):typeof o=="object"?Object.entries(o).forEach(([i,s])=>r(`${a}[${i}]`,s)):n(a,o))};return Object.entries(e).forEach(([a,o])=>r(a,o)),t.length?`?${t.join("&")}`:""},YZ=(e,t)=>{const n=e.ENCODE_PATH||encodeURI,r=t.url.replace("{api-version}",e.VERSION).replace(/{(.*?)}/g,(o,i)=>{var s;return(s=t.path)!=null&&s.hasOwnProperty(i)?n(String(t.path[i])):o}),a=e.BASE+r;return t.query?a+KZ(t.query):a},ZZ=e=>{if(e.formData){const t=new FormData,n=(r,a)=>{Zm(a)||y6(a)?t.append(r,a):t.append(r,JSON.stringify(a))};return Object.entries(e.formData).filter(([,r])=>r!=null).forEach(([r,a])=>{Array.isArray(a)?a.forEach(o=>n(r,o)):n(r,a)}),t}},Yf=async(e,t)=>typeof t=="function"?t(e):t,XZ=async(e,t)=>{const[n,r,a,o]=await Promise.all([Yf(t,e.TOKEN),Yf(t,e.USERNAME),Yf(t,e.PASSWORD),Yf(t,e.HEADERS)]),i=Object.entries({Accept:"application/json",...o,...t.headers}).filter(([,s])=>s!=null).reduce((s,[l,c])=>({...s,[l]:String(c)}),{});if(Nb(n)&&(i.Authorization=`Bearer ${n}`),Nb(r)&&Nb(a)){const s=WZ(`${r}:${a}`);i.Authorization=`Basic ${s}`}return t.body!==void 0?t.mediaType?i["Content-Type"]=t.mediaType:y6(t.body)?i["Content-Type"]=t.body.type||"application/octet-stream":Zm(t.body)?i["Content-Type"]="text/plain":GZ(t.body)||(i["Content-Type"]="application/json"):t.formData!==void 0&&t.mediaType&&(i["Content-Type"]=t.mediaType),i},QZ=e=>{if(e.body)return e.body},JZ=async(e,t,n,r,a,o,i,s)=>{const l=new AbortController;let c={data:r??a,headers:o,method:t.method,signal:l.signal,url:n,withCredentials:e.WITH_CREDENTIALS};i(()=>l.abort());for(const u of e.interceptors.request._fns)c=await u(c);try{return await s.request(c)}catch(u){const d=u;if(d.response)return d.response;throw u}},eX=(e,t)=>{if(t){const n=e.headers[t];if(Zm(n))return n}},tX=e=>{if(e.status!==204)return e.data},nX=(e,t)=>{const r={400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",406:"Not Acceptable",407:"Proxy Authentication Required",408:"Request Timeout",409:"Conflict",410:"Gone",411:"Length Required",412:"Precondition Failed",413:"Payload Too Large",414:"URI Too Long",415:"Unsupported Media Type",416:"Range Not Satisfiable",417:"Expectation Failed",418:"Im a teapot",421:"Misdirected Request",422:"Unprocessable Content",423:"Locked",424:"Failed Dependency",425:"Too Early",426:"Upgrade Required",428:"Precondition Required",429:"Too Many Requests",431:"Request Header Fields Too Large",451:"Unavailable For Legal Reasons",500:"Internal Server Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout",505:"HTTP Version Not Supported",506:"Variant Also Negotiates",507:"Insufficient Storage",508:"Loop Detected",510:"Not Extended",511:"Network Authentication Required",...e.errors}[t.status];if(r)throw new d2(e,t,r);if(!t.ok){const a=t.status??"unknown",o=t.statusText??"unknown",i=(()=>{try{return JSON.stringify(t.body,null,2)}catch{return}})();throw new d2(e,t,`Generic Error: status: ${a}; status text: ${o}; body: ${i}`)}},Pe=(e,t,n=p6)=>new qZ(async(r,a,o)=>{try{const i=YZ(e,t),s=ZZ(t),l=QZ(t),c=await XZ(e,t);if(!o.isCancelled){let u=await JZ(e,t,i,l,s,c,o,n);for(const y of e.interceptors.response._fns)u=await y(u);const d=tX(u),g=eX(u,t.responseHeader);let m=d;t.responseTransformer&&f2(u.status)&&(m=await t.responseTransformer(d));const b={url:i,ok:f2(u.status),status:u.status,statusText:u.statusText,body:g??m};nX(t,b),r(b.body)}}catch(i){a(i)}});class m_{static deleteTool(t,n){return Pe(Ie,{method:"DELETE",url:"/v1/tools/{tool_id}",path:{tool_id:t.toolId},errors:{422:"Validation Error"},headers:n})}static getTool(t,n){return Pe(Ie,{method:"GET",url:"/v1/tools/{tool_id}",path:{tool_id:t.toolId},errors:{422:"Validation Error"},headers:n})}static updateTool(t,n){return Pe(Ie,{method:"PATCH",url:"/v1/tools/{tool_id}",path:{tool_id:t.toolId},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static getToolIdByName(t,n){return Pe(Ie,{method:"GET",url:"/v1/tools/name/{tool_name}",path:{tool_name:t.toolName},errors:{422:"Validation Error"},headers:n})}static listTools(t={},n){return Pe(Ie,{method:"GET",url:"/v1/tools/",errors:{422:"Validation Error"},headers:n})}static createTool(t,n){return Pe(Ie,{method:"POST",url:"/v1/tools/",query:{update:t.update},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}}class Pc{static getSource(t,n){return Pe(Ie,{method:"GET",url:"/v1/sources/{source_id}",path:{source_id:t.sourceId},errors:{422:"Validation Error"},headers:n})}static updateSource(t,n){return Pe(Ie,{method:"PATCH",url:"/v1/sources/{source_id}",path:{source_id:t.sourceId},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static deleteSource(t,n){return Pe(Ie,{method:"DELETE",url:"/v1/sources/{source_id}",path:{source_id:t.sourceId},errors:{422:"Validation Error"},headers:n})}static getSourceIdByName(t,n){return Pe(Ie,{method:"GET",url:"/v1/sources/name/{source_name}",path:{source_name:t.sourceName},errors:{422:"Validation Error"},headers:n})}static listSources(t={},n){return Pe(Ie,{method:"GET",url:"/v1/sources/",errors:{422:"Validation Error"},headers:n})}static createSource(t,n){return Pe(Ie,{method:"POST",url:"/v1/sources/",body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static attachAgentToSource(t,n){return Pe(Ie,{method:"POST",url:"/v1/sources/{source_id}/attach",path:{source_id:t.sourceId},query:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static detachAgentFromSource(t,n){return Pe(Ie,{method:"POST",url:"/v1/sources/{source_id}/detach",path:{source_id:t.sourceId},query:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static uploadFileToSource(t,n){return Pe(Ie,{method:"POST",url:"/v1/sources/{source_id}/upload",path:{source_id:t.sourceId},formData:t.formData,mediaType:"multipart/form-data",errors:{422:"Validation Error"},headers:n})}static listSourcePassages(t,n){return Pe(Ie,{method:"GET",url:"/v1/sources/{source_id}/passages",path:{source_id:t.sourceId},errors:{422:"Validation Error"},headers:n})}static listFilesFromSource(t,n){return Pe(Ie,{method:"GET",url:"/v1/sources/{source_id}/files",path:{source_id:t.sourceId},query:{limit:t.limit,cursor:t.cursor},errors:{422:"Validation Error"},headers:n})}}class Va{static listAgents(t={},n){return Pe(Ie,{method:"GET",url:"/v1/agents/",errors:{422:"Validation Error"},headers:n})}static createAgent(t,n){return Pe(Ie,{method:"POST",url:"/v1/agents/",body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static updateAgent(t,n){return Pe(Ie,{method:"PATCH",url:"/v1/agents/{agent_id}",path:{agent_id:t.agentId},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static getAgent(t,n){return Pe(Ie,{method:"GET",url:"/v1/agents/{agent_id}",path:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static deleteAgent(t,n){return Pe(Ie,{method:"DELETE",url:"/v1/agents/{agent_id}",path:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static getAgentSources(t,n){return Pe(Ie,{method:"GET",url:"/v1/agents/{agent_id}/sources",path:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static listAgentInContextMessages(t,n){return Pe(Ie,{method:"GET",url:"/v1/agents/{agent_id}/memory/messages",path:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static getAgentMemory(t,n){return Pe(Ie,{method:"GET",url:"/v1/agents/{agent_id}/memory",path:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static updateAgentMemory(t,n){return Pe(Ie,{method:"PATCH",url:"/v1/agents/{agent_id}/memory",path:{agent_id:t.agentId},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static getAgentRecallMemorySummary(t,n){return Pe(Ie,{method:"GET",url:"/v1/agents/{agent_id}/memory/recall",path:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static getAgentArchivalMemorySummary(t,n){return Pe(Ie,{method:"GET",url:"/v1/agents/{agent_id}/memory/archival",path:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static listAgentArchivalMemory(t,n){return Pe(Ie,{method:"GET",url:"/v1/agents/{agent_id}/archival",path:{agent_id:t.agentId},query:{after:t.after,before:t.before,limit:t.limit},errors:{422:"Validation Error"},headers:n})}static createAgentArchivalMemory(t,n){return Pe(Ie,{method:"POST",url:"/v1/agents/{agent_id}/archival",path:{agent_id:t.agentId},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static deleteAgentArchivalMemory(t,n){return Pe(Ie,{method:"DELETE",url:"/v1/agents/{agent_id}/archival/{memory_id}",path:{agent_id:t.agentId,memory_id:t.memoryId},errors:{422:"Validation Error"},headers:n})}static listAgentMessages(t,n){return Pe(Ie,{method:"GET",url:"/v1/agents/{agent_id}/messages",path:{agent_id:t.agentId},query:{before:t.before,limit:t.limit,msg_object:t.msgObject,use_assistant_message:t.useAssistantMessage,assistant_message_function_name:t.assistantMessageFunctionName,assistant_message_function_kwarg:t.assistantMessageFunctionKwarg},errors:{422:"Validation Error"},headers:n})}static createAgentMessage(t,n){return Pe(Ie,{method:"POST",url:"/v1/agents/{agent_id}/messages",path:{agent_id:t.agentId},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static updateAgentMessage(t,n){return Pe(Ie,{method:"PATCH",url:"/v1/agents/{agent_id}/messages/{message_id}",path:{agent_id:t.agentId,message_id:t.messageId},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}}class rX{static listModels(t){return Pe(Ie,{method:"GET",url:"/v1/models/",headers:t})}static listEmbeddingModels(t){return Pe(Ie,{method:"GET",url:"/v1/models/embedding",headers:t})}}class aX{static listModels(t){return Pe(Ie,{method:"GET",url:"/v1/models/",headers:t})}static listEmbeddingModels(t){return Pe(Ie,{method:"GET",url:"/v1/models/embedding",headers:t})}}class h_{static listMemoryBlocks(t={},n){return Pe(Ie,{method:"GET",url:"/v1/blocks/",query:{label:t.label,templates_only:t.templatesOnly,name:t.name},errors:{422:"Validation Error"},headers:n})}static createMemoryBlock(t,n){return Pe(Ie,{method:"POST",url:"/v1/blocks/",body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static updateMemoryBlock(t,n){return Pe(Ie,{method:"PATCH",url:"/v1/blocks/{block_id}",path:{block_id:t.blockId},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static deleteMemoryBlock(t,n){return Pe(Ie,{method:"DELETE",url:"/v1/blocks/{block_id}",path:{block_id:t.blockId},errors:{422:"Validation Error"},headers:n})}static getMemoryBlock(t,n){return Pe(Ie,{method:"GET",url:"/v1/blocks/{block_id}",path:{block_id:t.blockId},errors:{422:"Validation Error"},headers:n})}}class oX{static listJobs(t={},n){return Pe(Ie,{method:"GET",url:"/v1/jobs/",query:{source_id:t.sourceId},errors:{422:"Validation Error"},headers:n})}static listActiveJobs(t={},n){return Pe(Ie,{method:"GET",url:"/v1/jobs/active",errors:{422:"Validation Error"},headers:n})}static getJob(t,n){return Pe(Ie,{method:"GET",url:"/v1/jobs/{job_id}",path:{job_id:t.jobId},errors:{422:"Validation Error"},headers:n})}static deleteJob(t,n){return Pe(Ie,{method:"DELETE",url:"/v1/jobs/{job_id}",path:{job_id:t.jobId},errors:{422:"Validation Error"},headers:n})}}const Xm=({userId:e}={},t,n)=>Jr({queryKey:g_({userId:e},t),queryFn:()=>m_.listTools({userId:e}),...n}),b_=({userId:e}={},t,n)=>Jr({queryKey:sf({userId:e},t),queryFn:()=>Pc.listSources({userId:e}),...n}),Qm=({userId:e}={},t,n)=>Jr({queryKey:g6({userId:e},t),queryFn:()=>Va.listAgents({userId:e}),...n}),y_=({agentId:e,userId:t},n,r)=>Jr({queryKey:$s({agentId:e,userId:t},n),queryFn:()=>Va.getAgent({agentId:e,userId:t}),...r}),v6=({agentId:e},t,n)=>Jr({queryKey:m6({agentId:e},t),queryFn:()=>Va.getAgentSources({agentId:e}),...n}),S6=({after:e,agentId:t,before:n,limit:r,userId:a},o,i)=>Jr({queryKey:h6({after:e,agentId:t,before:n,limit:r,userId:a},o),queryFn:()=>Va.listAgentArchivalMemory({after:e,agentId:t,before:n,limit:r,userId:a}),...i}),iX=({agentId:e,assistantMessageFunctionKwarg:t,assistantMessageFunctionName:n,before:r,limit:a,msgObject:o,useAssistantMessage:i,userId:s},l,c)=>Jr({queryKey:MZ({agentId:e,assistantMessageFunctionKwarg:t,assistantMessageFunctionName:n,before:r,limit:a,msgObject:o,useAssistantMessage:i,userId:s},l),queryFn:()=>Va.listAgentMessages({agentId:e,assistantMessageFunctionKwarg:t,assistantMessageFunctionName:n,before:r,limit:a,msgObject:o,useAssistantMessage:i,userId:s}),...c}),w6=(e,t)=>Jr({queryKey:$Z(e),queryFn:()=>rX.listModels(),...t}),E6=(e,t)=>Jr({queryKey:jZ(e),queryFn:()=>aX.listEmbeddingModels(),...t}),Ng=({label:e,name:t,templatesOnly:n,userId:r}={},a,o)=>Jr({queryKey:lf({label:e,name:t,templatesOnly:n,userId:r},a),queryFn:()=>h_.listMemoryBlocks({label:e,name:t,templatesOnly:n,userId:r}),...o}),sX=({userId:e}={},t,n)=>Jr({queryKey:b6({userId:e},t),queryFn:()=>oX.listActiveJobs({userId:e}),...n}),lX=e=>gr({mutationFn:({requestBody:t,update:n,userId:r})=>m_.createTool({requestBody:t,update:n,userId:r}),...e}),cX=e=>gr({mutationFn:({requestBody:t,userId:n})=>Pc.createSource({requestBody:t,userId:n}),...e}),x6=e=>gr({mutationFn:({agentId:t,sourceId:n,userId:r})=>Pc.attachAgentToSource({agentId:t,sourceId:n,userId:r}),...e}),k6=e=>gr({mutationFn:({agentId:t,sourceId:n,userId:r})=>Pc.detachAgentFromSource({agentId:t,sourceId:n,userId:r}),...e}),C6=e=>gr({mutationFn:({formData:t,sourceId:n,userId:r})=>Pc.uploadFileToSource({formData:t,sourceId:n,userId:r}),...e}),uX=e=>gr({mutationFn:({requestBody:t,userId:n})=>Va.createAgent({requestBody:t,userId:n}),...e}),dX=e=>gr({mutationFn:({agentId:t,requestBody:n,userId:r})=>Va.createAgentArchivalMemory({agentId:t,requestBody:n,userId:r}),...e}),_6=e=>gr({mutationFn:({requestBody:t,userId:n})=>h_.createMemoryBlock({requestBody:t,userId:n}),...e}),fX=e=>gr({mutationFn:({requestBody:t,toolId:n,userId:r})=>m_.updateTool({requestBody:t,toolId:n,userId:r}),...e}),pX=e=>gr({mutationFn:({requestBody:t,sourceId:n,userId:r})=>Pc.updateSource({requestBody:t,sourceId:n,userId:r}),...e}),cf=e=>gr({mutationFn:({agentId:t,requestBody:n,userId:r})=>Va.updateAgent({agentId:t,requestBody:n,userId:r}),...e}),v_=e=>gr({mutationFn:({blockId:t,requestBody:n})=>h_.updateMemoryBlock({blockId:t,requestBody:n}),...e}),gX=e=>gr({mutationFn:({agentId:t,userId:n})=>Va.deleteAgent({agentId:t,userId:n}),...e}),mX=e=>gr({mutationFn:({agentId:t,memoryId:n,userId:r})=>Va.deleteAgentArchivalMemory({agentId:t,memoryId:n,userId:r}),...e});Ie.BASE="";Ie.HEADERS={"Content-Type":"application/json","Cache-Control":"no-cache"};const hX=({children:e})=>{const[t,n]=p.useState(!1),r=qF(),a=Mi();return p.useEffect(()=>{const o=i=>i;return Ie.interceptors.response.use(o),()=>{Ie.interceptors.response.eject(o)}},[a]),p.useEffect(()=>{const o=i=>(i.headers={...i.headers,Authorization:"Bearer password"},i);return Ie.interceptors.request.use(o),()=>{Ie.interceptors.request.eject(o)}},[r]),p.useEffect(()=>{t||setTimeout(()=>n(!0),10)},[t]),t?e:f.jsx("div",{className:"sr-only",children:"Re-authenticating..."})},yc=ef("inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground hover:bg-destructive/90",outline:"border border-input bg-background hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3",xs:"text-xs h-7 rounded-md px-3",lg:"h-11 rounded-md px-8",icon:"h-10 w-10",iconSm:"h-9 w-9",iconXs:"h-7 w-7"}},defaultVariants:{variant:"default",size:"default"}});function p2({isBusy:e,icon:t}){return e?f.jsx(un,{className:"h-4 w-4 animate-spin"}):t||null}const ue=p.forwardRef(({className:e,children:t,label:n,isBusy:r,icon:a,iconPosition:o="left",disabled:i,variant:s,size:l,asChild:c=!1,...u},d)=>{const g=c?$a:"button",m=p.useMemo(()=>i||r,[i,r]),b=p.useMemo(()=>a||o?"flex items-center gap-1":"",[a,o]);return f.jsxs(g,{className:ee(b,yc({variant:s,size:l,className:e})),disabled:m,ref:d,...u,children:[o==="left"&&f.jsx(p2,{isBusy:r??!1,icon:a??null}),f.jsx(Rm,{children:t}),o==="right"&&f.jsx(p2,{isBusy:r??!1,icon:a??null})]})});ue.displayName="Button";const Fs=({children:e,className:t})=>f.jsx("div",{className:ee("h-full w-full overflow-auto",t),children:e});function Zf({children:e,className:t}){return f.jsx("div",{className:ee("flex justify-center text-muted-foreground",t),children:e})}function bX(e){return f.jsxs("svg",{viewBox:"0 0 20 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e,children:[f.jsx("path",{d:"M5.21875 8.90625H3.84375C3.46875 8.90625 3.125 9.21875 3.125 9.625C3.125 10.0313 3.4375 10.3437 3.84375 10.3437H5.21875C5.59375 10.3437 5.9375 10.0313 5.9375 9.625C5.9375 9.21875 5.59375 8.90625 5.21875 8.90625Z",fill:"currentColor"}),f.jsx("path",{d:"M12.875 8.90625H11.5C11.125 8.90625 10.7812 9.21875 10.7812 9.625C10.7812 10.0313 11.0937 10.3437 11.5 10.3437H12.875C13.25 10.3437 13.5938 10.0313 13.5938 9.625C13.5938 9.21875 13.25 8.90625 12.875 8.90625Z",fill:"currentColor"}),f.jsx("path",{d:"M17.7187 8.09375V3.9375C18.5 3.65625 19.0312 2.90625 19.0312 2.0625C19.0312 0.9375 18.125 0.03125 17 0.03125C15.875 0.03125 14.9687 0.9375 14.9687 2.0625C14.9687 2.9375 15.5312 3.65625 16.2812 3.9375V8.0625H15.9375V7.84375C15.9375 6.59375 14.9062 5.5625 13.6562 5.5625H11.875V4.875C11.875 3.84375 11.0312 3.03125 10.0312 3.03125H9.0625V0.96875C9.0625 0.59375 8.75 0.25 8.34375 0.25C7.9375 0.25 7.625 0.5625 7.625 0.96875V3.03125H6.625C5.59375 3.03125 4.78125 3.875 4.78125 4.875V5.5625H2.8125C1.5625 5.5625 0.53125 6.59375 0.53125 7.84375V13.6875C0.53125 14.9375 1.5625 15.9688 2.8125 15.9688H13.6875C14.9375 15.9688 15.9687 14.9375 15.9687 13.6875V13.4688H17.625C18.6562 13.4688 19.4687 12.625 19.4687 11.625V9.96875C19.4687 8.9375 18.6875 8.15625 17.7187 8.09375ZM17 1.4375C17.3437 1.4375 17.625 1.71875 17.625 2.0625C17.625 2.40625 17.3437 2.6875 17 2.6875C16.6562 2.6875 16.375 2.40625 16.375 2.0625C16.375 1.71875 16.6562 1.4375 17 1.4375ZM6.21875 4.875C6.21875 4.625 6.40625 4.4375 6.65625 4.4375H10.0312C10.2812 4.4375 10.4687 4.625 10.4687 4.875V5.5625H6.21875V4.875ZM14.5312 13.6875C14.5312 14.1562 14.1562 14.5625 13.6562 14.5625H2.8125C2.34375 14.5625 1.9375 14.1875 1.9375 13.6875V7.84375C1.9375 7.375 2.3125 6.96875 2.8125 6.96875H13.6875C14.1562 6.96875 14.5625 7.34375 14.5625 7.84375V13.6875H14.5312ZM18.0625 11.5938C18.0625 11.8438 17.875 12.0312 17.625 12.0312H15.9375V9.46875H17.5937C17.8437 9.46875 18.0312 9.65625 18.0312 9.90625V11.5938H18.0625Z",fill:"currentColor"}),f.jsx("path",{d:"M9.5 11.125C9.125 11.125 8.78125 11.4375 8.78125 11.8437C8.78125 12.0937 8.59375 12.2813 8.34375 12.2813C8.09375 12.2813 7.90625 12.0937 7.90625 11.8437C7.90625 11.4687 7.59375 11.125 7.1875 11.125C6.78125 11.125 6.46875 11.4375 6.46875 11.8437C6.46875 12.875 7.3125 13.6875 8.3125 13.6875C9.3125 13.6875 10.1562 12.8437 10.1562 11.8437C10.1875 11.4375 9.875 11.125 9.5 11.125Z",fill:"currentColor"})]})}function yX(e){return f.jsx("svg",{viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e,children:f.jsx("path",{d:"M8.00039 11.3998C7.85039 11.3998 7.72539 11.3498 7.60039 11.2498L1.85039 5.5998C1.62539 5.3748 1.62539 5.0248 1.85039 4.7998C2.07539 4.5748 2.42539 4.5748 2.65039 4.7998L8.00039 10.0248L13.3504 4.7498C13.5754 4.5248 13.9254 4.5248 14.1504 4.7498C14.3754 4.9748 14.3754 5.3248 14.1504 5.5498L8.40039 11.1998C8.27539 11.3248 8.15039 11.3998 8.00039 11.3998Z",fill:"currentColor"})})}function vX(e){return f.jsx("svg",{viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e,children:f.jsx("path",{d:"M13.7504 11.4002C13.6004 11.4002 13.4754 11.3502 13.3504 11.2502L8.00039 5.9752L2.65039 11.2252C2.42539 11.4502 2.07539 11.4502 1.85039 11.2252C1.62539 11.0002 1.62539 10.6502 1.85039 10.4252L7.60039 4.7752C7.82539 4.5502 8.17539 4.5502 8.40039 4.7752L14.1504 10.4252C14.3754 10.6502 14.3754 11.0002 14.1504 11.2252C14.0504 11.3252 13.9004 11.4002 13.7504 11.4002Z",fill:"currentColor"})})}function SX(e){return f.jsxs("svg",{viewBox:"0 0 20 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e,children:[f.jsx("path",{d:"M10 9.5C12.5938 9.5 14.6875 7.40625 14.6875 4.8125C14.6875 2.21875 12.5938 0.125 10 0.125C7.40625 0.125 5.3125 2.21875 5.3125 4.8125C5.3125 7.40625 7.40625 9.5 10 9.5ZM10 1.53125C11.8125 1.53125 13.2812 3 13.2812 4.8125C13.2812 6.625 11.8125 8.09375 10 8.09375C8.1875 8.09375 6.71875 6.625 6.71875 4.8125C6.71875 3 8.1875 1.53125 10 1.53125Z",fill:"currentColor"}),f.jsx("path",{d:"M19.2191 14.625C16.6566 12.4688 13.4066 11.2812 10.0004 11.2812C6.59412 11.2812 3.34412 12.4688 0.781616 14.625C0.500366 14.875 0.437866 15.3125 0.687866 15.625C0.937866 15.9063 1.37537 15.9688 1.68787 15.7188C4.00037 13.75 6.93787 12.6875 10.0004 12.6875C13.0629 12.6875 16.0004 13.75 18.2816 15.6875C18.4066 15.8125 18.5629 15.8438 18.7504 15.8438C18.9379 15.8438 19.1566 15.75 19.2816 15.5938C19.5316 15.3125 19.5004 14.875 19.2191 14.625Z",fill:"currentColor"})]})}function wX(e){return f.jsxs("svg",{viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e,children:[f.jsx("path",{d:"M17.875 2.9375H11C10.625 2.9375 10.2812 3.0625 10 3.25C9.71875 3.0625 9.375 2.9375 9 2.9375H2.125C1.25 2.9375 0.5625 3.65625 0.5625 4.5V14.6875C0.5625 15.5625 1.28125 16.25 2.125 16.25H9.3125V16.3437C9.3125 16.7187 9.625 17.0625 10.0312 17.0625C10.4062 17.0625 10.75 16.75 10.75 16.3437V16.25H17.9375C18.8125 16.25 19.5 15.5312 19.5 14.6875V4.5C19.4688 3.625 18.75 2.9375 17.875 2.9375ZM2.125 14.875C2.03125 14.875 1.96875 14.8125 1.96875 14.7187V4.5C1.96875 4.40625 2.03125 4.34375 2.125 4.34375H9.03125C9.1875 4.34375 9.3125 4.46875 9.3125 4.625V14.875H2.125ZM18.0625 14.6875C18.0625 14.7812 18 14.8437 17.9062 14.8437H10.7188V4.625C10.7188 4.46875 10.8438 4.34375 11 4.34375H17.9062C18 4.34375 18.0625 4.40625 18.0625 4.5V14.6875Z",fill:"currentColor"}),f.jsx("path",{d:"M4.46875 7.40625H6.78125C7.15625 7.40625 7.5 7.09375 7.5 6.6875C7.5 6.28125 7.1875 5.96875 6.78125 5.96875H4.46875C4.09375 5.96875 3.75 6.28125 3.75 6.6875C3.75 7.09375 4.0625 7.40625 4.46875 7.40625Z",fill:"currentColor"}),f.jsx("path",{d:"M13.125 7.40625H15.4375C15.8125 7.40625 16.1562 7.09375 16.1562 6.6875C16.1562 6.28125 15.8438 5.96875 15.4375 5.96875H13.125C12.75 5.96875 12.4062 6.28125 12.4062 6.6875C12.4062 7.09375 12.75 7.40625 13.125 7.40625Z",fill:"currentColor"}),f.jsx("path",{d:"M15.5 8.5625H13.1875C12.8125 8.5625 12.4688 8.875 12.4688 9.28125C12.4688 9.6875 12.7812 10 13.1875 10H15.5C15.875 10 16.2188 9.6875 16.2188 9.28125C16.2188 8.875 15.875 8.5625 15.5 8.5625Z",fill:"currentColor"}),f.jsx("path",{d:"M6.8125 8.5625H4.5C4.125 8.5625 3.78125 8.875 3.78125 9.28125C3.78125 9.6875 4.09375 10 4.5 10H6.8125C7.1875 10 7.53125 9.6875 7.53125 9.28125C7.53125 8.875 7.21875 8.5625 6.8125 8.5625Z",fill:"currentColor"}),f.jsx("path",{d:"M6.8125 11.3125H4.5C4.125 11.3125 3.78125 11.625 3.78125 12.0312C3.78125 12.4375 4.09375 12.75 4.5 12.75H6.8125C7.1875 12.75 7.53125 12.4375 7.53125 12.0312C7.53125 11.625 7.21875 11.3125 6.8125 11.3125Z",fill:"currentColor"}),f.jsx("path",{d:"M15.5 11.3125H13.1875C12.8125 11.3125 12.4688 11.625 12.4688 12.0312C12.4688 12.4375 12.7812 12.75 13.1875 12.75H15.5C15.875 12.75 16.2188 12.4375 16.2188 12.0312C16.2188 11.625 15.875 11.3125 15.5 11.3125Z",fill:"currentColor"})]})}function EX(e){return f.jsxs("svg",{viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e,children:[f.jsx("path",{d:"M17.5625 2.28125H2.4375C1.40625 2.28125 0.5625 3.125 0.5625 4.15625V12.875C0.5625 13.9063 1.40625 14.75 2.4375 14.75H6.9375L9.4375 17.5C9.5625 17.6563 9.75 17.7188 9.96875 17.7188C10.1562 17.7188 10.3438 17.625 10.5 17.5L13.0625 14.7188H17.5938C18.625 14.7188 19.4688 13.875 19.4688 12.8438V4.15625C19.4688 3.125 18.5938 2.28125 17.5625 2.28125ZM18.0625 12.8438C18.0625 13.0938 17.8438 13.3125 17.5938 13.3125H12.7188C12.5312 13.3125 12.3438 13.4063 12.1875 13.5313L9.9375 15.9688L7.75 13.5625C7.625 13.4063 7.4375 13.3438 7.21875 13.3438H2.4375C2.1875 13.3438 1.96875 13.125 1.96875 12.875V4.15625C1.96875 3.90625 2.1875 3.6875 2.4375 3.6875H17.5625C17.8125 3.6875 18.0312 3.90625 18.0312 4.15625V12.8438H18.0625Z",fill:"currentColor"}),f.jsx("path",{d:"M5.5625 7.59375C5.15625 7.59375 4.8125 7.9375 4.8125 8.34375C4.8125 8.75 5.15625 9.09375 5.5625 9.09375C5.96875 9.09375 6.3125 8.75 6.3125 8.34375C6.3125 7.9375 6 7.59375 5.5625 7.59375Z",fill:"currentColor"}),f.jsx("path",{d:"M10 7.59375C9.59375 7.59375 9.25 7.9375 9.25 8.34375C9.25 8.75 9.59375 9.09375 10 9.09375C10.4062 9.09375 10.75 8.75 10.75 8.34375C10.75 7.9375 10.4062 7.59375 10 7.59375Z",fill:"currentColor"}),f.jsx("path",{d:"M14.4375 7.59375C14.0313 7.59375 13.6875 7.9375 13.6875 8.34375C13.6875 8.75 14.0313 9.09375 14.4375 9.09375C14.8438 9.09375 15.1875 8.75 15.1875 8.34375C15.1875 7.9375 14.8438 7.59375 14.4375 7.59375Z",fill:"currentColor"})]})}function xX(e){return f.jsx("svg",{viewBox:"0 0 14 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e,children:f.jsx("path",{d:"M7 0.5625C3.34375 0.5625 0.46875 2.28125 0.46875 4.4375V15.5625C0.46875 17.7188 3.40625 19.4375 6.96875 19.4375C10.5625 19.4375 13.5 17.6875 13.5 15.5625V4.4375C13.5312 2.25 10.6562 0.5625 7 0.5625ZM7 1.96875C10 1.96875 12.125 3.28125 12.125 4.4375C12.125 5.625 10.0312 6.90625 7 6.90625C3.96875 6.90625 1.875 5.59375 1.875 4.4375C1.875 3.25 4 1.96875 7 1.96875ZM7 18.0625C4.0625 18.0625 1.90625 16.75 1.90625 15.5938V14.375C3.09375 15.25 4.90625 15.7813 7 15.7813C9.09375 15.7813 10.9375 15.2188 12.125 14.375V15.5938C12.125 16.75 9.9375 18.0625 7 18.0625ZM7 14.375C4 14.375 1.90625 13.125 1.90625 12V10.5625C3.125 11.4375 5.03125 11.9688 7 11.9688C9.0625 11.9688 10.9063 11.4375 12.125 10.5625V12C12.125 13.125 10 14.375 7 14.375ZM11.3125 9.40625C10.3437 10.125 8.75 10.5625 7 10.5625C5.28125 10.5625 3.65625 10.125 2.6875 9.40625C2.3125 9.15625 1.90625 8.71875 1.90625 8.1875V6.875C3.09375 7.75 4.9375 8.3125 7.03125 8.3125C9.125 8.3125 10.9688 7.75 12.1562 6.875V8.1875C12.125 8.6875 11.6875 9.125 11.3125 9.40625Z",fill:"currentColor"})})}function kX(e){return f.jsxs("svg",{viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e,children:[f.jsx("g",{clipPath:"url(#clip0_6318_531)",children:f.jsx("path",{d:"M18.7505 13.7189L16.813 11.7814C16.0317 11.0002 14.7505 11.0002 13.9692 11.7814L13.438 12.3127L11.7192 10.5939L13.3442 8.96891L16.5317 8.12515C17.2192 7.93765 17.7817 7.37515 17.9692 6.68765L18.8755 3.3439C18.9692 2.9689 18.7505 2.5939 18.3755 2.4689C18.0005 2.37515 17.6255 2.5939 17.5005 2.9689L16.5942 6.31265C16.5317 6.5314 16.3755 6.68765 16.1567 6.75015L12.813 7.6564C12.688 7.68765 12.5942 7.75015 12.5005 7.8439L10.7505 9.59391L9.68799 8.5314L11.438 6.7814C11.5317 6.68765 11.5942 6.5939 11.6255 6.4689L12.5005 3.12515C12.563 2.9064 12.7192 2.75015 12.938 2.68765L16.2817 1.7814C16.6567 1.68765 16.8755 1.2814 16.7817 0.906405C16.688 0.531405 16.313 0.312655 15.938 0.437655L12.5942 1.31265C11.9067 1.50015 11.3442 2.06265 11.1567 2.75015L10.313 5.9064L8.68799 7.5314L7.063 5.9064C7.688 5.18765 7.7505 4.12515 7.188 3.3439L5.84425 1.56265C5.5005 1.0939 4.96925 0.812655 4.3755 0.781405C3.78175 0.750155 3.21925 0.937655 2.813 1.37515L1.53175 2.6564C1.1255 3.06265 0.906746 3.62515 0.937996 4.2189C0.969246 4.81265 1.2505 5.3439 1.71925 5.68765L3.5005 7.0314C3.84425 7.31265 4.28175 7.43765 4.71925 7.43765C5.21925 7.43765 5.688 7.25015 6.063 6.9064L7.688 8.5314L5.59425 10.6252L2.438 11.4689C1.7505 11.6564 1.188 12.2189 1.0005 12.9064L0.312996 15.5002C0.125496 16.1877 0.312996 16.9377 0.844246 17.4689L1.813 18.4377C2.188 18.8127 2.71925 19.0314 3.2505 19.0314C3.438 19.0314 3.59425 19.0002 3.78175 18.9689L6.3755 18.2814C7.063 18.0939 7.6255 17.5314 7.813 16.8439L8.65675 13.6877L10.7505 11.5939L12.4692 13.3127L11.938 13.8439C11.1567 14.6252 11.1567 15.9064 11.938 16.6877L13.8755 18.6252C14.5317 19.2814 15.3755 19.6252 16.313 19.6252C17.2505 19.6252 18.0942 19.2814 18.7505 18.6252C19.4067 17.9689 19.7505 17.1252 19.7505 16.1877C19.7505 15.2502 19.4067 14.3752 18.7505 13.7189ZM4.34425 5.87515L2.563 4.5314C2.3755 4.37515 2.34425 4.18765 2.313 4.0939C2.313 4.00015 2.313 3.7814 2.5005 3.62515L3.78175 2.3439C3.938 2.18765 4.09425 2.1564 4.21925 2.1564H4.2505C4.34425 2.1564 4.53175 2.2189 4.688 2.4064L6.03175 4.18765C6.21925 4.43765 6.188 4.75015 5.96925 4.9689L5.1255 5.81265C4.938 6.0314 4.59425 6.06265 4.34425 5.87515ZM7.53175 12.8127C7.438 12.9064 7.3755 13.0002 7.34425 13.1252L6.438 16.4689C6.3755 16.6877 6.21925 16.8439 6.0005 16.9064L3.40675 17.5939C3.188 17.6564 2.96925 17.5939 2.813 17.4377L1.84425 16.4689C1.688 16.3127 1.6255 16.0939 1.688 15.8752L2.3755 13.2814C2.438 13.0627 2.59425 12.9064 2.813 12.8439L6.15675 11.9377C6.28175 11.9064 6.3755 11.8439 6.46925 11.7502L8.71924 9.50015L9.78174 10.5627L7.53175 12.8127ZM17.7505 17.5939C17.3755 17.9689 16.8442 18.1877 16.313 18.1877C15.7817 18.1877 15.2505 17.9689 14.8755 17.5939L12.938 15.6564C12.7192 15.4377 12.7192 15.0314 12.938 14.8127L13.4692 14.2814L13.9067 14.7189C14.0317 14.8439 14.2192 14.9377 14.4067 14.9377C14.5942 14.9377 14.7817 14.8752 14.9067 14.7189C15.188 14.4377 15.188 14.0002 14.9067 13.7189L14.4692 13.2814L15.0005 12.7502C15.1255 12.6252 15.2505 12.5627 15.438 12.5627C15.5942 12.5627 15.7505 12.6252 15.8755 12.7502L17.813 14.6877C18.188 15.0627 18.4067 15.5939 18.4067 16.1252C18.4067 16.6564 18.1567 17.2189 17.7505 17.5939Z",fill:"currentColor"})}),f.jsx("defs",{children:f.jsx("clipPath",{id:"clip0_6318_531",children:f.jsx("rect",{width:"20",height:"20",fill:"white"})})})]})}/** * table-core * * Copyright (c) TanStack @@ -98,7 +98,7 @@ Error generating stack: `+o.message+` */function ii(e,t){return typeof e=="function"?e(t):e}function Tr(e,t){return n=>{t.setState(r=>({...r,[e]:ii(n,r[e])}))}}function Ig(e){return e instanceof Function}function CX(e){return Array.isArray(e)&&e.every(t=>typeof t=="number")}function _X(e,t){const n=[],r=a=>{a.forEach(o=>{n.push(o);const i=t(o);i!=null&&i.length&&r(i)})};return r(e),n}function $e(e,t,n){let r=[],a;return o=>{let i;n.key&&n.debug&&(i=Date.now());const s=e(o);if(!(s.length!==r.length||s.some((u,d)=>r[d]!==u)))return a;r=s;let c;if(n.key&&n.debug&&(c=Date.now()),a=t(...s),n==null||n.onChange==null||n.onChange(a),n.key&&n.debug&&n!=null&&n.debug()){const u=Math.round((Date.now()-i)*100)/100,d=Math.round((Date.now()-c)*100)/100,g=d/16,m=(b,y)=>{for(b=String(b);b.length{var a;return(a=e==null?void 0:e.debugAll)!=null?a:e[t]},key:!1,onChange:r}}function AX(e,t,n,r){var a,o;const s={...e._getDefaultColumnDef(),...t},l=s.accessorKey;let c=(a=(o=s.id)!=null?o:l?l.replace(".","_"):void 0)!=null?a:typeof s.header=="string"?s.header:void 0,u;if(s.accessorFn?u=s.accessorFn:l&&(l.includes(".")?u=g=>{let m=g;for(const y of l.split(".")){var b;m=(b=m)==null?void 0:b[y]}return m}:u=g=>g[s.accessorKey]),!c)throw new Error;let d={id:`${String(c)}`,accessorFn:u,parent:r,depth:n,columnDef:s,columns:[],getFlatColumns:$e(()=>[!0],()=>{var g;return[d,...(g=d.columns)==null?void 0:g.flatMap(m=>m.getFlatColumns())]},Fe(e.options,"debugColumns")),getLeafColumns:$e(()=>[e._getOrderColumnsFn()],g=>{var m;if((m=d.columns)!=null&&m.length){let b=d.columns.flatMap(y=>y.getLeafColumns());return g(b)}return[d]},Fe(e.options,"debugColumns"))};for(const g of e._features)g.createColumn==null||g.createColumn(d,e);return d}const In="debugHeaders";function g2(e,t,n){var r;let o={id:(r=n.id)!=null?r:t.id,column:t,index:n.index,isPlaceholder:!!n.isPlaceholder,placeholderId:n.placeholderId,depth:n.depth,subHeaders:[],colSpan:0,rowSpan:0,headerGroup:null,getLeafHeaders:()=>{const i=[],s=l=>{l.subHeaders&&l.subHeaders.length&&l.subHeaders.map(s),i.push(l)};return s(o),i},getContext:()=>({table:e,header:o,column:t})};return e._features.forEach(i=>{i.createHeader==null||i.createHeader(o,e)}),o}const TX={createTable:e=>{e.getHeaderGroups=$e(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.left,e.getState().columnPinning.right],(t,n,r,a)=>{var o,i;const s=(o=r==null?void 0:r.map(d=>n.find(g=>g.id===d)).filter(Boolean))!=null?o:[],l=(i=a==null?void 0:a.map(d=>n.find(g=>g.id===d)).filter(Boolean))!=null?i:[],c=n.filter(d=>!(r!=null&&r.includes(d.id))&&!(a!=null&&a.includes(d.id)));return Xf(t,[...s,...c,...l],e)},Fe(e.options,In)),e.getCenterHeaderGroups=$e(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.left,e.getState().columnPinning.right],(t,n,r,a)=>(n=n.filter(o=>!(r!=null&&r.includes(o.id))&&!(a!=null&&a.includes(o.id))),Xf(t,n,e,"center")),Fe(e.options,In)),e.getLeftHeaderGroups=$e(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.left],(t,n,r)=>{var a;const o=(a=r==null?void 0:r.map(i=>n.find(s=>s.id===i)).filter(Boolean))!=null?a:[];return Xf(t,o,e,"left")},Fe(e.options,In)),e.getRightHeaderGroups=$e(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.right],(t,n,r)=>{var a;const o=(a=r==null?void 0:r.map(i=>n.find(s=>s.id===i)).filter(Boolean))!=null?a:[];return Xf(t,o,e,"right")},Fe(e.options,In)),e.getFooterGroups=$e(()=>[e.getHeaderGroups()],t=>[...t].reverse(),Fe(e.options,In)),e.getLeftFooterGroups=$e(()=>[e.getLeftHeaderGroups()],t=>[...t].reverse(),Fe(e.options,In)),e.getCenterFooterGroups=$e(()=>[e.getCenterHeaderGroups()],t=>[...t].reverse(),Fe(e.options,In)),e.getRightFooterGroups=$e(()=>[e.getRightHeaderGroups()],t=>[...t].reverse(),Fe(e.options,In)),e.getFlatHeaders=$e(()=>[e.getHeaderGroups()],t=>t.map(n=>n.headers).flat(),Fe(e.options,In)),e.getLeftFlatHeaders=$e(()=>[e.getLeftHeaderGroups()],t=>t.map(n=>n.headers).flat(),Fe(e.options,In)),e.getCenterFlatHeaders=$e(()=>[e.getCenterHeaderGroups()],t=>t.map(n=>n.headers).flat(),Fe(e.options,In)),e.getRightFlatHeaders=$e(()=>[e.getRightHeaderGroups()],t=>t.map(n=>n.headers).flat(),Fe(e.options,In)),e.getCenterLeafHeaders=$e(()=>[e.getCenterFlatHeaders()],t=>t.filter(n=>{var r;return!((r=n.subHeaders)!=null&&r.length)}),Fe(e.options,In)),e.getLeftLeafHeaders=$e(()=>[e.getLeftFlatHeaders()],t=>t.filter(n=>{var r;return!((r=n.subHeaders)!=null&&r.length)}),Fe(e.options,In)),e.getRightLeafHeaders=$e(()=>[e.getRightFlatHeaders()],t=>t.filter(n=>{var r;return!((r=n.subHeaders)!=null&&r.length)}),Fe(e.options,In)),e.getLeafHeaders=$e(()=>[e.getLeftHeaderGroups(),e.getCenterHeaderGroups(),e.getRightHeaderGroups()],(t,n,r)=>{var a,o,i,s,l,c;return[...(a=(o=t[0])==null?void 0:o.headers)!=null?a:[],...(i=(s=n[0])==null?void 0:s.headers)!=null?i:[],...(l=(c=r[0])==null?void 0:c.headers)!=null?l:[]].map(u=>u.getLeafHeaders()).flat()},Fe(e.options,In))}};function Xf(e,t,n,r){var a,o;let i=0;const s=function(g,m){m===void 0&&(m=1),i=Math.max(i,m),g.filter(b=>b.getIsVisible()).forEach(b=>{var y;(y=b.columns)!=null&&y.length&&s(b.columns,m+1)},0)};s(e);let l=[];const c=(g,m)=>{const b={depth:m,id:[r,`${m}`].filter(Boolean).join("_"),headers:[]},y=[];g.forEach(w=>{const v=[...y].reverse()[0],h=w.column.depth===b.depth;let S,E=!1;if(h&&w.column.parent?S=w.column.parent:(S=w.column,E=!0),v&&(v==null?void 0:v.column)===S)v.subHeaders.push(w);else{const k=g2(n,S,{id:[r,m,S.id,w==null?void 0:w.id].filter(Boolean).join("_"),isPlaceholder:E,placeholderId:E?`${y.filter(x=>x.column===S).length}`:void 0,depth:m,index:y.length});k.subHeaders.push(w),y.push(k)}b.headers.push(w),w.headerGroup=b}),l.push(b),m>0&&c(y,m-1)},u=t.map((g,m)=>g2(n,g,{depth:i,index:m}));c(u,i-1),l.reverse();const d=g=>g.filter(b=>b.column.getIsVisible()).map(b=>{let y=0,w=0,v=[0];b.subHeaders&&b.subHeaders.length?(v=[],d(b.subHeaders).forEach(S=>{let{colSpan:E,rowSpan:k}=S;y+=E,v.push(k)})):y=1;const h=Math.min(...v);return w=w+h,b.colSpan=y,b.rowSpan=w,{colSpan:y,rowSpan:w}});return d((a=(o=l[0])==null?void 0:o.headers)!=null?a:[]),l}const Qf={size:150,minSize:20,maxSize:Number.MAX_SAFE_INTEGER},Nb=()=>({startOffset:null,startSize:null,deltaOffset:null,deltaPercentage:null,isResizingColumn:!1,columnSizingStart:[]}),RX={getDefaultColumnDef:()=>Qf,getInitialState:e=>({columnSizing:{},columnSizingInfo:Nb(),...e}),getDefaultOptions:e=>({columnResizeMode:"onEnd",columnResizeDirection:"ltr",onColumnSizingChange:Tr("columnSizing",e),onColumnSizingInfoChange:Tr("columnSizingInfo",e)}),createColumn:(e,t)=>{e.getSize=()=>{var n,r,a;const o=t.getState().columnSizing[e.id];return Math.min(Math.max((n=e.columnDef.minSize)!=null?n:Qf.minSize,(r=o??e.columnDef.size)!=null?r:Qf.size),(a=e.columnDef.maxSize)!=null?a:Qf.maxSize)},e.getStart=$e(n=>[n,Hu(t,n),t.getState().columnSizing],(n,r)=>r.slice(0,e.getIndex(n)).reduce((a,o)=>a+o.getSize(),0),Fe(t.options,"debugColumns")),e.getAfter=$e(n=>[n,Hu(t,n),t.getState().columnSizing],(n,r)=>r.slice(e.getIndex(n)+1).reduce((a,o)=>a+o.getSize(),0),Fe(t.options,"debugColumns")),e.resetSize=()=>{t.setColumnSizing(n=>{let{[e.id]:r,...a}=n;return a})},e.getCanResize=()=>{var n,r;return((n=e.columnDef.enableResizing)!=null?n:!0)&&((r=t.options.enableColumnResizing)!=null?r:!0)},e.getIsResizing=()=>t.getState().columnSizingInfo.isResizingColumn===e.id},createHeader:(e,t)=>{e.getSize=()=>{let n=0;const r=a=>{if(a.subHeaders.length)a.subHeaders.forEach(r);else{var o;n+=(o=a.column.getSize())!=null?o:0}};return r(e),n},e.getStart=()=>{if(e.index>0){const n=e.headerGroup.headers[e.index-1];return n.getStart()+n.getSize()}return 0},e.getResizeHandler=n=>{const r=t.getColumn(e.column.id),a=r==null?void 0:r.getCanResize();return o=>{if(!r||!a||(o.persist==null||o.persist(),Ib(o)&&o.touches&&o.touches.length>1))return;const i=e.getSize(),s=e?e.getLeafHeaders().map(v=>[v.column.id,v.column.getSize()]):[[r.id,r.getSize()]],l=Ib(o)?Math.round(o.touches[0].clientX):o.clientX,c={},u=(v,h)=>{typeof h=="number"&&(t.setColumnSizingInfo(S=>{var E,k;const x=t.options.columnResizeDirection==="rtl"?-1:1,C=(h-((E=S==null?void 0:S.startOffset)!=null?E:0))*x,_=Math.max(C/((k=S==null?void 0:S.startSize)!=null?k:0),-.999999);return S.columnSizingStart.forEach(R=>{let[T,L]=R;c[T]=Math.round(Math.max(L+L*_,0)*100)/100}),{...S,deltaOffset:C,deltaPercentage:_}}),(t.options.columnResizeMode==="onChange"||v==="end")&&t.setColumnSizing(S=>({...S,...c})))},d=v=>u("move",v),g=v=>{u("end",v),t.setColumnSizingInfo(h=>({...h,isResizingColumn:!1,startOffset:null,startSize:null,deltaOffset:null,deltaPercentage:null,columnSizingStart:[]}))},m=n||typeof document<"u"?document:null,b={moveHandler:v=>d(v.clientX),upHandler:v=>{m==null||m.removeEventListener("mousemove",b.moveHandler),m==null||m.removeEventListener("mouseup",b.upHandler),g(v.clientX)}},y={moveHandler:v=>(v.cancelable&&(v.preventDefault(),v.stopPropagation()),d(v.touches[0].clientX),!1),upHandler:v=>{var h;m==null||m.removeEventListener("touchmove",y.moveHandler),m==null||m.removeEventListener("touchend",y.upHandler),v.cancelable&&(v.preventDefault(),v.stopPropagation()),g((h=v.touches[0])==null?void 0:h.clientX)}},w=NX()?{passive:!1}:!1;Ib(o)?(m==null||m.addEventListener("touchmove",y.moveHandler,w),m==null||m.addEventListener("touchend",y.upHandler,w)):(m==null||m.addEventListener("mousemove",b.moveHandler,w),m==null||m.addEventListener("mouseup",b.upHandler,w)),t.setColumnSizingInfo(v=>({...v,startOffset:l,startSize:i,deltaOffset:0,deltaPercentage:0,columnSizingStart:s,isResizingColumn:r.id}))}}},createTable:e=>{e.setColumnSizing=t=>e.options.onColumnSizingChange==null?void 0:e.options.onColumnSizingChange(t),e.setColumnSizingInfo=t=>e.options.onColumnSizingInfoChange==null?void 0:e.options.onColumnSizingInfoChange(t),e.resetColumnSizing=t=>{var n;e.setColumnSizing(t?{}:(n=e.initialState.columnSizing)!=null?n:{})},e.resetHeaderSizeInfo=t=>{var n;e.setColumnSizingInfo(t?Nb():(n=e.initialState.columnSizingInfo)!=null?n:Nb())},e.getTotalSize=()=>{var t,n;return(t=(n=e.getHeaderGroups()[0])==null?void 0:n.headers.reduce((r,a)=>r+a.getSize(),0))!=null?t:0},e.getLeftTotalSize=()=>{var t,n;return(t=(n=e.getLeftHeaderGroups()[0])==null?void 0:n.headers.reduce((r,a)=>r+a.getSize(),0))!=null?t:0},e.getCenterTotalSize=()=>{var t,n;return(t=(n=e.getCenterHeaderGroups()[0])==null?void 0:n.headers.reduce((r,a)=>r+a.getSize(),0))!=null?t:0},e.getRightTotalSize=()=>{var t,n;return(t=(n=e.getRightHeaderGroups()[0])==null?void 0:n.headers.reduce((r,a)=>r+a.getSize(),0))!=null?t:0}}};let Jf=null;function NX(){if(typeof Jf=="boolean")return Jf;let e=!1;try{const t={get passive(){return e=!0,!1}},n=()=>{};window.addEventListener("test",n,t),window.removeEventListener("test",n)}catch{e=!1}return Jf=e,Jf}function Ib(e){return e.type==="touchstart"}const IX={getInitialState:e=>({expanded:{},...e}),getDefaultOptions:e=>({onExpandedChange:Tr("expanded",e),paginateExpandedRows:!0}),createTable:e=>{let t=!1,n=!1;e._autoResetExpanded=()=>{var r,a;if(!t){e._queue(()=>{t=!0});return}if((r=(a=e.options.autoResetAll)!=null?a:e.options.autoResetExpanded)!=null?r:!e.options.manualExpanding){if(n)return;n=!0,e._queue(()=>{e.resetExpanded(),n=!1})}},e.setExpanded=r=>e.options.onExpandedChange==null?void 0:e.options.onExpandedChange(r),e.toggleAllRowsExpanded=r=>{r??!e.getIsAllRowsExpanded()?e.setExpanded(!0):e.setExpanded({})},e.resetExpanded=r=>{var a,o;e.setExpanded(r?{}:(a=(o=e.initialState)==null?void 0:o.expanded)!=null?a:{})},e.getCanSomeRowsExpand=()=>e.getPrePaginationRowModel().flatRows.some(r=>r.getCanExpand()),e.getToggleAllRowsExpandedHandler=()=>r=>{r.persist==null||r.persist(),e.toggleAllRowsExpanded()},e.getIsSomeRowsExpanded=()=>{const r=e.getState().expanded;return r===!0||Object.values(r).some(Boolean)},e.getIsAllRowsExpanded=()=>{const r=e.getState().expanded;return typeof r=="boolean"?r===!0:!(!Object.keys(r).length||e.getRowModel().flatRows.some(a=>!a.getIsExpanded()))},e.getExpandedDepth=()=>{let r=0;return(e.getState().expanded===!0?Object.keys(e.getRowModel().rowsById):Object.keys(e.getState().expanded)).forEach(o=>{const i=o.split(".");r=Math.max(r,i.length)}),r},e.getPreExpandedRowModel=()=>e.getSortedRowModel(),e.getExpandedRowModel=()=>(!e._getExpandedRowModel&&e.options.getExpandedRowModel&&(e._getExpandedRowModel=e.options.getExpandedRowModel(e)),e.options.manualExpanding||!e._getExpandedRowModel?e.getPreExpandedRowModel():e._getExpandedRowModel())},createRow:(e,t)=>{e.toggleExpanded=n=>{t.setExpanded(r=>{var a;const o=r===!0?!0:!!(r!=null&&r[e.id]);let i={};if(r===!0?Object.keys(t.getRowModel().rowsById).forEach(s=>{i[s]=!0}):i=r,n=(a=n)!=null?a:!o,!o&&n)return{...i,[e.id]:!0};if(o&&!n){const{[e.id]:s,...l}=i;return l}return r})},e.getIsExpanded=()=>{var n;const r=t.getState().expanded;return!!((n=t.options.getIsRowExpanded==null?void 0:t.options.getIsRowExpanded(e))!=null?n:r===!0||r!=null&&r[e.id])},e.getCanExpand=()=>{var n,r,a;return(n=t.options.getRowCanExpand==null?void 0:t.options.getRowCanExpand(e))!=null?n:((r=t.options.enableExpanding)!=null?r:!0)&&!!((a=e.subRows)!=null&&a.length)},e.getIsAllParentsExpanded=()=>{let n=!0,r=e;for(;n&&r.parentId;)r=t.getRow(r.parentId,!0),n=r.getIsExpanded();return n},e.getToggleExpandedHandler=()=>{const n=e.getCanExpand();return()=>{n&&e.toggleExpanded()}}}},_6=(e,t,n)=>{var r;const a=n.toLowerCase();return!!(!((r=e.getValue(t))==null||(r=r.toString())==null||(r=r.toLowerCase())==null)&&r.includes(a))};_6.autoRemove=e=>pa(e);const A6=(e,t,n)=>{var r;return!!(!((r=e.getValue(t))==null||(r=r.toString())==null)&&r.includes(n))};A6.autoRemove=e=>pa(e);const T6=(e,t,n)=>{var r;return((r=e.getValue(t))==null||(r=r.toString())==null?void 0:r.toLowerCase())===(n==null?void 0:n.toLowerCase())};T6.autoRemove=e=>pa(e);const R6=(e,t,n)=>{var r;return(r=e.getValue(t))==null?void 0:r.includes(n)};R6.autoRemove=e=>pa(e)||!(e!=null&&e.length);const N6=(e,t,n)=>!n.some(r=>{var a;return!((a=e.getValue(t))!=null&&a.includes(r))});N6.autoRemove=e=>pa(e)||!(e!=null&&e.length);const I6=(e,t,n)=>n.some(r=>{var a;return(a=e.getValue(t))==null?void 0:a.includes(r)});I6.autoRemove=e=>pa(e)||!(e!=null&&e.length);const O6=(e,t,n)=>e.getValue(t)===n;O6.autoRemove=e=>pa(e);const D6=(e,t,n)=>e.getValue(t)==n;D6.autoRemove=e=>pa(e);const v_=(e,t,n)=>{let[r,a]=n;const o=e.getValue(t);return o>=r&&o<=a};v_.resolveFilterValue=e=>{let[t,n]=e,r=typeof t!="number"?parseFloat(t):t,a=typeof n!="number"?parseFloat(n):n,o=t===null||Number.isNaN(r)?-1/0:r,i=n===null||Number.isNaN(a)?1/0:a;if(o>i){const s=o;o=i,i=s}return[o,i]};v_.autoRemove=e=>pa(e)||pa(e[0])&&pa(e[1]);const Qa={includesString:_6,includesStringSensitive:A6,equalsString:T6,arrIncludes:R6,arrIncludesAll:N6,arrIncludesSome:I6,equals:O6,weakEquals:D6,inNumberRange:v_};function pa(e){return e==null||e===""}const OX={getDefaultColumnDef:()=>({filterFn:"auto"}),getInitialState:e=>({columnFilters:[],globalFilter:void 0,...e}),getDefaultOptions:e=>({onColumnFiltersChange:Tr("columnFilters",e),onGlobalFilterChange:Tr("globalFilter",e),filterFromLeafRows:!1,maxLeafRowFilterDepth:100,globalFilterFn:"auto",getColumnCanGlobalFilter:t=>{var n;const r=(n=e.getCoreRowModel().flatRows[0])==null||(n=n._getAllCellsByColumnId()[t.id])==null?void 0:n.getValue();return typeof r=="string"||typeof r=="number"}}),createColumn:(e,t)=>{e.getAutoFilterFn=()=>{const n=t.getCoreRowModel().flatRows[0],r=n==null?void 0:n.getValue(e.id);return typeof r=="string"?Qa.includesString:typeof r=="number"?Qa.inNumberRange:typeof r=="boolean"||r!==null&&typeof r=="object"?Qa.equals:Array.isArray(r)?Qa.arrIncludes:Qa.weakEquals},e.getFilterFn=()=>{var n,r;return Ig(e.columnDef.filterFn)?e.columnDef.filterFn:e.columnDef.filterFn==="auto"?e.getAutoFilterFn():(n=(r=t.options.filterFns)==null?void 0:r[e.columnDef.filterFn])!=null?n:Qa[e.columnDef.filterFn]},e.getCanFilter=()=>{var n,r,a;return((n=e.columnDef.enableColumnFilter)!=null?n:!0)&&((r=t.options.enableColumnFilters)!=null?r:!0)&&((a=t.options.enableFilters)!=null?a:!0)&&!!e.accessorFn},e.getCanGlobalFilter=()=>{var n,r,a,o;return((n=e.columnDef.enableGlobalFilter)!=null?n:!0)&&((r=t.options.enableGlobalFilter)!=null?r:!0)&&((a=t.options.enableFilters)!=null?a:!0)&&((o=t.options.getColumnCanGlobalFilter==null?void 0:t.options.getColumnCanGlobalFilter(e))!=null?o:!0)&&!!e.accessorFn},e.getIsFiltered=()=>e.getFilterIndex()>-1,e.getFilterValue=()=>{var n;return(n=t.getState().columnFilters)==null||(n=n.find(r=>r.id===e.id))==null?void 0:n.value},e.getFilterIndex=()=>{var n,r;return(n=(r=t.getState().columnFilters)==null?void 0:r.findIndex(a=>a.id===e.id))!=null?n:-1},e.setFilterValue=n=>{t.setColumnFilters(r=>{const a=e.getFilterFn(),o=r==null?void 0:r.find(u=>u.id===e.id),i=ii(n,o?o.value:void 0);if(m2(a,i,e)){var s;return(s=r==null?void 0:r.filter(u=>u.id!==e.id))!=null?s:[]}const l={id:e.id,value:i};if(o){var c;return(c=r==null?void 0:r.map(u=>u.id===e.id?l:u))!=null?c:[]}return r!=null&&r.length?[...r,l]:[l]})},e._getFacetedRowModel=t.options.getFacetedRowModel&&t.options.getFacetedRowModel(t,e.id),e.getFacetedRowModel=()=>e._getFacetedRowModel?e._getFacetedRowModel():t.getPreFilteredRowModel(),e._getFacetedUniqueValues=t.options.getFacetedUniqueValues&&t.options.getFacetedUniqueValues(t,e.id),e.getFacetedUniqueValues=()=>e._getFacetedUniqueValues?e._getFacetedUniqueValues():new Map,e._getFacetedMinMaxValues=t.options.getFacetedMinMaxValues&&t.options.getFacetedMinMaxValues(t,e.id),e.getFacetedMinMaxValues=()=>{if(e._getFacetedMinMaxValues)return e._getFacetedMinMaxValues()}},createRow:(e,t)=>{e.columnFilters={},e.columnFiltersMeta={}},createTable:e=>{e.getGlobalAutoFilterFn=()=>Qa.includesString,e.getGlobalFilterFn=()=>{var t,n;const{globalFilterFn:r}=e.options;return Ig(r)?r:r==="auto"?e.getGlobalAutoFilterFn():(t=(n=e.options.filterFns)==null?void 0:n[r])!=null?t:Qa[r]},e.setColumnFilters=t=>{const n=e.getAllLeafColumns(),r=a=>{var o;return(o=ii(t,a))==null?void 0:o.filter(i=>{const s=n.find(l=>l.id===i.id);if(s){const l=s.getFilterFn();if(m2(l,i.value,s))return!1}return!0})};e.options.onColumnFiltersChange==null||e.options.onColumnFiltersChange(r)},e.setGlobalFilter=t=>{e.options.onGlobalFilterChange==null||e.options.onGlobalFilterChange(t)},e.resetGlobalFilter=t=>{e.setGlobalFilter(t?void 0:e.initialState.globalFilter)},e.resetColumnFilters=t=>{var n,r;e.setColumnFilters(t?[]:(n=(r=e.initialState)==null?void 0:r.columnFilters)!=null?n:[])},e.getPreFilteredRowModel=()=>e.getCoreRowModel(),e.getFilteredRowModel=()=>(!e._getFilteredRowModel&&e.options.getFilteredRowModel&&(e._getFilteredRowModel=e.options.getFilteredRowModel(e)),e.options.manualFiltering||!e._getFilteredRowModel?e.getPreFilteredRowModel():e._getFilteredRowModel()),e._getGlobalFacetedRowModel=e.options.getFacetedRowModel&&e.options.getFacetedRowModel(e,"__global__"),e.getGlobalFacetedRowModel=()=>e.options.manualFiltering||!e._getGlobalFacetedRowModel?e.getPreFilteredRowModel():e._getGlobalFacetedRowModel(),e._getGlobalFacetedUniqueValues=e.options.getFacetedUniqueValues&&e.options.getFacetedUniqueValues(e,"__global__"),e.getGlobalFacetedUniqueValues=()=>e._getGlobalFacetedUniqueValues?e._getGlobalFacetedUniqueValues():new Map,e._getGlobalFacetedMinMaxValues=e.options.getFacetedMinMaxValues&&e.options.getFacetedMinMaxValues(e,"__global__"),e.getGlobalFacetedMinMaxValues=()=>{if(e._getGlobalFacetedMinMaxValues)return e._getGlobalFacetedMinMaxValues()}}};function m2(e,t,n){return(e&&e.autoRemove?e.autoRemove(t,n):!1)||typeof t>"u"||typeof t=="string"&&!t}const DX=(e,t,n)=>n.reduce((r,a)=>{const o=a.getValue(e);return r+(typeof o=="number"?o:0)},0),LX=(e,t,n)=>{let r;return n.forEach(a=>{const o=a.getValue(e);o!=null&&(r>o||r===void 0&&o>=o)&&(r=o)}),r},MX=(e,t,n)=>{let r;return n.forEach(a=>{const o=a.getValue(e);o!=null&&(r=o)&&(r=o)}),r},PX=(e,t,n)=>{let r,a;return n.forEach(o=>{const i=o.getValue(e);i!=null&&(r===void 0?i>=i&&(r=a=i):(r>i&&(r=i),a{let n=0,r=0;if(t.forEach(a=>{let o=a.getValue(e);o!=null&&(o=+o)>=o&&(++n,r+=o)}),n)return r/n},FX=(e,t)=>{if(!t.length)return;const n=t.map(o=>o.getValue(e));if(!CX(n))return;if(n.length===1)return n[0];const r=Math.floor(n.length/2),a=n.sort((o,i)=>o-i);return n.length%2!==0?a[r]:(a[r-1]+a[r])/2},jX=(e,t)=>Array.from(new Set(t.map(n=>n.getValue(e))).values()),zX=(e,t)=>new Set(t.map(n=>n.getValue(e))).size,UX=(e,t)=>t.length,Ob={sum:DX,min:LX,max:MX,extent:PX,mean:$X,median:FX,unique:jX,uniqueCount:zX,count:UX},BX={getDefaultColumnDef:()=>({aggregatedCell:e=>{var t,n;return(t=(n=e.getValue())==null||n.toString==null?void 0:n.toString())!=null?t:null},aggregationFn:"auto"}),getInitialState:e=>({grouping:[],...e}),getDefaultOptions:e=>({onGroupingChange:Tr("grouping",e),groupedColumnMode:"reorder"}),createColumn:(e,t)=>{e.toggleGrouping=()=>{t.setGrouping(n=>n!=null&&n.includes(e.id)?n.filter(r=>r!==e.id):[...n??[],e.id])},e.getCanGroup=()=>{var n,r,a,o;return(n=(r=(a=(o=e.columnDef.enableGrouping)!=null?o:!0)!=null?a:t.options.enableGrouping)!=null?r:!0)!=null?n:!!e.accessorFn},e.getIsGrouped=()=>{var n;return(n=t.getState().grouping)==null?void 0:n.includes(e.id)},e.getGroupedIndex=()=>{var n;return(n=t.getState().grouping)==null?void 0:n.indexOf(e.id)},e.getToggleGroupingHandler=()=>{const n=e.getCanGroup();return()=>{n&&e.toggleGrouping()}},e.getAutoAggregationFn=()=>{const n=t.getCoreRowModel().flatRows[0],r=n==null?void 0:n.getValue(e.id);if(typeof r=="number")return Ob.sum;if(Object.prototype.toString.call(r)==="[object Date]")return Ob.extent},e.getAggregationFn=()=>{var n,r;if(!e)throw new Error;return Ig(e.columnDef.aggregationFn)?e.columnDef.aggregationFn:e.columnDef.aggregationFn==="auto"?e.getAutoAggregationFn():(n=(r=t.options.aggregationFns)==null?void 0:r[e.columnDef.aggregationFn])!=null?n:Ob[e.columnDef.aggregationFn]}},createTable:e=>{e.setGrouping=t=>e.options.onGroupingChange==null?void 0:e.options.onGroupingChange(t),e.resetGrouping=t=>{var n,r;e.setGrouping(t?[]:(n=(r=e.initialState)==null?void 0:r.grouping)!=null?n:[])},e.getPreGroupedRowModel=()=>e.getFilteredRowModel(),e.getGroupedRowModel=()=>(!e._getGroupedRowModel&&e.options.getGroupedRowModel&&(e._getGroupedRowModel=e.options.getGroupedRowModel(e)),e.options.manualGrouping||!e._getGroupedRowModel?e.getPreGroupedRowModel():e._getGroupedRowModel())},createRow:(e,t)=>{e.getIsGrouped=()=>!!e.groupingColumnId,e.getGroupingValue=n=>{if(e._groupingValuesCache.hasOwnProperty(n))return e._groupingValuesCache[n];const r=t.getColumn(n);return r!=null&&r.columnDef.getGroupingValue?(e._groupingValuesCache[n]=r.columnDef.getGroupingValue(e.original),e._groupingValuesCache[n]):e.getValue(n)},e._groupingValuesCache={}},createCell:(e,t,n,r)=>{e.getIsGrouped=()=>t.getIsGrouped()&&t.id===n.groupingColumnId,e.getIsPlaceholder=()=>!e.getIsGrouped()&&t.getIsGrouped(),e.getIsAggregated=()=>{var a;return!e.getIsGrouped()&&!e.getIsPlaceholder()&&!!((a=n.subRows)!=null&&a.length)}}};function HX(e,t,n){if(!(t!=null&&t.length)||!n)return e;const r=e.filter(o=>!t.includes(o.id));return n==="remove"?r:[...t.map(o=>e.find(i=>i.id===o)).filter(Boolean),...r]}const VX={getInitialState:e=>({columnOrder:[],...e}),getDefaultOptions:e=>({onColumnOrderChange:Tr("columnOrder",e)}),createColumn:(e,t)=>{e.getIndex=$e(n=>[Hu(t,n)],n=>n.findIndex(r=>r.id===e.id),Fe(t.options,"debugColumns")),e.getIsFirstColumn=n=>{var r;return((r=Hu(t,n)[0])==null?void 0:r.id)===e.id},e.getIsLastColumn=n=>{var r;const a=Hu(t,n);return((r=a[a.length-1])==null?void 0:r.id)===e.id}},createTable:e=>{e.setColumnOrder=t=>e.options.onColumnOrderChange==null?void 0:e.options.onColumnOrderChange(t),e.resetColumnOrder=t=>{var n;e.setColumnOrder(t?[]:(n=e.initialState.columnOrder)!=null?n:[])},e._getOrderColumnsFn=$e(()=>[e.getState().columnOrder,e.getState().grouping,e.options.groupedColumnMode],(t,n,r)=>a=>{let o=[];if(!(t!=null&&t.length))o=a;else{const i=[...t],s=[...a];for(;s.length&&i.length;){const l=i.shift(),c=s.findIndex(u=>u.id===l);c>-1&&o.push(s.splice(c,1)[0])}o=[...o,...s]}return HX(o,n,r)},Fe(e.options,"debugTable"))}},K1=0,Y1=10,Db=()=>({pageIndex:K1,pageSize:Y1}),qX={getInitialState:e=>({...e,pagination:{...Db(),...e==null?void 0:e.pagination}}),getDefaultOptions:e=>({onPaginationChange:Tr("pagination",e)}),createTable:e=>{let t=!1,n=!1;e._autoResetPageIndex=()=>{var r,a;if(!t){e._queue(()=>{t=!0});return}if((r=(a=e.options.autoResetAll)!=null?a:e.options.autoResetPageIndex)!=null?r:!e.options.manualPagination){if(n)return;n=!0,e._queue(()=>{e.resetPageIndex(),n=!1})}},e.setPagination=r=>{const a=o=>ii(r,o);return e.options.onPaginationChange==null?void 0:e.options.onPaginationChange(a)},e.resetPagination=r=>{var a;e.setPagination(r?Db():(a=e.initialState.pagination)!=null?a:Db())},e.setPageIndex=r=>{e.setPagination(a=>{let o=ii(r,a.pageIndex);const i=typeof e.options.pageCount>"u"||e.options.pageCount===-1?Number.MAX_SAFE_INTEGER:e.options.pageCount-1;return o=Math.max(0,Math.min(o,i)),{...a,pageIndex:o}})},e.resetPageIndex=r=>{var a,o;e.setPageIndex(r?K1:(a=(o=e.initialState)==null||(o=o.pagination)==null?void 0:o.pageIndex)!=null?a:K1)},e.resetPageSize=r=>{var a,o;e.setPageSize(r?Y1:(a=(o=e.initialState)==null||(o=o.pagination)==null?void 0:o.pageSize)!=null?a:Y1)},e.setPageSize=r=>{e.setPagination(a=>{const o=Math.max(1,ii(r,a.pageSize)),i=a.pageSize*a.pageIndex,s=Math.floor(i/o);return{...a,pageIndex:s,pageSize:o}})},e.setPageCount=r=>e.setPagination(a=>{var o;let i=ii(r,(o=e.options.pageCount)!=null?o:-1);return typeof i=="number"&&(i=Math.max(-1,i)),{...a,pageCount:i}}),e.getPageOptions=$e(()=>[e.getPageCount()],r=>{let a=[];return r&&r>0&&(a=[...new Array(r)].fill(null).map((o,i)=>i)),a},Fe(e.options,"debugTable")),e.getCanPreviousPage=()=>e.getState().pagination.pageIndex>0,e.getCanNextPage=()=>{const{pageIndex:r}=e.getState().pagination,a=e.getPageCount();return a===-1?!0:a===0?!1:re.setPageIndex(r=>r-1),e.nextPage=()=>e.setPageIndex(r=>r+1),e.getPrePaginationRowModel=()=>e.getExpandedRowModel(),e.getPaginationRowModel=()=>(!e._getPaginationRowModel&&e.options.getPaginationRowModel&&(e._getPaginationRowModel=e.options.getPaginationRowModel(e)),e.options.manualPagination||!e._getPaginationRowModel?e.getPrePaginationRowModel():e._getPaginationRowModel()),e.getPageCount=()=>{var r;return(r=e.options.pageCount)!=null?r:Math.ceil(e.getPrePaginationRowModel().rows.length/e.getState().pagination.pageSize)}}},Lb=()=>({left:[],right:[]}),Mb=()=>({top:[],bottom:[]}),GX={getInitialState:e=>({columnPinning:Lb(),rowPinning:Mb(),...e}),getDefaultOptions:e=>({onColumnPinningChange:Tr("columnPinning",e),onRowPinningChange:Tr("rowPinning",e)}),createColumn:(e,t)=>{e.pin=n=>{const r=e.getLeafColumns().map(a=>a.id).filter(Boolean);t.setColumnPinning(a=>{var o,i;if(n==="right"){var s,l;return{left:((s=a==null?void 0:a.left)!=null?s:[]).filter(d=>!(r!=null&&r.includes(d))),right:[...((l=a==null?void 0:a.right)!=null?l:[]).filter(d=>!(r!=null&&r.includes(d))),...r]}}if(n==="left"){var c,u;return{left:[...((c=a==null?void 0:a.left)!=null?c:[]).filter(d=>!(r!=null&&r.includes(d))),...r],right:((u=a==null?void 0:a.right)!=null?u:[]).filter(d=>!(r!=null&&r.includes(d)))}}return{left:((o=a==null?void 0:a.left)!=null?o:[]).filter(d=>!(r!=null&&r.includes(d))),right:((i=a==null?void 0:a.right)!=null?i:[]).filter(d=>!(r!=null&&r.includes(d)))}})},e.getCanPin=()=>e.getLeafColumns().some(r=>{var a,o,i;return((a=r.columnDef.enablePinning)!=null?a:!0)&&((o=(i=t.options.enableColumnPinning)!=null?i:t.options.enablePinning)!=null?o:!0)}),e.getIsPinned=()=>{const n=e.getLeafColumns().map(s=>s.id),{left:r,right:a}=t.getState().columnPinning,o=n.some(s=>r==null?void 0:r.includes(s)),i=n.some(s=>a==null?void 0:a.includes(s));return o?"left":i?"right":!1},e.getPinnedIndex=()=>{var n,r;const a=e.getIsPinned();return a?(n=(r=t.getState().columnPinning)==null||(r=r[a])==null?void 0:r.indexOf(e.id))!=null?n:-1:0}},createRow:(e,t)=>{e.pin=(n,r,a)=>{const o=r?e.getLeafRows().map(l=>{let{id:c}=l;return c}):[],i=a?e.getParentRows().map(l=>{let{id:c}=l;return c}):[],s=new Set([...i,e.id,...o]);t.setRowPinning(l=>{var c,u;if(n==="bottom"){var d,g;return{top:((d=l==null?void 0:l.top)!=null?d:[]).filter(y=>!(s!=null&&s.has(y))),bottom:[...((g=l==null?void 0:l.bottom)!=null?g:[]).filter(y=>!(s!=null&&s.has(y))),...Array.from(s)]}}if(n==="top"){var m,b;return{top:[...((m=l==null?void 0:l.top)!=null?m:[]).filter(y=>!(s!=null&&s.has(y))),...Array.from(s)],bottom:((b=l==null?void 0:l.bottom)!=null?b:[]).filter(y=>!(s!=null&&s.has(y)))}}return{top:((c=l==null?void 0:l.top)!=null?c:[]).filter(y=>!(s!=null&&s.has(y))),bottom:((u=l==null?void 0:l.bottom)!=null?u:[]).filter(y=>!(s!=null&&s.has(y)))}})},e.getCanPin=()=>{var n;const{enableRowPinning:r,enablePinning:a}=t.options;return typeof r=="function"?r(e):(n=r??a)!=null?n:!0},e.getIsPinned=()=>{const n=[e.id],{top:r,bottom:a}=t.getState().rowPinning,o=n.some(s=>r==null?void 0:r.includes(s)),i=n.some(s=>a==null?void 0:a.includes(s));return o?"top":i?"bottom":!1},e.getPinnedIndex=()=>{var n,r;const a=e.getIsPinned();if(!a)return-1;const o=(n=t._getPinnedRows(a))==null?void 0:n.map(i=>{let{id:s}=i;return s});return(r=o==null?void 0:o.indexOf(e.id))!=null?r:-1},e.getCenterVisibleCells=$e(()=>[e._getAllVisibleCells(),t.getState().columnPinning.left,t.getState().columnPinning.right],(n,r,a)=>{const o=[...r??[],...a??[]];return n.filter(i=>!o.includes(i.column.id))},Fe(t.options,"debugRows")),e.getLeftVisibleCells=$e(()=>[e._getAllVisibleCells(),t.getState().columnPinning.left,,],(n,r)=>(r??[]).map(o=>n.find(i=>i.column.id===o)).filter(Boolean).map(o=>({...o,position:"left"})),Fe(t.options,"debugRows")),e.getRightVisibleCells=$e(()=>[e._getAllVisibleCells(),t.getState().columnPinning.right],(n,r)=>(r??[]).map(o=>n.find(i=>i.column.id===o)).filter(Boolean).map(o=>({...o,position:"right"})),Fe(t.options,"debugRows"))},createTable:e=>{e.setColumnPinning=t=>e.options.onColumnPinningChange==null?void 0:e.options.onColumnPinningChange(t),e.resetColumnPinning=t=>{var n,r;return e.setColumnPinning(t?Lb():(n=(r=e.initialState)==null?void 0:r.columnPinning)!=null?n:Lb())},e.getIsSomeColumnsPinned=t=>{var n;const r=e.getState().columnPinning;if(!t){var a,o;return!!((a=r.left)!=null&&a.length||(o=r.right)!=null&&o.length)}return!!((n=r[t])!=null&&n.length)},e.getLeftLeafColumns=$e(()=>[e.getAllLeafColumns(),e.getState().columnPinning.left],(t,n)=>(n??[]).map(r=>t.find(a=>a.id===r)).filter(Boolean),Fe(e.options,"debugColumns")),e.getRightLeafColumns=$e(()=>[e.getAllLeafColumns(),e.getState().columnPinning.right],(t,n)=>(n??[]).map(r=>t.find(a=>a.id===r)).filter(Boolean),Fe(e.options,"debugColumns")),e.getCenterLeafColumns=$e(()=>[e.getAllLeafColumns(),e.getState().columnPinning.left,e.getState().columnPinning.right],(t,n,r)=>{const a=[...n??[],...r??[]];return t.filter(o=>!a.includes(o.id))},Fe(e.options,"debugColumns")),e.setRowPinning=t=>e.options.onRowPinningChange==null?void 0:e.options.onRowPinningChange(t),e.resetRowPinning=t=>{var n,r;return e.setRowPinning(t?Mb():(n=(r=e.initialState)==null?void 0:r.rowPinning)!=null?n:Mb())},e.getIsSomeRowsPinned=t=>{var n;const r=e.getState().rowPinning;if(!t){var a,o;return!!((a=r.top)!=null&&a.length||(o=r.bottom)!=null&&o.length)}return!!((n=r[t])!=null&&n.length)},e._getPinnedRows=$e(t=>[e.getRowModel().rows,e.getState().rowPinning[t],t],(t,n,r)=>{var a;return((a=e.options.keepPinnedRows)==null||a?(n??[]).map(i=>{const s=e.getRow(i,!0);return s.getIsAllParentsExpanded()?s:null}):(n??[]).map(i=>t.find(s=>s.id===i))).filter(Boolean).map(i=>({...i,position:r}))},Fe(e.options,"debugRows")),e.getTopRows=()=>e._getPinnedRows("top"),e.getBottomRows=()=>e._getPinnedRows("bottom"),e.getCenterRows=$e(()=>[e.getRowModel().rows,e.getState().rowPinning.top,e.getState().rowPinning.bottom],(t,n,r)=>{const a=new Set([...n??[],...r??[]]);return t.filter(o=>!a.has(o.id))},Fe(e.options,"debugRows"))}},WX={getInitialState:e=>({rowSelection:{},...e}),getDefaultOptions:e=>({onRowSelectionChange:Tr("rowSelection",e),enableRowSelection:!0,enableMultiRowSelection:!0,enableSubRowSelection:!0}),createTable:e=>{e.setRowSelection=t=>e.options.onRowSelectionChange==null?void 0:e.options.onRowSelectionChange(t),e.resetRowSelection=t=>{var n;return e.setRowSelection(t?{}:(n=e.initialState.rowSelection)!=null?n:{})},e.toggleAllRowsSelected=t=>{e.setRowSelection(n=>{t=typeof t<"u"?t:!e.getIsAllRowsSelected();const r={...n},a=e.getPreGroupedRowModel().flatRows;return t?a.forEach(o=>{o.getCanSelect()&&(r[o.id]=!0)}):a.forEach(o=>{delete r[o.id]}),r})},e.toggleAllPageRowsSelected=t=>e.setRowSelection(n=>{const r=typeof t<"u"?t:!e.getIsAllPageRowsSelected(),a={...n};return e.getRowModel().rows.forEach(o=>{Z1(a,o.id,r,!0,e)}),a}),e.getPreSelectedRowModel=()=>e.getCoreRowModel(),e.getSelectedRowModel=$e(()=>[e.getState().rowSelection,e.getCoreRowModel()],(t,n)=>Object.keys(t).length?Pb(e,n):{rows:[],flatRows:[],rowsById:{}},Fe(e.options,"debugTable")),e.getFilteredSelectedRowModel=$e(()=>[e.getState().rowSelection,e.getFilteredRowModel()],(t,n)=>Object.keys(t).length?Pb(e,n):{rows:[],flatRows:[],rowsById:{}},Fe(e.options,"debugTable")),e.getGroupedSelectedRowModel=$e(()=>[e.getState().rowSelection,e.getSortedRowModel()],(t,n)=>Object.keys(t).length?Pb(e,n):{rows:[],flatRows:[],rowsById:{}},Fe(e.options,"debugTable")),e.getIsAllRowsSelected=()=>{const t=e.getFilteredRowModel().flatRows,{rowSelection:n}=e.getState();let r=!!(t.length&&Object.keys(n).length);return r&&t.some(a=>a.getCanSelect()&&!n[a.id])&&(r=!1),r},e.getIsAllPageRowsSelected=()=>{const t=e.getPaginationRowModel().flatRows.filter(a=>a.getCanSelect()),{rowSelection:n}=e.getState();let r=!!t.length;return r&&t.some(a=>!n[a.id])&&(r=!1),r},e.getIsSomeRowsSelected=()=>{var t;const n=Object.keys((t=e.getState().rowSelection)!=null?t:{}).length;return n>0&&n{const t=e.getPaginationRowModel().flatRows;return e.getIsAllPageRowsSelected()?!1:t.filter(n=>n.getCanSelect()).some(n=>n.getIsSelected()||n.getIsSomeSelected())},e.getToggleAllRowsSelectedHandler=()=>t=>{e.toggleAllRowsSelected(t.target.checked)},e.getToggleAllPageRowsSelectedHandler=()=>t=>{e.toggleAllPageRowsSelected(t.target.checked)}},createRow:(e,t)=>{e.toggleSelected=(n,r)=>{const a=e.getIsSelected();t.setRowSelection(o=>{var i;if(n=typeof n<"u"?n:!a,e.getCanSelect()&&a===n)return o;const s={...o};return Z1(s,e.id,n,(i=r==null?void 0:r.selectChildren)!=null?i:!0,t),s})},e.getIsSelected=()=>{const{rowSelection:n}=t.getState();return S_(e,n)},e.getIsSomeSelected=()=>{const{rowSelection:n}=t.getState();return X1(e,n)==="some"},e.getIsAllSubRowsSelected=()=>{const{rowSelection:n}=t.getState();return X1(e,n)==="all"},e.getCanSelect=()=>{var n;return typeof t.options.enableRowSelection=="function"?t.options.enableRowSelection(e):(n=t.options.enableRowSelection)!=null?n:!0},e.getCanSelectSubRows=()=>{var n;return typeof t.options.enableSubRowSelection=="function"?t.options.enableSubRowSelection(e):(n=t.options.enableSubRowSelection)!=null?n:!0},e.getCanMultiSelect=()=>{var n;return typeof t.options.enableMultiRowSelection=="function"?t.options.enableMultiRowSelection(e):(n=t.options.enableMultiRowSelection)!=null?n:!0},e.getToggleSelectedHandler=()=>{const n=e.getCanSelect();return r=>{var a;n&&e.toggleSelected((a=r.target)==null?void 0:a.checked)}}}},Z1=(e,t,n,r,a)=>{var o;const i=a.getRow(t,!0);n?(i.getCanMultiSelect()||Object.keys(e).forEach(s=>delete e[s]),i.getCanSelect()&&(e[t]=!0)):delete e[t],r&&(o=i.subRows)!=null&&o.length&&i.getCanSelectSubRows()&&i.subRows.forEach(s=>Z1(e,s.id,n,r,a))};function Pb(e,t){const n=e.getState().rowSelection,r=[],a={},o=function(i,s){return i.map(l=>{var c;const u=S_(l,n);if(u&&(r.push(l),a[l.id]=l),(c=l.subRows)!=null&&c.length&&(l={...l,subRows:o(l.subRows)}),u)return l}).filter(Boolean)};return{rows:o(t.rows),flatRows:r,rowsById:a}}function S_(e,t){var n;return(n=t[e.id])!=null?n:!1}function X1(e,t,n){var r;if(!((r=e.subRows)!=null&&r.length))return!1;let a=!0,o=!1;return e.subRows.forEach(i=>{if(!(o&&!a)&&(i.getCanSelect()&&(S_(i,t)?o=!0:a=!1),i.subRows&&i.subRows.length)){const s=X1(i,t);s==="all"?o=!0:(s==="some"&&(o=!0),a=!1)}}),a?"all":o?"some":!1}const Q1=/([0-9]+)/gm,KX=(e,t,n)=>L6(Ei(e.getValue(n)).toLowerCase(),Ei(t.getValue(n)).toLowerCase()),YX=(e,t,n)=>L6(Ei(e.getValue(n)),Ei(t.getValue(n))),ZX=(e,t,n)=>w_(Ei(e.getValue(n)).toLowerCase(),Ei(t.getValue(n)).toLowerCase()),XX=(e,t,n)=>w_(Ei(e.getValue(n)),Ei(t.getValue(n))),QX=(e,t,n)=>{const r=e.getValue(n),a=t.getValue(n);return r>a?1:rw_(e.getValue(n),t.getValue(n));function w_(e,t){return e===t?0:e>t?1:-1}function Ei(e){return typeof e=="number"?isNaN(e)||e===1/0||e===-1/0?"":String(e):typeof e=="string"?e:""}function L6(e,t){const n=e.split(Q1).filter(Boolean),r=t.split(Q1).filter(Boolean);for(;n.length&&r.length;){const a=n.shift(),o=r.shift(),i=parseInt(a,10),s=parseInt(o,10),l=[i,s].sort();if(isNaN(l[0])){if(a>o)return 1;if(o>a)return-1;continue}if(isNaN(l[1]))return isNaN(i)?-1:1;if(i>s)return 1;if(s>i)return-1}return n.length-r.length}const cu={alphanumeric:KX,alphanumericCaseSensitive:YX,text:ZX,textCaseSensitive:XX,datetime:QX,basic:JX},eQ={getInitialState:e=>({sorting:[],...e}),getDefaultColumnDef:()=>({sortingFn:"auto",sortUndefined:1}),getDefaultOptions:e=>({onSortingChange:Tr("sorting",e),isMultiSortEvent:t=>t.shiftKey}),createColumn:(e,t)=>{e.getAutoSortingFn=()=>{const n=t.getFilteredRowModel().flatRows.slice(10);let r=!1;for(const a of n){const o=a==null?void 0:a.getValue(e.id);if(Object.prototype.toString.call(o)==="[object Date]")return cu.datetime;if(typeof o=="string"&&(r=!0,o.split(Q1).length>1))return cu.alphanumeric}return r?cu.text:cu.basic},e.getAutoSortDir=()=>{const n=t.getFilteredRowModel().flatRows[0];return typeof(n==null?void 0:n.getValue(e.id))=="string"?"asc":"desc"},e.getSortingFn=()=>{var n,r;if(!e)throw new Error;return Ig(e.columnDef.sortingFn)?e.columnDef.sortingFn:e.columnDef.sortingFn==="auto"?e.getAutoSortingFn():(n=(r=t.options.sortingFns)==null?void 0:r[e.columnDef.sortingFn])!=null?n:cu[e.columnDef.sortingFn]},e.toggleSorting=(n,r)=>{const a=e.getNextSortingOrder(),o=typeof n<"u"&&n!==null;t.setSorting(i=>{const s=i==null?void 0:i.find(m=>m.id===e.id),l=i==null?void 0:i.findIndex(m=>m.id===e.id);let c=[],u,d=o?n:a==="desc";if(i!=null&&i.length&&e.getCanMultiSort()&&r?s?u="toggle":u="add":i!=null&&i.length&&l!==i.length-1?u="replace":s?u="toggle":u="replace",u==="toggle"&&(o||a||(u="remove")),u==="add"){var g;c=[...i,{id:e.id,desc:d}],c.splice(0,c.length-((g=t.options.maxMultiSortColCount)!=null?g:Number.MAX_SAFE_INTEGER))}else u==="toggle"?c=i.map(m=>m.id===e.id?{...m,desc:d}:m):u==="remove"?c=i.filter(m=>m.id!==e.id):c=[{id:e.id,desc:d}];return c})},e.getFirstSortDir=()=>{var n,r;return((n=(r=e.columnDef.sortDescFirst)!=null?r:t.options.sortDescFirst)!=null?n:e.getAutoSortDir()==="desc")?"desc":"asc"},e.getNextSortingOrder=n=>{var r,a;const o=e.getFirstSortDir(),i=e.getIsSorted();return i?i!==o&&((r=t.options.enableSortingRemoval)==null||r)&&(!(n&&(a=t.options.enableMultiRemove)!=null)||a)?!1:i==="desc"?"asc":"desc":o},e.getCanSort=()=>{var n,r;return((n=e.columnDef.enableSorting)!=null?n:!0)&&((r=t.options.enableSorting)!=null?r:!0)&&!!e.accessorFn},e.getCanMultiSort=()=>{var n,r;return(n=(r=e.columnDef.enableMultiSort)!=null?r:t.options.enableMultiSort)!=null?n:!!e.accessorFn},e.getIsSorted=()=>{var n;const r=(n=t.getState().sorting)==null?void 0:n.find(a=>a.id===e.id);return r?r.desc?"desc":"asc":!1},e.getSortIndex=()=>{var n,r;return(n=(r=t.getState().sorting)==null?void 0:r.findIndex(a=>a.id===e.id))!=null?n:-1},e.clearSorting=()=>{t.setSorting(n=>n!=null&&n.length?n.filter(r=>r.id!==e.id):[])},e.getToggleSortingHandler=()=>{const n=e.getCanSort();return r=>{n&&(r.persist==null||r.persist(),e.toggleSorting==null||e.toggleSorting(void 0,e.getCanMultiSort()?t.options.isMultiSortEvent==null?void 0:t.options.isMultiSortEvent(r):!1))}}},createTable:e=>{e.setSorting=t=>e.options.onSortingChange==null?void 0:e.options.onSortingChange(t),e.resetSorting=t=>{var n,r;e.setSorting(t?[]:(n=(r=e.initialState)==null?void 0:r.sorting)!=null?n:[])},e.getPreSortedRowModel=()=>e.getGroupedRowModel(),e.getSortedRowModel=()=>(!e._getSortedRowModel&&e.options.getSortedRowModel&&(e._getSortedRowModel=e.options.getSortedRowModel(e)),e.options.manualSorting||!e._getSortedRowModel?e.getPreSortedRowModel():e._getSortedRowModel())}},tQ={getInitialState:e=>({columnVisibility:{},...e}),getDefaultOptions:e=>({onColumnVisibilityChange:Tr("columnVisibility",e)}),createColumn:(e,t)=>{e.toggleVisibility=n=>{e.getCanHide()&&t.setColumnVisibility(r=>({...r,[e.id]:n??!e.getIsVisible()}))},e.getIsVisible=()=>{var n,r;return(n=(r=t.getState().columnVisibility)==null?void 0:r[e.id])!=null?n:!0},e.getCanHide=()=>{var n,r;return((n=e.columnDef.enableHiding)!=null?n:!0)&&((r=t.options.enableHiding)!=null?r:!0)},e.getToggleVisibilityHandler=()=>n=>{e.toggleVisibility==null||e.toggleVisibility(n.target.checked)}},createRow:(e,t)=>{e._getAllVisibleCells=$e(()=>[e.getAllCells(),t.getState().columnVisibility],n=>n.filter(r=>r.column.getIsVisible()),Fe(t.options,"debugRows")),e.getVisibleCells=$e(()=>[e.getLeftVisibleCells(),e.getCenterVisibleCells(),e.getRightVisibleCells()],(n,r,a)=>[...n,...r,...a],Fe(t.options,"debugRows"))},createTable:e=>{const t=(n,r)=>$e(()=>[r(),r().filter(a=>a.getIsVisible()).map(a=>a.id).join("_")],a=>a.filter(o=>o.getIsVisible==null?void 0:o.getIsVisible()),Fe(e.options,"debugColumns"));e.getVisibleFlatColumns=t("getVisibleFlatColumns",()=>e.getAllFlatColumns()),e.getVisibleLeafColumns=t("getVisibleLeafColumns",()=>e.getAllLeafColumns()),e.getLeftVisibleLeafColumns=t("getLeftVisibleLeafColumns",()=>e.getLeftLeafColumns()),e.getRightVisibleLeafColumns=t("getRightVisibleLeafColumns",()=>e.getRightLeafColumns()),e.getCenterVisibleLeafColumns=t("getCenterVisibleLeafColumns",()=>e.getCenterLeafColumns()),e.setColumnVisibility=n=>e.options.onColumnVisibilityChange==null?void 0:e.options.onColumnVisibilityChange(n),e.resetColumnVisibility=n=>{var r;e.setColumnVisibility(n?{}:(r=e.initialState.columnVisibility)!=null?r:{})},e.toggleAllColumnsVisible=n=>{var r;n=(r=n)!=null?r:!e.getIsAllColumnsVisible(),e.setColumnVisibility(e.getAllLeafColumns().reduce((a,o)=>({...a,[o.id]:n||!(o.getCanHide!=null&&o.getCanHide())}),{}))},e.getIsAllColumnsVisible=()=>!e.getAllLeafColumns().some(n=>!(n.getIsVisible!=null&&n.getIsVisible())),e.getIsSomeColumnsVisible=()=>e.getAllLeafColumns().some(n=>n.getIsVisible==null?void 0:n.getIsVisible()),e.getToggleAllColumnsVisibilityHandler=()=>n=>{var r;e.toggleAllColumnsVisible((r=n.target)==null?void 0:r.checked)}}};function Hu(e,t){return t?t==="center"?e.getCenterVisibleLeafColumns():t==="left"?e.getLeftVisibleLeafColumns():e.getRightVisibleLeafColumns():e.getVisibleLeafColumns()}const h2=[TX,tQ,VX,GX,OX,eQ,BX,IX,qX,WX,RX];function nQ(e){var t;(e.debugAll||e.debugTable)&&console.info("Creating Table Instance...");let n={_features:h2};const r=n._features.reduce((u,d)=>Object.assign(u,d.getDefaultOptions==null?void 0:d.getDefaultOptions(n)),{}),a=u=>n.options.mergeOptions?n.options.mergeOptions(r,u):{...r,...u};let i={...{},...(t=e.initialState)!=null?t:{}};n._features.forEach(u=>{var d;i=(d=u.getInitialState==null?void 0:u.getInitialState(i))!=null?d:i});const s=[];let l=!1;const c={_features:h2,options:{...r,...e},initialState:i,_queue:u=>{s.push(u),l||(l=!0,Promise.resolve().then(()=>{for(;s.length;)s.shift()();l=!1}).catch(d=>setTimeout(()=>{throw d})))},reset:()=>{n.setState(n.initialState)},setOptions:u=>{const d=ii(u,n.options);n.options=a(d)},getState:()=>n.options.state,setState:u=>{n.options.onStateChange==null||n.options.onStateChange(u)},_getRowId:(u,d,g)=>{var m;return(m=n.options.getRowId==null?void 0:n.options.getRowId(u,d,g))!=null?m:`${g?[g.id,d].join("."):d}`},getCoreRowModel:()=>(n._getCoreRowModel||(n._getCoreRowModel=n.options.getCoreRowModel(n)),n._getCoreRowModel()),getRowModel:()=>n.getPaginationRowModel(),getRow:(u,d)=>{let g=(d?n.getPrePaginationRowModel():n.getRowModel()).rowsById[u];if(!g&&(g=n.getCoreRowModel().rowsById[u],!g))throw new Error;return g},_getDefaultColumnDef:$e(()=>[n.options.defaultColumn],u=>{var d;return u=(d=u)!=null?d:{},{header:g=>{const m=g.header.column.columnDef;return m.accessorKey?m.accessorKey:m.accessorFn?m.id:null},cell:g=>{var m,b;return(m=(b=g.renderValue())==null||b.toString==null?void 0:b.toString())!=null?m:null},...n._features.reduce((g,m)=>Object.assign(g,m.getDefaultColumnDef==null?void 0:m.getDefaultColumnDef()),{}),...u}},Fe(e,"debugColumns")),_getColumnDefs:()=>n.options.columns,getAllColumns:$e(()=>[n._getColumnDefs()],u=>{const d=function(g,m,b){return b===void 0&&(b=0),g.map(y=>{const w=AX(n,y,b,m),v=y;return w.columns=v.columns?d(v.columns,w,b+1):[],w})};return d(u)},Fe(e,"debugColumns")),getAllFlatColumns:$e(()=>[n.getAllColumns()],u=>u.flatMap(d=>d.getFlatColumns()),Fe(e,"debugColumns")),_getAllFlatColumnsById:$e(()=>[n.getAllFlatColumns()],u=>u.reduce((d,g)=>(d[g.id]=g,d),{}),Fe(e,"debugColumns")),getAllLeafColumns:$e(()=>[n.getAllColumns(),n._getOrderColumnsFn()],(u,d)=>{let g=u.flatMap(m=>m.getLeafColumns());return d(g)},Fe(e,"debugColumns")),getColumn:u=>n._getAllFlatColumnsById()[u]};Object.assign(n,c);for(let u=0;u{var i;return(i=o.getValue())!=null?i:e.options.renderFallbackValue},o={id:`${t.id}_${n.id}`,row:t,column:n,getValue:()=>t.getValue(r),renderValue:a,getContext:$e(()=>[e,n,t,o],(i,s,l,c)=>({table:i,column:s,row:l,cell:c,getValue:c.getValue,renderValue:c.renderValue}),Fe(e.options,"debugCells"))};return e._features.forEach(i=>{i.createCell==null||i.createCell(o,n,t,e)},{}),o}const aQ=(e,t,n,r,a,o,i)=>{let s={id:t,index:r,original:n,depth:a,parentId:i,_valuesCache:{},_uniqueValuesCache:{},getValue:l=>{if(s._valuesCache.hasOwnProperty(l))return s._valuesCache[l];const c=e.getColumn(l);if(c!=null&&c.accessorFn)return s._valuesCache[l]=c.accessorFn(s.original,r),s._valuesCache[l]},getUniqueValues:l=>{if(s._uniqueValuesCache.hasOwnProperty(l))return s._uniqueValuesCache[l];const c=e.getColumn(l);if(c!=null&&c.accessorFn)return c.columnDef.getUniqueValues?(s._uniqueValuesCache[l]=c.columnDef.getUniqueValues(s.original,r),s._uniqueValuesCache[l]):(s._uniqueValuesCache[l]=[s.getValue(l)],s._uniqueValuesCache[l])},renderValue:l=>{var c;return(c=s.getValue(l))!=null?c:e.options.renderFallbackValue},subRows:o??[],getLeafRows:()=>_X(s.subRows,l=>l.subRows),getParentRow:()=>s.parentId?e.getRow(s.parentId,!0):void 0,getParentRows:()=>{let l=[],c=s;for(;;){const u=c.getParentRow();if(!u)break;l.push(u),c=u}return l.reverse()},getAllCells:$e(()=>[e.getAllLeafColumns()],l=>l.map(c=>rQ(e,s,c,c.id)),Fe(e.options,"debugRows")),_getAllCellsByColumnId:$e(()=>[s.getAllCells()],l=>l.reduce((c,u)=>(c[u.column.id]=u,c),{}),Fe(e.options,"debugRows"))};for(let l=0;l$e(()=>[e.options.data],t=>{const n={rows:[],flatRows:[],rowsById:{}},r=function(a,o,i){o===void 0&&(o=0);const s=[];for(let c=0;ce._autoResetPageIndex()))}function iQ(e){const t=[],n=r=>{var a;t.push(r),(a=r.subRows)!=null&&a.length&&r.getIsExpanded()&&r.subRows.forEach(n)};return e.rows.forEach(n),{rows:t,flatRows:e.flatRows,rowsById:e.rowsById}}function sQ(e){return t=>$e(()=>[t.getState().pagination,t.getPrePaginationRowModel(),t.options.paginateExpandedRows?void 0:t.getState().expanded],(n,r)=>{if(!r.rows.length)return r;const{pageSize:a,pageIndex:o}=n;let{rows:i,flatRows:s,rowsById:l}=r;const c=a*o,u=c+a;i=i.slice(c,u);let d;t.options.paginateExpandedRows?d={rows:i,flatRows:s,rowsById:l}:d=iQ({rows:i,flatRows:s,rowsById:l}),d.flatRows=[];const g=m=>{d.flatRows.push(m),m.subRows.length&&m.subRows.forEach(g)};return d.rows.forEach(g),d},Fe(t.options,"debugTable"))}/** + color: hsl(${Math.max(0,Math.min(120-120*g,120))}deg 100% 31%);`,n==null?void 0:n.key)}return a}}function Fe(e,t,n,r){return{debug:()=>{var a;return(a=e==null?void 0:e.debugAll)!=null?a:e[t]},key:!1,onChange:r}}function AX(e,t,n,r){var a,o;const s={...e._getDefaultColumnDef(),...t},l=s.accessorKey;let c=(a=(o=s.id)!=null?o:l?l.replace(".","_"):void 0)!=null?a:typeof s.header=="string"?s.header:void 0,u;if(s.accessorFn?u=s.accessorFn:l&&(l.includes(".")?u=g=>{let m=g;for(const y of l.split(".")){var b;m=(b=m)==null?void 0:b[y]}return m}:u=g=>g[s.accessorKey]),!c)throw new Error;let d={id:`${String(c)}`,accessorFn:u,parent:r,depth:n,columnDef:s,columns:[],getFlatColumns:$e(()=>[!0],()=>{var g;return[d,...(g=d.columns)==null?void 0:g.flatMap(m=>m.getFlatColumns())]},Fe(e.options,"debugColumns")),getLeafColumns:$e(()=>[e._getOrderColumnsFn()],g=>{var m;if((m=d.columns)!=null&&m.length){let b=d.columns.flatMap(y=>y.getLeafColumns());return g(b)}return[d]},Fe(e.options,"debugColumns"))};for(const g of e._features)g.createColumn==null||g.createColumn(d,e);return d}const In="debugHeaders";function g2(e,t,n){var r;let o={id:(r=n.id)!=null?r:t.id,column:t,index:n.index,isPlaceholder:!!n.isPlaceholder,placeholderId:n.placeholderId,depth:n.depth,subHeaders:[],colSpan:0,rowSpan:0,headerGroup:null,getLeafHeaders:()=>{const i=[],s=l=>{l.subHeaders&&l.subHeaders.length&&l.subHeaders.map(s),i.push(l)};return s(o),i},getContext:()=>({table:e,header:o,column:t})};return e._features.forEach(i=>{i.createHeader==null||i.createHeader(o,e)}),o}const TX={createTable:e=>{e.getHeaderGroups=$e(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.left,e.getState().columnPinning.right],(t,n,r,a)=>{var o,i;const s=(o=r==null?void 0:r.map(d=>n.find(g=>g.id===d)).filter(Boolean))!=null?o:[],l=(i=a==null?void 0:a.map(d=>n.find(g=>g.id===d)).filter(Boolean))!=null?i:[],c=n.filter(d=>!(r!=null&&r.includes(d.id))&&!(a!=null&&a.includes(d.id)));return Xf(t,[...s,...c,...l],e)},Fe(e.options,In)),e.getCenterHeaderGroups=$e(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.left,e.getState().columnPinning.right],(t,n,r,a)=>(n=n.filter(o=>!(r!=null&&r.includes(o.id))&&!(a!=null&&a.includes(o.id))),Xf(t,n,e,"center")),Fe(e.options,In)),e.getLeftHeaderGroups=$e(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.left],(t,n,r)=>{var a;const o=(a=r==null?void 0:r.map(i=>n.find(s=>s.id===i)).filter(Boolean))!=null?a:[];return Xf(t,o,e,"left")},Fe(e.options,In)),e.getRightHeaderGroups=$e(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.right],(t,n,r)=>{var a;const o=(a=r==null?void 0:r.map(i=>n.find(s=>s.id===i)).filter(Boolean))!=null?a:[];return Xf(t,o,e,"right")},Fe(e.options,In)),e.getFooterGroups=$e(()=>[e.getHeaderGroups()],t=>[...t].reverse(),Fe(e.options,In)),e.getLeftFooterGroups=$e(()=>[e.getLeftHeaderGroups()],t=>[...t].reverse(),Fe(e.options,In)),e.getCenterFooterGroups=$e(()=>[e.getCenterHeaderGroups()],t=>[...t].reverse(),Fe(e.options,In)),e.getRightFooterGroups=$e(()=>[e.getRightHeaderGroups()],t=>[...t].reverse(),Fe(e.options,In)),e.getFlatHeaders=$e(()=>[e.getHeaderGroups()],t=>t.map(n=>n.headers).flat(),Fe(e.options,In)),e.getLeftFlatHeaders=$e(()=>[e.getLeftHeaderGroups()],t=>t.map(n=>n.headers).flat(),Fe(e.options,In)),e.getCenterFlatHeaders=$e(()=>[e.getCenterHeaderGroups()],t=>t.map(n=>n.headers).flat(),Fe(e.options,In)),e.getRightFlatHeaders=$e(()=>[e.getRightHeaderGroups()],t=>t.map(n=>n.headers).flat(),Fe(e.options,In)),e.getCenterLeafHeaders=$e(()=>[e.getCenterFlatHeaders()],t=>t.filter(n=>{var r;return!((r=n.subHeaders)!=null&&r.length)}),Fe(e.options,In)),e.getLeftLeafHeaders=$e(()=>[e.getLeftFlatHeaders()],t=>t.filter(n=>{var r;return!((r=n.subHeaders)!=null&&r.length)}),Fe(e.options,In)),e.getRightLeafHeaders=$e(()=>[e.getRightFlatHeaders()],t=>t.filter(n=>{var r;return!((r=n.subHeaders)!=null&&r.length)}),Fe(e.options,In)),e.getLeafHeaders=$e(()=>[e.getLeftHeaderGroups(),e.getCenterHeaderGroups(),e.getRightHeaderGroups()],(t,n,r)=>{var a,o,i,s,l,c;return[...(a=(o=t[0])==null?void 0:o.headers)!=null?a:[],...(i=(s=n[0])==null?void 0:s.headers)!=null?i:[],...(l=(c=r[0])==null?void 0:c.headers)!=null?l:[]].map(u=>u.getLeafHeaders()).flat()},Fe(e.options,In))}};function Xf(e,t,n,r){var a,o;let i=0;const s=function(g,m){m===void 0&&(m=1),i=Math.max(i,m),g.filter(b=>b.getIsVisible()).forEach(b=>{var y;(y=b.columns)!=null&&y.length&&s(b.columns,m+1)},0)};s(e);let l=[];const c=(g,m)=>{const b={depth:m,id:[r,`${m}`].filter(Boolean).join("_"),headers:[]},y=[];g.forEach(w=>{const v=[...y].reverse()[0],h=w.column.depth===b.depth;let S,E=!1;if(h&&w.column.parent?S=w.column.parent:(S=w.column,E=!0),v&&(v==null?void 0:v.column)===S)v.subHeaders.push(w);else{const k=g2(n,S,{id:[r,m,S.id,w==null?void 0:w.id].filter(Boolean).join("_"),isPlaceholder:E,placeholderId:E?`${y.filter(x=>x.column===S).length}`:void 0,depth:m,index:y.length});k.subHeaders.push(w),y.push(k)}b.headers.push(w),w.headerGroup=b}),l.push(b),m>0&&c(y,m-1)},u=t.map((g,m)=>g2(n,g,{depth:i,index:m}));c(u,i-1),l.reverse();const d=g=>g.filter(b=>b.column.getIsVisible()).map(b=>{let y=0,w=0,v=[0];b.subHeaders&&b.subHeaders.length?(v=[],d(b.subHeaders).forEach(S=>{let{colSpan:E,rowSpan:k}=S;y+=E,v.push(k)})):y=1;const h=Math.min(...v);return w=w+h,b.colSpan=y,b.rowSpan=w,{colSpan:y,rowSpan:w}});return d((a=(o=l[0])==null?void 0:o.headers)!=null?a:[]),l}const Qf={size:150,minSize:20,maxSize:Number.MAX_SAFE_INTEGER},Ib=()=>({startOffset:null,startSize:null,deltaOffset:null,deltaPercentage:null,isResizingColumn:!1,columnSizingStart:[]}),RX={getDefaultColumnDef:()=>Qf,getInitialState:e=>({columnSizing:{},columnSizingInfo:Ib(),...e}),getDefaultOptions:e=>({columnResizeMode:"onEnd",columnResizeDirection:"ltr",onColumnSizingChange:Tr("columnSizing",e),onColumnSizingInfoChange:Tr("columnSizingInfo",e)}),createColumn:(e,t)=>{e.getSize=()=>{var n,r,a;const o=t.getState().columnSizing[e.id];return Math.min(Math.max((n=e.columnDef.minSize)!=null?n:Qf.minSize,(r=o??e.columnDef.size)!=null?r:Qf.size),(a=e.columnDef.maxSize)!=null?a:Qf.maxSize)},e.getStart=$e(n=>[n,Hu(t,n),t.getState().columnSizing],(n,r)=>r.slice(0,e.getIndex(n)).reduce((a,o)=>a+o.getSize(),0),Fe(t.options,"debugColumns")),e.getAfter=$e(n=>[n,Hu(t,n),t.getState().columnSizing],(n,r)=>r.slice(e.getIndex(n)+1).reduce((a,o)=>a+o.getSize(),0),Fe(t.options,"debugColumns")),e.resetSize=()=>{t.setColumnSizing(n=>{let{[e.id]:r,...a}=n;return a})},e.getCanResize=()=>{var n,r;return((n=e.columnDef.enableResizing)!=null?n:!0)&&((r=t.options.enableColumnResizing)!=null?r:!0)},e.getIsResizing=()=>t.getState().columnSizingInfo.isResizingColumn===e.id},createHeader:(e,t)=>{e.getSize=()=>{let n=0;const r=a=>{if(a.subHeaders.length)a.subHeaders.forEach(r);else{var o;n+=(o=a.column.getSize())!=null?o:0}};return r(e),n},e.getStart=()=>{if(e.index>0){const n=e.headerGroup.headers[e.index-1];return n.getStart()+n.getSize()}return 0},e.getResizeHandler=n=>{const r=t.getColumn(e.column.id),a=r==null?void 0:r.getCanResize();return o=>{if(!r||!a||(o.persist==null||o.persist(),Ob(o)&&o.touches&&o.touches.length>1))return;const i=e.getSize(),s=e?e.getLeafHeaders().map(v=>[v.column.id,v.column.getSize()]):[[r.id,r.getSize()]],l=Ob(o)?Math.round(o.touches[0].clientX):o.clientX,c={},u=(v,h)=>{typeof h=="number"&&(t.setColumnSizingInfo(S=>{var E,k;const x=t.options.columnResizeDirection==="rtl"?-1:1,C=(h-((E=S==null?void 0:S.startOffset)!=null?E:0))*x,_=Math.max(C/((k=S==null?void 0:S.startSize)!=null?k:0),-.999999);return S.columnSizingStart.forEach(R=>{let[T,L]=R;c[T]=Math.round(Math.max(L+L*_,0)*100)/100}),{...S,deltaOffset:C,deltaPercentage:_}}),(t.options.columnResizeMode==="onChange"||v==="end")&&t.setColumnSizing(S=>({...S,...c})))},d=v=>u("move",v),g=v=>{u("end",v),t.setColumnSizingInfo(h=>({...h,isResizingColumn:!1,startOffset:null,startSize:null,deltaOffset:null,deltaPercentage:null,columnSizingStart:[]}))},m=n||typeof document<"u"?document:null,b={moveHandler:v=>d(v.clientX),upHandler:v=>{m==null||m.removeEventListener("mousemove",b.moveHandler),m==null||m.removeEventListener("mouseup",b.upHandler),g(v.clientX)}},y={moveHandler:v=>(v.cancelable&&(v.preventDefault(),v.stopPropagation()),d(v.touches[0].clientX),!1),upHandler:v=>{var h;m==null||m.removeEventListener("touchmove",y.moveHandler),m==null||m.removeEventListener("touchend",y.upHandler),v.cancelable&&(v.preventDefault(),v.stopPropagation()),g((h=v.touches[0])==null?void 0:h.clientX)}},w=NX()?{passive:!1}:!1;Ob(o)?(m==null||m.addEventListener("touchmove",y.moveHandler,w),m==null||m.addEventListener("touchend",y.upHandler,w)):(m==null||m.addEventListener("mousemove",b.moveHandler,w),m==null||m.addEventListener("mouseup",b.upHandler,w)),t.setColumnSizingInfo(v=>({...v,startOffset:l,startSize:i,deltaOffset:0,deltaPercentage:0,columnSizingStart:s,isResizingColumn:r.id}))}}},createTable:e=>{e.setColumnSizing=t=>e.options.onColumnSizingChange==null?void 0:e.options.onColumnSizingChange(t),e.setColumnSizingInfo=t=>e.options.onColumnSizingInfoChange==null?void 0:e.options.onColumnSizingInfoChange(t),e.resetColumnSizing=t=>{var n;e.setColumnSizing(t?{}:(n=e.initialState.columnSizing)!=null?n:{})},e.resetHeaderSizeInfo=t=>{var n;e.setColumnSizingInfo(t?Ib():(n=e.initialState.columnSizingInfo)!=null?n:Ib())},e.getTotalSize=()=>{var t,n;return(t=(n=e.getHeaderGroups()[0])==null?void 0:n.headers.reduce((r,a)=>r+a.getSize(),0))!=null?t:0},e.getLeftTotalSize=()=>{var t,n;return(t=(n=e.getLeftHeaderGroups()[0])==null?void 0:n.headers.reduce((r,a)=>r+a.getSize(),0))!=null?t:0},e.getCenterTotalSize=()=>{var t,n;return(t=(n=e.getCenterHeaderGroups()[0])==null?void 0:n.headers.reduce((r,a)=>r+a.getSize(),0))!=null?t:0},e.getRightTotalSize=()=>{var t,n;return(t=(n=e.getRightHeaderGroups()[0])==null?void 0:n.headers.reduce((r,a)=>r+a.getSize(),0))!=null?t:0}}};let Jf=null;function NX(){if(typeof Jf=="boolean")return Jf;let e=!1;try{const t={get passive(){return e=!0,!1}},n=()=>{};window.addEventListener("test",n,t),window.removeEventListener("test",n)}catch{e=!1}return Jf=e,Jf}function Ob(e){return e.type==="touchstart"}const IX={getInitialState:e=>({expanded:{},...e}),getDefaultOptions:e=>({onExpandedChange:Tr("expanded",e),paginateExpandedRows:!0}),createTable:e=>{let t=!1,n=!1;e._autoResetExpanded=()=>{var r,a;if(!t){e._queue(()=>{t=!0});return}if((r=(a=e.options.autoResetAll)!=null?a:e.options.autoResetExpanded)!=null?r:!e.options.manualExpanding){if(n)return;n=!0,e._queue(()=>{e.resetExpanded(),n=!1})}},e.setExpanded=r=>e.options.onExpandedChange==null?void 0:e.options.onExpandedChange(r),e.toggleAllRowsExpanded=r=>{r??!e.getIsAllRowsExpanded()?e.setExpanded(!0):e.setExpanded({})},e.resetExpanded=r=>{var a,o;e.setExpanded(r?{}:(a=(o=e.initialState)==null?void 0:o.expanded)!=null?a:{})},e.getCanSomeRowsExpand=()=>e.getPrePaginationRowModel().flatRows.some(r=>r.getCanExpand()),e.getToggleAllRowsExpandedHandler=()=>r=>{r.persist==null||r.persist(),e.toggleAllRowsExpanded()},e.getIsSomeRowsExpanded=()=>{const r=e.getState().expanded;return r===!0||Object.values(r).some(Boolean)},e.getIsAllRowsExpanded=()=>{const r=e.getState().expanded;return typeof r=="boolean"?r===!0:!(!Object.keys(r).length||e.getRowModel().flatRows.some(a=>!a.getIsExpanded()))},e.getExpandedDepth=()=>{let r=0;return(e.getState().expanded===!0?Object.keys(e.getRowModel().rowsById):Object.keys(e.getState().expanded)).forEach(o=>{const i=o.split(".");r=Math.max(r,i.length)}),r},e.getPreExpandedRowModel=()=>e.getSortedRowModel(),e.getExpandedRowModel=()=>(!e._getExpandedRowModel&&e.options.getExpandedRowModel&&(e._getExpandedRowModel=e.options.getExpandedRowModel(e)),e.options.manualExpanding||!e._getExpandedRowModel?e.getPreExpandedRowModel():e._getExpandedRowModel())},createRow:(e,t)=>{e.toggleExpanded=n=>{t.setExpanded(r=>{var a;const o=r===!0?!0:!!(r!=null&&r[e.id]);let i={};if(r===!0?Object.keys(t.getRowModel().rowsById).forEach(s=>{i[s]=!0}):i=r,n=(a=n)!=null?a:!o,!o&&n)return{...i,[e.id]:!0};if(o&&!n){const{[e.id]:s,...l}=i;return l}return r})},e.getIsExpanded=()=>{var n;const r=t.getState().expanded;return!!((n=t.options.getIsRowExpanded==null?void 0:t.options.getIsRowExpanded(e))!=null?n:r===!0||r!=null&&r[e.id])},e.getCanExpand=()=>{var n,r,a;return(n=t.options.getRowCanExpand==null?void 0:t.options.getRowCanExpand(e))!=null?n:((r=t.options.enableExpanding)!=null?r:!0)&&!!((a=e.subRows)!=null&&a.length)},e.getIsAllParentsExpanded=()=>{let n=!0,r=e;for(;n&&r.parentId;)r=t.getRow(r.parentId,!0),n=r.getIsExpanded();return n},e.getToggleExpandedHandler=()=>{const n=e.getCanExpand();return()=>{n&&e.toggleExpanded()}}}},A6=(e,t,n)=>{var r;const a=n.toLowerCase();return!!(!((r=e.getValue(t))==null||(r=r.toString())==null||(r=r.toLowerCase())==null)&&r.includes(a))};A6.autoRemove=e=>pa(e);const T6=(e,t,n)=>{var r;return!!(!((r=e.getValue(t))==null||(r=r.toString())==null)&&r.includes(n))};T6.autoRemove=e=>pa(e);const R6=(e,t,n)=>{var r;return((r=e.getValue(t))==null||(r=r.toString())==null?void 0:r.toLowerCase())===(n==null?void 0:n.toLowerCase())};R6.autoRemove=e=>pa(e);const N6=(e,t,n)=>{var r;return(r=e.getValue(t))==null?void 0:r.includes(n)};N6.autoRemove=e=>pa(e)||!(e!=null&&e.length);const I6=(e,t,n)=>!n.some(r=>{var a;return!((a=e.getValue(t))!=null&&a.includes(r))});I6.autoRemove=e=>pa(e)||!(e!=null&&e.length);const O6=(e,t,n)=>n.some(r=>{var a;return(a=e.getValue(t))==null?void 0:a.includes(r)});O6.autoRemove=e=>pa(e)||!(e!=null&&e.length);const D6=(e,t,n)=>e.getValue(t)===n;D6.autoRemove=e=>pa(e);const L6=(e,t,n)=>e.getValue(t)==n;L6.autoRemove=e=>pa(e);const S_=(e,t,n)=>{let[r,a]=n;const o=e.getValue(t);return o>=r&&o<=a};S_.resolveFilterValue=e=>{let[t,n]=e,r=typeof t!="number"?parseFloat(t):t,a=typeof n!="number"?parseFloat(n):n,o=t===null||Number.isNaN(r)?-1/0:r,i=n===null||Number.isNaN(a)?1/0:a;if(o>i){const s=o;o=i,i=s}return[o,i]};S_.autoRemove=e=>pa(e)||pa(e[0])&&pa(e[1]);const Qa={includesString:A6,includesStringSensitive:T6,equalsString:R6,arrIncludes:N6,arrIncludesAll:I6,arrIncludesSome:O6,equals:D6,weakEquals:L6,inNumberRange:S_};function pa(e){return e==null||e===""}const OX={getDefaultColumnDef:()=>({filterFn:"auto"}),getInitialState:e=>({columnFilters:[],globalFilter:void 0,...e}),getDefaultOptions:e=>({onColumnFiltersChange:Tr("columnFilters",e),onGlobalFilterChange:Tr("globalFilter",e),filterFromLeafRows:!1,maxLeafRowFilterDepth:100,globalFilterFn:"auto",getColumnCanGlobalFilter:t=>{var n;const r=(n=e.getCoreRowModel().flatRows[0])==null||(n=n._getAllCellsByColumnId()[t.id])==null?void 0:n.getValue();return typeof r=="string"||typeof r=="number"}}),createColumn:(e,t)=>{e.getAutoFilterFn=()=>{const n=t.getCoreRowModel().flatRows[0],r=n==null?void 0:n.getValue(e.id);return typeof r=="string"?Qa.includesString:typeof r=="number"?Qa.inNumberRange:typeof r=="boolean"||r!==null&&typeof r=="object"?Qa.equals:Array.isArray(r)?Qa.arrIncludes:Qa.weakEquals},e.getFilterFn=()=>{var n,r;return Ig(e.columnDef.filterFn)?e.columnDef.filterFn:e.columnDef.filterFn==="auto"?e.getAutoFilterFn():(n=(r=t.options.filterFns)==null?void 0:r[e.columnDef.filterFn])!=null?n:Qa[e.columnDef.filterFn]},e.getCanFilter=()=>{var n,r,a;return((n=e.columnDef.enableColumnFilter)!=null?n:!0)&&((r=t.options.enableColumnFilters)!=null?r:!0)&&((a=t.options.enableFilters)!=null?a:!0)&&!!e.accessorFn},e.getCanGlobalFilter=()=>{var n,r,a,o;return((n=e.columnDef.enableGlobalFilter)!=null?n:!0)&&((r=t.options.enableGlobalFilter)!=null?r:!0)&&((a=t.options.enableFilters)!=null?a:!0)&&((o=t.options.getColumnCanGlobalFilter==null?void 0:t.options.getColumnCanGlobalFilter(e))!=null?o:!0)&&!!e.accessorFn},e.getIsFiltered=()=>e.getFilterIndex()>-1,e.getFilterValue=()=>{var n;return(n=t.getState().columnFilters)==null||(n=n.find(r=>r.id===e.id))==null?void 0:n.value},e.getFilterIndex=()=>{var n,r;return(n=(r=t.getState().columnFilters)==null?void 0:r.findIndex(a=>a.id===e.id))!=null?n:-1},e.setFilterValue=n=>{t.setColumnFilters(r=>{const a=e.getFilterFn(),o=r==null?void 0:r.find(u=>u.id===e.id),i=ii(n,o?o.value:void 0);if(m2(a,i,e)){var s;return(s=r==null?void 0:r.filter(u=>u.id!==e.id))!=null?s:[]}const l={id:e.id,value:i};if(o){var c;return(c=r==null?void 0:r.map(u=>u.id===e.id?l:u))!=null?c:[]}return r!=null&&r.length?[...r,l]:[l]})},e._getFacetedRowModel=t.options.getFacetedRowModel&&t.options.getFacetedRowModel(t,e.id),e.getFacetedRowModel=()=>e._getFacetedRowModel?e._getFacetedRowModel():t.getPreFilteredRowModel(),e._getFacetedUniqueValues=t.options.getFacetedUniqueValues&&t.options.getFacetedUniqueValues(t,e.id),e.getFacetedUniqueValues=()=>e._getFacetedUniqueValues?e._getFacetedUniqueValues():new Map,e._getFacetedMinMaxValues=t.options.getFacetedMinMaxValues&&t.options.getFacetedMinMaxValues(t,e.id),e.getFacetedMinMaxValues=()=>{if(e._getFacetedMinMaxValues)return e._getFacetedMinMaxValues()}},createRow:(e,t)=>{e.columnFilters={},e.columnFiltersMeta={}},createTable:e=>{e.getGlobalAutoFilterFn=()=>Qa.includesString,e.getGlobalFilterFn=()=>{var t,n;const{globalFilterFn:r}=e.options;return Ig(r)?r:r==="auto"?e.getGlobalAutoFilterFn():(t=(n=e.options.filterFns)==null?void 0:n[r])!=null?t:Qa[r]},e.setColumnFilters=t=>{const n=e.getAllLeafColumns(),r=a=>{var o;return(o=ii(t,a))==null?void 0:o.filter(i=>{const s=n.find(l=>l.id===i.id);if(s){const l=s.getFilterFn();if(m2(l,i.value,s))return!1}return!0})};e.options.onColumnFiltersChange==null||e.options.onColumnFiltersChange(r)},e.setGlobalFilter=t=>{e.options.onGlobalFilterChange==null||e.options.onGlobalFilterChange(t)},e.resetGlobalFilter=t=>{e.setGlobalFilter(t?void 0:e.initialState.globalFilter)},e.resetColumnFilters=t=>{var n,r;e.setColumnFilters(t?[]:(n=(r=e.initialState)==null?void 0:r.columnFilters)!=null?n:[])},e.getPreFilteredRowModel=()=>e.getCoreRowModel(),e.getFilteredRowModel=()=>(!e._getFilteredRowModel&&e.options.getFilteredRowModel&&(e._getFilteredRowModel=e.options.getFilteredRowModel(e)),e.options.manualFiltering||!e._getFilteredRowModel?e.getPreFilteredRowModel():e._getFilteredRowModel()),e._getGlobalFacetedRowModel=e.options.getFacetedRowModel&&e.options.getFacetedRowModel(e,"__global__"),e.getGlobalFacetedRowModel=()=>e.options.manualFiltering||!e._getGlobalFacetedRowModel?e.getPreFilteredRowModel():e._getGlobalFacetedRowModel(),e._getGlobalFacetedUniqueValues=e.options.getFacetedUniqueValues&&e.options.getFacetedUniqueValues(e,"__global__"),e.getGlobalFacetedUniqueValues=()=>e._getGlobalFacetedUniqueValues?e._getGlobalFacetedUniqueValues():new Map,e._getGlobalFacetedMinMaxValues=e.options.getFacetedMinMaxValues&&e.options.getFacetedMinMaxValues(e,"__global__"),e.getGlobalFacetedMinMaxValues=()=>{if(e._getGlobalFacetedMinMaxValues)return e._getGlobalFacetedMinMaxValues()}}};function m2(e,t,n){return(e&&e.autoRemove?e.autoRemove(t,n):!1)||typeof t>"u"||typeof t=="string"&&!t}const DX=(e,t,n)=>n.reduce((r,a)=>{const o=a.getValue(e);return r+(typeof o=="number"?o:0)},0),LX=(e,t,n)=>{let r;return n.forEach(a=>{const o=a.getValue(e);o!=null&&(r>o||r===void 0&&o>=o)&&(r=o)}),r},MX=(e,t,n)=>{let r;return n.forEach(a=>{const o=a.getValue(e);o!=null&&(r=o)&&(r=o)}),r},PX=(e,t,n)=>{let r,a;return n.forEach(o=>{const i=o.getValue(e);i!=null&&(r===void 0?i>=i&&(r=a=i):(r>i&&(r=i),a{let n=0,r=0;if(t.forEach(a=>{let o=a.getValue(e);o!=null&&(o=+o)>=o&&(++n,r+=o)}),n)return r/n},FX=(e,t)=>{if(!t.length)return;const n=t.map(o=>o.getValue(e));if(!CX(n))return;if(n.length===1)return n[0];const r=Math.floor(n.length/2),a=n.sort((o,i)=>o-i);return n.length%2!==0?a[r]:(a[r-1]+a[r])/2},jX=(e,t)=>Array.from(new Set(t.map(n=>n.getValue(e))).values()),zX=(e,t)=>new Set(t.map(n=>n.getValue(e))).size,UX=(e,t)=>t.length,Db={sum:DX,min:LX,max:MX,extent:PX,mean:$X,median:FX,unique:jX,uniqueCount:zX,count:UX},BX={getDefaultColumnDef:()=>({aggregatedCell:e=>{var t,n;return(t=(n=e.getValue())==null||n.toString==null?void 0:n.toString())!=null?t:null},aggregationFn:"auto"}),getInitialState:e=>({grouping:[],...e}),getDefaultOptions:e=>({onGroupingChange:Tr("grouping",e),groupedColumnMode:"reorder"}),createColumn:(e,t)=>{e.toggleGrouping=()=>{t.setGrouping(n=>n!=null&&n.includes(e.id)?n.filter(r=>r!==e.id):[...n??[],e.id])},e.getCanGroup=()=>{var n,r,a,o;return(n=(r=(a=(o=e.columnDef.enableGrouping)!=null?o:!0)!=null?a:t.options.enableGrouping)!=null?r:!0)!=null?n:!!e.accessorFn},e.getIsGrouped=()=>{var n;return(n=t.getState().grouping)==null?void 0:n.includes(e.id)},e.getGroupedIndex=()=>{var n;return(n=t.getState().grouping)==null?void 0:n.indexOf(e.id)},e.getToggleGroupingHandler=()=>{const n=e.getCanGroup();return()=>{n&&e.toggleGrouping()}},e.getAutoAggregationFn=()=>{const n=t.getCoreRowModel().flatRows[0],r=n==null?void 0:n.getValue(e.id);if(typeof r=="number")return Db.sum;if(Object.prototype.toString.call(r)==="[object Date]")return Db.extent},e.getAggregationFn=()=>{var n,r;if(!e)throw new Error;return Ig(e.columnDef.aggregationFn)?e.columnDef.aggregationFn:e.columnDef.aggregationFn==="auto"?e.getAutoAggregationFn():(n=(r=t.options.aggregationFns)==null?void 0:r[e.columnDef.aggregationFn])!=null?n:Db[e.columnDef.aggregationFn]}},createTable:e=>{e.setGrouping=t=>e.options.onGroupingChange==null?void 0:e.options.onGroupingChange(t),e.resetGrouping=t=>{var n,r;e.setGrouping(t?[]:(n=(r=e.initialState)==null?void 0:r.grouping)!=null?n:[])},e.getPreGroupedRowModel=()=>e.getFilteredRowModel(),e.getGroupedRowModel=()=>(!e._getGroupedRowModel&&e.options.getGroupedRowModel&&(e._getGroupedRowModel=e.options.getGroupedRowModel(e)),e.options.manualGrouping||!e._getGroupedRowModel?e.getPreGroupedRowModel():e._getGroupedRowModel())},createRow:(e,t)=>{e.getIsGrouped=()=>!!e.groupingColumnId,e.getGroupingValue=n=>{if(e._groupingValuesCache.hasOwnProperty(n))return e._groupingValuesCache[n];const r=t.getColumn(n);return r!=null&&r.columnDef.getGroupingValue?(e._groupingValuesCache[n]=r.columnDef.getGroupingValue(e.original),e._groupingValuesCache[n]):e.getValue(n)},e._groupingValuesCache={}},createCell:(e,t,n,r)=>{e.getIsGrouped=()=>t.getIsGrouped()&&t.id===n.groupingColumnId,e.getIsPlaceholder=()=>!e.getIsGrouped()&&t.getIsGrouped(),e.getIsAggregated=()=>{var a;return!e.getIsGrouped()&&!e.getIsPlaceholder()&&!!((a=n.subRows)!=null&&a.length)}}};function HX(e,t,n){if(!(t!=null&&t.length)||!n)return e;const r=e.filter(o=>!t.includes(o.id));return n==="remove"?r:[...t.map(o=>e.find(i=>i.id===o)).filter(Boolean),...r]}const VX={getInitialState:e=>({columnOrder:[],...e}),getDefaultOptions:e=>({onColumnOrderChange:Tr("columnOrder",e)}),createColumn:(e,t)=>{e.getIndex=$e(n=>[Hu(t,n)],n=>n.findIndex(r=>r.id===e.id),Fe(t.options,"debugColumns")),e.getIsFirstColumn=n=>{var r;return((r=Hu(t,n)[0])==null?void 0:r.id)===e.id},e.getIsLastColumn=n=>{var r;const a=Hu(t,n);return((r=a[a.length-1])==null?void 0:r.id)===e.id}},createTable:e=>{e.setColumnOrder=t=>e.options.onColumnOrderChange==null?void 0:e.options.onColumnOrderChange(t),e.resetColumnOrder=t=>{var n;e.setColumnOrder(t?[]:(n=e.initialState.columnOrder)!=null?n:[])},e._getOrderColumnsFn=$e(()=>[e.getState().columnOrder,e.getState().grouping,e.options.groupedColumnMode],(t,n,r)=>a=>{let o=[];if(!(t!=null&&t.length))o=a;else{const i=[...t],s=[...a];for(;s.length&&i.length;){const l=i.shift(),c=s.findIndex(u=>u.id===l);c>-1&&o.push(s.splice(c,1)[0])}o=[...o,...s]}return HX(o,n,r)},Fe(e.options,"debugTable"))}},Y1=0,Z1=10,Lb=()=>({pageIndex:Y1,pageSize:Z1}),qX={getInitialState:e=>({...e,pagination:{...Lb(),...e==null?void 0:e.pagination}}),getDefaultOptions:e=>({onPaginationChange:Tr("pagination",e)}),createTable:e=>{let t=!1,n=!1;e._autoResetPageIndex=()=>{var r,a;if(!t){e._queue(()=>{t=!0});return}if((r=(a=e.options.autoResetAll)!=null?a:e.options.autoResetPageIndex)!=null?r:!e.options.manualPagination){if(n)return;n=!0,e._queue(()=>{e.resetPageIndex(),n=!1})}},e.setPagination=r=>{const a=o=>ii(r,o);return e.options.onPaginationChange==null?void 0:e.options.onPaginationChange(a)},e.resetPagination=r=>{var a;e.setPagination(r?Lb():(a=e.initialState.pagination)!=null?a:Lb())},e.setPageIndex=r=>{e.setPagination(a=>{let o=ii(r,a.pageIndex);const i=typeof e.options.pageCount>"u"||e.options.pageCount===-1?Number.MAX_SAFE_INTEGER:e.options.pageCount-1;return o=Math.max(0,Math.min(o,i)),{...a,pageIndex:o}})},e.resetPageIndex=r=>{var a,o;e.setPageIndex(r?Y1:(a=(o=e.initialState)==null||(o=o.pagination)==null?void 0:o.pageIndex)!=null?a:Y1)},e.resetPageSize=r=>{var a,o;e.setPageSize(r?Z1:(a=(o=e.initialState)==null||(o=o.pagination)==null?void 0:o.pageSize)!=null?a:Z1)},e.setPageSize=r=>{e.setPagination(a=>{const o=Math.max(1,ii(r,a.pageSize)),i=a.pageSize*a.pageIndex,s=Math.floor(i/o);return{...a,pageIndex:s,pageSize:o}})},e.setPageCount=r=>e.setPagination(a=>{var o;let i=ii(r,(o=e.options.pageCount)!=null?o:-1);return typeof i=="number"&&(i=Math.max(-1,i)),{...a,pageCount:i}}),e.getPageOptions=$e(()=>[e.getPageCount()],r=>{let a=[];return r&&r>0&&(a=[...new Array(r)].fill(null).map((o,i)=>i)),a},Fe(e.options,"debugTable")),e.getCanPreviousPage=()=>e.getState().pagination.pageIndex>0,e.getCanNextPage=()=>{const{pageIndex:r}=e.getState().pagination,a=e.getPageCount();return a===-1?!0:a===0?!1:re.setPageIndex(r=>r-1),e.nextPage=()=>e.setPageIndex(r=>r+1),e.getPrePaginationRowModel=()=>e.getExpandedRowModel(),e.getPaginationRowModel=()=>(!e._getPaginationRowModel&&e.options.getPaginationRowModel&&(e._getPaginationRowModel=e.options.getPaginationRowModel(e)),e.options.manualPagination||!e._getPaginationRowModel?e.getPrePaginationRowModel():e._getPaginationRowModel()),e.getPageCount=()=>{var r;return(r=e.options.pageCount)!=null?r:Math.ceil(e.getPrePaginationRowModel().rows.length/e.getState().pagination.pageSize)}}},Mb=()=>({left:[],right:[]}),Pb=()=>({top:[],bottom:[]}),GX={getInitialState:e=>({columnPinning:Mb(),rowPinning:Pb(),...e}),getDefaultOptions:e=>({onColumnPinningChange:Tr("columnPinning",e),onRowPinningChange:Tr("rowPinning",e)}),createColumn:(e,t)=>{e.pin=n=>{const r=e.getLeafColumns().map(a=>a.id).filter(Boolean);t.setColumnPinning(a=>{var o,i;if(n==="right"){var s,l;return{left:((s=a==null?void 0:a.left)!=null?s:[]).filter(d=>!(r!=null&&r.includes(d))),right:[...((l=a==null?void 0:a.right)!=null?l:[]).filter(d=>!(r!=null&&r.includes(d))),...r]}}if(n==="left"){var c,u;return{left:[...((c=a==null?void 0:a.left)!=null?c:[]).filter(d=>!(r!=null&&r.includes(d))),...r],right:((u=a==null?void 0:a.right)!=null?u:[]).filter(d=>!(r!=null&&r.includes(d)))}}return{left:((o=a==null?void 0:a.left)!=null?o:[]).filter(d=>!(r!=null&&r.includes(d))),right:((i=a==null?void 0:a.right)!=null?i:[]).filter(d=>!(r!=null&&r.includes(d)))}})},e.getCanPin=()=>e.getLeafColumns().some(r=>{var a,o,i;return((a=r.columnDef.enablePinning)!=null?a:!0)&&((o=(i=t.options.enableColumnPinning)!=null?i:t.options.enablePinning)!=null?o:!0)}),e.getIsPinned=()=>{const n=e.getLeafColumns().map(s=>s.id),{left:r,right:a}=t.getState().columnPinning,o=n.some(s=>r==null?void 0:r.includes(s)),i=n.some(s=>a==null?void 0:a.includes(s));return o?"left":i?"right":!1},e.getPinnedIndex=()=>{var n,r;const a=e.getIsPinned();return a?(n=(r=t.getState().columnPinning)==null||(r=r[a])==null?void 0:r.indexOf(e.id))!=null?n:-1:0}},createRow:(e,t)=>{e.pin=(n,r,a)=>{const o=r?e.getLeafRows().map(l=>{let{id:c}=l;return c}):[],i=a?e.getParentRows().map(l=>{let{id:c}=l;return c}):[],s=new Set([...i,e.id,...o]);t.setRowPinning(l=>{var c,u;if(n==="bottom"){var d,g;return{top:((d=l==null?void 0:l.top)!=null?d:[]).filter(y=>!(s!=null&&s.has(y))),bottom:[...((g=l==null?void 0:l.bottom)!=null?g:[]).filter(y=>!(s!=null&&s.has(y))),...Array.from(s)]}}if(n==="top"){var m,b;return{top:[...((m=l==null?void 0:l.top)!=null?m:[]).filter(y=>!(s!=null&&s.has(y))),...Array.from(s)],bottom:((b=l==null?void 0:l.bottom)!=null?b:[]).filter(y=>!(s!=null&&s.has(y)))}}return{top:((c=l==null?void 0:l.top)!=null?c:[]).filter(y=>!(s!=null&&s.has(y))),bottom:((u=l==null?void 0:l.bottom)!=null?u:[]).filter(y=>!(s!=null&&s.has(y)))}})},e.getCanPin=()=>{var n;const{enableRowPinning:r,enablePinning:a}=t.options;return typeof r=="function"?r(e):(n=r??a)!=null?n:!0},e.getIsPinned=()=>{const n=[e.id],{top:r,bottom:a}=t.getState().rowPinning,o=n.some(s=>r==null?void 0:r.includes(s)),i=n.some(s=>a==null?void 0:a.includes(s));return o?"top":i?"bottom":!1},e.getPinnedIndex=()=>{var n,r;const a=e.getIsPinned();if(!a)return-1;const o=(n=t._getPinnedRows(a))==null?void 0:n.map(i=>{let{id:s}=i;return s});return(r=o==null?void 0:o.indexOf(e.id))!=null?r:-1},e.getCenterVisibleCells=$e(()=>[e._getAllVisibleCells(),t.getState().columnPinning.left,t.getState().columnPinning.right],(n,r,a)=>{const o=[...r??[],...a??[]];return n.filter(i=>!o.includes(i.column.id))},Fe(t.options,"debugRows")),e.getLeftVisibleCells=$e(()=>[e._getAllVisibleCells(),t.getState().columnPinning.left,,],(n,r)=>(r??[]).map(o=>n.find(i=>i.column.id===o)).filter(Boolean).map(o=>({...o,position:"left"})),Fe(t.options,"debugRows")),e.getRightVisibleCells=$e(()=>[e._getAllVisibleCells(),t.getState().columnPinning.right],(n,r)=>(r??[]).map(o=>n.find(i=>i.column.id===o)).filter(Boolean).map(o=>({...o,position:"right"})),Fe(t.options,"debugRows"))},createTable:e=>{e.setColumnPinning=t=>e.options.onColumnPinningChange==null?void 0:e.options.onColumnPinningChange(t),e.resetColumnPinning=t=>{var n,r;return e.setColumnPinning(t?Mb():(n=(r=e.initialState)==null?void 0:r.columnPinning)!=null?n:Mb())},e.getIsSomeColumnsPinned=t=>{var n;const r=e.getState().columnPinning;if(!t){var a,o;return!!((a=r.left)!=null&&a.length||(o=r.right)!=null&&o.length)}return!!((n=r[t])!=null&&n.length)},e.getLeftLeafColumns=$e(()=>[e.getAllLeafColumns(),e.getState().columnPinning.left],(t,n)=>(n??[]).map(r=>t.find(a=>a.id===r)).filter(Boolean),Fe(e.options,"debugColumns")),e.getRightLeafColumns=$e(()=>[e.getAllLeafColumns(),e.getState().columnPinning.right],(t,n)=>(n??[]).map(r=>t.find(a=>a.id===r)).filter(Boolean),Fe(e.options,"debugColumns")),e.getCenterLeafColumns=$e(()=>[e.getAllLeafColumns(),e.getState().columnPinning.left,e.getState().columnPinning.right],(t,n,r)=>{const a=[...n??[],...r??[]];return t.filter(o=>!a.includes(o.id))},Fe(e.options,"debugColumns")),e.setRowPinning=t=>e.options.onRowPinningChange==null?void 0:e.options.onRowPinningChange(t),e.resetRowPinning=t=>{var n,r;return e.setRowPinning(t?Pb():(n=(r=e.initialState)==null?void 0:r.rowPinning)!=null?n:Pb())},e.getIsSomeRowsPinned=t=>{var n;const r=e.getState().rowPinning;if(!t){var a,o;return!!((a=r.top)!=null&&a.length||(o=r.bottom)!=null&&o.length)}return!!((n=r[t])!=null&&n.length)},e._getPinnedRows=$e(t=>[e.getRowModel().rows,e.getState().rowPinning[t],t],(t,n,r)=>{var a;return((a=e.options.keepPinnedRows)==null||a?(n??[]).map(i=>{const s=e.getRow(i,!0);return s.getIsAllParentsExpanded()?s:null}):(n??[]).map(i=>t.find(s=>s.id===i))).filter(Boolean).map(i=>({...i,position:r}))},Fe(e.options,"debugRows")),e.getTopRows=()=>e._getPinnedRows("top"),e.getBottomRows=()=>e._getPinnedRows("bottom"),e.getCenterRows=$e(()=>[e.getRowModel().rows,e.getState().rowPinning.top,e.getState().rowPinning.bottom],(t,n,r)=>{const a=new Set([...n??[],...r??[]]);return t.filter(o=>!a.has(o.id))},Fe(e.options,"debugRows"))}},WX={getInitialState:e=>({rowSelection:{},...e}),getDefaultOptions:e=>({onRowSelectionChange:Tr("rowSelection",e),enableRowSelection:!0,enableMultiRowSelection:!0,enableSubRowSelection:!0}),createTable:e=>{e.setRowSelection=t=>e.options.onRowSelectionChange==null?void 0:e.options.onRowSelectionChange(t),e.resetRowSelection=t=>{var n;return e.setRowSelection(t?{}:(n=e.initialState.rowSelection)!=null?n:{})},e.toggleAllRowsSelected=t=>{e.setRowSelection(n=>{t=typeof t<"u"?t:!e.getIsAllRowsSelected();const r={...n},a=e.getPreGroupedRowModel().flatRows;return t?a.forEach(o=>{o.getCanSelect()&&(r[o.id]=!0)}):a.forEach(o=>{delete r[o.id]}),r})},e.toggleAllPageRowsSelected=t=>e.setRowSelection(n=>{const r=typeof t<"u"?t:!e.getIsAllPageRowsSelected(),a={...n};return e.getRowModel().rows.forEach(o=>{X1(a,o.id,r,!0,e)}),a}),e.getPreSelectedRowModel=()=>e.getCoreRowModel(),e.getSelectedRowModel=$e(()=>[e.getState().rowSelection,e.getCoreRowModel()],(t,n)=>Object.keys(t).length?$b(e,n):{rows:[],flatRows:[],rowsById:{}},Fe(e.options,"debugTable")),e.getFilteredSelectedRowModel=$e(()=>[e.getState().rowSelection,e.getFilteredRowModel()],(t,n)=>Object.keys(t).length?$b(e,n):{rows:[],flatRows:[],rowsById:{}},Fe(e.options,"debugTable")),e.getGroupedSelectedRowModel=$e(()=>[e.getState().rowSelection,e.getSortedRowModel()],(t,n)=>Object.keys(t).length?$b(e,n):{rows:[],flatRows:[],rowsById:{}},Fe(e.options,"debugTable")),e.getIsAllRowsSelected=()=>{const t=e.getFilteredRowModel().flatRows,{rowSelection:n}=e.getState();let r=!!(t.length&&Object.keys(n).length);return r&&t.some(a=>a.getCanSelect()&&!n[a.id])&&(r=!1),r},e.getIsAllPageRowsSelected=()=>{const t=e.getPaginationRowModel().flatRows.filter(a=>a.getCanSelect()),{rowSelection:n}=e.getState();let r=!!t.length;return r&&t.some(a=>!n[a.id])&&(r=!1),r},e.getIsSomeRowsSelected=()=>{var t;const n=Object.keys((t=e.getState().rowSelection)!=null?t:{}).length;return n>0&&n{const t=e.getPaginationRowModel().flatRows;return e.getIsAllPageRowsSelected()?!1:t.filter(n=>n.getCanSelect()).some(n=>n.getIsSelected()||n.getIsSomeSelected())},e.getToggleAllRowsSelectedHandler=()=>t=>{e.toggleAllRowsSelected(t.target.checked)},e.getToggleAllPageRowsSelectedHandler=()=>t=>{e.toggleAllPageRowsSelected(t.target.checked)}},createRow:(e,t)=>{e.toggleSelected=(n,r)=>{const a=e.getIsSelected();t.setRowSelection(o=>{var i;if(n=typeof n<"u"?n:!a,e.getCanSelect()&&a===n)return o;const s={...o};return X1(s,e.id,n,(i=r==null?void 0:r.selectChildren)!=null?i:!0,t),s})},e.getIsSelected=()=>{const{rowSelection:n}=t.getState();return w_(e,n)},e.getIsSomeSelected=()=>{const{rowSelection:n}=t.getState();return Q1(e,n)==="some"},e.getIsAllSubRowsSelected=()=>{const{rowSelection:n}=t.getState();return Q1(e,n)==="all"},e.getCanSelect=()=>{var n;return typeof t.options.enableRowSelection=="function"?t.options.enableRowSelection(e):(n=t.options.enableRowSelection)!=null?n:!0},e.getCanSelectSubRows=()=>{var n;return typeof t.options.enableSubRowSelection=="function"?t.options.enableSubRowSelection(e):(n=t.options.enableSubRowSelection)!=null?n:!0},e.getCanMultiSelect=()=>{var n;return typeof t.options.enableMultiRowSelection=="function"?t.options.enableMultiRowSelection(e):(n=t.options.enableMultiRowSelection)!=null?n:!0},e.getToggleSelectedHandler=()=>{const n=e.getCanSelect();return r=>{var a;n&&e.toggleSelected((a=r.target)==null?void 0:a.checked)}}}},X1=(e,t,n,r,a)=>{var o;const i=a.getRow(t,!0);n?(i.getCanMultiSelect()||Object.keys(e).forEach(s=>delete e[s]),i.getCanSelect()&&(e[t]=!0)):delete e[t],r&&(o=i.subRows)!=null&&o.length&&i.getCanSelectSubRows()&&i.subRows.forEach(s=>X1(e,s.id,n,r,a))};function $b(e,t){const n=e.getState().rowSelection,r=[],a={},o=function(i,s){return i.map(l=>{var c;const u=w_(l,n);if(u&&(r.push(l),a[l.id]=l),(c=l.subRows)!=null&&c.length&&(l={...l,subRows:o(l.subRows)}),u)return l}).filter(Boolean)};return{rows:o(t.rows),flatRows:r,rowsById:a}}function w_(e,t){var n;return(n=t[e.id])!=null?n:!1}function Q1(e,t,n){var r;if(!((r=e.subRows)!=null&&r.length))return!1;let a=!0,o=!1;return e.subRows.forEach(i=>{if(!(o&&!a)&&(i.getCanSelect()&&(w_(i,t)?o=!0:a=!1),i.subRows&&i.subRows.length)){const s=Q1(i,t);s==="all"?o=!0:(s==="some"&&(o=!0),a=!1)}}),a?"all":o?"some":!1}const J1=/([0-9]+)/gm,KX=(e,t,n)=>M6(Ei(e.getValue(n)).toLowerCase(),Ei(t.getValue(n)).toLowerCase()),YX=(e,t,n)=>M6(Ei(e.getValue(n)),Ei(t.getValue(n))),ZX=(e,t,n)=>E_(Ei(e.getValue(n)).toLowerCase(),Ei(t.getValue(n)).toLowerCase()),XX=(e,t,n)=>E_(Ei(e.getValue(n)),Ei(t.getValue(n))),QX=(e,t,n)=>{const r=e.getValue(n),a=t.getValue(n);return r>a?1:rE_(e.getValue(n),t.getValue(n));function E_(e,t){return e===t?0:e>t?1:-1}function Ei(e){return typeof e=="number"?isNaN(e)||e===1/0||e===-1/0?"":String(e):typeof e=="string"?e:""}function M6(e,t){const n=e.split(J1).filter(Boolean),r=t.split(J1).filter(Boolean);for(;n.length&&r.length;){const a=n.shift(),o=r.shift(),i=parseInt(a,10),s=parseInt(o,10),l=[i,s].sort();if(isNaN(l[0])){if(a>o)return 1;if(o>a)return-1;continue}if(isNaN(l[1]))return isNaN(i)?-1:1;if(i>s)return 1;if(s>i)return-1}return n.length-r.length}const cu={alphanumeric:KX,alphanumericCaseSensitive:YX,text:ZX,textCaseSensitive:XX,datetime:QX,basic:JX},eQ={getInitialState:e=>({sorting:[],...e}),getDefaultColumnDef:()=>({sortingFn:"auto",sortUndefined:1}),getDefaultOptions:e=>({onSortingChange:Tr("sorting",e),isMultiSortEvent:t=>t.shiftKey}),createColumn:(e,t)=>{e.getAutoSortingFn=()=>{const n=t.getFilteredRowModel().flatRows.slice(10);let r=!1;for(const a of n){const o=a==null?void 0:a.getValue(e.id);if(Object.prototype.toString.call(o)==="[object Date]")return cu.datetime;if(typeof o=="string"&&(r=!0,o.split(J1).length>1))return cu.alphanumeric}return r?cu.text:cu.basic},e.getAutoSortDir=()=>{const n=t.getFilteredRowModel().flatRows[0];return typeof(n==null?void 0:n.getValue(e.id))=="string"?"asc":"desc"},e.getSortingFn=()=>{var n,r;if(!e)throw new Error;return Ig(e.columnDef.sortingFn)?e.columnDef.sortingFn:e.columnDef.sortingFn==="auto"?e.getAutoSortingFn():(n=(r=t.options.sortingFns)==null?void 0:r[e.columnDef.sortingFn])!=null?n:cu[e.columnDef.sortingFn]},e.toggleSorting=(n,r)=>{const a=e.getNextSortingOrder(),o=typeof n<"u"&&n!==null;t.setSorting(i=>{const s=i==null?void 0:i.find(m=>m.id===e.id),l=i==null?void 0:i.findIndex(m=>m.id===e.id);let c=[],u,d=o?n:a==="desc";if(i!=null&&i.length&&e.getCanMultiSort()&&r?s?u="toggle":u="add":i!=null&&i.length&&l!==i.length-1?u="replace":s?u="toggle":u="replace",u==="toggle"&&(o||a||(u="remove")),u==="add"){var g;c=[...i,{id:e.id,desc:d}],c.splice(0,c.length-((g=t.options.maxMultiSortColCount)!=null?g:Number.MAX_SAFE_INTEGER))}else u==="toggle"?c=i.map(m=>m.id===e.id?{...m,desc:d}:m):u==="remove"?c=i.filter(m=>m.id!==e.id):c=[{id:e.id,desc:d}];return c})},e.getFirstSortDir=()=>{var n,r;return((n=(r=e.columnDef.sortDescFirst)!=null?r:t.options.sortDescFirst)!=null?n:e.getAutoSortDir()==="desc")?"desc":"asc"},e.getNextSortingOrder=n=>{var r,a;const o=e.getFirstSortDir(),i=e.getIsSorted();return i?i!==o&&((r=t.options.enableSortingRemoval)==null||r)&&(!(n&&(a=t.options.enableMultiRemove)!=null)||a)?!1:i==="desc"?"asc":"desc":o},e.getCanSort=()=>{var n,r;return((n=e.columnDef.enableSorting)!=null?n:!0)&&((r=t.options.enableSorting)!=null?r:!0)&&!!e.accessorFn},e.getCanMultiSort=()=>{var n,r;return(n=(r=e.columnDef.enableMultiSort)!=null?r:t.options.enableMultiSort)!=null?n:!!e.accessorFn},e.getIsSorted=()=>{var n;const r=(n=t.getState().sorting)==null?void 0:n.find(a=>a.id===e.id);return r?r.desc?"desc":"asc":!1},e.getSortIndex=()=>{var n,r;return(n=(r=t.getState().sorting)==null?void 0:r.findIndex(a=>a.id===e.id))!=null?n:-1},e.clearSorting=()=>{t.setSorting(n=>n!=null&&n.length?n.filter(r=>r.id!==e.id):[])},e.getToggleSortingHandler=()=>{const n=e.getCanSort();return r=>{n&&(r.persist==null||r.persist(),e.toggleSorting==null||e.toggleSorting(void 0,e.getCanMultiSort()?t.options.isMultiSortEvent==null?void 0:t.options.isMultiSortEvent(r):!1))}}},createTable:e=>{e.setSorting=t=>e.options.onSortingChange==null?void 0:e.options.onSortingChange(t),e.resetSorting=t=>{var n,r;e.setSorting(t?[]:(n=(r=e.initialState)==null?void 0:r.sorting)!=null?n:[])},e.getPreSortedRowModel=()=>e.getGroupedRowModel(),e.getSortedRowModel=()=>(!e._getSortedRowModel&&e.options.getSortedRowModel&&(e._getSortedRowModel=e.options.getSortedRowModel(e)),e.options.manualSorting||!e._getSortedRowModel?e.getPreSortedRowModel():e._getSortedRowModel())}},tQ={getInitialState:e=>({columnVisibility:{},...e}),getDefaultOptions:e=>({onColumnVisibilityChange:Tr("columnVisibility",e)}),createColumn:(e,t)=>{e.toggleVisibility=n=>{e.getCanHide()&&t.setColumnVisibility(r=>({...r,[e.id]:n??!e.getIsVisible()}))},e.getIsVisible=()=>{var n,r;return(n=(r=t.getState().columnVisibility)==null?void 0:r[e.id])!=null?n:!0},e.getCanHide=()=>{var n,r;return((n=e.columnDef.enableHiding)!=null?n:!0)&&((r=t.options.enableHiding)!=null?r:!0)},e.getToggleVisibilityHandler=()=>n=>{e.toggleVisibility==null||e.toggleVisibility(n.target.checked)}},createRow:(e,t)=>{e._getAllVisibleCells=$e(()=>[e.getAllCells(),t.getState().columnVisibility],n=>n.filter(r=>r.column.getIsVisible()),Fe(t.options,"debugRows")),e.getVisibleCells=$e(()=>[e.getLeftVisibleCells(),e.getCenterVisibleCells(),e.getRightVisibleCells()],(n,r,a)=>[...n,...r,...a],Fe(t.options,"debugRows"))},createTable:e=>{const t=(n,r)=>$e(()=>[r(),r().filter(a=>a.getIsVisible()).map(a=>a.id).join("_")],a=>a.filter(o=>o.getIsVisible==null?void 0:o.getIsVisible()),Fe(e.options,"debugColumns"));e.getVisibleFlatColumns=t("getVisibleFlatColumns",()=>e.getAllFlatColumns()),e.getVisibleLeafColumns=t("getVisibleLeafColumns",()=>e.getAllLeafColumns()),e.getLeftVisibleLeafColumns=t("getLeftVisibleLeafColumns",()=>e.getLeftLeafColumns()),e.getRightVisibleLeafColumns=t("getRightVisibleLeafColumns",()=>e.getRightLeafColumns()),e.getCenterVisibleLeafColumns=t("getCenterVisibleLeafColumns",()=>e.getCenterLeafColumns()),e.setColumnVisibility=n=>e.options.onColumnVisibilityChange==null?void 0:e.options.onColumnVisibilityChange(n),e.resetColumnVisibility=n=>{var r;e.setColumnVisibility(n?{}:(r=e.initialState.columnVisibility)!=null?r:{})},e.toggleAllColumnsVisible=n=>{var r;n=(r=n)!=null?r:!e.getIsAllColumnsVisible(),e.setColumnVisibility(e.getAllLeafColumns().reduce((a,o)=>({...a,[o.id]:n||!(o.getCanHide!=null&&o.getCanHide())}),{}))},e.getIsAllColumnsVisible=()=>!e.getAllLeafColumns().some(n=>!(n.getIsVisible!=null&&n.getIsVisible())),e.getIsSomeColumnsVisible=()=>e.getAllLeafColumns().some(n=>n.getIsVisible==null?void 0:n.getIsVisible()),e.getToggleAllColumnsVisibilityHandler=()=>n=>{var r;e.toggleAllColumnsVisible((r=n.target)==null?void 0:r.checked)}}};function Hu(e,t){return t?t==="center"?e.getCenterVisibleLeafColumns():t==="left"?e.getLeftVisibleLeafColumns():e.getRightVisibleLeafColumns():e.getVisibleLeafColumns()}const h2=[TX,tQ,VX,GX,OX,eQ,BX,IX,qX,WX,RX];function nQ(e){var t;(e.debugAll||e.debugTable)&&console.info("Creating Table Instance...");let n={_features:h2};const r=n._features.reduce((u,d)=>Object.assign(u,d.getDefaultOptions==null?void 0:d.getDefaultOptions(n)),{}),a=u=>n.options.mergeOptions?n.options.mergeOptions(r,u):{...r,...u};let i={...{},...(t=e.initialState)!=null?t:{}};n._features.forEach(u=>{var d;i=(d=u.getInitialState==null?void 0:u.getInitialState(i))!=null?d:i});const s=[];let l=!1;const c={_features:h2,options:{...r,...e},initialState:i,_queue:u=>{s.push(u),l||(l=!0,Promise.resolve().then(()=>{for(;s.length;)s.shift()();l=!1}).catch(d=>setTimeout(()=>{throw d})))},reset:()=>{n.setState(n.initialState)},setOptions:u=>{const d=ii(u,n.options);n.options=a(d)},getState:()=>n.options.state,setState:u=>{n.options.onStateChange==null||n.options.onStateChange(u)},_getRowId:(u,d,g)=>{var m;return(m=n.options.getRowId==null?void 0:n.options.getRowId(u,d,g))!=null?m:`${g?[g.id,d].join("."):d}`},getCoreRowModel:()=>(n._getCoreRowModel||(n._getCoreRowModel=n.options.getCoreRowModel(n)),n._getCoreRowModel()),getRowModel:()=>n.getPaginationRowModel(),getRow:(u,d)=>{let g=(d?n.getPrePaginationRowModel():n.getRowModel()).rowsById[u];if(!g&&(g=n.getCoreRowModel().rowsById[u],!g))throw new Error;return g},_getDefaultColumnDef:$e(()=>[n.options.defaultColumn],u=>{var d;return u=(d=u)!=null?d:{},{header:g=>{const m=g.header.column.columnDef;return m.accessorKey?m.accessorKey:m.accessorFn?m.id:null},cell:g=>{var m,b;return(m=(b=g.renderValue())==null||b.toString==null?void 0:b.toString())!=null?m:null},...n._features.reduce((g,m)=>Object.assign(g,m.getDefaultColumnDef==null?void 0:m.getDefaultColumnDef()),{}),...u}},Fe(e,"debugColumns")),_getColumnDefs:()=>n.options.columns,getAllColumns:$e(()=>[n._getColumnDefs()],u=>{const d=function(g,m,b){return b===void 0&&(b=0),g.map(y=>{const w=AX(n,y,b,m),v=y;return w.columns=v.columns?d(v.columns,w,b+1):[],w})};return d(u)},Fe(e,"debugColumns")),getAllFlatColumns:$e(()=>[n.getAllColumns()],u=>u.flatMap(d=>d.getFlatColumns()),Fe(e,"debugColumns")),_getAllFlatColumnsById:$e(()=>[n.getAllFlatColumns()],u=>u.reduce((d,g)=>(d[g.id]=g,d),{}),Fe(e,"debugColumns")),getAllLeafColumns:$e(()=>[n.getAllColumns(),n._getOrderColumnsFn()],(u,d)=>{let g=u.flatMap(m=>m.getLeafColumns());return d(g)},Fe(e,"debugColumns")),getColumn:u=>n._getAllFlatColumnsById()[u]};Object.assign(n,c);for(let u=0;u{var i;return(i=o.getValue())!=null?i:e.options.renderFallbackValue},o={id:`${t.id}_${n.id}`,row:t,column:n,getValue:()=>t.getValue(r),renderValue:a,getContext:$e(()=>[e,n,t,o],(i,s,l,c)=>({table:i,column:s,row:l,cell:c,getValue:c.getValue,renderValue:c.renderValue}),Fe(e.options,"debugCells"))};return e._features.forEach(i=>{i.createCell==null||i.createCell(o,n,t,e)},{}),o}const aQ=(e,t,n,r,a,o,i)=>{let s={id:t,index:r,original:n,depth:a,parentId:i,_valuesCache:{},_uniqueValuesCache:{},getValue:l=>{if(s._valuesCache.hasOwnProperty(l))return s._valuesCache[l];const c=e.getColumn(l);if(c!=null&&c.accessorFn)return s._valuesCache[l]=c.accessorFn(s.original,r),s._valuesCache[l]},getUniqueValues:l=>{if(s._uniqueValuesCache.hasOwnProperty(l))return s._uniqueValuesCache[l];const c=e.getColumn(l);if(c!=null&&c.accessorFn)return c.columnDef.getUniqueValues?(s._uniqueValuesCache[l]=c.columnDef.getUniqueValues(s.original,r),s._uniqueValuesCache[l]):(s._uniqueValuesCache[l]=[s.getValue(l)],s._uniqueValuesCache[l])},renderValue:l=>{var c;return(c=s.getValue(l))!=null?c:e.options.renderFallbackValue},subRows:o??[],getLeafRows:()=>_X(s.subRows,l=>l.subRows),getParentRow:()=>s.parentId?e.getRow(s.parentId,!0):void 0,getParentRows:()=>{let l=[],c=s;for(;;){const u=c.getParentRow();if(!u)break;l.push(u),c=u}return l.reverse()},getAllCells:$e(()=>[e.getAllLeafColumns()],l=>l.map(c=>rQ(e,s,c,c.id)),Fe(e.options,"debugRows")),_getAllCellsByColumnId:$e(()=>[s.getAllCells()],l=>l.reduce((c,u)=>(c[u.column.id]=u,c),{}),Fe(e.options,"debugRows"))};for(let l=0;l$e(()=>[e.options.data],t=>{const n={rows:[],flatRows:[],rowsById:{}},r=function(a,o,i){o===void 0&&(o=0);const s=[];for(let c=0;ce._autoResetPageIndex()))}function iQ(e){const t=[],n=r=>{var a;t.push(r),(a=r.subRows)!=null&&a.length&&r.getIsExpanded()&&r.subRows.forEach(n)};return e.rows.forEach(n),{rows:t,flatRows:e.flatRows,rowsById:e.rowsById}}function sQ(e){return t=>$e(()=>[t.getState().pagination,t.getPrePaginationRowModel(),t.options.paginateExpandedRows?void 0:t.getState().expanded],(n,r)=>{if(!r.rows.length)return r;const{pageSize:a,pageIndex:o}=n;let{rows:i,flatRows:s,rowsById:l}=r;const c=a*o,u=c+a;i=i.slice(c,u);let d;t.options.paginateExpandedRows?d={rows:i,flatRows:s,rowsById:l}:d=iQ({rows:i,flatRows:s,rowsById:l}),d.flatRows=[];const g=m=>{d.flatRows.push(m),m.subRows.length&&m.subRows.forEach(g)};return d.rows.forEach(g),d},Fe(t.options,"debugTable"))}/** * react-table * * Copyright (c) TanStack @@ -107,7 +107,7 @@ Error generating stack: `+o.message+` * LICENSE.md file in the root directory of this source tree. * * @license MIT - */function M6(e,t){return e?lQ(e)?p.createElement(e,t):e:null}function lQ(e){return cQ(e)||typeof e=="function"||uQ(e)}function cQ(e){return typeof e=="function"&&(()=>{const t=Object.getPrototypeOf(e);return t.prototype&&t.prototype.isReactComponent})()}function uQ(e){return typeof e=="object"&&typeof e.$$typeof=="symbol"&&["react.memo","react.forward_ref"].includes(e.$$typeof.description)}function dQ(e){const t={state:{},onStateChange:()=>{},renderFallbackValue:null,...e},[n]=p.useState(()=>({current:nQ(t)})),[r,a]=p.useState(()=>n.current.initialState);return n.current.setOptions(o=>({...o,...e,state:{...r,...e.state},onStateChange:i=>{a(i),e.onStateChange==null||e.onStateChange(i)}})),n.current}const P6=p.forwardRef(({className:e,...t},n)=>f.jsx("div",{className:"relative w-full overflow-auto",children:f.jsx("table",{ref:n,className:ee("caption-bottom w-full text-sm",e),...t})}));P6.displayName="Table";const $6=p.forwardRef(({className:e,...t},n)=>f.jsx("thead",{ref:n,className:ee("[&_tr]:border-b",e),...t}));$6.displayName="TableHeader";const _u=p.forwardRef(({className:e,...t},n)=>f.jsx("tbody",{ref:n,className:ee("[&_tr:last-child]:border-0",e),...t}));_u.displayName="TableBody";const fQ=p.forwardRef(({className:e,...t},n)=>f.jsx("tfoot",{ref:n,className:ee("bg-primary font-medium text-primary-foreground",e),...t}));fQ.displayName="TableFooter";const Zi=p.forwardRef(({className:e,...t},n)=>f.jsx("tr",{ref:n,className:ee("border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted",e),...t}));Zi.displayName="TableRow";const F6=p.forwardRef(({className:e,...t},n)=>f.jsx("th",{ref:n,className:ee("h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0",e),...t}));F6.displayName="TableHead";const ul=p.forwardRef(({className:e,...t},n)=>f.jsx("td",{ref:n,className:ee("p-4 align-middle [&:has([role=checkbox])]:pr-0",e),...t}));ul.displayName="TableCell";const pQ=p.forwardRef(({className:e,...t},n)=>f.jsx("caption",{ref:n,className:ee("mt-4 text-sm text-muted-foreground",e),...t}));pQ.displayName="TableCaption";function Pi({className:e,...t}){return f.jsx("div",{className:ee("animate-pulse rounded-md bg-muted",e),...t})}const gQ=ef("relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground",{variants:{variant:{default:"bg-background text-foreground",destructive:"border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive"}},defaultVariants:{variant:"default"}}),E_=p.forwardRef(({className:e,variant:t,...n},r)=>f.jsx("div",{ref:r,role:"alert",className:ee(gQ({variant:t}),e),...n}));E_.displayName="Alert";const j6=p.forwardRef(({className:e,...t},n)=>f.jsx("h5",{ref:n,className:ee("mb-1 font-medium leading-none tracking-tight",e),...t}));j6.displayName="AlertTitle";const z6=p.forwardRef(({className:e,...t},n)=>f.jsx("div",{ref:n,className:ee("text-sm [&_p]:leading-relaxed",e),...t}));z6.displayName="AlertDescription";function mQ(e){var i;const{table:t,isLoading:n,expandedRowsContent:r,error:a}=e,o=p.useMemo(()=>t.getAllColumns().length,[t]);return n?f.jsx(_u,{children:Array.from({length:15}).map((s,l)=>f.jsx(Zi,{children:t.getVisibleFlatColumns().map(c=>f.jsx(ul,{width:c.getSize(),className:"text-center",children:f.jsx(Pi,{className:"w-[95%] h-2"})},c.id))},l))}):a?f.jsx(_u,{children:f.jsx(Zi,{children:f.jsx(ul,{colSpan:o,className:"text-center",children:f.jsx(E_,{variant:"destructive",children:a})})})}):((i=t.getRowModel().rows)==null?void 0:i.length)===0?f.jsx(_u,{children:f.jsx(Zi,{children:f.jsx(ul,{colSpan:o,className:"h-24 text-center",children:"No results."})})}):f.jsx(_u,{children:t.getRowModel().rows.map((s,l)=>f.jsxs(f.Fragment,{children:[f.jsx(Zi,{"data-state":s.getIsSelected()&&"selected",className:ee(s.getIsExpanded()&&"border-b-0"),children:s.getVisibleCells().map(c=>f.jsx(ul,{style:{width:`${c.column.getSize()}px`},children:M6(c.column.columnDef.cell,c.getContext())},c.id))},s.id),s.getIsExpanded()?f.jsx(Zi,{children:f.jsx(ul,{colSpan:o,className:"text-center pt-0",children:r?r(l):null})},s.id):null]}))})}function uf({columns:e,data:t,renderPagination:n,className:r,isLoading:a,error:o,expandedRowsContent:i}){const s=dQ({data:t,columns:e,getCoreRowModel:oQ(),getPaginationRowModel:sQ()});return f.jsxs(f.Fragment,{children:[f.jsx("div",{className:ee("rounded-md border",r),children:f.jsxs(P6,{children:[f.jsx($6,{children:s.getHeaderGroups().map(l=>f.jsx(Zi,{children:l.headers.map(c=>f.jsx(F6,{children:c.isPlaceholder?null:M6(c.column.columnDef.header,c.getContext())},c.id))},l.id))}),f.jsx(mQ,{table:s,isLoading:!!a,error:o,expandedRowsContent:i})]})}),n&&n(s)]})}function df({table:e,className:t,renderAdditionalInfo:n}){return f.jsxs("div",{className:ee("flex items-center justify-end space-x-2",t),children:[n&&n(e),f.jsxs("div",{className:"space-x-2",children:[f.jsx(ue,{variant:"outline",size:"sm",onClick:()=>e.previousPage(),disabled:!e.getCanPreviousPage(),children:"Previous"}),f.jsx(ue,{variant:"outline",size:"sm",onClick:()=>e.nextPage(),disabled:!e.getCanNextPage(),children:"Next"})]})]})}const hQ=p.createContext(void 0);function x_(e){const t=p.useContext(hQ);return e||t||"ltr"}let $b=0;function Jm(){p.useEffect(()=>{var e,t;const n=document.querySelectorAll("[data-radix-focus-guard]");return document.body.insertAdjacentElement("afterbegin",(e=n[0])!==null&&e!==void 0?e:b2()),document.body.insertAdjacentElement("beforeend",(t=n[1])!==null&&t!==void 0?t:b2()),$b++,()=>{$b===1&&document.querySelectorAll("[data-radix-focus-guard]").forEach(r=>r.remove()),$b--}},[])}function b2(){const e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.cssText="outline: none; opacity: 0; position: fixed; pointer-events: none",e}const Fb="focusScope.autoFocusOnMount",jb="focusScope.autoFocusOnUnmount",y2={bubbles:!1,cancelable:!0},eh=p.forwardRef((e,t)=>{const{loop:n=!1,trapped:r=!1,onMountAutoFocus:a,onUnmountAutoFocus:o,...i}=e,[s,l]=p.useState(null),c=ur(a),u=ur(o),d=p.useRef(null),g=nt(t,y=>l(y)),m=p.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;p.useEffect(()=>{if(r){let h=function(x){if(m.paused||!s)return;const C=x.target;s.contains(C)?d.current=C:Ho(d.current,{select:!0})},S=function(x){if(m.paused||!s)return;const C=x.relatedTarget;C!==null&&(s.contains(C)||Ho(d.current,{select:!0}))},E=function(x){if(document.activeElement===document.body)for(const _ of x)_.removedNodes.length>0&&Ho(s)};var y=h,w=S,v=E;document.addEventListener("focusin",h),document.addEventListener("focusout",S);const k=new MutationObserver(E);return s&&k.observe(s,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",h),document.removeEventListener("focusout",S),k.disconnect()}}},[r,s,m.paused]),p.useEffect(()=>{if(s){S2.add(m);const y=document.activeElement;if(!s.contains(y)){const v=new CustomEvent(Fb,y2);s.addEventListener(Fb,c),s.dispatchEvent(v),v.defaultPrevented||(bQ(EQ(U6(s)),{select:!0}),document.activeElement===y&&Ho(s))}return()=>{s.removeEventListener(Fb,c),setTimeout(()=>{const v=new CustomEvent(jb,y2);s.addEventListener(jb,u),s.dispatchEvent(v),v.defaultPrevented||Ho(y??document.body,{select:!0}),s.removeEventListener(jb,u),S2.remove(m)},0)}}},[s,c,u,m]);const b=p.useCallback(y=>{if(!n&&!r||m.paused)return;const w=y.key==="Tab"&&!y.altKey&&!y.ctrlKey&&!y.metaKey,v=document.activeElement;if(w&&v){const h=y.currentTarget,[S,E]=yQ(h);S&&E?!y.shiftKey&&v===E?(y.preventDefault(),n&&Ho(S,{select:!0})):y.shiftKey&&v===S&&(y.preventDefault(),n&&Ho(E,{select:!0})):v===h&&y.preventDefault()}},[n,r,m.paused]);return p.createElement(ze.div,W({tabIndex:-1},i,{ref:g,onKeyDown:b}))});function bQ(e,{select:t=!1}={}){const n=document.activeElement;for(const r of e)if(Ho(r,{select:t}),document.activeElement!==n)return}function yQ(e){const t=U6(e),n=v2(t,e),r=v2(t.reverse(),e);return[n,r]}function U6(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>{const a=r.tagName==="INPUT"&&r.type==="hidden";return r.disabled||r.hidden||a?NodeFilter.FILTER_SKIP:r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function v2(e,t){for(const n of e)if(!vQ(n,{upTo:t}))return n}function vQ(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function SQ(e){return e instanceof HTMLInputElement&&"select"in e}function Ho(e,{select:t=!1}={}){if(e&&e.focus){const n=document.activeElement;e.focus({preventScroll:!0}),e!==n&&SQ(e)&&t&&e.select()}}const S2=wQ();function wQ(){let e=[];return{add(t){const n=e[0];t!==n&&(n==null||n.pause()),e=w2(e,t),e.unshift(t)},remove(t){var n;e=w2(e,t),(n=e[0])===null||n===void 0||n.resume()}}}function w2(e,t){const n=[...e],r=n.indexOf(t);return r!==-1&&n.splice(r,1),n}function EQ(e){return e.filter(t=>t.tagName!=="A")}const xQ=Kd["useId".toString()]||(()=>{});let kQ=0;function bi(e){const[t,n]=p.useState(xQ());return Zr(()=>{e||n(r=>r??String(kQ++))},[e]),e||(t?`radix-${t}`:"")}const CQ=["top","right","bottom","left"],xi=Math.min,Er=Math.max,Og=Math.round,ep=Math.floor,ki=e=>({x:e,y:e}),_Q={left:"right",right:"left",bottom:"top",top:"bottom"},AQ={start:"end",end:"start"};function J1(e,t,n){return Er(e,xi(t,n))}function bo(e,t){return typeof e=="function"?e(t):e}function yo(e){return e.split("-")[0]}function $c(e){return e.split("-")[1]}function k_(e){return e==="x"?"y":"x"}function C_(e){return e==="y"?"height":"width"}function Fc(e){return["top","bottom"].includes(yo(e))?"y":"x"}function __(e){return k_(Fc(e))}function TQ(e,t,n){n===void 0&&(n=!1);const r=$c(e),a=__(e),o=C_(a);let i=a==="x"?r===(n?"end":"start")?"right":"left":r==="start"?"bottom":"top";return t.reference[o]>t.floating[o]&&(i=Dg(i)),[i,Dg(i)]}function RQ(e){const t=Dg(e);return[ek(e),t,ek(t)]}function ek(e){return e.replace(/start|end/g,t=>AQ[t])}function NQ(e,t,n){const r=["left","right"],a=["right","left"],o=["top","bottom"],i=["bottom","top"];switch(e){case"top":case"bottom":return n?t?a:r:t?r:a;case"left":case"right":return t?o:i;default:return[]}}function IQ(e,t,n,r){const a=$c(e);let o=NQ(yo(e),n==="start",r);return a&&(o=o.map(i=>i+"-"+a),t&&(o=o.concat(o.map(ek)))),o}function Dg(e){return e.replace(/left|right|bottom|top/g,t=>_Q[t])}function OQ(e){return{top:0,right:0,bottom:0,left:0,...e}}function B6(e){return typeof e!="number"?OQ(e):{top:e,right:e,bottom:e,left:e}}function Lg(e){return{...e,top:e.y,left:e.x,right:e.x+e.width,bottom:e.y+e.height}}function E2(e,t,n){let{reference:r,floating:a}=e;const o=Fc(t),i=__(t),s=C_(i),l=yo(t),c=o==="y",u=r.x+r.width/2-a.width/2,d=r.y+r.height/2-a.height/2,g=r[s]/2-a[s]/2;let m;switch(l){case"top":m={x:u,y:r.y-a.height};break;case"bottom":m={x:u,y:r.y+r.height};break;case"right":m={x:r.x+r.width,y:d};break;case"left":m={x:r.x-a.width,y:d};break;default:m={x:r.x,y:r.y}}switch($c(t)){case"start":m[i]-=g*(n&&c?-1:1);break;case"end":m[i]+=g*(n&&c?-1:1);break}return m}const DQ=async(e,t,n)=>{const{placement:r="bottom",strategy:a="absolute",middleware:o=[],platform:i}=n,s=o.filter(Boolean),l=await(i.isRTL==null?void 0:i.isRTL(t));let c=await i.getElementRects({reference:e,floating:t,strategy:a}),{x:u,y:d}=E2(c,r,l),g=r,m={},b=0;for(let y=0;y({name:"arrow",options:e,async fn(t){const{x:n,y:r,placement:a,rects:o,platform:i,elements:s,middlewareData:l}=t,{element:c,padding:u=0}=bo(e,t)||{};if(c==null)return{};const d=B6(u),g={x:n,y:r},m=__(a),b=C_(m),y=await i.getDimensions(c),w=m==="y",v=w?"top":"left",h=w?"bottom":"right",S=w?"clientHeight":"clientWidth",E=o.reference[b]+o.reference[m]-g[m]-o.floating[b],k=g[m]-o.reference[m],x=await(i.getOffsetParent==null?void 0:i.getOffsetParent(c));let C=x?x[S]:0;(!C||!await(i.isElement==null?void 0:i.isElement(x)))&&(C=s.floating[S]||o.floating[b]);const _=E/2-k/2,R=C/2-y[b]/2-1,T=xi(d[v],R),L=xi(d[h],R),D=T,H=C-y[b]-L,z=C/2-y[b]/2+_,M=J1(D,z,H),U=!l.arrow&&$c(a)!=null&&z!=M&&o.reference[b]/2-(zD<=0)){var R,T;const D=(((R=o.flip)==null?void 0:R.index)||0)+1,H=k[D];if(H)return{data:{index:D,overflows:_},reset:{placement:H}};let z=(T=_.filter(M=>M.overflows[0]<=0).sort((M,U)=>M.overflows[1]-U.overflows[1])[0])==null?void 0:T.placement;if(!z)switch(m){case"bestFit":{var L;const M=(L=_.map(U=>[U.placement,U.overflows.filter(X=>X>0).reduce((X,j)=>X+j,0)]).sort((U,X)=>U[1]-X[1])[0])==null?void 0:L[0];M&&(z=M);break}case"initialPlacement":z=s;break}if(a!==z)return{reset:{placement:z}}}return{}}}};function k2(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function C2(e){return CQ.some(t=>e[t]>=0)}const MQ=function(e){return e===void 0&&(e={}),{name:"hide",options:e,async fn(t){const{rects:n}=t,{strategy:r="referenceHidden",...a}=bo(e,t);switch(r){case"referenceHidden":{const o=await Sd(t,{...a,elementContext:"reference"}),i=k2(o,n.reference);return{data:{referenceHiddenOffsets:i,referenceHidden:C2(i)}}}case"escaped":{const o=await Sd(t,{...a,altBoundary:!0}),i=k2(o,n.floating);return{data:{escapedOffsets:i,escaped:C2(i)}}}default:return{}}}}};async function PQ(e,t){const{placement:n,platform:r,elements:a}=e,o=await(r.isRTL==null?void 0:r.isRTL(a.floating)),i=yo(n),s=$c(n),l=Fc(n)==="y",c=["left","top"].includes(i)?-1:1,u=o&&l?-1:1,d=bo(t,e);let{mainAxis:g,crossAxis:m,alignmentAxis:b}=typeof d=="number"?{mainAxis:d,crossAxis:0,alignmentAxis:null}:{mainAxis:0,crossAxis:0,alignmentAxis:null,...d};return s&&typeof b=="number"&&(m=s==="end"?b*-1:b),l?{x:m*u,y:g*c}:{x:g*c,y:m*u}}const $Q=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(t){const{x:n,y:r}=t,a=await PQ(t,e);return{x:n+a.x,y:r+a.y,data:a}}}},FQ=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(t){const{x:n,y:r,placement:a}=t,{mainAxis:o=!0,crossAxis:i=!1,limiter:s={fn:w=>{let{x:v,y:h}=w;return{x:v,y:h}}},...l}=bo(e,t),c={x:n,y:r},u=await Sd(t,l),d=Fc(yo(a)),g=k_(d);let m=c[g],b=c[d];if(o){const w=g==="y"?"top":"left",v=g==="y"?"bottom":"right",h=m+u[w],S=m-u[v];m=J1(h,m,S)}if(i){const w=d==="y"?"top":"left",v=d==="y"?"bottom":"right",h=b+u[w],S=b-u[v];b=J1(h,b,S)}const y=s.fn({...t,[g]:m,[d]:b});return{...y,data:{x:y.x-n,y:y.y-r}}}}},jQ=function(e){return e===void 0&&(e={}),{options:e,fn(t){const{x:n,y:r,placement:a,rects:o,middlewareData:i}=t,{offset:s=0,mainAxis:l=!0,crossAxis:c=!0}=bo(e,t),u={x:n,y:r},d=Fc(a),g=k_(d);let m=u[g],b=u[d];const y=bo(s,t),w=typeof y=="number"?{mainAxis:y,crossAxis:0}:{mainAxis:0,crossAxis:0,...y};if(l){const S=g==="y"?"height":"width",E=o.reference[g]-o.floating[S]+w.mainAxis,k=o.reference[g]+o.reference[S]-w.mainAxis;mk&&(m=k)}if(c){var v,h;const S=g==="y"?"width":"height",E=["top","left"].includes(yo(a)),k=o.reference[d]-o.floating[S]+(E&&((v=i.offset)==null?void 0:v[d])||0)+(E?0:w.crossAxis),x=o.reference[d]+o.reference[S]+(E?0:((h=i.offset)==null?void 0:h[d])||0)-(E?w.crossAxis:0);bx&&(b=x)}return{[g]:m,[d]:b}}}},zQ=function(e){return e===void 0&&(e={}),{name:"size",options:e,async fn(t){const{placement:n,rects:r,platform:a,elements:o}=t,{apply:i=()=>{},...s}=bo(e,t),l=await Sd(t,s),c=yo(n),u=$c(n),d=Fc(n)==="y",{width:g,height:m}=r.floating;let b,y;c==="top"||c==="bottom"?(b=c,y=u===(await(a.isRTL==null?void 0:a.isRTL(o.floating))?"start":"end")?"left":"right"):(y=c,b=u==="end"?"top":"bottom");const w=m-l[b],v=g-l[y],h=!t.middlewareData.shift;let S=w,E=v;if(d){const x=g-l.left-l.right;E=u||h?xi(v,x):x}else{const x=m-l.top-l.bottom;S=u||h?xi(w,x):x}if(h&&!u){const x=Er(l.left,0),C=Er(l.right,0),_=Er(l.top,0),R=Er(l.bottom,0);d?E=g-2*(x!==0||C!==0?x+C:Er(l.left,l.right)):S=m-2*(_!==0||R!==0?_+R:Er(l.top,l.bottom))}await i({...t,availableWidth:E,availableHeight:S});const k=await a.getDimensions(o.floating);return g!==k.width||m!==k.height?{reset:{rects:!0}}:{}}}};function Ci(e){return H6(e)?(e.nodeName||"").toLowerCase():"#document"}function _r(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function Ao(e){var t;return(t=(H6(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function H6(e){return e instanceof Node||e instanceof _r(e).Node}function vo(e){return e instanceof Element||e instanceof _r(e).Element}function ja(e){return e instanceof HTMLElement||e instanceof _r(e).HTMLElement}function _2(e){return typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof _r(e).ShadowRoot}function ff(e){const{overflow:t,overflowX:n,overflowY:r,display:a}=Xr(e);return/auto|scroll|overlay|hidden|clip/.test(t+r+n)&&!["inline","contents"].includes(a)}function UQ(e){return["table","td","th"].includes(Ci(e))}function A_(e){const t=T_(),n=Xr(e);return n.transform!=="none"||n.perspective!=="none"||(n.containerType?n.containerType!=="normal":!1)||!t&&(n.backdropFilter?n.backdropFilter!=="none":!1)||!t&&(n.filter?n.filter!=="none":!1)||["transform","perspective","filter"].some(r=>(n.willChange||"").includes(r))||["paint","layout","strict","content"].some(r=>(n.contain||"").includes(r))}function BQ(e){let t=vc(e);for(;ja(t)&&!th(t);){if(A_(t))return t;t=vc(t)}return null}function T_(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}function th(e){return["html","body","#document"].includes(Ci(e))}function Xr(e){return _r(e).getComputedStyle(e)}function nh(e){return vo(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function vc(e){if(Ci(e)==="html")return e;const t=e.assignedSlot||e.parentNode||_2(e)&&e.host||Ao(e);return _2(t)?t.host:t}function V6(e){const t=vc(e);return th(t)?e.ownerDocument?e.ownerDocument.body:e.body:ja(t)&&ff(t)?t:V6(t)}function wd(e,t,n){var r;t===void 0&&(t=[]),n===void 0&&(n=!0);const a=V6(e),o=a===((r=e.ownerDocument)==null?void 0:r.body),i=_r(a);return o?t.concat(i,i.visualViewport||[],ff(a)?a:[],i.frameElement&&n?wd(i.frameElement):[]):t.concat(a,wd(a,[],n))}function q6(e){const t=Xr(e);let n=parseFloat(t.width)||0,r=parseFloat(t.height)||0;const a=ja(e),o=a?e.offsetWidth:n,i=a?e.offsetHeight:r,s=Og(n)!==o||Og(r)!==i;return s&&(n=o,r=i),{width:n,height:r,$:s}}function R_(e){return vo(e)?e:e.contextElement}function Ul(e){const t=R_(e);if(!ja(t))return ki(1);const n=t.getBoundingClientRect(),{width:r,height:a,$:o}=q6(t);let i=(o?Og(n.width):n.width)/r,s=(o?Og(n.height):n.height)/a;return(!i||!Number.isFinite(i))&&(i=1),(!s||!Number.isFinite(s))&&(s=1),{x:i,y:s}}const HQ=ki(0);function G6(e){const t=_r(e);return!T_()||!t.visualViewport?HQ:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function VQ(e,t,n){return t===void 0&&(t=!1),!n||t&&n!==_r(e)?!1:t}function As(e,t,n,r){t===void 0&&(t=!1),n===void 0&&(n=!1);const a=e.getBoundingClientRect(),o=R_(e);let i=ki(1);t&&(r?vo(r)&&(i=Ul(r)):i=Ul(e));const s=VQ(o,n,r)?G6(o):ki(0);let l=(a.left+s.x)/i.x,c=(a.top+s.y)/i.y,u=a.width/i.x,d=a.height/i.y;if(o){const g=_r(o),m=r&&vo(r)?_r(r):r;let b=g.frameElement;for(;b&&r&&m!==g;){const y=Ul(b),w=b.getBoundingClientRect(),v=Xr(b),h=w.left+(b.clientLeft+parseFloat(v.paddingLeft))*y.x,S=w.top+(b.clientTop+parseFloat(v.paddingTop))*y.y;l*=y.x,c*=y.y,u*=y.x,d*=y.y,l+=h,c+=S,b=_r(b).frameElement}}return Lg({width:u,height:d,x:l,y:c})}function qQ(e){let{rect:t,offsetParent:n,strategy:r}=e;const a=ja(n),o=Ao(n);if(n===o)return t;let i={scrollLeft:0,scrollTop:0},s=ki(1);const l=ki(0);if((a||!a&&r!=="fixed")&&((Ci(n)!=="body"||ff(o))&&(i=nh(n)),ja(n))){const c=As(n);s=Ul(n),l.x=c.x+n.clientLeft,l.y=c.y+n.clientTop}return{width:t.width*s.x,height:t.height*s.y,x:t.x*s.x-i.scrollLeft*s.x+l.x,y:t.y*s.y-i.scrollTop*s.y+l.y}}function GQ(e){return Array.from(e.getClientRects())}function W6(e){return As(Ao(e)).left+nh(e).scrollLeft}function WQ(e){const t=Ao(e),n=nh(e),r=e.ownerDocument.body,a=Er(t.scrollWidth,t.clientWidth,r.scrollWidth,r.clientWidth),o=Er(t.scrollHeight,t.clientHeight,r.scrollHeight,r.clientHeight);let i=-n.scrollLeft+W6(e);const s=-n.scrollTop;return Xr(r).direction==="rtl"&&(i+=Er(t.clientWidth,r.clientWidth)-a),{width:a,height:o,x:i,y:s}}function KQ(e,t){const n=_r(e),r=Ao(e),a=n.visualViewport;let o=r.clientWidth,i=r.clientHeight,s=0,l=0;if(a){o=a.width,i=a.height;const c=T_();(!c||c&&t==="fixed")&&(s=a.offsetLeft,l=a.offsetTop)}return{width:o,height:i,x:s,y:l}}function YQ(e,t){const n=As(e,!0,t==="fixed"),r=n.top+e.clientTop,a=n.left+e.clientLeft,o=ja(e)?Ul(e):ki(1),i=e.clientWidth*o.x,s=e.clientHeight*o.y,l=a*o.x,c=r*o.y;return{width:i,height:s,x:l,y:c}}function A2(e,t,n){let r;if(t==="viewport")r=KQ(e,n);else if(t==="document")r=WQ(Ao(e));else if(vo(t))r=YQ(t,n);else{const a=G6(e);r={...t,x:t.x-a.x,y:t.y-a.y}}return Lg(r)}function K6(e,t){const n=vc(e);return n===t||!vo(n)||th(n)?!1:Xr(n).position==="fixed"||K6(n,t)}function ZQ(e,t){const n=t.get(e);if(n)return n;let r=wd(e,[],!1).filter(s=>vo(s)&&Ci(s)!=="body"),a=null;const o=Xr(e).position==="fixed";let i=o?vc(e):e;for(;vo(i)&&!th(i);){const s=Xr(i),l=A_(i);!l&&s.position==="fixed"&&(a=null),(o?!l&&!a:!l&&s.position==="static"&&!!a&&["absolute","fixed"].includes(a.position)||ff(i)&&!l&&K6(e,i))?r=r.filter(u=>u!==i):a=s,i=vc(i)}return t.set(e,r),r}function XQ(e){let{element:t,boundary:n,rootBoundary:r,strategy:a}=e;const i=[...n==="clippingAncestors"?ZQ(t,this._c):[].concat(n),r],s=i[0],l=i.reduce((c,u)=>{const d=A2(t,u,a);return c.top=Er(d.top,c.top),c.right=xi(d.right,c.right),c.bottom=xi(d.bottom,c.bottom),c.left=Er(d.left,c.left),c},A2(t,s,a));return{width:l.right-l.left,height:l.bottom-l.top,x:l.left,y:l.top}}function QQ(e){return q6(e)}function JQ(e,t,n){const r=ja(t),a=Ao(t),o=n==="fixed",i=As(e,!0,o,t);let s={scrollLeft:0,scrollTop:0};const l=ki(0);if(r||!r&&!o)if((Ci(t)!=="body"||ff(a))&&(s=nh(t)),r){const c=As(t,!0,o,t);l.x=c.x+t.clientLeft,l.y=c.y+t.clientTop}else a&&(l.x=W6(a));return{x:i.left+s.scrollLeft-l.x,y:i.top+s.scrollTop-l.y,width:i.width,height:i.height}}function T2(e,t){return!ja(e)||Xr(e).position==="fixed"?null:t?t(e):e.offsetParent}function Y6(e,t){const n=_r(e);if(!ja(e))return n;let r=T2(e,t);for(;r&&UQ(r)&&Xr(r).position==="static";)r=T2(r,t);return r&&(Ci(r)==="html"||Ci(r)==="body"&&Xr(r).position==="static"&&!A_(r))?n:r||BQ(e)||n}const eJ=async function(e){let{reference:t,floating:n,strategy:r}=e;const a=this.getOffsetParent||Y6,o=this.getDimensions;return{reference:JQ(t,await a(n),r),floating:{x:0,y:0,...await o(n)}}};function tJ(e){return Xr(e).direction==="rtl"}const nJ={convertOffsetParentRelativeRectToViewportRelativeRect:qQ,getDocumentElement:Ao,getClippingRect:XQ,getOffsetParent:Y6,getElementRects:eJ,getClientRects:GQ,getDimensions:QQ,getScale:Ul,isElement:vo,isRTL:tJ};function rJ(e,t){let n=null,r;const a=Ao(e);function o(){clearTimeout(r),n&&n.disconnect(),n=null}function i(s,l){s===void 0&&(s=!1),l===void 0&&(l=1),o();const{left:c,top:u,width:d,height:g}=e.getBoundingClientRect();if(s||t(),!d||!g)return;const m=ep(u),b=ep(a.clientWidth-(c+d)),y=ep(a.clientHeight-(u+g)),w=ep(c),h={rootMargin:-m+"px "+-b+"px "+-y+"px "+-w+"px",threshold:Er(0,xi(1,l))||1};let S=!0;function E(k){const x=k[0].intersectionRatio;if(x!==l){if(!S)return i();x?i(!1,x):r=setTimeout(()=>{i(!1,1e-7)},100)}S=!1}try{n=new IntersectionObserver(E,{...h,root:a.ownerDocument})}catch{n=new IntersectionObserver(E,h)}n.observe(e)}return i(!0),o}function aJ(e,t,n,r){r===void 0&&(r={});const{ancestorScroll:a=!0,ancestorResize:o=!0,elementResize:i=typeof ResizeObserver=="function",layoutShift:s=typeof IntersectionObserver=="function",animationFrame:l=!1}=r,c=R_(e),u=a||o?[...c?wd(c):[],...wd(t)]:[];u.forEach(v=>{a&&v.addEventListener("scroll",n,{passive:!0}),o&&v.addEventListener("resize",n)});const d=c&&s?rJ(c,n):null;let g=-1,m=null;i&&(m=new ResizeObserver(v=>{let[h]=v;h&&h.target===c&&m&&(m.unobserve(t),cancelAnimationFrame(g),g=requestAnimationFrame(()=>{m&&m.observe(t)})),n()}),c&&!l&&m.observe(c),m.observe(t));let b,y=l?As(e):null;l&&w();function w(){const v=As(e);y&&(v.x!==y.x||v.y!==y.y||v.width!==y.width||v.height!==y.height)&&n(),y=v,b=requestAnimationFrame(w)}return n(),()=>{u.forEach(v=>{a&&v.removeEventListener("scroll",n),o&&v.removeEventListener("resize",n)}),d&&d(),m&&m.disconnect(),m=null,l&&cancelAnimationFrame(b)}}const oJ=(e,t,n)=>{const r=new Map,a={platform:nJ,...n},o={...a.platform,_c:r};return DQ(e,t,{...a,platform:o})},iJ=e=>{function t(n){return{}.hasOwnProperty.call(n,"current")}return{name:"arrow",options:e,fn(n){const{element:r,padding:a}=typeof e=="function"?e(n):e;return r&&t(r)?r.current!=null?x2({element:r.current,padding:a}).fn(n):{}:r?x2({element:r,padding:a}).fn(n):{}}}};var qp=typeof document<"u"?p.useLayoutEffect:p.useEffect;function Mg(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(typeof e=="function"&&e.toString()===t.toString())return!0;let n,r,a;if(e&&t&&typeof e=="object"){if(Array.isArray(e)){if(n=e.length,n!=t.length)return!1;for(r=n;r--!==0;)if(!Mg(e[r],t[r]))return!1;return!0}if(a=Object.keys(e),n=a.length,n!==Object.keys(t).length)return!1;for(r=n;r--!==0;)if(!{}.hasOwnProperty.call(t,a[r]))return!1;for(r=n;r--!==0;){const o=a[r];if(!(o==="_owner"&&e.$$typeof)&&!Mg(e[o],t[o]))return!1}return!0}return e!==e&&t!==t}function Z6(e){return typeof window>"u"?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function R2(e,t){const n=Z6(e);return Math.round(t*n)/n}function N2(e){const t=p.useRef(e);return qp(()=>{t.current=e}),t}function sJ(e){e===void 0&&(e={});const{placement:t="bottom",strategy:n="absolute",middleware:r=[],platform:a,elements:{reference:o,floating:i}={},transform:s=!0,whileElementsMounted:l,open:c}=e,[u,d]=p.useState({x:0,y:0,strategy:n,placement:t,middlewareData:{},isPositioned:!1}),[g,m]=p.useState(r);Mg(g,r)||m(r);const[b,y]=p.useState(null),[w,v]=p.useState(null),h=p.useCallback(U=>{U!=x.current&&(x.current=U,y(U))},[y]),S=p.useCallback(U=>{U!==C.current&&(C.current=U,v(U))},[v]),E=o||b,k=i||w,x=p.useRef(null),C=p.useRef(null),_=p.useRef(u),R=N2(l),T=N2(a),L=p.useCallback(()=>{if(!x.current||!C.current)return;const U={placement:t,strategy:n,middleware:g};T.current&&(U.platform=T.current),oJ(x.current,C.current,U).then(X=>{const j={...X,isPositioned:!0};D.current&&!Mg(_.current,j)&&(_.current=j,ba.flushSync(()=>{d(j)}))})},[g,t,n,T]);qp(()=>{c===!1&&_.current.isPositioned&&(_.current.isPositioned=!1,d(U=>({...U,isPositioned:!1})))},[c]);const D=p.useRef(!1);qp(()=>(D.current=!0,()=>{D.current=!1}),[]),qp(()=>{if(E&&(x.current=E),k&&(C.current=k),E&&k){if(R.current)return R.current(E,k,L);L()}},[E,k,L,R]);const H=p.useMemo(()=>({reference:x,floating:C,setReference:h,setFloating:S}),[h,S]),z=p.useMemo(()=>({reference:E,floating:k}),[E,k]),M=p.useMemo(()=>{const U={position:n,left:0,top:0};if(!z.floating)return U;const X=R2(z.floating,u.x),j=R2(z.floating,u.y);return s?{...U,transform:"translate("+X+"px, "+j+"px)",...Z6(z.floating)>=1.5&&{willChange:"transform"}}:{position:n,left:X,top:j}},[n,s,z.floating,u.x,u.y]);return p.useMemo(()=>({...u,update:L,refs:H,elements:z,floatingStyles:M}),[u,L,H,z,M])}function N_(e){const[t,n]=p.useState(void 0);return Zr(()=>{if(e){n({width:e.offsetWidth,height:e.offsetHeight});const r=new ResizeObserver(a=>{if(!Array.isArray(a)||!a.length)return;const o=a[0];let i,s;if("borderBoxSize"in o){const l=o.borderBoxSize,c=Array.isArray(l)?l[0]:l;i=c.inlineSize,s=c.blockSize}else i=e.offsetWidth,s=e.offsetHeight;n({width:i,height:s})});return r.observe(e,{box:"border-box"}),()=>r.unobserve(e)}else n(void 0)},[e]),t}const X6="Popper",[Q6,qa]=zn(X6),[lJ,J6]=Q6(X6),cJ=e=>{const{__scopePopper:t,children:n}=e,[r,a]=p.useState(null);return p.createElement(lJ,{scope:t,anchor:r,onAnchorChange:a},n)},uJ="PopperAnchor",dJ=p.forwardRef((e,t)=>{const{__scopePopper:n,virtualRef:r,...a}=e,o=J6(uJ,n),i=p.useRef(null),s=nt(t,i);return p.useEffect(()=>{o.onAnchorChange((r==null?void 0:r.current)||i.current)}),r?null:p.createElement(ze.div,W({},a,{ref:s}))}),e7="PopperContent",[fJ,eTe]=Q6(e7),pJ=p.forwardRef((e,t)=>{var n,r,a,o,i,s,l,c;const{__scopePopper:u,side:d="bottom",sideOffset:g=0,align:m="center",alignOffset:b=0,arrowPadding:y=0,avoidCollisions:w=!0,collisionBoundary:v=[],collisionPadding:h=0,sticky:S="partial",hideWhenDetached:E=!1,updatePositionStrategy:k="optimized",onPlaced:x,...C}=e,_=J6(e7,u),[R,T]=p.useState(null),L=nt(t,mt=>T(mt)),[D,H]=p.useState(null),z=N_(D),M=(n=z==null?void 0:z.width)!==null&&n!==void 0?n:0,U=(r=z==null?void 0:z.height)!==null&&r!==void 0?r:0,X=d+(m!=="center"?"-"+m:""),j=typeof h=="number"?h:{top:0,right:0,bottom:0,left:0,...h},O=Array.isArray(v)?v:[v],A=O.length>0,V={padding:j,boundary:O.filter(gJ),altBoundary:A},{refs:P,floatingStyles:N,placement:K,isPositioned:ae,middlewareData:ne}=sJ({strategy:"fixed",placement:X,whileElementsMounted:(...mt)=>aJ(...mt,{animationFrame:k==="always"}),elements:{reference:_.anchor},middleware:[$Q({mainAxis:g+U,alignmentAxis:b}),w&&FQ({mainAxis:!0,crossAxis:!1,limiter:S==="partial"?jQ():void 0,...V}),w&&LQ({...V}),zQ({...V,apply:({elements:mt,rects:Hn,availableWidth:F,availableHeight:q})=>{const{width:Y,height:ye}=Hn.reference,de=mt.floating.style;de.setProperty("--radix-popper-available-width",`${F}px`),de.setProperty("--radix-popper-available-height",`${q}px`),de.setProperty("--radix-popper-anchor-width",`${Y}px`),de.setProperty("--radix-popper-anchor-height",`${ye}px`)}}),D&&iJ({element:D,padding:y}),mJ({arrowWidth:M,arrowHeight:U}),E&&MQ({strategy:"referenceHidden",...V})]}),[Q,pe]=t7(K),he=ur(x);Zr(()=>{ae&&(he==null||he())},[ae,he]);const re=(a=ne.arrow)===null||a===void 0?void 0:a.x,Ee=(o=ne.arrow)===null||o===void 0?void 0:o.y,ke=((i=ne.arrow)===null||i===void 0?void 0:i.centerOffset)!==0,[We,Vt]=p.useState();return Zr(()=>{R&&Vt(window.getComputedStyle(R).zIndex)},[R]),p.createElement("div",{ref:P.setFloating,"data-radix-popper-content-wrapper":"",style:{...N,transform:ae?N.transform:"translate(0, -200%)",minWidth:"max-content",zIndex:We,["--radix-popper-transform-origin"]:[(s=ne.transformOrigin)===null||s===void 0?void 0:s.x,(l=ne.transformOrigin)===null||l===void 0?void 0:l.y].join(" ")},dir:e.dir},p.createElement(fJ,{scope:u,placedSide:Q,onArrowChange:H,arrowX:re,arrowY:Ee,shouldHideArrow:ke},p.createElement(ze.div,W({"data-side":Q,"data-align":pe},C,{ref:L,style:{...C.style,animation:ae?void 0:"none",opacity:(c=ne.hide)!==null&&c!==void 0&&c.referenceHidden?0:void 0}}))))});function gJ(e){return e!==null}const mJ=e=>({name:"transformOrigin",options:e,fn(t){var n,r,a,o,i;const{placement:s,rects:l,middlewareData:c}=t,d=((n=c.arrow)===null||n===void 0?void 0:n.centerOffset)!==0,g=d?0:e.arrowWidth,m=d?0:e.arrowHeight,[b,y]=t7(s),w={start:"0%",center:"50%",end:"100%"}[y],v=((r=(a=c.arrow)===null||a===void 0?void 0:a.x)!==null&&r!==void 0?r:0)+g/2,h=((o=(i=c.arrow)===null||i===void 0?void 0:i.y)!==null&&o!==void 0?o:0)+m/2;let S="",E="";return b==="bottom"?(S=d?w:`${v}px`,E=`${-m}px`):b==="top"?(S=d?w:`${v}px`,E=`${l.floating.height+m}px`):b==="right"?(S=`${-m}px`,E=d?w:`${h}px`):b==="left"&&(S=`${l.floating.width+m}px`,E=d?w:`${h}px`),{data:{x:S,y:E}}}});function t7(e){const[t,n="center"]=e.split("-");return[t,n]}const rh=cJ,pf=dJ,gf=pJ,zb="rovingFocusGroup.onEntryFocus",hJ={bubbles:!1,cancelable:!0},I_="RovingFocusGroup",[tk,n7,bJ]=Nm(I_),[yJ,ah]=zn(I_,[bJ]),[vJ,SJ]=yJ(I_),wJ=p.forwardRef((e,t)=>p.createElement(tk.Provider,{scope:e.__scopeRovingFocusGroup},p.createElement(tk.Slot,{scope:e.__scopeRovingFocusGroup},p.createElement(EJ,W({},e,{ref:t}))))),EJ=p.forwardRef((e,t)=>{const{__scopeRovingFocusGroup:n,orientation:r,loop:a=!1,dir:o,currentTabStopId:i,defaultCurrentTabStopId:s,onCurrentTabStopIdChange:l,onEntryFocus:c,...u}=e,d=p.useRef(null),g=nt(t,d),m=x_(o),[b=null,y]=Fa({prop:i,defaultProp:s,onChange:l}),[w,v]=p.useState(!1),h=ur(c),S=n7(n),E=p.useRef(!1),[k,x]=p.useState(0);return p.useEffect(()=>{const C=d.current;if(C)return C.addEventListener(zb,h),()=>C.removeEventListener(zb,h)},[h]),p.createElement(vJ,{scope:n,orientation:r,dir:m,loop:a,currentTabStopId:b,onItemFocus:p.useCallback(C=>y(C),[y]),onItemShiftTab:p.useCallback(()=>v(!0),[]),onFocusableItemAdd:p.useCallback(()=>x(C=>C+1),[]),onFocusableItemRemove:p.useCallback(()=>x(C=>C-1),[])},p.createElement(ze.div,W({tabIndex:w||k===0?-1:0,"data-orientation":r},u,{ref:g,style:{outline:"none",...e.style},onMouseDown:fe(e.onMouseDown,()=>{E.current=!0}),onFocus:fe(e.onFocus,C=>{const _=!E.current;if(C.target===C.currentTarget&&_&&!w){const R=new CustomEvent(zb,hJ);if(C.currentTarget.dispatchEvent(R),!R.defaultPrevented){const T=S().filter(M=>M.focusable),L=T.find(M=>M.active),D=T.find(M=>M.id===b),z=[L,D,...T].filter(Boolean).map(M=>M.ref.current);r7(z)}}E.current=!1}),onBlur:fe(e.onBlur,()=>v(!1))})))}),xJ="RovingFocusGroupItem",kJ=p.forwardRef((e,t)=>{const{__scopeRovingFocusGroup:n,focusable:r=!0,active:a=!1,tabStopId:o,...i}=e,s=bi(),l=o||s,c=SJ(xJ,n),u=c.currentTabStopId===l,d=n7(n),{onFocusableItemAdd:g,onFocusableItemRemove:m}=c;return p.useEffect(()=>{if(r)return g(),()=>m()},[r,g,m]),p.createElement(tk.ItemSlot,{scope:n,id:l,focusable:r,active:a},p.createElement(ze.span,W({tabIndex:u?0:-1,"data-orientation":c.orientation},i,{ref:t,onMouseDown:fe(e.onMouseDown,b=>{r?c.onItemFocus(l):b.preventDefault()}),onFocus:fe(e.onFocus,()=>c.onItemFocus(l)),onKeyDown:fe(e.onKeyDown,b=>{if(b.key==="Tab"&&b.shiftKey){c.onItemShiftTab();return}if(b.target!==b.currentTarget)return;const y=AJ(b,c.orientation,c.dir);if(y!==void 0){b.preventDefault();let v=d().filter(h=>h.focusable).map(h=>h.ref.current);if(y==="last")v.reverse();else if(y==="prev"||y==="next"){y==="prev"&&v.reverse();const h=v.indexOf(b.currentTarget);v=c.loop?TJ(v,h+1):v.slice(h+1)}setTimeout(()=>r7(v))}})})))}),CJ={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function _J(e,t){return t!=="rtl"?e:e==="ArrowLeft"?"ArrowRight":e==="ArrowRight"?"ArrowLeft":e}function AJ(e,t,n){const r=_J(e.key,n);if(!(t==="vertical"&&["ArrowLeft","ArrowRight"].includes(r))&&!(t==="horizontal"&&["ArrowUp","ArrowDown"].includes(r)))return CJ[r]}function r7(e){const t=document.activeElement;for(const n of e)if(n===t||(n.focus(),document.activeElement!==t))return}function TJ(e,t){return e.map((n,r)=>e[(t+r)%e.length])}const a7=wJ,o7=kJ;var RJ=function(e){if(typeof document>"u")return null;var t=Array.isArray(e)?e[0]:e;return t.ownerDocument.body},Qs=new WeakMap,tp=new WeakMap,np={},Ub=0,i7=function(e){return e&&(e.host||i7(e.parentNode))},NJ=function(e,t){return t.map(function(n){if(e.contains(n))return n;var r=i7(n);return r&&e.contains(r)?r:(console.error("aria-hidden",n,"in not contained inside",e,". Doing nothing"),null)}).filter(function(n){return!!n})},IJ=function(e,t,n,r){var a=NJ(t,Array.isArray(e)?e:[e]);np[n]||(np[n]=new WeakMap);var o=np[n],i=[],s=new Set,l=new Set(a),c=function(d){!d||s.has(d)||(s.add(d),c(d.parentNode))};a.forEach(c);var u=function(d){!d||l.has(d)||Array.prototype.forEach.call(d.children,function(g){if(s.has(g))u(g);else{var m=g.getAttribute(r),b=m!==null&&m!=="false",y=(Qs.get(g)||0)+1,w=(o.get(g)||0)+1;Qs.set(g,y),o.set(g,w),i.push(g),y===1&&b&&tp.set(g,!0),w===1&&g.setAttribute(n,"true"),b||g.setAttribute(r,"true")}})};return u(t),s.clear(),Ub++,function(){i.forEach(function(d){var g=Qs.get(d)-1,m=o.get(d)-1;Qs.set(d,g),o.set(d,m),g||(tp.has(d)||d.removeAttribute(r),tp.delete(d)),m||d.removeAttribute(n)}),Ub--,Ub||(Qs=new WeakMap,Qs=new WeakMap,tp=new WeakMap,np={})}},mf=function(e,t,n){n===void 0&&(n="data-aria-hidden");var r=Array.from(Array.isArray(e)?e:[e]),a=t||RJ(e);return a?(r.push.apply(r,Array.from(a.querySelectorAll("[aria-live]"))),IJ(r,a,n,"aria-hidden")):function(){return null}},Pn=function(){return Pn=Object.assign||function(t){for(var n,r=1,a=arguments.length;r"u")return VJ;var t=qJ(e),n=document.documentElement.clientWidth,r=window.innerWidth;return{left:t[0],top:t[1],right:t[2],gap:Math.max(0,r-n+t[2]-t[0])}},WJ=D_(),KJ=function(e,t,n,r){var a=e.left,o=e.top,i=e.right,s=e.gap;return n===void 0&&(n="margin"),` + */function P6(e,t){return e?lQ(e)?p.createElement(e,t):e:null}function lQ(e){return cQ(e)||typeof e=="function"||uQ(e)}function cQ(e){return typeof e=="function"&&(()=>{const t=Object.getPrototypeOf(e);return t.prototype&&t.prototype.isReactComponent})()}function uQ(e){return typeof e=="object"&&typeof e.$$typeof=="symbol"&&["react.memo","react.forward_ref"].includes(e.$$typeof.description)}function dQ(e){const t={state:{},onStateChange:()=>{},renderFallbackValue:null,...e},[n]=p.useState(()=>({current:nQ(t)})),[r,a]=p.useState(()=>n.current.initialState);return n.current.setOptions(o=>({...o,...e,state:{...r,...e.state},onStateChange:i=>{a(i),e.onStateChange==null||e.onStateChange(i)}})),n.current}const $6=p.forwardRef(({className:e,...t},n)=>f.jsx("div",{className:"relative w-full overflow-auto",children:f.jsx("table",{ref:n,className:ee("caption-bottom w-full text-sm",e),...t})}));$6.displayName="Table";const F6=p.forwardRef(({className:e,...t},n)=>f.jsx("thead",{ref:n,className:ee("[&_tr]:border-b",e),...t}));F6.displayName="TableHeader";const _u=p.forwardRef(({className:e,...t},n)=>f.jsx("tbody",{ref:n,className:ee("[&_tr:last-child]:border-0",e),...t}));_u.displayName="TableBody";const fQ=p.forwardRef(({className:e,...t},n)=>f.jsx("tfoot",{ref:n,className:ee("bg-primary font-medium text-primary-foreground",e),...t}));fQ.displayName="TableFooter";const Zi=p.forwardRef(({className:e,...t},n)=>f.jsx("tr",{ref:n,className:ee("border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted",e),...t}));Zi.displayName="TableRow";const j6=p.forwardRef(({className:e,...t},n)=>f.jsx("th",{ref:n,className:ee("h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0",e),...t}));j6.displayName="TableHead";const ul=p.forwardRef(({className:e,...t},n)=>f.jsx("td",{ref:n,className:ee("p-4 align-middle [&:has([role=checkbox])]:pr-0",e),...t}));ul.displayName="TableCell";const pQ=p.forwardRef(({className:e,...t},n)=>f.jsx("caption",{ref:n,className:ee("mt-4 text-sm text-muted-foreground",e),...t}));pQ.displayName="TableCaption";function Pi({className:e,...t}){return f.jsx("div",{className:ee("animate-pulse rounded-md bg-muted",e),...t})}const gQ=ef("relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground",{variants:{variant:{default:"bg-background text-foreground",destructive:"border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive"}},defaultVariants:{variant:"default"}}),Jm=p.forwardRef(({className:e,variant:t,...n},r)=>f.jsx("div",{ref:r,role:"alert",className:ee(gQ({variant:t}),e),...n}));Jm.displayName="Alert";const z6=p.forwardRef(({className:e,...t},n)=>f.jsx("h5",{ref:n,className:ee("mb-1 font-medium leading-none tracking-tight",e),...t}));z6.displayName="AlertTitle";const U6=p.forwardRef(({className:e,...t},n)=>f.jsx("div",{ref:n,className:ee("text-sm [&_p]:leading-relaxed",e),...t}));U6.displayName="AlertDescription";function mQ(e){var i;const{table:t,isLoading:n,expandedRowsContent:r,error:a}=e,o=p.useMemo(()=>t.getAllColumns().length,[t]);return n?f.jsx(_u,{children:Array.from({length:15}).map((s,l)=>f.jsx(Zi,{children:t.getVisibleFlatColumns().map(c=>f.jsx(ul,{width:c.getSize(),className:"text-center",children:f.jsx(Pi,{className:"w-[95%] h-2"})},c.id))},l))}):a?f.jsx(_u,{children:f.jsx(Zi,{children:f.jsx(ul,{colSpan:o,className:"text-center",children:f.jsx(Jm,{variant:"destructive",children:a})})})}):((i=t.getRowModel().rows)==null?void 0:i.length)===0?f.jsx(_u,{children:f.jsx(Zi,{children:f.jsx(ul,{colSpan:o,className:"h-24 text-center",children:"No results."})})}):f.jsx(_u,{children:t.getRowModel().rows.map((s,l)=>f.jsxs(f.Fragment,{children:[f.jsx(Zi,{"data-state":s.getIsSelected()&&"selected",className:ee(s.getIsExpanded()&&"border-b-0"),children:s.getVisibleCells().map(c=>f.jsx(ul,{style:{width:`${c.column.getSize()}px`},children:P6(c.column.columnDef.cell,c.getContext())},c.id))},s.id),s.getIsExpanded()?f.jsx(Zi,{children:f.jsx(ul,{colSpan:o,className:"text-center pt-0",children:r?r(l):null})},s.id):null]}))})}function uf({columns:e,data:t,renderPagination:n,className:r,isLoading:a,error:o,expandedRowsContent:i}){const s=dQ({data:t,columns:e,getCoreRowModel:oQ(),getPaginationRowModel:sQ()});return f.jsxs(f.Fragment,{children:[f.jsx("div",{className:ee("rounded-md border",r),children:f.jsxs($6,{children:[f.jsx(F6,{children:s.getHeaderGroups().map(l=>f.jsx(Zi,{children:l.headers.map(c=>f.jsx(j6,{children:c.isPlaceholder?null:P6(c.column.columnDef.header,c.getContext())},c.id))},l.id))}),f.jsx(mQ,{table:s,isLoading:!!a,error:o,expandedRowsContent:i})]})}),n&&n(s)]})}function df({table:e,className:t,renderAdditionalInfo:n}){return f.jsxs("div",{className:ee("flex items-center justify-end space-x-2",t),children:[n&&n(e),f.jsxs("div",{className:"space-x-2",children:[f.jsx(ue,{variant:"outline",size:"sm",onClick:()=>e.previousPage(),disabled:!e.getCanPreviousPage(),children:"Previous"}),f.jsx(ue,{variant:"outline",size:"sm",onClick:()=>e.nextPage(),disabled:!e.getCanNextPage(),children:"Next"})]})]})}const hQ=p.createContext(void 0);function x_(e){const t=p.useContext(hQ);return e||t||"ltr"}let Fb=0;function eh(){p.useEffect(()=>{var e,t;const n=document.querySelectorAll("[data-radix-focus-guard]");return document.body.insertAdjacentElement("afterbegin",(e=n[0])!==null&&e!==void 0?e:b2()),document.body.insertAdjacentElement("beforeend",(t=n[1])!==null&&t!==void 0?t:b2()),Fb++,()=>{Fb===1&&document.querySelectorAll("[data-radix-focus-guard]").forEach(r=>r.remove()),Fb--}},[])}function b2(){const e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.cssText="outline: none; opacity: 0; position: fixed; pointer-events: none",e}const jb="focusScope.autoFocusOnMount",zb="focusScope.autoFocusOnUnmount",y2={bubbles:!1,cancelable:!0},th=p.forwardRef((e,t)=>{const{loop:n=!1,trapped:r=!1,onMountAutoFocus:a,onUnmountAutoFocus:o,...i}=e,[s,l]=p.useState(null),c=ur(a),u=ur(o),d=p.useRef(null),g=nt(t,y=>l(y)),m=p.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;p.useEffect(()=>{if(r){let h=function(x){if(m.paused||!s)return;const C=x.target;s.contains(C)?d.current=C:Ho(d.current,{select:!0})},S=function(x){if(m.paused||!s)return;const C=x.relatedTarget;C!==null&&(s.contains(C)||Ho(d.current,{select:!0}))},E=function(x){if(document.activeElement===document.body)for(const _ of x)_.removedNodes.length>0&&Ho(s)};var y=h,w=S,v=E;document.addEventListener("focusin",h),document.addEventListener("focusout",S);const k=new MutationObserver(E);return s&&k.observe(s,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",h),document.removeEventListener("focusout",S),k.disconnect()}}},[r,s,m.paused]),p.useEffect(()=>{if(s){S2.add(m);const y=document.activeElement;if(!s.contains(y)){const v=new CustomEvent(jb,y2);s.addEventListener(jb,c),s.dispatchEvent(v),v.defaultPrevented||(bQ(EQ(B6(s)),{select:!0}),document.activeElement===y&&Ho(s))}return()=>{s.removeEventListener(jb,c),setTimeout(()=>{const v=new CustomEvent(zb,y2);s.addEventListener(zb,u),s.dispatchEvent(v),v.defaultPrevented||Ho(y??document.body,{select:!0}),s.removeEventListener(zb,u),S2.remove(m)},0)}}},[s,c,u,m]);const b=p.useCallback(y=>{if(!n&&!r||m.paused)return;const w=y.key==="Tab"&&!y.altKey&&!y.ctrlKey&&!y.metaKey,v=document.activeElement;if(w&&v){const h=y.currentTarget,[S,E]=yQ(h);S&&E?!y.shiftKey&&v===E?(y.preventDefault(),n&&Ho(S,{select:!0})):y.shiftKey&&v===S&&(y.preventDefault(),n&&Ho(E,{select:!0})):v===h&&y.preventDefault()}},[n,r,m.paused]);return p.createElement(ze.div,W({tabIndex:-1},i,{ref:g,onKeyDown:b}))});function bQ(e,{select:t=!1}={}){const n=document.activeElement;for(const r of e)if(Ho(r,{select:t}),document.activeElement!==n)return}function yQ(e){const t=B6(e),n=v2(t,e),r=v2(t.reverse(),e);return[n,r]}function B6(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>{const a=r.tagName==="INPUT"&&r.type==="hidden";return r.disabled||r.hidden||a?NodeFilter.FILTER_SKIP:r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function v2(e,t){for(const n of e)if(!vQ(n,{upTo:t}))return n}function vQ(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function SQ(e){return e instanceof HTMLInputElement&&"select"in e}function Ho(e,{select:t=!1}={}){if(e&&e.focus){const n=document.activeElement;e.focus({preventScroll:!0}),e!==n&&SQ(e)&&t&&e.select()}}const S2=wQ();function wQ(){let e=[];return{add(t){const n=e[0];t!==n&&(n==null||n.pause()),e=w2(e,t),e.unshift(t)},remove(t){var n;e=w2(e,t),(n=e[0])===null||n===void 0||n.resume()}}}function w2(e,t){const n=[...e],r=n.indexOf(t);return r!==-1&&n.splice(r,1),n}function EQ(e){return e.filter(t=>t.tagName!=="A")}const xQ=Kd["useId".toString()]||(()=>{});let kQ=0;function bi(e){const[t,n]=p.useState(xQ());return Zr(()=>{e||n(r=>r??String(kQ++))},[e]),e||(t?`radix-${t}`:"")}const CQ=["top","right","bottom","left"],xi=Math.min,Er=Math.max,Og=Math.round,ep=Math.floor,ki=e=>({x:e,y:e}),_Q={left:"right",right:"left",bottom:"top",top:"bottom"},AQ={start:"end",end:"start"};function ek(e,t,n){return Er(e,xi(t,n))}function bo(e,t){return typeof e=="function"?e(t):e}function yo(e){return e.split("-")[0]}function $c(e){return e.split("-")[1]}function k_(e){return e==="x"?"y":"x"}function C_(e){return e==="y"?"height":"width"}function Fc(e){return["top","bottom"].includes(yo(e))?"y":"x"}function __(e){return k_(Fc(e))}function TQ(e,t,n){n===void 0&&(n=!1);const r=$c(e),a=__(e),o=C_(a);let i=a==="x"?r===(n?"end":"start")?"right":"left":r==="start"?"bottom":"top";return t.reference[o]>t.floating[o]&&(i=Dg(i)),[i,Dg(i)]}function RQ(e){const t=Dg(e);return[tk(e),t,tk(t)]}function tk(e){return e.replace(/start|end/g,t=>AQ[t])}function NQ(e,t,n){const r=["left","right"],a=["right","left"],o=["top","bottom"],i=["bottom","top"];switch(e){case"top":case"bottom":return n?t?a:r:t?r:a;case"left":case"right":return t?o:i;default:return[]}}function IQ(e,t,n,r){const a=$c(e);let o=NQ(yo(e),n==="start",r);return a&&(o=o.map(i=>i+"-"+a),t&&(o=o.concat(o.map(tk)))),o}function Dg(e){return e.replace(/left|right|bottom|top/g,t=>_Q[t])}function OQ(e){return{top:0,right:0,bottom:0,left:0,...e}}function H6(e){return typeof e!="number"?OQ(e):{top:e,right:e,bottom:e,left:e}}function Lg(e){return{...e,top:e.y,left:e.x,right:e.x+e.width,bottom:e.y+e.height}}function E2(e,t,n){let{reference:r,floating:a}=e;const o=Fc(t),i=__(t),s=C_(i),l=yo(t),c=o==="y",u=r.x+r.width/2-a.width/2,d=r.y+r.height/2-a.height/2,g=r[s]/2-a[s]/2;let m;switch(l){case"top":m={x:u,y:r.y-a.height};break;case"bottom":m={x:u,y:r.y+r.height};break;case"right":m={x:r.x+r.width,y:d};break;case"left":m={x:r.x-a.width,y:d};break;default:m={x:r.x,y:r.y}}switch($c(t)){case"start":m[i]-=g*(n&&c?-1:1);break;case"end":m[i]+=g*(n&&c?-1:1);break}return m}const DQ=async(e,t,n)=>{const{placement:r="bottom",strategy:a="absolute",middleware:o=[],platform:i}=n,s=o.filter(Boolean),l=await(i.isRTL==null?void 0:i.isRTL(t));let c=await i.getElementRects({reference:e,floating:t,strategy:a}),{x:u,y:d}=E2(c,r,l),g=r,m={},b=0;for(let y=0;y({name:"arrow",options:e,async fn(t){const{x:n,y:r,placement:a,rects:o,platform:i,elements:s,middlewareData:l}=t,{element:c,padding:u=0}=bo(e,t)||{};if(c==null)return{};const d=H6(u),g={x:n,y:r},m=__(a),b=C_(m),y=await i.getDimensions(c),w=m==="y",v=w?"top":"left",h=w?"bottom":"right",S=w?"clientHeight":"clientWidth",E=o.reference[b]+o.reference[m]-g[m]-o.floating[b],k=g[m]-o.reference[m],x=await(i.getOffsetParent==null?void 0:i.getOffsetParent(c));let C=x?x[S]:0;(!C||!await(i.isElement==null?void 0:i.isElement(x)))&&(C=s.floating[S]||o.floating[b]);const _=E/2-k/2,R=C/2-y[b]/2-1,T=xi(d[v],R),L=xi(d[h],R),D=T,H=C-y[b]-L,z=C/2-y[b]/2+_,M=ek(D,z,H),U=!l.arrow&&$c(a)!=null&&z!=M&&o.reference[b]/2-(zD<=0)){var R,T;const D=(((R=o.flip)==null?void 0:R.index)||0)+1,H=k[D];if(H)return{data:{index:D,overflows:_},reset:{placement:H}};let z=(T=_.filter(M=>M.overflows[0]<=0).sort((M,U)=>M.overflows[1]-U.overflows[1])[0])==null?void 0:T.placement;if(!z)switch(m){case"bestFit":{var L;const M=(L=_.map(U=>[U.placement,U.overflows.filter(X=>X>0).reduce((X,j)=>X+j,0)]).sort((U,X)=>U[1]-X[1])[0])==null?void 0:L[0];M&&(z=M);break}case"initialPlacement":z=s;break}if(a!==z)return{reset:{placement:z}}}return{}}}};function k2(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function C2(e){return CQ.some(t=>e[t]>=0)}const MQ=function(e){return e===void 0&&(e={}),{name:"hide",options:e,async fn(t){const{rects:n}=t,{strategy:r="referenceHidden",...a}=bo(e,t);switch(r){case"referenceHidden":{const o=await Sd(t,{...a,elementContext:"reference"}),i=k2(o,n.reference);return{data:{referenceHiddenOffsets:i,referenceHidden:C2(i)}}}case"escaped":{const o=await Sd(t,{...a,altBoundary:!0}),i=k2(o,n.floating);return{data:{escapedOffsets:i,escaped:C2(i)}}}default:return{}}}}};async function PQ(e,t){const{placement:n,platform:r,elements:a}=e,o=await(r.isRTL==null?void 0:r.isRTL(a.floating)),i=yo(n),s=$c(n),l=Fc(n)==="y",c=["left","top"].includes(i)?-1:1,u=o&&l?-1:1,d=bo(t,e);let{mainAxis:g,crossAxis:m,alignmentAxis:b}=typeof d=="number"?{mainAxis:d,crossAxis:0,alignmentAxis:null}:{mainAxis:0,crossAxis:0,alignmentAxis:null,...d};return s&&typeof b=="number"&&(m=s==="end"?b*-1:b),l?{x:m*u,y:g*c}:{x:g*c,y:m*u}}const $Q=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(t){const{x:n,y:r}=t,a=await PQ(t,e);return{x:n+a.x,y:r+a.y,data:a}}}},FQ=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(t){const{x:n,y:r,placement:a}=t,{mainAxis:o=!0,crossAxis:i=!1,limiter:s={fn:w=>{let{x:v,y:h}=w;return{x:v,y:h}}},...l}=bo(e,t),c={x:n,y:r},u=await Sd(t,l),d=Fc(yo(a)),g=k_(d);let m=c[g],b=c[d];if(o){const w=g==="y"?"top":"left",v=g==="y"?"bottom":"right",h=m+u[w],S=m-u[v];m=ek(h,m,S)}if(i){const w=d==="y"?"top":"left",v=d==="y"?"bottom":"right",h=b+u[w],S=b-u[v];b=ek(h,b,S)}const y=s.fn({...t,[g]:m,[d]:b});return{...y,data:{x:y.x-n,y:y.y-r}}}}},jQ=function(e){return e===void 0&&(e={}),{options:e,fn(t){const{x:n,y:r,placement:a,rects:o,middlewareData:i}=t,{offset:s=0,mainAxis:l=!0,crossAxis:c=!0}=bo(e,t),u={x:n,y:r},d=Fc(a),g=k_(d);let m=u[g],b=u[d];const y=bo(s,t),w=typeof y=="number"?{mainAxis:y,crossAxis:0}:{mainAxis:0,crossAxis:0,...y};if(l){const S=g==="y"?"height":"width",E=o.reference[g]-o.floating[S]+w.mainAxis,k=o.reference[g]+o.reference[S]-w.mainAxis;mk&&(m=k)}if(c){var v,h;const S=g==="y"?"width":"height",E=["top","left"].includes(yo(a)),k=o.reference[d]-o.floating[S]+(E&&((v=i.offset)==null?void 0:v[d])||0)+(E?0:w.crossAxis),x=o.reference[d]+o.reference[S]+(E?0:((h=i.offset)==null?void 0:h[d])||0)-(E?w.crossAxis:0);bx&&(b=x)}return{[g]:m,[d]:b}}}},zQ=function(e){return e===void 0&&(e={}),{name:"size",options:e,async fn(t){const{placement:n,rects:r,platform:a,elements:o}=t,{apply:i=()=>{},...s}=bo(e,t),l=await Sd(t,s),c=yo(n),u=$c(n),d=Fc(n)==="y",{width:g,height:m}=r.floating;let b,y;c==="top"||c==="bottom"?(b=c,y=u===(await(a.isRTL==null?void 0:a.isRTL(o.floating))?"start":"end")?"left":"right"):(y=c,b=u==="end"?"top":"bottom");const w=m-l[b],v=g-l[y],h=!t.middlewareData.shift;let S=w,E=v;if(d){const x=g-l.left-l.right;E=u||h?xi(v,x):x}else{const x=m-l.top-l.bottom;S=u||h?xi(w,x):x}if(h&&!u){const x=Er(l.left,0),C=Er(l.right,0),_=Er(l.top,0),R=Er(l.bottom,0);d?E=g-2*(x!==0||C!==0?x+C:Er(l.left,l.right)):S=m-2*(_!==0||R!==0?_+R:Er(l.top,l.bottom))}await i({...t,availableWidth:E,availableHeight:S});const k=await a.getDimensions(o.floating);return g!==k.width||m!==k.height?{reset:{rects:!0}}:{}}}};function Ci(e){return V6(e)?(e.nodeName||"").toLowerCase():"#document"}function _r(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function Ao(e){var t;return(t=(V6(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function V6(e){return e instanceof Node||e instanceof _r(e).Node}function vo(e){return e instanceof Element||e instanceof _r(e).Element}function ja(e){return e instanceof HTMLElement||e instanceof _r(e).HTMLElement}function _2(e){return typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof _r(e).ShadowRoot}function ff(e){const{overflow:t,overflowX:n,overflowY:r,display:a}=Xr(e);return/auto|scroll|overlay|hidden|clip/.test(t+r+n)&&!["inline","contents"].includes(a)}function UQ(e){return["table","td","th"].includes(Ci(e))}function A_(e){const t=T_(),n=Xr(e);return n.transform!=="none"||n.perspective!=="none"||(n.containerType?n.containerType!=="normal":!1)||!t&&(n.backdropFilter?n.backdropFilter!=="none":!1)||!t&&(n.filter?n.filter!=="none":!1)||["transform","perspective","filter"].some(r=>(n.willChange||"").includes(r))||["paint","layout","strict","content"].some(r=>(n.contain||"").includes(r))}function BQ(e){let t=vc(e);for(;ja(t)&&!nh(t);){if(A_(t))return t;t=vc(t)}return null}function T_(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}function nh(e){return["html","body","#document"].includes(Ci(e))}function Xr(e){return _r(e).getComputedStyle(e)}function rh(e){return vo(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function vc(e){if(Ci(e)==="html")return e;const t=e.assignedSlot||e.parentNode||_2(e)&&e.host||Ao(e);return _2(t)?t.host:t}function q6(e){const t=vc(e);return nh(t)?e.ownerDocument?e.ownerDocument.body:e.body:ja(t)&&ff(t)?t:q6(t)}function wd(e,t,n){var r;t===void 0&&(t=[]),n===void 0&&(n=!0);const a=q6(e),o=a===((r=e.ownerDocument)==null?void 0:r.body),i=_r(a);return o?t.concat(i,i.visualViewport||[],ff(a)?a:[],i.frameElement&&n?wd(i.frameElement):[]):t.concat(a,wd(a,[],n))}function G6(e){const t=Xr(e);let n=parseFloat(t.width)||0,r=parseFloat(t.height)||0;const a=ja(e),o=a?e.offsetWidth:n,i=a?e.offsetHeight:r,s=Og(n)!==o||Og(r)!==i;return s&&(n=o,r=i),{width:n,height:r,$:s}}function R_(e){return vo(e)?e:e.contextElement}function Ul(e){const t=R_(e);if(!ja(t))return ki(1);const n=t.getBoundingClientRect(),{width:r,height:a,$:o}=G6(t);let i=(o?Og(n.width):n.width)/r,s=(o?Og(n.height):n.height)/a;return(!i||!Number.isFinite(i))&&(i=1),(!s||!Number.isFinite(s))&&(s=1),{x:i,y:s}}const HQ=ki(0);function W6(e){const t=_r(e);return!T_()||!t.visualViewport?HQ:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function VQ(e,t,n){return t===void 0&&(t=!1),!n||t&&n!==_r(e)?!1:t}function As(e,t,n,r){t===void 0&&(t=!1),n===void 0&&(n=!1);const a=e.getBoundingClientRect(),o=R_(e);let i=ki(1);t&&(r?vo(r)&&(i=Ul(r)):i=Ul(e));const s=VQ(o,n,r)?W6(o):ki(0);let l=(a.left+s.x)/i.x,c=(a.top+s.y)/i.y,u=a.width/i.x,d=a.height/i.y;if(o){const g=_r(o),m=r&&vo(r)?_r(r):r;let b=g.frameElement;for(;b&&r&&m!==g;){const y=Ul(b),w=b.getBoundingClientRect(),v=Xr(b),h=w.left+(b.clientLeft+parseFloat(v.paddingLeft))*y.x,S=w.top+(b.clientTop+parseFloat(v.paddingTop))*y.y;l*=y.x,c*=y.y,u*=y.x,d*=y.y,l+=h,c+=S,b=_r(b).frameElement}}return Lg({width:u,height:d,x:l,y:c})}function qQ(e){let{rect:t,offsetParent:n,strategy:r}=e;const a=ja(n),o=Ao(n);if(n===o)return t;let i={scrollLeft:0,scrollTop:0},s=ki(1);const l=ki(0);if((a||!a&&r!=="fixed")&&((Ci(n)!=="body"||ff(o))&&(i=rh(n)),ja(n))){const c=As(n);s=Ul(n),l.x=c.x+n.clientLeft,l.y=c.y+n.clientTop}return{width:t.width*s.x,height:t.height*s.y,x:t.x*s.x-i.scrollLeft*s.x+l.x,y:t.y*s.y-i.scrollTop*s.y+l.y}}function GQ(e){return Array.from(e.getClientRects())}function K6(e){return As(Ao(e)).left+rh(e).scrollLeft}function WQ(e){const t=Ao(e),n=rh(e),r=e.ownerDocument.body,a=Er(t.scrollWidth,t.clientWidth,r.scrollWidth,r.clientWidth),o=Er(t.scrollHeight,t.clientHeight,r.scrollHeight,r.clientHeight);let i=-n.scrollLeft+K6(e);const s=-n.scrollTop;return Xr(r).direction==="rtl"&&(i+=Er(t.clientWidth,r.clientWidth)-a),{width:a,height:o,x:i,y:s}}function KQ(e,t){const n=_r(e),r=Ao(e),a=n.visualViewport;let o=r.clientWidth,i=r.clientHeight,s=0,l=0;if(a){o=a.width,i=a.height;const c=T_();(!c||c&&t==="fixed")&&(s=a.offsetLeft,l=a.offsetTop)}return{width:o,height:i,x:s,y:l}}function YQ(e,t){const n=As(e,!0,t==="fixed"),r=n.top+e.clientTop,a=n.left+e.clientLeft,o=ja(e)?Ul(e):ki(1),i=e.clientWidth*o.x,s=e.clientHeight*o.y,l=a*o.x,c=r*o.y;return{width:i,height:s,x:l,y:c}}function A2(e,t,n){let r;if(t==="viewport")r=KQ(e,n);else if(t==="document")r=WQ(Ao(e));else if(vo(t))r=YQ(t,n);else{const a=W6(e);r={...t,x:t.x-a.x,y:t.y-a.y}}return Lg(r)}function Y6(e,t){const n=vc(e);return n===t||!vo(n)||nh(n)?!1:Xr(n).position==="fixed"||Y6(n,t)}function ZQ(e,t){const n=t.get(e);if(n)return n;let r=wd(e,[],!1).filter(s=>vo(s)&&Ci(s)!=="body"),a=null;const o=Xr(e).position==="fixed";let i=o?vc(e):e;for(;vo(i)&&!nh(i);){const s=Xr(i),l=A_(i);!l&&s.position==="fixed"&&(a=null),(o?!l&&!a:!l&&s.position==="static"&&!!a&&["absolute","fixed"].includes(a.position)||ff(i)&&!l&&Y6(e,i))?r=r.filter(u=>u!==i):a=s,i=vc(i)}return t.set(e,r),r}function XQ(e){let{element:t,boundary:n,rootBoundary:r,strategy:a}=e;const i=[...n==="clippingAncestors"?ZQ(t,this._c):[].concat(n),r],s=i[0],l=i.reduce((c,u)=>{const d=A2(t,u,a);return c.top=Er(d.top,c.top),c.right=xi(d.right,c.right),c.bottom=xi(d.bottom,c.bottom),c.left=Er(d.left,c.left),c},A2(t,s,a));return{width:l.right-l.left,height:l.bottom-l.top,x:l.left,y:l.top}}function QQ(e){return G6(e)}function JQ(e,t,n){const r=ja(t),a=Ao(t),o=n==="fixed",i=As(e,!0,o,t);let s={scrollLeft:0,scrollTop:0};const l=ki(0);if(r||!r&&!o)if((Ci(t)!=="body"||ff(a))&&(s=rh(t)),r){const c=As(t,!0,o,t);l.x=c.x+t.clientLeft,l.y=c.y+t.clientTop}else a&&(l.x=K6(a));return{x:i.left+s.scrollLeft-l.x,y:i.top+s.scrollTop-l.y,width:i.width,height:i.height}}function T2(e,t){return!ja(e)||Xr(e).position==="fixed"?null:t?t(e):e.offsetParent}function Z6(e,t){const n=_r(e);if(!ja(e))return n;let r=T2(e,t);for(;r&&UQ(r)&&Xr(r).position==="static";)r=T2(r,t);return r&&(Ci(r)==="html"||Ci(r)==="body"&&Xr(r).position==="static"&&!A_(r))?n:r||BQ(e)||n}const eJ=async function(e){let{reference:t,floating:n,strategy:r}=e;const a=this.getOffsetParent||Z6,o=this.getDimensions;return{reference:JQ(t,await a(n),r),floating:{x:0,y:0,...await o(n)}}};function tJ(e){return Xr(e).direction==="rtl"}const nJ={convertOffsetParentRelativeRectToViewportRelativeRect:qQ,getDocumentElement:Ao,getClippingRect:XQ,getOffsetParent:Z6,getElementRects:eJ,getClientRects:GQ,getDimensions:QQ,getScale:Ul,isElement:vo,isRTL:tJ};function rJ(e,t){let n=null,r;const a=Ao(e);function o(){clearTimeout(r),n&&n.disconnect(),n=null}function i(s,l){s===void 0&&(s=!1),l===void 0&&(l=1),o();const{left:c,top:u,width:d,height:g}=e.getBoundingClientRect();if(s||t(),!d||!g)return;const m=ep(u),b=ep(a.clientWidth-(c+d)),y=ep(a.clientHeight-(u+g)),w=ep(c),h={rootMargin:-m+"px "+-b+"px "+-y+"px "+-w+"px",threshold:Er(0,xi(1,l))||1};let S=!0;function E(k){const x=k[0].intersectionRatio;if(x!==l){if(!S)return i();x?i(!1,x):r=setTimeout(()=>{i(!1,1e-7)},100)}S=!1}try{n=new IntersectionObserver(E,{...h,root:a.ownerDocument})}catch{n=new IntersectionObserver(E,h)}n.observe(e)}return i(!0),o}function aJ(e,t,n,r){r===void 0&&(r={});const{ancestorScroll:a=!0,ancestorResize:o=!0,elementResize:i=typeof ResizeObserver=="function",layoutShift:s=typeof IntersectionObserver=="function",animationFrame:l=!1}=r,c=R_(e),u=a||o?[...c?wd(c):[],...wd(t)]:[];u.forEach(v=>{a&&v.addEventListener("scroll",n,{passive:!0}),o&&v.addEventListener("resize",n)});const d=c&&s?rJ(c,n):null;let g=-1,m=null;i&&(m=new ResizeObserver(v=>{let[h]=v;h&&h.target===c&&m&&(m.unobserve(t),cancelAnimationFrame(g),g=requestAnimationFrame(()=>{m&&m.observe(t)})),n()}),c&&!l&&m.observe(c),m.observe(t));let b,y=l?As(e):null;l&&w();function w(){const v=As(e);y&&(v.x!==y.x||v.y!==y.y||v.width!==y.width||v.height!==y.height)&&n(),y=v,b=requestAnimationFrame(w)}return n(),()=>{u.forEach(v=>{a&&v.removeEventListener("scroll",n),o&&v.removeEventListener("resize",n)}),d&&d(),m&&m.disconnect(),m=null,l&&cancelAnimationFrame(b)}}const oJ=(e,t,n)=>{const r=new Map,a={platform:nJ,...n},o={...a.platform,_c:r};return DQ(e,t,{...a,platform:o})},iJ=e=>{function t(n){return{}.hasOwnProperty.call(n,"current")}return{name:"arrow",options:e,fn(n){const{element:r,padding:a}=typeof e=="function"?e(n):e;return r&&t(r)?r.current!=null?x2({element:r.current,padding:a}).fn(n):{}:r?x2({element:r,padding:a}).fn(n):{}}}};var qp=typeof document<"u"?p.useLayoutEffect:p.useEffect;function Mg(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(typeof e=="function"&&e.toString()===t.toString())return!0;let n,r,a;if(e&&t&&typeof e=="object"){if(Array.isArray(e)){if(n=e.length,n!=t.length)return!1;for(r=n;r--!==0;)if(!Mg(e[r],t[r]))return!1;return!0}if(a=Object.keys(e),n=a.length,n!==Object.keys(t).length)return!1;for(r=n;r--!==0;)if(!{}.hasOwnProperty.call(t,a[r]))return!1;for(r=n;r--!==0;){const o=a[r];if(!(o==="_owner"&&e.$$typeof)&&!Mg(e[o],t[o]))return!1}return!0}return e!==e&&t!==t}function X6(e){return typeof window>"u"?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function R2(e,t){const n=X6(e);return Math.round(t*n)/n}function N2(e){const t=p.useRef(e);return qp(()=>{t.current=e}),t}function sJ(e){e===void 0&&(e={});const{placement:t="bottom",strategy:n="absolute",middleware:r=[],platform:a,elements:{reference:o,floating:i}={},transform:s=!0,whileElementsMounted:l,open:c}=e,[u,d]=p.useState({x:0,y:0,strategy:n,placement:t,middlewareData:{},isPositioned:!1}),[g,m]=p.useState(r);Mg(g,r)||m(r);const[b,y]=p.useState(null),[w,v]=p.useState(null),h=p.useCallback(U=>{U!=x.current&&(x.current=U,y(U))},[y]),S=p.useCallback(U=>{U!==C.current&&(C.current=U,v(U))},[v]),E=o||b,k=i||w,x=p.useRef(null),C=p.useRef(null),_=p.useRef(u),R=N2(l),T=N2(a),L=p.useCallback(()=>{if(!x.current||!C.current)return;const U={placement:t,strategy:n,middleware:g};T.current&&(U.platform=T.current),oJ(x.current,C.current,U).then(X=>{const j={...X,isPositioned:!0};D.current&&!Mg(_.current,j)&&(_.current=j,ba.flushSync(()=>{d(j)}))})},[g,t,n,T]);qp(()=>{c===!1&&_.current.isPositioned&&(_.current.isPositioned=!1,d(U=>({...U,isPositioned:!1})))},[c]);const D=p.useRef(!1);qp(()=>(D.current=!0,()=>{D.current=!1}),[]),qp(()=>{if(E&&(x.current=E),k&&(C.current=k),E&&k){if(R.current)return R.current(E,k,L);L()}},[E,k,L,R]);const H=p.useMemo(()=>({reference:x,floating:C,setReference:h,setFloating:S}),[h,S]),z=p.useMemo(()=>({reference:E,floating:k}),[E,k]),M=p.useMemo(()=>{const U={position:n,left:0,top:0};if(!z.floating)return U;const X=R2(z.floating,u.x),j=R2(z.floating,u.y);return s?{...U,transform:"translate("+X+"px, "+j+"px)",...X6(z.floating)>=1.5&&{willChange:"transform"}}:{position:n,left:X,top:j}},[n,s,z.floating,u.x,u.y]);return p.useMemo(()=>({...u,update:L,refs:H,elements:z,floatingStyles:M}),[u,L,H,z,M])}function N_(e){const[t,n]=p.useState(void 0);return Zr(()=>{if(e){n({width:e.offsetWidth,height:e.offsetHeight});const r=new ResizeObserver(a=>{if(!Array.isArray(a)||!a.length)return;const o=a[0];let i,s;if("borderBoxSize"in o){const l=o.borderBoxSize,c=Array.isArray(l)?l[0]:l;i=c.inlineSize,s=c.blockSize}else i=e.offsetWidth,s=e.offsetHeight;n({width:i,height:s})});return r.observe(e,{box:"border-box"}),()=>r.unobserve(e)}else n(void 0)},[e]),t}const Q6="Popper",[J6,qa]=zn(Q6),[lJ,e7]=J6(Q6),cJ=e=>{const{__scopePopper:t,children:n}=e,[r,a]=p.useState(null);return p.createElement(lJ,{scope:t,anchor:r,onAnchorChange:a},n)},uJ="PopperAnchor",dJ=p.forwardRef((e,t)=>{const{__scopePopper:n,virtualRef:r,...a}=e,o=e7(uJ,n),i=p.useRef(null),s=nt(t,i);return p.useEffect(()=>{o.onAnchorChange((r==null?void 0:r.current)||i.current)}),r?null:p.createElement(ze.div,W({},a,{ref:s}))}),t7="PopperContent",[fJ,tTe]=J6(t7),pJ=p.forwardRef((e,t)=>{var n,r,a,o,i,s,l,c;const{__scopePopper:u,side:d="bottom",sideOffset:g=0,align:m="center",alignOffset:b=0,arrowPadding:y=0,avoidCollisions:w=!0,collisionBoundary:v=[],collisionPadding:h=0,sticky:S="partial",hideWhenDetached:E=!1,updatePositionStrategy:k="optimized",onPlaced:x,...C}=e,_=e7(t7,u),[R,T]=p.useState(null),L=nt(t,mt=>T(mt)),[D,H]=p.useState(null),z=N_(D),M=(n=z==null?void 0:z.width)!==null&&n!==void 0?n:0,U=(r=z==null?void 0:z.height)!==null&&r!==void 0?r:0,X=d+(m!=="center"?"-"+m:""),j=typeof h=="number"?h:{top:0,right:0,bottom:0,left:0,...h},O=Array.isArray(v)?v:[v],A=O.length>0,V={padding:j,boundary:O.filter(gJ),altBoundary:A},{refs:P,floatingStyles:N,placement:K,isPositioned:ae,middlewareData:ne}=sJ({strategy:"fixed",placement:X,whileElementsMounted:(...mt)=>aJ(...mt,{animationFrame:k==="always"}),elements:{reference:_.anchor},middleware:[$Q({mainAxis:g+U,alignmentAxis:b}),w&&FQ({mainAxis:!0,crossAxis:!1,limiter:S==="partial"?jQ():void 0,...V}),w&&LQ({...V}),zQ({...V,apply:({elements:mt,rects:Hn,availableWidth:F,availableHeight:q})=>{const{width:Y,height:ye}=Hn.reference,de=mt.floating.style;de.setProperty("--radix-popper-available-width",`${F}px`),de.setProperty("--radix-popper-available-height",`${q}px`),de.setProperty("--radix-popper-anchor-width",`${Y}px`),de.setProperty("--radix-popper-anchor-height",`${ye}px`)}}),D&&iJ({element:D,padding:y}),mJ({arrowWidth:M,arrowHeight:U}),E&&MQ({strategy:"referenceHidden",...V})]}),[Q,pe]=n7(K),he=ur(x);Zr(()=>{ae&&(he==null||he())},[ae,he]);const re=(a=ne.arrow)===null||a===void 0?void 0:a.x,Ee=(o=ne.arrow)===null||o===void 0?void 0:o.y,ke=((i=ne.arrow)===null||i===void 0?void 0:i.centerOffset)!==0,[We,Vt]=p.useState();return Zr(()=>{R&&Vt(window.getComputedStyle(R).zIndex)},[R]),p.createElement("div",{ref:P.setFloating,"data-radix-popper-content-wrapper":"",style:{...N,transform:ae?N.transform:"translate(0, -200%)",minWidth:"max-content",zIndex:We,["--radix-popper-transform-origin"]:[(s=ne.transformOrigin)===null||s===void 0?void 0:s.x,(l=ne.transformOrigin)===null||l===void 0?void 0:l.y].join(" ")},dir:e.dir},p.createElement(fJ,{scope:u,placedSide:Q,onArrowChange:H,arrowX:re,arrowY:Ee,shouldHideArrow:ke},p.createElement(ze.div,W({"data-side":Q,"data-align":pe},C,{ref:L,style:{...C.style,animation:ae?void 0:"none",opacity:(c=ne.hide)!==null&&c!==void 0&&c.referenceHidden?0:void 0}}))))});function gJ(e){return e!==null}const mJ=e=>({name:"transformOrigin",options:e,fn(t){var n,r,a,o,i;const{placement:s,rects:l,middlewareData:c}=t,d=((n=c.arrow)===null||n===void 0?void 0:n.centerOffset)!==0,g=d?0:e.arrowWidth,m=d?0:e.arrowHeight,[b,y]=n7(s),w={start:"0%",center:"50%",end:"100%"}[y],v=((r=(a=c.arrow)===null||a===void 0?void 0:a.x)!==null&&r!==void 0?r:0)+g/2,h=((o=(i=c.arrow)===null||i===void 0?void 0:i.y)!==null&&o!==void 0?o:0)+m/2;let S="",E="";return b==="bottom"?(S=d?w:`${v}px`,E=`${-m}px`):b==="top"?(S=d?w:`${v}px`,E=`${l.floating.height+m}px`):b==="right"?(S=`${-m}px`,E=d?w:`${h}px`):b==="left"&&(S=`${l.floating.width+m}px`,E=d?w:`${h}px`),{data:{x:S,y:E}}}});function n7(e){const[t,n="center"]=e.split("-");return[t,n]}const ah=cJ,pf=dJ,gf=pJ,Ub="rovingFocusGroup.onEntryFocus",hJ={bubbles:!1,cancelable:!0},I_="RovingFocusGroup",[nk,r7,bJ]=Nm(I_),[yJ,oh]=zn(I_,[bJ]),[vJ,SJ]=yJ(I_),wJ=p.forwardRef((e,t)=>p.createElement(nk.Provider,{scope:e.__scopeRovingFocusGroup},p.createElement(nk.Slot,{scope:e.__scopeRovingFocusGroup},p.createElement(EJ,W({},e,{ref:t}))))),EJ=p.forwardRef((e,t)=>{const{__scopeRovingFocusGroup:n,orientation:r,loop:a=!1,dir:o,currentTabStopId:i,defaultCurrentTabStopId:s,onCurrentTabStopIdChange:l,onEntryFocus:c,...u}=e,d=p.useRef(null),g=nt(t,d),m=x_(o),[b=null,y]=Fa({prop:i,defaultProp:s,onChange:l}),[w,v]=p.useState(!1),h=ur(c),S=r7(n),E=p.useRef(!1),[k,x]=p.useState(0);return p.useEffect(()=>{const C=d.current;if(C)return C.addEventListener(Ub,h),()=>C.removeEventListener(Ub,h)},[h]),p.createElement(vJ,{scope:n,orientation:r,dir:m,loop:a,currentTabStopId:b,onItemFocus:p.useCallback(C=>y(C),[y]),onItemShiftTab:p.useCallback(()=>v(!0),[]),onFocusableItemAdd:p.useCallback(()=>x(C=>C+1),[]),onFocusableItemRemove:p.useCallback(()=>x(C=>C-1),[])},p.createElement(ze.div,W({tabIndex:w||k===0?-1:0,"data-orientation":r},u,{ref:g,style:{outline:"none",...e.style},onMouseDown:fe(e.onMouseDown,()=>{E.current=!0}),onFocus:fe(e.onFocus,C=>{const _=!E.current;if(C.target===C.currentTarget&&_&&!w){const R=new CustomEvent(Ub,hJ);if(C.currentTarget.dispatchEvent(R),!R.defaultPrevented){const T=S().filter(M=>M.focusable),L=T.find(M=>M.active),D=T.find(M=>M.id===b),z=[L,D,...T].filter(Boolean).map(M=>M.ref.current);a7(z)}}E.current=!1}),onBlur:fe(e.onBlur,()=>v(!1))})))}),xJ="RovingFocusGroupItem",kJ=p.forwardRef((e,t)=>{const{__scopeRovingFocusGroup:n,focusable:r=!0,active:a=!1,tabStopId:o,...i}=e,s=bi(),l=o||s,c=SJ(xJ,n),u=c.currentTabStopId===l,d=r7(n),{onFocusableItemAdd:g,onFocusableItemRemove:m}=c;return p.useEffect(()=>{if(r)return g(),()=>m()},[r,g,m]),p.createElement(nk.ItemSlot,{scope:n,id:l,focusable:r,active:a},p.createElement(ze.span,W({tabIndex:u?0:-1,"data-orientation":c.orientation},i,{ref:t,onMouseDown:fe(e.onMouseDown,b=>{r?c.onItemFocus(l):b.preventDefault()}),onFocus:fe(e.onFocus,()=>c.onItemFocus(l)),onKeyDown:fe(e.onKeyDown,b=>{if(b.key==="Tab"&&b.shiftKey){c.onItemShiftTab();return}if(b.target!==b.currentTarget)return;const y=AJ(b,c.orientation,c.dir);if(y!==void 0){b.preventDefault();let v=d().filter(h=>h.focusable).map(h=>h.ref.current);if(y==="last")v.reverse();else if(y==="prev"||y==="next"){y==="prev"&&v.reverse();const h=v.indexOf(b.currentTarget);v=c.loop?TJ(v,h+1):v.slice(h+1)}setTimeout(()=>a7(v))}})})))}),CJ={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function _J(e,t){return t!=="rtl"?e:e==="ArrowLeft"?"ArrowRight":e==="ArrowRight"?"ArrowLeft":e}function AJ(e,t,n){const r=_J(e.key,n);if(!(t==="vertical"&&["ArrowLeft","ArrowRight"].includes(r))&&!(t==="horizontal"&&["ArrowUp","ArrowDown"].includes(r)))return CJ[r]}function a7(e){const t=document.activeElement;for(const n of e)if(n===t||(n.focus(),document.activeElement!==t))return}function TJ(e,t){return e.map((n,r)=>e[(t+r)%e.length])}const o7=wJ,i7=kJ;var RJ=function(e){if(typeof document>"u")return null;var t=Array.isArray(e)?e[0]:e;return t.ownerDocument.body},Qs=new WeakMap,tp=new WeakMap,np={},Bb=0,s7=function(e){return e&&(e.host||s7(e.parentNode))},NJ=function(e,t){return t.map(function(n){if(e.contains(n))return n;var r=s7(n);return r&&e.contains(r)?r:(console.error("aria-hidden",n,"in not contained inside",e,". Doing nothing"),null)}).filter(function(n){return!!n})},IJ=function(e,t,n,r){var a=NJ(t,Array.isArray(e)?e:[e]);np[n]||(np[n]=new WeakMap);var o=np[n],i=[],s=new Set,l=new Set(a),c=function(d){!d||s.has(d)||(s.add(d),c(d.parentNode))};a.forEach(c);var u=function(d){!d||l.has(d)||Array.prototype.forEach.call(d.children,function(g){if(s.has(g))u(g);else{var m=g.getAttribute(r),b=m!==null&&m!=="false",y=(Qs.get(g)||0)+1,w=(o.get(g)||0)+1;Qs.set(g,y),o.set(g,w),i.push(g),y===1&&b&&tp.set(g,!0),w===1&&g.setAttribute(n,"true"),b||g.setAttribute(r,"true")}})};return u(t),s.clear(),Bb++,function(){i.forEach(function(d){var g=Qs.get(d)-1,m=o.get(d)-1;Qs.set(d,g),o.set(d,m),g||(tp.has(d)||d.removeAttribute(r),tp.delete(d)),m||d.removeAttribute(n)}),Bb--,Bb||(Qs=new WeakMap,Qs=new WeakMap,tp=new WeakMap,np={})}},mf=function(e,t,n){n===void 0&&(n="data-aria-hidden");var r=Array.from(Array.isArray(e)?e:[e]),a=t||RJ(e);return a?(r.push.apply(r,Array.from(a.querySelectorAll("[aria-live]"))),IJ(r,a,n,"aria-hidden")):function(){return null}},Pn=function(){return Pn=Object.assign||function(t){for(var n,r=1,a=arguments.length;r"u")return VJ;var t=qJ(e),n=document.documentElement.clientWidth,r=window.innerWidth;return{left:t[0],top:t[1],right:t[2],gap:Math.max(0,r-n+t[2]-t[0])}},WJ=D_(),KJ=function(e,t,n,r){var a=e.left,o=e.top,i=e.right,s=e.gap;return n===void 0&&(n="margin"),` .`.concat(OJ,` { overflow: hidden `).concat(r,`; padding-right: `).concat(s,"px ").concat(r,`; @@ -144,73 +144,73 @@ Error generating stack: `+o.message+` body { `).concat(DJ,": ").concat(s,`px; } -`)},p7=function(e){var t=e.noRelative,n=e.noImportant,r=e.gapMode,a=r===void 0?"margin":r,o=p.useMemo(function(){return GJ(a)},[a]);return p.createElement(WJ,{styles:KJ(o,!t,a,n?"":"!important")})},nk=!1;if(typeof window<"u")try{var rp=Object.defineProperty({},"passive",{get:function(){return nk=!0,!0}});window.addEventListener("test",rp,rp),window.removeEventListener("test",rp,rp)}catch{nk=!1}var Js=nk?{passive:!1}:!1,YJ=function(e){return e.tagName==="TEXTAREA"},g7=function(e,t){var n=window.getComputedStyle(e);return n[t]!=="hidden"&&!(n.overflowY===n.overflowX&&!YJ(e)&&n[t]==="visible")},ZJ=function(e){return g7(e,"overflowY")},XJ=function(e){return g7(e,"overflowX")},O2=function(e,t){var n=t;do{typeof ShadowRoot<"u"&&n instanceof ShadowRoot&&(n=n.host);var r=m7(e,n);if(r){var a=h7(e,n),o=a[1],i=a[2];if(o>i)return!0}n=n.parentNode}while(n&&n!==document.body);return!1},QJ=function(e){var t=e.scrollTop,n=e.scrollHeight,r=e.clientHeight;return[t,n,r]},JJ=function(e){var t=e.scrollLeft,n=e.scrollWidth,r=e.clientWidth;return[t,n,r]},m7=function(e,t){return e==="v"?ZJ(t):XJ(t)},h7=function(e,t){return e==="v"?QJ(t):JJ(t)},eee=function(e,t){return e==="h"&&t==="rtl"?-1:1},tee=function(e,t,n,r,a){var o=eee(e,window.getComputedStyle(t).direction),i=o*r,s=n.target,l=t.contains(s),c=!1,u=i>0,d=0,g=0;do{var m=h7(e,s),b=m[0],y=m[1],w=m[2],v=y-w-o*b;(b||v)&&m7(e,s)&&(d+=v,g+=b),s=s.parentNode}while(!l&&s!==document.body||l&&(t.contains(s)||t===s));return(u&&(a&&d===0||!a&&i>d)||!u&&(a&&g===0||!a&&-i>g))&&(c=!0),c},ap=function(e){return"changedTouches"in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},D2=function(e){return[e.deltaX,e.deltaY]},L2=function(e){return e&&"current"in e?e.current:e},nee=function(e,t){return e[0]===t[0]&&e[1]===t[1]},ree=function(e){return` +`)},g7=function(e){var t=e.noRelative,n=e.noImportant,r=e.gapMode,a=r===void 0?"margin":r,o=p.useMemo(function(){return GJ(a)},[a]);return p.createElement(WJ,{styles:KJ(o,!t,a,n?"":"!important")})},rk=!1;if(typeof window<"u")try{var rp=Object.defineProperty({},"passive",{get:function(){return rk=!0,!0}});window.addEventListener("test",rp,rp),window.removeEventListener("test",rp,rp)}catch{rk=!1}var Js=rk?{passive:!1}:!1,YJ=function(e){return e.tagName==="TEXTAREA"},m7=function(e,t){var n=window.getComputedStyle(e);return n[t]!=="hidden"&&!(n.overflowY===n.overflowX&&!YJ(e)&&n[t]==="visible")},ZJ=function(e){return m7(e,"overflowY")},XJ=function(e){return m7(e,"overflowX")},O2=function(e,t){var n=t;do{typeof ShadowRoot<"u"&&n instanceof ShadowRoot&&(n=n.host);var r=h7(e,n);if(r){var a=b7(e,n),o=a[1],i=a[2];if(o>i)return!0}n=n.parentNode}while(n&&n!==document.body);return!1},QJ=function(e){var t=e.scrollTop,n=e.scrollHeight,r=e.clientHeight;return[t,n,r]},JJ=function(e){var t=e.scrollLeft,n=e.scrollWidth,r=e.clientWidth;return[t,n,r]},h7=function(e,t){return e==="v"?ZJ(t):XJ(t)},b7=function(e,t){return e==="v"?QJ(t):JJ(t)},eee=function(e,t){return e==="h"&&t==="rtl"?-1:1},tee=function(e,t,n,r,a){var o=eee(e,window.getComputedStyle(t).direction),i=o*r,s=n.target,l=t.contains(s),c=!1,u=i>0,d=0,g=0;do{var m=b7(e,s),b=m[0],y=m[1],w=m[2],v=y-w-o*b;(b||v)&&h7(e,s)&&(d+=v,g+=b),s=s.parentNode}while(!l&&s!==document.body||l&&(t.contains(s)||t===s));return(u&&(a&&d===0||!a&&i>d)||!u&&(a&&g===0||!a&&-i>g))&&(c=!0),c},ap=function(e){return"changedTouches"in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},D2=function(e){return[e.deltaX,e.deltaY]},L2=function(e){return e&&"current"in e?e.current:e},nee=function(e,t){return e[0]===t[0]&&e[1]===t[1]},ree=function(e){return` .block-interactivity-`.concat(e,` {pointer-events: none;} .allow-interactivity-`).concat(e,` {pointer-events: all;} -`)},aee=0,el=[];function oee(e){var t=p.useRef([]),n=p.useRef([0,0]),r=p.useRef(),a=p.useState(aee++)[0],o=p.useState(function(){return D_()})[0],i=p.useRef(e);p.useEffect(function(){i.current=e},[e]),p.useEffect(function(){if(e.inert){document.body.classList.add("block-interactivity-".concat(a));var y=s7([e.lockRef.current],(e.shards||[]).map(L2),!0).filter(Boolean);return y.forEach(function(w){return w.classList.add("allow-interactivity-".concat(a))}),function(){document.body.classList.remove("block-interactivity-".concat(a)),y.forEach(function(w){return w.classList.remove("allow-interactivity-".concat(a))})}}},[e.inert,e.lockRef.current,e.shards]);var s=p.useCallback(function(y,w){if("touches"in y&&y.touches.length===2)return!i.current.allowPinchZoom;var v=ap(y),h=n.current,S="deltaX"in y?y.deltaX:h[0]-v[0],E="deltaY"in y?y.deltaY:h[1]-v[1],k,x=y.target,C=Math.abs(S)>Math.abs(E)?"h":"v";if("touches"in y&&C==="h"&&x.type==="range")return!1;var _=O2(C,x);if(!_)return!0;if(_?k=C:(k=C==="v"?"h":"v",_=O2(C,x)),!_)return!1;if(!r.current&&"changedTouches"in y&&(S||E)&&(r.current=k),!k)return!0;var R=r.current||k;return tee(R,w,y,R==="h"?S:E,!0)},[]),l=p.useCallback(function(y){var w=y;if(!(!el.length||el[el.length-1]!==o)){var v="deltaY"in w?D2(w):ap(w),h=t.current.filter(function(k){return k.name===w.type&&k.target===w.target&&nee(k.delta,v)})[0];if(h&&h.should){w.cancelable&&w.preventDefault();return}if(!h){var S=(i.current.shards||[]).map(L2).filter(Boolean).filter(function(k){return k.contains(w.target)}),E=S.length>0?s(w,S[0]):!i.current.noIsolation;E&&w.cancelable&&w.preventDefault()}}},[]),c=p.useCallback(function(y,w,v,h){var S={name:y,delta:w,target:v,should:h};t.current.push(S),setTimeout(function(){t.current=t.current.filter(function(E){return E!==S})},1)},[]),u=p.useCallback(function(y){n.current=ap(y),r.current=void 0},[]),d=p.useCallback(function(y){c(y.type,D2(y),y.target,s(y,e.lockRef.current))},[]),g=p.useCallback(function(y){c(y.type,ap(y),y.target,s(y,e.lockRef.current))},[]);p.useEffect(function(){return el.push(o),e.setCallbacks({onScrollCapture:d,onWheelCapture:d,onTouchMoveCapture:g}),document.addEventListener("wheel",l,Js),document.addEventListener("touchmove",l,Js),document.addEventListener("touchstart",u,Js),function(){el=el.filter(function(y){return y!==o}),document.removeEventListener("wheel",l,Js),document.removeEventListener("touchmove",l,Js),document.removeEventListener("touchstart",u,Js)}},[]);var m=e.removeScrollBar,b=e.inert;return p.createElement(p.Fragment,null,b?p.createElement(o,{styles:ree(a)}):null,m?p.createElement(p7,{gapMode:"margin"}):null)}const iee=d7(f7,oee);var b7=p.forwardRef(function(e,t){return p.createElement(oh,Pn({},e,{ref:t,sideCar:iee}))});b7.classNames=oh.classNames;const ih=b7,rk=["Enter"," "],see=["ArrowDown","PageUp","Home"],y7=["ArrowUp","PageDown","End"],lee=[...see,...y7],cee={ltr:[...rk,"ArrowRight"],rtl:[...rk,"ArrowLeft"]},uee={ltr:["ArrowLeft"],rtl:["ArrowRight"]},sh="Menu",[Ed,dee,fee]=Nm(sh),[js,v7]=zn(sh,[fee,qa,ah]),S7=qa(),w7=ah(),[tTe,zs]=js(sh),[nTe,hf]=js(sh),pee=p.forwardRef((e,t)=>{const{__scopeMenu:n,...r}=e,a=S7(n);return p.createElement(pf,W({},a,r,{ref:t}))}),E7="MenuPortal",[gee,x7]=js(E7,{forceMount:void 0}),mee=e=>{const{__scopeMenu:t,forceMount:n,children:r,container:a}=e,o=zs(E7,t);return p.createElement(gee,{scope:t,forceMount:n},p.createElement(pr,{present:n||o.open},p.createElement(Jd,{asChild:!0,container:a},r)))},ga="MenuContent",[hee,L_]=js(ga),bee=p.forwardRef((e,t)=>{const n=x7(ga,e.__scopeMenu),{forceMount:r=n.forceMount,...a}=e,o=zs(ga,e.__scopeMenu),i=hf(ga,e.__scopeMenu);return p.createElement(Ed.Provider,{scope:e.__scopeMenu},p.createElement(pr,{present:r||o.open},p.createElement(Ed.Slot,{scope:e.__scopeMenu},i.modal?p.createElement(yee,W({},a,{ref:t})):p.createElement(vee,W({},a,{ref:t})))))}),yee=p.forwardRef((e,t)=>{const n=zs(ga,e.__scopeMenu),r=p.useRef(null),a=nt(t,r);return p.useEffect(()=>{const o=r.current;if(o)return mf(o)},[]),p.createElement(M_,W({},e,{ref:a,trapFocus:n.open,disableOutsidePointerEvents:n.open,disableOutsideScroll:!0,onFocusOutside:fe(e.onFocusOutside,o=>o.preventDefault(),{checkForDefaultPrevented:!1}),onDismiss:()=>n.onOpenChange(!1)}))}),vee=p.forwardRef((e,t)=>{const n=zs(ga,e.__scopeMenu);return p.createElement(M_,W({},e,{ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,disableOutsideScroll:!1,onDismiss:()=>n.onOpenChange(!1)}))}),M_=p.forwardRef((e,t)=>{const{__scopeMenu:n,loop:r=!1,trapFocus:a,onOpenAutoFocus:o,onCloseAutoFocus:i,disableOutsidePointerEvents:s,onEntryFocus:l,onEscapeKeyDown:c,onPointerDownOutside:u,onFocusOutside:d,onInteractOutside:g,onDismiss:m,disableOutsideScroll:b,...y}=e,w=zs(ga,n),v=hf(ga,n),h=S7(n),S=w7(n),E=dee(n),[k,x]=p.useState(null),C=p.useRef(null),_=nt(t,C,w.onContentChange),R=p.useRef(0),T=p.useRef(""),L=p.useRef(0),D=p.useRef(null),H=p.useRef("right"),z=p.useRef(0),M=b?ih:p.Fragment,U=b?{as:$a,allowPinchZoom:!0}:void 0,X=O=>{var A,V;const P=T.current+O,N=E().filter(he=>!he.disabled),K=document.activeElement,ae=(A=N.find(he=>he.ref.current===K))===null||A===void 0?void 0:A.textValue,ne=N.map(he=>he.textValue),Q=Mee(ne,P,ae),pe=(V=N.find(he=>he.textValue===Q))===null||V===void 0?void 0:V.ref.current;(function he(re){T.current=re,window.clearTimeout(R.current),re!==""&&(R.current=window.setTimeout(()=>he(""),1e3))})(P),pe&&setTimeout(()=>pe.focus())};p.useEffect(()=>()=>window.clearTimeout(R.current),[]),Jm();const j=p.useCallback(O=>{var A,V;return H.current===((A=D.current)===null||A===void 0?void 0:A.side)&&$ee(O,(V=D.current)===null||V===void 0?void 0:V.area)},[]);return p.createElement(hee,{scope:n,searchRef:T,onItemEnter:p.useCallback(O=>{j(O)&&O.preventDefault()},[j]),onItemLeave:p.useCallback(O=>{var A;j(O)||((A=C.current)===null||A===void 0||A.focus(),x(null))},[j]),onTriggerLeave:p.useCallback(O=>{j(O)&&O.preventDefault()},[j]),pointerGraceTimerRef:L,onPointerGraceIntentChange:p.useCallback(O=>{D.current=O},[])},p.createElement(M,U,p.createElement(eh,{asChild:!0,trapped:a,onMountAutoFocus:fe(o,O=>{var A;O.preventDefault(),(A=C.current)===null||A===void 0||A.focus()}),onUnmountAutoFocus:i},p.createElement(Ls,{asChild:!0,disableOutsidePointerEvents:s,onEscapeKeyDown:c,onPointerDownOutside:u,onFocusOutside:d,onInteractOutside:g,onDismiss:m},p.createElement(a7,W({asChild:!0},S,{dir:v.dir,orientation:"vertical",loop:r,currentTabStopId:k,onCurrentTabStopIdChange:x,onEntryFocus:fe(l,O=>{v.isUsingKeyboardRef.current||O.preventDefault()})}),p.createElement(gf,W({role:"menu","aria-orientation":"vertical","data-state":T7(w.open),"data-radix-menu-content":"",dir:v.dir},h,y,{ref:_,style:{outline:"none",...y.style},onKeyDown:fe(y.onKeyDown,O=>{const V=O.target.closest("[data-radix-menu-content]")===O.currentTarget,P=O.ctrlKey||O.altKey||O.metaKey,N=O.key.length===1;V&&(O.key==="Tab"&&O.preventDefault(),!P&&N&&X(O.key));const K=C.current;if(O.target!==K||!lee.includes(O.key))return;O.preventDefault();const ne=E().filter(Q=>!Q.disabled).map(Q=>Q.ref.current);y7.includes(O.key)&&ne.reverse(),Dee(ne)}),onBlur:fe(e.onBlur,O=>{O.currentTarget.contains(O.target)||(window.clearTimeout(R.current),T.current="")}),onPointerMove:fe(e.onPointerMove,xd(O=>{const A=O.target,V=z.current!==O.clientX;if(O.currentTarget.contains(A)&&V){const P=O.clientX>z.current?"right":"left";H.current=P,z.current=O.clientX}}))})))))))}),See=p.forwardRef((e,t)=>{const{__scopeMenu:n,...r}=e;return p.createElement(ze.div,W({},r,{ref:t}))}),ak="MenuItem",M2="menu.itemSelect",P_=p.forwardRef((e,t)=>{const{disabled:n=!1,onSelect:r,...a}=e,o=p.useRef(null),i=hf(ak,e.__scopeMenu),s=L_(ak,e.__scopeMenu),l=nt(t,o),c=p.useRef(!1),u=()=>{const d=o.current;if(!n&&d){const g=new CustomEvent(M2,{bubbles:!0,cancelable:!0});d.addEventListener(M2,m=>r==null?void 0:r(m),{once:!0}),WC(d,g),g.defaultPrevented?c.current=!1:i.onClose()}};return p.createElement(k7,W({},a,{ref:l,disabled:n,onClick:fe(e.onClick,u),onPointerDown:d=>{var g;(g=e.onPointerDown)===null||g===void 0||g.call(e,d),c.current=!0},onPointerUp:fe(e.onPointerUp,d=>{var g;c.current||(g=d.currentTarget)===null||g===void 0||g.click()}),onKeyDown:fe(e.onKeyDown,d=>{const g=s.searchRef.current!=="";n||g&&d.key===" "||rk.includes(d.key)&&(d.currentTarget.click(),d.preventDefault())})}))}),k7=p.forwardRef((e,t)=>{const{__scopeMenu:n,disabled:r=!1,textValue:a,...o}=e,i=L_(ak,n),s=w7(n),l=p.useRef(null),c=nt(t,l),[u,d]=p.useState(!1),[g,m]=p.useState("");return p.useEffect(()=>{const b=l.current;if(b){var y;m(((y=b.textContent)!==null&&y!==void 0?y:"").trim())}},[o.children]),p.createElement(Ed.ItemSlot,{scope:n,disabled:r,textValue:a??g},p.createElement(o7,W({asChild:!0},s,{focusable:!r}),p.createElement(ze.div,W({role:"menuitem","data-highlighted":u?"":void 0,"aria-disabled":r||void 0,"data-disabled":r?"":void 0},o,{ref:c,onPointerMove:fe(e.onPointerMove,xd(b=>{r?i.onItemLeave(b):(i.onItemEnter(b),b.defaultPrevented||b.currentTarget.focus())})),onPointerLeave:fe(e.onPointerLeave,xd(b=>i.onItemLeave(b))),onFocus:fe(e.onFocus,()=>d(!0)),onBlur:fe(e.onBlur,()=>d(!1))}))))}),wee=p.forwardRef((e,t)=>{const{checked:n=!1,onCheckedChange:r,...a}=e;return p.createElement(_7,{scope:e.__scopeMenu,checked:n},p.createElement(P_,W({role:"menuitemcheckbox","aria-checked":Pg(n)?"mixed":n},a,{ref:t,"data-state":$_(n),onSelect:fe(a.onSelect,()=>r==null?void 0:r(Pg(n)?!0:!n),{checkForDefaultPrevented:!1})})))}),Eee="MenuRadioGroup",[rTe,xee]=js(Eee,{value:void 0,onValueChange:()=>{}}),kee="MenuRadioItem",Cee=p.forwardRef((e,t)=>{const{value:n,...r}=e,a=xee(kee,e.__scopeMenu),o=n===a.value;return p.createElement(_7,{scope:e.__scopeMenu,checked:o},p.createElement(P_,W({role:"menuitemradio","aria-checked":o},r,{ref:t,"data-state":$_(o),onSelect:fe(r.onSelect,()=>{var i;return(i=a.onValueChange)===null||i===void 0?void 0:i.call(a,n)},{checkForDefaultPrevented:!1})})))}),C7="MenuItemIndicator",[_7,_ee]=js(C7,{checked:!1}),Aee=p.forwardRef((e,t)=>{const{__scopeMenu:n,forceMount:r,...a}=e,o=_ee(C7,n);return p.createElement(pr,{present:r||Pg(o.checked)||o.checked===!0},p.createElement(ze.span,W({},a,{ref:t,"data-state":$_(o.checked)})))}),Tee=p.forwardRef((e,t)=>{const{__scopeMenu:n,...r}=e;return p.createElement(ze.div,W({role:"separator","aria-orientation":"horizontal"},r,{ref:t}))}),Ree="MenuSub",[aTe,A7]=js(Ree),op="MenuSubTrigger",Nee=p.forwardRef((e,t)=>{const n=zs(op,e.__scopeMenu),r=hf(op,e.__scopeMenu),a=A7(op,e.__scopeMenu),o=L_(op,e.__scopeMenu),i=p.useRef(null),{pointerGraceTimerRef:s,onPointerGraceIntentChange:l}=o,c={__scopeMenu:e.__scopeMenu},u=p.useCallback(()=>{i.current&&window.clearTimeout(i.current),i.current=null},[]);return p.useEffect(()=>u,[u]),p.useEffect(()=>{const d=s.current;return()=>{window.clearTimeout(d),l(null)}},[s,l]),p.createElement(pee,W({asChild:!0},c),p.createElement(k7,W({id:a.triggerId,"aria-haspopup":"menu","aria-expanded":n.open,"aria-controls":a.contentId,"data-state":T7(n.open)},e,{ref:GC(t,a.onTriggerChange),onClick:d=>{var g;(g=e.onClick)===null||g===void 0||g.call(e,d),!(e.disabled||d.defaultPrevented)&&(d.currentTarget.focus(),n.open||n.onOpenChange(!0))},onPointerMove:fe(e.onPointerMove,xd(d=>{o.onItemEnter(d),!d.defaultPrevented&&!e.disabled&&!n.open&&!i.current&&(o.onPointerGraceIntentChange(null),i.current=window.setTimeout(()=>{n.onOpenChange(!0),u()},100))})),onPointerLeave:fe(e.onPointerLeave,xd(d=>{var g;u();const m=(g=n.content)===null||g===void 0?void 0:g.getBoundingClientRect();if(m){var b;const y=(b=n.content)===null||b===void 0?void 0:b.dataset.side,w=y==="right",v=w?-5:5,h=m[w?"left":"right"],S=m[w?"right":"left"];o.onPointerGraceIntentChange({area:[{x:d.clientX+v,y:d.clientY},{x:h,y:m.top},{x:S,y:m.top},{x:S,y:m.bottom},{x:h,y:m.bottom}],side:y}),window.clearTimeout(s.current),s.current=window.setTimeout(()=>o.onPointerGraceIntentChange(null),300)}else{if(o.onTriggerLeave(d),d.defaultPrevented)return;o.onPointerGraceIntentChange(null)}})),onKeyDown:fe(e.onKeyDown,d=>{const g=o.searchRef.current!=="";if(!(e.disabled||g&&d.key===" ")&&cee[r.dir].includes(d.key)){var m;n.onOpenChange(!0),(m=n.content)===null||m===void 0||m.focus(),d.preventDefault()}})})))}),Iee="MenuSubContent",Oee=p.forwardRef((e,t)=>{const n=x7(ga,e.__scopeMenu),{forceMount:r=n.forceMount,...a}=e,o=zs(ga,e.__scopeMenu),i=hf(ga,e.__scopeMenu),s=A7(Iee,e.__scopeMenu),l=p.useRef(null),c=nt(t,l);return p.createElement(Ed.Provider,{scope:e.__scopeMenu},p.createElement(pr,{present:r||o.open},p.createElement(Ed.Slot,{scope:e.__scopeMenu},p.createElement(M_,W({id:s.contentId,"aria-labelledby":s.triggerId},a,{ref:c,align:"start",side:i.dir==="rtl"?"left":"right",disableOutsidePointerEvents:!1,disableOutsideScroll:!1,trapFocus:!1,onOpenAutoFocus:u=>{var d;i.isUsingKeyboardRef.current&&((d=l.current)===null||d===void 0||d.focus()),u.preventDefault()},onCloseAutoFocus:u=>u.preventDefault(),onFocusOutside:fe(e.onFocusOutside,u=>{u.target!==s.trigger&&o.onOpenChange(!1)}),onEscapeKeyDown:fe(e.onEscapeKeyDown,u=>{i.onClose(),u.preventDefault()}),onKeyDown:fe(e.onKeyDown,u=>{const d=u.currentTarget.contains(u.target),g=uee[i.dir].includes(u.key);if(d&&g){var m;o.onOpenChange(!1),(m=s.trigger)===null||m===void 0||m.focus(),u.preventDefault()}})})))))});function T7(e){return e?"open":"closed"}function Pg(e){return e==="indeterminate"}function $_(e){return Pg(e)?"indeterminate":e?"checked":"unchecked"}function Dee(e){const t=document.activeElement;for(const n of e)if(n===t||(n.focus(),document.activeElement!==t))return}function Lee(e,t){return e.map((n,r)=>e[(t+r)%e.length])}function Mee(e,t,n){const a=t.length>1&&Array.from(t).every(c=>c===t[0])?t[0]:t,o=n?e.indexOf(n):-1;let i=Lee(e,Math.max(o,0));a.length===1&&(i=i.filter(c=>c!==n));const l=i.find(c=>c.toLowerCase().startsWith(a.toLowerCase()));return l!==n?l:void 0}function Pee(e,t){const{x:n,y:r}=e;let a=!1;for(let o=0,i=t.length-1;or!=u>r&&n<(c-s)*(r-l)/(u-l)+s&&(a=!a)}return a}function $ee(e,t){if(!t)return!1;const n={x:e.clientX,y:e.clientY};return Pee(n,t)}function xd(e){return t=>t.pointerType==="mouse"?e(t):void 0}const Fee=mee,jee=bee,zee=See,Uee=P_,Bee=wee,Hee=Cee,Vee=Aee,qee=Tee,Gee=Nee,Wee=Oee,R7="DropdownMenu",[Kee,oTe]=zn(R7,[v7]),Ga=v7(),[iTe,Yee]=Kee(R7),Zee=e=>{const{__scopeDropdownMenu:t,...n}=e,r=Ga(t);return p.createElement(Fee,W({},r,n))},Xee="DropdownMenuContent",Qee=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Yee(Xee,n),o=Ga(n),i=p.useRef(!1);return p.createElement(jee,W({id:a.contentId,"aria-labelledby":a.triggerId},o,r,{ref:t,onCloseAutoFocus:fe(e.onCloseAutoFocus,s=>{var l;i.current||(l=a.triggerRef.current)===null||l===void 0||l.focus(),i.current=!1,s.preventDefault()}),onInteractOutside:fe(e.onInteractOutside,s=>{const l=s.detail.originalEvent,c=l.button===0&&l.ctrlKey===!0,u=l.button===2||c;(!a.modal||u)&&(i.current=!0)}),style:{...e.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}}))}),Jee=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Ga(n);return p.createElement(zee,W({},a,r,{ref:t}))}),ete=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Ga(n);return p.createElement(Uee,W({},a,r,{ref:t}))}),tte=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Ga(n);return p.createElement(Bee,W({},a,r,{ref:t}))}),nte=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Ga(n);return p.createElement(Hee,W({},a,r,{ref:t}))}),rte=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Ga(n);return p.createElement(Vee,W({},a,r,{ref:t}))}),ate=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Ga(n);return p.createElement(qee,W({},a,r,{ref:t}))}),ote=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Ga(n);return p.createElement(Gee,W({},a,r,{ref:t}))}),ite=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Ga(n);return p.createElement(Wee,W({},a,r,{ref:t,style:{...e.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}}))}),ste=Zee,N7=Qee,I7=Jee,O7=ete,D7=tte,L7=nte,M7=rte,P7=ate,$7=ote,F7=ite,lte=p.forwardRef(({className:e,inset:t,children:n,...r},a)=>f.jsxs($7,{ref:a,className:ee("flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent",t&&"pl-8",e),...r,children:[n,f.jsx($m,{className:"ml-auto h-4 w-4"})]}));lte.displayName=$7.displayName;const cte=p.forwardRef(({className:e,...t},n)=>f.jsx(F7,{ref:n,className:ee("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...t}));cte.displayName=F7.displayName;const ute=p.forwardRef(({className:e,sideOffset:t=4,...n},r)=>f.jsx(ste,{children:f.jsx(N7,{ref:r,sideOffset:t,className:ee("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...n})}));ute.displayName=N7.displayName;const dte=p.forwardRef(({className:e,inset:t,...n},r)=>f.jsx(O7,{ref:r,className:ee("relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",t&&"pl-8",e),...n}));dte.displayName=O7.displayName;const fte=p.forwardRef(({className:e,children:t,checked:n,...r},a)=>f.jsxs(D7,{ref:a,className:ee("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),checked:n,...r,children:[f.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:f.jsx(M7,{children:f.jsx(Pm,{className:"h-4 w-4"})})}),t]}));fte.displayName=D7.displayName;const pte=p.forwardRef(({className:e,children:t,...n},r)=>f.jsxs(L7,{ref:r,className:ee("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),...n,children:[f.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:f.jsx(M7,{children:f.jsx(X4,{className:"h-2 w-2 fill-current"})})}),t]}));pte.displayName=L7.displayName;const gte=p.forwardRef(({className:e,inset:t,...n},r)=>f.jsx(I7,{ref:r,className:ee("px-2 py-1.5 text-sm font-semibold",t&&"pl-8",e),...n}));gte.displayName=I7.displayName;const mte=p.forwardRef(({className:e,...t},n)=>f.jsx(P7,{ref:n,className:ee("-mx-1 my-1 h-px bg-muted",e),...t}));mte.displayName=P7.displayName;function P2(e,[t,n]){return Math.min(n,Math.max(t,e))}function F_(e){const t=p.useRef({value:e,previous:e});return p.useMemo(()=>(t.current.value!==e&&(t.current.previous=t.current.value,t.current.value=e),t.current.previous),[e])}const hte=[" ","Enter","ArrowUp","ArrowDown"],bte=[" ","Enter"],lh="Select",[ch,j_,yte]=Nm(lh),[jc,sTe]=zn(lh,[yte,qa]),z_=qa(),[vte,Us]=jc(lh),[Ste,wte]=jc(lh),Ete=e=>{const{__scopeSelect:t,children:n,open:r,defaultOpen:a,onOpenChange:o,value:i,defaultValue:s,onValueChange:l,dir:c,name:u,autoComplete:d,disabled:g,required:m}=e,b=z_(t),[y,w]=p.useState(null),[v,h]=p.useState(null),[S,E]=p.useState(!1),k=x_(c),[x=!1,C]=Fa({prop:r,defaultProp:a,onChange:o}),[_,R]=Fa({prop:i,defaultProp:s,onChange:l}),T=p.useRef(null),L=y?!!y.closest("form"):!0,[D,H]=p.useState(new Set),z=Array.from(D).map(M=>M.props.value).join(";");return p.createElement(rh,b,p.createElement(vte,{required:m,scope:t,trigger:y,onTriggerChange:w,valueNode:v,onValueNodeChange:h,valueNodeHasChildren:S,onValueNodeHasChildrenChange:E,contentId:bi(),value:_,onValueChange:R,open:x,onOpenChange:C,dir:k,triggerPointerDownPosRef:T,disabled:g},p.createElement(ch.Provider,{scope:t},p.createElement(Ste,{scope:e.__scopeSelect,onNativeOptionAdd:p.useCallback(M=>{H(U=>new Set(U).add(M))},[]),onNativeOptionRemove:p.useCallback(M=>{H(U=>{const X=new Set(U);return X.delete(M),X})},[])},n)),L?p.createElement(B7,{key:z,"aria-hidden":!0,required:m,tabIndex:-1,name:u,autoComplete:d,value:_,onChange:M=>R(M.target.value),disabled:g},_===void 0?p.createElement("option",{value:""}):null,Array.from(D)):null))},xte="SelectTrigger",kte=p.forwardRef((e,t)=>{const{__scopeSelect:n,disabled:r=!1,...a}=e,o=z_(n),i=Us(xte,n),s=i.disabled||r,l=nt(t,i.onTriggerChange),c=j_(n),[u,d,g]=H7(b=>{const y=c().filter(h=>!h.disabled),w=y.find(h=>h.value===i.value),v=V7(y,b,w);v!==void 0&&i.onValueChange(v.value)}),m=()=>{s||(i.onOpenChange(!0),g())};return p.createElement(pf,W({asChild:!0},o),p.createElement(ze.button,W({type:"button",role:"combobox","aria-controls":i.contentId,"aria-expanded":i.open,"aria-required":i.required,"aria-autocomplete":"none",dir:i.dir,"data-state":i.open?"open":"closed",disabled:s,"data-disabled":s?"":void 0,"data-placeholder":U7(i.value)?"":void 0},a,{ref:l,onClick:fe(a.onClick,b=>{b.currentTarget.focus()}),onPointerDown:fe(a.onPointerDown,b=>{const y=b.target;y.hasPointerCapture(b.pointerId)&&y.releasePointerCapture(b.pointerId),b.button===0&&b.ctrlKey===!1&&(m(),i.triggerPointerDownPosRef.current={x:Math.round(b.pageX),y:Math.round(b.pageY)},b.preventDefault())}),onKeyDown:fe(a.onKeyDown,b=>{const y=u.current!=="";!(b.ctrlKey||b.altKey||b.metaKey)&&b.key.length===1&&d(b.key),!(y&&b.key===" ")&&hte.includes(b.key)&&(m(),b.preventDefault())})})))}),Cte="SelectValue",_te=p.forwardRef((e,t)=>{const{__scopeSelect:n,className:r,style:a,children:o,placeholder:i="",...s}=e,l=Us(Cte,n),{onValueNodeHasChildrenChange:c}=l,u=o!==void 0,d=nt(t,l.onValueNodeChange);return Zr(()=>{c(u)},[c,u]),p.createElement(ze.span,W({},s,{ref:d,style:{pointerEvents:"none"}}),U7(l.value)?p.createElement(p.Fragment,null,i):o)}),Ate=p.forwardRef((e,t)=>{const{__scopeSelect:n,children:r,...a}=e;return p.createElement(ze.span,W({"aria-hidden":!0},a,{ref:t}),r||"▼")}),Tte=e=>p.createElement(Jd,W({asChild:!0},e)),Sc="SelectContent",Rte=p.forwardRef((e,t)=>{const n=Us(Sc,e.__scopeSelect),[r,a]=p.useState();if(Zr(()=>{a(new DocumentFragment)},[]),!n.open){const o=r;return o?ba.createPortal(p.createElement(j7,{scope:e.__scopeSelect},p.createElement(ch.Slot,{scope:e.__scopeSelect},p.createElement("div",null,e.children))),o):null}return p.createElement(Nte,W({},e,{ref:t}))}),ro=10,[j7,uh]=jc(Sc),Nte=p.forwardRef((e,t)=>{const{__scopeSelect:n,position:r="item-aligned",onCloseAutoFocus:a,onEscapeKeyDown:o,onPointerDownOutside:i,side:s,sideOffset:l,align:c,alignOffset:u,arrowPadding:d,collisionBoundary:g,collisionPadding:m,sticky:b,hideWhenDetached:y,avoidCollisions:w,...v}=e,h=Us(Sc,n),[S,E]=p.useState(null),[k,x]=p.useState(null),C=nt(t,Q=>E(Q)),[_,R]=p.useState(null),[T,L]=p.useState(null),D=j_(n),[H,z]=p.useState(!1),M=p.useRef(!1);p.useEffect(()=>{if(S)return mf(S)},[S]),Jm();const U=p.useCallback(Q=>{const[pe,...he]=D().map(ke=>ke.ref.current),[re]=he.slice(-1),Ee=document.activeElement;for(const ke of Q)if(ke===Ee||(ke==null||ke.scrollIntoView({block:"nearest"}),ke===pe&&k&&(k.scrollTop=0),ke===re&&k&&(k.scrollTop=k.scrollHeight),ke==null||ke.focus(),document.activeElement!==Ee))return},[D,k]),X=p.useCallback(()=>U([_,S]),[U,_,S]);p.useEffect(()=>{H&&X()},[H,X]);const{onOpenChange:j,triggerPointerDownPosRef:O}=h;p.useEffect(()=>{if(S){let Q={x:0,y:0};const pe=re=>{var Ee,ke,We,Vt;Q={x:Math.abs(Math.round(re.pageX)-((Ee=(ke=O.current)===null||ke===void 0?void 0:ke.x)!==null&&Ee!==void 0?Ee:0)),y:Math.abs(Math.round(re.pageY)-((We=(Vt=O.current)===null||Vt===void 0?void 0:Vt.y)!==null&&We!==void 0?We:0))}},he=re=>{Q.x<=10&&Q.y<=10?re.preventDefault():S.contains(re.target)||j(!1),document.removeEventListener("pointermove",pe),O.current=null};return O.current!==null&&(document.addEventListener("pointermove",pe),document.addEventListener("pointerup",he,{capture:!0,once:!0})),()=>{document.removeEventListener("pointermove",pe),document.removeEventListener("pointerup",he,{capture:!0})}}},[S,j,O]),p.useEffect(()=>{const Q=()=>j(!1);return window.addEventListener("blur",Q),window.addEventListener("resize",Q),()=>{window.removeEventListener("blur",Q),window.removeEventListener("resize",Q)}},[j]);const[A,V]=H7(Q=>{const pe=D().filter(Ee=>!Ee.disabled),he=pe.find(Ee=>Ee.ref.current===document.activeElement),re=V7(pe,Q,he);re&&setTimeout(()=>re.ref.current.focus())}),P=p.useCallback((Q,pe,he)=>{const re=!M.current&&!he;(h.value!==void 0&&h.value===pe||re)&&(R(Q),re&&(M.current=!0))},[h.value]),N=p.useCallback(()=>S==null?void 0:S.focus(),[S]),K=p.useCallback((Q,pe,he)=>{const re=!M.current&&!he;(h.value!==void 0&&h.value===pe||re)&&L(Q)},[h.value]),ae=r==="popper"?$2:Ite,ne=ae===$2?{side:s,sideOffset:l,align:c,alignOffset:u,arrowPadding:d,collisionBoundary:g,collisionPadding:m,sticky:b,hideWhenDetached:y,avoidCollisions:w}:{};return p.createElement(j7,{scope:n,content:S,viewport:k,onViewportChange:x,itemRefCallback:P,selectedItem:_,onItemLeave:N,itemTextRefCallback:K,focusSelectedItem:X,selectedItemText:T,position:r,isPositioned:H,searchRef:A},p.createElement(ih,{as:$a,allowPinchZoom:!0},p.createElement(eh,{asChild:!0,trapped:h.open,onMountAutoFocus:Q=>{Q.preventDefault()},onUnmountAutoFocus:fe(a,Q=>{var pe;(pe=h.trigger)===null||pe===void 0||pe.focus({preventScroll:!0}),Q.preventDefault()})},p.createElement(Ls,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:o,onPointerDownOutside:i,onFocusOutside:Q=>Q.preventDefault(),onDismiss:()=>h.onOpenChange(!1)},p.createElement(ae,W({role:"listbox",id:h.contentId,"data-state":h.open?"open":"closed",dir:h.dir,onContextMenu:Q=>Q.preventDefault()},v,ne,{onPlaced:()=>z(!0),ref:C,style:{display:"flex",flexDirection:"column",outline:"none",...v.style},onKeyDown:fe(v.onKeyDown,Q=>{const pe=Q.ctrlKey||Q.altKey||Q.metaKey;if(Q.key==="Tab"&&Q.preventDefault(),!pe&&Q.key.length===1&&V(Q.key),["ArrowUp","ArrowDown","Home","End"].includes(Q.key)){let re=D().filter(Ee=>!Ee.disabled).map(Ee=>Ee.ref.current);if(["ArrowUp","End"].includes(Q.key)&&(re=re.slice().reverse()),["ArrowUp","ArrowDown"].includes(Q.key)){const Ee=Q.target,ke=re.indexOf(Ee);re=re.slice(ke+1)}setTimeout(()=>U(re)),Q.preventDefault()}})}))))))}),Ite=p.forwardRef((e,t)=>{const{__scopeSelect:n,onPlaced:r,...a}=e,o=Us(Sc,n),i=uh(Sc,n),[s,l]=p.useState(null),[c,u]=p.useState(null),d=nt(t,C=>u(C)),g=j_(n),m=p.useRef(!1),b=p.useRef(!0),{viewport:y,selectedItem:w,selectedItemText:v,focusSelectedItem:h}=i,S=p.useCallback(()=>{if(o.trigger&&o.valueNode&&s&&c&&y&&w&&v){const C=o.trigger.getBoundingClientRect(),_=c.getBoundingClientRect(),R=o.valueNode.getBoundingClientRect(),T=v.getBoundingClientRect();if(o.dir!=="rtl"){const Ee=T.left-_.left,ke=R.left-Ee,We=C.left-ke,Vt=C.width+We,mt=Math.max(Vt,_.width),Hn=window.innerWidth-ro,F=P2(ke,[ro,Hn-mt]);s.style.minWidth=Vt+"px",s.style.left=F+"px"}else{const Ee=_.right-T.right,ke=window.innerWidth-R.right-Ee,We=window.innerWidth-C.right-ke,Vt=C.width+We,mt=Math.max(Vt,_.width),Hn=window.innerWidth-ro,F=P2(ke,[ro,Hn-mt]);s.style.minWidth=Vt+"px",s.style.right=F+"px"}const L=g(),D=window.innerHeight-ro*2,H=y.scrollHeight,z=window.getComputedStyle(c),M=parseInt(z.borderTopWidth,10),U=parseInt(z.paddingTop,10),X=parseInt(z.borderBottomWidth,10),j=parseInt(z.paddingBottom,10),O=M+U+H+j+X,A=Math.min(w.offsetHeight*5,O),V=window.getComputedStyle(y),P=parseInt(V.paddingTop,10),N=parseInt(V.paddingBottom,10),K=C.top+C.height/2-ro,ae=D-K,ne=w.offsetHeight/2,Q=w.offsetTop+ne,pe=M+U+Q,he=O-pe;if(pe<=K){const Ee=w===L[L.length-1].ref.current;s.style.bottom="0px";const ke=c.clientHeight-y.offsetTop-y.offsetHeight,We=Math.max(ae,ne+(Ee?N:0)+ke+X),Vt=pe+We;s.style.height=Vt+"px"}else{const Ee=w===L[0].ref.current;s.style.top="0px";const We=Math.max(K,M+y.offsetTop+(Ee?P:0)+ne)+he;s.style.height=We+"px",y.scrollTop=pe-K+y.offsetTop}s.style.margin=`${ro}px 0`,s.style.minHeight=A+"px",s.style.maxHeight=D+"px",r==null||r(),requestAnimationFrame(()=>m.current=!0)}},[g,o.trigger,o.valueNode,s,c,y,w,v,o.dir,r]);Zr(()=>S(),[S]);const[E,k]=p.useState();Zr(()=>{c&&k(window.getComputedStyle(c).zIndex)},[c]);const x=p.useCallback(C=>{C&&b.current===!0&&(S(),h==null||h(),b.current=!1)},[S,h]);return p.createElement(Ote,{scope:n,contentWrapper:s,shouldExpandOnScrollRef:m,onScrollButtonChange:x},p.createElement("div",{ref:l,style:{display:"flex",flexDirection:"column",position:"fixed",zIndex:E}},p.createElement(ze.div,W({},a,{ref:d,style:{boxSizing:"border-box",maxHeight:"100%",...a.style}}))))}),$2=p.forwardRef((e,t)=>{const{__scopeSelect:n,align:r="start",collisionPadding:a=ro,...o}=e,i=z_(n);return p.createElement(gf,W({},i,o,{ref:t,align:r,collisionPadding:a,style:{boxSizing:"border-box",...o.style,"--radix-select-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-select-content-available-width":"var(--radix-popper-available-width)","--radix-select-content-available-height":"var(--radix-popper-available-height)","--radix-select-trigger-width":"var(--radix-popper-anchor-width)","--radix-select-trigger-height":"var(--radix-popper-anchor-height)"}}))}),[Ote,Dte]=jc(Sc,{}),F2="SelectViewport",Lte=p.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e,a=uh(F2,n),o=Dte(F2,n),i=nt(t,a.onViewportChange),s=p.useRef(0);return p.createElement(p.Fragment,null,p.createElement("style",{dangerouslySetInnerHTML:{__html:"[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}"}}),p.createElement(ch.Slot,{scope:n},p.createElement(ze.div,W({"data-radix-select-viewport":"",role:"presentation"},r,{ref:i,style:{position:"relative",flex:1,overflow:"auto",...r.style},onScroll:fe(r.onScroll,l=>{const c=l.currentTarget,{contentWrapper:u,shouldExpandOnScrollRef:d}=o;if(d!=null&&d.current&&u){const g=Math.abs(s.current-c.scrollTop);if(g>0){const m=window.innerHeight-ro*2,b=parseFloat(u.style.minHeight),y=parseFloat(u.style.height),w=Math.max(b,y);if(w0?S:0,u.style.justifyContent="flex-end")}}}s.current=c.scrollTop})}))))}),Mte="SelectGroup",[lTe,Pte]=jc(Mte),$te="SelectLabel",Fte=p.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e,a=Pte($te,n);return p.createElement(ze.div,W({id:a.id},r,{ref:t}))}),ok="SelectItem",[jte,z7]=jc(ok),zte=p.forwardRef((e,t)=>{const{__scopeSelect:n,value:r,disabled:a=!1,textValue:o,...i}=e,s=Us(ok,n),l=uh(ok,n),c=s.value===r,[u,d]=p.useState(o??""),[g,m]=p.useState(!1),b=nt(t,v=>{var h;return(h=l.itemRefCallback)===null||h===void 0?void 0:h.call(l,v,r,a)}),y=bi(),w=()=>{a||(s.onValueChange(r),s.onOpenChange(!1))};if(r==="")throw new Error("A must have a value prop that is not an empty string. This is because the Select value can be set to an empty string to clear the selection and show the placeholder.");return p.createElement(jte,{scope:n,value:r,disabled:a,textId:y,isSelected:c,onItemTextChange:p.useCallback(v=>{d(h=>{var S;return h||((S=v==null?void 0:v.textContent)!==null&&S!==void 0?S:"").trim()})},[])},p.createElement(ch.ItemSlot,{scope:n,value:r,disabled:a,textValue:u},p.createElement(ze.div,W({role:"option","aria-labelledby":y,"data-highlighted":g?"":void 0,"aria-selected":c&&g,"data-state":c?"checked":"unchecked","aria-disabled":a||void 0,"data-disabled":a?"":void 0,tabIndex:a?void 0:-1},i,{ref:b,onFocus:fe(i.onFocus,()=>m(!0)),onBlur:fe(i.onBlur,()=>m(!1)),onPointerUp:fe(i.onPointerUp,w),onPointerMove:fe(i.onPointerMove,v=>{if(a){var h;(h=l.onItemLeave)===null||h===void 0||h.call(l)}else v.currentTarget.focus({preventScroll:!0})}),onPointerLeave:fe(i.onPointerLeave,v=>{if(v.currentTarget===document.activeElement){var h;(h=l.onItemLeave)===null||h===void 0||h.call(l)}}),onKeyDown:fe(i.onKeyDown,v=>{var h;((h=l.searchRef)===null||h===void 0?void 0:h.current)!==""&&v.key===" "||(bte.includes(v.key)&&w(),v.key===" "&&v.preventDefault())})}))))}),ip="SelectItemText",Ute=p.forwardRef((e,t)=>{const{__scopeSelect:n,className:r,style:a,...o}=e,i=Us(ip,n),s=uh(ip,n),l=z7(ip,n),c=wte(ip,n),[u,d]=p.useState(null),g=nt(t,v=>d(v),l.onItemTextChange,v=>{var h;return(h=s.itemTextRefCallback)===null||h===void 0?void 0:h.call(s,v,l.value,l.disabled)}),m=u==null?void 0:u.textContent,b=p.useMemo(()=>p.createElement("option",{key:l.value,value:l.value,disabled:l.disabled},m),[l.disabled,l.value,m]),{onNativeOptionAdd:y,onNativeOptionRemove:w}=c;return Zr(()=>(y(b),()=>w(b)),[y,w,b]),p.createElement(p.Fragment,null,p.createElement(ze.span,W({id:l.textId},o,{ref:g})),l.isSelected&&i.valueNode&&!i.valueNodeHasChildren?ba.createPortal(o.children,i.valueNode):null)}),Bte="SelectItemIndicator",Hte=p.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e;return z7(Bte,n).isSelected?p.createElement(ze.span,W({"aria-hidden":!0},r,{ref:t})):null}),Vte=p.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e;return p.createElement(ze.div,W({"aria-hidden":!0},r,{ref:t}))});function U7(e){return e===""||e===void 0}const B7=p.forwardRef((e,t)=>{const{value:n,...r}=e,a=p.useRef(null),o=nt(t,a),i=F_(n);return p.useEffect(()=>{const s=a.current,l=window.HTMLSelectElement.prototype,u=Object.getOwnPropertyDescriptor(l,"value").set;if(i!==n&&u){const d=new Event("change",{bubbles:!0});u.call(s,n),s.dispatchEvent(d)}},[i,n]),p.createElement(Im,{asChild:!0},p.createElement("select",W({},r,{ref:o,defaultValue:n})))});B7.displayName="BubbleSelect";function H7(e){const t=ur(e),n=p.useRef(""),r=p.useRef(0),a=p.useCallback(i=>{const s=n.current+i;t(s),function l(c){n.current=c,window.clearTimeout(r.current),c!==""&&(r.current=window.setTimeout(()=>l(""),1e3))}(s)},[t]),o=p.useCallback(()=>{n.current="",window.clearTimeout(r.current)},[]);return p.useEffect(()=>()=>window.clearTimeout(r.current),[]),[n,a,o]}function V7(e,t,n){const a=t.length>1&&Array.from(t).every(c=>c===t[0])?t[0]:t,o=n?e.indexOf(n):-1;let i=qte(e,Math.max(o,0));a.length===1&&(i=i.filter(c=>c!==n));const l=i.find(c=>c.textValue.toLowerCase().startsWith(a.toLowerCase()));return l!==n?l:void 0}function qte(e,t){return e.map((n,r)=>e[(t+r)%e.length])}const Gte=Ete,q7=kte,Wte=_te,Kte=Ate,Yte=Tte,G7=Rte,Zte=Lte,W7=Fte,K7=zte,Xte=Ute,Qte=Hte,Y7=Vte,So=Gte,wo=Wte,za=p.forwardRef(({className:e,children:t,...n},r)=>f.jsxs(q7,{ref:r,className:ee("flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),...n,children:[t,f.jsx(Kte,{asChild:!0,children:f.jsx(YC,{className:"h-4 w-4 opacity-50"})})]}));za.displayName=q7.displayName;const Ua=p.forwardRef(({className:e,children:t,position:n="popper",...r},a)=>f.jsx(Yte,{children:f.jsx(G7,{ref:a,className:ee("relative z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",n==="popper"&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",e),position:n,...r,children:f.jsx(Zte,{className:ee("p-1",n==="popper"&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"),children:t})})}));Ua.displayName=G7.displayName;const Jte=p.forwardRef(({className:e,...t},n)=>f.jsx(W7,{ref:n,className:ee("py-1.5 pl-8 pr-2 text-sm font-semibold",e),...t}));Jte.displayName=W7.displayName;const Fn=p.forwardRef(({className:e,children:t,...n},r)=>f.jsxs(K7,{ref:r,className:ee("relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),...n,children:[f.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:f.jsx(Qte,{children:f.jsx(Pm,{className:"h-4 w-4"})})}),f.jsx(Xte,{children:t})]}));Fn.displayName=K7.displayName;const ene=p.forwardRef(({className:e,...t},n)=>f.jsx(Y7,{ref:n,className:ee("-mx-1 my-1 h-px bg-muted",e),...t}));ene.displayName=Y7.displayName;function Ts(e){"@babel/helpers - typeof";return Ts=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ts(e)}function _i(e){if(e===null||e===!0||e===!1)return NaN;var t=Number(e);return isNaN(t)?t:t<0?Math.ceil(t):Math.floor(t)}function Un(e,t){if(t.length1?"s":"")+" required, but only "+t.length+" present")}function Wa(e){Un(1,arguments);var t=Object.prototype.toString.call(e);return e instanceof Date||Ts(e)==="object"&&t==="[object Date]"?new Date(e.getTime()):typeof e=="number"||t==="[object Number]"?new Date(e):((typeof e=="string"||t==="[object String]")&&typeof console<"u"&&(console.warn("Starting with v2.0.0-beta.1 date-fns doesn't accept strings as date arguments. Please use `parseISO` to parse strings. See: https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#string-arguments"),console.warn(new Error().stack)),new Date(NaN))}function tne(e,t){Un(2,arguments);var n=Wa(e).getTime(),r=_i(t);return new Date(n+r)}var nne={};function dh(){return nne}function rne(e){var t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()));return t.setUTCFullYear(e.getFullYear()),e.getTime()-t.getTime()}var Z7=6e4,X7=36e5;function ane(e){return Un(1,arguments),e instanceof Date||Ts(e)==="object"&&Object.prototype.toString.call(e)==="[object Date]"}function one(e){if(Un(1,arguments),!ane(e)&&typeof e!="number")return!1;var t=Wa(e);return!isNaN(Number(t))}function ine(e,t){Un(2,arguments);var n=_i(t);return tne(e,-n)}var sne=864e5;function lne(e){Un(1,arguments);var t=Wa(e),n=t.getTime();t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0);var r=t.getTime(),a=n-r;return Math.floor(a/sne)+1}function $g(e){Un(1,arguments);var t=1,n=Wa(e),r=n.getUTCDay(),a=(r=a.getTime()?n+1:t.getTime()>=i.getTime()?n:n-1}function cne(e){Un(1,arguments);var t=Q7(e),n=new Date(0);n.setUTCFullYear(t,0,4),n.setUTCHours(0,0,0,0);var r=$g(n);return r}var une=6048e5;function dne(e){Un(1,arguments);var t=Wa(e),n=$g(t).getTime()-cne(t).getTime();return Math.round(n/une)+1}function Fg(e,t){var n,r,a,o,i,s,l,c;Un(1,arguments);var u=dh(),d=_i((n=(r=(a=(o=t==null?void 0:t.weekStartsOn)!==null&&o!==void 0?o:t==null||(i=t.locale)===null||i===void 0||(s=i.options)===null||s===void 0?void 0:s.weekStartsOn)!==null&&a!==void 0?a:u.weekStartsOn)!==null&&r!==void 0?r:(l=u.locale)===null||l===void 0||(c=l.options)===null||c===void 0?void 0:c.weekStartsOn)!==null&&n!==void 0?n:0);if(!(d>=0&&d<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");var g=Wa(e),m=g.getUTCDay(),b=(m=1&&m<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var b=new Date(0);b.setUTCFullYear(d+1,0,m),b.setUTCHours(0,0,0,0);var y=Fg(b,t),w=new Date(0);w.setUTCFullYear(d,0,m),w.setUTCHours(0,0,0,0);var v=Fg(w,t);return u.getTime()>=y.getTime()?d+1:u.getTime()>=v.getTime()?d:d-1}function fne(e,t){var n,r,a,o,i,s,l,c;Un(1,arguments);var u=dh(),d=_i((n=(r=(a=(o=t==null?void 0:t.firstWeekContainsDate)!==null&&o!==void 0?o:t==null||(i=t.locale)===null||i===void 0||(s=i.options)===null||s===void 0?void 0:s.firstWeekContainsDate)!==null&&a!==void 0?a:u.firstWeekContainsDate)!==null&&r!==void 0?r:(l=u.locale)===null||l===void 0||(c=l.options)===null||c===void 0?void 0:c.firstWeekContainsDate)!==null&&n!==void 0?n:1),g=J7(e,t),m=new Date(0);m.setUTCFullYear(g,0,d),m.setUTCHours(0,0,0,0);var b=Fg(m,t);return b}var pne=6048e5;function gne(e,t){Un(1,arguments);var n=Wa(e),r=Fg(n,t).getTime()-fne(n,t).getTime();return Math.round(r/pne)+1}function bt(e,t){for(var n=e<0?"-":"",r=Math.abs(e).toString();r.length0?r:1-r;return bt(n==="yy"?a%100:a,n.length)},M:function(t,n){var r=t.getUTCMonth();return n==="M"?String(r+1):bt(r+1,2)},d:function(t,n){return bt(t.getUTCDate(),n.length)},a:function(t,n){var r=t.getUTCHours()/12>=1?"pm":"am";switch(n){case"a":case"aa":return r.toUpperCase();case"aaa":return r;case"aaaaa":return r[0];case"aaaa":default:return r==="am"?"a.m.":"p.m."}},h:function(t,n){return bt(t.getUTCHours()%12||12,n.length)},H:function(t,n){return bt(t.getUTCHours(),n.length)},m:function(t,n){return bt(t.getUTCMinutes(),n.length)},s:function(t,n){return bt(t.getUTCSeconds(),n.length)},S:function(t,n){var r=n.length,a=t.getUTCMilliseconds(),o=Math.floor(a*Math.pow(10,r-3));return bt(o,n.length)}};const Po=mne;var tl={am:"am",pm:"pm",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},hne={G:function(t,n,r){var a=t.getUTCFullYear()>0?1:0;switch(n){case"G":case"GG":case"GGG":return r.era(a,{width:"abbreviated"});case"GGGGG":return r.era(a,{width:"narrow"});case"GGGG":default:return r.era(a,{width:"wide"})}},y:function(t,n,r){if(n==="yo"){var a=t.getUTCFullYear(),o=a>0?a:1-a;return r.ordinalNumber(o,{unit:"year"})}return Po.y(t,n)},Y:function(t,n,r,a){var o=J7(t,a),i=o>0?o:1-o;if(n==="YY"){var s=i%100;return bt(s,2)}return n==="Yo"?r.ordinalNumber(i,{unit:"year"}):bt(i,n.length)},R:function(t,n){var r=Q7(t);return bt(r,n.length)},u:function(t,n){var r=t.getUTCFullYear();return bt(r,n.length)},Q:function(t,n,r){var a=Math.ceil((t.getUTCMonth()+1)/3);switch(n){case"Q":return String(a);case"QQ":return bt(a,2);case"Qo":return r.ordinalNumber(a,{unit:"quarter"});case"QQQ":return r.quarter(a,{width:"abbreviated",context:"formatting"});case"QQQQQ":return r.quarter(a,{width:"narrow",context:"formatting"});case"QQQQ":default:return r.quarter(a,{width:"wide",context:"formatting"})}},q:function(t,n,r){var a=Math.ceil((t.getUTCMonth()+1)/3);switch(n){case"q":return String(a);case"qq":return bt(a,2);case"qo":return r.ordinalNumber(a,{unit:"quarter"});case"qqq":return r.quarter(a,{width:"abbreviated",context:"standalone"});case"qqqqq":return r.quarter(a,{width:"narrow",context:"standalone"});case"qqqq":default:return r.quarter(a,{width:"wide",context:"standalone"})}},M:function(t,n,r){var a=t.getUTCMonth();switch(n){case"M":case"MM":return Po.M(t,n);case"Mo":return r.ordinalNumber(a+1,{unit:"month"});case"MMM":return r.month(a,{width:"abbreviated",context:"formatting"});case"MMMMM":return r.month(a,{width:"narrow",context:"formatting"});case"MMMM":default:return r.month(a,{width:"wide",context:"formatting"})}},L:function(t,n,r){var a=t.getUTCMonth();switch(n){case"L":return String(a+1);case"LL":return bt(a+1,2);case"Lo":return r.ordinalNumber(a+1,{unit:"month"});case"LLL":return r.month(a,{width:"abbreviated",context:"standalone"});case"LLLLL":return r.month(a,{width:"narrow",context:"standalone"});case"LLLL":default:return r.month(a,{width:"wide",context:"standalone"})}},w:function(t,n,r,a){var o=gne(t,a);return n==="wo"?r.ordinalNumber(o,{unit:"week"}):bt(o,n.length)},I:function(t,n,r){var a=dne(t);return n==="Io"?r.ordinalNumber(a,{unit:"week"}):bt(a,n.length)},d:function(t,n,r){return n==="do"?r.ordinalNumber(t.getUTCDate(),{unit:"date"}):Po.d(t,n)},D:function(t,n,r){var a=lne(t);return n==="Do"?r.ordinalNumber(a,{unit:"dayOfYear"}):bt(a,n.length)},E:function(t,n,r){var a=t.getUTCDay();switch(n){case"E":case"EE":case"EEE":return r.day(a,{width:"abbreviated",context:"formatting"});case"EEEEE":return r.day(a,{width:"narrow",context:"formatting"});case"EEEEEE":return r.day(a,{width:"short",context:"formatting"});case"EEEE":default:return r.day(a,{width:"wide",context:"formatting"})}},e:function(t,n,r,a){var o=t.getUTCDay(),i=(o-a.weekStartsOn+8)%7||7;switch(n){case"e":return String(i);case"ee":return bt(i,2);case"eo":return r.ordinalNumber(i,{unit:"day"});case"eee":return r.day(o,{width:"abbreviated",context:"formatting"});case"eeeee":return r.day(o,{width:"narrow",context:"formatting"});case"eeeeee":return r.day(o,{width:"short",context:"formatting"});case"eeee":default:return r.day(o,{width:"wide",context:"formatting"})}},c:function(t,n,r,a){var o=t.getUTCDay(),i=(o-a.weekStartsOn+8)%7||7;switch(n){case"c":return String(i);case"cc":return bt(i,n.length);case"co":return r.ordinalNumber(i,{unit:"day"});case"ccc":return r.day(o,{width:"abbreviated",context:"standalone"});case"ccccc":return r.day(o,{width:"narrow",context:"standalone"});case"cccccc":return r.day(o,{width:"short",context:"standalone"});case"cccc":default:return r.day(o,{width:"wide",context:"standalone"})}},i:function(t,n,r){var a=t.getUTCDay(),o=a===0?7:a;switch(n){case"i":return String(o);case"ii":return bt(o,n.length);case"io":return r.ordinalNumber(o,{unit:"day"});case"iii":return r.day(a,{width:"abbreviated",context:"formatting"});case"iiiii":return r.day(a,{width:"narrow",context:"formatting"});case"iiiiii":return r.day(a,{width:"short",context:"formatting"});case"iiii":default:return r.day(a,{width:"wide",context:"formatting"})}},a:function(t,n,r){var a=t.getUTCHours(),o=a/12>=1?"pm":"am";switch(n){case"a":case"aa":return r.dayPeriod(o,{width:"abbreviated",context:"formatting"});case"aaa":return r.dayPeriod(o,{width:"abbreviated",context:"formatting"}).toLowerCase();case"aaaaa":return r.dayPeriod(o,{width:"narrow",context:"formatting"});case"aaaa":default:return r.dayPeriod(o,{width:"wide",context:"formatting"})}},b:function(t,n,r){var a=t.getUTCHours(),o;switch(a===12?o=tl.noon:a===0?o=tl.midnight:o=a/12>=1?"pm":"am",n){case"b":case"bb":return r.dayPeriod(o,{width:"abbreviated",context:"formatting"});case"bbb":return r.dayPeriod(o,{width:"abbreviated",context:"formatting"}).toLowerCase();case"bbbbb":return r.dayPeriod(o,{width:"narrow",context:"formatting"});case"bbbb":default:return r.dayPeriod(o,{width:"wide",context:"formatting"})}},B:function(t,n,r){var a=t.getUTCHours(),o;switch(a>=17?o=tl.evening:a>=12?o=tl.afternoon:a>=4?o=tl.morning:o=tl.night,n){case"B":case"BB":case"BBB":return r.dayPeriod(o,{width:"abbreviated",context:"formatting"});case"BBBBB":return r.dayPeriod(o,{width:"narrow",context:"formatting"});case"BBBB":default:return r.dayPeriod(o,{width:"wide",context:"formatting"})}},h:function(t,n,r){if(n==="ho"){var a=t.getUTCHours()%12;return a===0&&(a=12),r.ordinalNumber(a,{unit:"hour"})}return Po.h(t,n)},H:function(t,n,r){return n==="Ho"?r.ordinalNumber(t.getUTCHours(),{unit:"hour"}):Po.H(t,n)},K:function(t,n,r){var a=t.getUTCHours()%12;return n==="Ko"?r.ordinalNumber(a,{unit:"hour"}):bt(a,n.length)},k:function(t,n,r){var a=t.getUTCHours();return a===0&&(a=24),n==="ko"?r.ordinalNumber(a,{unit:"hour"}):bt(a,n.length)},m:function(t,n,r){return n==="mo"?r.ordinalNumber(t.getUTCMinutes(),{unit:"minute"}):Po.m(t,n)},s:function(t,n,r){return n==="so"?r.ordinalNumber(t.getUTCSeconds(),{unit:"second"}):Po.s(t,n)},S:function(t,n){return Po.S(t,n)},X:function(t,n,r,a){var o=a._originalDate||t,i=o.getTimezoneOffset();if(i===0)return"Z";switch(n){case"X":return z2(i);case"XXXX":case"XX":return Ki(i);case"XXXXX":case"XXX":default:return Ki(i,":")}},x:function(t,n,r,a){var o=a._originalDate||t,i=o.getTimezoneOffset();switch(n){case"x":return z2(i);case"xxxx":case"xx":return Ki(i);case"xxxxx":case"xxx":default:return Ki(i,":")}},O:function(t,n,r,a){var o=a._originalDate||t,i=o.getTimezoneOffset();switch(n){case"O":case"OO":case"OOO":return"GMT"+j2(i,":");case"OOOO":default:return"GMT"+Ki(i,":")}},z:function(t,n,r,a){var o=a._originalDate||t,i=o.getTimezoneOffset();switch(n){case"z":case"zz":case"zzz":return"GMT"+j2(i,":");case"zzzz":default:return"GMT"+Ki(i,":")}},t:function(t,n,r,a){var o=a._originalDate||t,i=Math.floor(o.getTime()/1e3);return bt(i,n.length)},T:function(t,n,r,a){var o=a._originalDate||t,i=o.getTime();return bt(i,n.length)}};function j2(e,t){var n=e>0?"-":"+",r=Math.abs(e),a=Math.floor(r/60),o=r%60;if(o===0)return n+String(a);var i=t||"";return n+String(a)+i+bt(o,2)}function z2(e,t){if(e%60===0){var n=e>0?"-":"+";return n+bt(Math.abs(e)/60,2)}return Ki(e,t)}function Ki(e,t){var n=t||"",r=e>0?"-":"+",a=Math.abs(e),o=bt(Math.floor(a/60),2),i=bt(a%60,2);return r+o+n+i}const bne=hne;var U2=function(t,n){switch(t){case"P":return n.date({width:"short"});case"PP":return n.date({width:"medium"});case"PPP":return n.date({width:"long"});case"PPPP":default:return n.date({width:"full"})}},e8=function(t,n){switch(t){case"p":return n.time({width:"short"});case"pp":return n.time({width:"medium"});case"ppp":return n.time({width:"long"});case"pppp":default:return n.time({width:"full"})}},yne=function(t,n){var r=t.match(/(P+)(p+)?/)||[],a=r[1],o=r[2];if(!o)return U2(t,n);var i;switch(a){case"P":i=n.dateTime({width:"short"});break;case"PP":i=n.dateTime({width:"medium"});break;case"PPP":i=n.dateTime({width:"long"});break;case"PPPP":default:i=n.dateTime({width:"full"});break}return i.replace("{{date}}",U2(a,n)).replace("{{time}}",e8(o,n))},vne={p:e8,P:yne};const Sne=vne;var wne=["D","DD"],Ene=["YY","YYYY"];function xne(e){return wne.indexOf(e)!==-1}function kne(e){return Ene.indexOf(e)!==-1}function B2(e,t,n){if(e==="YYYY")throw new RangeError("Use `yyyy` instead of `YYYY` (in `".concat(t,"`) for formatting years to the input `").concat(n,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));if(e==="YY")throw new RangeError("Use `yy` instead of `YY` (in `".concat(t,"`) for formatting years to the input `").concat(n,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));if(e==="D")throw new RangeError("Use `d` instead of `D` (in `".concat(t,"`) for formatting days of the month to the input `").concat(n,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));if(e==="DD")throw new RangeError("Use `dd` instead of `DD` (in `".concat(t,"`) for formatting days of the month to the input `").concat(n,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"))}var Cne={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}},_ne=function(t,n,r){var a,o=Cne[t];return typeof o=="string"?a=o:n===1?a=o.one:a=o.other.replace("{{count}}",n.toString()),r!=null&&r.addSuffix?r.comparison&&r.comparison>0?"in "+a:a+" ago":a};const Ane=_ne;function Vb(e){return function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},n=t.width?String(t.width):e.defaultWidth,r=e.formats[n]||e.formats[e.defaultWidth];return r}}var Tne={full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},Rne={full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},Nne={full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},Ine={date:Vb({formats:Tne,defaultWidth:"full"}),time:Vb({formats:Rne,defaultWidth:"full"}),dateTime:Vb({formats:Nne,defaultWidth:"full"})};const One=Ine;var Dne={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"},Lne=function(t,n,r,a){return Dne[t]};const Mne=Lne;function uu(e){return function(t,n){var r=n!=null&&n.context?String(n.context):"standalone",a;if(r==="formatting"&&e.formattingValues){var o=e.defaultFormattingWidth||e.defaultWidth,i=n!=null&&n.width?String(n.width):o;a=e.formattingValues[i]||e.formattingValues[o]}else{var s=e.defaultWidth,l=n!=null&&n.width?String(n.width):e.defaultWidth;a=e.values[l]||e.values[s]}var c=e.argumentCallback?e.argumentCallback(t):t;return a[c]}}var Pne={narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},$ne={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},Fne={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},jne={narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},zne={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},Une={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},Bne=function(t,n){var r=Number(t),a=r%100;if(a>20||a<10)switch(a%10){case 1:return r+"st";case 2:return r+"nd";case 3:return r+"rd"}return r+"th"},Hne={ordinalNumber:Bne,era:uu({values:Pne,defaultWidth:"wide"}),quarter:uu({values:$ne,defaultWidth:"wide",argumentCallback:function(t){return t-1}}),month:uu({values:Fne,defaultWidth:"wide"}),day:uu({values:jne,defaultWidth:"wide"}),dayPeriod:uu({values:zne,defaultWidth:"wide",formattingValues:Une,defaultFormattingWidth:"wide"})};const Vne=Hne;function du(e){return function(t){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},r=n.width,a=r&&e.matchPatterns[r]||e.matchPatterns[e.defaultMatchWidth],o=t.match(a);if(!o)return null;var i=o[0],s=r&&e.parsePatterns[r]||e.parsePatterns[e.defaultParseWidth],l=Array.isArray(s)?Gne(s,function(d){return d.test(i)}):qne(s,function(d){return d.test(i)}),c;c=e.valueCallback?e.valueCallback(l):l,c=n.valueCallback?n.valueCallback(c):c;var u=t.slice(i.length);return{value:c,rest:u}}}function qne(e,t){for(var n in e)if(e.hasOwnProperty(n)&&t(e[n]))return n}function Gne(e,t){for(var n=0;n1&&arguments[1]!==void 0?arguments[1]:{},r=t.match(e.matchPattern);if(!r)return null;var a=r[0],o=t.match(e.parsePattern);if(!o)return null;var i=e.valueCallback?e.valueCallback(o[0]):o[0];i=n.valueCallback?n.valueCallback(i):i;var s=t.slice(a.length);return{value:i,rest:s}}}var Kne=/^(\d+)(th|st|nd|rd)?/i,Yne=/\d+/i,Zne={narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},Xne={any:[/^b/i,/^(a|c)/i]},Qne={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},Jne={any:[/1/i,/2/i,/3/i,/4/i]},ere={narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},tre={narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},nre={narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},rre={narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},are={narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},ore={any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},ire={ordinalNumber:Wne({matchPattern:Kne,parsePattern:Yne,valueCallback:function(t){return parseInt(t,10)}}),era:du({matchPatterns:Zne,defaultMatchWidth:"wide",parsePatterns:Xne,defaultParseWidth:"any"}),quarter:du({matchPatterns:Qne,defaultMatchWidth:"wide",parsePatterns:Jne,defaultParseWidth:"any",valueCallback:function(t){return t+1}}),month:du({matchPatterns:ere,defaultMatchWidth:"wide",parsePatterns:tre,defaultParseWidth:"any"}),day:du({matchPatterns:nre,defaultMatchWidth:"wide",parsePatterns:rre,defaultParseWidth:"any"}),dayPeriod:du({matchPatterns:are,defaultMatchWidth:"any",parsePatterns:ore,defaultParseWidth:"any"})};const sre=ire;var lre={code:"en-US",formatDistance:Ane,formatLong:One,formatRelative:Mne,localize:Vne,match:sre,options:{weekStartsOn:0,firstWeekContainsDate:1}};const cre=lre;var ure=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,dre=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,fre=/^'([^]*?)'?$/,pre=/''/g,gre=/[a-zA-Z]/;function Bs(e,t,n){var r,a,o,i,s,l,c,u,d,g,m,b,y,w,v,h,S,E;Un(2,arguments);var k=String(t),x=dh(),C=(r=(a=n==null?void 0:n.locale)!==null&&a!==void 0?a:x.locale)!==null&&r!==void 0?r:cre,_=_i((o=(i=(s=(l=n==null?void 0:n.firstWeekContainsDate)!==null&&l!==void 0?l:n==null||(c=n.locale)===null||c===void 0||(u=c.options)===null||u===void 0?void 0:u.firstWeekContainsDate)!==null&&s!==void 0?s:x.firstWeekContainsDate)!==null&&i!==void 0?i:(d=x.locale)===null||d===void 0||(g=d.options)===null||g===void 0?void 0:g.firstWeekContainsDate)!==null&&o!==void 0?o:1);if(!(_>=1&&_<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var R=_i((m=(b=(y=(w=n==null?void 0:n.weekStartsOn)!==null&&w!==void 0?w:n==null||(v=n.locale)===null||v===void 0||(h=v.options)===null||h===void 0?void 0:h.weekStartsOn)!==null&&y!==void 0?y:x.weekStartsOn)!==null&&b!==void 0?b:(S=x.locale)===null||S===void 0||(E=S.options)===null||E===void 0?void 0:E.weekStartsOn)!==null&&m!==void 0?m:0);if(!(R>=0&&R<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");if(!C.localize)throw new RangeError("locale must contain localize property");if(!C.formatLong)throw new RangeError("locale must contain formatLong property");var T=Wa(e);if(!one(T))throw new RangeError("Invalid time value");var L=rne(T),D=ine(T,L),H={firstWeekContainsDate:_,weekStartsOn:R,locale:C,_originalDate:T},z=k.match(dre).map(function(M){var U=M[0];if(U==="p"||U==="P"){var X=Sne[U];return X(M,C.formatLong)}return M}).join("").match(ure).map(function(M){if(M==="''")return"'";var U=M[0];if(U==="'")return mre(M);var X=bne[U];if(X)return!(n!=null&&n.useAdditionalWeekYearTokens)&&kne(M)&&B2(M,t,String(e)),!(n!=null&&n.useAdditionalDayOfYearTokens)&&xne(M)&&B2(M,t,String(e)),X(D,M,C.localize,H);if(U.match(gre))throw new RangeError("Format string contains an unescaped latin alphabet character `"+U+"`");return M}).join("");return z}function mre(e){var t=e.match(fre);return t?t[1].replace(pre,"'"):e}function ik(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n2)return t;if(/:/.test(n[0])?r=n[0]:(t.date=n[0],r=n[1],sp.timeZoneDelimiter.test(t.date)&&(t.date=e.split(sp.timeZoneDelimiter)[0],r=e.substr(t.date.length,e.length))),r){var a=sp.timezone.exec(r);a?(t.time=r.replace(a[1],""),t.timezone=a[1]):t.time=r}return t}function kre(e,t){var n=new RegExp("^(?:(\\d{4}|[+-]\\d{"+(4+t)+"})|(\\d{2}|[+-]\\d{"+(2+t)+"})$)"),r=e.match(n);if(!r)return{year:NaN,restDateString:""};var a=r[1]?parseInt(r[1]):null,o=r[2]?parseInt(r[2]):null;return{year:o===null?a:o*100,restDateString:e.slice((r[1]||r[2]).length)}}function Cre(e,t){if(t===null)return new Date(NaN);var n=e.match(Sre);if(!n)return new Date(NaN);var r=!!n[4],a=fu(n[1]),o=fu(n[2])-1,i=fu(n[3]),s=fu(n[4]),l=fu(n[5])-1;if(r)return Ore(t,s,l)?Tre(t,s,l):new Date(NaN);var c=new Date(0);return!Nre(t,o,i)||!Ire(t,a)?new Date(NaN):(c.setUTCFullYear(t,o,Math.max(a,i)),c)}function fu(e){return e?parseInt(e):1}function _re(e){var t=e.match(wre);if(!t)return NaN;var n=qb(t[1]),r=qb(t[2]),a=qb(t[3]);return Dre(n,r,a)?n*X7+r*Z7+a*1e3:NaN}function qb(e){return e&&parseFloat(e.replace(",","."))||0}function Are(e){if(e==="Z")return 0;var t=e.match(Ere);if(!t)return 0;var n=t[1]==="+"?-1:1,r=parseInt(t[2]),a=t[3]&&parseInt(t[3])||0;return Lre(r,a)?n*(r*X7+a*Z7):NaN}function Tre(e,t,n){var r=new Date(0);r.setUTCFullYear(e,0,4);var a=r.getUTCDay()||7,o=(t-1)*7+n+1-a;return r.setUTCDate(r.getUTCDate()+o),r}var Rre=[31,null,31,30,31,30,31,31,30,31,30,31];function n8(e){return e%400===0||e%4===0&&e%100!==0}function Nre(e,t,n){return t>=0&&t<=11&&n>=1&&n<=(Rre[t]||(n8(e)?29:28))}function Ire(e,t){return t>=1&&t<=(n8(e)?366:365)}function Ore(e,t,n){return t>=1&&t<=53&&n>=0&&n<=6}function Dre(e,t,n){return e===24?t===0&&n===0:n>=0&&n<60&&t>=0&&t<60&&e>=0&&e<25}function Lre(e,t){return t>=0&&t<=59}const Mre=(e,t,n="Never")=>{const r=e.getValue(t);return r?Bs(new Date(r),"MMM dd, yyyy"):n},Dn=({isLoading:e,children:t})=>e?f.jsx(Pi,{className:"h-6 w-full"}):t,_n=p.forwardRef(({className:e,type:t,...n},r)=>f.jsx("input",{type:t,className:ee("flex h-10 w-full rounded-md border border-input bg-background-lighter px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),ref:r,...n}));_n.displayName="Input";const Pre=({value:e,onValueChange:t})=>f.jsx("form",{children:f.jsxs("div",{className:"relative",children:[f.jsx(Ms,{className:"pointer-events-none absolute left-[12px] top-3 h-4 w-4 text-muted-foreground"}),f.jsx(_n,{placeholder:"Search",value:e,onChange:n=>t(n.target.value),className:"w-52 pl-8 lg:w-80"})]})}),zi=({isLoading:e,children:t})=>e?f.jsx(Pi,{className:"h-6 w-full"}):t,H2=(e,t)=>{const n=e.getValue(t);return n?Bs(new Date(n),"MMM dd, yyyy"):"Never"},$re=(e,t)=>[{accessorKey:"name",header:"Agent Name",cell:({row:n})=>f.jsx(zi,{isLoading:t,children:n.getValue("name")})},{accessorFn:n=>{var r,a;return((a=(r=n.memory)==null?void 0:r.memory)==null?void 0:a.recall_memory)??0},accessorKey:"messages",header:()=>f.jsx(Zf,{children:f.jsx(EX,{className:"h-5 w-5"})}),cell:({row:n})=>f.jsx(zi,{isLoading:t,children:f.jsx("div",{className:" text-center tabular-nums",children:n.getValue("messages")??0})})},{accessorFn:n=>{var r,a;return((a=(r=n.memory)==null?void 0:r.memory)==null?void 0:a.archival_memory)??0},accessorKey:"memories",header:()=>f.jsx(Zf,{children:f.jsx(wX,{className:"h-5 w-5"})}),cell:({row:n})=>f.jsx(zi,{isLoading:t,children:f.jsx("div",{className:"text-center tabular-nums",children:n.getValue("memories")??0})})},{accessorFn:n=>0,accessorKey:"sources",header:()=>f.jsx(Zf,{children:f.jsx(xX,{className:"h-5 w-4"})}),cell:({row:n})=>f.jsx(zi,{isLoading:t,children:f.jsx("div",{className:"text-center tabular-nums",children:n.getValue("sources")??0})})},{accessorFn:n=>n.tools.length,accessorKey:"tools",header:()=>f.jsx(Zf,{className:"justify-center",children:f.jsx(kX,{className:"h-5 w-5"})}),cell:({row:n})=>f.jsx(zi,{isLoading:t,children:f.jsx("div",{className:"text-center tabular-nums",children:n.getValue("tools")??0})})},{accessorKey:"last_run",header:"Last Run",cell:({row:n})=>f.jsx(zi,{isLoading:t,children:H2(n,"last_run")})},{accessorKey:"created_at",header:"Lifespan",cell:({row:n})=>f.jsx(zi,{isLoading:t,children:H2(n,"created_at")})},{accessorKey:"chat",header:"",cell:({row:n})=>t?f.jsx(Pi,{className:"h-6 w-6"}):f.jsxs("div",{className:"flex",children:[f.jsx(ue,{onClick:()=>e(n.original),className:"rounded-lg px-3 py-1",variant:"outline",children:"Chat"}),f.jsx(ue,{variant:"ghost",onClick:()=>n.toggleExpanded(),children:n.getIsExpanded()?f.jsx(vX,{className:"h-4 w-4 text-muted-foreground"}):f.jsx(yX,{className:"h-4 w-4 text-muted-foreground"})})]})}],U_=rf(Vm((e,t)=>({currentAgent:null,lastAgentInitMessage:null,actions:{setAgent:n=>e({currentAgent:n}),setLastAgentInitMessage:n=>e(r=>({...r,lastAgentInitMessage:n})),removeAgent:()=>e(n=>({...n,currentAgent:null}))}}),{name:"agent-storage",partialize:({actions:e,...t})=>t})),To=()=>U_(e=>e.currentAgent),Fre=()=>U_(e=>e.lastAgentInitMessage),fh=()=>U_(e=>e.actions);function jre({setShowingAgentCreation:e}){return f.jsxs("div",{className:"flex h-full flex-col items-center justify-center gap-3",children:[f.jsx("h2",{className:"font-semibold",children:"Create your first agent"}),f.jsxs(ue,{size:"sm",onClick:()=>e(!0),children:[f.jsx(ya,{className:"mr-2 h-4 w-4"}),"Create Agent"]})]})}const zre=e=>{const{agent:t}=e,n=p.useMemo(()=>{var o;return Object.values(((o=t.memory)==null?void 0:o.memory)||{})},[t]),r=p.useMemo(()=>{var o;return((o=n.find(i=>i.label==="persona"))==null?void 0:o.name)??"Not set"},[t]),a=p.useMemo(()=>{var o;return((o=n.find(i=>i.label==="human"))==null?void 0:o.name)??"Not set"},[t]);return f.jsxs("div",{className:"flex flex-col",children:[f.jsxs("div",{className:"flex gap-4 border-b-[1px] py-3",children:[f.jsxs("div",{className:"flex gap-3 text-muted-foreground",children:[f.jsx(bX,{className:"h-4 w-5"}),f.jsx("h6",{children:"Agent Persona"})]}),f.jsx("p",{children:r})]}),f.jsxs("div",{className:"flex gap-4 py-3",children:[f.jsxs("div",{className:"flex gap-3 text-muted-foreground",children:[f.jsx(SX,{className:"h-4 w-5"}),f.jsx("h6",{children:"Human Persona"})]}),f.jsx("p",{children:a})]})]})},Ure=({className:e,setShowingAgentCreation:t})=>{const[n,r]=p.useState(""),{setAgent:a}=fh(),{data:o,isSuccess:i,isError:s,isLoading:l}=Qm({userId:void 0},void 0,{retry:!1}),c=p.useMemo(()=>i?o==null?void 0:o.filter(g=>g.name.toLowerCase().includes(n.toLowerCase())):[],[o,i,n]),u=Mi(),d=g=>{a(g),u(`${g.name}/chat`,{relative:"path"})};return f.jsxs(f.Fragment,{children:[f.jsx("div",{className:"flex items-center justify-between bg-background/95 px-4 pb-3 pt-2.5 backdrop-blur supports-[backdrop-filter]:bg-background/60",children:f.jsx(Pre,{value:n,onValueChange:r})}),f.jsx("div",{className:e,children:!l&&c.length===0?f.jsx(jre,{setShowingAgentCreation:t}):f.jsx(uf,{columns:$re(d,!1),isLoading:l,data:c,error:s?"There was an error loading the agents. Please try again later":void 0,renderPagination:g=>f.jsx(df,{className:"mt-4",table:g}),expandedRowsContent:g=>f.jsx(zre,{agent:c[g]})})})]})},r8="Dialog",[a8,o8]=zn(r8),[Bre,va]=a8(r8),Hre=e=>{const{__scopeDialog:t,children:n,open:r,defaultOpen:a,onOpenChange:o,modal:i=!0}=e,s=p.useRef(null),l=p.useRef(null),[c=!1,u]=Fa({prop:r,defaultProp:a,onChange:o});return p.createElement(Bre,{scope:t,triggerRef:s,contentRef:l,contentId:bi(),titleId:bi(),descriptionId:bi(),open:c,onOpenChange:u,onOpenToggle:p.useCallback(()=>u(d=>!d),[u]),modal:i},n)},Vre="DialogTrigger",qre=p.forwardRef((e,t)=>{const{__scopeDialog:n,...r}=e,a=va(Vre,n),o=nt(t,a.triggerRef);return p.createElement(ze.button,W({type:"button","aria-haspopup":"dialog","aria-expanded":a.open,"aria-controls":a.contentId,"data-state":B_(a.open)},r,{ref:o,onClick:fe(e.onClick,a.onOpenToggle)}))}),i8="DialogPortal",[Gre,s8]=a8(i8,{forceMount:void 0}),Wre=e=>{const{__scopeDialog:t,forceMount:n,children:r,container:a}=e,o=va(i8,t);return p.createElement(Gre,{scope:t,forceMount:n},p.Children.map(r,i=>p.createElement(pr,{present:n||o.open},p.createElement(Jd,{asChild:!0,container:a},i))))},sk="DialogOverlay",Kre=p.forwardRef((e,t)=>{const n=s8(sk,e.__scopeDialog),{forceMount:r=n.forceMount,...a}=e,o=va(sk,e.__scopeDialog);return o.modal?p.createElement(pr,{present:r||o.open},p.createElement(Yre,W({},a,{ref:t}))):null}),Yre=p.forwardRef((e,t)=>{const{__scopeDialog:n,...r}=e,a=va(sk,n);return p.createElement(ih,{as:$a,allowPinchZoom:!0,shards:[a.contentRef]},p.createElement(ze.div,W({"data-state":B_(a.open)},r,{ref:t,style:{pointerEvents:"auto",...r.style}})))}),wc="DialogContent",Zre=p.forwardRef((e,t)=>{const n=s8(wc,e.__scopeDialog),{forceMount:r=n.forceMount,...a}=e,o=va(wc,e.__scopeDialog);return p.createElement(pr,{present:r||o.open},o.modal?p.createElement(Xre,W({},a,{ref:t})):p.createElement(Qre,W({},a,{ref:t})))}),Xre=p.forwardRef((e,t)=>{const n=va(wc,e.__scopeDialog),r=p.useRef(null),a=nt(t,n.contentRef,r);return p.useEffect(()=>{const o=r.current;if(o)return mf(o)},[]),p.createElement(l8,W({},e,{ref:a,trapFocus:n.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:fe(e.onCloseAutoFocus,o=>{var i;o.preventDefault(),(i=n.triggerRef.current)===null||i===void 0||i.focus()}),onPointerDownOutside:fe(e.onPointerDownOutside,o=>{const i=o.detail.originalEvent,s=i.button===0&&i.ctrlKey===!0;(i.button===2||s)&&o.preventDefault()}),onFocusOutside:fe(e.onFocusOutside,o=>o.preventDefault())}))}),Qre=p.forwardRef((e,t)=>{const n=va(wc,e.__scopeDialog),r=p.useRef(!1),a=p.useRef(!1);return p.createElement(l8,W({},e,{ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:o=>{var i;if((i=e.onCloseAutoFocus)===null||i===void 0||i.call(e,o),!o.defaultPrevented){var s;r.current||(s=n.triggerRef.current)===null||s===void 0||s.focus(),o.preventDefault()}r.current=!1,a.current=!1},onInteractOutside:o=>{var i,s;(i=e.onInteractOutside)===null||i===void 0||i.call(e,o),o.defaultPrevented||(r.current=!0,o.detail.originalEvent.type==="pointerdown"&&(a.current=!0));const l=o.target;((s=n.triggerRef.current)===null||s===void 0?void 0:s.contains(l))&&o.preventDefault(),o.detail.originalEvent.type==="focusin"&&a.current&&o.preventDefault()}}))}),l8=p.forwardRef((e,t)=>{const{__scopeDialog:n,trapFocus:r,onOpenAutoFocus:a,onCloseAutoFocus:o,...i}=e,s=va(wc,n),l=p.useRef(null),c=nt(t,l);return Jm(),p.createElement(p.Fragment,null,p.createElement(eh,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:a,onUnmountAutoFocus:o},p.createElement(Ls,W({role:"dialog",id:s.contentId,"aria-describedby":s.descriptionId,"aria-labelledby":s.titleId,"data-state":B_(s.open)},i,{ref:c,onDismiss:()=>s.onOpenChange(!1)}))),!1)}),c8="DialogTitle",Jre=p.forwardRef((e,t)=>{const{__scopeDialog:n,...r}=e,a=va(c8,n);return p.createElement(ze.h2,W({id:a.titleId},r,{ref:t}))}),eae="DialogDescription",tae=p.forwardRef((e,t)=>{const{__scopeDialog:n,...r}=e,a=va(eae,n);return p.createElement(ze.p,W({id:a.descriptionId},r,{ref:t}))}),nae="DialogClose",rae=p.forwardRef((e,t)=>{const{__scopeDialog:n,...r}=e,a=va(nae,n);return p.createElement(ze.button,W({type:"button"},r,{ref:t,onClick:fe(e.onClick,()=>a.onOpenChange(!1))}))});function B_(e){return e?"open":"closed"}const aae="DialogTitleWarning",[oae,cTe]=TV(aae,{contentName:wc,titleName:c8,docsSlug:"dialog"}),u8=Hre,iae=qre,d8=Wre,H_=Kre,V_=Zre,q_=Jre,G_=tae,W_=rae,Kt=u8,sae=d8,f8=p.forwardRef(({className:e,...t},n)=>f.jsx(H_,{ref:n,className:ee("fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",e),...t}));f8.displayName=H_.displayName;const Ht=p.forwardRef(({className:e,children:t,hasCloseButton:n=!0,...r},a)=>f.jsxs(sae,{children:[f.jsx(f8,{}),f.jsxs(V_,{ref:a,className:ee("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg md:w-full",e),...r,children:[t,n?f.jsxs(W_,{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",children:[f.jsx(Di,{className:"h-4 w-4"}),f.jsx("span",{className:"sr-only",children:"Close"})]}):null]})]}));Ht.displayName=V_.displayName;const Pt=({className:e,...t})=>f.jsx("div",{className:ee("flex flex-col space-y-1.5 text-center sm:text-left",e),...t});Pt.displayName="DialogHeader";const p8=({className:e,...t})=>f.jsx("div",{className:ee("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",e),...t});p8.displayName="DialogFooter";const $t=p.forwardRef(({className:e,...t},n)=>f.jsx(q_,{ref:n,className:ee("text-lg font-semibold leading-none tracking-tight",e),...t}));$t.displayName=q_.displayName;const dn=p.forwardRef(({className:e,...t},n)=>f.jsx(G_,{ref:n,className:ee("text-sm text-muted-foreground",e),...t}));dn.displayName=G_.displayName;const lae=({open:e,onOpenChange:t,closeDialog:n})=>{const r=()=>{t(!1),n()};return f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Cancel Creating Agent"}),f.jsx(dn,{children:"Are you sure you want to cancel creating an Agent? All the information you worked on will be lost."})]}),f.jsxs("div",{className:"flex justify-end gap-4",children:[f.jsx(ue,{variant:"ghost",onClick:()=>t(!1),children:"No"}),f.jsx(ue,{onClick:r,children:"Yes"})]})]})})};var bf=e=>e.type==="checkbox",Nl=e=>e instanceof Date,Yn=e=>e==null;const g8=e=>typeof e=="object";var cn=e=>!Yn(e)&&!Array.isArray(e)&&g8(e)&&!Nl(e),m8=e=>cn(e)&&e.target?bf(e.target)?e.target.checked:e.target.value:e,cae=e=>e.substring(0,e.search(/\.\d+(\.|$)/))||e,h8=(e,t)=>e.has(cae(t)),uae=e=>{const t=e.constructor&&e.constructor.prototype;return cn(t)&&t.hasOwnProperty("isPrototypeOf")},K_=typeof window<"u"&&typeof window.HTMLElement<"u"&&typeof document<"u";function Ln(e){let t;const n=Array.isArray(e);if(e instanceof Date)t=new Date(e);else if(e instanceof Set)t=new Set(e);else if(!(K_&&(e instanceof Blob||e instanceof FileList))&&(n||cn(e)))if(t=n?[]:{},!n&&!uae(e))t=e;else for(const r in e)e.hasOwnProperty(r)&&(t[r]=Ln(e[r]));else return e;return t}var zc=e=>Array.isArray(e)?e.filter(Boolean):[],Ot=e=>e===void 0,ge=(e,t,n)=>{if(!t||!cn(e))return n;const r=zc(t.split(/[,[\].]+?/)).reduce((a,o)=>Yn(a)?a:a[o],e);return Ot(r)||r===e?Ot(e[t])?n:e[t]:r},si=e=>typeof e=="boolean";const jg={BLUR:"blur",FOCUS_OUT:"focusout",CHANGE:"change"},Hr={onBlur:"onBlur",onChange:"onChange",onSubmit:"onSubmit",onTouched:"onTouched",all:"all"},Ja={max:"max",min:"min",maxLength:"maxLength",minLength:"minLength",pattern:"pattern",required:"required",validate:"validate"},b8=Ae.createContext(null),Hs=()=>Ae.useContext(b8),dae=e=>{const{children:t,...n}=e;return Ae.createElement(b8.Provider,{value:n},t)};var y8=(e,t,n,r=!0)=>{const a={defaultValues:t._defaultValues};for(const o in e)Object.defineProperty(a,o,{get:()=>{const i=o;return t._proxyFormState[i]!==Hr.all&&(t._proxyFormState[i]=!r||Hr.all),n&&(n[i]=!0),e[i]}});return a},wr=e=>cn(e)&&!Object.keys(e).length,v8=(e,t,n,r)=>{n(e);const{name:a,...o}=e;return wr(o)||Object.keys(o).length>=Object.keys(t).length||Object.keys(o).find(i=>t[i]===(!r||Hr.all))},kr=e=>Array.isArray(e)?e:[e],S8=(e,t,n)=>!e||!t||e===t||kr(e).some(r=>r&&(n?r===t:r.startsWith(t)||t.startsWith(r)));function ph(e){const t=Ae.useRef(e);t.current=e,Ae.useEffect(()=>{const n=!e.disabled&&t.current.subject&&t.current.subject.subscribe({next:t.current.next});return()=>{n&&n.unsubscribe()}},[e.disabled])}function fae(e){const t=Hs(),{control:n=t.control,disabled:r,name:a,exact:o}=e||{},[i,s]=Ae.useState(n._formState),l=Ae.useRef(!0),c=Ae.useRef({isDirty:!1,isLoading:!1,dirtyFields:!1,touchedFields:!1,isValidating:!1,isValid:!1,errors:!1}),u=Ae.useRef(a);return u.current=a,ph({disabled:r,next:d=>l.current&&S8(u.current,d.name,o)&&v8(d,c.current,n._updateFormState)&&s({...n._formState,...d}),subject:n._subjects.state}),Ae.useEffect(()=>(l.current=!0,c.current.isValid&&n._updateValid(!0),()=>{l.current=!1}),[n]),y8(i,n,c.current,!1)}var Oa=e=>typeof e=="string",w8=(e,t,n,r,a)=>Oa(e)?(r&&t.watch.add(e),ge(n,e,a)):Array.isArray(e)?e.map(o=>(r&&t.watch.add(o),ge(n,o))):(r&&(t.watchAll=!0),n);function pae(e){const t=Hs(),{control:n=t.control,name:r,defaultValue:a,disabled:o,exact:i}=e||{},s=Ae.useRef(r);s.current=r,ph({disabled:o,subject:n._subjects.values,next:u=>{S8(s.current,u.name,i)&&c(Ln(w8(s.current,n._names,u.values||n._formValues,!1,a)))}});const[l,c]=Ae.useState(n._getWatch(r,a));return Ae.useEffect(()=>n._removeUnmounted()),l}var Y_=e=>/^\w*$/.test(e),E8=e=>zc(e.replace(/["|']|\]/g,"").split(/\.|\[/));function ht(e,t,n){let r=-1;const a=Y_(t)?[t]:E8(t),o=a.length,i=o-1;for(;++r{const u=a._options.shouldUnregister||o,d=(g,m)=>{const b=ge(a._fields,g);b&&(b._f.mount=m)};if(d(n,!0),u){const g=Ln(ge(a._options.defaultValues,n));ht(a._defaultValues,n,g),Ot(ge(a._formValues,n))&&ht(a._formValues,n,g)}return()=>{(i?u&&!a._state.action:u)?a.unregister(n):d(n,!1)}},[n,a,i,o]),Ae.useEffect(()=>{ge(a._fields,n)&&a._updateDisabledField({disabled:r,fields:a._fields,name:n})},[r,n,a]),{field:{name:n,value:s,...si(r)?{disabled:r}:{},onChange:Ae.useCallback(u=>c.current.onChange({target:{value:m8(u),name:n},type:jg.CHANGE}),[n]),onBlur:Ae.useCallback(()=>c.current.onBlur({target:{value:ge(a._formValues,n),name:n},type:jg.BLUR}),[n,a]),ref:u=>{const d=ge(a._fields,n);d&&u&&(d._f.ref={focus:()=>u.focus(),select:()=>u.select(),setCustomValidity:g=>u.setCustomValidity(g),reportValidity:()=>u.reportValidity()})}},formState:l,fieldState:Object.defineProperties({},{invalid:{enumerable:!0,get:()=>!!ge(l.errors,n)},isDirty:{enumerable:!0,get:()=>!!ge(l.dirtyFields,n)},isTouched:{enumerable:!0,get:()=>!!ge(l.touchedFields,n)},error:{enumerable:!0,get:()=>ge(l.errors,n)}})}}const mae=e=>e.render(gae(e));var x8=(e,t,n,r,a)=>t?{...n[e],types:{...n[e]&&n[e].types?n[e].types:{},[r]:a||!0}}:{};const zg=(e,t,n)=>{for(const r of n||Object.keys(e)){const a=ge(e,r);if(a){const{_f:o,...i}=a;if(o&&t(o.name)){if(o.ref.focus){o.ref.focus();break}else if(o.refs&&o.refs[0].focus){o.refs[0].focus();break}}else cn(i)&&zg(i,t)}}};var $o=()=>{const e=typeof performance>"u"?Date.now():performance.now()*1e3;return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{const n=(Math.random()*16+e)%16|0;return(t=="x"?n:n&3|8).toString(16)})},Gb=(e,t,n={})=>n.shouldFocus||Ot(n.shouldFocus)?n.focusName||`${e}.${Ot(n.focusIndex)?t:n.focusIndex}.`:"",lk=e=>({isOnSubmit:!e||e===Hr.onSubmit,isOnBlur:e===Hr.onBlur,isOnChange:e===Hr.onChange,isOnAll:e===Hr.all,isOnTouch:e===Hr.onTouched}),ck=(e,t,n)=>!n&&(t.watchAll||t.watch.has(e)||[...t.watch].some(r=>e.startsWith(r)&&/^\.\w+/.test(e.slice(r.length)))),k8=(e,t,n)=>{const r=zc(ge(e,n));return ht(r,"root",t[n]),ht(e,n,r),e},Z_=e=>e.type==="file",li=e=>typeof e=="function",Ug=e=>{if(!K_)return!1;const t=e?e.ownerDocument:0;return e instanceof(t&&t.defaultView?t.defaultView.HTMLElement:HTMLElement)},Gp=e=>Oa(e),X_=e=>e.type==="radio",Bg=e=>e instanceof RegExp;const V2={value:!1,isValid:!1},q2={value:!0,isValid:!0};var C8=e=>{if(Array.isArray(e)){if(e.length>1){const t=e.filter(n=>n&&n.checked&&!n.disabled).map(n=>n.value);return{value:t,isValid:!!t.length}}return e[0].checked&&!e[0].disabled?e[0].attributes&&!Ot(e[0].attributes.value)?Ot(e[0].value)||e[0].value===""?q2:{value:e[0].value,isValid:!0}:q2:V2}return V2};const G2={isValid:!1,value:null};var _8=e=>Array.isArray(e)?e.reduce((t,n)=>n&&n.checked&&!n.disabled?{isValid:!0,value:n.value}:t,G2):G2;function W2(e,t,n="validate"){if(Gp(e)||Array.isArray(e)&&e.every(Gp)||si(e)&&!e)return{type:n,message:Gp(e)?e:"",ref:t}}var nl=e=>cn(e)&&!Bg(e)?e:{value:e,message:""},uk=async(e,t,n,r,a)=>{const{ref:o,refs:i,required:s,maxLength:l,minLength:c,min:u,max:d,pattern:g,validate:m,name:b,valueAsNumber:y,mount:w,disabled:v}=e._f,h=ge(t,b);if(!w||v)return{};const S=i?i[0]:o,E=D=>{r&&S.reportValidity&&(S.setCustomValidity(si(D)?"":D||""),S.reportValidity())},k={},x=X_(o),C=bf(o),_=x||C,R=(y||Z_(o))&&Ot(o.value)&&Ot(h)||Ug(o)&&o.value===""||h===""||Array.isArray(h)&&!h.length,T=x8.bind(null,b,n,k),L=(D,H,z,M=Ja.maxLength,U=Ja.minLength)=>{const X=D?H:z;k[b]={type:D?M:U,message:X,ref:o,...T(D?M:U,X)}};if(a?!Array.isArray(h)||!h.length:s&&(!_&&(R||Yn(h))||si(h)&&!h||C&&!C8(i).isValid||x&&!_8(i).isValid)){const{value:D,message:H}=Gp(s)?{value:!!s,message:s}:nl(s);if(D&&(k[b]={type:Ja.required,message:H,ref:S,...T(Ja.required,H)},!n))return E(H),k}if(!R&&(!Yn(u)||!Yn(d))){let D,H;const z=nl(d),M=nl(u);if(!Yn(h)&&!isNaN(h)){const U=o.valueAsNumber||h&&+h;Yn(z.value)||(D=U>z.value),Yn(M.value)||(H=Unew Date(new Date().toDateString()+" "+A),j=o.type=="time",O=o.type=="week";Oa(z.value)&&h&&(D=j?X(h)>X(z.value):O?h>z.value:U>new Date(z.value)),Oa(M.value)&&h&&(H=j?X(h)+D.value,M=!Yn(H.value)&&h.length<+H.value;if((z||M)&&(L(z,D.message,H.message),!n))return E(k[b].message),k}if(g&&!R&&Oa(h)){const{value:D,message:H}=nl(g);if(Bg(D)&&!h.match(D)&&(k[b]={type:Ja.pattern,message:H,ref:o,...T(Ja.pattern,H)},!n))return E(H),k}if(m){if(li(m)){const D=await m(h,t),H=W2(D,S);if(H&&(k[b]={...H,...T(Ja.validate,H.message)},!n))return E(H.message),k}else if(cn(m)){let D={};for(const H in m){if(!wr(D)&&!n)break;const z=W2(await m[H](h,t),S,H);z&&(D={...z,...T(H,z.message)},E(z.message),n&&(k[b]=D))}if(!wr(D)&&(k[b]={ref:S,...D},!n))return k}}return E(!0),k};function Wb(e,t){return[...e,...kr(t)]}var Kb=e=>Array.isArray(e)?e.map(()=>{}):void 0;function Yb(e,t,n){return[...e.slice(0,t),...kr(n),...e.slice(t)]}var Zb=(e,t,n)=>Array.isArray(e)?(Ot(e[n])&&(e[n]=void 0),e.splice(n,0,e.splice(t,1)[0]),e):[];function Xb(e,t){return[...kr(t),...kr(e)]}function hae(e,t){let n=0;const r=[...e];for(const a of t)r.splice(a-n,1),n++;return zc(r).length?r:[]}var Qb=(e,t)=>Ot(t)?[]:hae(e,kr(t).sort((n,r)=>n-r)),Jb=(e,t,n)=>{e[t]=[e[n],e[n]=e[t]][0]};function bae(e,t){const n=t.slice(0,-1).length;let r=0;for(;r(e[t]=n,e);function vae(e){const t=Hs(),{control:n=t.control,name:r,keyName:a="id",shouldUnregister:o}=e,[i,s]=Ae.useState(n._getFieldArray(r)),l=Ae.useRef(n._getFieldArray(r).map($o)),c=Ae.useRef(i),u=Ae.useRef(r),d=Ae.useRef(!1);u.current=r,c.current=i,n._names.array.add(r),e.rules&&n.register(r,e.rules),ph({next:({values:k,name:x})=>{if(x===u.current||!x){const C=ge(k,u.current);Array.isArray(C)&&(s(C),l.current=C.map($o))}},subject:n._subjects.array});const g=Ae.useCallback(k=>{d.current=!0,n._updateFieldArray(r,k)},[n,r]),m=(k,x)=>{const C=kr(Ln(k)),_=Wb(n._getFieldArray(r),C);n._names.focus=Gb(r,_.length-1,x),l.current=Wb(l.current,C.map($o)),g(_),s(_),n._updateFieldArray(r,_,Wb,{argA:Kb(k)})},b=(k,x)=>{const C=kr(Ln(k)),_=Xb(n._getFieldArray(r),C);n._names.focus=Gb(r,0,x),l.current=Xb(l.current,C.map($o)),g(_),s(_),n._updateFieldArray(r,_,Xb,{argA:Kb(k)})},y=k=>{const x=Qb(n._getFieldArray(r),k);l.current=Qb(l.current,k),g(x),s(x),n._updateFieldArray(r,x,Qb,{argA:k})},w=(k,x,C)=>{const _=kr(Ln(x)),R=Yb(n._getFieldArray(r),k,_);n._names.focus=Gb(r,k,C),l.current=Yb(l.current,k,_.map($o)),g(R),s(R),n._updateFieldArray(r,R,Yb,{argA:k,argB:Kb(x)})},v=(k,x)=>{const C=n._getFieldArray(r);Jb(C,k,x),Jb(l.current,k,x),g(C),s(C),n._updateFieldArray(r,C,Jb,{argA:k,argB:x},!1)},h=(k,x)=>{const C=n._getFieldArray(r);Zb(C,k,x),Zb(l.current,k,x),g(C),s(C),n._updateFieldArray(r,C,Zb,{argA:k,argB:x},!1)},S=(k,x)=>{const C=Ln(x),_=K2(n._getFieldArray(r),k,C);l.current=[..._].map((R,T)=>!R||T===k?$o():l.current[T]),g(_),s([..._]),n._updateFieldArray(r,_,K2,{argA:k,argB:C},!0,!1)},E=k=>{const x=kr(Ln(k));l.current=x.map($o),g([...x]),s([...x]),n._updateFieldArray(r,[...x],C=>C,{},!0,!1)};return Ae.useEffect(()=>{if(n._state.action=!1,ck(r,n._names)&&n._subjects.state.next({...n._formState}),d.current&&(!lk(n._options.mode).isOnSubmit||n._formState.isSubmitted))if(n._options.resolver)n._executeSchema([r]).then(k=>{const x=ge(k.errors,r),C=ge(n._formState.errors,r);(C?!x&&C.type||x&&(C.type!==x.type||C.message!==x.message):x&&x.type)&&(x?ht(n._formState.errors,r,x):pn(n._formState.errors,r),n._subjects.state.next({errors:n._formState.errors}))});else{const k=ge(n._fields,r);k&&k._f&&uk(k,n._formValues,n._options.criteriaMode===Hr.all,n._options.shouldUseNativeValidation,!0).then(x=>!wr(x)&&n._subjects.state.next({errors:k8(n._formState.errors,x,r)}))}n._subjects.values.next({name:r,values:{...n._formValues}}),n._names.focus&&zg(n._fields,k=>!!k&&k.startsWith(n._names.focus||"")),n._names.focus="",n._updateValid(),d.current=!1},[i,r,n]),Ae.useEffect(()=>(!ge(n._formValues,r)&&n._updateFieldArray(r),()=>{(n._options.shouldUnregister||o)&&n.unregister(r)}),[r,n,a,o]),{swap:Ae.useCallback(v,[g,r,n]),move:Ae.useCallback(h,[g,r,n]),prepend:Ae.useCallback(b,[g,r,n]),append:Ae.useCallback(m,[g,r,n]),remove:Ae.useCallback(y,[g,r,n]),insert:Ae.useCallback(w,[g,r,n]),update:Ae.useCallback(S,[g,r,n]),replace:Ae.useCallback(E,[g,r,n]),fields:Ae.useMemo(()=>i.map((k,x)=>({...k,[a]:l.current[x]||$o()})),[i,a])}}function ey(){let e=[];return{get observers(){return e},next:a=>{for(const o of e)o.next&&o.next(a)},subscribe:a=>(e.push(a),{unsubscribe:()=>{e=e.filter(o=>o!==a)}}),unsubscribe:()=>{e=[]}}}var Hg=e=>Yn(e)||!g8(e);function as(e,t){if(Hg(e)||Hg(t))return e===t;if(Nl(e)&&Nl(t))return e.getTime()===t.getTime();const n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(const a of n){const o=e[a];if(!r.includes(a))return!1;if(a!=="ref"){const i=t[a];if(Nl(o)&&Nl(i)||cn(o)&&cn(i)||Array.isArray(o)&&Array.isArray(i)?!as(o,i):o!==i)return!1}}return!0}var A8=e=>e.type==="select-multiple",Sae=e=>X_(e)||bf(e),ty=e=>Ug(e)&&e.isConnected,T8=e=>{for(const t in e)if(li(e[t]))return!0;return!1};function Vg(e,t={}){const n=Array.isArray(e);if(cn(e)||n)for(const r in e)Array.isArray(e[r])||cn(e[r])&&!T8(e[r])?(t[r]=Array.isArray(e[r])?[]:{},Vg(e[r],t[r])):Yn(e[r])||(t[r]=!0);return t}function R8(e,t,n){const r=Array.isArray(e);if(cn(e)||r)for(const a in e)Array.isArray(e[a])||cn(e[a])&&!T8(e[a])?Ot(t)||Hg(n[a])?n[a]=Array.isArray(e[a])?Vg(e[a],[]):{...Vg(e[a])}:R8(e[a],Yn(t)?{}:t[a],n[a]):n[a]=!as(e[a],t[a]);return n}var ny=(e,t)=>R8(e,t,Vg(t)),N8=(e,{valueAsNumber:t,valueAsDate:n,setValueAs:r})=>Ot(e)?e:t?e===""?NaN:e&&+e:n&&Oa(e)?new Date(e):r?r(e):e;function ry(e){const t=e.ref;if(!(e.refs?e.refs.every(n=>n.disabled):t.disabled))return Z_(t)?t.files:X_(t)?_8(e.refs).value:A8(t)?[...t.selectedOptions].map(({value:n})=>n):bf(t)?C8(e.refs).value:N8(Ot(t.value)?e.ref.value:t.value,e)}var wae=(e,t,n,r)=>{const a={};for(const o of e){const i=ge(t,o);i&&ht(a,o,i._f)}return{criteriaMode:n,names:[...e],fields:a,shouldUseNativeValidation:r}},pu=e=>Ot(e)?e:Bg(e)?e.source:cn(e)?Bg(e.value)?e.value.source:e.value:e,Eae=e=>e.mount&&(e.required||e.min||e.max||e.maxLength||e.minLength||e.pattern||e.validate);function Y2(e,t,n){const r=ge(e,n);if(r||Y_(n))return{error:r,name:n};const a=n.split(".");for(;a.length;){const o=a.join("."),i=ge(t,o),s=ge(e,o);if(i&&!Array.isArray(i)&&n!==o)return{name:n};if(s&&s.type)return{name:o,error:s};a.pop()}return{name:n}}var xae=(e,t,n,r,a)=>a.isOnAll?!1:!n&&a.isOnTouch?!(t||e):(n?r.isOnBlur:a.isOnBlur)?!e:(n?r.isOnChange:a.isOnChange)?e:!0,kae=(e,t)=>!zc(ge(e,t)).length&&pn(e,t);const Cae={mode:Hr.onSubmit,reValidateMode:Hr.onChange,shouldFocusError:!0};function _ae(e={},t){let n={...Cae,...e},r={submitCount:0,isDirty:!1,isLoading:li(n.defaultValues),isValidating:!1,isSubmitted:!1,isSubmitting:!1,isSubmitSuccessful:!1,isValid:!1,touchedFields:{},dirtyFields:{},errors:{}},a={},o=cn(n.defaultValues)||cn(n.values)?Ln(n.defaultValues||n.values)||{}:{},i=n.shouldUnregister?{}:Ln(o),s={action:!1,mount:!1,watch:!1},l={mount:new Set,unMount:new Set,array:new Set,watch:new Set},c,u=0;const d={isDirty:!1,dirtyFields:!1,touchedFields:!1,isValidating:!1,isValid:!1,errors:!1},g={values:ey(),array:ey(),state:ey()},m=e.resetOptions&&e.resetOptions.keepDirtyValues,b=lk(n.mode),y=lk(n.reValidateMode),w=n.criteriaMode===Hr.all,v=F=>q=>{clearTimeout(u),u=setTimeout(F,q)},h=async F=>{if(d.isValid||F){const q=n.resolver?wr((await R()).errors):await L(a,!0);q!==r.isValid&&g.state.next({isValid:q})}},S=F=>d.isValidating&&g.state.next({isValidating:F}),E=(F,q=[],Y,ye,de=!0,oe=!0)=>{if(ye&&Y){if(s.action=!0,oe&&Array.isArray(ge(a,F))){const _e=Y(ge(a,F),ye.argA,ye.argB);de&&ht(a,F,_e)}if(oe&&Array.isArray(ge(r.errors,F))){const _e=Y(ge(r.errors,F),ye.argA,ye.argB);de&&ht(r.errors,F,_e),kae(r.errors,F)}if(d.touchedFields&&oe&&Array.isArray(ge(r.touchedFields,F))){const _e=Y(ge(r.touchedFields,F),ye.argA,ye.argB);de&&ht(r.touchedFields,F,_e)}d.dirtyFields&&(r.dirtyFields=ny(o,i)),g.state.next({name:F,isDirty:H(F,q),dirtyFields:r.dirtyFields,errors:r.errors,isValid:r.isValid})}else ht(i,F,q)},k=(F,q)=>{ht(r.errors,F,q),g.state.next({errors:r.errors})},x=(F,q,Y,ye)=>{const de=ge(a,F);if(de){const oe=ge(i,F,Ot(Y)?ge(o,F):Y);Ot(oe)||ye&&ye.defaultChecked||q?ht(i,F,q?oe:ry(de._f)):U(F,oe),s.mount&&h()}},C=(F,q,Y,ye,de)=>{let oe=!1,_e=!1;const wt={name:F};if(!Y||ye){d.isDirty&&(_e=r.isDirty,r.isDirty=wt.isDirty=H(),oe=_e!==wt.isDirty);const St=as(ge(o,F),q);_e=ge(r.dirtyFields,F),St?pn(r.dirtyFields,F):ht(r.dirtyFields,F,!0),wt.dirtyFields=r.dirtyFields,oe=oe||d.dirtyFields&&_e!==!St}if(Y){const St=ge(r.touchedFields,F);St||(ht(r.touchedFields,F,Y),wt.touchedFields=r.touchedFields,oe=oe||d.touchedFields&&St!==Y)}return oe&&de&&g.state.next(wt),oe?wt:{}},_=(F,q,Y,ye)=>{const de=ge(r.errors,F),oe=d.isValid&&si(q)&&r.isValid!==q;if(e.delayError&&Y?(c=v(()=>k(F,Y)),c(e.delayError)):(clearTimeout(u),c=null,Y?ht(r.errors,F,Y):pn(r.errors,F)),(Y?!as(de,Y):de)||!wr(ye)||oe){const _e={...ye,...oe&&si(q)?{isValid:q}:{},errors:r.errors,name:F};r={...r,..._e},g.state.next(_e)}S(!1)},R=async F=>n.resolver(i,n.context,wae(F||l.mount,a,n.criteriaMode,n.shouldUseNativeValidation)),T=async F=>{const{errors:q}=await R(F);if(F)for(const Y of F){const ye=ge(q,Y);ye?ht(r.errors,Y,ye):pn(r.errors,Y)}else r.errors=q;return q},L=async(F,q,Y={valid:!0})=>{for(const ye in F){const de=F[ye];if(de){const{_f:oe,..._e}=de;if(oe){const wt=l.array.has(oe.name),St=await uk(de,i,w,n.shouldUseNativeValidation&&!q,wt);if(St[oe.name]&&(Y.valid=!1,q))break;!q&&(ge(St,oe.name)?wt?k8(r.errors,St,oe.name):ht(r.errors,oe.name,St[oe.name]):pn(r.errors,oe.name))}_e&&await L(_e,q,Y)}}return Y.valid},D=()=>{for(const F of l.unMount){const q=ge(a,F);q&&(q._f.refs?q._f.refs.every(Y=>!ty(Y)):!ty(q._f.ref))&&ne(F)}l.unMount=new Set},H=(F,q)=>(F&&q&&ht(i,F,q),!as(V(),o)),z=(F,q,Y)=>w8(F,l,{...s.mount?i:Ot(q)?o:Oa(F)?{[F]:q}:q},Y,q),M=F=>zc(ge(s.mount?i:o,F,e.shouldUnregister?ge(o,F,[]):[])),U=(F,q,Y={})=>{const ye=ge(a,F);let de=q;if(ye){const oe=ye._f;oe&&(!oe.disabled&&ht(i,F,N8(q,oe)),de=Ug(oe.ref)&&Yn(q)?"":q,A8(oe.ref)?[...oe.ref.options].forEach(_e=>_e.selected=de.includes(_e.value)):oe.refs?bf(oe.ref)?oe.refs.length>1?oe.refs.forEach(_e=>(!_e.defaultChecked||!_e.disabled)&&(_e.checked=Array.isArray(de)?!!de.find(wt=>wt===_e.value):de===_e.value)):oe.refs[0]&&(oe.refs[0].checked=!!de):oe.refs.forEach(_e=>_e.checked=_e.value===de):Z_(oe.ref)?oe.ref.value="":(oe.ref.value=de,oe.ref.type||g.values.next({name:F,values:{...i}})))}(Y.shouldDirty||Y.shouldTouch)&&C(F,de,Y.shouldTouch,Y.shouldDirty,!0),Y.shouldValidate&&A(F)},X=(F,q,Y)=>{for(const ye in q){const de=q[ye],oe=`${F}.${ye}`,_e=ge(a,oe);(l.array.has(F)||!Hg(de)||_e&&!_e._f)&&!Nl(de)?X(oe,de,Y):U(oe,de,Y)}},j=(F,q,Y={})=>{const ye=ge(a,F),de=l.array.has(F),oe=Ln(q);ht(i,F,oe),de?(g.array.next({name:F,values:{...i}}),(d.isDirty||d.dirtyFields)&&Y.shouldDirty&&g.state.next({name:F,dirtyFields:ny(o,i),isDirty:H(F,oe)})):ye&&!ye._f&&!Yn(oe)?X(F,oe,Y):U(F,oe,Y),ck(F,l)&&g.state.next({...r}),g.values.next({name:F,values:{...i}}),!s.mount&&t()},O=async F=>{const q=F.target;let Y=q.name,ye=!0;const de=ge(a,Y),oe=()=>q.type?ry(de._f):m8(F);if(de){let _e,wt;const St=oe(),Z=F.type===jg.BLUR||F.type===jg.FOCUS_OUT,le=!Eae(de._f)&&!n.resolver&&!ge(r.errors,Y)&&!de._f.deps||xae(Z,ge(r.touchedFields,Y),r.isSubmitted,y,b),De=ck(Y,l,Z);ht(i,Y,St),Z?(de._f.onBlur&&de._f.onBlur(F),c&&c(0)):de._f.onChange&&de._f.onChange(F);const He=C(Y,St,Z,!1),ft=!wr(He)||De;if(!Z&&g.values.next({name:Y,type:F.type,values:{...i}}),le)return d.isValid&&h(),ft&&g.state.next({name:Y,...De?{}:He});if(!Z&&De&&g.state.next({...r}),S(!0),n.resolver){const{errors:Tn}=await R([Y]),Ir=Y2(r.errors,a,Y),Sn=Y2(Tn,a,Ir.name||Y);_e=Sn.error,Y=Sn.name,wt=wr(Tn)}else _e=(await uk(de,i,w,n.shouldUseNativeValidation))[Y],ye=Number.isNaN(St)||St===ge(i,Y,St),ye&&(_e?wt=!1:d.isValid&&(wt=await L(a,!0)));ye&&(de._f.deps&&A(de._f.deps),_(Y,wt,_e,He))}},A=async(F,q={})=>{let Y,ye;const de=kr(F);if(S(!0),n.resolver){const oe=await T(Ot(F)?F:de);Y=wr(oe),ye=F?!de.some(_e=>ge(oe,_e)):Y}else F?(ye=(await Promise.all(de.map(async oe=>{const _e=ge(a,oe);return await L(_e&&_e._f?{[oe]:_e}:_e)}))).every(Boolean),!(!ye&&!r.isValid)&&h()):ye=Y=await L(a);return g.state.next({...!Oa(F)||d.isValid&&Y!==r.isValid?{}:{name:F},...n.resolver||!F?{isValid:Y}:{},errors:r.errors,isValidating:!1}),q.shouldFocus&&!ye&&zg(a,oe=>oe&&ge(r.errors,oe),F?de:l.mount),ye},V=F=>{const q={...o,...s.mount?i:{}};return Ot(F)?q:Oa(F)?ge(q,F):F.map(Y=>ge(q,Y))},P=(F,q)=>({invalid:!!ge((q||r).errors,F),isDirty:!!ge((q||r).dirtyFields,F),isTouched:!!ge((q||r).touchedFields,F),error:ge((q||r).errors,F)}),N=F=>{F&&kr(F).forEach(q=>pn(r.errors,q)),g.state.next({errors:F?r.errors:{}})},K=(F,q,Y)=>{const ye=(ge(a,F,{_f:{}})._f||{}).ref;ht(r.errors,F,{...q,ref:ye}),g.state.next({name:F,errors:r.errors,isValid:!1}),Y&&Y.shouldFocus&&ye&&ye.focus&&ye.focus()},ae=(F,q)=>li(F)?g.values.subscribe({next:Y=>F(z(void 0,q),Y)}):z(F,q,!0),ne=(F,q={})=>{for(const Y of F?kr(F):l.mount)l.mount.delete(Y),l.array.delete(Y),q.keepValue||(pn(a,Y),pn(i,Y)),!q.keepError&&pn(r.errors,Y),!q.keepDirty&&pn(r.dirtyFields,Y),!q.keepTouched&&pn(r.touchedFields,Y),!n.shouldUnregister&&!q.keepDefaultValue&&pn(o,Y);g.values.next({values:{...i}}),g.state.next({...r,...q.keepDirty?{isDirty:H()}:{}}),!q.keepIsValid&&h()},Q=({disabled:F,name:q,field:Y,fields:ye})=>{if(si(F)){const de=F?void 0:ge(i,q,ry(Y?Y._f:ge(ye,q)._f));ht(i,q,de),C(q,de,!1,!1,!0)}},pe=(F,q={})=>{let Y=ge(a,F);const ye=si(q.disabled);return ht(a,F,{...Y||{},_f:{...Y&&Y._f?Y._f:{ref:{name:F}},name:F,mount:!0,...q}}),l.mount.add(F),Y?Q({field:Y,disabled:q.disabled,name:F}):x(F,!0,q.value),{...ye?{disabled:q.disabled}:{},...n.progressive?{required:!!q.required,min:pu(q.min),max:pu(q.max),minLength:pu(q.minLength),maxLength:pu(q.maxLength),pattern:pu(q.pattern)}:{},name:F,onChange:O,onBlur:O,ref:de=>{if(de){pe(F,q),Y=ge(a,F);const oe=Ot(de.value)&&de.querySelectorAll&&de.querySelectorAll("input,select,textarea")[0]||de,_e=Sae(oe),wt=Y._f.refs||[];if(_e?wt.find(St=>St===oe):oe===Y._f.ref)return;ht(a,F,{_f:{...Y._f,..._e?{refs:[...wt.filter(ty),oe,...Array.isArray(ge(o,F))?[{}]:[]],ref:{type:oe.type,name:F}}:{ref:oe}}}),x(F,!1,void 0,oe)}else Y=ge(a,F,{}),Y._f&&(Y._f.mount=!1),(n.shouldUnregister||q.shouldUnregister)&&!(h8(l.array,F)&&s.action)&&l.unMount.add(F)}}},he=()=>n.shouldFocusError&&zg(a,F=>F&&ge(r.errors,F),l.mount),re=(F,q)=>async Y=>{Y&&(Y.preventDefault&&Y.preventDefault(),Y.persist&&Y.persist());let ye=Ln(i);if(g.state.next({isSubmitting:!0}),n.resolver){const{errors:de,values:oe}=await R();r.errors=de,ye=oe}else await L(a);pn(r.errors,"root"),wr(r.errors)?(g.state.next({errors:{}}),await F(ye,Y)):(q&&await q({...r.errors},Y),he(),setTimeout(he)),g.state.next({isSubmitted:!0,isSubmitting:!1,isSubmitSuccessful:wr(r.errors),submitCount:r.submitCount+1,errors:r.errors})},Ee=(F,q={})=>{ge(a,F)&&(Ot(q.defaultValue)?j(F,ge(o,F)):(j(F,q.defaultValue),ht(o,F,q.defaultValue)),q.keepTouched||pn(r.touchedFields,F),q.keepDirty||(pn(r.dirtyFields,F),r.isDirty=q.defaultValue?H(F,ge(o,F)):H()),q.keepError||(pn(r.errors,F),d.isValid&&h()),g.state.next({...r}))},ke=(F,q={})=>{const Y=F?Ln(F):o,ye=Ln(Y),de=F&&!wr(F)?ye:o;if(q.keepDefaultValues||(o=Y),!q.keepValues){if(q.keepDirtyValues||m)for(const oe of l.mount)ge(r.dirtyFields,oe)?ht(de,oe,ge(i,oe)):j(oe,ge(de,oe));else{if(K_&&Ot(F))for(const oe of l.mount){const _e=ge(a,oe);if(_e&&_e._f){const wt=Array.isArray(_e._f.refs)?_e._f.refs[0]:_e._f.ref;if(Ug(wt)){const St=wt.closest("form");if(St){St.reset();break}}}}a={}}i=e.shouldUnregister?q.keepDefaultValues?Ln(o):{}:Ln(de),g.array.next({values:{...de}}),g.values.next({values:{...de}})}l={mount:new Set,unMount:new Set,array:new Set,watch:new Set,watchAll:!1,focus:""},!s.mount&&t(),s.mount=!d.isValid||!!q.keepIsValid,s.watch=!!e.shouldUnregister,g.state.next({submitCount:q.keepSubmitCount?r.submitCount:0,isDirty:q.keepDirty?r.isDirty:!!(q.keepDefaultValues&&!as(F,o)),isSubmitted:q.keepIsSubmitted?r.isSubmitted:!1,dirtyFields:q.keepDirtyValues?r.dirtyFields:q.keepDefaultValues&&F?ny(o,F):{},touchedFields:q.keepTouched?r.touchedFields:{},errors:q.keepErrors?r.errors:{},isSubmitSuccessful:q.keepIsSubmitSuccessful?r.isSubmitSuccessful:!1,isSubmitting:!1})},We=(F,q)=>ke(li(F)?F(i):F,q);return{control:{register:pe,unregister:ne,getFieldState:P,handleSubmit:re,setError:K,_executeSchema:R,_getWatch:z,_getDirty:H,_updateValid:h,_removeUnmounted:D,_updateFieldArray:E,_updateDisabledField:Q,_getFieldArray:M,_reset:ke,_resetDefaultValues:()=>li(n.defaultValues)&&n.defaultValues().then(F=>{We(F,n.resetOptions),g.state.next({isLoading:!1})}),_updateFormState:F=>{r={...r,...F}},_subjects:g,_proxyFormState:d,get _fields(){return a},get _formValues(){return i},get _state(){return s},set _state(F){s=F},get _defaultValues(){return o},get _names(){return l},set _names(F){l=F},get _formState(){return r},set _formState(F){r=F},get _options(){return n},set _options(F){n={...n,...F}}},trigger:A,register:pe,handleSubmit:re,watch:ae,setValue:j,getValues:V,reset:We,resetField:Ee,clearErrors:N,unregister:ne,setError:K,setFocus:(F,q={})=>{const Y=ge(a,F),ye=Y&&Y._f;if(ye){const de=ye.refs?ye.refs[0]:ye.ref;de.focus&&(de.focus(),q.shouldSelect&&de.select())}},getFieldState:P}}function bn(e={}){const t=Ae.useRef(),n=Ae.useRef(),[r,a]=Ae.useState({isDirty:!1,isValidating:!1,isLoading:li(e.defaultValues),isSubmitted:!1,isSubmitting:!1,isSubmitSuccessful:!1,isValid:!1,submitCount:0,dirtyFields:{},touchedFields:{},errors:{},defaultValues:li(e.defaultValues)?void 0:e.defaultValues});t.current||(t.current={..._ae(e,()=>a(i=>({...i}))),formState:r});const o=t.current.control;return o._options=e,ph({subject:o._subjects.state,next:i=>{v8(i,o._proxyFormState,o._updateFormState,!0)&&a({...o._formState})}}),Ae.useEffect(()=>{e.values&&!as(e.values,n.current)?(o._reset(e.values,o._options.resetOptions),n.current=e.values):o._resetDefaultValues()},[e.values,o]),Ae.useEffect(()=>{o._state.mount||(o._updateValid(),o._state.mount=!0),o._state.watch&&(o._state.watch=!1,o._subjects.state.next({...o._formState})),o._removeUnmounted()}),t.current.formState=y8(r,o),t.current}var Z2=function(e,t,n){if(e&&"reportValidity"in e){var r=ge(n,t);e.setCustomValidity(r&&r.message||""),e.reportValidity()}},I8=function(e,t){var n=function(a){var o=t.fields[a];o&&o.ref&&"reportValidity"in o.ref?Z2(o.ref,a,e):o.refs&&o.refs.forEach(function(i){return Z2(i,a,e)})};for(var r in t.fields)n(r)},Aae=function(e,t){t.shouldUseNativeValidation&&I8(e,t);var n={};for(var r in e){var a=ge(t.fields,r),o=Object.assign(e[r]||{},{ref:a&&a.ref});if(Rae(t.names||Object.keys(e),r)){var i=Object.assign({},Tae(ge(n,r)));ht(i,"root",o),ht(n,r,i)}else ht(n,r,o)}return n},Tae=function(e){return Array.isArray(e)?e.filter(Boolean):[]},Rae=function(e,t){return e.some(function(n){return n.startsWith(t+".")})},Nae=function(e,t){for(var n={};e.length;){var r=e[0],a=r.code,o=r.message,i=r.path.join(".");if(!n[i])if("unionErrors"in r){var s=r.unionErrors[0].errors[0];n[i]={message:s.message,type:s.code}}else n[i]={message:o,type:a};if("unionErrors"in r&&r.unionErrors.forEach(function(u){return u.errors.forEach(function(d){return e.push(d)})}),t){var l=n[i].types,c=l&&l[r.code];n[i]=x8(i,t,n,a,c?[].concat(c,r.message):r.message)}e.shift()}return n},yn=function(e,t,n){return n===void 0&&(n={}),function(r,a,o){try{return Promise.resolve(function(i,s){try{var l=Promise.resolve(e[n.mode==="sync"?"parse":"parseAsync"](r,t)).then(function(c){return o.shouldUseNativeValidation&&I8({},o),{errors:{},values:n.raw?r:c}})}catch(c){return s(c)}return l&&l.then?l.then(void 0,s):l}(0,function(i){if(function(s){return s.errors!=null}(i))return{values:{},errors:Aae(Nae(i.errors,!o.shouldUseNativeValidation&&o.criteriaMode==="all"),o)};throw i}))}catch(i){return Promise.reject(i)}}};function Bl(e,t,{checkForDefaultPrevented:n=!0}={}){return function(a){if(e==null||e(a),n===!1||!a.defaultPrevented)return t==null?void 0:t(a)}}function Iae(e,t){typeof e=="function"?e(t):e!=null&&(e.current=t)}function O8(...e){return t=>e.forEach(n=>Iae(n,t))}function yf(...e){return p.useCallback(O8(...e),e)}function Oae(e,t=[]){let n=[];function r(o,i){const s=p.createContext(i),l=n.length;n=[...n,i];function c(d){const{scope:g,children:m,...b}=d,y=(g==null?void 0:g[e][l])||s,w=p.useMemo(()=>b,Object.values(b));return p.createElement(y.Provider,{value:w},m)}function u(d,g){const m=(g==null?void 0:g[e][l])||s,b=p.useContext(m);if(b)return b;if(i!==void 0)return i;throw new Error(`\`${d}\` must be used within \`${o}\``)}return c.displayName=o+"Provider",[c,u]}const a=()=>{const o=n.map(i=>p.createContext(i));return function(s){const l=(s==null?void 0:s[e])||o;return p.useMemo(()=>({[`__scope${e}`]:{...s,[e]:l}}),[s,l])}};return a.scopeName=e,[r,Dae(a,...t)]}function Dae(...e){const t=e[0];if(e.length===1)return t;const n=()=>{const r=e.map(a=>({useScope:a(),scopeName:a.scopeName}));return function(o){const i=r.reduce((s,{useScope:l,scopeName:c})=>{const d=l(o)[`__scope${c}`];return{...s,...d}},{});return p.useMemo(()=>({[`__scope${t.scopeName}`]:i}),[i])}};return n.scopeName=t.scopeName,n}const dk=globalThis!=null&&globalThis.document?p.useLayoutEffect:()=>{},Lae=Kd["useId".toString()]||(()=>{});let Mae=0;function ay(e){const[t,n]=p.useState(Lae());return dk(()=>{e||n(r=>r??String(Mae++))},[e]),e||(t?`radix-${t}`:"")}function Rs(e){const t=p.useRef(e);return p.useEffect(()=>{t.current=e}),p.useMemo(()=>(...n)=>{var r;return(r=t.current)===null||r===void 0?void 0:r.call(t,...n)},[])}function Pae({prop:e,defaultProp:t,onChange:n=()=>{}}){const[r,a]=$ae({defaultProp:t,onChange:n}),o=e!==void 0,i=o?e:r,s=Rs(n),l=p.useCallback(c=>{if(o){const d=typeof c=="function"?c(e):c;d!==e&&s(d)}else a(c)},[o,e,a,s]);return[i,l]}function $ae({defaultProp:e,onChange:t}){const n=p.useState(e),[r]=n,a=p.useRef(r),o=Rs(t);return p.useEffect(()=>{a.current!==r&&(o(r),a.current=r)},[r,a,o]),n}const Q_=p.forwardRef((e,t)=>{const{children:n,...r}=e,a=p.Children.toArray(n),o=a.find(jae);if(o){const i=o.props.children,s=a.map(l=>l===o?p.Children.count(i)>1?p.Children.only(null):p.isValidElement(i)?i.props.children:null:l);return p.createElement(fk,W({},r,{ref:t}),p.isValidElement(i)?p.cloneElement(i,void 0,s):null)}return p.createElement(fk,W({},r,{ref:t}),n)});Q_.displayName="Slot";const fk=p.forwardRef((e,t)=>{const{children:n,...r}=e;return p.isValidElement(n)?p.cloneElement(n,{...zae(r,n.props),ref:O8(t,n.ref)}):p.Children.count(n)>1?p.Children.only(null):null});fk.displayName="SlotClone";const Fae=({children:e})=>p.createElement(p.Fragment,null,e);function jae(e){return p.isValidElement(e)&&e.type===Fae}function zae(e,t){const n={...t};for(const r in t){const a=e[r],o=t[r];/^on[A-Z]/.test(r)?n[r]=(...s)=>{o==null||o(...s),a==null||a(...s)}:r==="style"?n[r]={...a,...o}:r==="className"&&(n[r]=[a,o].filter(Boolean).join(" "))}return{...e,...n}}const Uae=["a","button","div","h2","h3","img","li","nav","ol","p","span","svg","ul"],gh=Uae.reduce((e,t)=>{const n=p.forwardRef((r,a)=>{const{asChild:o,...i}=r,s=o?Q_:t;return p.useEffect(()=>{window[Symbol.for("radix-ui")]=!0},[]),p.createElement(s,W({},i,{ref:a}))});return n.displayName=`Primitive.${t}`,{...e,[t]:n}},{});function Bae(e,t){e&&ba.flushSync(()=>e.dispatchEvent(t))}function Hae(e){const t=Rs(e);p.useEffect(()=>{const n=r=>{r.key==="Escape"&&t(r)};return document.addEventListener("keydown",n),()=>document.removeEventListener("keydown",n)},[t])}const pk="dismissableLayer.update",Vae="dismissableLayer.pointerDownOutside",qae="dismissableLayer.focusOutside";let X2;const Gae=p.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),Wae=p.forwardRef((e,t)=>{const{disableOutsidePointerEvents:n=!1,onEscapeKeyDown:r,onPointerDownOutside:a,onFocusOutside:o,onInteractOutside:i,onDismiss:s,...l}=e,c=p.useContext(Gae),[u,d]=p.useState(null),[,g]=p.useState({}),m=yf(t,x=>d(x)),b=Array.from(c.layers),[y]=[...c.layersWithOutsidePointerEventsDisabled].slice(-1),w=b.indexOf(y),v=u?b.indexOf(u):-1,h=c.layersWithOutsidePointerEventsDisabled.size>0,S=v>=w,E=Kae(x=>{const C=x.target,_=[...c.branches].some(R=>R.contains(C));!S||_||(a==null||a(x),i==null||i(x),x.defaultPrevented||s==null||s())}),k=Yae(x=>{const C=x.target;[...c.branches].some(R=>R.contains(C))||(o==null||o(x),i==null||i(x),x.defaultPrevented||s==null||s())});return Hae(x=>{v===c.layers.size-1&&(r==null||r(x),!x.defaultPrevented&&s&&(x.preventDefault(),s()))}),p.useEffect(()=>{if(u)return n&&(c.layersWithOutsidePointerEventsDisabled.size===0&&(X2=document.body.style.pointerEvents,document.body.style.pointerEvents="none"),c.layersWithOutsidePointerEventsDisabled.add(u)),c.layers.add(u),Q2(),()=>{n&&c.layersWithOutsidePointerEventsDisabled.size===1&&(document.body.style.pointerEvents=X2)}},[u,n,c]),p.useEffect(()=>()=>{u&&(c.layers.delete(u),c.layersWithOutsidePointerEventsDisabled.delete(u),Q2())},[u,c]),p.useEffect(()=>{const x=()=>g({});return document.addEventListener(pk,x),()=>document.removeEventListener(pk,x)},[]),p.createElement(gh.div,W({},l,{ref:m,style:{pointerEvents:h?S?"auto":"none":void 0,...e.style},onFocusCapture:Bl(e.onFocusCapture,k.onFocusCapture),onBlurCapture:Bl(e.onBlurCapture,k.onBlurCapture),onPointerDownCapture:Bl(e.onPointerDownCapture,E.onPointerDownCapture)}))});function Kae(e){const t=Rs(e),n=p.useRef(!1),r=p.useRef(()=>{});return p.useEffect(()=>{const a=i=>{if(i.target&&!n.current){let c=function(){D8(Vae,t,l,{discrete:!0})};var s=c;const l={originalEvent:i};i.pointerType==="touch"?(document.removeEventListener("click",r.current),r.current=c,document.addEventListener("click",r.current,{once:!0})):c()}n.current=!1},o=window.setTimeout(()=>{document.addEventListener("pointerdown",a)},0);return()=>{window.clearTimeout(o),document.removeEventListener("pointerdown",a),document.removeEventListener("click",r.current)}},[t]),{onPointerDownCapture:()=>n.current=!0}}function Yae(e){const t=Rs(e),n=p.useRef(!1);return p.useEffect(()=>{const r=a=>{a.target&&!n.current&&D8(qae,t,{originalEvent:a},{discrete:!1})};return document.addEventListener("focusin",r),()=>document.removeEventListener("focusin",r)},[t]),{onFocusCapture:()=>n.current=!0,onBlurCapture:()=>n.current=!1}}function Q2(){const e=new CustomEvent(pk);document.dispatchEvent(e)}function D8(e,t,n,{discrete:r}){const a=n.originalEvent.target,o=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&a.addEventListener(e,t,{once:!0}),r?Bae(a,o):a.dispatchEvent(o)}const oy="focusScope.autoFocusOnMount",iy="focusScope.autoFocusOnUnmount",J2={bubbles:!1,cancelable:!0},Zae=p.forwardRef((e,t)=>{const{loop:n=!1,trapped:r=!1,onMountAutoFocus:a,onUnmountAutoFocus:o,...i}=e,[s,l]=p.useState(null),c=Rs(a),u=Rs(o),d=p.useRef(null),g=yf(t,y=>l(y)),m=p.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;p.useEffect(()=>{if(r){let v=function(S){if(m.paused||!s)return;const E=S.target;s.contains(E)?d.current=E:Yi(d.current,{select:!0})},h=function(S){m.paused||!s||s.contains(S.relatedTarget)||Yi(d.current,{select:!0})};var y=v,w=h;return document.addEventListener("focusin",v),document.addEventListener("focusout",h),()=>{document.removeEventListener("focusin",v),document.removeEventListener("focusout",h)}}},[r,s,m.paused]),p.useEffect(()=>{if(s){tN.add(m);const y=document.activeElement;if(!s.contains(y)){const v=new CustomEvent(oy,J2);s.addEventListener(oy,c),s.dispatchEvent(v),v.defaultPrevented||(Xae(noe(L8(s)),{select:!0}),document.activeElement===y&&Yi(s))}return()=>{s.removeEventListener(oy,c),setTimeout(()=>{const v=new CustomEvent(iy,J2);s.addEventListener(iy,u),s.dispatchEvent(v),v.defaultPrevented||Yi(y??document.body,{select:!0}),s.removeEventListener(iy,u),tN.remove(m)},0)}}},[s,c,u,m]);const b=p.useCallback(y=>{if(!n&&!r||m.paused)return;const w=y.key==="Tab"&&!y.altKey&&!y.ctrlKey&&!y.metaKey,v=document.activeElement;if(w&&v){const h=y.currentTarget,[S,E]=Qae(h);S&&E?!y.shiftKey&&v===E?(y.preventDefault(),n&&Yi(S,{select:!0})):y.shiftKey&&v===S&&(y.preventDefault(),n&&Yi(E,{select:!0})):v===h&&y.preventDefault()}},[n,r,m.paused]);return p.createElement(gh.div,W({tabIndex:-1},i,{ref:g,onKeyDown:b}))});function Xae(e,{select:t=!1}={}){const n=document.activeElement;for(const r of e)if(Yi(r,{select:t}),document.activeElement!==n)return}function Qae(e){const t=L8(e),n=eN(t,e),r=eN(t.reverse(),e);return[n,r]}function L8(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>{const a=r.tagName==="INPUT"&&r.type==="hidden";return r.disabled||r.hidden||a?NodeFilter.FILTER_SKIP:r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function eN(e,t){for(const n of e)if(!Jae(n,{upTo:t}))return n}function Jae(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function eoe(e){return e instanceof HTMLInputElement&&"select"in e}function Yi(e,{select:t=!1}={}){if(e&&e.focus){const n=document.activeElement;e.focus({preventScroll:!0}),e!==n&&eoe(e)&&t&&e.select()}}const tN=toe();function toe(){let e=[];return{add(t){const n=e[0];t!==n&&(n==null||n.pause()),e=nN(e,t),e.unshift(t)},remove(t){var n;e=nN(e,t),(n=e[0])===null||n===void 0||n.resume()}}}function nN(e,t){const n=[...e],r=n.indexOf(t);return r!==-1&&n.splice(r,1),n}function noe(e){return e.filter(t=>t.tagName!=="A")}const roe=p.forwardRef((e,t)=>{var n;const{container:r=globalThis==null||(n=globalThis.document)===null||n===void 0?void 0:n.body,...a}=e;return r?qC.createPortal(p.createElement(gh.div,W({},a,{ref:t})),r):null});function aoe(e,t){return p.useReducer((n,r)=>{const a=t[n][r];return a??n},e)}const mh=e=>{const{present:t,children:n}=e,r=ooe(t),a=typeof n=="function"?n({present:r.isPresent}):p.Children.only(n),o=yf(r.ref,a.ref);return typeof n=="function"||r.isPresent?p.cloneElement(a,{ref:o}):null};mh.displayName="Presence";function ooe(e){const[t,n]=p.useState(),r=p.useRef({}),a=p.useRef(e),o=p.useRef("none"),i=e?"mounted":"unmounted",[s,l]=aoe(i,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return p.useEffect(()=>{const c=lp(r.current);o.current=s==="mounted"?c:"none"},[s]),dk(()=>{const c=r.current,u=a.current;if(u!==e){const g=o.current,m=lp(c);e?l("MOUNT"):m==="none"||(c==null?void 0:c.display)==="none"?l("UNMOUNT"):l(u&&g!==m?"ANIMATION_OUT":"UNMOUNT"),a.current=e}},[e,l]),dk(()=>{if(t){const c=d=>{const m=lp(r.current).includes(d.animationName);d.target===t&&m&&ba.flushSync(()=>l("ANIMATION_END"))},u=d=>{d.target===t&&(o.current=lp(r.current))};return t.addEventListener("animationstart",u),t.addEventListener("animationcancel",c),t.addEventListener("animationend",c),()=>{t.removeEventListener("animationstart",u),t.removeEventListener("animationcancel",c),t.removeEventListener("animationend",c)}}else l("ANIMATION_END")},[t,l]),{isPresent:["mounted","unmountSuspended"].includes(s),ref:p.useCallback(c=>{c&&(r.current=getComputedStyle(c)),n(c)},[])}}function lp(e){return(e==null?void 0:e.animationName)||"none"}let sy=0;function ioe(){p.useEffect(()=>{var e,t;const n=document.querySelectorAll("[data-radix-focus-guard]");return document.body.insertAdjacentElement("afterbegin",(e=n[0])!==null&&e!==void 0?e:rN()),document.body.insertAdjacentElement("beforeend",(t=n[1])!==null&&t!==void 0?t:rN()),sy++,()=>{sy===1&&document.querySelectorAll("[data-radix-focus-guard]").forEach(r=>r.remove()),sy--}},[])}function rN(){const e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.cssText="outline: none; opacity: 0; position: fixed; pointer-events: none",e}var M8=c7(),ly=function(){},hh=p.forwardRef(function(e,t){var n=p.useRef(null),r=p.useState({onScrollCapture:ly,onWheelCapture:ly,onTouchMoveCapture:ly}),a=r[0],o=r[1],i=e.forwardProps,s=e.children,l=e.className,c=e.removeScrollBar,u=e.enabled,d=e.shards,g=e.sideCar,m=e.noIsolation,b=e.inert,y=e.allowPinchZoom,w=e.as,v=w===void 0?"div":w,h=O_(e,["forwardProps","children","className","removeScrollBar","enabled","shards","sideCar","noIsolation","inert","allowPinchZoom","as"]),S=g,E=l7([n,t]),k=Pn(Pn({},h),a);return p.createElement(p.Fragment,null,u&&p.createElement(S,{sideCar:M8,removeScrollBar:c,shards:d,noIsolation:m,inert:b,setCallbacks:o,allowPinchZoom:!!y,lockRef:n}),i?p.cloneElement(p.Children.only(s),Pn(Pn({},k),{ref:E})):p.createElement(v,Pn({},k,{className:l,ref:E}),s))});hh.defaultProps={enabled:!0,removeScrollBar:!0,inert:!1};hh.classNames={fullWidth:qu,zeroRight:Vu};var gk=!1;if(typeof window<"u")try{var cp=Object.defineProperty({},"passive",{get:function(){return gk=!0,!0}});window.addEventListener("test",cp,cp),window.removeEventListener("test",cp,cp)}catch{gk=!1}var rl=gk?{passive:!1}:!1,soe=function(e){var t=window.getComputedStyle(e);return t.overflowY!=="hidden"&&!(t.overflowY===t.overflowX&&t.overflowY==="visible")},loe=function(e){var t=window.getComputedStyle(e);return t.overflowX!=="hidden"&&!(t.overflowY===t.overflowX&&t.overflowX==="visible")},aN=function(e,t){var n=t;do{typeof ShadowRoot<"u"&&n instanceof ShadowRoot&&(n=n.host);var r=P8(e,n);if(r){var a=$8(e,n),o=a[1],i=a[2];if(o>i)return!0}n=n.parentNode}while(n&&n!==document.body);return!1},coe=function(e){var t=e.scrollTop,n=e.scrollHeight,r=e.clientHeight;return[t,n,r]},uoe=function(e){var t=e.scrollLeft,n=e.scrollWidth,r=e.clientWidth;return[t,n,r]},P8=function(e,t){return e==="v"?soe(t):loe(t)},$8=function(e,t){return e==="v"?coe(t):uoe(t)},doe=function(e,t){return e==="h"&&t==="rtl"?-1:1},foe=function(e,t,n,r,a){var o=doe(e,window.getComputedStyle(t).direction),i=o*r,s=n.target,l=t.contains(s),c=!1,u=i>0,d=0,g=0;do{var m=$8(e,s),b=m[0],y=m[1],w=m[2],v=y-w-o*b;(b||v)&&P8(e,s)&&(d+=v,g+=b),s=s.parentNode}while(!l&&s!==document.body||l&&(t.contains(s)||t===s));return(u&&(a&&d===0||!a&&i>d)||!u&&(a&&g===0||!a&&-i>g))&&(c=!0),c},up=function(e){return"changedTouches"in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},oN=function(e){return[e.deltaX,e.deltaY]},iN=function(e){return e&&"current"in e?e.current:e},poe=function(e,t){return e[0]===t[0]&&e[1]===t[1]},goe=function(e){return` +`)},aee=0,el=[];function oee(e){var t=p.useRef([]),n=p.useRef([0,0]),r=p.useRef(),a=p.useState(aee++)[0],o=p.useState(function(){return D_()})[0],i=p.useRef(e);p.useEffect(function(){i.current=e},[e]),p.useEffect(function(){if(e.inert){document.body.classList.add("block-interactivity-".concat(a));var y=l7([e.lockRef.current],(e.shards||[]).map(L2),!0).filter(Boolean);return y.forEach(function(w){return w.classList.add("allow-interactivity-".concat(a))}),function(){document.body.classList.remove("block-interactivity-".concat(a)),y.forEach(function(w){return w.classList.remove("allow-interactivity-".concat(a))})}}},[e.inert,e.lockRef.current,e.shards]);var s=p.useCallback(function(y,w){if("touches"in y&&y.touches.length===2)return!i.current.allowPinchZoom;var v=ap(y),h=n.current,S="deltaX"in y?y.deltaX:h[0]-v[0],E="deltaY"in y?y.deltaY:h[1]-v[1],k,x=y.target,C=Math.abs(S)>Math.abs(E)?"h":"v";if("touches"in y&&C==="h"&&x.type==="range")return!1;var _=O2(C,x);if(!_)return!0;if(_?k=C:(k=C==="v"?"h":"v",_=O2(C,x)),!_)return!1;if(!r.current&&"changedTouches"in y&&(S||E)&&(r.current=k),!k)return!0;var R=r.current||k;return tee(R,w,y,R==="h"?S:E,!0)},[]),l=p.useCallback(function(y){var w=y;if(!(!el.length||el[el.length-1]!==o)){var v="deltaY"in w?D2(w):ap(w),h=t.current.filter(function(k){return k.name===w.type&&k.target===w.target&&nee(k.delta,v)})[0];if(h&&h.should){w.cancelable&&w.preventDefault();return}if(!h){var S=(i.current.shards||[]).map(L2).filter(Boolean).filter(function(k){return k.contains(w.target)}),E=S.length>0?s(w,S[0]):!i.current.noIsolation;E&&w.cancelable&&w.preventDefault()}}},[]),c=p.useCallback(function(y,w,v,h){var S={name:y,delta:w,target:v,should:h};t.current.push(S),setTimeout(function(){t.current=t.current.filter(function(E){return E!==S})},1)},[]),u=p.useCallback(function(y){n.current=ap(y),r.current=void 0},[]),d=p.useCallback(function(y){c(y.type,D2(y),y.target,s(y,e.lockRef.current))},[]),g=p.useCallback(function(y){c(y.type,ap(y),y.target,s(y,e.lockRef.current))},[]);p.useEffect(function(){return el.push(o),e.setCallbacks({onScrollCapture:d,onWheelCapture:d,onTouchMoveCapture:g}),document.addEventListener("wheel",l,Js),document.addEventListener("touchmove",l,Js),document.addEventListener("touchstart",u,Js),function(){el=el.filter(function(y){return y!==o}),document.removeEventListener("wheel",l,Js),document.removeEventListener("touchmove",l,Js),document.removeEventListener("touchstart",u,Js)}},[]);var m=e.removeScrollBar,b=e.inert;return p.createElement(p.Fragment,null,b?p.createElement(o,{styles:ree(a)}):null,m?p.createElement(g7,{gapMode:"margin"}):null)}const iee=f7(p7,oee);var y7=p.forwardRef(function(e,t){return p.createElement(ih,Pn({},e,{ref:t,sideCar:iee}))});y7.classNames=ih.classNames;const sh=y7,ak=["Enter"," "],see=["ArrowDown","PageUp","Home"],v7=["ArrowUp","PageDown","End"],lee=[...see,...v7],cee={ltr:[...ak,"ArrowRight"],rtl:[...ak,"ArrowLeft"]},uee={ltr:["ArrowLeft"],rtl:["ArrowRight"]},lh="Menu",[Ed,dee,fee]=Nm(lh),[js,S7]=zn(lh,[fee,qa,oh]),w7=qa(),E7=oh(),[nTe,zs]=js(lh),[rTe,hf]=js(lh),pee=p.forwardRef((e,t)=>{const{__scopeMenu:n,...r}=e,a=w7(n);return p.createElement(pf,W({},a,r,{ref:t}))}),x7="MenuPortal",[gee,k7]=js(x7,{forceMount:void 0}),mee=e=>{const{__scopeMenu:t,forceMount:n,children:r,container:a}=e,o=zs(x7,t);return p.createElement(gee,{scope:t,forceMount:n},p.createElement(pr,{present:n||o.open},p.createElement(Jd,{asChild:!0,container:a},r)))},ga="MenuContent",[hee,L_]=js(ga),bee=p.forwardRef((e,t)=>{const n=k7(ga,e.__scopeMenu),{forceMount:r=n.forceMount,...a}=e,o=zs(ga,e.__scopeMenu),i=hf(ga,e.__scopeMenu);return p.createElement(Ed.Provider,{scope:e.__scopeMenu},p.createElement(pr,{present:r||o.open},p.createElement(Ed.Slot,{scope:e.__scopeMenu},i.modal?p.createElement(yee,W({},a,{ref:t})):p.createElement(vee,W({},a,{ref:t})))))}),yee=p.forwardRef((e,t)=>{const n=zs(ga,e.__scopeMenu),r=p.useRef(null),a=nt(t,r);return p.useEffect(()=>{const o=r.current;if(o)return mf(o)},[]),p.createElement(M_,W({},e,{ref:a,trapFocus:n.open,disableOutsidePointerEvents:n.open,disableOutsideScroll:!0,onFocusOutside:fe(e.onFocusOutside,o=>o.preventDefault(),{checkForDefaultPrevented:!1}),onDismiss:()=>n.onOpenChange(!1)}))}),vee=p.forwardRef((e,t)=>{const n=zs(ga,e.__scopeMenu);return p.createElement(M_,W({},e,{ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,disableOutsideScroll:!1,onDismiss:()=>n.onOpenChange(!1)}))}),M_=p.forwardRef((e,t)=>{const{__scopeMenu:n,loop:r=!1,trapFocus:a,onOpenAutoFocus:o,onCloseAutoFocus:i,disableOutsidePointerEvents:s,onEntryFocus:l,onEscapeKeyDown:c,onPointerDownOutside:u,onFocusOutside:d,onInteractOutside:g,onDismiss:m,disableOutsideScroll:b,...y}=e,w=zs(ga,n),v=hf(ga,n),h=w7(n),S=E7(n),E=dee(n),[k,x]=p.useState(null),C=p.useRef(null),_=nt(t,C,w.onContentChange),R=p.useRef(0),T=p.useRef(""),L=p.useRef(0),D=p.useRef(null),H=p.useRef("right"),z=p.useRef(0),M=b?sh:p.Fragment,U=b?{as:$a,allowPinchZoom:!0}:void 0,X=O=>{var A,V;const P=T.current+O,N=E().filter(he=>!he.disabled),K=document.activeElement,ae=(A=N.find(he=>he.ref.current===K))===null||A===void 0?void 0:A.textValue,ne=N.map(he=>he.textValue),Q=Mee(ne,P,ae),pe=(V=N.find(he=>he.textValue===Q))===null||V===void 0?void 0:V.ref.current;(function he(re){T.current=re,window.clearTimeout(R.current),re!==""&&(R.current=window.setTimeout(()=>he(""),1e3))})(P),pe&&setTimeout(()=>pe.focus())};p.useEffect(()=>()=>window.clearTimeout(R.current),[]),eh();const j=p.useCallback(O=>{var A,V;return H.current===((A=D.current)===null||A===void 0?void 0:A.side)&&$ee(O,(V=D.current)===null||V===void 0?void 0:V.area)},[]);return p.createElement(hee,{scope:n,searchRef:T,onItemEnter:p.useCallback(O=>{j(O)&&O.preventDefault()},[j]),onItemLeave:p.useCallback(O=>{var A;j(O)||((A=C.current)===null||A===void 0||A.focus(),x(null))},[j]),onTriggerLeave:p.useCallback(O=>{j(O)&&O.preventDefault()},[j]),pointerGraceTimerRef:L,onPointerGraceIntentChange:p.useCallback(O=>{D.current=O},[])},p.createElement(M,U,p.createElement(th,{asChild:!0,trapped:a,onMountAutoFocus:fe(o,O=>{var A;O.preventDefault(),(A=C.current)===null||A===void 0||A.focus()}),onUnmountAutoFocus:i},p.createElement(Ls,{asChild:!0,disableOutsidePointerEvents:s,onEscapeKeyDown:c,onPointerDownOutside:u,onFocusOutside:d,onInteractOutside:g,onDismiss:m},p.createElement(o7,W({asChild:!0},S,{dir:v.dir,orientation:"vertical",loop:r,currentTabStopId:k,onCurrentTabStopIdChange:x,onEntryFocus:fe(l,O=>{v.isUsingKeyboardRef.current||O.preventDefault()})}),p.createElement(gf,W({role:"menu","aria-orientation":"vertical","data-state":R7(w.open),"data-radix-menu-content":"",dir:v.dir},h,y,{ref:_,style:{outline:"none",...y.style},onKeyDown:fe(y.onKeyDown,O=>{const V=O.target.closest("[data-radix-menu-content]")===O.currentTarget,P=O.ctrlKey||O.altKey||O.metaKey,N=O.key.length===1;V&&(O.key==="Tab"&&O.preventDefault(),!P&&N&&X(O.key));const K=C.current;if(O.target!==K||!lee.includes(O.key))return;O.preventDefault();const ne=E().filter(Q=>!Q.disabled).map(Q=>Q.ref.current);v7.includes(O.key)&&ne.reverse(),Dee(ne)}),onBlur:fe(e.onBlur,O=>{O.currentTarget.contains(O.target)||(window.clearTimeout(R.current),T.current="")}),onPointerMove:fe(e.onPointerMove,xd(O=>{const A=O.target,V=z.current!==O.clientX;if(O.currentTarget.contains(A)&&V){const P=O.clientX>z.current?"right":"left";H.current=P,z.current=O.clientX}}))})))))))}),See=p.forwardRef((e,t)=>{const{__scopeMenu:n,...r}=e;return p.createElement(ze.div,W({},r,{ref:t}))}),ok="MenuItem",M2="menu.itemSelect",P_=p.forwardRef((e,t)=>{const{disabled:n=!1,onSelect:r,...a}=e,o=p.useRef(null),i=hf(ok,e.__scopeMenu),s=L_(ok,e.__scopeMenu),l=nt(t,o),c=p.useRef(!1),u=()=>{const d=o.current;if(!n&&d){const g=new CustomEvent(M2,{bubbles:!0,cancelable:!0});d.addEventListener(M2,m=>r==null?void 0:r(m),{once:!0}),KC(d,g),g.defaultPrevented?c.current=!1:i.onClose()}};return p.createElement(C7,W({},a,{ref:l,disabled:n,onClick:fe(e.onClick,u),onPointerDown:d=>{var g;(g=e.onPointerDown)===null||g===void 0||g.call(e,d),c.current=!0},onPointerUp:fe(e.onPointerUp,d=>{var g;c.current||(g=d.currentTarget)===null||g===void 0||g.click()}),onKeyDown:fe(e.onKeyDown,d=>{const g=s.searchRef.current!=="";n||g&&d.key===" "||ak.includes(d.key)&&(d.currentTarget.click(),d.preventDefault())})}))}),C7=p.forwardRef((e,t)=>{const{__scopeMenu:n,disabled:r=!1,textValue:a,...o}=e,i=L_(ok,n),s=E7(n),l=p.useRef(null),c=nt(t,l),[u,d]=p.useState(!1),[g,m]=p.useState("");return p.useEffect(()=>{const b=l.current;if(b){var y;m(((y=b.textContent)!==null&&y!==void 0?y:"").trim())}},[o.children]),p.createElement(Ed.ItemSlot,{scope:n,disabled:r,textValue:a??g},p.createElement(i7,W({asChild:!0},s,{focusable:!r}),p.createElement(ze.div,W({role:"menuitem","data-highlighted":u?"":void 0,"aria-disabled":r||void 0,"data-disabled":r?"":void 0},o,{ref:c,onPointerMove:fe(e.onPointerMove,xd(b=>{r?i.onItemLeave(b):(i.onItemEnter(b),b.defaultPrevented||b.currentTarget.focus())})),onPointerLeave:fe(e.onPointerLeave,xd(b=>i.onItemLeave(b))),onFocus:fe(e.onFocus,()=>d(!0)),onBlur:fe(e.onBlur,()=>d(!1))}))))}),wee=p.forwardRef((e,t)=>{const{checked:n=!1,onCheckedChange:r,...a}=e;return p.createElement(A7,{scope:e.__scopeMenu,checked:n},p.createElement(P_,W({role:"menuitemcheckbox","aria-checked":Pg(n)?"mixed":n},a,{ref:t,"data-state":$_(n),onSelect:fe(a.onSelect,()=>r==null?void 0:r(Pg(n)?!0:!n),{checkForDefaultPrevented:!1})})))}),Eee="MenuRadioGroup",[aTe,xee]=js(Eee,{value:void 0,onValueChange:()=>{}}),kee="MenuRadioItem",Cee=p.forwardRef((e,t)=>{const{value:n,...r}=e,a=xee(kee,e.__scopeMenu),o=n===a.value;return p.createElement(A7,{scope:e.__scopeMenu,checked:o},p.createElement(P_,W({role:"menuitemradio","aria-checked":o},r,{ref:t,"data-state":$_(o),onSelect:fe(r.onSelect,()=>{var i;return(i=a.onValueChange)===null||i===void 0?void 0:i.call(a,n)},{checkForDefaultPrevented:!1})})))}),_7="MenuItemIndicator",[A7,_ee]=js(_7,{checked:!1}),Aee=p.forwardRef((e,t)=>{const{__scopeMenu:n,forceMount:r,...a}=e,o=_ee(_7,n);return p.createElement(pr,{present:r||Pg(o.checked)||o.checked===!0},p.createElement(ze.span,W({},a,{ref:t,"data-state":$_(o.checked)})))}),Tee=p.forwardRef((e,t)=>{const{__scopeMenu:n,...r}=e;return p.createElement(ze.div,W({role:"separator","aria-orientation":"horizontal"},r,{ref:t}))}),Ree="MenuSub",[oTe,T7]=js(Ree),op="MenuSubTrigger",Nee=p.forwardRef((e,t)=>{const n=zs(op,e.__scopeMenu),r=hf(op,e.__scopeMenu),a=T7(op,e.__scopeMenu),o=L_(op,e.__scopeMenu),i=p.useRef(null),{pointerGraceTimerRef:s,onPointerGraceIntentChange:l}=o,c={__scopeMenu:e.__scopeMenu},u=p.useCallback(()=>{i.current&&window.clearTimeout(i.current),i.current=null},[]);return p.useEffect(()=>u,[u]),p.useEffect(()=>{const d=s.current;return()=>{window.clearTimeout(d),l(null)}},[s,l]),p.createElement(pee,W({asChild:!0},c),p.createElement(C7,W({id:a.triggerId,"aria-haspopup":"menu","aria-expanded":n.open,"aria-controls":a.contentId,"data-state":R7(n.open)},e,{ref:WC(t,a.onTriggerChange),onClick:d=>{var g;(g=e.onClick)===null||g===void 0||g.call(e,d),!(e.disabled||d.defaultPrevented)&&(d.currentTarget.focus(),n.open||n.onOpenChange(!0))},onPointerMove:fe(e.onPointerMove,xd(d=>{o.onItemEnter(d),!d.defaultPrevented&&!e.disabled&&!n.open&&!i.current&&(o.onPointerGraceIntentChange(null),i.current=window.setTimeout(()=>{n.onOpenChange(!0),u()},100))})),onPointerLeave:fe(e.onPointerLeave,xd(d=>{var g;u();const m=(g=n.content)===null||g===void 0?void 0:g.getBoundingClientRect();if(m){var b;const y=(b=n.content)===null||b===void 0?void 0:b.dataset.side,w=y==="right",v=w?-5:5,h=m[w?"left":"right"],S=m[w?"right":"left"];o.onPointerGraceIntentChange({area:[{x:d.clientX+v,y:d.clientY},{x:h,y:m.top},{x:S,y:m.top},{x:S,y:m.bottom},{x:h,y:m.bottom}],side:y}),window.clearTimeout(s.current),s.current=window.setTimeout(()=>o.onPointerGraceIntentChange(null),300)}else{if(o.onTriggerLeave(d),d.defaultPrevented)return;o.onPointerGraceIntentChange(null)}})),onKeyDown:fe(e.onKeyDown,d=>{const g=o.searchRef.current!=="";if(!(e.disabled||g&&d.key===" ")&&cee[r.dir].includes(d.key)){var m;n.onOpenChange(!0),(m=n.content)===null||m===void 0||m.focus(),d.preventDefault()}})})))}),Iee="MenuSubContent",Oee=p.forwardRef((e,t)=>{const n=k7(ga,e.__scopeMenu),{forceMount:r=n.forceMount,...a}=e,o=zs(ga,e.__scopeMenu),i=hf(ga,e.__scopeMenu),s=T7(Iee,e.__scopeMenu),l=p.useRef(null),c=nt(t,l);return p.createElement(Ed.Provider,{scope:e.__scopeMenu},p.createElement(pr,{present:r||o.open},p.createElement(Ed.Slot,{scope:e.__scopeMenu},p.createElement(M_,W({id:s.contentId,"aria-labelledby":s.triggerId},a,{ref:c,align:"start",side:i.dir==="rtl"?"left":"right",disableOutsidePointerEvents:!1,disableOutsideScroll:!1,trapFocus:!1,onOpenAutoFocus:u=>{var d;i.isUsingKeyboardRef.current&&((d=l.current)===null||d===void 0||d.focus()),u.preventDefault()},onCloseAutoFocus:u=>u.preventDefault(),onFocusOutside:fe(e.onFocusOutside,u=>{u.target!==s.trigger&&o.onOpenChange(!1)}),onEscapeKeyDown:fe(e.onEscapeKeyDown,u=>{i.onClose(),u.preventDefault()}),onKeyDown:fe(e.onKeyDown,u=>{const d=u.currentTarget.contains(u.target),g=uee[i.dir].includes(u.key);if(d&&g){var m;o.onOpenChange(!1),(m=s.trigger)===null||m===void 0||m.focus(),u.preventDefault()}})})))))});function R7(e){return e?"open":"closed"}function Pg(e){return e==="indeterminate"}function $_(e){return Pg(e)?"indeterminate":e?"checked":"unchecked"}function Dee(e){const t=document.activeElement;for(const n of e)if(n===t||(n.focus(),document.activeElement!==t))return}function Lee(e,t){return e.map((n,r)=>e[(t+r)%e.length])}function Mee(e,t,n){const a=t.length>1&&Array.from(t).every(c=>c===t[0])?t[0]:t,o=n?e.indexOf(n):-1;let i=Lee(e,Math.max(o,0));a.length===1&&(i=i.filter(c=>c!==n));const l=i.find(c=>c.toLowerCase().startsWith(a.toLowerCase()));return l!==n?l:void 0}function Pee(e,t){const{x:n,y:r}=e;let a=!1;for(let o=0,i=t.length-1;or!=u>r&&n<(c-s)*(r-l)/(u-l)+s&&(a=!a)}return a}function $ee(e,t){if(!t)return!1;const n={x:e.clientX,y:e.clientY};return Pee(n,t)}function xd(e){return t=>t.pointerType==="mouse"?e(t):void 0}const Fee=mee,jee=bee,zee=See,Uee=P_,Bee=wee,Hee=Cee,Vee=Aee,qee=Tee,Gee=Nee,Wee=Oee,N7="DropdownMenu",[Kee,iTe]=zn(N7,[S7]),Ga=S7(),[sTe,Yee]=Kee(N7),Zee=e=>{const{__scopeDropdownMenu:t,...n}=e,r=Ga(t);return p.createElement(Fee,W({},r,n))},Xee="DropdownMenuContent",Qee=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Yee(Xee,n),o=Ga(n),i=p.useRef(!1);return p.createElement(jee,W({id:a.contentId,"aria-labelledby":a.triggerId},o,r,{ref:t,onCloseAutoFocus:fe(e.onCloseAutoFocus,s=>{var l;i.current||(l=a.triggerRef.current)===null||l===void 0||l.focus(),i.current=!1,s.preventDefault()}),onInteractOutside:fe(e.onInteractOutside,s=>{const l=s.detail.originalEvent,c=l.button===0&&l.ctrlKey===!0,u=l.button===2||c;(!a.modal||u)&&(i.current=!0)}),style:{...e.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}}))}),Jee=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Ga(n);return p.createElement(zee,W({},a,r,{ref:t}))}),ete=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Ga(n);return p.createElement(Uee,W({},a,r,{ref:t}))}),tte=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Ga(n);return p.createElement(Bee,W({},a,r,{ref:t}))}),nte=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Ga(n);return p.createElement(Hee,W({},a,r,{ref:t}))}),rte=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Ga(n);return p.createElement(Vee,W({},a,r,{ref:t}))}),ate=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Ga(n);return p.createElement(qee,W({},a,r,{ref:t}))}),ote=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Ga(n);return p.createElement(Gee,W({},a,r,{ref:t}))}),ite=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Ga(n);return p.createElement(Wee,W({},a,r,{ref:t,style:{...e.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}}))}),ste=Zee,I7=Qee,O7=Jee,D7=ete,L7=tte,M7=nte,P7=rte,$7=ate,F7=ote,j7=ite,lte=p.forwardRef(({className:e,inset:t,children:n,...r},a)=>f.jsxs(F7,{ref:a,className:ee("flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent",t&&"pl-8",e),...r,children:[n,f.jsx($m,{className:"ml-auto h-4 w-4"})]}));lte.displayName=F7.displayName;const cte=p.forwardRef(({className:e,...t},n)=>f.jsx(j7,{ref:n,className:ee("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...t}));cte.displayName=j7.displayName;const ute=p.forwardRef(({className:e,sideOffset:t=4,...n},r)=>f.jsx(ste,{children:f.jsx(I7,{ref:r,sideOffset:t,className:ee("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...n})}));ute.displayName=I7.displayName;const dte=p.forwardRef(({className:e,inset:t,...n},r)=>f.jsx(D7,{ref:r,className:ee("relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",t&&"pl-8",e),...n}));dte.displayName=D7.displayName;const fte=p.forwardRef(({className:e,children:t,checked:n,...r},a)=>f.jsxs(L7,{ref:a,className:ee("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),checked:n,...r,children:[f.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:f.jsx(P7,{children:f.jsx(Pm,{className:"h-4 w-4"})})}),t]}));fte.displayName=L7.displayName;const pte=p.forwardRef(({className:e,children:t,...n},r)=>f.jsxs(M7,{ref:r,className:ee("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),...n,children:[f.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:f.jsx(P7,{children:f.jsx(Q4,{className:"h-2 w-2 fill-current"})})}),t]}));pte.displayName=M7.displayName;const gte=p.forwardRef(({className:e,inset:t,...n},r)=>f.jsx(O7,{ref:r,className:ee("px-2 py-1.5 text-sm font-semibold",t&&"pl-8",e),...n}));gte.displayName=O7.displayName;const mte=p.forwardRef(({className:e,...t},n)=>f.jsx($7,{ref:n,className:ee("-mx-1 my-1 h-px bg-muted",e),...t}));mte.displayName=$7.displayName;function P2(e,[t,n]){return Math.min(n,Math.max(t,e))}function F_(e){const t=p.useRef({value:e,previous:e});return p.useMemo(()=>(t.current.value!==e&&(t.current.previous=t.current.value,t.current.value=e),t.current.previous),[e])}const hte=[" ","Enter","ArrowUp","ArrowDown"],bte=[" ","Enter"],ch="Select",[uh,j_,yte]=Nm(ch),[jc,lTe]=zn(ch,[yte,qa]),z_=qa(),[vte,Us]=jc(ch),[Ste,wte]=jc(ch),Ete=e=>{const{__scopeSelect:t,children:n,open:r,defaultOpen:a,onOpenChange:o,value:i,defaultValue:s,onValueChange:l,dir:c,name:u,autoComplete:d,disabled:g,required:m}=e,b=z_(t),[y,w]=p.useState(null),[v,h]=p.useState(null),[S,E]=p.useState(!1),k=x_(c),[x=!1,C]=Fa({prop:r,defaultProp:a,onChange:o}),[_,R]=Fa({prop:i,defaultProp:s,onChange:l}),T=p.useRef(null),L=y?!!y.closest("form"):!0,[D,H]=p.useState(new Set),z=Array.from(D).map(M=>M.props.value).join(";");return p.createElement(ah,b,p.createElement(vte,{required:m,scope:t,trigger:y,onTriggerChange:w,valueNode:v,onValueNodeChange:h,valueNodeHasChildren:S,onValueNodeHasChildrenChange:E,contentId:bi(),value:_,onValueChange:R,open:x,onOpenChange:C,dir:k,triggerPointerDownPosRef:T,disabled:g},p.createElement(uh.Provider,{scope:t},p.createElement(Ste,{scope:e.__scopeSelect,onNativeOptionAdd:p.useCallback(M=>{H(U=>new Set(U).add(M))},[]),onNativeOptionRemove:p.useCallback(M=>{H(U=>{const X=new Set(U);return X.delete(M),X})},[])},n)),L?p.createElement(H7,{key:z,"aria-hidden":!0,required:m,tabIndex:-1,name:u,autoComplete:d,value:_,onChange:M=>R(M.target.value),disabled:g},_===void 0?p.createElement("option",{value:""}):null,Array.from(D)):null))},xte="SelectTrigger",kte=p.forwardRef((e,t)=>{const{__scopeSelect:n,disabled:r=!1,...a}=e,o=z_(n),i=Us(xte,n),s=i.disabled||r,l=nt(t,i.onTriggerChange),c=j_(n),[u,d,g]=V7(b=>{const y=c().filter(h=>!h.disabled),w=y.find(h=>h.value===i.value),v=q7(y,b,w);v!==void 0&&i.onValueChange(v.value)}),m=()=>{s||(i.onOpenChange(!0),g())};return p.createElement(pf,W({asChild:!0},o),p.createElement(ze.button,W({type:"button",role:"combobox","aria-controls":i.contentId,"aria-expanded":i.open,"aria-required":i.required,"aria-autocomplete":"none",dir:i.dir,"data-state":i.open?"open":"closed",disabled:s,"data-disabled":s?"":void 0,"data-placeholder":B7(i.value)?"":void 0},a,{ref:l,onClick:fe(a.onClick,b=>{b.currentTarget.focus()}),onPointerDown:fe(a.onPointerDown,b=>{const y=b.target;y.hasPointerCapture(b.pointerId)&&y.releasePointerCapture(b.pointerId),b.button===0&&b.ctrlKey===!1&&(m(),i.triggerPointerDownPosRef.current={x:Math.round(b.pageX),y:Math.round(b.pageY)},b.preventDefault())}),onKeyDown:fe(a.onKeyDown,b=>{const y=u.current!=="";!(b.ctrlKey||b.altKey||b.metaKey)&&b.key.length===1&&d(b.key),!(y&&b.key===" ")&&hte.includes(b.key)&&(m(),b.preventDefault())})})))}),Cte="SelectValue",_te=p.forwardRef((e,t)=>{const{__scopeSelect:n,className:r,style:a,children:o,placeholder:i="",...s}=e,l=Us(Cte,n),{onValueNodeHasChildrenChange:c}=l,u=o!==void 0,d=nt(t,l.onValueNodeChange);return Zr(()=>{c(u)},[c,u]),p.createElement(ze.span,W({},s,{ref:d,style:{pointerEvents:"none"}}),B7(l.value)?p.createElement(p.Fragment,null,i):o)}),Ate=p.forwardRef((e,t)=>{const{__scopeSelect:n,children:r,...a}=e;return p.createElement(ze.span,W({"aria-hidden":!0},a,{ref:t}),r||"▼")}),Tte=e=>p.createElement(Jd,W({asChild:!0},e)),Sc="SelectContent",Rte=p.forwardRef((e,t)=>{const n=Us(Sc,e.__scopeSelect),[r,a]=p.useState();if(Zr(()=>{a(new DocumentFragment)},[]),!n.open){const o=r;return o?ba.createPortal(p.createElement(z7,{scope:e.__scopeSelect},p.createElement(uh.Slot,{scope:e.__scopeSelect},p.createElement("div",null,e.children))),o):null}return p.createElement(Nte,W({},e,{ref:t}))}),ro=10,[z7,dh]=jc(Sc),Nte=p.forwardRef((e,t)=>{const{__scopeSelect:n,position:r="item-aligned",onCloseAutoFocus:a,onEscapeKeyDown:o,onPointerDownOutside:i,side:s,sideOffset:l,align:c,alignOffset:u,arrowPadding:d,collisionBoundary:g,collisionPadding:m,sticky:b,hideWhenDetached:y,avoidCollisions:w,...v}=e,h=Us(Sc,n),[S,E]=p.useState(null),[k,x]=p.useState(null),C=nt(t,Q=>E(Q)),[_,R]=p.useState(null),[T,L]=p.useState(null),D=j_(n),[H,z]=p.useState(!1),M=p.useRef(!1);p.useEffect(()=>{if(S)return mf(S)},[S]),eh();const U=p.useCallback(Q=>{const[pe,...he]=D().map(ke=>ke.ref.current),[re]=he.slice(-1),Ee=document.activeElement;for(const ke of Q)if(ke===Ee||(ke==null||ke.scrollIntoView({block:"nearest"}),ke===pe&&k&&(k.scrollTop=0),ke===re&&k&&(k.scrollTop=k.scrollHeight),ke==null||ke.focus(),document.activeElement!==Ee))return},[D,k]),X=p.useCallback(()=>U([_,S]),[U,_,S]);p.useEffect(()=>{H&&X()},[H,X]);const{onOpenChange:j,triggerPointerDownPosRef:O}=h;p.useEffect(()=>{if(S){let Q={x:0,y:0};const pe=re=>{var Ee,ke,We,Vt;Q={x:Math.abs(Math.round(re.pageX)-((Ee=(ke=O.current)===null||ke===void 0?void 0:ke.x)!==null&&Ee!==void 0?Ee:0)),y:Math.abs(Math.round(re.pageY)-((We=(Vt=O.current)===null||Vt===void 0?void 0:Vt.y)!==null&&We!==void 0?We:0))}},he=re=>{Q.x<=10&&Q.y<=10?re.preventDefault():S.contains(re.target)||j(!1),document.removeEventListener("pointermove",pe),O.current=null};return O.current!==null&&(document.addEventListener("pointermove",pe),document.addEventListener("pointerup",he,{capture:!0,once:!0})),()=>{document.removeEventListener("pointermove",pe),document.removeEventListener("pointerup",he,{capture:!0})}}},[S,j,O]),p.useEffect(()=>{const Q=()=>j(!1);return window.addEventListener("blur",Q),window.addEventListener("resize",Q),()=>{window.removeEventListener("blur",Q),window.removeEventListener("resize",Q)}},[j]);const[A,V]=V7(Q=>{const pe=D().filter(Ee=>!Ee.disabled),he=pe.find(Ee=>Ee.ref.current===document.activeElement),re=q7(pe,Q,he);re&&setTimeout(()=>re.ref.current.focus())}),P=p.useCallback((Q,pe,he)=>{const re=!M.current&&!he;(h.value!==void 0&&h.value===pe||re)&&(R(Q),re&&(M.current=!0))},[h.value]),N=p.useCallback(()=>S==null?void 0:S.focus(),[S]),K=p.useCallback((Q,pe,he)=>{const re=!M.current&&!he;(h.value!==void 0&&h.value===pe||re)&&L(Q)},[h.value]),ae=r==="popper"?$2:Ite,ne=ae===$2?{side:s,sideOffset:l,align:c,alignOffset:u,arrowPadding:d,collisionBoundary:g,collisionPadding:m,sticky:b,hideWhenDetached:y,avoidCollisions:w}:{};return p.createElement(z7,{scope:n,content:S,viewport:k,onViewportChange:x,itemRefCallback:P,selectedItem:_,onItemLeave:N,itemTextRefCallback:K,focusSelectedItem:X,selectedItemText:T,position:r,isPositioned:H,searchRef:A},p.createElement(sh,{as:$a,allowPinchZoom:!0},p.createElement(th,{asChild:!0,trapped:h.open,onMountAutoFocus:Q=>{Q.preventDefault()},onUnmountAutoFocus:fe(a,Q=>{var pe;(pe=h.trigger)===null||pe===void 0||pe.focus({preventScroll:!0}),Q.preventDefault()})},p.createElement(Ls,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:o,onPointerDownOutside:i,onFocusOutside:Q=>Q.preventDefault(),onDismiss:()=>h.onOpenChange(!1)},p.createElement(ae,W({role:"listbox",id:h.contentId,"data-state":h.open?"open":"closed",dir:h.dir,onContextMenu:Q=>Q.preventDefault()},v,ne,{onPlaced:()=>z(!0),ref:C,style:{display:"flex",flexDirection:"column",outline:"none",...v.style},onKeyDown:fe(v.onKeyDown,Q=>{const pe=Q.ctrlKey||Q.altKey||Q.metaKey;if(Q.key==="Tab"&&Q.preventDefault(),!pe&&Q.key.length===1&&V(Q.key),["ArrowUp","ArrowDown","Home","End"].includes(Q.key)){let re=D().filter(Ee=>!Ee.disabled).map(Ee=>Ee.ref.current);if(["ArrowUp","End"].includes(Q.key)&&(re=re.slice().reverse()),["ArrowUp","ArrowDown"].includes(Q.key)){const Ee=Q.target,ke=re.indexOf(Ee);re=re.slice(ke+1)}setTimeout(()=>U(re)),Q.preventDefault()}})}))))))}),Ite=p.forwardRef((e,t)=>{const{__scopeSelect:n,onPlaced:r,...a}=e,o=Us(Sc,n),i=dh(Sc,n),[s,l]=p.useState(null),[c,u]=p.useState(null),d=nt(t,C=>u(C)),g=j_(n),m=p.useRef(!1),b=p.useRef(!0),{viewport:y,selectedItem:w,selectedItemText:v,focusSelectedItem:h}=i,S=p.useCallback(()=>{if(o.trigger&&o.valueNode&&s&&c&&y&&w&&v){const C=o.trigger.getBoundingClientRect(),_=c.getBoundingClientRect(),R=o.valueNode.getBoundingClientRect(),T=v.getBoundingClientRect();if(o.dir!=="rtl"){const Ee=T.left-_.left,ke=R.left-Ee,We=C.left-ke,Vt=C.width+We,mt=Math.max(Vt,_.width),Hn=window.innerWidth-ro,F=P2(ke,[ro,Hn-mt]);s.style.minWidth=Vt+"px",s.style.left=F+"px"}else{const Ee=_.right-T.right,ke=window.innerWidth-R.right-Ee,We=window.innerWidth-C.right-ke,Vt=C.width+We,mt=Math.max(Vt,_.width),Hn=window.innerWidth-ro,F=P2(ke,[ro,Hn-mt]);s.style.minWidth=Vt+"px",s.style.right=F+"px"}const L=g(),D=window.innerHeight-ro*2,H=y.scrollHeight,z=window.getComputedStyle(c),M=parseInt(z.borderTopWidth,10),U=parseInt(z.paddingTop,10),X=parseInt(z.borderBottomWidth,10),j=parseInt(z.paddingBottom,10),O=M+U+H+j+X,A=Math.min(w.offsetHeight*5,O),V=window.getComputedStyle(y),P=parseInt(V.paddingTop,10),N=parseInt(V.paddingBottom,10),K=C.top+C.height/2-ro,ae=D-K,ne=w.offsetHeight/2,Q=w.offsetTop+ne,pe=M+U+Q,he=O-pe;if(pe<=K){const Ee=w===L[L.length-1].ref.current;s.style.bottom="0px";const ke=c.clientHeight-y.offsetTop-y.offsetHeight,We=Math.max(ae,ne+(Ee?N:0)+ke+X),Vt=pe+We;s.style.height=Vt+"px"}else{const Ee=w===L[0].ref.current;s.style.top="0px";const We=Math.max(K,M+y.offsetTop+(Ee?P:0)+ne)+he;s.style.height=We+"px",y.scrollTop=pe-K+y.offsetTop}s.style.margin=`${ro}px 0`,s.style.minHeight=A+"px",s.style.maxHeight=D+"px",r==null||r(),requestAnimationFrame(()=>m.current=!0)}},[g,o.trigger,o.valueNode,s,c,y,w,v,o.dir,r]);Zr(()=>S(),[S]);const[E,k]=p.useState();Zr(()=>{c&&k(window.getComputedStyle(c).zIndex)},[c]);const x=p.useCallback(C=>{C&&b.current===!0&&(S(),h==null||h(),b.current=!1)},[S,h]);return p.createElement(Ote,{scope:n,contentWrapper:s,shouldExpandOnScrollRef:m,onScrollButtonChange:x},p.createElement("div",{ref:l,style:{display:"flex",flexDirection:"column",position:"fixed",zIndex:E}},p.createElement(ze.div,W({},a,{ref:d,style:{boxSizing:"border-box",maxHeight:"100%",...a.style}}))))}),$2=p.forwardRef((e,t)=>{const{__scopeSelect:n,align:r="start",collisionPadding:a=ro,...o}=e,i=z_(n);return p.createElement(gf,W({},i,o,{ref:t,align:r,collisionPadding:a,style:{boxSizing:"border-box",...o.style,"--radix-select-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-select-content-available-width":"var(--radix-popper-available-width)","--radix-select-content-available-height":"var(--radix-popper-available-height)","--radix-select-trigger-width":"var(--radix-popper-anchor-width)","--radix-select-trigger-height":"var(--radix-popper-anchor-height)"}}))}),[Ote,Dte]=jc(Sc,{}),F2="SelectViewport",Lte=p.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e,a=dh(F2,n),o=Dte(F2,n),i=nt(t,a.onViewportChange),s=p.useRef(0);return p.createElement(p.Fragment,null,p.createElement("style",{dangerouslySetInnerHTML:{__html:"[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}"}}),p.createElement(uh.Slot,{scope:n},p.createElement(ze.div,W({"data-radix-select-viewport":"",role:"presentation"},r,{ref:i,style:{position:"relative",flex:1,overflow:"auto",...r.style},onScroll:fe(r.onScroll,l=>{const c=l.currentTarget,{contentWrapper:u,shouldExpandOnScrollRef:d}=o;if(d!=null&&d.current&&u){const g=Math.abs(s.current-c.scrollTop);if(g>0){const m=window.innerHeight-ro*2,b=parseFloat(u.style.minHeight),y=parseFloat(u.style.height),w=Math.max(b,y);if(w0?S:0,u.style.justifyContent="flex-end")}}}s.current=c.scrollTop})}))))}),Mte="SelectGroup",[cTe,Pte]=jc(Mte),$te="SelectLabel",Fte=p.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e,a=Pte($te,n);return p.createElement(ze.div,W({id:a.id},r,{ref:t}))}),ik="SelectItem",[jte,U7]=jc(ik),zte=p.forwardRef((e,t)=>{const{__scopeSelect:n,value:r,disabled:a=!1,textValue:o,...i}=e,s=Us(ik,n),l=dh(ik,n),c=s.value===r,[u,d]=p.useState(o??""),[g,m]=p.useState(!1),b=nt(t,v=>{var h;return(h=l.itemRefCallback)===null||h===void 0?void 0:h.call(l,v,r,a)}),y=bi(),w=()=>{a||(s.onValueChange(r),s.onOpenChange(!1))};if(r==="")throw new Error("A must have a value prop that is not an empty string. This is because the Select value can be set to an empty string to clear the selection and show the placeholder.");return p.createElement(jte,{scope:n,value:r,disabled:a,textId:y,isSelected:c,onItemTextChange:p.useCallback(v=>{d(h=>{var S;return h||((S=v==null?void 0:v.textContent)!==null&&S!==void 0?S:"").trim()})},[])},p.createElement(uh.ItemSlot,{scope:n,value:r,disabled:a,textValue:u},p.createElement(ze.div,W({role:"option","aria-labelledby":y,"data-highlighted":g?"":void 0,"aria-selected":c&&g,"data-state":c?"checked":"unchecked","aria-disabled":a||void 0,"data-disabled":a?"":void 0,tabIndex:a?void 0:-1},i,{ref:b,onFocus:fe(i.onFocus,()=>m(!0)),onBlur:fe(i.onBlur,()=>m(!1)),onPointerUp:fe(i.onPointerUp,w),onPointerMove:fe(i.onPointerMove,v=>{if(a){var h;(h=l.onItemLeave)===null||h===void 0||h.call(l)}else v.currentTarget.focus({preventScroll:!0})}),onPointerLeave:fe(i.onPointerLeave,v=>{if(v.currentTarget===document.activeElement){var h;(h=l.onItemLeave)===null||h===void 0||h.call(l)}}),onKeyDown:fe(i.onKeyDown,v=>{var h;((h=l.searchRef)===null||h===void 0?void 0:h.current)!==""&&v.key===" "||(bte.includes(v.key)&&w(),v.key===" "&&v.preventDefault())})}))))}),ip="SelectItemText",Ute=p.forwardRef((e,t)=>{const{__scopeSelect:n,className:r,style:a,...o}=e,i=Us(ip,n),s=dh(ip,n),l=U7(ip,n),c=wte(ip,n),[u,d]=p.useState(null),g=nt(t,v=>d(v),l.onItemTextChange,v=>{var h;return(h=s.itemTextRefCallback)===null||h===void 0?void 0:h.call(s,v,l.value,l.disabled)}),m=u==null?void 0:u.textContent,b=p.useMemo(()=>p.createElement("option",{key:l.value,value:l.value,disabled:l.disabled},m),[l.disabled,l.value,m]),{onNativeOptionAdd:y,onNativeOptionRemove:w}=c;return Zr(()=>(y(b),()=>w(b)),[y,w,b]),p.createElement(p.Fragment,null,p.createElement(ze.span,W({id:l.textId},o,{ref:g})),l.isSelected&&i.valueNode&&!i.valueNodeHasChildren?ba.createPortal(o.children,i.valueNode):null)}),Bte="SelectItemIndicator",Hte=p.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e;return U7(Bte,n).isSelected?p.createElement(ze.span,W({"aria-hidden":!0},r,{ref:t})):null}),Vte=p.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e;return p.createElement(ze.div,W({"aria-hidden":!0},r,{ref:t}))});function B7(e){return e===""||e===void 0}const H7=p.forwardRef((e,t)=>{const{value:n,...r}=e,a=p.useRef(null),o=nt(t,a),i=F_(n);return p.useEffect(()=>{const s=a.current,l=window.HTMLSelectElement.prototype,u=Object.getOwnPropertyDescriptor(l,"value").set;if(i!==n&&u){const d=new Event("change",{bubbles:!0});u.call(s,n),s.dispatchEvent(d)}},[i,n]),p.createElement(Im,{asChild:!0},p.createElement("select",W({},r,{ref:o,defaultValue:n})))});H7.displayName="BubbleSelect";function V7(e){const t=ur(e),n=p.useRef(""),r=p.useRef(0),a=p.useCallback(i=>{const s=n.current+i;t(s),function l(c){n.current=c,window.clearTimeout(r.current),c!==""&&(r.current=window.setTimeout(()=>l(""),1e3))}(s)},[t]),o=p.useCallback(()=>{n.current="",window.clearTimeout(r.current)},[]);return p.useEffect(()=>()=>window.clearTimeout(r.current),[]),[n,a,o]}function q7(e,t,n){const a=t.length>1&&Array.from(t).every(c=>c===t[0])?t[0]:t,o=n?e.indexOf(n):-1;let i=qte(e,Math.max(o,0));a.length===1&&(i=i.filter(c=>c!==n));const l=i.find(c=>c.textValue.toLowerCase().startsWith(a.toLowerCase()));return l!==n?l:void 0}function qte(e,t){return e.map((n,r)=>e[(t+r)%e.length])}const Gte=Ete,G7=kte,Wte=_te,Kte=Ate,Yte=Tte,W7=Rte,Zte=Lte,K7=Fte,Y7=zte,Xte=Ute,Qte=Hte,Z7=Vte,So=Gte,wo=Wte,za=p.forwardRef(({className:e,children:t,...n},r)=>f.jsxs(G7,{ref:r,className:ee("flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),...n,children:[t,f.jsx(Kte,{asChild:!0,children:f.jsx(ZC,{className:"h-4 w-4 opacity-50"})})]}));za.displayName=G7.displayName;const Ua=p.forwardRef(({className:e,children:t,position:n="popper",...r},a)=>f.jsx(Yte,{children:f.jsx(W7,{ref:a,className:ee("relative z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",n==="popper"&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",e),position:n,...r,children:f.jsx(Zte,{className:ee("p-1",n==="popper"&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"),children:t})})}));Ua.displayName=W7.displayName;const Jte=p.forwardRef(({className:e,...t},n)=>f.jsx(K7,{ref:n,className:ee("py-1.5 pl-8 pr-2 text-sm font-semibold",e),...t}));Jte.displayName=K7.displayName;const Fn=p.forwardRef(({className:e,children:t,...n},r)=>f.jsxs(Y7,{ref:r,className:ee("relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),...n,children:[f.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:f.jsx(Qte,{children:f.jsx(Pm,{className:"h-4 w-4"})})}),f.jsx(Xte,{children:t})]}));Fn.displayName=Y7.displayName;const ene=p.forwardRef(({className:e,...t},n)=>f.jsx(Z7,{ref:n,className:ee("-mx-1 my-1 h-px bg-muted",e),...t}));ene.displayName=Z7.displayName;function Ts(e){"@babel/helpers - typeof";return Ts=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ts(e)}function _i(e){if(e===null||e===!0||e===!1)return NaN;var t=Number(e);return isNaN(t)?t:t<0?Math.ceil(t):Math.floor(t)}function Un(e,t){if(t.length1?"s":"")+" required, but only "+t.length+" present")}function Wa(e){Un(1,arguments);var t=Object.prototype.toString.call(e);return e instanceof Date||Ts(e)==="object"&&t==="[object Date]"?new Date(e.getTime()):typeof e=="number"||t==="[object Number]"?new Date(e):((typeof e=="string"||t==="[object String]")&&typeof console<"u"&&(console.warn("Starting with v2.0.0-beta.1 date-fns doesn't accept strings as date arguments. Please use `parseISO` to parse strings. See: https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#string-arguments"),console.warn(new Error().stack)),new Date(NaN))}function tne(e,t){Un(2,arguments);var n=Wa(e).getTime(),r=_i(t);return new Date(n+r)}var nne={};function fh(){return nne}function rne(e){var t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()));return t.setUTCFullYear(e.getFullYear()),e.getTime()-t.getTime()}var X7=6e4,Q7=36e5;function ane(e){return Un(1,arguments),e instanceof Date||Ts(e)==="object"&&Object.prototype.toString.call(e)==="[object Date]"}function one(e){if(Un(1,arguments),!ane(e)&&typeof e!="number")return!1;var t=Wa(e);return!isNaN(Number(t))}function ine(e,t){Un(2,arguments);var n=_i(t);return tne(e,-n)}var sne=864e5;function lne(e){Un(1,arguments);var t=Wa(e),n=t.getTime();t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0);var r=t.getTime(),a=n-r;return Math.floor(a/sne)+1}function $g(e){Un(1,arguments);var t=1,n=Wa(e),r=n.getUTCDay(),a=(r=a.getTime()?n+1:t.getTime()>=i.getTime()?n:n-1}function cne(e){Un(1,arguments);var t=J7(e),n=new Date(0);n.setUTCFullYear(t,0,4),n.setUTCHours(0,0,0,0);var r=$g(n);return r}var une=6048e5;function dne(e){Un(1,arguments);var t=Wa(e),n=$g(t).getTime()-cne(t).getTime();return Math.round(n/une)+1}function Fg(e,t){var n,r,a,o,i,s,l,c;Un(1,arguments);var u=fh(),d=_i((n=(r=(a=(o=t==null?void 0:t.weekStartsOn)!==null&&o!==void 0?o:t==null||(i=t.locale)===null||i===void 0||(s=i.options)===null||s===void 0?void 0:s.weekStartsOn)!==null&&a!==void 0?a:u.weekStartsOn)!==null&&r!==void 0?r:(l=u.locale)===null||l===void 0||(c=l.options)===null||c===void 0?void 0:c.weekStartsOn)!==null&&n!==void 0?n:0);if(!(d>=0&&d<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");var g=Wa(e),m=g.getUTCDay(),b=(m=1&&m<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var b=new Date(0);b.setUTCFullYear(d+1,0,m),b.setUTCHours(0,0,0,0);var y=Fg(b,t),w=new Date(0);w.setUTCFullYear(d,0,m),w.setUTCHours(0,0,0,0);var v=Fg(w,t);return u.getTime()>=y.getTime()?d+1:u.getTime()>=v.getTime()?d:d-1}function fne(e,t){var n,r,a,o,i,s,l,c;Un(1,arguments);var u=fh(),d=_i((n=(r=(a=(o=t==null?void 0:t.firstWeekContainsDate)!==null&&o!==void 0?o:t==null||(i=t.locale)===null||i===void 0||(s=i.options)===null||s===void 0?void 0:s.firstWeekContainsDate)!==null&&a!==void 0?a:u.firstWeekContainsDate)!==null&&r!==void 0?r:(l=u.locale)===null||l===void 0||(c=l.options)===null||c===void 0?void 0:c.firstWeekContainsDate)!==null&&n!==void 0?n:1),g=e8(e,t),m=new Date(0);m.setUTCFullYear(g,0,d),m.setUTCHours(0,0,0,0);var b=Fg(m,t);return b}var pne=6048e5;function gne(e,t){Un(1,arguments);var n=Wa(e),r=Fg(n,t).getTime()-fne(n,t).getTime();return Math.round(r/pne)+1}function bt(e,t){for(var n=e<0?"-":"",r=Math.abs(e).toString();r.length0?r:1-r;return bt(n==="yy"?a%100:a,n.length)},M:function(t,n){var r=t.getUTCMonth();return n==="M"?String(r+1):bt(r+1,2)},d:function(t,n){return bt(t.getUTCDate(),n.length)},a:function(t,n){var r=t.getUTCHours()/12>=1?"pm":"am";switch(n){case"a":case"aa":return r.toUpperCase();case"aaa":return r;case"aaaaa":return r[0];case"aaaa":default:return r==="am"?"a.m.":"p.m."}},h:function(t,n){return bt(t.getUTCHours()%12||12,n.length)},H:function(t,n){return bt(t.getUTCHours(),n.length)},m:function(t,n){return bt(t.getUTCMinutes(),n.length)},s:function(t,n){return bt(t.getUTCSeconds(),n.length)},S:function(t,n){var r=n.length,a=t.getUTCMilliseconds(),o=Math.floor(a*Math.pow(10,r-3));return bt(o,n.length)}};const Po=mne;var tl={am:"am",pm:"pm",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},hne={G:function(t,n,r){var a=t.getUTCFullYear()>0?1:0;switch(n){case"G":case"GG":case"GGG":return r.era(a,{width:"abbreviated"});case"GGGGG":return r.era(a,{width:"narrow"});case"GGGG":default:return r.era(a,{width:"wide"})}},y:function(t,n,r){if(n==="yo"){var a=t.getUTCFullYear(),o=a>0?a:1-a;return r.ordinalNumber(o,{unit:"year"})}return Po.y(t,n)},Y:function(t,n,r,a){var o=e8(t,a),i=o>0?o:1-o;if(n==="YY"){var s=i%100;return bt(s,2)}return n==="Yo"?r.ordinalNumber(i,{unit:"year"}):bt(i,n.length)},R:function(t,n){var r=J7(t);return bt(r,n.length)},u:function(t,n){var r=t.getUTCFullYear();return bt(r,n.length)},Q:function(t,n,r){var a=Math.ceil((t.getUTCMonth()+1)/3);switch(n){case"Q":return String(a);case"QQ":return bt(a,2);case"Qo":return r.ordinalNumber(a,{unit:"quarter"});case"QQQ":return r.quarter(a,{width:"abbreviated",context:"formatting"});case"QQQQQ":return r.quarter(a,{width:"narrow",context:"formatting"});case"QQQQ":default:return r.quarter(a,{width:"wide",context:"formatting"})}},q:function(t,n,r){var a=Math.ceil((t.getUTCMonth()+1)/3);switch(n){case"q":return String(a);case"qq":return bt(a,2);case"qo":return r.ordinalNumber(a,{unit:"quarter"});case"qqq":return r.quarter(a,{width:"abbreviated",context:"standalone"});case"qqqqq":return r.quarter(a,{width:"narrow",context:"standalone"});case"qqqq":default:return r.quarter(a,{width:"wide",context:"standalone"})}},M:function(t,n,r){var a=t.getUTCMonth();switch(n){case"M":case"MM":return Po.M(t,n);case"Mo":return r.ordinalNumber(a+1,{unit:"month"});case"MMM":return r.month(a,{width:"abbreviated",context:"formatting"});case"MMMMM":return r.month(a,{width:"narrow",context:"formatting"});case"MMMM":default:return r.month(a,{width:"wide",context:"formatting"})}},L:function(t,n,r){var a=t.getUTCMonth();switch(n){case"L":return String(a+1);case"LL":return bt(a+1,2);case"Lo":return r.ordinalNumber(a+1,{unit:"month"});case"LLL":return r.month(a,{width:"abbreviated",context:"standalone"});case"LLLLL":return r.month(a,{width:"narrow",context:"standalone"});case"LLLL":default:return r.month(a,{width:"wide",context:"standalone"})}},w:function(t,n,r,a){var o=gne(t,a);return n==="wo"?r.ordinalNumber(o,{unit:"week"}):bt(o,n.length)},I:function(t,n,r){var a=dne(t);return n==="Io"?r.ordinalNumber(a,{unit:"week"}):bt(a,n.length)},d:function(t,n,r){return n==="do"?r.ordinalNumber(t.getUTCDate(),{unit:"date"}):Po.d(t,n)},D:function(t,n,r){var a=lne(t);return n==="Do"?r.ordinalNumber(a,{unit:"dayOfYear"}):bt(a,n.length)},E:function(t,n,r){var a=t.getUTCDay();switch(n){case"E":case"EE":case"EEE":return r.day(a,{width:"abbreviated",context:"formatting"});case"EEEEE":return r.day(a,{width:"narrow",context:"formatting"});case"EEEEEE":return r.day(a,{width:"short",context:"formatting"});case"EEEE":default:return r.day(a,{width:"wide",context:"formatting"})}},e:function(t,n,r,a){var o=t.getUTCDay(),i=(o-a.weekStartsOn+8)%7||7;switch(n){case"e":return String(i);case"ee":return bt(i,2);case"eo":return r.ordinalNumber(i,{unit:"day"});case"eee":return r.day(o,{width:"abbreviated",context:"formatting"});case"eeeee":return r.day(o,{width:"narrow",context:"formatting"});case"eeeeee":return r.day(o,{width:"short",context:"formatting"});case"eeee":default:return r.day(o,{width:"wide",context:"formatting"})}},c:function(t,n,r,a){var o=t.getUTCDay(),i=(o-a.weekStartsOn+8)%7||7;switch(n){case"c":return String(i);case"cc":return bt(i,n.length);case"co":return r.ordinalNumber(i,{unit:"day"});case"ccc":return r.day(o,{width:"abbreviated",context:"standalone"});case"ccccc":return r.day(o,{width:"narrow",context:"standalone"});case"cccccc":return r.day(o,{width:"short",context:"standalone"});case"cccc":default:return r.day(o,{width:"wide",context:"standalone"})}},i:function(t,n,r){var a=t.getUTCDay(),o=a===0?7:a;switch(n){case"i":return String(o);case"ii":return bt(o,n.length);case"io":return r.ordinalNumber(o,{unit:"day"});case"iii":return r.day(a,{width:"abbreviated",context:"formatting"});case"iiiii":return r.day(a,{width:"narrow",context:"formatting"});case"iiiiii":return r.day(a,{width:"short",context:"formatting"});case"iiii":default:return r.day(a,{width:"wide",context:"formatting"})}},a:function(t,n,r){var a=t.getUTCHours(),o=a/12>=1?"pm":"am";switch(n){case"a":case"aa":return r.dayPeriod(o,{width:"abbreviated",context:"formatting"});case"aaa":return r.dayPeriod(o,{width:"abbreviated",context:"formatting"}).toLowerCase();case"aaaaa":return r.dayPeriod(o,{width:"narrow",context:"formatting"});case"aaaa":default:return r.dayPeriod(o,{width:"wide",context:"formatting"})}},b:function(t,n,r){var a=t.getUTCHours(),o;switch(a===12?o=tl.noon:a===0?o=tl.midnight:o=a/12>=1?"pm":"am",n){case"b":case"bb":return r.dayPeriod(o,{width:"abbreviated",context:"formatting"});case"bbb":return r.dayPeriod(o,{width:"abbreviated",context:"formatting"}).toLowerCase();case"bbbbb":return r.dayPeriod(o,{width:"narrow",context:"formatting"});case"bbbb":default:return r.dayPeriod(o,{width:"wide",context:"formatting"})}},B:function(t,n,r){var a=t.getUTCHours(),o;switch(a>=17?o=tl.evening:a>=12?o=tl.afternoon:a>=4?o=tl.morning:o=tl.night,n){case"B":case"BB":case"BBB":return r.dayPeriod(o,{width:"abbreviated",context:"formatting"});case"BBBBB":return r.dayPeriod(o,{width:"narrow",context:"formatting"});case"BBBB":default:return r.dayPeriod(o,{width:"wide",context:"formatting"})}},h:function(t,n,r){if(n==="ho"){var a=t.getUTCHours()%12;return a===0&&(a=12),r.ordinalNumber(a,{unit:"hour"})}return Po.h(t,n)},H:function(t,n,r){return n==="Ho"?r.ordinalNumber(t.getUTCHours(),{unit:"hour"}):Po.H(t,n)},K:function(t,n,r){var a=t.getUTCHours()%12;return n==="Ko"?r.ordinalNumber(a,{unit:"hour"}):bt(a,n.length)},k:function(t,n,r){var a=t.getUTCHours();return a===0&&(a=24),n==="ko"?r.ordinalNumber(a,{unit:"hour"}):bt(a,n.length)},m:function(t,n,r){return n==="mo"?r.ordinalNumber(t.getUTCMinutes(),{unit:"minute"}):Po.m(t,n)},s:function(t,n,r){return n==="so"?r.ordinalNumber(t.getUTCSeconds(),{unit:"second"}):Po.s(t,n)},S:function(t,n){return Po.S(t,n)},X:function(t,n,r,a){var o=a._originalDate||t,i=o.getTimezoneOffset();if(i===0)return"Z";switch(n){case"X":return z2(i);case"XXXX":case"XX":return Ki(i);case"XXXXX":case"XXX":default:return Ki(i,":")}},x:function(t,n,r,a){var o=a._originalDate||t,i=o.getTimezoneOffset();switch(n){case"x":return z2(i);case"xxxx":case"xx":return Ki(i);case"xxxxx":case"xxx":default:return Ki(i,":")}},O:function(t,n,r,a){var o=a._originalDate||t,i=o.getTimezoneOffset();switch(n){case"O":case"OO":case"OOO":return"GMT"+j2(i,":");case"OOOO":default:return"GMT"+Ki(i,":")}},z:function(t,n,r,a){var o=a._originalDate||t,i=o.getTimezoneOffset();switch(n){case"z":case"zz":case"zzz":return"GMT"+j2(i,":");case"zzzz":default:return"GMT"+Ki(i,":")}},t:function(t,n,r,a){var o=a._originalDate||t,i=Math.floor(o.getTime()/1e3);return bt(i,n.length)},T:function(t,n,r,a){var o=a._originalDate||t,i=o.getTime();return bt(i,n.length)}};function j2(e,t){var n=e>0?"-":"+",r=Math.abs(e),a=Math.floor(r/60),o=r%60;if(o===0)return n+String(a);var i=t||"";return n+String(a)+i+bt(o,2)}function z2(e,t){if(e%60===0){var n=e>0?"-":"+";return n+bt(Math.abs(e)/60,2)}return Ki(e,t)}function Ki(e,t){var n=t||"",r=e>0?"-":"+",a=Math.abs(e),o=bt(Math.floor(a/60),2),i=bt(a%60,2);return r+o+n+i}const bne=hne;var U2=function(t,n){switch(t){case"P":return n.date({width:"short"});case"PP":return n.date({width:"medium"});case"PPP":return n.date({width:"long"});case"PPPP":default:return n.date({width:"full"})}},t8=function(t,n){switch(t){case"p":return n.time({width:"short"});case"pp":return n.time({width:"medium"});case"ppp":return n.time({width:"long"});case"pppp":default:return n.time({width:"full"})}},yne=function(t,n){var r=t.match(/(P+)(p+)?/)||[],a=r[1],o=r[2];if(!o)return U2(t,n);var i;switch(a){case"P":i=n.dateTime({width:"short"});break;case"PP":i=n.dateTime({width:"medium"});break;case"PPP":i=n.dateTime({width:"long"});break;case"PPPP":default:i=n.dateTime({width:"full"});break}return i.replace("{{date}}",U2(a,n)).replace("{{time}}",t8(o,n))},vne={p:t8,P:yne};const Sne=vne;var wne=["D","DD"],Ene=["YY","YYYY"];function xne(e){return wne.indexOf(e)!==-1}function kne(e){return Ene.indexOf(e)!==-1}function B2(e,t,n){if(e==="YYYY")throw new RangeError("Use `yyyy` instead of `YYYY` (in `".concat(t,"`) for formatting years to the input `").concat(n,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));if(e==="YY")throw new RangeError("Use `yy` instead of `YY` (in `".concat(t,"`) for formatting years to the input `").concat(n,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));if(e==="D")throw new RangeError("Use `d` instead of `D` (in `".concat(t,"`) for formatting days of the month to the input `").concat(n,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));if(e==="DD")throw new RangeError("Use `dd` instead of `DD` (in `".concat(t,"`) for formatting days of the month to the input `").concat(n,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"))}var Cne={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}},_ne=function(t,n,r){var a,o=Cne[t];return typeof o=="string"?a=o:n===1?a=o.one:a=o.other.replace("{{count}}",n.toString()),r!=null&&r.addSuffix?r.comparison&&r.comparison>0?"in "+a:a+" ago":a};const Ane=_ne;function qb(e){return function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},n=t.width?String(t.width):e.defaultWidth,r=e.formats[n]||e.formats[e.defaultWidth];return r}}var Tne={full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},Rne={full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},Nne={full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},Ine={date:qb({formats:Tne,defaultWidth:"full"}),time:qb({formats:Rne,defaultWidth:"full"}),dateTime:qb({formats:Nne,defaultWidth:"full"})};const One=Ine;var Dne={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"},Lne=function(t,n,r,a){return Dne[t]};const Mne=Lne;function uu(e){return function(t,n){var r=n!=null&&n.context?String(n.context):"standalone",a;if(r==="formatting"&&e.formattingValues){var o=e.defaultFormattingWidth||e.defaultWidth,i=n!=null&&n.width?String(n.width):o;a=e.formattingValues[i]||e.formattingValues[o]}else{var s=e.defaultWidth,l=n!=null&&n.width?String(n.width):e.defaultWidth;a=e.values[l]||e.values[s]}var c=e.argumentCallback?e.argumentCallback(t):t;return a[c]}}var Pne={narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},$ne={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},Fne={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},jne={narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},zne={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},Une={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},Bne=function(t,n){var r=Number(t),a=r%100;if(a>20||a<10)switch(a%10){case 1:return r+"st";case 2:return r+"nd";case 3:return r+"rd"}return r+"th"},Hne={ordinalNumber:Bne,era:uu({values:Pne,defaultWidth:"wide"}),quarter:uu({values:$ne,defaultWidth:"wide",argumentCallback:function(t){return t-1}}),month:uu({values:Fne,defaultWidth:"wide"}),day:uu({values:jne,defaultWidth:"wide"}),dayPeriod:uu({values:zne,defaultWidth:"wide",formattingValues:Une,defaultFormattingWidth:"wide"})};const Vne=Hne;function du(e){return function(t){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},r=n.width,a=r&&e.matchPatterns[r]||e.matchPatterns[e.defaultMatchWidth],o=t.match(a);if(!o)return null;var i=o[0],s=r&&e.parsePatterns[r]||e.parsePatterns[e.defaultParseWidth],l=Array.isArray(s)?Gne(s,function(d){return d.test(i)}):qne(s,function(d){return d.test(i)}),c;c=e.valueCallback?e.valueCallback(l):l,c=n.valueCallback?n.valueCallback(c):c;var u=t.slice(i.length);return{value:c,rest:u}}}function qne(e,t){for(var n in e)if(e.hasOwnProperty(n)&&t(e[n]))return n}function Gne(e,t){for(var n=0;n1&&arguments[1]!==void 0?arguments[1]:{},r=t.match(e.matchPattern);if(!r)return null;var a=r[0],o=t.match(e.parsePattern);if(!o)return null;var i=e.valueCallback?e.valueCallback(o[0]):o[0];i=n.valueCallback?n.valueCallback(i):i;var s=t.slice(a.length);return{value:i,rest:s}}}var Kne=/^(\d+)(th|st|nd|rd)?/i,Yne=/\d+/i,Zne={narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},Xne={any:[/^b/i,/^(a|c)/i]},Qne={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},Jne={any:[/1/i,/2/i,/3/i,/4/i]},ere={narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},tre={narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},nre={narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},rre={narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},are={narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},ore={any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},ire={ordinalNumber:Wne({matchPattern:Kne,parsePattern:Yne,valueCallback:function(t){return parseInt(t,10)}}),era:du({matchPatterns:Zne,defaultMatchWidth:"wide",parsePatterns:Xne,defaultParseWidth:"any"}),quarter:du({matchPatterns:Qne,defaultMatchWidth:"wide",parsePatterns:Jne,defaultParseWidth:"any",valueCallback:function(t){return t+1}}),month:du({matchPatterns:ere,defaultMatchWidth:"wide",parsePatterns:tre,defaultParseWidth:"any"}),day:du({matchPatterns:nre,defaultMatchWidth:"wide",parsePatterns:rre,defaultParseWidth:"any"}),dayPeriod:du({matchPatterns:are,defaultMatchWidth:"any",parsePatterns:ore,defaultParseWidth:"any"})};const sre=ire;var lre={code:"en-US",formatDistance:Ane,formatLong:One,formatRelative:Mne,localize:Vne,match:sre,options:{weekStartsOn:0,firstWeekContainsDate:1}};const cre=lre;var ure=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,dre=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,fre=/^'([^]*?)'?$/,pre=/''/g,gre=/[a-zA-Z]/;function Bs(e,t,n){var r,a,o,i,s,l,c,u,d,g,m,b,y,w,v,h,S,E;Un(2,arguments);var k=String(t),x=fh(),C=(r=(a=n==null?void 0:n.locale)!==null&&a!==void 0?a:x.locale)!==null&&r!==void 0?r:cre,_=_i((o=(i=(s=(l=n==null?void 0:n.firstWeekContainsDate)!==null&&l!==void 0?l:n==null||(c=n.locale)===null||c===void 0||(u=c.options)===null||u===void 0?void 0:u.firstWeekContainsDate)!==null&&s!==void 0?s:x.firstWeekContainsDate)!==null&&i!==void 0?i:(d=x.locale)===null||d===void 0||(g=d.options)===null||g===void 0?void 0:g.firstWeekContainsDate)!==null&&o!==void 0?o:1);if(!(_>=1&&_<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var R=_i((m=(b=(y=(w=n==null?void 0:n.weekStartsOn)!==null&&w!==void 0?w:n==null||(v=n.locale)===null||v===void 0||(h=v.options)===null||h===void 0?void 0:h.weekStartsOn)!==null&&y!==void 0?y:x.weekStartsOn)!==null&&b!==void 0?b:(S=x.locale)===null||S===void 0||(E=S.options)===null||E===void 0?void 0:E.weekStartsOn)!==null&&m!==void 0?m:0);if(!(R>=0&&R<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");if(!C.localize)throw new RangeError("locale must contain localize property");if(!C.formatLong)throw new RangeError("locale must contain formatLong property");var T=Wa(e);if(!one(T))throw new RangeError("Invalid time value");var L=rne(T),D=ine(T,L),H={firstWeekContainsDate:_,weekStartsOn:R,locale:C,_originalDate:T},z=k.match(dre).map(function(M){var U=M[0];if(U==="p"||U==="P"){var X=Sne[U];return X(M,C.formatLong)}return M}).join("").match(ure).map(function(M){if(M==="''")return"'";var U=M[0];if(U==="'")return mre(M);var X=bne[U];if(X)return!(n!=null&&n.useAdditionalWeekYearTokens)&&kne(M)&&B2(M,t,String(e)),!(n!=null&&n.useAdditionalDayOfYearTokens)&&xne(M)&&B2(M,t,String(e)),X(D,M,C.localize,H);if(U.match(gre))throw new RangeError("Format string contains an unescaped latin alphabet character `"+U+"`");return M}).join("");return z}function mre(e){var t=e.match(fre);return t?t[1].replace(pre,"'"):e}function sk(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n2)return t;if(/:/.test(n[0])?r=n[0]:(t.date=n[0],r=n[1],sp.timeZoneDelimiter.test(t.date)&&(t.date=e.split(sp.timeZoneDelimiter)[0],r=e.substr(t.date.length,e.length))),r){var a=sp.timezone.exec(r);a?(t.time=r.replace(a[1],""),t.timezone=a[1]):t.time=r}return t}function kre(e,t){var n=new RegExp("^(?:(\\d{4}|[+-]\\d{"+(4+t)+"})|(\\d{2}|[+-]\\d{"+(2+t)+"})$)"),r=e.match(n);if(!r)return{year:NaN,restDateString:""};var a=r[1]?parseInt(r[1]):null,o=r[2]?parseInt(r[2]):null;return{year:o===null?a:o*100,restDateString:e.slice((r[1]||r[2]).length)}}function Cre(e,t){if(t===null)return new Date(NaN);var n=e.match(Sre);if(!n)return new Date(NaN);var r=!!n[4],a=fu(n[1]),o=fu(n[2])-1,i=fu(n[3]),s=fu(n[4]),l=fu(n[5])-1;if(r)return Ore(t,s,l)?Tre(t,s,l):new Date(NaN);var c=new Date(0);return!Nre(t,o,i)||!Ire(t,a)?new Date(NaN):(c.setUTCFullYear(t,o,Math.max(a,i)),c)}function fu(e){return e?parseInt(e):1}function _re(e){var t=e.match(wre);if(!t)return NaN;var n=Gb(t[1]),r=Gb(t[2]),a=Gb(t[3]);return Dre(n,r,a)?n*Q7+r*X7+a*1e3:NaN}function Gb(e){return e&&parseFloat(e.replace(",","."))||0}function Are(e){if(e==="Z")return 0;var t=e.match(Ere);if(!t)return 0;var n=t[1]==="+"?-1:1,r=parseInt(t[2]),a=t[3]&&parseInt(t[3])||0;return Lre(r,a)?n*(r*Q7+a*X7):NaN}function Tre(e,t,n){var r=new Date(0);r.setUTCFullYear(e,0,4);var a=r.getUTCDay()||7,o=(t-1)*7+n+1-a;return r.setUTCDate(r.getUTCDate()+o),r}var Rre=[31,null,31,30,31,30,31,31,30,31,30,31];function r8(e){return e%400===0||e%4===0&&e%100!==0}function Nre(e,t,n){return t>=0&&t<=11&&n>=1&&n<=(Rre[t]||(r8(e)?29:28))}function Ire(e,t){return t>=1&&t<=(r8(e)?366:365)}function Ore(e,t,n){return t>=1&&t<=53&&n>=0&&n<=6}function Dre(e,t,n){return e===24?t===0&&n===0:n>=0&&n<60&&t>=0&&t<60&&e>=0&&e<25}function Lre(e,t){return t>=0&&t<=59}const Mre=(e,t,n="Never")=>{const r=e.getValue(t);return r?Bs(new Date(r),"MMM dd, yyyy"):n},Dn=({isLoading:e,children:t})=>e?f.jsx(Pi,{className:"h-6 w-full"}):t,_n=p.forwardRef(({className:e,type:t,...n},r)=>f.jsx("input",{type:t,className:ee("flex h-10 w-full rounded-md border border-input bg-background-lighter px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),ref:r,...n}));_n.displayName="Input";const Pre=({value:e,onValueChange:t})=>f.jsx("form",{children:f.jsxs("div",{className:"relative",children:[f.jsx(Ms,{className:"pointer-events-none absolute left-[12px] top-3 h-4 w-4 text-muted-foreground"}),f.jsx(_n,{placeholder:"Search",value:e,onChange:n=>t(n.target.value),className:"w-52 pl-8 lg:w-80"})]})}),zi=({isLoading:e,children:t})=>e?f.jsx(Pi,{className:"h-6 w-full"}):t,H2=(e,t)=>{const n=e.getValue(t);return n?Bs(new Date(n),"MMM dd, yyyy"):"Never"},$re=(e,t)=>[{accessorKey:"name",header:"Agent Name",cell:({row:n})=>f.jsx(zi,{isLoading:t,children:n.getValue("name")})},{accessorFn:n=>{var r,a;return((a=(r=n.memory)==null?void 0:r.memory)==null?void 0:a.recall_memory)??0},accessorKey:"messages",header:()=>f.jsx(Zf,{children:f.jsx(EX,{className:"h-5 w-5"})}),cell:({row:n})=>f.jsx(zi,{isLoading:t,children:f.jsx("div",{className:" text-center tabular-nums",children:n.getValue("messages")??0})})},{accessorFn:n=>{var r,a;return((a=(r=n.memory)==null?void 0:r.memory)==null?void 0:a.archival_memory)??0},accessorKey:"memories",header:()=>f.jsx(Zf,{children:f.jsx(wX,{className:"h-5 w-5"})}),cell:({row:n})=>f.jsx(zi,{isLoading:t,children:f.jsx("div",{className:"text-center tabular-nums",children:n.getValue("memories")??0})})},{accessorFn:n=>0,accessorKey:"sources",header:()=>f.jsx(Zf,{children:f.jsx(xX,{className:"h-5 w-4"})}),cell:({row:n})=>f.jsx(zi,{isLoading:t,children:f.jsx("div",{className:"text-center tabular-nums",children:n.getValue("sources")??0})})},{accessorFn:n=>n.tools.length,accessorKey:"tools",header:()=>f.jsx(Zf,{className:"justify-center",children:f.jsx(kX,{className:"h-5 w-5"})}),cell:({row:n})=>f.jsx(zi,{isLoading:t,children:f.jsx("div",{className:"text-center tabular-nums",children:n.getValue("tools")??0})})},{accessorKey:"last_run",header:"Last Run",cell:({row:n})=>f.jsx(zi,{isLoading:t,children:H2(n,"last_run")})},{accessorKey:"created_at",header:"Lifespan",cell:({row:n})=>f.jsx(zi,{isLoading:t,children:H2(n,"created_at")})},{accessorKey:"chat",header:"",cell:({row:n})=>t?f.jsx(Pi,{className:"h-6 w-6"}):f.jsxs("div",{className:"flex",children:[f.jsx(ue,{onClick:()=>e(n.original),className:"rounded-lg px-3 py-1",variant:"outline",children:"Chat"}),f.jsx(ue,{variant:"ghost",onClick:()=>n.toggleExpanded(),children:n.getIsExpanded()?f.jsx(vX,{className:"h-4 w-4 text-muted-foreground"}):f.jsx(yX,{className:"h-4 w-4 text-muted-foreground"})})]})}],U_=rf(Vm((e,t)=>({currentAgent:null,lastAgentInitMessage:null,actions:{setAgent:n=>e({currentAgent:n}),setLastAgentInitMessage:n=>e(r=>({...r,lastAgentInitMessage:n})),removeAgent:()=>e(n=>({...n,currentAgent:null}))}}),{name:"agent-storage",partialize:({actions:e,...t})=>t})),To=()=>U_(e=>e.currentAgent),Fre=()=>U_(e=>e.lastAgentInitMessage),ph=()=>U_(e=>e.actions);function jre({setShowingAgentCreation:e}){return f.jsxs("div",{className:"flex h-full flex-col items-center justify-center gap-3",children:[f.jsx("h2",{className:"font-semibold",children:"Create your first agent"}),f.jsxs(ue,{size:"sm",onClick:()=>e(!0),children:[f.jsx(ya,{className:"mr-2 h-4 w-4"}),"Create Agent"]})]})}const zre=e=>{const{agent:t}=e,n=p.useMemo(()=>{var o;return Object.values(((o=t.memory)==null?void 0:o.memory)||{})},[t]),r=p.useMemo(()=>{var o;return((o=n.find(i=>i.label==="persona"))==null?void 0:o.name)??"Not set"},[t]),a=p.useMemo(()=>{var o;return((o=n.find(i=>i.label==="human"))==null?void 0:o.name)??"Not set"},[t]);return f.jsxs("div",{className:"flex flex-col",children:[f.jsxs("div",{className:"flex gap-4 border-b-[1px] py-3",children:[f.jsxs("div",{className:"flex gap-3 text-muted-foreground",children:[f.jsx(bX,{className:"h-4 w-5"}),f.jsx("h6",{children:"Agent Persona"})]}),f.jsx("p",{children:r})]}),f.jsxs("div",{className:"flex gap-4 py-3",children:[f.jsxs("div",{className:"flex gap-3 text-muted-foreground",children:[f.jsx(SX,{className:"h-4 w-5"}),f.jsx("h6",{children:"Human Persona"})]}),f.jsx("p",{children:a})]})]})},Ure=({className:e,setShowingAgentCreation:t})=>{const[n,r]=p.useState(""),{setAgent:a}=ph(),{data:o,isSuccess:i,isError:s,isLoading:l}=Qm({userId:void 0},void 0,{retry:!1}),c=p.useMemo(()=>i?o==null?void 0:o.filter(g=>g.name.toLowerCase().includes(n.toLowerCase())):[],[o,i,n]),u=Mi(),d=g=>{a(g),u(`${g.name}/chat`,{relative:"path"})};return f.jsxs(f.Fragment,{children:[f.jsx("div",{className:"flex items-center justify-between bg-background/95 px-4 pb-3 pt-2.5 backdrop-blur supports-[backdrop-filter]:bg-background/60",children:f.jsx(Pre,{value:n,onValueChange:r})}),f.jsx("div",{className:e,children:!l&&c.length===0?f.jsx(jre,{setShowingAgentCreation:t}):f.jsx(uf,{columns:$re(d,!1),isLoading:l,data:c,error:s?"There was an error loading the agents. Please try again later":void 0,renderPagination:g=>f.jsx(df,{className:"mt-4",table:g}),expandedRowsContent:g=>f.jsx(zre,{agent:c[g]})})})]})},a8="Dialog",[o8,i8]=zn(a8),[Bre,va]=o8(a8),Hre=e=>{const{__scopeDialog:t,children:n,open:r,defaultOpen:a,onOpenChange:o,modal:i=!0}=e,s=p.useRef(null),l=p.useRef(null),[c=!1,u]=Fa({prop:r,defaultProp:a,onChange:o});return p.createElement(Bre,{scope:t,triggerRef:s,contentRef:l,contentId:bi(),titleId:bi(),descriptionId:bi(),open:c,onOpenChange:u,onOpenToggle:p.useCallback(()=>u(d=>!d),[u]),modal:i},n)},Vre="DialogTrigger",qre=p.forwardRef((e,t)=>{const{__scopeDialog:n,...r}=e,a=va(Vre,n),o=nt(t,a.triggerRef);return p.createElement(ze.button,W({type:"button","aria-haspopup":"dialog","aria-expanded":a.open,"aria-controls":a.contentId,"data-state":B_(a.open)},r,{ref:o,onClick:fe(e.onClick,a.onOpenToggle)}))}),s8="DialogPortal",[Gre,l8]=o8(s8,{forceMount:void 0}),Wre=e=>{const{__scopeDialog:t,forceMount:n,children:r,container:a}=e,o=va(s8,t);return p.createElement(Gre,{scope:t,forceMount:n},p.Children.map(r,i=>p.createElement(pr,{present:n||o.open},p.createElement(Jd,{asChild:!0,container:a},i))))},lk="DialogOverlay",Kre=p.forwardRef((e,t)=>{const n=l8(lk,e.__scopeDialog),{forceMount:r=n.forceMount,...a}=e,o=va(lk,e.__scopeDialog);return o.modal?p.createElement(pr,{present:r||o.open},p.createElement(Yre,W({},a,{ref:t}))):null}),Yre=p.forwardRef((e,t)=>{const{__scopeDialog:n,...r}=e,a=va(lk,n);return p.createElement(sh,{as:$a,allowPinchZoom:!0,shards:[a.contentRef]},p.createElement(ze.div,W({"data-state":B_(a.open)},r,{ref:t,style:{pointerEvents:"auto",...r.style}})))}),wc="DialogContent",Zre=p.forwardRef((e,t)=>{const n=l8(wc,e.__scopeDialog),{forceMount:r=n.forceMount,...a}=e,o=va(wc,e.__scopeDialog);return p.createElement(pr,{present:r||o.open},o.modal?p.createElement(Xre,W({},a,{ref:t})):p.createElement(Qre,W({},a,{ref:t})))}),Xre=p.forwardRef((e,t)=>{const n=va(wc,e.__scopeDialog),r=p.useRef(null),a=nt(t,n.contentRef,r);return p.useEffect(()=>{const o=r.current;if(o)return mf(o)},[]),p.createElement(c8,W({},e,{ref:a,trapFocus:n.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:fe(e.onCloseAutoFocus,o=>{var i;o.preventDefault(),(i=n.triggerRef.current)===null||i===void 0||i.focus()}),onPointerDownOutside:fe(e.onPointerDownOutside,o=>{const i=o.detail.originalEvent,s=i.button===0&&i.ctrlKey===!0;(i.button===2||s)&&o.preventDefault()}),onFocusOutside:fe(e.onFocusOutside,o=>o.preventDefault())}))}),Qre=p.forwardRef((e,t)=>{const n=va(wc,e.__scopeDialog),r=p.useRef(!1),a=p.useRef(!1);return p.createElement(c8,W({},e,{ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:o=>{var i;if((i=e.onCloseAutoFocus)===null||i===void 0||i.call(e,o),!o.defaultPrevented){var s;r.current||(s=n.triggerRef.current)===null||s===void 0||s.focus(),o.preventDefault()}r.current=!1,a.current=!1},onInteractOutside:o=>{var i,s;(i=e.onInteractOutside)===null||i===void 0||i.call(e,o),o.defaultPrevented||(r.current=!0,o.detail.originalEvent.type==="pointerdown"&&(a.current=!0));const l=o.target;((s=n.triggerRef.current)===null||s===void 0?void 0:s.contains(l))&&o.preventDefault(),o.detail.originalEvent.type==="focusin"&&a.current&&o.preventDefault()}}))}),c8=p.forwardRef((e,t)=>{const{__scopeDialog:n,trapFocus:r,onOpenAutoFocus:a,onCloseAutoFocus:o,...i}=e,s=va(wc,n),l=p.useRef(null),c=nt(t,l);return eh(),p.createElement(p.Fragment,null,p.createElement(th,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:a,onUnmountAutoFocus:o},p.createElement(Ls,W({role:"dialog",id:s.contentId,"aria-describedby":s.descriptionId,"aria-labelledby":s.titleId,"data-state":B_(s.open)},i,{ref:c,onDismiss:()=>s.onOpenChange(!1)}))),!1)}),u8="DialogTitle",Jre=p.forwardRef((e,t)=>{const{__scopeDialog:n,...r}=e,a=va(u8,n);return p.createElement(ze.h2,W({id:a.titleId},r,{ref:t}))}),eae="DialogDescription",tae=p.forwardRef((e,t)=>{const{__scopeDialog:n,...r}=e,a=va(eae,n);return p.createElement(ze.p,W({id:a.descriptionId},r,{ref:t}))}),nae="DialogClose",rae=p.forwardRef((e,t)=>{const{__scopeDialog:n,...r}=e,a=va(nae,n);return p.createElement(ze.button,W({type:"button"},r,{ref:t,onClick:fe(e.onClick,()=>a.onOpenChange(!1))}))});function B_(e){return e?"open":"closed"}const aae="DialogTitleWarning",[oae,uTe]=RV(aae,{contentName:wc,titleName:u8,docsSlug:"dialog"}),d8=Hre,iae=qre,f8=Wre,H_=Kre,V_=Zre,q_=Jre,G_=tae,W_=rae,Kt=d8,sae=f8,p8=p.forwardRef(({className:e,...t},n)=>f.jsx(H_,{ref:n,className:ee("fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",e),...t}));p8.displayName=H_.displayName;const Ht=p.forwardRef(({className:e,children:t,hasCloseButton:n=!0,...r},a)=>f.jsxs(sae,{children:[f.jsx(p8,{}),f.jsxs(V_,{ref:a,className:ee("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg md:w-full",e),...r,children:[t,n?f.jsxs(W_,{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",children:[f.jsx(Di,{className:"h-4 w-4"}),f.jsx("span",{className:"sr-only",children:"Close"})]}):null]})]}));Ht.displayName=V_.displayName;const Pt=({className:e,...t})=>f.jsx("div",{className:ee("flex flex-col space-y-1.5 text-center sm:text-left",e),...t});Pt.displayName="DialogHeader";const g8=({className:e,...t})=>f.jsx("div",{className:ee("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",e),...t});g8.displayName="DialogFooter";const $t=p.forwardRef(({className:e,...t},n)=>f.jsx(q_,{ref:n,className:ee("text-lg font-semibold leading-none tracking-tight",e),...t}));$t.displayName=q_.displayName;const dn=p.forwardRef(({className:e,...t},n)=>f.jsx(G_,{ref:n,className:ee("text-sm text-muted-foreground",e),...t}));dn.displayName=G_.displayName;const lae=({open:e,onOpenChange:t,closeDialog:n})=>{const r=()=>{t(!1),n()};return f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Cancel Creating Agent"}),f.jsx(dn,{children:"Are you sure you want to cancel creating an Agent? All the information you worked on will be lost."})]}),f.jsxs("div",{className:"flex justify-end gap-4",children:[f.jsx(ue,{variant:"ghost",onClick:()=>t(!1),children:"No"}),f.jsx(ue,{onClick:r,children:"Yes"})]})]})})};var bf=e=>e.type==="checkbox",Nl=e=>e instanceof Date,Yn=e=>e==null;const m8=e=>typeof e=="object";var cn=e=>!Yn(e)&&!Array.isArray(e)&&m8(e)&&!Nl(e),h8=e=>cn(e)&&e.target?bf(e.target)?e.target.checked:e.target.value:e,cae=e=>e.substring(0,e.search(/\.\d+(\.|$)/))||e,b8=(e,t)=>e.has(cae(t)),uae=e=>{const t=e.constructor&&e.constructor.prototype;return cn(t)&&t.hasOwnProperty("isPrototypeOf")},K_=typeof window<"u"&&typeof window.HTMLElement<"u"&&typeof document<"u";function Ln(e){let t;const n=Array.isArray(e);if(e instanceof Date)t=new Date(e);else if(e instanceof Set)t=new Set(e);else if(!(K_&&(e instanceof Blob||e instanceof FileList))&&(n||cn(e)))if(t=n?[]:{},!n&&!uae(e))t=e;else for(const r in e)e.hasOwnProperty(r)&&(t[r]=Ln(e[r]));else return e;return t}var zc=e=>Array.isArray(e)?e.filter(Boolean):[],Ot=e=>e===void 0,ge=(e,t,n)=>{if(!t||!cn(e))return n;const r=zc(t.split(/[,[\].]+?/)).reduce((a,o)=>Yn(a)?a:a[o],e);return Ot(r)||r===e?Ot(e[t])?n:e[t]:r},si=e=>typeof e=="boolean";const jg={BLUR:"blur",FOCUS_OUT:"focusout",CHANGE:"change"},Hr={onBlur:"onBlur",onChange:"onChange",onSubmit:"onSubmit",onTouched:"onTouched",all:"all"},Ja={max:"max",min:"min",maxLength:"maxLength",minLength:"minLength",pattern:"pattern",required:"required",validate:"validate"},y8=Ae.createContext(null),Hs=()=>Ae.useContext(y8),dae=e=>{const{children:t,...n}=e;return Ae.createElement(y8.Provider,{value:n},t)};var v8=(e,t,n,r=!0)=>{const a={defaultValues:t._defaultValues};for(const o in e)Object.defineProperty(a,o,{get:()=>{const i=o;return t._proxyFormState[i]!==Hr.all&&(t._proxyFormState[i]=!r||Hr.all),n&&(n[i]=!0),e[i]}});return a},wr=e=>cn(e)&&!Object.keys(e).length,S8=(e,t,n,r)=>{n(e);const{name:a,...o}=e;return wr(o)||Object.keys(o).length>=Object.keys(t).length||Object.keys(o).find(i=>t[i]===(!r||Hr.all))},kr=e=>Array.isArray(e)?e:[e],w8=(e,t,n)=>!e||!t||e===t||kr(e).some(r=>r&&(n?r===t:r.startsWith(t)||t.startsWith(r)));function gh(e){const t=Ae.useRef(e);t.current=e,Ae.useEffect(()=>{const n=!e.disabled&&t.current.subject&&t.current.subject.subscribe({next:t.current.next});return()=>{n&&n.unsubscribe()}},[e.disabled])}function fae(e){const t=Hs(),{control:n=t.control,disabled:r,name:a,exact:o}=e||{},[i,s]=Ae.useState(n._formState),l=Ae.useRef(!0),c=Ae.useRef({isDirty:!1,isLoading:!1,dirtyFields:!1,touchedFields:!1,isValidating:!1,isValid:!1,errors:!1}),u=Ae.useRef(a);return u.current=a,gh({disabled:r,next:d=>l.current&&w8(u.current,d.name,o)&&S8(d,c.current,n._updateFormState)&&s({...n._formState,...d}),subject:n._subjects.state}),Ae.useEffect(()=>(l.current=!0,c.current.isValid&&n._updateValid(!0),()=>{l.current=!1}),[n]),v8(i,n,c.current,!1)}var Oa=e=>typeof e=="string",E8=(e,t,n,r,a)=>Oa(e)?(r&&t.watch.add(e),ge(n,e,a)):Array.isArray(e)?e.map(o=>(r&&t.watch.add(o),ge(n,o))):(r&&(t.watchAll=!0),n);function pae(e){const t=Hs(),{control:n=t.control,name:r,defaultValue:a,disabled:o,exact:i}=e||{},s=Ae.useRef(r);s.current=r,gh({disabled:o,subject:n._subjects.values,next:u=>{w8(s.current,u.name,i)&&c(Ln(E8(s.current,n._names,u.values||n._formValues,!1,a)))}});const[l,c]=Ae.useState(n._getWatch(r,a));return Ae.useEffect(()=>n._removeUnmounted()),l}var Y_=e=>/^\w*$/.test(e),x8=e=>zc(e.replace(/["|']|\]/g,"").split(/\.|\[/));function ht(e,t,n){let r=-1;const a=Y_(t)?[t]:x8(t),o=a.length,i=o-1;for(;++r{const u=a._options.shouldUnregister||o,d=(g,m)=>{const b=ge(a._fields,g);b&&(b._f.mount=m)};if(d(n,!0),u){const g=Ln(ge(a._options.defaultValues,n));ht(a._defaultValues,n,g),Ot(ge(a._formValues,n))&&ht(a._formValues,n,g)}return()=>{(i?u&&!a._state.action:u)?a.unregister(n):d(n,!1)}},[n,a,i,o]),Ae.useEffect(()=>{ge(a._fields,n)&&a._updateDisabledField({disabled:r,fields:a._fields,name:n})},[r,n,a]),{field:{name:n,value:s,...si(r)?{disabled:r}:{},onChange:Ae.useCallback(u=>c.current.onChange({target:{value:h8(u),name:n},type:jg.CHANGE}),[n]),onBlur:Ae.useCallback(()=>c.current.onBlur({target:{value:ge(a._formValues,n),name:n},type:jg.BLUR}),[n,a]),ref:u=>{const d=ge(a._fields,n);d&&u&&(d._f.ref={focus:()=>u.focus(),select:()=>u.select(),setCustomValidity:g=>u.setCustomValidity(g),reportValidity:()=>u.reportValidity()})}},formState:l,fieldState:Object.defineProperties({},{invalid:{enumerable:!0,get:()=>!!ge(l.errors,n)},isDirty:{enumerable:!0,get:()=>!!ge(l.dirtyFields,n)},isTouched:{enumerable:!0,get:()=>!!ge(l.touchedFields,n)},error:{enumerable:!0,get:()=>ge(l.errors,n)}})}}const mae=e=>e.render(gae(e));var k8=(e,t,n,r,a)=>t?{...n[e],types:{...n[e]&&n[e].types?n[e].types:{},[r]:a||!0}}:{};const zg=(e,t,n)=>{for(const r of n||Object.keys(e)){const a=ge(e,r);if(a){const{_f:o,...i}=a;if(o&&t(o.name)){if(o.ref.focus){o.ref.focus();break}else if(o.refs&&o.refs[0].focus){o.refs[0].focus();break}}else cn(i)&&zg(i,t)}}};var $o=()=>{const e=typeof performance>"u"?Date.now():performance.now()*1e3;return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{const n=(Math.random()*16+e)%16|0;return(t=="x"?n:n&3|8).toString(16)})},Wb=(e,t,n={})=>n.shouldFocus||Ot(n.shouldFocus)?n.focusName||`${e}.${Ot(n.focusIndex)?t:n.focusIndex}.`:"",ck=e=>({isOnSubmit:!e||e===Hr.onSubmit,isOnBlur:e===Hr.onBlur,isOnChange:e===Hr.onChange,isOnAll:e===Hr.all,isOnTouch:e===Hr.onTouched}),uk=(e,t,n)=>!n&&(t.watchAll||t.watch.has(e)||[...t.watch].some(r=>e.startsWith(r)&&/^\.\w+/.test(e.slice(r.length)))),C8=(e,t,n)=>{const r=zc(ge(e,n));return ht(r,"root",t[n]),ht(e,n,r),e},Z_=e=>e.type==="file",li=e=>typeof e=="function",Ug=e=>{if(!K_)return!1;const t=e?e.ownerDocument:0;return e instanceof(t&&t.defaultView?t.defaultView.HTMLElement:HTMLElement)},Gp=e=>Oa(e),X_=e=>e.type==="radio",Bg=e=>e instanceof RegExp;const V2={value:!1,isValid:!1},q2={value:!0,isValid:!0};var _8=e=>{if(Array.isArray(e)){if(e.length>1){const t=e.filter(n=>n&&n.checked&&!n.disabled).map(n=>n.value);return{value:t,isValid:!!t.length}}return e[0].checked&&!e[0].disabled?e[0].attributes&&!Ot(e[0].attributes.value)?Ot(e[0].value)||e[0].value===""?q2:{value:e[0].value,isValid:!0}:q2:V2}return V2};const G2={isValid:!1,value:null};var A8=e=>Array.isArray(e)?e.reduce((t,n)=>n&&n.checked&&!n.disabled?{isValid:!0,value:n.value}:t,G2):G2;function W2(e,t,n="validate"){if(Gp(e)||Array.isArray(e)&&e.every(Gp)||si(e)&&!e)return{type:n,message:Gp(e)?e:"",ref:t}}var nl=e=>cn(e)&&!Bg(e)?e:{value:e,message:""},dk=async(e,t,n,r,a)=>{const{ref:o,refs:i,required:s,maxLength:l,minLength:c,min:u,max:d,pattern:g,validate:m,name:b,valueAsNumber:y,mount:w,disabled:v}=e._f,h=ge(t,b);if(!w||v)return{};const S=i?i[0]:o,E=D=>{r&&S.reportValidity&&(S.setCustomValidity(si(D)?"":D||""),S.reportValidity())},k={},x=X_(o),C=bf(o),_=x||C,R=(y||Z_(o))&&Ot(o.value)&&Ot(h)||Ug(o)&&o.value===""||h===""||Array.isArray(h)&&!h.length,T=k8.bind(null,b,n,k),L=(D,H,z,M=Ja.maxLength,U=Ja.minLength)=>{const X=D?H:z;k[b]={type:D?M:U,message:X,ref:o,...T(D?M:U,X)}};if(a?!Array.isArray(h)||!h.length:s&&(!_&&(R||Yn(h))||si(h)&&!h||C&&!_8(i).isValid||x&&!A8(i).isValid)){const{value:D,message:H}=Gp(s)?{value:!!s,message:s}:nl(s);if(D&&(k[b]={type:Ja.required,message:H,ref:S,...T(Ja.required,H)},!n))return E(H),k}if(!R&&(!Yn(u)||!Yn(d))){let D,H;const z=nl(d),M=nl(u);if(!Yn(h)&&!isNaN(h)){const U=o.valueAsNumber||h&&+h;Yn(z.value)||(D=U>z.value),Yn(M.value)||(H=Unew Date(new Date().toDateString()+" "+A),j=o.type=="time",O=o.type=="week";Oa(z.value)&&h&&(D=j?X(h)>X(z.value):O?h>z.value:U>new Date(z.value)),Oa(M.value)&&h&&(H=j?X(h)+D.value,M=!Yn(H.value)&&h.length<+H.value;if((z||M)&&(L(z,D.message,H.message),!n))return E(k[b].message),k}if(g&&!R&&Oa(h)){const{value:D,message:H}=nl(g);if(Bg(D)&&!h.match(D)&&(k[b]={type:Ja.pattern,message:H,ref:o,...T(Ja.pattern,H)},!n))return E(H),k}if(m){if(li(m)){const D=await m(h,t),H=W2(D,S);if(H&&(k[b]={...H,...T(Ja.validate,H.message)},!n))return E(H.message),k}else if(cn(m)){let D={};for(const H in m){if(!wr(D)&&!n)break;const z=W2(await m[H](h,t),S,H);z&&(D={...z,...T(H,z.message)},E(z.message),n&&(k[b]=D))}if(!wr(D)&&(k[b]={ref:S,...D},!n))return k}}return E(!0),k};function Kb(e,t){return[...e,...kr(t)]}var Yb=e=>Array.isArray(e)?e.map(()=>{}):void 0;function Zb(e,t,n){return[...e.slice(0,t),...kr(n),...e.slice(t)]}var Xb=(e,t,n)=>Array.isArray(e)?(Ot(e[n])&&(e[n]=void 0),e.splice(n,0,e.splice(t,1)[0]),e):[];function Qb(e,t){return[...kr(t),...kr(e)]}function hae(e,t){let n=0;const r=[...e];for(const a of t)r.splice(a-n,1),n++;return zc(r).length?r:[]}var Jb=(e,t)=>Ot(t)?[]:hae(e,kr(t).sort((n,r)=>n-r)),ey=(e,t,n)=>{e[t]=[e[n],e[n]=e[t]][0]};function bae(e,t){const n=t.slice(0,-1).length;let r=0;for(;r(e[t]=n,e);function vae(e){const t=Hs(),{control:n=t.control,name:r,keyName:a="id",shouldUnregister:o}=e,[i,s]=Ae.useState(n._getFieldArray(r)),l=Ae.useRef(n._getFieldArray(r).map($o)),c=Ae.useRef(i),u=Ae.useRef(r),d=Ae.useRef(!1);u.current=r,c.current=i,n._names.array.add(r),e.rules&&n.register(r,e.rules),gh({next:({values:k,name:x})=>{if(x===u.current||!x){const C=ge(k,u.current);Array.isArray(C)&&(s(C),l.current=C.map($o))}},subject:n._subjects.array});const g=Ae.useCallback(k=>{d.current=!0,n._updateFieldArray(r,k)},[n,r]),m=(k,x)=>{const C=kr(Ln(k)),_=Kb(n._getFieldArray(r),C);n._names.focus=Wb(r,_.length-1,x),l.current=Kb(l.current,C.map($o)),g(_),s(_),n._updateFieldArray(r,_,Kb,{argA:Yb(k)})},b=(k,x)=>{const C=kr(Ln(k)),_=Qb(n._getFieldArray(r),C);n._names.focus=Wb(r,0,x),l.current=Qb(l.current,C.map($o)),g(_),s(_),n._updateFieldArray(r,_,Qb,{argA:Yb(k)})},y=k=>{const x=Jb(n._getFieldArray(r),k);l.current=Jb(l.current,k),g(x),s(x),n._updateFieldArray(r,x,Jb,{argA:k})},w=(k,x,C)=>{const _=kr(Ln(x)),R=Zb(n._getFieldArray(r),k,_);n._names.focus=Wb(r,k,C),l.current=Zb(l.current,k,_.map($o)),g(R),s(R),n._updateFieldArray(r,R,Zb,{argA:k,argB:Yb(x)})},v=(k,x)=>{const C=n._getFieldArray(r);ey(C,k,x),ey(l.current,k,x),g(C),s(C),n._updateFieldArray(r,C,ey,{argA:k,argB:x},!1)},h=(k,x)=>{const C=n._getFieldArray(r);Xb(C,k,x),Xb(l.current,k,x),g(C),s(C),n._updateFieldArray(r,C,Xb,{argA:k,argB:x},!1)},S=(k,x)=>{const C=Ln(x),_=K2(n._getFieldArray(r),k,C);l.current=[..._].map((R,T)=>!R||T===k?$o():l.current[T]),g(_),s([..._]),n._updateFieldArray(r,_,K2,{argA:k,argB:C},!0,!1)},E=k=>{const x=kr(Ln(k));l.current=x.map($o),g([...x]),s([...x]),n._updateFieldArray(r,[...x],C=>C,{},!0,!1)};return Ae.useEffect(()=>{if(n._state.action=!1,uk(r,n._names)&&n._subjects.state.next({...n._formState}),d.current&&(!ck(n._options.mode).isOnSubmit||n._formState.isSubmitted))if(n._options.resolver)n._executeSchema([r]).then(k=>{const x=ge(k.errors,r),C=ge(n._formState.errors,r);(C?!x&&C.type||x&&(C.type!==x.type||C.message!==x.message):x&&x.type)&&(x?ht(n._formState.errors,r,x):pn(n._formState.errors,r),n._subjects.state.next({errors:n._formState.errors}))});else{const k=ge(n._fields,r);k&&k._f&&dk(k,n._formValues,n._options.criteriaMode===Hr.all,n._options.shouldUseNativeValidation,!0).then(x=>!wr(x)&&n._subjects.state.next({errors:C8(n._formState.errors,x,r)}))}n._subjects.values.next({name:r,values:{...n._formValues}}),n._names.focus&&zg(n._fields,k=>!!k&&k.startsWith(n._names.focus||"")),n._names.focus="",n._updateValid(),d.current=!1},[i,r,n]),Ae.useEffect(()=>(!ge(n._formValues,r)&&n._updateFieldArray(r),()=>{(n._options.shouldUnregister||o)&&n.unregister(r)}),[r,n,a,o]),{swap:Ae.useCallback(v,[g,r,n]),move:Ae.useCallback(h,[g,r,n]),prepend:Ae.useCallback(b,[g,r,n]),append:Ae.useCallback(m,[g,r,n]),remove:Ae.useCallback(y,[g,r,n]),insert:Ae.useCallback(w,[g,r,n]),update:Ae.useCallback(S,[g,r,n]),replace:Ae.useCallback(E,[g,r,n]),fields:Ae.useMemo(()=>i.map((k,x)=>({...k,[a]:l.current[x]||$o()})),[i,a])}}function ty(){let e=[];return{get observers(){return e},next:a=>{for(const o of e)o.next&&o.next(a)},subscribe:a=>(e.push(a),{unsubscribe:()=>{e=e.filter(o=>o!==a)}}),unsubscribe:()=>{e=[]}}}var Hg=e=>Yn(e)||!m8(e);function as(e,t){if(Hg(e)||Hg(t))return e===t;if(Nl(e)&&Nl(t))return e.getTime()===t.getTime();const n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(const a of n){const o=e[a];if(!r.includes(a))return!1;if(a!=="ref"){const i=t[a];if(Nl(o)&&Nl(i)||cn(o)&&cn(i)||Array.isArray(o)&&Array.isArray(i)?!as(o,i):o!==i)return!1}}return!0}var T8=e=>e.type==="select-multiple",Sae=e=>X_(e)||bf(e),ny=e=>Ug(e)&&e.isConnected,R8=e=>{for(const t in e)if(li(e[t]))return!0;return!1};function Vg(e,t={}){const n=Array.isArray(e);if(cn(e)||n)for(const r in e)Array.isArray(e[r])||cn(e[r])&&!R8(e[r])?(t[r]=Array.isArray(e[r])?[]:{},Vg(e[r],t[r])):Yn(e[r])||(t[r]=!0);return t}function N8(e,t,n){const r=Array.isArray(e);if(cn(e)||r)for(const a in e)Array.isArray(e[a])||cn(e[a])&&!R8(e[a])?Ot(t)||Hg(n[a])?n[a]=Array.isArray(e[a])?Vg(e[a],[]):{...Vg(e[a])}:N8(e[a],Yn(t)?{}:t[a],n[a]):n[a]=!as(e[a],t[a]);return n}var ry=(e,t)=>N8(e,t,Vg(t)),I8=(e,{valueAsNumber:t,valueAsDate:n,setValueAs:r})=>Ot(e)?e:t?e===""?NaN:e&&+e:n&&Oa(e)?new Date(e):r?r(e):e;function ay(e){const t=e.ref;if(!(e.refs?e.refs.every(n=>n.disabled):t.disabled))return Z_(t)?t.files:X_(t)?A8(e.refs).value:T8(t)?[...t.selectedOptions].map(({value:n})=>n):bf(t)?_8(e.refs).value:I8(Ot(t.value)?e.ref.value:t.value,e)}var wae=(e,t,n,r)=>{const a={};for(const o of e){const i=ge(t,o);i&&ht(a,o,i._f)}return{criteriaMode:n,names:[...e],fields:a,shouldUseNativeValidation:r}},pu=e=>Ot(e)?e:Bg(e)?e.source:cn(e)?Bg(e.value)?e.value.source:e.value:e,Eae=e=>e.mount&&(e.required||e.min||e.max||e.maxLength||e.minLength||e.pattern||e.validate);function Y2(e,t,n){const r=ge(e,n);if(r||Y_(n))return{error:r,name:n};const a=n.split(".");for(;a.length;){const o=a.join("."),i=ge(t,o),s=ge(e,o);if(i&&!Array.isArray(i)&&n!==o)return{name:n};if(s&&s.type)return{name:o,error:s};a.pop()}return{name:n}}var xae=(e,t,n,r,a)=>a.isOnAll?!1:!n&&a.isOnTouch?!(t||e):(n?r.isOnBlur:a.isOnBlur)?!e:(n?r.isOnChange:a.isOnChange)?e:!0,kae=(e,t)=>!zc(ge(e,t)).length&&pn(e,t);const Cae={mode:Hr.onSubmit,reValidateMode:Hr.onChange,shouldFocusError:!0};function _ae(e={},t){let n={...Cae,...e},r={submitCount:0,isDirty:!1,isLoading:li(n.defaultValues),isValidating:!1,isSubmitted:!1,isSubmitting:!1,isSubmitSuccessful:!1,isValid:!1,touchedFields:{},dirtyFields:{},errors:{}},a={},o=cn(n.defaultValues)||cn(n.values)?Ln(n.defaultValues||n.values)||{}:{},i=n.shouldUnregister?{}:Ln(o),s={action:!1,mount:!1,watch:!1},l={mount:new Set,unMount:new Set,array:new Set,watch:new Set},c,u=0;const d={isDirty:!1,dirtyFields:!1,touchedFields:!1,isValidating:!1,isValid:!1,errors:!1},g={values:ty(),array:ty(),state:ty()},m=e.resetOptions&&e.resetOptions.keepDirtyValues,b=ck(n.mode),y=ck(n.reValidateMode),w=n.criteriaMode===Hr.all,v=F=>q=>{clearTimeout(u),u=setTimeout(F,q)},h=async F=>{if(d.isValid||F){const q=n.resolver?wr((await R()).errors):await L(a,!0);q!==r.isValid&&g.state.next({isValid:q})}},S=F=>d.isValidating&&g.state.next({isValidating:F}),E=(F,q=[],Y,ye,de=!0,oe=!0)=>{if(ye&&Y){if(s.action=!0,oe&&Array.isArray(ge(a,F))){const _e=Y(ge(a,F),ye.argA,ye.argB);de&&ht(a,F,_e)}if(oe&&Array.isArray(ge(r.errors,F))){const _e=Y(ge(r.errors,F),ye.argA,ye.argB);de&&ht(r.errors,F,_e),kae(r.errors,F)}if(d.touchedFields&&oe&&Array.isArray(ge(r.touchedFields,F))){const _e=Y(ge(r.touchedFields,F),ye.argA,ye.argB);de&&ht(r.touchedFields,F,_e)}d.dirtyFields&&(r.dirtyFields=ry(o,i)),g.state.next({name:F,isDirty:H(F,q),dirtyFields:r.dirtyFields,errors:r.errors,isValid:r.isValid})}else ht(i,F,q)},k=(F,q)=>{ht(r.errors,F,q),g.state.next({errors:r.errors})},x=(F,q,Y,ye)=>{const de=ge(a,F);if(de){const oe=ge(i,F,Ot(Y)?ge(o,F):Y);Ot(oe)||ye&&ye.defaultChecked||q?ht(i,F,q?oe:ay(de._f)):U(F,oe),s.mount&&h()}},C=(F,q,Y,ye,de)=>{let oe=!1,_e=!1;const wt={name:F};if(!Y||ye){d.isDirty&&(_e=r.isDirty,r.isDirty=wt.isDirty=H(),oe=_e!==wt.isDirty);const St=as(ge(o,F),q);_e=ge(r.dirtyFields,F),St?pn(r.dirtyFields,F):ht(r.dirtyFields,F,!0),wt.dirtyFields=r.dirtyFields,oe=oe||d.dirtyFields&&_e!==!St}if(Y){const St=ge(r.touchedFields,F);St||(ht(r.touchedFields,F,Y),wt.touchedFields=r.touchedFields,oe=oe||d.touchedFields&&St!==Y)}return oe&&de&&g.state.next(wt),oe?wt:{}},_=(F,q,Y,ye)=>{const de=ge(r.errors,F),oe=d.isValid&&si(q)&&r.isValid!==q;if(e.delayError&&Y?(c=v(()=>k(F,Y)),c(e.delayError)):(clearTimeout(u),c=null,Y?ht(r.errors,F,Y):pn(r.errors,F)),(Y?!as(de,Y):de)||!wr(ye)||oe){const _e={...ye,...oe&&si(q)?{isValid:q}:{},errors:r.errors,name:F};r={...r,..._e},g.state.next(_e)}S(!1)},R=async F=>n.resolver(i,n.context,wae(F||l.mount,a,n.criteriaMode,n.shouldUseNativeValidation)),T=async F=>{const{errors:q}=await R(F);if(F)for(const Y of F){const ye=ge(q,Y);ye?ht(r.errors,Y,ye):pn(r.errors,Y)}else r.errors=q;return q},L=async(F,q,Y={valid:!0})=>{for(const ye in F){const de=F[ye];if(de){const{_f:oe,..._e}=de;if(oe){const wt=l.array.has(oe.name),St=await dk(de,i,w,n.shouldUseNativeValidation&&!q,wt);if(St[oe.name]&&(Y.valid=!1,q))break;!q&&(ge(St,oe.name)?wt?C8(r.errors,St,oe.name):ht(r.errors,oe.name,St[oe.name]):pn(r.errors,oe.name))}_e&&await L(_e,q,Y)}}return Y.valid},D=()=>{for(const F of l.unMount){const q=ge(a,F);q&&(q._f.refs?q._f.refs.every(Y=>!ny(Y)):!ny(q._f.ref))&&ne(F)}l.unMount=new Set},H=(F,q)=>(F&&q&&ht(i,F,q),!as(V(),o)),z=(F,q,Y)=>E8(F,l,{...s.mount?i:Ot(q)?o:Oa(F)?{[F]:q}:q},Y,q),M=F=>zc(ge(s.mount?i:o,F,e.shouldUnregister?ge(o,F,[]):[])),U=(F,q,Y={})=>{const ye=ge(a,F);let de=q;if(ye){const oe=ye._f;oe&&(!oe.disabled&&ht(i,F,I8(q,oe)),de=Ug(oe.ref)&&Yn(q)?"":q,T8(oe.ref)?[...oe.ref.options].forEach(_e=>_e.selected=de.includes(_e.value)):oe.refs?bf(oe.ref)?oe.refs.length>1?oe.refs.forEach(_e=>(!_e.defaultChecked||!_e.disabled)&&(_e.checked=Array.isArray(de)?!!de.find(wt=>wt===_e.value):de===_e.value)):oe.refs[0]&&(oe.refs[0].checked=!!de):oe.refs.forEach(_e=>_e.checked=_e.value===de):Z_(oe.ref)?oe.ref.value="":(oe.ref.value=de,oe.ref.type||g.values.next({name:F,values:{...i}})))}(Y.shouldDirty||Y.shouldTouch)&&C(F,de,Y.shouldTouch,Y.shouldDirty,!0),Y.shouldValidate&&A(F)},X=(F,q,Y)=>{for(const ye in q){const de=q[ye],oe=`${F}.${ye}`,_e=ge(a,oe);(l.array.has(F)||!Hg(de)||_e&&!_e._f)&&!Nl(de)?X(oe,de,Y):U(oe,de,Y)}},j=(F,q,Y={})=>{const ye=ge(a,F),de=l.array.has(F),oe=Ln(q);ht(i,F,oe),de?(g.array.next({name:F,values:{...i}}),(d.isDirty||d.dirtyFields)&&Y.shouldDirty&&g.state.next({name:F,dirtyFields:ry(o,i),isDirty:H(F,oe)})):ye&&!ye._f&&!Yn(oe)?X(F,oe,Y):U(F,oe,Y),uk(F,l)&&g.state.next({...r}),g.values.next({name:F,values:{...i}}),!s.mount&&t()},O=async F=>{const q=F.target;let Y=q.name,ye=!0;const de=ge(a,Y),oe=()=>q.type?ay(de._f):h8(F);if(de){let _e,wt;const St=oe(),Z=F.type===jg.BLUR||F.type===jg.FOCUS_OUT,le=!Eae(de._f)&&!n.resolver&&!ge(r.errors,Y)&&!de._f.deps||xae(Z,ge(r.touchedFields,Y),r.isSubmitted,y,b),De=uk(Y,l,Z);ht(i,Y,St),Z?(de._f.onBlur&&de._f.onBlur(F),c&&c(0)):de._f.onChange&&de._f.onChange(F);const He=C(Y,St,Z,!1),ft=!wr(He)||De;if(!Z&&g.values.next({name:Y,type:F.type,values:{...i}}),le)return d.isValid&&h(),ft&&g.state.next({name:Y,...De?{}:He});if(!Z&&De&&g.state.next({...r}),S(!0),n.resolver){const{errors:Tn}=await R([Y]),Ir=Y2(r.errors,a,Y),Sn=Y2(Tn,a,Ir.name||Y);_e=Sn.error,Y=Sn.name,wt=wr(Tn)}else _e=(await dk(de,i,w,n.shouldUseNativeValidation))[Y],ye=Number.isNaN(St)||St===ge(i,Y,St),ye&&(_e?wt=!1:d.isValid&&(wt=await L(a,!0)));ye&&(de._f.deps&&A(de._f.deps),_(Y,wt,_e,He))}},A=async(F,q={})=>{let Y,ye;const de=kr(F);if(S(!0),n.resolver){const oe=await T(Ot(F)?F:de);Y=wr(oe),ye=F?!de.some(_e=>ge(oe,_e)):Y}else F?(ye=(await Promise.all(de.map(async oe=>{const _e=ge(a,oe);return await L(_e&&_e._f?{[oe]:_e}:_e)}))).every(Boolean),!(!ye&&!r.isValid)&&h()):ye=Y=await L(a);return g.state.next({...!Oa(F)||d.isValid&&Y!==r.isValid?{}:{name:F},...n.resolver||!F?{isValid:Y}:{},errors:r.errors,isValidating:!1}),q.shouldFocus&&!ye&&zg(a,oe=>oe&&ge(r.errors,oe),F?de:l.mount),ye},V=F=>{const q={...o,...s.mount?i:{}};return Ot(F)?q:Oa(F)?ge(q,F):F.map(Y=>ge(q,Y))},P=(F,q)=>({invalid:!!ge((q||r).errors,F),isDirty:!!ge((q||r).dirtyFields,F),isTouched:!!ge((q||r).touchedFields,F),error:ge((q||r).errors,F)}),N=F=>{F&&kr(F).forEach(q=>pn(r.errors,q)),g.state.next({errors:F?r.errors:{}})},K=(F,q,Y)=>{const ye=(ge(a,F,{_f:{}})._f||{}).ref;ht(r.errors,F,{...q,ref:ye}),g.state.next({name:F,errors:r.errors,isValid:!1}),Y&&Y.shouldFocus&&ye&&ye.focus&&ye.focus()},ae=(F,q)=>li(F)?g.values.subscribe({next:Y=>F(z(void 0,q),Y)}):z(F,q,!0),ne=(F,q={})=>{for(const Y of F?kr(F):l.mount)l.mount.delete(Y),l.array.delete(Y),q.keepValue||(pn(a,Y),pn(i,Y)),!q.keepError&&pn(r.errors,Y),!q.keepDirty&&pn(r.dirtyFields,Y),!q.keepTouched&&pn(r.touchedFields,Y),!n.shouldUnregister&&!q.keepDefaultValue&&pn(o,Y);g.values.next({values:{...i}}),g.state.next({...r,...q.keepDirty?{isDirty:H()}:{}}),!q.keepIsValid&&h()},Q=({disabled:F,name:q,field:Y,fields:ye})=>{if(si(F)){const de=F?void 0:ge(i,q,ay(Y?Y._f:ge(ye,q)._f));ht(i,q,de),C(q,de,!1,!1,!0)}},pe=(F,q={})=>{let Y=ge(a,F);const ye=si(q.disabled);return ht(a,F,{...Y||{},_f:{...Y&&Y._f?Y._f:{ref:{name:F}},name:F,mount:!0,...q}}),l.mount.add(F),Y?Q({field:Y,disabled:q.disabled,name:F}):x(F,!0,q.value),{...ye?{disabled:q.disabled}:{},...n.progressive?{required:!!q.required,min:pu(q.min),max:pu(q.max),minLength:pu(q.minLength),maxLength:pu(q.maxLength),pattern:pu(q.pattern)}:{},name:F,onChange:O,onBlur:O,ref:de=>{if(de){pe(F,q),Y=ge(a,F);const oe=Ot(de.value)&&de.querySelectorAll&&de.querySelectorAll("input,select,textarea")[0]||de,_e=Sae(oe),wt=Y._f.refs||[];if(_e?wt.find(St=>St===oe):oe===Y._f.ref)return;ht(a,F,{_f:{...Y._f,..._e?{refs:[...wt.filter(ny),oe,...Array.isArray(ge(o,F))?[{}]:[]],ref:{type:oe.type,name:F}}:{ref:oe}}}),x(F,!1,void 0,oe)}else Y=ge(a,F,{}),Y._f&&(Y._f.mount=!1),(n.shouldUnregister||q.shouldUnregister)&&!(b8(l.array,F)&&s.action)&&l.unMount.add(F)}}},he=()=>n.shouldFocusError&&zg(a,F=>F&&ge(r.errors,F),l.mount),re=(F,q)=>async Y=>{Y&&(Y.preventDefault&&Y.preventDefault(),Y.persist&&Y.persist());let ye=Ln(i);if(g.state.next({isSubmitting:!0}),n.resolver){const{errors:de,values:oe}=await R();r.errors=de,ye=oe}else await L(a);pn(r.errors,"root"),wr(r.errors)?(g.state.next({errors:{}}),await F(ye,Y)):(q&&await q({...r.errors},Y),he(),setTimeout(he)),g.state.next({isSubmitted:!0,isSubmitting:!1,isSubmitSuccessful:wr(r.errors),submitCount:r.submitCount+1,errors:r.errors})},Ee=(F,q={})=>{ge(a,F)&&(Ot(q.defaultValue)?j(F,ge(o,F)):(j(F,q.defaultValue),ht(o,F,q.defaultValue)),q.keepTouched||pn(r.touchedFields,F),q.keepDirty||(pn(r.dirtyFields,F),r.isDirty=q.defaultValue?H(F,ge(o,F)):H()),q.keepError||(pn(r.errors,F),d.isValid&&h()),g.state.next({...r}))},ke=(F,q={})=>{const Y=F?Ln(F):o,ye=Ln(Y),de=F&&!wr(F)?ye:o;if(q.keepDefaultValues||(o=Y),!q.keepValues){if(q.keepDirtyValues||m)for(const oe of l.mount)ge(r.dirtyFields,oe)?ht(de,oe,ge(i,oe)):j(oe,ge(de,oe));else{if(K_&&Ot(F))for(const oe of l.mount){const _e=ge(a,oe);if(_e&&_e._f){const wt=Array.isArray(_e._f.refs)?_e._f.refs[0]:_e._f.ref;if(Ug(wt)){const St=wt.closest("form");if(St){St.reset();break}}}}a={}}i=e.shouldUnregister?q.keepDefaultValues?Ln(o):{}:Ln(de),g.array.next({values:{...de}}),g.values.next({values:{...de}})}l={mount:new Set,unMount:new Set,array:new Set,watch:new Set,watchAll:!1,focus:""},!s.mount&&t(),s.mount=!d.isValid||!!q.keepIsValid,s.watch=!!e.shouldUnregister,g.state.next({submitCount:q.keepSubmitCount?r.submitCount:0,isDirty:q.keepDirty?r.isDirty:!!(q.keepDefaultValues&&!as(F,o)),isSubmitted:q.keepIsSubmitted?r.isSubmitted:!1,dirtyFields:q.keepDirtyValues?r.dirtyFields:q.keepDefaultValues&&F?ry(o,F):{},touchedFields:q.keepTouched?r.touchedFields:{},errors:q.keepErrors?r.errors:{},isSubmitSuccessful:q.keepIsSubmitSuccessful?r.isSubmitSuccessful:!1,isSubmitting:!1})},We=(F,q)=>ke(li(F)?F(i):F,q);return{control:{register:pe,unregister:ne,getFieldState:P,handleSubmit:re,setError:K,_executeSchema:R,_getWatch:z,_getDirty:H,_updateValid:h,_removeUnmounted:D,_updateFieldArray:E,_updateDisabledField:Q,_getFieldArray:M,_reset:ke,_resetDefaultValues:()=>li(n.defaultValues)&&n.defaultValues().then(F=>{We(F,n.resetOptions),g.state.next({isLoading:!1})}),_updateFormState:F=>{r={...r,...F}},_subjects:g,_proxyFormState:d,get _fields(){return a},get _formValues(){return i},get _state(){return s},set _state(F){s=F},get _defaultValues(){return o},get _names(){return l},set _names(F){l=F},get _formState(){return r},set _formState(F){r=F},get _options(){return n},set _options(F){n={...n,...F}}},trigger:A,register:pe,handleSubmit:re,watch:ae,setValue:j,getValues:V,reset:We,resetField:Ee,clearErrors:N,unregister:ne,setError:K,setFocus:(F,q={})=>{const Y=ge(a,F),ye=Y&&Y._f;if(ye){const de=ye.refs?ye.refs[0]:ye.ref;de.focus&&(de.focus(),q.shouldSelect&&de.select())}},getFieldState:P}}function bn(e={}){const t=Ae.useRef(),n=Ae.useRef(),[r,a]=Ae.useState({isDirty:!1,isValidating:!1,isLoading:li(e.defaultValues),isSubmitted:!1,isSubmitting:!1,isSubmitSuccessful:!1,isValid:!1,submitCount:0,dirtyFields:{},touchedFields:{},errors:{},defaultValues:li(e.defaultValues)?void 0:e.defaultValues});t.current||(t.current={..._ae(e,()=>a(i=>({...i}))),formState:r});const o=t.current.control;return o._options=e,gh({subject:o._subjects.state,next:i=>{S8(i,o._proxyFormState,o._updateFormState,!0)&&a({...o._formState})}}),Ae.useEffect(()=>{e.values&&!as(e.values,n.current)?(o._reset(e.values,o._options.resetOptions),n.current=e.values):o._resetDefaultValues()},[e.values,o]),Ae.useEffect(()=>{o._state.mount||(o._updateValid(),o._state.mount=!0),o._state.watch&&(o._state.watch=!1,o._subjects.state.next({...o._formState})),o._removeUnmounted()}),t.current.formState=v8(r,o),t.current}var Z2=function(e,t,n){if(e&&"reportValidity"in e){var r=ge(n,t);e.setCustomValidity(r&&r.message||""),e.reportValidity()}},O8=function(e,t){var n=function(a){var o=t.fields[a];o&&o.ref&&"reportValidity"in o.ref?Z2(o.ref,a,e):o.refs&&o.refs.forEach(function(i){return Z2(i,a,e)})};for(var r in t.fields)n(r)},Aae=function(e,t){t.shouldUseNativeValidation&&O8(e,t);var n={};for(var r in e){var a=ge(t.fields,r),o=Object.assign(e[r]||{},{ref:a&&a.ref});if(Rae(t.names||Object.keys(e),r)){var i=Object.assign({},Tae(ge(n,r)));ht(i,"root",o),ht(n,r,i)}else ht(n,r,o)}return n},Tae=function(e){return Array.isArray(e)?e.filter(Boolean):[]},Rae=function(e,t){return e.some(function(n){return n.startsWith(t+".")})},Nae=function(e,t){for(var n={};e.length;){var r=e[0],a=r.code,o=r.message,i=r.path.join(".");if(!n[i])if("unionErrors"in r){var s=r.unionErrors[0].errors[0];n[i]={message:s.message,type:s.code}}else n[i]={message:o,type:a};if("unionErrors"in r&&r.unionErrors.forEach(function(u){return u.errors.forEach(function(d){return e.push(d)})}),t){var l=n[i].types,c=l&&l[r.code];n[i]=k8(i,t,n,a,c?[].concat(c,r.message):r.message)}e.shift()}return n},yn=function(e,t,n){return n===void 0&&(n={}),function(r,a,o){try{return Promise.resolve(function(i,s){try{var l=Promise.resolve(e[n.mode==="sync"?"parse":"parseAsync"](r,t)).then(function(c){return o.shouldUseNativeValidation&&O8({},o),{errors:{},values:n.raw?r:c}})}catch(c){return s(c)}return l&&l.then?l.then(void 0,s):l}(0,function(i){if(function(s){return s.errors!=null}(i))return{values:{},errors:Aae(Nae(i.errors,!o.shouldUseNativeValidation&&o.criteriaMode==="all"),o)};throw i}))}catch(i){return Promise.reject(i)}}};function Bl(e,t,{checkForDefaultPrevented:n=!0}={}){return function(a){if(e==null||e(a),n===!1||!a.defaultPrevented)return t==null?void 0:t(a)}}function Iae(e,t){typeof e=="function"?e(t):e!=null&&(e.current=t)}function D8(...e){return t=>e.forEach(n=>Iae(n,t))}function yf(...e){return p.useCallback(D8(...e),e)}function Oae(e,t=[]){let n=[];function r(o,i){const s=p.createContext(i),l=n.length;n=[...n,i];function c(d){const{scope:g,children:m,...b}=d,y=(g==null?void 0:g[e][l])||s,w=p.useMemo(()=>b,Object.values(b));return p.createElement(y.Provider,{value:w},m)}function u(d,g){const m=(g==null?void 0:g[e][l])||s,b=p.useContext(m);if(b)return b;if(i!==void 0)return i;throw new Error(`\`${d}\` must be used within \`${o}\``)}return c.displayName=o+"Provider",[c,u]}const a=()=>{const o=n.map(i=>p.createContext(i));return function(s){const l=(s==null?void 0:s[e])||o;return p.useMemo(()=>({[`__scope${e}`]:{...s,[e]:l}}),[s,l])}};return a.scopeName=e,[r,Dae(a,...t)]}function Dae(...e){const t=e[0];if(e.length===1)return t;const n=()=>{const r=e.map(a=>({useScope:a(),scopeName:a.scopeName}));return function(o){const i=r.reduce((s,{useScope:l,scopeName:c})=>{const d=l(o)[`__scope${c}`];return{...s,...d}},{});return p.useMemo(()=>({[`__scope${t.scopeName}`]:i}),[i])}};return n.scopeName=t.scopeName,n}const fk=globalThis!=null&&globalThis.document?p.useLayoutEffect:()=>{},Lae=Kd["useId".toString()]||(()=>{});let Mae=0;function oy(e){const[t,n]=p.useState(Lae());return fk(()=>{e||n(r=>r??String(Mae++))},[e]),e||(t?`radix-${t}`:"")}function Rs(e){const t=p.useRef(e);return p.useEffect(()=>{t.current=e}),p.useMemo(()=>(...n)=>{var r;return(r=t.current)===null||r===void 0?void 0:r.call(t,...n)},[])}function Pae({prop:e,defaultProp:t,onChange:n=()=>{}}){const[r,a]=$ae({defaultProp:t,onChange:n}),o=e!==void 0,i=o?e:r,s=Rs(n),l=p.useCallback(c=>{if(o){const d=typeof c=="function"?c(e):c;d!==e&&s(d)}else a(c)},[o,e,a,s]);return[i,l]}function $ae({defaultProp:e,onChange:t}){const n=p.useState(e),[r]=n,a=p.useRef(r),o=Rs(t);return p.useEffect(()=>{a.current!==r&&(o(r),a.current=r)},[r,a,o]),n}const Q_=p.forwardRef((e,t)=>{const{children:n,...r}=e,a=p.Children.toArray(n),o=a.find(jae);if(o){const i=o.props.children,s=a.map(l=>l===o?p.Children.count(i)>1?p.Children.only(null):p.isValidElement(i)?i.props.children:null:l);return p.createElement(pk,W({},r,{ref:t}),p.isValidElement(i)?p.cloneElement(i,void 0,s):null)}return p.createElement(pk,W({},r,{ref:t}),n)});Q_.displayName="Slot";const pk=p.forwardRef((e,t)=>{const{children:n,...r}=e;return p.isValidElement(n)?p.cloneElement(n,{...zae(r,n.props),ref:D8(t,n.ref)}):p.Children.count(n)>1?p.Children.only(null):null});pk.displayName="SlotClone";const Fae=({children:e})=>p.createElement(p.Fragment,null,e);function jae(e){return p.isValidElement(e)&&e.type===Fae}function zae(e,t){const n={...t};for(const r in t){const a=e[r],o=t[r];/^on[A-Z]/.test(r)?n[r]=(...s)=>{o==null||o(...s),a==null||a(...s)}:r==="style"?n[r]={...a,...o}:r==="className"&&(n[r]=[a,o].filter(Boolean).join(" "))}return{...e,...n}}const Uae=["a","button","div","h2","h3","img","li","nav","ol","p","span","svg","ul"],mh=Uae.reduce((e,t)=>{const n=p.forwardRef((r,a)=>{const{asChild:o,...i}=r,s=o?Q_:t;return p.useEffect(()=>{window[Symbol.for("radix-ui")]=!0},[]),p.createElement(s,W({},i,{ref:a}))});return n.displayName=`Primitive.${t}`,{...e,[t]:n}},{});function Bae(e,t){e&&ba.flushSync(()=>e.dispatchEvent(t))}function Hae(e){const t=Rs(e);p.useEffect(()=>{const n=r=>{r.key==="Escape"&&t(r)};return document.addEventListener("keydown",n),()=>document.removeEventListener("keydown",n)},[t])}const gk="dismissableLayer.update",Vae="dismissableLayer.pointerDownOutside",qae="dismissableLayer.focusOutside";let X2;const Gae=p.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),Wae=p.forwardRef((e,t)=>{const{disableOutsidePointerEvents:n=!1,onEscapeKeyDown:r,onPointerDownOutside:a,onFocusOutside:o,onInteractOutside:i,onDismiss:s,...l}=e,c=p.useContext(Gae),[u,d]=p.useState(null),[,g]=p.useState({}),m=yf(t,x=>d(x)),b=Array.from(c.layers),[y]=[...c.layersWithOutsidePointerEventsDisabled].slice(-1),w=b.indexOf(y),v=u?b.indexOf(u):-1,h=c.layersWithOutsidePointerEventsDisabled.size>0,S=v>=w,E=Kae(x=>{const C=x.target,_=[...c.branches].some(R=>R.contains(C));!S||_||(a==null||a(x),i==null||i(x),x.defaultPrevented||s==null||s())}),k=Yae(x=>{const C=x.target;[...c.branches].some(R=>R.contains(C))||(o==null||o(x),i==null||i(x),x.defaultPrevented||s==null||s())});return Hae(x=>{v===c.layers.size-1&&(r==null||r(x),!x.defaultPrevented&&s&&(x.preventDefault(),s()))}),p.useEffect(()=>{if(u)return n&&(c.layersWithOutsidePointerEventsDisabled.size===0&&(X2=document.body.style.pointerEvents,document.body.style.pointerEvents="none"),c.layersWithOutsidePointerEventsDisabled.add(u)),c.layers.add(u),Q2(),()=>{n&&c.layersWithOutsidePointerEventsDisabled.size===1&&(document.body.style.pointerEvents=X2)}},[u,n,c]),p.useEffect(()=>()=>{u&&(c.layers.delete(u),c.layersWithOutsidePointerEventsDisabled.delete(u),Q2())},[u,c]),p.useEffect(()=>{const x=()=>g({});return document.addEventListener(gk,x),()=>document.removeEventListener(gk,x)},[]),p.createElement(mh.div,W({},l,{ref:m,style:{pointerEvents:h?S?"auto":"none":void 0,...e.style},onFocusCapture:Bl(e.onFocusCapture,k.onFocusCapture),onBlurCapture:Bl(e.onBlurCapture,k.onBlurCapture),onPointerDownCapture:Bl(e.onPointerDownCapture,E.onPointerDownCapture)}))});function Kae(e){const t=Rs(e),n=p.useRef(!1),r=p.useRef(()=>{});return p.useEffect(()=>{const a=i=>{if(i.target&&!n.current){let c=function(){L8(Vae,t,l,{discrete:!0})};var s=c;const l={originalEvent:i};i.pointerType==="touch"?(document.removeEventListener("click",r.current),r.current=c,document.addEventListener("click",r.current,{once:!0})):c()}n.current=!1},o=window.setTimeout(()=>{document.addEventListener("pointerdown",a)},0);return()=>{window.clearTimeout(o),document.removeEventListener("pointerdown",a),document.removeEventListener("click",r.current)}},[t]),{onPointerDownCapture:()=>n.current=!0}}function Yae(e){const t=Rs(e),n=p.useRef(!1);return p.useEffect(()=>{const r=a=>{a.target&&!n.current&&L8(qae,t,{originalEvent:a},{discrete:!1})};return document.addEventListener("focusin",r),()=>document.removeEventListener("focusin",r)},[t]),{onFocusCapture:()=>n.current=!0,onBlurCapture:()=>n.current=!1}}function Q2(){const e=new CustomEvent(gk);document.dispatchEvent(e)}function L8(e,t,n,{discrete:r}){const a=n.originalEvent.target,o=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&a.addEventListener(e,t,{once:!0}),r?Bae(a,o):a.dispatchEvent(o)}const iy="focusScope.autoFocusOnMount",sy="focusScope.autoFocusOnUnmount",J2={bubbles:!1,cancelable:!0},Zae=p.forwardRef((e,t)=>{const{loop:n=!1,trapped:r=!1,onMountAutoFocus:a,onUnmountAutoFocus:o,...i}=e,[s,l]=p.useState(null),c=Rs(a),u=Rs(o),d=p.useRef(null),g=yf(t,y=>l(y)),m=p.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;p.useEffect(()=>{if(r){let v=function(S){if(m.paused||!s)return;const E=S.target;s.contains(E)?d.current=E:Yi(d.current,{select:!0})},h=function(S){m.paused||!s||s.contains(S.relatedTarget)||Yi(d.current,{select:!0})};var y=v,w=h;return document.addEventListener("focusin",v),document.addEventListener("focusout",h),()=>{document.removeEventListener("focusin",v),document.removeEventListener("focusout",h)}}},[r,s,m.paused]),p.useEffect(()=>{if(s){tN.add(m);const y=document.activeElement;if(!s.contains(y)){const v=new CustomEvent(iy,J2);s.addEventListener(iy,c),s.dispatchEvent(v),v.defaultPrevented||(Xae(noe(M8(s)),{select:!0}),document.activeElement===y&&Yi(s))}return()=>{s.removeEventListener(iy,c),setTimeout(()=>{const v=new CustomEvent(sy,J2);s.addEventListener(sy,u),s.dispatchEvent(v),v.defaultPrevented||Yi(y??document.body,{select:!0}),s.removeEventListener(sy,u),tN.remove(m)},0)}}},[s,c,u,m]);const b=p.useCallback(y=>{if(!n&&!r||m.paused)return;const w=y.key==="Tab"&&!y.altKey&&!y.ctrlKey&&!y.metaKey,v=document.activeElement;if(w&&v){const h=y.currentTarget,[S,E]=Qae(h);S&&E?!y.shiftKey&&v===E?(y.preventDefault(),n&&Yi(S,{select:!0})):y.shiftKey&&v===S&&(y.preventDefault(),n&&Yi(E,{select:!0})):v===h&&y.preventDefault()}},[n,r,m.paused]);return p.createElement(mh.div,W({tabIndex:-1},i,{ref:g,onKeyDown:b}))});function Xae(e,{select:t=!1}={}){const n=document.activeElement;for(const r of e)if(Yi(r,{select:t}),document.activeElement!==n)return}function Qae(e){const t=M8(e),n=eN(t,e),r=eN(t.reverse(),e);return[n,r]}function M8(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>{const a=r.tagName==="INPUT"&&r.type==="hidden";return r.disabled||r.hidden||a?NodeFilter.FILTER_SKIP:r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function eN(e,t){for(const n of e)if(!Jae(n,{upTo:t}))return n}function Jae(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function eoe(e){return e instanceof HTMLInputElement&&"select"in e}function Yi(e,{select:t=!1}={}){if(e&&e.focus){const n=document.activeElement;e.focus({preventScroll:!0}),e!==n&&eoe(e)&&t&&e.select()}}const tN=toe();function toe(){let e=[];return{add(t){const n=e[0];t!==n&&(n==null||n.pause()),e=nN(e,t),e.unshift(t)},remove(t){var n;e=nN(e,t),(n=e[0])===null||n===void 0||n.resume()}}}function nN(e,t){const n=[...e],r=n.indexOf(t);return r!==-1&&n.splice(r,1),n}function noe(e){return e.filter(t=>t.tagName!=="A")}const roe=p.forwardRef((e,t)=>{var n;const{container:r=globalThis==null||(n=globalThis.document)===null||n===void 0?void 0:n.body,...a}=e;return r?GC.createPortal(p.createElement(mh.div,W({},a,{ref:t})),r):null});function aoe(e,t){return p.useReducer((n,r)=>{const a=t[n][r];return a??n},e)}const hh=e=>{const{present:t,children:n}=e,r=ooe(t),a=typeof n=="function"?n({present:r.isPresent}):p.Children.only(n),o=yf(r.ref,a.ref);return typeof n=="function"||r.isPresent?p.cloneElement(a,{ref:o}):null};hh.displayName="Presence";function ooe(e){const[t,n]=p.useState(),r=p.useRef({}),a=p.useRef(e),o=p.useRef("none"),i=e?"mounted":"unmounted",[s,l]=aoe(i,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return p.useEffect(()=>{const c=lp(r.current);o.current=s==="mounted"?c:"none"},[s]),fk(()=>{const c=r.current,u=a.current;if(u!==e){const g=o.current,m=lp(c);e?l("MOUNT"):m==="none"||(c==null?void 0:c.display)==="none"?l("UNMOUNT"):l(u&&g!==m?"ANIMATION_OUT":"UNMOUNT"),a.current=e}},[e,l]),fk(()=>{if(t){const c=d=>{const m=lp(r.current).includes(d.animationName);d.target===t&&m&&ba.flushSync(()=>l("ANIMATION_END"))},u=d=>{d.target===t&&(o.current=lp(r.current))};return t.addEventListener("animationstart",u),t.addEventListener("animationcancel",c),t.addEventListener("animationend",c),()=>{t.removeEventListener("animationstart",u),t.removeEventListener("animationcancel",c),t.removeEventListener("animationend",c)}}else l("ANIMATION_END")},[t,l]),{isPresent:["mounted","unmountSuspended"].includes(s),ref:p.useCallback(c=>{c&&(r.current=getComputedStyle(c)),n(c)},[])}}function lp(e){return(e==null?void 0:e.animationName)||"none"}let ly=0;function ioe(){p.useEffect(()=>{var e,t;const n=document.querySelectorAll("[data-radix-focus-guard]");return document.body.insertAdjacentElement("afterbegin",(e=n[0])!==null&&e!==void 0?e:rN()),document.body.insertAdjacentElement("beforeend",(t=n[1])!==null&&t!==void 0?t:rN()),ly++,()=>{ly===1&&document.querySelectorAll("[data-radix-focus-guard]").forEach(r=>r.remove()),ly--}},[])}function rN(){const e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.cssText="outline: none; opacity: 0; position: fixed; pointer-events: none",e}var P8=u7(),cy=function(){},bh=p.forwardRef(function(e,t){var n=p.useRef(null),r=p.useState({onScrollCapture:cy,onWheelCapture:cy,onTouchMoveCapture:cy}),a=r[0],o=r[1],i=e.forwardProps,s=e.children,l=e.className,c=e.removeScrollBar,u=e.enabled,d=e.shards,g=e.sideCar,m=e.noIsolation,b=e.inert,y=e.allowPinchZoom,w=e.as,v=w===void 0?"div":w,h=O_(e,["forwardProps","children","className","removeScrollBar","enabled","shards","sideCar","noIsolation","inert","allowPinchZoom","as"]),S=g,E=c7([n,t]),k=Pn(Pn({},h),a);return p.createElement(p.Fragment,null,u&&p.createElement(S,{sideCar:P8,removeScrollBar:c,shards:d,noIsolation:m,inert:b,setCallbacks:o,allowPinchZoom:!!y,lockRef:n}),i?p.cloneElement(p.Children.only(s),Pn(Pn({},k),{ref:E})):p.createElement(v,Pn({},k,{className:l,ref:E}),s))});bh.defaultProps={enabled:!0,removeScrollBar:!0,inert:!1};bh.classNames={fullWidth:qu,zeroRight:Vu};var mk=!1;if(typeof window<"u")try{var cp=Object.defineProperty({},"passive",{get:function(){return mk=!0,!0}});window.addEventListener("test",cp,cp),window.removeEventListener("test",cp,cp)}catch{mk=!1}var rl=mk?{passive:!1}:!1,soe=function(e){var t=window.getComputedStyle(e);return t.overflowY!=="hidden"&&!(t.overflowY===t.overflowX&&t.overflowY==="visible")},loe=function(e){var t=window.getComputedStyle(e);return t.overflowX!=="hidden"&&!(t.overflowY===t.overflowX&&t.overflowX==="visible")},aN=function(e,t){var n=t;do{typeof ShadowRoot<"u"&&n instanceof ShadowRoot&&(n=n.host);var r=$8(e,n);if(r){var a=F8(e,n),o=a[1],i=a[2];if(o>i)return!0}n=n.parentNode}while(n&&n!==document.body);return!1},coe=function(e){var t=e.scrollTop,n=e.scrollHeight,r=e.clientHeight;return[t,n,r]},uoe=function(e){var t=e.scrollLeft,n=e.scrollWidth,r=e.clientWidth;return[t,n,r]},$8=function(e,t){return e==="v"?soe(t):loe(t)},F8=function(e,t){return e==="v"?coe(t):uoe(t)},doe=function(e,t){return e==="h"&&t==="rtl"?-1:1},foe=function(e,t,n,r,a){var o=doe(e,window.getComputedStyle(t).direction),i=o*r,s=n.target,l=t.contains(s),c=!1,u=i>0,d=0,g=0;do{var m=F8(e,s),b=m[0],y=m[1],w=m[2],v=y-w-o*b;(b||v)&&$8(e,s)&&(d+=v,g+=b),s=s.parentNode}while(!l&&s!==document.body||l&&(t.contains(s)||t===s));return(u&&(a&&d===0||!a&&i>d)||!u&&(a&&g===0||!a&&-i>g))&&(c=!0),c},up=function(e){return"changedTouches"in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},oN=function(e){return[e.deltaX,e.deltaY]},iN=function(e){return e&&"current"in e?e.current:e},poe=function(e,t){return e[0]===t[0]&&e[1]===t[1]},goe=function(e){return` .block-interactivity-`.concat(e,` {pointer-events: none;} .allow-interactivity-`).concat(e,` {pointer-events: all;} -`)},moe=0,al=[];function hoe(e){var t=p.useRef([]),n=p.useRef([0,0]),r=p.useRef(),a=p.useState(moe++)[0],o=p.useState(function(){return D_()})[0],i=p.useRef(e);p.useEffect(function(){i.current=e},[e]),p.useEffect(function(){if(e.inert){document.body.classList.add("block-interactivity-".concat(a));var y=s7([e.lockRef.current],(e.shards||[]).map(iN),!0).filter(Boolean);return y.forEach(function(w){return w.classList.add("allow-interactivity-".concat(a))}),function(){document.body.classList.remove("block-interactivity-".concat(a)),y.forEach(function(w){return w.classList.remove("allow-interactivity-".concat(a))})}}},[e.inert,e.lockRef.current,e.shards]);var s=p.useCallback(function(y,w){if("touches"in y&&y.touches.length===2)return!i.current.allowPinchZoom;var v=up(y),h=n.current,S="deltaX"in y?y.deltaX:h[0]-v[0],E="deltaY"in y?y.deltaY:h[1]-v[1],k,x=y.target,C=Math.abs(S)>Math.abs(E)?"h":"v";if("touches"in y&&C==="h"&&x.type==="range")return!1;var _=aN(C,x);if(!_)return!0;if(_?k=C:(k=C==="v"?"h":"v",_=aN(C,x)),!_)return!1;if(!r.current&&"changedTouches"in y&&(S||E)&&(r.current=k),!k)return!0;var R=r.current||k;return foe(R,w,y,R==="h"?S:E,!0)},[]),l=p.useCallback(function(y){var w=y;if(!(!al.length||al[al.length-1]!==o)){var v="deltaY"in w?oN(w):up(w),h=t.current.filter(function(k){return k.name===w.type&&k.target===w.target&&poe(k.delta,v)})[0];if(h&&h.should){w.preventDefault();return}if(!h){var S=(i.current.shards||[]).map(iN).filter(Boolean).filter(function(k){return k.contains(w.target)}),E=S.length>0?s(w,S[0]):!i.current.noIsolation;E&&w.preventDefault()}}},[]),c=p.useCallback(function(y,w,v,h){var S={name:y,delta:w,target:v,should:h};t.current.push(S),setTimeout(function(){t.current=t.current.filter(function(E){return E!==S})},1)},[]),u=p.useCallback(function(y){n.current=up(y),r.current=void 0},[]),d=p.useCallback(function(y){c(y.type,oN(y),y.target,s(y,e.lockRef.current))},[]),g=p.useCallback(function(y){c(y.type,up(y),y.target,s(y,e.lockRef.current))},[]);p.useEffect(function(){return al.push(o),e.setCallbacks({onScrollCapture:d,onWheelCapture:d,onTouchMoveCapture:g}),document.addEventListener("wheel",l,rl),document.addEventListener("touchmove",l,rl),document.addEventListener("touchstart",u,rl),function(){al=al.filter(function(y){return y!==o}),document.removeEventListener("wheel",l,rl),document.removeEventListener("touchmove",l,rl),document.removeEventListener("touchstart",u,rl)}},[]);var m=e.removeScrollBar,b=e.inert;return p.createElement(p.Fragment,null,b?p.createElement(o,{styles:goe(a)}):null,m?p.createElement(p7,{gapMode:"margin"}):null)}const boe=d7(M8,hoe);var F8=p.forwardRef(function(e,t){return p.createElement(hh,Pn({},e,{ref:t,sideCar:boe}))});F8.classNames=hh.classNames;const yoe=F8,j8="Dialog",[z8,uTe]=Oae(j8),[voe,Vs]=z8(j8),Soe=e=>{const{__scopeDialog:t,children:n,open:r,defaultOpen:a,onOpenChange:o,modal:i=!0}=e,s=p.useRef(null),l=p.useRef(null),[c=!1,u]=Pae({prop:r,defaultProp:a,onChange:o});return p.createElement(voe,{scope:t,triggerRef:s,contentRef:l,contentId:ay(),titleId:ay(),descriptionId:ay(),open:c,onOpenChange:u,onOpenToggle:p.useCallback(()=>u(d=>!d),[u]),modal:i},n)},U8="DialogPortal",[woe,B8]=z8(U8,{forceMount:void 0}),Eoe=e=>{const{__scopeDialog:t,forceMount:n,children:r,container:a}=e,o=Vs(U8,t);return p.createElement(woe,{scope:t,forceMount:n},p.Children.map(r,i=>p.createElement(mh,{present:n||o.open},p.createElement(roe,{asChild:!0,container:a},i))))},mk="DialogOverlay",xoe=p.forwardRef((e,t)=>{const n=B8(mk,e.__scopeDialog),{forceMount:r=n.forceMount,...a}=e,o=Vs(mk,e.__scopeDialog);return o.modal?p.createElement(mh,{present:r||o.open},p.createElement(koe,W({},a,{ref:t}))):null}),koe=p.forwardRef((e,t)=>{const{__scopeDialog:n,...r}=e,a=Vs(mk,n);return p.createElement(yoe,{as:Q_,allowPinchZoom:!0,shards:[a.contentRef]},p.createElement(gh.div,W({"data-state":V8(a.open)},r,{ref:t,style:{pointerEvents:"auto",...r.style}})))}),kd="DialogContent",Coe=p.forwardRef((e,t)=>{const n=B8(kd,e.__scopeDialog),{forceMount:r=n.forceMount,...a}=e,o=Vs(kd,e.__scopeDialog);return p.createElement(mh,{present:r||o.open},o.modal?p.createElement(_oe,W({},a,{ref:t})):p.createElement(Aoe,W({},a,{ref:t})))}),_oe=p.forwardRef((e,t)=>{const n=Vs(kd,e.__scopeDialog),r=p.useRef(null),a=yf(t,n.contentRef,r);return p.useEffect(()=>{const o=r.current;if(o)return mf(o)},[]),p.createElement(H8,W({},e,{ref:a,trapFocus:n.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:Bl(e.onCloseAutoFocus,o=>{var i;o.preventDefault(),(i=n.triggerRef.current)===null||i===void 0||i.focus()}),onPointerDownOutside:Bl(e.onPointerDownOutside,o=>{const i=o.detail.originalEvent,s=i.button===0&&i.ctrlKey===!0;(i.button===2||s)&&o.preventDefault()}),onFocusOutside:Bl(e.onFocusOutside,o=>o.preventDefault())}))}),Aoe=p.forwardRef((e,t)=>{const n=Vs(kd,e.__scopeDialog),r=p.useRef(!1);return p.createElement(H8,W({},e,{ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:a=>{var o;if((o=e.onCloseAutoFocus)===null||o===void 0||o.call(e,a),!a.defaultPrevented){var i;r.current||(i=n.triggerRef.current)===null||i===void 0||i.focus(),a.preventDefault()}r.current=!1},onInteractOutside:a=>{var o,i;(o=e.onInteractOutside)===null||o===void 0||o.call(e,a),a.defaultPrevented||(r.current=!0);const s=a.target;((i=n.triggerRef.current)===null||i===void 0?void 0:i.contains(s))&&a.preventDefault()}}))}),H8=p.forwardRef((e,t)=>{const{__scopeDialog:n,trapFocus:r,onOpenAutoFocus:a,onCloseAutoFocus:o,...i}=e,s=Vs(kd,n),l=p.useRef(null),c=yf(t,l);return ioe(),p.createElement(p.Fragment,null,p.createElement(Zae,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:a,onUnmountAutoFocus:o},p.createElement(Wae,W({role:"dialog",id:s.contentId,"aria-describedby":s.descriptionId,"aria-labelledby":s.titleId,"data-state":V8(s.open)},i,{ref:c,onDismiss:()=>s.onOpenChange(!1)}))),!1)});function V8(e){return e?"open":"closed"}const Toe=Soe,Roe=Eoe,Noe=xoe,Ioe=Coe;var sN=1,Ooe=.9,Doe=.3,cy=.1,Loe=0,uy=.999,Moe=.9999,Poe=.99,lN=/[\\\/\-_+.# \t"@\[\(\{&]/,$oe=/[\\\/\-_+.# \t"@\[\(\{&]/g;function hk(e,t,n,r,a,o){if(o===t.length)return a===e.length?sN:Poe;for(var i=r.charAt(o),s=n.indexOf(i,a),l=0,c,u,d;s>=0;)c=hk(e,t,n,r,s+1,o+1),c>l&&(s===a?c*=sN:lN.test(e.charAt(s-1))?(c*=Ooe,d=e.slice(a,s-1).match($oe),d&&a>0&&(c*=Math.pow(uy,d.length))):lN.test(e.slice(a,s-1))?(c*=Loe,a>0&&(c*=Math.pow(uy,s-a))):(c*=Doe,a>0&&(c*=Math.pow(uy,s-a))),e.charAt(s)!==t.charAt(o)&&(c*=Moe)),cc&&(c=u*cy)),c>l&&(l=c),s=n.indexOf(i,s+1);return l}function Foe(e,t){return hk(e,t,e.toLowerCase(),t.toLowerCase(),0,0)}var joe=Foe;const zoe=Tc(joe);var Uoe='[cmdk-list-sizer=""]',gu='[cmdk-group=""]',dy='[cmdk-group-items=""]',Boe='[cmdk-group-heading=""]',q8='[cmdk-item=""]',cN=`${q8}:not([aria-disabled="true"])`,bk="cmdk-item-select",Vo="data-value",Hoe=(e,t)=>zoe(e,t),G8=p.createContext(void 0),vf=()=>p.useContext(G8),W8=p.createContext(void 0),J_=()=>p.useContext(W8),K8=p.createContext(void 0),Y8=p.forwardRef((e,t)=>{let n=p.useRef(null),r=dl(()=>({search:"",value:"",filtered:{count:0,items:new Map,groups:new Set}})),a=dl(()=>new Set),o=dl(()=>new Map),i=dl(()=>new Map),s=dl(()=>new Set),l=e9(e),{label:c,children:u,value:d,onValueChange:g,filter:m,shouldFilter:b,...y}=e,w=p.useId(),v=p.useId(),h=p.useId(),S=Xoe();Uc(()=>{if(d!==void 0){let O=d.trim().toLowerCase();r.current.value=O,S(6,T),E.emit()}},[d]);let E=p.useMemo(()=>({subscribe:O=>(s.current.add(O),()=>s.current.delete(O)),snapshot:()=>r.current,setState:(O,A,V)=>{var P,N,K;if(!Object.is(r.current[O],A)){if(r.current[O]=A,O==="search")R(),C(),S(1,_);else if(O==="value")if(((P=l.current)==null?void 0:P.value)!==void 0){(K=(N=l.current).onValueChange)==null||K.call(N,A);return}else V||S(5,T);E.emit()}},emit:()=>{s.current.forEach(O=>O())}}),[]),k=p.useMemo(()=>({value:(O,A)=>{A!==i.current.get(O)&&(i.current.set(O,A),r.current.filtered.items.set(O,x(A)),S(2,()=>{C(),E.emit()}))},item:(O,A)=>(a.current.add(O),A&&(o.current.has(A)?o.current.get(A).add(O):o.current.set(A,new Set([O]))),S(3,()=>{R(),C(),r.current.value||_(),E.emit()}),()=>{i.current.delete(O),a.current.delete(O),r.current.filtered.items.delete(O),S(4,()=>{R(),_(),E.emit()})}),group:O=>(o.current.has(O)||o.current.set(O,new Set),()=>{i.current.delete(O),o.current.delete(O)}),filter:()=>l.current.shouldFilter,label:c||e["aria-label"],listId:w,inputId:h,labelId:v}),[]);function x(O){var A;let V=((A=l.current)==null?void 0:A.filter)??Hoe;return O?V(O,r.current.search):0}function C(){if(!n.current||!r.current.search||l.current.shouldFilter===!1)return;let O=r.current.filtered.items,A=[];r.current.filtered.groups.forEach(P=>{let N=o.current.get(P),K=0;N.forEach(ae=>{let ne=O.get(ae);K=Math.max(ne,K)}),A.push([P,K])});let V=n.current.querySelector(Uoe);D().sort((P,N)=>{let K=P.getAttribute(Vo),ae=N.getAttribute(Vo);return(O.get(ae)??0)-(O.get(K)??0)}).forEach(P=>{let N=P.closest(dy);N?N.appendChild(P.parentElement===N?P:P.closest(`${dy} > *`)):V.appendChild(P.parentElement===V?P:P.closest(`${dy} > *`))}),A.sort((P,N)=>N[1]-P[1]).forEach(P=>{let N=n.current.querySelector(`${gu}[${Vo}="${P[0]}"]`);N==null||N.parentElement.appendChild(N)})}function _(){let O=D().find(V=>!V.ariaDisabled),A=O==null?void 0:O.getAttribute(Vo);E.setState("value",A||void 0)}function R(){if(!r.current.search||l.current.shouldFilter===!1){r.current.filtered.count=a.current.size;return}r.current.filtered.groups=new Set;let O=0;for(let A of a.current){let V=i.current.get(A),P=x(V);r.current.filtered.items.set(A,P),P>0&&O++}for(let[A,V]of o.current)for(let P of V)if(r.current.filtered.items.get(P)>0){r.current.filtered.groups.add(A);break}r.current.filtered.count=O}function T(){var O,A,V;let P=L();P&&(((O=P.parentElement)==null?void 0:O.firstChild)===P&&((V=(A=P.closest(gu))==null?void 0:A.querySelector(Boe))==null||V.scrollIntoView({block:"nearest"})),P.scrollIntoView({block:"nearest"}))}function L(){return n.current.querySelector(`${q8}[aria-selected="true"]`)}function D(){return Array.from(n.current.querySelectorAll(cN))}function H(O){let A=D()[O];A&&E.setState("value",A.getAttribute(Vo))}function z(O){var A;let V=L(),P=D(),N=P.findIndex(ae=>ae===V),K=P[N+O];(A=l.current)!=null&&A.loop&&(K=N+O<0?P[P.length-1]:N+O===P.length?P[0]:P[N+O]),K&&E.setState("value",K.getAttribute(Vo))}function M(O){let A=L(),V=A==null?void 0:A.closest(gu),P;for(;V&&!P;)V=O>0?Yoe(V,gu):Zoe(V,gu),P=V==null?void 0:V.querySelector(cN);P?E.setState("value",P.getAttribute(Vo)):z(O)}let U=()=>H(D().length-1),X=O=>{O.preventDefault(),O.metaKey?U():O.altKey?M(1):z(1)},j=O=>{O.preventDefault(),O.metaKey?H(0):O.altKey?M(-1):z(-1)};return p.createElement("div",{ref:Sf([n,t]),...y,"cmdk-root":"",onKeyDown:O=>{var A;if((A=y.onKeyDown)==null||A.call(y,O),!O.defaultPrevented)switch(O.key){case"n":case"j":{O.ctrlKey&&X(O);break}case"ArrowDown":{X(O);break}case"p":case"k":{O.ctrlKey&&j(O);break}case"ArrowUp":{j(O);break}case"Home":{O.preventDefault(),H(0);break}case"End":{O.preventDefault(),U();break}case"Enter":{O.preventDefault();let V=L();if(V){let P=new Event(bk);V.dispatchEvent(P)}}}}},p.createElement("label",{"cmdk-label":"",htmlFor:k.inputId,id:k.labelId,style:Qoe},c),p.createElement(W8.Provider,{value:E},p.createElement(G8.Provider,{value:k},u)))}),Z8=p.forwardRef((e,t)=>{let n=p.useId(),r=p.useRef(null),a=p.useContext(K8),o=vf(),i=e9(e);Uc(()=>o.item(n,a),[]);let s=t9(n,r,[e.value,e.children,r]),l=J_(),c=Ec(v=>v.value&&v.value===s.current),u=Ec(v=>o.filter()===!1?!0:v.search?v.filtered.items.get(n)>0:!0);p.useEffect(()=>{let v=r.current;if(!(!v||e.disabled))return v.addEventListener(bk,d),()=>v.removeEventListener(bk,d)},[u,e.onSelect,e.disabled]);function d(){var v,h;(h=(v=i.current).onSelect)==null||h.call(v,s.current)}function g(){l.setState("value",s.current,!0)}if(!u)return null;let{disabled:m,value:b,onSelect:y,...w}=e;return p.createElement("div",{ref:Sf([r,t]),...w,"cmdk-item":"",role:"option","aria-disabled":m||void 0,"aria-selected":c||void 0,"data-selected":c||void 0,onPointerMove:m?void 0:g,onClick:m?void 0:d},e.children)}),X8=p.forwardRef((e,t)=>{let{heading:n,children:r,...a}=e,o=p.useId(),i=p.useRef(null),s=p.useRef(null),l=p.useId(),c=vf(),u=Ec(g=>c.filter()===!1?!0:g.search?g.filtered.groups.has(o):!0);Uc(()=>c.group(o),[]),t9(o,i,[e.value,e.heading,s]);let d=p.createElement(K8.Provider,{value:o},r);return p.createElement("div",{ref:Sf([i,t]),...a,"cmdk-group":"",role:"presentation",hidden:u?void 0:!0},n&&p.createElement("div",{ref:s,"cmdk-group-heading":"","aria-hidden":!0,id:l},n),p.createElement("div",{"cmdk-group-items":"",role:"group","aria-labelledby":n?l:void 0},d))}),Voe=p.forwardRef((e,t)=>{let{alwaysRender:n,...r}=e,a=p.useRef(null),o=Ec(i=>!i.search);return!n&&!o?null:p.createElement("div",{ref:Sf([a,t]),...r,"cmdk-separator":"",role:"separator"})}),Q8=p.forwardRef((e,t)=>{let{onValueChange:n,...r}=e,a=e.value!=null,o=J_(),i=Ec(l=>l.search),s=vf();return p.useEffect(()=>{e.value!=null&&o.setState("search",e.value)},[e.value]),p.createElement("input",{ref:t,...r,"cmdk-input":"",autoComplete:"off",autoCorrect:"off",spellCheck:!1,"aria-autocomplete":"list",role:"combobox","aria-expanded":!0,"aria-controls":s.listId,"aria-labelledby":s.labelId,id:s.inputId,type:"text",value:a?e.value:i,onChange:l=>{a||o.setState("search",l.target.value),n==null||n(l.target.value)}})}),qoe=p.forwardRef((e,t)=>{let{children:n,...r}=e,a=p.useRef(null),o=p.useRef(null),i=vf();return p.useEffect(()=>{if(o.current&&a.current){let s=o.current,l=a.current,c,u=new ResizeObserver(()=>{c=requestAnimationFrame(()=>{let d=s.getBoundingClientRect().height;l.style.setProperty("--cmdk-list-height",d.toFixed(1)+"px")})});return u.observe(s),()=>{cancelAnimationFrame(c),u.unobserve(s)}}},[]),p.createElement("div",{ref:Sf([a,t]),...r,"cmdk-list":"",role:"listbox","aria-label":"Suggestions",id:i.listId,"aria-labelledby":i.inputId},p.createElement("div",{ref:o,"cmdk-list-sizer":""},n))}),Goe=p.forwardRef((e,t)=>{let{open:n,onOpenChange:r,container:a,...o}=e;return p.createElement(Toe,{open:n,onOpenChange:r},p.createElement(Roe,{container:a},p.createElement(Noe,{"cmdk-overlay":""}),p.createElement(Ioe,{"aria-label":e.label,"cmdk-dialog":""},p.createElement(Y8,{ref:t,...o}))))}),J8=p.forwardRef((e,t)=>{let n=p.useRef(!0),r=Ec(a=>a.filtered.count===0);return p.useEffect(()=>{n.current=!1},[]),n.current||!r?null:p.createElement("div",{ref:t,...e,"cmdk-empty":"",role:"presentation"})}),Woe=p.forwardRef((e,t)=>{let{progress:n,children:r,...a}=e;return p.createElement("div",{ref:t,...a,"cmdk-loading":"",role:"progressbar","aria-valuenow":n,"aria-valuemin":0,"aria-valuemax":100,"aria-label":"Loading..."},p.createElement("div",{"aria-hidden":!0},r))}),Koe=Object.assign(Y8,{List:qoe,Item:Z8,Input:Q8,Group:X8,Separator:Voe,Dialog:Goe,Empty:J8,Loading:Woe});function Yoe(e,t){let n=e.nextElementSibling;for(;n;){if(n.matches(t))return n;n=n.nextElementSibling}}function Zoe(e,t){let n=e.previousElementSibling;for(;n;){if(n.matches(t))return n;n=n.previousElementSibling}}function e9(e){let t=p.useRef(e);return Uc(()=>{t.current=e}),t}var Uc=typeof window>"u"?p.useEffect:p.useLayoutEffect;function dl(e){let t=p.useRef();return t.current===void 0&&(t.current=e()),t}function Sf(e){return t=>{e.forEach(n=>{typeof n=="function"?n(t):n!=null&&(n.current=t)})}}function Ec(e){let t=J_(),n=()=>e(t.snapshot());return p.useSyncExternalStore(t.subscribe,n,n)}function t9(e,t,n){let r=p.useRef(),a=vf();return Uc(()=>{var o;let i=(()=>{var s;for(let l of n){if(typeof l=="string")return l.trim().toLowerCase();if(typeof l=="object"&&"current"in l&&l.current)return(s=l.current.textContent)==null?void 0:s.trim().toLowerCase()}})();a.value(e,i),(o=t.current)==null||o.setAttribute(Vo,i),r.current=i}),r}var Xoe=()=>{let[e,t]=p.useState(),n=dl(()=>new Map);return Uc(()=>{n.current.forEach(r=>r()),n.current=new Map},[e]),(r,a)=>{n.current.set(r,a),t({})}},Qoe={position:"absolute",width:"1px",height:"1px",padding:"0",margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0"};const n9="Popover",[r9,dTe]=zn(n9,[qa]),eA=qa(),[Joe,Bc]=r9(n9),a9=e=>{const{__scopePopover:t,children:n,open:r,defaultOpen:a,onOpenChange:o,modal:i=!1}=e,s=eA(t),l=p.useRef(null),[c,u]=p.useState(!1),[d=!1,g]=Fa({prop:r,defaultProp:a,onChange:o});return p.createElement(rh,s,p.createElement(Joe,{scope:t,contentId:bi(),triggerRef:l,open:d,onOpenChange:g,onOpenToggle:p.useCallback(()=>g(m=>!m),[g]),hasCustomAnchor:c,onCustomAnchorAdd:p.useCallback(()=>u(!0),[]),onCustomAnchorRemove:p.useCallback(()=>u(!1),[]),modal:i},n))},eie="PopoverTrigger",o9=p.forwardRef((e,t)=>{const{__scopePopover:n,...r}=e,a=Bc(eie,n),o=eA(n),i=nt(t,a.triggerRef),s=p.createElement(ze.button,W({type:"button","aria-haspopup":"dialog","aria-expanded":a.open,"aria-controls":a.contentId,"data-state":c9(a.open)},r,{ref:i,onClick:fe(e.onClick,a.onOpenToggle)}));return a.hasCustomAnchor?s:p.createElement(pf,W({asChild:!0},o),s)}),i9="PopoverPortal",[tie,nie]=r9(i9,{forceMount:void 0}),rie=e=>{const{__scopePopover:t,forceMount:n,children:r,container:a}=e,o=Bc(i9,t);return p.createElement(tie,{scope:t,forceMount:n},p.createElement(pr,{present:n||o.open},p.createElement(Jd,{asChild:!0,container:a},r)))},Cd="PopoverContent",s9=p.forwardRef((e,t)=>{const n=nie(Cd,e.__scopePopover),{forceMount:r=n.forceMount,...a}=e,o=Bc(Cd,e.__scopePopover);return p.createElement(pr,{present:r||o.open},o.modal?p.createElement(aie,W({},a,{ref:t})):p.createElement(oie,W({},a,{ref:t})))}),aie=p.forwardRef((e,t)=>{const n=Bc(Cd,e.__scopePopover),r=p.useRef(null),a=nt(t,r),o=p.useRef(!1);return p.useEffect(()=>{const i=r.current;if(i)return mf(i)},[]),p.createElement(ih,{as:$a,allowPinchZoom:!0},p.createElement(l9,W({},e,{ref:a,trapFocus:n.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:fe(e.onCloseAutoFocus,i=>{var s;i.preventDefault(),o.current||(s=n.triggerRef.current)===null||s===void 0||s.focus()}),onPointerDownOutside:fe(e.onPointerDownOutside,i=>{const s=i.detail.originalEvent,l=s.button===0&&s.ctrlKey===!0,c=s.button===2||l;o.current=c},{checkForDefaultPrevented:!1}),onFocusOutside:fe(e.onFocusOutside,i=>i.preventDefault(),{checkForDefaultPrevented:!1})})))}),oie=p.forwardRef((e,t)=>{const n=Bc(Cd,e.__scopePopover),r=p.useRef(!1),a=p.useRef(!1);return p.createElement(l9,W({},e,{ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:o=>{var i;if((i=e.onCloseAutoFocus)===null||i===void 0||i.call(e,o),!o.defaultPrevented){var s;r.current||(s=n.triggerRef.current)===null||s===void 0||s.focus(),o.preventDefault()}r.current=!1,a.current=!1},onInteractOutside:o=>{var i,s;(i=e.onInteractOutside)===null||i===void 0||i.call(e,o),o.defaultPrevented||(r.current=!0,o.detail.originalEvent.type==="pointerdown"&&(a.current=!0));const l=o.target;((s=n.triggerRef.current)===null||s===void 0?void 0:s.contains(l))&&o.preventDefault(),o.detail.originalEvent.type==="focusin"&&a.current&&o.preventDefault()}}))}),l9=p.forwardRef((e,t)=>{const{__scopePopover:n,trapFocus:r,onOpenAutoFocus:a,onCloseAutoFocus:o,disableOutsidePointerEvents:i,onEscapeKeyDown:s,onPointerDownOutside:l,onFocusOutside:c,onInteractOutside:u,...d}=e,g=Bc(Cd,n),m=eA(n);return Jm(),p.createElement(eh,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:a,onUnmountAutoFocus:o},p.createElement(Ls,{asChild:!0,disableOutsidePointerEvents:i,onInteractOutside:u,onEscapeKeyDown:s,onPointerDownOutside:l,onFocusOutside:c,onDismiss:()=>g.onOpenChange(!1)},p.createElement(gf,W({"data-state":c9(g.open),role:"dialog",id:g.contentId},m,d,{ref:t,style:{...d.style,"--radix-popover-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-popover-content-available-width":"var(--radix-popper-available-width)","--radix-popover-content-available-height":"var(--radix-popper-available-height)","--radix-popover-trigger-width":"var(--radix-popper-anchor-width)","--radix-popover-trigger-height":"var(--radix-popper-anchor-height)"}}))))});function c9(e){return e?"open":"closed"}const iie=a9,sie=o9,lie=rie,u9=s9,uN=a9,dN=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(o9,{asChild:!0,...n,children:f.jsxs(ue,{variant:"outline",role:"combobox",className:ee("w-full justify-between font-normal py-2 px-3 hover:bg-transparent",e),children:[t,f.jsx(YC,{className:"h-4 w-4 opacity-50"})]})})),fN=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(s9,{className:ee("PopoverContent z-50 bg-background rounded-md border"),...n,children:t})),pN=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(Koe,{className:ee("w-full",e),...n,children:t})),gN=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(Q8,{className:ee("w-full pt-2 px-3 bg-background text-foreground border-b py-3 focus-visible:outline-none",e),...n,children:t})),mN=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(J8,{className:ee("w-full px-3 text-destructive text-sm",e),...n,children:t})),hN=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(X8,{className:ee("w-full",e),...n,children:t})),bN=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(Z8,{className:ee("w-full py-2 px-3 hover:bg-muted",e),...n,children:t})),cie=p.forwardRef((e,t)=>p.createElement(ze.label,W({},e,{ref:t,onMouseDown:n=>{var r;(r=e.onMouseDown)===null||r===void 0||r.call(e,n),!n.defaultPrevented&&n.detail>1&&n.preventDefault()}}))),d9=cie,uie=ef("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"),os=p.forwardRef(({className:e,...t},n)=>f.jsx(d9,{ref:n,className:ee(uie(),e),...t}));os.displayName=d9.displayName;const vn=dae,f9=p.createContext({}),ut=({...e})=>f.jsx(f9.Provider,{value:{name:e.name},children:f.jsx(mae,{...e})}),bh=()=>{const e=p.useContext(f9),t=p.useContext(p9),{getFieldState:n,formState:r}=Hs(),a=n(e.name,r);if(!e)throw new Error("useFormField should be used within ");const{id:o}=t;return{id:o,name:e.name,formItemId:`${o}-form-item`,formDescriptionId:`${o}-form-item-description`,formMessageId:`${o}-form-item-message`,...a}},p9=p.createContext({}),ot=p.forwardRef(({className:e,...t},n)=>{const r=p.useId();return f.jsx(p9.Provider,{value:{id:r},children:f.jsx("div",{ref:n,className:ee("space-y-2",e),...t})})});ot.displayName="FormItem";const yt=p.forwardRef(({className:e,...t},n)=>{const{error:r,formItemId:a}=bh();return f.jsx(os,{ref:n,className:ee(r&&"text-destructive",e),htmlFor:a,...t})});yt.displayName="FormLabel";const pt=p.forwardRef(({...e},t)=>{const{error:n,formItemId:r,formDescriptionId:a,formMessageId:o}=bh();return f.jsx($a,{ref:t,id:r,"aria-describedby":n?`${a} ${o}`:`${a}`,"aria-invalid":!!n,...e})});pt.displayName="FormControl";const Mt=p.forwardRef(({className:e,...t},n)=>{const{formDescriptionId:r}=bh();return f.jsx("p",{ref:n,id:r,className:ee("text-sm text-muted-foreground",e),...t})});Mt.displayName="FormDescription";const lt=p.forwardRef(({className:e,children:t,...n},r)=>{const{error:a,formMessageId:o}=bh(),i=a?String(a==null?void 0:a.message):t;return i?f.jsx("p",{ref:r,id:o,className:ee("text-sm font-medium text-destructive",e),...n,children:i}):null});lt.displayName="FormMessage";function die(){const e=p.useRef(null);return{formRef:e,onKeyDown:n=>{var r;n.key==="Enter"&&!n.shiftKey&&!n.nativeEvent.isComposing&&((r=e.current)==null||r.requestSubmit(),n.preventDefault())}}}const qs=p.forwardRef(({className:e,...t},n)=>f.jsx("textarea",{className:ee("flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),ref:n,...t}));qs.displayName="Textarea";const Ai=({limit:e,charCount:t,...n})=>f.jsxs("div",{className:"relative",children:[f.jsx(qs,{className:ee("min-h-80",n.className),...n}),f.jsxs("div",{className:"absolute bottom-2 right-2.5 text-xs text-muted-foreground",children:[t??0," / ",e]})]}),fie=(...e)=>ee("scroll-m-20 text-2xl font-semibold tracking-tight",e),pie=(...e)=>ee("rounded bg-muted px-[0.3rem] py-[0.2rem] font-mono text-sm font-semibold",e),Tt=(...e)=>ee("text-sm text-muted-foreground",e);var gt;(function(e){e.assertEqual=a=>a;function t(a){}e.assertIs=t;function n(a){throw new Error}e.assertNever=n,e.arrayToEnum=a=>{const o={};for(const i of a)o[i]=i;return o},e.getValidEnumValues=a=>{const o=e.objectKeys(a).filter(s=>typeof a[a[s]]!="number"),i={};for(const s of o)i[s]=a[s];return e.objectValues(i)},e.objectValues=a=>e.objectKeys(a).map(function(o){return a[o]}),e.objectKeys=typeof Object.keys=="function"?a=>Object.keys(a):a=>{const o=[];for(const i in a)Object.prototype.hasOwnProperty.call(a,i)&&o.push(i);return o},e.find=(a,o)=>{for(const i of a)if(o(i))return i},e.isInteger=typeof Number.isInteger=="function"?a=>Number.isInteger(a):a=>typeof a=="number"&&isFinite(a)&&Math.floor(a)===a;function r(a,o=" | "){return a.map(i=>typeof i=="string"?`'${i}'`:i).join(o)}e.joinValues=r,e.jsonStringifyReplacer=(a,o)=>typeof o=="bigint"?o.toString():o})(gt||(gt={}));var yN;(function(e){e.mergeShapes=(t,n)=>({...t,...n})})(yN||(yN={}));const ve=gt.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),Xi=e=>{switch(typeof e){case"undefined":return ve.undefined;case"string":return ve.string;case"number":return isNaN(e)?ve.nan:ve.number;case"boolean":return ve.boolean;case"function":return ve.function;case"bigint":return ve.bigint;case"symbol":return ve.symbol;case"object":return Array.isArray(e)?ve.array:e===null?ve.null:e.then&&typeof e.then=="function"&&e.catch&&typeof e.catch=="function"?ve.promise:typeof Map<"u"&&e instanceof Map?ve.map:typeof Set<"u"&&e instanceof Set?ve.set:typeof Date<"u"&&e instanceof Date?ve.date:ve.object;default:return ve.unknown}},ce=gt.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]);class Ma extends Error{constructor(t){super(),this.issues=[],this.addIssue=r=>{this.issues=[...this.issues,r]},this.addIssues=(r=[])=>{this.issues=[...this.issues,...r]};const n=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,n):this.__proto__=n,this.name="ZodError",this.issues=t}get errors(){return this.issues}format(t){const n=t||function(o){return o.message},r={_errors:[]},a=o=>{for(const i of o.issues)if(i.code==="invalid_union")i.unionErrors.map(a);else if(i.code==="invalid_return_type")a(i.returnTypeError);else if(i.code==="invalid_arguments")a(i.argumentsError);else if(i.path.length===0)r._errors.push(n(i));else{let s=r,l=0;for(;ln.message){const n={},r=[];for(const a of this.issues)a.path.length>0?(n[a.path[0]]=n[a.path[0]]||[],n[a.path[0]].push(t(a))):r.push(t(a));return{formErrors:r,fieldErrors:n}}get formErrors(){return this.flatten()}}Ma.create=e=>new Ma(e);const qg=(e,t)=>{let n;switch(e.code){case ce.invalid_type:e.received===ve.undefined?n="Required":n=`Expected ${e.expected}, received ${e.received}`;break;case ce.invalid_literal:n=`Invalid literal value, expected ${JSON.stringify(e.expected,gt.jsonStringifyReplacer)}`;break;case ce.unrecognized_keys:n=`Unrecognized key(s) in object: ${gt.joinValues(e.keys,", ")}`;break;case ce.invalid_union:n="Invalid input";break;case ce.invalid_union_discriminator:n=`Invalid discriminator value. Expected ${gt.joinValues(e.options)}`;break;case ce.invalid_enum_value:n=`Invalid enum value. Expected ${gt.joinValues(e.options)}, received '${e.received}'`;break;case ce.invalid_arguments:n="Invalid function arguments";break;case ce.invalid_return_type:n="Invalid function return type";break;case ce.invalid_date:n="Invalid date";break;case ce.invalid_string:typeof e.validation=="object"?"includes"in e.validation?(n=`Invalid input: must include "${e.validation.includes}"`,typeof e.validation.position=="number"&&(n=`${n} at one or more positions greater than or equal to ${e.validation.position}`)):"startsWith"in e.validation?n=`Invalid input: must start with "${e.validation.startsWith}"`:"endsWith"in e.validation?n=`Invalid input: must end with "${e.validation.endsWith}"`:gt.assertNever(e.validation):e.validation!=="regex"?n=`Invalid ${e.validation}`:n="Invalid";break;case ce.too_small:e.type==="array"?n=`Array must contain ${e.exact?"exactly":e.inclusive?"at least":"more than"} ${e.minimum} element(s)`:e.type==="string"?n=`String must contain ${e.exact?"exactly":e.inclusive?"at least":"over"} ${e.minimum} character(s)`:e.type==="number"?n=`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:e.type==="date"?n=`Date must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(e.minimum))}`:n="Invalid input";break;case ce.too_big:e.type==="array"?n=`Array must contain ${e.exact?"exactly":e.inclusive?"at most":"less than"} ${e.maximum} element(s)`:e.type==="string"?n=`String must contain ${e.exact?"exactly":e.inclusive?"at most":"under"} ${e.maximum} character(s)`:e.type==="number"?n=`Number must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="bigint"?n=`BigInt must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="date"?n=`Date must be ${e.exact?"exactly":e.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(e.maximum))}`:n="Invalid input";break;case ce.custom:n="Invalid input";break;case ce.invalid_intersection_types:n="Intersection results could not be merged";break;case ce.not_multiple_of:n=`Number must be a multiple of ${e.multipleOf}`;break;case ce.not_finite:n="Number must be finite";break;default:n=t.defaultError,gt.assertNever(e)}return{message:n}};let gie=qg;function yk(){return gie}const vk=e=>{const{data:t,path:n,errorMaps:r,issueData:a}=e,o=[...n,...a.path||[]],i={...a,path:o};let s="";const l=r.filter(c=>!!c).slice().reverse();for(const c of l)s=c(i,{data:t,defaultError:s}).message;return{...a,path:o,message:a.message||s}};function we(e,t){const n=vk({issueData:t,data:e.data,path:e.path,errorMaps:[e.common.contextualErrorMap,e.schemaErrorMap,yk(),qg].filter(r=>!!r)});e.common.issues.push(n)}class Qn{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(t,n){const r=[];for(const a of n){if(a.status==="aborted")return Ge;a.status==="dirty"&&t.dirty(),r.push(a.value)}return{status:t.value,value:r}}static async mergeObjectAsync(t,n){const r=[];for(const a of n)r.push({key:await a.key,value:await a.value});return Qn.mergeObjectSync(t,r)}static mergeObjectSync(t,n){const r={};for(const a of n){const{key:o,value:i}=a;if(o.status==="aborted"||i.status==="aborted")return Ge;o.status==="dirty"&&t.dirty(),i.status==="dirty"&&t.dirty(),o.value!=="__proto__"&&(typeof i.value<"u"||a.alwaysSet)&&(r[o.value]=i.value)}return{status:t.value,value:r}}}const Ge=Object.freeze({status:"aborted"}),mie=e=>({status:"dirty",value:e}),dr=e=>({status:"valid",value:e}),vN=e=>e.status==="aborted",SN=e=>e.status==="dirty",Gg=e=>e.status==="valid",Sk=e=>typeof Promise<"u"&&e instanceof Promise;var Ne;(function(e){e.errToObj=t=>typeof t=="string"?{message:t}:t||{},e.toString=t=>typeof t=="string"?t:t==null?void 0:t.message})(Ne||(Ne={}));class Ba{constructor(t,n,r,a){this._cachedPath=[],this.parent=t,this.data=n,this._path=r,this._key=a}get path(){return this._cachedPath.length||(this._key instanceof Array?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}}const wN=(e,t)=>{if(Gg(t))return{success:!0,data:t.value};if(!e.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;const n=new Ma(e.common.issues);return this._error=n,this._error}}};function qe(e){if(!e)return{};const{errorMap:t,invalid_type_error:n,required_error:r,description:a}=e;if(t&&(n||r))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return t?{errorMap:t,description:a}:{errorMap:(i,s)=>i.code!=="invalid_type"?{message:s.defaultError}:typeof s.data>"u"?{message:r??s.defaultError}:{message:n??s.defaultError},description:a}}class rt{constructor(t){this.spa=this.safeParseAsync,this._def=t,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this)}get description(){return this._def.description}_getType(t){return Xi(t.data)}_getOrReturnCtx(t,n){return n||{common:t.parent.common,data:t.data,parsedType:Xi(t.data),schemaErrorMap:this._def.errorMap,path:t.path,parent:t.parent}}_processInputParams(t){return{status:new Qn,ctx:{common:t.parent.common,data:t.data,parsedType:Xi(t.data),schemaErrorMap:this._def.errorMap,path:t.path,parent:t.parent}}}_parseSync(t){const n=this._parse(t);if(Sk(n))throw new Error("Synchronous parse encountered promise.");return n}_parseAsync(t){const n=this._parse(t);return Promise.resolve(n)}parse(t,n){const r=this.safeParse(t,n);if(r.success)return r.data;throw r.error}safeParse(t,n){var r;const a={common:{issues:[],async:(r=n==null?void 0:n.async)!==null&&r!==void 0?r:!1,contextualErrorMap:n==null?void 0:n.errorMap},path:(n==null?void 0:n.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:Xi(t)},o=this._parseSync({data:t,path:a.path,parent:a});return wN(a,o)}async parseAsync(t,n){const r=await this.safeParseAsync(t,n);if(r.success)return r.data;throw r.error}async safeParseAsync(t,n){const r={common:{issues:[],contextualErrorMap:n==null?void 0:n.errorMap,async:!0},path:(n==null?void 0:n.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:Xi(t)},a=this._parse({data:t,path:r.path,parent:r}),o=await(Sk(a)?a:Promise.resolve(a));return wN(r,o)}refine(t,n){const r=a=>typeof n=="string"||typeof n>"u"?{message:n}:typeof n=="function"?n(a):n;return this._refinement((a,o)=>{const i=t(a),s=()=>o.addIssue({code:ce.custom,...r(a)});return typeof Promise<"u"&&i instanceof Promise?i.then(l=>l?!0:(s(),!1)):i?!0:(s(),!1)})}refinement(t,n){return this._refinement((r,a)=>t(r)?!0:(a.addIssue(typeof n=="function"?n(r,a):n),!1))}_refinement(t){return new xo({schema:this,typeName:Me.ZodEffects,effect:{type:"refinement",refinement:t}})}superRefine(t){return this._refinement(t)}optional(){return yi.create(this,this._def)}nullable(){return _c.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return Pa.create(this,this._def)}promise(){return Td.create(this,this._def)}or(t){return Yg.create([this,t],this._def)}and(t){return Zg.create(this,t,this._def)}transform(t){return new xo({...qe(this._def),schema:this,typeName:Me.ZodEffects,effect:{type:"transform",transform:t}})}default(t){const n=typeof t=="function"?t:()=>t;return new tm({...qe(this._def),innerType:this,defaultValue:n,typeName:Me.ZodDefault})}brand(){return new Aie({typeName:Me.ZodBranded,type:this,...qe(this._def)})}catch(t){const n=typeof t=="function"?t:()=>t;return new _k({...qe(this._def),innerType:this,catchValue:n,typeName:Me.ZodCatch})}describe(t){const n=this.constructor;return new n({...this._def,description:t})}pipe(t){return yh.create(this,t)}readonly(){return Tk.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}const hie=/^c[^\s-]{8,}$/i,bie=/^[a-z][a-z0-9]*$/,yie=/^[0-9A-HJKMNP-TV-Z]{26}$/,vie=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,Sie=/^(?!\.)(?!.*\.\.)([A-Z0-9_+-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,wie="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$";let fy;const Eie=/^(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))$/,xie=/^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,kie=e=>e.precision?e.offset?new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${e.precision}}(([+-]\\d{2}(:?\\d{2})?)|Z)$`):new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${e.precision}}Z$`):e.precision===0?e.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(([+-]\\d{2}(:?\\d{2})?)|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$"):e.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}(:?\\d{2})?)|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$");function Cie(e,t){return!!((t==="v4"||!t)&&Eie.test(e)||(t==="v6"||!t)&&xie.test(e))}class lo extends rt{_parse(t){if(this._def.coerce&&(t.data=String(t.data)),this._getType(t)!==ve.string){const o=this._getOrReturnCtx(t);return we(o,{code:ce.invalid_type,expected:ve.string,received:o.parsedType}),Ge}const r=new Qn;let a;for(const o of this._def.checks)if(o.kind==="min")t.data.lengtho.value&&(a=this._getOrReturnCtx(t,a),we(a,{code:ce.too_big,maximum:o.value,type:"string",inclusive:!0,exact:!1,message:o.message}),r.dirty());else if(o.kind==="length"){const i=t.data.length>o.value,s=t.data.lengtht.test(a),{validation:n,code:ce.invalid_string,...Ne.errToObj(r)})}_addCheck(t){return new lo({...this._def,checks:[...this._def.checks,t]})}email(t){return this._addCheck({kind:"email",...Ne.errToObj(t)})}url(t){return this._addCheck({kind:"url",...Ne.errToObj(t)})}emoji(t){return this._addCheck({kind:"emoji",...Ne.errToObj(t)})}uuid(t){return this._addCheck({kind:"uuid",...Ne.errToObj(t)})}cuid(t){return this._addCheck({kind:"cuid",...Ne.errToObj(t)})}cuid2(t){return this._addCheck({kind:"cuid2",...Ne.errToObj(t)})}ulid(t){return this._addCheck({kind:"ulid",...Ne.errToObj(t)})}ip(t){return this._addCheck({kind:"ip",...Ne.errToObj(t)})}datetime(t){var n;return typeof t=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,message:t}):this._addCheck({kind:"datetime",precision:typeof(t==null?void 0:t.precision)>"u"?null:t==null?void 0:t.precision,offset:(n=t==null?void 0:t.offset)!==null&&n!==void 0?n:!1,...Ne.errToObj(t==null?void 0:t.message)})}regex(t,n){return this._addCheck({kind:"regex",regex:t,...Ne.errToObj(n)})}includes(t,n){return this._addCheck({kind:"includes",value:t,position:n==null?void 0:n.position,...Ne.errToObj(n==null?void 0:n.message)})}startsWith(t,n){return this._addCheck({kind:"startsWith",value:t,...Ne.errToObj(n)})}endsWith(t,n){return this._addCheck({kind:"endsWith",value:t,...Ne.errToObj(n)})}min(t,n){return this._addCheck({kind:"min",value:t,...Ne.errToObj(n)})}max(t,n){return this._addCheck({kind:"max",value:t,...Ne.errToObj(n)})}length(t,n){return this._addCheck({kind:"length",value:t,...Ne.errToObj(n)})}nonempty(t){return this.min(1,Ne.errToObj(t))}trim(){return new lo({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new lo({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new lo({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(t=>t.kind==="datetime")}get isEmail(){return!!this._def.checks.find(t=>t.kind==="email")}get isURL(){return!!this._def.checks.find(t=>t.kind==="url")}get isEmoji(){return!!this._def.checks.find(t=>t.kind==="emoji")}get isUUID(){return!!this._def.checks.find(t=>t.kind==="uuid")}get isCUID(){return!!this._def.checks.find(t=>t.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(t=>t.kind==="cuid2")}get isULID(){return!!this._def.checks.find(t=>t.kind==="ulid")}get isIP(){return!!this._def.checks.find(t=>t.kind==="ip")}get minLength(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxLength(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.value{var t;return new lo({checks:[],typeName:Me.ZodString,coerce:(t=e==null?void 0:e.coerce)!==null&&t!==void 0?t:!1,...qe(e)})};function _ie(e,t){const n=(e.toString().split(".")[1]||"").length,r=(t.toString().split(".")[1]||"").length,a=n>r?n:r,o=parseInt(e.toFixed(a).replace(".","")),i=parseInt(t.toFixed(a).replace(".",""));return o%i/Math.pow(10,a)}class xc extends rt{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(t){if(this._def.coerce&&(t.data=Number(t.data)),this._getType(t)!==ve.number){const o=this._getOrReturnCtx(t);return we(o,{code:ce.invalid_type,expected:ve.number,received:o.parsedType}),Ge}let r;const a=new Qn;for(const o of this._def.checks)o.kind==="int"?gt.isInteger(t.data)||(r=this._getOrReturnCtx(t,r),we(r,{code:ce.invalid_type,expected:"integer",received:"float",message:o.message}),a.dirty()):o.kind==="min"?(o.inclusive?t.datao.value:t.data>=o.value)&&(r=this._getOrReturnCtx(t,r),we(r,{code:ce.too_big,maximum:o.value,type:"number",inclusive:o.inclusive,exact:!1,message:o.message}),a.dirty()):o.kind==="multipleOf"?_ie(t.data,o.value)!==0&&(r=this._getOrReturnCtx(t,r),we(r,{code:ce.not_multiple_of,multipleOf:o.value,message:o.message}),a.dirty()):o.kind==="finite"?Number.isFinite(t.data)||(r=this._getOrReturnCtx(t,r),we(r,{code:ce.not_finite,message:o.message}),a.dirty()):gt.assertNever(o);return{status:a.value,value:t.data}}gte(t,n){return this.setLimit("min",t,!0,Ne.toString(n))}gt(t,n){return this.setLimit("min",t,!1,Ne.toString(n))}lte(t,n){return this.setLimit("max",t,!0,Ne.toString(n))}lt(t,n){return this.setLimit("max",t,!1,Ne.toString(n))}setLimit(t,n,r,a){return new xc({...this._def,checks:[...this._def.checks,{kind:t,value:n,inclusive:r,message:Ne.toString(a)}]})}_addCheck(t){return new xc({...this._def,checks:[...this._def.checks,t]})}int(t){return this._addCheck({kind:"int",message:Ne.toString(t)})}positive(t){return this._addCheck({kind:"min",value:0,inclusive:!1,message:Ne.toString(t)})}negative(t){return this._addCheck({kind:"max",value:0,inclusive:!1,message:Ne.toString(t)})}nonpositive(t){return this._addCheck({kind:"max",value:0,inclusive:!0,message:Ne.toString(t)})}nonnegative(t){return this._addCheck({kind:"min",value:0,inclusive:!0,message:Ne.toString(t)})}multipleOf(t,n){return this._addCheck({kind:"multipleOf",value:t,message:Ne.toString(n)})}finite(t){return this._addCheck({kind:"finite",message:Ne.toString(t)})}safe(t){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:Ne.toString(t)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:Ne.toString(t)})}get minValue(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxValue(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.valuet.kind==="int"||t.kind==="multipleOf"&>.isInteger(t.value))}get isFinite(){let t=null,n=null;for(const r of this._def.checks){if(r.kind==="finite"||r.kind==="int"||r.kind==="multipleOf")return!0;r.kind==="min"?(n===null||r.value>n)&&(n=r.value):r.kind==="max"&&(t===null||r.valuenew xc({checks:[],typeName:Me.ZodNumber,coerce:(e==null?void 0:e.coerce)||!1,...qe(e)});class kc extends rt{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(t){if(this._def.coerce&&(t.data=BigInt(t.data)),this._getType(t)!==ve.bigint){const o=this._getOrReturnCtx(t);return we(o,{code:ce.invalid_type,expected:ve.bigint,received:o.parsedType}),Ge}let r;const a=new Qn;for(const o of this._def.checks)o.kind==="min"?(o.inclusive?t.datao.value:t.data>=o.value)&&(r=this._getOrReturnCtx(t,r),we(r,{code:ce.too_big,type:"bigint",maximum:o.value,inclusive:o.inclusive,message:o.message}),a.dirty()):o.kind==="multipleOf"?t.data%o.value!==BigInt(0)&&(r=this._getOrReturnCtx(t,r),we(r,{code:ce.not_multiple_of,multipleOf:o.value,message:o.message}),a.dirty()):gt.assertNever(o);return{status:a.value,value:t.data}}gte(t,n){return this.setLimit("min",t,!0,Ne.toString(n))}gt(t,n){return this.setLimit("min",t,!1,Ne.toString(n))}lte(t,n){return this.setLimit("max",t,!0,Ne.toString(n))}lt(t,n){return this.setLimit("max",t,!1,Ne.toString(n))}setLimit(t,n,r,a){return new kc({...this._def,checks:[...this._def.checks,{kind:t,value:n,inclusive:r,message:Ne.toString(a)}]})}_addCheck(t){return new kc({...this._def,checks:[...this._def.checks,t]})}positive(t){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:Ne.toString(t)})}negative(t){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:Ne.toString(t)})}nonpositive(t){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:Ne.toString(t)})}nonnegative(t){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:Ne.toString(t)})}multipleOf(t,n){return this._addCheck({kind:"multipleOf",value:t,message:Ne.toString(n)})}get minValue(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxValue(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.value{var t;return new kc({checks:[],typeName:Me.ZodBigInt,coerce:(t=e==null?void 0:e.coerce)!==null&&t!==void 0?t:!1,...qe(e)})};class wk extends rt{_parse(t){if(this._def.coerce&&(t.data=!!t.data),this._getType(t)!==ve.boolean){const r=this._getOrReturnCtx(t);return we(r,{code:ce.invalid_type,expected:ve.boolean,received:r.parsedType}),Ge}return dr(t.data)}}wk.create=e=>new wk({typeName:Me.ZodBoolean,coerce:(e==null?void 0:e.coerce)||!1,...qe(e)});class _d extends rt{_parse(t){if(this._def.coerce&&(t.data=new Date(t.data)),this._getType(t)!==ve.date){const o=this._getOrReturnCtx(t);return we(o,{code:ce.invalid_type,expected:ve.date,received:o.parsedType}),Ge}if(isNaN(t.data.getTime())){const o=this._getOrReturnCtx(t);return we(o,{code:ce.invalid_date}),Ge}const r=new Qn;let a;for(const o of this._def.checks)o.kind==="min"?t.data.getTime()o.value&&(a=this._getOrReturnCtx(t,a),we(a,{code:ce.too_big,message:o.message,inclusive:!0,exact:!1,maximum:o.value,type:"date"}),r.dirty()):gt.assertNever(o);return{status:r.value,value:new Date(t.data.getTime())}}_addCheck(t){return new _d({...this._def,checks:[...this._def.checks,t]})}min(t,n){return this._addCheck({kind:"min",value:t.getTime(),message:Ne.toString(n)})}max(t,n){return this._addCheck({kind:"max",value:t.getTime(),message:Ne.toString(n)})}get minDate(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t!=null?new Date(t):null}get maxDate(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.valuenew _d({checks:[],coerce:(e==null?void 0:e.coerce)||!1,typeName:Me.ZodDate,...qe(e)});class Ek extends rt{_parse(t){if(this._getType(t)!==ve.symbol){const r=this._getOrReturnCtx(t);return we(r,{code:ce.invalid_type,expected:ve.symbol,received:r.parsedType}),Ge}return dr(t.data)}}Ek.create=e=>new Ek({typeName:Me.ZodSymbol,...qe(e)});class Wg extends rt{_parse(t){if(this._getType(t)!==ve.undefined){const r=this._getOrReturnCtx(t);return we(r,{code:ce.invalid_type,expected:ve.undefined,received:r.parsedType}),Ge}return dr(t.data)}}Wg.create=e=>new Wg({typeName:Me.ZodUndefined,...qe(e)});class Kg extends rt{_parse(t){if(this._getType(t)!==ve.null){const r=this._getOrReturnCtx(t);return we(r,{code:ce.invalid_type,expected:ve.null,received:r.parsedType}),Ge}return dr(t.data)}}Kg.create=e=>new Kg({typeName:Me.ZodNull,...qe(e)});class Ad extends rt{constructor(){super(...arguments),this._any=!0}_parse(t){return dr(t.data)}}Ad.create=e=>new Ad({typeName:Me.ZodAny,...qe(e)});class Hl extends rt{constructor(){super(...arguments),this._unknown=!0}_parse(t){return dr(t.data)}}Hl.create=e=>new Hl({typeName:Me.ZodUnknown,...qe(e)});class Ti extends rt{_parse(t){const n=this._getOrReturnCtx(t);return we(n,{code:ce.invalid_type,expected:ve.never,received:n.parsedType}),Ge}}Ti.create=e=>new Ti({typeName:Me.ZodNever,...qe(e)});class xk extends rt{_parse(t){if(this._getType(t)!==ve.undefined){const r=this._getOrReturnCtx(t);return we(r,{code:ce.invalid_type,expected:ve.void,received:r.parsedType}),Ge}return dr(t.data)}}xk.create=e=>new xk({typeName:Me.ZodVoid,...qe(e)});class Pa extends rt{_parse(t){const{ctx:n,status:r}=this._processInputParams(t),a=this._def;if(n.parsedType!==ve.array)return we(n,{code:ce.invalid_type,expected:ve.array,received:n.parsedType}),Ge;if(a.exactLength!==null){const i=n.data.length>a.exactLength.value,s=n.data.lengtha.maxLength.value&&(we(n,{code:ce.too_big,maximum:a.maxLength.value,type:"array",inclusive:!0,exact:!1,message:a.maxLength.message}),r.dirty()),n.common.async)return Promise.all([...n.data].map((i,s)=>a.type._parseAsync(new Ba(n,i,n.path,s)))).then(i=>Qn.mergeArray(r,i));const o=[...n.data].map((i,s)=>a.type._parseSync(new Ba(n,i,n.path,s)));return Qn.mergeArray(r,o)}get element(){return this._def.type}min(t,n){return new Pa({...this._def,minLength:{value:t,message:Ne.toString(n)}})}max(t,n){return new Pa({...this._def,maxLength:{value:t,message:Ne.toString(n)}})}length(t,n){return new Pa({...this._def,exactLength:{value:t,message:Ne.toString(n)}})}nonempty(t){return this.min(1,t)}}Pa.create=(e,t)=>new Pa({type:e,minLength:null,maxLength:null,exactLength:null,typeName:Me.ZodArray,...qe(t)});function fl(e){if(e instanceof qt){const t={};for(const n in e.shape){const r=e.shape[n];t[n]=yi.create(fl(r))}return new qt({...e._def,shape:()=>t})}else return e instanceof Pa?new Pa({...e._def,type:fl(e.element)}):e instanceof yi?yi.create(fl(e.unwrap())):e instanceof _c?_c.create(fl(e.unwrap())):e instanceof Eo?Eo.create(e.items.map(t=>fl(t))):e}class qt extends rt{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;const t=this._def.shape(),n=gt.objectKeys(t);return this._cached={shape:t,keys:n}}_parse(t){if(this._getType(t)!==ve.object){const c=this._getOrReturnCtx(t);return we(c,{code:ce.invalid_type,expected:ve.object,received:c.parsedType}),Ge}const{status:r,ctx:a}=this._processInputParams(t),{shape:o,keys:i}=this._getCached(),s=[];if(!(this._def.catchall instanceof Ti&&this._def.unknownKeys==="strip"))for(const c in a.data)i.includes(c)||s.push(c);const l=[];for(const c of i){const u=o[c],d=a.data[c];l.push({key:{status:"valid",value:c},value:u._parse(new Ba(a,d,a.path,c)),alwaysSet:c in a.data})}if(this._def.catchall instanceof Ti){const c=this._def.unknownKeys;if(c==="passthrough")for(const u of s)l.push({key:{status:"valid",value:u},value:{status:"valid",value:a.data[u]}});else if(c==="strict")s.length>0&&(we(a,{code:ce.unrecognized_keys,keys:s}),r.dirty());else if(c!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{const c=this._def.catchall;for(const u of s){const d=a.data[u];l.push({key:{status:"valid",value:u},value:c._parse(new Ba(a,d,a.path,u)),alwaysSet:u in a.data})}}return a.common.async?Promise.resolve().then(async()=>{const c=[];for(const u of l){const d=await u.key;c.push({key:d,value:await u.value,alwaysSet:u.alwaysSet})}return c}).then(c=>Qn.mergeObjectSync(r,c)):Qn.mergeObjectSync(r,l)}get shape(){return this._def.shape()}strict(t){return Ne.errToObj,new qt({...this._def,unknownKeys:"strict",...t!==void 0?{errorMap:(n,r)=>{var a,o,i,s;const l=(i=(o=(a=this._def).errorMap)===null||o===void 0?void 0:o.call(a,n,r).message)!==null&&i!==void 0?i:r.defaultError;return n.code==="unrecognized_keys"?{message:(s=Ne.errToObj(t).message)!==null&&s!==void 0?s:l}:{message:l}}}:{}})}strip(){return new qt({...this._def,unknownKeys:"strip"})}passthrough(){return new qt({...this._def,unknownKeys:"passthrough"})}extend(t){return new qt({...this._def,shape:()=>({...this._def.shape(),...t})})}merge(t){return new qt({unknownKeys:t._def.unknownKeys,catchall:t._def.catchall,shape:()=>({...this._def.shape(),...t._def.shape()}),typeName:Me.ZodObject})}setKey(t,n){return this.augment({[t]:n})}catchall(t){return new qt({...this._def,catchall:t})}pick(t){const n={};return gt.objectKeys(t).forEach(r=>{t[r]&&this.shape[r]&&(n[r]=this.shape[r])}),new qt({...this._def,shape:()=>n})}omit(t){const n={};return gt.objectKeys(this.shape).forEach(r=>{t[r]||(n[r]=this.shape[r])}),new qt({...this._def,shape:()=>n})}deepPartial(){return fl(this)}partial(t){const n={};return gt.objectKeys(this.shape).forEach(r=>{const a=this.shape[r];t&&!t[r]?n[r]=a:n[r]=a.optional()}),new qt({...this._def,shape:()=>n})}required(t){const n={};return gt.objectKeys(this.shape).forEach(r=>{if(t&&!t[r])n[r]=this.shape[r];else{let o=this.shape[r];for(;o instanceof yi;)o=o._def.innerType;n[r]=o}}),new qt({...this._def,shape:()=>n})}keyof(){return g9(gt.objectKeys(this.shape))}}qt.create=(e,t)=>new qt({shape:()=>e,unknownKeys:"strip",catchall:Ti.create(),typeName:Me.ZodObject,...qe(t)});qt.strictCreate=(e,t)=>new qt({shape:()=>e,unknownKeys:"strict",catchall:Ti.create(),typeName:Me.ZodObject,...qe(t)});qt.lazycreate=(e,t)=>new qt({shape:e,unknownKeys:"strip",catchall:Ti.create(),typeName:Me.ZodObject,...qe(t)});class Yg extends rt{_parse(t){const{ctx:n}=this._processInputParams(t),r=this._def.options;function a(o){for(const s of o)if(s.result.status==="valid")return s.result;for(const s of o)if(s.result.status==="dirty")return n.common.issues.push(...s.ctx.common.issues),s.result;const i=o.map(s=>new Ma(s.ctx.common.issues));return we(n,{code:ce.invalid_union,unionErrors:i}),Ge}if(n.common.async)return Promise.all(r.map(async o=>{const i={...n,common:{...n.common,issues:[]},parent:null};return{result:await o._parseAsync({data:n.data,path:n.path,parent:i}),ctx:i}})).then(a);{let o;const i=[];for(const l of r){const c={...n,common:{...n.common,issues:[]},parent:null},u=l._parseSync({data:n.data,path:n.path,parent:c});if(u.status==="valid")return u;u.status==="dirty"&&!o&&(o={result:u,ctx:c}),c.common.issues.length&&i.push(c.common.issues)}if(o)return n.common.issues.push(...o.ctx.common.issues),o.result;const s=i.map(l=>new Ma(l));return we(n,{code:ce.invalid_union,unionErrors:s}),Ge}}get options(){return this._def.options}}Yg.create=(e,t)=>new Yg({options:e,typeName:Me.ZodUnion,...qe(t)});const Wp=e=>e instanceof Qg?Wp(e.schema):e instanceof xo?Wp(e.innerType()):e instanceof Jg?[e.value]:e instanceof Ns?e.options:e instanceof em?Object.keys(e.enum):e instanceof tm?Wp(e._def.innerType):e instanceof Wg?[void 0]:e instanceof Kg?[null]:null;class tA extends rt{_parse(t){const{ctx:n}=this._processInputParams(t);if(n.parsedType!==ve.object)return we(n,{code:ce.invalid_type,expected:ve.object,received:n.parsedType}),Ge;const r=this.discriminator,a=n.data[r],o=this.optionsMap.get(a);return o?n.common.async?o._parseAsync({data:n.data,path:n.path,parent:n}):o._parseSync({data:n.data,path:n.path,parent:n}):(we(n,{code:ce.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[r]}),Ge)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(t,n,r){const a=new Map;for(const o of n){const i=Wp(o.shape[t]);if(!i)throw new Error(`A discriminator value for key \`${t}\` could not be extracted from all schema options`);for(const s of i){if(a.has(s))throw new Error(`Discriminator property ${String(t)} has duplicate value ${String(s)}`);a.set(s,o)}}return new tA({typeName:Me.ZodDiscriminatedUnion,discriminator:t,options:n,optionsMap:a,...qe(r)})}}function kk(e,t){const n=Xi(e),r=Xi(t);if(e===t)return{valid:!0,data:e};if(n===ve.object&&r===ve.object){const a=gt.objectKeys(t),o=gt.objectKeys(e).filter(s=>a.indexOf(s)!==-1),i={...e,...t};for(const s of o){const l=kk(e[s],t[s]);if(!l.valid)return{valid:!1};i[s]=l.data}return{valid:!0,data:i}}else if(n===ve.array&&r===ve.array){if(e.length!==t.length)return{valid:!1};const a=[];for(let o=0;o{if(vN(o)||vN(i))return Ge;const s=kk(o.value,i.value);return s.valid?((SN(o)||SN(i))&&n.dirty(),{status:n.value,value:s.data}):(we(r,{code:ce.invalid_intersection_types}),Ge)};return r.common.async?Promise.all([this._def.left._parseAsync({data:r.data,path:r.path,parent:r}),this._def.right._parseAsync({data:r.data,path:r.path,parent:r})]).then(([o,i])=>a(o,i)):a(this._def.left._parseSync({data:r.data,path:r.path,parent:r}),this._def.right._parseSync({data:r.data,path:r.path,parent:r}))}}Zg.create=(e,t,n)=>new Zg({left:e,right:t,typeName:Me.ZodIntersection,...qe(n)});class Eo extends rt{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==ve.array)return we(r,{code:ce.invalid_type,expected:ve.array,received:r.parsedType}),Ge;if(r.data.lengththis._def.items.length&&(we(r,{code:ce.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),n.dirty());const o=[...r.data].map((i,s)=>{const l=this._def.items[s]||this._def.rest;return l?l._parse(new Ba(r,i,r.path,s)):null}).filter(i=>!!i);return r.common.async?Promise.all(o).then(i=>Qn.mergeArray(n,i)):Qn.mergeArray(n,o)}get items(){return this._def.items}rest(t){return new Eo({...this._def,rest:t})}}Eo.create=(e,t)=>{if(!Array.isArray(e))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new Eo({items:e,typeName:Me.ZodTuple,rest:null,...qe(t)})};class Xg extends rt{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==ve.object)return we(r,{code:ce.invalid_type,expected:ve.object,received:r.parsedType}),Ge;const a=[],o=this._def.keyType,i=this._def.valueType;for(const s in r.data)a.push({key:o._parse(new Ba(r,s,r.path,s)),value:i._parse(new Ba(r,r.data[s],r.path,s))});return r.common.async?Qn.mergeObjectAsync(n,a):Qn.mergeObjectSync(n,a)}get element(){return this._def.valueType}static create(t,n,r){return n instanceof rt?new Xg({keyType:t,valueType:n,typeName:Me.ZodRecord,...qe(r)}):new Xg({keyType:lo.create(),valueType:t,typeName:Me.ZodRecord,...qe(n)})}}class Ck extends rt{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==ve.map)return we(r,{code:ce.invalid_type,expected:ve.map,received:r.parsedType}),Ge;const a=this._def.keyType,o=this._def.valueType,i=[...r.data.entries()].map(([s,l],c)=>({key:a._parse(new Ba(r,s,r.path,[c,"key"])),value:o._parse(new Ba(r,l,r.path,[c,"value"]))}));if(r.common.async){const s=new Map;return Promise.resolve().then(async()=>{for(const l of i){const c=await l.key,u=await l.value;if(c.status==="aborted"||u.status==="aborted")return Ge;(c.status==="dirty"||u.status==="dirty")&&n.dirty(),s.set(c.value,u.value)}return{status:n.value,value:s}})}else{const s=new Map;for(const l of i){const c=l.key,u=l.value;if(c.status==="aborted"||u.status==="aborted")return Ge;(c.status==="dirty"||u.status==="dirty")&&n.dirty(),s.set(c.value,u.value)}return{status:n.value,value:s}}}}Ck.create=(e,t,n)=>new Ck({valueType:t,keyType:e,typeName:Me.ZodMap,...qe(n)});class Cc extends rt{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==ve.set)return we(r,{code:ce.invalid_type,expected:ve.set,received:r.parsedType}),Ge;const a=this._def;a.minSize!==null&&r.data.sizea.maxSize.value&&(we(r,{code:ce.too_big,maximum:a.maxSize.value,type:"set",inclusive:!0,exact:!1,message:a.maxSize.message}),n.dirty());const o=this._def.valueType;function i(l){const c=new Set;for(const u of l){if(u.status==="aborted")return Ge;u.status==="dirty"&&n.dirty(),c.add(u.value)}return{status:n.value,value:c}}const s=[...r.data.values()].map((l,c)=>o._parse(new Ba(r,l,r.path,c)));return r.common.async?Promise.all(s).then(l=>i(l)):i(s)}min(t,n){return new Cc({...this._def,minSize:{value:t,message:Ne.toString(n)}})}max(t,n){return new Cc({...this._def,maxSize:{value:t,message:Ne.toString(n)}})}size(t,n){return this.min(t,n).max(t,n)}nonempty(t){return this.min(1,t)}}Cc.create=(e,t)=>new Cc({valueType:e,minSize:null,maxSize:null,typeName:Me.ZodSet,...qe(t)});class Gu extends rt{constructor(){super(...arguments),this.validate=this.implement}_parse(t){const{ctx:n}=this._processInputParams(t);if(n.parsedType!==ve.function)return we(n,{code:ce.invalid_type,expected:ve.function,received:n.parsedType}),Ge;function r(s,l){return vk({data:s,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,yk(),qg].filter(c=>!!c),issueData:{code:ce.invalid_arguments,argumentsError:l}})}function a(s,l){return vk({data:s,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,yk(),qg].filter(c=>!!c),issueData:{code:ce.invalid_return_type,returnTypeError:l}})}const o={errorMap:n.common.contextualErrorMap},i=n.data;if(this._def.returns instanceof Td){const s=this;return dr(async function(...l){const c=new Ma([]),u=await s._def.args.parseAsync(l,o).catch(m=>{throw c.addIssue(r(l,m)),c}),d=await Reflect.apply(i,this,u);return await s._def.returns._def.type.parseAsync(d,o).catch(m=>{throw c.addIssue(a(d,m)),c})})}else{const s=this;return dr(function(...l){const c=s._def.args.safeParse(l,o);if(!c.success)throw new Ma([r(l,c.error)]);const u=Reflect.apply(i,this,c.data),d=s._def.returns.safeParse(u,o);if(!d.success)throw new Ma([a(u,d.error)]);return d.data})}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...t){return new Gu({...this._def,args:Eo.create(t).rest(Hl.create())})}returns(t){return new Gu({...this._def,returns:t})}implement(t){return this.parse(t)}strictImplement(t){return this.parse(t)}static create(t,n,r){return new Gu({args:t||Eo.create([]).rest(Hl.create()),returns:n||Hl.create(),typeName:Me.ZodFunction,...qe(r)})}}class Qg extends rt{get schema(){return this._def.getter()}_parse(t){const{ctx:n}=this._processInputParams(t);return this._def.getter()._parse({data:n.data,path:n.path,parent:n})}}Qg.create=(e,t)=>new Qg({getter:e,typeName:Me.ZodLazy,...qe(t)});class Jg extends rt{_parse(t){if(t.data!==this._def.value){const n=this._getOrReturnCtx(t);return we(n,{received:n.data,code:ce.invalid_literal,expected:this._def.value}),Ge}return{status:"valid",value:t.data}}get value(){return this._def.value}}Jg.create=(e,t)=>new Jg({value:e,typeName:Me.ZodLiteral,...qe(t)});function g9(e,t){return new Ns({values:e,typeName:Me.ZodEnum,...qe(t)})}class Ns extends rt{_parse(t){if(typeof t.data!="string"){const n=this._getOrReturnCtx(t),r=this._def.values;return we(n,{expected:gt.joinValues(r),received:n.parsedType,code:ce.invalid_type}),Ge}if(this._def.values.indexOf(t.data)===-1){const n=this._getOrReturnCtx(t),r=this._def.values;return we(n,{received:n.data,code:ce.invalid_enum_value,options:r}),Ge}return dr(t.data)}get options(){return this._def.values}get enum(){const t={};for(const n of this._def.values)t[n]=n;return t}get Values(){const t={};for(const n of this._def.values)t[n]=n;return t}get Enum(){const t={};for(const n of this._def.values)t[n]=n;return t}extract(t){return Ns.create(t)}exclude(t){return Ns.create(this.options.filter(n=>!t.includes(n)))}}Ns.create=g9;class em extends rt{_parse(t){const n=gt.getValidEnumValues(this._def.values),r=this._getOrReturnCtx(t);if(r.parsedType!==ve.string&&r.parsedType!==ve.number){const a=gt.objectValues(n);return we(r,{expected:gt.joinValues(a),received:r.parsedType,code:ce.invalid_type}),Ge}if(n.indexOf(t.data)===-1){const a=gt.objectValues(n);return we(r,{received:r.data,code:ce.invalid_enum_value,options:a}),Ge}return dr(t.data)}get enum(){return this._def.values}}em.create=(e,t)=>new em({values:e,typeName:Me.ZodNativeEnum,...qe(t)});class Td extends rt{unwrap(){return this._def.type}_parse(t){const{ctx:n}=this._processInputParams(t);if(n.parsedType!==ve.promise&&n.common.async===!1)return we(n,{code:ce.invalid_type,expected:ve.promise,received:n.parsedType}),Ge;const r=n.parsedType===ve.promise?n.data:Promise.resolve(n.data);return dr(r.then(a=>this._def.type.parseAsync(a,{path:n.path,errorMap:n.common.contextualErrorMap})))}}Td.create=(e,t)=>new Td({type:e,typeName:Me.ZodPromise,...qe(t)});class xo extends rt{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===Me.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(t){const{status:n,ctx:r}=this._processInputParams(t),a=this._def.effect||null,o={addIssue:i=>{we(r,i),i.fatal?n.abort():n.dirty()},get path(){return r.path}};if(o.addIssue=o.addIssue.bind(o),a.type==="preprocess"){const i=a.transform(r.data,o);return r.common.issues.length?{status:"dirty",value:r.data}:r.common.async?Promise.resolve(i).then(s=>this._def.schema._parseAsync({data:s,path:r.path,parent:r})):this._def.schema._parseSync({data:i,path:r.path,parent:r})}if(a.type==="refinement"){const i=s=>{const l=a.refinement(s,o);if(r.common.async)return Promise.resolve(l);if(l instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return s};if(r.common.async===!1){const s=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});return s.status==="aborted"?Ge:(s.status==="dirty"&&n.dirty(),i(s.value),{status:n.value,value:s.value})}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(s=>s.status==="aborted"?Ge:(s.status==="dirty"&&n.dirty(),i(s.value).then(()=>({status:n.value,value:s.value}))))}if(a.type==="transform")if(r.common.async===!1){const i=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});if(!Gg(i))return i;const s=a.transform(i.value,o);if(s instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:n.value,value:s}}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(i=>Gg(i)?Promise.resolve(a.transform(i.value,o)).then(s=>({status:n.value,value:s})):i);gt.assertNever(a)}}xo.create=(e,t,n)=>new xo({schema:e,typeName:Me.ZodEffects,effect:t,...qe(n)});xo.createWithPreprocess=(e,t,n)=>new xo({schema:t,effect:{type:"preprocess",transform:e},typeName:Me.ZodEffects,...qe(n)});class yi extends rt{_parse(t){return this._getType(t)===ve.undefined?dr(void 0):this._def.innerType._parse(t)}unwrap(){return this._def.innerType}}yi.create=(e,t)=>new yi({innerType:e,typeName:Me.ZodOptional,...qe(t)});class _c extends rt{_parse(t){return this._getType(t)===ve.null?dr(null):this._def.innerType._parse(t)}unwrap(){return this._def.innerType}}_c.create=(e,t)=>new _c({innerType:e,typeName:Me.ZodNullable,...qe(t)});class tm extends rt{_parse(t){const{ctx:n}=this._processInputParams(t);let r=n.data;return n.parsedType===ve.undefined&&(r=this._def.defaultValue()),this._def.innerType._parse({data:r,path:n.path,parent:n})}removeDefault(){return this._def.innerType}}tm.create=(e,t)=>new tm({innerType:e,typeName:Me.ZodDefault,defaultValue:typeof t.default=="function"?t.default:()=>t.default,...qe(t)});class _k extends rt{_parse(t){const{ctx:n}=this._processInputParams(t),r={...n,common:{...n.common,issues:[]}},a=this._def.innerType._parse({data:r.data,path:r.path,parent:{...r}});return Sk(a)?a.then(o=>({status:"valid",value:o.status==="valid"?o.value:this._def.catchValue({get error(){return new Ma(r.common.issues)},input:r.data})})):{status:"valid",value:a.status==="valid"?a.value:this._def.catchValue({get error(){return new Ma(r.common.issues)},input:r.data})}}removeCatch(){return this._def.innerType}}_k.create=(e,t)=>new _k({innerType:e,typeName:Me.ZodCatch,catchValue:typeof t.catch=="function"?t.catch:()=>t.catch,...qe(t)});class Ak extends rt{_parse(t){if(this._getType(t)!==ve.nan){const r=this._getOrReturnCtx(t);return we(r,{code:ce.invalid_type,expected:ve.nan,received:r.parsedType}),Ge}return{status:"valid",value:t.data}}}Ak.create=e=>new Ak({typeName:Me.ZodNaN,...qe(e)});class Aie extends rt{_parse(t){const{ctx:n}=this._processInputParams(t),r=n.data;return this._def.type._parse({data:r,path:n.path,parent:n})}unwrap(){return this._def.type}}class yh extends rt{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.common.async)return(async()=>{const o=await this._def.in._parseAsync({data:r.data,path:r.path,parent:r});return o.status==="aborted"?Ge:o.status==="dirty"?(n.dirty(),mie(o.value)):this._def.out._parseAsync({data:o.value,path:r.path,parent:r})})();{const a=this._def.in._parseSync({data:r.data,path:r.path,parent:r});return a.status==="aborted"?Ge:a.status==="dirty"?(n.dirty(),{status:"dirty",value:a.value}):this._def.out._parseSync({data:a.value,path:r.path,parent:r})}}static create(t,n){return new yh({in:t,out:n,typeName:Me.ZodPipeline})}}class Tk extends rt{_parse(t){const n=this._def.innerType._parse(t);return Gg(n)&&(n.value=Object.freeze(n.value)),n}}Tk.create=(e,t)=>new Tk({innerType:e,typeName:Me.ZodReadonly,...qe(t)});const Tie=(e,t={},n)=>e?Ad.create().superRefine((r,a)=>{var o,i;if(!e(r)){const s=typeof t=="function"?t(r):typeof t=="string"?{message:t}:t,l=(i=(o=s.fatal)!==null&&o!==void 0?o:n)!==null&&i!==void 0?i:!0,c=typeof s=="string"?{message:s}:s;a.addIssue({code:"custom",...c,fatal:l})}}):Ad.create();qt.lazycreate;var Me;(function(e){e.ZodString="ZodString",e.ZodNumber="ZodNumber",e.ZodNaN="ZodNaN",e.ZodBigInt="ZodBigInt",e.ZodBoolean="ZodBoolean",e.ZodDate="ZodDate",e.ZodSymbol="ZodSymbol",e.ZodUndefined="ZodUndefined",e.ZodNull="ZodNull",e.ZodAny="ZodAny",e.ZodUnknown="ZodUnknown",e.ZodNever="ZodNever",e.ZodVoid="ZodVoid",e.ZodArray="ZodArray",e.ZodObject="ZodObject",e.ZodUnion="ZodUnion",e.ZodDiscriminatedUnion="ZodDiscriminatedUnion",e.ZodIntersection="ZodIntersection",e.ZodTuple="ZodTuple",e.ZodRecord="ZodRecord",e.ZodMap="ZodMap",e.ZodSet="ZodSet",e.ZodFunction="ZodFunction",e.ZodLazy="ZodLazy",e.ZodLiteral="ZodLiteral",e.ZodEnum="ZodEnum",e.ZodEffects="ZodEffects",e.ZodNativeEnum="ZodNativeEnum",e.ZodOptional="ZodOptional",e.ZodNullable="ZodNullable",e.ZodDefault="ZodDefault",e.ZodCatch="ZodCatch",e.ZodPromise="ZodPromise",e.ZodBranded="ZodBranded",e.ZodPipeline="ZodPipeline",e.ZodReadonly="ZodReadonly"})(Me||(Me={}));const Ce=lo.create;xc.create;Ak.create;kc.create;wk.create;_d.create;Ek.create;Wg.create;Kg.create;const Rie=Ad.create;Hl.create;Ti.create;xk.create;const nA=Pa.create,Xe=qt.create;qt.strictCreate;Yg.create;tA.create;Zg.create;Eo.create;Xg.create;Ck.create;Cc.create;Gu.create;Qg.create;Jg.create;Ns.create;em.create;Td.create;xo.create;yi.create;_c.create;xo.createWithPreprocess;yh.create;function EN({setEditPersona:e,personas:t,descriptionName:n,fieldName:r}){const a=Hs(),o=()=>{e(void 0);const i=t.find(s=>s.name===a.watch(n));i&&a.setValue(r,i.value||"")};return f.jsxs("div",{className:"flex justify-end gap-3",children:[f.jsx(ue,{variant:"ghost",type:"button",onClick:o,children:f.jsx("span",{children:"Cancel"})}),f.jsx(ue,{variant:"outline",onClick:()=>e(void 0),children:f.jsx("span",{children:"Save changes"})})]})}function xN({setEditPersona:e,editPersona:t,personaValue:n}){const r=Hs(),a=Mi();return f.jsxs("div",{className:"mt-2 flex gap-4",children:[r.getValues(n)?f.jsxs(ue,{variant:"ghost",className:"px-0",onClick:()=>e(t),children:[f.jsx(ZC,{className:"mr-1 h-4 w-4"}),f.jsx("span",{children:"Edit Persona"})]}):null,f.jsxs(ue,{variant:"ghost",className:"px-0",onClick:()=>a(t==="human"?"/human-templates?openCreatePersona":"/agent-templates?openCreatePersona"),children:[f.jsx(ya,{className:"h-4 w-4"}),f.jsx("span",{children:"New Template"})]})]})}const Nie=Xe({name:Ce().min(2,{message:"Name must be at least 2 characters."}).max(30,{message:"Name must not be longer than 30 characters."}),model:Ce(),humanName:Ce().max(2e3),agentName:Ce().max(2e3)});function Iie(e,t){let n="Error creating agent";const r=`${n}: Unspecified error.`;try{const a=JSON.parse(e.message);a.detail&&(a.detail=="None"?n=r:n=`${n}: ${a.detail}`)}catch{n=r}t({title:n,duration:5e3})}const Qr="persona",fr="human";function Oie({personas:e,humans:t,models:n,tools:r,closeDialog:a,openCancelCreateAgent:o}){const i=Bt(),s=uX(),{toast:l}=An(),c=2e3,u=2e3,d=Nie.extend({humanValue:Ce().max(u).min(2,{message:"Human name must be at least 2 characters."}),agentValue:Ce().max(c).min(2,{message:"Agent name must be at least 2 characters."}),embedding_model:Ce()}),{data:g}=w6(),m=bn({resolver:yn(d),defaultValues:{name:"",model:"",embedding_model:"",humanName:"",agentName:"",humanValue:"",agentValue:""},mode:"onChange"}),b=C=>{const _=n.find(R=>R.model===C.model);_&&g&&s.mutate({requestBody:{name:C.name,embedding_config:g.find(R=>R.embedding_model===C.embedding_model)||void 0,llm_config:_,tools:r.filter(R=>R.tags.includes("base")).map(R=>R.name).filter(R=>!!R),memory:{memory:{[fr]:{name:C.humanName,label:fr,value:C.humanValue},[Qr]:{name:C.agentName,label:Qr,value:C.agentValue}}}}},{onSuccess:()=>{i.invalidateQueries({queryKey:p6()}),a(),l({title:"Agent created successfully!",duration:5e3})},onError:R=>Iie(R,l)})},[y,w]=p.useState(),v=m.getFieldState("humanValue").isDirty,h=m.getFieldState("agentValue").isDirty,[S,E]=p.useState(!1),[k,x]=p.useState(!1);return f.jsx(vn,{...m,children:f.jsxs("form",{onSubmit:m.handleSubmit(b),className:"space-y-8",children:[f.jsxs("div",{className:"space-y-4",children:[f.jsx(ut,{control:m.control,name:"name",render:({field:C})=>f.jsxs(ot,{className:"space-y-1",children:[f.jsx(yt,{children:"Agent Name"}),f.jsx(pt,{children:f.jsx(_n,{...C})}),f.jsx(Mt,{className:"text-xs",children:"This is your agents display name. It can be a real name or a pseudonym."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:m.control,name:"model",render:({field:C})=>f.jsxs(ot,{className:"space-y-1",children:[f.jsx(yt,{children:"Model"}),f.jsxs(So,{onValueChange:C.onChange,value:C.value,children:[f.jsx(pt,{children:f.jsx(za,{children:f.jsx(wo,{placeholder:"Select a model"})})}),f.jsx(Ua,{children:n.map(_=>f.jsx(Fn,{value:_.model,children:_.model},_.model))})]}),f.jsx(Mt,{className:"text-xs ",children:"Select the model to be used with this agent."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:m.control,name:"embedding_model",render:({field:C})=>f.jsxs(ot,{className:"space-y-1",children:[f.jsx(yt,{children:"Embedding Config"}),f.jsxs(So,{onValueChange:C.onChange,value:C.value,children:[f.jsx(pt,{children:f.jsx(za,{children:f.jsx(wo,{placeholder:"Select a model"})})}),f.jsx(Ua,{children:g?g.map(_=>f.jsx(Fn,{value:_.embedding_model,children:_.embedding_model},_.embedding_model)):f.jsx(Fn,{value:"loading",disabled:!0,children:"Loading..."})})]}),f.jsx(lt,{})]})})]}),f.jsxs("div",{className:"space-y-6",children:[f.jsxs("div",{children:[f.jsx("p",{className:"font-semibold ",children:"Core memory"}),f.jsx("p",{className:"text-sm text-muted-foreground",children:"Agent’s core memory about itself (agent persona) and the user (human persona)."})]}),f.jsxs("div",{children:[f.jsx(ut,{control:m.control,name:"agentName",render:({field:C})=>f.jsxs(ot,{className:"space-y-1",children:[f.jsx(yt,{children:"Agent Persona"}),f.jsxs(uN,{open:S,onOpenChange:E,children:[f.jsx(dN,{children:f.jsxs("div",{className:"flex gap-2",children:[f.jsx("span",{children:C.value??"Search or select"}),h?f.jsx("div",{className:"text-muted-foreground",children:"(Edited)"}):null]})}),f.jsx(fN,{children:f.jsxs(pN,{children:[f.jsx(gN,{placeholder:"Search persona"}),f.jsx(mN,{children:"No Agent Persona was found."}),f.jsx(hN,{children:e.map(_=>f.jsx(bN,{value:_.name||"",onSelect:R=>{const T=e.find(L=>L.name===R);C.onChange(R),m.setValue("agentValue",(T==null?void 0:T.value)||""),E(!1)},children:_.name},_.name))})]})})]}),f.jsx(lt,{})]})}),y==="agent"?null:f.jsx(xN,{editPersona:"agent",setEditPersona:w,personaValue:"agentName"})]}),y==="agent"?f.jsx(ut,{control:m.control,name:"agentValue",render:({field:C})=>{var _;return f.jsxs(f.Fragment,{children:[f.jsxs(ot,{className:"space-y-1",children:[f.jsx(yt,{children:"Persona Description"}),f.jsx(pt,{children:f.jsx(Ai,{placeholder:"Describe your persona here",charCount:(_=C.value)==null?void 0:_.length,limit:c,...C})}),f.jsx(Mt,{children:"You can use no more than 2000 characters."}),f.jsx(lt,{})]}),f.jsx(EN,{fieldName:"agentValue",descriptionName:"agentName",personas:e,setEditPersona:w})]})}}):null,f.jsxs("div",{children:[f.jsx(ut,{control:m.control,name:"humanName",render:({field:C})=>f.jsxs(ot,{className:"space-y-1",children:[f.jsx(yt,{children:"Human Persona"}),f.jsxs(uN,{open:k,onOpenChange:x,children:[f.jsx(dN,{children:f.jsxs("div",{className:"flex gap-2",children:[f.jsx("span",{children:C.value??"Search or select"}),v?f.jsx("span",{className:"text-muted-foreground",children:"(Edited)"}):null]})}),f.jsx(fN,{children:f.jsxs(pN,{children:[f.jsx(gN,{placeholder:"Search human"}),f.jsx(mN,{children:"No Human Persona was found."}),f.jsx(hN,{children:t.map(_=>f.jsx(bN,{value:_.name||"",onSelect:R=>{const T=t.find(L=>L.name===R);C.onChange(R),m.setValue("humanValue",(T==null?void 0:T.value)||""),x(!1)},children:_.name},_.name))})]})})]}),f.jsx(lt,{})]})}),y==="human"?null:f.jsx(xN,{editPersona:"human",setEditPersona:w,personaValue:"humanName"})]}),y==="human"?f.jsxs(f.Fragment,{children:[f.jsx(ut,{control:m.control,name:"humanValue",render:({field:C})=>{var _;return f.jsxs(ot,{className:"space-y-1",children:[f.jsx(yt,{children:"Persona Description"}),f.jsx(pt,{children:f.jsx(Ai,{placeholder:"Describe your human here",charCount:(_=C.value)==null?void 0:_.length,limit:c,...C})}),f.jsx(Mt,{children:"You can use no more than 2000 characters."}),f.jsx(lt,{})]})}}),f.jsx(EN,{fieldName:"humanValue",descriptionName:"humanName",personas:t,setEditPersona:w})]}):null]}),f.jsxs("div",{className:"flex justify-between",children:[f.jsx(ue,{type:"button",variant:"ghost",onClick:()=>o(),children:"Cancel"}),f.jsxs("div",{className:"flex items-center",children:[s.isPending?f.jsxs("div",{className:Tt("mr-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Creating Agent..."})]}):null,f.jsx(ue,{type:"submit",children:"Create Agent"})]})]})]})})}const Die=({open:e,onOpenChange:t})=>{const{data:n}=S6(),{data:r}=Ng({label:Qr}),{data:a}=Ng({label:fr}),{data:o}=Xm(),[i,s]=p.useState(!1);return f.jsxs(Kt,{open:e,onOpenChange:t,children:[f.jsxs(Ht,{className:"h-full max-h-[95svh] w-full gap-8 sm:max-w-[800px]",hasCloseButton:!1,children:[f.jsxs("button",{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",onClick:()=>s(!0),children:[f.jsx(Di,{className:"h-4 w-4"}),f.jsx("span",{className:"sr-only",children:"Close"})]}),f.jsx(Pt,{children:f.jsx($t,{children:"Create Agent"})}),f.jsx("div",{className:"-mt-8 h-full overflow-y-auto p-1",children:f.jsx(Oie,{models:n||[],humans:a??[],personas:r??[],tools:o??[],closeDialog:()=>t(!1),openCancelCreateAgent:()=>s(!0)})})]}),f.jsx(lae,{open:i,onOpenChange:l=>s(l),closeDialog:()=>t(!1)})]})},Lie=()=>{const[e,t]=p.useState(!1);return f.jsxs(Fs,{className:"flex flex-col",children:[f.jsxs("div",{className:"flex items-center justify-between px-4",children:[f.jsx("h1",{className:"mb-4 flex pt-2 text-2xl font-bold",children:"Agents"}),f.jsx(ue,{icon:f.jsx(ya,{className:"h-4 w-4"}),onClick:()=>t(!0),size:"sm",children:"Create Agent"})]}),f.jsx(Ure,{className:"mx-4 h-full",setShowingAgentCreation:t}),f.jsx(Die,{open:e,onOpenChange:n=>t(n)})]})},Mie={path:"agents",element:f.jsx(Lie,{})},m9=ef("inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground hover:bg-primary/80",secondary:"border-transparent bg-background-darker hover:bg-secondary/80",destructive:"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",outline:"text-foreground"}},defaultVariants:{variant:"default"}});function h9({className:e,variant:t,...n}){return f.jsx("div",{className:ee(m9({variant:t}),e),...n})}const Pie=(e,t)=>e==="date"?vre(t):t,b9=rf(Vm(e=>({history:{},actions:{addMessage:(t,n)=>e(r=>({...r,history:{...r.history,[t]:[...r.history[t]??[],n]}})),replaceLastMessage:(t,n)=>e(r=>{const a=[...r.history[t]];return a.length>0&&(a[a.length-1]=n),{...r,history:{...r.history,[t]:a}}}),replaceMessageIds:(t,n,r)=>e(a=>{const o=a.history[t],i=[];for(const s of o)s.id===n&&(console.log("replacing old id",n,r),s.id=r),i.push(s);return{...a,history:{...a.history,[t]:i}}})}}),{name:"message-history-storage",storage:o_(()=>localStorage,{reviver:Pie}),partialize:({actions:e,...t})=>t})),$ie=e=>b9(t=>t.history[e]??[]),Fie=()=>b9(e=>e.actions);async function jie(e,t){const n=e.getReader();let r;for(;!(r=await n.read()).done;)t(r.value)}function zie(e){let t,n,r,a=!1;return function(i){t===void 0?(t=i,n=0,r=-1):t=Bie(t,i);const s=t.length;let l=0;for(;n0){const l=a.decode(i.subarray(0,s)),c=s+(i[s+1]===32?2:1),u=a.decode(i.subarray(c));switch(l){case"data":r.data=r.data?r.data+` -`+u:u;break;case"event":r.event=u;break;case"id":e(r.id=u);break;case"retry":const d=parseInt(u,10);isNaN(d)||t(r.retry=d);break}}}}function Bie(e,t){const n=new Uint8Array(e.length+t.length);return n.set(e),n.set(t,e.length),n}function kN(){return{data:"",event:"",id:"",retry:void 0}}var Hie=globalThis&&globalThis.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var a=0,r=Object.getOwnPropertySymbols(e);a{const m=Object.assign({},r);m.accept||(m.accept=Rk);let b;function y(){b.abort(),document.hidden||k()}l||document.addEventListener("visibilitychange",y);let w=Vie,v=0;function h(){document.removeEventListener("visibilitychange",y),window.clearTimeout(v),b.abort()}n==null||n.addEventListener("abort",()=>{h(),d()});const S=c??window.fetch,E=a??qie;async function k(){var x;b=new AbortController;try{const C=await S(e,Object.assign(Object.assign({},u),{headers:m,signal:b.signal}));await E(C),await jie(C.body,zie(Uie(_=>{_?m[CN]=_:delete m[CN]},_=>{w=_},o))),i==null||i(),h(),d()}catch(C){if(!b.signal.aborted)try{const _=(x=s==null?void 0:s(C))!==null&&x!==void 0?x:w;window.clearTimeout(v),v=window.setTimeout(k,_)}catch(_){h(),g(_)}}}k()})}function qie(e){const t=e.headers.get("content-type");if(!(t!=null&&t.startsWith(Rk)))throw new Error(`Expected content-type to be ${Rk}, Actual: ${t}`)}const v9="/v1";var En=[];for(var py=0;py<256;++py)En.push((py+256).toString(16).slice(1));function Gie(e,t=0){return(En[e[t+0]]+En[e[t+1]]+En[e[t+2]]+En[e[t+3]]+"-"+En[e[t+4]]+En[e[t+5]]+"-"+En[e[t+6]]+En[e[t+7]]+"-"+En[e[t+8]]+En[e[t+9]]+"-"+En[e[t+10]]+En[e[t+11]]+En[e[t+12]]+En[e[t+13]]+En[e[t+14]]+En[e[t+15]]).toLowerCase()}var dp,Wie=new Uint8Array(16);function Kie(){if(!dp&&(dp=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!dp))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return dp(Wie)}var Yie=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto);const _N={randomUUID:Yie};function Wu(e,t,n){if(_N.randomUUID&&!t&&!e)return _N.randomUUID();e=e||{};var r=e.random||(e.rng||Kie)();if(r[6]=r[6]&15|64,r[8]=r[8]&63|128,t){n=n||0;for(var a=0;a<16;++a)t[n+a]=r[a];return t}return Gie(r)}const Zie=rf(nY({socket:null,socketURL:null,readyState:0,abortController:null,onReplaceTemporaryIdsWithReturnedIdsCallback:(e,t)=>console.warn("no replace id callback set up."),onMessageCallback:e=>console.warn("No message callback set up. Simply logging message",e),onLastMessageReplaceCallback:e=>console.warn("No replace last message callback set up. Simply logging message",e)},(e,t)=>({actions:{sendMessage:({agentId:n,memoryName:r,message:a,role:o})=>{const i=new AbortController;e(E=>({...E,abortController:i,readyState:2}));const{onMessageCallback:s,onLastMessageReplaceCallback:l,onReplaceTemporaryIdsWithReturnedIdsCallback:c}=t(),u=()=>e(E=>({...E,readyState:0})),d=()=>e(E=>({...E,readyState:0})),g=()=>e(E=>({...E,readyState:1})),m=()=>e(E=>(i.abort(),{...E,abortController:null,readyState:3})),b={messages:[{role:o??"user",text:a,name:r}],stream_steps:!0,stream_tokens:!0};let y="",w="",v=Wu(),h=!1;const S=()=>{y="",w="",v=Wu()};return y9(`${v9}/agents/${n}/messages`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"text/event-stream",Authorization:"Bearer password"},body:JSON.stringify(b),signal:i.signal,onopen:async E=>{E.ok&&E.status===200?(console.log("Connection made ",E),g()):E.status>=400&&E.status<500&&E.status!==429&&(console.log("Client-side error ",E),m())},onmessage:async E=>{if(E.data==="[DONE]"||E.data==="[DONE_GEN]"||E.data==="[DONE_STEP]")return;const k=Xe({internal_monologue:Ce()}).or(Xe({function_call:Xe({name:Ce(),arguments:Ce()})})).or(Xe({function_call:Xe({name:Ce()})})).or(Xe({function_call:Xe({arguments:Ce()})})).or(Xe({function_return:Ce(),status:Ce(),id:Ce()})).or(Xe({function_return:Ce(),date:Ce(),status:Ce(),id:Ce()})).and(Xe({date:Ce().optional().transform(C=>C?new Date(C):new Date)})).safeParse(JSON.parse(E.data));if(!k.success){console.log("error",k.error.message,E.data),m();return}const x=k.data;if("internal_monologue"in x)y+=x.internal_monologue??"",y.length===0?s({type:"agent_response",message_type:"internal_monologue",message:"",date:x.date,id:v}):l({type:"agent_response",message_type:"internal_monologue",message:y,date:x.date,id:v});else if("function_call"in x){const C=x.function_call;"name"in C&&(C.name==="send_message"?(h=!0,s({type:"agent_response",message_type:"assistant_message",message:"",date:x.date,id:v})):(w+=C.name+"(",s({type:"agent_response",message_type:"function_call",message:"",date:x.date,id:v}))),"arguments"in C&&(w+=C.arguments.replace(/\\n/g,` +`)},moe=0,al=[];function hoe(e){var t=p.useRef([]),n=p.useRef([0,0]),r=p.useRef(),a=p.useState(moe++)[0],o=p.useState(function(){return D_()})[0],i=p.useRef(e);p.useEffect(function(){i.current=e},[e]),p.useEffect(function(){if(e.inert){document.body.classList.add("block-interactivity-".concat(a));var y=l7([e.lockRef.current],(e.shards||[]).map(iN),!0).filter(Boolean);return y.forEach(function(w){return w.classList.add("allow-interactivity-".concat(a))}),function(){document.body.classList.remove("block-interactivity-".concat(a)),y.forEach(function(w){return w.classList.remove("allow-interactivity-".concat(a))})}}},[e.inert,e.lockRef.current,e.shards]);var s=p.useCallback(function(y,w){if("touches"in y&&y.touches.length===2)return!i.current.allowPinchZoom;var v=up(y),h=n.current,S="deltaX"in y?y.deltaX:h[0]-v[0],E="deltaY"in y?y.deltaY:h[1]-v[1],k,x=y.target,C=Math.abs(S)>Math.abs(E)?"h":"v";if("touches"in y&&C==="h"&&x.type==="range")return!1;var _=aN(C,x);if(!_)return!0;if(_?k=C:(k=C==="v"?"h":"v",_=aN(C,x)),!_)return!1;if(!r.current&&"changedTouches"in y&&(S||E)&&(r.current=k),!k)return!0;var R=r.current||k;return foe(R,w,y,R==="h"?S:E,!0)},[]),l=p.useCallback(function(y){var w=y;if(!(!al.length||al[al.length-1]!==o)){var v="deltaY"in w?oN(w):up(w),h=t.current.filter(function(k){return k.name===w.type&&k.target===w.target&&poe(k.delta,v)})[0];if(h&&h.should){w.preventDefault();return}if(!h){var S=(i.current.shards||[]).map(iN).filter(Boolean).filter(function(k){return k.contains(w.target)}),E=S.length>0?s(w,S[0]):!i.current.noIsolation;E&&w.preventDefault()}}},[]),c=p.useCallback(function(y,w,v,h){var S={name:y,delta:w,target:v,should:h};t.current.push(S),setTimeout(function(){t.current=t.current.filter(function(E){return E!==S})},1)},[]),u=p.useCallback(function(y){n.current=up(y),r.current=void 0},[]),d=p.useCallback(function(y){c(y.type,oN(y),y.target,s(y,e.lockRef.current))},[]),g=p.useCallback(function(y){c(y.type,up(y),y.target,s(y,e.lockRef.current))},[]);p.useEffect(function(){return al.push(o),e.setCallbacks({onScrollCapture:d,onWheelCapture:d,onTouchMoveCapture:g}),document.addEventListener("wheel",l,rl),document.addEventListener("touchmove",l,rl),document.addEventListener("touchstart",u,rl),function(){al=al.filter(function(y){return y!==o}),document.removeEventListener("wheel",l,rl),document.removeEventListener("touchmove",l,rl),document.removeEventListener("touchstart",u,rl)}},[]);var m=e.removeScrollBar,b=e.inert;return p.createElement(p.Fragment,null,b?p.createElement(o,{styles:goe(a)}):null,m?p.createElement(g7,{gapMode:"margin"}):null)}const boe=f7(P8,hoe);var j8=p.forwardRef(function(e,t){return p.createElement(bh,Pn({},e,{ref:t,sideCar:boe}))});j8.classNames=bh.classNames;const yoe=j8,z8="Dialog",[U8,dTe]=Oae(z8),[voe,Vs]=U8(z8),Soe=e=>{const{__scopeDialog:t,children:n,open:r,defaultOpen:a,onOpenChange:o,modal:i=!0}=e,s=p.useRef(null),l=p.useRef(null),[c=!1,u]=Pae({prop:r,defaultProp:a,onChange:o});return p.createElement(voe,{scope:t,triggerRef:s,contentRef:l,contentId:oy(),titleId:oy(),descriptionId:oy(),open:c,onOpenChange:u,onOpenToggle:p.useCallback(()=>u(d=>!d),[u]),modal:i},n)},B8="DialogPortal",[woe,H8]=U8(B8,{forceMount:void 0}),Eoe=e=>{const{__scopeDialog:t,forceMount:n,children:r,container:a}=e,o=Vs(B8,t);return p.createElement(woe,{scope:t,forceMount:n},p.Children.map(r,i=>p.createElement(hh,{present:n||o.open},p.createElement(roe,{asChild:!0,container:a},i))))},hk="DialogOverlay",xoe=p.forwardRef((e,t)=>{const n=H8(hk,e.__scopeDialog),{forceMount:r=n.forceMount,...a}=e,o=Vs(hk,e.__scopeDialog);return o.modal?p.createElement(hh,{present:r||o.open},p.createElement(koe,W({},a,{ref:t}))):null}),koe=p.forwardRef((e,t)=>{const{__scopeDialog:n,...r}=e,a=Vs(hk,n);return p.createElement(yoe,{as:Q_,allowPinchZoom:!0,shards:[a.contentRef]},p.createElement(mh.div,W({"data-state":q8(a.open)},r,{ref:t,style:{pointerEvents:"auto",...r.style}})))}),kd="DialogContent",Coe=p.forwardRef((e,t)=>{const n=H8(kd,e.__scopeDialog),{forceMount:r=n.forceMount,...a}=e,o=Vs(kd,e.__scopeDialog);return p.createElement(hh,{present:r||o.open},o.modal?p.createElement(_oe,W({},a,{ref:t})):p.createElement(Aoe,W({},a,{ref:t})))}),_oe=p.forwardRef((e,t)=>{const n=Vs(kd,e.__scopeDialog),r=p.useRef(null),a=yf(t,n.contentRef,r);return p.useEffect(()=>{const o=r.current;if(o)return mf(o)},[]),p.createElement(V8,W({},e,{ref:a,trapFocus:n.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:Bl(e.onCloseAutoFocus,o=>{var i;o.preventDefault(),(i=n.triggerRef.current)===null||i===void 0||i.focus()}),onPointerDownOutside:Bl(e.onPointerDownOutside,o=>{const i=o.detail.originalEvent,s=i.button===0&&i.ctrlKey===!0;(i.button===2||s)&&o.preventDefault()}),onFocusOutside:Bl(e.onFocusOutside,o=>o.preventDefault())}))}),Aoe=p.forwardRef((e,t)=>{const n=Vs(kd,e.__scopeDialog),r=p.useRef(!1);return p.createElement(V8,W({},e,{ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:a=>{var o;if((o=e.onCloseAutoFocus)===null||o===void 0||o.call(e,a),!a.defaultPrevented){var i;r.current||(i=n.triggerRef.current)===null||i===void 0||i.focus(),a.preventDefault()}r.current=!1},onInteractOutside:a=>{var o,i;(o=e.onInteractOutside)===null||o===void 0||o.call(e,a),a.defaultPrevented||(r.current=!0);const s=a.target;((i=n.triggerRef.current)===null||i===void 0?void 0:i.contains(s))&&a.preventDefault()}}))}),V8=p.forwardRef((e,t)=>{const{__scopeDialog:n,trapFocus:r,onOpenAutoFocus:a,onCloseAutoFocus:o,...i}=e,s=Vs(kd,n),l=p.useRef(null),c=yf(t,l);return ioe(),p.createElement(p.Fragment,null,p.createElement(Zae,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:a,onUnmountAutoFocus:o},p.createElement(Wae,W({role:"dialog",id:s.contentId,"aria-describedby":s.descriptionId,"aria-labelledby":s.titleId,"data-state":q8(s.open)},i,{ref:c,onDismiss:()=>s.onOpenChange(!1)}))),!1)});function q8(e){return e?"open":"closed"}const Toe=Soe,Roe=Eoe,Noe=xoe,Ioe=Coe;var sN=1,Ooe=.9,Doe=.3,uy=.1,Loe=0,dy=.999,Moe=.9999,Poe=.99,lN=/[\\\/\-_+.# \t"@\[\(\{&]/,$oe=/[\\\/\-_+.# \t"@\[\(\{&]/g;function bk(e,t,n,r,a,o){if(o===t.length)return a===e.length?sN:Poe;for(var i=r.charAt(o),s=n.indexOf(i,a),l=0,c,u,d;s>=0;)c=bk(e,t,n,r,s+1,o+1),c>l&&(s===a?c*=sN:lN.test(e.charAt(s-1))?(c*=Ooe,d=e.slice(a,s-1).match($oe),d&&a>0&&(c*=Math.pow(dy,d.length))):lN.test(e.slice(a,s-1))?(c*=Loe,a>0&&(c*=Math.pow(dy,s-a))):(c*=Doe,a>0&&(c*=Math.pow(dy,s-a))),e.charAt(s)!==t.charAt(o)&&(c*=Moe)),cc&&(c=u*uy)),c>l&&(l=c),s=n.indexOf(i,s+1);return l}function Foe(e,t){return bk(e,t,e.toLowerCase(),t.toLowerCase(),0,0)}var joe=Foe;const zoe=Tc(joe);var Uoe='[cmdk-list-sizer=""]',gu='[cmdk-group=""]',fy='[cmdk-group-items=""]',Boe='[cmdk-group-heading=""]',G8='[cmdk-item=""]',cN=`${G8}:not([aria-disabled="true"])`,yk="cmdk-item-select",Vo="data-value",Hoe=(e,t)=>zoe(e,t),W8=p.createContext(void 0),vf=()=>p.useContext(W8),K8=p.createContext(void 0),J_=()=>p.useContext(K8),Y8=p.createContext(void 0),Z8=p.forwardRef((e,t)=>{let n=p.useRef(null),r=dl(()=>({search:"",value:"",filtered:{count:0,items:new Map,groups:new Set}})),a=dl(()=>new Set),o=dl(()=>new Map),i=dl(()=>new Map),s=dl(()=>new Set),l=t9(e),{label:c,children:u,value:d,onValueChange:g,filter:m,shouldFilter:b,...y}=e,w=p.useId(),v=p.useId(),h=p.useId(),S=Xoe();Uc(()=>{if(d!==void 0){let O=d.trim().toLowerCase();r.current.value=O,S(6,T),E.emit()}},[d]);let E=p.useMemo(()=>({subscribe:O=>(s.current.add(O),()=>s.current.delete(O)),snapshot:()=>r.current,setState:(O,A,V)=>{var P,N,K;if(!Object.is(r.current[O],A)){if(r.current[O]=A,O==="search")R(),C(),S(1,_);else if(O==="value")if(((P=l.current)==null?void 0:P.value)!==void 0){(K=(N=l.current).onValueChange)==null||K.call(N,A);return}else V||S(5,T);E.emit()}},emit:()=>{s.current.forEach(O=>O())}}),[]),k=p.useMemo(()=>({value:(O,A)=>{A!==i.current.get(O)&&(i.current.set(O,A),r.current.filtered.items.set(O,x(A)),S(2,()=>{C(),E.emit()}))},item:(O,A)=>(a.current.add(O),A&&(o.current.has(A)?o.current.get(A).add(O):o.current.set(A,new Set([O]))),S(3,()=>{R(),C(),r.current.value||_(),E.emit()}),()=>{i.current.delete(O),a.current.delete(O),r.current.filtered.items.delete(O),S(4,()=>{R(),_(),E.emit()})}),group:O=>(o.current.has(O)||o.current.set(O,new Set),()=>{i.current.delete(O),o.current.delete(O)}),filter:()=>l.current.shouldFilter,label:c||e["aria-label"],listId:w,inputId:h,labelId:v}),[]);function x(O){var A;let V=((A=l.current)==null?void 0:A.filter)??Hoe;return O?V(O,r.current.search):0}function C(){if(!n.current||!r.current.search||l.current.shouldFilter===!1)return;let O=r.current.filtered.items,A=[];r.current.filtered.groups.forEach(P=>{let N=o.current.get(P),K=0;N.forEach(ae=>{let ne=O.get(ae);K=Math.max(ne,K)}),A.push([P,K])});let V=n.current.querySelector(Uoe);D().sort((P,N)=>{let K=P.getAttribute(Vo),ae=N.getAttribute(Vo);return(O.get(ae)??0)-(O.get(K)??0)}).forEach(P=>{let N=P.closest(fy);N?N.appendChild(P.parentElement===N?P:P.closest(`${fy} > *`)):V.appendChild(P.parentElement===V?P:P.closest(`${fy} > *`))}),A.sort((P,N)=>N[1]-P[1]).forEach(P=>{let N=n.current.querySelector(`${gu}[${Vo}="${P[0]}"]`);N==null||N.parentElement.appendChild(N)})}function _(){let O=D().find(V=>!V.ariaDisabled),A=O==null?void 0:O.getAttribute(Vo);E.setState("value",A||void 0)}function R(){if(!r.current.search||l.current.shouldFilter===!1){r.current.filtered.count=a.current.size;return}r.current.filtered.groups=new Set;let O=0;for(let A of a.current){let V=i.current.get(A),P=x(V);r.current.filtered.items.set(A,P),P>0&&O++}for(let[A,V]of o.current)for(let P of V)if(r.current.filtered.items.get(P)>0){r.current.filtered.groups.add(A);break}r.current.filtered.count=O}function T(){var O,A,V;let P=L();P&&(((O=P.parentElement)==null?void 0:O.firstChild)===P&&((V=(A=P.closest(gu))==null?void 0:A.querySelector(Boe))==null||V.scrollIntoView({block:"nearest"})),P.scrollIntoView({block:"nearest"}))}function L(){return n.current.querySelector(`${G8}[aria-selected="true"]`)}function D(){return Array.from(n.current.querySelectorAll(cN))}function H(O){let A=D()[O];A&&E.setState("value",A.getAttribute(Vo))}function z(O){var A;let V=L(),P=D(),N=P.findIndex(ae=>ae===V),K=P[N+O];(A=l.current)!=null&&A.loop&&(K=N+O<0?P[P.length-1]:N+O===P.length?P[0]:P[N+O]),K&&E.setState("value",K.getAttribute(Vo))}function M(O){let A=L(),V=A==null?void 0:A.closest(gu),P;for(;V&&!P;)V=O>0?Yoe(V,gu):Zoe(V,gu),P=V==null?void 0:V.querySelector(cN);P?E.setState("value",P.getAttribute(Vo)):z(O)}let U=()=>H(D().length-1),X=O=>{O.preventDefault(),O.metaKey?U():O.altKey?M(1):z(1)},j=O=>{O.preventDefault(),O.metaKey?H(0):O.altKey?M(-1):z(-1)};return p.createElement("div",{ref:Sf([n,t]),...y,"cmdk-root":"",onKeyDown:O=>{var A;if((A=y.onKeyDown)==null||A.call(y,O),!O.defaultPrevented)switch(O.key){case"n":case"j":{O.ctrlKey&&X(O);break}case"ArrowDown":{X(O);break}case"p":case"k":{O.ctrlKey&&j(O);break}case"ArrowUp":{j(O);break}case"Home":{O.preventDefault(),H(0);break}case"End":{O.preventDefault(),U();break}case"Enter":{O.preventDefault();let V=L();if(V){let P=new Event(yk);V.dispatchEvent(P)}}}}},p.createElement("label",{"cmdk-label":"",htmlFor:k.inputId,id:k.labelId,style:Qoe},c),p.createElement(K8.Provider,{value:E},p.createElement(W8.Provider,{value:k},u)))}),X8=p.forwardRef((e,t)=>{let n=p.useId(),r=p.useRef(null),a=p.useContext(Y8),o=vf(),i=t9(e);Uc(()=>o.item(n,a),[]);let s=n9(n,r,[e.value,e.children,r]),l=J_(),c=Ec(v=>v.value&&v.value===s.current),u=Ec(v=>o.filter()===!1?!0:v.search?v.filtered.items.get(n)>0:!0);p.useEffect(()=>{let v=r.current;if(!(!v||e.disabled))return v.addEventListener(yk,d),()=>v.removeEventListener(yk,d)},[u,e.onSelect,e.disabled]);function d(){var v,h;(h=(v=i.current).onSelect)==null||h.call(v,s.current)}function g(){l.setState("value",s.current,!0)}if(!u)return null;let{disabled:m,value:b,onSelect:y,...w}=e;return p.createElement("div",{ref:Sf([r,t]),...w,"cmdk-item":"",role:"option","aria-disabled":m||void 0,"aria-selected":c||void 0,"data-selected":c||void 0,onPointerMove:m?void 0:g,onClick:m?void 0:d},e.children)}),Q8=p.forwardRef((e,t)=>{let{heading:n,children:r,...a}=e,o=p.useId(),i=p.useRef(null),s=p.useRef(null),l=p.useId(),c=vf(),u=Ec(g=>c.filter()===!1?!0:g.search?g.filtered.groups.has(o):!0);Uc(()=>c.group(o),[]),n9(o,i,[e.value,e.heading,s]);let d=p.createElement(Y8.Provider,{value:o},r);return p.createElement("div",{ref:Sf([i,t]),...a,"cmdk-group":"",role:"presentation",hidden:u?void 0:!0},n&&p.createElement("div",{ref:s,"cmdk-group-heading":"","aria-hidden":!0,id:l},n),p.createElement("div",{"cmdk-group-items":"",role:"group","aria-labelledby":n?l:void 0},d))}),Voe=p.forwardRef((e,t)=>{let{alwaysRender:n,...r}=e,a=p.useRef(null),o=Ec(i=>!i.search);return!n&&!o?null:p.createElement("div",{ref:Sf([a,t]),...r,"cmdk-separator":"",role:"separator"})}),J8=p.forwardRef((e,t)=>{let{onValueChange:n,...r}=e,a=e.value!=null,o=J_(),i=Ec(l=>l.search),s=vf();return p.useEffect(()=>{e.value!=null&&o.setState("search",e.value)},[e.value]),p.createElement("input",{ref:t,...r,"cmdk-input":"",autoComplete:"off",autoCorrect:"off",spellCheck:!1,"aria-autocomplete":"list",role:"combobox","aria-expanded":!0,"aria-controls":s.listId,"aria-labelledby":s.labelId,id:s.inputId,type:"text",value:a?e.value:i,onChange:l=>{a||o.setState("search",l.target.value),n==null||n(l.target.value)}})}),qoe=p.forwardRef((e,t)=>{let{children:n,...r}=e,a=p.useRef(null),o=p.useRef(null),i=vf();return p.useEffect(()=>{if(o.current&&a.current){let s=o.current,l=a.current,c,u=new ResizeObserver(()=>{c=requestAnimationFrame(()=>{let d=s.getBoundingClientRect().height;l.style.setProperty("--cmdk-list-height",d.toFixed(1)+"px")})});return u.observe(s),()=>{cancelAnimationFrame(c),u.unobserve(s)}}},[]),p.createElement("div",{ref:Sf([a,t]),...r,"cmdk-list":"",role:"listbox","aria-label":"Suggestions",id:i.listId,"aria-labelledby":i.inputId},p.createElement("div",{ref:o,"cmdk-list-sizer":""},n))}),Goe=p.forwardRef((e,t)=>{let{open:n,onOpenChange:r,container:a,...o}=e;return p.createElement(Toe,{open:n,onOpenChange:r},p.createElement(Roe,{container:a},p.createElement(Noe,{"cmdk-overlay":""}),p.createElement(Ioe,{"aria-label":e.label,"cmdk-dialog":""},p.createElement(Z8,{ref:t,...o}))))}),e9=p.forwardRef((e,t)=>{let n=p.useRef(!0),r=Ec(a=>a.filtered.count===0);return p.useEffect(()=>{n.current=!1},[]),n.current||!r?null:p.createElement("div",{ref:t,...e,"cmdk-empty":"",role:"presentation"})}),Woe=p.forwardRef((e,t)=>{let{progress:n,children:r,...a}=e;return p.createElement("div",{ref:t,...a,"cmdk-loading":"",role:"progressbar","aria-valuenow":n,"aria-valuemin":0,"aria-valuemax":100,"aria-label":"Loading..."},p.createElement("div",{"aria-hidden":!0},r))}),Koe=Object.assign(Z8,{List:qoe,Item:X8,Input:J8,Group:Q8,Separator:Voe,Dialog:Goe,Empty:e9,Loading:Woe});function Yoe(e,t){let n=e.nextElementSibling;for(;n;){if(n.matches(t))return n;n=n.nextElementSibling}}function Zoe(e,t){let n=e.previousElementSibling;for(;n;){if(n.matches(t))return n;n=n.previousElementSibling}}function t9(e){let t=p.useRef(e);return Uc(()=>{t.current=e}),t}var Uc=typeof window>"u"?p.useEffect:p.useLayoutEffect;function dl(e){let t=p.useRef();return t.current===void 0&&(t.current=e()),t}function Sf(e){return t=>{e.forEach(n=>{typeof n=="function"?n(t):n!=null&&(n.current=t)})}}function Ec(e){let t=J_(),n=()=>e(t.snapshot());return p.useSyncExternalStore(t.subscribe,n,n)}function n9(e,t,n){let r=p.useRef(),a=vf();return Uc(()=>{var o;let i=(()=>{var s;for(let l of n){if(typeof l=="string")return l.trim().toLowerCase();if(typeof l=="object"&&"current"in l&&l.current)return(s=l.current.textContent)==null?void 0:s.trim().toLowerCase()}})();a.value(e,i),(o=t.current)==null||o.setAttribute(Vo,i),r.current=i}),r}var Xoe=()=>{let[e,t]=p.useState(),n=dl(()=>new Map);return Uc(()=>{n.current.forEach(r=>r()),n.current=new Map},[e]),(r,a)=>{n.current.set(r,a),t({})}},Qoe={position:"absolute",width:"1px",height:"1px",padding:"0",margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0"};const r9="Popover",[a9,fTe]=zn(r9,[qa]),eA=qa(),[Joe,Bc]=a9(r9),o9=e=>{const{__scopePopover:t,children:n,open:r,defaultOpen:a,onOpenChange:o,modal:i=!1}=e,s=eA(t),l=p.useRef(null),[c,u]=p.useState(!1),[d=!1,g]=Fa({prop:r,defaultProp:a,onChange:o});return p.createElement(ah,s,p.createElement(Joe,{scope:t,contentId:bi(),triggerRef:l,open:d,onOpenChange:g,onOpenToggle:p.useCallback(()=>g(m=>!m),[g]),hasCustomAnchor:c,onCustomAnchorAdd:p.useCallback(()=>u(!0),[]),onCustomAnchorRemove:p.useCallback(()=>u(!1),[]),modal:i},n))},eie="PopoverTrigger",i9=p.forwardRef((e,t)=>{const{__scopePopover:n,...r}=e,a=Bc(eie,n),o=eA(n),i=nt(t,a.triggerRef),s=p.createElement(ze.button,W({type:"button","aria-haspopup":"dialog","aria-expanded":a.open,"aria-controls":a.contentId,"data-state":u9(a.open)},r,{ref:i,onClick:fe(e.onClick,a.onOpenToggle)}));return a.hasCustomAnchor?s:p.createElement(pf,W({asChild:!0},o),s)}),s9="PopoverPortal",[tie,nie]=a9(s9,{forceMount:void 0}),rie=e=>{const{__scopePopover:t,forceMount:n,children:r,container:a}=e,o=Bc(s9,t);return p.createElement(tie,{scope:t,forceMount:n},p.createElement(pr,{present:n||o.open},p.createElement(Jd,{asChild:!0,container:a},r)))},Cd="PopoverContent",l9=p.forwardRef((e,t)=>{const n=nie(Cd,e.__scopePopover),{forceMount:r=n.forceMount,...a}=e,o=Bc(Cd,e.__scopePopover);return p.createElement(pr,{present:r||o.open},o.modal?p.createElement(aie,W({},a,{ref:t})):p.createElement(oie,W({},a,{ref:t})))}),aie=p.forwardRef((e,t)=>{const n=Bc(Cd,e.__scopePopover),r=p.useRef(null),a=nt(t,r),o=p.useRef(!1);return p.useEffect(()=>{const i=r.current;if(i)return mf(i)},[]),p.createElement(sh,{as:$a,allowPinchZoom:!0},p.createElement(c9,W({},e,{ref:a,trapFocus:n.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:fe(e.onCloseAutoFocus,i=>{var s;i.preventDefault(),o.current||(s=n.triggerRef.current)===null||s===void 0||s.focus()}),onPointerDownOutside:fe(e.onPointerDownOutside,i=>{const s=i.detail.originalEvent,l=s.button===0&&s.ctrlKey===!0,c=s.button===2||l;o.current=c},{checkForDefaultPrevented:!1}),onFocusOutside:fe(e.onFocusOutside,i=>i.preventDefault(),{checkForDefaultPrevented:!1})})))}),oie=p.forwardRef((e,t)=>{const n=Bc(Cd,e.__scopePopover),r=p.useRef(!1),a=p.useRef(!1);return p.createElement(c9,W({},e,{ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:o=>{var i;if((i=e.onCloseAutoFocus)===null||i===void 0||i.call(e,o),!o.defaultPrevented){var s;r.current||(s=n.triggerRef.current)===null||s===void 0||s.focus(),o.preventDefault()}r.current=!1,a.current=!1},onInteractOutside:o=>{var i,s;(i=e.onInteractOutside)===null||i===void 0||i.call(e,o),o.defaultPrevented||(r.current=!0,o.detail.originalEvent.type==="pointerdown"&&(a.current=!0));const l=o.target;((s=n.triggerRef.current)===null||s===void 0?void 0:s.contains(l))&&o.preventDefault(),o.detail.originalEvent.type==="focusin"&&a.current&&o.preventDefault()}}))}),c9=p.forwardRef((e,t)=>{const{__scopePopover:n,trapFocus:r,onOpenAutoFocus:a,onCloseAutoFocus:o,disableOutsidePointerEvents:i,onEscapeKeyDown:s,onPointerDownOutside:l,onFocusOutside:c,onInteractOutside:u,...d}=e,g=Bc(Cd,n),m=eA(n);return eh(),p.createElement(th,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:a,onUnmountAutoFocus:o},p.createElement(Ls,{asChild:!0,disableOutsidePointerEvents:i,onInteractOutside:u,onEscapeKeyDown:s,onPointerDownOutside:l,onFocusOutside:c,onDismiss:()=>g.onOpenChange(!1)},p.createElement(gf,W({"data-state":u9(g.open),role:"dialog",id:g.contentId},m,d,{ref:t,style:{...d.style,"--radix-popover-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-popover-content-available-width":"var(--radix-popper-available-width)","--radix-popover-content-available-height":"var(--radix-popper-available-height)","--radix-popover-trigger-width":"var(--radix-popper-anchor-width)","--radix-popover-trigger-height":"var(--radix-popper-anchor-height)"}}))))});function u9(e){return e?"open":"closed"}const iie=o9,sie=i9,lie=rie,d9=l9,uN=o9,dN=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(i9,{asChild:!0,...n,children:f.jsxs(ue,{variant:"outline",role:"combobox",className:ee("w-full justify-between font-normal py-2 px-3 hover:bg-transparent",e),children:[t,f.jsx(ZC,{className:"h-4 w-4 opacity-50"})]})})),fN=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(l9,{className:ee("PopoverContent z-50 bg-background rounded-md border"),...n,children:t})),pN=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(Koe,{className:ee("w-full",e),...n,children:t})),gN=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(J8,{className:ee("w-full pt-2 px-3 bg-background text-foreground border-b py-3 focus-visible:outline-none",e),...n,children:t})),mN=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(e9,{className:ee("w-full px-3 text-destructive text-sm",e),...n,children:t})),hN=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(Q8,{className:ee("w-full",e),...n,children:t})),bN=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(X8,{className:ee("w-full py-2 px-3 hover:bg-muted",e),...n,children:t})),cie=p.forwardRef((e,t)=>p.createElement(ze.label,W({},e,{ref:t,onMouseDown:n=>{var r;(r=e.onMouseDown)===null||r===void 0||r.call(e,n),!n.defaultPrevented&&n.detail>1&&n.preventDefault()}}))),f9=cie,uie=ef("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"),os=p.forwardRef(({className:e,...t},n)=>f.jsx(f9,{ref:n,className:ee(uie(),e),...t}));os.displayName=f9.displayName;const vn=dae,p9=p.createContext({}),ut=({...e})=>f.jsx(p9.Provider,{value:{name:e.name},children:f.jsx(mae,{...e})}),yh=()=>{const e=p.useContext(p9),t=p.useContext(g9),{getFieldState:n,formState:r}=Hs(),a=n(e.name,r);if(!e)throw new Error("useFormField should be used within ");const{id:o}=t;return{id:o,name:e.name,formItemId:`${o}-form-item`,formDescriptionId:`${o}-form-item-description`,formMessageId:`${o}-form-item-message`,...a}},g9=p.createContext({}),ot=p.forwardRef(({className:e,...t},n)=>{const r=p.useId();return f.jsx(g9.Provider,{value:{id:r},children:f.jsx("div",{ref:n,className:ee("space-y-2",e),...t})})});ot.displayName="FormItem";const yt=p.forwardRef(({className:e,...t},n)=>{const{error:r,formItemId:a}=yh();return f.jsx(os,{ref:n,className:ee(r&&"text-destructive",e),htmlFor:a,...t})});yt.displayName="FormLabel";const pt=p.forwardRef(({...e},t)=>{const{error:n,formItemId:r,formDescriptionId:a,formMessageId:o}=yh();return f.jsx($a,{ref:t,id:r,"aria-describedby":n?`${a} ${o}`:`${a}`,"aria-invalid":!!n,...e})});pt.displayName="FormControl";const Mt=p.forwardRef(({className:e,...t},n)=>{const{formDescriptionId:r}=yh();return f.jsx("p",{ref:n,id:r,className:ee("text-sm text-muted-foreground",e),...t})});Mt.displayName="FormDescription";const lt=p.forwardRef(({className:e,children:t,...n},r)=>{const{error:a,formMessageId:o}=yh(),i=a?String(a==null?void 0:a.message):t;return i?f.jsx("p",{ref:r,id:o,className:ee("text-sm font-medium text-destructive",e),...n,children:i}):null});lt.displayName="FormMessage";function die(){const e=p.useRef(null);return{formRef:e,onKeyDown:n=>{var r;n.key==="Enter"&&!n.shiftKey&&!n.nativeEvent.isComposing&&((r=e.current)==null||r.requestSubmit(),n.preventDefault())}}}const qs=p.forwardRef(({className:e,...t},n)=>f.jsx("textarea",{className:ee("flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),ref:n,...t}));qs.displayName="Textarea";const Ai=({limit:e,charCount:t,...n})=>f.jsxs("div",{className:"relative",children:[f.jsx(qs,{className:ee("min-h-80",n.className),...n}),f.jsxs("div",{className:"absolute bottom-2 right-2.5 text-xs text-muted-foreground",children:[t??0," / ",e]})]}),fie=(...e)=>ee("scroll-m-20 text-2xl font-semibold tracking-tight",e),pie=(...e)=>ee("rounded bg-muted px-[0.3rem] py-[0.2rem] font-mono text-sm font-semibold",e),Tt=(...e)=>ee("text-sm text-muted-foreground",e);var gt;(function(e){e.assertEqual=a=>a;function t(a){}e.assertIs=t;function n(a){throw new Error}e.assertNever=n,e.arrayToEnum=a=>{const o={};for(const i of a)o[i]=i;return o},e.getValidEnumValues=a=>{const o=e.objectKeys(a).filter(s=>typeof a[a[s]]!="number"),i={};for(const s of o)i[s]=a[s];return e.objectValues(i)},e.objectValues=a=>e.objectKeys(a).map(function(o){return a[o]}),e.objectKeys=typeof Object.keys=="function"?a=>Object.keys(a):a=>{const o=[];for(const i in a)Object.prototype.hasOwnProperty.call(a,i)&&o.push(i);return o},e.find=(a,o)=>{for(const i of a)if(o(i))return i},e.isInteger=typeof Number.isInteger=="function"?a=>Number.isInteger(a):a=>typeof a=="number"&&isFinite(a)&&Math.floor(a)===a;function r(a,o=" | "){return a.map(i=>typeof i=="string"?`'${i}'`:i).join(o)}e.joinValues=r,e.jsonStringifyReplacer=(a,o)=>typeof o=="bigint"?o.toString():o})(gt||(gt={}));var yN;(function(e){e.mergeShapes=(t,n)=>({...t,...n})})(yN||(yN={}));const ve=gt.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),Xi=e=>{switch(typeof e){case"undefined":return ve.undefined;case"string":return ve.string;case"number":return isNaN(e)?ve.nan:ve.number;case"boolean":return ve.boolean;case"function":return ve.function;case"bigint":return ve.bigint;case"symbol":return ve.symbol;case"object":return Array.isArray(e)?ve.array:e===null?ve.null:e.then&&typeof e.then=="function"&&e.catch&&typeof e.catch=="function"?ve.promise:typeof Map<"u"&&e instanceof Map?ve.map:typeof Set<"u"&&e instanceof Set?ve.set:typeof Date<"u"&&e instanceof Date?ve.date:ve.object;default:return ve.unknown}},ce=gt.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]);class Ma extends Error{constructor(t){super(),this.issues=[],this.addIssue=r=>{this.issues=[...this.issues,r]},this.addIssues=(r=[])=>{this.issues=[...this.issues,...r]};const n=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,n):this.__proto__=n,this.name="ZodError",this.issues=t}get errors(){return this.issues}format(t){const n=t||function(o){return o.message},r={_errors:[]},a=o=>{for(const i of o.issues)if(i.code==="invalid_union")i.unionErrors.map(a);else if(i.code==="invalid_return_type")a(i.returnTypeError);else if(i.code==="invalid_arguments")a(i.argumentsError);else if(i.path.length===0)r._errors.push(n(i));else{let s=r,l=0;for(;ln.message){const n={},r=[];for(const a of this.issues)a.path.length>0?(n[a.path[0]]=n[a.path[0]]||[],n[a.path[0]].push(t(a))):r.push(t(a));return{formErrors:r,fieldErrors:n}}get formErrors(){return this.flatten()}}Ma.create=e=>new Ma(e);const qg=(e,t)=>{let n;switch(e.code){case ce.invalid_type:e.received===ve.undefined?n="Required":n=`Expected ${e.expected}, received ${e.received}`;break;case ce.invalid_literal:n=`Invalid literal value, expected ${JSON.stringify(e.expected,gt.jsonStringifyReplacer)}`;break;case ce.unrecognized_keys:n=`Unrecognized key(s) in object: ${gt.joinValues(e.keys,", ")}`;break;case ce.invalid_union:n="Invalid input";break;case ce.invalid_union_discriminator:n=`Invalid discriminator value. Expected ${gt.joinValues(e.options)}`;break;case ce.invalid_enum_value:n=`Invalid enum value. Expected ${gt.joinValues(e.options)}, received '${e.received}'`;break;case ce.invalid_arguments:n="Invalid function arguments";break;case ce.invalid_return_type:n="Invalid function return type";break;case ce.invalid_date:n="Invalid date";break;case ce.invalid_string:typeof e.validation=="object"?"includes"in e.validation?(n=`Invalid input: must include "${e.validation.includes}"`,typeof e.validation.position=="number"&&(n=`${n} at one or more positions greater than or equal to ${e.validation.position}`)):"startsWith"in e.validation?n=`Invalid input: must start with "${e.validation.startsWith}"`:"endsWith"in e.validation?n=`Invalid input: must end with "${e.validation.endsWith}"`:gt.assertNever(e.validation):e.validation!=="regex"?n=`Invalid ${e.validation}`:n="Invalid";break;case ce.too_small:e.type==="array"?n=`Array must contain ${e.exact?"exactly":e.inclusive?"at least":"more than"} ${e.minimum} element(s)`:e.type==="string"?n=`String must contain ${e.exact?"exactly":e.inclusive?"at least":"over"} ${e.minimum} character(s)`:e.type==="number"?n=`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:e.type==="date"?n=`Date must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(e.minimum))}`:n="Invalid input";break;case ce.too_big:e.type==="array"?n=`Array must contain ${e.exact?"exactly":e.inclusive?"at most":"less than"} ${e.maximum} element(s)`:e.type==="string"?n=`String must contain ${e.exact?"exactly":e.inclusive?"at most":"under"} ${e.maximum} character(s)`:e.type==="number"?n=`Number must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="bigint"?n=`BigInt must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="date"?n=`Date must be ${e.exact?"exactly":e.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(e.maximum))}`:n="Invalid input";break;case ce.custom:n="Invalid input";break;case ce.invalid_intersection_types:n="Intersection results could not be merged";break;case ce.not_multiple_of:n=`Number must be a multiple of ${e.multipleOf}`;break;case ce.not_finite:n="Number must be finite";break;default:n=t.defaultError,gt.assertNever(e)}return{message:n}};let gie=qg;function vk(){return gie}const Sk=e=>{const{data:t,path:n,errorMaps:r,issueData:a}=e,o=[...n,...a.path||[]],i={...a,path:o};let s="";const l=r.filter(c=>!!c).slice().reverse();for(const c of l)s=c(i,{data:t,defaultError:s}).message;return{...a,path:o,message:a.message||s}};function we(e,t){const n=Sk({issueData:t,data:e.data,path:e.path,errorMaps:[e.common.contextualErrorMap,e.schemaErrorMap,vk(),qg].filter(r=>!!r)});e.common.issues.push(n)}class Qn{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(t,n){const r=[];for(const a of n){if(a.status==="aborted")return Ge;a.status==="dirty"&&t.dirty(),r.push(a.value)}return{status:t.value,value:r}}static async mergeObjectAsync(t,n){const r=[];for(const a of n)r.push({key:await a.key,value:await a.value});return Qn.mergeObjectSync(t,r)}static mergeObjectSync(t,n){const r={};for(const a of n){const{key:o,value:i}=a;if(o.status==="aborted"||i.status==="aborted")return Ge;o.status==="dirty"&&t.dirty(),i.status==="dirty"&&t.dirty(),o.value!=="__proto__"&&(typeof i.value<"u"||a.alwaysSet)&&(r[o.value]=i.value)}return{status:t.value,value:r}}}const Ge=Object.freeze({status:"aborted"}),mie=e=>({status:"dirty",value:e}),dr=e=>({status:"valid",value:e}),vN=e=>e.status==="aborted",SN=e=>e.status==="dirty",Gg=e=>e.status==="valid",wk=e=>typeof Promise<"u"&&e instanceof Promise;var Ne;(function(e){e.errToObj=t=>typeof t=="string"?{message:t}:t||{},e.toString=t=>typeof t=="string"?t:t==null?void 0:t.message})(Ne||(Ne={}));class Ba{constructor(t,n,r,a){this._cachedPath=[],this.parent=t,this.data=n,this._path=r,this._key=a}get path(){return this._cachedPath.length||(this._key instanceof Array?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}}const wN=(e,t)=>{if(Gg(t))return{success:!0,data:t.value};if(!e.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;const n=new Ma(e.common.issues);return this._error=n,this._error}}};function qe(e){if(!e)return{};const{errorMap:t,invalid_type_error:n,required_error:r,description:a}=e;if(t&&(n||r))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return t?{errorMap:t,description:a}:{errorMap:(i,s)=>i.code!=="invalid_type"?{message:s.defaultError}:typeof s.data>"u"?{message:r??s.defaultError}:{message:n??s.defaultError},description:a}}class rt{constructor(t){this.spa=this.safeParseAsync,this._def=t,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this)}get description(){return this._def.description}_getType(t){return Xi(t.data)}_getOrReturnCtx(t,n){return n||{common:t.parent.common,data:t.data,parsedType:Xi(t.data),schemaErrorMap:this._def.errorMap,path:t.path,parent:t.parent}}_processInputParams(t){return{status:new Qn,ctx:{common:t.parent.common,data:t.data,parsedType:Xi(t.data),schemaErrorMap:this._def.errorMap,path:t.path,parent:t.parent}}}_parseSync(t){const n=this._parse(t);if(wk(n))throw new Error("Synchronous parse encountered promise.");return n}_parseAsync(t){const n=this._parse(t);return Promise.resolve(n)}parse(t,n){const r=this.safeParse(t,n);if(r.success)return r.data;throw r.error}safeParse(t,n){var r;const a={common:{issues:[],async:(r=n==null?void 0:n.async)!==null&&r!==void 0?r:!1,contextualErrorMap:n==null?void 0:n.errorMap},path:(n==null?void 0:n.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:Xi(t)},o=this._parseSync({data:t,path:a.path,parent:a});return wN(a,o)}async parseAsync(t,n){const r=await this.safeParseAsync(t,n);if(r.success)return r.data;throw r.error}async safeParseAsync(t,n){const r={common:{issues:[],contextualErrorMap:n==null?void 0:n.errorMap,async:!0},path:(n==null?void 0:n.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:Xi(t)},a=this._parse({data:t,path:r.path,parent:r}),o=await(wk(a)?a:Promise.resolve(a));return wN(r,o)}refine(t,n){const r=a=>typeof n=="string"||typeof n>"u"?{message:n}:typeof n=="function"?n(a):n;return this._refinement((a,o)=>{const i=t(a),s=()=>o.addIssue({code:ce.custom,...r(a)});return typeof Promise<"u"&&i instanceof Promise?i.then(l=>l?!0:(s(),!1)):i?!0:(s(),!1)})}refinement(t,n){return this._refinement((r,a)=>t(r)?!0:(a.addIssue(typeof n=="function"?n(r,a):n),!1))}_refinement(t){return new xo({schema:this,typeName:Me.ZodEffects,effect:{type:"refinement",refinement:t}})}superRefine(t){return this._refinement(t)}optional(){return yi.create(this,this._def)}nullable(){return _c.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return Pa.create(this,this._def)}promise(){return Td.create(this,this._def)}or(t){return Yg.create([this,t],this._def)}and(t){return Zg.create(this,t,this._def)}transform(t){return new xo({...qe(this._def),schema:this,typeName:Me.ZodEffects,effect:{type:"transform",transform:t}})}default(t){const n=typeof t=="function"?t:()=>t;return new tm({...qe(this._def),innerType:this,defaultValue:n,typeName:Me.ZodDefault})}brand(){return new Aie({typeName:Me.ZodBranded,type:this,...qe(this._def)})}catch(t){const n=typeof t=="function"?t:()=>t;return new Ak({...qe(this._def),innerType:this,catchValue:n,typeName:Me.ZodCatch})}describe(t){const n=this.constructor;return new n({...this._def,description:t})}pipe(t){return vh.create(this,t)}readonly(){return Rk.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}const hie=/^c[^\s-]{8,}$/i,bie=/^[a-z][a-z0-9]*$/,yie=/^[0-9A-HJKMNP-TV-Z]{26}$/,vie=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,Sie=/^(?!\.)(?!.*\.\.)([A-Z0-9_+-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,wie="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$";let py;const Eie=/^(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))$/,xie=/^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,kie=e=>e.precision?e.offset?new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${e.precision}}(([+-]\\d{2}(:?\\d{2})?)|Z)$`):new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${e.precision}}Z$`):e.precision===0?e.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(([+-]\\d{2}(:?\\d{2})?)|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$"):e.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}(:?\\d{2})?)|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$");function Cie(e,t){return!!((t==="v4"||!t)&&Eie.test(e)||(t==="v6"||!t)&&xie.test(e))}class lo extends rt{_parse(t){if(this._def.coerce&&(t.data=String(t.data)),this._getType(t)!==ve.string){const o=this._getOrReturnCtx(t);return we(o,{code:ce.invalid_type,expected:ve.string,received:o.parsedType}),Ge}const r=new Qn;let a;for(const o of this._def.checks)if(o.kind==="min")t.data.lengtho.value&&(a=this._getOrReturnCtx(t,a),we(a,{code:ce.too_big,maximum:o.value,type:"string",inclusive:!0,exact:!1,message:o.message}),r.dirty());else if(o.kind==="length"){const i=t.data.length>o.value,s=t.data.lengtht.test(a),{validation:n,code:ce.invalid_string,...Ne.errToObj(r)})}_addCheck(t){return new lo({...this._def,checks:[...this._def.checks,t]})}email(t){return this._addCheck({kind:"email",...Ne.errToObj(t)})}url(t){return this._addCheck({kind:"url",...Ne.errToObj(t)})}emoji(t){return this._addCheck({kind:"emoji",...Ne.errToObj(t)})}uuid(t){return this._addCheck({kind:"uuid",...Ne.errToObj(t)})}cuid(t){return this._addCheck({kind:"cuid",...Ne.errToObj(t)})}cuid2(t){return this._addCheck({kind:"cuid2",...Ne.errToObj(t)})}ulid(t){return this._addCheck({kind:"ulid",...Ne.errToObj(t)})}ip(t){return this._addCheck({kind:"ip",...Ne.errToObj(t)})}datetime(t){var n;return typeof t=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,message:t}):this._addCheck({kind:"datetime",precision:typeof(t==null?void 0:t.precision)>"u"?null:t==null?void 0:t.precision,offset:(n=t==null?void 0:t.offset)!==null&&n!==void 0?n:!1,...Ne.errToObj(t==null?void 0:t.message)})}regex(t,n){return this._addCheck({kind:"regex",regex:t,...Ne.errToObj(n)})}includes(t,n){return this._addCheck({kind:"includes",value:t,position:n==null?void 0:n.position,...Ne.errToObj(n==null?void 0:n.message)})}startsWith(t,n){return this._addCheck({kind:"startsWith",value:t,...Ne.errToObj(n)})}endsWith(t,n){return this._addCheck({kind:"endsWith",value:t,...Ne.errToObj(n)})}min(t,n){return this._addCheck({kind:"min",value:t,...Ne.errToObj(n)})}max(t,n){return this._addCheck({kind:"max",value:t,...Ne.errToObj(n)})}length(t,n){return this._addCheck({kind:"length",value:t,...Ne.errToObj(n)})}nonempty(t){return this.min(1,Ne.errToObj(t))}trim(){return new lo({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new lo({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new lo({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(t=>t.kind==="datetime")}get isEmail(){return!!this._def.checks.find(t=>t.kind==="email")}get isURL(){return!!this._def.checks.find(t=>t.kind==="url")}get isEmoji(){return!!this._def.checks.find(t=>t.kind==="emoji")}get isUUID(){return!!this._def.checks.find(t=>t.kind==="uuid")}get isCUID(){return!!this._def.checks.find(t=>t.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(t=>t.kind==="cuid2")}get isULID(){return!!this._def.checks.find(t=>t.kind==="ulid")}get isIP(){return!!this._def.checks.find(t=>t.kind==="ip")}get minLength(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxLength(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.value{var t;return new lo({checks:[],typeName:Me.ZodString,coerce:(t=e==null?void 0:e.coerce)!==null&&t!==void 0?t:!1,...qe(e)})};function _ie(e,t){const n=(e.toString().split(".")[1]||"").length,r=(t.toString().split(".")[1]||"").length,a=n>r?n:r,o=parseInt(e.toFixed(a).replace(".","")),i=parseInt(t.toFixed(a).replace(".",""));return o%i/Math.pow(10,a)}class xc extends rt{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(t){if(this._def.coerce&&(t.data=Number(t.data)),this._getType(t)!==ve.number){const o=this._getOrReturnCtx(t);return we(o,{code:ce.invalid_type,expected:ve.number,received:o.parsedType}),Ge}let r;const a=new Qn;for(const o of this._def.checks)o.kind==="int"?gt.isInteger(t.data)||(r=this._getOrReturnCtx(t,r),we(r,{code:ce.invalid_type,expected:"integer",received:"float",message:o.message}),a.dirty()):o.kind==="min"?(o.inclusive?t.datao.value:t.data>=o.value)&&(r=this._getOrReturnCtx(t,r),we(r,{code:ce.too_big,maximum:o.value,type:"number",inclusive:o.inclusive,exact:!1,message:o.message}),a.dirty()):o.kind==="multipleOf"?_ie(t.data,o.value)!==0&&(r=this._getOrReturnCtx(t,r),we(r,{code:ce.not_multiple_of,multipleOf:o.value,message:o.message}),a.dirty()):o.kind==="finite"?Number.isFinite(t.data)||(r=this._getOrReturnCtx(t,r),we(r,{code:ce.not_finite,message:o.message}),a.dirty()):gt.assertNever(o);return{status:a.value,value:t.data}}gte(t,n){return this.setLimit("min",t,!0,Ne.toString(n))}gt(t,n){return this.setLimit("min",t,!1,Ne.toString(n))}lte(t,n){return this.setLimit("max",t,!0,Ne.toString(n))}lt(t,n){return this.setLimit("max",t,!1,Ne.toString(n))}setLimit(t,n,r,a){return new xc({...this._def,checks:[...this._def.checks,{kind:t,value:n,inclusive:r,message:Ne.toString(a)}]})}_addCheck(t){return new xc({...this._def,checks:[...this._def.checks,t]})}int(t){return this._addCheck({kind:"int",message:Ne.toString(t)})}positive(t){return this._addCheck({kind:"min",value:0,inclusive:!1,message:Ne.toString(t)})}negative(t){return this._addCheck({kind:"max",value:0,inclusive:!1,message:Ne.toString(t)})}nonpositive(t){return this._addCheck({kind:"max",value:0,inclusive:!0,message:Ne.toString(t)})}nonnegative(t){return this._addCheck({kind:"min",value:0,inclusive:!0,message:Ne.toString(t)})}multipleOf(t,n){return this._addCheck({kind:"multipleOf",value:t,message:Ne.toString(n)})}finite(t){return this._addCheck({kind:"finite",message:Ne.toString(t)})}safe(t){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:Ne.toString(t)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:Ne.toString(t)})}get minValue(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxValue(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.valuet.kind==="int"||t.kind==="multipleOf"&>.isInteger(t.value))}get isFinite(){let t=null,n=null;for(const r of this._def.checks){if(r.kind==="finite"||r.kind==="int"||r.kind==="multipleOf")return!0;r.kind==="min"?(n===null||r.value>n)&&(n=r.value):r.kind==="max"&&(t===null||r.valuenew xc({checks:[],typeName:Me.ZodNumber,coerce:(e==null?void 0:e.coerce)||!1,...qe(e)});class kc extends rt{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(t){if(this._def.coerce&&(t.data=BigInt(t.data)),this._getType(t)!==ve.bigint){const o=this._getOrReturnCtx(t);return we(o,{code:ce.invalid_type,expected:ve.bigint,received:o.parsedType}),Ge}let r;const a=new Qn;for(const o of this._def.checks)o.kind==="min"?(o.inclusive?t.datao.value:t.data>=o.value)&&(r=this._getOrReturnCtx(t,r),we(r,{code:ce.too_big,type:"bigint",maximum:o.value,inclusive:o.inclusive,message:o.message}),a.dirty()):o.kind==="multipleOf"?t.data%o.value!==BigInt(0)&&(r=this._getOrReturnCtx(t,r),we(r,{code:ce.not_multiple_of,multipleOf:o.value,message:o.message}),a.dirty()):gt.assertNever(o);return{status:a.value,value:t.data}}gte(t,n){return this.setLimit("min",t,!0,Ne.toString(n))}gt(t,n){return this.setLimit("min",t,!1,Ne.toString(n))}lte(t,n){return this.setLimit("max",t,!0,Ne.toString(n))}lt(t,n){return this.setLimit("max",t,!1,Ne.toString(n))}setLimit(t,n,r,a){return new kc({...this._def,checks:[...this._def.checks,{kind:t,value:n,inclusive:r,message:Ne.toString(a)}]})}_addCheck(t){return new kc({...this._def,checks:[...this._def.checks,t]})}positive(t){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:Ne.toString(t)})}negative(t){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:Ne.toString(t)})}nonpositive(t){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:Ne.toString(t)})}nonnegative(t){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:Ne.toString(t)})}multipleOf(t,n){return this._addCheck({kind:"multipleOf",value:t,message:Ne.toString(n)})}get minValue(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxValue(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.value{var t;return new kc({checks:[],typeName:Me.ZodBigInt,coerce:(t=e==null?void 0:e.coerce)!==null&&t!==void 0?t:!1,...qe(e)})};class Ek extends rt{_parse(t){if(this._def.coerce&&(t.data=!!t.data),this._getType(t)!==ve.boolean){const r=this._getOrReturnCtx(t);return we(r,{code:ce.invalid_type,expected:ve.boolean,received:r.parsedType}),Ge}return dr(t.data)}}Ek.create=e=>new Ek({typeName:Me.ZodBoolean,coerce:(e==null?void 0:e.coerce)||!1,...qe(e)});class _d extends rt{_parse(t){if(this._def.coerce&&(t.data=new Date(t.data)),this._getType(t)!==ve.date){const o=this._getOrReturnCtx(t);return we(o,{code:ce.invalid_type,expected:ve.date,received:o.parsedType}),Ge}if(isNaN(t.data.getTime())){const o=this._getOrReturnCtx(t);return we(o,{code:ce.invalid_date}),Ge}const r=new Qn;let a;for(const o of this._def.checks)o.kind==="min"?t.data.getTime()o.value&&(a=this._getOrReturnCtx(t,a),we(a,{code:ce.too_big,message:o.message,inclusive:!0,exact:!1,maximum:o.value,type:"date"}),r.dirty()):gt.assertNever(o);return{status:r.value,value:new Date(t.data.getTime())}}_addCheck(t){return new _d({...this._def,checks:[...this._def.checks,t]})}min(t,n){return this._addCheck({kind:"min",value:t.getTime(),message:Ne.toString(n)})}max(t,n){return this._addCheck({kind:"max",value:t.getTime(),message:Ne.toString(n)})}get minDate(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t!=null?new Date(t):null}get maxDate(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.valuenew _d({checks:[],coerce:(e==null?void 0:e.coerce)||!1,typeName:Me.ZodDate,...qe(e)});class xk extends rt{_parse(t){if(this._getType(t)!==ve.symbol){const r=this._getOrReturnCtx(t);return we(r,{code:ce.invalid_type,expected:ve.symbol,received:r.parsedType}),Ge}return dr(t.data)}}xk.create=e=>new xk({typeName:Me.ZodSymbol,...qe(e)});class Wg extends rt{_parse(t){if(this._getType(t)!==ve.undefined){const r=this._getOrReturnCtx(t);return we(r,{code:ce.invalid_type,expected:ve.undefined,received:r.parsedType}),Ge}return dr(t.data)}}Wg.create=e=>new Wg({typeName:Me.ZodUndefined,...qe(e)});class Kg extends rt{_parse(t){if(this._getType(t)!==ve.null){const r=this._getOrReturnCtx(t);return we(r,{code:ce.invalid_type,expected:ve.null,received:r.parsedType}),Ge}return dr(t.data)}}Kg.create=e=>new Kg({typeName:Me.ZodNull,...qe(e)});class Ad extends rt{constructor(){super(...arguments),this._any=!0}_parse(t){return dr(t.data)}}Ad.create=e=>new Ad({typeName:Me.ZodAny,...qe(e)});class Hl extends rt{constructor(){super(...arguments),this._unknown=!0}_parse(t){return dr(t.data)}}Hl.create=e=>new Hl({typeName:Me.ZodUnknown,...qe(e)});class Ti extends rt{_parse(t){const n=this._getOrReturnCtx(t);return we(n,{code:ce.invalid_type,expected:ve.never,received:n.parsedType}),Ge}}Ti.create=e=>new Ti({typeName:Me.ZodNever,...qe(e)});class kk extends rt{_parse(t){if(this._getType(t)!==ve.undefined){const r=this._getOrReturnCtx(t);return we(r,{code:ce.invalid_type,expected:ve.void,received:r.parsedType}),Ge}return dr(t.data)}}kk.create=e=>new kk({typeName:Me.ZodVoid,...qe(e)});class Pa extends rt{_parse(t){const{ctx:n,status:r}=this._processInputParams(t),a=this._def;if(n.parsedType!==ve.array)return we(n,{code:ce.invalid_type,expected:ve.array,received:n.parsedType}),Ge;if(a.exactLength!==null){const i=n.data.length>a.exactLength.value,s=n.data.lengtha.maxLength.value&&(we(n,{code:ce.too_big,maximum:a.maxLength.value,type:"array",inclusive:!0,exact:!1,message:a.maxLength.message}),r.dirty()),n.common.async)return Promise.all([...n.data].map((i,s)=>a.type._parseAsync(new Ba(n,i,n.path,s)))).then(i=>Qn.mergeArray(r,i));const o=[...n.data].map((i,s)=>a.type._parseSync(new Ba(n,i,n.path,s)));return Qn.mergeArray(r,o)}get element(){return this._def.type}min(t,n){return new Pa({...this._def,minLength:{value:t,message:Ne.toString(n)}})}max(t,n){return new Pa({...this._def,maxLength:{value:t,message:Ne.toString(n)}})}length(t,n){return new Pa({...this._def,exactLength:{value:t,message:Ne.toString(n)}})}nonempty(t){return this.min(1,t)}}Pa.create=(e,t)=>new Pa({type:e,minLength:null,maxLength:null,exactLength:null,typeName:Me.ZodArray,...qe(t)});function fl(e){if(e instanceof qt){const t={};for(const n in e.shape){const r=e.shape[n];t[n]=yi.create(fl(r))}return new qt({...e._def,shape:()=>t})}else return e instanceof Pa?new Pa({...e._def,type:fl(e.element)}):e instanceof yi?yi.create(fl(e.unwrap())):e instanceof _c?_c.create(fl(e.unwrap())):e instanceof Eo?Eo.create(e.items.map(t=>fl(t))):e}class qt extends rt{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;const t=this._def.shape(),n=gt.objectKeys(t);return this._cached={shape:t,keys:n}}_parse(t){if(this._getType(t)!==ve.object){const c=this._getOrReturnCtx(t);return we(c,{code:ce.invalid_type,expected:ve.object,received:c.parsedType}),Ge}const{status:r,ctx:a}=this._processInputParams(t),{shape:o,keys:i}=this._getCached(),s=[];if(!(this._def.catchall instanceof Ti&&this._def.unknownKeys==="strip"))for(const c in a.data)i.includes(c)||s.push(c);const l=[];for(const c of i){const u=o[c],d=a.data[c];l.push({key:{status:"valid",value:c},value:u._parse(new Ba(a,d,a.path,c)),alwaysSet:c in a.data})}if(this._def.catchall instanceof Ti){const c=this._def.unknownKeys;if(c==="passthrough")for(const u of s)l.push({key:{status:"valid",value:u},value:{status:"valid",value:a.data[u]}});else if(c==="strict")s.length>0&&(we(a,{code:ce.unrecognized_keys,keys:s}),r.dirty());else if(c!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{const c=this._def.catchall;for(const u of s){const d=a.data[u];l.push({key:{status:"valid",value:u},value:c._parse(new Ba(a,d,a.path,u)),alwaysSet:u in a.data})}}return a.common.async?Promise.resolve().then(async()=>{const c=[];for(const u of l){const d=await u.key;c.push({key:d,value:await u.value,alwaysSet:u.alwaysSet})}return c}).then(c=>Qn.mergeObjectSync(r,c)):Qn.mergeObjectSync(r,l)}get shape(){return this._def.shape()}strict(t){return Ne.errToObj,new qt({...this._def,unknownKeys:"strict",...t!==void 0?{errorMap:(n,r)=>{var a,o,i,s;const l=(i=(o=(a=this._def).errorMap)===null||o===void 0?void 0:o.call(a,n,r).message)!==null&&i!==void 0?i:r.defaultError;return n.code==="unrecognized_keys"?{message:(s=Ne.errToObj(t).message)!==null&&s!==void 0?s:l}:{message:l}}}:{}})}strip(){return new qt({...this._def,unknownKeys:"strip"})}passthrough(){return new qt({...this._def,unknownKeys:"passthrough"})}extend(t){return new qt({...this._def,shape:()=>({...this._def.shape(),...t})})}merge(t){return new qt({unknownKeys:t._def.unknownKeys,catchall:t._def.catchall,shape:()=>({...this._def.shape(),...t._def.shape()}),typeName:Me.ZodObject})}setKey(t,n){return this.augment({[t]:n})}catchall(t){return new qt({...this._def,catchall:t})}pick(t){const n={};return gt.objectKeys(t).forEach(r=>{t[r]&&this.shape[r]&&(n[r]=this.shape[r])}),new qt({...this._def,shape:()=>n})}omit(t){const n={};return gt.objectKeys(this.shape).forEach(r=>{t[r]||(n[r]=this.shape[r])}),new qt({...this._def,shape:()=>n})}deepPartial(){return fl(this)}partial(t){const n={};return gt.objectKeys(this.shape).forEach(r=>{const a=this.shape[r];t&&!t[r]?n[r]=a:n[r]=a.optional()}),new qt({...this._def,shape:()=>n})}required(t){const n={};return gt.objectKeys(this.shape).forEach(r=>{if(t&&!t[r])n[r]=this.shape[r];else{let o=this.shape[r];for(;o instanceof yi;)o=o._def.innerType;n[r]=o}}),new qt({...this._def,shape:()=>n})}keyof(){return m9(gt.objectKeys(this.shape))}}qt.create=(e,t)=>new qt({shape:()=>e,unknownKeys:"strip",catchall:Ti.create(),typeName:Me.ZodObject,...qe(t)});qt.strictCreate=(e,t)=>new qt({shape:()=>e,unknownKeys:"strict",catchall:Ti.create(),typeName:Me.ZodObject,...qe(t)});qt.lazycreate=(e,t)=>new qt({shape:e,unknownKeys:"strip",catchall:Ti.create(),typeName:Me.ZodObject,...qe(t)});class Yg extends rt{_parse(t){const{ctx:n}=this._processInputParams(t),r=this._def.options;function a(o){for(const s of o)if(s.result.status==="valid")return s.result;for(const s of o)if(s.result.status==="dirty")return n.common.issues.push(...s.ctx.common.issues),s.result;const i=o.map(s=>new Ma(s.ctx.common.issues));return we(n,{code:ce.invalid_union,unionErrors:i}),Ge}if(n.common.async)return Promise.all(r.map(async o=>{const i={...n,common:{...n.common,issues:[]},parent:null};return{result:await o._parseAsync({data:n.data,path:n.path,parent:i}),ctx:i}})).then(a);{let o;const i=[];for(const l of r){const c={...n,common:{...n.common,issues:[]},parent:null},u=l._parseSync({data:n.data,path:n.path,parent:c});if(u.status==="valid")return u;u.status==="dirty"&&!o&&(o={result:u,ctx:c}),c.common.issues.length&&i.push(c.common.issues)}if(o)return n.common.issues.push(...o.ctx.common.issues),o.result;const s=i.map(l=>new Ma(l));return we(n,{code:ce.invalid_union,unionErrors:s}),Ge}}get options(){return this._def.options}}Yg.create=(e,t)=>new Yg({options:e,typeName:Me.ZodUnion,...qe(t)});const Wp=e=>e instanceof Qg?Wp(e.schema):e instanceof xo?Wp(e.innerType()):e instanceof Jg?[e.value]:e instanceof Ns?e.options:e instanceof em?Object.keys(e.enum):e instanceof tm?Wp(e._def.innerType):e instanceof Wg?[void 0]:e instanceof Kg?[null]:null;class tA extends rt{_parse(t){const{ctx:n}=this._processInputParams(t);if(n.parsedType!==ve.object)return we(n,{code:ce.invalid_type,expected:ve.object,received:n.parsedType}),Ge;const r=this.discriminator,a=n.data[r],o=this.optionsMap.get(a);return o?n.common.async?o._parseAsync({data:n.data,path:n.path,parent:n}):o._parseSync({data:n.data,path:n.path,parent:n}):(we(n,{code:ce.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[r]}),Ge)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(t,n,r){const a=new Map;for(const o of n){const i=Wp(o.shape[t]);if(!i)throw new Error(`A discriminator value for key \`${t}\` could not be extracted from all schema options`);for(const s of i){if(a.has(s))throw new Error(`Discriminator property ${String(t)} has duplicate value ${String(s)}`);a.set(s,o)}}return new tA({typeName:Me.ZodDiscriminatedUnion,discriminator:t,options:n,optionsMap:a,...qe(r)})}}function Ck(e,t){const n=Xi(e),r=Xi(t);if(e===t)return{valid:!0,data:e};if(n===ve.object&&r===ve.object){const a=gt.objectKeys(t),o=gt.objectKeys(e).filter(s=>a.indexOf(s)!==-1),i={...e,...t};for(const s of o){const l=Ck(e[s],t[s]);if(!l.valid)return{valid:!1};i[s]=l.data}return{valid:!0,data:i}}else if(n===ve.array&&r===ve.array){if(e.length!==t.length)return{valid:!1};const a=[];for(let o=0;o{if(vN(o)||vN(i))return Ge;const s=Ck(o.value,i.value);return s.valid?((SN(o)||SN(i))&&n.dirty(),{status:n.value,value:s.data}):(we(r,{code:ce.invalid_intersection_types}),Ge)};return r.common.async?Promise.all([this._def.left._parseAsync({data:r.data,path:r.path,parent:r}),this._def.right._parseAsync({data:r.data,path:r.path,parent:r})]).then(([o,i])=>a(o,i)):a(this._def.left._parseSync({data:r.data,path:r.path,parent:r}),this._def.right._parseSync({data:r.data,path:r.path,parent:r}))}}Zg.create=(e,t,n)=>new Zg({left:e,right:t,typeName:Me.ZodIntersection,...qe(n)});class Eo extends rt{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==ve.array)return we(r,{code:ce.invalid_type,expected:ve.array,received:r.parsedType}),Ge;if(r.data.lengththis._def.items.length&&(we(r,{code:ce.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),n.dirty());const o=[...r.data].map((i,s)=>{const l=this._def.items[s]||this._def.rest;return l?l._parse(new Ba(r,i,r.path,s)):null}).filter(i=>!!i);return r.common.async?Promise.all(o).then(i=>Qn.mergeArray(n,i)):Qn.mergeArray(n,o)}get items(){return this._def.items}rest(t){return new Eo({...this._def,rest:t})}}Eo.create=(e,t)=>{if(!Array.isArray(e))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new Eo({items:e,typeName:Me.ZodTuple,rest:null,...qe(t)})};class Xg extends rt{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==ve.object)return we(r,{code:ce.invalid_type,expected:ve.object,received:r.parsedType}),Ge;const a=[],o=this._def.keyType,i=this._def.valueType;for(const s in r.data)a.push({key:o._parse(new Ba(r,s,r.path,s)),value:i._parse(new Ba(r,r.data[s],r.path,s))});return r.common.async?Qn.mergeObjectAsync(n,a):Qn.mergeObjectSync(n,a)}get element(){return this._def.valueType}static create(t,n,r){return n instanceof rt?new Xg({keyType:t,valueType:n,typeName:Me.ZodRecord,...qe(r)}):new Xg({keyType:lo.create(),valueType:t,typeName:Me.ZodRecord,...qe(n)})}}class _k extends rt{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==ve.map)return we(r,{code:ce.invalid_type,expected:ve.map,received:r.parsedType}),Ge;const a=this._def.keyType,o=this._def.valueType,i=[...r.data.entries()].map(([s,l],c)=>({key:a._parse(new Ba(r,s,r.path,[c,"key"])),value:o._parse(new Ba(r,l,r.path,[c,"value"]))}));if(r.common.async){const s=new Map;return Promise.resolve().then(async()=>{for(const l of i){const c=await l.key,u=await l.value;if(c.status==="aborted"||u.status==="aborted")return Ge;(c.status==="dirty"||u.status==="dirty")&&n.dirty(),s.set(c.value,u.value)}return{status:n.value,value:s}})}else{const s=new Map;for(const l of i){const c=l.key,u=l.value;if(c.status==="aborted"||u.status==="aborted")return Ge;(c.status==="dirty"||u.status==="dirty")&&n.dirty(),s.set(c.value,u.value)}return{status:n.value,value:s}}}}_k.create=(e,t,n)=>new _k({valueType:t,keyType:e,typeName:Me.ZodMap,...qe(n)});class Cc extends rt{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==ve.set)return we(r,{code:ce.invalid_type,expected:ve.set,received:r.parsedType}),Ge;const a=this._def;a.minSize!==null&&r.data.sizea.maxSize.value&&(we(r,{code:ce.too_big,maximum:a.maxSize.value,type:"set",inclusive:!0,exact:!1,message:a.maxSize.message}),n.dirty());const o=this._def.valueType;function i(l){const c=new Set;for(const u of l){if(u.status==="aborted")return Ge;u.status==="dirty"&&n.dirty(),c.add(u.value)}return{status:n.value,value:c}}const s=[...r.data.values()].map((l,c)=>o._parse(new Ba(r,l,r.path,c)));return r.common.async?Promise.all(s).then(l=>i(l)):i(s)}min(t,n){return new Cc({...this._def,minSize:{value:t,message:Ne.toString(n)}})}max(t,n){return new Cc({...this._def,maxSize:{value:t,message:Ne.toString(n)}})}size(t,n){return this.min(t,n).max(t,n)}nonempty(t){return this.min(1,t)}}Cc.create=(e,t)=>new Cc({valueType:e,minSize:null,maxSize:null,typeName:Me.ZodSet,...qe(t)});class Gu extends rt{constructor(){super(...arguments),this.validate=this.implement}_parse(t){const{ctx:n}=this._processInputParams(t);if(n.parsedType!==ve.function)return we(n,{code:ce.invalid_type,expected:ve.function,received:n.parsedType}),Ge;function r(s,l){return Sk({data:s,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,vk(),qg].filter(c=>!!c),issueData:{code:ce.invalid_arguments,argumentsError:l}})}function a(s,l){return Sk({data:s,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,vk(),qg].filter(c=>!!c),issueData:{code:ce.invalid_return_type,returnTypeError:l}})}const o={errorMap:n.common.contextualErrorMap},i=n.data;if(this._def.returns instanceof Td){const s=this;return dr(async function(...l){const c=new Ma([]),u=await s._def.args.parseAsync(l,o).catch(m=>{throw c.addIssue(r(l,m)),c}),d=await Reflect.apply(i,this,u);return await s._def.returns._def.type.parseAsync(d,o).catch(m=>{throw c.addIssue(a(d,m)),c})})}else{const s=this;return dr(function(...l){const c=s._def.args.safeParse(l,o);if(!c.success)throw new Ma([r(l,c.error)]);const u=Reflect.apply(i,this,c.data),d=s._def.returns.safeParse(u,o);if(!d.success)throw new Ma([a(u,d.error)]);return d.data})}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...t){return new Gu({...this._def,args:Eo.create(t).rest(Hl.create())})}returns(t){return new Gu({...this._def,returns:t})}implement(t){return this.parse(t)}strictImplement(t){return this.parse(t)}static create(t,n,r){return new Gu({args:t||Eo.create([]).rest(Hl.create()),returns:n||Hl.create(),typeName:Me.ZodFunction,...qe(r)})}}class Qg extends rt{get schema(){return this._def.getter()}_parse(t){const{ctx:n}=this._processInputParams(t);return this._def.getter()._parse({data:n.data,path:n.path,parent:n})}}Qg.create=(e,t)=>new Qg({getter:e,typeName:Me.ZodLazy,...qe(t)});class Jg extends rt{_parse(t){if(t.data!==this._def.value){const n=this._getOrReturnCtx(t);return we(n,{received:n.data,code:ce.invalid_literal,expected:this._def.value}),Ge}return{status:"valid",value:t.data}}get value(){return this._def.value}}Jg.create=(e,t)=>new Jg({value:e,typeName:Me.ZodLiteral,...qe(t)});function m9(e,t){return new Ns({values:e,typeName:Me.ZodEnum,...qe(t)})}class Ns extends rt{_parse(t){if(typeof t.data!="string"){const n=this._getOrReturnCtx(t),r=this._def.values;return we(n,{expected:gt.joinValues(r),received:n.parsedType,code:ce.invalid_type}),Ge}if(this._def.values.indexOf(t.data)===-1){const n=this._getOrReturnCtx(t),r=this._def.values;return we(n,{received:n.data,code:ce.invalid_enum_value,options:r}),Ge}return dr(t.data)}get options(){return this._def.values}get enum(){const t={};for(const n of this._def.values)t[n]=n;return t}get Values(){const t={};for(const n of this._def.values)t[n]=n;return t}get Enum(){const t={};for(const n of this._def.values)t[n]=n;return t}extract(t){return Ns.create(t)}exclude(t){return Ns.create(this.options.filter(n=>!t.includes(n)))}}Ns.create=m9;class em extends rt{_parse(t){const n=gt.getValidEnumValues(this._def.values),r=this._getOrReturnCtx(t);if(r.parsedType!==ve.string&&r.parsedType!==ve.number){const a=gt.objectValues(n);return we(r,{expected:gt.joinValues(a),received:r.parsedType,code:ce.invalid_type}),Ge}if(n.indexOf(t.data)===-1){const a=gt.objectValues(n);return we(r,{received:r.data,code:ce.invalid_enum_value,options:a}),Ge}return dr(t.data)}get enum(){return this._def.values}}em.create=(e,t)=>new em({values:e,typeName:Me.ZodNativeEnum,...qe(t)});class Td extends rt{unwrap(){return this._def.type}_parse(t){const{ctx:n}=this._processInputParams(t);if(n.parsedType!==ve.promise&&n.common.async===!1)return we(n,{code:ce.invalid_type,expected:ve.promise,received:n.parsedType}),Ge;const r=n.parsedType===ve.promise?n.data:Promise.resolve(n.data);return dr(r.then(a=>this._def.type.parseAsync(a,{path:n.path,errorMap:n.common.contextualErrorMap})))}}Td.create=(e,t)=>new Td({type:e,typeName:Me.ZodPromise,...qe(t)});class xo extends rt{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===Me.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(t){const{status:n,ctx:r}=this._processInputParams(t),a=this._def.effect||null,o={addIssue:i=>{we(r,i),i.fatal?n.abort():n.dirty()},get path(){return r.path}};if(o.addIssue=o.addIssue.bind(o),a.type==="preprocess"){const i=a.transform(r.data,o);return r.common.issues.length?{status:"dirty",value:r.data}:r.common.async?Promise.resolve(i).then(s=>this._def.schema._parseAsync({data:s,path:r.path,parent:r})):this._def.schema._parseSync({data:i,path:r.path,parent:r})}if(a.type==="refinement"){const i=s=>{const l=a.refinement(s,o);if(r.common.async)return Promise.resolve(l);if(l instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return s};if(r.common.async===!1){const s=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});return s.status==="aborted"?Ge:(s.status==="dirty"&&n.dirty(),i(s.value),{status:n.value,value:s.value})}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(s=>s.status==="aborted"?Ge:(s.status==="dirty"&&n.dirty(),i(s.value).then(()=>({status:n.value,value:s.value}))))}if(a.type==="transform")if(r.common.async===!1){const i=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});if(!Gg(i))return i;const s=a.transform(i.value,o);if(s instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:n.value,value:s}}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(i=>Gg(i)?Promise.resolve(a.transform(i.value,o)).then(s=>({status:n.value,value:s})):i);gt.assertNever(a)}}xo.create=(e,t,n)=>new xo({schema:e,typeName:Me.ZodEffects,effect:t,...qe(n)});xo.createWithPreprocess=(e,t,n)=>new xo({schema:t,effect:{type:"preprocess",transform:e},typeName:Me.ZodEffects,...qe(n)});class yi extends rt{_parse(t){return this._getType(t)===ve.undefined?dr(void 0):this._def.innerType._parse(t)}unwrap(){return this._def.innerType}}yi.create=(e,t)=>new yi({innerType:e,typeName:Me.ZodOptional,...qe(t)});class _c extends rt{_parse(t){return this._getType(t)===ve.null?dr(null):this._def.innerType._parse(t)}unwrap(){return this._def.innerType}}_c.create=(e,t)=>new _c({innerType:e,typeName:Me.ZodNullable,...qe(t)});class tm extends rt{_parse(t){const{ctx:n}=this._processInputParams(t);let r=n.data;return n.parsedType===ve.undefined&&(r=this._def.defaultValue()),this._def.innerType._parse({data:r,path:n.path,parent:n})}removeDefault(){return this._def.innerType}}tm.create=(e,t)=>new tm({innerType:e,typeName:Me.ZodDefault,defaultValue:typeof t.default=="function"?t.default:()=>t.default,...qe(t)});class Ak extends rt{_parse(t){const{ctx:n}=this._processInputParams(t),r={...n,common:{...n.common,issues:[]}},a=this._def.innerType._parse({data:r.data,path:r.path,parent:{...r}});return wk(a)?a.then(o=>({status:"valid",value:o.status==="valid"?o.value:this._def.catchValue({get error(){return new Ma(r.common.issues)},input:r.data})})):{status:"valid",value:a.status==="valid"?a.value:this._def.catchValue({get error(){return new Ma(r.common.issues)},input:r.data})}}removeCatch(){return this._def.innerType}}Ak.create=(e,t)=>new Ak({innerType:e,typeName:Me.ZodCatch,catchValue:typeof t.catch=="function"?t.catch:()=>t.catch,...qe(t)});class Tk extends rt{_parse(t){if(this._getType(t)!==ve.nan){const r=this._getOrReturnCtx(t);return we(r,{code:ce.invalid_type,expected:ve.nan,received:r.parsedType}),Ge}return{status:"valid",value:t.data}}}Tk.create=e=>new Tk({typeName:Me.ZodNaN,...qe(e)});class Aie extends rt{_parse(t){const{ctx:n}=this._processInputParams(t),r=n.data;return this._def.type._parse({data:r,path:n.path,parent:n})}unwrap(){return this._def.type}}class vh extends rt{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.common.async)return(async()=>{const o=await this._def.in._parseAsync({data:r.data,path:r.path,parent:r});return o.status==="aborted"?Ge:o.status==="dirty"?(n.dirty(),mie(o.value)):this._def.out._parseAsync({data:o.value,path:r.path,parent:r})})();{const a=this._def.in._parseSync({data:r.data,path:r.path,parent:r});return a.status==="aborted"?Ge:a.status==="dirty"?(n.dirty(),{status:"dirty",value:a.value}):this._def.out._parseSync({data:a.value,path:r.path,parent:r})}}static create(t,n){return new vh({in:t,out:n,typeName:Me.ZodPipeline})}}class Rk extends rt{_parse(t){const n=this._def.innerType._parse(t);return Gg(n)&&(n.value=Object.freeze(n.value)),n}}Rk.create=(e,t)=>new Rk({innerType:e,typeName:Me.ZodReadonly,...qe(t)});const Tie=(e,t={},n)=>e?Ad.create().superRefine((r,a)=>{var o,i;if(!e(r)){const s=typeof t=="function"?t(r):typeof t=="string"?{message:t}:t,l=(i=(o=s.fatal)!==null&&o!==void 0?o:n)!==null&&i!==void 0?i:!0,c=typeof s=="string"?{message:s}:s;a.addIssue({code:"custom",...c,fatal:l})}}):Ad.create();qt.lazycreate;var Me;(function(e){e.ZodString="ZodString",e.ZodNumber="ZodNumber",e.ZodNaN="ZodNaN",e.ZodBigInt="ZodBigInt",e.ZodBoolean="ZodBoolean",e.ZodDate="ZodDate",e.ZodSymbol="ZodSymbol",e.ZodUndefined="ZodUndefined",e.ZodNull="ZodNull",e.ZodAny="ZodAny",e.ZodUnknown="ZodUnknown",e.ZodNever="ZodNever",e.ZodVoid="ZodVoid",e.ZodArray="ZodArray",e.ZodObject="ZodObject",e.ZodUnion="ZodUnion",e.ZodDiscriminatedUnion="ZodDiscriminatedUnion",e.ZodIntersection="ZodIntersection",e.ZodTuple="ZodTuple",e.ZodRecord="ZodRecord",e.ZodMap="ZodMap",e.ZodSet="ZodSet",e.ZodFunction="ZodFunction",e.ZodLazy="ZodLazy",e.ZodLiteral="ZodLiteral",e.ZodEnum="ZodEnum",e.ZodEffects="ZodEffects",e.ZodNativeEnum="ZodNativeEnum",e.ZodOptional="ZodOptional",e.ZodNullable="ZodNullable",e.ZodDefault="ZodDefault",e.ZodCatch="ZodCatch",e.ZodPromise="ZodPromise",e.ZodBranded="ZodBranded",e.ZodPipeline="ZodPipeline",e.ZodReadonly="ZodReadonly"})(Me||(Me={}));const Ce=lo.create;xc.create;Tk.create;kc.create;Ek.create;_d.create;xk.create;Wg.create;Kg.create;const Rie=Ad.create;Hl.create;Ti.create;kk.create;const nA=Pa.create,Xe=qt.create;qt.strictCreate;Yg.create;tA.create;Zg.create;Eo.create;Xg.create;_k.create;Cc.create;Gu.create;Qg.create;Jg.create;Ns.create;em.create;Td.create;xo.create;yi.create;_c.create;xo.createWithPreprocess;vh.create;function EN({setEditPersona:e,personas:t,descriptionName:n,fieldName:r}){const a=Hs(),o=()=>{e(void 0);const i=t.find(s=>s.name===a.watch(n));i&&a.setValue(r,i.value||"")};return f.jsxs("div",{className:"flex justify-end gap-3",children:[f.jsx(ue,{variant:"ghost",type:"button",onClick:o,children:f.jsx("span",{children:"Cancel"})}),f.jsx(ue,{variant:"outline",onClick:()=>e(void 0),children:f.jsx("span",{children:"Save changes"})})]})}function xN({setEditPersona:e,editPersona:t,personaValue:n}){const r=Hs(),a=Mi();return f.jsxs("div",{className:"mt-2 flex gap-4",children:[r.getValues(n)?f.jsxs(ue,{variant:"ghost",className:"px-0",onClick:()=>e(t),children:[f.jsx(XC,{className:"mr-1 h-4 w-4"}),f.jsx("span",{children:"Edit Persona"})]}):null,f.jsxs(ue,{variant:"ghost",className:"px-0",onClick:()=>a(t==="human"?"/human-templates?openCreatePersona":"/agent-templates?openCreatePersona"),children:[f.jsx(ya,{className:"h-4 w-4"}),f.jsx("span",{children:"New Template"})]})]})}const Nie=Xe({name:Ce().min(2,{message:"Name must be at least 2 characters."}).max(30,{message:"Name must not be longer than 30 characters."}),model:Ce(),humanName:Ce().max(2e3),agentName:Ce().max(2e3)});function Iie(e,t){let n="Error creating agent";const r=`${n}: Unspecified error.`;try{const a=JSON.parse(e.message);a.detail&&(a.detail=="None"?n=r:n=`${n}: ${a.detail}`)}catch{n=r}t({title:n,duration:5e3})}const Qr="persona",fr="human";function Oie({personas:e,humans:t,models:n,tools:r,closeDialog:a,openCancelCreateAgent:o}){const i=Bt(),s=uX(),{toast:l}=An(),c=2e3,u=2e3,d=Nie.extend({humanValue:Ce().max(u).min(2,{message:"Human name must be at least 2 characters."}),agentValue:Ce().max(c).min(2,{message:"Agent name must be at least 2 characters."}),embedding_model:Ce()}),{data:g}=E6(),m=bn({resolver:yn(d),defaultValues:{name:"",model:"",embedding_model:"",humanName:"",agentName:"",humanValue:"",agentValue:""},mode:"onChange"}),b=C=>{const _=n.find(R=>R.model===C.model);_&&g&&s.mutate({requestBody:{name:C.name,embedding_config:g.find(R=>R.embedding_model===C.embedding_model)||void 0,llm_config:_,tools:r.filter(R=>R.tags.includes("base")).map(R=>R.name).filter(R=>!!R),memory:{memory:{[fr]:{name:C.humanName,label:fr,value:C.humanValue},[Qr]:{name:C.agentName,label:Qr,value:C.agentValue}}}}},{onSuccess:()=>{i.invalidateQueries({queryKey:g6()}),a(),l({title:"Agent created successfully!",duration:5e3})},onError:R=>Iie(R,l)})},[y,w]=p.useState(),v=m.getFieldState("humanValue").isDirty,h=m.getFieldState("agentValue").isDirty,[S,E]=p.useState(!1),[k,x]=p.useState(!1);return f.jsx(vn,{...m,children:f.jsxs("form",{onSubmit:m.handleSubmit(b),className:"space-y-8",children:[f.jsxs("div",{className:"space-y-4",children:[f.jsx(ut,{control:m.control,name:"name",render:({field:C})=>f.jsxs(ot,{className:"space-y-1",children:[f.jsx(yt,{children:"Agent Name"}),f.jsx(pt,{children:f.jsx(_n,{...C})}),f.jsx(Mt,{className:"text-xs",children:"This is your agents display name. It can be a real name or a pseudonym."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:m.control,name:"model",render:({field:C})=>f.jsxs(ot,{className:"space-y-1",children:[f.jsx(yt,{children:"Model"}),f.jsxs(So,{onValueChange:C.onChange,value:C.value,children:[f.jsx(pt,{children:f.jsx(za,{children:f.jsx(wo,{placeholder:"Select a model"})})}),f.jsx(Ua,{children:n.map(_=>f.jsx(Fn,{value:_.model,children:_.model},_.model))})]}),f.jsx(Mt,{className:"text-xs ",children:"Select the model to be used with this agent."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:m.control,name:"embedding_model",render:({field:C})=>f.jsxs(ot,{className:"space-y-1",children:[f.jsx(yt,{children:"Embedding Config"}),f.jsxs(So,{onValueChange:C.onChange,value:C.value,children:[f.jsx(pt,{children:f.jsx(za,{children:f.jsx(wo,{placeholder:"Select a model"})})}),f.jsx(Ua,{children:g?g.map(_=>f.jsx(Fn,{value:_.embedding_model,children:_.embedding_model},_.embedding_model)):f.jsx(Fn,{value:"loading",disabled:!0,children:"Loading..."})})]}),f.jsx(lt,{})]})})]}),f.jsxs("div",{className:"space-y-6",children:[f.jsxs("div",{children:[f.jsx("p",{className:"font-semibold ",children:"Core memory"}),f.jsx("p",{className:"text-sm text-muted-foreground",children:"Agent’s core memory about itself (agent persona) and the user (human persona)."})]}),f.jsxs("div",{children:[f.jsx(ut,{control:m.control,name:"agentName",render:({field:C})=>f.jsxs(ot,{className:"space-y-1",children:[f.jsx(yt,{children:"Agent Persona"}),f.jsxs(uN,{open:S,onOpenChange:E,children:[f.jsx(dN,{children:f.jsxs("div",{className:"flex gap-2",children:[f.jsx("span",{children:C.value??"Search or select"}),h?f.jsx("div",{className:"text-muted-foreground",children:"(Edited)"}):null]})}),f.jsx(fN,{children:f.jsxs(pN,{children:[f.jsx(gN,{placeholder:"Search persona"}),f.jsx(mN,{children:"No Agent Persona was found."}),f.jsx(hN,{children:e.map(_=>f.jsx(bN,{value:_.name||"",onSelect:R=>{const T=e.find(L=>L.name===R);C.onChange(R),m.setValue("agentValue",(T==null?void 0:T.value)||""),E(!1)},children:_.name},_.name))})]})})]}),f.jsx(lt,{})]})}),y==="agent"?null:f.jsx(xN,{editPersona:"agent",setEditPersona:w,personaValue:"agentName"})]}),y==="agent"?f.jsx(ut,{control:m.control,name:"agentValue",render:({field:C})=>{var _;return f.jsxs(f.Fragment,{children:[f.jsxs(ot,{className:"space-y-1",children:[f.jsx(yt,{children:"Persona Description"}),f.jsx(pt,{children:f.jsx(Ai,{placeholder:"Describe your persona here",charCount:(_=C.value)==null?void 0:_.length,limit:c,...C})}),f.jsx(Mt,{children:"You can use no more than 2000 characters."}),f.jsx(lt,{})]}),f.jsx(EN,{fieldName:"agentValue",descriptionName:"agentName",personas:e,setEditPersona:w})]})}}):null,f.jsxs("div",{children:[f.jsx(ut,{control:m.control,name:"humanName",render:({field:C})=>f.jsxs(ot,{className:"space-y-1",children:[f.jsx(yt,{children:"Human Persona"}),f.jsxs(uN,{open:k,onOpenChange:x,children:[f.jsx(dN,{children:f.jsxs("div",{className:"flex gap-2",children:[f.jsx("span",{children:C.value??"Search or select"}),v?f.jsx("span",{className:"text-muted-foreground",children:"(Edited)"}):null]})}),f.jsx(fN,{children:f.jsxs(pN,{children:[f.jsx(gN,{placeholder:"Search human"}),f.jsx(mN,{children:"No Human Persona was found."}),f.jsx(hN,{children:t.map(_=>f.jsx(bN,{value:_.name||"",onSelect:R=>{const T=t.find(L=>L.name===R);C.onChange(R),m.setValue("humanValue",(T==null?void 0:T.value)||""),x(!1)},children:_.name},_.name))})]})})]}),f.jsx(lt,{})]})}),y==="human"?null:f.jsx(xN,{editPersona:"human",setEditPersona:w,personaValue:"humanName"})]}),y==="human"?f.jsxs(f.Fragment,{children:[f.jsx(ut,{control:m.control,name:"humanValue",render:({field:C})=>{var _;return f.jsxs(ot,{className:"space-y-1",children:[f.jsx(yt,{children:"Persona Description"}),f.jsx(pt,{children:f.jsx(Ai,{placeholder:"Describe your human here",charCount:(_=C.value)==null?void 0:_.length,limit:c,...C})}),f.jsx(Mt,{children:"You can use no more than 2000 characters."}),f.jsx(lt,{})]})}}),f.jsx(EN,{fieldName:"humanValue",descriptionName:"humanName",personas:t,setEditPersona:w})]}):null]}),f.jsxs("div",{className:"flex justify-between",children:[f.jsx(ue,{type:"button",variant:"ghost",onClick:()=>o(),children:"Cancel"}),f.jsxs("div",{className:"flex items-center",children:[s.isPending?f.jsxs("div",{className:Tt("mr-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Creating Agent..."})]}):null,f.jsx(ue,{type:"submit",children:"Create Agent"})]})]})]})})}const Die=({open:e,onOpenChange:t})=>{const{data:n}=w6(),{data:r}=Ng({label:Qr}),{data:a}=Ng({label:fr}),{data:o}=Xm(),[i,s]=p.useState(!1);return f.jsxs(Kt,{open:e,onOpenChange:t,children:[f.jsxs(Ht,{className:"h-full max-h-[95svh] w-full gap-8 sm:max-w-[800px]",hasCloseButton:!1,children:[f.jsxs("button",{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",onClick:()=>s(!0),children:[f.jsx(Di,{className:"h-4 w-4"}),f.jsx("span",{className:"sr-only",children:"Close"})]}),f.jsx(Pt,{children:f.jsx($t,{children:"Create Agent"})}),f.jsx("div",{className:"-mt-8 h-full overflow-y-auto p-1",children:f.jsx(Oie,{models:n||[],humans:a??[],personas:r??[],tools:o??[],closeDialog:()=>t(!1),openCancelCreateAgent:()=>s(!0)})})]}),f.jsx(lae,{open:i,onOpenChange:l=>s(l),closeDialog:()=>t(!1)})]})},Lie=()=>{const[e,t]=p.useState(!1);return f.jsxs(Fs,{className:"flex flex-col",children:[f.jsxs("div",{className:"flex items-center justify-between px-4",children:[f.jsx("h1",{className:"mb-4 flex pt-2 text-2xl font-bold",children:"Agents"}),f.jsx(ue,{icon:f.jsx(ya,{className:"h-4 w-4"}),onClick:()=>t(!0),size:"sm",children:"Create Agent"})]}),f.jsx(Ure,{className:"mx-4 h-full",setShowingAgentCreation:t}),f.jsx(Die,{open:e,onOpenChange:n=>t(n)})]})},Mie={path:"agents",element:f.jsx(Lie,{})},h9=ef("inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground hover:bg-primary/80",secondary:"border-transparent bg-background-darker hover:bg-secondary/80",destructive:"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",outline:"text-foreground"}},defaultVariants:{variant:"default"}});function b9({className:e,variant:t,...n}){return f.jsx("div",{className:ee(h9({variant:t}),e),...n})}const Pie=(e,t)=>e==="date"?vre(t):t,y9=rf(Vm(e=>({history:{},actions:{addMessage:(t,n)=>e(r=>({...r,history:{...r.history,[t]:[...r.history[t]??[],n]}})),replaceLastMessage:(t,n)=>e(r=>{const a=[...r.history[t]];return a.length>0&&(a[a.length-1]=n),{...r,history:{...r.history,[t]:a}}}),replaceMessageIds:(t,n,r)=>e(a=>{const o=a.history[t],i=[];for(const s of o)s.id===n&&(console.log("replacing old id",n,r),s.id=r),i.push(s);return{...a,history:{...a.history,[t]:i}}})}}),{name:"message-history-storage",storage:i_(()=>localStorage,{reviver:Pie}),partialize:({actions:e,...t})=>t})),$ie=e=>y9(t=>t.history[e]??[]),Fie=()=>y9(e=>e.actions);async function jie(e,t){const n=e.getReader();let r;for(;!(r=await n.read()).done;)t(r.value)}function zie(e){let t,n,r,a=!1;return function(i){t===void 0?(t=i,n=0,r=-1):t=Bie(t,i);const s=t.length;let l=0;for(;n0){const l=a.decode(i.subarray(0,s)),c=s+(i[s+1]===32?2:1),u=a.decode(i.subarray(c));switch(l){case"data":r.data=r.data?r.data+` +`+u:u;break;case"event":r.event=u;break;case"id":e(r.id=u);break;case"retry":const d=parseInt(u,10);isNaN(d)||t(r.retry=d);break}}}}function Bie(e,t){const n=new Uint8Array(e.length+t.length);return n.set(e),n.set(t,e.length),n}function kN(){return{data:"",event:"",id:"",retry:void 0}}var Hie=globalThis&&globalThis.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var a=0,r=Object.getOwnPropertySymbols(e);a{const m=Object.assign({},r);m.accept||(m.accept=Nk);let b;function y(){b.abort(),document.hidden||k()}l||document.addEventListener("visibilitychange",y);let w=Vie,v=0;function h(){document.removeEventListener("visibilitychange",y),window.clearTimeout(v),b.abort()}n==null||n.addEventListener("abort",()=>{h(),d()});const S=c??window.fetch,E=a??qie;async function k(){var x;b=new AbortController;try{const C=await S(e,Object.assign(Object.assign({},u),{headers:m,signal:b.signal}));await E(C),await jie(C.body,zie(Uie(_=>{_?m[CN]=_:delete m[CN]},_=>{w=_},o))),i==null||i(),h(),d()}catch(C){if(!b.signal.aborted)try{const _=(x=s==null?void 0:s(C))!==null&&x!==void 0?x:w;window.clearTimeout(v),v=window.setTimeout(k,_)}catch(_){h(),g(_)}}}k()})}function qie(e){const t=e.headers.get("content-type");if(!(t!=null&&t.startsWith(Nk)))throw new Error(`Expected content-type to be ${Nk}, Actual: ${t}`)}const S9="/v1";var En=[];for(var gy=0;gy<256;++gy)En.push((gy+256).toString(16).slice(1));function Gie(e,t=0){return(En[e[t+0]]+En[e[t+1]]+En[e[t+2]]+En[e[t+3]]+"-"+En[e[t+4]]+En[e[t+5]]+"-"+En[e[t+6]]+En[e[t+7]]+"-"+En[e[t+8]]+En[e[t+9]]+"-"+En[e[t+10]]+En[e[t+11]]+En[e[t+12]]+En[e[t+13]]+En[e[t+14]]+En[e[t+15]]).toLowerCase()}var dp,Wie=new Uint8Array(16);function Kie(){if(!dp&&(dp=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!dp))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return dp(Wie)}var Yie=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto);const _N={randomUUID:Yie};function Wu(e,t,n){if(_N.randomUUID&&!t&&!e)return _N.randomUUID();e=e||{};var r=e.random||(e.rng||Kie)();if(r[6]=r[6]&15|64,r[8]=r[8]&63|128,t){n=n||0;for(var a=0;a<16;++a)t[n+a]=r[a];return t}return Gie(r)}const Zie=rf(nY({socket:null,socketURL:null,readyState:0,abortController:null,onReplaceTemporaryIdsWithReturnedIdsCallback:(e,t)=>console.warn("no replace id callback set up."),onMessageCallback:e=>console.warn("No message callback set up. Simply logging message",e),onLastMessageReplaceCallback:e=>console.warn("No replace last message callback set up. Simply logging message",e)},(e,t)=>({actions:{sendMessage:({agentId:n,memoryName:r,message:a,role:o})=>{const i=new AbortController;e(E=>({...E,abortController:i,readyState:2}));const{onMessageCallback:s,onLastMessageReplaceCallback:l,onReplaceTemporaryIdsWithReturnedIdsCallback:c}=t(),u=()=>e(E=>({...E,readyState:0})),d=()=>e(E=>({...E,readyState:0})),g=()=>e(E=>({...E,readyState:1})),m=()=>e(E=>(i.abort(),{...E,abortController:null,readyState:3})),b={messages:[{role:o??"user",text:a,name:r}],stream_steps:!0,stream_tokens:!0};let y="",w="",v=Wu(),h=!1;const S=()=>{y="",w="",v=Wu()};return v9(`${S9}/agents/${n}/messages`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"text/event-stream",Authorization:"Bearer password"},body:JSON.stringify(b),signal:i.signal,onopen:async E=>{E.ok&&E.status===200?(console.log("Connection made ",E),g()):E.status>=400&&E.status<500&&E.status!==429&&(console.log("Client-side error ",E),m())},onmessage:async E=>{if(E.data==="[DONE]"||E.data==="[DONE_GEN]"||E.data==="[DONE_STEP]")return;const k=Xe({internal_monologue:Ce()}).or(Xe({function_call:Xe({name:Ce(),arguments:Ce()})})).or(Xe({function_call:Xe({name:Ce()})})).or(Xe({function_call:Xe({arguments:Ce()})})).or(Xe({function_return:Ce(),status:Ce(),id:Ce()})).or(Xe({function_return:Ce(),date:Ce(),status:Ce(),id:Ce()})).and(Xe({date:Ce().optional().transform(C=>C?new Date(C):new Date)})).safeParse(JSON.parse(E.data));if(!k.success){console.log("error",k.error.message,E.data),m();return}const x=k.data;if("internal_monologue"in x)y+=x.internal_monologue??"",y.length===0?s({type:"agent_response",message_type:"internal_monologue",message:"",date:x.date,id:v}):l({type:"agent_response",message_type:"internal_monologue",message:y,date:x.date,id:v});else if("function_call"in x){const C=x.function_call;"name"in C&&(C.name==="send_message"?(h=!0,s({type:"agent_response",message_type:"assistant_message",message:"",date:x.date,id:v})):(w+=C.name+"(",s({type:"agent_response",message_type:"function_call",message:"",date:x.date,id:v}))),"arguments"in C&&(w+=C.arguments.replace(/\\n/g,` `),l(h?{type:"agent_response",message_type:"assistant_message",message:w.startsWith(`{ "message": "`)?w.replace(`{ "message": "`,"").replace('"}',"").replace('",}',"").replace(`" -}`,""):"",date:x.date,id:v}:{type:"agent_response",message_type:"function_call",message:w.replace("}","})"),date:x.date,id:v}))}else"function_return"in x?(h=!1,console.error("replacing ids",v,x.id),c(v,x.id),console.log("a",x),s({type:"agent_response",message_type:"function_return",message:"None",date:x.date,id:x.id}),d(),S()):"internal_error"in x?(console.log("error",x),m()):console.log("not matched",x)},onclose(){console.log("Connection closed by the server"),S(),u()},onerror(E){console.log("There was an error from server",E),S(),m()}}),v},registerOnMessageCallback:n=>e(r=>({...r,onMessageCallback:n})),registerOnLastMessageReplaceCallback:n=>e(r=>({...r,onLastMessageReplaceCallback:n})),registerOnReplaceTemporaryIdsWithReturnedIdsCallback:n=>e(r=>({...r,onReplaceTemporaryIdsWithReturnedIdsCallback:n})),abortStream:()=>{var n;(n=t().abortController)==null||n.abort(),e({...e,abortController:null,readyState:0})}}}))),AN=()=>Zie(e=>e.actions),Xie="The user is back! Let's pick up the conversation! Reflect on the previous conversation and use your function calling to send them a friendly message.",wf=rf(Vm((e,t)=>({showingMessageReceipts:!1,showingInternalMonologue:!0,shouldSendAutoMessage:!1,autoMessage:Xie,showingFunctions:!0,actions:{setShouldSendAutoMessage:n=>e({...t(),shouldSendAutoMessage:n}),setAutoMessage:n=>e({...t(),autoMessage:n}),setShowingInternalMonologue:n=>e({...t(),showingInternalMonologue:n}),setShowingFunctions:n=>e({...t(),showingFunctions:n}),setShowingMessageReceipts:n=>e({...t(),showingMessageReceipts:n})}}),{name:"chat-storage",partialize:({actions:e,...t})=>t})),Qie=()=>wf(e=>e.showingMessageReceipts),S9=()=>wf(e=>e.showingInternalMonologue),w9=()=>wf(e=>e.showingFunctions),E9=()=>wf(e=>({shouldSendAutoMessage:e.shouldSendAutoMessage,autoMessage:e.autoMessage})),Jie=()=>wf(e=>e.actions),ese=iie,tse=sie,x9=p.forwardRef(({className:e,align:t="center",sideOffset:n=4,...r},a)=>f.jsx(lie,{children:f.jsx(u9,{ref:a,align:t,sideOffset:n,className:ee("z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...r})}));x9.displayName=u9.displayName;const k9="Switch",[nse,fTe]=zn(k9),[rse,ase]=nse(k9),ose=p.forwardRef((e,t)=>{const{__scopeSwitch:n,name:r,checked:a,defaultChecked:o,required:i,disabled:s,value:l="on",onCheckedChange:c,...u}=e,[d,g]=p.useState(null),m=nt(t,h=>g(h)),b=p.useRef(!1),y=d?!!d.closest("form"):!0,[w=!1,v]=Fa({prop:a,defaultProp:o,onChange:c});return p.createElement(rse,{scope:n,checked:w,disabled:s},p.createElement(ze.button,W({type:"button",role:"switch","aria-checked":w,"aria-required":i,"data-state":C9(w),"data-disabled":s?"":void 0,disabled:s,value:l},u,{ref:m,onClick:fe(e.onClick,h=>{v(S=>!S),y&&(b.current=h.isPropagationStopped(),b.current||h.stopPropagation())})})),y&&p.createElement(lse,{control:d,bubbles:!b.current,name:r,value:l,checked:w,required:i,disabled:s,style:{transform:"translateX(-100%)"}}))}),ise="SwitchThumb",sse=p.forwardRef((e,t)=>{const{__scopeSwitch:n,...r}=e,a=ase(ise,n);return p.createElement(ze.span,W({"data-state":C9(a.checked),"data-disabled":a.disabled?"":void 0},r,{ref:t}))}),lse=e=>{const{control:t,checked:n,bubbles:r=!0,...a}=e,o=p.useRef(null),i=F_(n),s=N_(t);return p.useEffect(()=>{const l=o.current,c=window.HTMLInputElement.prototype,d=Object.getOwnPropertyDescriptor(c,"checked").set;if(i!==n&&d){const g=new Event("click",{bubbles:r});d.call(l,n),l.dispatchEvent(g)}},[i,n,r]),p.createElement("input",W({type:"checkbox","aria-hidden":!0,defaultChecked:n},a,{tabIndex:-1,ref:o,style:{...e.style,...s,position:"absolute",pointerEvents:"none",opacity:0,margin:0}}))};function C9(e){return e?"checked":"unchecked"}const _9=ose,cse=sse,Kp=p.forwardRef(({className:e,...t},n)=>f.jsx(_9,{className:ee("peer inline-flex h-[24px] w-[44px] shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input",e),...t,ref:n,children:f.jsx(cse,{className:ee("pointer-events-none block h-5 w-5 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0")})}));Kp.displayName=_9.displayName;const use=()=>{const{autoMessage:e,shouldSendAutoMessage:t}=E9(),[n,r]=p.useState(e),[a,o]=p.useState("idle"),i=S9(),s=w9(),{setShowingInternalMonologue:l,setShowingFunctions:c,setAutoMessage:u,setShouldSendAutoMessage:d}=Jie(),g=()=>{o("updating"),setTimeout(()=>{u(n),o("success"),setTimeout(()=>o("idle"),600)},600)};return f.jsxs(ese,{children:[f.jsx(tse,{asChild:!0,children:f.jsx(ue,{size:"iconXs",className:"absolute right-3 top-2 z-10",variant:"outline",children:f.jsx(Fq,{className:"size-4"})})}),f.jsxs(x9,{align:"end",className:"w-80 space-y-4 rounded-md border bg-background p-4",children:[f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsx(os,{htmlFor:"internal-monologue",children:"Show Internal Monologue"}),f.jsx(Kp,{checked:i,onCheckedChange:m=>l(m),id:"internal-monologue"})]}),f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsx(os,{htmlFor:"showing-functions",children:"Show Functions"}),f.jsx(Kp,{checked:s,onCheckedChange:m=>c(m),id:"showing-functions"})]}),f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsx(os,{htmlFor:"should-send-auto-message",children:"Send Auto Message"}),f.jsx(Kp,{checked:t,onCheckedChange:m=>d(m),id:"should-send-auto-message"})]}),f.jsxs("div",{className:"flex flex-col space-y-2",children:[f.jsx(os,{htmlFor:"auto-message",children:"Auto Message"}),f.jsx(qs,{id:"auto-message",className:"min-h-[10rem] resize-none",value:n,onChange:m=>r(m.target.value)}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{disabled:a==="updating",onClick:g,className:"w-fit",variant:"outline",size:"xs",children:"Update Message"}),a!=="updating"?null:f.jsx("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "})}),a!=="success"?null:f.jsx("div",{className:Tt("ml-4 flex items-center text-emerald-600 animate-in slide-in-from-bottom-2"),children:f.jsx(Mm,{className:"mr-2 h-4 w-4 "})})]})]})]})]})},vh=({children:e,className:t})=>f.jsx("h4",{className:ee("text-sm font-medium uppercase text-foreground",t),children:e}),Sh=({children:e,className:t,button:n,onClickInfo:r})=>f.jsxs(vh,{className:ee("flex h-8 items-center justify-between",t),children:[f.jsxs("span",{className:"inline-flex items-center tabular-nums",children:[f.jsx("span",{children:e}),f.jsx(Nq,{className:"ml-1.5 size-3.5 text-muted-foreground",onClick:r})]}),n]}),rA=({onClick:e})=>f.jsx(ue,{onClick:e,size:"iconXs",variant:"outline",children:f.jsx(ya,{className:"size-4 text-foreground"})}),A9=({className:e,children:t,onClick:n})=>f.jsxs("div",{className:ee("flex items-center justify-between rounded-md border border-dashed p-2 text-sm font-normal text-muted-foreground",e),children:[f.jsx("span",{children:t}),f.jsx(ue,{onClick:n,size:"iconXs",variant:"outline",children:f.jsx(ya,{className:"size-4 text-foreground"})})]}),dse=Xe({message:Ce().min(1,"Message cannot be empty...")}),fse=e=>{const n=bn({resolver:yn(dse),defaultValues:{message:""}});function r(a){e.onCreateArchivalMemory(a.message)}return f.jsx(vn,{...n,children:f.jsxs("form",{onSubmit:n.handleSubmit(r),className:"mt-4",children:[f.jsx(ut,{control:n.control,name:"message",render:({field:a})=>{var o;return f.jsxs(ot,{className:"-mt-2 w-full",children:[f.jsx(yt,{className:"sr-only",children:"Memory to store"}),f.jsx(pt,{className:"w-full",children:f.jsx(Ai,{className:"min-h-40",placeholder:"What you want the agent to know about you",charCount:(o=a.value)==null?void 0:o.length,limit:2e3,...a})}),f.jsx(lt,{})]})}}),f.jsxs("div",{className:"flex items-center justify-between pt-8",children:[f.jsx(ue,{type:"button",onClick:e.onCancel,variant:"ghost",children:"Cancel"}),f.jsxs("div",{className:"flex gap-3",children:[e.isPending&&f.jsxs("div",{className:Tt("mr-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Saving memory..."})]}),f.jsx(ue,{disabled:e.isPending,type:"submit",children:"Save Memory"})]})]})]})})},pse=({agentId:e,open:t,onOpenChange:n})=>{const r=Bt(),a=dX(),o=i=>{a.mutate({agentId:e||"",requestBody:{text:i}},{onSuccess:()=>{n(!1),r.invalidateQueries({queryKey:m6({agentId:e||""})})}})};return f.jsx(Kt,{open:t,onOpenChange:n,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Add Memory"}),f.jsx(dn,{children:"Add a memory. Archival memory serves as an infinite, structured storage space for reflections, insights, and other data not fitting into core memory."})]}),f.jsx(fse,{isPending:a.isPending,onCreateArchivalMemory:o,onCancel:()=>n(!1)})]})})},gse=({memoryId:e,agentId:t,open:n,onOpenChange:r})=>{const a=Bt(),o=mX(),i=()=>o.mutate({agentId:t||"",memoryId:e},{onSuccess:()=>{a.invalidateQueries({queryKey:$s({agentId:t||""})}),r(!1)}});return f.jsx(Kt,{open:n,onOpenChange:r,children:f.jsxs(Ht,{className:"w-full sm:max-w-[350px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Delete Memory"}),f.jsx(dn,{className:"!my-4",children:"Are you sure you want to delete this memory?"})]}),f.jsxs(p8,{children:[f.jsx(ue,{size:"sm",type:"button",onClick:()=>r(!1),variant:"ghost",children:"Cancel"}),f.jsx(ue,{size:"sm",disabled:o.isPending,onClick:i,children:"Delete"})]})]})})},T9=({className:e,archivalMemory:t,agentId:n,isViewMemoryDialog:r})=>{const[a,o]=p.useState(!1),[i,s]=p.useState(!0),[l,c]=p.useState(!1),u=p.useRef(null),d=p.useRef(null);return p.useLayoutEffect(()=>{(()=>{if(u.current&&d.current){const m=u.current.scrollWidth>d.current.clientWidth;c(m)}})()},[t.text]),f.jsxs(f.Fragment,{children:[f.jsxs("div",{className:ee("relative w-full rounded-md border p-4 pr-10",e),children:[f.jsxs("div",{className:"flex-1",children:[f.jsx("div",{className:"mb-1 text-xs text-muted-foreground",children:"Jun 18 2024"}),f.jsx("div",{className:ee("break-words text-sm",i&&"truncate"),ref:d,children:f.jsx("p",{ref:u,className:ee(i?"w-min":"w-full",!r&&"inline"),children:t.text})})]}),f.jsx(ue,{className:"absolute right-2 top-2.5 text-muted-foreground",onClick:()=>o(!0),variant:"ghost",size:"iconXs",children:f.jsx(Di,{className:"size-4"})}),r&&l?f.jsx(ue,{className:"mt-2 h-7 w-fit p-0 font-semibold",variant:"link",onClick:()=>s(!i),children:i?f.jsxs(f.Fragment,{children:["more",f.jsx(YC,{className:"ml-2 h-4 w-4"})]}):f.jsxs(f.Fragment,{children:["less",f.jsx(wq,{className:"ml-2 h-4 w-4"})]})}):null]}),f.jsx(gse,{memoryId:t.id||"",agentId:n,open:a,onOpenChange:o})]})},mse=({setCurrentPage:e,className:t,currentPage:n,totalPages:r})=>f.jsx("div",{className:ee("flex items-center justify-end space-x-2",t),children:f.jsxs("div",{className:"space-x-2",children:[f.jsx(ue,{variant:"outline",size:"sm",onClick:()=>e(a=>Math.max(a-1,1)),disabled:n===1,children:"Previous"}),f.jsx(ue,{variant:"outline",size:"sm",onClick:()=>e(a=>Math.min(a+1,r)),disabled:n===r,children:"Next"})]})}),aA=({items:e,searchTerm:t,setSearchTerm:n,setShowSearchInput:r,showSearchInput:a,onOpenAddDialog:o,buttonText:i,isViewArchivalMemoryDialog:s,setShowFilterButton:l,showFilterButton:c})=>{const u=()=>{r(!a),l&&l(!1)},d=()=>{l&&l(!c),r(!1)};return f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsxs("div",{className:"flex h-8 w-full items-center justify-between",children:[f.jsxs("p",{className:"text-xs",children:[e?e==null?void 0:e.length:null," items"]}),f.jsxs("div",{className:"flex h-full gap-2",children:[f.jsxs("div",{className:"relative flex h-full items-center justify-end border-r-2",children:[a?f.jsx(_n,{placeholder:"Search",value:t,onChange:g=>n(g.target.value),className:"mr-2 h-8 w-32 pl-9 md:w-52"}):null,f.jsx("button",{className:ee("mr-2",a&&"absolute left-3 top-2"),onClick:()=>u(),children:f.jsx(Ms,{className:ee("h-4 w-4")})})]}),s?f.jsxs("div",{className:"flex h-full items-center justify-end gap-2 border-r-2",children:[c?f.jsx(ue,{className:"px-2 py-0",size:"sm",children:f.jsx("span",{className:"p-0 text-xs",children:"Oldest to newest"})}):null,f.jsx("button",{className:ee("mr-2 h-full p-0.5",c&&"bg-muted"),onClick:()=>d(),children:f.jsx(yq,{className:"h-4 w-4"})})]}):null]})]}),f.jsxs(ue,{variant:"ghost",onClick:()=>o(!0),children:[i,f.jsx(ya,{className:"ml-1 h-4 w-4"})]})]})},hse=({agentId:e,open:t,onOpenChange:n,onOpenAddMemory:r})=>{HF();const o=v6({agentId:e||""}).data??[],[i,s]=p.useState(!1),[l,c]=p.useState(!1),[u,d]=p.useState(""),g=(o??[]).filter(S=>S.text.toLowerCase().includes(u.toLowerCase())),[m,b]=p.useState(1),y=10,w=m*y,v=w-y,h=g.slice(v,w);return f.jsx(Kt,{open:t,onOpenChange:n,children:f.jsxs(Ht,{className:"flex max-h-[95svh] flex-col overflow-auto sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Archival Memory"}),f.jsx(dn,{children:"Archival memory serves as an infinite, structured storage space for reflections, insights, and other data not fitting into core memory."}),f.jsx(aA,{items:o,searchTerm:u,setSearchTerm:d,setShowSearchInput:s,showSearchInput:i,onOpenAddDialog:r,buttonText:"Add Memory",isViewArchivalMemoryDialog:!0,setShowFilterButton:c,showFilterButton:l})]}),f.jsx("div",{className:"flex w-full flex-col",children:h.map(S=>f.jsx(T9,{agentId:e,archivalMemory:S,className:"mb-2",isViewMemoryDialog:!0},S.id))}),f.jsx(mse,{currentPage:m,setCurrentPage:b,totalPages:Math.ceil(g.length/y)})]})})},bse=({agentId:e})=>{const t=v6({agentId:e??""},void 0,{enabled:!!e}),n=t.data??[],[r,a]=p.useState(!1),[o,i]=p.useState(!1),s=()=>a(!0);return f.jsxs(f.Fragment,{children:[f.jsxs("div",{className:"py-4",children:[f.jsxs(Sh,{button:n.length===0?null:f.jsx(rA,{onClick:()=>i(!0)}),children:["Archival Memory (",n.length,")"]}),t.isFetching?f.jsx(Pi,{className:"h-[70px]"}):null,t.isError?f.jsx("div",{className:"h-[70px] border border-destructive",children:"Something went wrong..."}):null,t.isSuccess?f.jsxs(f.Fragment,{children:[f.jsx("div",{className:"mt-2",children:[...n].slice(0,3).map(l=>f.jsx(T9,{className:"mb-2",archivalMemory:l,agentId:e},l.id))}),n.length<1?null:f.jsxs(ue,{onClick:s,className:"mt-2 h-7 w-fit p-2 font-semibold",variant:"link",children:["See all ",f.jsx($m,{className:"ml-2 h-4 w-4"})]}),n.length>0?null:f.jsx(A9,{onClick:()=>i(!0),children:"Nothing here yet. Add memory"})]}):null]}),f.jsx(hse,{agentId:e,open:r,onOpenChange:a,onOpenAddMemory:l=>i(l)}),f.jsx(pse,{agentId:e,open:o,onOpenChange:i})]})},yse=(e,t)=>e.length>t?e.substring(0,t)+"...":e;function vse(e,t){let n="Error adding data source...";const r=`${n}: Unspecified error.`;try{const a=JSON.parse(e.message);a.detail&&(a.detail=="None"?n=r:n=`${n}: ${a.detail}`)}catch{n=r}t({title:n,duration:5e3})}const R9=({source:e,handleRemoveDataSource:t})=>f.jsxs("div",{className:"relative rounded-md border p-4",children:[f.jsxs("p",{className:"flex items-center gap-1",children:[f.jsx("span",{className:"font-medium",children:e.name}),f.jsx("span",{className:"mt-0.5 text-xs text-muted-foreground",children:Bs(new Date(e.created_at||""),"MMM dd yyyy")})]}),f.jsx("p",{className:Tt(),children:(e==null?void 0:e.description)??"None"}),f.jsxs("button",{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",onClick:()=>t(e.id||""),children:[f.jsx(Di,{className:"h-4 w-4"}),f.jsx("span",{className:"sr-only",children:"Close"})]})]},e.id),Sse=Xe({sourceIds:nA(Ce())}),wse=({closeDialog:e})=>{const t=To(),n=Bt(),{data:r,isLoading:a}=h_(),{data:o}=y6({agentId:(t==null?void 0:t.id)||""}),i=E6(),[s,l]=p.useState(!1),{toast:c}=An(),u=r??[],d=bn({resolver:yn(Sse),mode:"onSubmit",defaultValues:{sourceIds:[]}}),g=async v=>{if(!(t!=null&&t.id))return;l(!0);const h=[];for(const S of v.sourceIds)try{const E=await i.mutateAsync({agentId:t.id,sourceId:S},{onSuccess:()=>{n.invalidateQueries({queryKey:g6({agentId:t.id||""})}),c({title:"Data source added successfully!",duration:5e3})}});h.push(E)}catch(E){vse(E,c)}h.length>0&&c({title:"Data source added successfully!",duration:5e3}),l(!1),e()},m=d.watch("sourceIds"),b=p.useMemo(()=>{if(!u)return[];const v=new Set(m),h=new Set((o||[]).map(S=>S.id));return u.filter(S=>!v.has(S.id||"")&&!h.has(S.id))},[r,u,m]),y=v=>{m.some(h=>h===v)||d.setValue("sourceIds",[...m,v])},w=v=>{d.setValue("sourceIds",m.filter(h=>h!==v))};return f.jsx(vn,{...d,children:f.jsxs("form",{onSubmit:d.handleSubmit(g,v=>console.log(v)),className:"space-y-8",children:[f.jsx(ut,{control:d.control,name:"sourceIds",render:()=>f.jsxs(ot,{children:[f.jsxs(So,{disabled:a,value:"",onValueChange:v=>y(v),children:[f.jsx(pt,{children:f.jsx(za,{children:f.jsx(wo,{placeholder:a?"Loading data sources...":"Search or select data source"})})}),f.jsx(Ua,{className:"max-h-[200px] overflow-y-auto",children:(b==null?void 0:b.length)===0?f.jsx(Fn,{value:"no-sources",disabled:!0,children:"No additional data sources available"}):b.map(v=>f.jsx(Fn,{value:v.id||"",children:v.name},v.id))})]}),f.jsx(lt,{})]})}),f.jsx("div",{className:"space-y-2",children:d.watch("sourceIds")?u.filter(v=>d.getValues("sourceIds").some(h=>h===v.id)).map(v=>f.jsx(R9,{handleRemoveDataSource:w,source:v},v.id)):null}),f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsx(ue,{variant:"ghost",type:"button",onClick:()=>e(),children:"Cancel"}),f.jsxs("div",{className:"flex gap-3",children:[s&&f.jsxs("div",{className:Tt("mr-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Attaching to agent..."})]}),f.jsx(ue,{type:"submit",children:"Add Source"})]})]})]})})},Ese=({open:e,onOpenChange:t})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Add Data Source"}),f.jsx(dn,{children:"By adding a data source, you will make it available to the Agent to use for information."})]}),f.jsx(wse,{closeDialog:()=>t(!1)})]})}),xse=({onDetach:e,onOpenAddSourceChange:t})=>{const n=[],[r,a]=p.useState(!1),[o,i]=p.useState(""),s=(n??[]).filter(l=>l.name.toLowerCase().includes(o.toLowerCase()));return f.jsxs(f.Fragment,{children:[f.jsx(aA,{items:n,searchTerm:o,setSearchTerm:i,setShowSearchInput:a,showSearchInput:r,onOpenAddDialog:t,buttonText:"Add Source"}),f.jsx("div",{className:"space-y-2",children:n?s.map(l=>f.jsx(R9,{handleRemoveDataSource:e,source:l},l.id)):null})]})},kse=({open:e,onOpenChange:t,onDetach:n,onOpenAddSourceChange:r})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Data Sources"}),f.jsx(dn,{children:"Data sources make it available to the Agent to use for information outside of the immediate context window."})]}),f.jsx(xse,{onDetach:n,onOpenAddSourceChange:r})]})}),Cse=()=>{const[e,t]=p.useState(!1),[n,r]=p.useState(!1),a=To(),{data:o}=y6({agentId:(a==null?void 0:a.id)||""}),i=p.useMemo(()=>o??[],[o]),s=x6(),{toast:l}=An(),c=u=>{!u||!a||s.mutate({agentId:a.id||"",sourceId:u},{onSuccess:()=>{l({title:"Agent detached successfully!",duration:3e3})},onError:d=>l({title:"Failed to detach agent!",duration:3e3})})};return f.jsxs("div",{className:"py-4",children:[f.jsxs(Sh,{button:i.length===0?null:f.jsx(rA,{onClick:()=>t(!0)}),onClickInfo:()=>r(!0),children:["Data Sources (",i.length,")"]}),f.jsx("ul",{className:"mt-2 space-y-2",children:i.map(u=>f.jsxs("li",{className:"rounded-md border p-4",children:[f.jsx("div",{className:"relative flex justify-between",children:f.jsxs("p",{className:"flex items-center gap-2",children:[f.jsx("span",{className:"font-medium",children:u.name}),f.jsx("span",{className:"text-xs",children:Bs(new Date(u.created_at||""),"MMM dd yyyy")})]})}),f.jsx("p",{className:Tt(),children:yse((u==null?void 0:u.description)??"None",42)})]},u.id))}),i.length>0?null:f.jsx(A9,{onClick:()=>t(!0),children:"Nothing here yet. Add source"}),f.jsx(Ese,{open:e,onOpenChange:u=>t(u)}),f.jsx(kse,{open:n,onOpenChange:u=>r(u),onDetach:c,onOpenAddSourceChange:u=>t(u)})]})},_se="AlertDialog",[Ase,pTe]=zn(_se,[o8]),Ro=o8(),Tse=e=>{const{__scopeAlertDialog:t,...n}=e,r=Ro(t);return p.createElement(u8,W({},r,n,{modal:!0}))},Rse=p.forwardRef((e,t)=>{const{__scopeAlertDialog:n,...r}=e,a=Ro(n);return p.createElement(iae,W({},a,r,{ref:t}))}),Nse=e=>{const{__scopeAlertDialog:t,...n}=e,r=Ro(t);return p.createElement(d8,W({},r,n))},Ise=p.forwardRef((e,t)=>{const{__scopeAlertDialog:n,...r}=e,a=Ro(n);return p.createElement(H_,W({},a,r,{ref:t}))}),N9="AlertDialogContent",[Ose,Dse]=Ase(N9),Lse=p.forwardRef((e,t)=>{const{__scopeAlertDialog:n,children:r,...a}=e,o=Ro(n),i=p.useRef(null),s=nt(t,i),l=p.useRef(null);return p.createElement(oae,{contentName:N9,titleName:Mse,docsSlug:"alert-dialog"},p.createElement(Ose,{scope:n,cancelRef:l},p.createElement(V_,W({role:"alertdialog"},o,a,{ref:s,onOpenAutoFocus:fe(a.onOpenAutoFocus,c=>{var u;c.preventDefault(),(u=l.current)===null||u===void 0||u.focus({preventScroll:!0})}),onPointerDownOutside:c=>c.preventDefault(),onInteractOutside:c=>c.preventDefault()}),p.createElement(Rm,null,r),!1)))}),Mse="AlertDialogTitle",Pse=p.forwardRef((e,t)=>{const{__scopeAlertDialog:n,...r}=e,a=Ro(n);return p.createElement(q_,W({},a,r,{ref:t}))}),$se=p.forwardRef((e,t)=>{const{__scopeAlertDialog:n,...r}=e,a=Ro(n);return p.createElement(G_,W({},a,r,{ref:t}))}),Fse=p.forwardRef((e,t)=>{const{__scopeAlertDialog:n,...r}=e,a=Ro(n);return p.createElement(W_,W({},a,r,{ref:t}))}),jse="AlertDialogCancel",zse=p.forwardRef((e,t)=>{const{__scopeAlertDialog:n,...r}=e,{cancelRef:a}=Dse(jse,n),o=Ro(n),i=nt(t,a);return p.createElement(W_,W({},o,r,{ref:i}))}),Use=Tse,Bse=Rse,Hse=Nse,I9=Ise,O9=Lse,D9=Fse,L9=zse,M9=Pse,P9=$se,Vse=Use,qse=Bse,Gse=Hse,$9=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(I9,{className:ee("fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",e),...n,ref:r}));$9.displayName=I9.displayName;const F9=p.forwardRef(({className:e,...t},n)=>f.jsxs(Gse,{children:[f.jsx($9,{}),f.jsx(O9,{ref:n,className:ee("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg md:w-full",e),...t})]}));F9.displayName=O9.displayName;const j9=({className:e,...t})=>f.jsx("div",{className:ee("flex flex-col space-y-2 text-center sm:text-left",e),...t});j9.displayName="AlertDialogHeader";const z9=({className:e,...t})=>f.jsx("div",{className:ee("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",e),...t});z9.displayName="AlertDialogFooter";const U9=p.forwardRef(({className:e,...t},n)=>f.jsx(M9,{ref:n,className:ee("text-lg font-semibold",e),...t}));U9.displayName=M9.displayName;const B9=p.forwardRef(({className:e,...t},n)=>f.jsx(P9,{ref:n,className:ee("text-sm text-muted-foreground",e),...t}));B9.displayName=P9.displayName;const H9=p.forwardRef(({className:e,variant:t,...n},r)=>f.jsx(D9,{ref:r,className:ee(yc({variant:t}),e),...n}));H9.displayName=D9.displayName;const V9=p.forwardRef(({className:e,...t},n)=>f.jsx(L9,{ref:n,className:ee(yc({variant:"outline"}),"mt-2 sm:mt-0",e),...t}));V9.displayName=L9.displayName;const Wse=()=>{const e=To(),{mutate:t,isPending:n}=gX(),{toast:r}=An(),a=Mi(),o=p.useCallback(()=>{e&&t({agentId:e.id||""},{onSuccess:()=>{r({title:"Agent deleted successfully",duration:500}),a("/agents")},onError:()=>{r({title:"There was an error deleting the agent, please try again",duration:5e3})}})},[e==null?void 0:e.id,a,t]);return f.jsxs(Vse,{children:[f.jsx(qse,{asChild:!0,children:f.jsx(ue,{variant:"destructive",children:"Delete Agent"})}),f.jsxs(F9,{children:[f.jsxs(j9,{children:[f.jsx(U9,{children:"Delete Agent"}),f.jsx(B9,{children:"When you delete an agent, all the information and interaction will be lost. Are you sure you want to delete the agent"})]}),f.jsxs(z9,{children:[f.jsx(V9,{children:"Cancel"}),f.jsx(H9,{onClick:o,variant:"destructive",children:f.jsxs(f.Fragment,{children:[n&&f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),"Delete Agent"]})})]})]})]})},Kse=()=>f.jsxs("div",{className:"flex flex-col gap-2 pb-10 pt-4",children:[f.jsx(vh,{children:"Delete Agent"}),f.jsx("p",{className:" text-sm text-muted-foreground",children:"When you delete an agent, all the information and interaction will be lost."}),f.jsx(Wse,{})]}),Yse={configItem:e=>["config",e]},Zse=e=>{const t=_Z();return Jr({queryKey:Yse.configItem(e),enabled:!!e,queryFn:async()=>t.get("/config").then(n=>n.data)})},q9=({icon:e,name:t,isEditing:n,onEditPersonaClicked:r})=>f.jsxs("div",{className:"flex items-center justify-between py-4",children:[f.jsxs("div",{className:"flex items-center font-medium",children:[e,f.jsx("span",{children:t})]}),n?null:f.jsxs(ue,{onClick:r,variant:"ghost",size:"xs",children:["Edit Persona ",f.jsx(ZC,{className:"ml-2 size-4"})]})]}),G9=({renderContent:e,state:t,onClose:n})=>{const r=p.useRef("closed"),a=t==="edit"||t==="closed"&&r.current==="edit";return p.useEffect(()=>{r.current=t},[t]),f.jsx(Kt,{open:t==="view"||t==="edit",onOpenChange:o=>{o||n()},children:f.jsx(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:e(a)})})},W9=({status:e,limit:t,defaultContent:n,onCancelClicked:r,onSaveClicked:a})=>{const[o,i]=p.useState(n);return f.jsxs(f.Fragment,{children:[f.jsxs(os,{children:["Persona Description",f.jsx(Ai,{charCount:(o==null?void 0:o.length)??0,limit:t,onChange:s=>i(s.target.value),className:"min-h-[60vh] whitespace-pre-line font-normal",defaultValue:o})]}),f.jsxs("div",{className:"flex items-center justify-between pt-8",children:[f.jsx(ue,{onClick:()=>r(),variant:"ghost",children:"Cancel"}),f.jsxs("div",{className:"flex items-center",children:[e!=="pending"?null:f.jsxs("div",{className:Tt("mr-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Updating persona..."})]}),e!=="success"?null:f.jsxs("div",{className:Tt("mr-4 flex items-center text-emerald-600 animate-in slide-in-from-bottom-2"),children:[f.jsx(Mm,{className:"mr-2 h-4 w-4 "}),f.jsx("span",{children:"Persona updated!"})]}),f.jsx(ue,{onClick:()=>a(o),children:"Save"})]})]})]})},Xse=({name:e,state:t,onClose:n,onSaveEditPersonaClicked:r,onEditPersonaClicked:a,onCancelEditPersonaClicked:o,status:i,content:s})=>{Zse(HF());const l=2e3;return f.jsx(G9,{name:e,state:t,onClose:n,renderContent:c=>f.jsxs(f.Fragment,{children:[f.jsxs(Pt,{children:[f.jsx($t,{children:c?"Edit Agent Persona":"Agent Persona"}),f.jsx(dn,{children:c?"You can edit your personas memory. This won’t affect the persona original template. Any changes will be saved as new core memories.":"This information stores details about the agent's persona, guiding its behaviour and responses to maintain consistency and personality in interactions."})]}),f.jsxs("div",{className:c?"":"mb-8",children:[f.jsx(q9,{name:e,icon:f.jsx(Lm,{className:"mr-2 size-6"}),isEditing:c,onEditPersonaClicked:a}),c?null:f.jsx("p",{className:"whitespace-pre-line",children:s}),c?f.jsx(W9,{status:i,defaultContent:s,limit:l,onCancelClicked:o,onSaveClicked:r}):null]})]})})},Qse=({name:e,state:t,onClose:n,content:r,onCancelEditPersonaClicked:a,onEditPersonaClicked:o,onSaveEditPersonaClicked:i,status:s})=>f.jsx(G9,{name:e,state:t,onClose:n,renderContent:l=>f.jsxs(f.Fragment,{children:[f.jsxs(Pt,{children:[f.jsx($t,{children:l?"Edit Human Persona":"Human Persona"}),f.jsx(dn,{children:l?"You can edit your personas memory. This won’t affect the persona original template. Any changes will be saved as new core memories":"Stores key details about the person the agent is conversing with, enabling personalised and friend-like conversations"})]}),f.jsxs("div",{className:l?"":"mb-8",children:[f.jsx(q9,{name:e,icon:f.jsx(XC,{className:"mr-2 size-6"}),isEditing:l,onEditPersonaClicked:o}),l?null:f.jsx("p",{className:"whitespace-pre-line",children:r}),l?f.jsx(W9,{status:s,defaultContent:r,limit:2e3,onCancelClicked:a,onSaveClicked:i}):null]})]})}),TN=({className:e,title:t,name:n,content:r,onEditClick:a,onMoreClick:o,icon:i})=>f.jsxs("div",{className:ee("rounded-md border p-3",e),children:[f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsxs("div",{className:"flex items-center font-semibold",children:[i,f.jsx("span",{children:t})]}),f.jsx(ue,{onClick:a,size:"iconXs",variant:"ghost",children:f.jsx(ZC,{className:"h-4 w-4 text-muted-foreground"})})]}),f.jsxs("div",{className:"flex flex-col gap-2 pl-7",children:[f.jsx("p",{className:"mt-2 text-xs text-muted-foreground/60",children:n}),f.jsxs("p",{className:"relative h-[78px] overflow-hidden text-ellipsis text-sm text-muted-foreground",children:[r,f.jsx("span",{className:"absolute bottom-0 right-0 h-5 w-10 bg-gradient-to-r from-transparent to-background to-55%"})]}),f.jsxs(ue,{onClick:o,className:"-ml-2 h-7 w-fit p-2 font-semibold",variant:"link",children:["more ",f.jsx($m,{className:"ml-2 h-4 w-4"})]})]})]}),Jse=({agentId:e})=>{const t=y_(),{data:n,refetch:r,isRefetching:a}=b_({agentId:e||""}),{mutate:o}=cf(),i=Bt(),s=p.useMemo(()=>{var b,y;return(y=(b=n==null?void 0:n.memory)==null?void 0:b.memory)==null?void 0:y[fr]},[n]),l=p.useMemo(()=>{var b,y;return(y=(b=n==null?void 0:n.memory)==null?void 0:b.memory)==null?void 0:y[Qr]},[n]),[c,u]=p.useState("closed"),[d,g]=p.useState("closed"),m=b=>y=>{var w,v,h;!l||!e||o({agentId:e,requestBody:{id:e,memory:{...n==null?void 0:n.memory,memory:{...(w=n==null?void 0:n.memory)==null?void 0:w.memory,[b]:{...(h=(v=n==null?void 0:n.memory)==null?void 0:v.memory)==null?void 0:h[b],value:y}}}}},{onSuccess:()=>{i.invalidateQueries({queryKey:$s({agentId:e})})}})};return f.jsxs("div",{className:"pb-6 pt-4",children:[f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsx(Sh,{children:"Core Memory"}),f.jsx(ue,{onClick:b=>{b.stopPropagation(),r()},disabled:a,variant:"outline",className:"z-10 h-7 w-7 p-0",children:f.jsx(Lq,{className:"size-5 "+(a?"animate-spin":"")})})]}),!l||!s?f.jsx("p",{className:"flex items-center justify-center p-20",children:"Loading memory..."}):f.jsxs(f.Fragment,{children:[f.jsx(TN,{className:"mt-2",title:"Agent Persona",name:l.name||"",content:l.value,onMoreClick:()=>u("view"),onEditClick:()=>u("edit"),icon:f.jsx(Lm,{className:"mr-2 h-5 w-5"})}),f.jsx(TN,{className:"my-4",title:"Human Persona",name:s.name||"",content:s.value,onMoreClick:()=>g("view"),onEditClick:()=>g("edit"),icon:f.jsx(XC,{className:"mr-2 h-5 w-5"})}),f.jsx(Xse,{status:t.status,content:l.value||"",name:l.name||"",onClose:()=>u("closed"),state:c,onEditPersonaClicked:()=>u("edit"),onCancelEditPersonaClicked:()=>u("closed"),onSaveEditPersonaClicked:m(Qr)}),f.jsx(Qse,{status:t.status,content:s.value||"",name:s.name||"",onClose:()=>g("closed"),state:d,onEditPersonaClicked:()=>g("edit"),onCancelEditPersonaClicked:()=>g("closed"),onSaveEditPersonaClicked:m(fr)})]})]})},ele=(e,t)=>{var a,o;const n=(a=e.tags)==null?void 0:a.includes("memgpt-base"),r=(o=t.tags)==null?void 0:o.includes("memgpt-base");return n&&r?e.name.localeCompare(t.name):n?-1:1},to="-ml-1 mr-2 size-5",tle={archival_memory_insert:f.jsx(bq,{className:to}),archival_memory_search:f.jsx(Oq,{className:to}),conversation_search:f.jsx(Ms,{className:to}),conversation_search_date:f.jsx(vq,{className:to}),core_memory_append:f.jsx(ya,{className:to}),core_memory_replace:f.jsx(Mq,{className:to}),pause_heartbeats:f.jsx(Tq,{className:to}),send_message:f.jsx($q,{className:to})},oA=({tool:e,showDescription:t,isAddModal:n,onClick:r})=>{var o,i;const a=n??!e.tags.some(s=>s==="memgpt-base");return f.jsxs("div",{className:"rounded-md border px-4 py-2",children:[f.jsxs("div",{className:"flex items-end justify-between",children:[f.jsxs("span",{className:"inline-flex items-center text-sm font-semibold",children:[tle[e.name]??f.jsx(Rq,{className:to})," ",e.name.replace(/_/g," ").replace(/\w\S*/g,s=>s.charAt(0).toUpperCase()+s.substring(1).toLowerCase())]}),a?f.jsx(ue,{variant:"ghost",size:"iconXs",type:"button",onClick:r,children:f.jsx(Di,{className:"size-4"})}):f.jsx("div",{className:"h-7"})]}),f.jsxs("div",{className:"mt-1 flex items-center justify-between",children:[f.jsx("span",{className:"ml-6 text-xs text-muted-foreground",children:e.name}),f.jsx(h9,{variant:"secondary",className:"text-muted-foreground",children:(o=e.tags[0])==null?void 0:o.replace("memgpt-","")})]}),t?f.jsx("div",{className:"mt-2",children:f.jsx("p",{className:"text-sm text-muted-foreground",children:JSON.stringify((i=e==null?void 0:e.json_schema)==null?void 0:i.description)||""})}):null]})},K9=()=>{const e=To();return b_({agentId:(e==null?void 0:e.id)||""},void 0,{initialData:e,enabled:!!e})},nle=Xe({toolIds:nA(Ce())}),rle=({closeDialog:e})=>{const{data:t}=K9(),{data:n,isLoading:r}=Xm(),{mutate:a,isPending:o}=cf(),i=Bt(),s=p.useMemo(()=>new Set(t==null?void 0:t.tools),[t]),l=p.useMemo(()=>(n||[]).filter(v=>!s.has(v.name)),[n]),c=To(),u=(c==null?void 0:c.tools)??[],d=bn({resolver:yn(nle),mode:"onSubmit",defaultValues:{toolIds:[]}}),g=async v=>{v.toolIds.length&&c!=null&&c.id&&a({agentId:c.id,requestBody:{id:c.id,tools:Array.from(new Set([...Array.from(s),...v.toolIds]))}},{onSuccess:()=>{i.invalidateQueries({queryKey:$s({agentId:c.id||""})}),e()}})},m=l.filter(v=>!u.some(h=>h===v.id)),b=d.watch("toolIds"),y=v=>{b.some(h=>h===v)||d.setValue("toolIds",[...b,v])},w=v=>{d.setValue("toolIds",b.filter(h=>h!==v))};return f.jsx(vn,{...d,children:f.jsxs("form",{onSubmit:d.handleSubmit(g,v=>console.log(v)),className:"space-y-8",children:[f.jsx(ut,{control:d.control,name:"toolIds",render:({field:v})=>f.jsxs(ot,{children:[f.jsxs(So,{disabled:r,onValueChange:h=>y(h),children:[f.jsx(pt,{children:f.jsx(za,{children:f.jsx(wo,{placeholder:r?"Loading tools...":"Search or select tools"})})}),f.jsx(Ua,{className:"max-h-[200px] overflow-y-auto",children:(m??[]).map(h=>f.jsx(Fn,{value:h.name,children:h.name},h.id))})]}),f.jsx(lt,{})]})}),f.jsx("div",{className:"space-y-2",children:d.watch("toolIds")?l.filter(v=>d.getValues("toolIds").some(h=>h===v.id)).map(v=>f.jsx(oA,{tool:v,showDescription:!0,isAddModal:!0,onClick:()=>w(v.id||"")},v.id)):null}),f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsx(ue,{variant:"ghost",type:"button",onClick:()=>e(),children:"Cancel"}),f.jsxs("div",{className:"flex gap-3",children:[o&&f.jsxs("div",{className:Tt("mr-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Adding tool to agent..."})]}),f.jsx(ue,{type:"submit",children:"Add Tool"})]})]})]})})},ale=({open:e,onOpenChange:t})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsx(Pt,{children:f.jsx($t,{children:"Add Tool"})}),f.jsx(rle,{closeDialog:()=>t(!1)})]})}),ole=({toolId:e,onClose:t})=>{const{mutate:n,isPending:r}=cf(),{data:a}=K9(),o=Bt(),i=p.useMemo(()=>new Set(a==null?void 0:a.tools),[a]),s=()=>{!e||!(a!=null&&a.id)||n({agentId:a.id,requestBody:{id:a.id,tools:Array.from(i).filter(l=>l!==e)}},{onSuccess:()=>{o.invalidateQueries({queryKey:$s({agentId:a.id||""})}),t()}})};return f.jsx(Kt,{open:!0,onOpenChange:()=>{t()},children:f.jsxs(Ht,{className:"max-h-[95svh] w-full max-w-80 overflow-auto",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Remove Tool"}),f.jsx(dn,{children:"Are you sure you want to remove this Tool? This is a base Agent tool, removing it might result in problems in hove the Agent functions."})]}),f.jsxs("div",{className:"flex justify-end gap-4",children:[f.jsx(ue,{type:"button",variant:"ghost",onClick:()=>t(),children:"Cancel"}),f.jsx(ue,{isBusy:r,onClick:s,children:"Remove"})]})]})})},ile=({open:e,onOpenChange:t,onOpenAddToolsChange:n,tools:r,onRemoveTool:a})=>{const[o,i]=p.useState(!1),[s,l]=p.useState(""),c=(r??[]).filter(u=>{var d;return(d=u.name)==null?void 0:d.toLowerCase().includes(s.toLowerCase())});return f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full overflow-auto sm:max-w-[800px]",children:[f.jsx(Pt,{children:f.jsx($t,{children:"Tools"})}),f.jsx(aA,{items:r,searchTerm:s,setSearchTerm:l,setShowSearchInput:i,showSearchInput:o,onOpenAddDialog:n,buttonText:"Add Tool"}),c==null?void 0:c.map(u=>f.jsx(oA,{tool:u,showDescription:!0,onClick:()=>a(u.name||"")},u.id))]})})},sle=({tools:e})=>{const[t,n]=p.useState(!1),[r,a]=p.useState(!1),[o,i]=p.useState(null),{data:s}=Xm(),l=p.useMemo(()=>(s==null?void 0:s.filter(u=>e.find(d=>d===u.name)))||[],[s,e]),c=(s||[]).length>l.length;return f.jsxs(f.Fragment,{children:[f.jsxs("div",{className:"py-4",children:[f.jsxs(Sh,{button:c?f.jsx(rA,{onClick:()=>n(!0)}):null,children:["Tools (",e.length,")"]}),f.jsx("div",{className:"mt-2 space-y-2",children:l.sort(ele).slice(0,3).map(u=>f.jsx(oA,{tool:u,onClick:()=>i(u.name||"")},u.id))}),e.length<3?null:f.jsxs(ue,{onClick:()=>a(!0),className:"mt-2 h-7 w-fit p-2 font-semibold",variant:"link",children:["See all ",f.jsx($m,{className:"ml-2 h-4 w-4"})]})]}),f.jsx(ile,{onOpenChange:u=>a(u),open:r,onOpenAddToolsChange:u=>n(u),tools:l,onRemoveTool:u=>i(u)}),f.jsx(ale,{onOpenChange:n,open:t}),o&&f.jsx(ole,{onClose:()=>i(null),toolId:o})]})};function lle(e){const{agent:t}=e,[n,r]=p.useState(!1),{data:a}=S6(),{mutate:o}=cf(),i=Bt(),s=p.useCallback(l=>{if(!t.id)return;const c=a==null?void 0:a.find(u=>u.model===l);c&&o({agentId:t.id,requestBody:{llm_config:c,id:t.id}},{onSuccess:()=>{i.setQueriesData({queryKey:$s({agentId:t.id||""})},u=>{if(u)return{...u,llm_config:c}})}})},[t.id,o,i]);return f.jsx("div",{className:"pb-6 pt-4",children:f.jsxs("div",{className:"h-[35px] flex flex-col justify-between",children:[f.jsx(vh,{children:"Model"}),n?f.jsxs("div",{className:"flex items-center gap-2",children:[f.jsxs(So,{value:t.llm_config.model,onValueChange:s,children:[f.jsx(za,{children:f.jsx(wo,{placeholder:"Select a model"})}),f.jsx(Ua,{children:a?a.map(l=>f.jsx(Fn,{value:l.model,children:l.model},l.model)):f.jsx(Fn,{value:"loading",disabled:!0,children:"Loading..."})})]}),f.jsxs("button",{onClick:()=>r(!1),className:"h-7 w-7 p-0",children:[f.jsx(Di,{})," ",f.jsx("div",{className:"sr-only",children:"Close"})," "]})]}):f.jsxs("div",{onClick:()=>r(!0),className:"flex cursor-pointer items-center gap-2 text-sm",children:[t.llm_config.model," ",f.jsx(Q4,{className:"w-4"}),f.jsx("div",{className:"sr-only",children:"Edit"})]})]})})}function cle(e){const{agent:t}=e,{data:n}=w6(),[r,a]=p.useState(!1),{mutate:o}=cf(),i=Bt(),s=p.useCallback(l=>{if(!n||!t.id)return;const c=n.find(u=>u.embedding_model===l);c&&o({agentId:t.id,requestBody:{embedding_config:c,id:t.id}},{onSuccess:()=>{i.setQueriesData({queryKey:$s({agentId:t.id||""})},u=>{if(u)return{...u,embedding_config:c}})}})},[t.id,n,o,i]);return f.jsx("div",{className:"pb-6 pt-4",children:f.jsxs("div",{className:"h-[35px] flex w-full flex-col items-start justify-start",children:[f.jsx(vh,{children:"Embedding Model"}),r?f.jsxs("div",{className:"flex w-full items-center gap-2",children:[f.jsxs(So,{value:t.embedding_config.embedding_model,onValueChange:s,children:[f.jsx(za,{className:"w-full",children:f.jsx(wo,{placeholder:"Select an embedding model"})}),f.jsx(Ua,{children:n?n.map(l=>f.jsx(Fn,{value:l.embedding_model,children:l.embedding_model},l.embedding_model)):f.jsx(Fn,{value:"loading",disabled:!0,children:"Loading..."})})]}),f.jsxs("button",{onClick:()=>a(!1),className:"h-7 w-7 p-0",children:[f.jsx(Di,{})," ",f.jsx("div",{className:"sr-only",children:"Close"})," "]})]}):f.jsxs("div",{onClick:()=>a(!0),className:"flex cursor-pointer items-center gap-2 text-sm",children:[t.embedding_config.embedding_model," ",f.jsx(Q4,{className:"w-4"}),f.jsx("div",{className:"sr-only",children:"Edit"})]})]})})}const ule=({currentAgentId:e})=>{const t=To(),{data:n}=b_({agentId:(t==null?void 0:t.id)||""},void 0,{initialData:t,enabled:!!t});return f.jsxs("div",{className:"w-96 flex-none overflow-auto px-4",children:[n&&f.jsx(lle,{agent:n}),n&&f.jsx(cle,{agent:n}),f.jsx(Jse,{agentId:e}),f.jsx(bse,{agentId:e}),f.jsx(Cse,{}),f.jsx(sle,{tools:(n==null?void 0:n.tools)??[]}),f.jsx(Kse,{})]})},RN={user:6,"internal-monologue":5,assistant:4,"function-call":3,"message-receipt":2,error:1,login:0},dle=(e,t)=>e.sort((n,r)=>{const a=n.date.toISOString().localeCompare(r.date.toISOString());return a!==0?a:RN[r.type]-RN[n.type]}).filter(n=>!!n.message),fle=()=>{const e=p.useRef(null),t=p.useRef(null),n=p.useRef(null),[r,a]=p.useState(!0),[o,i]=p.useState(!1),s=p.useCallback(()=>{e.current&&e.current.scrollIntoView({block:"end",behavior:"smooth"})},[]);return p.useEffect(()=>{e.current&&r&&!o&&e.current.scrollIntoView({block:"end"})},[r,o]),p.useEffect(()=>{const{current:l}=t;if(l){const c=u=>{const d=u.target,g=25,m=d.scrollTop+d.clientHeight>=d.scrollHeight-g;a(m)};return l.addEventListener("scroll",c,{passive:!0}),()=>{l.removeEventListener("scroll",c)}}},[]),p.useEffect(()=>{if(n.current){const l=new IntersectionObserver(c=>{c.forEach(u=>{u.isIntersecting?i(!0):i(!1)})},{rootMargin:"0px 0px 100px 0px"});return l.observe(n.current),()=>{l.disconnect()}}}),{messagesRef:e,scrollRef:t,visibilityRef:n,scrollToBottom:s,isAtBottom:r,isVisible:o}},ple=({children:e})=>f.jsx("div",{className:"relative flex-1 overflow-y-auto",children:e}),gle=({name:e,date:t})=>e?f.jsxs("p",{className:"flex items-center",children:[f.jsx("span",{className:"mr-2 flex h-6 w-6 items-center justify-center rounded-full bg-primary text-primary-foreground",children:f.jsx(Lm,{className:"h-4 w-4"})}),f.jsx("span",{className:"text-sm font-semibold text-foreground",children:e}),f.jsx("span",{className:"ml-2 text-xs font-normal text-muted-foreground",children:t?Bs(t,"MMM d yy, h:mm a"):""})]}):null;function mle(e){if(typeof e!="string")throw new TypeError("Expected a string");return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}const wh=function(e){if(e==null)return vle;if(typeof e=="function")return Eh(e);if(typeof e=="object")return Array.isArray(e)?hle(e):ble(e);if(typeof e=="string")return yle(e);throw new Error("Expected function, string, or object as test")};function hle(e){const t=[];let n=-1;for(;++n":""))+")"})}return g;function g(){let m=Y9,b,y,w;if((!t||o(l,c,u[u.length-1]||void 0))&&(m=xle(n(l,u)),m[0]===Nk))return m;if("children"in l&&l.children){const v=l;if(v.children&&m[0]!==Ele)for(y=(r?v.children.length:-1)+i,w=u.concat(v);y>-1&&y0?{type:"text",value:x}:void 0),x===!1?g.lastIndex=E+1:(b!==E&&h.push({type:"text",value:c.value.slice(b,E)}),Array.isArray(x)?h.push(...x):x&&h.push(x),b=E+S[0].length,v=!0),!g.global)break;S=g.exec(c.value)}return v?(b-1&&e.test(String.fromCharCode(n))}}const gy="phrasing",my=["autolink","link","image","label"];function Dle(){return{transforms:[zle],enter:{literalAutolink:Mle,literalAutolinkEmail:hy,literalAutolinkHttp:hy,literalAutolinkWww:hy},exit:{literalAutolink:jle,literalAutolinkEmail:Fle,literalAutolinkHttp:Ple,literalAutolinkWww:$le}}}function Lle(){return{unsafe:[{character:"@",before:"[+\\-.\\w]",after:"[\\-.\\w]",inConstruct:gy,notInConstruct:my},{character:".",before:"[Ww]",after:"[\\-.\\w]",inConstruct:gy,notInConstruct:my},{character:":",before:"[ps]",after:"\\/",inConstruct:gy,notInConstruct:my}]}}function Mle(e){this.enter({type:"link",title:null,url:"",children:[]},e)}function hy(e){this.config.enter.autolinkProtocol.call(this,e)}function Ple(e){this.config.exit.autolinkProtocol.call(this,e)}function $le(e){this.config.exit.data.call(this,e);const t=this.stack[this.stack.length-1];t.type,t.url="http://"+this.sliceSerialize(e)}function Fle(e){this.config.exit.autolinkEmail.call(this,e)}function jle(e){this.exit(e)}function zle(e){X9(e,[[/(https?:\/\/|www(?=\.))([-.\w]+)([^ \t\r\n]*)/gi,Ule],[/([-.\w+]+)@([-\w]+(?:\.[-\w]+)+)/g,Ble]],{ignore:["link","linkReference"]})}function Ule(e,t,n,r,a){let o="";if(!Q9(a)||(/^w/i.test(t)&&(n=t+n,t="",o="http://"),!Hle(n)))return!1;const i=Vle(n+r);if(!i[0])return!1;const s={type:"link",title:null,url:o+t+i[0],children:[{type:"text",value:t+i[0]}]};return i[1]?[s,{type:"text",value:i[1]}]:s}function Ble(e,t,n,r){return!Q9(r,!0)||/[-\d_]$/.test(n)?!1:{type:"link",title:null,url:"mailto:"+t+"@"+n,children:[{type:"text",value:t+"@"+n}]}}function Hle(e){const t=e.split(".");return!(t.length<2||t[t.length-1]&&(/_/.test(t[t.length-1])||!/[a-zA-Z\d]/.test(t[t.length-1]))||t[t.length-2]&&(/_/.test(t[t.length-2])||!/[a-zA-Z\d]/.test(t[t.length-2])))}function Vle(e){const t=/[!"&'),.:;<>?\]}]+$/.exec(e);if(!t)return[e,void 0];e=e.slice(0,t.index);let n=t[0],r=n.indexOf(")");const a=NN(e,"(");let o=NN(e,")");for(;r!==-1&&a>o;)e+=n.slice(0,r+1),n=n.slice(r+1),r=n.indexOf(")"),o++;return[e,n]}function Q9(e,t){const n=e.input.charCodeAt(e.index-1);return(e.index===0||Is(n)||xh(n))&&(!t||n!==47)}function ma(e){return e.replace(/[\t\n\r ]+/g," ").replace(/^ | $/g,"").toLowerCase().toUpperCase()}J9.peek=tce;function qle(){return{enter:{gfmFootnoteDefinition:Wle,gfmFootnoteDefinitionLabelString:Kle,gfmFootnoteCall:Xle,gfmFootnoteCallString:Qle},exit:{gfmFootnoteDefinition:Zle,gfmFootnoteDefinitionLabelString:Yle,gfmFootnoteCall:ece,gfmFootnoteCallString:Jle}}}function Gle(){return{unsafe:[{character:"[",inConstruct:["phrasing","label","reference"]}],handlers:{footnoteDefinition:nce,footnoteReference:J9}}}function Wle(e){this.enter({type:"footnoteDefinition",identifier:"",label:"",children:[]},e)}function Kle(){this.buffer()}function Yle(e){const t=this.resume(),n=this.stack[this.stack.length-1];n.type,n.label=t,n.identifier=ma(this.sliceSerialize(e)).toLowerCase()}function Zle(e){this.exit(e)}function Xle(e){this.enter({type:"footnoteReference",identifier:"",label:""},e)}function Qle(){this.buffer()}function Jle(e){const t=this.resume(),n=this.stack[this.stack.length-1];n.type,n.label=t,n.identifier=ma(this.sliceSerialize(e)).toLowerCase()}function ece(e){this.exit(e)}function J9(e,t,n,r){const a=n.createTracker(r);let o=a.move("[^");const i=n.enter("footnoteReference"),s=n.enter("reference");return o+=a.move(n.safe(n.associationId(e),{...a.current(),before:o,after:"]"})),s(),i(),o+=a.move("]"),o}function tce(){return"["}function nce(e,t,n,r){const a=n.createTracker(r);let o=a.move("[^");const i=n.enter("footnoteDefinition"),s=n.enter("label");return o+=a.move(n.safe(n.associationId(e),{...a.current(),before:o,after:"]"})),s(),o+=a.move("]:"+(e.children&&e.children.length>0?" ":"")),a.shift(4),o+=a.move(n.indentLines(n.containerFlow(e,a.current()),rce)),i(),o}function rce(e,t,n){return t===0?e:(n?"":" ")+e}const ace=["autolink","destinationLiteral","destinationRaw","reference","titleQuote","titleApostrophe"];ej.peek=cce;function oce(){return{canContainEols:["delete"],enter:{strikethrough:sce},exit:{strikethrough:lce}}}function ice(){return{unsafe:[{character:"~",inConstruct:"phrasing",notInConstruct:ace}],handlers:{delete:ej}}}function sce(e){this.enter({type:"delete",children:[]},e)}function lce(e){this.exit(e)}function ej(e,t,n,r){const a=n.createTracker(r),o=n.enter("strikethrough");let i=a.move("~~");return i+=n.containerPhrasing(e,{...a.current(),before:i,after:"~"}),i+=a.move("~~"),o(),i}function cce(){return"~"}function uce(e,t={}){const n=(t.align||[]).concat(),r=t.stringLength||fce,a=[],o=[],i=[],s=[];let l=0,c=-1;for(;++cl&&(l=e[c].length);++ws[w])&&(s[w]=h)}b.push(v)}o[c]=b,i[c]=y}let u=-1;if(typeof n=="object"&&"length"in n)for(;++us[u]&&(s[u]=v),g[u]=v),d[u]=h}o.splice(1,0,d),i.splice(1,0,g),c=-1;const m=[];for(;++ce(r=>({...r,onMessageCallback:n})),registerOnLastMessageReplaceCallback:n=>e(r=>({...r,onLastMessageReplaceCallback:n})),registerOnReplaceTemporaryIdsWithReturnedIdsCallback:n=>e(r=>({...r,onReplaceTemporaryIdsWithReturnedIdsCallback:n})),abortStream:()=>{var n;(n=t().abortController)==null||n.abort(),e({...e,abortController:null,readyState:0})}}}))),AN=()=>Zie(e=>e.actions),Xie="The user is back! Let's pick up the conversation! Reflect on the previous conversation and use your function calling to send them a friendly message.",wf=rf(Vm((e,t)=>({showingMessageReceipts:!1,showingInternalMonologue:!0,shouldSendAutoMessage:!1,autoMessage:Xie,showingFunctions:!0,actions:{setShouldSendAutoMessage:n=>e({...t(),shouldSendAutoMessage:n}),setAutoMessage:n=>e({...t(),autoMessage:n}),setShowingInternalMonologue:n=>e({...t(),showingInternalMonologue:n}),setShowingFunctions:n=>e({...t(),showingFunctions:n}),setShowingMessageReceipts:n=>e({...t(),showingMessageReceipts:n})}}),{name:"chat-storage",partialize:({actions:e,...t})=>t})),Qie=()=>wf(e=>e.showingMessageReceipts),w9=()=>wf(e=>e.showingInternalMonologue),E9=()=>wf(e=>e.showingFunctions),x9=()=>wf(e=>({shouldSendAutoMessage:e.shouldSendAutoMessage,autoMessage:e.autoMessage})),Jie=()=>wf(e=>e.actions),ese=iie,tse=sie,k9=p.forwardRef(({className:e,align:t="center",sideOffset:n=4,...r},a)=>f.jsx(lie,{children:f.jsx(d9,{ref:a,align:t,sideOffset:n,className:ee("z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...r})}));k9.displayName=d9.displayName;const C9="Switch",[nse,pTe]=zn(C9),[rse,ase]=nse(C9),ose=p.forwardRef((e,t)=>{const{__scopeSwitch:n,name:r,checked:a,defaultChecked:o,required:i,disabled:s,value:l="on",onCheckedChange:c,...u}=e,[d,g]=p.useState(null),m=nt(t,h=>g(h)),b=p.useRef(!1),y=d?!!d.closest("form"):!0,[w=!1,v]=Fa({prop:a,defaultProp:o,onChange:c});return p.createElement(rse,{scope:n,checked:w,disabled:s},p.createElement(ze.button,W({type:"button",role:"switch","aria-checked":w,"aria-required":i,"data-state":_9(w),"data-disabled":s?"":void 0,disabled:s,value:l},u,{ref:m,onClick:fe(e.onClick,h=>{v(S=>!S),y&&(b.current=h.isPropagationStopped(),b.current||h.stopPropagation())})})),y&&p.createElement(lse,{control:d,bubbles:!b.current,name:r,value:l,checked:w,required:i,disabled:s,style:{transform:"translateX(-100%)"}}))}),ise="SwitchThumb",sse=p.forwardRef((e,t)=>{const{__scopeSwitch:n,...r}=e,a=ase(ise,n);return p.createElement(ze.span,W({"data-state":_9(a.checked),"data-disabled":a.disabled?"":void 0},r,{ref:t}))}),lse=e=>{const{control:t,checked:n,bubbles:r=!0,...a}=e,o=p.useRef(null),i=F_(n),s=N_(t);return p.useEffect(()=>{const l=o.current,c=window.HTMLInputElement.prototype,d=Object.getOwnPropertyDescriptor(c,"checked").set;if(i!==n&&d){const g=new Event("click",{bubbles:r});d.call(l,n),l.dispatchEvent(g)}},[i,n,r]),p.createElement("input",W({type:"checkbox","aria-hidden":!0,defaultChecked:n},a,{tabIndex:-1,ref:o,style:{...e.style,...s,position:"absolute",pointerEvents:"none",opacity:0,margin:0}}))};function _9(e){return e?"checked":"unchecked"}const A9=ose,cse=sse,Kp=p.forwardRef(({className:e,...t},n)=>f.jsx(A9,{className:ee("peer inline-flex h-[24px] w-[44px] shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input",e),...t,ref:n,children:f.jsx(cse,{className:ee("pointer-events-none block h-5 w-5 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0")})}));Kp.displayName=A9.displayName;const use=()=>{const{autoMessage:e,shouldSendAutoMessage:t}=x9(),[n,r]=p.useState(e),[a,o]=p.useState("idle"),i=w9(),s=E9(),{setShowingInternalMonologue:l,setShowingFunctions:c,setAutoMessage:u,setShouldSendAutoMessage:d}=Jie(),g=()=>{o("updating"),setTimeout(()=>{u(n),o("success"),setTimeout(()=>o("idle"),600)},600)};return f.jsxs(ese,{children:[f.jsx(tse,{asChild:!0,children:f.jsx(ue,{size:"iconXs",className:"absolute right-3 top-2 z-10",variant:"outline",children:f.jsx(Fq,{className:"size-4"})})}),f.jsxs(k9,{align:"end",className:"w-80 space-y-4 rounded-md border bg-background p-4",children:[f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsx(os,{htmlFor:"internal-monologue",children:"Show Internal Monologue"}),f.jsx(Kp,{checked:i,onCheckedChange:m=>l(m),id:"internal-monologue"})]}),f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsx(os,{htmlFor:"showing-functions",children:"Show Functions"}),f.jsx(Kp,{checked:s,onCheckedChange:m=>c(m),id:"showing-functions"})]}),f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsx(os,{htmlFor:"should-send-auto-message",children:"Send Auto Message"}),f.jsx(Kp,{checked:t,onCheckedChange:m=>d(m),id:"should-send-auto-message"})]}),f.jsxs("div",{className:"flex flex-col space-y-2",children:[f.jsx(os,{htmlFor:"auto-message",children:"Auto Message"}),f.jsx(qs,{id:"auto-message",className:"min-h-[10rem] resize-none",value:n,onChange:m=>r(m.target.value)}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{disabled:a==="updating",onClick:g,className:"w-fit",variant:"outline",size:"xs",children:"Update Message"}),a!=="updating"?null:f.jsx("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "})}),a!=="success"?null:f.jsx("div",{className:Tt("ml-4 flex items-center text-emerald-600 animate-in slide-in-from-bottom-2"),children:f.jsx(Mm,{className:"mr-2 h-4 w-4 "})})]})]})]})]})},Sh=({children:e,className:t})=>f.jsx("h4",{className:ee("text-sm font-medium uppercase text-foreground",t),children:e}),wh=({children:e,className:t,button:n,onClickInfo:r})=>f.jsxs(Sh,{className:ee("flex h-8 items-center justify-between",t),children:[f.jsxs("span",{className:"inline-flex items-center tabular-nums",children:[f.jsx("span",{children:e}),f.jsx(Nq,{className:"ml-1.5 size-3.5 text-muted-foreground",onClick:r})]}),n]}),rA=({onClick:e})=>f.jsx(ue,{onClick:e,size:"iconXs",variant:"outline",children:f.jsx(ya,{className:"size-4 text-foreground"})}),T9=({className:e,children:t,onClick:n})=>f.jsxs("div",{className:ee("flex items-center justify-between rounded-md border border-dashed p-2 text-sm font-normal text-muted-foreground",e),children:[f.jsx("span",{children:t}),f.jsx(ue,{onClick:n,size:"iconXs",variant:"outline",children:f.jsx(ya,{className:"size-4 text-foreground"})})]}),dse=Xe({message:Ce().min(1,"Message cannot be empty...")}),fse=e=>{const n=bn({resolver:yn(dse),defaultValues:{message:""}});function r(a){e.onCreateArchivalMemory(a.message)}return f.jsx(vn,{...n,children:f.jsxs("form",{onSubmit:n.handleSubmit(r),className:"mt-4",children:[f.jsx(ut,{control:n.control,name:"message",render:({field:a})=>{var o;return f.jsxs(ot,{className:"-mt-2 w-full",children:[f.jsx(yt,{className:"sr-only",children:"Memory to store"}),f.jsx(pt,{className:"w-full",children:f.jsx(Ai,{className:"min-h-40",placeholder:"What you want the agent to know about you",charCount:(o=a.value)==null?void 0:o.length,limit:2e3,...a})}),f.jsx(lt,{})]})}}),f.jsxs("div",{className:"flex items-center justify-between pt-8",children:[f.jsx(ue,{type:"button",onClick:e.onCancel,variant:"ghost",children:"Cancel"}),f.jsxs("div",{className:"flex gap-3",children:[e.isPending&&f.jsxs("div",{className:Tt("mr-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Saving memory..."})]}),f.jsx(ue,{disabled:e.isPending,type:"submit",children:"Save Memory"})]})]})]})})},pse=({agentId:e,open:t,onOpenChange:n})=>{const r=Bt(),a=dX(),o=i=>{a.mutate({agentId:e||"",requestBody:{text:i}},{onSuccess:()=>{n(!1),r.invalidateQueries({queryKey:h6({agentId:e||""})})}})};return f.jsx(Kt,{open:t,onOpenChange:n,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Add Memory"}),f.jsx(dn,{children:"Add a memory. Archival memory serves as an infinite, structured storage space for reflections, insights, and other data not fitting into core memory."})]}),f.jsx(fse,{isPending:a.isPending,onCreateArchivalMemory:o,onCancel:()=>n(!1)})]})})},gse=({memoryId:e,agentId:t,open:n,onOpenChange:r})=>{const a=Bt(),o=mX(),i=()=>o.mutate({agentId:t||"",memoryId:e},{onSuccess:()=>{a.invalidateQueries({queryKey:$s({agentId:t||""})}),r(!1)}});return f.jsx(Kt,{open:n,onOpenChange:r,children:f.jsxs(Ht,{className:"w-full sm:max-w-[350px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Delete Memory"}),f.jsx(dn,{className:"!my-4",children:"Are you sure you want to delete this memory?"})]}),f.jsxs(g8,{children:[f.jsx(ue,{size:"sm",type:"button",onClick:()=>r(!1),variant:"ghost",children:"Cancel"}),f.jsx(ue,{size:"sm",disabled:o.isPending,onClick:i,children:"Delete"})]})]})})},R9=({className:e,archivalMemory:t,agentId:n,isViewMemoryDialog:r})=>{const[a,o]=p.useState(!1),[i,s]=p.useState(!0),[l,c]=p.useState(!1),u=p.useRef(null),d=p.useRef(null);return p.useLayoutEffect(()=>{(()=>{if(u.current&&d.current){const m=u.current.scrollWidth>d.current.clientWidth;c(m)}})()},[t.text]),f.jsxs(f.Fragment,{children:[f.jsxs("div",{className:ee("relative w-full rounded-md border p-4 pr-10",e),children:[f.jsxs("div",{className:"flex-1",children:[f.jsx("div",{className:"mb-1 text-xs text-muted-foreground",children:"Jun 18 2024"}),f.jsx("div",{className:ee("break-words text-sm",i&&"truncate"),ref:d,children:f.jsx("p",{ref:u,className:ee(i?"w-min":"w-full",!r&&"inline"),children:t.text})})]}),f.jsx(ue,{className:"absolute right-2 top-2.5 text-muted-foreground",onClick:()=>o(!0),variant:"ghost",size:"iconXs",children:f.jsx(Di,{className:"size-4"})}),r&&l?f.jsx(ue,{className:"mt-2 h-7 w-fit p-0 font-semibold",variant:"link",onClick:()=>s(!i),children:i?f.jsxs(f.Fragment,{children:["more",f.jsx(ZC,{className:"ml-2 h-4 w-4"})]}):f.jsxs(f.Fragment,{children:["less",f.jsx(wq,{className:"ml-2 h-4 w-4"})]})}):null]}),f.jsx(gse,{memoryId:t.id||"",agentId:n,open:a,onOpenChange:o})]})},mse=({setCurrentPage:e,className:t,currentPage:n,totalPages:r})=>f.jsx("div",{className:ee("flex items-center justify-end space-x-2",t),children:f.jsxs("div",{className:"space-x-2",children:[f.jsx(ue,{variant:"outline",size:"sm",onClick:()=>e(a=>Math.max(a-1,1)),disabled:n===1,children:"Previous"}),f.jsx(ue,{variant:"outline",size:"sm",onClick:()=>e(a=>Math.min(a+1,r)),disabled:n===r,children:"Next"})]})}),aA=({items:e,searchTerm:t,setSearchTerm:n,setShowSearchInput:r,showSearchInput:a,onOpenAddDialog:o,buttonText:i,isViewArchivalMemoryDialog:s,setShowFilterButton:l,showFilterButton:c})=>{const u=()=>{r(!a),l&&l(!1)},d=()=>{l&&l(!c),r(!1)};return f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsxs("div",{className:"flex h-8 w-full items-center justify-between",children:[f.jsxs("p",{className:"text-xs",children:[e?e==null?void 0:e.length:null," items"]}),f.jsxs("div",{className:"flex h-full gap-2",children:[f.jsxs("div",{className:"relative flex h-full items-center justify-end border-r-2",children:[a?f.jsx(_n,{placeholder:"Search",value:t,onChange:g=>n(g.target.value),className:"mr-2 h-8 w-32 pl-9 md:w-52"}):null,f.jsx("button",{className:ee("mr-2",a&&"absolute left-3 top-2"),onClick:()=>u(),children:f.jsx(Ms,{className:ee("h-4 w-4")})})]}),s?f.jsxs("div",{className:"flex h-full items-center justify-end gap-2 border-r-2",children:[c?f.jsx(ue,{className:"px-2 py-0",size:"sm",children:f.jsx("span",{className:"p-0 text-xs",children:"Oldest to newest"})}):null,f.jsx("button",{className:ee("mr-2 h-full p-0.5",c&&"bg-muted"),onClick:()=>d(),children:f.jsx(yq,{className:"h-4 w-4"})})]}):null]})]}),f.jsxs(ue,{variant:"ghost",onClick:()=>o(!0),children:[i,f.jsx(ya,{className:"ml-1 h-4 w-4"})]})]})},hse=({agentId:e,open:t,onOpenChange:n,onOpenAddMemory:r})=>{VF();const o=S6({agentId:e||""}).data??[],[i,s]=p.useState(!1),[l,c]=p.useState(!1),[u,d]=p.useState(""),g=(o??[]).filter(S=>S.text.toLowerCase().includes(u.toLowerCase())),[m,b]=p.useState(1),y=10,w=m*y,v=w-y,h=g.slice(v,w);return f.jsx(Kt,{open:t,onOpenChange:n,children:f.jsxs(Ht,{className:"flex max-h-[95svh] flex-col overflow-auto sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Archival Memory"}),f.jsx(dn,{children:"Archival memory serves as an infinite, structured storage space for reflections, insights, and other data not fitting into core memory."}),f.jsx(aA,{items:o,searchTerm:u,setSearchTerm:d,setShowSearchInput:s,showSearchInput:i,onOpenAddDialog:r,buttonText:"Add Memory",isViewArchivalMemoryDialog:!0,setShowFilterButton:c,showFilterButton:l})]}),f.jsx("div",{className:"flex w-full flex-col",children:h.map(S=>f.jsx(R9,{agentId:e,archivalMemory:S,className:"mb-2",isViewMemoryDialog:!0},S.id))}),f.jsx(mse,{currentPage:m,setCurrentPage:b,totalPages:Math.ceil(g.length/y)})]})})},bse=({agentId:e})=>{const t=S6({agentId:e??""},void 0,{enabled:!!e}),n=t.data??[],[r,a]=p.useState(!1),[o,i]=p.useState(!1),s=()=>a(!0);return f.jsxs(f.Fragment,{children:[f.jsxs("div",{className:"py-4",children:[f.jsxs(wh,{button:n.length===0?null:f.jsx(rA,{onClick:()=>i(!0)}),children:["Archival Memory (",n.length,")"]}),t.isFetching?f.jsx(Pi,{className:"h-[70px]"}):null,t.isError?f.jsx("div",{className:"h-[70px] border border-destructive",children:"Something went wrong..."}):null,t.isSuccess?f.jsxs(f.Fragment,{children:[f.jsx("div",{className:"mt-2",children:[...n].slice(0,3).map(l=>f.jsx(R9,{className:"mb-2",archivalMemory:l,agentId:e},l.id))}),n.length<1?null:f.jsxs(ue,{onClick:s,className:"mt-2 h-7 w-fit p-2 font-semibold",variant:"link",children:["See all ",f.jsx($m,{className:"ml-2 h-4 w-4"})]}),n.length>0?null:f.jsx(T9,{onClick:()=>i(!0),children:"Nothing here yet. Add memory"})]}):null]}),f.jsx(hse,{agentId:e,open:r,onOpenChange:a,onOpenAddMemory:l=>i(l)}),f.jsx(pse,{agentId:e,open:o,onOpenChange:i})]})},yse=(e,t)=>e.length>t?e.substring(0,t)+"...":e;function vse(e,t){let n="Error adding data source...";const r=`${n}: Unspecified error.`;try{const a=JSON.parse(e.message);a.detail&&(a.detail=="None"?n=r:n=`${n}: ${a.detail}`)}catch{n=r}t({title:n,duration:5e3})}const N9=({source:e,handleRemoveDataSource:t})=>f.jsxs("div",{className:"relative rounded-md border p-4",children:[f.jsxs("p",{className:"flex items-center gap-1",children:[f.jsx("span",{className:"font-medium",children:e.name}),f.jsx("span",{className:"mt-0.5 text-xs text-muted-foreground",children:Bs(new Date(e.created_at||""),"MMM dd yyyy")})]}),f.jsx("p",{className:Tt(),children:(e==null?void 0:e.description)??"None"}),f.jsxs("button",{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",onClick:()=>t(e.id||""),children:[f.jsx(Di,{className:"h-4 w-4"}),f.jsx("span",{className:"sr-only",children:"Close"})]})]},e.id),Sse=Xe({sourceIds:nA(Ce())}),wse=({closeDialog:e})=>{const t=To(),n=Bt(),{data:r,isLoading:a}=b_(),{data:o}=v6({agentId:(t==null?void 0:t.id)||""}),i=x6(),[s,l]=p.useState(!1),{toast:c}=An(),u=r??[],d=bn({resolver:yn(Sse),mode:"onSubmit",defaultValues:{sourceIds:[]}}),g=async v=>{if(!(t!=null&&t.id))return;l(!0);const h=[];for(const S of v.sourceIds)try{const E=await i.mutateAsync({agentId:t.id,sourceId:S},{onSuccess:()=>{n.invalidateQueries({queryKey:m6({agentId:t.id||""})}),c({title:"Data source added successfully!",duration:5e3})}});h.push(E)}catch(E){vse(E,c)}h.length>0&&c({title:"Data source added successfully!",duration:5e3}),l(!1),e()},m=d.watch("sourceIds"),b=p.useMemo(()=>{if(!u)return[];const v=new Set(m),h=new Set((o||[]).map(S=>S.id));return u.filter(S=>!v.has(S.id||"")&&!h.has(S.id))},[r,u,m]),y=v=>{m.some(h=>h===v)||d.setValue("sourceIds",[...m,v])},w=v=>{d.setValue("sourceIds",m.filter(h=>h!==v))};return f.jsx(vn,{...d,children:f.jsxs("form",{onSubmit:d.handleSubmit(g,v=>console.log(v)),className:"space-y-8",children:[f.jsx(ut,{control:d.control,name:"sourceIds",render:()=>f.jsxs(ot,{children:[f.jsxs(So,{disabled:a,value:"",onValueChange:v=>y(v),children:[f.jsx(pt,{children:f.jsx(za,{children:f.jsx(wo,{placeholder:a?"Loading data sources...":"Search or select data source"})})}),f.jsx(Ua,{className:"max-h-[200px] overflow-y-auto",children:(b==null?void 0:b.length)===0?f.jsx(Fn,{value:"no-sources",disabled:!0,children:"No additional data sources available"}):b.map(v=>f.jsx(Fn,{value:v.id||"",children:v.name},v.id))})]}),f.jsx(lt,{})]})}),f.jsx("div",{className:"space-y-2",children:d.watch("sourceIds")?u.filter(v=>d.getValues("sourceIds").some(h=>h===v.id)).map(v=>f.jsx(N9,{handleRemoveDataSource:w,source:v},v.id)):null}),f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsx(ue,{variant:"ghost",type:"button",onClick:()=>e(),children:"Cancel"}),f.jsxs("div",{className:"flex gap-3",children:[s&&f.jsxs("div",{className:Tt("mr-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Attaching to agent..."})]}),f.jsx(ue,{type:"submit",children:"Add Source"})]})]})]})})},Ese=({open:e,onOpenChange:t})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Add Data Source"}),f.jsx(dn,{children:"By adding a data source, you will make it available to the Agent to use for information."})]}),f.jsx(wse,{closeDialog:()=>t(!1)})]})}),xse=({onDetach:e,onOpenAddSourceChange:t})=>{const n=[],[r,a]=p.useState(!1),[o,i]=p.useState(""),s=(n??[]).filter(l=>l.name.toLowerCase().includes(o.toLowerCase()));return f.jsxs(f.Fragment,{children:[f.jsx(aA,{items:n,searchTerm:o,setSearchTerm:i,setShowSearchInput:a,showSearchInput:r,onOpenAddDialog:t,buttonText:"Add Source"}),f.jsx("div",{className:"space-y-2",children:n?s.map(l=>f.jsx(N9,{handleRemoveDataSource:e,source:l},l.id)):null})]})},kse=({open:e,onOpenChange:t,onDetach:n,onOpenAddSourceChange:r})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Data Sources"}),f.jsx(dn,{children:"Data sources make it available to the Agent to use for information outside of the immediate context window."})]}),f.jsx(xse,{onDetach:n,onOpenAddSourceChange:r})]})}),Cse=()=>{const[e,t]=p.useState(!1),[n,r]=p.useState(!1),a=To(),{data:o}=v6({agentId:(a==null?void 0:a.id)||""}),i=p.useMemo(()=>o??[],[o]),s=k6(),{toast:l}=An(),c=u=>{!u||!a||s.mutate({agentId:a.id||"",sourceId:u},{onSuccess:()=>{l({title:"Agent detached successfully!",duration:3e3})},onError:d=>l({title:"Failed to detach agent!",duration:3e3})})};return f.jsxs("div",{className:"py-4",children:[f.jsxs(wh,{button:i.length===0?null:f.jsx(rA,{onClick:()=>t(!0)}),onClickInfo:()=>r(!0),children:["Data Sources (",i.length,")"]}),f.jsx("ul",{className:"mt-2 space-y-2",children:i.map(u=>f.jsxs("li",{className:"rounded-md border p-4",children:[f.jsx("div",{className:"relative flex justify-between",children:f.jsxs("p",{className:"flex items-center gap-2",children:[f.jsx("span",{className:"font-medium",children:u.name}),f.jsx("span",{className:"text-xs",children:Bs(new Date(u.created_at||""),"MMM dd yyyy")})]})}),f.jsx("p",{className:Tt(),children:yse((u==null?void 0:u.description)??"None",42)})]},u.id))}),i.length>0?null:f.jsx(T9,{onClick:()=>t(!0),children:"Nothing here yet. Add source"}),f.jsx(Ese,{open:e,onOpenChange:u=>t(u)}),f.jsx(kse,{open:n,onOpenChange:u=>r(u),onDetach:c,onOpenAddSourceChange:u=>t(u)})]})},_se="AlertDialog",[Ase,gTe]=zn(_se,[i8]),Ro=i8(),Tse=e=>{const{__scopeAlertDialog:t,...n}=e,r=Ro(t);return p.createElement(d8,W({},r,n,{modal:!0}))},Rse=p.forwardRef((e,t)=>{const{__scopeAlertDialog:n,...r}=e,a=Ro(n);return p.createElement(iae,W({},a,r,{ref:t}))}),Nse=e=>{const{__scopeAlertDialog:t,...n}=e,r=Ro(t);return p.createElement(f8,W({},r,n))},Ise=p.forwardRef((e,t)=>{const{__scopeAlertDialog:n,...r}=e,a=Ro(n);return p.createElement(H_,W({},a,r,{ref:t}))}),I9="AlertDialogContent",[Ose,Dse]=Ase(I9),Lse=p.forwardRef((e,t)=>{const{__scopeAlertDialog:n,children:r,...a}=e,o=Ro(n),i=p.useRef(null),s=nt(t,i),l=p.useRef(null);return p.createElement(oae,{contentName:I9,titleName:Mse,docsSlug:"alert-dialog"},p.createElement(Ose,{scope:n,cancelRef:l},p.createElement(V_,W({role:"alertdialog"},o,a,{ref:s,onOpenAutoFocus:fe(a.onOpenAutoFocus,c=>{var u;c.preventDefault(),(u=l.current)===null||u===void 0||u.focus({preventScroll:!0})}),onPointerDownOutside:c=>c.preventDefault(),onInteractOutside:c=>c.preventDefault()}),p.createElement(Rm,null,r),!1)))}),Mse="AlertDialogTitle",Pse=p.forwardRef((e,t)=>{const{__scopeAlertDialog:n,...r}=e,a=Ro(n);return p.createElement(q_,W({},a,r,{ref:t}))}),$se=p.forwardRef((e,t)=>{const{__scopeAlertDialog:n,...r}=e,a=Ro(n);return p.createElement(G_,W({},a,r,{ref:t}))}),Fse=p.forwardRef((e,t)=>{const{__scopeAlertDialog:n,...r}=e,a=Ro(n);return p.createElement(W_,W({},a,r,{ref:t}))}),jse="AlertDialogCancel",zse=p.forwardRef((e,t)=>{const{__scopeAlertDialog:n,...r}=e,{cancelRef:a}=Dse(jse,n),o=Ro(n),i=nt(t,a);return p.createElement(W_,W({},o,r,{ref:i}))}),Use=Tse,Bse=Rse,Hse=Nse,O9=Ise,D9=Lse,L9=Fse,M9=zse,P9=Pse,$9=$se,Vse=Use,qse=Bse,Gse=Hse,F9=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(O9,{className:ee("fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",e),...n,ref:r}));F9.displayName=O9.displayName;const j9=p.forwardRef(({className:e,...t},n)=>f.jsxs(Gse,{children:[f.jsx(F9,{}),f.jsx(D9,{ref:n,className:ee("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg md:w-full",e),...t})]}));j9.displayName=D9.displayName;const z9=({className:e,...t})=>f.jsx("div",{className:ee("flex flex-col space-y-2 text-center sm:text-left",e),...t});z9.displayName="AlertDialogHeader";const U9=({className:e,...t})=>f.jsx("div",{className:ee("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",e),...t});U9.displayName="AlertDialogFooter";const B9=p.forwardRef(({className:e,...t},n)=>f.jsx(P9,{ref:n,className:ee("text-lg font-semibold",e),...t}));B9.displayName=P9.displayName;const H9=p.forwardRef(({className:e,...t},n)=>f.jsx($9,{ref:n,className:ee("text-sm text-muted-foreground",e),...t}));H9.displayName=$9.displayName;const V9=p.forwardRef(({className:e,variant:t,...n},r)=>f.jsx(L9,{ref:r,className:ee(yc({variant:t}),e),...n}));V9.displayName=L9.displayName;const q9=p.forwardRef(({className:e,...t},n)=>f.jsx(M9,{ref:n,className:ee(yc({variant:"outline"}),"mt-2 sm:mt-0",e),...t}));q9.displayName=M9.displayName;const Wse=()=>{const e=To(),{mutate:t,isPending:n}=gX(),{toast:r}=An(),a=Mi(),o=p.useCallback(()=>{e&&t({agentId:e.id||""},{onSuccess:()=>{r({title:"Agent deleted successfully",duration:500}),a("/agents")},onError:()=>{r({title:"There was an error deleting the agent, please try again",duration:5e3})}})},[e==null?void 0:e.id,a,t]);return f.jsxs(Vse,{children:[f.jsx(qse,{asChild:!0,children:f.jsx(ue,{variant:"destructive",children:"Delete Agent"})}),f.jsxs(j9,{children:[f.jsxs(z9,{children:[f.jsx(B9,{children:"Delete Agent"}),f.jsx(H9,{children:"When you delete an agent, all the information and interaction will be lost. Are you sure you want to delete the agent"})]}),f.jsxs(U9,{children:[f.jsx(q9,{children:"Cancel"}),f.jsx(V9,{onClick:o,variant:"destructive",children:f.jsxs(f.Fragment,{children:[n&&f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),"Delete Agent"]})})]})]})]})},Kse=()=>f.jsxs("div",{className:"flex flex-col gap-2 pb-10 pt-4",children:[f.jsx(Sh,{children:"Delete Agent"}),f.jsx("p",{className:" text-sm text-muted-foreground",children:"When you delete an agent, all the information and interaction will be lost."}),f.jsx(Wse,{})]}),Yse={configItem:e=>["config",e]},Zse=e=>{const t=_Z();return Jr({queryKey:Yse.configItem(e),enabled:!!e,queryFn:async()=>t.get("/config").then(n=>n.data)})},G9=({icon:e,name:t,isEditing:n,onEditPersonaClicked:r})=>f.jsxs("div",{className:"flex items-center justify-between py-4",children:[f.jsxs("div",{className:"flex items-center font-medium",children:[e,f.jsx("span",{children:t})]}),n?null:f.jsxs(ue,{onClick:r,variant:"ghost",size:"xs",children:["Edit Persona ",f.jsx(XC,{className:"ml-2 size-4"})]})]}),W9=({renderContent:e,state:t,onClose:n})=>{const r=p.useRef("closed"),a=t==="edit"||t==="closed"&&r.current==="edit";return p.useEffect(()=>{r.current=t},[t]),f.jsx(Kt,{open:t==="view"||t==="edit",onOpenChange:o=>{o||n()},children:f.jsx(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:e(a)})})},K9=({status:e,limit:t,defaultContent:n,onCancelClicked:r,onSaveClicked:a})=>{const[o,i]=p.useState(n);return f.jsxs(f.Fragment,{children:[f.jsxs(os,{children:["Persona Description",f.jsx(Ai,{charCount:(o==null?void 0:o.length)??0,limit:t,onChange:s=>i(s.target.value),className:"min-h-[60vh] whitespace-pre-line font-normal",defaultValue:o})]}),f.jsxs("div",{className:"flex items-center justify-between pt-8",children:[f.jsx(ue,{onClick:()=>r(),variant:"ghost",children:"Cancel"}),f.jsxs("div",{className:"flex items-center",children:[e!=="pending"?null:f.jsxs("div",{className:Tt("mr-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Updating persona..."})]}),e!=="success"?null:f.jsxs("div",{className:Tt("mr-4 flex items-center text-emerald-600 animate-in slide-in-from-bottom-2"),children:[f.jsx(Mm,{className:"mr-2 h-4 w-4 "}),f.jsx("span",{children:"Persona updated!"})]}),f.jsx(ue,{onClick:()=>a(o),children:"Save"})]})]})]})},Xse=({name:e,state:t,onClose:n,onSaveEditPersonaClicked:r,onEditPersonaClicked:a,onCancelEditPersonaClicked:o,status:i,content:s})=>{Zse(VF());const l=2e3;return f.jsx(W9,{name:e,state:t,onClose:n,renderContent:c=>f.jsxs(f.Fragment,{children:[f.jsxs(Pt,{children:[f.jsx($t,{children:c?"Edit Agent Persona":"Agent Persona"}),f.jsx(dn,{children:c?"You can edit your personas memory. This won’t affect the persona original template. Any changes will be saved as new core memories.":"This information stores details about the agent's persona, guiding its behaviour and responses to maintain consistency and personality in interactions."})]}),f.jsxs("div",{className:c?"":"mb-8",children:[f.jsx(G9,{name:e,icon:f.jsx(Lm,{className:"mr-2 size-6"}),isEditing:c,onEditPersonaClicked:a}),c?null:f.jsx("p",{className:"whitespace-pre-line",children:s}),c?f.jsx(K9,{status:i,defaultContent:s,limit:l,onCancelClicked:o,onSaveClicked:r}):null]})]})})},Qse=({name:e,state:t,onClose:n,content:r,onCancelEditPersonaClicked:a,onEditPersonaClicked:o,onSaveEditPersonaClicked:i,status:s})=>f.jsx(W9,{name:e,state:t,onClose:n,renderContent:l=>f.jsxs(f.Fragment,{children:[f.jsxs(Pt,{children:[f.jsx($t,{children:l?"Edit Human Persona":"Human Persona"}),f.jsx(dn,{children:l?"You can edit your personas memory. This won’t affect the persona original template. Any changes will be saved as new core memories":"Stores key details about the person the agent is conversing with, enabling personalised and friend-like conversations"})]}),f.jsxs("div",{className:l?"":"mb-8",children:[f.jsx(G9,{name:e,icon:f.jsx(QC,{className:"mr-2 size-6"}),isEditing:l,onEditPersonaClicked:o}),l?null:f.jsx("p",{className:"whitespace-pre-line",children:r}),l?f.jsx(K9,{status:s,defaultContent:r,limit:2e3,onCancelClicked:a,onSaveClicked:i}):null]})]})}),TN=({className:e,title:t,name:n,content:r,onEditClick:a,onMoreClick:o,icon:i})=>f.jsxs("div",{className:ee("rounded-md border p-3",e),children:[f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsxs("div",{className:"flex items-center font-semibold",children:[i,f.jsx("span",{children:t})]}),f.jsx(ue,{onClick:a,size:"iconXs",variant:"ghost",children:f.jsx(XC,{className:"h-4 w-4 text-muted-foreground"})})]}),f.jsxs("div",{className:"flex flex-col gap-2 pl-7",children:[f.jsx("p",{className:"mt-2 text-xs text-muted-foreground/60",children:n}),f.jsxs("p",{className:"relative h-[78px] overflow-hidden text-ellipsis text-sm text-muted-foreground",children:[r,f.jsx("span",{className:"absolute bottom-0 right-0 h-5 w-10 bg-gradient-to-r from-transparent to-background to-55%"})]}),f.jsxs(ue,{onClick:o,className:"-ml-2 h-7 w-fit p-2 font-semibold",variant:"link",children:["more ",f.jsx($m,{className:"ml-2 h-4 w-4"})]})]})]}),Jse=({agentId:e})=>{const t=v_(),{data:n,refetch:r,isRefetching:a}=y_({agentId:e||""}),{mutate:o}=cf(),i=Bt(),s=p.useMemo(()=>{var b,y;return(y=(b=n==null?void 0:n.memory)==null?void 0:b.memory)==null?void 0:y[fr]},[n]),l=p.useMemo(()=>{var b,y;return(y=(b=n==null?void 0:n.memory)==null?void 0:b.memory)==null?void 0:y[Qr]},[n]),[c,u]=p.useState("closed"),[d,g]=p.useState("closed"),m=b=>y=>{var w,v,h;!l||!e||o({agentId:e,requestBody:{id:e,memory:{...n==null?void 0:n.memory,memory:{...(w=n==null?void 0:n.memory)==null?void 0:w.memory,[b]:{...(h=(v=n==null?void 0:n.memory)==null?void 0:v.memory)==null?void 0:h[b],value:y}}}}},{onSuccess:()=>{i.invalidateQueries({queryKey:$s({agentId:e})})}})};return f.jsxs("div",{className:"pb-6 pt-4",children:[f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsx(wh,{children:"Core Memory"}),f.jsx(ue,{onClick:b=>{b.stopPropagation(),r()},disabled:a,variant:"outline",className:"z-10 h-7 w-7 p-0",children:f.jsx(Lq,{className:"size-5 "+(a?"animate-spin":"")})})]}),!l||!s?f.jsx("p",{className:"flex items-center justify-center p-20",children:"Loading memory..."}):f.jsxs(f.Fragment,{children:[f.jsx(TN,{className:"mt-2",title:"Agent Persona",name:l.name||"",content:l.value,onMoreClick:()=>u("view"),onEditClick:()=>u("edit"),icon:f.jsx(Lm,{className:"mr-2 h-5 w-5"})}),f.jsx(TN,{className:"my-4",title:"Human Persona",name:s.name||"",content:s.value,onMoreClick:()=>g("view"),onEditClick:()=>g("edit"),icon:f.jsx(QC,{className:"mr-2 h-5 w-5"})}),f.jsx(Xse,{status:t.status,content:l.value||"",name:l.name||"",onClose:()=>u("closed"),state:c,onEditPersonaClicked:()=>u("edit"),onCancelEditPersonaClicked:()=>u("closed"),onSaveEditPersonaClicked:m(Qr)}),f.jsx(Qse,{status:t.status,content:s.value||"",name:s.name||"",onClose:()=>g("closed"),state:d,onEditPersonaClicked:()=>g("edit"),onCancelEditPersonaClicked:()=>g("closed"),onSaveEditPersonaClicked:m(fr)})]})]})},ele=(e,t)=>{var a,o;const n=(a=e.tags)==null?void 0:a.includes("memgpt-base"),r=(o=t.tags)==null?void 0:o.includes("memgpt-base");return n&&r?e.name.localeCompare(t.name):n?-1:1},to="-ml-1 mr-2 size-5",tle={archival_memory_insert:f.jsx(bq,{className:to}),archival_memory_search:f.jsx(Oq,{className:to}),conversation_search:f.jsx(Ms,{className:to}),conversation_search_date:f.jsx(vq,{className:to}),core_memory_append:f.jsx(ya,{className:to}),core_memory_replace:f.jsx(Mq,{className:to}),pause_heartbeats:f.jsx(Tq,{className:to}),send_message:f.jsx($q,{className:to})},oA=({tool:e,showDescription:t,isAddModal:n,onClick:r})=>{var o,i;const a=n??!e.tags.some(s=>s==="memgpt-base");return f.jsxs("div",{className:"rounded-md border px-4 py-2",children:[f.jsxs("div",{className:"flex items-end justify-between",children:[f.jsxs("span",{className:"inline-flex items-center text-sm font-semibold",children:[tle[e.name]??f.jsx(Rq,{className:to})," ",e.name.replace(/_/g," ").replace(/\w\S*/g,s=>s.charAt(0).toUpperCase()+s.substring(1).toLowerCase())]}),a?f.jsx(ue,{variant:"ghost",size:"iconXs",type:"button",onClick:r,children:f.jsx(Di,{className:"size-4"})}):f.jsx("div",{className:"h-7"})]}),f.jsxs("div",{className:"mt-1 flex items-center justify-between",children:[f.jsx("span",{className:"ml-6 text-xs text-muted-foreground",children:e.name}),f.jsx(b9,{variant:"secondary",className:"text-muted-foreground",children:(o=e.tags[0])==null?void 0:o.replace("memgpt-","")})]}),t?f.jsx("div",{className:"mt-2",children:f.jsx("p",{className:"text-sm text-muted-foreground",children:JSON.stringify((i=e==null?void 0:e.json_schema)==null?void 0:i.description)||""})}):null]})},Y9=()=>{const e=To();return y_({agentId:(e==null?void 0:e.id)||""},void 0,{initialData:e,enabled:!!e})},nle=Xe({toolIds:nA(Ce())}),rle=({closeDialog:e})=>{const{data:t}=Y9(),{data:n,isLoading:r}=Xm(),{mutate:a,isPending:o}=cf(),i=Bt(),s=p.useMemo(()=>new Set(t==null?void 0:t.tools),[t]),l=p.useMemo(()=>(n||[]).filter(v=>!s.has(v.name)),[n]),c=To(),u=(c==null?void 0:c.tools)??[],d=bn({resolver:yn(nle),mode:"onSubmit",defaultValues:{toolIds:[]}}),g=async v=>{v.toolIds.length&&c!=null&&c.id&&a({agentId:c.id,requestBody:{id:c.id,tools:Array.from(new Set([...Array.from(s),...v.toolIds]))}},{onSuccess:()=>{i.invalidateQueries({queryKey:$s({agentId:c.id||""})}),e()}})},m=l.filter(v=>!u.some(h=>h===v.id)),b=d.watch("toolIds"),y=v=>{b.some(h=>h===v)||d.setValue("toolIds",[...b,v])},w=v=>{d.setValue("toolIds",b.filter(h=>h!==v))};return f.jsx(vn,{...d,children:f.jsxs("form",{onSubmit:d.handleSubmit(g,v=>console.log(v)),className:"space-y-8",children:[f.jsx(ut,{control:d.control,name:"toolIds",render:({field:v})=>f.jsxs(ot,{children:[f.jsxs(So,{disabled:r,onValueChange:h=>y(h),children:[f.jsx(pt,{children:f.jsx(za,{children:f.jsx(wo,{placeholder:r?"Loading tools...":"Search or select tools"})})}),f.jsx(Ua,{className:"max-h-[200px] overflow-y-auto",children:(m??[]).map(h=>f.jsx(Fn,{value:h.name,children:h.name},h.id))})]}),f.jsx(lt,{})]})}),f.jsx("div",{className:"space-y-2",children:d.watch("toolIds")?l.filter(v=>d.getValues("toolIds").some(h=>h===v.id)).map(v=>f.jsx(oA,{tool:v,showDescription:!0,isAddModal:!0,onClick:()=>w(v.id||"")},v.id)):null}),f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsx(ue,{variant:"ghost",type:"button",onClick:()=>e(),children:"Cancel"}),f.jsxs("div",{className:"flex gap-3",children:[o&&f.jsxs("div",{className:Tt("mr-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Adding tool to agent..."})]}),f.jsx(ue,{type:"submit",children:"Add Tool"})]})]})]})})},ale=({open:e,onOpenChange:t})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsx(Pt,{children:f.jsx($t,{children:"Add Tool"})}),f.jsx(rle,{closeDialog:()=>t(!1)})]})}),ole=({toolId:e,onClose:t})=>{const{mutate:n,isPending:r}=cf(),{data:a}=Y9(),o=Bt(),i=p.useMemo(()=>new Set(a==null?void 0:a.tools),[a]),s=()=>{!e||!(a!=null&&a.id)||n({agentId:a.id,requestBody:{id:a.id,tools:Array.from(i).filter(l=>l!==e)}},{onSuccess:()=>{o.invalidateQueries({queryKey:$s({agentId:a.id||""})}),t()}})};return f.jsx(Kt,{open:!0,onOpenChange:()=>{t()},children:f.jsxs(Ht,{className:"max-h-[95svh] w-full max-w-80 overflow-auto",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Remove Tool"}),f.jsx(dn,{children:"Are you sure you want to remove this Tool? This is a base Agent tool, removing it might result in problems in hove the Agent functions."})]}),f.jsxs("div",{className:"flex justify-end gap-4",children:[f.jsx(ue,{type:"button",variant:"ghost",onClick:()=>t(),children:"Cancel"}),f.jsx(ue,{isBusy:r,onClick:s,children:"Remove"})]})]})})},ile=({open:e,onOpenChange:t,onOpenAddToolsChange:n,tools:r,onRemoveTool:a})=>{const[o,i]=p.useState(!1),[s,l]=p.useState(""),c=(r??[]).filter(u=>{var d;return(d=u.name)==null?void 0:d.toLowerCase().includes(s.toLowerCase())});return f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full overflow-auto sm:max-w-[800px]",children:[f.jsx(Pt,{children:f.jsx($t,{children:"Tools"})}),f.jsx(aA,{items:r,searchTerm:s,setSearchTerm:l,setShowSearchInput:i,showSearchInput:o,onOpenAddDialog:n,buttonText:"Add Tool"}),c==null?void 0:c.map(u=>f.jsx(oA,{tool:u,showDescription:!0,onClick:()=>a(u.name||"")},u.id))]})})},sle=({tools:e})=>{const[t,n]=p.useState(!1),[r,a]=p.useState(!1),[o,i]=p.useState(null),{data:s}=Xm(),l=p.useMemo(()=>(s==null?void 0:s.filter(u=>e.find(d=>d===u.name)))||[],[s,e]),c=(s||[]).length>l.length;return f.jsxs(f.Fragment,{children:[f.jsxs("div",{className:"py-4",children:[f.jsxs(wh,{button:c?f.jsx(rA,{onClick:()=>n(!0)}):null,children:["Tools (",e.length,")"]}),f.jsx("div",{className:"mt-2 space-y-2",children:l.sort(ele).slice(0,3).map(u=>f.jsx(oA,{tool:u,onClick:()=>i(u.name||"")},u.id))}),e.length<3?null:f.jsxs(ue,{onClick:()=>a(!0),className:"mt-2 h-7 w-fit p-2 font-semibold",variant:"link",children:["See all ",f.jsx($m,{className:"ml-2 h-4 w-4"})]})]}),f.jsx(ile,{onOpenChange:u=>a(u),open:r,onOpenAddToolsChange:u=>n(u),tools:l,onRemoveTool:u=>i(u)}),f.jsx(ale,{onOpenChange:n,open:t}),o&&f.jsx(ole,{onClose:()=>i(null),toolId:o})]})};function lle(e){const{agent:t}=e,[n,r]=p.useState(!1),{data:a}=w6(),{mutate:o}=cf(),i=Bt(),s=p.useCallback(l=>{if(!t.id)return;const c=a==null?void 0:a.find(u=>u.model===l);c&&o({agentId:t.id,requestBody:{llm_config:c,id:t.id}},{onSuccess:()=>{i.setQueriesData({queryKey:$s({agentId:t.id||""})},u=>{if(u)return{...u,llm_config:c}})}})},[t.id,o,i]);return f.jsx("div",{className:"pb-6 pt-4",children:f.jsxs("div",{className:"h-[35px] flex flex-col justify-between",children:[f.jsx(Sh,{children:"Model"}),n?f.jsxs("div",{className:"flex items-center gap-2",children:[f.jsxs(So,{value:t.llm_config.model,onValueChange:s,children:[f.jsx(za,{children:f.jsx(wo,{placeholder:"Select a model"})}),f.jsx(Ua,{children:a?a.map(l=>f.jsx(Fn,{value:l.model,children:l.model},l.model)):f.jsx(Fn,{value:"loading",disabled:!0,children:"Loading..."})})]}),f.jsxs("button",{onClick:()=>r(!1),className:"h-7 w-7 p-0",children:[f.jsx(Di,{})," ",f.jsx("div",{className:"sr-only",children:"Close"})," "]})]}):f.jsxs("div",{onClick:()=>r(!0),className:"flex cursor-pointer items-center gap-2 text-sm",children:[t.llm_config.model," ",f.jsx(J4,{className:"w-4"}),f.jsx("div",{className:"sr-only",children:"Edit"})]})]})})}function cle(e){const{agent:t}=e,{data:n}=E6(),[r,a]=p.useState(!1),{mutate:o}=cf(),i=Bt(),s=p.useCallback(l=>{if(!n||!t.id)return;const c=n.find(u=>u.embedding_model===l);c&&o({agentId:t.id,requestBody:{embedding_config:c,id:t.id}},{onSuccess:()=>{i.setQueriesData({queryKey:$s({agentId:t.id||""})},u=>{if(u)return{...u,embedding_config:c}})}})},[t.id,n,o,i]);return f.jsx("div",{className:"pb-6 pt-4",children:f.jsxs("div",{className:"h-[35px] flex w-full flex-col items-start justify-start",children:[f.jsx(Sh,{children:"Embedding Model"}),r?f.jsxs("div",{className:"flex w-full items-center gap-2",children:[f.jsxs(So,{value:t.embedding_config.embedding_model,onValueChange:s,children:[f.jsx(za,{className:"w-full",children:f.jsx(wo,{placeholder:"Select an embedding model"})}),f.jsx(Ua,{children:n?n.map(l=>f.jsx(Fn,{value:l.embedding_model,children:l.embedding_model},l.embedding_model)):f.jsx(Fn,{value:"loading",disabled:!0,children:"Loading..."})})]}),f.jsxs("button",{onClick:()=>a(!1),className:"h-7 w-7 p-0",children:[f.jsx(Di,{})," ",f.jsx("div",{className:"sr-only",children:"Close"})," "]})]}):f.jsxs("div",{onClick:()=>a(!0),className:"flex cursor-pointer items-center gap-2 text-sm",children:[t.embedding_config.embedding_model," ",f.jsx(J4,{className:"w-4"}),f.jsx("div",{className:"sr-only",children:"Edit"})]})]})})}const ule=({currentAgentId:e})=>{const t=To(),{data:n}=y_({agentId:(t==null?void 0:t.id)||""},void 0,{initialData:t,enabled:!!t});return f.jsxs("div",{className:"w-96 flex-none overflow-auto px-4",children:[n&&f.jsx(lle,{agent:n}),n&&f.jsx(cle,{agent:n}),f.jsx(Jse,{agentId:e}),f.jsx(bse,{agentId:e}),f.jsx(Cse,{}),f.jsx(sle,{tools:(n==null?void 0:n.tools)??[]}),f.jsx(Kse,{})]})},RN={user:6,"internal-monologue":5,assistant:4,"function-call":3,"message-receipt":2,error:1,login:0},dle=(e,t)=>e.sort((n,r)=>{const a=n.date.toISOString().localeCompare(r.date.toISOString());return a!==0?a:RN[r.type]-RN[n.type]}).filter(n=>!!n.message),fle=()=>{const e=p.useRef(null),t=p.useRef(null),n=p.useRef(null),[r,a]=p.useState(!0),[o,i]=p.useState(!1),s=p.useCallback(()=>{e.current&&e.current.scrollIntoView({block:"end",behavior:"smooth"})},[]);return p.useEffect(()=>{e.current&&r&&!o&&e.current.scrollIntoView({block:"end"})},[r,o]),p.useEffect(()=>{const{current:l}=t;if(l){const c=u=>{const d=u.target,g=25,m=d.scrollTop+d.clientHeight>=d.scrollHeight-g;a(m)};return l.addEventListener("scroll",c,{passive:!0}),()=>{l.removeEventListener("scroll",c)}}},[]),p.useEffect(()=>{if(n.current){const l=new IntersectionObserver(c=>{c.forEach(u=>{u.isIntersecting?i(!0):i(!1)})},{rootMargin:"0px 0px 100px 0px"});return l.observe(n.current),()=>{l.disconnect()}}}),{messagesRef:e,scrollRef:t,visibilityRef:n,scrollToBottom:s,isAtBottom:r,isVisible:o}},ple=({children:e})=>f.jsx("div",{className:"relative flex-1 overflow-y-auto",children:e}),gle=({name:e,date:t})=>e?f.jsxs("p",{className:"flex items-center",children:[f.jsx("span",{className:"mr-2 flex h-6 w-6 items-center justify-center rounded-full bg-primary text-primary-foreground",children:f.jsx(Lm,{className:"h-4 w-4"})}),f.jsx("span",{className:"text-sm font-semibold text-foreground",children:e}),f.jsx("span",{className:"ml-2 text-xs font-normal text-muted-foreground",children:t?Bs(t,"MMM d yy, h:mm a"):""})]}):null;function mle(e){if(typeof e!="string")throw new TypeError("Expected a string");return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}const Eh=function(e){if(e==null)return vle;if(typeof e=="function")return xh(e);if(typeof e=="object")return Array.isArray(e)?hle(e):ble(e);if(typeof e=="string")return yle(e);throw new Error("Expected function, string, or object as test")};function hle(e){const t=[];let n=-1;for(;++n":""))+")"})}return g;function g(){let m=Z9,b,y,w;if((!t||o(l,c,u[u.length-1]||void 0))&&(m=xle(n(l,u)),m[0]===Ik))return m;if("children"in l&&l.children){const v=l;if(v.children&&m[0]!==Ele)for(y=(r?v.children.length:-1)+i,w=u.concat(v);y>-1&&y0?{type:"text",value:x}:void 0),x===!1?g.lastIndex=E+1:(b!==E&&h.push({type:"text",value:c.value.slice(b,E)}),Array.isArray(x)?h.push(...x):x&&h.push(x),b=E+S[0].length,v=!0),!g.global)break;S=g.exec(c.value)}return v?(b-1&&e.test(String.fromCharCode(n))}}const my="phrasing",hy=["autolink","link","image","label"];function Dle(){return{transforms:[zle],enter:{literalAutolink:Mle,literalAutolinkEmail:by,literalAutolinkHttp:by,literalAutolinkWww:by},exit:{literalAutolink:jle,literalAutolinkEmail:Fle,literalAutolinkHttp:Ple,literalAutolinkWww:$le}}}function Lle(){return{unsafe:[{character:"@",before:"[+\\-.\\w]",after:"[\\-.\\w]",inConstruct:my,notInConstruct:hy},{character:".",before:"[Ww]",after:"[\\-.\\w]",inConstruct:my,notInConstruct:hy},{character:":",before:"[ps]",after:"\\/",inConstruct:my,notInConstruct:hy}]}}function Mle(e){this.enter({type:"link",title:null,url:"",children:[]},e)}function by(e){this.config.enter.autolinkProtocol.call(this,e)}function Ple(e){this.config.exit.autolinkProtocol.call(this,e)}function $le(e){this.config.exit.data.call(this,e);const t=this.stack[this.stack.length-1];t.type,t.url="http://"+this.sliceSerialize(e)}function Fle(e){this.config.exit.autolinkEmail.call(this,e)}function jle(e){this.exit(e)}function zle(e){Q9(e,[[/(https?:\/\/|www(?=\.))([-.\w]+)([^ \t\r\n]*)/gi,Ule],[/([-.\w+]+)@([-\w]+(?:\.[-\w]+)+)/g,Ble]],{ignore:["link","linkReference"]})}function Ule(e,t,n,r,a){let o="";if(!J9(a)||(/^w/i.test(t)&&(n=t+n,t="",o="http://"),!Hle(n)))return!1;const i=Vle(n+r);if(!i[0])return!1;const s={type:"link",title:null,url:o+t+i[0],children:[{type:"text",value:t+i[0]}]};return i[1]?[s,{type:"text",value:i[1]}]:s}function Ble(e,t,n,r){return!J9(r,!0)||/[-\d_]$/.test(n)?!1:{type:"link",title:null,url:"mailto:"+t+"@"+n,children:[{type:"text",value:t+"@"+n}]}}function Hle(e){const t=e.split(".");return!(t.length<2||t[t.length-1]&&(/_/.test(t[t.length-1])||!/[a-zA-Z\d]/.test(t[t.length-1]))||t[t.length-2]&&(/_/.test(t[t.length-2])||!/[a-zA-Z\d]/.test(t[t.length-2])))}function Vle(e){const t=/[!"&'),.:;<>?\]}]+$/.exec(e);if(!t)return[e,void 0];e=e.slice(0,t.index);let n=t[0],r=n.indexOf(")");const a=NN(e,"(");let o=NN(e,")");for(;r!==-1&&a>o;)e+=n.slice(0,r+1),n=n.slice(r+1),r=n.indexOf(")"),o++;return[e,n]}function J9(e,t){const n=e.input.charCodeAt(e.index-1);return(e.index===0||Is(n)||kh(n))&&(!t||n!==47)}function ma(e){return e.replace(/[\t\n\r ]+/g," ").replace(/^ | $/g,"").toLowerCase().toUpperCase()}ej.peek=tce;function qle(){return{enter:{gfmFootnoteDefinition:Wle,gfmFootnoteDefinitionLabelString:Kle,gfmFootnoteCall:Xle,gfmFootnoteCallString:Qle},exit:{gfmFootnoteDefinition:Zle,gfmFootnoteDefinitionLabelString:Yle,gfmFootnoteCall:ece,gfmFootnoteCallString:Jle}}}function Gle(){return{unsafe:[{character:"[",inConstruct:["phrasing","label","reference"]}],handlers:{footnoteDefinition:nce,footnoteReference:ej}}}function Wle(e){this.enter({type:"footnoteDefinition",identifier:"",label:"",children:[]},e)}function Kle(){this.buffer()}function Yle(e){const t=this.resume(),n=this.stack[this.stack.length-1];n.type,n.label=t,n.identifier=ma(this.sliceSerialize(e)).toLowerCase()}function Zle(e){this.exit(e)}function Xle(e){this.enter({type:"footnoteReference",identifier:"",label:""},e)}function Qle(){this.buffer()}function Jle(e){const t=this.resume(),n=this.stack[this.stack.length-1];n.type,n.label=t,n.identifier=ma(this.sliceSerialize(e)).toLowerCase()}function ece(e){this.exit(e)}function ej(e,t,n,r){const a=n.createTracker(r);let o=a.move("[^");const i=n.enter("footnoteReference"),s=n.enter("reference");return o+=a.move(n.safe(n.associationId(e),{...a.current(),before:o,after:"]"})),s(),i(),o+=a.move("]"),o}function tce(){return"["}function nce(e,t,n,r){const a=n.createTracker(r);let o=a.move("[^");const i=n.enter("footnoteDefinition"),s=n.enter("label");return o+=a.move(n.safe(n.associationId(e),{...a.current(),before:o,after:"]"})),s(),o+=a.move("]:"+(e.children&&e.children.length>0?" ":"")),a.shift(4),o+=a.move(n.indentLines(n.containerFlow(e,a.current()),rce)),i(),o}function rce(e,t,n){return t===0?e:(n?"":" ")+e}const ace=["autolink","destinationLiteral","destinationRaw","reference","titleQuote","titleApostrophe"];tj.peek=cce;function oce(){return{canContainEols:["delete"],enter:{strikethrough:sce},exit:{strikethrough:lce}}}function ice(){return{unsafe:[{character:"~",inConstruct:"phrasing",notInConstruct:ace}],handlers:{delete:tj}}}function sce(e){this.enter({type:"delete",children:[]},e)}function lce(e){this.exit(e)}function tj(e,t,n,r){const a=n.createTracker(r),o=n.enter("strikethrough");let i=a.move("~~");return i+=n.containerPhrasing(e,{...a.current(),before:i,after:"~"}),i+=a.move("~~"),o(),i}function cce(){return"~"}function uce(e,t={}){const n=(t.align||[]).concat(),r=t.stringLength||fce,a=[],o=[],i=[],s=[];let l=0,c=-1;for(;++cl&&(l=e[c].length);++ws[w])&&(s[w]=h)}b.push(v)}o[c]=b,i[c]=y}let u=-1;if(typeof n=="object"&&"length"in n)for(;++us[u]&&(s[u]=v),g[u]=v),d[u]=h}o.splice(1,0,d),i.splice(1,0,g),c=-1;const m=[];for(;++c "),o.shift(2);const i=n.indentLines(n.containerFlow(e,o.current()),gce);return a(),i}function gce(e,t,n){return">"+(n?"":" ")+e}function mce(e,t){return ON(e,t.inConstruct,!0)&&!ON(e,t.notInConstruct,!1)}function ON(e,t,n){if(typeof t=="string"&&(t=[t]),!t||t.length===0)return n;let r=-1;for(;++ri&&(i=o):o=1,a=r+t.length,r=n.indexOf(t,a);return i}function bce(e,t){return!!(t.options.fences===!1&&e.value&&!e.lang&&/[^ \r\n]/.test(e.value)&&!/^[\t ]*(?:[\r\n]|$)|(?:^|[\r\n])[\t ]*$/.test(e.value))}function yce(e){const t=e.options.fence||"`";if(t!=="`"&&t!=="~")throw new Error("Cannot serialize code with `"+t+"` for `options.fence`, expected `` ` `` or `~`");return t}function vce(e,t,n,r){const a=yce(n),o=e.value||"",i=a==="`"?"GraveAccent":"Tilde";if(bce(e,n)){const d=n.enter("codeIndented"),g=n.indentLines(o,Sce);return d(),g}const s=n.createTracker(r),l=a.repeat(Math.max(hce(o,a)+1,3)),c=n.enter("codeFenced");let u=s.move(l);if(e.lang){const d=n.enter(`codeFencedLang${i}`);u+=s.move(n.safe(e.lang,{before:u,after:" ",encode:["`"],...s.current()})),d()}if(e.lang&&e.meta){const d=n.enter(`codeFencedMeta${i}`);u+=s.move(" "),u+=s.move(n.safe(e.meta,{before:u,after:` `,encode:["`"],...s.current()})),d()}return u+=s.move(` `),o&&(u+=s.move(o+` `)),u+=s.move(l),c(),u}function Sce(e,t,n){return(n?"":" ")+e}function iA(e){const t=e.options.quote||'"';if(t!=='"'&&t!=="'")throw new Error("Cannot serialize title with `"+t+"` for `options.quote`, expected `\"`, or `'`");return t}function wce(e,t,n,r){const a=iA(n),o=a==='"'?"Quote":"Apostrophe",i=n.enter("definition");let s=n.enter("label");const l=n.createTracker(r);let c=l.move("[");return c+=l.move(n.safe(n.associationId(e),{before:c,after:"]",...l.current()})),c+=l.move("]: "),s(),!e.url||/[\0- \u007F]/.test(e.url)?(s=n.enter("destinationLiteral"),c+=l.move("<"),c+=l.move(n.safe(e.url,{before:c,after:">",...l.current()})),c+=l.move(">")):(s=n.enter("destinationRaw"),c+=l.move(n.safe(e.url,{before:c,after:e.title?" ":` -`,...l.current()}))),s(),e.title&&(s=n.enter(`title${o}`),c+=l.move(" "+a),c+=l.move(n.safe(e.title,{before:c,after:a,...l.current()})),c+=l.move(a),s()),i(),c}function Ece(e){const t=e.options.emphasis||"*";if(t!=="*"&&t!=="_")throw new Error("Cannot serialize emphasis with `"+t+"` for `options.emphasis`, expected `*`, or `_`");return t}tj.peek=xce;function tj(e,t,n,r){const a=Ece(n),o=n.enter("emphasis"),i=n.createTracker(r);let s=i.move(a);return s+=i.move(n.containerPhrasing(e,{before:s,after:a,...i.current()})),s+=i.move(a),o(),s}function xce(e,t,n){return n.options.emphasis||"*"}function sA(e,t,n,r){let a,o,i;typeof t=="function"&&typeof n!="function"?(o=void 0,i=t,a=n):(o=t,i=n,a=r),Z9(e,o,s,a);function s(l,c){const u=c[c.length-1],d=u?u.children.indexOf(l):void 0;return i(l,d,u)}}const kce={};function lA(e,t){const n=t||kce,r=typeof n.includeImageAlt=="boolean"?n.includeImageAlt:!0,a=typeof n.includeHtml=="boolean"?n.includeHtml:!0;return nj(e,r,a)}function nj(e,t,n){if(Cce(e)){if("value"in e)return e.type==="html"&&!n?"":e.value;if(t&&"alt"in e&&e.alt)return e.alt;if("children"in e)return LN(e.children,t,n)}return Array.isArray(e)?LN(e,t,n):""}function LN(e,t,n){const r=[];let a=-1;for(;++a",...l.current()})),c+=l.move(">")):(s=n.enter("destinationRaw"),c+=l.move(n.safe(e.url,{before:c,after:e.title?" ":")",...l.current()}))),s(),e.title&&(s=n.enter(`title${o}`),c+=l.move(" "+a),c+=l.move(n.safe(e.title,{before:c,after:a,...l.current()})),c+=l.move(a),s()),c+=l.move(")"),i(),c}function Rce(){return"!"}oj.peek=Nce;function oj(e,t,n,r){const a=e.referenceType,o=n.enter("imageReference");let i=n.enter("label");const s=n.createTracker(r);let l=s.move("![");const c=n.safe(e.alt,{before:l,after:"]",...s.current()});l+=s.move(c+"]["),i();const u=n.stack;n.stack=[],i=n.enter("reference");const d=n.safe(n.associationId(e),{before:l,after:"]",...s.current()});return i(),n.stack=u,o(),a==="full"||!c||c!==d?l+=s.move(d+"]"):a==="shortcut"?l=l.slice(0,-1):l+=s.move("]"),l}function Nce(){return"!"}ij.peek=Ice;function ij(e,t,n){let r=e.value||"",a="`",o=-1;for(;new RegExp("(^|[^`])"+a+"([^`]|$)").test(r);)a+="`";for(/[^ \r\n]/.test(r)&&(/^[ \r\n]/.test(r)&&/[ \r\n]$/.test(r)||/^`|`$/.test(r))&&(r=" "+r+" ");++o\u007F]/.test(e.url))}lj.peek=Oce;function lj(e,t,n,r){const a=iA(n),o=a==='"'?"Quote":"Apostrophe",i=n.createTracker(r);let s,l;if(sj(e,n)){const u=n.stack;n.stack=[],s=n.enter("autolink");let d=i.move("<");return d+=i.move(n.containerPhrasing(e,{before:d,after:">",...i.current()})),d+=i.move(">"),s(),n.stack=u,d}s=n.enter("link"),l=n.enter("label");let c=i.move("[");return c+=i.move(n.containerPhrasing(e,{before:c,after:"](",...i.current()})),c+=i.move("]("),l(),!e.url&&e.title||/[\0- \u007F]/.test(e.url)?(l=n.enter("destinationLiteral"),c+=i.move("<"),c+=i.move(n.safe(e.url,{before:c,after:">",...i.current()})),c+=i.move(">")):(l=n.enter("destinationRaw"),c+=i.move(n.safe(e.url,{before:c,after:e.title?" ":")",...i.current()}))),l(),e.title&&(l=n.enter(`title${o}`),c+=i.move(" "+a),c+=i.move(n.safe(e.title,{before:c,after:a,...i.current()})),c+=i.move(a),l()),c+=i.move(")"),s(),c}function Oce(e,t,n){return sj(e,n)?"<":"["}cj.peek=Dce;function cj(e,t,n,r){const a=e.referenceType,o=n.enter("linkReference");let i=n.enter("label");const s=n.createTracker(r);let l=s.move("[");const c=n.containerPhrasing(e,{before:l,after:"]",...s.current()});l+=s.move(c+"]["),i();const u=n.stack;n.stack=[],i=n.enter("reference");const d=n.safe(n.associationId(e),{before:l,after:"]",...s.current()});return i(),n.stack=u,o(),a==="full"||!c||c!==d?l+=s.move(d+"]"):a==="shortcut"?l=l.slice(0,-1):l+=s.move("]"),l}function Dce(){return"["}function cA(e){const t=e.options.bullet||"*";if(t!=="*"&&t!=="+"&&t!=="-")throw new Error("Cannot serialize items with `"+t+"` for `options.bullet`, expected `*`, `+`, or `-`");return t}function Lce(e){const t=cA(e),n=e.options.bulletOther;if(!n)return t==="*"?"-":"*";if(n!=="*"&&n!=="+"&&n!=="-")throw new Error("Cannot serialize items with `"+n+"` for `options.bulletOther`, expected `*`, `+`, or `-`");if(n===t)throw new Error("Expected `bullet` (`"+t+"`) and `bulletOther` (`"+n+"`) to be different");return n}function Mce(e){const t=e.options.bulletOrdered||".";if(t!=="."&&t!==")")throw new Error("Cannot serialize items with `"+t+"` for `options.bulletOrdered`, expected `.` or `)`");return t}function uj(e){const t=e.options.rule||"*";if(t!=="*"&&t!=="-"&&t!=="_")throw new Error("Cannot serialize rules with `"+t+"` for `options.rule`, expected `*`, `-`, or `_`");return t}function Pce(e,t,n,r){const a=n.enter("list"),o=n.bulletCurrent;let i=e.ordered?Mce(n):cA(n);const s=e.ordered?i==="."?")":".":Lce(n);let l=t&&n.bulletLastUsed?i===n.bulletLastUsed:!1;if(!e.ordered){const u=e.children?e.children[0]:void 0;if((i==="*"||i==="-")&&u&&(!u.children||!u.children[0])&&n.stack[n.stack.length-1]==="list"&&n.stack[n.stack.length-2]==="listItem"&&n.stack[n.stack.length-3]==="list"&&n.stack[n.stack.length-4]==="listItem"&&n.indexStack[n.indexStack.length-1]===0&&n.indexStack[n.indexStack.length-2]===0&&n.indexStack[n.indexStack.length-3]===0&&(l=!0),uj(n)===i&&u){let d=-1;for(;++d-1?t.start:1)+(n.options.incrementListMarker===!1?0:t.children.indexOf(e))+o);let i=o.length+1;(a==="tab"||a==="mixed"&&(t&&t.type==="list"&&t.spread||e.spread))&&(i=Math.ceil(i/4)*4);const s=n.createTracker(r);s.move(o+" ".repeat(i-o.length)),s.shift(i);const l=n.enter("listItem"),c=n.indentLines(n.containerFlow(e,s.current()),u);return l(),c;function u(d,g,m){return g?(m?"":" ".repeat(i))+d:(m?o:o+" ".repeat(i-o.length))+d}}function jce(e,t,n,r){const a=n.enter("paragraph"),o=n.enter("phrasing"),i=n.containerPhrasing(e,r);return o(),a(),i}const zce=wh(["break","delete","emphasis","footnote","footnoteReference","image","imageReference","inlineCode","inlineMath","link","linkReference","mdxJsxTextElement","mdxTextExpression","strong","text","textDirective"]);function Uce(e,t,n,r){return(e.children.some(function(i){return zce(i)})?n.containerPhrasing:n.containerFlow).call(n,e,r)}function Bce(e){const t=e.options.strong||"*";if(t!=="*"&&t!=="_")throw new Error("Cannot serialize strong with `"+t+"` for `options.strong`, expected `*`, or `_`");return t}dj.peek=Hce;function dj(e,t,n,r){const a=Bce(n),o=n.enter("strong"),i=n.createTracker(r);let s=i.move(a+a);return s+=i.move(n.containerPhrasing(e,{before:s,after:a,...i.current()})),s+=i.move(a+a),o(),s}function Hce(e,t,n){return n.options.strong||"*"}function Vce(e,t,n,r){return n.safe(e.value,r)}function qce(e){const t=e.options.ruleRepetition||3;if(t<3)throw new Error("Cannot serialize rules with repetition `"+t+"` for `options.ruleRepetition`, expected `3` or more");return t}function Gce(e,t,n){const r=(uj(n)+(n.options.ruleSpaces?" ":"")).repeat(qce(n));return n.options.ruleSpaces?r.slice(0,-1):r}const fj={blockquote:pce,break:DN,code:vce,definition:wce,emphasis:tj,hardBreak:DN,heading:Ace,html:rj,image:aj,imageReference:oj,inlineCode:ij,link:lj,linkReference:cj,list:Pce,listItem:Fce,paragraph:jce,root:Uce,strong:dj,text:Vce,thematicBreak:Gce},MN=document.createElement("i");function uA(e){const t="&"+e+";";MN.innerHTML=t;const n=MN.textContent;return n.charCodeAt(n.length-1)===59&&e!=="semi"||n===t?!1:n}function pj(e,t){const n=Number.parseInt(e,t);return n<9||n===11||n>13&&n<32||n>126&&n<160||n>55295&&n<57344||n>64975&&n<65008||(n&65535)===65535||(n&65535)===65534||n>1114111?"�":String.fromCodePoint(n)}const Wce=/\\([!-/:-@[-`{-~])|&(#(?:\d{1,7}|x[\da-f]{1,6})|[\da-z]{1,31});/gi;function Kce(e){return e.replace(Wce,Yce)}function Yce(e,t,n){if(t)return t;if(n.charCodeAt(0)===35){const a=n.charCodeAt(1),o=a===120||a===88;return pj(n.slice(o?2:1),o?16:10)}return uA(n)||e}function Zce(){return{enter:{table:Xce,tableData:PN,tableHeader:PN,tableRow:Jce},exit:{codeText:eue,table:Qce,tableData:by,tableHeader:by,tableRow:by}}}function Xce(e){const t=e._align;this.enter({type:"table",align:t.map(function(n){return n==="none"?null:n}),children:[]},e),this.data.inTable=!0}function Qce(e){this.exit(e),this.data.inTable=void 0}function Jce(e){this.enter({type:"tableRow",children:[]},e)}function by(e){this.exit(e)}function PN(e){this.enter({type:"tableCell",children:[]},e)}function eue(e){let t=this.resume();this.data.inTable&&(t=t.replace(/\\([\\|])/g,tue));const n=this.stack[this.stack.length-1];n.type,n.value=t,this.exit(e)}function tue(e,t){return t==="|"?t:e}function nue(e){const t=e||{},n=t.tableCellPadding,r=t.tablePipeAlign,a=t.stringLength,o=n?" ":"|";return{unsafe:[{character:"\r",inConstruct:"tableCell"},{character:` +`,...o.current()});return/^[\t ]/.test(c)&&(c="&#x"+c.charCodeAt(0).toString(16).toUpperCase()+";"+c.slice(1)),c=c?i+" "+c:i,n.options.closeAtx&&(c+=" "+i),l(),s(),c}aj.peek=Tce;function aj(e){return e.value||""}function Tce(){return"<"}oj.peek=Rce;function oj(e,t,n,r){const a=iA(n),o=a==='"'?"Quote":"Apostrophe",i=n.enter("image");let s=n.enter("label");const l=n.createTracker(r);let c=l.move("![");return c+=l.move(n.safe(e.alt,{before:c,after:"]",...l.current()})),c+=l.move("]("),s(),!e.url&&e.title||/[\0- \u007F]/.test(e.url)?(s=n.enter("destinationLiteral"),c+=l.move("<"),c+=l.move(n.safe(e.url,{before:c,after:">",...l.current()})),c+=l.move(">")):(s=n.enter("destinationRaw"),c+=l.move(n.safe(e.url,{before:c,after:e.title?" ":")",...l.current()}))),s(),e.title&&(s=n.enter(`title${o}`),c+=l.move(" "+a),c+=l.move(n.safe(e.title,{before:c,after:a,...l.current()})),c+=l.move(a),s()),c+=l.move(")"),i(),c}function Rce(){return"!"}ij.peek=Nce;function ij(e,t,n,r){const a=e.referenceType,o=n.enter("imageReference");let i=n.enter("label");const s=n.createTracker(r);let l=s.move("![");const c=n.safe(e.alt,{before:l,after:"]",...s.current()});l+=s.move(c+"]["),i();const u=n.stack;n.stack=[],i=n.enter("reference");const d=n.safe(n.associationId(e),{before:l,after:"]",...s.current()});return i(),n.stack=u,o(),a==="full"||!c||c!==d?l+=s.move(d+"]"):a==="shortcut"?l=l.slice(0,-1):l+=s.move("]"),l}function Nce(){return"!"}sj.peek=Ice;function sj(e,t,n){let r=e.value||"",a="`",o=-1;for(;new RegExp("(^|[^`])"+a+"([^`]|$)").test(r);)a+="`";for(/[^ \r\n]/.test(r)&&(/^[ \r\n]/.test(r)&&/[ \r\n]$/.test(r)||/^`|`$/.test(r))&&(r=" "+r+" ");++o\u007F]/.test(e.url))}cj.peek=Oce;function cj(e,t,n,r){const a=iA(n),o=a==='"'?"Quote":"Apostrophe",i=n.createTracker(r);let s,l;if(lj(e,n)){const u=n.stack;n.stack=[],s=n.enter("autolink");let d=i.move("<");return d+=i.move(n.containerPhrasing(e,{before:d,after:">",...i.current()})),d+=i.move(">"),s(),n.stack=u,d}s=n.enter("link"),l=n.enter("label");let c=i.move("[");return c+=i.move(n.containerPhrasing(e,{before:c,after:"](",...i.current()})),c+=i.move("]("),l(),!e.url&&e.title||/[\0- \u007F]/.test(e.url)?(l=n.enter("destinationLiteral"),c+=i.move("<"),c+=i.move(n.safe(e.url,{before:c,after:">",...i.current()})),c+=i.move(">")):(l=n.enter("destinationRaw"),c+=i.move(n.safe(e.url,{before:c,after:e.title?" ":")",...i.current()}))),l(),e.title&&(l=n.enter(`title${o}`),c+=i.move(" "+a),c+=i.move(n.safe(e.title,{before:c,after:a,...i.current()})),c+=i.move(a),l()),c+=i.move(")"),s(),c}function Oce(e,t,n){return lj(e,n)?"<":"["}uj.peek=Dce;function uj(e,t,n,r){const a=e.referenceType,o=n.enter("linkReference");let i=n.enter("label");const s=n.createTracker(r);let l=s.move("[");const c=n.containerPhrasing(e,{before:l,after:"]",...s.current()});l+=s.move(c+"]["),i();const u=n.stack;n.stack=[],i=n.enter("reference");const d=n.safe(n.associationId(e),{before:l,after:"]",...s.current()});return i(),n.stack=u,o(),a==="full"||!c||c!==d?l+=s.move(d+"]"):a==="shortcut"?l=l.slice(0,-1):l+=s.move("]"),l}function Dce(){return"["}function cA(e){const t=e.options.bullet||"*";if(t!=="*"&&t!=="+"&&t!=="-")throw new Error("Cannot serialize items with `"+t+"` for `options.bullet`, expected `*`, `+`, or `-`");return t}function Lce(e){const t=cA(e),n=e.options.bulletOther;if(!n)return t==="*"?"-":"*";if(n!=="*"&&n!=="+"&&n!=="-")throw new Error("Cannot serialize items with `"+n+"` for `options.bulletOther`, expected `*`, `+`, or `-`");if(n===t)throw new Error("Expected `bullet` (`"+t+"`) and `bulletOther` (`"+n+"`) to be different");return n}function Mce(e){const t=e.options.bulletOrdered||".";if(t!=="."&&t!==")")throw new Error("Cannot serialize items with `"+t+"` for `options.bulletOrdered`, expected `.` or `)`");return t}function dj(e){const t=e.options.rule||"*";if(t!=="*"&&t!=="-"&&t!=="_")throw new Error("Cannot serialize rules with `"+t+"` for `options.rule`, expected `*`, `-`, or `_`");return t}function Pce(e,t,n,r){const a=n.enter("list"),o=n.bulletCurrent;let i=e.ordered?Mce(n):cA(n);const s=e.ordered?i==="."?")":".":Lce(n);let l=t&&n.bulletLastUsed?i===n.bulletLastUsed:!1;if(!e.ordered){const u=e.children?e.children[0]:void 0;if((i==="*"||i==="-")&&u&&(!u.children||!u.children[0])&&n.stack[n.stack.length-1]==="list"&&n.stack[n.stack.length-2]==="listItem"&&n.stack[n.stack.length-3]==="list"&&n.stack[n.stack.length-4]==="listItem"&&n.indexStack[n.indexStack.length-1]===0&&n.indexStack[n.indexStack.length-2]===0&&n.indexStack[n.indexStack.length-3]===0&&(l=!0),dj(n)===i&&u){let d=-1;for(;++d-1?t.start:1)+(n.options.incrementListMarker===!1?0:t.children.indexOf(e))+o);let i=o.length+1;(a==="tab"||a==="mixed"&&(t&&t.type==="list"&&t.spread||e.spread))&&(i=Math.ceil(i/4)*4);const s=n.createTracker(r);s.move(o+" ".repeat(i-o.length)),s.shift(i);const l=n.enter("listItem"),c=n.indentLines(n.containerFlow(e,s.current()),u);return l(),c;function u(d,g,m){return g?(m?"":" ".repeat(i))+d:(m?o:o+" ".repeat(i-o.length))+d}}function jce(e,t,n,r){const a=n.enter("paragraph"),o=n.enter("phrasing"),i=n.containerPhrasing(e,r);return o(),a(),i}const zce=Eh(["break","delete","emphasis","footnote","footnoteReference","image","imageReference","inlineCode","inlineMath","link","linkReference","mdxJsxTextElement","mdxTextExpression","strong","text","textDirective"]);function Uce(e,t,n,r){return(e.children.some(function(i){return zce(i)})?n.containerPhrasing:n.containerFlow).call(n,e,r)}function Bce(e){const t=e.options.strong||"*";if(t!=="*"&&t!=="_")throw new Error("Cannot serialize strong with `"+t+"` for `options.strong`, expected `*`, or `_`");return t}fj.peek=Hce;function fj(e,t,n,r){const a=Bce(n),o=n.enter("strong"),i=n.createTracker(r);let s=i.move(a+a);return s+=i.move(n.containerPhrasing(e,{before:s,after:a,...i.current()})),s+=i.move(a+a),o(),s}function Hce(e,t,n){return n.options.strong||"*"}function Vce(e,t,n,r){return n.safe(e.value,r)}function qce(e){const t=e.options.ruleRepetition||3;if(t<3)throw new Error("Cannot serialize rules with repetition `"+t+"` for `options.ruleRepetition`, expected `3` or more");return t}function Gce(e,t,n){const r=(dj(n)+(n.options.ruleSpaces?" ":"")).repeat(qce(n));return n.options.ruleSpaces?r.slice(0,-1):r}const pj={blockquote:pce,break:DN,code:vce,definition:wce,emphasis:nj,hardBreak:DN,heading:Ace,html:aj,image:oj,imageReference:ij,inlineCode:sj,link:cj,linkReference:uj,list:Pce,listItem:Fce,paragraph:jce,root:Uce,strong:fj,text:Vce,thematicBreak:Gce},MN=document.createElement("i");function uA(e){const t="&"+e+";";MN.innerHTML=t;const n=MN.textContent;return n.charCodeAt(n.length-1)===59&&e!=="semi"||n===t?!1:n}function gj(e,t){const n=Number.parseInt(e,t);return n<9||n===11||n>13&&n<32||n>126&&n<160||n>55295&&n<57344||n>64975&&n<65008||(n&65535)===65535||(n&65535)===65534||n>1114111?"�":String.fromCodePoint(n)}const Wce=/\\([!-/:-@[-`{-~])|&(#(?:\d{1,7}|x[\da-f]{1,6})|[\da-z]{1,31});/gi;function Kce(e){return e.replace(Wce,Yce)}function Yce(e,t,n){if(t)return t;if(n.charCodeAt(0)===35){const a=n.charCodeAt(1),o=a===120||a===88;return gj(n.slice(o?2:1),o?16:10)}return uA(n)||e}function Zce(){return{enter:{table:Xce,tableData:PN,tableHeader:PN,tableRow:Jce},exit:{codeText:eue,table:Qce,tableData:yy,tableHeader:yy,tableRow:yy}}}function Xce(e){const t=e._align;this.enter({type:"table",align:t.map(function(n){return n==="none"?null:n}),children:[]},e),this.data.inTable=!0}function Qce(e){this.exit(e),this.data.inTable=void 0}function Jce(e){this.enter({type:"tableRow",children:[]},e)}function yy(e){this.exit(e)}function PN(e){this.enter({type:"tableCell",children:[]},e)}function eue(e){let t=this.resume();this.data.inTable&&(t=t.replace(/\\([\\|])/g,tue));const n=this.stack[this.stack.length-1];n.type,n.value=t,this.exit(e)}function tue(e,t){return t==="|"?t:e}function nue(e){const t=e||{},n=t.tableCellPadding,r=t.tablePipeAlign,a=t.stringLength,o=n?" ":"|";return{unsafe:[{character:"\r",inConstruct:"tableCell"},{character:` `,inConstruct:"tableCell"},{atBreak:!0,character:"|",after:"[ :-]"},{character:"|",inConstruct:"tableCell"},{atBreak:!0,character:":",after:"-"},{atBreak:!0,character:"-",after:"[:|-]"}],handlers:{inlineCode:g,table:i,tableCell:l,tableRow:s}};function i(m,b,y,w){return c(u(m,y,w),m.align)}function s(m,b,y,w){const v=d(m,y,w),h=c([v]);return h.slice(0,h.indexOf(` -`))}function l(m,b,y,w){const v=y.enter("tableCell"),h=y.enter("phrasing"),S=y.containerPhrasing(m,{...w,before:o,after:o});return h(),v(),S}function c(m,b){return uce(m,{align:b,alignDelimiters:r,padding:n,stringLength:a})}function u(m,b,y){const w=m.children;let v=-1;const h=[],S=b.enter("table");for(;++va?0:a+t:t=t>a?a:t,n=n>0?n:0,r.length<1e4)i=Array.from(r),i.unshift(t,n),e.splice(...i);else for(n&&e.splice(t,n);o0?(Wr(e,e.length,0,t),e):t}const FN={}.hasOwnProperty;function gj(e){const t={};let n=-1;for(;++n0&&!n&&(e[e.length-1][1]._gfmAutolinkLiteralWalkedInto=!0),n}function Hc(e){const t=[];let n=-1,r=0,a=0;for(;++n55295&&o<57344){const s=e.charCodeAt(n+1);o<56320&&s>56319&&s<57344?(i=String.fromCharCode(o,s),a=1):i="�"}else i=String.fromCharCode(o);i&&(t.push(e.slice(r,n),encodeURIComponent(i)),r=n+a+1,i=""),a&&(n+=a,a=0)}return t.join("")+e.slice(r)}function rm(e){if(e===null||Et(e)||Is(e))return 1;if(xh(e))return 2}function kh(e,t,n){const r=[];let a=-1;for(;++a1&&e[n][1].end.offset-e[n][1].start.offset>1?2:1;const d=Object.assign({},e[r][1].end),g=Object.assign({},e[n][1].start);jN(d,-l),jN(g,l),i={type:l>1?"strongSequence":"emphasisSequence",start:d,end:Object.assign({},e[r][1].end)},s={type:l>1?"strongSequence":"emphasisSequence",start:Object.assign({},e[n][1].start),end:g},o={type:l>1?"strongText":"emphasisText",start:Object.assign({},e[r][1].end),end:Object.assign({},e[n][1].start)},a={type:l>1?"strong":"emphasis",start:Object.assign({},i.start),end:Object.assign({},s.end)},e[r][1].end=Object.assign({},i.start),e[n][1].start=Object.assign({},s.end),c=[],e[r][1].end.offset-e[r][1].start.offset&&(c=Br(c,[["enter",e[r][1],t],["exit",e[r][1],t]])),c=Br(c,[["enter",a,t],["enter",i,t],["exit",i,t],["enter",o,t]]),c=Br(c,kh(t.parser.constructs.insideSpan.null,e.slice(r+1,n),t)),c=Br(c,[["exit",o,t],["enter",s,t],["exit",s,t],["exit",a,t]]),e[n][1].end.offset-e[n][1].start.offset?(u=2,c=Br(c,[["enter",e[n][1],t],["exit",e[n][1],t]])):u=0,Wr(e,r-1,n-r+3,c),n=r+c.length-u-2;break}}for(n=-1;++n0&&tt(x)?ct(e,h,"linePrefix",o+1)(x):h(x)}function h(x){return x===null||Oe(x)?e.check(zN,y,E)(x):(e.enter("codeFlowValue"),S(x))}function S(x){return x===null||Oe(x)?(e.exit("codeFlowValue"),h(x)):(e.consume(x),S)}function E(x){return e.exit("codeFenced"),t(x)}function k(x,C,_){let R=0;return T;function T(M){return x.enter("lineEnding"),x.consume(M),x.exit("lineEnding"),L}function L(M){return x.enter("codeFencedFence"),tt(M)?ct(x,D,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(M):D(M)}function D(M){return M===s?(x.enter("codeFencedFenceSequence"),H(M)):_(M)}function H(M){return M===s?(R++,x.consume(M),H):R>=i?(x.exit("codeFencedFenceSequence"),tt(M)?ct(x,z,"whitespace")(M):z(M)):_(M)}function z(M){return M===null||Oe(M)?(x.exit("codeFencedFence"),C(M)):_(M)}}}function Due(e,t,n){const r=this;return a;function a(i){return i===null?n(i):(e.enter("lineEnding"),e.consume(i),e.exit("lineEnding"),o)}function o(i){return r.parser.lazy[r.now().line]?n(i):t(i)}}const yy={name:"codeIndented",tokenize:Mue},Lue={tokenize:Pue,partial:!0};function Mue(e,t,n){const r=this;return a;function a(c){return e.enter("codeIndented"),ct(e,o,"linePrefix",4+1)(c)}function o(c){const u=r.events[r.events.length-1];return u&&u[1].type==="linePrefix"&&u[2].sliceSerialize(u[1],!0).length>=4?i(c):n(c)}function i(c){return c===null?l(c):Oe(c)?e.attempt(Lue,i,l)(c):(e.enter("codeFlowValue"),s(c))}function s(c){return c===null||Oe(c)?(e.exit("codeFlowValue"),i(c)):(e.consume(c),s)}function l(c){return e.exit("codeIndented"),t(c)}}function Pue(e,t,n){const r=this;return a;function a(i){return r.parser.lazy[r.now().line]?n(i):Oe(i)?(e.enter("lineEnding"),e.consume(i),e.exit("lineEnding"),a):ct(e,o,"linePrefix",4+1)(i)}function o(i){const s=r.events[r.events.length-1];return s&&s[1].type==="linePrefix"&&s[2].sliceSerialize(s[1],!0).length>=4?t(i):Oe(i)?a(i):n(i)}}const $ue={name:"codeText",tokenize:zue,resolve:Fue,previous:jue};function Fue(e){let t=e.length-4,n=3,r,a;if((e[n][1].type==="lineEnding"||e[n][1].type==="space")&&(e[t][1].type==="lineEnding"||e[t][1].type==="space")){for(r=n;++r=this.left.length+this.right.length)throw new RangeError("Cannot access index `"+t+"` in a splice buffer of size `"+(this.left.length+this.right.length)+"`");return tthis.left.length?this.right.slice(this.right.length-r+this.left.length,this.right.length-t+this.left.length).reverse():this.left.slice(t).concat(this.right.slice(this.right.length-r+this.left.length).reverse())}splice(t,n,r){const a=n||0;this.setCursor(Math.trunc(t));const o=this.right.splice(this.right.length-a,Number.POSITIVE_INFINITY);return r&&mu(this.left,r),o.reverse()}pop(){return this.setCursor(Number.POSITIVE_INFINITY),this.left.pop()}push(t){this.setCursor(Number.POSITIVE_INFINITY),this.left.push(t)}pushMany(t){this.setCursor(Number.POSITIVE_INFINITY),mu(this.left,t)}unshift(t){this.setCursor(0),this.right.push(t)}unshiftMany(t){this.setCursor(0),mu(this.right,t.reverse())}setCursor(t){if(!(t===this.left.length||t>this.left.length&&this.right.length===0||t<0&&this.left.length===0))if(t=4?t(i):e.interrupt(r.parser.constructs.flow,n,t)(i)}}function Aj(e,t,n,r,a,o,i,s,l){const c=l||Number.POSITIVE_INFINITY;let u=0;return d;function d(v){return v===60?(e.enter(r),e.enter(a),e.enter(o),e.consume(v),e.exit(o),g):v===null||v===32||v===41||nm(v)?n(v):(e.enter(r),e.enter(i),e.enter(s),e.enter("chunkString",{contentType:"string"}),y(v))}function g(v){return v===62?(e.enter(o),e.consume(v),e.exit(o),e.exit(a),e.exit(r),t):(e.enter(s),e.enter("chunkString",{contentType:"string"}),m(v))}function m(v){return v===62?(e.exit("chunkString"),e.exit(s),g(v)):v===null||v===60||Oe(v)?n(v):(e.consume(v),v===92?b:m)}function b(v){return v===60||v===62||v===92?(e.consume(v),m):m(v)}function y(v){return!u&&(v===null||v===41||Et(v))?(e.exit("chunkString"),e.exit(s),e.exit(i),e.exit(r),t(v)):u999||m===null||m===91||m===93&&!l||m===94&&!s&&"_hiddenFootnoteSupport"in i.parser.constructs?n(m):m===93?(e.exit(o),e.enter(a),e.consume(m),e.exit(a),e.exit(r),t):Oe(m)?(e.enter("lineEnding"),e.consume(m),e.exit("lineEnding"),u):(e.enter("chunkString",{contentType:"string"}),d(m))}function d(m){return m===null||m===91||m===93||Oe(m)||s++>999?(e.exit("chunkString"),u(m)):(e.consume(m),l||(l=!tt(m)),m===92?g:d)}function g(m){return m===91||m===92||m===93?(e.consume(m),s++,d):d(m)}}function Rj(e,t,n,r,a,o){let i;return s;function s(g){return g===34||g===39||g===40?(e.enter(r),e.enter(a),e.consume(g),e.exit(a),i=g===40?41:g,l):n(g)}function l(g){return g===i?(e.enter(a),e.consume(g),e.exit(a),e.exit(r),t):(e.enter(o),c(g))}function c(g){return g===i?(e.exit(o),l(i)):g===null?n(g):Oe(g)?(e.enter("lineEnding"),e.consume(g),e.exit("lineEnding"),ct(e,c,"linePrefix")):(e.enter("chunkString",{contentType:"string"}),u(g))}function u(g){return g===i||g===null||Oe(g)?(e.exit("chunkString"),c(g)):(e.consume(g),g===92?d:u)}function d(g){return g===i||g===92?(e.consume(g),u):u(g)}}function Ku(e,t){let n;return r;function r(a){return Oe(a)?(e.enter("lineEnding"),e.consume(a),e.exit("lineEnding"),n=!0,r):tt(a)?ct(e,r,n?"linePrefix":"lineSuffix")(a):t(a)}}const Kue={name:"definition",tokenize:Zue},Yue={tokenize:Xue,partial:!0};function Zue(e,t,n){const r=this;let a;return o;function o(m){return e.enter("definition"),i(m)}function i(m){return Tj.call(r,e,s,n,"definitionLabel","definitionLabelMarker","definitionLabelString")(m)}function s(m){return a=ma(r.sliceSerialize(r.events[r.events.length-1][1]).slice(1,-1)),m===58?(e.enter("definitionMarker"),e.consume(m),e.exit("definitionMarker"),l):n(m)}function l(m){return Et(m)?Ku(e,c)(m):c(m)}function c(m){return Aj(e,u,n,"definitionDestination","definitionDestinationLiteral","definitionDestinationLiteralMarker","definitionDestinationRaw","definitionDestinationString")(m)}function u(m){return e.attempt(Yue,d,d)(m)}function d(m){return tt(m)?ct(e,g,"whitespace")(m):g(m)}function g(m){return m===null||Oe(m)?(e.exit("definition"),r.parser.defined.push(a),t(m)):n(m)}}function Xue(e,t,n){return r;function r(s){return Et(s)?Ku(e,a)(s):n(s)}function a(s){return Rj(e,o,n,"definitionTitle","definitionTitleMarker","definitionTitleString")(s)}function o(s){return tt(s)?ct(e,i,"whitespace")(s):i(s)}function i(s){return s===null||Oe(s)?t(s):n(s)}}const Que={name:"hardBreakEscape",tokenize:Jue};function Jue(e,t,n){return r;function r(o){return e.enter("hardBreakEscape"),e.consume(o),a}function a(o){return Oe(o)?(e.exit("hardBreakEscape"),t(o)):n(o)}}const ede={name:"headingAtx",tokenize:nde,resolve:tde};function tde(e,t){let n=e.length-2,r=3,a,o;return e[r][1].type==="whitespace"&&(r+=2),n-2>r&&e[n][1].type==="whitespace"&&(n-=2),e[n][1].type==="atxHeadingSequence"&&(r===n-1||n-4>r&&e[n-2][1].type==="whitespace")&&(n-=r+1===n?2:4),n>r&&(a={type:"atxHeadingText",start:e[r][1].start,end:e[n][1].end},o={type:"chunkText",start:e[r][1].start,end:e[n][1].end,contentType:"text"},Wr(e,r,n-r+1,[["enter",a,t],["enter",o,t],["exit",o,t],["exit",a,t]])),e}function nde(e,t,n){let r=0;return a;function a(u){return e.enter("atxHeading"),o(u)}function o(u){return e.enter("atxHeadingSequence"),i(u)}function i(u){return u===35&&r++<6?(e.consume(u),i):u===null||Et(u)?(e.exit("atxHeadingSequence"),s(u)):n(u)}function s(u){return u===35?(e.enter("atxHeadingSequence"),l(u)):u===null||Oe(u)?(e.exit("atxHeading"),t(u)):tt(u)?ct(e,s,"whitespace")(u):(e.enter("atxHeadingText"),c(u))}function l(u){return u===35?(e.consume(u),l):(e.exit("atxHeadingSequence"),s(u))}function c(u){return u===null||u===35||Et(u)?(e.exit("atxHeadingText"),s(u)):(e.consume(u),c)}}const rde=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","search","section","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"],BN=["pre","script","style","textarea"],ade={name:"htmlFlow",tokenize:lde,resolveTo:sde,concrete:!0},ode={tokenize:ude,partial:!0},ide={tokenize:cde,partial:!0};function sde(e){let t=e.length;for(;t--&&!(e[t][0]==="enter"&&e[t][1].type==="htmlFlow"););return t>1&&e[t-2][1].type==="linePrefix"&&(e[t][1].start=e[t-2][1].start,e[t+1][1].start=e[t-2][1].start,e.splice(t-2,2)),e}function lde(e,t,n){const r=this;let a,o,i,s,l;return c;function c(N){return u(N)}function u(N){return e.enter("htmlFlow"),e.enter("htmlFlowData"),e.consume(N),d}function d(N){return N===33?(e.consume(N),g):N===47?(e.consume(N),o=!0,y):N===63?(e.consume(N),a=3,r.interrupt?t:A):Zn(N)?(e.consume(N),i=String.fromCharCode(N),w):n(N)}function g(N){return N===45?(e.consume(N),a=2,m):N===91?(e.consume(N),a=5,s=0,b):Zn(N)?(e.consume(N),a=4,r.interrupt?t:A):n(N)}function m(N){return N===45?(e.consume(N),r.interrupt?t:A):n(N)}function b(N){const K="CDATA[";return N===K.charCodeAt(s++)?(e.consume(N),s===K.length?r.interrupt?t:D:b):n(N)}function y(N){return Zn(N)?(e.consume(N),i=String.fromCharCode(N),w):n(N)}function w(N){if(N===null||N===47||N===62||Et(N)){const K=N===47,ae=i.toLowerCase();return!K&&!o&&BN.includes(ae)?(a=1,r.interrupt?t(N):D(N)):rde.includes(i.toLowerCase())?(a=6,K?(e.consume(N),v):r.interrupt?t(N):D(N)):(a=7,r.interrupt&&!r.parser.lazy[r.now().line]?n(N):o?h(N):S(N))}return N===45||$n(N)?(e.consume(N),i+=String.fromCharCode(N),w):n(N)}function v(N){return N===62?(e.consume(N),r.interrupt?t:D):n(N)}function h(N){return tt(N)?(e.consume(N),h):T(N)}function S(N){return N===47?(e.consume(N),T):N===58||N===95||Zn(N)?(e.consume(N),E):tt(N)?(e.consume(N),S):T(N)}function E(N){return N===45||N===46||N===58||N===95||$n(N)?(e.consume(N),E):k(N)}function k(N){return N===61?(e.consume(N),x):tt(N)?(e.consume(N),k):S(N)}function x(N){return N===null||N===60||N===61||N===62||N===96?n(N):N===34||N===39?(e.consume(N),l=N,C):tt(N)?(e.consume(N),x):_(N)}function C(N){return N===l?(e.consume(N),l=null,R):N===null||Oe(N)?n(N):(e.consume(N),C)}function _(N){return N===null||N===34||N===39||N===47||N===60||N===61||N===62||N===96||Et(N)?k(N):(e.consume(N),_)}function R(N){return N===47||N===62||tt(N)?S(N):n(N)}function T(N){return N===62?(e.consume(N),L):n(N)}function L(N){return N===null||Oe(N)?D(N):tt(N)?(e.consume(N),L):n(N)}function D(N){return N===45&&a===2?(e.consume(N),U):N===60&&a===1?(e.consume(N),X):N===62&&a===4?(e.consume(N),V):N===63&&a===3?(e.consume(N),A):N===93&&a===5?(e.consume(N),O):Oe(N)&&(a===6||a===7)?(e.exit("htmlFlowData"),e.check(ode,P,H)(N)):N===null||Oe(N)?(e.exit("htmlFlowData"),H(N)):(e.consume(N),D)}function H(N){return e.check(ide,z,P)(N)}function z(N){return e.enter("lineEnding"),e.consume(N),e.exit("lineEnding"),M}function M(N){return N===null||Oe(N)?H(N):(e.enter("htmlFlowData"),D(N))}function U(N){return N===45?(e.consume(N),A):D(N)}function X(N){return N===47?(e.consume(N),i="",j):D(N)}function j(N){if(N===62){const K=i.toLowerCase();return BN.includes(K)?(e.consume(N),V):D(N)}return Zn(N)&&i.length<8?(e.consume(N),i+=String.fromCharCode(N),j):D(N)}function O(N){return N===93?(e.consume(N),A):D(N)}function A(N){return N===62?(e.consume(N),V):N===45&&a===2?(e.consume(N),A):D(N)}function V(N){return N===null||Oe(N)?(e.exit("htmlFlowData"),P(N)):(e.consume(N),V)}function P(N){return e.exit("htmlFlow"),t(N)}}function cde(e,t,n){const r=this;return a;function a(i){return Oe(i)?(e.enter("lineEnding"),e.consume(i),e.exit("lineEnding"),o):n(i)}function o(i){return r.parser.lazy[r.now().line]?n(i):t(i)}}function ude(e,t,n){return r;function r(a){return e.enter("lineEnding"),e.consume(a),e.exit("lineEnding"),e.attempt(Ef,t,n)}}const dde={name:"htmlText",tokenize:fde};function fde(e,t,n){const r=this;let a,o,i;return s;function s(A){return e.enter("htmlText"),e.enter("htmlTextData"),e.consume(A),l}function l(A){return A===33?(e.consume(A),c):A===47?(e.consume(A),k):A===63?(e.consume(A),S):Zn(A)?(e.consume(A),_):n(A)}function c(A){return A===45?(e.consume(A),u):A===91?(e.consume(A),o=0,b):Zn(A)?(e.consume(A),h):n(A)}function u(A){return A===45?(e.consume(A),m):n(A)}function d(A){return A===null?n(A):A===45?(e.consume(A),g):Oe(A)?(i=d,X(A)):(e.consume(A),d)}function g(A){return A===45?(e.consume(A),m):d(A)}function m(A){return A===62?U(A):A===45?g(A):d(A)}function b(A){const V="CDATA[";return A===V.charCodeAt(o++)?(e.consume(A),o===V.length?y:b):n(A)}function y(A){return A===null?n(A):A===93?(e.consume(A),w):Oe(A)?(i=y,X(A)):(e.consume(A),y)}function w(A){return A===93?(e.consume(A),v):y(A)}function v(A){return A===62?U(A):A===93?(e.consume(A),v):y(A)}function h(A){return A===null||A===62?U(A):Oe(A)?(i=h,X(A)):(e.consume(A),h)}function S(A){return A===null?n(A):A===63?(e.consume(A),E):Oe(A)?(i=S,X(A)):(e.consume(A),S)}function E(A){return A===62?U(A):S(A)}function k(A){return Zn(A)?(e.consume(A),x):n(A)}function x(A){return A===45||$n(A)?(e.consume(A),x):C(A)}function C(A){return Oe(A)?(i=C,X(A)):tt(A)?(e.consume(A),C):U(A)}function _(A){return A===45||$n(A)?(e.consume(A),_):A===47||A===62||Et(A)?R(A):n(A)}function R(A){return A===47?(e.consume(A),U):A===58||A===95||Zn(A)?(e.consume(A),T):Oe(A)?(i=R,X(A)):tt(A)?(e.consume(A),R):U(A)}function T(A){return A===45||A===46||A===58||A===95||$n(A)?(e.consume(A),T):L(A)}function L(A){return A===61?(e.consume(A),D):Oe(A)?(i=L,X(A)):tt(A)?(e.consume(A),L):R(A)}function D(A){return A===null||A===60||A===61||A===62||A===96?n(A):A===34||A===39?(e.consume(A),a=A,H):Oe(A)?(i=D,X(A)):tt(A)?(e.consume(A),D):(e.consume(A),z)}function H(A){return A===a?(e.consume(A),a=void 0,M):A===null?n(A):Oe(A)?(i=H,X(A)):(e.consume(A),H)}function z(A){return A===null||A===34||A===39||A===60||A===61||A===96?n(A):A===47||A===62||Et(A)?R(A):(e.consume(A),z)}function M(A){return A===47||A===62||Et(A)?R(A):n(A)}function U(A){return A===62?(e.consume(A),e.exit("htmlTextData"),e.exit("htmlText"),t):n(A)}function X(A){return e.exit("htmlTextData"),e.enter("lineEnding"),e.consume(A),e.exit("lineEnding"),j}function j(A){return tt(A)?ct(e,O,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(A):O(A)}function O(A){return e.enter("htmlTextData"),i(A)}}const fA={name:"labelEnd",tokenize:yde,resolveTo:bde,resolveAll:hde},pde={tokenize:vde},gde={tokenize:Sde},mde={tokenize:wde};function hde(e){let t=-1;for(;++t=3&&(c===null||Oe(c))?(e.exit("thematicBreak"),t(c)):n(c)}function l(c){return c===a?(e.consume(c),r++,l):(e.exit("thematicBreakSequence"),tt(c)?ct(e,s,"whitespace")(c):s(c))}}const nr={name:"list",tokenize:Nde,continuation:{tokenize:Ide},exit:Dde},Tde={tokenize:Lde,partial:!0},Rde={tokenize:Ode,partial:!0};function Nde(e,t,n){const r=this,a=r.events[r.events.length-1];let o=a&&a[1].type==="linePrefix"?a[2].sliceSerialize(a[1],!0).length:0,i=0;return s;function s(m){const b=r.containerState.type||(m===42||m===43||m===45?"listUnordered":"listOrdered");if(b==="listUnordered"?!r.containerState.marker||m===r.containerState.marker:Ik(m)){if(r.containerState.type||(r.containerState.type=b,e.enter(b,{_container:!0})),b==="listUnordered")return e.enter("listItemPrefix"),m===42||m===45?e.check(Yp,n,c)(m):c(m);if(!r.interrupt||m===49)return e.enter("listItemPrefix"),e.enter("listItemValue"),l(m)}return n(m)}function l(m){return Ik(m)&&++i<10?(e.consume(m),l):(!r.interrupt||i<2)&&(r.containerState.marker?m===r.containerState.marker:m===41||m===46)?(e.exit("listItemValue"),c(m)):n(m)}function c(m){return e.enter("listItemMarker"),e.consume(m),e.exit("listItemMarker"),r.containerState.marker=r.containerState.marker||m,e.check(Ef,r.interrupt?n:u,e.attempt(Tde,g,d))}function u(m){return r.containerState.initialBlankLine=!0,o++,g(m)}function d(m){return tt(m)?(e.enter("listItemPrefixWhitespace"),e.consume(m),e.exit("listItemPrefixWhitespace"),g):n(m)}function g(m){return r.containerState.size=o+r.sliceSerialize(e.exit("listItemPrefix"),!0).length,t(m)}}function Ide(e,t,n){const r=this;return r.containerState._closeFlow=void 0,e.check(Ef,a,o);function a(s){return r.containerState.furtherBlankLines=r.containerState.furtherBlankLines||r.containerState.initialBlankLine,ct(e,t,"listItemIndent",r.containerState.size+1)(s)}function o(s){return r.containerState.furtherBlankLines||!tt(s)?(r.containerState.furtherBlankLines=void 0,r.containerState.initialBlankLine=void 0,i(s)):(r.containerState.furtherBlankLines=void 0,r.containerState.initialBlankLine=void 0,e.attempt(Rde,t,i)(s))}function i(s){return r.containerState._closeFlow=!0,r.interrupt=void 0,ct(e,e.attempt(nr,t,n),"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(s)}}function Ode(e,t,n){const r=this;return ct(e,a,"listItemIndent",r.containerState.size+1);function a(o){const i=r.events[r.events.length-1];return i&&i[1].type==="listItemIndent"&&i[2].sliceSerialize(i[1],!0).length===r.containerState.size?t(o):n(o)}}function Dde(e){e.exit(this.containerState.type)}function Lde(e,t,n){const r=this;return ct(e,a,"listItemPrefixWhitespace",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4+1);function a(o){const i=r.events[r.events.length-1];return!tt(o)&&i&&i[1].type==="listItemPrefixWhitespace"?t(o):n(o)}}const HN={name:"setextUnderline",tokenize:Pde,resolveTo:Mde};function Mde(e,t){let n=e.length,r,a,o;for(;n--;)if(e[n][0]==="enter"){if(e[n][1].type==="content"){r=n;break}e[n][1].type==="paragraph"&&(a=n)}else e[n][1].type==="content"&&e.splice(n,1),!o&&e[n][1].type==="definition"&&(o=n);const i={type:"setextHeading",start:Object.assign({},e[a][1].start),end:Object.assign({},e[e.length-1][1].end)};return e[a][1].type="setextHeadingText",o?(e.splice(a,0,["enter",i,t]),e.splice(o+1,0,["exit",e[r][1],t]),e[r][1].end=Object.assign({},e[o][1].end)):e[r][1]=i,e.push(["exit",i,t]),e}function Pde(e,t,n){const r=this;let a;return o;function o(c){let u=r.events.length,d;for(;u--;)if(r.events[u][1].type!=="lineEnding"&&r.events[u][1].type!=="linePrefix"&&r.events[u][1].type!=="content"){d=r.events[u][1].type==="paragraph";break}return!r.parser.lazy[r.now().line]&&(r.interrupt||d)?(e.enter("setextHeadingLine"),a=c,i(c)):n(c)}function i(c){return e.enter("setextHeadingLineSequence"),s(c)}function s(c){return c===a?(e.consume(c),s):(e.exit("setextHeadingLineSequence"),tt(c)?ct(e,l,"lineSuffix")(c):l(c))}function l(c){return c===null||Oe(c)?(e.exit("setextHeadingLine"),t(c)):n(c)}}const $de={tokenize:qde,partial:!0};function Fde(){return{document:{[91]:{name:"gfmFootnoteDefinition",tokenize:Bde,continuation:{tokenize:Hde},exit:Vde}},text:{[91]:{name:"gfmFootnoteCall",tokenize:Ude},[93]:{name:"gfmPotentialFootnoteCall",add:"after",tokenize:jde,resolveTo:zde}}}}function jde(e,t,n){const r=this;let a=r.events.length;const o=r.parser.gfmFootnotes||(r.parser.gfmFootnotes=[]);let i;for(;a--;){const l=r.events[a][1];if(l.type==="labelImage"){i=l;break}if(l.type==="gfmFootnoteCall"||l.type==="labelLink"||l.type==="label"||l.type==="image"||l.type==="link")break}return s;function s(l){if(!i||!i._balanced)return n(l);const c=ma(r.sliceSerialize({start:i.end,end:r.now()}));return c.codePointAt(0)!==94||!o.includes(c.slice(1))?n(l):(e.enter("gfmFootnoteCallLabelMarker"),e.consume(l),e.exit("gfmFootnoteCallLabelMarker"),t(l))}}function zde(e,t){let n=e.length;for(;n--;)if(e[n][1].type==="labelImage"&&e[n][0]==="enter"){e[n][1];break}e[n+1][1].type="data",e[n+3][1].type="gfmFootnoteCallLabelMarker";const r={type:"gfmFootnoteCall",start:Object.assign({},e[n+3][1].start),end:Object.assign({},e[e.length-1][1].end)},a={type:"gfmFootnoteCallMarker",start:Object.assign({},e[n+3][1].end),end:Object.assign({},e[n+3][1].end)};a.end.column++,a.end.offset++,a.end._bufferIndex++;const o={type:"gfmFootnoteCallString",start:Object.assign({},a.end),end:Object.assign({},e[e.length-1][1].start)},i={type:"chunkString",contentType:"string",start:Object.assign({},o.start),end:Object.assign({},o.end)},s=[e[n+1],e[n+2],["enter",r,t],e[n+3],e[n+4],["enter",a,t],["exit",a,t],["enter",o,t],["enter",i,t],["exit",i,t],["exit",o,t],e[e.length-2],e[e.length-1],["exit",r,t]];return e.splice(n,e.length-n+1,...s),e}function Ude(e,t,n){const r=this,a=r.parser.gfmFootnotes||(r.parser.gfmFootnotes=[]);let o=0,i;return s;function s(d){return e.enter("gfmFootnoteCall"),e.enter("gfmFootnoteCallLabelMarker"),e.consume(d),e.exit("gfmFootnoteCallLabelMarker"),l}function l(d){return d!==94?n(d):(e.enter("gfmFootnoteCallMarker"),e.consume(d),e.exit("gfmFootnoteCallMarker"),e.enter("gfmFootnoteCallString"),e.enter("chunkString").contentType="string",c)}function c(d){if(o>999||d===93&&!i||d===null||d===91||Et(d))return n(d);if(d===93){e.exit("chunkString");const g=e.exit("gfmFootnoteCallString");return a.includes(ma(r.sliceSerialize(g)))?(e.enter("gfmFootnoteCallLabelMarker"),e.consume(d),e.exit("gfmFootnoteCallLabelMarker"),e.exit("gfmFootnoteCall"),t):n(d)}return Et(d)||(i=!0),o++,e.consume(d),d===92?u:c}function u(d){return d===91||d===92||d===93?(e.consume(d),o++,c):c(d)}}function Bde(e,t,n){const r=this,a=r.parser.gfmFootnotes||(r.parser.gfmFootnotes=[]);let o,i=0,s;return l;function l(b){return e.enter("gfmFootnoteDefinition")._container=!0,e.enter("gfmFootnoteDefinitionLabel"),e.enter("gfmFootnoteDefinitionLabelMarker"),e.consume(b),e.exit("gfmFootnoteDefinitionLabelMarker"),c}function c(b){return b===94?(e.enter("gfmFootnoteDefinitionMarker"),e.consume(b),e.exit("gfmFootnoteDefinitionMarker"),e.enter("gfmFootnoteDefinitionLabelString"),e.enter("chunkString").contentType="string",u):n(b)}function u(b){if(i>999||b===93&&!s||b===null||b===91||Et(b))return n(b);if(b===93){e.exit("chunkString");const y=e.exit("gfmFootnoteDefinitionLabelString");return o=ma(r.sliceSerialize(y)),e.enter("gfmFootnoteDefinitionLabelMarker"),e.consume(b),e.exit("gfmFootnoteDefinitionLabelMarker"),e.exit("gfmFootnoteDefinitionLabel"),g}return Et(b)||(s=!0),i++,e.consume(b),b===92?d:u}function d(b){return b===91||b===92||b===93?(e.consume(b),i++,u):u(b)}function g(b){return b===58?(e.enter("definitionMarker"),e.consume(b),e.exit("definitionMarker"),a.includes(o)||a.push(o),ct(e,m,"gfmFootnoteDefinitionWhitespace")):n(b)}function m(b){return t(b)}}function Hde(e,t,n){return e.check(Ef,t,e.attempt($de,t,n))}function Vde(e){e.exit("gfmFootnoteDefinition")}function qde(e,t,n){const r=this;return ct(e,a,"gfmFootnoteDefinitionIndent",4+1);function a(o){const i=r.events[r.events.length-1];return i&&i[1].type==="gfmFootnoteDefinitionIndent"&&i[2].sliceSerialize(i[1],!0).length===4?t(o):n(o)}}function Gde(e){let n=(e||{}).singleTilde;const r={name:"strikethrough",tokenize:o,resolveAll:a};return n==null&&(n=!0),{text:{[126]:r},insideSpan:{null:[r]},attentionMarkers:{null:[126]}};function a(i,s){let l=-1;for(;++l1?l(b):(i.consume(b),d++,m);if(d<2&&!n)return l(b);const w=i.exit("strikethroughSequenceTemporary"),v=rm(b);return w._open=!v||v===2&&!!y,w._close=!y||y===2&&!!v,s(b)}}}class Wde{constructor(){this.map=[]}add(t,n,r){Kde(this,t,n,r)}consume(t){if(this.map.sort(function(o,i){return o[0]-i[0]}),this.map.length===0)return;let n=this.map.length;const r=[];for(;n>0;)n-=1,r.push(t.slice(this.map[n][0]+this.map[n][1]),this.map[n][2]),t.length=this.map[n][0];r.push([...t]),t.length=0;let a=r.pop();for(;a;)t.push(...a),a=r.pop();this.map.length=0}}function Kde(e,t,n,r){let a=0;if(!(n===0&&r.length===0)){for(;a-1;){const z=r.events[L][1].type;if(z==="lineEnding"||z==="linePrefix")L--;else break}const D=L>-1?r.events[L][1].type:null,H=D==="tableHead"||D==="tableRow"?x:l;return H===x&&r.parser.lazy[r.now().line]?n(T):H(T)}function l(T){return e.enter("tableHead"),e.enter("tableRow"),c(T)}function c(T){return T===124||(i=!0,o+=1),u(T)}function u(T){return T===null?n(T):Oe(T)?o>1?(o=0,r.interrupt=!0,e.exit("tableRow"),e.enter("lineEnding"),e.consume(T),e.exit("lineEnding"),m):n(T):tt(T)?ct(e,u,"whitespace")(T):(o+=1,i&&(i=!1,a+=1),T===124?(e.enter("tableCellDivider"),e.consume(T),e.exit("tableCellDivider"),i=!0,u):(e.enter("data"),d(T)))}function d(T){return T===null||T===124||Et(T)?(e.exit("data"),u(T)):(e.consume(T),T===92?g:d)}function g(T){return T===92||T===124?(e.consume(T),d):d(T)}function m(T){return r.interrupt=!1,r.parser.lazy[r.now().line]?n(T):(e.enter("tableDelimiterRow"),i=!1,tt(T)?ct(e,b,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(T):b(T))}function b(T){return T===45||T===58?w(T):T===124?(i=!0,e.enter("tableCellDivider"),e.consume(T),e.exit("tableCellDivider"),y):k(T)}function y(T){return tt(T)?ct(e,w,"whitespace")(T):w(T)}function w(T){return T===58?(o+=1,i=!0,e.enter("tableDelimiterMarker"),e.consume(T),e.exit("tableDelimiterMarker"),v):T===45?(o+=1,v(T)):T===null||Oe(T)?E(T):k(T)}function v(T){return T===45?(e.enter("tableDelimiterFiller"),h(T)):k(T)}function h(T){return T===45?(e.consume(T),h):T===58?(i=!0,e.exit("tableDelimiterFiller"),e.enter("tableDelimiterMarker"),e.consume(T),e.exit("tableDelimiterMarker"),S):(e.exit("tableDelimiterFiller"),S(T))}function S(T){return tt(T)?ct(e,E,"whitespace")(T):E(T)}function E(T){return T===124?b(T):T===null||Oe(T)?!i||a!==o?k(T):(e.exit("tableDelimiterRow"),e.exit("tableHead"),t(T)):k(T)}function k(T){return n(T)}function x(T){return e.enter("tableRow"),C(T)}function C(T){return T===124?(e.enter("tableCellDivider"),e.consume(T),e.exit("tableCellDivider"),C):T===null||Oe(T)?(e.exit("tableRow"),t(T)):tt(T)?ct(e,C,"whitespace")(T):(e.enter("data"),_(T))}function _(T){return T===null||T===124||Et(T)?(e.exit("data"),C(T)):(e.consume(T),T===92?R:_)}function R(T){return T===92||T===124?(e.consume(T),_):_(T)}}function Qde(e,t){let n=-1,r=!0,a=0,o=[0,0,0,0],i=[0,0,0,0],s=!1,l=0,c,u,d;const g=new Wde;for(;++nn[2]+1){const b=n[2]+1,y=n[3]-n[2]-1;e.add(b,y,[])}}e.add(n[3]+1,0,[["exit",d,t]])}return a!==void 0&&(o.end=Object.assign({},pl(t.events,a)),e.add(a,0,[["exit",o,t]]),o=void 0),o}function VN(e,t,n,r,a){const o=[],i=pl(t.events,n);a&&(a.end=Object.assign({},i),o.push(["exit",a,t])),r.end=Object.assign({},i),o.push(["exit",r,t]),e.add(n+1,0,o)}function pl(e,t){const n=e[t],r=n[0]==="enter"?"start":"end";return n[1][r]}const Jde={name:"tasklistCheck",tokenize:tfe};function efe(){return{text:{[91]:Jde}}}function tfe(e,t,n){const r=this;return a;function a(l){return r.previous!==null||!r._gfmTasklistFirstContentOfListItem?n(l):(e.enter("taskListCheck"),e.enter("taskListCheckMarker"),e.consume(l),e.exit("taskListCheckMarker"),o)}function o(l){return Et(l)?(e.enter("taskListCheckValueUnchecked"),e.consume(l),e.exit("taskListCheckValueUnchecked"),i):l===88||l===120?(e.enter("taskListCheckValueChecked"),e.consume(l),e.exit("taskListCheckValueChecked"),i):n(l)}function i(l){return l===93?(e.enter("taskListCheckMarker"),e.consume(l),e.exit("taskListCheckMarker"),e.exit("taskListCheck"),s):n(l)}function s(l){return Oe(l)?t(l):tt(l)?e.check({tokenize:nfe},t,n)(l):n(l)}}function nfe(e,t,n){return ct(e,r,"whitespace");function r(a){return a===null?n(a):t(a)}}function rfe(e){return gj([pue(),Fde(),Gde(e),Zde(),efe()])}const afe={};function ofe(e){const t=this,n=e||afe,r=t.data(),a=r.micromarkExtensions||(r.micromarkExtensions=[]),o=r.fromMarkdownExtensions||(r.fromMarkdownExtensions=[]),i=r.toMarkdownExtensions||(r.toMarkdownExtensions=[]);a.push(rfe(n)),o.push(sue()),i.push(lue(n))}function ife(e,t){if(e==null)return{};var n={},r=Object.keys(e),a,o;for(o=0;o=0)&&(n[a]=e[a]);return n}function sfe(e,t){if(e==null)return{};var n=ife(e,t),r,a;if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}function lfe(e){if(Array.isArray(e))return ik(e)}function cfe(e){if(typeof Symbol<"u"&&e[Symbol.iterator]!=null||e["@@iterator"]!=null)return Array.from(e)}function ufe(){throw new TypeError(`Invalid attempt to spread non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function dfe(e){return lfe(e)||cfe(e)||hre(e)||ufe()}function qN(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),n.push.apply(n,r)}return n}function Il(e){for(var t=1;t=4)return[e[0],e[1],e[2],e[3],"".concat(e[0],".").concat(e[1]),"".concat(e[0],".").concat(e[2]),"".concat(e[0],".").concat(e[3]),"".concat(e[1],".").concat(e[0]),"".concat(e[1],".").concat(e[2]),"".concat(e[1],".").concat(e[3]),"".concat(e[2],".").concat(e[0]),"".concat(e[2],".").concat(e[1]),"".concat(e[2],".").concat(e[3]),"".concat(e[3],".").concat(e[0]),"".concat(e[3],".").concat(e[1]),"".concat(e[3],".").concat(e[2]),"".concat(e[0],".").concat(e[1],".").concat(e[2]),"".concat(e[0],".").concat(e[1],".").concat(e[3]),"".concat(e[0],".").concat(e[2],".").concat(e[1]),"".concat(e[0],".").concat(e[2],".").concat(e[3]),"".concat(e[0],".").concat(e[3],".").concat(e[1]),"".concat(e[0],".").concat(e[3],".").concat(e[2]),"".concat(e[1],".").concat(e[0],".").concat(e[2]),"".concat(e[1],".").concat(e[0],".").concat(e[3]),"".concat(e[1],".").concat(e[2],".").concat(e[0]),"".concat(e[1],".").concat(e[2],".").concat(e[3]),"".concat(e[1],".").concat(e[3],".").concat(e[0]),"".concat(e[1],".").concat(e[3],".").concat(e[2]),"".concat(e[2],".").concat(e[0],".").concat(e[1]),"".concat(e[2],".").concat(e[0],".").concat(e[3]),"".concat(e[2],".").concat(e[1],".").concat(e[0]),"".concat(e[2],".").concat(e[1],".").concat(e[3]),"".concat(e[2],".").concat(e[3],".").concat(e[0]),"".concat(e[2],".").concat(e[3],".").concat(e[1]),"".concat(e[3],".").concat(e[0],".").concat(e[1]),"".concat(e[3],".").concat(e[0],".").concat(e[2]),"".concat(e[3],".").concat(e[1],".").concat(e[0]),"".concat(e[3],".").concat(e[1],".").concat(e[2]),"".concat(e[3],".").concat(e[2],".").concat(e[0]),"".concat(e[3],".").concat(e[2],".").concat(e[1]),"".concat(e[0],".").concat(e[1],".").concat(e[2],".").concat(e[3]),"".concat(e[0],".").concat(e[1],".").concat(e[3],".").concat(e[2]),"".concat(e[0],".").concat(e[2],".").concat(e[1],".").concat(e[3]),"".concat(e[0],".").concat(e[2],".").concat(e[3],".").concat(e[1]),"".concat(e[0],".").concat(e[3],".").concat(e[1],".").concat(e[2]),"".concat(e[0],".").concat(e[3],".").concat(e[2],".").concat(e[1]),"".concat(e[1],".").concat(e[0],".").concat(e[2],".").concat(e[3]),"".concat(e[1],".").concat(e[0],".").concat(e[3],".").concat(e[2]),"".concat(e[1],".").concat(e[2],".").concat(e[0],".").concat(e[3]),"".concat(e[1],".").concat(e[2],".").concat(e[3],".").concat(e[0]),"".concat(e[1],".").concat(e[3],".").concat(e[0],".").concat(e[2]),"".concat(e[1],".").concat(e[3],".").concat(e[2],".").concat(e[0]),"".concat(e[2],".").concat(e[0],".").concat(e[1],".").concat(e[3]),"".concat(e[2],".").concat(e[0],".").concat(e[3],".").concat(e[1]),"".concat(e[2],".").concat(e[1],".").concat(e[0],".").concat(e[3]),"".concat(e[2],".").concat(e[1],".").concat(e[3],".").concat(e[0]),"".concat(e[2],".").concat(e[3],".").concat(e[0],".").concat(e[1]),"".concat(e[2],".").concat(e[3],".").concat(e[1],".").concat(e[0]),"".concat(e[3],".").concat(e[0],".").concat(e[1],".").concat(e[2]),"".concat(e[3],".").concat(e[0],".").concat(e[2],".").concat(e[1]),"".concat(e[3],".").concat(e[1],".").concat(e[0],".").concat(e[2]),"".concat(e[3],".").concat(e[1],".").concat(e[2],".").concat(e[0]),"".concat(e[3],".").concat(e[2],".").concat(e[0],".").concat(e[1]),"".concat(e[3],".").concat(e[2],".").concat(e[1],".").concat(e[0])]}var Sy={};function pfe(e){if(e.length===0||e.length===1)return e;var t=e.join(".");return Sy[t]||(Sy[t]=ffe(e)),Sy[t]}function gfe(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0,r=e.filter(function(o){return o!=="token"}),a=pfe(r);return a.reduce(function(o,i){return Il(Il({},o),n[i])},t)}function GN(e){return e.join(" ")}function mfe(e,t){var n=0;return function(r){return n+=1,r.map(function(a,o){return Nj({node:a,stylesheet:e,useInlineStyles:t,key:"code-segment-".concat(n,"-").concat(o)})})}}function Nj(e){var t=e.node,n=e.stylesheet,r=e.style,a=r===void 0?{}:r,o=e.useInlineStyles,i=e.key,s=t.properties,l=t.type,c=t.tagName,u=t.value;if(l==="text")return u;if(c){var d=mfe(n,o),g;if(!o)g=Il(Il({},s),{},{className:GN(s.className)});else{var m=Object.keys(n).reduce(function(v,h){return h.split(".").forEach(function(S){v.includes(S)||v.push(S)}),v},[]),b=s.className&&s.className.includes("token")?["token"]:[],y=s.className&&b.concat(s.className.filter(function(v){return!m.includes(v)}));g=Il(Il({},s),{},{className:GN(y)||void 0,style:gfe(s.className,Object.assign({},s.style,a),n)})}var w=d(t.children);return Ae.createElement(c,W({key:i},g),w)}}const hfe=function(e,t){var n=e.listLanguages();return n.indexOf(t)!==-1};var bfe=["language","children","style","customStyle","codeTagProps","useInlineStyles","showLineNumbers","showInlineLineNumbers","startingLineNumber","lineNumberContainerStyle","lineNumberStyle","wrapLines","wrapLongLines","lineProps","renderer","PreTag","CodeTag","code","astGenerator"];function WN(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),n.push.apply(n,r)}return n}function Ra(e){for(var t=1;ta?0:a+t:t=t>a?a:t,n=n>0?n:0,r.length<1e4)i=Array.from(r),i.unshift(t,n),e.splice(...i);else for(n&&e.splice(t,n);o0?(Wr(e,e.length,0,t),e):t}const FN={}.hasOwnProperty;function mj(e){const t={};let n=-1;for(;++n0&&!n&&(e[e.length-1][1]._gfmAutolinkLiteralWalkedInto=!0),n}function Hc(e){const t=[];let n=-1,r=0,a=0;for(;++n55295&&o<57344){const s=e.charCodeAt(n+1);o<56320&&s>56319&&s<57344?(i=String.fromCharCode(o,s),a=1):i="�"}else i=String.fromCharCode(o);i&&(t.push(e.slice(r,n),encodeURIComponent(i)),r=n+a+1,i=""),a&&(n+=a,a=0)}return t.join("")+e.slice(r)}function rm(e){if(e===null||Et(e)||Is(e))return 1;if(kh(e))return 2}function Ch(e,t,n){const r=[];let a=-1;for(;++a1&&e[n][1].end.offset-e[n][1].start.offset>1?2:1;const d=Object.assign({},e[r][1].end),g=Object.assign({},e[n][1].start);jN(d,-l),jN(g,l),i={type:l>1?"strongSequence":"emphasisSequence",start:d,end:Object.assign({},e[r][1].end)},s={type:l>1?"strongSequence":"emphasisSequence",start:Object.assign({},e[n][1].start),end:g},o={type:l>1?"strongText":"emphasisText",start:Object.assign({},e[r][1].end),end:Object.assign({},e[n][1].start)},a={type:l>1?"strong":"emphasis",start:Object.assign({},i.start),end:Object.assign({},s.end)},e[r][1].end=Object.assign({},i.start),e[n][1].start=Object.assign({},s.end),c=[],e[r][1].end.offset-e[r][1].start.offset&&(c=Br(c,[["enter",e[r][1],t],["exit",e[r][1],t]])),c=Br(c,[["enter",a,t],["enter",i,t],["exit",i,t],["enter",o,t]]),c=Br(c,Ch(t.parser.constructs.insideSpan.null,e.slice(r+1,n),t)),c=Br(c,[["exit",o,t],["enter",s,t],["exit",s,t],["exit",a,t]]),e[n][1].end.offset-e[n][1].start.offset?(u=2,c=Br(c,[["enter",e[n][1],t],["exit",e[n][1],t]])):u=0,Wr(e,r-1,n-r+3,c),n=r+c.length-u-2;break}}for(n=-1;++n0&&tt(x)?ct(e,h,"linePrefix",o+1)(x):h(x)}function h(x){return x===null||Oe(x)?e.check(zN,y,E)(x):(e.enter("codeFlowValue"),S(x))}function S(x){return x===null||Oe(x)?(e.exit("codeFlowValue"),h(x)):(e.consume(x),S)}function E(x){return e.exit("codeFenced"),t(x)}function k(x,C,_){let R=0;return T;function T(M){return x.enter("lineEnding"),x.consume(M),x.exit("lineEnding"),L}function L(M){return x.enter("codeFencedFence"),tt(M)?ct(x,D,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(M):D(M)}function D(M){return M===s?(x.enter("codeFencedFenceSequence"),H(M)):_(M)}function H(M){return M===s?(R++,x.consume(M),H):R>=i?(x.exit("codeFencedFenceSequence"),tt(M)?ct(x,z,"whitespace")(M):z(M)):_(M)}function z(M){return M===null||Oe(M)?(x.exit("codeFencedFence"),C(M)):_(M)}}}function Due(e,t,n){const r=this;return a;function a(i){return i===null?n(i):(e.enter("lineEnding"),e.consume(i),e.exit("lineEnding"),o)}function o(i){return r.parser.lazy[r.now().line]?n(i):t(i)}}const vy={name:"codeIndented",tokenize:Mue},Lue={tokenize:Pue,partial:!0};function Mue(e,t,n){const r=this;return a;function a(c){return e.enter("codeIndented"),ct(e,o,"linePrefix",4+1)(c)}function o(c){const u=r.events[r.events.length-1];return u&&u[1].type==="linePrefix"&&u[2].sliceSerialize(u[1],!0).length>=4?i(c):n(c)}function i(c){return c===null?l(c):Oe(c)?e.attempt(Lue,i,l)(c):(e.enter("codeFlowValue"),s(c))}function s(c){return c===null||Oe(c)?(e.exit("codeFlowValue"),i(c)):(e.consume(c),s)}function l(c){return e.exit("codeIndented"),t(c)}}function Pue(e,t,n){const r=this;return a;function a(i){return r.parser.lazy[r.now().line]?n(i):Oe(i)?(e.enter("lineEnding"),e.consume(i),e.exit("lineEnding"),a):ct(e,o,"linePrefix",4+1)(i)}function o(i){const s=r.events[r.events.length-1];return s&&s[1].type==="linePrefix"&&s[2].sliceSerialize(s[1],!0).length>=4?t(i):Oe(i)?a(i):n(i)}}const $ue={name:"codeText",tokenize:zue,resolve:Fue,previous:jue};function Fue(e){let t=e.length-4,n=3,r,a;if((e[n][1].type==="lineEnding"||e[n][1].type==="space")&&(e[t][1].type==="lineEnding"||e[t][1].type==="space")){for(r=n;++r=this.left.length+this.right.length)throw new RangeError("Cannot access index `"+t+"` in a splice buffer of size `"+(this.left.length+this.right.length)+"`");return tthis.left.length?this.right.slice(this.right.length-r+this.left.length,this.right.length-t+this.left.length).reverse():this.left.slice(t).concat(this.right.slice(this.right.length-r+this.left.length).reverse())}splice(t,n,r){const a=n||0;this.setCursor(Math.trunc(t));const o=this.right.splice(this.right.length-a,Number.POSITIVE_INFINITY);return r&&mu(this.left,r),o.reverse()}pop(){return this.setCursor(Number.POSITIVE_INFINITY),this.left.pop()}push(t){this.setCursor(Number.POSITIVE_INFINITY),this.left.push(t)}pushMany(t){this.setCursor(Number.POSITIVE_INFINITY),mu(this.left,t)}unshift(t){this.setCursor(0),this.right.push(t)}unshiftMany(t){this.setCursor(0),mu(this.right,t.reverse())}setCursor(t){if(!(t===this.left.length||t>this.left.length&&this.right.length===0||t<0&&this.left.length===0))if(t=4?t(i):e.interrupt(r.parser.constructs.flow,n,t)(i)}}function Tj(e,t,n,r,a,o,i,s,l){const c=l||Number.POSITIVE_INFINITY;let u=0;return d;function d(v){return v===60?(e.enter(r),e.enter(a),e.enter(o),e.consume(v),e.exit(o),g):v===null||v===32||v===41||nm(v)?n(v):(e.enter(r),e.enter(i),e.enter(s),e.enter("chunkString",{contentType:"string"}),y(v))}function g(v){return v===62?(e.enter(o),e.consume(v),e.exit(o),e.exit(a),e.exit(r),t):(e.enter(s),e.enter("chunkString",{contentType:"string"}),m(v))}function m(v){return v===62?(e.exit("chunkString"),e.exit(s),g(v)):v===null||v===60||Oe(v)?n(v):(e.consume(v),v===92?b:m)}function b(v){return v===60||v===62||v===92?(e.consume(v),m):m(v)}function y(v){return!u&&(v===null||v===41||Et(v))?(e.exit("chunkString"),e.exit(s),e.exit(i),e.exit(r),t(v)):u999||m===null||m===91||m===93&&!l||m===94&&!s&&"_hiddenFootnoteSupport"in i.parser.constructs?n(m):m===93?(e.exit(o),e.enter(a),e.consume(m),e.exit(a),e.exit(r),t):Oe(m)?(e.enter("lineEnding"),e.consume(m),e.exit("lineEnding"),u):(e.enter("chunkString",{contentType:"string"}),d(m))}function d(m){return m===null||m===91||m===93||Oe(m)||s++>999?(e.exit("chunkString"),u(m)):(e.consume(m),l||(l=!tt(m)),m===92?g:d)}function g(m){return m===91||m===92||m===93?(e.consume(m),s++,d):d(m)}}function Nj(e,t,n,r,a,o){let i;return s;function s(g){return g===34||g===39||g===40?(e.enter(r),e.enter(a),e.consume(g),e.exit(a),i=g===40?41:g,l):n(g)}function l(g){return g===i?(e.enter(a),e.consume(g),e.exit(a),e.exit(r),t):(e.enter(o),c(g))}function c(g){return g===i?(e.exit(o),l(i)):g===null?n(g):Oe(g)?(e.enter("lineEnding"),e.consume(g),e.exit("lineEnding"),ct(e,c,"linePrefix")):(e.enter("chunkString",{contentType:"string"}),u(g))}function u(g){return g===i||g===null||Oe(g)?(e.exit("chunkString"),c(g)):(e.consume(g),g===92?d:u)}function d(g){return g===i||g===92?(e.consume(g),u):u(g)}}function Ku(e,t){let n;return r;function r(a){return Oe(a)?(e.enter("lineEnding"),e.consume(a),e.exit("lineEnding"),n=!0,r):tt(a)?ct(e,r,n?"linePrefix":"lineSuffix")(a):t(a)}}const Kue={name:"definition",tokenize:Zue},Yue={tokenize:Xue,partial:!0};function Zue(e,t,n){const r=this;let a;return o;function o(m){return e.enter("definition"),i(m)}function i(m){return Rj.call(r,e,s,n,"definitionLabel","definitionLabelMarker","definitionLabelString")(m)}function s(m){return a=ma(r.sliceSerialize(r.events[r.events.length-1][1]).slice(1,-1)),m===58?(e.enter("definitionMarker"),e.consume(m),e.exit("definitionMarker"),l):n(m)}function l(m){return Et(m)?Ku(e,c)(m):c(m)}function c(m){return Tj(e,u,n,"definitionDestination","definitionDestinationLiteral","definitionDestinationLiteralMarker","definitionDestinationRaw","definitionDestinationString")(m)}function u(m){return e.attempt(Yue,d,d)(m)}function d(m){return tt(m)?ct(e,g,"whitespace")(m):g(m)}function g(m){return m===null||Oe(m)?(e.exit("definition"),r.parser.defined.push(a),t(m)):n(m)}}function Xue(e,t,n){return r;function r(s){return Et(s)?Ku(e,a)(s):n(s)}function a(s){return Nj(e,o,n,"definitionTitle","definitionTitleMarker","definitionTitleString")(s)}function o(s){return tt(s)?ct(e,i,"whitespace")(s):i(s)}function i(s){return s===null||Oe(s)?t(s):n(s)}}const Que={name:"hardBreakEscape",tokenize:Jue};function Jue(e,t,n){return r;function r(o){return e.enter("hardBreakEscape"),e.consume(o),a}function a(o){return Oe(o)?(e.exit("hardBreakEscape"),t(o)):n(o)}}const ede={name:"headingAtx",tokenize:nde,resolve:tde};function tde(e,t){let n=e.length-2,r=3,a,o;return e[r][1].type==="whitespace"&&(r+=2),n-2>r&&e[n][1].type==="whitespace"&&(n-=2),e[n][1].type==="atxHeadingSequence"&&(r===n-1||n-4>r&&e[n-2][1].type==="whitespace")&&(n-=r+1===n?2:4),n>r&&(a={type:"atxHeadingText",start:e[r][1].start,end:e[n][1].end},o={type:"chunkText",start:e[r][1].start,end:e[n][1].end,contentType:"text"},Wr(e,r,n-r+1,[["enter",a,t],["enter",o,t],["exit",o,t],["exit",a,t]])),e}function nde(e,t,n){let r=0;return a;function a(u){return e.enter("atxHeading"),o(u)}function o(u){return e.enter("atxHeadingSequence"),i(u)}function i(u){return u===35&&r++<6?(e.consume(u),i):u===null||Et(u)?(e.exit("atxHeadingSequence"),s(u)):n(u)}function s(u){return u===35?(e.enter("atxHeadingSequence"),l(u)):u===null||Oe(u)?(e.exit("atxHeading"),t(u)):tt(u)?ct(e,s,"whitespace")(u):(e.enter("atxHeadingText"),c(u))}function l(u){return u===35?(e.consume(u),l):(e.exit("atxHeadingSequence"),s(u))}function c(u){return u===null||u===35||Et(u)?(e.exit("atxHeadingText"),s(u)):(e.consume(u),c)}}const rde=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","search","section","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"],BN=["pre","script","style","textarea"],ade={name:"htmlFlow",tokenize:lde,resolveTo:sde,concrete:!0},ode={tokenize:ude,partial:!0},ide={tokenize:cde,partial:!0};function sde(e){let t=e.length;for(;t--&&!(e[t][0]==="enter"&&e[t][1].type==="htmlFlow"););return t>1&&e[t-2][1].type==="linePrefix"&&(e[t][1].start=e[t-2][1].start,e[t+1][1].start=e[t-2][1].start,e.splice(t-2,2)),e}function lde(e,t,n){const r=this;let a,o,i,s,l;return c;function c(N){return u(N)}function u(N){return e.enter("htmlFlow"),e.enter("htmlFlowData"),e.consume(N),d}function d(N){return N===33?(e.consume(N),g):N===47?(e.consume(N),o=!0,y):N===63?(e.consume(N),a=3,r.interrupt?t:A):Zn(N)?(e.consume(N),i=String.fromCharCode(N),w):n(N)}function g(N){return N===45?(e.consume(N),a=2,m):N===91?(e.consume(N),a=5,s=0,b):Zn(N)?(e.consume(N),a=4,r.interrupt?t:A):n(N)}function m(N){return N===45?(e.consume(N),r.interrupt?t:A):n(N)}function b(N){const K="CDATA[";return N===K.charCodeAt(s++)?(e.consume(N),s===K.length?r.interrupt?t:D:b):n(N)}function y(N){return Zn(N)?(e.consume(N),i=String.fromCharCode(N),w):n(N)}function w(N){if(N===null||N===47||N===62||Et(N)){const K=N===47,ae=i.toLowerCase();return!K&&!o&&BN.includes(ae)?(a=1,r.interrupt?t(N):D(N)):rde.includes(i.toLowerCase())?(a=6,K?(e.consume(N),v):r.interrupt?t(N):D(N)):(a=7,r.interrupt&&!r.parser.lazy[r.now().line]?n(N):o?h(N):S(N))}return N===45||$n(N)?(e.consume(N),i+=String.fromCharCode(N),w):n(N)}function v(N){return N===62?(e.consume(N),r.interrupt?t:D):n(N)}function h(N){return tt(N)?(e.consume(N),h):T(N)}function S(N){return N===47?(e.consume(N),T):N===58||N===95||Zn(N)?(e.consume(N),E):tt(N)?(e.consume(N),S):T(N)}function E(N){return N===45||N===46||N===58||N===95||$n(N)?(e.consume(N),E):k(N)}function k(N){return N===61?(e.consume(N),x):tt(N)?(e.consume(N),k):S(N)}function x(N){return N===null||N===60||N===61||N===62||N===96?n(N):N===34||N===39?(e.consume(N),l=N,C):tt(N)?(e.consume(N),x):_(N)}function C(N){return N===l?(e.consume(N),l=null,R):N===null||Oe(N)?n(N):(e.consume(N),C)}function _(N){return N===null||N===34||N===39||N===47||N===60||N===61||N===62||N===96||Et(N)?k(N):(e.consume(N),_)}function R(N){return N===47||N===62||tt(N)?S(N):n(N)}function T(N){return N===62?(e.consume(N),L):n(N)}function L(N){return N===null||Oe(N)?D(N):tt(N)?(e.consume(N),L):n(N)}function D(N){return N===45&&a===2?(e.consume(N),U):N===60&&a===1?(e.consume(N),X):N===62&&a===4?(e.consume(N),V):N===63&&a===3?(e.consume(N),A):N===93&&a===5?(e.consume(N),O):Oe(N)&&(a===6||a===7)?(e.exit("htmlFlowData"),e.check(ode,P,H)(N)):N===null||Oe(N)?(e.exit("htmlFlowData"),H(N)):(e.consume(N),D)}function H(N){return e.check(ide,z,P)(N)}function z(N){return e.enter("lineEnding"),e.consume(N),e.exit("lineEnding"),M}function M(N){return N===null||Oe(N)?H(N):(e.enter("htmlFlowData"),D(N))}function U(N){return N===45?(e.consume(N),A):D(N)}function X(N){return N===47?(e.consume(N),i="",j):D(N)}function j(N){if(N===62){const K=i.toLowerCase();return BN.includes(K)?(e.consume(N),V):D(N)}return Zn(N)&&i.length<8?(e.consume(N),i+=String.fromCharCode(N),j):D(N)}function O(N){return N===93?(e.consume(N),A):D(N)}function A(N){return N===62?(e.consume(N),V):N===45&&a===2?(e.consume(N),A):D(N)}function V(N){return N===null||Oe(N)?(e.exit("htmlFlowData"),P(N)):(e.consume(N),V)}function P(N){return e.exit("htmlFlow"),t(N)}}function cde(e,t,n){const r=this;return a;function a(i){return Oe(i)?(e.enter("lineEnding"),e.consume(i),e.exit("lineEnding"),o):n(i)}function o(i){return r.parser.lazy[r.now().line]?n(i):t(i)}}function ude(e,t,n){return r;function r(a){return e.enter("lineEnding"),e.consume(a),e.exit("lineEnding"),e.attempt(Ef,t,n)}}const dde={name:"htmlText",tokenize:fde};function fde(e,t,n){const r=this;let a,o,i;return s;function s(A){return e.enter("htmlText"),e.enter("htmlTextData"),e.consume(A),l}function l(A){return A===33?(e.consume(A),c):A===47?(e.consume(A),k):A===63?(e.consume(A),S):Zn(A)?(e.consume(A),_):n(A)}function c(A){return A===45?(e.consume(A),u):A===91?(e.consume(A),o=0,b):Zn(A)?(e.consume(A),h):n(A)}function u(A){return A===45?(e.consume(A),m):n(A)}function d(A){return A===null?n(A):A===45?(e.consume(A),g):Oe(A)?(i=d,X(A)):(e.consume(A),d)}function g(A){return A===45?(e.consume(A),m):d(A)}function m(A){return A===62?U(A):A===45?g(A):d(A)}function b(A){const V="CDATA[";return A===V.charCodeAt(o++)?(e.consume(A),o===V.length?y:b):n(A)}function y(A){return A===null?n(A):A===93?(e.consume(A),w):Oe(A)?(i=y,X(A)):(e.consume(A),y)}function w(A){return A===93?(e.consume(A),v):y(A)}function v(A){return A===62?U(A):A===93?(e.consume(A),v):y(A)}function h(A){return A===null||A===62?U(A):Oe(A)?(i=h,X(A)):(e.consume(A),h)}function S(A){return A===null?n(A):A===63?(e.consume(A),E):Oe(A)?(i=S,X(A)):(e.consume(A),S)}function E(A){return A===62?U(A):S(A)}function k(A){return Zn(A)?(e.consume(A),x):n(A)}function x(A){return A===45||$n(A)?(e.consume(A),x):C(A)}function C(A){return Oe(A)?(i=C,X(A)):tt(A)?(e.consume(A),C):U(A)}function _(A){return A===45||$n(A)?(e.consume(A),_):A===47||A===62||Et(A)?R(A):n(A)}function R(A){return A===47?(e.consume(A),U):A===58||A===95||Zn(A)?(e.consume(A),T):Oe(A)?(i=R,X(A)):tt(A)?(e.consume(A),R):U(A)}function T(A){return A===45||A===46||A===58||A===95||$n(A)?(e.consume(A),T):L(A)}function L(A){return A===61?(e.consume(A),D):Oe(A)?(i=L,X(A)):tt(A)?(e.consume(A),L):R(A)}function D(A){return A===null||A===60||A===61||A===62||A===96?n(A):A===34||A===39?(e.consume(A),a=A,H):Oe(A)?(i=D,X(A)):tt(A)?(e.consume(A),D):(e.consume(A),z)}function H(A){return A===a?(e.consume(A),a=void 0,M):A===null?n(A):Oe(A)?(i=H,X(A)):(e.consume(A),H)}function z(A){return A===null||A===34||A===39||A===60||A===61||A===96?n(A):A===47||A===62||Et(A)?R(A):(e.consume(A),z)}function M(A){return A===47||A===62||Et(A)?R(A):n(A)}function U(A){return A===62?(e.consume(A),e.exit("htmlTextData"),e.exit("htmlText"),t):n(A)}function X(A){return e.exit("htmlTextData"),e.enter("lineEnding"),e.consume(A),e.exit("lineEnding"),j}function j(A){return tt(A)?ct(e,O,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(A):O(A)}function O(A){return e.enter("htmlTextData"),i(A)}}const fA={name:"labelEnd",tokenize:yde,resolveTo:bde,resolveAll:hde},pde={tokenize:vde},gde={tokenize:Sde},mde={tokenize:wde};function hde(e){let t=-1;for(;++t=3&&(c===null||Oe(c))?(e.exit("thematicBreak"),t(c)):n(c)}function l(c){return c===a?(e.consume(c),r++,l):(e.exit("thematicBreakSequence"),tt(c)?ct(e,s,"whitespace")(c):s(c))}}const nr={name:"list",tokenize:Nde,continuation:{tokenize:Ide},exit:Dde},Tde={tokenize:Lde,partial:!0},Rde={tokenize:Ode,partial:!0};function Nde(e,t,n){const r=this,a=r.events[r.events.length-1];let o=a&&a[1].type==="linePrefix"?a[2].sliceSerialize(a[1],!0).length:0,i=0;return s;function s(m){const b=r.containerState.type||(m===42||m===43||m===45?"listUnordered":"listOrdered");if(b==="listUnordered"?!r.containerState.marker||m===r.containerState.marker:Ok(m)){if(r.containerState.type||(r.containerState.type=b,e.enter(b,{_container:!0})),b==="listUnordered")return e.enter("listItemPrefix"),m===42||m===45?e.check(Yp,n,c)(m):c(m);if(!r.interrupt||m===49)return e.enter("listItemPrefix"),e.enter("listItemValue"),l(m)}return n(m)}function l(m){return Ok(m)&&++i<10?(e.consume(m),l):(!r.interrupt||i<2)&&(r.containerState.marker?m===r.containerState.marker:m===41||m===46)?(e.exit("listItemValue"),c(m)):n(m)}function c(m){return e.enter("listItemMarker"),e.consume(m),e.exit("listItemMarker"),r.containerState.marker=r.containerState.marker||m,e.check(Ef,r.interrupt?n:u,e.attempt(Tde,g,d))}function u(m){return r.containerState.initialBlankLine=!0,o++,g(m)}function d(m){return tt(m)?(e.enter("listItemPrefixWhitespace"),e.consume(m),e.exit("listItemPrefixWhitespace"),g):n(m)}function g(m){return r.containerState.size=o+r.sliceSerialize(e.exit("listItemPrefix"),!0).length,t(m)}}function Ide(e,t,n){const r=this;return r.containerState._closeFlow=void 0,e.check(Ef,a,o);function a(s){return r.containerState.furtherBlankLines=r.containerState.furtherBlankLines||r.containerState.initialBlankLine,ct(e,t,"listItemIndent",r.containerState.size+1)(s)}function o(s){return r.containerState.furtherBlankLines||!tt(s)?(r.containerState.furtherBlankLines=void 0,r.containerState.initialBlankLine=void 0,i(s)):(r.containerState.furtherBlankLines=void 0,r.containerState.initialBlankLine=void 0,e.attempt(Rde,t,i)(s))}function i(s){return r.containerState._closeFlow=!0,r.interrupt=void 0,ct(e,e.attempt(nr,t,n),"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(s)}}function Ode(e,t,n){const r=this;return ct(e,a,"listItemIndent",r.containerState.size+1);function a(o){const i=r.events[r.events.length-1];return i&&i[1].type==="listItemIndent"&&i[2].sliceSerialize(i[1],!0).length===r.containerState.size?t(o):n(o)}}function Dde(e){e.exit(this.containerState.type)}function Lde(e,t,n){const r=this;return ct(e,a,"listItemPrefixWhitespace",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4+1);function a(o){const i=r.events[r.events.length-1];return!tt(o)&&i&&i[1].type==="listItemPrefixWhitespace"?t(o):n(o)}}const HN={name:"setextUnderline",tokenize:Pde,resolveTo:Mde};function Mde(e,t){let n=e.length,r,a,o;for(;n--;)if(e[n][0]==="enter"){if(e[n][1].type==="content"){r=n;break}e[n][1].type==="paragraph"&&(a=n)}else e[n][1].type==="content"&&e.splice(n,1),!o&&e[n][1].type==="definition"&&(o=n);const i={type:"setextHeading",start:Object.assign({},e[a][1].start),end:Object.assign({},e[e.length-1][1].end)};return e[a][1].type="setextHeadingText",o?(e.splice(a,0,["enter",i,t]),e.splice(o+1,0,["exit",e[r][1],t]),e[r][1].end=Object.assign({},e[o][1].end)):e[r][1]=i,e.push(["exit",i,t]),e}function Pde(e,t,n){const r=this;let a;return o;function o(c){let u=r.events.length,d;for(;u--;)if(r.events[u][1].type!=="lineEnding"&&r.events[u][1].type!=="linePrefix"&&r.events[u][1].type!=="content"){d=r.events[u][1].type==="paragraph";break}return!r.parser.lazy[r.now().line]&&(r.interrupt||d)?(e.enter("setextHeadingLine"),a=c,i(c)):n(c)}function i(c){return e.enter("setextHeadingLineSequence"),s(c)}function s(c){return c===a?(e.consume(c),s):(e.exit("setextHeadingLineSequence"),tt(c)?ct(e,l,"lineSuffix")(c):l(c))}function l(c){return c===null||Oe(c)?(e.exit("setextHeadingLine"),t(c)):n(c)}}const $de={tokenize:qde,partial:!0};function Fde(){return{document:{[91]:{name:"gfmFootnoteDefinition",tokenize:Bde,continuation:{tokenize:Hde},exit:Vde}},text:{[91]:{name:"gfmFootnoteCall",tokenize:Ude},[93]:{name:"gfmPotentialFootnoteCall",add:"after",tokenize:jde,resolveTo:zde}}}}function jde(e,t,n){const r=this;let a=r.events.length;const o=r.parser.gfmFootnotes||(r.parser.gfmFootnotes=[]);let i;for(;a--;){const l=r.events[a][1];if(l.type==="labelImage"){i=l;break}if(l.type==="gfmFootnoteCall"||l.type==="labelLink"||l.type==="label"||l.type==="image"||l.type==="link")break}return s;function s(l){if(!i||!i._balanced)return n(l);const c=ma(r.sliceSerialize({start:i.end,end:r.now()}));return c.codePointAt(0)!==94||!o.includes(c.slice(1))?n(l):(e.enter("gfmFootnoteCallLabelMarker"),e.consume(l),e.exit("gfmFootnoteCallLabelMarker"),t(l))}}function zde(e,t){let n=e.length;for(;n--;)if(e[n][1].type==="labelImage"&&e[n][0]==="enter"){e[n][1];break}e[n+1][1].type="data",e[n+3][1].type="gfmFootnoteCallLabelMarker";const r={type:"gfmFootnoteCall",start:Object.assign({},e[n+3][1].start),end:Object.assign({},e[e.length-1][1].end)},a={type:"gfmFootnoteCallMarker",start:Object.assign({},e[n+3][1].end),end:Object.assign({},e[n+3][1].end)};a.end.column++,a.end.offset++,a.end._bufferIndex++;const o={type:"gfmFootnoteCallString",start:Object.assign({},a.end),end:Object.assign({},e[e.length-1][1].start)},i={type:"chunkString",contentType:"string",start:Object.assign({},o.start),end:Object.assign({},o.end)},s=[e[n+1],e[n+2],["enter",r,t],e[n+3],e[n+4],["enter",a,t],["exit",a,t],["enter",o,t],["enter",i,t],["exit",i,t],["exit",o,t],e[e.length-2],e[e.length-1],["exit",r,t]];return e.splice(n,e.length-n+1,...s),e}function Ude(e,t,n){const r=this,a=r.parser.gfmFootnotes||(r.parser.gfmFootnotes=[]);let o=0,i;return s;function s(d){return e.enter("gfmFootnoteCall"),e.enter("gfmFootnoteCallLabelMarker"),e.consume(d),e.exit("gfmFootnoteCallLabelMarker"),l}function l(d){return d!==94?n(d):(e.enter("gfmFootnoteCallMarker"),e.consume(d),e.exit("gfmFootnoteCallMarker"),e.enter("gfmFootnoteCallString"),e.enter("chunkString").contentType="string",c)}function c(d){if(o>999||d===93&&!i||d===null||d===91||Et(d))return n(d);if(d===93){e.exit("chunkString");const g=e.exit("gfmFootnoteCallString");return a.includes(ma(r.sliceSerialize(g)))?(e.enter("gfmFootnoteCallLabelMarker"),e.consume(d),e.exit("gfmFootnoteCallLabelMarker"),e.exit("gfmFootnoteCall"),t):n(d)}return Et(d)||(i=!0),o++,e.consume(d),d===92?u:c}function u(d){return d===91||d===92||d===93?(e.consume(d),o++,c):c(d)}}function Bde(e,t,n){const r=this,a=r.parser.gfmFootnotes||(r.parser.gfmFootnotes=[]);let o,i=0,s;return l;function l(b){return e.enter("gfmFootnoteDefinition")._container=!0,e.enter("gfmFootnoteDefinitionLabel"),e.enter("gfmFootnoteDefinitionLabelMarker"),e.consume(b),e.exit("gfmFootnoteDefinitionLabelMarker"),c}function c(b){return b===94?(e.enter("gfmFootnoteDefinitionMarker"),e.consume(b),e.exit("gfmFootnoteDefinitionMarker"),e.enter("gfmFootnoteDefinitionLabelString"),e.enter("chunkString").contentType="string",u):n(b)}function u(b){if(i>999||b===93&&!s||b===null||b===91||Et(b))return n(b);if(b===93){e.exit("chunkString");const y=e.exit("gfmFootnoteDefinitionLabelString");return o=ma(r.sliceSerialize(y)),e.enter("gfmFootnoteDefinitionLabelMarker"),e.consume(b),e.exit("gfmFootnoteDefinitionLabelMarker"),e.exit("gfmFootnoteDefinitionLabel"),g}return Et(b)||(s=!0),i++,e.consume(b),b===92?d:u}function d(b){return b===91||b===92||b===93?(e.consume(b),i++,u):u(b)}function g(b){return b===58?(e.enter("definitionMarker"),e.consume(b),e.exit("definitionMarker"),a.includes(o)||a.push(o),ct(e,m,"gfmFootnoteDefinitionWhitespace")):n(b)}function m(b){return t(b)}}function Hde(e,t,n){return e.check(Ef,t,e.attempt($de,t,n))}function Vde(e){e.exit("gfmFootnoteDefinition")}function qde(e,t,n){const r=this;return ct(e,a,"gfmFootnoteDefinitionIndent",4+1);function a(o){const i=r.events[r.events.length-1];return i&&i[1].type==="gfmFootnoteDefinitionIndent"&&i[2].sliceSerialize(i[1],!0).length===4?t(o):n(o)}}function Gde(e){let n=(e||{}).singleTilde;const r={name:"strikethrough",tokenize:o,resolveAll:a};return n==null&&(n=!0),{text:{[126]:r},insideSpan:{null:[r]},attentionMarkers:{null:[126]}};function a(i,s){let l=-1;for(;++l1?l(b):(i.consume(b),d++,m);if(d<2&&!n)return l(b);const w=i.exit("strikethroughSequenceTemporary"),v=rm(b);return w._open=!v||v===2&&!!y,w._close=!y||y===2&&!!v,s(b)}}}class Wde{constructor(){this.map=[]}add(t,n,r){Kde(this,t,n,r)}consume(t){if(this.map.sort(function(o,i){return o[0]-i[0]}),this.map.length===0)return;let n=this.map.length;const r=[];for(;n>0;)n-=1,r.push(t.slice(this.map[n][0]+this.map[n][1]),this.map[n][2]),t.length=this.map[n][0];r.push([...t]),t.length=0;let a=r.pop();for(;a;)t.push(...a),a=r.pop();this.map.length=0}}function Kde(e,t,n,r){let a=0;if(!(n===0&&r.length===0)){for(;a-1;){const z=r.events[L][1].type;if(z==="lineEnding"||z==="linePrefix")L--;else break}const D=L>-1?r.events[L][1].type:null,H=D==="tableHead"||D==="tableRow"?x:l;return H===x&&r.parser.lazy[r.now().line]?n(T):H(T)}function l(T){return e.enter("tableHead"),e.enter("tableRow"),c(T)}function c(T){return T===124||(i=!0,o+=1),u(T)}function u(T){return T===null?n(T):Oe(T)?o>1?(o=0,r.interrupt=!0,e.exit("tableRow"),e.enter("lineEnding"),e.consume(T),e.exit("lineEnding"),m):n(T):tt(T)?ct(e,u,"whitespace")(T):(o+=1,i&&(i=!1,a+=1),T===124?(e.enter("tableCellDivider"),e.consume(T),e.exit("tableCellDivider"),i=!0,u):(e.enter("data"),d(T)))}function d(T){return T===null||T===124||Et(T)?(e.exit("data"),u(T)):(e.consume(T),T===92?g:d)}function g(T){return T===92||T===124?(e.consume(T),d):d(T)}function m(T){return r.interrupt=!1,r.parser.lazy[r.now().line]?n(T):(e.enter("tableDelimiterRow"),i=!1,tt(T)?ct(e,b,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(T):b(T))}function b(T){return T===45||T===58?w(T):T===124?(i=!0,e.enter("tableCellDivider"),e.consume(T),e.exit("tableCellDivider"),y):k(T)}function y(T){return tt(T)?ct(e,w,"whitespace")(T):w(T)}function w(T){return T===58?(o+=1,i=!0,e.enter("tableDelimiterMarker"),e.consume(T),e.exit("tableDelimiterMarker"),v):T===45?(o+=1,v(T)):T===null||Oe(T)?E(T):k(T)}function v(T){return T===45?(e.enter("tableDelimiterFiller"),h(T)):k(T)}function h(T){return T===45?(e.consume(T),h):T===58?(i=!0,e.exit("tableDelimiterFiller"),e.enter("tableDelimiterMarker"),e.consume(T),e.exit("tableDelimiterMarker"),S):(e.exit("tableDelimiterFiller"),S(T))}function S(T){return tt(T)?ct(e,E,"whitespace")(T):E(T)}function E(T){return T===124?b(T):T===null||Oe(T)?!i||a!==o?k(T):(e.exit("tableDelimiterRow"),e.exit("tableHead"),t(T)):k(T)}function k(T){return n(T)}function x(T){return e.enter("tableRow"),C(T)}function C(T){return T===124?(e.enter("tableCellDivider"),e.consume(T),e.exit("tableCellDivider"),C):T===null||Oe(T)?(e.exit("tableRow"),t(T)):tt(T)?ct(e,C,"whitespace")(T):(e.enter("data"),_(T))}function _(T){return T===null||T===124||Et(T)?(e.exit("data"),C(T)):(e.consume(T),T===92?R:_)}function R(T){return T===92||T===124?(e.consume(T),_):_(T)}}function Qde(e,t){let n=-1,r=!0,a=0,o=[0,0,0,0],i=[0,0,0,0],s=!1,l=0,c,u,d;const g=new Wde;for(;++nn[2]+1){const b=n[2]+1,y=n[3]-n[2]-1;e.add(b,y,[])}}e.add(n[3]+1,0,[["exit",d,t]])}return a!==void 0&&(o.end=Object.assign({},pl(t.events,a)),e.add(a,0,[["exit",o,t]]),o=void 0),o}function VN(e,t,n,r,a){const o=[],i=pl(t.events,n);a&&(a.end=Object.assign({},i),o.push(["exit",a,t])),r.end=Object.assign({},i),o.push(["exit",r,t]),e.add(n+1,0,o)}function pl(e,t){const n=e[t],r=n[0]==="enter"?"start":"end";return n[1][r]}const Jde={name:"tasklistCheck",tokenize:tfe};function efe(){return{text:{[91]:Jde}}}function tfe(e,t,n){const r=this;return a;function a(l){return r.previous!==null||!r._gfmTasklistFirstContentOfListItem?n(l):(e.enter("taskListCheck"),e.enter("taskListCheckMarker"),e.consume(l),e.exit("taskListCheckMarker"),o)}function o(l){return Et(l)?(e.enter("taskListCheckValueUnchecked"),e.consume(l),e.exit("taskListCheckValueUnchecked"),i):l===88||l===120?(e.enter("taskListCheckValueChecked"),e.consume(l),e.exit("taskListCheckValueChecked"),i):n(l)}function i(l){return l===93?(e.enter("taskListCheckMarker"),e.consume(l),e.exit("taskListCheckMarker"),e.exit("taskListCheck"),s):n(l)}function s(l){return Oe(l)?t(l):tt(l)?e.check({tokenize:nfe},t,n)(l):n(l)}}function nfe(e,t,n){return ct(e,r,"whitespace");function r(a){return a===null?n(a):t(a)}}function rfe(e){return mj([pue(),Fde(),Gde(e),Zde(),efe()])}const afe={};function ofe(e){const t=this,n=e||afe,r=t.data(),a=r.micromarkExtensions||(r.micromarkExtensions=[]),o=r.fromMarkdownExtensions||(r.fromMarkdownExtensions=[]),i=r.toMarkdownExtensions||(r.toMarkdownExtensions=[]);a.push(rfe(n)),o.push(sue()),i.push(lue(n))}function ife(e,t){if(e==null)return{};var n={},r=Object.keys(e),a,o;for(o=0;o=0)&&(n[a]=e[a]);return n}function sfe(e,t){if(e==null)return{};var n=ife(e,t),r,a;if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}function lfe(e){if(Array.isArray(e))return sk(e)}function cfe(e){if(typeof Symbol<"u"&&e[Symbol.iterator]!=null||e["@@iterator"]!=null)return Array.from(e)}function ufe(){throw new TypeError(`Invalid attempt to spread non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function dfe(e){return lfe(e)||cfe(e)||hre(e)||ufe()}function qN(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),n.push.apply(n,r)}return n}function Il(e){for(var t=1;t=4)return[e[0],e[1],e[2],e[3],"".concat(e[0],".").concat(e[1]),"".concat(e[0],".").concat(e[2]),"".concat(e[0],".").concat(e[3]),"".concat(e[1],".").concat(e[0]),"".concat(e[1],".").concat(e[2]),"".concat(e[1],".").concat(e[3]),"".concat(e[2],".").concat(e[0]),"".concat(e[2],".").concat(e[1]),"".concat(e[2],".").concat(e[3]),"".concat(e[3],".").concat(e[0]),"".concat(e[3],".").concat(e[1]),"".concat(e[3],".").concat(e[2]),"".concat(e[0],".").concat(e[1],".").concat(e[2]),"".concat(e[0],".").concat(e[1],".").concat(e[3]),"".concat(e[0],".").concat(e[2],".").concat(e[1]),"".concat(e[0],".").concat(e[2],".").concat(e[3]),"".concat(e[0],".").concat(e[3],".").concat(e[1]),"".concat(e[0],".").concat(e[3],".").concat(e[2]),"".concat(e[1],".").concat(e[0],".").concat(e[2]),"".concat(e[1],".").concat(e[0],".").concat(e[3]),"".concat(e[1],".").concat(e[2],".").concat(e[0]),"".concat(e[1],".").concat(e[2],".").concat(e[3]),"".concat(e[1],".").concat(e[3],".").concat(e[0]),"".concat(e[1],".").concat(e[3],".").concat(e[2]),"".concat(e[2],".").concat(e[0],".").concat(e[1]),"".concat(e[2],".").concat(e[0],".").concat(e[3]),"".concat(e[2],".").concat(e[1],".").concat(e[0]),"".concat(e[2],".").concat(e[1],".").concat(e[3]),"".concat(e[2],".").concat(e[3],".").concat(e[0]),"".concat(e[2],".").concat(e[3],".").concat(e[1]),"".concat(e[3],".").concat(e[0],".").concat(e[1]),"".concat(e[3],".").concat(e[0],".").concat(e[2]),"".concat(e[3],".").concat(e[1],".").concat(e[0]),"".concat(e[3],".").concat(e[1],".").concat(e[2]),"".concat(e[3],".").concat(e[2],".").concat(e[0]),"".concat(e[3],".").concat(e[2],".").concat(e[1]),"".concat(e[0],".").concat(e[1],".").concat(e[2],".").concat(e[3]),"".concat(e[0],".").concat(e[1],".").concat(e[3],".").concat(e[2]),"".concat(e[0],".").concat(e[2],".").concat(e[1],".").concat(e[3]),"".concat(e[0],".").concat(e[2],".").concat(e[3],".").concat(e[1]),"".concat(e[0],".").concat(e[3],".").concat(e[1],".").concat(e[2]),"".concat(e[0],".").concat(e[3],".").concat(e[2],".").concat(e[1]),"".concat(e[1],".").concat(e[0],".").concat(e[2],".").concat(e[3]),"".concat(e[1],".").concat(e[0],".").concat(e[3],".").concat(e[2]),"".concat(e[1],".").concat(e[2],".").concat(e[0],".").concat(e[3]),"".concat(e[1],".").concat(e[2],".").concat(e[3],".").concat(e[0]),"".concat(e[1],".").concat(e[3],".").concat(e[0],".").concat(e[2]),"".concat(e[1],".").concat(e[3],".").concat(e[2],".").concat(e[0]),"".concat(e[2],".").concat(e[0],".").concat(e[1],".").concat(e[3]),"".concat(e[2],".").concat(e[0],".").concat(e[3],".").concat(e[1]),"".concat(e[2],".").concat(e[1],".").concat(e[0],".").concat(e[3]),"".concat(e[2],".").concat(e[1],".").concat(e[3],".").concat(e[0]),"".concat(e[2],".").concat(e[3],".").concat(e[0],".").concat(e[1]),"".concat(e[2],".").concat(e[3],".").concat(e[1],".").concat(e[0]),"".concat(e[3],".").concat(e[0],".").concat(e[1],".").concat(e[2]),"".concat(e[3],".").concat(e[0],".").concat(e[2],".").concat(e[1]),"".concat(e[3],".").concat(e[1],".").concat(e[0],".").concat(e[2]),"".concat(e[3],".").concat(e[1],".").concat(e[2],".").concat(e[0]),"".concat(e[3],".").concat(e[2],".").concat(e[0],".").concat(e[1]),"".concat(e[3],".").concat(e[2],".").concat(e[1],".").concat(e[0])]}var wy={};function pfe(e){if(e.length===0||e.length===1)return e;var t=e.join(".");return wy[t]||(wy[t]=ffe(e)),wy[t]}function gfe(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0,r=e.filter(function(o){return o!=="token"}),a=pfe(r);return a.reduce(function(o,i){return Il(Il({},o),n[i])},t)}function GN(e){return e.join(" ")}function mfe(e,t){var n=0;return function(r){return n+=1,r.map(function(a,o){return Ij({node:a,stylesheet:e,useInlineStyles:t,key:"code-segment-".concat(n,"-").concat(o)})})}}function Ij(e){var t=e.node,n=e.stylesheet,r=e.style,a=r===void 0?{}:r,o=e.useInlineStyles,i=e.key,s=t.properties,l=t.type,c=t.tagName,u=t.value;if(l==="text")return u;if(c){var d=mfe(n,o),g;if(!o)g=Il(Il({},s),{},{className:GN(s.className)});else{var m=Object.keys(n).reduce(function(v,h){return h.split(".").forEach(function(S){v.includes(S)||v.push(S)}),v},[]),b=s.className&&s.className.includes("token")?["token"]:[],y=s.className&&b.concat(s.className.filter(function(v){return!m.includes(v)}));g=Il(Il({},s),{},{className:GN(y)||void 0,style:gfe(s.className,Object.assign({},s.style,a),n)})}var w=d(t.children);return Ae.createElement(c,W({key:i},g),w)}}const hfe=function(e,t){var n=e.listLanguages();return n.indexOf(t)!==-1};var bfe=["language","children","style","customStyle","codeTagProps","useInlineStyles","showLineNumbers","showInlineLineNumbers","startingLineNumber","lineNumberContainerStyle","lineNumberStyle","wrapLines","wrapLongLines","lineProps","renderer","PreTag","CodeTag","code","astGenerator"];function WN(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),n.push.apply(n,r)}return n}function Ra(e){for(var t=1;t1&&arguments[1]!==void 0?arguments[1]:[],n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],r=0;r2&&arguments[2]!==void 0?arguments[2]:[];return Zp({children:k,lineNumber:x,lineNumberStyle:s,largestLineNumber:i,showInlineLineNumbers:a,lineProps:n,className:C,showLineNumbers:r,wrapLongLines:l})}function y(k,x){if(r&&x&&a){var C=Oj(s,x,i);k.unshift(Ij(x,C))}return k}function w(k,x){var C=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[];return t||C.length>0?b(k,x,C):y(k,x)}for(var v=function(){var x=u[m],C=x.children[0].value,_=vfe(C);if(_){var R=C.split(` +`),style:i,startingLineNumber:s}))}function Efe(e){return"".concat(e.toString().length,".25em")}function Oj(e,t){return{type:"element",tagName:"span",properties:{key:"line-number--".concat(e),className:["comment","linenumber","react-syntax-highlighter-line-number"],style:t},children:[{type:"text",value:e}]}}function Dj(e,t,n){var r={display:"inline-block",minWidth:Efe(n),paddingRight:"1em",textAlign:"right",userSelect:"none"},a=typeof e=="function"?e(t):e,o=Ra(Ra({},r),a);return o}function Zp(e){var t=e.children,n=e.lineNumber,r=e.lineNumberStyle,a=e.largestLineNumber,o=e.showInlineLineNumbers,i=e.lineProps,s=i===void 0?{}:i,l=e.className,c=l===void 0?[]:l,u=e.showLineNumbers,d=e.wrapLongLines,g=typeof s=="function"?s(n):s;if(g.className=c,n&&o){var m=Dj(r,n,a);t.unshift(Oj(n,m))}return d&u&&(g.style=Ra(Ra({},g.style),{},{display:"flex"})),{type:"element",tagName:"span",properties:g,children:t}}function Lj(e){for(var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],r=0;r2&&arguments[2]!==void 0?arguments[2]:[];return Zp({children:k,lineNumber:x,lineNumberStyle:s,largestLineNumber:i,showInlineLineNumbers:a,lineProps:n,className:C,showLineNumbers:r,wrapLongLines:l})}function y(k,x){if(r&&x&&a){var C=Dj(s,x,i);k.unshift(Oj(x,C))}return k}function w(k,x){var C=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[];return t||C.length>0?b(k,x,C):y(k,x)}for(var v=function(){var x=u[m],C=x.children[0].value,_=vfe(C);if(_){var R=C.split(` `);R.forEach(function(T,L){var D=r&&d.length+o,H={type:"text",value:"".concat(T,` -`)};if(L===0){var z=u.slice(g+1,m).concat(Zp({children:[H],className:x.properties.className})),M=w(z,D);d.push(M)}else if(L===R.length-1){var U=u[m+1]&&u[m+1].children&&u[m+1].children[0],X={type:"text",value:"".concat(T)};if(U){var j=Zp({children:[X],className:x.properties.className});u.splice(m+1,0,j)}else{var O=[X],A=w(O,D,x.properties.className);d.push(A)}}else{var V=[H],P=w(V,D,x.properties.className);d.push(P)}}),g=m}m++};m4&&n.slice(0,4)===bA&&bpe.test(t)&&(t.charAt(4)==="-"?r=Spe(t):t=wpe(t),a=gpe),new a(r,t))}function Spe(e){var t=e.slice(5).replace(Hj,xpe);return bA+t.charAt(0).toUpperCase()+t.slice(1)}function wpe(e){var t=e.slice(4);return Hj.test(t)?e:(t=t.replace(ype,Epe),t.charAt(0)!=="-"&&(t="-"+t),bA+t)}function Epe(e){return"-"+e.toLowerCase()}function xpe(e){return e.charAt(1).toUpperCase()}var kpe=Cpe,QN=/[#.]/g;function Cpe(e,t){for(var n=e||"",r=t||"div",a={},o=0,i,s,l;o=48&&t<=57}var Wme=Kme;function Kme(e){var t=typeof e=="string"?e.charCodeAt(0):e;return t>=97&&t<=102||t>=65&&t<=70||t>=48&&t<=57}var Yme=Zme;function Zme(e){var t=typeof e=="string"?e.charCodeAt(0):e;return t>=97&&t<=122||t>=65&&t<=90}var Xme=Yme,Qme=Gj,Jme=ehe;function ehe(e){return Xme(e)||Qme(e)}var gp,the=59,nhe=rhe;function rhe(e){var t="&"+e+";",n;return gp=gp||document.createElement("i"),gp.innerHTML=t,n=gp.textContent,n.charCodeAt(n.length-1)===the&&e!=="semi"||n===t?!1:n}var oI=Vme,iI=qme,ahe=Gj,ohe=Wme,Wj=Jme,ihe=nhe,she=She,lhe={}.hasOwnProperty,ol=String.fromCharCode,che=Function.prototype,sI={warning:null,reference:null,text:null,warningContext:null,referenceContext:null,textContext:null,position:{},additional:null,attribute:!1,nonTerminated:!0},uhe=9,lI=10,dhe=12,fhe=32,cI=38,phe=59,ghe=60,mhe=61,hhe=35,bhe=88,yhe=120,vhe=65533,gl="named",SA="hexadecimal",wA="decimal",EA={};EA[SA]=16;EA[wA]=10;var Ch={};Ch[gl]=Wj;Ch[wA]=ahe;Ch[SA]=ohe;var Kj=1,Yj=2,Zj=3,Xj=4,Qj=5,Mk=6,Jj=7,Fi={};Fi[Kj]="Named character references must be terminated by a semicolon";Fi[Yj]="Numeric character references must be terminated by a semicolon";Fi[Zj]="Named character references cannot be empty";Fi[Xj]="Numeric character references cannot be empty";Fi[Qj]="Named character references must be known";Fi[Mk]="Numeric character references cannot be disallowed";Fi[Jj]="Numeric character references cannot be outside the permissible Unicode range";function She(e,t){var n={},r,a;t||(t={});for(a in sI)r=t[a],n[a]=r??sI[a];return(n.position.indent||n.position.start)&&(n.indent=n.position.indent||[],n.position=n.position.start),whe(e,n)}function whe(e,t){var n=t.additional,r=t.nonTerminated,a=t.text,o=t.reference,i=t.warning,s=t.textContext,l=t.referenceContext,c=t.warningContext,u=t.position,d=t.indent||[],g=e.length,m=0,b=-1,y=u.column||1,w=u.line||1,v="",h=[],S,E,k,x,C,_,R,T,L,D,H,z,M,U,X,j,O,A,V;for(typeof n=="string"&&(n=n.charCodeAt(0)),j=P(),T=i?N:che,m--,g++;++m65535&&(_-=65536,D+=ol(_>>>10|55296),_=56320|_&1023),_=D+ol(_))):U!==gl&&T(Xj,A)),_?(K(),j=P(),m=V-1,y+=V-M+1,h.push(_),O=P(),O.offset++,o&&o.call(l,_,{start:j,end:O},e.slice(M-1,V)),j=O):(x=e.slice(M-1,V),v+=x,y+=x.length,m=V-1)}else C===10&&(w++,b++,y=0),C===C?(v+=ol(C),y++):K();return h.join("");function P(){return{line:w,column:y,offset:m+(u.offset||0)}}function N(ae,ne){var Q=P();Q.column+=ne,Q.offset+=ne,i.call(c,Fi[ae],Q,ae)}function K(){v&&(h.push(v),a&&a.call(s,v,{start:j,end:P()}),v="")}}function Ehe(e){return e>=55296&&e<=57343||e>1114111}function xhe(e){return e>=1&&e<=8||e===11||e>=13&&e<=31||e>=127&&e<=159||e>=64976&&e<=65007||(e&65535)===65535||(e&65535)===65534}var ez={exports:{}};(function(e){var t=typeof window<"u"?window:typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope?self:{};/** +`)};if(L===0){var z=u.slice(g+1,m).concat(Zp({children:[H],className:x.properties.className})),M=w(z,D);d.push(M)}else if(L===R.length-1){var U=u[m+1]&&u[m+1].children&&u[m+1].children[0],X={type:"text",value:"".concat(T)};if(U){var j=Zp({children:[X],className:x.properties.className});u.splice(m+1,0,j)}else{var O=[X],A=w(O,D,x.properties.className);d.push(A)}}else{var V=[H],P=w(V,D,x.properties.className);d.push(P)}}),g=m}m++};m4&&n.slice(0,4)===bA&&bpe.test(t)&&(t.charAt(4)==="-"?r=Spe(t):t=wpe(t),a=gpe),new a(r,t))}function Spe(e){var t=e.slice(5).replace(Vj,xpe);return bA+t.charAt(0).toUpperCase()+t.slice(1)}function wpe(e){var t=e.slice(4);return Vj.test(t)?e:(t=t.replace(ype,Epe),t.charAt(0)!=="-"&&(t="-"+t),bA+t)}function Epe(e){return"-"+e.toLowerCase()}function xpe(e){return e.charAt(1).toUpperCase()}var kpe=Cpe,QN=/[#.]/g;function Cpe(e,t){for(var n=e||"",r=t||"div",a={},o=0,i,s,l;o=48&&t<=57}var Wme=Kme;function Kme(e){var t=typeof e=="string"?e.charCodeAt(0):e;return t>=97&&t<=102||t>=65&&t<=70||t>=48&&t<=57}var Yme=Zme;function Zme(e){var t=typeof e=="string"?e.charCodeAt(0):e;return t>=97&&t<=122||t>=65&&t<=90}var Xme=Yme,Qme=Wj,Jme=ehe;function ehe(e){return Xme(e)||Qme(e)}var gp,the=59,nhe=rhe;function rhe(e){var t="&"+e+";",n;return gp=gp||document.createElement("i"),gp.innerHTML=t,n=gp.textContent,n.charCodeAt(n.length-1)===the&&e!=="semi"||n===t?!1:n}var oI=Vme,iI=qme,ahe=Wj,ohe=Wme,Kj=Jme,ihe=nhe,she=She,lhe={}.hasOwnProperty,ol=String.fromCharCode,che=Function.prototype,sI={warning:null,reference:null,text:null,warningContext:null,referenceContext:null,textContext:null,position:{},additional:null,attribute:!1,nonTerminated:!0},uhe=9,lI=10,dhe=12,fhe=32,cI=38,phe=59,ghe=60,mhe=61,hhe=35,bhe=88,yhe=120,vhe=65533,gl="named",SA="hexadecimal",wA="decimal",EA={};EA[SA]=16;EA[wA]=10;var _h={};_h[gl]=Kj;_h[wA]=ahe;_h[SA]=ohe;var Yj=1,Zj=2,Xj=3,Qj=4,Jj=5,Pk=6,ez=7,Fi={};Fi[Yj]="Named character references must be terminated by a semicolon";Fi[Zj]="Numeric character references must be terminated by a semicolon";Fi[Xj]="Named character references cannot be empty";Fi[Qj]="Numeric character references cannot be empty";Fi[Jj]="Named character references must be known";Fi[Pk]="Numeric character references cannot be disallowed";Fi[ez]="Numeric character references cannot be outside the permissible Unicode range";function She(e,t){var n={},r,a;t||(t={});for(a in sI)r=t[a],n[a]=r??sI[a];return(n.position.indent||n.position.start)&&(n.indent=n.position.indent||[],n.position=n.position.start),whe(e,n)}function whe(e,t){var n=t.additional,r=t.nonTerminated,a=t.text,o=t.reference,i=t.warning,s=t.textContext,l=t.referenceContext,c=t.warningContext,u=t.position,d=t.indent||[],g=e.length,m=0,b=-1,y=u.column||1,w=u.line||1,v="",h=[],S,E,k,x,C,_,R,T,L,D,H,z,M,U,X,j,O,A,V;for(typeof n=="string"&&(n=n.charCodeAt(0)),j=P(),T=i?N:che,m--,g++;++m65535&&(_-=65536,D+=ol(_>>>10|55296),_=56320|_&1023),_=D+ol(_))):U!==gl&&T(Qj,A)),_?(K(),j=P(),m=V-1,y+=V-M+1,h.push(_),O=P(),O.offset++,o&&o.call(l,_,{start:j,end:O},e.slice(M-1,V)),j=O):(x=e.slice(M-1,V),v+=x,y+=x.length,m=V-1)}else C===10&&(w++,b++,y=0),C===C?(v+=ol(C),y++):K();return h.join("");function P(){return{line:w,column:y,offset:m+(u.offset||0)}}function N(ae,ne){var Q=P();Q.column+=ne,Q.offset+=ne,i.call(c,Fi[ae],Q,ae)}function K(){v&&(h.push(v),a&&a.call(s,v,{start:j,end:P()}),v="")}}function Ehe(e){return e>=55296&&e<=57343||e>1114111}function xhe(e){return e>=1&&e<=8||e===11||e>=13&&e<=31||e>=127&&e<=159||e>=64976&&e<=65007||(e&65535)===65535||(e&65535)===65534}var tz={exports:{}};(function(e){var t=typeof window<"u"?window:typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope?self:{};/** * Prism: Lightweight, robust, elegant syntax highlighting * * @license MIT * @author Lea Verou * @namespace * @public - */var n=function(r){var a=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,o=0,i={},s={manual:r.Prism&&r.Prism.manual,disableWorkerMessageHandler:r.Prism&&r.Prism.disableWorkerMessageHandler,util:{encode:function h(S){return S instanceof l?new l(S.type,h(S.content),S.alias):Array.isArray(S)?S.map(h):S.replace(/&/g,"&").replace(/"u")return null;if("currentScript"in document&&1<2)return document.currentScript;try{throw new Error}catch(k){var h=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(k.stack)||[])[1];if(h){var S=document.getElementsByTagName("script");for(var E in S)if(S[E].src==h)return S[E]}return null}},isActive:function(h,S,E){for(var k="no-"+S;h;){var x=h.classList;if(x.contains(S))return!0;if(x.contains(k))return!1;h=h.parentElement}return!!E}},languages:{plain:i,plaintext:i,text:i,txt:i,extend:function(h,S){var E=s.util.clone(s.languages[h]);for(var k in S)E[k]=S[k];return E},insertBefore:function(h,S,E,k){k=k||s.languages;var x=k[h],C={};for(var _ in x)if(x.hasOwnProperty(_)){if(_==S)for(var R in E)E.hasOwnProperty(R)&&(C[R]=E[R]);E.hasOwnProperty(_)||(C[_]=x[_])}var T=k[h];return k[h]=C,s.languages.DFS(s.languages,function(L,D){D===T&&L!=h&&(this[L]=C)}),C},DFS:function h(S,E,k,x){x=x||{};var C=s.util.objId;for(var _ in S)if(S.hasOwnProperty(_)){E.call(S,_,S[_],k||_);var R=S[_],T=s.util.type(R);T==="Object"&&!x[C(R)]?(x[C(R)]=!0,h(R,E,null,x)):T==="Array"&&!x[C(R)]&&(x[C(R)]=!0,h(R,E,_,x))}}},plugins:{},highlightAll:function(h,S){s.highlightAllUnder(document,h,S)},highlightAllUnder:function(h,S,E){var k={callback:E,container:h,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};s.hooks.run("before-highlightall",k),k.elements=Array.prototype.slice.apply(k.container.querySelectorAll(k.selector)),s.hooks.run("before-all-elements-highlight",k);for(var x=0,C;C=k.elements[x++];)s.highlightElement(C,S===!0,k.callback)},highlightElement:function(h,S,E){var k=s.util.getLanguage(h),x=s.languages[k];s.util.setLanguage(h,k);var C=h.parentElement;C&&C.nodeName.toLowerCase()==="pre"&&s.util.setLanguage(C,k);var _=h.textContent,R={element:h,language:k,grammar:x,code:_};function T(D){R.highlightedCode=D,s.hooks.run("before-insert",R),R.element.innerHTML=R.highlightedCode,s.hooks.run("after-highlight",R),s.hooks.run("complete",R),E&&E.call(R.element)}if(s.hooks.run("before-sanity-check",R),C=R.element.parentElement,C&&C.nodeName.toLowerCase()==="pre"&&!C.hasAttribute("tabindex")&&C.setAttribute("tabindex","0"),!R.code){s.hooks.run("complete",R),E&&E.call(R.element);return}if(s.hooks.run("before-highlight",R),!R.grammar){T(s.util.encode(R.code));return}if(S&&r.Worker){var L=new Worker(s.filename);L.onmessage=function(D){T(D.data)},L.postMessage(JSON.stringify({language:R.language,code:R.code,immediateClose:!0}))}else T(s.highlight(R.code,R.grammar,R.language))},highlight:function(h,S,E){var k={code:h,grammar:S,language:E};if(s.hooks.run("before-tokenize",k),!k.grammar)throw new Error('The language "'+k.language+'" has no grammar.');return k.tokens=s.tokenize(k.code,k.grammar),s.hooks.run("after-tokenize",k),l.stringify(s.util.encode(k.tokens),k.language)},tokenize:function(h,S){var E=S.rest;if(E){for(var k in E)S[k]=E[k];delete S.rest}var x=new d;return g(x,x.head,h),u(h,x,S,x.head,0),b(x)},hooks:{all:{},add:function(h,S){var E=s.hooks.all;E[h]=E[h]||[],E[h].push(S)},run:function(h,S){var E=s.hooks.all[h];if(!(!E||!E.length))for(var k=0,x;x=E[k++];)x(S)}},Token:l};r.Prism=s;function l(h,S,E,k){this.type=h,this.content=S,this.alias=E,this.length=(k||"").length|0}l.stringify=function h(S,E){if(typeof S=="string")return S;if(Array.isArray(S)){var k="";return S.forEach(function(T){k+=h(T,E)}),k}var x={type:S.type,content:h(S.content,E),tag:"span",classes:["token",S.type],attributes:{},language:E},C=S.alias;C&&(Array.isArray(C)?Array.prototype.push.apply(x.classes,C):x.classes.push(C)),s.hooks.run("wrap",x);var _="";for(var R in x.attributes)_+=" "+R+'="'+(x.attributes[R]||"").replace(/"/g,""")+'"';return"<"+x.tag+' class="'+x.classes.join(" ")+'"'+_+">"+x.content+""};function c(h,S,E,k){h.lastIndex=S;var x=h.exec(E);if(x&&k&&x[1]){var C=x[1].length;x.index+=C,x[0]=x[0].slice(C)}return x}function u(h,S,E,k,x,C){for(var _ in E)if(!(!E.hasOwnProperty(_)||!E[_])){var R=E[_];R=Array.isArray(R)?R:[R];for(var T=0;T=C.reach);O+=j.value.length,j=j.next){var A=j.value;if(S.length>h.length)return;if(!(A instanceof l)){var V=1,P;if(z){if(P=c(X,O,h,H),!P||P.index>=h.length)break;var ne=P.index,N=P.index+P[0].length,K=O;for(K+=j.value.length;ne>=K;)j=j.next,K+=j.value.length;if(K-=j.value.length,O=K,j.value instanceof l)continue;for(var ae=j;ae!==S.tail&&(KC.reach&&(C.reach=re);var Ee=j.prev;pe&&(Ee=g(S,Ee,pe),O+=pe.length),m(S,Ee,V);var ke=new l(_,D?s.tokenize(Q,D):Q,M,Q);if(j=g(S,Ee,ke),he&&g(S,j,he),V>1){var We={cause:_+","+T,reach:re};u(h,S,E,j.prev,O,We),C&&We.reach>C.reach&&(C.reach=We.reach)}}}}}}function d(){var h={value:null,prev:null,next:null},S={value:null,prev:h,next:null};h.next=S,this.head=h,this.tail=S,this.length=0}function g(h,S,E){var k=S.next,x={value:E,prev:S,next:k};return S.next=x,k.prev=x,h.length++,x}function m(h,S,E){for(var k=S.next,x=0;x/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},e.languages.markup.tag.inside["attr-value"].inside.entity=e.languages.markup.entity,e.languages.markup.doctype.inside["internal-subset"].inside=e.languages.markup,e.hooks.add("wrap",function(t){t.type==="entity"&&(t.attributes.title=t.content.value.replace(/&/,"&"))}),Object.defineProperty(e.languages.markup.tag,"addInlined",{value:function(n,r){var a={};a["language-"+r]={pattern:/(^$)/i,lookbehind:!0,inside:e.languages[r]},a.cdata=/^$/i;var o={"included-cdata":{pattern://i,inside:a}};o["language-"+r]={pattern:/[\s\S]+/,inside:e.languages[r]};var i={};i[n]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return n}),"i"),lookbehind:!0,greedy:!0,inside:o},e.languages.insertBefore("markup","cdata",i)}}),Object.defineProperty(e.languages.markup.tag,"addAttribute",{value:function(t,n){e.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+t+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[n,"language-"+n],inside:e.languages[n]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),e.languages.html=e.languages.markup,e.languages.mathml=e.languages.markup,e.languages.svg=e.languages.markup,e.languages.xml=e.languages.extend("markup",{}),e.languages.ssml=e.languages.xml,e.languages.atom=e.languages.xml,e.languages.rss=e.languages.xml}var _he=kA;kA.displayName="css";kA.aliases=[];function kA(e){(function(t){var n=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;t.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+n.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+n.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+n.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:n,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},t.languages.css.atrule.inside.rest=t.languages.css;var r=t.languages.markup;r&&(r.tag.addInlined("style","css"),r.tag.addAttribute("style","css"))})(e)}var Ahe=CA;CA.displayName="clike";CA.aliases=[];function CA(e){e.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}}var The=_A;_A.displayName="javascript";_A.aliases=["js"];function _A(e){e.languages.javascript=e.languages.extend("clike",{"class-name":[e.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+(/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source)+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),e.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,e.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:e.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:e.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:e.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:e.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:e.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),e.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:e.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),e.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),e.languages.markup&&(e.languages.markup.tag.addInlined("script","javascript"),e.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),e.languages.js=e.languages.javascript}var Tu=typeof globalThis=="object"?globalThis:typeof self=="object"?self:typeof window=="object"?window:typeof nn=="object"?nn:{},Rhe=qhe();Tu.Prism={manual:!0,disableWorkerMessageHandler:!0};var Nhe=qpe,Ihe=she,tz=khe,Ohe=Che,Dhe=_he,Lhe=Ahe,Mhe=The;Rhe();var AA={}.hasOwnProperty;function nz(){}nz.prototype=tz;var tn=new nz,Phe=tn;tn.highlight=Fhe;tn.register=kf;tn.alias=$he;tn.registered=jhe;tn.listLanguages=zhe;kf(Ohe);kf(Dhe);kf(Lhe);kf(Mhe);tn.util.encode=Hhe;tn.Token.stringify=Uhe;function kf(e){if(typeof e!="function"||!e.displayName)throw new Error("Expected `function` for `grammar`, got `"+e+"`");tn.languages[e.displayName]===void 0&&e(tn)}function $he(e,t){var n=tn.languages,r=e,a,o,i,s;t&&(r={},r[e]=t);for(a in r)for(o=r[a],o=typeof o=="string"?[o]:o,i=o.length,s=-1;++s code[class*="language-"]':{background:"#f5f2f0",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"slategray"},prolog:{color:"slategray"},doctype:{color:"slategray"},cdata:{color:"slategray"},punctuation:{color:"#999"},namespace:{Opacity:".7"},property:{color:"#905"},tag:{color:"#905"},boolean:{color:"#905"},number:{color:"#905"},constant:{color:"#905"},symbol:{color:"#905"},deleted:{color:"#905"},selector:{color:"#690"},"attr-name":{color:"#690"},string:{color:"#690"},char:{color:"#690"},builtin:{color:"#690"},inserted:{color:"#690"},operator:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},entity:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)",cursor:"help"},url:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},".language-css .token.string":{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},".style .token.string":{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},atrule:{color:"#07a"},"attr-value":{color:"#07a"},keyword:{color:"#07a"},function:{color:"#DD4A68"},"class-name":{color:"#DD4A68"},regex:{color:"#e90"},important:{color:"#e90",fontWeight:"bold"},variable:{color:"#e90"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};var wy,uI;function Whe(){if(uI)return wy;uI=1,wy=e,e.displayName="abap",e.aliases=[];function e(t){t.languages.abap={comment:/^\*.*/m,string:/(`|')(?:\\.|(?!\1)[^\\\r\n])*\1/,"string-template":{pattern:/([|}])(?:\\.|[^\\|{\r\n])*(?=[|{])/,lookbehind:!0,alias:"string"},"eol-comment":{pattern:/(^|\s)".*/m,lookbehind:!0,alias:"comment"},keyword:{pattern:/(\s|\.|^)(?:SCIENTIFIC_WITH_LEADING_ZERO|SCALE_PRESERVING_SCIENTIFIC|RMC_COMMUNICATION_FAILURE|END-ENHANCEMENT-SECTION|MULTIPLY-CORRESPONDING|SUBTRACT-CORRESPONDING|VERIFICATION-MESSAGE|DIVIDE-CORRESPONDING|ENHANCEMENT-SECTION|CURRENCY_CONVERSION|RMC_SYSTEM_FAILURE|START-OF-SELECTION|MOVE-CORRESPONDING|RMC_INVALID_STATUS|CUSTOMER-FUNCTION|END-OF-DEFINITION|ENHANCEMENT-POINT|SYSTEM-EXCEPTIONS|ADD-CORRESPONDING|SCALE_PRESERVING|SELECTION-SCREEN|CURSOR-SELECTION|END-OF-SELECTION|LOAD-OF-PROGRAM|SCROLL-BOUNDARY|SELECTION-TABLE|EXCEPTION-TABLE|IMPLEMENTATIONS|PARAMETER-TABLE|RIGHT-JUSTIFIED|UNIT_CONVERSION|AUTHORITY-CHECK|LIST-PROCESSING|SIGN_AS_POSTFIX|COL_BACKGROUND|IMPLEMENTATION|INTERFACE-POOL|TRANSFORMATION|IDENTIFICATION|ENDENHANCEMENT|LINE-SELECTION|INITIALIZATION|LEFT-JUSTIFIED|SELECT-OPTIONS|SELECTION-SETS|COMMUNICATION|CORRESPONDING|DECIMAL_SHIFT|PRINT-CONTROL|VALUE-REQUEST|CHAIN-REQUEST|FUNCTION-POOL|FIELD-SYMBOLS|FUNCTIONALITY|INVERTED-DATE|SELECTION-SET|CLASS-METHODS|OUTPUT-LENGTH|CLASS-CODING|COL_NEGATIVE|ERRORMESSAGE|FIELD-GROUPS|HELP-REQUEST|NO-EXTENSION|NO-TOPOFPAGE|REDEFINITION|DISPLAY-MODE|ENDINTERFACE|EXIT-COMMAND|FIELD-SYMBOL|NO-SCROLLING|SHORTDUMP-ID|ACCESSPOLICY|CLASS-EVENTS|COL_POSITIVE|DECLARATIONS|ENHANCEMENTS|FILTER-TABLE|SWITCHSTATES|SYNTAX-CHECK|TRANSPORTING|ASYNCHRONOUS|SYNTAX-TRACE|TOKENIZATION|USER-COMMAND|WITH-HEADING|ABAP-SOURCE|BREAK-POINT|CHAIN-INPUT|COMPRESSION|FIXED-POINT|NEW-SECTION|NON-UNICODE|OCCURRENCES|RESPONSIBLE|SYSTEM-CALL|TRACE-TABLE|ABBREVIATED|CHAR-TO-HEX|END-OF-FILE|ENDFUNCTION|ENVIRONMENT|ASSOCIATION|COL_HEADING|EDITOR-CALL|END-OF-PAGE|ENGINEERING|IMPLEMENTED|INTENSIFIED|RADIOBUTTON|SYSTEM-EXIT|TOP-OF-PAGE|TRANSACTION|APPLICATION|CONCATENATE|DESTINATION|ENHANCEMENT|IMMEDIATELY|NO-GROUPING|PRECOMPILED|REPLACEMENT|TITLE-LINES|ACTIVATION|BYTE-ORDER|CLASS-POOL|CONNECTION|CONVERSION|DEFINITION|DEPARTMENT|EXPIRATION|INHERITING|MESSAGE-ID|NO-HEADING|PERFORMING|QUEUE-ONLY|RIGHTSPACE|SCIENTIFIC|STATUSINFO|STRUCTURES|SYNCPOINTS|WITH-TITLE|ATTRIBUTES|BOUNDARIES|CLASS-DATA|COL_NORMAL|DD\/MM\/YYYY|DESCENDING|INTERFACES|LINE-COUNT|MM\/DD\/YYYY|NON-UNIQUE|PRESERVING|SELECTIONS|STATEMENTS|SUBROUTINE|TRUNCATION|TYPE-POOLS|ARITHMETIC|BACKGROUND|ENDPROVIDE|EXCEPTIONS|IDENTIFIER|INDEX-LINE|OBLIGATORY|PARAMETERS|PERCENTAGE|PUSHBUTTON|RESOLUTION|COMPONENTS|DEALLOCATE|DISCONNECT|DUPLICATES|FIRST-LINE|HEAD-LINES|NO-DISPLAY|OCCURRENCE|RESPECTING|RETURNCODE|SUBMATCHES|TRACE-FILE|ASCENDING|BYPASSING|ENDMODULE|EXCEPTION|EXCLUDING|EXPORTING|INCREMENT|MATCHCODE|PARAMETER|PARTIALLY|PREFERRED|REFERENCE|REPLACING|RETURNING|SELECTION|SEPARATED|SPECIFIED|STATEMENT|TIMESTAMP|TYPE-POOL|ACCEPTING|APPENDAGE|ASSIGNING|COL_GROUP|COMPARING|CONSTANTS|DANGEROUS|IMPORTING|INSTANCES|LEFTSPACE|LOG-POINT|QUICKINFO|READ-ONLY|SCROLLING|SQLSCRIPT|STEP-LOOP|TOP-LINES|TRANSLATE|APPENDING|AUTHORITY|CHARACTER|COMPONENT|CONDITION|DIRECTORY|DUPLICATE|MESSAGING|RECEIVING|SUBSCREEN|ACCORDING|COL_TOTAL|END-LINES|ENDMETHOD|ENDSELECT|EXPANDING|EXTENSION|INCLUDING|INFOTYPES|INTERFACE|INTERVALS|LINE-SIZE|PF-STATUS|PROCEDURE|PROTECTED|REQUESTED|RESUMABLE|RIGHTPLUS|SAP-SPOOL|SECONDARY|STRUCTURE|SUBSTRING|TABLEVIEW|NUMOFCHAR|ADJACENT|ANALYSIS|ASSIGNED|BACKWARD|CHANNELS|CHECKBOX|CONTINUE|CRITICAL|DATAINFO|DD\/MM\/YY|DURATION|ENCODING|ENDCLASS|FUNCTION|LEFTPLUS|LINEFEED|MM\/DD\/YY|OVERFLOW|RECEIVED|SKIPPING|SORTABLE|STANDARD|SUBTRACT|SUPPRESS|TABSTRIP|TITLEBAR|TRUNCATE|UNASSIGN|WHENEVER|ANALYZER|COALESCE|COMMENTS|CONDENSE|DECIMALS|DEFERRED|ENDWHILE|EXPLICIT|KEYWORDS|MESSAGES|POSITION|PRIORITY|RECEIVER|RENAMING|TIMEZONE|TRAILING|ALLOCATE|CENTERED|CIRCULAR|CONTROLS|CURRENCY|DELETING|DESCRIBE|DISTANCE|ENDCATCH|EXPONENT|EXTENDED|GENERATE|IGNORING|INCLUDES|INTERNAL|MAJOR-ID|MODIFIER|NEW-LINE|OPTIONAL|PROPERTY|ROLLBACK|STARTING|SUPPLIED|ABSTRACT|CHANGING|CONTEXTS|CREATING|CUSTOMER|DATABASE|DAYLIGHT|DEFINING|DISTINCT|DIVISION|ENABLING|ENDCHAIN|ESCAPING|HARMLESS|IMPLICIT|INACTIVE|LANGUAGE|MINOR-ID|MULTIPLY|NEW-PAGE|NO-TITLE|POS_HIGH|SEPARATE|TEXTPOOL|TRANSFER|SELECTOR|DBMAXLEN|ITERATOR|ARCHIVE|BIT-XOR|BYTE-CO|COLLECT|COMMENT|CURRENT|DEFAULT|DISPLAY|ENDFORM|EXTRACT|LEADING|LISTBOX|LOCATOR|MEMBERS|METHODS|NESTING|POS_LOW|PROCESS|PROVIDE|RAISING|RESERVE|SECONDS|SUMMARY|VISIBLE|BETWEEN|BIT-AND|BYTE-CS|CLEANUP|COMPUTE|CONTROL|CONVERT|DATASET|ENDCASE|FORWARD|HEADERS|HOTSPOT|INCLUDE|INVERSE|KEEPING|NO-ZERO|OBJECTS|OVERLAY|PADDING|PATTERN|PROGRAM|REFRESH|SECTION|SUMMING|TESTING|VERSION|WINDOWS|WITHOUT|BIT-NOT|BYTE-CA|BYTE-NA|CASTING|CONTEXT|COUNTRY|DYNAMIC|ENABLED|ENDLOOP|EXECUTE|FRIENDS|HANDLER|HEADING|INITIAL|\*-INPUT|LOGFILE|MAXIMUM|MINIMUM|NO-GAPS|NO-SIGN|PRAGMAS|PRIMARY|PRIVATE|REDUCED|REPLACE|REQUEST|RESULTS|UNICODE|WARNING|ALIASES|BYTE-CN|BYTE-NS|CALLING|COL_KEY|COLUMNS|CONNECT|ENDEXEC|ENTRIES|EXCLUDE|FILTERS|FURTHER|HELP-ID|LOGICAL|MAPPING|MESSAGE|NAMETAB|OPTIONS|PACKAGE|PERFORM|RECEIVE|STATICS|VARYING|BINDING|CHARLEN|GREATER|XSTRLEN|ACCEPT|APPEND|DETAIL|ELSEIF|ENDING|ENDTRY|FORMAT|FRAMES|GIVING|HASHED|HEADER|IMPORT|INSERT|MARGIN|MODULE|NATIVE|OBJECT|OFFSET|REMOTE|RESUME|SAVING|SIMPLE|SUBMIT|TABBED|TOKENS|UNIQUE|UNPACK|UPDATE|WINDOW|YELLOW|ACTUAL|ASPECT|CENTER|CURSOR|DELETE|DIALOG|DIVIDE|DURING|ERRORS|EVENTS|EXTEND|FILTER|HANDLE|HAVING|IGNORE|LITTLE|MEMORY|NO-GAP|OCCURS|OPTION|PERSON|PLACES|PUBLIC|REDUCE|REPORT|RESULT|SINGLE|SORTED|SWITCH|SYNTAX|TARGET|VALUES|WRITER|ASSERT|BLOCKS|BOUNDS|BUFFER|CHANGE|COLUMN|COMMIT|CONCAT|COPIES|CREATE|DDMMYY|DEFINE|ENDIAN|ESCAPE|EXPAND|KERNEL|LAYOUT|LEGACY|LEVELS|MMDDYY|NUMBER|OUTPUT|RANGES|READER|RETURN|SCREEN|SEARCH|SELECT|SHARED|SOURCE|STABLE|STATIC|SUBKEY|SUFFIX|TABLES|UNWIND|YYMMDD|ASSIGN|BACKUP|BEFORE|BINARY|BIT-OR|BLANKS|CLIENT|CODING|COMMON|DEMAND|DYNPRO|EXCEPT|EXISTS|EXPORT|FIELDS|GLOBAL|GROUPS|LENGTH|LOCALE|MEDIUM|METHOD|MODIFY|NESTED|OTHERS|REJECT|SCROLL|SUPPLY|SYMBOL|ENDFOR|STRLEN|ALIGN|BEGIN|BOUND|ENDAT|ENTRY|EVENT|FINAL|FLUSH|GRANT|INNER|SHORT|USING|WRITE|AFTER|BLACK|BLOCK|CLOCK|COLOR|COUNT|DUMMY|EMPTY|ENDDO|ENDON|GREEN|INDEX|INOUT|LEAVE|LEVEL|LINES|MODIF|ORDER|OUTER|RANGE|RESET|RETRY|RIGHT|SMART|SPLIT|STYLE|TABLE|THROW|UNDER|UNTIL|UPPER|UTF-8|WHERE|ALIAS|BLANK|CLEAR|CLOSE|EXACT|FETCH|FIRST|FOUND|GROUP|LLANG|LOCAL|OTHER|REGEX|SPOOL|TITLE|TYPES|VALID|WHILE|ALPHA|BOXED|CATCH|CHAIN|CHECK|CLASS|COVER|ENDIF|EQUIV|FIELD|FLOOR|FRAME|INPUT|LOWER|MATCH|NODES|PAGES|PRINT|RAISE|ROUND|SHIFT|SPACE|SPOTS|STAMP|STATE|TASKS|TIMES|TRMAC|ULINE|UNION|VALUE|WIDTH|EQUAL|LOG10|TRUNC|BLOB|CASE|CEIL|CLOB|COND|EXIT|FILE|GAPS|HOLD|INCL|INTO|KEEP|KEYS|LAST|LINE|LONG|LPAD|MAIL|MODE|OPEN|PINK|READ|ROWS|TEST|THEN|ZERO|AREA|BACK|BADI|BYTE|CAST|EDIT|EXEC|FAIL|FIND|FKEQ|FONT|FREE|GKEQ|HIDE|INIT|ITNO|LATE|LOOP|MAIN|MARK|MOVE|NEXT|NULL|RISK|ROLE|UNIT|WAIT|ZONE|BASE|CALL|CODE|DATA|DATE|FKGE|GKGE|HIGH|KIND|LEFT|LIST|MASK|MESH|NAME|NODE|PACK|PAGE|POOL|SEND|SIGN|SIZE|SOME|STOP|TASK|TEXT|TIME|USER|VARY|WITH|WORD|BLUE|CONV|COPY|DEEP|ELSE|FORM|FROM|HINT|ICON|JOIN|LIKE|LOAD|ONLY|PART|SCAN|SKIP|SORT|TYPE|UNIX|VIEW|WHEN|WORK|ACOS|ASIN|ATAN|COSH|EACH|FRAC|LESS|RTTI|SINH|SQRT|TANH|AVG|BIT|DIV|ISO|LET|OUT|PAD|SQL|ALL|CI_|CPI|END|LOB|LPI|MAX|MIN|NEW|OLE|RUN|SET|\?TO|YES|ABS|ADD|AND|BIG|FOR|HDB|JOB|LOW|NOT|SAP|TRY|VIA|XML|ANY|GET|IDS|KEY|MOD|OFF|PUT|RAW|RED|REF|SUM|TAB|XSD|CNT|COS|EXP|LOG|SIN|TAN|XOR|AT|CO|CP|DO|GT|ID|IF|NS|OR|BT|CA|CS|GE|NA|NB|EQ|IN|LT|NE|NO|OF|ON|PF|TO|AS|BY|CN|IS|LE|NP|UP|E|I|M|O|Z|C|X)\b/i,lookbehind:!0},number:/\b\d+\b/,operator:{pattern:/(\s)(?:\*\*?|<[=>]?|>=?|\?=|[-+\/=])(?=\s)/,lookbehind:!0},"string-operator":{pattern:/(\s)&&?(?=\s)/,lookbehind:!0,alias:"keyword"},"token-operator":[{pattern:/(\w)(?:->?|=>|[~|{}])(?=\w)/,lookbehind:!0,alias:"punctuation"},{pattern:/[|{}]/,alias:"punctuation"}],punctuation:/[,.:()]/}}return wy}var Ey,dI;function Khe(){if(dI)return Ey;dI=1,Ey=e,e.displayName="abnf",e.aliases=[];function e(t){(function(n){var r="(?:ALPHA|BIT|CHAR|CR|CRLF|CTL|DIGIT|DQUOTE|HEXDIG|HTAB|LF|LWSP|OCTET|SP|VCHAR|WSP)";n.languages.abnf={comment:/;.*/,string:{pattern:/(?:%[is])?"[^"\n\r]*"/,greedy:!0,inside:{punctuation:/^%[is]/}},range:{pattern:/%(?:b[01]+-[01]+|d\d+-\d+|x[A-F\d]+-[A-F\d]+)/i,alias:"number"},terminal:{pattern:/%(?:b[01]+(?:\.[01]+)*|d\d+(?:\.\d+)*|x[A-F\d]+(?:\.[A-F\d]+)*)/i,alias:"number"},repetition:{pattern:/(^|[^\w-])(?:\d*\*\d*|\d+)/,lookbehind:!0,alias:"operator"},definition:{pattern:/(^[ \t]*)(?:[a-z][\w-]*|<[^<>\r\n]*>)(?=\s*=)/m,lookbehind:!0,alias:"keyword",inside:{punctuation:/<|>/}},"core-rule":{pattern:RegExp("(?:(^|[^<\\w-])"+r+"|<"+r+">)(?![\\w-])","i"),lookbehind:!0,alias:["rule","constant"],inside:{punctuation:/<|>/}},rule:{pattern:/(^|[^<\w-])[a-z][\w-]*|<[^<>\r\n]*>/i,lookbehind:!0,inside:{punctuation:/<|>/}},operator:/=\/?|\//,punctuation:/[()\[\]]/}})(t)}return Ey}var xy,fI;function Yhe(){if(fI)return xy;fI=1,xy=e,e.displayName="actionscript",e.aliases=[];function e(t){t.languages.actionscript=t.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<>?>?|[!=]=?)=?|[~?@]/}),t.languages.actionscript["class-name"].alias="function",delete t.languages.actionscript.parameter,delete t.languages.actionscript["literal-property"],t.languages.markup&&t.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:t.languages.markup}})}return xy}var ky,pI;function Zhe(){if(pI)return ky;pI=1,ky=e,e.displayName="ada",e.aliases=[];function e(t){t.languages.ada={comment:/--.*/,string:/"(?:""|[^"\r\f\n])*"/,number:[{pattern:/\b\d(?:_?\d)*#[\dA-F](?:_?[\dA-F])*(?:\.[\dA-F](?:_?[\dA-F])*)?#(?:E[+-]?\d(?:_?\d)*)?/i},{pattern:/\b\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:E[+-]?\d(?:_?\d)*)?\b/i}],"attr-name":/\b'\w+/,keyword:/\b(?:abort|abs|abstract|accept|access|aliased|all|and|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|elsif|end|entry|exception|exit|for|function|generic|goto|if|in|interface|is|limited|loop|mod|new|not|null|of|others|out|overriding|package|pragma|private|procedure|protected|raise|range|record|rem|renames|requeue|return|reverse|select|separate|some|subtype|synchronized|tagged|task|terminate|then|type|until|use|when|while|with|xor)\b/i,boolean:/\b(?:false|true)\b/i,operator:/<[=>]?|>=?|=>?|:=|\/=?|\*\*?|[&+-]/,punctuation:/\.\.?|[,;():]/,char:/'.'/,variable:/\b[a-z](?:\w)*\b/i}}return ky}var Cy,gI;function Xhe(){if(gI)return Cy;gI=1,Cy=e,e.displayName="agda",e.aliases=[];function e(t){(function(n){n.languages.agda={comment:/\{-[\s\S]*?(?:-\}|$)|--.*/,string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},punctuation:/[(){}⦃⦄.;@]/,"class-name":{pattern:/((?:data|record) +)\S+/,lookbehind:!0},function:{pattern:/(^[ \t]*)(?!\s)[^:\r\n]+(?=:)/m,lookbehind:!0},operator:{pattern:/(^\s*|\s)(?:[=|:∀→λ\\?_]|->)(?=\s)/,lookbehind:!0},keyword:/\b(?:Set|abstract|constructor|data|eta-equality|field|forall|hiding|import|in|inductive|infix|infixl|infixr|instance|let|macro|module|mutual|no-eta-equality|open|overlap|pattern|postulate|primitive|private|public|quote|quoteContext|quoteGoal|quoteTerm|record|renaming|rewrite|syntax|tactic|unquote|unquoteDecl|unquoteDef|using|variable|where|with)\b/}})(t)}return Cy}var _y,mI;function Qhe(){if(mI)return _y;mI=1,_y=e,e.displayName="al",e.aliases=[];function e(t){t.languages.al={comment:/\/\/.*|\/\*[\s\S]*?\*\//,string:{pattern:/'(?:''|[^'\r\n])*'(?!')|"(?:""|[^"\r\n])*"(?!")/,greedy:!0},function:{pattern:/(\b(?:event|procedure|trigger)\s+|(?:^|[^.])\.\s*)[a-z_]\w*(?=\s*\()/i,lookbehind:!0},keyword:[/\b(?:array|asserterror|begin|break|case|do|downto|else|end|event|exit|for|foreach|function|if|implements|in|indataset|interface|internal|local|of|procedure|program|protected|repeat|runonclient|securityfiltering|suppressdispose|temporary|then|to|trigger|until|var|while|with|withevents)\b/i,/\b(?:action|actions|addafter|addbefore|addfirst|addlast|area|assembly|chartpart|codeunit|column|controladdin|cuegroup|customizes|dataitem|dataset|dotnet|elements|enum|enumextension|extends|field|fieldattribute|fieldelement|fieldgroup|fieldgroups|fields|filter|fixed|grid|group|key|keys|label|labels|layout|modify|moveafter|movebefore|movefirst|movelast|page|pagecustomization|pageextension|part|profile|query|repeater|report|requestpage|schema|separator|systempart|table|tableelement|tableextension|textattribute|textelement|type|usercontrol|value|xmlport)\b/i],number:/\b(?:0x[\da-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)(?:F|LL?|U(?:LL?)?)?\b/i,boolean:/\b(?:false|true)\b/i,variable:/\b(?:Curr(?:FieldNo|Page|Report)|x?Rec|RequestOptionsPage)\b/,"class-name":/\b(?:automation|biginteger|bigtext|blob|boolean|byte|char|clienttype|code|completiontriggererrorlevel|connectiontype|database|dataclassification|datascope|date|dateformula|datetime|decimal|defaultlayout|dialog|dictionary|dotnetassembly|dotnettypedeclaration|duration|errorinfo|errortype|executioncontext|executionmode|fieldclass|fieldref|fieldtype|file|filterpagebuilder|guid|httpclient|httpcontent|httpheaders|httprequestmessage|httpresponsemessage|instream|integer|joker|jsonarray|jsonobject|jsontoken|jsonvalue|keyref|list|moduledependencyinfo|moduleinfo|none|notification|notificationscope|objecttype|option|outstream|pageresult|record|recordid|recordref|reportformat|securityfilter|sessionsettings|tableconnectiontype|tablefilter|testaction|testfield|testfilterfield|testpage|testpermissions|testrequestpage|text|textbuilder|textconst|textencoding|time|transactionmodel|transactiontype|variant|verbosity|version|view|views|webserviceactioncontext|webserviceactionresultcode|xmlattribute|xmlattributecollection|xmlcdata|xmlcomment|xmldeclaration|xmldocument|xmldocumenttype|xmlelement|xmlnamespacemanager|xmlnametable|xmlnode|xmlnodelist|xmlprocessinginstruction|xmlreadoptions|xmltext|xmlwriteoptions)\b/i,operator:/\.\.|:[=:]|[-+*/]=?|<>|[<>]=?|=|\b(?:and|div|mod|not|or|xor)\b/i,punctuation:/[()\[\]{}:.;,]/}}return _y}var Ay,hI;function Jhe(){if(hI)return Ay;hI=1,Ay=e,e.displayName="antlr4",e.aliases=["g4"];function e(t){t.languages.antlr4={comment:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,string:{pattern:/'(?:\\.|[^\\'\r\n])*'/,greedy:!0},"character-class":{pattern:/\[(?:\\.|[^\\\]\r\n])*\]/,greedy:!0,alias:"regex",inside:{range:{pattern:/([^[]|(?:^|[^\\])(?:\\\\)*\\\[)-(?!\])/,lookbehind:!0,alias:"punctuation"},escape:/\\(?:u(?:[a-fA-F\d]{4}|\{[a-fA-F\d]+\})|[pP]\{[=\w-]+\}|[^\r\nupP])/,punctuation:/[\[\]]/}},action:{pattern:/\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\}/,greedy:!0,inside:{content:{pattern:/(\{)[\s\S]+(?=\})/,lookbehind:!0},punctuation:/[{}]/}},command:{pattern:/(->\s*(?!\s))(?:\s*(?:,\s*)?\b[a-z]\w*(?:\s*\([^()\r\n]*\))?)+(?=\s*;)/i,lookbehind:!0,inside:{function:/\b\w+(?=\s*(?:[,(]|$))/,punctuation:/[,()]/}},annotation:{pattern:/@\w+(?:::\w+)*/,alias:"keyword"},label:{pattern:/#[ \t]*\w+/,alias:"punctuation"},keyword:/\b(?:catch|channels|finally|fragment|grammar|import|lexer|locals|mode|options|parser|returns|throws|tokens)\b/,definition:[{pattern:/\b[a-z]\w*(?=\s*:)/,alias:["rule","class-name"]},{pattern:/\b[A-Z]\w*(?=\s*:)/,alias:["token","constant"]}],constant:/\b[A-Z][A-Z_]*\b/,operator:/\.\.|->|[|~]|[*+?]\??/,punctuation:/[;:()=]/},t.languages.g4=t.languages.antlr4}return Ay}var Ty,bI;function ebe(){if(bI)return Ty;bI=1,Ty=e,e.displayName="apacheconf",e.aliases=[];function e(t){t.languages.apacheconf={comment:/#.*/,"directive-inline":{pattern:/(^[\t ]*)\b(?:AcceptFilter|AcceptPathInfo|AccessFileName|Action|Add(?:Alt|AltByEncoding|AltByType|Charset|DefaultCharset|Description|Encoding|Handler|Icon|IconByEncoding|IconByType|InputFilter|Language|ModuleInfo|OutputFilter|OutputFilterByType|Type)|Alias|AliasMatch|Allow(?:CONNECT|EncodedSlashes|Methods|Override|OverrideList)?|Anonymous(?:_LogEmail|_MustGiveEmail|_NoUserID|_VerifyEmail)?|AsyncRequestWorkerFactor|Auth(?:BasicAuthoritative|BasicFake|BasicProvider|BasicUseDigestAlgorithm|DBDUserPWQuery|DBDUserRealmQuery|DBMGroupFile|DBMType|DBMUserFile|Digest(?:Algorithm|Domain|NonceLifetime|Provider|Qop|ShmemSize)|Form(?:Authoritative|Body|DisableNoStore|FakeBasicAuth|Location|LoginRequiredLocation|LoginSuccessLocation|LogoutLocation|Method|Mimetype|Password|Provider|SitePassphrase|Size|Username)|GroupFile|LDAP(?:AuthorizePrefix|BindAuthoritative|BindDN|BindPassword|CharsetConfig|CompareAsUser|CompareDNOnServer|DereferenceAliases|GroupAttribute|GroupAttributeIsDN|InitialBindAsUser|InitialBindPattern|MaxSubGroupDepth|RemoteUserAttribute|RemoteUserIsDN|SearchAsUser|SubGroupAttribute|SubGroupClass|Url)|Merging|Name|nCache(?:Context|Enable|ProvideFor|SOCache|Timeout)|nzFcgiCheckAuthnProvider|nzFcgiDefineProvider|Type|UserFile|zDBDLoginToReferer|zDBDQuery|zDBDRedirectQuery|zDBMType|zSendForbiddenOnFailure)|BalancerGrowth|BalancerInherit|BalancerMember|BalancerPersist|BrowserMatch|BrowserMatchNoCase|BufferedLogs|BufferSize|Cache(?:DefaultExpire|DetailHeader|DirLength|DirLevels|Disable|Enable|File|Header|IgnoreCacheControl|IgnoreHeaders|IgnoreNoLastMod|IgnoreQueryString|IgnoreURLSessionIdentifiers|KeyBaseURL|LastModifiedFactor|Lock|LockMaxAge|LockPath|MaxExpire|MaxFileSize|MinExpire|MinFileSize|NegotiatedDocs|QuickHandler|ReadSize|ReadTime|Root|Socache(?:MaxSize|MaxTime|MinTime|ReadSize|ReadTime)?|StaleOnError|StoreExpired|StoreNoStore|StorePrivate)|CGIDScriptTimeout|CGIMapExtension|CharsetDefault|CharsetOptions|CharsetSourceEnc|CheckCaseOnly|CheckSpelling|ChrootDir|ContentDigest|CookieDomain|CookieExpires|CookieName|CookieStyle|CookieTracking|CoreDumpDirectory|CustomLog|Dav|DavDepthInfinity|DavGenericLockDB|DavLockDB|DavMinTimeout|DBDExptime|DBDInitSQL|DBDKeep|DBDMax|DBDMin|DBDParams|DBDPersist|DBDPrepareSQL|DBDriver|DefaultIcon|DefaultLanguage|DefaultRuntimeDir|DefaultType|Define|Deflate(?:BufferSize|CompressionLevel|FilterNote|InflateLimitRequestBody|InflateRatio(?:Burst|Limit)|MemLevel|WindowSize)|Deny|DirectoryCheckHandler|DirectoryIndex|DirectoryIndexRedirect|DirectorySlash|DocumentRoot|DTracePrivileges|DumpIOInput|DumpIOOutput|EnableExceptionHook|EnableMMAP|EnableSendfile|Error|ErrorDocument|ErrorLog|ErrorLogFormat|Example|ExpiresActive|ExpiresByType|ExpiresDefault|ExtendedStatus|ExtFilterDefine|ExtFilterOptions|FallbackResource|FileETag|FilterChain|FilterDeclare|FilterProtocol|FilterProvider|FilterTrace|ForceLanguagePriority|ForceType|ForensicLog|GprofDir|GracefulShutdownTimeout|Group|Header|HeaderName|Heartbeat(?:Address|Listen|MaxServers|Storage)|HostnameLookups|IdentityCheck|IdentityCheckTimeout|ImapBase|ImapDefault|ImapMenu|Include|IncludeOptional|Index(?:HeadInsert|Ignore|IgnoreReset|Options|OrderDefault|StyleSheet)|InputSed|ISAPI(?:AppendLogToErrors|AppendLogToQuery|CacheFile|FakeAsync|LogNotSupported|ReadAheadBuffer)|KeepAlive|KeepAliveTimeout|KeptBodySize|LanguagePriority|LDAP(?:CacheEntries|CacheTTL|ConnectionPoolTTL|ConnectionTimeout|LibraryDebug|OpCacheEntries|OpCacheTTL|ReferralHopLimit|Referrals|Retries|RetryDelay|SharedCacheFile|SharedCacheSize|Timeout|TrustedClientCert|TrustedGlobalCert|TrustedMode|VerifyServerCert)|Limit(?:InternalRecursion|Request(?:Body|Fields|FieldSize|Line)|XMLRequestBody)|Listen|ListenBackLog|LoadFile|LoadModule|LogFormat|LogLevel|LogMessage|LuaAuthzProvider|LuaCodeCache|Lua(?:Hook(?:AccessChecker|AuthChecker|CheckUserID|Fixups|InsertFilter|Log|MapToStorage|TranslateName|TypeChecker)|Inherit|InputFilter|MapHandler|OutputFilter|PackageCPath|PackagePath|QuickHandler|Root|Scope)|Max(?:ConnectionsPerChild|KeepAliveRequests|MemFree|RangeOverlaps|RangeReversals|Ranges|RequestWorkers|SpareServers|SpareThreads|Threads)|MergeTrailers|MetaDir|MetaFiles|MetaSuffix|MimeMagicFile|MinSpareServers|MinSpareThreads|MMapFile|ModemStandard|ModMimeUsePathInfo|MultiviewsMatch|Mutex|NameVirtualHost|NoProxy|NWSSLTrustedCerts|NWSSLUpgradeable|Options|Order|OutputSed|PassEnv|PidFile|PrivilegesMode|Protocol|ProtocolEcho|Proxy(?:AddHeaders|BadHeader|Block|Domain|ErrorOverride|ExpressDBMFile|ExpressDBMType|ExpressEnable|FtpDirCharset|FtpEscapeWildcards|FtpListOnWildcard|HTML(?:BufSize|CharsetOut|DocType|Enable|Events|Extended|Fixups|Interp|Links|Meta|StripComments|URLMap)|IOBufferSize|MaxForwards|Pass(?:Inherit|InterpolateEnv|Match|Reverse|ReverseCookieDomain|ReverseCookiePath)?|PreserveHost|ReceiveBufferSize|Remote|RemoteMatch|Requests|SCGIInternalRedirect|SCGISendfile|Set|SourceAddress|Status|Timeout|Via)|ReadmeName|ReceiveBufferSize|Redirect|RedirectMatch|RedirectPermanent|RedirectTemp|ReflectorHeader|RemoteIP(?:Header|InternalProxy|InternalProxyList|ProxiesHeader|TrustedProxy|TrustedProxyList)|RemoveCharset|RemoveEncoding|RemoveHandler|RemoveInputFilter|RemoveLanguage|RemoveOutputFilter|RemoveType|RequestHeader|RequestReadTimeout|Require|Rewrite(?:Base|Cond|Engine|Map|Options|Rule)|RLimitCPU|RLimitMEM|RLimitNPROC|Satisfy|ScoreBoardFile|Script(?:Alias|AliasMatch|InterpreterSource|Log|LogBuffer|LogLength|Sock)?|SecureListen|SeeRequestTail|SendBufferSize|Server(?:Admin|Alias|Limit|Name|Path|Root|Signature|Tokens)|Session(?:Cookie(?:Name|Name2|Remove)|Crypto(?:Cipher|Driver|Passphrase|PassphraseFile)|DBD(?:CookieName|CookieName2|CookieRemove|DeleteLabel|InsertLabel|PerUser|SelectLabel|UpdateLabel)|Env|Exclude|Header|Include|MaxAge)?|SetEnv|SetEnvIf|SetEnvIfExpr|SetEnvIfNoCase|SetHandler|SetInputFilter|SetOutputFilter|SSIEndTag|SSIErrorMsg|SSIETag|SSILastModified|SSILegacyExprParser|SSIStartTag|SSITimeFormat|SSIUndefinedEcho|SSL(?:CACertificateFile|CACertificatePath|CADNRequestFile|CADNRequestPath|CARevocationCheck|CARevocationFile|CARevocationPath|CertificateChainFile|CertificateFile|CertificateKeyFile|CipherSuite|Compression|CryptoDevice|Engine|FIPS|HonorCipherOrder|InsecureRenegotiation|OCSP(?:DefaultResponder|Enable|OverrideResponder|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|UseRequestNonce)|OpenSSLConfCmd|Options|PassPhraseDialog|Protocol|Proxy(?:CACertificateFile|CACertificatePath|CARevocation(?:Check|File|Path)|CheckPeer(?:CN|Expire|Name)|CipherSuite|Engine|MachineCertificate(?:ChainFile|File|Path)|Protocol|Verify|VerifyDepth)|RandomSeed|RenegBufferSize|Require|RequireSSL|Session(?:Cache|CacheTimeout|TicketKeyFile|Tickets)|SRPUnknownUserSeed|SRPVerifierFile|Stapling(?:Cache|ErrorCacheTimeout|FakeTryLater|ForceURL|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|ReturnResponderErrors|StandardCacheTimeout)|StrictSNIVHostCheck|UserName|UseStapling|VerifyClient|VerifyDepth)|StartServers|StartThreads|Substitute|Suexec|SuexecUserGroup|ThreadLimit|ThreadsPerChild|ThreadStackSize|TimeOut|TraceEnable|TransferLog|TypesConfig|UnDefine|UndefMacro|UnsetEnv|Use|UseCanonicalName|UseCanonicalPhysicalPort|User|UserDir|VHostCGIMode|VHostCGIPrivs|VHostGroup|VHostPrivs|VHostSecure|VHostUser|Virtual(?:DocumentRoot|ScriptAlias)(?:IP)?|WatchdogInterval|XBitHack|xml2EncAlias|xml2EncDefault|xml2StartParse)\b/im,lookbehind:!0,alias:"property"},"directive-block":{pattern:/<\/?\b(?:Auth[nz]ProviderAlias|Directory|DirectoryMatch|Else|ElseIf|Files|FilesMatch|If|IfDefine|IfModule|IfVersion|Limit|LimitExcept|Location|LocationMatch|Macro|Proxy|Require(?:All|Any|None)|VirtualHost)\b.*>/i,inside:{"directive-block":{pattern:/^<\/?\w+/,inside:{punctuation:/^<\/?/},alias:"tag"},"directive-block-parameter":{pattern:/.*[^>]/,inside:{punctuation:/:/,string:{pattern:/("|').*\1/,inside:{variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/}}},alias:"attr-value"},punctuation:/>/},alias:"tag"},"directive-flags":{pattern:/\[(?:[\w=],?)+\]/,alias:"keyword"},string:{pattern:/("|').*\1/,inside:{variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/}},variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/,regex:/\^?.*\$|\^.*\$?/}}return Ty}var Ry,yI;function TA(){if(yI)return Ry;yI=1,Ry=e,e.displayName="sql",e.aliases=[];function e(t){t.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/}}return Ry}var Ny,vI;function tbe(){if(vI)return Ny;vI=1;var e=TA();Ny=t,t.displayName="apex",t.aliases=[];function t(n){n.register(e),function(r){var a=/\b(?:(?:after|before)(?=\s+[a-z])|abstract|activate|and|any|array|as|asc|autonomous|begin|bigdecimal|blob|boolean|break|bulk|by|byte|case|cast|catch|char|class|collect|commit|const|continue|currency|date|datetime|decimal|default|delete|desc|do|double|else|end|enum|exception|exit|export|extends|final|finally|float|for|from|get(?=\s*[{};])|global|goto|group|having|hint|if|implements|import|in|inner|insert|instanceof|int|integer|interface|into|join|like|limit|list|long|loop|map|merge|new|not|null|nulls|number|object|of|on|or|outer|override|package|parallel|pragma|private|protected|public|retrieve|return|rollback|select|set|short|sObject|sort|static|string|super|switch|synchronized|system|testmethod|then|this|throw|time|transaction|transient|trigger|try|undelete|update|upsert|using|virtual|void|webservice|when|where|while|(?:inherited|with|without)\s+sharing)\b/i,o=/\b(?:(?=[a-z_]\w*\s*[<\[])|(?!))[A-Z_]\w*(?:\s*\.\s*[A-Z_]\w*)*\b(?:\s*(?:\[\s*\]|<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>))*/.source.replace(//g,function(){return a.source});function i(l){return RegExp(l.replace(//g,function(){return o}),"i")}var s={keyword:a,punctuation:/[()\[\]{};,:.<>]/};r.languages.apex={comment:r.languages.clike.comment,string:r.languages.clike.string,sql:{pattern:/((?:[=,({:]|\breturn)\s*)\[[^\[\]]*\]/i,lookbehind:!0,greedy:!0,alias:"language-sql",inside:r.languages.sql},annotation:{pattern:/@\w+\b/,alias:"punctuation"},"class-name":[{pattern:i(/(\b(?:class|enum|extends|implements|instanceof|interface|new|trigger\s+\w+\s+on)\s+)/.source),lookbehind:!0,inside:s},{pattern:i(/(\(\s*)(?=\s*\)\s*[\w(])/.source),lookbehind:!0,inside:s},{pattern:i(/(?=\s*\w+\s*[;=,(){:])/.source),inside:s}],trigger:{pattern:/(\btrigger\s+)\w+\b/i,lookbehind:!0,alias:"class-name"},keyword:a,function:/\b[a-z_]\w*(?=\s*\()/i,boolean:/\b(?:false|true)\b/i,number:/(?:\B\.\d+|\b\d+(?:\.\d+|L)?)\b/i,operator:/[!=](?:==?)?|\?\.?|&&|\|\||--|\+\+|[-+*/^&|]=?|:|<{1,3}=?/,punctuation:/[()\[\]{};,.]/}}(n)}return Ny}var Iy,SI;function nbe(){if(SI)return Iy;SI=1,Iy=e,e.displayName="apl",e.aliases=[];function e(t){t.languages.apl={comment:/(?:⍝|#[! ]).*$/m,string:{pattern:/'(?:[^'\r\n]|'')*'/,greedy:!0},number:/¯?(?:\d*\.?\b\d+(?:e[+¯]?\d+)?|¯|∞)(?:j¯?(?:(?:\d+(?:\.\d+)?|\.\d+)(?:e[+¯]?\d+)?|¯|∞))?/i,statement:/:[A-Z][a-z][A-Za-z]*\b/,"system-function":{pattern:/⎕[A-Z]+/i,alias:"function"},constant:/[⍬⌾#⎕⍞]/,function:/[-+×÷⌈⌊∣|⍳⍸?*⍟○!⌹<≤=>≥≠≡≢∊⍷∪∩~∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⊆⊇⌷⍋⍒⊤⊥⍕⍎⊣⊢⍁⍂≈⍯↗¤→]/,"monadic-operator":{pattern:/[\\\/⌿⍀¨⍨⌶&∥]/,alias:"operator"},"dyadic-operator":{pattern:/[.⍣⍠⍤∘⌸@⌺⍥]/,alias:"operator"},assignment:{pattern:/←/,alias:"keyword"},punctuation:/[\[;\]()◇⋄]/,dfn:{pattern:/[{}⍺⍵⍶⍹∇⍫:]/,alias:"builtin"}}}return Iy}var Oy,wI;function rbe(){if(wI)return Oy;wI=1,Oy=e,e.displayName="applescript",e.aliases=[];function e(t){t.languages.applescript={comment:[/\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,/--.+/,/#.+/],string:/"(?:\\.|[^"\\\r\n])*"/,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e-?\d+)?\b/i,operator:[/[&=≠≤≥*+\-\/÷^]|[<>]=?/,/\b(?:(?:begin|end|start)s? with|(?:contains?|(?:does not|doesn't) contain)|(?:is|isn't|is not) (?:contained by|in)|(?:(?:is|isn't|is not) )?(?:greater|less) than(?: or equal)?(?: to)?|(?:comes|(?:does not|doesn't) come) (?:after|before)|(?:is|isn't|is not) equal(?: to)?|(?:(?:does not|doesn't) equal|equal to|equals|is not|isn't)|(?:a )?(?:ref(?: to)?|reference to)|(?:and|as|div|mod|not|or))\b/],keyword:/\b(?:about|above|after|against|apart from|around|aside from|at|back|before|beginning|behind|below|beneath|beside|between|but|by|considering|continue|copy|does|eighth|else|end|equal|error|every|exit|false|fifth|first|for|fourth|from|front|get|given|global|if|ignoring|in|instead of|into|is|it|its|last|local|me|middle|my|ninth|of|on|onto|out of|over|prop|property|put|repeat|return|returning|second|set|seventh|since|sixth|some|tell|tenth|that|the|then|third|through|thru|timeout|times|to|transaction|true|try|until|where|while|whose|with|without)\b/,"class-name":/\b(?:POSIX file|RGB color|alias|application|boolean|centimeters|centimetres|class|constant|cubic centimeters|cubic centimetres|cubic feet|cubic inches|cubic meters|cubic metres|cubic yards|date|degrees Celsius|degrees Fahrenheit|degrees Kelvin|feet|file|gallons|grams|inches|integer|kilograms|kilometers|kilometres|list|liters|litres|meters|metres|miles|number|ounces|pounds|quarts|real|record|reference|script|square feet|square kilometers|square kilometres|square meters|square metres|square miles|square yards|text|yards)\b/,punctuation:/[{}():,¬«»《》]/}}return Oy}var Dy,EI;function abe(){if(EI)return Dy;EI=1,Dy=e,e.displayName="aql",e.aliases=[];function e(t){t.languages.aql={comment:/\/\/.*|\/\*[\s\S]*?\*\//,property:{pattern:/([{,]\s*)(?:(?!\d)\w+|(["'´`])(?:(?!\2)[^\\\r\n]|\\.)*\2)(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\.)*\1/,greedy:!0},identifier:{pattern:/([´`])(?:(?!\1)[^\\\r\n]|\\.)*\1/,greedy:!0},variable:/@@?\w+/,keyword:[{pattern:/(\bWITH\s+)COUNT(?=\s+INTO\b)/i,lookbehind:!0},/\b(?:AGGREGATE|ALL|AND|ANY|ASC|COLLECT|DESC|DISTINCT|FILTER|FOR|GRAPH|IN|INBOUND|INSERT|INTO|K_PATHS|K_SHORTEST_PATHS|LET|LIKE|LIMIT|NONE|NOT|NULL|OR|OUTBOUND|REMOVE|REPLACE|RETURN|SHORTEST_PATH|SORT|UPDATE|UPSERT|WINDOW|WITH)\b/i,{pattern:/(^|[^\w.[])(?:KEEP|PRUNE|SEARCH|TO)\b/i,lookbehind:!0},{pattern:/(^|[^\w.[])(?:CURRENT|NEW|OLD)\b/,lookbehind:!0},{pattern:/\bOPTIONS(?=\s*\{)/i}],function:/\b(?!\d)\w+(?=\s*\()/,boolean:/\b(?:false|true)\b/i,range:{pattern:/\.\./,alias:"operator"},number:[/\b0b[01]+/i,/\b0x[0-9a-f]+/i,/(?:\B\.\d+|\b(?:0|[1-9]\d*)(?:\.\d+)?)(?:e[+-]?\d+)?/i],operator:/\*{2,}|[=!]~|[!=<>]=?|&&|\|\||[-+*/%]/,punctuation:/::|[?.:,;()[\]{}]/}}return Dy}var Ly,xI;function Ws(){if(xI)return Ly;xI=1,Ly=e,e.displayName="c",e.aliases=[];function e(t){t.languages.c=t.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),t.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),t.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},t.languages.c.string],char:t.languages.c.char,comment:t.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:t.languages.c}}}}),t.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete t.languages.c.boolean}return Ly}var My,kI;function RA(){if(kI)return My;kI=1;var e=Ws();My=t,t.displayName="cpp",t.aliases=[];function t(n){n.register(e),function(r){var a=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,o=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,function(){return a.source});r.languages.cpp=r.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,function(){return a.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:a,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),r.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,function(){return o})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),r.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:r.languages.cpp}}}}),r.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),r.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:r.languages.extend("cpp",{})}}),r.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},r.languages.cpp["base-clause"])}(n)}return My}var Py,CI;function obe(){if(CI)return Py;CI=1;var e=RA();Py=t,t.displayName="arduino",t.aliases=["ino"];function t(n){n.register(e),n.languages.arduino=n.languages.extend("cpp",{keyword:/\b(?:String|array|bool|boolean|break|byte|case|catch|continue|default|do|double|else|finally|for|function|goto|if|in|instanceof|int|integer|long|loop|new|null|return|setup|string|switch|throw|try|void|while|word)\b/,constant:/\b(?:ANALOG_MESSAGE|DEFAULT|DIGITAL_MESSAGE|EXTERNAL|FIRMATA_STRING|HIGH|INPUT|INPUT_PULLUP|INTERNAL|INTERNAL1V1|INTERNAL2V56|LED_BUILTIN|LOW|OUTPUT|REPORT_ANALOG|REPORT_DIGITAL|SET_PIN_MODE|SYSEX_START|SYSTEM_RESET)\b/,builtin:/\b(?:Audio|BSSID|Bridge|Client|Console|EEPROM|Esplora|EsploraTFT|Ethernet|EthernetClient|EthernetServer|EthernetUDP|File|FileIO|FileSystem|Firmata|GPRS|GSM|GSMBand|GSMClient|GSMModem|GSMPIN|GSMScanner|GSMServer|GSMVoiceCall|GSM_SMS|HttpClient|IPAddress|IRread|Keyboard|KeyboardController|LiquidCrystal|LiquidCrystal_I2C|Mailbox|Mouse|MouseController|PImage|Process|RSSI|RobotControl|RobotMotor|SD|SPI|SSID|Scheduler|Serial|Server|Servo|SoftwareSerial|Stepper|Stream|TFT|Task|USBHost|WiFi|WiFiClient|WiFiServer|WiFiUDP|Wire|YunClient|YunServer|abs|addParameter|analogRead|analogReadResolution|analogReference|analogWrite|analogWriteResolution|answerCall|attach|attachGPRS|attachInterrupt|attached|autoscroll|available|background|beep|begin|beginPacket|beginSD|beginSMS|beginSpeaker|beginTFT|beginTransmission|beginWrite|bit|bitClear|bitRead|bitSet|bitWrite|blink|blinkVersion|buffer|changePIN|checkPIN|checkPUK|checkReg|circle|cityNameRead|cityNameWrite|clear|clearScreen|click|close|compassRead|config|connect|connected|constrain|cos|countryNameRead|countryNameWrite|createChar|cursor|debugPrint|delay|delayMicroseconds|detach|detachInterrupt|digitalRead|digitalWrite|disconnect|display|displayLogos|drawBMP|drawCompass|encryptionType|end|endPacket|endSMS|endTransmission|endWrite|exists|exitValue|fill|find|findUntil|flush|gatewayIP|get|getAsynchronously|getBand|getButton|getCurrentCarrier|getIMEI|getKey|getModifiers|getOemKey|getPINUsed|getResult|getSignalStrength|getSocket|getVoiceCallStatus|getXChange|getYChange|hangCall|height|highByte|home|image|interrupts|isActionDone|isDirectory|isListening|isPIN|isPressed|isValid|keyPressed|keyReleased|keyboardRead|knobRead|leftToRight|line|lineFollowConfig|listen|listenOnLocalhost|loadImage|localIP|lowByte|macAddress|maintain|map|max|messageAvailable|micros|millis|min|mkdir|motorsStop|motorsWrite|mouseDragged|mouseMoved|mousePressed|mouseReleased|move|noAutoscroll|noBlink|noBuffer|noCursor|noDisplay|noFill|noInterrupts|noListenOnLocalhost|noStroke|noTone|onReceive|onRequest|open|openNextFile|overflow|parseCommand|parseFloat|parseInt|parsePacket|pauseMode|peek|pinMode|playFile|playMelody|point|pointTo|position|pow|prepare|press|print|printFirmwareVersion|printVersion|println|process|processInput|pulseIn|put|random|randomSeed|read|readAccelerometer|readBlue|readButton|readBytes|readBytesUntil|readGreen|readJoystickButton|readJoystickSwitch|readJoystickX|readJoystickY|readLightSensor|readMessage|readMicrophone|readNetworks|readRed|readSlider|readString|readStringUntil|readTemperature|ready|rect|release|releaseAll|remoteIP|remoteNumber|remotePort|remove|requestFrom|retrieveCallingNumber|rewindDirectory|rightToLeft|rmdir|robotNameRead|robotNameWrite|run|runAsynchronously|runShellCommand|runShellCommandAsynchronously|running|scanNetworks|scrollDisplayLeft|scrollDisplayRight|seek|sendAnalog|sendDigitalPortPair|sendDigitalPorts|sendString|sendSysex|serialEvent|setBand|setBitOrder|setClockDivider|setCursor|setDNS|setDataMode|setFirmwareVersion|setMode|setPINUsed|setSpeed|setTextSize|setTimeout|shiftIn|shiftOut|shutdown|sin|size|sqrt|startLoop|step|stop|stroke|subnetMask|switchPIN|tan|tempoWrite|text|tone|transfer|tuneWrite|turn|updateIR|userNameRead|userNameWrite|voiceCall|waitContinue|width|write|writeBlue|writeGreen|writeJSON|writeMessage|writeMicroseconds|writeRGB|writeRed|yield)\b/}),n.languages.ino=n.languages.arduino}return Py}var $y,_I;function ibe(){if(_I)return $y;_I=1,$y=e,e.displayName="arff",e.aliases=[];function e(t){t.languages.arff={comment:/%.*/,string:{pattern:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:/@(?:attribute|data|end|relation)\b/i,number:/\b\d+(?:\.\d+)?\b/,punctuation:/[{},]/}}return $y}var Fy,AI;function sbe(){if(AI)return Fy;AI=1,Fy=e,e.displayName="asciidoc",e.aliases=["adoc"];function e(t){(function(n){var r={pattern:/(^[ \t]*)\[(?!\[)(?:(["'$`])(?:(?!\2)[^\\]|\\.)*\2|\[(?:[^\[\]\\]|\\.)*\]|[^\[\]\\"'$`]|\\.)*\]/m,lookbehind:!0,inside:{quoted:{pattern:/([$`])(?:(?!\1)[^\\]|\\.)*\1/,inside:{punctuation:/^[$`]|[$`]$/}},interpreted:{pattern:/'(?:[^'\\]|\\.)*'/,inside:{punctuation:/^'|'$/}},string:/"(?:[^"\\]|\\.)*"/,variable:/\w+(?==)/,punctuation:/^\[|\]$|,/,operator:/=/,"attr-value":/(?!^\s+$).+/}},a=n.languages.asciidoc={"comment-block":{pattern:/^(\/{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1/m,alias:"comment"},table:{pattern:/^\|={3,}(?:(?:\r?\n|\r(?!\n)).*)*?(?:\r?\n|\r)\|={3,}$/m,inside:{specifiers:{pattern:/(?:(?:(?:\d+(?:\.\d+)?|\.\d+)[+*](?:[<^>](?:\.[<^>])?|\.[<^>])?|[<^>](?:\.[<^>])?|\.[<^>])[a-z]*|[a-z]+)(?=\|)/,alias:"attr-value"},punctuation:{pattern:/(^|[^\\])[|!]=*/,lookbehind:!0}}},"passthrough-block":{pattern:/^(\+{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,inside:{punctuation:/^\++|\++$/}},"literal-block":{pattern:/^(-{4,}|\.{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,inside:{punctuation:/^(?:-+|\.+)|(?:-+|\.+)$/}},"other-block":{pattern:/^(--|\*{4,}|_{4,}|={4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,inside:{punctuation:/^(?:-+|\*+|_+|=+)|(?:-+|\*+|_+|=+)$/}},"list-punctuation":{pattern:/(^[ \t]*)(?:-|\*{1,5}|\.{1,5}|(?:[a-z]|\d+)\.|[xvi]+\))(?= )/im,lookbehind:!0,alias:"punctuation"},"list-label":{pattern:/(^[ \t]*)[a-z\d].+(?::{2,4}|;;)(?=\s)/im,lookbehind:!0,alias:"symbol"},"indented-block":{pattern:/((\r?\n|\r)\2)([ \t]+)\S.*(?:(?:\r?\n|\r)\3.+)*(?=\2{2}|$)/,lookbehind:!0},comment:/^\/\/.*/m,title:{pattern:/^.+(?:\r?\n|\r)(?:={3,}|-{3,}|~{3,}|\^{3,}|\+{3,})$|^={1,5} .+|^\.(?![\s.]).*/m,alias:"important",inside:{punctuation:/^(?:\.|=+)|(?:=+|-+|~+|\^+|\++)$/}},"attribute-entry":{pattern:/^:[^:\r\n]+:(?: .*?(?: \+(?:\r?\n|\r).*?)*)?$/m,alias:"tag"},attributes:r,hr:{pattern:/^'{3,}$/m,alias:"punctuation"},"page-break":{pattern:/^<{3,}$/m,alias:"punctuation"},admonition:{pattern:/^(?:CAUTION|IMPORTANT|NOTE|TIP|WARNING):/m,alias:"keyword"},callout:[{pattern:/(^[ \t]*)/m,lookbehind:!0,alias:"symbol"},{pattern:/<\d+>/,alias:"symbol"}],macro:{pattern:/\b[a-z\d][a-z\d-]*::?(?:[^\s\[\]]*\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,inside:{function:/^[a-z\d-]+(?=:)/,punctuation:/^::?/,attributes:{pattern:/(?:\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,inside:r.inside}}},inline:{pattern:/(^|[^\\])(?:(?:\B\[(?:[^\]\\"']|(["'])(?:(?!\2)[^\\]|\\.)*\2|\\.)*\])?(?:\b_(?!\s)(?: _|[^_\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: _|[^_\\\r\n]|\\.)+)*_\b|\B``(?!\s).+?(?:(?:\r?\n|\r).+?)*''\B|\B`(?!\s)(?:[^`'\s]|\s+\S)+['`]\B|\B(['*+#])(?!\s)(?: \3|(?!\3)[^\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: \3|(?!\3)[^\\\r\n]|\\.)+)*\3\B)|(?:\[(?:[^\]\\"']|(["'])(?:(?!\4)[^\\]|\\.)*\4|\\.)*\])?(?:(__|\*\*|\+\+\+?|##|\$\$|[~^]).+?(?:(?:\r?\n|\r).+?)*\5|\{[^}\r\n]+\}|\[\[\[?.+?(?:(?:\r?\n|\r).+?)*\]?\]\]|<<.+?(?:(?:\r?\n|\r).+?)*>>|\(\(\(?.+?(?:(?:\r?\n|\r).+?)*\)?\)\)))/m,lookbehind:!0,inside:{attributes:r,url:{pattern:/^(?:\[\[\[?.+?\]?\]\]|<<.+?>>)$/,inside:{punctuation:/^(?:\[\[\[?|<<)|(?:\]\]\]?|>>)$/}},"attribute-ref":{pattern:/^\{.+\}$/,inside:{variable:{pattern:/(^\{)[a-z\d,+_-]+/,lookbehind:!0},operator:/^[=?!#%@$]|!(?=[:}])/,punctuation:/^\{|\}$|::?/}},italic:{pattern:/^(['_])[\s\S]+\1$/,inside:{punctuation:/^(?:''?|__?)|(?:''?|__?)$/}},bold:{pattern:/^\*[\s\S]+\*$/,inside:{punctuation:/^\*\*?|\*\*?$/}},punctuation:/^(?:``?|\+{1,3}|##?|\$\$|[~^]|\(\(\(?)|(?:''?|\+{1,3}|##?|\$\$|[~^`]|\)?\)\))$/}},replacement:{pattern:/\((?:C|R|TM)\)/,alias:"builtin"},entity:/&#?[\da-z]{1,8};/i,"line-continuation":{pattern:/(^| )\+$/m,lookbehind:!0,alias:"punctuation"}};function o(i){i=i.split(" ");for(var s={},l=0,c=i.length;l>=?|<<=?|&&?|\|\|?|[-+*/%&|^!=<>?]=?/,punctuation:/[(),:]/}}return zy}var Uy,NI;function _h(){if(NI)return Uy;NI=1,Uy=e,e.displayName="csharp",e.aliases=["dotnet","cs"];function e(t){(function(n){function r(V,P){return V.replace(/<<(\d+)>>/g,function(N,K){return"(?:"+P[+K]+")"})}function a(V,P,N){return RegExp(r(V,P),N||"")}function o(V,P){for(var N=0;N>/g,function(){return"(?:"+V+")"});return V.replace(/<>/g,"[^\\s\\S]")}var i={type:"bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",typeDeclaration:"class enum interface record struct",contextual:"add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",other:"abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield"};function s(V){return"\\b(?:"+V.trim().replace(/ /g,"|")+")\\b"}var l=s(i.typeDeclaration),c=RegExp(s(i.type+" "+i.typeDeclaration+" "+i.contextual+" "+i.other)),u=s(i.typeDeclaration+" "+i.contextual+" "+i.other),d=s(i.type+" "+i.typeDeclaration+" "+i.other),g=o(/<(?:[^<>;=+\-*/%&|^]|<>)*>/.source,2),m=o(/\((?:[^()]|<>)*\)/.source,2),b=/@?\b[A-Za-z_]\w*\b/.source,y=r(/<<0>>(?:\s*<<1>>)?/.source,[b,g]),w=r(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source,[u,y]),v=/\[\s*(?:,\s*)*\]/.source,h=r(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source,[w,v]),S=r(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[g,m,v]),E=r(/\(<<0>>+(?:,<<0>>+)+\)/.source,[S]),k=r(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source,[E,w,v]),x={keyword:c,punctuation:/[<>()?,.:[\]]/},C=/'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source,_=/"(?:\\.|[^\\"\r\n])*"/.source,R=/@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source;n.languages.csharp=n.languages.extend("clike",{string:[{pattern:a(/(^|[^$\\])<<0>>/.source,[R]),lookbehind:!0,greedy:!0},{pattern:a(/(^|[^@$\\])<<0>>/.source,[_]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:a(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source,[w]),lookbehind:!0,inside:x},{pattern:a(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source,[b,k]),lookbehind:!0,inside:x},{pattern:a(/(\busing\s+)<<0>>(?=\s*=)/.source,[b]),lookbehind:!0},{pattern:a(/(\b<<0>>\s+)<<1>>/.source,[l,y]),lookbehind:!0,inside:x},{pattern:a(/(\bcatch\s*\(\s*)<<0>>/.source,[w]),lookbehind:!0,inside:x},{pattern:a(/(\bwhere\s+)<<0>>/.source,[b]),lookbehind:!0},{pattern:a(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source,[h]),lookbehind:!0,inside:x},{pattern:a(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source,[k,d,b]),inside:x}],keyword:c,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),n.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),n.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:a(/([(,]\s*)<<0>>(?=\s*:)/.source,[b]),lookbehind:!0,alias:"punctuation"}}),n.languages.insertBefore("csharp","class-name",{namespace:{pattern:a(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source,[b]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:a(/(\b(?:default|sizeof|typeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source,[m]),lookbehind:!0,alias:"class-name",inside:x},"return-type":{pattern:a(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source,[k,w]),inside:x,alias:"class-name"},"constructor-invocation":{pattern:a(/(\bnew\s+)<<0>>(?=\s*[[({])/.source,[k]),lookbehind:!0,inside:x,alias:"class-name"},"generic-method":{pattern:a(/<<0>>\s*<<1>>(?=\s*\()/.source,[b,g]),inside:{function:a(/^<<0>>/.source,[b]),generic:{pattern:RegExp(g),alias:"class-name",inside:x}}},"type-list":{pattern:a(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source,[l,y,b,k,c.source,m,/\bnew\s*\(\s*\)/.source]),lookbehind:!0,inside:{"record-arguments":{pattern:a(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source,[y,m]),lookbehind:!0,greedy:!0,inside:n.languages.csharp},keyword:c,"class-name":{pattern:RegExp(k),greedy:!0,inside:x},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var T=_+"|"+C,L=r(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source,[T]),D=o(r(/[^"'/()]|<<0>>|\(<>*\)/.source,[L]),2),H=/\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source,z=r(/<<0>>(?:\s*\(<<1>>*\))?/.source,[w,D]);n.languages.insertBefore("csharp","class-name",{attribute:{pattern:a(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source,[H,z]),lookbehind:!0,greedy:!0,inside:{target:{pattern:a(/^<<0>>(?=\s*:)/.source,[H]),alias:"keyword"},"attribute-arguments":{pattern:a(/\(<<0>>*\)/.source,[D]),inside:n.languages.csharp},"class-name":{pattern:RegExp(w),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var M=/:[^}\r\n]+/.source,U=o(r(/[^"'/()]|<<0>>|\(<>*\)/.source,[L]),2),X=r(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[U,M]),j=o(r(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<>*\)/.source,[T]),2),O=r(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[j,M]);function A(V,P){return{interpolation:{pattern:a(/((?:^|[^{])(?:\{\{)*)<<0>>/.source,[V]),lookbehind:!0,inside:{"format-string":{pattern:a(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source,[P,M]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:n.languages.csharp}}},string:/[\s\S]+/}}n.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:a(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source,[X]),lookbehind:!0,greedy:!0,inside:A(X,U)},{pattern:a(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source,[O]),lookbehind:!0,greedy:!0,inside:A(O,j)}],char:{pattern:RegExp(C),greedy:!0}}),n.languages.dotnet=n.languages.cs=n.languages.csharp})(t)}return Uy}var By,II;function ube(){if(II)return By;II=1;var e=_h();By=t,t.displayName="aspnet",t.aliases=[];function t(n){n.register(e),n.languages.aspnet=n.languages.extend("markup",{"page-directive":{pattern:/<%\s*@.*%>/,alias:"tag",inside:{"page-directive":{pattern:/<%\s*@\s*(?:Assembly|Control|Implements|Import|Master(?:Type)?|OutputCache|Page|PreviousPageType|Reference|Register)?|%>/i,alias:"tag"},rest:n.languages.markup.tag.inside}},directive:{pattern:/<%.*%>/,alias:"tag",inside:{directive:{pattern:/<%\s*?[$=%#:]{0,2}|%>/,alias:"tag"},rest:n.languages.csharp}}}),n.languages.aspnet.tag.pattern=/<(?!%)\/?[^\s>\/]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/,n.languages.insertBefore("inside","punctuation",{directive:n.languages.aspnet.directive},n.languages.aspnet.tag.inside["attr-value"]),n.languages.insertBefore("aspnet","comment",{"asp-comment":{pattern:/<%--[\s\S]*?--%>/,alias:["asp","comment"]}}),n.languages.insertBefore("aspnet",n.languages.javascript?"script":"tag",{"asp-script":{pattern:/(]*>)[\s\S]*?(?=<\/script>)/i,lookbehind:!0,alias:["asp","script"],inside:n.languages.csharp||{}}})}return By}var Hy,OI;function dbe(){if(OI)return Hy;OI=1,Hy=e,e.displayName="autohotkey",e.aliases=[];function e(t){t.languages.autohotkey={comment:[{pattern:/(^|\s);.*/,lookbehind:!0},{pattern:/(^[\t ]*)\/\*(?:[\r\n](?![ \t]*\*\/)|[^\r\n])*(?:[\r\n][ \t]*\*\/)?/m,lookbehind:!0,greedy:!0}],tag:{pattern:/^([ \t]*)[^\s,`":]+(?=:[ \t]*$)/m,lookbehind:!0},string:/"(?:[^"\n\r]|"")*"/,variable:/%\w+%/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/\?|\/\/?=?|:=|\|[=|]?|&[=&]?|\+[=+]?|-[=-]?|\*[=*]?|<(?:<=?|>|=)?|>>?=?|[.^!=~]=?|\b(?:AND|NOT|OR)\b/,boolean:/\b(?:false|true)\b/,selector:/\b(?:AutoTrim|BlockInput|Break|Click|ClipWait|Continue|Control|ControlClick|ControlFocus|ControlGet|ControlGetFocus|ControlGetPos|ControlGetText|ControlMove|ControlSend|ControlSendRaw|ControlSetText|CoordMode|Critical|DetectHiddenText|DetectHiddenWindows|Drive|DriveGet|DriveSpaceFree|EnvAdd|EnvDiv|EnvGet|EnvMult|EnvSet|EnvSub|EnvUpdate|Exit|ExitApp|FileAppend|FileCopy|FileCopyDir|FileCreateDir|FileCreateShortcut|FileDelete|FileEncoding|FileGetAttrib|FileGetShortcut|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileMoveDir|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileRemoveDir|FileSelectFile|FileSelectFolder|FileSetAttrib|FileSetTime|FormatTime|GetKeyState|Gosub|Goto|GroupActivate|GroupAdd|GroupClose|GroupDeactivate|Gui|GuiControl|GuiControlGet|Hotkey|ImageSearch|IniDelete|IniRead|IniWrite|Input|InputBox|KeyWait|ListHotkeys|ListLines|ListVars|Loop|Menu|MouseClick|MouseClickDrag|MouseGetPos|MouseMove|MsgBox|OnExit|OutputDebug|Pause|PixelGetColor|PixelSearch|PostMessage|Process|Progress|Random|RegDelete|RegRead|RegWrite|Reload|Repeat|Return|Run|RunAs|RunWait|Send|SendEvent|SendInput|SendMessage|SendMode|SendPlay|SendRaw|SetBatchLines|SetCapslockState|SetControlDelay|SetDefaultMouseSpeed|SetEnv|SetFormat|SetKeyDelay|SetMouseDelay|SetNumlockState|SetRegView|SetScrollLockState|SetStoreCapslockMode|SetTimer|SetTitleMatchMode|SetWinDelay|SetWorkingDir|Shutdown|Sleep|Sort|SoundBeep|SoundGet|SoundGetWaveVolume|SoundPlay|SoundSet|SoundSetWaveVolume|SplashImage|SplashTextOff|SplashTextOn|SplitPath|StatusBarGetText|StatusBarWait|StringCaseSense|StringGetPos|StringLeft|StringLen|StringLower|StringMid|StringReplace|StringRight|StringSplit|StringTrimLeft|StringTrimRight|StringUpper|Suspend|SysGet|Thread|ToolTip|Transform|TrayTip|URLDownloadToFile|WinActivate|WinActivateBottom|WinClose|WinGet|WinGetActiveStats|WinGetActiveTitle|WinGetClass|WinGetPos|WinGetText|WinGetTitle|WinHide|WinKill|WinMaximize|WinMenuSelectItem|WinMinimize|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinRestore|WinSet|WinSetTitle|WinShow|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive)\b/i,constant:/\b(?:a_ahkpath|a_ahkversion|a_appdata|a_appdatacommon|a_autotrim|a_batchlines|a_caretx|a_carety|a_computername|a_controldelay|a_cursor|a_dd|a_ddd|a_dddd|a_defaultmousespeed|a_desktop|a_desktopcommon|a_detecthiddentext|a_detecthiddenwindows|a_endchar|a_eventinfo|a_exitreason|a_fileencoding|a_formatfloat|a_formatinteger|a_gui|a_guicontrol|a_guicontrolevent|a_guievent|a_guiheight|a_guiwidth|a_guix|a_guiy|a_hour|a_iconfile|a_iconhidden|a_iconnumber|a_icontip|a_index|a_ipaddress1|a_ipaddress2|a_ipaddress3|a_ipaddress4|a_is64bitos|a_isadmin|a_iscompiled|a_iscritical|a_ispaused|a_issuspended|a_isunicode|a_keydelay|a_language|a_lasterror|a_linefile|a_linenumber|a_loopfield|a_loopfileattrib|a_loopfiledir|a_loopfileext|a_loopfilefullpath|a_loopfilelongpath|a_loopfilename|a_loopfileshortname|a_loopfileshortpath|a_loopfilesize|a_loopfilesizekb|a_loopfilesizemb|a_loopfiletimeaccessed|a_loopfiletimecreated|a_loopfiletimemodified|a_loopreadline|a_loopregkey|a_loopregname|a_loopregsubkey|a_loopregtimemodified|a_loopregtype|a_mday|a_min|a_mm|a_mmm|a_mmmm|a_mon|a_mousedelay|a_msec|a_mydocuments|a_now|a_nowutc|a_numbatchlines|a_ostype|a_osversion|a_priorhotkey|a_priorkey|a_programfiles|a_programs|a_programscommon|a_ptrsize|a_regview|a_screendpi|a_screenheight|a_screenwidth|a_scriptdir|a_scriptfullpath|a_scripthwnd|a_scriptname|a_sec|a_space|a_startmenu|a_startmenucommon|a_startup|a_startupcommon|a_stringcasesense|a_tab|a_temp|a_thisfunc|a_thishotkey|a_thislabel|a_thismenu|a_thismenuitem|a_thismenuitempos|a_tickcount|a_timeidle|a_timeidlephysical|a_timesincepriorhotkey|a_timesincethishotkey|a_titlematchmode|a_titlematchmodespeed|a_username|a_wday|a_windelay|a_windir|a_workingdir|a_yday|a_year|a_yweek|a_yyyy|clipboard|clipboardall|comspec|errorlevel|programfiles)\b/i,builtin:/\b(?:abs|acos|asc|asin|atan|ceil|chr|class|comobjactive|comobjarray|comobjconnect|comobjcreate|comobjerror|comobjflags|comobjget|comobjquery|comobjtype|comobjvalue|cos|dllcall|exp|fileexist|Fileopen|floor|format|il_add|il_create|il_destroy|instr|isfunc|islabel|IsObject|ln|log|ltrim|lv_add|lv_delete|lv_deletecol|lv_getcount|lv_getnext|lv_gettext|lv_insert|lv_insertcol|lv_modify|lv_modifycol|lv_setimagelist|mod|numget|numput|onmessage|regexmatch|regexreplace|registercallback|round|rtrim|sb_seticon|sb_setparts|sb_settext|sin|sqrt|strlen|strreplace|strsplit|substr|tan|tv_add|tv_delete|tv_get|tv_getchild|tv_getcount|tv_getnext|tv_getparent|tv_getprev|tv_getselection|tv_gettext|tv_modify|varsetcapacity|winactive|winexist|__Call|__Get|__New|__Set)\b/i,symbol:/\b(?:alt|altdown|altup|appskey|backspace|browser_back|browser_favorites|browser_forward|browser_home|browser_refresh|browser_search|browser_stop|bs|capslock|ctrl|ctrlbreak|ctrldown|ctrlup|del|delete|down|end|enter|esc|escape|f1|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f2|f20|f21|f22|f23|f24|f3|f4|f5|f6|f7|f8|f9|home|ins|insert|joy1|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy2|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy3|joy30|joy31|joy32|joy4|joy5|joy6|joy7|joy8|joy9|joyaxes|joybuttons|joyinfo|joyname|joypov|joyr|joyu|joyv|joyx|joyy|joyz|lalt|launch_app1|launch_app2|launch_mail|launch_media|lbutton|lcontrol|lctrl|left|lshift|lwin|lwindown|lwinup|mbutton|media_next|media_play_pause|media_prev|media_stop|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadadd|numpadclear|numpaddel|numpaddiv|numpaddot|numpaddown|numpadend|numpadenter|numpadhome|numpadins|numpadleft|numpadmult|numpadpgdn|numpadpgup|numpadright|numpadsub|numpadup|pgdn|pgup|printscreen|ralt|rbutton|rcontrol|rctrl|right|rshift|rwin|rwindown|rwinup|scrolllock|shift|shiftdown|shiftup|space|tab|up|volume_down|volume_mute|volume_up|wheeldown|wheelleft|wheelright|wheelup|xbutton1|xbutton2)\b/i,important:/#\b(?:AllowSameLineComments|ClipboardTimeout|CommentFlag|DerefChar|ErrorStdOut|EscapeChar|HotkeyInterval|HotkeyModifierTimeout|Hotstring|If|IfTimeout|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Include|IncludeAgain|InputLevel|InstallKeybdHook|InstallMouseHook|KeyHistory|MaxHotkeysPerInterval|MaxMem|MaxThreads|MaxThreadsBuffer|MaxThreadsPerHotkey|MenuMaskKey|NoEnv|NoTrayIcon|Persistent|SingleInstance|UseHook|Warn|WinActivateForce)\b/i,keyword:/\b(?:Abort|AboveNormal|Add|ahk_class|ahk_exe|ahk_group|ahk_id|ahk_pid|All|Alnum|Alpha|AltSubmit|AltTab|AltTabAndMenu|AltTabMenu|AltTabMenuDismiss|AlwaysOnTop|AutoSize|Background|BackgroundTrans|BelowNormal|between|BitAnd|BitNot|BitOr|BitShiftLeft|BitShiftRight|BitXOr|Bold|Border|Button|ByRef|Catch|Checkbox|Checked|CheckedGray|Choose|ChooseString|Close|Color|ComboBox|Contains|ControlList|Count|Date|DateTime|Days|DDL|Default|DeleteAll|Delimiter|Deref|Destroy|Digit|Disable|Disabled|DropDownList|Edit|Eject|Else|Enable|Enabled|Error|Exist|Expand|ExStyle|FileSystem|Finally|First|Flash|Float|FloatFast|Focus|Font|for|global|Grid|Group|GroupBox|GuiClose|GuiContextMenu|GuiDropFiles|GuiEscape|GuiSize|Hdr|Hidden|Hide|High|HKCC|HKCR|HKCU|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_LOCAL_MACHINE|HKEY_USERS|HKLM|HKU|Hours|HScroll|Icon|IconSmall|ID|IDLast|If|IfEqual|IfExist|IfGreater|IfGreaterOrEqual|IfInString|IfLess|IfLessOrEqual|IfMsgBox|IfNotEqual|IfNotExist|IfNotInString|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Ignore|ImageList|in|Integer|IntegerFast|Interrupt|is|italic|Join|Label|LastFound|LastFoundExist|Limit|Lines|List|ListBox|ListView|local|Lock|Logoff|Low|Lower|Lowercase|MainWindow|Margin|Maximize|MaximizeBox|MaxSize|Minimize|MinimizeBox|MinMax|MinSize|Minutes|MonthCal|Mouse|Move|Multi|NA|No|NoActivate|NoDefault|NoHide|NoIcon|NoMainWindow|norm|Normal|NoSort|NoSortHdr|NoStandard|Not|NoTab|NoTimers|Number|Off|Ok|On|OwnDialogs|Owner|Parse|Password|Picture|Pixel|Pos|Pow|Priority|ProcessName|Radio|Range|Read|ReadOnly|Realtime|Redraw|Region|REG_BINARY|REG_DWORD|REG_EXPAND_SZ|REG_MULTI_SZ|REG_SZ|Relative|Rename|Report|Resize|Restore|Retry|RGB|Screen|Seconds|Section|Serial|SetLabel|ShiftAltTab|Show|Single|Slider|SortDesc|Standard|static|Status|StatusBar|StatusCD|strike|Style|Submit|SysMenu|Tab2|TabStop|Text|Theme|Throw|Tile|ToggleCheck|ToggleEnable|ToolWindow|Top|Topmost|TransColor|Transparent|Tray|TreeView|Try|TryAgain|Type|UnCheck|underline|Unicode|Unlock|Until|UpDown|Upper|Uppercase|UseErrorLevel|Vis|VisFirst|Visible|VScroll|Wait|WaitClose|WantCtrlA|WantF2|WantReturn|While|Wrap|Xdigit|xm|xp|xs|Yes|ym|yp|ys)\b/i,function:/[^(); \t,\n+*\-=?>:\\\/<&%\[\]]+(?=\()/,punctuation:/[{}[\]():,]/}}return Hy}var Vy,DI;function fbe(){if(DI)return Vy;DI=1,Vy=e,e.displayName="autoit",e.aliases=[];function e(t){t.languages.autoit={comment:[/;.*/,{pattern:/(^[\t ]*)#(?:comments-start|cs)[\s\S]*?^[ \t]*#(?:ce|comments-end)/m,lookbehind:!0}],url:{pattern:/(^[\t ]*#include\s+)(?:<[^\r\n>]+>|"[^\r\n"]+")/m,lookbehind:!0},string:{pattern:/(["'])(?:\1\1|(?!\1)[^\r\n])*\1/,greedy:!0,inside:{variable:/([%$@])\w+\1/}},directive:{pattern:/(^[\t ]*)#[\w-]+/m,lookbehind:!0,alias:"keyword"},function:/\b\w+(?=\()/,variable:/[$@]\w+/,keyword:/\b(?:Case|Const|Continue(?:Case|Loop)|Default|Dim|Do|Else(?:If)?|End(?:Func|If|Select|Switch|With)|Enum|Exit(?:Loop)?|For|Func|Global|If|In|Local|Next|Null|ReDim|Select|Static|Step|Switch|Then|To|Until|Volatile|WEnd|While|With)\b/i,number:/\b(?:0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,boolean:/\b(?:False|True)\b/i,operator:/<[=>]?|[-+*\/=&>]=?|[?^]|\b(?:And|Not|Or)\b/i,punctuation:/[\[\]().,:]/}}return Vy}var qy,LI;function pbe(){if(LI)return qy;LI=1,qy=e,e.displayName="avisynth",e.aliases=["avs"];function e(t){(function(n){function r(u,d){return u.replace(/<<(\d+)>>/g,function(g,m){return d[+m]})}function a(u,d,g){return RegExp(r(u,d),g||"")}var o=/bool|clip|float|int|string|val/.source,i=[/is(?:bool|clip|float|int|string)|defined|(?:(?:internal)?function|var)?exists?/.source,/apply|assert|default|eval|import|nop|select|undefined/.source,/opt_(?:allowfloataudio|avipadscanlines|dwchannelmask|enable_(?:b64a|planartopackedrgb|v210|y3_10_10|y3_10_16)|usewaveextensible|vdubplanarhack)|set(?:cachemode|maxcpu|memorymax|planarlegacyalignment|workingdir)/.source,/hex(?:value)?|value/.source,/abs|ceil|continued(?:denominator|numerator)?|exp|floor|fmod|frac|log(?:10)?|max|min|muldiv|pi|pow|rand|round|sign|spline|sqrt/.source,/a?sinh?|a?cosh?|a?tan[2h]?/.source,/(?:bit(?:and|not|x?or|[lr]?shift[aslu]?|sh[lr]|sa[lr]|[lr]rotatel?|ro[rl]|te?st|set(?:count)?|cl(?:ea)?r|ch(?:an)?ge?))/.source,/average(?:[bgr]|chroma[uv]|luma)|(?:[rgb]|chroma[uv]|luma|rgb|[yuv](?=difference(?:fromprevious|tonext)))difference(?:fromprevious|tonext)?|[yuvrgb]plane(?:median|min|max|minmaxdifference)/.source,/getprocessinfo|logmsg|script(?:dir(?:utf8)?|file(?:utf8)?|name(?:utf8)?)|setlogparams/.source,/chr|(?:fill|find|left|mid|replace|rev|right)str|format|[lu]case|ord|str(?:cmpi?|fromutf8|len|toutf8)|time|trim(?:all|left|right)/.source,/isversionorgreater|version(?:number|string)/.source,/buildpixeltype|colorspacenametopixeltype/.source,/addautoloaddir|on(?:cpu|cuda)|prefetch|setfiltermtmode/.source].join("|"),s=[/has(?:audio|video)/.source,/height|width/.source,/frame(?:count|rate)|framerate(?:denominator|numerator)/.source,/getparity|is(?:field|frame)based/.source,/bitspercomponent|componentsize|hasalpha|is(?:planar(?:rgba?)?|interleaved|rgb(?:24|32|48|64)?|y(?:8|u(?:va?|y2))?|yv(?:12|16|24|411)|420|422|444|packedrgb)|numcomponents|pixeltype/.source,/audio(?:bits|channels|duration|length(?:[fs]|hi|lo)?|rate)|isaudio(?:float|int)/.source].join("|"),l=[/avi(?:file)?source|directshowsource|image(?:reader|source|sourceanim)|opendmlsource|segmented(?:avisource|directshowsource)|wavsource/.source,/coloryuv|convertbacktoyuy2|convertto(?:RGB(?:24|32|48|64)|(?:planar)?RGBA?|Y8?|YV(?:12|16|24|411)|YUVA?(?:411|420|422|444)|YUY2)|fixluminance|gr[ae]yscale|invert|levels|limiter|mergea?rgb|merge(?:chroma|luma)|rgbadjust|show(?:alpha|blue|green|red)|swapuv|tweak|[uv]toy8?|ytouv/.source,/(?:colorkey|reset)mask|layer|mask(?:hs)?|merge|overlay|subtract/.source,/addborders|(?:bicubic|bilinear|blackman|gauss|lanczos4|lanczos|point|sinc|spline(?:16|36|64))resize|crop(?:bottom)?|flip(?:horizontal|vertical)|(?:horizontal|vertical)?reduceby2|letterbox|skewrows|turn(?:180|left|right)/.source,/blur|fixbrokenchromaupsampling|generalconvolution|(?:spatial|temporal)soften|sharpen/.source,/trim|(?:un)?alignedsplice|(?:assume|assumescaled|change|convert)FPS|(?:delete|duplicate)frame|dissolve|fade(?:in|io|out)[02]?|freezeframe|interleave|loop|reverse|select(?:even|odd|(?:range)?every)/.source,/assume[bt]ff|assume(?:field|frame)based|bob|complementparity|doubleweave|peculiarblend|pulldown|separate(?:columns|fields|rows)|swapfields|weave(?:columns|rows)?/.source,/amplify(?:db)?|assumesamplerate|audiodub(?:ex)?|audiotrim|convertaudioto(?:(?:8|16|24|32)bit|float)|converttomono|delayaudio|ensurevbrmp3sync|get(?:left|right)?channel|kill(?:audio|video)|mergechannels|mixaudio|monotostereo|normalize|resampleaudio|ssrc|supereq|timestretch/.source,/animate|applyrange|conditional(?:filter|reader|select)|frameevaluate|scriptclip|tcp(?:server|source)|writefile(?:end|if|start)?/.source,/imagewriter/.source,/blackness|blankclip|colorbars(?:hd)?|compare|dumpfiltergraph|echo|histogram|info|messageclip|preroll|setgraphanalysis|show(?:framenumber|smpte|time)|showfiveversions|stack(?:horizontal|vertical)|subtitle|tone|version/.source].join("|"),c=[i,s,l].join("|");n.languages.avisynth={comment:[{pattern:/(^|[^\\])\[\*(?:[^\[*]|\[(?!\*)|\*(?!\])|\[\*(?:[^\[*]|\[(?!\*)|\*(?!\]))*\*\])*\*\]/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0,greedy:!0}],argument:{pattern:a(/\b(?:<<0>>)\s+("?)\w+\1/.source,[o],"i"),inside:{keyword:/^\w+/}},"argument-label":{pattern:/([,(][\s\\]*)\w+\s*=(?!=)/,lookbehind:!0,inside:{"argument-name":{pattern:/^\w+/,alias:"punctuation"},punctuation:/=$/}},string:[{pattern:/"""[\s\S]*?"""/,greedy:!0},{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0,inside:{constant:{pattern:/\b(?:DEFAULT_MT_MODE|(?:MAINSCRIPT|PROGRAM|SCRIPT)DIR|(?:MACHINE|USER)_(?:CLASSIC|PLUS)_PLUGINS)\b/}}}],variable:/\b(?:last)\b/i,boolean:/\b(?:false|no|true|yes)\b/i,keyword:/\b(?:catch|else|for|function|global|if|return|try|while|__END__)\b/i,constant:/\bMT_(?:MULTI_INSTANCE|NICE_FILTER|SERIALIZED|SPECIAL_MT)\b/,"builtin-function":{pattern:a(/\b(?:<<0>>)\b/.source,[c],"i"),alias:"function"},"type-cast":{pattern:a(/\b(?:<<0>>)(?=\s*\()/.source,[o],"i"),alias:"keyword"},function:{pattern:/\b[a-z_]\w*(?=\s*\()|(\.)[a-z_]\w*\b/i,lookbehind:!0},"line-continuation":{pattern:/(^[ \t]*)\\|\\(?=[ \t]*$)/m,lookbehind:!0,alias:"punctuation"},number:/\B\$(?:[\da-f]{6}|[\da-f]{8})\b|(?:(?:\b|\B-)\d+(?:\.\d*)?\b|\B\.\d+\b)/i,operator:/\+\+?|[!=<>]=?|&&|\|\||[?:*/%-]/,punctuation:/[{}\[\]();,.]/},n.languages.avs=n.languages.avisynth})(t)}return qy}var Gy,MI;function gbe(){if(MI)return Gy;MI=1,Gy=e,e.displayName="avroIdl",e.aliases=[];function e(t){t.languages["avro-idl"]={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},string:{pattern:/(^|[^\\])"(?:[^\r\n"\\]|\\.)*"/,lookbehind:!0,greedy:!0},annotation:{pattern:/@(?:[$\w.-]|`[^\r\n`]+`)+/,greedy:!0,alias:"function"},"function-identifier":{pattern:/`[^\r\n`]+`(?=\s*\()/,greedy:!0,alias:"function"},identifier:{pattern:/`[^\r\n`]+`/,greedy:!0},"class-name":{pattern:/(\b(?:enum|error|protocol|record|throws)\b\s+)[$\w]+/,lookbehind:!0,greedy:!0},keyword:/\b(?:array|boolean|bytes|date|decimal|double|enum|error|false|fixed|float|idl|import|int|local_timestamp_ms|long|map|null|oneway|protocol|record|schema|string|throws|time_ms|timestamp_ms|true|union|uuid|void)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:[{pattern:/(^|[^\w.])-?(?:(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|0x(?:[a-f0-9]+(?:\.[a-f0-9]*)?|\.[a-f0-9]+)(?:p[+-]?\d+)?)[dfl]?(?![\w.])/i,lookbehind:!0},/-?\b(?:Infinity|NaN)\b/],operator:/=/,punctuation:/[()\[\]{}<>.:,;-]/},t.languages.avdl=t.languages["avro-idl"]}return Gy}var Wy,PI;function rz(){if(PI)return Wy;PI=1,Wy=e,e.displayName="bash",e.aliases=["shell"];function e(t){(function(n){var r="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",a={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},o={bash:a,environment:{pattern:RegExp("\\$"+r),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+r),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};n.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+r),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:o},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:a}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:o},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:o.entity}}],environment:{pattern:RegExp("\\$?"+r),alias:"constant"},variable:o.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},a.inside=n.languages.bash;for(var i=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],s=o.variable[1].inside,l=0;l?^\w +\-.])*"/,greedy:!0},number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,keyword:/\b(?:AS|BEEP|BLOAD|BSAVE|CALL(?: ABSOLUTE)?|CASE|CHAIN|CHDIR|CLEAR|CLOSE|CLS|COM|COMMON|CONST|DATA|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DIM|DO|DOUBLE|ELSE|ELSEIF|END|ENVIRON|ERASE|ERROR|EXIT|FIELD|FILES|FOR|FUNCTION|GET|GOSUB|GOTO|IF|INPUT|INTEGER|IOCTL|KEY|KILL|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|MKDIR|NAME|NEXT|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPTION BASE|OUT|POKE|PUT|READ|REDIM|REM|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SELECT CASE|SHARED|SHELL|SINGLE|SLEEP|STATIC|STEP|STOP|STRING|SUB|SWAP|SYSTEM|THEN|TIMER|TO|TROFF|TRON|TYPE|UNLOCK|UNTIL|USING|VIEW PRINT|WAIT|WEND|WHILE|WRITE)(?:\$|\b)/i,function:/\b(?:ABS|ACCESS|ACOS|ANGLE|AREA|ARITHMETIC|ARRAY|ASIN|ASK|AT|ATN|BASE|BEGIN|BREAK|CAUSE|CEIL|CHR|CLIP|COLLATE|COLOR|CON|COS|COSH|COT|CSC|DATE|DATUM|DEBUG|DECIMAL|DEF|DEG|DEGREES|DELETE|DET|DEVICE|DISPLAY|DOT|ELAPSED|EPS|ERASABLE|EXLINE|EXP|EXTERNAL|EXTYPE|FILETYPE|FIXED|FP|GO|GRAPH|HANDLER|IDN|IMAGE|IN|INT|INTERNAL|IP|IS|KEYED|LBOUND|LCASE|LEFT|LEN|LENGTH|LET|LINE|LINES|LOG|LOG10|LOG2|LTRIM|MARGIN|MAT|MAX|MAXNUM|MID|MIN|MISSING|MOD|NATIVE|NUL|NUMERIC|OF|OPTION|ORD|ORGANIZATION|OUTIN|OUTPUT|PI|POINT|POINTER|POINTS|POS|PRINT|PROGRAM|PROMPT|RAD|RADIANS|RANDOMIZE|RECORD|RECSIZE|RECTYPE|RELATIVE|REMAINDER|REPEAT|REST|RETRY|REWRITE|RIGHT|RND|ROUND|RTRIM|SAME|SEC|SELECT|SEQUENTIAL|SET|SETTER|SGN|SIN|SINH|SIZE|SKIP|SQR|STANDARD|STATUS|STR|STREAM|STYLE|TAB|TAN|TANH|TEMPLATE|TEXT|THERE|TIME|TIMEOUT|TRACE|TRANSFORM|TRUNCATE|UBOUND|UCASE|USE|VAL|VARIABLE|VIEWPORT|WHEN|WINDOW|WITH|ZER|ZONEWIDTH)(?:\$|\b)/i,operator:/<[=>]?|>=?|[+\-*\/^=&]|\b(?:AND|EQV|IMP|NOT|OR|XOR)\b/i,punctuation:/[,;:()]/}}return Ky}var Yy,FI;function mbe(){if(FI)return Yy;FI=1,Yy=e,e.displayName="batch",e.aliases=[];function e(t){(function(n){var r=/%%?[~:\w]+%?|!\S+!/,a={pattern:/\/[a-z?]+(?=[ :]|$):?|-[a-z]\b|--[a-z-]+\b/im,alias:"attr-name",inside:{punctuation:/:/}},o=/"(?:[\\"]"|[^"])*"(?!")/,i=/(?:\b|-)\d+\b/;n.languages.batch={comment:[/^::.*/m,{pattern:/((?:^|[&(])[ \t]*)rem\b(?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0}],label:{pattern:/^:.*/m,alias:"property"},command:[{pattern:/((?:^|[&(])[ \t]*)for(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* \S+ in \([^)]+\) do/im,lookbehind:!0,inside:{keyword:/\b(?:do|in)\b|^for\b/i,string:o,parameter:a,variable:r,number:i,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*)if(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:not )?(?:cmdextversion \d+|defined \w+|errorlevel \d+|exist \S+|(?:"[^"]*"|(?!")(?:(?!==)\S)+)?(?:==| (?:equ|geq|gtr|leq|lss|neq) )(?:"[^"]*"|[^\s"]\S*))/im,lookbehind:!0,inside:{keyword:/\b(?:cmdextversion|defined|errorlevel|exist|not)\b|^if\b/i,string:o,parameter:a,variable:r,number:i,operator:/\^|==|\b(?:equ|geq|gtr|leq|lss|neq)\b/i}},{pattern:/((?:^|[&()])[ \t]*)else\b/im,lookbehind:!0,inside:{keyword:/^else\b/i}},{pattern:/((?:^|[&(])[ \t]*)set(?: \/[a-z](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0,inside:{keyword:/^set\b/i,string:o,parameter:a,variable:[r,/\w+(?=(?:[*\/%+\-&^|]|<<|>>)?=)/],number:i,operator:/[*\/%+\-&^|]=?|<<=?|>>=?|[!~_=]/,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*@?)\w+\b(?:"(?:[\\"]"|[^"])*"(?!")|[^"^&)\r\n]|\^(?:\r\n|[\s\S]))*/m,lookbehind:!0,inside:{keyword:/^\w+\b/,string:o,parameter:a,label:{pattern:/(^\s*):\S+/m,lookbehind:!0,alias:"property"},variable:r,number:i,operator:/\^/}}],operator:/[&@]/,punctuation:/[()']/}})(t)}return Yy}var Zy,jI;function hbe(){if(jI)return Zy;jI=1,Zy=e,e.displayName="bbcode",e.aliases=["shortcode"];function e(t){t.languages.bbcode={tag:{pattern:/\[\/?[^\s=\]]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+))?(?:\s+[^\s=\]]+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+))*\s*\]/,inside:{tag:{pattern:/^\[\/?[^\s=\]]+/,inside:{punctuation:/^\[\/?/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+)/,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\]/,"attr-name":/[^\s=\]]+/}}},t.languages.shortcode=t.languages.bbcode}return Zy}var Xy,zI;function bbe(){if(zI)return Xy;zI=1,Xy=e,e.displayName="bicep",e.aliases=[];function e(t){t.languages.bicep={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],property:[{pattern:/([\r\n][ \t]*)[a-z_]\w*(?=[ \t]*:)/i,lookbehind:!0},{pattern:/([\r\n][ \t]*)'(?:\\.|\$(?!\{)|[^'\\\r\n$])*'(?=[ \t]*:)/,lookbehind:!0,greedy:!0}],string:[{pattern:/'''[^'][\s\S]*?'''/,greedy:!0},{pattern:/(^|[^\\'])'(?:\\.|\$(?!\{)|[^'\\\r\n$])*'/,lookbehind:!0,greedy:!0}],"interpolated-string":{pattern:/(^|[^\\'])'(?:\\.|\$(?:(?!\{)|\{[^{}\r\n]*\})|[^'\\\r\n$])*'/,lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/\$\{[^{}\r\n]*\}/,inside:{expression:{pattern:/(^\$\{)[\s\S]+(?=\}$)/,lookbehind:!0},punctuation:/^\$\{|\}$/}},string:/[\s\S]+/}},datatype:{pattern:/(\b(?:output|param)\b[ \t]+\w+[ \t]+)\w+\b/,lookbehind:!0,alias:"class-name"},boolean:/\b(?:false|true)\b/,keyword:/\b(?:existing|for|if|in|module|null|output|param|resource|targetScope|var)\b/,decorator:/@\w+\b/,function:/\b[a-z_]\w*(?=[ \t]*\()/i,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/,punctuation:/[{}[\];(),.:]/},t.languages.bicep["interpolated-string"].inside.interpolation.inside.expression.inside=t.languages.bicep}return Xy}var Qy,UI;function ybe(){if(UI)return Qy;UI=1,Qy=e,e.displayName="birb",e.aliases=[];function e(t){t.languages.birb=t.languages.extend("clike",{string:{pattern:/r?("|')(?:\\.|(?!\1)[^\\])*\1/,greedy:!0},"class-name":[/\b[A-Z](?:[\d_]*[a-zA-Z]\w*)?\b/,/\b(?:[A-Z]\w*|(?!(?:var|void)\b)[a-z]\w*)(?=\s+\w+\s*[;,=()])/],keyword:/\b(?:assert|break|case|class|const|default|else|enum|final|follows|for|grab|if|nest|new|next|noSeeb|return|static|switch|throw|var|void|while)\b/,operator:/\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?|:/,variable:/\b[a-z_]\w*\b/}),t.languages.insertBefore("birb","function",{metadata:{pattern:/<\w+>/,greedy:!0,alias:"symbol"}})}return Qy}var Jy,BI;function vbe(){if(BI)return Jy;BI=1;var e=Ws();Jy=t,t.displayName="bison",t.aliases=[];function t(n){n.register(e),n.languages.bison=n.languages.extend("c",{}),n.languages.insertBefore("bison","comment",{bison:{pattern:/^(?:[^%]|%(?!%))*%%[\s\S]*?%%/,inside:{c:{pattern:/%\{[\s\S]*?%\}|\{(?:\{[^}]*\}|[^{}])*\}/,inside:{delimiter:{pattern:/^%?\{|%?\}$/,alias:"punctuation"},"bison-variable":{pattern:/[$@](?:<[^\s>]+>)?[\w$]+/,alias:"variable",inside:{punctuation:/<|>/}},rest:n.languages.c}},comment:n.languages.c.comment,string:n.languages.c.string,property:/\S+(?=:)/,keyword:/%\w+/,number:{pattern:/(^|[^@])\b(?:0x[\da-f]+|\d+)/i,lookbehind:!0},punctuation:/%[%?]|[|:;\[\]<>]/}}})}return Jy}var ev,HI;function Sbe(){if(HI)return ev;HI=1,ev=e,e.displayName="bnf",e.aliases=["rbnf"];function e(t){t.languages.bnf={string:{pattern:/"[^\r\n"]*"|'[^\r\n']*'/},definition:{pattern:/<[^<>\r\n\t]+>(?=\s*::=)/,alias:["rule","keyword"],inside:{punctuation:/^<|>$/}},rule:{pattern:/<[^<>\r\n\t]+>/,inside:{punctuation:/^<|>$/}},operator:/::=|[|()[\]{}*+?]|\.{3}/},t.languages.rbnf=t.languages.bnf}return ev}var tv,VI;function wbe(){if(VI)return tv;VI=1,tv=e,e.displayName="brainfuck",e.aliases=[];function e(t){t.languages.brainfuck={pointer:{pattern:/<|>/,alias:"keyword"},increment:{pattern:/\+/,alias:"inserted"},decrement:{pattern:/-/,alias:"deleted"},branching:{pattern:/\[|\]/,alias:"important"},operator:/[.,]/,comment:/\S+/}}return tv}var nv,qI;function Ebe(){if(qI)return nv;qI=1,nv=e,e.displayName="brightscript",e.aliases=[];function e(t){t.languages.brightscript={comment:/(?:\brem|').*/i,"directive-statement":{pattern:/(^[\t ]*)#(?:const|else(?:[\t ]+if)?|end[\t ]+if|error|if).*/im,lookbehind:!0,alias:"property",inside:{"error-message":{pattern:/(^#error).+/,lookbehind:!0},directive:{pattern:/^#(?:const|else(?:[\t ]+if)?|end[\t ]+if|error|if)/,alias:"keyword"},expression:{pattern:/[\s\S]+/,inside:null}}},property:{pattern:/([\r\n{,][\t ]*)(?:(?!\d)\w+|"(?:[^"\r\n]|"")*"(?!"))(?=[ \t]*:)/,lookbehind:!0,greedy:!0},string:{pattern:/"(?:[^"\r\n]|"")*"(?!")/,greedy:!0},"class-name":{pattern:/(\bAs[\t ]+)\w+/i,lookbehind:!0},keyword:/\b(?:As|Dim|Each|Else|Elseif|End|Exit|For|Function|Goto|If|In|Print|Return|Step|Stop|Sub|Then|To|While)\b/i,boolean:/\b(?:false|true)\b/i,function:/\b(?!\d)\w+(?=[\t ]*\()/,number:/(?:\b\d+(?:\.\d+)?(?:[ed][+-]\d+)?|&h[a-f\d]+)\b[%&!#]?/i,operator:/--|\+\+|>>=?|<<=?|<>|[-+*/\\<>]=?|[:^=?]|\b(?:and|mod|not|or)\b/i,punctuation:/[.,;()[\]{}]/,constant:/\b(?:LINE_NUM)\b/i},t.languages.brightscript["directive-statement"].inside.expression.inside=t.languages.brightscript}return nv}var rv,GI;function xbe(){if(GI)return rv;GI=1,rv=e,e.displayName="bro",e.aliases=[];function e(t){t.languages.bro={comment:{pattern:/(^|[^\\$])#.*/,lookbehind:!0,inside:{italic:/\b(?:FIXME|TODO|XXX)\b/}},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},boolean:/\b[TF]\b/,function:{pattern:/(\b(?:event|function|hook)[ \t]+)\w+(?:::\w+)?/,lookbehind:!0},builtin:/(?:@(?:load(?:-(?:plugin|sigs))?|unload|prefixes|ifn?def|else|(?:end)?if|DIR|FILENAME))|(?:&?(?:add_func|create_expire|default|delete_func|encrypt|error_handler|expire_func|group|log|mergeable|optional|persistent|priority|raw_output|read_expire|redef|rotate_interval|rotate_size|synchronized|type_column|write_expire))/,constant:{pattern:/(\bconst[ \t]+)\w+/i,lookbehind:!0},keyword:/\b(?:add|addr|alarm|any|bool|break|const|continue|count|delete|double|else|enum|event|export|file|for|function|global|hook|if|in|int|interval|local|module|next|of|opaque|pattern|port|print|record|return|schedule|set|string|subnet|table|time|timeout|using|vector|when)\b/,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&|\|\|?|\?|\*|\/|~|\^|%/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,punctuation:/[{}[\];(),.:]/}}return rv}var av,WI;function kbe(){if(WI)return av;WI=1,av=e,e.displayName="bsl",e.aliases=[];function e(t){t.languages.bsl={comment:/\/\/.*/,string:[{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},{pattern:/'(?:[^'\r\n\\]|\\.)*'/}],keyword:[{pattern:/(^|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:пока|для|новый|прервать|попытка|исключение|вызватьисключение|иначе|конецпопытки|неопределено|функция|перем|возврат|конецфункции|если|иначеесли|процедура|конецпроцедуры|тогда|знач|экспорт|конецесли|из|каждого|истина|ложь|по|цикл|конеццикла|выполнить)(?![\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])/i,lookbehind:!0},{pattern:/\b(?:break|do|each|else|elseif|enddo|endfunction|endif|endprocedure|endtry|except|execute|export|false|for|function|if|in|new|null|procedure|raise|return|then|to|true|try|undefined|val|var|while)\b/i}],number:{pattern:/(^(?=\d)|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?/i,lookbehind:!0},operator:[/[<>+\-*/]=?|[%=]/,{pattern:/(^|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:и|или|не)(?![\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])/i,lookbehind:!0},{pattern:/\b(?:and|not|or)\b/i}],punctuation:/\(\.|\.\)|[()\[\]:;,.]/,directive:[{pattern:/^([ \t]*)&.*/m,lookbehind:!0,greedy:!0,alias:"important"},{pattern:/^([ \t]*)#.*/gm,lookbehind:!0,greedy:!0,alias:"important"}]},t.languages.oscript=t.languages.bsl}return av}var ov,KI;function Cbe(){if(KI)return ov;KI=1,ov=e,e.displayName="cfscript",e.aliases=[];function e(t){t.languages.cfscript=t.languages.extend("clike",{comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,inside:{annotation:{pattern:/(?:^|[^.])@[\w\.]+/,alias:"punctuation"}}},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],keyword:/\b(?:abstract|break|catch|component|continue|default|do|else|extends|final|finally|for|function|if|in|include|package|private|property|public|remote|required|rethrow|return|static|switch|throw|try|var|while|xml)\b(?!\s*=)/,operator:[/\+\+|--|&&|\|\||::|=>|[!=]==|<=?|>=?|[-+*/%&|^!=<>]=?|\?(?:\.|:)?|[?:]/,/\b(?:and|contains|eq|equal|eqv|gt|gte|imp|is|lt|lte|mod|not|or|xor)\b/],scope:{pattern:/\b(?:application|arguments|cgi|client|cookie|local|session|super|this|variables)\b/,alias:"global"},type:{pattern:/\b(?:any|array|binary|boolean|date|guid|numeric|query|string|struct|uuid|void|xml)\b/,alias:"builtin"}}),t.languages.insertBefore("cfscript","keyword",{"function-variable":{pattern:/[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"}}),delete t.languages.cfscript["class-name"],t.languages.cfc=t.languages.cfscript}return ov}var iv,YI;function _be(){if(YI)return iv;YI=1;var e=RA();iv=t,t.displayName="chaiscript",t.aliases=[];function t(n){n.register(e),n.languages.chaiscript=n.languages.extend("clike",{string:{pattern:/(^|[^\\])'(?:[^'\\]|\\[\s\S])*'/,lookbehind:!0,greedy:!0},"class-name":[{pattern:/(\bclass\s+)\w+/,lookbehind:!0},{pattern:/(\b(?:attr|def)\s+)\w+(?=\s*::)/,lookbehind:!0}],keyword:/\b(?:attr|auto|break|case|catch|class|continue|def|default|else|finally|for|fun|global|if|return|switch|this|try|var|while)\b/,number:[n.languages.cpp.number,/\b(?:Infinity|NaN)\b/],operator:/>>=?|<<=?|\|\||&&|:[:=]?|--|\+\+|[=!<>+\-*/%|&^]=?|[?~]|`[^`\r\n]{1,4}`/}),n.languages.insertBefore("chaiscript","operator",{"parameter-type":{pattern:/([,(]\s*)\w+(?=\s+\w)/,lookbehind:!0,alias:"class-name"}}),n.languages.insertBefore("chaiscript","string",{"string-interpolation":{pattern:/(^|[^\\])"(?:[^"$\\]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*"/,lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\}/,lookbehind:!0,inside:{"interpolation-expression":{pattern:/(^\$\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:n.languages.chaiscript},"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"}}},string:/[\s\S]+/}}})}return iv}var sv,ZI;function Abe(){if(ZI)return sv;ZI=1,sv=e,e.displayName="cil",e.aliases=[];function e(t){t.languages.cil={comment:/\/\/.*/,string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},directive:{pattern:/(^|\W)\.[a-z]+(?=\s)/,lookbehind:!0,alias:"class-name"},variable:/\[[\w\.]+\]/,keyword:/\b(?:abstract|ansi|assembly|auto|autochar|beforefieldinit|bool|bstr|byvalstr|catch|char|cil|class|currency|date|decimal|default|enum|error|explicit|extends|extern|famandassem|family|famorassem|final(?:ly)?|float32|float64|hidebysig|u?int(?:8|16|32|64)?|iant|idispatch|implements|import|initonly|instance|interface|iunknown|literal|lpstr|lpstruct|lptstr|lpwstr|managed|method|native(?:Type)?|nested|newslot|object(?:ref)?|pinvokeimpl|private|privatescope|public|reqsecobj|rtspecialname|runtime|sealed|sequential|serializable|specialname|static|string|struct|syschar|tbstr|unicode|unmanagedexp|unsigned|value(?:type)?|variant|virtual|void)\b/,function:/\b(?:(?:constrained|no|readonly|tail|unaligned|volatile)\.)?(?:conv\.(?:[iu][1248]?|ovf\.[iu][1248]?(?:\.un)?|r\.un|r4|r8)|ldc\.(?:i4(?:\.\d+|\.[mM]1|\.s)?|i8|r4|r8)|ldelem(?:\.[iu][1248]?|\.r[48]|\.ref|a)?|ldind\.(?:[iu][1248]?|r[48]|ref)|stelem\.?(?:i[1248]?|r[48]|ref)?|stind\.(?:i[1248]?|r[48]|ref)?|end(?:fault|filter|finally)|ldarg(?:\.[0-3s]|a(?:\.s)?)?|ldloc(?:\.\d+|\.s)?|sub(?:\.ovf(?:\.un)?)?|mul(?:\.ovf(?:\.un)?)?|add(?:\.ovf(?:\.un)?)?|stloc(?:\.[0-3s])?|refany(?:type|val)|blt(?:\.un)?(?:\.s)?|ble(?:\.un)?(?:\.s)?|bgt(?:\.un)?(?:\.s)?|bge(?:\.un)?(?:\.s)?|unbox(?:\.any)?|init(?:blk|obj)|call(?:i|virt)?|brfalse(?:\.s)?|bne\.un(?:\.s)?|ldloca(?:\.s)?|brzero(?:\.s)?|brtrue(?:\.s)?|brnull(?:\.s)?|brinst(?:\.s)?|starg(?:\.s)?|leave(?:\.s)?|shr(?:\.un)?|rem(?:\.un)?|div(?:\.un)?|clt(?:\.un)?|alignment|castclass|ldvirtftn|beq(?:\.s)?|ckfinite|ldsflda|ldtoken|localloc|mkrefany|rethrow|cgt\.un|arglist|switch|stsfld|sizeof|newobj|newarr|ldsfld|ldnull|ldflda|isinst|throw|stobj|stfld|ldstr|ldobj|ldlen|ldftn|ldfld|cpobj|cpblk|break|br\.s|xor|shl|ret|pop|not|nop|neg|jmp|dup|cgt|ceq|box|and|or|br)\b/,boolean:/\b(?:false|true)\b/,number:/\b-?(?:0x[0-9a-f]+|\d+)(?:\.[0-9a-f]+)?\b/i,punctuation:/[{}[\];(),:=]|IL_[0-9A-Za-z]+/}}return sv}var lv,XI;function Tbe(){if(XI)return lv;XI=1,lv=e,e.displayName="clojure",e.aliases=[];function e(t){t.languages.clojure={comment:{pattern:/;.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},char:/\\\w+/,symbol:{pattern:/(^|[\s()\[\]{},])::?[\w*+!?'<>=/.-]+/,lookbehind:!0},keyword:{pattern:/(\()(?:-|->|->>|\.|\.\.|\*|\/|\+|<|<=|=|==|>|>=|accessor|agent|agent-errors|aget|alength|all-ns|alter|and|append-child|apply|array-map|aset|aset-boolean|aset-byte|aset-char|aset-double|aset-float|aset-int|aset-long|aset-short|assert|assoc|await|await-for|bean|binding|bit-and|bit-not|bit-or|bit-shift-left|bit-shift-right|bit-xor|boolean|branch\?|butlast|byte|cast|char|children|class|clear-agent-errors|comment|commute|comp|comparator|complement|concat|cond|conj|cons|constantly|construct-proxy|contains\?|count|create-ns|create-struct|cycle|dec|declare|def|def-|definline|definterface|defmacro|defmethod|defmulti|defn|defn-|defonce|defproject|defprotocol|defrecord|defstruct|deftype|deref|difference|disj|dissoc|distinct|do|doall|doc|dorun|doseq|dosync|dotimes|doto|double|down|drop|drop-while|edit|end\?|ensure|eval|every\?|false\?|ffirst|file-seq|filter|find|find-doc|find-ns|find-var|first|float|flush|fn|fnseq|for|frest|gensym|get|get-proxy-class|hash-map|hash-set|identical\?|identity|if|if-let|if-not|import|in-ns|inc|index|insert-child|insert-left|insert-right|inspect-table|inspect-tree|instance\?|int|interleave|intersection|into|into-array|iterate|join|key|keys|keyword|keyword\?|last|lazy-cat|lazy-cons|left|lefts|let|line-seq|list|list\*|load|load-file|locking|long|loop|macroexpand|macroexpand-1|make-array|make-node|map|map-invert|map\?|mapcat|max|max-key|memfn|merge|merge-with|meta|min|min-key|monitor-enter|name|namespace|neg\?|new|newline|next|nil\?|node|not|not-any\?|not-every\?|not=|ns|ns-imports|ns-interns|ns-map|ns-name|ns-publics|ns-refers|ns-resolve|ns-unmap|nth|nthrest|or|parse|partial|path|peek|pop|pos\?|pr|pr-str|print|print-str|println|println-str|prn|prn-str|project|proxy|proxy-mappings|quot|quote|rand|rand-int|range|re-find|re-groups|re-matcher|re-matches|re-pattern|re-seq|read|read-line|recur|reduce|ref|ref-set|refer|rem|remove|remove-method|remove-ns|rename|rename-keys|repeat|replace|replicate|resolve|rest|resultset-seq|reverse|rfirst|right|rights|root|rrest|rseq|second|select|select-keys|send|send-off|seq|seq-zip|seq\?|set|set!|short|slurp|some|sort|sort-by|sorted-map|sorted-map-by|sorted-set|special-symbol\?|split-at|split-with|str|string\?|struct|struct-map|subs|subvec|symbol|symbol\?|sync|take|take-nth|take-while|test|throw|time|to-array|to-array-2d|tree-seq|true\?|try|union|up|update-proxy|val|vals|var|var-get|var-set|var\?|vector|vector-zip|vector\?|when|when-first|when-let|when-not|with-local-vars|with-meta|with-open|with-out-str|xml-seq|xml-zip|zero\?|zipmap|zipper)(?=[\s)]|$)/,lookbehind:!0},boolean:/\b(?:false|nil|true)\b/,number:{pattern:/(^|[^\w$@])(?:\d+(?:[/.]\d+)?(?:e[+-]?\d+)?|0x[a-f0-9]+|[1-9]\d?r[a-z0-9]+)[lmn]?(?![\w$@])/i,lookbehind:!0},function:{pattern:/((?:^|[^'])\()[\w*+!?'<>=/.-]+(?=[\s)]|$)/,lookbehind:!0},operator:/[#@^`~]/,punctuation:/[{}\[\](),]/}}return lv}var cv,QI;function Rbe(){if(QI)return cv;QI=1,cv=e,e.displayName="cmake",e.aliases=[];function e(t){t.languages.cmake={comment:/#.*/,string:{pattern:/"(?:[^\\"]|\\.)*"/,greedy:!0,inside:{interpolation:{pattern:/\$\{(?:[^{}$]|\$\{[^{}$]*\})*\}/,inside:{punctuation:/\$\{|\}/,variable:/\w+/}}}},variable:/\b(?:CMAKE_\w+|\w+_(?:(?:BINARY|SOURCE)_DIR|DESCRIPTION|HOMEPAGE_URL|ROOT|VERSION(?:_MAJOR|_MINOR|_PATCH|_TWEAK)?)|(?:ANDROID|APPLE|BORLAND|BUILD_SHARED_LIBS|CACHE|CPACK_(?:ABSOLUTE_DESTINATION_FILES|COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY|ERROR_ON_ABSOLUTE_INSTALL_DESTINATION|INCLUDE_TOPLEVEL_DIRECTORY|INSTALL_DEFAULT_DIRECTORY_PERMISSIONS|INSTALL_SCRIPT|PACKAGING_INSTALL_PREFIX|SET_DESTDIR|WARN_ON_ABSOLUTE_INSTALL_DESTINATION)|CTEST_(?:BINARY_DIRECTORY|BUILD_COMMAND|BUILD_NAME|BZR_COMMAND|BZR_UPDATE_OPTIONS|CHANGE_ID|CHECKOUT_COMMAND|CONFIGURATION_TYPE|CONFIGURE_COMMAND|COVERAGE_COMMAND|COVERAGE_EXTRA_FLAGS|CURL_OPTIONS|CUSTOM_(?:COVERAGE_EXCLUDE|ERROR_EXCEPTION|ERROR_MATCH|ERROR_POST_CONTEXT|ERROR_PRE_CONTEXT|MAXIMUM_FAILED_TEST_OUTPUT_SIZE|MAXIMUM_NUMBER_OF_(?:ERRORS|WARNINGS)|MAXIMUM_PASSED_TEST_OUTPUT_SIZE|MEMCHECK_IGNORE|POST_MEMCHECK|POST_TEST|PRE_MEMCHECK|PRE_TEST|TESTS_IGNORE|WARNING_EXCEPTION|WARNING_MATCH)|CVS_CHECKOUT|CVS_COMMAND|CVS_UPDATE_OPTIONS|DROP_LOCATION|DROP_METHOD|DROP_SITE|DROP_SITE_CDASH|DROP_SITE_PASSWORD|DROP_SITE_USER|EXTRA_COVERAGE_GLOB|GIT_COMMAND|GIT_INIT_SUBMODULES|GIT_UPDATE_CUSTOM|GIT_UPDATE_OPTIONS|HG_COMMAND|HG_UPDATE_OPTIONS|LABELS_FOR_SUBPROJECTS|MEMORYCHECK_(?:COMMAND|COMMAND_OPTIONS|SANITIZER_OPTIONS|SUPPRESSIONS_FILE|TYPE)|NIGHTLY_START_TIME|P4_CLIENT|P4_COMMAND|P4_OPTIONS|P4_UPDATE_OPTIONS|RUN_CURRENT_SCRIPT|SCP_COMMAND|SITE|SOURCE_DIRECTORY|SUBMIT_URL|SVN_COMMAND|SVN_OPTIONS|SVN_UPDATE_OPTIONS|TEST_LOAD|TEST_TIMEOUT|TRIGGER_SITE|UPDATE_COMMAND|UPDATE_OPTIONS|UPDATE_VERSION_ONLY|USE_LAUNCHERS)|CYGWIN|ENV|EXECUTABLE_OUTPUT_PATH|GHS-MULTI|IOS|LIBRARY_OUTPUT_PATH|MINGW|MSVC(?:10|11|12|14|60|70|71|80|90|_IDE|_TOOLSET_VERSION|_VERSION)?|MSYS|PROJECT_(?:BINARY_DIR|DESCRIPTION|HOMEPAGE_URL|NAME|SOURCE_DIR|VERSION|VERSION_(?:MAJOR|MINOR|PATCH|TWEAK))|UNIX|WIN32|WINCE|WINDOWS_PHONE|WINDOWS_STORE|XCODE|XCODE_VERSION))\b/,property:/\b(?:cxx_\w+|(?:ARCHIVE_OUTPUT_(?:DIRECTORY|NAME)|COMPILE_DEFINITIONS|COMPILE_PDB_NAME|COMPILE_PDB_OUTPUT_DIRECTORY|EXCLUDE_FROM_DEFAULT_BUILD|IMPORTED_(?:IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_LANGUAGES|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|NO_SONAME|OBJECTS|SONAME)|INTERPROCEDURAL_OPTIMIZATION|LIBRARY_OUTPUT_DIRECTORY|LIBRARY_OUTPUT_NAME|LINK_FLAGS|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|MAP_IMPORTED_CONFIG|OSX_ARCHITECTURES|OUTPUT_NAME|PDB_NAME|PDB_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_NAME|STATIC_LIBRARY_FLAGS|VS_CSHARP|VS_DOTNET_REFERENCEPROP|VS_DOTNET_REFERENCE|VS_GLOBAL_SECTION_POST|VS_GLOBAL_SECTION_PRE|VS_GLOBAL|XCODE_ATTRIBUTE)_\w+|\w+_(?:CLANG_TIDY|COMPILER_LAUNCHER|CPPCHECK|CPPLINT|INCLUDE_WHAT_YOU_USE|OUTPUT_NAME|POSTFIX|VISIBILITY_PRESET)|ABSTRACT|ADDITIONAL_MAKE_CLEAN_FILES|ADVANCED|ALIASED_TARGET|ALLOW_DUPLICATE_CUSTOM_TARGETS|ANDROID_(?:ANT_ADDITIONAL_OPTIONS|API|API_MIN|ARCH|ASSETS_DIRECTORIES|GUI|JAR_DEPENDENCIES|NATIVE_LIB_DEPENDENCIES|NATIVE_LIB_DIRECTORIES|PROCESS_MAX|PROGUARD|PROGUARD_CONFIG_PATH|SECURE_PROPS_PATH|SKIP_ANT_STEP|STL_TYPE)|ARCHIVE_OUTPUT_DIRECTORY|ATTACHED_FILES|ATTACHED_FILES_ON_FAIL|AUTOGEN_(?:BUILD_DIR|ORIGIN_DEPENDS|PARALLEL|SOURCE_GROUP|TARGETS_FOLDER|TARGET_DEPENDS)|AUTOMOC|AUTOMOC_(?:COMPILER_PREDEFINES|DEPEND_FILTERS|EXECUTABLE|MACRO_NAMES|MOC_OPTIONS|SOURCE_GROUP|TARGETS_FOLDER)|AUTORCC|AUTORCC_EXECUTABLE|AUTORCC_OPTIONS|AUTORCC_SOURCE_GROUP|AUTOUIC|AUTOUIC_EXECUTABLE|AUTOUIC_OPTIONS|AUTOUIC_SEARCH_PATHS|BINARY_DIR|BUILDSYSTEM_TARGETS|BUILD_RPATH|BUILD_RPATH_USE_ORIGIN|BUILD_WITH_INSTALL_NAME_DIR|BUILD_WITH_INSTALL_RPATH|BUNDLE|BUNDLE_EXTENSION|CACHE_VARIABLES|CLEAN_NO_CUSTOM|COMMON_LANGUAGE_RUNTIME|COMPATIBLE_INTERFACE_(?:BOOL|NUMBER_MAX|NUMBER_MIN|STRING)|COMPILE_(?:DEFINITIONS|FEATURES|FLAGS|OPTIONS|PDB_NAME|PDB_OUTPUT_DIRECTORY)|COST|CPACK_DESKTOP_SHORTCUTS|CPACK_NEVER_OVERWRITE|CPACK_PERMANENT|CPACK_STARTUP_SHORTCUTS|CPACK_START_MENU_SHORTCUTS|CPACK_WIX_ACL|CROSSCOMPILING_EMULATOR|CUDA_EXTENSIONS|CUDA_PTX_COMPILATION|CUDA_RESOLVE_DEVICE_SYMBOLS|CUDA_SEPARABLE_COMPILATION|CUDA_STANDARD|CUDA_STANDARD_REQUIRED|CXX_EXTENSIONS|CXX_STANDARD|CXX_STANDARD_REQUIRED|C_EXTENSIONS|C_STANDARD|C_STANDARD_REQUIRED|DEBUG_CONFIGURATIONS|DEFINE_SYMBOL|DEFINITIONS|DEPENDS|DEPLOYMENT_ADDITIONAL_FILES|DEPLOYMENT_REMOTE_DIRECTORY|DISABLED|DISABLED_FEATURES|ECLIPSE_EXTRA_CPROJECT_CONTENTS|ECLIPSE_EXTRA_NATURES|ENABLED_FEATURES|ENABLED_LANGUAGES|ENABLE_EXPORTS|ENVIRONMENT|EXCLUDE_FROM_ALL|EXCLUDE_FROM_DEFAULT_BUILD|EXPORT_NAME|EXPORT_PROPERTIES|EXTERNAL_OBJECT|EchoString|FAIL_REGULAR_EXPRESSION|FIND_LIBRARY_USE_LIB32_PATHS|FIND_LIBRARY_USE_LIB64_PATHS|FIND_LIBRARY_USE_LIBX32_PATHS|FIND_LIBRARY_USE_OPENBSD_VERSIONING|FIXTURES_CLEANUP|FIXTURES_REQUIRED|FIXTURES_SETUP|FOLDER|FRAMEWORK|Fortran_FORMAT|Fortran_MODULE_DIRECTORY|GENERATED|GENERATOR_FILE_NAME|GENERATOR_IS_MULTI_CONFIG|GHS_INTEGRITY_APP|GHS_NO_SOURCE_GROUP_FILE|GLOBAL_DEPENDS_DEBUG_MODE|GLOBAL_DEPENDS_NO_CYCLES|GNUtoMS|HAS_CXX|HEADER_FILE_ONLY|HELPSTRING|IMPLICIT_DEPENDS_INCLUDE_TRANSFORM|IMPORTED|IMPORTED_(?:COMMON_LANGUAGE_RUNTIME|CONFIGURATIONS|GLOBAL|IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_(?:LANGUAGES|LIBRARIES|MULTIPLICITY)|LOCATION|NO_SONAME|OBJECTS|SONAME)|IMPORT_PREFIX|IMPORT_SUFFIX|INCLUDE_DIRECTORIES|INCLUDE_REGULAR_EXPRESSION|INSTALL_NAME_DIR|INSTALL_RPATH|INSTALL_RPATH_USE_LINK_PATH|INTERFACE_(?:AUTOUIC_OPTIONS|COMPILE_DEFINITIONS|COMPILE_FEATURES|COMPILE_OPTIONS|INCLUDE_DIRECTORIES|LINK_DEPENDS|LINK_DIRECTORIES|LINK_LIBRARIES|LINK_OPTIONS|POSITION_INDEPENDENT_CODE|SOURCES|SYSTEM_INCLUDE_DIRECTORIES)|INTERPROCEDURAL_OPTIMIZATION|IN_TRY_COMPILE|IOS_INSTALL_COMBINED|JOB_POOLS|JOB_POOL_COMPILE|JOB_POOL_LINK|KEEP_EXTENSION|LABELS|LANGUAGE|LIBRARY_OUTPUT_DIRECTORY|LINKER_LANGUAGE|LINK_(?:DEPENDS|DEPENDS_NO_SHARED|DIRECTORIES|FLAGS|INTERFACE_LIBRARIES|INTERFACE_MULTIPLICITY|LIBRARIES|OPTIONS|SEARCH_END_STATIC|SEARCH_START_STATIC|WHAT_YOU_USE)|LISTFILE_STACK|LOCATION|MACOSX_BUNDLE|MACOSX_BUNDLE_INFO_PLIST|MACOSX_FRAMEWORK_INFO_PLIST|MACOSX_PACKAGE_LOCATION|MACOSX_RPATH|MACROS|MANUALLY_ADDED_DEPENDENCIES|MEASUREMENT|MODIFIED|NAME|NO_SONAME|NO_SYSTEM_FROM_IMPORTED|OBJECT_DEPENDS|OBJECT_OUTPUTS|OSX_ARCHITECTURES|OUTPUT_NAME|PACKAGES_FOUND|PACKAGES_NOT_FOUND|PARENT_DIRECTORY|PASS_REGULAR_EXPRESSION|PDB_NAME|PDB_OUTPUT_DIRECTORY|POSITION_INDEPENDENT_CODE|POST_INSTALL_SCRIPT|PREDEFINED_TARGETS_FOLDER|PREFIX|PRE_INSTALL_SCRIPT|PRIVATE_HEADER|PROCESSORS|PROCESSOR_AFFINITY|PROJECT_LABEL|PUBLIC_HEADER|REPORT_UNDEFINED_PROPERTIES|REQUIRED_FILES|RESOURCE|RESOURCE_LOCK|RULE_LAUNCH_COMPILE|RULE_LAUNCH_CUSTOM|RULE_LAUNCH_LINK|RULE_MESSAGES|RUNTIME_OUTPUT_DIRECTORY|RUN_SERIAL|SKIP_AUTOGEN|SKIP_AUTOMOC|SKIP_AUTORCC|SKIP_AUTOUIC|SKIP_BUILD_RPATH|SKIP_RETURN_CODE|SOURCES|SOURCE_DIR|SOVERSION|STATIC_LIBRARY_FLAGS|STATIC_LIBRARY_OPTIONS|STRINGS|SUBDIRECTORIES|SUFFIX|SYMBOLIC|TARGET_ARCHIVES_MAY_BE_SHARED_LIBS|TARGET_MESSAGES|TARGET_SUPPORTS_SHARED_LIBS|TESTS|TEST_INCLUDE_FILE|TEST_INCLUDE_FILES|TIMEOUT|TIMEOUT_AFTER_MATCH|TYPE|USE_FOLDERS|VALUE|VARIABLES|VERSION|VISIBILITY_INLINES_HIDDEN|VS_(?:CONFIGURATION_TYPE|COPY_TO_OUT_DIR|DEBUGGER_(?:COMMAND|COMMAND_ARGUMENTS|ENVIRONMENT|WORKING_DIRECTORY)|DEPLOYMENT_CONTENT|DEPLOYMENT_LOCATION|DOTNET_REFERENCES|DOTNET_REFERENCES_COPY_LOCAL|GLOBAL_KEYWORD|GLOBAL_PROJECT_TYPES|GLOBAL_ROOTNAMESPACE|INCLUDE_IN_VSIX|IOT_STARTUP_TASK|KEYWORD|RESOURCE_GENERATOR|SCC_AUXPATH|SCC_LOCALPATH|SCC_PROJECTNAME|SCC_PROVIDER|SDK_REFERENCES|SHADER_(?:DISABLE_OPTIMIZATIONS|ENABLE_DEBUG|ENTRYPOINT|FLAGS|MODEL|OBJECT_FILE_NAME|OUTPUT_HEADER_FILE|TYPE|VARIABLE_NAME)|STARTUP_PROJECT|TOOL_OVERRIDE|USER_PROPS|WINRT_COMPONENT|WINRT_EXTENSIONS|WINRT_REFERENCES|XAML_TYPE)|WILL_FAIL|WIN32_EXECUTABLE|WINDOWS_EXPORT_ALL_SYMBOLS|WORKING_DIRECTORY|WRAP_EXCLUDE|XCODE_(?:EMIT_EFFECTIVE_PLATFORM_NAME|EXPLICIT_FILE_TYPE|FILE_ATTRIBUTES|LAST_KNOWN_FILE_TYPE|PRODUCT_TYPE|SCHEME_(?:ADDRESS_SANITIZER|ADDRESS_SANITIZER_USE_AFTER_RETURN|ARGUMENTS|DISABLE_MAIN_THREAD_CHECKER|DYNAMIC_LIBRARY_LOADS|DYNAMIC_LINKER_API_USAGE|ENVIRONMENT|EXECUTABLE|GUARD_MALLOC|MAIN_THREAD_CHECKER_STOP|MALLOC_GUARD_EDGES|MALLOC_SCRIBBLE|MALLOC_STACK|THREAD_SANITIZER(?:_STOP)?|UNDEFINED_BEHAVIOUR_SANITIZER(?:_STOP)?|ZOMBIE_OBJECTS))|XCTEST)\b/,keyword:/\b(?:add_compile_definitions|add_compile_options|add_custom_command|add_custom_target|add_definitions|add_dependencies|add_executable|add_library|add_link_options|add_subdirectory|add_test|aux_source_directory|break|build_command|build_name|cmake_host_system_information|cmake_minimum_required|cmake_parse_arguments|cmake_policy|configure_file|continue|create_test_sourcelist|ctest_build|ctest_configure|ctest_coverage|ctest_empty_binary_directory|ctest_memcheck|ctest_read_custom_files|ctest_run_script|ctest_sleep|ctest_start|ctest_submit|ctest_test|ctest_update|ctest_upload|define_property|else|elseif|enable_language|enable_testing|endforeach|endfunction|endif|endmacro|endwhile|exec_program|execute_process|export|export_library_dependencies|file|find_file|find_library|find_package|find_path|find_program|fltk_wrap_ui|foreach|function|get_cmake_property|get_directory_property|get_filename_component|get_property|get_source_file_property|get_target_property|get_test_property|if|include|include_directories|include_external_msproject|include_guard|include_regular_expression|install|install_files|install_programs|install_targets|link_directories|link_libraries|list|load_cache|load_command|macro|make_directory|mark_as_advanced|math|message|option|output_required_files|project|qt_wrap_cpp|qt_wrap_ui|remove|remove_definitions|return|separate_arguments|set|set_directory_properties|set_property|set_source_files_properties|set_target_properties|set_tests_properties|site_name|source_group|string|subdir_depends|subdirs|target_compile_definitions|target_compile_features|target_compile_options|target_include_directories|target_link_directories|target_link_libraries|target_link_options|target_sources|try_compile|try_run|unset|use_mangled_mesa|utility_source|variable_requires|variable_watch|while|write_file)(?=\s*\()\b/,boolean:/\b(?:FALSE|OFF|ON|TRUE)\b/,namespace:/\b(?:INTERFACE|PRIVATE|PROPERTIES|PUBLIC|SHARED|STATIC|TARGET_OBJECTS)\b/,operator:/\b(?:AND|DEFINED|EQUAL|GREATER|LESS|MATCHES|NOT|OR|STREQUAL|STRGREATER|STRLESS|VERSION_EQUAL|VERSION_GREATER|VERSION_LESS)\b/,inserted:{pattern:/\b\w+::\w+\b/,alias:"class-name"},number:/\b\d+(?:\.\d+)*\b/,function:/\b[a-z_]\w*(?=\s*\()\b/i,punctuation:/[()>}]|\$[<{]/}}return cv}var uv,JI;function Nbe(){if(JI)return uv;JI=1,uv=e,e.displayName="cobol",e.aliases=[];function e(t){t.languages.cobol={comment:{pattern:/\*>.*|(^[ \t]*)\*.*/m,lookbehind:!0,greedy:!0},string:{pattern:/[xzgn]?(?:"(?:[^\r\n"]|"")*"(?!")|'(?:[^\r\n']|'')*'(?!'))/i,greedy:!0},level:{pattern:/(^[ \t]*)\d+\b/m,lookbehind:!0,greedy:!0,alias:"number"},"class-name":{pattern:/(\bpic(?:ture)?\s+)(?:(?:[-\w$/,:*+<>]|\.(?!\s|$))(?:\(\d+\))?)+/i,lookbehind:!0,inside:{number:{pattern:/(\()\d+/,lookbehind:!0},punctuation:/[()]/}},keyword:{pattern:/(^|[^\w-])(?:ABORT|ACCEPT|ACCESS|ADD|ADDRESS|ADVANCING|AFTER|ALIGNED|ALL|ALPHABET|ALPHABETIC|ALPHABETIC-LOWER|ALPHABETIC-UPPER|ALPHANUMERIC|ALPHANUMERIC-EDITED|ALSO|ALTER|ALTERNATE|ANY|ARE|AREA|AREAS|AS|ASCENDING|ASCII|ASSIGN|ASSOCIATED-DATA|ASSOCIATED-DATA-LENGTH|AT|ATTRIBUTE|AUTHOR|AUTO|AUTO-SKIP|BACKGROUND-COLOR|BACKGROUND-COLOUR|BASIS|BEEP|BEFORE|BEGINNING|BELL|BINARY|BIT|BLANK|BLINK|BLOCK|BOTTOM|BOUNDS|BY|BYFUNCTION|BYTITLE|CALL|CANCEL|CAPABLE|CCSVERSION|CD|CF|CH|CHAINING|CHANGED|CHANNEL|CHARACTER|CHARACTERS|CLASS|CLASS-ID|CLOCK-UNITS|CLOSE|CLOSE-DISPOSITION|COBOL|CODE|CODE-SET|COL|COLLATING|COLUMN|COM-REG|COMMA|COMMITMENT|COMMON|COMMUNICATION|COMP|COMP-1|COMP-2|COMP-3|COMP-4|COMP-5|COMPUTATIONAL|COMPUTATIONAL-1|COMPUTATIONAL-2|COMPUTATIONAL-3|COMPUTATIONAL-4|COMPUTATIONAL-5|COMPUTE|CONFIGURATION|CONTAINS|CONTENT|CONTINUE|CONTROL|CONTROL-POINT|CONTROLS|CONVENTION|CONVERTING|COPY|CORR|CORRESPONDING|COUNT|CRUNCH|CURRENCY|CURSOR|DATA|DATA-BASE|DATE|DATE-COMPILED|DATE-WRITTEN|DAY|DAY-OF-WEEK|DBCS|DE|DEBUG-CONTENTS|DEBUG-ITEM|DEBUG-LINE|DEBUG-NAME|DEBUG-SUB-1|DEBUG-SUB-2|DEBUG-SUB-3|DEBUGGING|DECIMAL-POINT|DECLARATIVES|DEFAULT|DEFAULT-DISPLAY|DEFINITION|DELETE|DELIMITED|DELIMITER|DEPENDING|DESCENDING|DESTINATION|DETAIL|DFHRESP|DFHVALUE|DISABLE|DISK|DISPLAY|DISPLAY-1|DIVIDE|DIVISION|DONTCARE|DOUBLE|DOWN|DUPLICATES|DYNAMIC|EBCDIC|EGCS|EGI|ELSE|EMI|EMPTY-CHECK|ENABLE|END|END-ACCEPT|END-ADD|END-CALL|END-COMPUTE|END-DELETE|END-DIVIDE|END-EVALUATE|END-IF|END-MULTIPLY|END-OF-PAGE|END-PERFORM|END-READ|END-RECEIVE|END-RETURN|END-REWRITE|END-SEARCH|END-START|END-STRING|END-SUBTRACT|END-UNSTRING|END-WRITE|ENDING|ENTER|ENTRY|ENTRY-PROCEDURE|ENVIRONMENT|EOL|EOP|EOS|ERASE|ERROR|ESCAPE|ESI|EVALUATE|EVENT|EVERY|EXCEPTION|EXCLUSIVE|EXHIBIT|EXIT|EXPORT|EXTEND|EXTENDED|EXTERNAL|FD|FILE|FILE-CONTROL|FILLER|FINAL|FIRST|FOOTING|FOR|FOREGROUND-COLOR|FOREGROUND-COLOUR|FROM|FULL|FUNCTION|FUNCTION-POINTER|FUNCTIONNAME|GENERATE|GIVING|GLOBAL|GO|GOBACK|GRID|GROUP|HEADING|HIGH-VALUE|HIGH-VALUES|HIGHLIGHT|I-O|I-O-CONTROL|ID|IDENTIFICATION|IF|IMPLICIT|IMPORT|IN|INDEX|INDEXED|INDICATE|INITIAL|INITIALIZE|INITIATE|INPUT|INPUT-OUTPUT|INSPECT|INSTALLATION|INTEGER|INTO|INVALID|INVOKE|IS|JUST|JUSTIFIED|KANJI|KEPT|KEY|KEYBOARD|LABEL|LANGUAGE|LAST|LB|LD|LEADING|LEFT|LEFTLINE|LENGTH|LENGTH-CHECK|LIBACCESS|LIBPARAMETER|LIBRARY|LIMIT|LIMITS|LINAGE|LINAGE-COUNTER|LINE|LINE-COUNTER|LINES|LINKAGE|LIST|LOCAL|LOCAL-STORAGE|LOCK|LONG-DATE|LONG-TIME|LOW-VALUE|LOW-VALUES|LOWER|LOWLIGHT|MEMORY|MERGE|MESSAGE|MMDDYYYY|MODE|MODULES|MORE-LABELS|MOVE|MULTIPLE|MULTIPLY|NAMED|NATIONAL|NATIONAL-EDITED|NATIVE|NEGATIVE|NETWORK|NEXT|NO|NO-ECHO|NULL|NULLS|NUMBER|NUMERIC|NUMERIC-DATE|NUMERIC-EDITED|NUMERIC-TIME|OBJECT-COMPUTER|OCCURS|ODT|OF|OFF|OMITTED|ON|OPEN|OPTIONAL|ORDER|ORDERLY|ORGANIZATION|OTHER|OUTPUT|OVERFLOW|OVERLINE|OWN|PACKED-DECIMAL|PADDING|PAGE|PAGE-COUNTER|PASSWORD|PERFORM|PF|PH|PIC|PICTURE|PLUS|POINTER|PORT|POSITION|POSITIVE|PRINTER|PRINTING|PRIVATE|PROCEDURE|PROCEDURE-POINTER|PROCEDURES|PROCEED|PROCESS|PROGRAM|PROGRAM-ID|PROGRAM-LIBRARY|PROMPT|PURGE|QUEUE|QUOTE|QUOTES|RANDOM|RD|READ|READER|REAL|RECEIVE|RECEIVED|RECORD|RECORDING|RECORDS|RECURSIVE|REDEFINES|REEL|REF|REFERENCE|REFERENCES|RELATIVE|RELEASE|REMAINDER|REMARKS|REMOTE|REMOVAL|REMOVE|RENAMES|REPLACE|REPLACING|REPORT|REPORTING|REPORTS|REQUIRED|RERUN|RESERVE|RESET|RETURN|RETURN-CODE|RETURNING|REVERSE-VIDEO|REVERSED|REWIND|REWRITE|RF|RH|RIGHT|ROUNDED|RUN|SAME|SAVE|SCREEN|SD|SEARCH|SECTION|SECURE|SECURITY|SEGMENT|SEGMENT-LIMIT|SELECT|SEND|SENTENCE|SEPARATE|SEQUENCE|SEQUENTIAL|SET|SHARED|SHAREDBYALL|SHAREDBYRUNUNIT|SHARING|SHIFT-IN|SHIFT-OUT|SHORT-DATE|SIGN|SIZE|SORT|SORT-CONTROL|SORT-CORE-SIZE|SORT-FILE-SIZE|SORT-MERGE|SORT-MESSAGE|SORT-MODE-SIZE|SORT-RETURN|SOURCE|SOURCE-COMPUTER|SPACE|SPACES|SPECIAL-NAMES|STANDARD|STANDARD-1|STANDARD-2|START|STATUS|STOP|STRING|SUB-QUEUE-1|SUB-QUEUE-2|SUB-QUEUE-3|SUBTRACT|SUM|SUPPRESS|SYMBOL|SYMBOLIC|SYNC|SYNCHRONIZED|TABLE|TALLY|TALLYING|TAPE|TASK|TERMINAL|TERMINATE|TEST|TEXT|THEN|THREAD|THREAD-LOCAL|THROUGH|THRU|TIME|TIMER|TIMES|TITLE|TO|TODAYS-DATE|TODAYS-NAME|TOP|TRAILING|TRUNCATED|TYPE|TYPEDEF|UNDERLINE|UNIT|UNSTRING|UNTIL|UP|UPON|USAGE|USE|USING|VALUE|VALUES|VARYING|VIRTUAL|WAIT|WHEN|WHEN-COMPILED|WITH|WORDS|WORKING-STORAGE|WRITE|YEAR|YYYYDDD|YYYYMMDD|ZERO-FILL|ZEROES|ZEROS)(?![\w-])/i,lookbehind:!0},boolean:{pattern:/(^|[^\w-])(?:false|true)(?![\w-])/i,lookbehind:!0},number:{pattern:/(^|[^\w-])(?:[+-]?(?:(?:\d+(?:[.,]\d+)?|[.,]\d+)(?:e[+-]?\d+)?|zero))(?![\w-])/i,lookbehind:!0},operator:[/<>|[<>]=?|[=+*/&]/,{pattern:/(^|[^\w-])(?:-|and|equal|greater|less|not|or|than)(?![\w-])/i,lookbehind:!0}],punctuation:/[.:,()]/}}return uv}var dv,eO;function Ibe(){if(eO)return dv;eO=1,dv=e,e.displayName="coffeescript",e.aliases=["coffee"];function e(t){(function(n){var r=/#(?!\{).+/,a={pattern:/#\{[^}]+\}/,alias:"variable"};n.languages.coffeescript=n.languages.extend("javascript",{comment:r,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:a}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),n.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:r,interpolation:a}}}),n.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:n.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:a}}]}),n.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete n.languages.coffeescript["template-string"],n.languages.coffee=n.languages.coffeescript})(t)}return dv}var fv,tO;function Obe(){if(tO)return fv;tO=1,fv=e,e.displayName="concurnas",e.aliases=["conc"];function e(t){t.languages.concurnas={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\/\/.*)/,lookbehind:!0,greedy:!0},langext:{pattern:/\b\w+\s*\|\|[\s\S]+?\|\|/,greedy:!0,inside:{"class-name":/^\w+/,string:{pattern:/(^\s*\|\|)[\s\S]+(?=\|\|$)/,lookbehind:!0},punctuation:/\|\|/}},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/,lookbehind:!0},keyword:/\b(?:abstract|actor|also|annotation|assert|async|await|bool|boolean|break|byte|case|catch|changed|char|class|closed|constant|continue|def|default|del|double|elif|else|enum|every|extends|false|finally|float|for|from|global|gpudef|gpukernel|if|import|in|init|inject|int|lambda|local|long|loop|match|new|nodefault|null|of|onchange|open|out|override|package|parfor|parforsync|post|pre|private|protected|provide|provider|public|return|shared|short|single|size_t|sizeof|super|sync|this|throw|trait|trans|transient|true|try|typedef|unchecked|using|val|var|void|while|with)\b/,boolean:/\b(?:false|true)\b/,number:/\b0b[01][01_]*L?\b|\b0x(?:[\da-f_]*\.)?[\da-f_p+-]+\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfls]?/i,punctuation:/[{}[\];(),.:]/,operator:/<==|>==|=>|->|<-|<>|&==|&<>|\?:?|\.\?|\+\+|--|[-+*/=<>]=?|[!^~]|\b(?:and|as|band|bor|bxor|comp|is|isnot|mod|or)\b=?/,annotation:{pattern:/@(?:\w+:)?(?:\w+|\[[^\]]+\])?/,alias:"builtin"}},t.languages.insertBefore("concurnas","langext",{"regex-literal":{pattern:/\br("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:t.languages.concurnas},regex:/[\s\S]+/}},"string-literal":{pattern:/(?:\B|\bs)("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:t.languages.concurnas},string:/[\s\S]+/}}}),t.languages.conc=t.languages.concurnas}return fv}var pv,nO;function Dbe(){if(nO)return pv;nO=1,pv=e,e.displayName="coq",e.aliases=[];function e(t){(function(n){for(var r=/\(\*(?:[^(*]|\((?!\*)|\*(?!\))|)*\*\)/.source,a=0;a<2;a++)r=r.replace(//g,function(){return r});r=r.replace(//g,"[]"),n.languages.coq={comment:RegExp(r),string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},attribute:[{pattern:RegExp(/#\[(?:[^\[\]("]|"(?:[^"]|"")*"(?!")|\((?!\*)|)*\]/.source.replace(//g,function(){return r})),greedy:!0,alias:"attr-name",inside:{comment:RegExp(r),string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},operator:/=/,punctuation:/^#\[|\]$|[,()]/}},{pattern:/\b(?:Cumulative|Global|Local|Monomorphic|NonCumulative|Polymorphic|Private|Program)\b/,alias:"attr-name"}],keyword:/\b(?:Abort|About|Add|Admit|Admitted|All|Arguments|As|Assumptions|Axiom|Axioms|Back|BackTo|Backtrace|BinOp|BinOpSpec|BinRel|Bind|Blacklist|Canonical|Case|Cd|Check|Class|Classes|Close|CoFixpoint|CoInductive|Coercion|Coercions|Collection|Combined|Compute|Conjecture|Conjectures|Constant|Constants|Constraint|Constructors|Context|Corollary|Create|CstOp|Custom|Cut|Debug|Declare|Defined|Definition|Delimit|Dependencies|Dependent|Derive|Diffs|Drop|Elimination|End|Entry|Equality|Eval|Example|Existential|Existentials|Existing|Export|Extern|Extraction|Fact|Fail|Field|File|Firstorder|Fixpoint|Flags|Focus|From|Funclass|Function|Functional|GC|Generalizable|Goal|Grab|Grammar|Graph|Guarded|Haskell|Heap|Hide|Hint|HintDb|Hints|Hypotheses|Hypothesis|IF|Identity|Immediate|Implicit|Implicits|Import|Include|Induction|Inductive|Infix|Info|Initial|InjTyp|Inline|Inspect|Instance|Instances|Intro|Intros|Inversion|Inversion_clear|JSON|Language|Left|Lemma|Let|Lia|Libraries|Library|Load|LoadPath|Locate|Ltac|Ltac2|ML|Match|Method|Minimality|Module|Modules|Morphism|Next|NoInline|Notation|Number|OCaml|Obligation|Obligations|Opaque|Open|Optimize|Parameter|Parameters|Parametric|Path|Paths|Prenex|Preterm|Primitive|Print|Profile|Projections|Proof|Prop|PropBinOp|PropOp|PropUOp|Property|Proposition|Pwd|Qed|Quit|Rec|Record|Recursive|Redirect|Reduction|Register|Relation|Remark|Remove|Require|Reserved|Reset|Resolve|Restart|Rewrite|Right|Ring|Rings|SProp|Saturate|Save|Scheme|Scope|Scopes|Search|SearchHead|SearchPattern|SearchRewrite|Section|Separate|Set|Setoid|Show|Signatures|Solve|Solver|Sort|Sortclass|Sorted|Spec|Step|Strategies|Strategy|String|Structure|SubClass|Subgraph|SuchThat|Tactic|Term|TestCompile|Theorem|Time|Timeout|To|Transparent|Type|Typeclasses|Types|Typing|UnOp|UnOpSpec|Undelimit|Undo|Unfocus|Unfocused|Unfold|Universe|Universes|Unshelve|Variable|Variables|Variant|Verbose|View|Visibility|Zify|_|apply|as|at|by|cofix|else|end|exists|exists2|fix|for|forall|fun|if|in|let|match|measure|move|removed|return|struct|then|using|wf|where|with)\b/,number:/\b(?:0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]+)?(?:p[+-]?\d[\d_]*)?|\d[\d_]*(?:\.[\d_]+)?(?:e[+-]?\d[\d_]*)?)\b/i,punct:{pattern:/@\{|\{\||\[=|:>/,alias:"punctuation"},operator:/\/\\|\\\/|\.{2,3}|:{1,2}=|\*\*|[-=]>|<(?:->?|[+:=>]|<:)|>(?:=|->)|\|[-|]?|[-!%&*+/<=>?@^~']/,punctuation:/\.\(|`\(|@\{|`\{|\{\||\[=|:>|[:.,;(){}\[\]]/}})(t)}return pv}var gv,rO;function Ah(){if(rO)return gv;rO=1,gv=e,e.displayName="ruby",e.aliases=["rb"];function e(t){(function(n){n.languages.ruby=n.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===||[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),n.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var r={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:n.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete n.languages.ruby.function;var a="(?:"+[/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source].join("|")+")",o=/(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;n.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp(/%r/.source+a+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:r,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:r,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp(/(^|[^:]):/.source+o),lookbehind:!0,greedy:!0},{pattern:RegExp(/([\r\n{(,][ \t]*)/.source+o+/(?=:(?!:))/.source),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),n.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp(/%[qQiIwWs]?/.source+a),greedy:!0,inside:{interpolation:r,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:r,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:r,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp(/%x/.source+a),greedy:!0,inside:{interpolation:r,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:r,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete n.languages.ruby.string,n.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),n.languages.rb=n.languages.ruby})(t)}return gv}var mv,aO;function Lbe(){if(aO)return mv;aO=1;var e=Ah();mv=t,t.displayName="crystal",t.aliases=[];function t(n){n.register(e),function(r){r.languages.crystal=r.languages.extend("ruby",{keyword:[/\b(?:__DIR__|__END_LINE__|__FILE__|__LINE__|abstract|alias|annotation|as|asm|begin|break|case|class|def|do|else|elsif|end|ensure|enum|extend|for|fun|if|ifdef|include|instance_sizeof|lib|macro|module|next|of|out|pointerof|private|protected|ptr|require|rescue|return|select|self|sizeof|struct|super|then|type|typeof|undef|uninitialized|union|unless|until|when|while|with|yield)\b/,{pattern:/(\.\s*)(?:is_a|responds_to)\?/,lookbehind:!0}],number:/\b(?:0b[01_]*[01]|0o[0-7_]*[0-7]|0x[\da-fA-F_]*[\da-fA-F]|(?:\d(?:[\d_]*\d)?)(?:\.[\d_]*\d)?(?:[eE][+-]?[\d_]*\d)?)(?:_(?:[uif](?:8|16|32|64))?)?\b/,operator:[/->/,r.languages.ruby.operator],punctuation:/[(){}[\].,;\\]/}),r.languages.insertBefore("crystal","string-literal",{attribute:{pattern:/@\[.*?\]/,inside:{delimiter:{pattern:/^@\[|\]$/,alias:"punctuation"},attribute:{pattern:/^(\s*)\w+/,lookbehind:!0,alias:"class-name"},args:{pattern:/\S(?:[\s\S]*\S)?/,inside:r.languages.crystal}}},expansion:{pattern:/\{(?:\{.*?\}|%.*?%)\}/,inside:{content:{pattern:/^(\{.)[\s\S]+(?=.\}$)/,lookbehind:!0,inside:r.languages.crystal},delimiter:{pattern:/^\{[\{%]|[\}%]\}$/,alias:"operator"}}},char:{pattern:/'(?:[^\\\r\n]{1,2}|\\(?:.|u(?:[A-Fa-f0-9]{1,4}|\{[A-Fa-f0-9]{1,6}\})))'/,greedy:!0}})}(n)}return mv}var hv,oO;function Mbe(){if(oO)return hv;oO=1;var e=_h();hv=t,t.displayName="cshtml",t.aliases=["razor"];function t(n){n.register(e),function(r){var a=/\/(?![/*])|\/\/.*[\r\n]|\/\*[^*]*(?:\*(?!\/)[^*]*)*\*\//.source,o=/@(?!")|"(?:[^\r\n\\"]|\\.)*"|@"(?:[^\\"]|""|\\[\s\S])*"(?!")/.source+"|"+/'(?:(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'|(?=[^\\](?!')))/.source;function i(w,v){for(var h=0;h/g,function(){return"(?:"+w+")"});return w.replace(//g,"[^\\s\\S]").replace(//g,"(?:"+o+")").replace(//g,"(?:"+a+")")}var s=i(/\((?:[^()'"@/]|||)*\)/.source,2),l=i(/\[(?:[^\[\]'"@/]|||)*\]/.source,2),c=i(/\{(?:[^{}'"@/]|||)*\}/.source,2),u=i(/<(?:[^<>'"@/]|||)*>/.source,2),d=/(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?/.source,g=/(?!\d)[^\s>\/=$<%]+/.source+d+/\s*\/?>/.source,m=/\B@?/.source+"(?:"+/<([a-zA-Z][\w:]*)/.source+d+/\s*>/.source+"(?:"+(/[^<]/.source+"|"+/<\/?(?!\1\b)/.source+g+"|"+i(/<\1/.source+d+/\s*>/.source+"(?:"+(/[^<]/.source+"|"+/<\/?(?!\1\b)/.source+g+"|")+")*"+/<\/\1\s*>/.source,2))+")*"+/<\/\1\s*>/.source+"|"+/|\+|~|\|\|/,punctuation:/[(),]/}},n.languages.css.atrule.inside["selector-function-argument"].inside=a,n.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var o={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},i={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};n.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:o,number:i,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:o,number:i})})(t)}return yv}var vv,lO;function Fbe(){if(lO)return vv;lO=1,vv=e,e.displayName="csv",e.aliases=[];function e(t){t.languages.csv={value:/[^\r\n,"]+|"(?:[^"]|"")*"(?!")/,punctuation:/,/}}return vv}var Sv,cO;function jbe(){if(cO)return Sv;cO=1,Sv=e,e.displayName="cypher",e.aliases=[];function e(t){t.languages.cypher={comment:/\/\/.*/,string:{pattern:/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/,greedy:!0},"class-name":{pattern:/(:\s*)(?:\w+|`(?:[^`\\\r\n])*`)(?=\s*[{):])/,lookbehind:!0,greedy:!0},relationship:{pattern:/(-\[\s*(?:\w+\s*|`(?:[^`\\\r\n])*`\s*)?:\s*|\|\s*:\s*)(?:\w+|`(?:[^`\\\r\n])*`)/,lookbehind:!0,greedy:!0,alias:"property"},identifier:{pattern:/`(?:[^`\\\r\n])*`/,greedy:!0},variable:/\$\w+/,keyword:/\b(?:ADD|ALL|AND|AS|ASC|ASCENDING|ASSERT|BY|CALL|CASE|COMMIT|CONSTRAINT|CONTAINS|CREATE|CSV|DELETE|DESC|DESCENDING|DETACH|DISTINCT|DO|DROP|ELSE|END|ENDS|EXISTS|FOR|FOREACH|IN|INDEX|IS|JOIN|KEY|LIMIT|LOAD|MANDATORY|MATCH|MERGE|NODE|NOT|OF|ON|OPTIONAL|OR|ORDER(?=\s+BY)|PERIODIC|REMOVE|REQUIRE|RETURN|SCALAR|SCAN|SET|SKIP|START|STARTS|THEN|UNION|UNIQUE|UNWIND|USING|WHEN|WHERE|WITH|XOR|YIELD)\b/i,function:/\b\w+\b(?=\s*\()/,boolean:/\b(?:false|null|true)\b/i,number:/\b(?:0x[\da-fA-F]+|\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)\b/,operator:/:|<--?|--?>?|<>|=~?|[<>]=?|[+*/%^|]|\.\.\.?/,punctuation:/[()[\]{},;.]/}}return Sv}var wv,uO;function zbe(){if(uO)return wv;uO=1,wv=e,e.displayName="d",e.aliases=[];function e(t){t.languages.d=t.languages.extend("clike",{comment:[{pattern:/^\s*#!.+/,greedy:!0},{pattern:RegExp(/(^|[^\\])/.source+"(?:"+[/\/\+(?:\/\+(?:[^+]|\+(?!\/))*\+\/|(?!\/\+)[\s\S])*?\+\//.source,/\/\/.*/.source,/\/\*[\s\S]*?\*\//.source].join("|")+")"),lookbehind:!0,greedy:!0}],string:[{pattern:RegExp([/\b[rx]"(?:\\[\s\S]|[^\\"])*"[cwd]?/.source,/\bq"(?:\[[\s\S]*?\]|\([\s\S]*?\)|<[\s\S]*?>|\{[\s\S]*?\})"/.source,/\bq"((?!\d)\w+)$[\s\S]*?^\1"/.source,/\bq"(.)[\s\S]*?\2"/.source,/(["`])(?:\\[\s\S]|(?!\3)[^\\])*\3[cwd]?/.source].join("|"),"m"),greedy:!0},{pattern:/\bq\{(?:\{[^{}]*\}|[^{}])*\}/,greedy:!0,alias:"token-string"}],keyword:/\$|\b(?:__(?:(?:DATE|EOF|FILE|FUNCTION|LINE|MODULE|PRETTY_FUNCTION|TIMESTAMP|TIME|VENDOR|VERSION)__|gshared|parameters|traits|vector)|abstract|alias|align|asm|assert|auto|body|bool|break|byte|case|cast|catch|cdouble|cent|cfloat|char|class|const|continue|creal|dchar|debug|default|delegate|delete|deprecated|do|double|dstring|else|enum|export|extern|false|final|finally|float|for|foreach|foreach_reverse|function|goto|idouble|if|ifloat|immutable|import|inout|int|interface|invariant|ireal|lazy|long|macro|mixin|module|new|nothrow|null|out|override|package|pragma|private|protected|ptrdiff_t|public|pure|real|ref|return|scope|shared|short|size_t|static|string|struct|super|switch|synchronized|template|this|throw|true|try|typedef|typeid|typeof|ubyte|ucent|uint|ulong|union|unittest|ushort|version|void|volatile|wchar|while|with|wstring)\b/,number:[/\b0x\.?[a-f\d_]+(?:(?!\.\.)\.[a-f\d_]*)?(?:p[+-]?[a-f\d_]+)?[ulfi]{0,4}/i,{pattern:/((?:\.\.)?)(?:\b0b\.?|\b|\.)\d[\d_]*(?:(?!\.\.)\.[\d_]*)?(?:e[+-]?\d[\d_]*)?[ulfi]{0,4}/i,lookbehind:!0}],operator:/\|[|=]?|&[&=]?|\+[+=]?|-[-=]?|\.?\.\.|=[>=]?|!(?:i[ns]\b|<>?=?|>=?|=)?|\bi[ns]\b|(?:<[<>]?|>>?>?|\^\^|[*\/%^~])=?/}),t.languages.insertBefore("d","string",{char:/'(?:\\(?:\W|\w+)|[^\\])'/}),t.languages.insertBefore("d","keyword",{property:/\B@\w*/}),t.languages.insertBefore("d","function",{register:{pattern:/\b(?:[ABCD][LHX]|E?(?:BP|DI|SI|SP)|[BS]PL|[ECSDGF]S|CR[0234]|[DS]IL|DR[012367]|E[ABCD]X|X?MM[0-7]|R(?:1[0-5]|[89])[BWD]?|R[ABCD]X|R[BS]P|R[DS]I|TR[3-7]|XMM(?:1[0-5]|[89])|YMM(?:1[0-5]|\d))\b|\bST(?:\([0-7]\)|\b)/,alias:"variable"}})}return wv}var Ev,dO;function Ube(){if(dO)return Ev;dO=1,Ev=e,e.displayName="dart",e.aliases=[];function e(t){(function(n){var r=[/\b(?:async|sync|yield)\*/,/\b(?:abstract|assert|async|await|break|case|catch|class|const|continue|covariant|default|deferred|do|dynamic|else|enum|export|extends|extension|external|factory|final|finally|for|get|hide|if|implements|import|in|interface|library|mixin|new|null|on|operator|part|rethrow|return|set|show|static|super|switch|sync|this|throw|try|typedef|var|void|while|with|yield)\b/],a=/(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,o={pattern:RegExp(a+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}}}};n.languages.dart=n.languages.extend("clike",{"class-name":[o,{pattern:RegExp(a+/[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source),lookbehind:!0,inside:o.inside}],keyword:r,operator:/\bis!|\b(?:as|is)\b|\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?/}),n.languages.insertBefore("dart","string",{"string-literal":{pattern:/r?(?:("""|''')[\s\S]*?\1|(["'])(?:\\.|(?!\2)[^\\\r\n])*\2(?!\2))/,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,lookbehind:!0,inside:{punctuation:/^\$\{?|\}$/,expression:{pattern:/[\s\S]+/,inside:n.languages.dart}}},string:/[\s\S]+/}},string:void 0}),n.languages.insertBefore("dart","class-name",{metadata:{pattern:/@\w+/,alias:"function"}}),n.languages.insertBefore("dart","class-name",{generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":o,keyword:r,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})})(t)}return Ev}var xv,fO;function Bbe(){if(fO)return xv;fO=1,xv=e,e.displayName="dataweave",e.aliases=[];function e(t){(function(n){n.languages.dataweave={url:/\b[A-Za-z]+:\/\/[\w/:.?=&-]+|\burn:[\w:.?=&-]+/,property:{pattern:/(?:\b\w+#)?(?:"(?:\\.|[^\\"\r\n])*"|\b\w+)(?=\s*[:@])/,greedy:!0},string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},"mime-type":/\b(?:application|audio|image|multipart|text|video)\/[\w+-]+/,date:{pattern:/\|[\w:+-]+\|/,greedy:!0},comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],regex:{pattern:/\/(?:[^\\\/\r\n]|\\[^\r\n])+\//,greedy:!0},keyword:/\b(?:and|as|at|case|do|else|fun|if|input|is|match|not|ns|null|or|output|type|unless|update|using|var)\b/,function:/\b[A-Z_]\w*(?=\s*\()/i,number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\];(),.:@]/,operator:/<<|>>|->|[<>~=]=?|!=|--?-?|\+\+?|!|\?/,boolean:/\b(?:false|true)\b/}})(t)}return xv}var kv,pO;function Hbe(){if(pO)return kv;pO=1,kv=e,e.displayName="dax",e.aliases=[];function e(t){t.languages.dax={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/).*)/,lookbehind:!0},"data-field":{pattern:/'(?:[^']|'')*'(?!')(?:\[[ \w\xA0-\uFFFF]+\])?|\w+\[[ \w\xA0-\uFFFF]+\]/,alias:"symbol"},measure:{pattern:/\[[ \w\xA0-\uFFFF]+\]/,alias:"constant"},string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},function:/\b(?:ABS|ACOS|ACOSH|ACOT|ACOTH|ADDCOLUMNS|ADDMISSINGITEMS|ALL|ALLCROSSFILTERED|ALLEXCEPT|ALLNOBLANKROW|ALLSELECTED|AND|APPROXIMATEDISTINCTCOUNT|ASIN|ASINH|ATAN|ATANH|AVERAGE|AVERAGEA|AVERAGEX|BETA\.DIST|BETA\.INV|BLANK|CALCULATE|CALCULATETABLE|CALENDAR|CALENDARAUTO|CEILING|CHISQ\.DIST|CHISQ\.DIST\.RT|CHISQ\.INV|CHISQ\.INV\.RT|CLOSINGBALANCEMONTH|CLOSINGBALANCEQUARTER|CLOSINGBALANCEYEAR|COALESCE|COMBIN|COMBINA|COMBINEVALUES|CONCATENATE|CONCATENATEX|CONFIDENCE\.NORM|CONFIDENCE\.T|CONTAINS|CONTAINSROW|CONTAINSSTRING|CONTAINSSTRINGEXACT|CONVERT|COS|COSH|COT|COTH|COUNT|COUNTA|COUNTAX|COUNTBLANK|COUNTROWS|COUNTX|CROSSFILTER|CROSSJOIN|CURRENCY|CURRENTGROUP|CUSTOMDATA|DATATABLE|DATE|DATEADD|DATEDIFF|DATESBETWEEN|DATESINPERIOD|DATESMTD|DATESQTD|DATESYTD|DATEVALUE|DAY|DEGREES|DETAILROWS|DISTINCT|DISTINCTCOUNT|DISTINCTCOUNTNOBLANK|DIVIDE|EARLIER|EARLIEST|EDATE|ENDOFMONTH|ENDOFQUARTER|ENDOFYEAR|EOMONTH|ERROR|EVEN|EXACT|EXCEPT|EXP|EXPON\.DIST|FACT|FALSE|FILTER|FILTERS|FIND|FIRSTDATE|FIRSTNONBLANK|FIRSTNONBLANKVALUE|FIXED|FLOOR|FORMAT|GCD|GENERATE|GENERATEALL|GENERATESERIES|GEOMEAN|GEOMEANX|GROUPBY|HASONEFILTER|HASONEVALUE|HOUR|IF|IF\.EAGER|IFERROR|IGNORE|INT|INTERSECT|ISBLANK|ISCROSSFILTERED|ISEMPTY|ISERROR|ISEVEN|ISFILTERED|ISINSCOPE|ISLOGICAL|ISNONTEXT|ISNUMBER|ISO\.CEILING|ISODD|ISONORAFTER|ISSELECTEDMEASURE|ISSUBTOTAL|ISTEXT|KEEPFILTERS|KEYWORDMATCH|LASTDATE|LASTNONBLANK|LASTNONBLANKVALUE|LCM|LEFT|LEN|LN|LOG|LOG10|LOOKUPVALUE|LOWER|MAX|MAXA|MAXX|MEDIAN|MEDIANX|MID|MIN|MINA|MINUTE|MINX|MOD|MONTH|MROUND|NATURALINNERJOIN|NATURALLEFTOUTERJOIN|NEXTDAY|NEXTMONTH|NEXTQUARTER|NEXTYEAR|NONVISUAL|NORM\.DIST|NORM\.INV|NORM\.S\.DIST|NORM\.S\.INV|NOT|NOW|ODD|OPENINGBALANCEMONTH|OPENINGBALANCEQUARTER|OPENINGBALANCEYEAR|OR|PARALLELPERIOD|PATH|PATHCONTAINS|PATHITEM|PATHITEMREVERSE|PATHLENGTH|PERCENTILE\.EXC|PERCENTILE\.INC|PERCENTILEX\.EXC|PERCENTILEX\.INC|PERMUT|PI|POISSON\.DIST|POWER|PREVIOUSDAY|PREVIOUSMONTH|PREVIOUSQUARTER|PREVIOUSYEAR|PRODUCT|PRODUCTX|QUARTER|QUOTIENT|RADIANS|RAND|RANDBETWEEN|RANK\.EQ|RANKX|RELATED|RELATEDTABLE|REMOVEFILTERS|REPLACE|REPT|RIGHT|ROLLUP|ROLLUPADDISSUBTOTAL|ROLLUPGROUP|ROLLUPISSUBTOTAL|ROUND|ROUNDDOWN|ROUNDUP|ROW|SAMEPERIODLASTYEAR|SAMPLE|SEARCH|SECOND|SELECTCOLUMNS|SELECTEDMEASURE|SELECTEDMEASUREFORMATSTRING|SELECTEDMEASURENAME|SELECTEDVALUE|SIGN|SIN|SINH|SQRT|SQRTPI|STARTOFMONTH|STARTOFQUARTER|STARTOFYEAR|STDEV\.P|STDEV\.S|STDEVX\.P|STDEVX\.S|SUBSTITUTE|SUBSTITUTEWITHINDEX|SUM|SUMMARIZE|SUMMARIZECOLUMNS|SUMX|SWITCH|T\.DIST|T\.DIST\.2T|T\.DIST\.RT|T\.INV|T\.INV\.2T|TAN|TANH|TIME|TIMEVALUE|TODAY|TOPN|TOPNPERLEVEL|TOPNSKIP|TOTALMTD|TOTALQTD|TOTALYTD|TREATAS|TRIM|TRUE|TRUNC|UNICHAR|UNICODE|UNION|UPPER|USERELATIONSHIP|USERNAME|USEROBJECTID|USERPRINCIPALNAME|UTCNOW|UTCTODAY|VALUE|VALUES|VAR\.P|VAR\.S|VARX\.P|VARX\.S|WEEKDAY|WEEKNUM|XIRR|XNPV|YEAR|YEARFRAC)(?=\s*\()/i,keyword:/\b(?:DEFINE|EVALUATE|MEASURE|ORDER\s+BY|RETURN|VAR|START\s+AT|ASC|DESC)\b/i,boolean:{pattern:/\b(?:FALSE|NULL|TRUE)\b/i,alias:"constant"},number:/\b\d+(?:\.\d*)?|\B\.\d+\b/,operator:/:=|[-+*\/=^]|&&?|\|\||<(?:=>?|<|>)?|>[>=]?|\b(?:IN|NOT)\b/i,punctuation:/[;\[\](){}`,.]/}}return kv}var Cv,gO;function Vbe(){if(gO)return Cv;gO=1,Cv=e,e.displayName="dhall",e.aliases=[];function e(t){t.languages.dhall={comment:/--.*|\{-(?:[^-{]|-(?!\})|\{(?!-)|\{-(?:[^-{]|-(?!\})|\{(?!-))*-\})*-\}/,string:{pattern:/"(?:[^"\\]|\\.)*"|''(?:[^']|'(?!')|'''|''\$\{)*''(?!'|\$)/,greedy:!0,inside:{interpolation:{pattern:/\$\{[^{}]*\}/,inside:{expression:{pattern:/(^\$\{)[\s\S]+(?=\}$)/,lookbehind:!0,alias:"language-dhall",inside:null},punctuation:/\$\{|\}/}}}},label:{pattern:/`[^`]*`/,greedy:!0},url:{pattern:/\bhttps?:\/\/[\w.:%!$&'*+;=@~-]+(?:\/[\w.:%!$&'*+;=@~-]*)*(?:\?[/?\w.:%!$&'*+;=@~-]*)?/,greedy:!0},env:{pattern:/\benv:(?:(?!\d)\w+|"(?:[^"\\=]|\\.)*")/,greedy:!0,inside:{function:/^env/,operator:/^:/,variable:/[\s\S]+/}},hash:{pattern:/\bsha256:[\da-fA-F]{64}\b/,inside:{function:/sha256/,operator:/:/,number:/[\da-fA-F]{64}/}},keyword:/\b(?:as|assert|else|forall|if|in|let|merge|missing|then|toMap|using|with)\b|\u2200/,builtin:/\b(?:None|Some)\b/,boolean:/\b(?:False|True)\b/,number:/\bNaN\b|-?\bInfinity\b|[+-]?\b(?:0x[\da-fA-F]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/,operator:/\/\\|\/\/\\\\|&&|\|\||===|[!=]=|\/\/|->|\+\+|::|[+*#@=:?<>|\\\u2227\u2a53\u2261\u2afd\u03bb\u2192]/,punctuation:/\.\.|[{}\[\](),./]/,"class-name":/\b[A-Z]\w*\b/},t.languages.dhall.string.inside.interpolation.inside.expression.inside=t.languages.dhall}return Cv}var _v,mO;function qbe(){if(mO)return _v;mO=1,_v=e,e.displayName="diff",e.aliases=[];function e(t){(function(n){n.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var r={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(r).forEach(function(a){var o=r[a],i=[];/^\w+$/.test(a)||i.push(/\w+/.exec(a)[0]),a==="diff"&&i.push("bold"),n.languages.diff[a]={pattern:RegExp("^(?:["+o+`].*(?:\r + */var n=function(r){var a=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,o=0,i={},s={manual:r.Prism&&r.Prism.manual,disableWorkerMessageHandler:r.Prism&&r.Prism.disableWorkerMessageHandler,util:{encode:function h(S){return S instanceof l?new l(S.type,h(S.content),S.alias):Array.isArray(S)?S.map(h):S.replace(/&/g,"&").replace(/"u")return null;if("currentScript"in document&&1<2)return document.currentScript;try{throw new Error}catch(k){var h=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(k.stack)||[])[1];if(h){var S=document.getElementsByTagName("script");for(var E in S)if(S[E].src==h)return S[E]}return null}},isActive:function(h,S,E){for(var k="no-"+S;h;){var x=h.classList;if(x.contains(S))return!0;if(x.contains(k))return!1;h=h.parentElement}return!!E}},languages:{plain:i,plaintext:i,text:i,txt:i,extend:function(h,S){var E=s.util.clone(s.languages[h]);for(var k in S)E[k]=S[k];return E},insertBefore:function(h,S,E,k){k=k||s.languages;var x=k[h],C={};for(var _ in x)if(x.hasOwnProperty(_)){if(_==S)for(var R in E)E.hasOwnProperty(R)&&(C[R]=E[R]);E.hasOwnProperty(_)||(C[_]=x[_])}var T=k[h];return k[h]=C,s.languages.DFS(s.languages,function(L,D){D===T&&L!=h&&(this[L]=C)}),C},DFS:function h(S,E,k,x){x=x||{};var C=s.util.objId;for(var _ in S)if(S.hasOwnProperty(_)){E.call(S,_,S[_],k||_);var R=S[_],T=s.util.type(R);T==="Object"&&!x[C(R)]?(x[C(R)]=!0,h(R,E,null,x)):T==="Array"&&!x[C(R)]&&(x[C(R)]=!0,h(R,E,_,x))}}},plugins:{},highlightAll:function(h,S){s.highlightAllUnder(document,h,S)},highlightAllUnder:function(h,S,E){var k={callback:E,container:h,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};s.hooks.run("before-highlightall",k),k.elements=Array.prototype.slice.apply(k.container.querySelectorAll(k.selector)),s.hooks.run("before-all-elements-highlight",k);for(var x=0,C;C=k.elements[x++];)s.highlightElement(C,S===!0,k.callback)},highlightElement:function(h,S,E){var k=s.util.getLanguage(h),x=s.languages[k];s.util.setLanguage(h,k);var C=h.parentElement;C&&C.nodeName.toLowerCase()==="pre"&&s.util.setLanguage(C,k);var _=h.textContent,R={element:h,language:k,grammar:x,code:_};function T(D){R.highlightedCode=D,s.hooks.run("before-insert",R),R.element.innerHTML=R.highlightedCode,s.hooks.run("after-highlight",R),s.hooks.run("complete",R),E&&E.call(R.element)}if(s.hooks.run("before-sanity-check",R),C=R.element.parentElement,C&&C.nodeName.toLowerCase()==="pre"&&!C.hasAttribute("tabindex")&&C.setAttribute("tabindex","0"),!R.code){s.hooks.run("complete",R),E&&E.call(R.element);return}if(s.hooks.run("before-highlight",R),!R.grammar){T(s.util.encode(R.code));return}if(S&&r.Worker){var L=new Worker(s.filename);L.onmessage=function(D){T(D.data)},L.postMessage(JSON.stringify({language:R.language,code:R.code,immediateClose:!0}))}else T(s.highlight(R.code,R.grammar,R.language))},highlight:function(h,S,E){var k={code:h,grammar:S,language:E};if(s.hooks.run("before-tokenize",k),!k.grammar)throw new Error('The language "'+k.language+'" has no grammar.');return k.tokens=s.tokenize(k.code,k.grammar),s.hooks.run("after-tokenize",k),l.stringify(s.util.encode(k.tokens),k.language)},tokenize:function(h,S){var E=S.rest;if(E){for(var k in E)S[k]=E[k];delete S.rest}var x=new d;return g(x,x.head,h),u(h,x,S,x.head,0),b(x)},hooks:{all:{},add:function(h,S){var E=s.hooks.all;E[h]=E[h]||[],E[h].push(S)},run:function(h,S){var E=s.hooks.all[h];if(!(!E||!E.length))for(var k=0,x;x=E[k++];)x(S)}},Token:l};r.Prism=s;function l(h,S,E,k){this.type=h,this.content=S,this.alias=E,this.length=(k||"").length|0}l.stringify=function h(S,E){if(typeof S=="string")return S;if(Array.isArray(S)){var k="";return S.forEach(function(T){k+=h(T,E)}),k}var x={type:S.type,content:h(S.content,E),tag:"span",classes:["token",S.type],attributes:{},language:E},C=S.alias;C&&(Array.isArray(C)?Array.prototype.push.apply(x.classes,C):x.classes.push(C)),s.hooks.run("wrap",x);var _="";for(var R in x.attributes)_+=" "+R+'="'+(x.attributes[R]||"").replace(/"/g,""")+'"';return"<"+x.tag+' class="'+x.classes.join(" ")+'"'+_+">"+x.content+""};function c(h,S,E,k){h.lastIndex=S;var x=h.exec(E);if(x&&k&&x[1]){var C=x[1].length;x.index+=C,x[0]=x[0].slice(C)}return x}function u(h,S,E,k,x,C){for(var _ in E)if(!(!E.hasOwnProperty(_)||!E[_])){var R=E[_];R=Array.isArray(R)?R:[R];for(var T=0;T=C.reach);O+=j.value.length,j=j.next){var A=j.value;if(S.length>h.length)return;if(!(A instanceof l)){var V=1,P;if(z){if(P=c(X,O,h,H),!P||P.index>=h.length)break;var ne=P.index,N=P.index+P[0].length,K=O;for(K+=j.value.length;ne>=K;)j=j.next,K+=j.value.length;if(K-=j.value.length,O=K,j.value instanceof l)continue;for(var ae=j;ae!==S.tail&&(KC.reach&&(C.reach=re);var Ee=j.prev;pe&&(Ee=g(S,Ee,pe),O+=pe.length),m(S,Ee,V);var ke=new l(_,D?s.tokenize(Q,D):Q,M,Q);if(j=g(S,Ee,ke),he&&g(S,j,he),V>1){var We={cause:_+","+T,reach:re};u(h,S,E,j.prev,O,We),C&&We.reach>C.reach&&(C.reach=We.reach)}}}}}}function d(){var h={value:null,prev:null,next:null},S={value:null,prev:h,next:null};h.next=S,this.head=h,this.tail=S,this.length=0}function g(h,S,E){var k=S.next,x={value:E,prev:S,next:k};return S.next=x,k.prev=x,h.length++,x}function m(h,S,E){for(var k=S.next,x=0;x/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},e.languages.markup.tag.inside["attr-value"].inside.entity=e.languages.markup.entity,e.languages.markup.doctype.inside["internal-subset"].inside=e.languages.markup,e.hooks.add("wrap",function(t){t.type==="entity"&&(t.attributes.title=t.content.value.replace(/&/,"&"))}),Object.defineProperty(e.languages.markup.tag,"addInlined",{value:function(n,r){var a={};a["language-"+r]={pattern:/(^$)/i,lookbehind:!0,inside:e.languages[r]},a.cdata=/^$/i;var o={"included-cdata":{pattern://i,inside:a}};o["language-"+r]={pattern:/[\s\S]+/,inside:e.languages[r]};var i={};i[n]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return n}),"i"),lookbehind:!0,greedy:!0,inside:o},e.languages.insertBefore("markup","cdata",i)}}),Object.defineProperty(e.languages.markup.tag,"addAttribute",{value:function(t,n){e.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+t+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[n,"language-"+n],inside:e.languages[n]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),e.languages.html=e.languages.markup,e.languages.mathml=e.languages.markup,e.languages.svg=e.languages.markup,e.languages.xml=e.languages.extend("markup",{}),e.languages.ssml=e.languages.xml,e.languages.atom=e.languages.xml,e.languages.rss=e.languages.xml}var _he=kA;kA.displayName="css";kA.aliases=[];function kA(e){(function(t){var n=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;t.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+n.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+n.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+n.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:n,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},t.languages.css.atrule.inside.rest=t.languages.css;var r=t.languages.markup;r&&(r.tag.addInlined("style","css"),r.tag.addAttribute("style","css"))})(e)}var Ahe=CA;CA.displayName="clike";CA.aliases=[];function CA(e){e.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}}var The=_A;_A.displayName="javascript";_A.aliases=["js"];function _A(e){e.languages.javascript=e.languages.extend("clike",{"class-name":[e.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+(/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source)+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),e.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,e.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:e.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:e.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:e.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:e.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:e.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),e.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:e.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),e.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),e.languages.markup&&(e.languages.markup.tag.addInlined("script","javascript"),e.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),e.languages.js=e.languages.javascript}var Tu=typeof globalThis=="object"?globalThis:typeof self=="object"?self:typeof window=="object"?window:typeof nn=="object"?nn:{},Rhe=qhe();Tu.Prism={manual:!0,disableWorkerMessageHandler:!0};var Nhe=qpe,Ihe=she,nz=khe,Ohe=Che,Dhe=_he,Lhe=Ahe,Mhe=The;Rhe();var AA={}.hasOwnProperty;function rz(){}rz.prototype=nz;var tn=new rz,Phe=tn;tn.highlight=Fhe;tn.register=kf;tn.alias=$he;tn.registered=jhe;tn.listLanguages=zhe;kf(Ohe);kf(Dhe);kf(Lhe);kf(Mhe);tn.util.encode=Hhe;tn.Token.stringify=Uhe;function kf(e){if(typeof e!="function"||!e.displayName)throw new Error("Expected `function` for `grammar`, got `"+e+"`");tn.languages[e.displayName]===void 0&&e(tn)}function $he(e,t){var n=tn.languages,r=e,a,o,i,s;t&&(r={},r[e]=t);for(a in r)for(o=r[a],o=typeof o=="string"?[o]:o,i=o.length,s=-1;++s code[class*="language-"]':{background:"#f5f2f0",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"slategray"},prolog:{color:"slategray"},doctype:{color:"slategray"},cdata:{color:"slategray"},punctuation:{color:"#999"},namespace:{Opacity:".7"},property:{color:"#905"},tag:{color:"#905"},boolean:{color:"#905"},number:{color:"#905"},constant:{color:"#905"},symbol:{color:"#905"},deleted:{color:"#905"},selector:{color:"#690"},"attr-name":{color:"#690"},string:{color:"#690"},char:{color:"#690"},builtin:{color:"#690"},inserted:{color:"#690"},operator:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},entity:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)",cursor:"help"},url:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},".language-css .token.string":{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},".style .token.string":{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},atrule:{color:"#07a"},"attr-value":{color:"#07a"},keyword:{color:"#07a"},function:{color:"#DD4A68"},"class-name":{color:"#DD4A68"},regex:{color:"#e90"},important:{color:"#e90",fontWeight:"bold"},variable:{color:"#e90"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};var Ey,uI;function Whe(){if(uI)return Ey;uI=1,Ey=e,e.displayName="abap",e.aliases=[];function e(t){t.languages.abap={comment:/^\*.*/m,string:/(`|')(?:\\.|(?!\1)[^\\\r\n])*\1/,"string-template":{pattern:/([|}])(?:\\.|[^\\|{\r\n])*(?=[|{])/,lookbehind:!0,alias:"string"},"eol-comment":{pattern:/(^|\s)".*/m,lookbehind:!0,alias:"comment"},keyword:{pattern:/(\s|\.|^)(?:SCIENTIFIC_WITH_LEADING_ZERO|SCALE_PRESERVING_SCIENTIFIC|RMC_COMMUNICATION_FAILURE|END-ENHANCEMENT-SECTION|MULTIPLY-CORRESPONDING|SUBTRACT-CORRESPONDING|VERIFICATION-MESSAGE|DIVIDE-CORRESPONDING|ENHANCEMENT-SECTION|CURRENCY_CONVERSION|RMC_SYSTEM_FAILURE|START-OF-SELECTION|MOVE-CORRESPONDING|RMC_INVALID_STATUS|CUSTOMER-FUNCTION|END-OF-DEFINITION|ENHANCEMENT-POINT|SYSTEM-EXCEPTIONS|ADD-CORRESPONDING|SCALE_PRESERVING|SELECTION-SCREEN|CURSOR-SELECTION|END-OF-SELECTION|LOAD-OF-PROGRAM|SCROLL-BOUNDARY|SELECTION-TABLE|EXCEPTION-TABLE|IMPLEMENTATIONS|PARAMETER-TABLE|RIGHT-JUSTIFIED|UNIT_CONVERSION|AUTHORITY-CHECK|LIST-PROCESSING|SIGN_AS_POSTFIX|COL_BACKGROUND|IMPLEMENTATION|INTERFACE-POOL|TRANSFORMATION|IDENTIFICATION|ENDENHANCEMENT|LINE-SELECTION|INITIALIZATION|LEFT-JUSTIFIED|SELECT-OPTIONS|SELECTION-SETS|COMMUNICATION|CORRESPONDING|DECIMAL_SHIFT|PRINT-CONTROL|VALUE-REQUEST|CHAIN-REQUEST|FUNCTION-POOL|FIELD-SYMBOLS|FUNCTIONALITY|INVERTED-DATE|SELECTION-SET|CLASS-METHODS|OUTPUT-LENGTH|CLASS-CODING|COL_NEGATIVE|ERRORMESSAGE|FIELD-GROUPS|HELP-REQUEST|NO-EXTENSION|NO-TOPOFPAGE|REDEFINITION|DISPLAY-MODE|ENDINTERFACE|EXIT-COMMAND|FIELD-SYMBOL|NO-SCROLLING|SHORTDUMP-ID|ACCESSPOLICY|CLASS-EVENTS|COL_POSITIVE|DECLARATIONS|ENHANCEMENTS|FILTER-TABLE|SWITCHSTATES|SYNTAX-CHECK|TRANSPORTING|ASYNCHRONOUS|SYNTAX-TRACE|TOKENIZATION|USER-COMMAND|WITH-HEADING|ABAP-SOURCE|BREAK-POINT|CHAIN-INPUT|COMPRESSION|FIXED-POINT|NEW-SECTION|NON-UNICODE|OCCURRENCES|RESPONSIBLE|SYSTEM-CALL|TRACE-TABLE|ABBREVIATED|CHAR-TO-HEX|END-OF-FILE|ENDFUNCTION|ENVIRONMENT|ASSOCIATION|COL_HEADING|EDITOR-CALL|END-OF-PAGE|ENGINEERING|IMPLEMENTED|INTENSIFIED|RADIOBUTTON|SYSTEM-EXIT|TOP-OF-PAGE|TRANSACTION|APPLICATION|CONCATENATE|DESTINATION|ENHANCEMENT|IMMEDIATELY|NO-GROUPING|PRECOMPILED|REPLACEMENT|TITLE-LINES|ACTIVATION|BYTE-ORDER|CLASS-POOL|CONNECTION|CONVERSION|DEFINITION|DEPARTMENT|EXPIRATION|INHERITING|MESSAGE-ID|NO-HEADING|PERFORMING|QUEUE-ONLY|RIGHTSPACE|SCIENTIFIC|STATUSINFO|STRUCTURES|SYNCPOINTS|WITH-TITLE|ATTRIBUTES|BOUNDARIES|CLASS-DATA|COL_NORMAL|DD\/MM\/YYYY|DESCENDING|INTERFACES|LINE-COUNT|MM\/DD\/YYYY|NON-UNIQUE|PRESERVING|SELECTIONS|STATEMENTS|SUBROUTINE|TRUNCATION|TYPE-POOLS|ARITHMETIC|BACKGROUND|ENDPROVIDE|EXCEPTIONS|IDENTIFIER|INDEX-LINE|OBLIGATORY|PARAMETERS|PERCENTAGE|PUSHBUTTON|RESOLUTION|COMPONENTS|DEALLOCATE|DISCONNECT|DUPLICATES|FIRST-LINE|HEAD-LINES|NO-DISPLAY|OCCURRENCE|RESPECTING|RETURNCODE|SUBMATCHES|TRACE-FILE|ASCENDING|BYPASSING|ENDMODULE|EXCEPTION|EXCLUDING|EXPORTING|INCREMENT|MATCHCODE|PARAMETER|PARTIALLY|PREFERRED|REFERENCE|REPLACING|RETURNING|SELECTION|SEPARATED|SPECIFIED|STATEMENT|TIMESTAMP|TYPE-POOL|ACCEPTING|APPENDAGE|ASSIGNING|COL_GROUP|COMPARING|CONSTANTS|DANGEROUS|IMPORTING|INSTANCES|LEFTSPACE|LOG-POINT|QUICKINFO|READ-ONLY|SCROLLING|SQLSCRIPT|STEP-LOOP|TOP-LINES|TRANSLATE|APPENDING|AUTHORITY|CHARACTER|COMPONENT|CONDITION|DIRECTORY|DUPLICATE|MESSAGING|RECEIVING|SUBSCREEN|ACCORDING|COL_TOTAL|END-LINES|ENDMETHOD|ENDSELECT|EXPANDING|EXTENSION|INCLUDING|INFOTYPES|INTERFACE|INTERVALS|LINE-SIZE|PF-STATUS|PROCEDURE|PROTECTED|REQUESTED|RESUMABLE|RIGHTPLUS|SAP-SPOOL|SECONDARY|STRUCTURE|SUBSTRING|TABLEVIEW|NUMOFCHAR|ADJACENT|ANALYSIS|ASSIGNED|BACKWARD|CHANNELS|CHECKBOX|CONTINUE|CRITICAL|DATAINFO|DD\/MM\/YY|DURATION|ENCODING|ENDCLASS|FUNCTION|LEFTPLUS|LINEFEED|MM\/DD\/YY|OVERFLOW|RECEIVED|SKIPPING|SORTABLE|STANDARD|SUBTRACT|SUPPRESS|TABSTRIP|TITLEBAR|TRUNCATE|UNASSIGN|WHENEVER|ANALYZER|COALESCE|COMMENTS|CONDENSE|DECIMALS|DEFERRED|ENDWHILE|EXPLICIT|KEYWORDS|MESSAGES|POSITION|PRIORITY|RECEIVER|RENAMING|TIMEZONE|TRAILING|ALLOCATE|CENTERED|CIRCULAR|CONTROLS|CURRENCY|DELETING|DESCRIBE|DISTANCE|ENDCATCH|EXPONENT|EXTENDED|GENERATE|IGNORING|INCLUDES|INTERNAL|MAJOR-ID|MODIFIER|NEW-LINE|OPTIONAL|PROPERTY|ROLLBACK|STARTING|SUPPLIED|ABSTRACT|CHANGING|CONTEXTS|CREATING|CUSTOMER|DATABASE|DAYLIGHT|DEFINING|DISTINCT|DIVISION|ENABLING|ENDCHAIN|ESCAPING|HARMLESS|IMPLICIT|INACTIVE|LANGUAGE|MINOR-ID|MULTIPLY|NEW-PAGE|NO-TITLE|POS_HIGH|SEPARATE|TEXTPOOL|TRANSFER|SELECTOR|DBMAXLEN|ITERATOR|ARCHIVE|BIT-XOR|BYTE-CO|COLLECT|COMMENT|CURRENT|DEFAULT|DISPLAY|ENDFORM|EXTRACT|LEADING|LISTBOX|LOCATOR|MEMBERS|METHODS|NESTING|POS_LOW|PROCESS|PROVIDE|RAISING|RESERVE|SECONDS|SUMMARY|VISIBLE|BETWEEN|BIT-AND|BYTE-CS|CLEANUP|COMPUTE|CONTROL|CONVERT|DATASET|ENDCASE|FORWARD|HEADERS|HOTSPOT|INCLUDE|INVERSE|KEEPING|NO-ZERO|OBJECTS|OVERLAY|PADDING|PATTERN|PROGRAM|REFRESH|SECTION|SUMMING|TESTING|VERSION|WINDOWS|WITHOUT|BIT-NOT|BYTE-CA|BYTE-NA|CASTING|CONTEXT|COUNTRY|DYNAMIC|ENABLED|ENDLOOP|EXECUTE|FRIENDS|HANDLER|HEADING|INITIAL|\*-INPUT|LOGFILE|MAXIMUM|MINIMUM|NO-GAPS|NO-SIGN|PRAGMAS|PRIMARY|PRIVATE|REDUCED|REPLACE|REQUEST|RESULTS|UNICODE|WARNING|ALIASES|BYTE-CN|BYTE-NS|CALLING|COL_KEY|COLUMNS|CONNECT|ENDEXEC|ENTRIES|EXCLUDE|FILTERS|FURTHER|HELP-ID|LOGICAL|MAPPING|MESSAGE|NAMETAB|OPTIONS|PACKAGE|PERFORM|RECEIVE|STATICS|VARYING|BINDING|CHARLEN|GREATER|XSTRLEN|ACCEPT|APPEND|DETAIL|ELSEIF|ENDING|ENDTRY|FORMAT|FRAMES|GIVING|HASHED|HEADER|IMPORT|INSERT|MARGIN|MODULE|NATIVE|OBJECT|OFFSET|REMOTE|RESUME|SAVING|SIMPLE|SUBMIT|TABBED|TOKENS|UNIQUE|UNPACK|UPDATE|WINDOW|YELLOW|ACTUAL|ASPECT|CENTER|CURSOR|DELETE|DIALOG|DIVIDE|DURING|ERRORS|EVENTS|EXTEND|FILTER|HANDLE|HAVING|IGNORE|LITTLE|MEMORY|NO-GAP|OCCURS|OPTION|PERSON|PLACES|PUBLIC|REDUCE|REPORT|RESULT|SINGLE|SORTED|SWITCH|SYNTAX|TARGET|VALUES|WRITER|ASSERT|BLOCKS|BOUNDS|BUFFER|CHANGE|COLUMN|COMMIT|CONCAT|COPIES|CREATE|DDMMYY|DEFINE|ENDIAN|ESCAPE|EXPAND|KERNEL|LAYOUT|LEGACY|LEVELS|MMDDYY|NUMBER|OUTPUT|RANGES|READER|RETURN|SCREEN|SEARCH|SELECT|SHARED|SOURCE|STABLE|STATIC|SUBKEY|SUFFIX|TABLES|UNWIND|YYMMDD|ASSIGN|BACKUP|BEFORE|BINARY|BIT-OR|BLANKS|CLIENT|CODING|COMMON|DEMAND|DYNPRO|EXCEPT|EXISTS|EXPORT|FIELDS|GLOBAL|GROUPS|LENGTH|LOCALE|MEDIUM|METHOD|MODIFY|NESTED|OTHERS|REJECT|SCROLL|SUPPLY|SYMBOL|ENDFOR|STRLEN|ALIGN|BEGIN|BOUND|ENDAT|ENTRY|EVENT|FINAL|FLUSH|GRANT|INNER|SHORT|USING|WRITE|AFTER|BLACK|BLOCK|CLOCK|COLOR|COUNT|DUMMY|EMPTY|ENDDO|ENDON|GREEN|INDEX|INOUT|LEAVE|LEVEL|LINES|MODIF|ORDER|OUTER|RANGE|RESET|RETRY|RIGHT|SMART|SPLIT|STYLE|TABLE|THROW|UNDER|UNTIL|UPPER|UTF-8|WHERE|ALIAS|BLANK|CLEAR|CLOSE|EXACT|FETCH|FIRST|FOUND|GROUP|LLANG|LOCAL|OTHER|REGEX|SPOOL|TITLE|TYPES|VALID|WHILE|ALPHA|BOXED|CATCH|CHAIN|CHECK|CLASS|COVER|ENDIF|EQUIV|FIELD|FLOOR|FRAME|INPUT|LOWER|MATCH|NODES|PAGES|PRINT|RAISE|ROUND|SHIFT|SPACE|SPOTS|STAMP|STATE|TASKS|TIMES|TRMAC|ULINE|UNION|VALUE|WIDTH|EQUAL|LOG10|TRUNC|BLOB|CASE|CEIL|CLOB|COND|EXIT|FILE|GAPS|HOLD|INCL|INTO|KEEP|KEYS|LAST|LINE|LONG|LPAD|MAIL|MODE|OPEN|PINK|READ|ROWS|TEST|THEN|ZERO|AREA|BACK|BADI|BYTE|CAST|EDIT|EXEC|FAIL|FIND|FKEQ|FONT|FREE|GKEQ|HIDE|INIT|ITNO|LATE|LOOP|MAIN|MARK|MOVE|NEXT|NULL|RISK|ROLE|UNIT|WAIT|ZONE|BASE|CALL|CODE|DATA|DATE|FKGE|GKGE|HIGH|KIND|LEFT|LIST|MASK|MESH|NAME|NODE|PACK|PAGE|POOL|SEND|SIGN|SIZE|SOME|STOP|TASK|TEXT|TIME|USER|VARY|WITH|WORD|BLUE|CONV|COPY|DEEP|ELSE|FORM|FROM|HINT|ICON|JOIN|LIKE|LOAD|ONLY|PART|SCAN|SKIP|SORT|TYPE|UNIX|VIEW|WHEN|WORK|ACOS|ASIN|ATAN|COSH|EACH|FRAC|LESS|RTTI|SINH|SQRT|TANH|AVG|BIT|DIV|ISO|LET|OUT|PAD|SQL|ALL|CI_|CPI|END|LOB|LPI|MAX|MIN|NEW|OLE|RUN|SET|\?TO|YES|ABS|ADD|AND|BIG|FOR|HDB|JOB|LOW|NOT|SAP|TRY|VIA|XML|ANY|GET|IDS|KEY|MOD|OFF|PUT|RAW|RED|REF|SUM|TAB|XSD|CNT|COS|EXP|LOG|SIN|TAN|XOR|AT|CO|CP|DO|GT|ID|IF|NS|OR|BT|CA|CS|GE|NA|NB|EQ|IN|LT|NE|NO|OF|ON|PF|TO|AS|BY|CN|IS|LE|NP|UP|E|I|M|O|Z|C|X)\b/i,lookbehind:!0},number:/\b\d+\b/,operator:{pattern:/(\s)(?:\*\*?|<[=>]?|>=?|\?=|[-+\/=])(?=\s)/,lookbehind:!0},"string-operator":{pattern:/(\s)&&?(?=\s)/,lookbehind:!0,alias:"keyword"},"token-operator":[{pattern:/(\w)(?:->?|=>|[~|{}])(?=\w)/,lookbehind:!0,alias:"punctuation"},{pattern:/[|{}]/,alias:"punctuation"}],punctuation:/[,.:()]/}}return Ey}var xy,dI;function Khe(){if(dI)return xy;dI=1,xy=e,e.displayName="abnf",e.aliases=[];function e(t){(function(n){var r="(?:ALPHA|BIT|CHAR|CR|CRLF|CTL|DIGIT|DQUOTE|HEXDIG|HTAB|LF|LWSP|OCTET|SP|VCHAR|WSP)";n.languages.abnf={comment:/;.*/,string:{pattern:/(?:%[is])?"[^"\n\r]*"/,greedy:!0,inside:{punctuation:/^%[is]/}},range:{pattern:/%(?:b[01]+-[01]+|d\d+-\d+|x[A-F\d]+-[A-F\d]+)/i,alias:"number"},terminal:{pattern:/%(?:b[01]+(?:\.[01]+)*|d\d+(?:\.\d+)*|x[A-F\d]+(?:\.[A-F\d]+)*)/i,alias:"number"},repetition:{pattern:/(^|[^\w-])(?:\d*\*\d*|\d+)/,lookbehind:!0,alias:"operator"},definition:{pattern:/(^[ \t]*)(?:[a-z][\w-]*|<[^<>\r\n]*>)(?=\s*=)/m,lookbehind:!0,alias:"keyword",inside:{punctuation:/<|>/}},"core-rule":{pattern:RegExp("(?:(^|[^<\\w-])"+r+"|<"+r+">)(?![\\w-])","i"),lookbehind:!0,alias:["rule","constant"],inside:{punctuation:/<|>/}},rule:{pattern:/(^|[^<\w-])[a-z][\w-]*|<[^<>\r\n]*>/i,lookbehind:!0,inside:{punctuation:/<|>/}},operator:/=\/?|\//,punctuation:/[()\[\]]/}})(t)}return xy}var ky,fI;function Yhe(){if(fI)return ky;fI=1,ky=e,e.displayName="actionscript",e.aliases=[];function e(t){t.languages.actionscript=t.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<>?>?|[!=]=?)=?|[~?@]/}),t.languages.actionscript["class-name"].alias="function",delete t.languages.actionscript.parameter,delete t.languages.actionscript["literal-property"],t.languages.markup&&t.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:t.languages.markup}})}return ky}var Cy,pI;function Zhe(){if(pI)return Cy;pI=1,Cy=e,e.displayName="ada",e.aliases=[];function e(t){t.languages.ada={comment:/--.*/,string:/"(?:""|[^"\r\f\n])*"/,number:[{pattern:/\b\d(?:_?\d)*#[\dA-F](?:_?[\dA-F])*(?:\.[\dA-F](?:_?[\dA-F])*)?#(?:E[+-]?\d(?:_?\d)*)?/i},{pattern:/\b\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:E[+-]?\d(?:_?\d)*)?\b/i}],"attr-name":/\b'\w+/,keyword:/\b(?:abort|abs|abstract|accept|access|aliased|all|and|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|elsif|end|entry|exception|exit|for|function|generic|goto|if|in|interface|is|limited|loop|mod|new|not|null|of|others|out|overriding|package|pragma|private|procedure|protected|raise|range|record|rem|renames|requeue|return|reverse|select|separate|some|subtype|synchronized|tagged|task|terminate|then|type|until|use|when|while|with|xor)\b/i,boolean:/\b(?:false|true)\b/i,operator:/<[=>]?|>=?|=>?|:=|\/=?|\*\*?|[&+-]/,punctuation:/\.\.?|[,;():]/,char:/'.'/,variable:/\b[a-z](?:\w)*\b/i}}return Cy}var _y,gI;function Xhe(){if(gI)return _y;gI=1,_y=e,e.displayName="agda",e.aliases=[];function e(t){(function(n){n.languages.agda={comment:/\{-[\s\S]*?(?:-\}|$)|--.*/,string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},punctuation:/[(){}⦃⦄.;@]/,"class-name":{pattern:/((?:data|record) +)\S+/,lookbehind:!0},function:{pattern:/(^[ \t]*)(?!\s)[^:\r\n]+(?=:)/m,lookbehind:!0},operator:{pattern:/(^\s*|\s)(?:[=|:∀→λ\\?_]|->)(?=\s)/,lookbehind:!0},keyword:/\b(?:Set|abstract|constructor|data|eta-equality|field|forall|hiding|import|in|inductive|infix|infixl|infixr|instance|let|macro|module|mutual|no-eta-equality|open|overlap|pattern|postulate|primitive|private|public|quote|quoteContext|quoteGoal|quoteTerm|record|renaming|rewrite|syntax|tactic|unquote|unquoteDecl|unquoteDef|using|variable|where|with)\b/}})(t)}return _y}var Ay,mI;function Qhe(){if(mI)return Ay;mI=1,Ay=e,e.displayName="al",e.aliases=[];function e(t){t.languages.al={comment:/\/\/.*|\/\*[\s\S]*?\*\//,string:{pattern:/'(?:''|[^'\r\n])*'(?!')|"(?:""|[^"\r\n])*"(?!")/,greedy:!0},function:{pattern:/(\b(?:event|procedure|trigger)\s+|(?:^|[^.])\.\s*)[a-z_]\w*(?=\s*\()/i,lookbehind:!0},keyword:[/\b(?:array|asserterror|begin|break|case|do|downto|else|end|event|exit|for|foreach|function|if|implements|in|indataset|interface|internal|local|of|procedure|program|protected|repeat|runonclient|securityfiltering|suppressdispose|temporary|then|to|trigger|until|var|while|with|withevents)\b/i,/\b(?:action|actions|addafter|addbefore|addfirst|addlast|area|assembly|chartpart|codeunit|column|controladdin|cuegroup|customizes|dataitem|dataset|dotnet|elements|enum|enumextension|extends|field|fieldattribute|fieldelement|fieldgroup|fieldgroups|fields|filter|fixed|grid|group|key|keys|label|labels|layout|modify|moveafter|movebefore|movefirst|movelast|page|pagecustomization|pageextension|part|profile|query|repeater|report|requestpage|schema|separator|systempart|table|tableelement|tableextension|textattribute|textelement|type|usercontrol|value|xmlport)\b/i],number:/\b(?:0x[\da-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)(?:F|LL?|U(?:LL?)?)?\b/i,boolean:/\b(?:false|true)\b/i,variable:/\b(?:Curr(?:FieldNo|Page|Report)|x?Rec|RequestOptionsPage)\b/,"class-name":/\b(?:automation|biginteger|bigtext|blob|boolean|byte|char|clienttype|code|completiontriggererrorlevel|connectiontype|database|dataclassification|datascope|date|dateformula|datetime|decimal|defaultlayout|dialog|dictionary|dotnetassembly|dotnettypedeclaration|duration|errorinfo|errortype|executioncontext|executionmode|fieldclass|fieldref|fieldtype|file|filterpagebuilder|guid|httpclient|httpcontent|httpheaders|httprequestmessage|httpresponsemessage|instream|integer|joker|jsonarray|jsonobject|jsontoken|jsonvalue|keyref|list|moduledependencyinfo|moduleinfo|none|notification|notificationscope|objecttype|option|outstream|pageresult|record|recordid|recordref|reportformat|securityfilter|sessionsettings|tableconnectiontype|tablefilter|testaction|testfield|testfilterfield|testpage|testpermissions|testrequestpage|text|textbuilder|textconst|textencoding|time|transactionmodel|transactiontype|variant|verbosity|version|view|views|webserviceactioncontext|webserviceactionresultcode|xmlattribute|xmlattributecollection|xmlcdata|xmlcomment|xmldeclaration|xmldocument|xmldocumenttype|xmlelement|xmlnamespacemanager|xmlnametable|xmlnode|xmlnodelist|xmlprocessinginstruction|xmlreadoptions|xmltext|xmlwriteoptions)\b/i,operator:/\.\.|:[=:]|[-+*/]=?|<>|[<>]=?|=|\b(?:and|div|mod|not|or|xor)\b/i,punctuation:/[()\[\]{}:.;,]/}}return Ay}var Ty,hI;function Jhe(){if(hI)return Ty;hI=1,Ty=e,e.displayName="antlr4",e.aliases=["g4"];function e(t){t.languages.antlr4={comment:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,string:{pattern:/'(?:\\.|[^\\'\r\n])*'/,greedy:!0},"character-class":{pattern:/\[(?:\\.|[^\\\]\r\n])*\]/,greedy:!0,alias:"regex",inside:{range:{pattern:/([^[]|(?:^|[^\\])(?:\\\\)*\\\[)-(?!\])/,lookbehind:!0,alias:"punctuation"},escape:/\\(?:u(?:[a-fA-F\d]{4}|\{[a-fA-F\d]+\})|[pP]\{[=\w-]+\}|[^\r\nupP])/,punctuation:/[\[\]]/}},action:{pattern:/\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\}/,greedy:!0,inside:{content:{pattern:/(\{)[\s\S]+(?=\})/,lookbehind:!0},punctuation:/[{}]/}},command:{pattern:/(->\s*(?!\s))(?:\s*(?:,\s*)?\b[a-z]\w*(?:\s*\([^()\r\n]*\))?)+(?=\s*;)/i,lookbehind:!0,inside:{function:/\b\w+(?=\s*(?:[,(]|$))/,punctuation:/[,()]/}},annotation:{pattern:/@\w+(?:::\w+)*/,alias:"keyword"},label:{pattern:/#[ \t]*\w+/,alias:"punctuation"},keyword:/\b(?:catch|channels|finally|fragment|grammar|import|lexer|locals|mode|options|parser|returns|throws|tokens)\b/,definition:[{pattern:/\b[a-z]\w*(?=\s*:)/,alias:["rule","class-name"]},{pattern:/\b[A-Z]\w*(?=\s*:)/,alias:["token","constant"]}],constant:/\b[A-Z][A-Z_]*\b/,operator:/\.\.|->|[|~]|[*+?]\??/,punctuation:/[;:()=]/},t.languages.g4=t.languages.antlr4}return Ty}var Ry,bI;function ebe(){if(bI)return Ry;bI=1,Ry=e,e.displayName="apacheconf",e.aliases=[];function e(t){t.languages.apacheconf={comment:/#.*/,"directive-inline":{pattern:/(^[\t ]*)\b(?:AcceptFilter|AcceptPathInfo|AccessFileName|Action|Add(?:Alt|AltByEncoding|AltByType|Charset|DefaultCharset|Description|Encoding|Handler|Icon|IconByEncoding|IconByType|InputFilter|Language|ModuleInfo|OutputFilter|OutputFilterByType|Type)|Alias|AliasMatch|Allow(?:CONNECT|EncodedSlashes|Methods|Override|OverrideList)?|Anonymous(?:_LogEmail|_MustGiveEmail|_NoUserID|_VerifyEmail)?|AsyncRequestWorkerFactor|Auth(?:BasicAuthoritative|BasicFake|BasicProvider|BasicUseDigestAlgorithm|DBDUserPWQuery|DBDUserRealmQuery|DBMGroupFile|DBMType|DBMUserFile|Digest(?:Algorithm|Domain|NonceLifetime|Provider|Qop|ShmemSize)|Form(?:Authoritative|Body|DisableNoStore|FakeBasicAuth|Location|LoginRequiredLocation|LoginSuccessLocation|LogoutLocation|Method|Mimetype|Password|Provider|SitePassphrase|Size|Username)|GroupFile|LDAP(?:AuthorizePrefix|BindAuthoritative|BindDN|BindPassword|CharsetConfig|CompareAsUser|CompareDNOnServer|DereferenceAliases|GroupAttribute|GroupAttributeIsDN|InitialBindAsUser|InitialBindPattern|MaxSubGroupDepth|RemoteUserAttribute|RemoteUserIsDN|SearchAsUser|SubGroupAttribute|SubGroupClass|Url)|Merging|Name|nCache(?:Context|Enable|ProvideFor|SOCache|Timeout)|nzFcgiCheckAuthnProvider|nzFcgiDefineProvider|Type|UserFile|zDBDLoginToReferer|zDBDQuery|zDBDRedirectQuery|zDBMType|zSendForbiddenOnFailure)|BalancerGrowth|BalancerInherit|BalancerMember|BalancerPersist|BrowserMatch|BrowserMatchNoCase|BufferedLogs|BufferSize|Cache(?:DefaultExpire|DetailHeader|DirLength|DirLevels|Disable|Enable|File|Header|IgnoreCacheControl|IgnoreHeaders|IgnoreNoLastMod|IgnoreQueryString|IgnoreURLSessionIdentifiers|KeyBaseURL|LastModifiedFactor|Lock|LockMaxAge|LockPath|MaxExpire|MaxFileSize|MinExpire|MinFileSize|NegotiatedDocs|QuickHandler|ReadSize|ReadTime|Root|Socache(?:MaxSize|MaxTime|MinTime|ReadSize|ReadTime)?|StaleOnError|StoreExpired|StoreNoStore|StorePrivate)|CGIDScriptTimeout|CGIMapExtension|CharsetDefault|CharsetOptions|CharsetSourceEnc|CheckCaseOnly|CheckSpelling|ChrootDir|ContentDigest|CookieDomain|CookieExpires|CookieName|CookieStyle|CookieTracking|CoreDumpDirectory|CustomLog|Dav|DavDepthInfinity|DavGenericLockDB|DavLockDB|DavMinTimeout|DBDExptime|DBDInitSQL|DBDKeep|DBDMax|DBDMin|DBDParams|DBDPersist|DBDPrepareSQL|DBDriver|DefaultIcon|DefaultLanguage|DefaultRuntimeDir|DefaultType|Define|Deflate(?:BufferSize|CompressionLevel|FilterNote|InflateLimitRequestBody|InflateRatio(?:Burst|Limit)|MemLevel|WindowSize)|Deny|DirectoryCheckHandler|DirectoryIndex|DirectoryIndexRedirect|DirectorySlash|DocumentRoot|DTracePrivileges|DumpIOInput|DumpIOOutput|EnableExceptionHook|EnableMMAP|EnableSendfile|Error|ErrorDocument|ErrorLog|ErrorLogFormat|Example|ExpiresActive|ExpiresByType|ExpiresDefault|ExtendedStatus|ExtFilterDefine|ExtFilterOptions|FallbackResource|FileETag|FilterChain|FilterDeclare|FilterProtocol|FilterProvider|FilterTrace|ForceLanguagePriority|ForceType|ForensicLog|GprofDir|GracefulShutdownTimeout|Group|Header|HeaderName|Heartbeat(?:Address|Listen|MaxServers|Storage)|HostnameLookups|IdentityCheck|IdentityCheckTimeout|ImapBase|ImapDefault|ImapMenu|Include|IncludeOptional|Index(?:HeadInsert|Ignore|IgnoreReset|Options|OrderDefault|StyleSheet)|InputSed|ISAPI(?:AppendLogToErrors|AppendLogToQuery|CacheFile|FakeAsync|LogNotSupported|ReadAheadBuffer)|KeepAlive|KeepAliveTimeout|KeptBodySize|LanguagePriority|LDAP(?:CacheEntries|CacheTTL|ConnectionPoolTTL|ConnectionTimeout|LibraryDebug|OpCacheEntries|OpCacheTTL|ReferralHopLimit|Referrals|Retries|RetryDelay|SharedCacheFile|SharedCacheSize|Timeout|TrustedClientCert|TrustedGlobalCert|TrustedMode|VerifyServerCert)|Limit(?:InternalRecursion|Request(?:Body|Fields|FieldSize|Line)|XMLRequestBody)|Listen|ListenBackLog|LoadFile|LoadModule|LogFormat|LogLevel|LogMessage|LuaAuthzProvider|LuaCodeCache|Lua(?:Hook(?:AccessChecker|AuthChecker|CheckUserID|Fixups|InsertFilter|Log|MapToStorage|TranslateName|TypeChecker)|Inherit|InputFilter|MapHandler|OutputFilter|PackageCPath|PackagePath|QuickHandler|Root|Scope)|Max(?:ConnectionsPerChild|KeepAliveRequests|MemFree|RangeOverlaps|RangeReversals|Ranges|RequestWorkers|SpareServers|SpareThreads|Threads)|MergeTrailers|MetaDir|MetaFiles|MetaSuffix|MimeMagicFile|MinSpareServers|MinSpareThreads|MMapFile|ModemStandard|ModMimeUsePathInfo|MultiviewsMatch|Mutex|NameVirtualHost|NoProxy|NWSSLTrustedCerts|NWSSLUpgradeable|Options|Order|OutputSed|PassEnv|PidFile|PrivilegesMode|Protocol|ProtocolEcho|Proxy(?:AddHeaders|BadHeader|Block|Domain|ErrorOverride|ExpressDBMFile|ExpressDBMType|ExpressEnable|FtpDirCharset|FtpEscapeWildcards|FtpListOnWildcard|HTML(?:BufSize|CharsetOut|DocType|Enable|Events|Extended|Fixups|Interp|Links|Meta|StripComments|URLMap)|IOBufferSize|MaxForwards|Pass(?:Inherit|InterpolateEnv|Match|Reverse|ReverseCookieDomain|ReverseCookiePath)?|PreserveHost|ReceiveBufferSize|Remote|RemoteMatch|Requests|SCGIInternalRedirect|SCGISendfile|Set|SourceAddress|Status|Timeout|Via)|ReadmeName|ReceiveBufferSize|Redirect|RedirectMatch|RedirectPermanent|RedirectTemp|ReflectorHeader|RemoteIP(?:Header|InternalProxy|InternalProxyList|ProxiesHeader|TrustedProxy|TrustedProxyList)|RemoveCharset|RemoveEncoding|RemoveHandler|RemoveInputFilter|RemoveLanguage|RemoveOutputFilter|RemoveType|RequestHeader|RequestReadTimeout|Require|Rewrite(?:Base|Cond|Engine|Map|Options|Rule)|RLimitCPU|RLimitMEM|RLimitNPROC|Satisfy|ScoreBoardFile|Script(?:Alias|AliasMatch|InterpreterSource|Log|LogBuffer|LogLength|Sock)?|SecureListen|SeeRequestTail|SendBufferSize|Server(?:Admin|Alias|Limit|Name|Path|Root|Signature|Tokens)|Session(?:Cookie(?:Name|Name2|Remove)|Crypto(?:Cipher|Driver|Passphrase|PassphraseFile)|DBD(?:CookieName|CookieName2|CookieRemove|DeleteLabel|InsertLabel|PerUser|SelectLabel|UpdateLabel)|Env|Exclude|Header|Include|MaxAge)?|SetEnv|SetEnvIf|SetEnvIfExpr|SetEnvIfNoCase|SetHandler|SetInputFilter|SetOutputFilter|SSIEndTag|SSIErrorMsg|SSIETag|SSILastModified|SSILegacyExprParser|SSIStartTag|SSITimeFormat|SSIUndefinedEcho|SSL(?:CACertificateFile|CACertificatePath|CADNRequestFile|CADNRequestPath|CARevocationCheck|CARevocationFile|CARevocationPath|CertificateChainFile|CertificateFile|CertificateKeyFile|CipherSuite|Compression|CryptoDevice|Engine|FIPS|HonorCipherOrder|InsecureRenegotiation|OCSP(?:DefaultResponder|Enable|OverrideResponder|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|UseRequestNonce)|OpenSSLConfCmd|Options|PassPhraseDialog|Protocol|Proxy(?:CACertificateFile|CACertificatePath|CARevocation(?:Check|File|Path)|CheckPeer(?:CN|Expire|Name)|CipherSuite|Engine|MachineCertificate(?:ChainFile|File|Path)|Protocol|Verify|VerifyDepth)|RandomSeed|RenegBufferSize|Require|RequireSSL|Session(?:Cache|CacheTimeout|TicketKeyFile|Tickets)|SRPUnknownUserSeed|SRPVerifierFile|Stapling(?:Cache|ErrorCacheTimeout|FakeTryLater|ForceURL|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|ReturnResponderErrors|StandardCacheTimeout)|StrictSNIVHostCheck|UserName|UseStapling|VerifyClient|VerifyDepth)|StartServers|StartThreads|Substitute|Suexec|SuexecUserGroup|ThreadLimit|ThreadsPerChild|ThreadStackSize|TimeOut|TraceEnable|TransferLog|TypesConfig|UnDefine|UndefMacro|UnsetEnv|Use|UseCanonicalName|UseCanonicalPhysicalPort|User|UserDir|VHostCGIMode|VHostCGIPrivs|VHostGroup|VHostPrivs|VHostSecure|VHostUser|Virtual(?:DocumentRoot|ScriptAlias)(?:IP)?|WatchdogInterval|XBitHack|xml2EncAlias|xml2EncDefault|xml2StartParse)\b/im,lookbehind:!0,alias:"property"},"directive-block":{pattern:/<\/?\b(?:Auth[nz]ProviderAlias|Directory|DirectoryMatch|Else|ElseIf|Files|FilesMatch|If|IfDefine|IfModule|IfVersion|Limit|LimitExcept|Location|LocationMatch|Macro|Proxy|Require(?:All|Any|None)|VirtualHost)\b.*>/i,inside:{"directive-block":{pattern:/^<\/?\w+/,inside:{punctuation:/^<\/?/},alias:"tag"},"directive-block-parameter":{pattern:/.*[^>]/,inside:{punctuation:/:/,string:{pattern:/("|').*\1/,inside:{variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/}}},alias:"attr-value"},punctuation:/>/},alias:"tag"},"directive-flags":{pattern:/\[(?:[\w=],?)+\]/,alias:"keyword"},string:{pattern:/("|').*\1/,inside:{variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/}},variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/,regex:/\^?.*\$|\^.*\$?/}}return Ry}var Ny,yI;function TA(){if(yI)return Ny;yI=1,Ny=e,e.displayName="sql",e.aliases=[];function e(t){t.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/}}return Ny}var Iy,vI;function tbe(){if(vI)return Iy;vI=1;var e=TA();Iy=t,t.displayName="apex",t.aliases=[];function t(n){n.register(e),function(r){var a=/\b(?:(?:after|before)(?=\s+[a-z])|abstract|activate|and|any|array|as|asc|autonomous|begin|bigdecimal|blob|boolean|break|bulk|by|byte|case|cast|catch|char|class|collect|commit|const|continue|currency|date|datetime|decimal|default|delete|desc|do|double|else|end|enum|exception|exit|export|extends|final|finally|float|for|from|get(?=\s*[{};])|global|goto|group|having|hint|if|implements|import|in|inner|insert|instanceof|int|integer|interface|into|join|like|limit|list|long|loop|map|merge|new|not|null|nulls|number|object|of|on|or|outer|override|package|parallel|pragma|private|protected|public|retrieve|return|rollback|select|set|short|sObject|sort|static|string|super|switch|synchronized|system|testmethod|then|this|throw|time|transaction|transient|trigger|try|undelete|update|upsert|using|virtual|void|webservice|when|where|while|(?:inherited|with|without)\s+sharing)\b/i,o=/\b(?:(?=[a-z_]\w*\s*[<\[])|(?!))[A-Z_]\w*(?:\s*\.\s*[A-Z_]\w*)*\b(?:\s*(?:\[\s*\]|<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>))*/.source.replace(//g,function(){return a.source});function i(l){return RegExp(l.replace(//g,function(){return o}),"i")}var s={keyword:a,punctuation:/[()\[\]{};,:.<>]/};r.languages.apex={comment:r.languages.clike.comment,string:r.languages.clike.string,sql:{pattern:/((?:[=,({:]|\breturn)\s*)\[[^\[\]]*\]/i,lookbehind:!0,greedy:!0,alias:"language-sql",inside:r.languages.sql},annotation:{pattern:/@\w+\b/,alias:"punctuation"},"class-name":[{pattern:i(/(\b(?:class|enum|extends|implements|instanceof|interface|new|trigger\s+\w+\s+on)\s+)/.source),lookbehind:!0,inside:s},{pattern:i(/(\(\s*)(?=\s*\)\s*[\w(])/.source),lookbehind:!0,inside:s},{pattern:i(/(?=\s*\w+\s*[;=,(){:])/.source),inside:s}],trigger:{pattern:/(\btrigger\s+)\w+\b/i,lookbehind:!0,alias:"class-name"},keyword:a,function:/\b[a-z_]\w*(?=\s*\()/i,boolean:/\b(?:false|true)\b/i,number:/(?:\B\.\d+|\b\d+(?:\.\d+|L)?)\b/i,operator:/[!=](?:==?)?|\?\.?|&&|\|\||--|\+\+|[-+*/^&|]=?|:|<{1,3}=?/,punctuation:/[()\[\]{};,.]/}}(n)}return Iy}var Oy,SI;function nbe(){if(SI)return Oy;SI=1,Oy=e,e.displayName="apl",e.aliases=[];function e(t){t.languages.apl={comment:/(?:⍝|#[! ]).*$/m,string:{pattern:/'(?:[^'\r\n]|'')*'/,greedy:!0},number:/¯?(?:\d*\.?\b\d+(?:e[+¯]?\d+)?|¯|∞)(?:j¯?(?:(?:\d+(?:\.\d+)?|\.\d+)(?:e[+¯]?\d+)?|¯|∞))?/i,statement:/:[A-Z][a-z][A-Za-z]*\b/,"system-function":{pattern:/⎕[A-Z]+/i,alias:"function"},constant:/[⍬⌾#⎕⍞]/,function:/[-+×÷⌈⌊∣|⍳⍸?*⍟○!⌹<≤=>≥≠≡≢∊⍷∪∩~∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⊆⊇⌷⍋⍒⊤⊥⍕⍎⊣⊢⍁⍂≈⍯↗¤→]/,"monadic-operator":{pattern:/[\\\/⌿⍀¨⍨⌶&∥]/,alias:"operator"},"dyadic-operator":{pattern:/[.⍣⍠⍤∘⌸@⌺⍥]/,alias:"operator"},assignment:{pattern:/←/,alias:"keyword"},punctuation:/[\[;\]()◇⋄]/,dfn:{pattern:/[{}⍺⍵⍶⍹∇⍫:]/,alias:"builtin"}}}return Oy}var Dy,wI;function rbe(){if(wI)return Dy;wI=1,Dy=e,e.displayName="applescript",e.aliases=[];function e(t){t.languages.applescript={comment:[/\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,/--.+/,/#.+/],string:/"(?:\\.|[^"\\\r\n])*"/,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e-?\d+)?\b/i,operator:[/[&=≠≤≥*+\-\/÷^]|[<>]=?/,/\b(?:(?:begin|end|start)s? with|(?:contains?|(?:does not|doesn't) contain)|(?:is|isn't|is not) (?:contained by|in)|(?:(?:is|isn't|is not) )?(?:greater|less) than(?: or equal)?(?: to)?|(?:comes|(?:does not|doesn't) come) (?:after|before)|(?:is|isn't|is not) equal(?: to)?|(?:(?:does not|doesn't) equal|equal to|equals|is not|isn't)|(?:a )?(?:ref(?: to)?|reference to)|(?:and|as|div|mod|not|or))\b/],keyword:/\b(?:about|above|after|against|apart from|around|aside from|at|back|before|beginning|behind|below|beneath|beside|between|but|by|considering|continue|copy|does|eighth|else|end|equal|error|every|exit|false|fifth|first|for|fourth|from|front|get|given|global|if|ignoring|in|instead of|into|is|it|its|last|local|me|middle|my|ninth|of|on|onto|out of|over|prop|property|put|repeat|return|returning|second|set|seventh|since|sixth|some|tell|tenth|that|the|then|third|through|thru|timeout|times|to|transaction|true|try|until|where|while|whose|with|without)\b/,"class-name":/\b(?:POSIX file|RGB color|alias|application|boolean|centimeters|centimetres|class|constant|cubic centimeters|cubic centimetres|cubic feet|cubic inches|cubic meters|cubic metres|cubic yards|date|degrees Celsius|degrees Fahrenheit|degrees Kelvin|feet|file|gallons|grams|inches|integer|kilograms|kilometers|kilometres|list|liters|litres|meters|metres|miles|number|ounces|pounds|quarts|real|record|reference|script|square feet|square kilometers|square kilometres|square meters|square metres|square miles|square yards|text|yards)\b/,punctuation:/[{}():,¬«»《》]/}}return Dy}var Ly,EI;function abe(){if(EI)return Ly;EI=1,Ly=e,e.displayName="aql",e.aliases=[];function e(t){t.languages.aql={comment:/\/\/.*|\/\*[\s\S]*?\*\//,property:{pattern:/([{,]\s*)(?:(?!\d)\w+|(["'´`])(?:(?!\2)[^\\\r\n]|\\.)*\2)(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\.)*\1/,greedy:!0},identifier:{pattern:/([´`])(?:(?!\1)[^\\\r\n]|\\.)*\1/,greedy:!0},variable:/@@?\w+/,keyword:[{pattern:/(\bWITH\s+)COUNT(?=\s+INTO\b)/i,lookbehind:!0},/\b(?:AGGREGATE|ALL|AND|ANY|ASC|COLLECT|DESC|DISTINCT|FILTER|FOR|GRAPH|IN|INBOUND|INSERT|INTO|K_PATHS|K_SHORTEST_PATHS|LET|LIKE|LIMIT|NONE|NOT|NULL|OR|OUTBOUND|REMOVE|REPLACE|RETURN|SHORTEST_PATH|SORT|UPDATE|UPSERT|WINDOW|WITH)\b/i,{pattern:/(^|[^\w.[])(?:KEEP|PRUNE|SEARCH|TO)\b/i,lookbehind:!0},{pattern:/(^|[^\w.[])(?:CURRENT|NEW|OLD)\b/,lookbehind:!0},{pattern:/\bOPTIONS(?=\s*\{)/i}],function:/\b(?!\d)\w+(?=\s*\()/,boolean:/\b(?:false|true)\b/i,range:{pattern:/\.\./,alias:"operator"},number:[/\b0b[01]+/i,/\b0x[0-9a-f]+/i,/(?:\B\.\d+|\b(?:0|[1-9]\d*)(?:\.\d+)?)(?:e[+-]?\d+)?/i],operator:/\*{2,}|[=!]~|[!=<>]=?|&&|\|\||[-+*/%]/,punctuation:/::|[?.:,;()[\]{}]/}}return Ly}var My,xI;function Ws(){if(xI)return My;xI=1,My=e,e.displayName="c",e.aliases=[];function e(t){t.languages.c=t.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),t.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),t.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},t.languages.c.string],char:t.languages.c.char,comment:t.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:t.languages.c}}}}),t.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete t.languages.c.boolean}return My}var Py,kI;function RA(){if(kI)return Py;kI=1;var e=Ws();Py=t,t.displayName="cpp",t.aliases=[];function t(n){n.register(e),function(r){var a=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,o=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,function(){return a.source});r.languages.cpp=r.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,function(){return a.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:a,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),r.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,function(){return o})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),r.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:r.languages.cpp}}}}),r.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),r.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:r.languages.extend("cpp",{})}}),r.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},r.languages.cpp["base-clause"])}(n)}return Py}var $y,CI;function obe(){if(CI)return $y;CI=1;var e=RA();$y=t,t.displayName="arduino",t.aliases=["ino"];function t(n){n.register(e),n.languages.arduino=n.languages.extend("cpp",{keyword:/\b(?:String|array|bool|boolean|break|byte|case|catch|continue|default|do|double|else|finally|for|function|goto|if|in|instanceof|int|integer|long|loop|new|null|return|setup|string|switch|throw|try|void|while|word)\b/,constant:/\b(?:ANALOG_MESSAGE|DEFAULT|DIGITAL_MESSAGE|EXTERNAL|FIRMATA_STRING|HIGH|INPUT|INPUT_PULLUP|INTERNAL|INTERNAL1V1|INTERNAL2V56|LED_BUILTIN|LOW|OUTPUT|REPORT_ANALOG|REPORT_DIGITAL|SET_PIN_MODE|SYSEX_START|SYSTEM_RESET)\b/,builtin:/\b(?:Audio|BSSID|Bridge|Client|Console|EEPROM|Esplora|EsploraTFT|Ethernet|EthernetClient|EthernetServer|EthernetUDP|File|FileIO|FileSystem|Firmata|GPRS|GSM|GSMBand|GSMClient|GSMModem|GSMPIN|GSMScanner|GSMServer|GSMVoiceCall|GSM_SMS|HttpClient|IPAddress|IRread|Keyboard|KeyboardController|LiquidCrystal|LiquidCrystal_I2C|Mailbox|Mouse|MouseController|PImage|Process|RSSI|RobotControl|RobotMotor|SD|SPI|SSID|Scheduler|Serial|Server|Servo|SoftwareSerial|Stepper|Stream|TFT|Task|USBHost|WiFi|WiFiClient|WiFiServer|WiFiUDP|Wire|YunClient|YunServer|abs|addParameter|analogRead|analogReadResolution|analogReference|analogWrite|analogWriteResolution|answerCall|attach|attachGPRS|attachInterrupt|attached|autoscroll|available|background|beep|begin|beginPacket|beginSD|beginSMS|beginSpeaker|beginTFT|beginTransmission|beginWrite|bit|bitClear|bitRead|bitSet|bitWrite|blink|blinkVersion|buffer|changePIN|checkPIN|checkPUK|checkReg|circle|cityNameRead|cityNameWrite|clear|clearScreen|click|close|compassRead|config|connect|connected|constrain|cos|countryNameRead|countryNameWrite|createChar|cursor|debugPrint|delay|delayMicroseconds|detach|detachInterrupt|digitalRead|digitalWrite|disconnect|display|displayLogos|drawBMP|drawCompass|encryptionType|end|endPacket|endSMS|endTransmission|endWrite|exists|exitValue|fill|find|findUntil|flush|gatewayIP|get|getAsynchronously|getBand|getButton|getCurrentCarrier|getIMEI|getKey|getModifiers|getOemKey|getPINUsed|getResult|getSignalStrength|getSocket|getVoiceCallStatus|getXChange|getYChange|hangCall|height|highByte|home|image|interrupts|isActionDone|isDirectory|isListening|isPIN|isPressed|isValid|keyPressed|keyReleased|keyboardRead|knobRead|leftToRight|line|lineFollowConfig|listen|listenOnLocalhost|loadImage|localIP|lowByte|macAddress|maintain|map|max|messageAvailable|micros|millis|min|mkdir|motorsStop|motorsWrite|mouseDragged|mouseMoved|mousePressed|mouseReleased|move|noAutoscroll|noBlink|noBuffer|noCursor|noDisplay|noFill|noInterrupts|noListenOnLocalhost|noStroke|noTone|onReceive|onRequest|open|openNextFile|overflow|parseCommand|parseFloat|parseInt|parsePacket|pauseMode|peek|pinMode|playFile|playMelody|point|pointTo|position|pow|prepare|press|print|printFirmwareVersion|printVersion|println|process|processInput|pulseIn|put|random|randomSeed|read|readAccelerometer|readBlue|readButton|readBytes|readBytesUntil|readGreen|readJoystickButton|readJoystickSwitch|readJoystickX|readJoystickY|readLightSensor|readMessage|readMicrophone|readNetworks|readRed|readSlider|readString|readStringUntil|readTemperature|ready|rect|release|releaseAll|remoteIP|remoteNumber|remotePort|remove|requestFrom|retrieveCallingNumber|rewindDirectory|rightToLeft|rmdir|robotNameRead|robotNameWrite|run|runAsynchronously|runShellCommand|runShellCommandAsynchronously|running|scanNetworks|scrollDisplayLeft|scrollDisplayRight|seek|sendAnalog|sendDigitalPortPair|sendDigitalPorts|sendString|sendSysex|serialEvent|setBand|setBitOrder|setClockDivider|setCursor|setDNS|setDataMode|setFirmwareVersion|setMode|setPINUsed|setSpeed|setTextSize|setTimeout|shiftIn|shiftOut|shutdown|sin|size|sqrt|startLoop|step|stop|stroke|subnetMask|switchPIN|tan|tempoWrite|text|tone|transfer|tuneWrite|turn|updateIR|userNameRead|userNameWrite|voiceCall|waitContinue|width|write|writeBlue|writeGreen|writeJSON|writeMessage|writeMicroseconds|writeRGB|writeRed|yield)\b/}),n.languages.ino=n.languages.arduino}return $y}var Fy,_I;function ibe(){if(_I)return Fy;_I=1,Fy=e,e.displayName="arff",e.aliases=[];function e(t){t.languages.arff={comment:/%.*/,string:{pattern:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:/@(?:attribute|data|end|relation)\b/i,number:/\b\d+(?:\.\d+)?\b/,punctuation:/[{},]/}}return Fy}var jy,AI;function sbe(){if(AI)return jy;AI=1,jy=e,e.displayName="asciidoc",e.aliases=["adoc"];function e(t){(function(n){var r={pattern:/(^[ \t]*)\[(?!\[)(?:(["'$`])(?:(?!\2)[^\\]|\\.)*\2|\[(?:[^\[\]\\]|\\.)*\]|[^\[\]\\"'$`]|\\.)*\]/m,lookbehind:!0,inside:{quoted:{pattern:/([$`])(?:(?!\1)[^\\]|\\.)*\1/,inside:{punctuation:/^[$`]|[$`]$/}},interpreted:{pattern:/'(?:[^'\\]|\\.)*'/,inside:{punctuation:/^'|'$/}},string:/"(?:[^"\\]|\\.)*"/,variable:/\w+(?==)/,punctuation:/^\[|\]$|,/,operator:/=/,"attr-value":/(?!^\s+$).+/}},a=n.languages.asciidoc={"comment-block":{pattern:/^(\/{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1/m,alias:"comment"},table:{pattern:/^\|={3,}(?:(?:\r?\n|\r(?!\n)).*)*?(?:\r?\n|\r)\|={3,}$/m,inside:{specifiers:{pattern:/(?:(?:(?:\d+(?:\.\d+)?|\.\d+)[+*](?:[<^>](?:\.[<^>])?|\.[<^>])?|[<^>](?:\.[<^>])?|\.[<^>])[a-z]*|[a-z]+)(?=\|)/,alias:"attr-value"},punctuation:{pattern:/(^|[^\\])[|!]=*/,lookbehind:!0}}},"passthrough-block":{pattern:/^(\+{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,inside:{punctuation:/^\++|\++$/}},"literal-block":{pattern:/^(-{4,}|\.{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,inside:{punctuation:/^(?:-+|\.+)|(?:-+|\.+)$/}},"other-block":{pattern:/^(--|\*{4,}|_{4,}|={4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,inside:{punctuation:/^(?:-+|\*+|_+|=+)|(?:-+|\*+|_+|=+)$/}},"list-punctuation":{pattern:/(^[ \t]*)(?:-|\*{1,5}|\.{1,5}|(?:[a-z]|\d+)\.|[xvi]+\))(?= )/im,lookbehind:!0,alias:"punctuation"},"list-label":{pattern:/(^[ \t]*)[a-z\d].+(?::{2,4}|;;)(?=\s)/im,lookbehind:!0,alias:"symbol"},"indented-block":{pattern:/((\r?\n|\r)\2)([ \t]+)\S.*(?:(?:\r?\n|\r)\3.+)*(?=\2{2}|$)/,lookbehind:!0},comment:/^\/\/.*/m,title:{pattern:/^.+(?:\r?\n|\r)(?:={3,}|-{3,}|~{3,}|\^{3,}|\+{3,})$|^={1,5} .+|^\.(?![\s.]).*/m,alias:"important",inside:{punctuation:/^(?:\.|=+)|(?:=+|-+|~+|\^+|\++)$/}},"attribute-entry":{pattern:/^:[^:\r\n]+:(?: .*?(?: \+(?:\r?\n|\r).*?)*)?$/m,alias:"tag"},attributes:r,hr:{pattern:/^'{3,}$/m,alias:"punctuation"},"page-break":{pattern:/^<{3,}$/m,alias:"punctuation"},admonition:{pattern:/^(?:CAUTION|IMPORTANT|NOTE|TIP|WARNING):/m,alias:"keyword"},callout:[{pattern:/(^[ \t]*)/m,lookbehind:!0,alias:"symbol"},{pattern:/<\d+>/,alias:"symbol"}],macro:{pattern:/\b[a-z\d][a-z\d-]*::?(?:[^\s\[\]]*\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,inside:{function:/^[a-z\d-]+(?=:)/,punctuation:/^::?/,attributes:{pattern:/(?:\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,inside:r.inside}}},inline:{pattern:/(^|[^\\])(?:(?:\B\[(?:[^\]\\"']|(["'])(?:(?!\2)[^\\]|\\.)*\2|\\.)*\])?(?:\b_(?!\s)(?: _|[^_\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: _|[^_\\\r\n]|\\.)+)*_\b|\B``(?!\s).+?(?:(?:\r?\n|\r).+?)*''\B|\B`(?!\s)(?:[^`'\s]|\s+\S)+['`]\B|\B(['*+#])(?!\s)(?: \3|(?!\3)[^\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: \3|(?!\3)[^\\\r\n]|\\.)+)*\3\B)|(?:\[(?:[^\]\\"']|(["'])(?:(?!\4)[^\\]|\\.)*\4|\\.)*\])?(?:(__|\*\*|\+\+\+?|##|\$\$|[~^]).+?(?:(?:\r?\n|\r).+?)*\5|\{[^}\r\n]+\}|\[\[\[?.+?(?:(?:\r?\n|\r).+?)*\]?\]\]|<<.+?(?:(?:\r?\n|\r).+?)*>>|\(\(\(?.+?(?:(?:\r?\n|\r).+?)*\)?\)\)))/m,lookbehind:!0,inside:{attributes:r,url:{pattern:/^(?:\[\[\[?.+?\]?\]\]|<<.+?>>)$/,inside:{punctuation:/^(?:\[\[\[?|<<)|(?:\]\]\]?|>>)$/}},"attribute-ref":{pattern:/^\{.+\}$/,inside:{variable:{pattern:/(^\{)[a-z\d,+_-]+/,lookbehind:!0},operator:/^[=?!#%@$]|!(?=[:}])/,punctuation:/^\{|\}$|::?/}},italic:{pattern:/^(['_])[\s\S]+\1$/,inside:{punctuation:/^(?:''?|__?)|(?:''?|__?)$/}},bold:{pattern:/^\*[\s\S]+\*$/,inside:{punctuation:/^\*\*?|\*\*?$/}},punctuation:/^(?:``?|\+{1,3}|##?|\$\$|[~^]|\(\(\(?)|(?:''?|\+{1,3}|##?|\$\$|[~^`]|\)?\)\))$/}},replacement:{pattern:/\((?:C|R|TM)\)/,alias:"builtin"},entity:/&#?[\da-z]{1,8};/i,"line-continuation":{pattern:/(^| )\+$/m,lookbehind:!0,alias:"punctuation"}};function o(i){i=i.split(" ");for(var s={},l=0,c=i.length;l>=?|<<=?|&&?|\|\|?|[-+*/%&|^!=<>?]=?/,punctuation:/[(),:]/}}return Uy}var By,NI;function Ah(){if(NI)return By;NI=1,By=e,e.displayName="csharp",e.aliases=["dotnet","cs"];function e(t){(function(n){function r(V,P){return V.replace(/<<(\d+)>>/g,function(N,K){return"(?:"+P[+K]+")"})}function a(V,P,N){return RegExp(r(V,P),N||"")}function o(V,P){for(var N=0;N>/g,function(){return"(?:"+V+")"});return V.replace(/<>/g,"[^\\s\\S]")}var i={type:"bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",typeDeclaration:"class enum interface record struct",contextual:"add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",other:"abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield"};function s(V){return"\\b(?:"+V.trim().replace(/ /g,"|")+")\\b"}var l=s(i.typeDeclaration),c=RegExp(s(i.type+" "+i.typeDeclaration+" "+i.contextual+" "+i.other)),u=s(i.typeDeclaration+" "+i.contextual+" "+i.other),d=s(i.type+" "+i.typeDeclaration+" "+i.other),g=o(/<(?:[^<>;=+\-*/%&|^]|<>)*>/.source,2),m=o(/\((?:[^()]|<>)*\)/.source,2),b=/@?\b[A-Za-z_]\w*\b/.source,y=r(/<<0>>(?:\s*<<1>>)?/.source,[b,g]),w=r(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source,[u,y]),v=/\[\s*(?:,\s*)*\]/.source,h=r(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source,[w,v]),S=r(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[g,m,v]),E=r(/\(<<0>>+(?:,<<0>>+)+\)/.source,[S]),k=r(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source,[E,w,v]),x={keyword:c,punctuation:/[<>()?,.:[\]]/},C=/'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source,_=/"(?:\\.|[^\\"\r\n])*"/.source,R=/@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source;n.languages.csharp=n.languages.extend("clike",{string:[{pattern:a(/(^|[^$\\])<<0>>/.source,[R]),lookbehind:!0,greedy:!0},{pattern:a(/(^|[^@$\\])<<0>>/.source,[_]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:a(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source,[w]),lookbehind:!0,inside:x},{pattern:a(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source,[b,k]),lookbehind:!0,inside:x},{pattern:a(/(\busing\s+)<<0>>(?=\s*=)/.source,[b]),lookbehind:!0},{pattern:a(/(\b<<0>>\s+)<<1>>/.source,[l,y]),lookbehind:!0,inside:x},{pattern:a(/(\bcatch\s*\(\s*)<<0>>/.source,[w]),lookbehind:!0,inside:x},{pattern:a(/(\bwhere\s+)<<0>>/.source,[b]),lookbehind:!0},{pattern:a(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source,[h]),lookbehind:!0,inside:x},{pattern:a(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source,[k,d,b]),inside:x}],keyword:c,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),n.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),n.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:a(/([(,]\s*)<<0>>(?=\s*:)/.source,[b]),lookbehind:!0,alias:"punctuation"}}),n.languages.insertBefore("csharp","class-name",{namespace:{pattern:a(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source,[b]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:a(/(\b(?:default|sizeof|typeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source,[m]),lookbehind:!0,alias:"class-name",inside:x},"return-type":{pattern:a(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source,[k,w]),inside:x,alias:"class-name"},"constructor-invocation":{pattern:a(/(\bnew\s+)<<0>>(?=\s*[[({])/.source,[k]),lookbehind:!0,inside:x,alias:"class-name"},"generic-method":{pattern:a(/<<0>>\s*<<1>>(?=\s*\()/.source,[b,g]),inside:{function:a(/^<<0>>/.source,[b]),generic:{pattern:RegExp(g),alias:"class-name",inside:x}}},"type-list":{pattern:a(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source,[l,y,b,k,c.source,m,/\bnew\s*\(\s*\)/.source]),lookbehind:!0,inside:{"record-arguments":{pattern:a(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source,[y,m]),lookbehind:!0,greedy:!0,inside:n.languages.csharp},keyword:c,"class-name":{pattern:RegExp(k),greedy:!0,inside:x},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var T=_+"|"+C,L=r(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source,[T]),D=o(r(/[^"'/()]|<<0>>|\(<>*\)/.source,[L]),2),H=/\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source,z=r(/<<0>>(?:\s*\(<<1>>*\))?/.source,[w,D]);n.languages.insertBefore("csharp","class-name",{attribute:{pattern:a(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source,[H,z]),lookbehind:!0,greedy:!0,inside:{target:{pattern:a(/^<<0>>(?=\s*:)/.source,[H]),alias:"keyword"},"attribute-arguments":{pattern:a(/\(<<0>>*\)/.source,[D]),inside:n.languages.csharp},"class-name":{pattern:RegExp(w),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var M=/:[^}\r\n]+/.source,U=o(r(/[^"'/()]|<<0>>|\(<>*\)/.source,[L]),2),X=r(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[U,M]),j=o(r(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<>*\)/.source,[T]),2),O=r(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[j,M]);function A(V,P){return{interpolation:{pattern:a(/((?:^|[^{])(?:\{\{)*)<<0>>/.source,[V]),lookbehind:!0,inside:{"format-string":{pattern:a(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source,[P,M]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:n.languages.csharp}}},string:/[\s\S]+/}}n.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:a(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source,[X]),lookbehind:!0,greedy:!0,inside:A(X,U)},{pattern:a(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source,[O]),lookbehind:!0,greedy:!0,inside:A(O,j)}],char:{pattern:RegExp(C),greedy:!0}}),n.languages.dotnet=n.languages.cs=n.languages.csharp})(t)}return By}var Hy,II;function ube(){if(II)return Hy;II=1;var e=Ah();Hy=t,t.displayName="aspnet",t.aliases=[];function t(n){n.register(e),n.languages.aspnet=n.languages.extend("markup",{"page-directive":{pattern:/<%\s*@.*%>/,alias:"tag",inside:{"page-directive":{pattern:/<%\s*@\s*(?:Assembly|Control|Implements|Import|Master(?:Type)?|OutputCache|Page|PreviousPageType|Reference|Register)?|%>/i,alias:"tag"},rest:n.languages.markup.tag.inside}},directive:{pattern:/<%.*%>/,alias:"tag",inside:{directive:{pattern:/<%\s*?[$=%#:]{0,2}|%>/,alias:"tag"},rest:n.languages.csharp}}}),n.languages.aspnet.tag.pattern=/<(?!%)\/?[^\s>\/]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/,n.languages.insertBefore("inside","punctuation",{directive:n.languages.aspnet.directive},n.languages.aspnet.tag.inside["attr-value"]),n.languages.insertBefore("aspnet","comment",{"asp-comment":{pattern:/<%--[\s\S]*?--%>/,alias:["asp","comment"]}}),n.languages.insertBefore("aspnet",n.languages.javascript?"script":"tag",{"asp-script":{pattern:/(]*>)[\s\S]*?(?=<\/script>)/i,lookbehind:!0,alias:["asp","script"],inside:n.languages.csharp||{}}})}return Hy}var Vy,OI;function dbe(){if(OI)return Vy;OI=1,Vy=e,e.displayName="autohotkey",e.aliases=[];function e(t){t.languages.autohotkey={comment:[{pattern:/(^|\s);.*/,lookbehind:!0},{pattern:/(^[\t ]*)\/\*(?:[\r\n](?![ \t]*\*\/)|[^\r\n])*(?:[\r\n][ \t]*\*\/)?/m,lookbehind:!0,greedy:!0}],tag:{pattern:/^([ \t]*)[^\s,`":]+(?=:[ \t]*$)/m,lookbehind:!0},string:/"(?:[^"\n\r]|"")*"/,variable:/%\w+%/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/\?|\/\/?=?|:=|\|[=|]?|&[=&]?|\+[=+]?|-[=-]?|\*[=*]?|<(?:<=?|>|=)?|>>?=?|[.^!=~]=?|\b(?:AND|NOT|OR)\b/,boolean:/\b(?:false|true)\b/,selector:/\b(?:AutoTrim|BlockInput|Break|Click|ClipWait|Continue|Control|ControlClick|ControlFocus|ControlGet|ControlGetFocus|ControlGetPos|ControlGetText|ControlMove|ControlSend|ControlSendRaw|ControlSetText|CoordMode|Critical|DetectHiddenText|DetectHiddenWindows|Drive|DriveGet|DriveSpaceFree|EnvAdd|EnvDiv|EnvGet|EnvMult|EnvSet|EnvSub|EnvUpdate|Exit|ExitApp|FileAppend|FileCopy|FileCopyDir|FileCreateDir|FileCreateShortcut|FileDelete|FileEncoding|FileGetAttrib|FileGetShortcut|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileMoveDir|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileRemoveDir|FileSelectFile|FileSelectFolder|FileSetAttrib|FileSetTime|FormatTime|GetKeyState|Gosub|Goto|GroupActivate|GroupAdd|GroupClose|GroupDeactivate|Gui|GuiControl|GuiControlGet|Hotkey|ImageSearch|IniDelete|IniRead|IniWrite|Input|InputBox|KeyWait|ListHotkeys|ListLines|ListVars|Loop|Menu|MouseClick|MouseClickDrag|MouseGetPos|MouseMove|MsgBox|OnExit|OutputDebug|Pause|PixelGetColor|PixelSearch|PostMessage|Process|Progress|Random|RegDelete|RegRead|RegWrite|Reload|Repeat|Return|Run|RunAs|RunWait|Send|SendEvent|SendInput|SendMessage|SendMode|SendPlay|SendRaw|SetBatchLines|SetCapslockState|SetControlDelay|SetDefaultMouseSpeed|SetEnv|SetFormat|SetKeyDelay|SetMouseDelay|SetNumlockState|SetRegView|SetScrollLockState|SetStoreCapslockMode|SetTimer|SetTitleMatchMode|SetWinDelay|SetWorkingDir|Shutdown|Sleep|Sort|SoundBeep|SoundGet|SoundGetWaveVolume|SoundPlay|SoundSet|SoundSetWaveVolume|SplashImage|SplashTextOff|SplashTextOn|SplitPath|StatusBarGetText|StatusBarWait|StringCaseSense|StringGetPos|StringLeft|StringLen|StringLower|StringMid|StringReplace|StringRight|StringSplit|StringTrimLeft|StringTrimRight|StringUpper|Suspend|SysGet|Thread|ToolTip|Transform|TrayTip|URLDownloadToFile|WinActivate|WinActivateBottom|WinClose|WinGet|WinGetActiveStats|WinGetActiveTitle|WinGetClass|WinGetPos|WinGetText|WinGetTitle|WinHide|WinKill|WinMaximize|WinMenuSelectItem|WinMinimize|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinRestore|WinSet|WinSetTitle|WinShow|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive)\b/i,constant:/\b(?:a_ahkpath|a_ahkversion|a_appdata|a_appdatacommon|a_autotrim|a_batchlines|a_caretx|a_carety|a_computername|a_controldelay|a_cursor|a_dd|a_ddd|a_dddd|a_defaultmousespeed|a_desktop|a_desktopcommon|a_detecthiddentext|a_detecthiddenwindows|a_endchar|a_eventinfo|a_exitreason|a_fileencoding|a_formatfloat|a_formatinteger|a_gui|a_guicontrol|a_guicontrolevent|a_guievent|a_guiheight|a_guiwidth|a_guix|a_guiy|a_hour|a_iconfile|a_iconhidden|a_iconnumber|a_icontip|a_index|a_ipaddress1|a_ipaddress2|a_ipaddress3|a_ipaddress4|a_is64bitos|a_isadmin|a_iscompiled|a_iscritical|a_ispaused|a_issuspended|a_isunicode|a_keydelay|a_language|a_lasterror|a_linefile|a_linenumber|a_loopfield|a_loopfileattrib|a_loopfiledir|a_loopfileext|a_loopfilefullpath|a_loopfilelongpath|a_loopfilename|a_loopfileshortname|a_loopfileshortpath|a_loopfilesize|a_loopfilesizekb|a_loopfilesizemb|a_loopfiletimeaccessed|a_loopfiletimecreated|a_loopfiletimemodified|a_loopreadline|a_loopregkey|a_loopregname|a_loopregsubkey|a_loopregtimemodified|a_loopregtype|a_mday|a_min|a_mm|a_mmm|a_mmmm|a_mon|a_mousedelay|a_msec|a_mydocuments|a_now|a_nowutc|a_numbatchlines|a_ostype|a_osversion|a_priorhotkey|a_priorkey|a_programfiles|a_programs|a_programscommon|a_ptrsize|a_regview|a_screendpi|a_screenheight|a_screenwidth|a_scriptdir|a_scriptfullpath|a_scripthwnd|a_scriptname|a_sec|a_space|a_startmenu|a_startmenucommon|a_startup|a_startupcommon|a_stringcasesense|a_tab|a_temp|a_thisfunc|a_thishotkey|a_thislabel|a_thismenu|a_thismenuitem|a_thismenuitempos|a_tickcount|a_timeidle|a_timeidlephysical|a_timesincepriorhotkey|a_timesincethishotkey|a_titlematchmode|a_titlematchmodespeed|a_username|a_wday|a_windelay|a_windir|a_workingdir|a_yday|a_year|a_yweek|a_yyyy|clipboard|clipboardall|comspec|errorlevel|programfiles)\b/i,builtin:/\b(?:abs|acos|asc|asin|atan|ceil|chr|class|comobjactive|comobjarray|comobjconnect|comobjcreate|comobjerror|comobjflags|comobjget|comobjquery|comobjtype|comobjvalue|cos|dllcall|exp|fileexist|Fileopen|floor|format|il_add|il_create|il_destroy|instr|isfunc|islabel|IsObject|ln|log|ltrim|lv_add|lv_delete|lv_deletecol|lv_getcount|lv_getnext|lv_gettext|lv_insert|lv_insertcol|lv_modify|lv_modifycol|lv_setimagelist|mod|numget|numput|onmessage|regexmatch|regexreplace|registercallback|round|rtrim|sb_seticon|sb_setparts|sb_settext|sin|sqrt|strlen|strreplace|strsplit|substr|tan|tv_add|tv_delete|tv_get|tv_getchild|tv_getcount|tv_getnext|tv_getparent|tv_getprev|tv_getselection|tv_gettext|tv_modify|varsetcapacity|winactive|winexist|__Call|__Get|__New|__Set)\b/i,symbol:/\b(?:alt|altdown|altup|appskey|backspace|browser_back|browser_favorites|browser_forward|browser_home|browser_refresh|browser_search|browser_stop|bs|capslock|ctrl|ctrlbreak|ctrldown|ctrlup|del|delete|down|end|enter|esc|escape|f1|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f2|f20|f21|f22|f23|f24|f3|f4|f5|f6|f7|f8|f9|home|ins|insert|joy1|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy2|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy3|joy30|joy31|joy32|joy4|joy5|joy6|joy7|joy8|joy9|joyaxes|joybuttons|joyinfo|joyname|joypov|joyr|joyu|joyv|joyx|joyy|joyz|lalt|launch_app1|launch_app2|launch_mail|launch_media|lbutton|lcontrol|lctrl|left|lshift|lwin|lwindown|lwinup|mbutton|media_next|media_play_pause|media_prev|media_stop|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadadd|numpadclear|numpaddel|numpaddiv|numpaddot|numpaddown|numpadend|numpadenter|numpadhome|numpadins|numpadleft|numpadmult|numpadpgdn|numpadpgup|numpadright|numpadsub|numpadup|pgdn|pgup|printscreen|ralt|rbutton|rcontrol|rctrl|right|rshift|rwin|rwindown|rwinup|scrolllock|shift|shiftdown|shiftup|space|tab|up|volume_down|volume_mute|volume_up|wheeldown|wheelleft|wheelright|wheelup|xbutton1|xbutton2)\b/i,important:/#\b(?:AllowSameLineComments|ClipboardTimeout|CommentFlag|DerefChar|ErrorStdOut|EscapeChar|HotkeyInterval|HotkeyModifierTimeout|Hotstring|If|IfTimeout|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Include|IncludeAgain|InputLevel|InstallKeybdHook|InstallMouseHook|KeyHistory|MaxHotkeysPerInterval|MaxMem|MaxThreads|MaxThreadsBuffer|MaxThreadsPerHotkey|MenuMaskKey|NoEnv|NoTrayIcon|Persistent|SingleInstance|UseHook|Warn|WinActivateForce)\b/i,keyword:/\b(?:Abort|AboveNormal|Add|ahk_class|ahk_exe|ahk_group|ahk_id|ahk_pid|All|Alnum|Alpha|AltSubmit|AltTab|AltTabAndMenu|AltTabMenu|AltTabMenuDismiss|AlwaysOnTop|AutoSize|Background|BackgroundTrans|BelowNormal|between|BitAnd|BitNot|BitOr|BitShiftLeft|BitShiftRight|BitXOr|Bold|Border|Button|ByRef|Catch|Checkbox|Checked|CheckedGray|Choose|ChooseString|Close|Color|ComboBox|Contains|ControlList|Count|Date|DateTime|Days|DDL|Default|DeleteAll|Delimiter|Deref|Destroy|Digit|Disable|Disabled|DropDownList|Edit|Eject|Else|Enable|Enabled|Error|Exist|Expand|ExStyle|FileSystem|Finally|First|Flash|Float|FloatFast|Focus|Font|for|global|Grid|Group|GroupBox|GuiClose|GuiContextMenu|GuiDropFiles|GuiEscape|GuiSize|Hdr|Hidden|Hide|High|HKCC|HKCR|HKCU|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_LOCAL_MACHINE|HKEY_USERS|HKLM|HKU|Hours|HScroll|Icon|IconSmall|ID|IDLast|If|IfEqual|IfExist|IfGreater|IfGreaterOrEqual|IfInString|IfLess|IfLessOrEqual|IfMsgBox|IfNotEqual|IfNotExist|IfNotInString|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Ignore|ImageList|in|Integer|IntegerFast|Interrupt|is|italic|Join|Label|LastFound|LastFoundExist|Limit|Lines|List|ListBox|ListView|local|Lock|Logoff|Low|Lower|Lowercase|MainWindow|Margin|Maximize|MaximizeBox|MaxSize|Minimize|MinimizeBox|MinMax|MinSize|Minutes|MonthCal|Mouse|Move|Multi|NA|No|NoActivate|NoDefault|NoHide|NoIcon|NoMainWindow|norm|Normal|NoSort|NoSortHdr|NoStandard|Not|NoTab|NoTimers|Number|Off|Ok|On|OwnDialogs|Owner|Parse|Password|Picture|Pixel|Pos|Pow|Priority|ProcessName|Radio|Range|Read|ReadOnly|Realtime|Redraw|Region|REG_BINARY|REG_DWORD|REG_EXPAND_SZ|REG_MULTI_SZ|REG_SZ|Relative|Rename|Report|Resize|Restore|Retry|RGB|Screen|Seconds|Section|Serial|SetLabel|ShiftAltTab|Show|Single|Slider|SortDesc|Standard|static|Status|StatusBar|StatusCD|strike|Style|Submit|SysMenu|Tab2|TabStop|Text|Theme|Throw|Tile|ToggleCheck|ToggleEnable|ToolWindow|Top|Topmost|TransColor|Transparent|Tray|TreeView|Try|TryAgain|Type|UnCheck|underline|Unicode|Unlock|Until|UpDown|Upper|Uppercase|UseErrorLevel|Vis|VisFirst|Visible|VScroll|Wait|WaitClose|WantCtrlA|WantF2|WantReturn|While|Wrap|Xdigit|xm|xp|xs|Yes|ym|yp|ys)\b/i,function:/[^(); \t,\n+*\-=?>:\\\/<&%\[\]]+(?=\()/,punctuation:/[{}[\]():,]/}}return Vy}var qy,DI;function fbe(){if(DI)return qy;DI=1,qy=e,e.displayName="autoit",e.aliases=[];function e(t){t.languages.autoit={comment:[/;.*/,{pattern:/(^[\t ]*)#(?:comments-start|cs)[\s\S]*?^[ \t]*#(?:ce|comments-end)/m,lookbehind:!0}],url:{pattern:/(^[\t ]*#include\s+)(?:<[^\r\n>]+>|"[^\r\n"]+")/m,lookbehind:!0},string:{pattern:/(["'])(?:\1\1|(?!\1)[^\r\n])*\1/,greedy:!0,inside:{variable:/([%$@])\w+\1/}},directive:{pattern:/(^[\t ]*)#[\w-]+/m,lookbehind:!0,alias:"keyword"},function:/\b\w+(?=\()/,variable:/[$@]\w+/,keyword:/\b(?:Case|Const|Continue(?:Case|Loop)|Default|Dim|Do|Else(?:If)?|End(?:Func|If|Select|Switch|With)|Enum|Exit(?:Loop)?|For|Func|Global|If|In|Local|Next|Null|ReDim|Select|Static|Step|Switch|Then|To|Until|Volatile|WEnd|While|With)\b/i,number:/\b(?:0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,boolean:/\b(?:False|True)\b/i,operator:/<[=>]?|[-+*\/=&>]=?|[?^]|\b(?:And|Not|Or)\b/i,punctuation:/[\[\]().,:]/}}return qy}var Gy,LI;function pbe(){if(LI)return Gy;LI=1,Gy=e,e.displayName="avisynth",e.aliases=["avs"];function e(t){(function(n){function r(u,d){return u.replace(/<<(\d+)>>/g,function(g,m){return d[+m]})}function a(u,d,g){return RegExp(r(u,d),g||"")}var o=/bool|clip|float|int|string|val/.source,i=[/is(?:bool|clip|float|int|string)|defined|(?:(?:internal)?function|var)?exists?/.source,/apply|assert|default|eval|import|nop|select|undefined/.source,/opt_(?:allowfloataudio|avipadscanlines|dwchannelmask|enable_(?:b64a|planartopackedrgb|v210|y3_10_10|y3_10_16)|usewaveextensible|vdubplanarhack)|set(?:cachemode|maxcpu|memorymax|planarlegacyalignment|workingdir)/.source,/hex(?:value)?|value/.source,/abs|ceil|continued(?:denominator|numerator)?|exp|floor|fmod|frac|log(?:10)?|max|min|muldiv|pi|pow|rand|round|sign|spline|sqrt/.source,/a?sinh?|a?cosh?|a?tan[2h]?/.source,/(?:bit(?:and|not|x?or|[lr]?shift[aslu]?|sh[lr]|sa[lr]|[lr]rotatel?|ro[rl]|te?st|set(?:count)?|cl(?:ea)?r|ch(?:an)?ge?))/.source,/average(?:[bgr]|chroma[uv]|luma)|(?:[rgb]|chroma[uv]|luma|rgb|[yuv](?=difference(?:fromprevious|tonext)))difference(?:fromprevious|tonext)?|[yuvrgb]plane(?:median|min|max|minmaxdifference)/.source,/getprocessinfo|logmsg|script(?:dir(?:utf8)?|file(?:utf8)?|name(?:utf8)?)|setlogparams/.source,/chr|(?:fill|find|left|mid|replace|rev|right)str|format|[lu]case|ord|str(?:cmpi?|fromutf8|len|toutf8)|time|trim(?:all|left|right)/.source,/isversionorgreater|version(?:number|string)/.source,/buildpixeltype|colorspacenametopixeltype/.source,/addautoloaddir|on(?:cpu|cuda)|prefetch|setfiltermtmode/.source].join("|"),s=[/has(?:audio|video)/.source,/height|width/.source,/frame(?:count|rate)|framerate(?:denominator|numerator)/.source,/getparity|is(?:field|frame)based/.source,/bitspercomponent|componentsize|hasalpha|is(?:planar(?:rgba?)?|interleaved|rgb(?:24|32|48|64)?|y(?:8|u(?:va?|y2))?|yv(?:12|16|24|411)|420|422|444|packedrgb)|numcomponents|pixeltype/.source,/audio(?:bits|channels|duration|length(?:[fs]|hi|lo)?|rate)|isaudio(?:float|int)/.source].join("|"),l=[/avi(?:file)?source|directshowsource|image(?:reader|source|sourceanim)|opendmlsource|segmented(?:avisource|directshowsource)|wavsource/.source,/coloryuv|convertbacktoyuy2|convertto(?:RGB(?:24|32|48|64)|(?:planar)?RGBA?|Y8?|YV(?:12|16|24|411)|YUVA?(?:411|420|422|444)|YUY2)|fixluminance|gr[ae]yscale|invert|levels|limiter|mergea?rgb|merge(?:chroma|luma)|rgbadjust|show(?:alpha|blue|green|red)|swapuv|tweak|[uv]toy8?|ytouv/.source,/(?:colorkey|reset)mask|layer|mask(?:hs)?|merge|overlay|subtract/.source,/addborders|(?:bicubic|bilinear|blackman|gauss|lanczos4|lanczos|point|sinc|spline(?:16|36|64))resize|crop(?:bottom)?|flip(?:horizontal|vertical)|(?:horizontal|vertical)?reduceby2|letterbox|skewrows|turn(?:180|left|right)/.source,/blur|fixbrokenchromaupsampling|generalconvolution|(?:spatial|temporal)soften|sharpen/.source,/trim|(?:un)?alignedsplice|(?:assume|assumescaled|change|convert)FPS|(?:delete|duplicate)frame|dissolve|fade(?:in|io|out)[02]?|freezeframe|interleave|loop|reverse|select(?:even|odd|(?:range)?every)/.source,/assume[bt]ff|assume(?:field|frame)based|bob|complementparity|doubleweave|peculiarblend|pulldown|separate(?:columns|fields|rows)|swapfields|weave(?:columns|rows)?/.source,/amplify(?:db)?|assumesamplerate|audiodub(?:ex)?|audiotrim|convertaudioto(?:(?:8|16|24|32)bit|float)|converttomono|delayaudio|ensurevbrmp3sync|get(?:left|right)?channel|kill(?:audio|video)|mergechannels|mixaudio|monotostereo|normalize|resampleaudio|ssrc|supereq|timestretch/.source,/animate|applyrange|conditional(?:filter|reader|select)|frameevaluate|scriptclip|tcp(?:server|source)|writefile(?:end|if|start)?/.source,/imagewriter/.source,/blackness|blankclip|colorbars(?:hd)?|compare|dumpfiltergraph|echo|histogram|info|messageclip|preroll|setgraphanalysis|show(?:framenumber|smpte|time)|showfiveversions|stack(?:horizontal|vertical)|subtitle|tone|version/.source].join("|"),c=[i,s,l].join("|");n.languages.avisynth={comment:[{pattern:/(^|[^\\])\[\*(?:[^\[*]|\[(?!\*)|\*(?!\])|\[\*(?:[^\[*]|\[(?!\*)|\*(?!\]))*\*\])*\*\]/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0,greedy:!0}],argument:{pattern:a(/\b(?:<<0>>)\s+("?)\w+\1/.source,[o],"i"),inside:{keyword:/^\w+/}},"argument-label":{pattern:/([,(][\s\\]*)\w+\s*=(?!=)/,lookbehind:!0,inside:{"argument-name":{pattern:/^\w+/,alias:"punctuation"},punctuation:/=$/}},string:[{pattern:/"""[\s\S]*?"""/,greedy:!0},{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0,inside:{constant:{pattern:/\b(?:DEFAULT_MT_MODE|(?:MAINSCRIPT|PROGRAM|SCRIPT)DIR|(?:MACHINE|USER)_(?:CLASSIC|PLUS)_PLUGINS)\b/}}}],variable:/\b(?:last)\b/i,boolean:/\b(?:false|no|true|yes)\b/i,keyword:/\b(?:catch|else|for|function|global|if|return|try|while|__END__)\b/i,constant:/\bMT_(?:MULTI_INSTANCE|NICE_FILTER|SERIALIZED|SPECIAL_MT)\b/,"builtin-function":{pattern:a(/\b(?:<<0>>)\b/.source,[c],"i"),alias:"function"},"type-cast":{pattern:a(/\b(?:<<0>>)(?=\s*\()/.source,[o],"i"),alias:"keyword"},function:{pattern:/\b[a-z_]\w*(?=\s*\()|(\.)[a-z_]\w*\b/i,lookbehind:!0},"line-continuation":{pattern:/(^[ \t]*)\\|\\(?=[ \t]*$)/m,lookbehind:!0,alias:"punctuation"},number:/\B\$(?:[\da-f]{6}|[\da-f]{8})\b|(?:(?:\b|\B-)\d+(?:\.\d*)?\b|\B\.\d+\b)/i,operator:/\+\+?|[!=<>]=?|&&|\|\||[?:*/%-]/,punctuation:/[{}\[\]();,.]/},n.languages.avs=n.languages.avisynth})(t)}return Gy}var Wy,MI;function gbe(){if(MI)return Wy;MI=1,Wy=e,e.displayName="avroIdl",e.aliases=[];function e(t){t.languages["avro-idl"]={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},string:{pattern:/(^|[^\\])"(?:[^\r\n"\\]|\\.)*"/,lookbehind:!0,greedy:!0},annotation:{pattern:/@(?:[$\w.-]|`[^\r\n`]+`)+/,greedy:!0,alias:"function"},"function-identifier":{pattern:/`[^\r\n`]+`(?=\s*\()/,greedy:!0,alias:"function"},identifier:{pattern:/`[^\r\n`]+`/,greedy:!0},"class-name":{pattern:/(\b(?:enum|error|protocol|record|throws)\b\s+)[$\w]+/,lookbehind:!0,greedy:!0},keyword:/\b(?:array|boolean|bytes|date|decimal|double|enum|error|false|fixed|float|idl|import|int|local_timestamp_ms|long|map|null|oneway|protocol|record|schema|string|throws|time_ms|timestamp_ms|true|union|uuid|void)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:[{pattern:/(^|[^\w.])-?(?:(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|0x(?:[a-f0-9]+(?:\.[a-f0-9]*)?|\.[a-f0-9]+)(?:p[+-]?\d+)?)[dfl]?(?![\w.])/i,lookbehind:!0},/-?\b(?:Infinity|NaN)\b/],operator:/=/,punctuation:/[()\[\]{}<>.:,;-]/},t.languages.avdl=t.languages["avro-idl"]}return Wy}var Ky,PI;function az(){if(PI)return Ky;PI=1,Ky=e,e.displayName="bash",e.aliases=["shell"];function e(t){(function(n){var r="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",a={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},o={bash:a,environment:{pattern:RegExp("\\$"+r),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+r),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};n.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+r),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:o},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:a}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:o},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:o.entity}}],environment:{pattern:RegExp("\\$?"+r),alias:"constant"},variable:o.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},a.inside=n.languages.bash;for(var i=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],s=o.variable[1].inside,l=0;l?^\w +\-.])*"/,greedy:!0},number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,keyword:/\b(?:AS|BEEP|BLOAD|BSAVE|CALL(?: ABSOLUTE)?|CASE|CHAIN|CHDIR|CLEAR|CLOSE|CLS|COM|COMMON|CONST|DATA|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DIM|DO|DOUBLE|ELSE|ELSEIF|END|ENVIRON|ERASE|ERROR|EXIT|FIELD|FILES|FOR|FUNCTION|GET|GOSUB|GOTO|IF|INPUT|INTEGER|IOCTL|KEY|KILL|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|MKDIR|NAME|NEXT|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPTION BASE|OUT|POKE|PUT|READ|REDIM|REM|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SELECT CASE|SHARED|SHELL|SINGLE|SLEEP|STATIC|STEP|STOP|STRING|SUB|SWAP|SYSTEM|THEN|TIMER|TO|TROFF|TRON|TYPE|UNLOCK|UNTIL|USING|VIEW PRINT|WAIT|WEND|WHILE|WRITE)(?:\$|\b)/i,function:/\b(?:ABS|ACCESS|ACOS|ANGLE|AREA|ARITHMETIC|ARRAY|ASIN|ASK|AT|ATN|BASE|BEGIN|BREAK|CAUSE|CEIL|CHR|CLIP|COLLATE|COLOR|CON|COS|COSH|COT|CSC|DATE|DATUM|DEBUG|DECIMAL|DEF|DEG|DEGREES|DELETE|DET|DEVICE|DISPLAY|DOT|ELAPSED|EPS|ERASABLE|EXLINE|EXP|EXTERNAL|EXTYPE|FILETYPE|FIXED|FP|GO|GRAPH|HANDLER|IDN|IMAGE|IN|INT|INTERNAL|IP|IS|KEYED|LBOUND|LCASE|LEFT|LEN|LENGTH|LET|LINE|LINES|LOG|LOG10|LOG2|LTRIM|MARGIN|MAT|MAX|MAXNUM|MID|MIN|MISSING|MOD|NATIVE|NUL|NUMERIC|OF|OPTION|ORD|ORGANIZATION|OUTIN|OUTPUT|PI|POINT|POINTER|POINTS|POS|PRINT|PROGRAM|PROMPT|RAD|RADIANS|RANDOMIZE|RECORD|RECSIZE|RECTYPE|RELATIVE|REMAINDER|REPEAT|REST|RETRY|REWRITE|RIGHT|RND|ROUND|RTRIM|SAME|SEC|SELECT|SEQUENTIAL|SET|SETTER|SGN|SIN|SINH|SIZE|SKIP|SQR|STANDARD|STATUS|STR|STREAM|STYLE|TAB|TAN|TANH|TEMPLATE|TEXT|THERE|TIME|TIMEOUT|TRACE|TRANSFORM|TRUNCATE|UBOUND|UCASE|USE|VAL|VARIABLE|VIEWPORT|WHEN|WINDOW|WITH|ZER|ZONEWIDTH)(?:\$|\b)/i,operator:/<[=>]?|>=?|[+\-*\/^=&]|\b(?:AND|EQV|IMP|NOT|OR|XOR)\b/i,punctuation:/[,;:()]/}}return Yy}var Zy,FI;function mbe(){if(FI)return Zy;FI=1,Zy=e,e.displayName="batch",e.aliases=[];function e(t){(function(n){var r=/%%?[~:\w]+%?|!\S+!/,a={pattern:/\/[a-z?]+(?=[ :]|$):?|-[a-z]\b|--[a-z-]+\b/im,alias:"attr-name",inside:{punctuation:/:/}},o=/"(?:[\\"]"|[^"])*"(?!")/,i=/(?:\b|-)\d+\b/;n.languages.batch={comment:[/^::.*/m,{pattern:/((?:^|[&(])[ \t]*)rem\b(?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0}],label:{pattern:/^:.*/m,alias:"property"},command:[{pattern:/((?:^|[&(])[ \t]*)for(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* \S+ in \([^)]+\) do/im,lookbehind:!0,inside:{keyword:/\b(?:do|in)\b|^for\b/i,string:o,parameter:a,variable:r,number:i,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*)if(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:not )?(?:cmdextversion \d+|defined \w+|errorlevel \d+|exist \S+|(?:"[^"]*"|(?!")(?:(?!==)\S)+)?(?:==| (?:equ|geq|gtr|leq|lss|neq) )(?:"[^"]*"|[^\s"]\S*))/im,lookbehind:!0,inside:{keyword:/\b(?:cmdextversion|defined|errorlevel|exist|not)\b|^if\b/i,string:o,parameter:a,variable:r,number:i,operator:/\^|==|\b(?:equ|geq|gtr|leq|lss|neq)\b/i}},{pattern:/((?:^|[&()])[ \t]*)else\b/im,lookbehind:!0,inside:{keyword:/^else\b/i}},{pattern:/((?:^|[&(])[ \t]*)set(?: \/[a-z](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0,inside:{keyword:/^set\b/i,string:o,parameter:a,variable:[r,/\w+(?=(?:[*\/%+\-&^|]|<<|>>)?=)/],number:i,operator:/[*\/%+\-&^|]=?|<<=?|>>=?|[!~_=]/,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*@?)\w+\b(?:"(?:[\\"]"|[^"])*"(?!")|[^"^&)\r\n]|\^(?:\r\n|[\s\S]))*/m,lookbehind:!0,inside:{keyword:/^\w+\b/,string:o,parameter:a,label:{pattern:/(^\s*):\S+/m,lookbehind:!0,alias:"property"},variable:r,number:i,operator:/\^/}}],operator:/[&@]/,punctuation:/[()']/}})(t)}return Zy}var Xy,jI;function hbe(){if(jI)return Xy;jI=1,Xy=e,e.displayName="bbcode",e.aliases=["shortcode"];function e(t){t.languages.bbcode={tag:{pattern:/\[\/?[^\s=\]]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+))?(?:\s+[^\s=\]]+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+))*\s*\]/,inside:{tag:{pattern:/^\[\/?[^\s=\]]+/,inside:{punctuation:/^\[\/?/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+)/,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\]/,"attr-name":/[^\s=\]]+/}}},t.languages.shortcode=t.languages.bbcode}return Xy}var Qy,zI;function bbe(){if(zI)return Qy;zI=1,Qy=e,e.displayName="bicep",e.aliases=[];function e(t){t.languages.bicep={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],property:[{pattern:/([\r\n][ \t]*)[a-z_]\w*(?=[ \t]*:)/i,lookbehind:!0},{pattern:/([\r\n][ \t]*)'(?:\\.|\$(?!\{)|[^'\\\r\n$])*'(?=[ \t]*:)/,lookbehind:!0,greedy:!0}],string:[{pattern:/'''[^'][\s\S]*?'''/,greedy:!0},{pattern:/(^|[^\\'])'(?:\\.|\$(?!\{)|[^'\\\r\n$])*'/,lookbehind:!0,greedy:!0}],"interpolated-string":{pattern:/(^|[^\\'])'(?:\\.|\$(?:(?!\{)|\{[^{}\r\n]*\})|[^'\\\r\n$])*'/,lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/\$\{[^{}\r\n]*\}/,inside:{expression:{pattern:/(^\$\{)[\s\S]+(?=\}$)/,lookbehind:!0},punctuation:/^\$\{|\}$/}},string:/[\s\S]+/}},datatype:{pattern:/(\b(?:output|param)\b[ \t]+\w+[ \t]+)\w+\b/,lookbehind:!0,alias:"class-name"},boolean:/\b(?:false|true)\b/,keyword:/\b(?:existing|for|if|in|module|null|output|param|resource|targetScope|var)\b/,decorator:/@\w+\b/,function:/\b[a-z_]\w*(?=[ \t]*\()/i,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/,punctuation:/[{}[\];(),.:]/},t.languages.bicep["interpolated-string"].inside.interpolation.inside.expression.inside=t.languages.bicep}return Qy}var Jy,UI;function ybe(){if(UI)return Jy;UI=1,Jy=e,e.displayName="birb",e.aliases=[];function e(t){t.languages.birb=t.languages.extend("clike",{string:{pattern:/r?("|')(?:\\.|(?!\1)[^\\])*\1/,greedy:!0},"class-name":[/\b[A-Z](?:[\d_]*[a-zA-Z]\w*)?\b/,/\b(?:[A-Z]\w*|(?!(?:var|void)\b)[a-z]\w*)(?=\s+\w+\s*[;,=()])/],keyword:/\b(?:assert|break|case|class|const|default|else|enum|final|follows|for|grab|if|nest|new|next|noSeeb|return|static|switch|throw|var|void|while)\b/,operator:/\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?|:/,variable:/\b[a-z_]\w*\b/}),t.languages.insertBefore("birb","function",{metadata:{pattern:/<\w+>/,greedy:!0,alias:"symbol"}})}return Jy}var ev,BI;function vbe(){if(BI)return ev;BI=1;var e=Ws();ev=t,t.displayName="bison",t.aliases=[];function t(n){n.register(e),n.languages.bison=n.languages.extend("c",{}),n.languages.insertBefore("bison","comment",{bison:{pattern:/^(?:[^%]|%(?!%))*%%[\s\S]*?%%/,inside:{c:{pattern:/%\{[\s\S]*?%\}|\{(?:\{[^}]*\}|[^{}])*\}/,inside:{delimiter:{pattern:/^%?\{|%?\}$/,alias:"punctuation"},"bison-variable":{pattern:/[$@](?:<[^\s>]+>)?[\w$]+/,alias:"variable",inside:{punctuation:/<|>/}},rest:n.languages.c}},comment:n.languages.c.comment,string:n.languages.c.string,property:/\S+(?=:)/,keyword:/%\w+/,number:{pattern:/(^|[^@])\b(?:0x[\da-f]+|\d+)/i,lookbehind:!0},punctuation:/%[%?]|[|:;\[\]<>]/}}})}return ev}var tv,HI;function Sbe(){if(HI)return tv;HI=1,tv=e,e.displayName="bnf",e.aliases=["rbnf"];function e(t){t.languages.bnf={string:{pattern:/"[^\r\n"]*"|'[^\r\n']*'/},definition:{pattern:/<[^<>\r\n\t]+>(?=\s*::=)/,alias:["rule","keyword"],inside:{punctuation:/^<|>$/}},rule:{pattern:/<[^<>\r\n\t]+>/,inside:{punctuation:/^<|>$/}},operator:/::=|[|()[\]{}*+?]|\.{3}/},t.languages.rbnf=t.languages.bnf}return tv}var nv,VI;function wbe(){if(VI)return nv;VI=1,nv=e,e.displayName="brainfuck",e.aliases=[];function e(t){t.languages.brainfuck={pointer:{pattern:/<|>/,alias:"keyword"},increment:{pattern:/\+/,alias:"inserted"},decrement:{pattern:/-/,alias:"deleted"},branching:{pattern:/\[|\]/,alias:"important"},operator:/[.,]/,comment:/\S+/}}return nv}var rv,qI;function Ebe(){if(qI)return rv;qI=1,rv=e,e.displayName="brightscript",e.aliases=[];function e(t){t.languages.brightscript={comment:/(?:\brem|').*/i,"directive-statement":{pattern:/(^[\t ]*)#(?:const|else(?:[\t ]+if)?|end[\t ]+if|error|if).*/im,lookbehind:!0,alias:"property",inside:{"error-message":{pattern:/(^#error).+/,lookbehind:!0},directive:{pattern:/^#(?:const|else(?:[\t ]+if)?|end[\t ]+if|error|if)/,alias:"keyword"},expression:{pattern:/[\s\S]+/,inside:null}}},property:{pattern:/([\r\n{,][\t ]*)(?:(?!\d)\w+|"(?:[^"\r\n]|"")*"(?!"))(?=[ \t]*:)/,lookbehind:!0,greedy:!0},string:{pattern:/"(?:[^"\r\n]|"")*"(?!")/,greedy:!0},"class-name":{pattern:/(\bAs[\t ]+)\w+/i,lookbehind:!0},keyword:/\b(?:As|Dim|Each|Else|Elseif|End|Exit|For|Function|Goto|If|In|Print|Return|Step|Stop|Sub|Then|To|While)\b/i,boolean:/\b(?:false|true)\b/i,function:/\b(?!\d)\w+(?=[\t ]*\()/,number:/(?:\b\d+(?:\.\d+)?(?:[ed][+-]\d+)?|&h[a-f\d]+)\b[%&!#]?/i,operator:/--|\+\+|>>=?|<<=?|<>|[-+*/\\<>]=?|[:^=?]|\b(?:and|mod|not|or)\b/i,punctuation:/[.,;()[\]{}]/,constant:/\b(?:LINE_NUM)\b/i},t.languages.brightscript["directive-statement"].inside.expression.inside=t.languages.brightscript}return rv}var av,GI;function xbe(){if(GI)return av;GI=1,av=e,e.displayName="bro",e.aliases=[];function e(t){t.languages.bro={comment:{pattern:/(^|[^\\$])#.*/,lookbehind:!0,inside:{italic:/\b(?:FIXME|TODO|XXX)\b/}},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},boolean:/\b[TF]\b/,function:{pattern:/(\b(?:event|function|hook)[ \t]+)\w+(?:::\w+)?/,lookbehind:!0},builtin:/(?:@(?:load(?:-(?:plugin|sigs))?|unload|prefixes|ifn?def|else|(?:end)?if|DIR|FILENAME))|(?:&?(?:add_func|create_expire|default|delete_func|encrypt|error_handler|expire_func|group|log|mergeable|optional|persistent|priority|raw_output|read_expire|redef|rotate_interval|rotate_size|synchronized|type_column|write_expire))/,constant:{pattern:/(\bconst[ \t]+)\w+/i,lookbehind:!0},keyword:/\b(?:add|addr|alarm|any|bool|break|const|continue|count|delete|double|else|enum|event|export|file|for|function|global|hook|if|in|int|interval|local|module|next|of|opaque|pattern|port|print|record|return|schedule|set|string|subnet|table|time|timeout|using|vector|when)\b/,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&|\|\|?|\?|\*|\/|~|\^|%/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,punctuation:/[{}[\];(),.:]/}}return av}var ov,WI;function kbe(){if(WI)return ov;WI=1,ov=e,e.displayName="bsl",e.aliases=[];function e(t){t.languages.bsl={comment:/\/\/.*/,string:[{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},{pattern:/'(?:[^'\r\n\\]|\\.)*'/}],keyword:[{pattern:/(^|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:пока|для|новый|прервать|попытка|исключение|вызватьисключение|иначе|конецпопытки|неопределено|функция|перем|возврат|конецфункции|если|иначеесли|процедура|конецпроцедуры|тогда|знач|экспорт|конецесли|из|каждого|истина|ложь|по|цикл|конеццикла|выполнить)(?![\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])/i,lookbehind:!0},{pattern:/\b(?:break|do|each|else|elseif|enddo|endfunction|endif|endprocedure|endtry|except|execute|export|false|for|function|if|in|new|null|procedure|raise|return|then|to|true|try|undefined|val|var|while)\b/i}],number:{pattern:/(^(?=\d)|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?/i,lookbehind:!0},operator:[/[<>+\-*/]=?|[%=]/,{pattern:/(^|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:и|или|не)(?![\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])/i,lookbehind:!0},{pattern:/\b(?:and|not|or)\b/i}],punctuation:/\(\.|\.\)|[()\[\]:;,.]/,directive:[{pattern:/^([ \t]*)&.*/m,lookbehind:!0,greedy:!0,alias:"important"},{pattern:/^([ \t]*)#.*/gm,lookbehind:!0,greedy:!0,alias:"important"}]},t.languages.oscript=t.languages.bsl}return ov}var iv,KI;function Cbe(){if(KI)return iv;KI=1,iv=e,e.displayName="cfscript",e.aliases=[];function e(t){t.languages.cfscript=t.languages.extend("clike",{comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,inside:{annotation:{pattern:/(?:^|[^.])@[\w\.]+/,alias:"punctuation"}}},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],keyword:/\b(?:abstract|break|catch|component|continue|default|do|else|extends|final|finally|for|function|if|in|include|package|private|property|public|remote|required|rethrow|return|static|switch|throw|try|var|while|xml)\b(?!\s*=)/,operator:[/\+\+|--|&&|\|\||::|=>|[!=]==|<=?|>=?|[-+*/%&|^!=<>]=?|\?(?:\.|:)?|[?:]/,/\b(?:and|contains|eq|equal|eqv|gt|gte|imp|is|lt|lte|mod|not|or|xor)\b/],scope:{pattern:/\b(?:application|arguments|cgi|client|cookie|local|session|super|this|variables)\b/,alias:"global"},type:{pattern:/\b(?:any|array|binary|boolean|date|guid|numeric|query|string|struct|uuid|void|xml)\b/,alias:"builtin"}}),t.languages.insertBefore("cfscript","keyword",{"function-variable":{pattern:/[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"}}),delete t.languages.cfscript["class-name"],t.languages.cfc=t.languages.cfscript}return iv}var sv,YI;function _be(){if(YI)return sv;YI=1;var e=RA();sv=t,t.displayName="chaiscript",t.aliases=[];function t(n){n.register(e),n.languages.chaiscript=n.languages.extend("clike",{string:{pattern:/(^|[^\\])'(?:[^'\\]|\\[\s\S])*'/,lookbehind:!0,greedy:!0},"class-name":[{pattern:/(\bclass\s+)\w+/,lookbehind:!0},{pattern:/(\b(?:attr|def)\s+)\w+(?=\s*::)/,lookbehind:!0}],keyword:/\b(?:attr|auto|break|case|catch|class|continue|def|default|else|finally|for|fun|global|if|return|switch|this|try|var|while)\b/,number:[n.languages.cpp.number,/\b(?:Infinity|NaN)\b/],operator:/>>=?|<<=?|\|\||&&|:[:=]?|--|\+\+|[=!<>+\-*/%|&^]=?|[?~]|`[^`\r\n]{1,4}`/}),n.languages.insertBefore("chaiscript","operator",{"parameter-type":{pattern:/([,(]\s*)\w+(?=\s+\w)/,lookbehind:!0,alias:"class-name"}}),n.languages.insertBefore("chaiscript","string",{"string-interpolation":{pattern:/(^|[^\\])"(?:[^"$\\]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*"/,lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\}/,lookbehind:!0,inside:{"interpolation-expression":{pattern:/(^\$\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:n.languages.chaiscript},"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"}}},string:/[\s\S]+/}}})}return sv}var lv,ZI;function Abe(){if(ZI)return lv;ZI=1,lv=e,e.displayName="cil",e.aliases=[];function e(t){t.languages.cil={comment:/\/\/.*/,string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},directive:{pattern:/(^|\W)\.[a-z]+(?=\s)/,lookbehind:!0,alias:"class-name"},variable:/\[[\w\.]+\]/,keyword:/\b(?:abstract|ansi|assembly|auto|autochar|beforefieldinit|bool|bstr|byvalstr|catch|char|cil|class|currency|date|decimal|default|enum|error|explicit|extends|extern|famandassem|family|famorassem|final(?:ly)?|float32|float64|hidebysig|u?int(?:8|16|32|64)?|iant|idispatch|implements|import|initonly|instance|interface|iunknown|literal|lpstr|lpstruct|lptstr|lpwstr|managed|method|native(?:Type)?|nested|newslot|object(?:ref)?|pinvokeimpl|private|privatescope|public|reqsecobj|rtspecialname|runtime|sealed|sequential|serializable|specialname|static|string|struct|syschar|tbstr|unicode|unmanagedexp|unsigned|value(?:type)?|variant|virtual|void)\b/,function:/\b(?:(?:constrained|no|readonly|tail|unaligned|volatile)\.)?(?:conv\.(?:[iu][1248]?|ovf\.[iu][1248]?(?:\.un)?|r\.un|r4|r8)|ldc\.(?:i4(?:\.\d+|\.[mM]1|\.s)?|i8|r4|r8)|ldelem(?:\.[iu][1248]?|\.r[48]|\.ref|a)?|ldind\.(?:[iu][1248]?|r[48]|ref)|stelem\.?(?:i[1248]?|r[48]|ref)?|stind\.(?:i[1248]?|r[48]|ref)?|end(?:fault|filter|finally)|ldarg(?:\.[0-3s]|a(?:\.s)?)?|ldloc(?:\.\d+|\.s)?|sub(?:\.ovf(?:\.un)?)?|mul(?:\.ovf(?:\.un)?)?|add(?:\.ovf(?:\.un)?)?|stloc(?:\.[0-3s])?|refany(?:type|val)|blt(?:\.un)?(?:\.s)?|ble(?:\.un)?(?:\.s)?|bgt(?:\.un)?(?:\.s)?|bge(?:\.un)?(?:\.s)?|unbox(?:\.any)?|init(?:blk|obj)|call(?:i|virt)?|brfalse(?:\.s)?|bne\.un(?:\.s)?|ldloca(?:\.s)?|brzero(?:\.s)?|brtrue(?:\.s)?|brnull(?:\.s)?|brinst(?:\.s)?|starg(?:\.s)?|leave(?:\.s)?|shr(?:\.un)?|rem(?:\.un)?|div(?:\.un)?|clt(?:\.un)?|alignment|castclass|ldvirtftn|beq(?:\.s)?|ckfinite|ldsflda|ldtoken|localloc|mkrefany|rethrow|cgt\.un|arglist|switch|stsfld|sizeof|newobj|newarr|ldsfld|ldnull|ldflda|isinst|throw|stobj|stfld|ldstr|ldobj|ldlen|ldftn|ldfld|cpobj|cpblk|break|br\.s|xor|shl|ret|pop|not|nop|neg|jmp|dup|cgt|ceq|box|and|or|br)\b/,boolean:/\b(?:false|true)\b/,number:/\b-?(?:0x[0-9a-f]+|\d+)(?:\.[0-9a-f]+)?\b/i,punctuation:/[{}[\];(),:=]|IL_[0-9A-Za-z]+/}}return lv}var cv,XI;function Tbe(){if(XI)return cv;XI=1,cv=e,e.displayName="clojure",e.aliases=[];function e(t){t.languages.clojure={comment:{pattern:/;.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},char:/\\\w+/,symbol:{pattern:/(^|[\s()\[\]{},])::?[\w*+!?'<>=/.-]+/,lookbehind:!0},keyword:{pattern:/(\()(?:-|->|->>|\.|\.\.|\*|\/|\+|<|<=|=|==|>|>=|accessor|agent|agent-errors|aget|alength|all-ns|alter|and|append-child|apply|array-map|aset|aset-boolean|aset-byte|aset-char|aset-double|aset-float|aset-int|aset-long|aset-short|assert|assoc|await|await-for|bean|binding|bit-and|bit-not|bit-or|bit-shift-left|bit-shift-right|bit-xor|boolean|branch\?|butlast|byte|cast|char|children|class|clear-agent-errors|comment|commute|comp|comparator|complement|concat|cond|conj|cons|constantly|construct-proxy|contains\?|count|create-ns|create-struct|cycle|dec|declare|def|def-|definline|definterface|defmacro|defmethod|defmulti|defn|defn-|defonce|defproject|defprotocol|defrecord|defstruct|deftype|deref|difference|disj|dissoc|distinct|do|doall|doc|dorun|doseq|dosync|dotimes|doto|double|down|drop|drop-while|edit|end\?|ensure|eval|every\?|false\?|ffirst|file-seq|filter|find|find-doc|find-ns|find-var|first|float|flush|fn|fnseq|for|frest|gensym|get|get-proxy-class|hash-map|hash-set|identical\?|identity|if|if-let|if-not|import|in-ns|inc|index|insert-child|insert-left|insert-right|inspect-table|inspect-tree|instance\?|int|interleave|intersection|into|into-array|iterate|join|key|keys|keyword|keyword\?|last|lazy-cat|lazy-cons|left|lefts|let|line-seq|list|list\*|load|load-file|locking|long|loop|macroexpand|macroexpand-1|make-array|make-node|map|map-invert|map\?|mapcat|max|max-key|memfn|merge|merge-with|meta|min|min-key|monitor-enter|name|namespace|neg\?|new|newline|next|nil\?|node|not|not-any\?|not-every\?|not=|ns|ns-imports|ns-interns|ns-map|ns-name|ns-publics|ns-refers|ns-resolve|ns-unmap|nth|nthrest|or|parse|partial|path|peek|pop|pos\?|pr|pr-str|print|print-str|println|println-str|prn|prn-str|project|proxy|proxy-mappings|quot|quote|rand|rand-int|range|re-find|re-groups|re-matcher|re-matches|re-pattern|re-seq|read|read-line|recur|reduce|ref|ref-set|refer|rem|remove|remove-method|remove-ns|rename|rename-keys|repeat|replace|replicate|resolve|rest|resultset-seq|reverse|rfirst|right|rights|root|rrest|rseq|second|select|select-keys|send|send-off|seq|seq-zip|seq\?|set|set!|short|slurp|some|sort|sort-by|sorted-map|sorted-map-by|sorted-set|special-symbol\?|split-at|split-with|str|string\?|struct|struct-map|subs|subvec|symbol|symbol\?|sync|take|take-nth|take-while|test|throw|time|to-array|to-array-2d|tree-seq|true\?|try|union|up|update-proxy|val|vals|var|var-get|var-set|var\?|vector|vector-zip|vector\?|when|when-first|when-let|when-not|with-local-vars|with-meta|with-open|with-out-str|xml-seq|xml-zip|zero\?|zipmap|zipper)(?=[\s)]|$)/,lookbehind:!0},boolean:/\b(?:false|nil|true)\b/,number:{pattern:/(^|[^\w$@])(?:\d+(?:[/.]\d+)?(?:e[+-]?\d+)?|0x[a-f0-9]+|[1-9]\d?r[a-z0-9]+)[lmn]?(?![\w$@])/i,lookbehind:!0},function:{pattern:/((?:^|[^'])\()[\w*+!?'<>=/.-]+(?=[\s)]|$)/,lookbehind:!0},operator:/[#@^`~]/,punctuation:/[{}\[\](),]/}}return cv}var uv,QI;function Rbe(){if(QI)return uv;QI=1,uv=e,e.displayName="cmake",e.aliases=[];function e(t){t.languages.cmake={comment:/#.*/,string:{pattern:/"(?:[^\\"]|\\.)*"/,greedy:!0,inside:{interpolation:{pattern:/\$\{(?:[^{}$]|\$\{[^{}$]*\})*\}/,inside:{punctuation:/\$\{|\}/,variable:/\w+/}}}},variable:/\b(?:CMAKE_\w+|\w+_(?:(?:BINARY|SOURCE)_DIR|DESCRIPTION|HOMEPAGE_URL|ROOT|VERSION(?:_MAJOR|_MINOR|_PATCH|_TWEAK)?)|(?:ANDROID|APPLE|BORLAND|BUILD_SHARED_LIBS|CACHE|CPACK_(?:ABSOLUTE_DESTINATION_FILES|COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY|ERROR_ON_ABSOLUTE_INSTALL_DESTINATION|INCLUDE_TOPLEVEL_DIRECTORY|INSTALL_DEFAULT_DIRECTORY_PERMISSIONS|INSTALL_SCRIPT|PACKAGING_INSTALL_PREFIX|SET_DESTDIR|WARN_ON_ABSOLUTE_INSTALL_DESTINATION)|CTEST_(?:BINARY_DIRECTORY|BUILD_COMMAND|BUILD_NAME|BZR_COMMAND|BZR_UPDATE_OPTIONS|CHANGE_ID|CHECKOUT_COMMAND|CONFIGURATION_TYPE|CONFIGURE_COMMAND|COVERAGE_COMMAND|COVERAGE_EXTRA_FLAGS|CURL_OPTIONS|CUSTOM_(?:COVERAGE_EXCLUDE|ERROR_EXCEPTION|ERROR_MATCH|ERROR_POST_CONTEXT|ERROR_PRE_CONTEXT|MAXIMUM_FAILED_TEST_OUTPUT_SIZE|MAXIMUM_NUMBER_OF_(?:ERRORS|WARNINGS)|MAXIMUM_PASSED_TEST_OUTPUT_SIZE|MEMCHECK_IGNORE|POST_MEMCHECK|POST_TEST|PRE_MEMCHECK|PRE_TEST|TESTS_IGNORE|WARNING_EXCEPTION|WARNING_MATCH)|CVS_CHECKOUT|CVS_COMMAND|CVS_UPDATE_OPTIONS|DROP_LOCATION|DROP_METHOD|DROP_SITE|DROP_SITE_CDASH|DROP_SITE_PASSWORD|DROP_SITE_USER|EXTRA_COVERAGE_GLOB|GIT_COMMAND|GIT_INIT_SUBMODULES|GIT_UPDATE_CUSTOM|GIT_UPDATE_OPTIONS|HG_COMMAND|HG_UPDATE_OPTIONS|LABELS_FOR_SUBPROJECTS|MEMORYCHECK_(?:COMMAND|COMMAND_OPTIONS|SANITIZER_OPTIONS|SUPPRESSIONS_FILE|TYPE)|NIGHTLY_START_TIME|P4_CLIENT|P4_COMMAND|P4_OPTIONS|P4_UPDATE_OPTIONS|RUN_CURRENT_SCRIPT|SCP_COMMAND|SITE|SOURCE_DIRECTORY|SUBMIT_URL|SVN_COMMAND|SVN_OPTIONS|SVN_UPDATE_OPTIONS|TEST_LOAD|TEST_TIMEOUT|TRIGGER_SITE|UPDATE_COMMAND|UPDATE_OPTIONS|UPDATE_VERSION_ONLY|USE_LAUNCHERS)|CYGWIN|ENV|EXECUTABLE_OUTPUT_PATH|GHS-MULTI|IOS|LIBRARY_OUTPUT_PATH|MINGW|MSVC(?:10|11|12|14|60|70|71|80|90|_IDE|_TOOLSET_VERSION|_VERSION)?|MSYS|PROJECT_(?:BINARY_DIR|DESCRIPTION|HOMEPAGE_URL|NAME|SOURCE_DIR|VERSION|VERSION_(?:MAJOR|MINOR|PATCH|TWEAK))|UNIX|WIN32|WINCE|WINDOWS_PHONE|WINDOWS_STORE|XCODE|XCODE_VERSION))\b/,property:/\b(?:cxx_\w+|(?:ARCHIVE_OUTPUT_(?:DIRECTORY|NAME)|COMPILE_DEFINITIONS|COMPILE_PDB_NAME|COMPILE_PDB_OUTPUT_DIRECTORY|EXCLUDE_FROM_DEFAULT_BUILD|IMPORTED_(?:IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_LANGUAGES|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|NO_SONAME|OBJECTS|SONAME)|INTERPROCEDURAL_OPTIMIZATION|LIBRARY_OUTPUT_DIRECTORY|LIBRARY_OUTPUT_NAME|LINK_FLAGS|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|MAP_IMPORTED_CONFIG|OSX_ARCHITECTURES|OUTPUT_NAME|PDB_NAME|PDB_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_NAME|STATIC_LIBRARY_FLAGS|VS_CSHARP|VS_DOTNET_REFERENCEPROP|VS_DOTNET_REFERENCE|VS_GLOBAL_SECTION_POST|VS_GLOBAL_SECTION_PRE|VS_GLOBAL|XCODE_ATTRIBUTE)_\w+|\w+_(?:CLANG_TIDY|COMPILER_LAUNCHER|CPPCHECK|CPPLINT|INCLUDE_WHAT_YOU_USE|OUTPUT_NAME|POSTFIX|VISIBILITY_PRESET)|ABSTRACT|ADDITIONAL_MAKE_CLEAN_FILES|ADVANCED|ALIASED_TARGET|ALLOW_DUPLICATE_CUSTOM_TARGETS|ANDROID_(?:ANT_ADDITIONAL_OPTIONS|API|API_MIN|ARCH|ASSETS_DIRECTORIES|GUI|JAR_DEPENDENCIES|NATIVE_LIB_DEPENDENCIES|NATIVE_LIB_DIRECTORIES|PROCESS_MAX|PROGUARD|PROGUARD_CONFIG_PATH|SECURE_PROPS_PATH|SKIP_ANT_STEP|STL_TYPE)|ARCHIVE_OUTPUT_DIRECTORY|ATTACHED_FILES|ATTACHED_FILES_ON_FAIL|AUTOGEN_(?:BUILD_DIR|ORIGIN_DEPENDS|PARALLEL|SOURCE_GROUP|TARGETS_FOLDER|TARGET_DEPENDS)|AUTOMOC|AUTOMOC_(?:COMPILER_PREDEFINES|DEPEND_FILTERS|EXECUTABLE|MACRO_NAMES|MOC_OPTIONS|SOURCE_GROUP|TARGETS_FOLDER)|AUTORCC|AUTORCC_EXECUTABLE|AUTORCC_OPTIONS|AUTORCC_SOURCE_GROUP|AUTOUIC|AUTOUIC_EXECUTABLE|AUTOUIC_OPTIONS|AUTOUIC_SEARCH_PATHS|BINARY_DIR|BUILDSYSTEM_TARGETS|BUILD_RPATH|BUILD_RPATH_USE_ORIGIN|BUILD_WITH_INSTALL_NAME_DIR|BUILD_WITH_INSTALL_RPATH|BUNDLE|BUNDLE_EXTENSION|CACHE_VARIABLES|CLEAN_NO_CUSTOM|COMMON_LANGUAGE_RUNTIME|COMPATIBLE_INTERFACE_(?:BOOL|NUMBER_MAX|NUMBER_MIN|STRING)|COMPILE_(?:DEFINITIONS|FEATURES|FLAGS|OPTIONS|PDB_NAME|PDB_OUTPUT_DIRECTORY)|COST|CPACK_DESKTOP_SHORTCUTS|CPACK_NEVER_OVERWRITE|CPACK_PERMANENT|CPACK_STARTUP_SHORTCUTS|CPACK_START_MENU_SHORTCUTS|CPACK_WIX_ACL|CROSSCOMPILING_EMULATOR|CUDA_EXTENSIONS|CUDA_PTX_COMPILATION|CUDA_RESOLVE_DEVICE_SYMBOLS|CUDA_SEPARABLE_COMPILATION|CUDA_STANDARD|CUDA_STANDARD_REQUIRED|CXX_EXTENSIONS|CXX_STANDARD|CXX_STANDARD_REQUIRED|C_EXTENSIONS|C_STANDARD|C_STANDARD_REQUIRED|DEBUG_CONFIGURATIONS|DEFINE_SYMBOL|DEFINITIONS|DEPENDS|DEPLOYMENT_ADDITIONAL_FILES|DEPLOYMENT_REMOTE_DIRECTORY|DISABLED|DISABLED_FEATURES|ECLIPSE_EXTRA_CPROJECT_CONTENTS|ECLIPSE_EXTRA_NATURES|ENABLED_FEATURES|ENABLED_LANGUAGES|ENABLE_EXPORTS|ENVIRONMENT|EXCLUDE_FROM_ALL|EXCLUDE_FROM_DEFAULT_BUILD|EXPORT_NAME|EXPORT_PROPERTIES|EXTERNAL_OBJECT|EchoString|FAIL_REGULAR_EXPRESSION|FIND_LIBRARY_USE_LIB32_PATHS|FIND_LIBRARY_USE_LIB64_PATHS|FIND_LIBRARY_USE_LIBX32_PATHS|FIND_LIBRARY_USE_OPENBSD_VERSIONING|FIXTURES_CLEANUP|FIXTURES_REQUIRED|FIXTURES_SETUP|FOLDER|FRAMEWORK|Fortran_FORMAT|Fortran_MODULE_DIRECTORY|GENERATED|GENERATOR_FILE_NAME|GENERATOR_IS_MULTI_CONFIG|GHS_INTEGRITY_APP|GHS_NO_SOURCE_GROUP_FILE|GLOBAL_DEPENDS_DEBUG_MODE|GLOBAL_DEPENDS_NO_CYCLES|GNUtoMS|HAS_CXX|HEADER_FILE_ONLY|HELPSTRING|IMPLICIT_DEPENDS_INCLUDE_TRANSFORM|IMPORTED|IMPORTED_(?:COMMON_LANGUAGE_RUNTIME|CONFIGURATIONS|GLOBAL|IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_(?:LANGUAGES|LIBRARIES|MULTIPLICITY)|LOCATION|NO_SONAME|OBJECTS|SONAME)|IMPORT_PREFIX|IMPORT_SUFFIX|INCLUDE_DIRECTORIES|INCLUDE_REGULAR_EXPRESSION|INSTALL_NAME_DIR|INSTALL_RPATH|INSTALL_RPATH_USE_LINK_PATH|INTERFACE_(?:AUTOUIC_OPTIONS|COMPILE_DEFINITIONS|COMPILE_FEATURES|COMPILE_OPTIONS|INCLUDE_DIRECTORIES|LINK_DEPENDS|LINK_DIRECTORIES|LINK_LIBRARIES|LINK_OPTIONS|POSITION_INDEPENDENT_CODE|SOURCES|SYSTEM_INCLUDE_DIRECTORIES)|INTERPROCEDURAL_OPTIMIZATION|IN_TRY_COMPILE|IOS_INSTALL_COMBINED|JOB_POOLS|JOB_POOL_COMPILE|JOB_POOL_LINK|KEEP_EXTENSION|LABELS|LANGUAGE|LIBRARY_OUTPUT_DIRECTORY|LINKER_LANGUAGE|LINK_(?:DEPENDS|DEPENDS_NO_SHARED|DIRECTORIES|FLAGS|INTERFACE_LIBRARIES|INTERFACE_MULTIPLICITY|LIBRARIES|OPTIONS|SEARCH_END_STATIC|SEARCH_START_STATIC|WHAT_YOU_USE)|LISTFILE_STACK|LOCATION|MACOSX_BUNDLE|MACOSX_BUNDLE_INFO_PLIST|MACOSX_FRAMEWORK_INFO_PLIST|MACOSX_PACKAGE_LOCATION|MACOSX_RPATH|MACROS|MANUALLY_ADDED_DEPENDENCIES|MEASUREMENT|MODIFIED|NAME|NO_SONAME|NO_SYSTEM_FROM_IMPORTED|OBJECT_DEPENDS|OBJECT_OUTPUTS|OSX_ARCHITECTURES|OUTPUT_NAME|PACKAGES_FOUND|PACKAGES_NOT_FOUND|PARENT_DIRECTORY|PASS_REGULAR_EXPRESSION|PDB_NAME|PDB_OUTPUT_DIRECTORY|POSITION_INDEPENDENT_CODE|POST_INSTALL_SCRIPT|PREDEFINED_TARGETS_FOLDER|PREFIX|PRE_INSTALL_SCRIPT|PRIVATE_HEADER|PROCESSORS|PROCESSOR_AFFINITY|PROJECT_LABEL|PUBLIC_HEADER|REPORT_UNDEFINED_PROPERTIES|REQUIRED_FILES|RESOURCE|RESOURCE_LOCK|RULE_LAUNCH_COMPILE|RULE_LAUNCH_CUSTOM|RULE_LAUNCH_LINK|RULE_MESSAGES|RUNTIME_OUTPUT_DIRECTORY|RUN_SERIAL|SKIP_AUTOGEN|SKIP_AUTOMOC|SKIP_AUTORCC|SKIP_AUTOUIC|SKIP_BUILD_RPATH|SKIP_RETURN_CODE|SOURCES|SOURCE_DIR|SOVERSION|STATIC_LIBRARY_FLAGS|STATIC_LIBRARY_OPTIONS|STRINGS|SUBDIRECTORIES|SUFFIX|SYMBOLIC|TARGET_ARCHIVES_MAY_BE_SHARED_LIBS|TARGET_MESSAGES|TARGET_SUPPORTS_SHARED_LIBS|TESTS|TEST_INCLUDE_FILE|TEST_INCLUDE_FILES|TIMEOUT|TIMEOUT_AFTER_MATCH|TYPE|USE_FOLDERS|VALUE|VARIABLES|VERSION|VISIBILITY_INLINES_HIDDEN|VS_(?:CONFIGURATION_TYPE|COPY_TO_OUT_DIR|DEBUGGER_(?:COMMAND|COMMAND_ARGUMENTS|ENVIRONMENT|WORKING_DIRECTORY)|DEPLOYMENT_CONTENT|DEPLOYMENT_LOCATION|DOTNET_REFERENCES|DOTNET_REFERENCES_COPY_LOCAL|GLOBAL_KEYWORD|GLOBAL_PROJECT_TYPES|GLOBAL_ROOTNAMESPACE|INCLUDE_IN_VSIX|IOT_STARTUP_TASK|KEYWORD|RESOURCE_GENERATOR|SCC_AUXPATH|SCC_LOCALPATH|SCC_PROJECTNAME|SCC_PROVIDER|SDK_REFERENCES|SHADER_(?:DISABLE_OPTIMIZATIONS|ENABLE_DEBUG|ENTRYPOINT|FLAGS|MODEL|OBJECT_FILE_NAME|OUTPUT_HEADER_FILE|TYPE|VARIABLE_NAME)|STARTUP_PROJECT|TOOL_OVERRIDE|USER_PROPS|WINRT_COMPONENT|WINRT_EXTENSIONS|WINRT_REFERENCES|XAML_TYPE)|WILL_FAIL|WIN32_EXECUTABLE|WINDOWS_EXPORT_ALL_SYMBOLS|WORKING_DIRECTORY|WRAP_EXCLUDE|XCODE_(?:EMIT_EFFECTIVE_PLATFORM_NAME|EXPLICIT_FILE_TYPE|FILE_ATTRIBUTES|LAST_KNOWN_FILE_TYPE|PRODUCT_TYPE|SCHEME_(?:ADDRESS_SANITIZER|ADDRESS_SANITIZER_USE_AFTER_RETURN|ARGUMENTS|DISABLE_MAIN_THREAD_CHECKER|DYNAMIC_LIBRARY_LOADS|DYNAMIC_LINKER_API_USAGE|ENVIRONMENT|EXECUTABLE|GUARD_MALLOC|MAIN_THREAD_CHECKER_STOP|MALLOC_GUARD_EDGES|MALLOC_SCRIBBLE|MALLOC_STACK|THREAD_SANITIZER(?:_STOP)?|UNDEFINED_BEHAVIOUR_SANITIZER(?:_STOP)?|ZOMBIE_OBJECTS))|XCTEST)\b/,keyword:/\b(?:add_compile_definitions|add_compile_options|add_custom_command|add_custom_target|add_definitions|add_dependencies|add_executable|add_library|add_link_options|add_subdirectory|add_test|aux_source_directory|break|build_command|build_name|cmake_host_system_information|cmake_minimum_required|cmake_parse_arguments|cmake_policy|configure_file|continue|create_test_sourcelist|ctest_build|ctest_configure|ctest_coverage|ctest_empty_binary_directory|ctest_memcheck|ctest_read_custom_files|ctest_run_script|ctest_sleep|ctest_start|ctest_submit|ctest_test|ctest_update|ctest_upload|define_property|else|elseif|enable_language|enable_testing|endforeach|endfunction|endif|endmacro|endwhile|exec_program|execute_process|export|export_library_dependencies|file|find_file|find_library|find_package|find_path|find_program|fltk_wrap_ui|foreach|function|get_cmake_property|get_directory_property|get_filename_component|get_property|get_source_file_property|get_target_property|get_test_property|if|include|include_directories|include_external_msproject|include_guard|include_regular_expression|install|install_files|install_programs|install_targets|link_directories|link_libraries|list|load_cache|load_command|macro|make_directory|mark_as_advanced|math|message|option|output_required_files|project|qt_wrap_cpp|qt_wrap_ui|remove|remove_definitions|return|separate_arguments|set|set_directory_properties|set_property|set_source_files_properties|set_target_properties|set_tests_properties|site_name|source_group|string|subdir_depends|subdirs|target_compile_definitions|target_compile_features|target_compile_options|target_include_directories|target_link_directories|target_link_libraries|target_link_options|target_sources|try_compile|try_run|unset|use_mangled_mesa|utility_source|variable_requires|variable_watch|while|write_file)(?=\s*\()\b/,boolean:/\b(?:FALSE|OFF|ON|TRUE)\b/,namespace:/\b(?:INTERFACE|PRIVATE|PROPERTIES|PUBLIC|SHARED|STATIC|TARGET_OBJECTS)\b/,operator:/\b(?:AND|DEFINED|EQUAL|GREATER|LESS|MATCHES|NOT|OR|STREQUAL|STRGREATER|STRLESS|VERSION_EQUAL|VERSION_GREATER|VERSION_LESS)\b/,inserted:{pattern:/\b\w+::\w+\b/,alias:"class-name"},number:/\b\d+(?:\.\d+)*\b/,function:/\b[a-z_]\w*(?=\s*\()\b/i,punctuation:/[()>}]|\$[<{]/}}return uv}var dv,JI;function Nbe(){if(JI)return dv;JI=1,dv=e,e.displayName="cobol",e.aliases=[];function e(t){t.languages.cobol={comment:{pattern:/\*>.*|(^[ \t]*)\*.*/m,lookbehind:!0,greedy:!0},string:{pattern:/[xzgn]?(?:"(?:[^\r\n"]|"")*"(?!")|'(?:[^\r\n']|'')*'(?!'))/i,greedy:!0},level:{pattern:/(^[ \t]*)\d+\b/m,lookbehind:!0,greedy:!0,alias:"number"},"class-name":{pattern:/(\bpic(?:ture)?\s+)(?:(?:[-\w$/,:*+<>]|\.(?!\s|$))(?:\(\d+\))?)+/i,lookbehind:!0,inside:{number:{pattern:/(\()\d+/,lookbehind:!0},punctuation:/[()]/}},keyword:{pattern:/(^|[^\w-])(?:ABORT|ACCEPT|ACCESS|ADD|ADDRESS|ADVANCING|AFTER|ALIGNED|ALL|ALPHABET|ALPHABETIC|ALPHABETIC-LOWER|ALPHABETIC-UPPER|ALPHANUMERIC|ALPHANUMERIC-EDITED|ALSO|ALTER|ALTERNATE|ANY|ARE|AREA|AREAS|AS|ASCENDING|ASCII|ASSIGN|ASSOCIATED-DATA|ASSOCIATED-DATA-LENGTH|AT|ATTRIBUTE|AUTHOR|AUTO|AUTO-SKIP|BACKGROUND-COLOR|BACKGROUND-COLOUR|BASIS|BEEP|BEFORE|BEGINNING|BELL|BINARY|BIT|BLANK|BLINK|BLOCK|BOTTOM|BOUNDS|BY|BYFUNCTION|BYTITLE|CALL|CANCEL|CAPABLE|CCSVERSION|CD|CF|CH|CHAINING|CHANGED|CHANNEL|CHARACTER|CHARACTERS|CLASS|CLASS-ID|CLOCK-UNITS|CLOSE|CLOSE-DISPOSITION|COBOL|CODE|CODE-SET|COL|COLLATING|COLUMN|COM-REG|COMMA|COMMITMENT|COMMON|COMMUNICATION|COMP|COMP-1|COMP-2|COMP-3|COMP-4|COMP-5|COMPUTATIONAL|COMPUTATIONAL-1|COMPUTATIONAL-2|COMPUTATIONAL-3|COMPUTATIONAL-4|COMPUTATIONAL-5|COMPUTE|CONFIGURATION|CONTAINS|CONTENT|CONTINUE|CONTROL|CONTROL-POINT|CONTROLS|CONVENTION|CONVERTING|COPY|CORR|CORRESPONDING|COUNT|CRUNCH|CURRENCY|CURSOR|DATA|DATA-BASE|DATE|DATE-COMPILED|DATE-WRITTEN|DAY|DAY-OF-WEEK|DBCS|DE|DEBUG-CONTENTS|DEBUG-ITEM|DEBUG-LINE|DEBUG-NAME|DEBUG-SUB-1|DEBUG-SUB-2|DEBUG-SUB-3|DEBUGGING|DECIMAL-POINT|DECLARATIVES|DEFAULT|DEFAULT-DISPLAY|DEFINITION|DELETE|DELIMITED|DELIMITER|DEPENDING|DESCENDING|DESTINATION|DETAIL|DFHRESP|DFHVALUE|DISABLE|DISK|DISPLAY|DISPLAY-1|DIVIDE|DIVISION|DONTCARE|DOUBLE|DOWN|DUPLICATES|DYNAMIC|EBCDIC|EGCS|EGI|ELSE|EMI|EMPTY-CHECK|ENABLE|END|END-ACCEPT|END-ADD|END-CALL|END-COMPUTE|END-DELETE|END-DIVIDE|END-EVALUATE|END-IF|END-MULTIPLY|END-OF-PAGE|END-PERFORM|END-READ|END-RECEIVE|END-RETURN|END-REWRITE|END-SEARCH|END-START|END-STRING|END-SUBTRACT|END-UNSTRING|END-WRITE|ENDING|ENTER|ENTRY|ENTRY-PROCEDURE|ENVIRONMENT|EOL|EOP|EOS|ERASE|ERROR|ESCAPE|ESI|EVALUATE|EVENT|EVERY|EXCEPTION|EXCLUSIVE|EXHIBIT|EXIT|EXPORT|EXTEND|EXTENDED|EXTERNAL|FD|FILE|FILE-CONTROL|FILLER|FINAL|FIRST|FOOTING|FOR|FOREGROUND-COLOR|FOREGROUND-COLOUR|FROM|FULL|FUNCTION|FUNCTION-POINTER|FUNCTIONNAME|GENERATE|GIVING|GLOBAL|GO|GOBACK|GRID|GROUP|HEADING|HIGH-VALUE|HIGH-VALUES|HIGHLIGHT|I-O|I-O-CONTROL|ID|IDENTIFICATION|IF|IMPLICIT|IMPORT|IN|INDEX|INDEXED|INDICATE|INITIAL|INITIALIZE|INITIATE|INPUT|INPUT-OUTPUT|INSPECT|INSTALLATION|INTEGER|INTO|INVALID|INVOKE|IS|JUST|JUSTIFIED|KANJI|KEPT|KEY|KEYBOARD|LABEL|LANGUAGE|LAST|LB|LD|LEADING|LEFT|LEFTLINE|LENGTH|LENGTH-CHECK|LIBACCESS|LIBPARAMETER|LIBRARY|LIMIT|LIMITS|LINAGE|LINAGE-COUNTER|LINE|LINE-COUNTER|LINES|LINKAGE|LIST|LOCAL|LOCAL-STORAGE|LOCK|LONG-DATE|LONG-TIME|LOW-VALUE|LOW-VALUES|LOWER|LOWLIGHT|MEMORY|MERGE|MESSAGE|MMDDYYYY|MODE|MODULES|MORE-LABELS|MOVE|MULTIPLE|MULTIPLY|NAMED|NATIONAL|NATIONAL-EDITED|NATIVE|NEGATIVE|NETWORK|NEXT|NO|NO-ECHO|NULL|NULLS|NUMBER|NUMERIC|NUMERIC-DATE|NUMERIC-EDITED|NUMERIC-TIME|OBJECT-COMPUTER|OCCURS|ODT|OF|OFF|OMITTED|ON|OPEN|OPTIONAL|ORDER|ORDERLY|ORGANIZATION|OTHER|OUTPUT|OVERFLOW|OVERLINE|OWN|PACKED-DECIMAL|PADDING|PAGE|PAGE-COUNTER|PASSWORD|PERFORM|PF|PH|PIC|PICTURE|PLUS|POINTER|PORT|POSITION|POSITIVE|PRINTER|PRINTING|PRIVATE|PROCEDURE|PROCEDURE-POINTER|PROCEDURES|PROCEED|PROCESS|PROGRAM|PROGRAM-ID|PROGRAM-LIBRARY|PROMPT|PURGE|QUEUE|QUOTE|QUOTES|RANDOM|RD|READ|READER|REAL|RECEIVE|RECEIVED|RECORD|RECORDING|RECORDS|RECURSIVE|REDEFINES|REEL|REF|REFERENCE|REFERENCES|RELATIVE|RELEASE|REMAINDER|REMARKS|REMOTE|REMOVAL|REMOVE|RENAMES|REPLACE|REPLACING|REPORT|REPORTING|REPORTS|REQUIRED|RERUN|RESERVE|RESET|RETURN|RETURN-CODE|RETURNING|REVERSE-VIDEO|REVERSED|REWIND|REWRITE|RF|RH|RIGHT|ROUNDED|RUN|SAME|SAVE|SCREEN|SD|SEARCH|SECTION|SECURE|SECURITY|SEGMENT|SEGMENT-LIMIT|SELECT|SEND|SENTENCE|SEPARATE|SEQUENCE|SEQUENTIAL|SET|SHARED|SHAREDBYALL|SHAREDBYRUNUNIT|SHARING|SHIFT-IN|SHIFT-OUT|SHORT-DATE|SIGN|SIZE|SORT|SORT-CONTROL|SORT-CORE-SIZE|SORT-FILE-SIZE|SORT-MERGE|SORT-MESSAGE|SORT-MODE-SIZE|SORT-RETURN|SOURCE|SOURCE-COMPUTER|SPACE|SPACES|SPECIAL-NAMES|STANDARD|STANDARD-1|STANDARD-2|START|STATUS|STOP|STRING|SUB-QUEUE-1|SUB-QUEUE-2|SUB-QUEUE-3|SUBTRACT|SUM|SUPPRESS|SYMBOL|SYMBOLIC|SYNC|SYNCHRONIZED|TABLE|TALLY|TALLYING|TAPE|TASK|TERMINAL|TERMINATE|TEST|TEXT|THEN|THREAD|THREAD-LOCAL|THROUGH|THRU|TIME|TIMER|TIMES|TITLE|TO|TODAYS-DATE|TODAYS-NAME|TOP|TRAILING|TRUNCATED|TYPE|TYPEDEF|UNDERLINE|UNIT|UNSTRING|UNTIL|UP|UPON|USAGE|USE|USING|VALUE|VALUES|VARYING|VIRTUAL|WAIT|WHEN|WHEN-COMPILED|WITH|WORDS|WORKING-STORAGE|WRITE|YEAR|YYYYDDD|YYYYMMDD|ZERO-FILL|ZEROES|ZEROS)(?![\w-])/i,lookbehind:!0},boolean:{pattern:/(^|[^\w-])(?:false|true)(?![\w-])/i,lookbehind:!0},number:{pattern:/(^|[^\w-])(?:[+-]?(?:(?:\d+(?:[.,]\d+)?|[.,]\d+)(?:e[+-]?\d+)?|zero))(?![\w-])/i,lookbehind:!0},operator:[/<>|[<>]=?|[=+*/&]/,{pattern:/(^|[^\w-])(?:-|and|equal|greater|less|not|or|than)(?![\w-])/i,lookbehind:!0}],punctuation:/[.:,()]/}}return dv}var fv,eO;function Ibe(){if(eO)return fv;eO=1,fv=e,e.displayName="coffeescript",e.aliases=["coffee"];function e(t){(function(n){var r=/#(?!\{).+/,a={pattern:/#\{[^}]+\}/,alias:"variable"};n.languages.coffeescript=n.languages.extend("javascript",{comment:r,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:a}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),n.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:r,interpolation:a}}}),n.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:n.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:a}}]}),n.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete n.languages.coffeescript["template-string"],n.languages.coffee=n.languages.coffeescript})(t)}return fv}var pv,tO;function Obe(){if(tO)return pv;tO=1,pv=e,e.displayName="concurnas",e.aliases=["conc"];function e(t){t.languages.concurnas={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\/\/.*)/,lookbehind:!0,greedy:!0},langext:{pattern:/\b\w+\s*\|\|[\s\S]+?\|\|/,greedy:!0,inside:{"class-name":/^\w+/,string:{pattern:/(^\s*\|\|)[\s\S]+(?=\|\|$)/,lookbehind:!0},punctuation:/\|\|/}},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/,lookbehind:!0},keyword:/\b(?:abstract|actor|also|annotation|assert|async|await|bool|boolean|break|byte|case|catch|changed|char|class|closed|constant|continue|def|default|del|double|elif|else|enum|every|extends|false|finally|float|for|from|global|gpudef|gpukernel|if|import|in|init|inject|int|lambda|local|long|loop|match|new|nodefault|null|of|onchange|open|out|override|package|parfor|parforsync|post|pre|private|protected|provide|provider|public|return|shared|short|single|size_t|sizeof|super|sync|this|throw|trait|trans|transient|true|try|typedef|unchecked|using|val|var|void|while|with)\b/,boolean:/\b(?:false|true)\b/,number:/\b0b[01][01_]*L?\b|\b0x(?:[\da-f_]*\.)?[\da-f_p+-]+\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfls]?/i,punctuation:/[{}[\];(),.:]/,operator:/<==|>==|=>|->|<-|<>|&==|&<>|\?:?|\.\?|\+\+|--|[-+*/=<>]=?|[!^~]|\b(?:and|as|band|bor|bxor|comp|is|isnot|mod|or)\b=?/,annotation:{pattern:/@(?:\w+:)?(?:\w+|\[[^\]]+\])?/,alias:"builtin"}},t.languages.insertBefore("concurnas","langext",{"regex-literal":{pattern:/\br("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:t.languages.concurnas},regex:/[\s\S]+/}},"string-literal":{pattern:/(?:\B|\bs)("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:t.languages.concurnas},string:/[\s\S]+/}}}),t.languages.conc=t.languages.concurnas}return pv}var gv,nO;function Dbe(){if(nO)return gv;nO=1,gv=e,e.displayName="coq",e.aliases=[];function e(t){(function(n){for(var r=/\(\*(?:[^(*]|\((?!\*)|\*(?!\))|)*\*\)/.source,a=0;a<2;a++)r=r.replace(//g,function(){return r});r=r.replace(//g,"[]"),n.languages.coq={comment:RegExp(r),string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},attribute:[{pattern:RegExp(/#\[(?:[^\[\]("]|"(?:[^"]|"")*"(?!")|\((?!\*)|)*\]/.source.replace(//g,function(){return r})),greedy:!0,alias:"attr-name",inside:{comment:RegExp(r),string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},operator:/=/,punctuation:/^#\[|\]$|[,()]/}},{pattern:/\b(?:Cumulative|Global|Local|Monomorphic|NonCumulative|Polymorphic|Private|Program)\b/,alias:"attr-name"}],keyword:/\b(?:Abort|About|Add|Admit|Admitted|All|Arguments|As|Assumptions|Axiom|Axioms|Back|BackTo|Backtrace|BinOp|BinOpSpec|BinRel|Bind|Blacklist|Canonical|Case|Cd|Check|Class|Classes|Close|CoFixpoint|CoInductive|Coercion|Coercions|Collection|Combined|Compute|Conjecture|Conjectures|Constant|Constants|Constraint|Constructors|Context|Corollary|Create|CstOp|Custom|Cut|Debug|Declare|Defined|Definition|Delimit|Dependencies|Dependent|Derive|Diffs|Drop|Elimination|End|Entry|Equality|Eval|Example|Existential|Existentials|Existing|Export|Extern|Extraction|Fact|Fail|Field|File|Firstorder|Fixpoint|Flags|Focus|From|Funclass|Function|Functional|GC|Generalizable|Goal|Grab|Grammar|Graph|Guarded|Haskell|Heap|Hide|Hint|HintDb|Hints|Hypotheses|Hypothesis|IF|Identity|Immediate|Implicit|Implicits|Import|Include|Induction|Inductive|Infix|Info|Initial|InjTyp|Inline|Inspect|Instance|Instances|Intro|Intros|Inversion|Inversion_clear|JSON|Language|Left|Lemma|Let|Lia|Libraries|Library|Load|LoadPath|Locate|Ltac|Ltac2|ML|Match|Method|Minimality|Module|Modules|Morphism|Next|NoInline|Notation|Number|OCaml|Obligation|Obligations|Opaque|Open|Optimize|Parameter|Parameters|Parametric|Path|Paths|Prenex|Preterm|Primitive|Print|Profile|Projections|Proof|Prop|PropBinOp|PropOp|PropUOp|Property|Proposition|Pwd|Qed|Quit|Rec|Record|Recursive|Redirect|Reduction|Register|Relation|Remark|Remove|Require|Reserved|Reset|Resolve|Restart|Rewrite|Right|Ring|Rings|SProp|Saturate|Save|Scheme|Scope|Scopes|Search|SearchHead|SearchPattern|SearchRewrite|Section|Separate|Set|Setoid|Show|Signatures|Solve|Solver|Sort|Sortclass|Sorted|Spec|Step|Strategies|Strategy|String|Structure|SubClass|Subgraph|SuchThat|Tactic|Term|TestCompile|Theorem|Time|Timeout|To|Transparent|Type|Typeclasses|Types|Typing|UnOp|UnOpSpec|Undelimit|Undo|Unfocus|Unfocused|Unfold|Universe|Universes|Unshelve|Variable|Variables|Variant|Verbose|View|Visibility|Zify|_|apply|as|at|by|cofix|else|end|exists|exists2|fix|for|forall|fun|if|in|let|match|measure|move|removed|return|struct|then|using|wf|where|with)\b/,number:/\b(?:0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]+)?(?:p[+-]?\d[\d_]*)?|\d[\d_]*(?:\.[\d_]+)?(?:e[+-]?\d[\d_]*)?)\b/i,punct:{pattern:/@\{|\{\||\[=|:>/,alias:"punctuation"},operator:/\/\\|\\\/|\.{2,3}|:{1,2}=|\*\*|[-=]>|<(?:->?|[+:=>]|<:)|>(?:=|->)|\|[-|]?|[-!%&*+/<=>?@^~']/,punctuation:/\.\(|`\(|@\{|`\{|\{\||\[=|:>|[:.,;(){}\[\]]/}})(t)}return gv}var mv,rO;function Th(){if(rO)return mv;rO=1,mv=e,e.displayName="ruby",e.aliases=["rb"];function e(t){(function(n){n.languages.ruby=n.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===||[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),n.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var r={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:n.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete n.languages.ruby.function;var a="(?:"+[/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source].join("|")+")",o=/(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;n.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp(/%r/.source+a+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:r,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:r,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp(/(^|[^:]):/.source+o),lookbehind:!0,greedy:!0},{pattern:RegExp(/([\r\n{(,][ \t]*)/.source+o+/(?=:(?!:))/.source),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),n.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp(/%[qQiIwWs]?/.source+a),greedy:!0,inside:{interpolation:r,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:r,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:r,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp(/%x/.source+a),greedy:!0,inside:{interpolation:r,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:r,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete n.languages.ruby.string,n.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),n.languages.rb=n.languages.ruby})(t)}return mv}var hv,aO;function Lbe(){if(aO)return hv;aO=1;var e=Th();hv=t,t.displayName="crystal",t.aliases=[];function t(n){n.register(e),function(r){r.languages.crystal=r.languages.extend("ruby",{keyword:[/\b(?:__DIR__|__END_LINE__|__FILE__|__LINE__|abstract|alias|annotation|as|asm|begin|break|case|class|def|do|else|elsif|end|ensure|enum|extend|for|fun|if|ifdef|include|instance_sizeof|lib|macro|module|next|of|out|pointerof|private|protected|ptr|require|rescue|return|select|self|sizeof|struct|super|then|type|typeof|undef|uninitialized|union|unless|until|when|while|with|yield)\b/,{pattern:/(\.\s*)(?:is_a|responds_to)\?/,lookbehind:!0}],number:/\b(?:0b[01_]*[01]|0o[0-7_]*[0-7]|0x[\da-fA-F_]*[\da-fA-F]|(?:\d(?:[\d_]*\d)?)(?:\.[\d_]*\d)?(?:[eE][+-]?[\d_]*\d)?)(?:_(?:[uif](?:8|16|32|64))?)?\b/,operator:[/->/,r.languages.ruby.operator],punctuation:/[(){}[\].,;\\]/}),r.languages.insertBefore("crystal","string-literal",{attribute:{pattern:/@\[.*?\]/,inside:{delimiter:{pattern:/^@\[|\]$/,alias:"punctuation"},attribute:{pattern:/^(\s*)\w+/,lookbehind:!0,alias:"class-name"},args:{pattern:/\S(?:[\s\S]*\S)?/,inside:r.languages.crystal}}},expansion:{pattern:/\{(?:\{.*?\}|%.*?%)\}/,inside:{content:{pattern:/^(\{.)[\s\S]+(?=.\}$)/,lookbehind:!0,inside:r.languages.crystal},delimiter:{pattern:/^\{[\{%]|[\}%]\}$/,alias:"operator"}}},char:{pattern:/'(?:[^\\\r\n]{1,2}|\\(?:.|u(?:[A-Fa-f0-9]{1,4}|\{[A-Fa-f0-9]{1,6}\})))'/,greedy:!0}})}(n)}return hv}var bv,oO;function Mbe(){if(oO)return bv;oO=1;var e=Ah();bv=t,t.displayName="cshtml",t.aliases=["razor"];function t(n){n.register(e),function(r){var a=/\/(?![/*])|\/\/.*[\r\n]|\/\*[^*]*(?:\*(?!\/)[^*]*)*\*\//.source,o=/@(?!")|"(?:[^\r\n\\"]|\\.)*"|@"(?:[^\\"]|""|\\[\s\S])*"(?!")/.source+"|"+/'(?:(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'|(?=[^\\](?!')))/.source;function i(w,v){for(var h=0;h/g,function(){return"(?:"+w+")"});return w.replace(//g,"[^\\s\\S]").replace(//g,"(?:"+o+")").replace(//g,"(?:"+a+")")}var s=i(/\((?:[^()'"@/]|||)*\)/.source,2),l=i(/\[(?:[^\[\]'"@/]|||)*\]/.source,2),c=i(/\{(?:[^{}'"@/]|||)*\}/.source,2),u=i(/<(?:[^<>'"@/]|||)*>/.source,2),d=/(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?/.source,g=/(?!\d)[^\s>\/=$<%]+/.source+d+/\s*\/?>/.source,m=/\B@?/.source+"(?:"+/<([a-zA-Z][\w:]*)/.source+d+/\s*>/.source+"(?:"+(/[^<]/.source+"|"+/<\/?(?!\1\b)/.source+g+"|"+i(/<\1/.source+d+/\s*>/.source+"(?:"+(/[^<]/.source+"|"+/<\/?(?!\1\b)/.source+g+"|")+")*"+/<\/\1\s*>/.source,2))+")*"+/<\/\1\s*>/.source+"|"+/|\+|~|\|\|/,punctuation:/[(),]/}},n.languages.css.atrule.inside["selector-function-argument"].inside=a,n.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var o={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},i={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};n.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:o,number:i,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:o,number:i})})(t)}return vv}var Sv,lO;function Fbe(){if(lO)return Sv;lO=1,Sv=e,e.displayName="csv",e.aliases=[];function e(t){t.languages.csv={value:/[^\r\n,"]+|"(?:[^"]|"")*"(?!")/,punctuation:/,/}}return Sv}var wv,cO;function jbe(){if(cO)return wv;cO=1,wv=e,e.displayName="cypher",e.aliases=[];function e(t){t.languages.cypher={comment:/\/\/.*/,string:{pattern:/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/,greedy:!0},"class-name":{pattern:/(:\s*)(?:\w+|`(?:[^`\\\r\n])*`)(?=\s*[{):])/,lookbehind:!0,greedy:!0},relationship:{pattern:/(-\[\s*(?:\w+\s*|`(?:[^`\\\r\n])*`\s*)?:\s*|\|\s*:\s*)(?:\w+|`(?:[^`\\\r\n])*`)/,lookbehind:!0,greedy:!0,alias:"property"},identifier:{pattern:/`(?:[^`\\\r\n])*`/,greedy:!0},variable:/\$\w+/,keyword:/\b(?:ADD|ALL|AND|AS|ASC|ASCENDING|ASSERT|BY|CALL|CASE|COMMIT|CONSTRAINT|CONTAINS|CREATE|CSV|DELETE|DESC|DESCENDING|DETACH|DISTINCT|DO|DROP|ELSE|END|ENDS|EXISTS|FOR|FOREACH|IN|INDEX|IS|JOIN|KEY|LIMIT|LOAD|MANDATORY|MATCH|MERGE|NODE|NOT|OF|ON|OPTIONAL|OR|ORDER(?=\s+BY)|PERIODIC|REMOVE|REQUIRE|RETURN|SCALAR|SCAN|SET|SKIP|START|STARTS|THEN|UNION|UNIQUE|UNWIND|USING|WHEN|WHERE|WITH|XOR|YIELD)\b/i,function:/\b\w+\b(?=\s*\()/,boolean:/\b(?:false|null|true)\b/i,number:/\b(?:0x[\da-fA-F]+|\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)\b/,operator:/:|<--?|--?>?|<>|=~?|[<>]=?|[+*/%^|]|\.\.\.?/,punctuation:/[()[\]{},;.]/}}return wv}var Ev,uO;function zbe(){if(uO)return Ev;uO=1,Ev=e,e.displayName="d",e.aliases=[];function e(t){t.languages.d=t.languages.extend("clike",{comment:[{pattern:/^\s*#!.+/,greedy:!0},{pattern:RegExp(/(^|[^\\])/.source+"(?:"+[/\/\+(?:\/\+(?:[^+]|\+(?!\/))*\+\/|(?!\/\+)[\s\S])*?\+\//.source,/\/\/.*/.source,/\/\*[\s\S]*?\*\//.source].join("|")+")"),lookbehind:!0,greedy:!0}],string:[{pattern:RegExp([/\b[rx]"(?:\\[\s\S]|[^\\"])*"[cwd]?/.source,/\bq"(?:\[[\s\S]*?\]|\([\s\S]*?\)|<[\s\S]*?>|\{[\s\S]*?\})"/.source,/\bq"((?!\d)\w+)$[\s\S]*?^\1"/.source,/\bq"(.)[\s\S]*?\2"/.source,/(["`])(?:\\[\s\S]|(?!\3)[^\\])*\3[cwd]?/.source].join("|"),"m"),greedy:!0},{pattern:/\bq\{(?:\{[^{}]*\}|[^{}])*\}/,greedy:!0,alias:"token-string"}],keyword:/\$|\b(?:__(?:(?:DATE|EOF|FILE|FUNCTION|LINE|MODULE|PRETTY_FUNCTION|TIMESTAMP|TIME|VENDOR|VERSION)__|gshared|parameters|traits|vector)|abstract|alias|align|asm|assert|auto|body|bool|break|byte|case|cast|catch|cdouble|cent|cfloat|char|class|const|continue|creal|dchar|debug|default|delegate|delete|deprecated|do|double|dstring|else|enum|export|extern|false|final|finally|float|for|foreach|foreach_reverse|function|goto|idouble|if|ifloat|immutable|import|inout|int|interface|invariant|ireal|lazy|long|macro|mixin|module|new|nothrow|null|out|override|package|pragma|private|protected|ptrdiff_t|public|pure|real|ref|return|scope|shared|short|size_t|static|string|struct|super|switch|synchronized|template|this|throw|true|try|typedef|typeid|typeof|ubyte|ucent|uint|ulong|union|unittest|ushort|version|void|volatile|wchar|while|with|wstring)\b/,number:[/\b0x\.?[a-f\d_]+(?:(?!\.\.)\.[a-f\d_]*)?(?:p[+-]?[a-f\d_]+)?[ulfi]{0,4}/i,{pattern:/((?:\.\.)?)(?:\b0b\.?|\b|\.)\d[\d_]*(?:(?!\.\.)\.[\d_]*)?(?:e[+-]?\d[\d_]*)?[ulfi]{0,4}/i,lookbehind:!0}],operator:/\|[|=]?|&[&=]?|\+[+=]?|-[-=]?|\.?\.\.|=[>=]?|!(?:i[ns]\b|<>?=?|>=?|=)?|\bi[ns]\b|(?:<[<>]?|>>?>?|\^\^|[*\/%^~])=?/}),t.languages.insertBefore("d","string",{char:/'(?:\\(?:\W|\w+)|[^\\])'/}),t.languages.insertBefore("d","keyword",{property:/\B@\w*/}),t.languages.insertBefore("d","function",{register:{pattern:/\b(?:[ABCD][LHX]|E?(?:BP|DI|SI|SP)|[BS]PL|[ECSDGF]S|CR[0234]|[DS]IL|DR[012367]|E[ABCD]X|X?MM[0-7]|R(?:1[0-5]|[89])[BWD]?|R[ABCD]X|R[BS]P|R[DS]I|TR[3-7]|XMM(?:1[0-5]|[89])|YMM(?:1[0-5]|\d))\b|\bST(?:\([0-7]\)|\b)/,alias:"variable"}})}return Ev}var xv,dO;function Ube(){if(dO)return xv;dO=1,xv=e,e.displayName="dart",e.aliases=[];function e(t){(function(n){var r=[/\b(?:async|sync|yield)\*/,/\b(?:abstract|assert|async|await|break|case|catch|class|const|continue|covariant|default|deferred|do|dynamic|else|enum|export|extends|extension|external|factory|final|finally|for|get|hide|if|implements|import|in|interface|library|mixin|new|null|on|operator|part|rethrow|return|set|show|static|super|switch|sync|this|throw|try|typedef|var|void|while|with|yield)\b/],a=/(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,o={pattern:RegExp(a+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}}}};n.languages.dart=n.languages.extend("clike",{"class-name":[o,{pattern:RegExp(a+/[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source),lookbehind:!0,inside:o.inside}],keyword:r,operator:/\bis!|\b(?:as|is)\b|\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?/}),n.languages.insertBefore("dart","string",{"string-literal":{pattern:/r?(?:("""|''')[\s\S]*?\1|(["'])(?:\\.|(?!\2)[^\\\r\n])*\2(?!\2))/,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,lookbehind:!0,inside:{punctuation:/^\$\{?|\}$/,expression:{pattern:/[\s\S]+/,inside:n.languages.dart}}},string:/[\s\S]+/}},string:void 0}),n.languages.insertBefore("dart","class-name",{metadata:{pattern:/@\w+/,alias:"function"}}),n.languages.insertBefore("dart","class-name",{generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":o,keyword:r,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})})(t)}return xv}var kv,fO;function Bbe(){if(fO)return kv;fO=1,kv=e,e.displayName="dataweave",e.aliases=[];function e(t){(function(n){n.languages.dataweave={url:/\b[A-Za-z]+:\/\/[\w/:.?=&-]+|\burn:[\w:.?=&-]+/,property:{pattern:/(?:\b\w+#)?(?:"(?:\\.|[^\\"\r\n])*"|\b\w+)(?=\s*[:@])/,greedy:!0},string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},"mime-type":/\b(?:application|audio|image|multipart|text|video)\/[\w+-]+/,date:{pattern:/\|[\w:+-]+\|/,greedy:!0},comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],regex:{pattern:/\/(?:[^\\\/\r\n]|\\[^\r\n])+\//,greedy:!0},keyword:/\b(?:and|as|at|case|do|else|fun|if|input|is|match|not|ns|null|or|output|type|unless|update|using|var)\b/,function:/\b[A-Z_]\w*(?=\s*\()/i,number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\];(),.:@]/,operator:/<<|>>|->|[<>~=]=?|!=|--?-?|\+\+?|!|\?/,boolean:/\b(?:false|true)\b/}})(t)}return kv}var Cv,pO;function Hbe(){if(pO)return Cv;pO=1,Cv=e,e.displayName="dax",e.aliases=[];function e(t){t.languages.dax={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/).*)/,lookbehind:!0},"data-field":{pattern:/'(?:[^']|'')*'(?!')(?:\[[ \w\xA0-\uFFFF]+\])?|\w+\[[ \w\xA0-\uFFFF]+\]/,alias:"symbol"},measure:{pattern:/\[[ \w\xA0-\uFFFF]+\]/,alias:"constant"},string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},function:/\b(?:ABS|ACOS|ACOSH|ACOT|ACOTH|ADDCOLUMNS|ADDMISSINGITEMS|ALL|ALLCROSSFILTERED|ALLEXCEPT|ALLNOBLANKROW|ALLSELECTED|AND|APPROXIMATEDISTINCTCOUNT|ASIN|ASINH|ATAN|ATANH|AVERAGE|AVERAGEA|AVERAGEX|BETA\.DIST|BETA\.INV|BLANK|CALCULATE|CALCULATETABLE|CALENDAR|CALENDARAUTO|CEILING|CHISQ\.DIST|CHISQ\.DIST\.RT|CHISQ\.INV|CHISQ\.INV\.RT|CLOSINGBALANCEMONTH|CLOSINGBALANCEQUARTER|CLOSINGBALANCEYEAR|COALESCE|COMBIN|COMBINA|COMBINEVALUES|CONCATENATE|CONCATENATEX|CONFIDENCE\.NORM|CONFIDENCE\.T|CONTAINS|CONTAINSROW|CONTAINSSTRING|CONTAINSSTRINGEXACT|CONVERT|COS|COSH|COT|COTH|COUNT|COUNTA|COUNTAX|COUNTBLANK|COUNTROWS|COUNTX|CROSSFILTER|CROSSJOIN|CURRENCY|CURRENTGROUP|CUSTOMDATA|DATATABLE|DATE|DATEADD|DATEDIFF|DATESBETWEEN|DATESINPERIOD|DATESMTD|DATESQTD|DATESYTD|DATEVALUE|DAY|DEGREES|DETAILROWS|DISTINCT|DISTINCTCOUNT|DISTINCTCOUNTNOBLANK|DIVIDE|EARLIER|EARLIEST|EDATE|ENDOFMONTH|ENDOFQUARTER|ENDOFYEAR|EOMONTH|ERROR|EVEN|EXACT|EXCEPT|EXP|EXPON\.DIST|FACT|FALSE|FILTER|FILTERS|FIND|FIRSTDATE|FIRSTNONBLANK|FIRSTNONBLANKVALUE|FIXED|FLOOR|FORMAT|GCD|GENERATE|GENERATEALL|GENERATESERIES|GEOMEAN|GEOMEANX|GROUPBY|HASONEFILTER|HASONEVALUE|HOUR|IF|IF\.EAGER|IFERROR|IGNORE|INT|INTERSECT|ISBLANK|ISCROSSFILTERED|ISEMPTY|ISERROR|ISEVEN|ISFILTERED|ISINSCOPE|ISLOGICAL|ISNONTEXT|ISNUMBER|ISO\.CEILING|ISODD|ISONORAFTER|ISSELECTEDMEASURE|ISSUBTOTAL|ISTEXT|KEEPFILTERS|KEYWORDMATCH|LASTDATE|LASTNONBLANK|LASTNONBLANKVALUE|LCM|LEFT|LEN|LN|LOG|LOG10|LOOKUPVALUE|LOWER|MAX|MAXA|MAXX|MEDIAN|MEDIANX|MID|MIN|MINA|MINUTE|MINX|MOD|MONTH|MROUND|NATURALINNERJOIN|NATURALLEFTOUTERJOIN|NEXTDAY|NEXTMONTH|NEXTQUARTER|NEXTYEAR|NONVISUAL|NORM\.DIST|NORM\.INV|NORM\.S\.DIST|NORM\.S\.INV|NOT|NOW|ODD|OPENINGBALANCEMONTH|OPENINGBALANCEQUARTER|OPENINGBALANCEYEAR|OR|PARALLELPERIOD|PATH|PATHCONTAINS|PATHITEM|PATHITEMREVERSE|PATHLENGTH|PERCENTILE\.EXC|PERCENTILE\.INC|PERCENTILEX\.EXC|PERCENTILEX\.INC|PERMUT|PI|POISSON\.DIST|POWER|PREVIOUSDAY|PREVIOUSMONTH|PREVIOUSQUARTER|PREVIOUSYEAR|PRODUCT|PRODUCTX|QUARTER|QUOTIENT|RADIANS|RAND|RANDBETWEEN|RANK\.EQ|RANKX|RELATED|RELATEDTABLE|REMOVEFILTERS|REPLACE|REPT|RIGHT|ROLLUP|ROLLUPADDISSUBTOTAL|ROLLUPGROUP|ROLLUPISSUBTOTAL|ROUND|ROUNDDOWN|ROUNDUP|ROW|SAMEPERIODLASTYEAR|SAMPLE|SEARCH|SECOND|SELECTCOLUMNS|SELECTEDMEASURE|SELECTEDMEASUREFORMATSTRING|SELECTEDMEASURENAME|SELECTEDVALUE|SIGN|SIN|SINH|SQRT|SQRTPI|STARTOFMONTH|STARTOFQUARTER|STARTOFYEAR|STDEV\.P|STDEV\.S|STDEVX\.P|STDEVX\.S|SUBSTITUTE|SUBSTITUTEWITHINDEX|SUM|SUMMARIZE|SUMMARIZECOLUMNS|SUMX|SWITCH|T\.DIST|T\.DIST\.2T|T\.DIST\.RT|T\.INV|T\.INV\.2T|TAN|TANH|TIME|TIMEVALUE|TODAY|TOPN|TOPNPERLEVEL|TOPNSKIP|TOTALMTD|TOTALQTD|TOTALYTD|TREATAS|TRIM|TRUE|TRUNC|UNICHAR|UNICODE|UNION|UPPER|USERELATIONSHIP|USERNAME|USEROBJECTID|USERPRINCIPALNAME|UTCNOW|UTCTODAY|VALUE|VALUES|VAR\.P|VAR\.S|VARX\.P|VARX\.S|WEEKDAY|WEEKNUM|XIRR|XNPV|YEAR|YEARFRAC)(?=\s*\()/i,keyword:/\b(?:DEFINE|EVALUATE|MEASURE|ORDER\s+BY|RETURN|VAR|START\s+AT|ASC|DESC)\b/i,boolean:{pattern:/\b(?:FALSE|NULL|TRUE)\b/i,alias:"constant"},number:/\b\d+(?:\.\d*)?|\B\.\d+\b/,operator:/:=|[-+*\/=^]|&&?|\|\||<(?:=>?|<|>)?|>[>=]?|\b(?:IN|NOT)\b/i,punctuation:/[;\[\](){}`,.]/}}return Cv}var _v,gO;function Vbe(){if(gO)return _v;gO=1,_v=e,e.displayName="dhall",e.aliases=[];function e(t){t.languages.dhall={comment:/--.*|\{-(?:[^-{]|-(?!\})|\{(?!-)|\{-(?:[^-{]|-(?!\})|\{(?!-))*-\})*-\}/,string:{pattern:/"(?:[^"\\]|\\.)*"|''(?:[^']|'(?!')|'''|''\$\{)*''(?!'|\$)/,greedy:!0,inside:{interpolation:{pattern:/\$\{[^{}]*\}/,inside:{expression:{pattern:/(^\$\{)[\s\S]+(?=\}$)/,lookbehind:!0,alias:"language-dhall",inside:null},punctuation:/\$\{|\}/}}}},label:{pattern:/`[^`]*`/,greedy:!0},url:{pattern:/\bhttps?:\/\/[\w.:%!$&'*+;=@~-]+(?:\/[\w.:%!$&'*+;=@~-]*)*(?:\?[/?\w.:%!$&'*+;=@~-]*)?/,greedy:!0},env:{pattern:/\benv:(?:(?!\d)\w+|"(?:[^"\\=]|\\.)*")/,greedy:!0,inside:{function:/^env/,operator:/^:/,variable:/[\s\S]+/}},hash:{pattern:/\bsha256:[\da-fA-F]{64}\b/,inside:{function:/sha256/,operator:/:/,number:/[\da-fA-F]{64}/}},keyword:/\b(?:as|assert|else|forall|if|in|let|merge|missing|then|toMap|using|with)\b|\u2200/,builtin:/\b(?:None|Some)\b/,boolean:/\b(?:False|True)\b/,number:/\bNaN\b|-?\bInfinity\b|[+-]?\b(?:0x[\da-fA-F]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/,operator:/\/\\|\/\/\\\\|&&|\|\||===|[!=]=|\/\/|->|\+\+|::|[+*#@=:?<>|\\\u2227\u2a53\u2261\u2afd\u03bb\u2192]/,punctuation:/\.\.|[{}\[\](),./]/,"class-name":/\b[A-Z]\w*\b/},t.languages.dhall.string.inside.interpolation.inside.expression.inside=t.languages.dhall}return _v}var Av,mO;function qbe(){if(mO)return Av;mO=1,Av=e,e.displayName="diff",e.aliases=[];function e(t){(function(n){n.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var r={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(r).forEach(function(a){var o=r[a],i=[];/^\w+$/.test(a)||i.push(/\w+/.exec(a)[0]),a==="diff"&&i.push("bold"),n.languages.diff[a]={pattern:RegExp("^(?:["+o+`].*(?:\r ?| -|(?![\\s\\S])))+`,"m"),alias:i,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(a)[0]}}}}),Object.defineProperty(n.languages.diff,"PREFIXES",{value:r})})(t)}return _v}var Av,hO;function mr(){if(hO)return Av;hO=1,Av=e,e.displayName="markupTemplating",e.aliases=[];function e(t){(function(n){function r(a,o){return"___"+a.toUpperCase()+o+"___"}Object.defineProperties(n.languages["markup-templating"]={},{buildPlaceholders:{value:function(a,o,i,s){if(a.language===o){var l=a.tokenStack=[];a.code=a.code.replace(i,function(c){if(typeof s=="function"&&!s(c))return c;for(var u=l.length,d;a.code.indexOf(d=r(o,u))!==-1;)++u;return l[u]=c,d}),a.grammar=n.languages.markup}}},tokenizePlaceholders:{value:function(a,o){if(a.language!==o||!a.tokenStack)return;a.grammar=n.languages[o];var i=0,s=Object.keys(a.tokenStack);function l(c){for(var u=0;u=s.length);u++){var d=c[u];if(typeof d=="string"||d.content&&typeof d.content=="string"){var g=s[i],m=a.tokenStack[g],b=typeof d=="string"?d:d.content,y=r(o,g),w=b.indexOf(y);if(w>-1){++i;var v=b.substring(0,w),h=new n.Token(o,n.tokenize(m,a.grammar),"language-"+o,m),S=b.substring(w+y.length),E=[];v&&E.push.apply(E,l([v])),E.push(h),S&&E.push.apply(E,l([S])),typeof d=="string"?c.splice.apply(c,[u,1].concat(E)):d.content=E}}else d.content&&l(d.content)}return c}l(a.tokens)}}})})(t)}return Av}var Tv,bO;function Gbe(){if(bO)return Tv;bO=1;var e=mr();Tv=t,t.displayName="django",t.aliases=["jinja2"];function t(n){n.register(e),function(r){r.languages.django={comment:/^\{#[\s\S]*?#\}$/,tag:{pattern:/(^\{%[+-]?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%][+-]?|[+-]?[}%]\}$/,alias:"punctuation"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},filter:{pattern:/(\|)\w+/,lookbehind:!0,alias:"function"},test:{pattern:/(\bis\s+(?:not\s+)?)(?!not\b)\w+/,lookbehind:!0,alias:"function"},function:/\b[a-z_]\w+(?=\s*\()/i,keyword:/\b(?:and|as|by|else|for|if|import|in|is|loop|not|or|recursive|with|without)\b/,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,number:/\b\d+(?:\.\d+)?\b/,boolean:/[Ff]alse|[Nn]one|[Tt]rue/,variable:/\b\w+\b/,punctuation:/[{}[\](),.:;]/};var a=/\{\{[\s\S]*?\}\}|\{%[\s\S]*?%\}|\{#[\s\S]*?#\}/g,o=r.languages["markup-templating"];r.hooks.add("before-tokenize",function(i){o.buildPlaceholders(i,"django",a)}),r.hooks.add("after-tokenize",function(i){o.tokenizePlaceholders(i,"django")}),r.languages.jinja2=r.languages.django,r.hooks.add("before-tokenize",function(i){o.buildPlaceholders(i,"jinja2",a)}),r.hooks.add("after-tokenize",function(i){o.tokenizePlaceholders(i,"jinja2")})}(n)}return Tv}var Rv,yO;function Wbe(){if(yO)return Rv;yO=1,Rv=e,e.displayName="dnsZoneFile",e.aliases=[];function e(t){t.languages["dns-zone-file"]={comment:/;.*/,string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},variable:[{pattern:/(^\$ORIGIN[ \t]+)\S+/m,lookbehind:!0},{pattern:/(^|\s)@(?=\s|$)/,lookbehind:!0}],keyword:/^\$(?:INCLUDE|ORIGIN|TTL)(?=\s|$)/m,class:{pattern:/(^|\s)(?:CH|CS|HS|IN)(?=\s|$)/,lookbehind:!0,alias:"keyword"},type:{pattern:/(^|\s)(?:A|A6|AAAA|AFSDB|APL|ATMA|CAA|CDNSKEY|CDS|CERT|CNAME|DHCID|DLV|DNAME|DNSKEY|DS|EID|GID|GPOS|HINFO|HIP|IPSECKEY|ISDN|KEY|KX|LOC|MAILA|MAILB|MB|MD|MF|MG|MINFO|MR|MX|NAPTR|NB|NBSTAT|NIMLOC|NINFO|NS|NSAP|NSAP-PTR|NSEC|NSEC3|NSEC3PARAM|NULL|NXT|OPENPGPKEY|PTR|PX|RKEY|RP|RRSIG|RT|SIG|SINK|SMIMEA|SOA|SPF|SRV|SSHFP|TA|TKEY|TLSA|TSIG|TXT|UID|UINFO|UNSPEC|URI|WKS|X25)(?=\s|$)/,lookbehind:!0,alias:"keyword"},punctuation:/[()]/},t.languages["dns-zone"]=t.languages["dns-zone-file"]}return Rv}var Nv,vO;function Kbe(){if(vO)return Nv;vO=1,Nv=e,e.displayName="docker",e.aliases=["dockerfile"];function e(t){(function(n){var r=/\\[\r\n](?:\s|\\[\r\n]|#.*(?!.))*(?![\s#]|\\[\r\n])/.source,a=/(?:[ \t]+(?![ \t])(?:)?|)/.source.replace(//g,function(){return r}),o=/"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*"|'(?:[^'\\\r\n]|\\(?:\r\n|[\s\S]))*'/.source,i=/--[\w-]+=(?:|(?!["'])(?:[^\s\\]|\\.)+)/.source.replace(//g,function(){return o}),s={pattern:RegExp(o),greedy:!0},l={pattern:/(^[ \t]*)#.*/m,lookbehind:!0,greedy:!0};function c(u,d){return u=u.replace(//g,function(){return i}).replace(//g,function(){return a}),RegExp(u,d)}n.languages.docker={instruction:{pattern:/(^[ \t]*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)(?:\\.|[^\r\n\\])*(?:\\$(?:\s|#.*$)*(?![\s#])(?:\\.|[^\r\n\\])*)*/im,lookbehind:!0,greedy:!0,inside:{options:{pattern:c(/(^(?:ONBUILD)?\w+)(?:)*/.source,"i"),lookbehind:!0,greedy:!0,inside:{property:{pattern:/(^|\s)--[\w-]+/,lookbehind:!0},string:[s,{pattern:/(=)(?!["'])(?:[^\s\\]|\\.)+/,lookbehind:!0}],operator:/\\$/m,punctuation:/=/}},keyword:[{pattern:c(/(^(?:ONBUILD)?HEALTHCHECK(?:)*)(?:CMD|NONE)\b/.source,"i"),lookbehind:!0,greedy:!0},{pattern:c(/(^(?:ONBUILD)?FROM(?:)*(?!--)[^ \t\\]+)AS/.source,"i"),lookbehind:!0,greedy:!0},{pattern:c(/(^ONBUILD)\w+/.source,"i"),lookbehind:!0,greedy:!0},{pattern:/^\w+/,greedy:!0}],comment:l,string:s,variable:/\$(?:\w+|\{[^{}"'\\]*\})/,operator:/\\$/m}},comment:l},n.languages.dockerfile=n.languages.docker})(t)}return Nv}var Iv,SO;function Ybe(){if(SO)return Iv;SO=1,Iv=e,e.displayName="dot",e.aliases=["gv"];function e(t){(function(n){var r="(?:"+[/[a-zA-Z_\x80-\uFFFF][\w\x80-\uFFFF]*/.source,/-?(?:\.\d+|\d+(?:\.\d*)?)/.source,/"[^"\\]*(?:\\[\s\S][^"\\]*)*"/.source,/<(?:[^<>]|(?!)*>/.source].join("|")+")",a={markup:{pattern:/(^<)[\s\S]+(?=>$)/,lookbehind:!0,alias:["language-markup","language-html","language-xml"],inside:n.languages.markup}};function o(i,s){return RegExp(i.replace(//g,function(){return r}),s)}n.languages.dot={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\/|^#.*/m,greedy:!0},"graph-name":{pattern:o(/(\b(?:digraph|graph|subgraph)[ \t\r\n]+)/.source,"i"),lookbehind:!0,greedy:!0,alias:"class-name",inside:a},"attr-value":{pattern:o(/(=[ \t\r\n]*)/.source),lookbehind:!0,greedy:!0,inside:a},"attr-name":{pattern:o(/([\[;, \t\r\n])(?=[ \t\r\n]*=)/.source),lookbehind:!0,greedy:!0,inside:a},keyword:/\b(?:digraph|edge|graph|node|strict|subgraph)\b/i,"compass-point":{pattern:/(:[ \t\r\n]*)(?:[ewc_]|[ns][ew]?)(?![\w\x80-\uFFFF])/,lookbehind:!0,alias:"builtin"},node:{pattern:o(/(^|[^-.\w\x80-\uFFFF\\])/.source),lookbehind:!0,greedy:!0,inside:a},operator:/[=:]|-[->]/,punctuation:/[\[\]{};,]/},n.languages.gv=n.languages.dot})(t)}return Iv}var Ov,wO;function Zbe(){if(wO)return Ov;wO=1,Ov=e,e.displayName="ebnf",e.aliases=[];function e(t){t.languages.ebnf={comment:/\(\*[\s\S]*?\*\)/,string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,greedy:!0},special:{pattern:/\?[^?\r\n]*\?/,greedy:!0,alias:"class-name"},definition:{pattern:/^([\t ]*)[a-z]\w*(?:[ \t]+[a-z]\w*)*(?=\s*=)/im,lookbehind:!0,alias:["rule","keyword"]},rule:/\b[a-z]\w*(?:[ \t]+[a-z]\w*)*\b/i,punctuation:/\([:/]|[:/]\)|[.,;()[\]{}]/,operator:/[-=|*/!]/}}return Ov}var Dv,EO;function Xbe(){if(EO)return Dv;EO=1,Dv=e,e.displayName="editorconfig",e.aliases=[];function e(t){t.languages.editorconfig={comment:/[;#].*/,section:{pattern:/(^[ \t]*)\[.+\]/m,lookbehind:!0,alias:"selector",inside:{regex:/\\\\[\[\]{},!?.*]/,operator:/[!?]|\.\.|\*{1,2}/,punctuation:/[\[\]{},]/}},key:{pattern:/(^[ \t]*)[^\s=]+(?=[ \t]*=)/m,lookbehind:!0,alias:"attr-name"},value:{pattern:/=.*/,alias:"attr-value",inside:{punctuation:/^=/}}}}return Dv}var Lv,xO;function Qbe(){if(xO)return Lv;xO=1,Lv=e,e.displayName="eiffel",e.aliases=[];function e(t){t.languages.eiffel={comment:/--.*/,string:[{pattern:/"([^[]*)\[[\s\S]*?\]\1"/,greedy:!0},{pattern:/"([^{]*)\{[\s\S]*?\}\1"/,greedy:!0},{pattern:/"(?:%(?:(?!\n)\s)*\n\s*%|%\S|[^%"\r\n])*"/,greedy:!0}],char:/'(?:%.|[^%'\r\n])+'/,keyword:/\b(?:across|agent|alias|all|and|as|assign|attached|attribute|check|class|convert|create|Current|debug|deferred|detachable|do|else|elseif|end|ensure|expanded|export|external|feature|from|frozen|if|implies|inherit|inspect|invariant|like|local|loop|not|note|obsolete|old|once|or|Precursor|redefine|rename|require|rescue|Result|retry|select|separate|some|then|undefine|until|variant|Void|when|xor)\b/i,boolean:/\b(?:False|True)\b/i,"class-name":/\b[A-Z][\dA-Z_]*\b/,number:[/\b0[xcb][\da-f](?:_*[\da-f])*\b/i,/(?:\b\d(?:_*\d)*)?\.(?:(?:\d(?:_*\d)*)?e[+-]?)?\d(?:_*\d)*\b|\b\d(?:_*\d)*\b\.?/i],punctuation:/:=|<<|>>|\(\||\|\)|->|\.(?=\w)|[{}[\];(),:?]/,operator:/\\\\|\|\.\.\||\.\.|\/[~\/=]?|[><]=?|[-+*^=~]/}}return Lv}var Mv,kO;function Jbe(){if(kO)return Mv;kO=1;var e=mr();Mv=t,t.displayName="ejs",t.aliases=["eta"];function t(n){n.register(e),function(r){r.languages.ejs={delimiter:{pattern:/^<%[-_=]?|[-_]?%>$/,alias:"punctuation"},comment:/^#[\s\S]*/,"language-javascript":{pattern:/[\s\S]+/,inside:r.languages.javascript}},r.hooks.add("before-tokenize",function(a){var o=/<%(?!%)[\s\S]+?%>/g;r.languages["markup-templating"].buildPlaceholders(a,"ejs",o)}),r.hooks.add("after-tokenize",function(a){r.languages["markup-templating"].tokenizePlaceholders(a,"ejs")}),r.languages.eta=r.languages.ejs}(n)}return Mv}var Pv,CO;function eye(){if(CO)return Pv;CO=1,Pv=e,e.displayName="elixir",e.aliases=[];function e(t){t.languages.elixir={doc:{pattern:/@(?:doc|moduledoc)\s+(?:("""|''')[\s\S]*?\1|("|')(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2)/,inside:{attribute:/^@\w+/,string:/['"][\s\S]+/}},comment:{pattern:/#.*/,greedy:!0},regex:{pattern:/~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,greedy:!0},string:[{pattern:/~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,greedy:!0,inside:{}},{pattern:/("""|''')[\s\S]*?\1/,greedy:!0,inside:{}},{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{}}],atom:{pattern:/(^|[^:]):\w+/,lookbehind:!0,alias:"symbol"},module:{pattern:/\b[A-Z]\w*\b/,alias:"class-name"},"attr-name":/\b\w+\??:(?!:)/,argument:{pattern:/(^|[^&])&\d+/,lookbehind:!0,alias:"variable"},attribute:{pattern:/@\w+/,alias:"variable"},function:/\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|(?=\/\d))/,number:/\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,keyword:/\b(?:after|alias|and|case|catch|cond|def(?:callback|delegate|exception|impl|macro|module|n|np|p|protocol|struct)?|do|else|end|fn|for|if|import|not|or|quote|raise|require|rescue|try|unless|unquote|use|when)\b/,boolean:/\b(?:false|nil|true)\b/,operator:[/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\[\]{}()]/},t.languages.elixir.string.forEach(function(n){n.inside={interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:t.languages.elixir}}}})}return Pv}var $v,_O;function tye(){if(_O)return $v;_O=1,$v=e,e.displayName="elm",e.aliases=[];function e(t){t.languages.elm={comment:/--.*|\{-[\s\S]*?-\}/,char:{pattern:/'(?:[^\\'\r\n]|\\(?:[abfnrtv\\']|\d+|x[0-9a-fA-F]+|u\{[0-9a-fA-F]+\}))'/,greedy:!0},string:[{pattern:/"""[\s\S]*?"""/,greedy:!0},{pattern:/"(?:[^\\"\r\n]|\\.)*"/,greedy:!0}],"import-statement":{pattern:/(^[\t ]*)import\s+[A-Z]\w*(?:\.[A-Z]\w*)*(?:\s+as\s+(?:[A-Z]\w*)(?:\.[A-Z]\w*)*)?(?:\s+exposing\s+)?/m,lookbehind:!0,inside:{keyword:/\b(?:as|exposing|import)\b/}},keyword:/\b(?:alias|as|case|else|exposing|if|in|infixl|infixr|let|module|of|then|type)\b/,builtin:/\b(?:abs|acos|always|asin|atan|atan2|ceiling|clamp|compare|cos|curry|degrees|e|flip|floor|fromPolar|identity|isInfinite|isNaN|logBase|max|min|negate|never|not|pi|radians|rem|round|sin|sqrt|tan|toFloat|toPolar|toString|truncate|turns|uncurry|xor)\b/,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0x[0-9a-f]+)\b/i,operator:/\s\.\s|[+\-/*=.$<>:&|^?%#@~!]{2,}|[+\-/*=$<>:&|^?%#@~!]/,hvariable:/\b(?:[A-Z]\w*\.)*[a-z]\w*\b/,constant:/\b(?:[A-Z]\w*\.)*[A-Z]\w*\b/,punctuation:/[{}[\]|(),.:]/}}return $v}var Fv,AO;function nye(){if(AO)return Fv;AO=1;var e=Ah(),t=mr();Fv=n,n.displayName="erb",n.aliases=[];function n(r){r.register(e),r.register(t),function(a){a.languages.erb={delimiter:{pattern:/^(\s*)<%=?|%>(?=\s*$)/,lookbehind:!0,alias:"punctuation"},ruby:{pattern:/\s*\S[\s\S]*/,alias:"language-ruby",inside:a.languages.ruby}},a.hooks.add("before-tokenize",function(o){var i=/<%=?(?:[^\r\n]|[\r\n](?!=begin)|[\r\n]=begin\s(?:[^\r\n]|[\r\n](?!=end))*[\r\n]=end)+?%>/g;a.languages["markup-templating"].buildPlaceholders(o,"erb",i)}),a.hooks.add("after-tokenize",function(o){a.languages["markup-templating"].tokenizePlaceholders(o,"erb")})}(r)}return Fv}var jv,TO;function rye(){if(TO)return jv;TO=1,jv=e,e.displayName="erlang",e.aliases=[];function e(t){t.languages.erlang={comment:/%.+/,string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},"quoted-function":{pattern:/'(?:\\.|[^\\'\r\n])+'(?=\()/,alias:"function"},"quoted-atom":{pattern:/'(?:\\.|[^\\'\r\n])+'/,alias:"atom"},boolean:/\b(?:false|true)\b/,keyword:/\b(?:after|case|catch|end|fun|if|of|receive|try|when)\b/,number:[/\$\\?./,/\b\d+#[a-z0-9]+/i,/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i],function:/\b[a-z][\w@]*(?=\()/,variable:{pattern:/(^|[^@])(?:\b|\?)[A-Z_][\w@]*/,lookbehind:!0},operator:[/[=\/<>:]=|=[:\/]=|\+\+?|--?|[=*\/!]|\b(?:and|andalso|band|bnot|bor|bsl|bsr|bxor|div|not|or|orelse|rem|xor)\b/,{pattern:/(^|[^<])<(?!<)/,lookbehind:!0},{pattern:/(^|[^>])>(?!>)/,lookbehind:!0}],atom:/\b[a-z][\w@]*/,punctuation:/[()[\]{}:;,.#|]|<<|>>/}}return jv}var zv,RO;function oz(){if(RO)return zv;RO=1,zv=e,e.displayName="lua",e.aliases=[];function e(t){t.languages.lua={comment:/^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,greedy:!0},number:/\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,keyword:/\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,function:/(?!\d)\w+(?=\s*(?:[({]))/,operator:[/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\.\.(?!\.)/,lookbehind:!0}],punctuation:/[\[\](){},;]|\.+|:+/}}return zv}var Uv,NO;function aye(){if(NO)return Uv;NO=1;var e=oz(),t=mr();Uv=n,n.displayName="etlua",n.aliases=[];function n(r){r.register(e),r.register(t),function(a){a.languages.etlua={delimiter:{pattern:/^<%[-=]?|-?%>$/,alias:"punctuation"},"language-lua":{pattern:/[\s\S]+/,inside:a.languages.lua}},a.hooks.add("before-tokenize",function(o){var i=/<%[\s\S]+?%>/g;a.languages["markup-templating"].buildPlaceholders(o,"etlua",i)}),a.hooks.add("after-tokenize",function(o){a.languages["markup-templating"].tokenizePlaceholders(o,"etlua")})}(r)}return Uv}var Bv,IO;function oye(){if(IO)return Bv;IO=1,Bv=e,e.displayName="excelFormula",e.aliases=[];function e(t){t.languages["excel-formula"]={comment:{pattern:/(\bN\(\s*)"(?:[^"]|"")*"(?=\s*\))/i,lookbehind:!0,greedy:!0},string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},reference:{pattern:/(?:'[^']*'|(?:[^\s()[\]{}<>*?"';,$&]*\[[^^\s()[\]{}<>*?"']+\])?\w+)!/,greedy:!0,alias:"string",inside:{operator:/!$/,punctuation:/'/,sheet:{pattern:/[^[\]]+$/,alias:"function"},file:{pattern:/\[[^[\]]+\]$/,inside:{punctuation:/[[\]]/}},path:/[\s\S]+/}},"function-name":{pattern:/\b[A-Z]\w*(?=\()/i,alias:"keyword"},range:{pattern:/\$?\b(?:[A-Z]+\$?\d+:\$?[A-Z]+\$?\d+|[A-Z]+:\$?[A-Z]+|\d+:\$?\d+)\b/i,alias:"property",inside:{operator:/:/,cell:/\$?[A-Z]+\$?\d+/i,column:/\$?[A-Z]+/i,row:/\$?\d+/}},cell:{pattern:/\b[A-Z]+\d+\b|\$[A-Za-z]+\$?\d+\b|\b[A-Za-z]+\$\d+\b/,alias:"property"},number:/(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?\b/i,boolean:/\b(?:FALSE|TRUE)\b/i,operator:/[-+*/^%=&,]|<[=>]?|>=?/,punctuation:/[[\]();{}|]/},t.languages.xlsx=t.languages.xls=t.languages["excel-formula"]}return Bv}var Hv,OO;function iye(){if(OO)return Hv;OO=1,Hv=e,e.displayName="factor",e.aliases=[];function e(t){(function(n){var r={function:/\b(?:BUGS?|FIX(?:MES?)?|NOTES?|TODOS?|XX+|HACKS?|WARN(?:ING)?|\?{2,}|!{2,})\b/},a={number:/\\[^\s']|%\w/},o={comment:[{pattern:/(^|\s)(?:! .*|!$)/,lookbehind:!0,inside:r},{pattern:/(^|\s)\/\*\s[\s\S]*?\*\/(?=\s|$)/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|\s)!\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,lookbehind:!0,greedy:!0,inside:r}],number:[{pattern:/(^|\s)[+-]?\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?0(?:b[01]+|o[0-7]+|d\d+|x[\dA-F]+)(?=\s|$)/i,lookbehind:!0},{pattern:/(^|\s)[+-]?\d+\/\d+\.?(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)\+?\d+\+\d+\/\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)-\d+-\d+\/\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?(?:\d*\.\d+|\d+\.\d*|\d+)(?:e[+-]?\d+)?(?=\s|$)/i,lookbehind:!0},{pattern:/(^|\s)NAN:\s+[\da-fA-F]+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?0(?:b1\.[01]*|o1\.[0-7]*|d1\.\d*|x1\.[\dA-F]*)p\d+(?=\s|$)/i,lookbehind:!0}],regexp:{pattern:/(^|\s)R\/\s(?:\\\S|[^\\/])*\/(?:[idmsr]*|[idmsr]+-[idmsr]+)(?=\s|$)/,lookbehind:!0,alias:"number",inside:{variable:/\\\S/,keyword:/[+?*\[\]^$(){}.|]/,operator:{pattern:/(\/)[idmsr]+(?:-[idmsr]+)?/,lookbehind:!0}}},boolean:{pattern:/(^|\s)[tf](?=\s|$)/,lookbehind:!0},"custom-string":{pattern:/(^|\s)[A-Z0-9\-]+"\s(?:\\\S|[^"\\])*"/,lookbehind:!0,greedy:!0,alias:"string",inside:{number:/\\\S|%\w|\//}},"multiline-string":[{pattern:/(^|\s)STRING:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*;(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:{number:a.number,"semicolon-or-setlocal":{pattern:/([\r\n][ \t]*);(?=\s|$)/,lookbehind:!0,alias:"function"}}},{pattern:/(^|\s)HEREDOC:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*\S+(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:a},{pattern:/(^|\s)\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:a}],"special-using":{pattern:/(^|\s)USING:(?:\s\S+)*(?=\s+;(?:\s|$))/,lookbehind:!0,alias:"function",inside:{string:{pattern:/(\s)[^:\s]+/,lookbehind:!0}}},"stack-effect-delimiter":[{pattern:/(^|\s)(?:call|eval|execute)?\((?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)--(?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)\)(?=\s|$)/,lookbehind:!0,alias:"operator"}],combinators:{pattern:null,lookbehind:!0,alias:"keyword"},"kernel-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"sequences-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"math-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"constructor-word":{pattern:/(^|\s)<(?!=+>|-+>)\S+>(?=\s|$)/,lookbehind:!0,alias:"keyword"},"other-builtin-syntax":{pattern:null,lookbehind:!0,alias:"operator"},"conventionally-named-word":{pattern:/(^|\s)(?!")(?:(?:change|new|set|with)-\S+|\$\S+|>[^>\s]+|[^:>\s]+>|[^>\s]+>[^>\s]+|\+[^+\s]+\+|[^?\s]+\?|\?[^?\s]+|[^>\s]+>>|>>[^>\s]+|[^<\s]+<<|\([^()\s]+\)|[^!\s]+!|[^*\s]\S*\*|[^.\s]\S*\.)(?=\s|$)/,lookbehind:!0,alias:"keyword"},"colon-syntax":{pattern:/(^|\s)(?:[A-Z0-9\-]+#?)?:{1,2}\s+(?:;\S+|(?!;)\S+)(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"function"},"semicolon-or-setlocal":{pattern:/(\s)(?:;|:>)(?=\s|$)/,lookbehind:!0,alias:"function"},"curly-brace-literal-delimiter":[{pattern:/(^|\s)[a-z]*\{(?=\s)/i,lookbehind:!0,alias:"operator"},{pattern:/(\s)\}(?=\s|$)/,lookbehind:!0,alias:"operator"}],"quotation-delimiter":[{pattern:/(^|\s)\[(?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)\](?=\s|$)/,lookbehind:!0,alias:"operator"}],"normal-word":{pattern:/(^|\s)[^"\s]\S*(?=\s|$)/,lookbehind:!0},string:{pattern:/"(?:\\\S|[^"\\])*"/,greedy:!0,inside:a}},i=function(u){return(u+"").replace(/([.?*+\^$\[\]\\(){}|\-])/g,"\\$1")},s=function(u){return new RegExp("(^|\\s)(?:"+u.map(i).join("|")+")(?=\\s|$)")},l={"kernel-builtin":["or","2nipd","4drop","tuck","wrapper","nip","wrapper?","callstack>array","die","dupd","callstack","callstack?","3dup","hashcode","pick","4nip","build",">boolean","nipd","clone","5nip","eq?","?","=","swapd","2over","clear","2dup","get-retainstack","not","tuple?","dup","3nipd","call","-rotd","object","drop","assert=","assert?","-rot","execute","boa","get-callstack","curried?","3drop","pickd","overd","over","roll","3nip","swap","and","2nip","rotd","throw","(clone)","hashcode*","spin","reach","4dup","equal?","get-datastack","assert","2drop","","boolean?","identity-hashcode","identity-tuple?","null","composed?","new","5drop","rot","-roll","xor","identity-tuple","boolean"],"other-builtin-syntax":["=======","recursive","flushable",">>","<<<<<<","M\\","B","PRIVATE>","\\","======","final","inline","delimiter","deprecated",">>>>>","<<<<<<<","parse-complex","malformed-complex","read-only",">>>>>>>","call-next-method","<<","foldable","$","$[","${"],"sequences-builtin":["member-eq?","mismatch","append","assert-sequence=","longer","repetition","clone-like","3sequence","assert-sequence?","last-index-from","reversed","index-from","cut*","pad-tail","join-as","remove-eq!","concat-as","but-last","snip","nths","nth","sequence","longest","slice?","","remove-nth","tail-slice","empty?","tail*","member?","virtual-sequence?","set-length","drop-prefix","iota","unclip","bounds-error?","unclip-last-slice","non-negative-integer-expected","non-negative-integer-expected?","midpoint@","longer?","?set-nth","?first","rest-slice","prepend-as","prepend","fourth","sift","subseq-start","new-sequence","?last","like","first4","1sequence","reverse","slice","virtual@","repetition?","set-last","index","4sequence","max-length","set-second","immutable-sequence","first2","first3","supremum","unclip-slice","suffix!","insert-nth","tail","3append","short","suffix","concat","flip","immutable?","reverse!","2sequence","sum","delete-all","indices","snip-slice","","check-slice","sequence?","head","append-as","halves","sequence=","collapse-slice","?second","slice-error?","product","bounds-check?","bounds-check","immutable","virtual-exemplar","harvest","remove","pad-head","last","set-fourth","cartesian-product","remove-eq","shorten","shorter","reversed?","shorter?","shortest","head-slice","pop*","tail-slice*","but-last-slice","iota?","append!","cut-slice","new-resizable","head-slice*","sequence-hashcode","pop","set-nth","?nth","second","join","immutable-sequence?","","3append-as","virtual-sequence","subseq?","remove-nth!","length","last-index","lengthen","assert-sequence","copy","move","third","first","tail?","set-first","prefix","bounds-error","","exchange","surround","cut","min-length","set-third","push-all","head?","subseq-start-from","delete-slice","rest","sum-lengths","head*","infimum","remove!","glue","slice-error","subseq","push","replace-slice","subseq-as","unclip-last"],"math-builtin":["number=","next-power-of-2","?1+","fp-special?","imaginary-part","float>bits","number?","fp-infinity?","bignum?","fp-snan?","denominator","gcd","*","+","fp-bitwise=","-","u>=","/",">=","bitand","power-of-2?","log2-expects-positive","neg?","<","log2",">","integer?","number","bits>double","2/","zero?","bits>float","float?","shift","ratio?","rect>","even?","ratio","fp-sign","bitnot",">fixnum","complex?","/i","integer>fixnum","/f","sgn",">bignum","next-float","u<","u>","mod","recip","rational",">float","2^","integer","fixnum?","neg","fixnum","sq","bignum",">rect","bit?","fp-qnan?","simple-gcd","complex","","real",">fraction","double>bits","bitor","rem","fp-nan-payload","real-part","log2-expects-positive?","prev-float","align","unordered?","float","fp-nan?","abs","bitxor","integer>fixnum-strict","u<=","odd?","<=","/mod",">integer","real?","rational?","numerator"]};Object.keys(l).forEach(function(u){o[u].pattern=s(l[u])});var c=["2bi","while","2tri","bi*","4dip","both?","same?","tri@","curry","prepose","3bi","?if","tri*","2keep","3keep","curried","2keepd","when","2bi*","2tri*","4keep","bi@","keepdd","do","unless*","tri-curry","if*","loop","bi-curry*","when*","2bi@","2tri@","with","2with","either?","bi","until","3dip","3curry","tri-curry*","tri-curry@","bi-curry","keepd","compose","2dip","if","3tri","unless","tuple","keep","2curry","tri","most","while*","dip","composed","bi-curry@","find-last-from","trim-head-slice","map-as","each-from","none?","trim-tail","partition","if-empty","accumulate*","reject!","find-from","accumulate-as","collector-for-as","reject","map","map-sum","accumulate!","2each-from","follow","supremum-by","map!","unless-empty","collector","padding","reduce-index","replicate-as","infimum-by","trim-tail-slice","count","find-index","filter","accumulate*!","reject-as","map-integers","map-find","reduce","selector","interleave","2map","filter-as","binary-reduce","map-index-as","find","produce","filter!","replicate","cartesian-map","cartesian-each","find-index-from","map-find-last","3map-as","3map","find-last","selector-as","2map-as","2map-reduce","accumulate","each","each-index","accumulate*-as","when-empty","all?","collector-as","push-either","new-like","collector-for","2selector","push-if","2all?","map-reduce","3each","any?","trim-slice","2reduce","change-nth","produce-as","2each","trim","trim-head","cartesian-find","map-index","if-zero","each-integer","unless-zero","(find-integer)","when-zero","find-last-integer","(all-integers?)","times","(each-integer)","find-integer","all-integers?","unless-negative","if-positive","when-positive","when-negative","unless-positive","if-negative","case","2cleave","cond>quot","case>quot","3cleave","wrong-values","to-fixed-point","alist>quot","cond","cleave","call-effect","recursive-hashcode","spread","deep-spread>quot","2||","0||","n||","0&&","2&&","3||","1||","1&&","n&&","3&&","smart-unless*","keep-inputs","reduce-outputs","smart-when*","cleave>array","smart-with","smart-apply","smart-if","inputs/outputs","output>sequence-n","map-outputs","map-reduce-outputs","dropping","output>array","smart-map-reduce","smart-2map-reduce","output>array-n","nullary","inputsequence"];o.combinators.pattern=s(c),n.languages.factor=o})(t)}return Hv}var Vv,DO;function sye(){if(DO)return Vv;DO=1,Vv=e,e.displayName="$false",e.aliases=[];function e(t){(function(n){n.languages.false={comment:{pattern:/\{[^}]*\}/},string:{pattern:/"[^"]*"/,greedy:!0},"character-code":{pattern:/'(?:[^\r]|\r\n?)/,alias:"number"},"assembler-code":{pattern:/\d+`/,alias:"important"},number:/\d+/,operator:/[-!#$%&'*+,./:;=>?@\\^_`|~ßø]/,punctuation:/\[|\]/,variable:/[a-z]/,"non-standard":{pattern:/[()!=]=?|[-+*/%]|\b(?:in|is)\b/}),delete t.languages["firestore-security-rules"]["class-name"],t.languages.insertBefore("firestore-security-rules","keyword",{path:{pattern:/(^|[\s(),])(?:\/(?:[\w\xA0-\uFFFF]+|\{[\w\xA0-\uFFFF]+(?:=\*\*)?\}|\$\([\w\xA0-\uFFFF.]+\)))+/,lookbehind:!0,greedy:!0,inside:{variable:{pattern:/\{[\w\xA0-\uFFFF]+(?:=\*\*)?\}|\$\([\w\xA0-\uFFFF.]+\)/,inside:{operator:/=/,keyword:/\*\*/,punctuation:/[.$(){}]/}},punctuation:/\//}},method:{pattern:/(\ballow\s+)[a-z]+(?:\s*,\s*[a-z]+)*(?=\s*[:;])/,lookbehind:!0,alias:"builtin",inside:{punctuation:/,/}}})}return qv}var Gv,MO;function cye(){if(MO)return Gv;MO=1,Gv=e,e.displayName="flow",e.aliases=[];function e(t){(function(n){n.languages.flow=n.languages.extend("javascript",{}),n.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|any|mixed|null|void)\b/,alias:"tag"}]}),n.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete n.languages.flow.parameter,n.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(n.languages.flow.keyword)||(n.languages.flow.keyword=[n.languages.flow.keyword]),n.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0})})(t)}return Gv}var Wv,PO;function uye(){if(PO)return Wv;PO=1,Wv=e,e.displayName="fortran",e.aliases=[];function e(t){t.languages.fortran={"quoted-number":{pattern:/[BOZ](['"])[A-F0-9]+\1/i,alias:"number"},string:{pattern:/(?:\b\w+_)?(['"])(?:\1\1|&(?:\r\n?|\n)(?:[ \t]*!.*(?:\r\n?|\n)|(?![ \t]*!))|(?!\1).)*(?:\1|&)/,inside:{comment:{pattern:/(&(?:\r\n?|\n)\s*)!.*/,lookbehind:!0}}},comment:{pattern:/!.*/,greedy:!0},boolean:/\.(?:FALSE|TRUE)\.(?:_\w+)?/i,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[ED][+-]?\d+)?(?:_\w+)?/i,keyword:[/\b(?:CHARACTER|COMPLEX|DOUBLE ?PRECISION|INTEGER|LOGICAL|REAL)\b/i,/\b(?:END ?)?(?:BLOCK ?DATA|DO|FILE|FORALL|FUNCTION|IF|INTERFACE|MODULE(?! PROCEDURE)|PROGRAM|SELECT|SUBROUTINE|TYPE|WHERE)\b/i,/\b(?:ALLOCATABLE|ALLOCATE|BACKSPACE|CALL|CASE|CLOSE|COMMON|CONTAINS|CONTINUE|CYCLE|DATA|DEALLOCATE|DIMENSION|DO|END|EQUIVALENCE|EXIT|EXTERNAL|FORMAT|GO ?TO|IMPLICIT(?: NONE)?|INQUIRE|INTENT|INTRINSIC|MODULE PROCEDURE|NAMELIST|NULLIFY|OPEN|OPTIONAL|PARAMETER|POINTER|PRINT|PRIVATE|PUBLIC|READ|RETURN|REWIND|SAVE|SELECT|STOP|TARGET|WHILE|WRITE)\b/i,/\b(?:ASSIGNMENT|DEFAULT|ELEMENTAL|ELSE|ELSEIF|ELSEWHERE|ENTRY|IN|INCLUDE|INOUT|KIND|NULL|ONLY|OPERATOR|OUT|PURE|RECURSIVE|RESULT|SEQUENCE|STAT|THEN|USE)\b/i],operator:[/\*\*|\/\/|=>|[=\/]=|[<>]=?|::|[+\-*=%]|\.[A-Z]+\./i,{pattern:/(^|(?!\().)\/(?!\))/,lookbehind:!0}],punctuation:/\(\/|\/\)|[(),;:&]/}}return Wv}var Kv,$O;function dye(){if($O)return Kv;$O=1,Kv=e,e.displayName="fsharp",e.aliases=[];function e(t){t.languages.fsharp=t.languages.extend("clike",{comment:[{pattern:/(^|[^\\])\(\*(?!\))[\s\S]*?\*\)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(?:"""[\s\S]*?"""|@"(?:""|[^"])*"|"(?:\\[\s\S]|[^\\"])*")B?/,greedy:!0},"class-name":{pattern:/(\b(?:exception|inherit|interface|new|of|type)\s+|\w\s*:\s*|\s:\??>\s*)[.\w]+\b(?:\s*(?:->|\*)\s*[.\w]+\b)*(?!\s*[:.])/,lookbehind:!0,inside:{operator:/->|\*/,punctuation:/\./}},keyword:/\b(?:let|return|use|yield)(?:!\B|\b)|\b(?:abstract|and|as|asr|assert|atomic|base|begin|break|checked|class|component|const|constraint|constructor|continue|default|delegate|do|done|downcast|downto|eager|elif|else|end|event|exception|extern|external|false|finally|fixed|for|fun|function|functor|global|if|in|include|inherit|inline|interface|internal|land|lazy|lor|lsl|lsr|lxor|match|member|method|mixin|mod|module|mutable|namespace|new|not|null|object|of|open|or|override|parallel|private|process|protected|public|pure|rec|sealed|select|sig|static|struct|tailcall|then|to|trait|true|try|type|upcast|val|virtual|void|volatile|when|while|with)\b/,number:[/\b0x[\da-fA-F]+(?:LF|lf|un)?\b/,/\b0b[01]+(?:uy|y)?\b/,/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[fm]|e[+-]?\d+)?\b/i,/\b\d+(?:[IlLsy]|UL|u[lsy]?)?\b/],operator:/([<>~&^])\1\1|([*.:<>&])\2|<-|->|[!=:]=|?|\??(?:<=|>=|<>|[-+*/%=<>])\??|[!?^&]|~[+~-]|:>|:\?>?/}),t.languages.insertBefore("fsharp","keyword",{preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(^#)\b(?:else|endif|if|light|line|nowarn)\b/,lookbehind:!0,alias:"keyword"}}}}),t.languages.insertBefore("fsharp","punctuation",{"computation-expression":{pattern:/\b[_a-z]\w*(?=\s*\{)/i,alias:"keyword"}}),t.languages.insertBefore("fsharp","string",{annotation:{pattern:/\[<.+?>\]/,greedy:!0,inside:{punctuation:/^\[<|>\]$/,"class-name":{pattern:/^\w+$|(^|;\s*)[A-Z]\w*(?=\()/,lookbehind:!0},"annotation-content":{pattern:/[\s\S]+/,inside:t.languages.fsharp}}},char:{pattern:/'(?:[^\\']|\\(?:.|\d{3}|x[a-fA-F\d]{2}|u[a-fA-F\d]{4}|U[a-fA-F\d]{8}))'B?/,greedy:!0}})}return Kv}var Yv,FO;function fye(){if(FO)return Yv;FO=1;var e=mr();Yv=t,t.displayName="ftl",t.aliases=[];function t(n){n.register(e),function(r){for(var a=/[^<()"']|\((?:)*\)|<(?!#--)|<#--(?:[^-]|-(?!->))*-->|"(?:[^\\"]|\\.)*"|'(?:[^\\']|\\.)*'/.source,o=0;o<2;o++)a=a.replace(//g,function(){return a});a=a.replace(//g,/[^\s\S]/.source);var i={comment:/<#--[\s\S]*?-->/,string:[{pattern:/\br("|')(?:(?!\1)[^\\]|\\.)*\1/,greedy:!0},{pattern:RegExp(/("|')(?:(?!\1|\$\{)[^\\]|\\.|\$\{(?:(?!\})(?:))*\})*\1/.source.replace(//g,function(){return a})),greedy:!0,inside:{interpolation:{pattern:RegExp(/((?:^|[^\\])(?:\\\\)*)\$\{(?:(?!\})(?:))*\}/.source.replace(//g,function(){return a})),lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:null}}}}],keyword:/\b(?:as)\b/,boolean:/\b(?:false|true)\b/,"builtin-function":{pattern:/((?:^|[^?])\?\s*)\w+/,lookbehind:!0,alias:"function"},function:/\b\w+(?=\s*\()/,number:/\b\d+(?:\.\d+)?\b/,operator:/\.\.[<*!]?|->|--|\+\+|&&|\|\||\?{1,2}|[-+*/%!=<>]=?|\b(?:gt|gte|lt|lte)\b/,punctuation:/[,;.:()[\]{}]/};i.string[1].inside.interpolation.inside.rest=i,r.languages.ftl={"ftl-comment":{pattern:/^<#--[\s\S]*/,alias:"comment"},"ftl-directive":{pattern:/^<[\s\S]+>$/,inside:{directive:{pattern:/(^<\/?)[#@][a-z]\w*/i,lookbehind:!0,alias:"keyword"},punctuation:/^<\/?|\/?>$/,content:{pattern:/\s*\S[\s\S]*/,alias:"ftl",inside:i}}},"ftl-interpolation":{pattern:/^\$\{[\s\S]*\}$/,inside:{punctuation:/^\$\{|\}$/,content:{pattern:/\s*\S[\s\S]*/,alias:"ftl",inside:i}}}},r.hooks.add("before-tokenize",function(s){var l=RegExp(/<#--[\s\S]*?-->|<\/?[#@][a-zA-Z](?:)*?>|\$\{(?:)*?\}/.source.replace(//g,function(){return a}),"gi");r.languages["markup-templating"].buildPlaceholders(s,"ftl",l)}),r.hooks.add("after-tokenize",function(s){r.languages["markup-templating"].tokenizePlaceholders(s,"ftl")})}(n)}return Yv}var Zv,jO;function pye(){if(jO)return Zv;jO=1,Zv=e,e.displayName="gap",e.aliases=[];function e(t){t.languages.gap={shell:{pattern:/^gap>[\s\S]*?(?=^gap>|$(?![\s\S]))/m,greedy:!0,inside:{gap:{pattern:/^(gap>).+(?:(?:\r(?:\n|(?!\n))|\n)>.*)*/,lookbehind:!0,inside:null},punctuation:/^gap>/}},comment:{pattern:/#.*/,greedy:!0},string:{pattern:/(^|[^\\'"])(?:'(?:[^\r\n\\']|\\.){1,10}'|"(?:[^\r\n\\"]|\\.)*"(?!")|"""[\s\S]*?""")/,lookbehind:!0,greedy:!0,inside:{continuation:{pattern:/([\r\n])>/,lookbehind:!0,alias:"punctuation"}}},keyword:/\b(?:Assert|Info|IsBound|QUIT|TryNextMethod|Unbind|and|atomic|break|continue|do|elif|else|end|fi|for|function|if|in|local|mod|not|od|or|quit|readonly|readwrite|rec|repeat|return|then|until|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:{pattern:/(^|[^\w.]|\.\.)(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?(?:_[a-z]?)?(?=$|[^\w.]|\.\.)/,lookbehind:!0},continuation:{pattern:/([\r\n])>/,lookbehind:!0,alias:"punctuation"},operator:/->|[-+*/^~=!]|<>|[<>]=?|:=|\.\./,punctuation:/[()[\]{},;.:]/},t.languages.gap.shell.inside.gap.inside=t.languages.gap}return Zv}var Xv,zO;function gye(){if(zO)return Xv;zO=1,Xv=e,e.displayName="gcode",e.aliases=[];function e(t){t.languages.gcode={comment:/;.*|\B\(.*?\)\B/,string:{pattern:/"(?:""|[^"])*"/,greedy:!0},keyword:/\b[GM]\d+(?:\.\d+)?\b/,property:/\b[A-Z]/,checksum:{pattern:/(\*)\d+/,lookbehind:!0,alias:"number"},punctuation:/[:*]/}}return Xv}var Qv,UO;function mye(){if(UO)return Qv;UO=1,Qv=e,e.displayName="gdscript",e.aliases=[];function e(t){t.languages.gdscript={comment:/#.*/,string:{pattern:/@?(?:("|')(?:(?!\1)[^\n\\]|\\[\s\S])*\1(?!"|')|"""(?:[^\\]|\\[\s\S])*?""")/,greedy:!0},"class-name":{pattern:/(^(?:class|class_name|extends)[ \t]+|^export\([ \t]*|\bas[ \t]+|(?:\b(?:const|var)[ \t]|[,(])[ \t]*\w+[ \t]*:[ \t]*|->[ \t]*)[a-zA-Z_]\w*/m,lookbehind:!0},keyword:/\b(?:and|as|assert|break|breakpoint|class|class_name|const|continue|elif|else|enum|export|extends|for|func|if|in|is|master|mastersync|match|not|null|onready|or|pass|preload|puppet|puppetsync|remote|remotesync|return|self|setget|signal|static|tool|var|while|yield)\b/,function:/\b[a-z_]\w*(?=[ \t]*\()/i,variable:/\$\w+/,number:[/\b0b[01_]+\b|\b0x[\da-fA-F_]+\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.[\d_]+)(?:e[+-]?[\d_]+)?\b/,/\b(?:INF|NAN|PI|TAU)\b/],constant:/\b[A-Z][A-Z_\d]*\b/,boolean:/\b(?:false|true)\b/,operator:/->|:=|&&|\|\||<<|>>|[-+*/%&|!<>=]=?|[~^]/,punctuation:/[.:,;()[\]{}]/}}return Qv}var Jv,BO;function hye(){if(BO)return Jv;BO=1,Jv=e,e.displayName="gedcom",e.aliases=[];function e(t){t.languages.gedcom={"line-value":{pattern:/(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?\w+ ).+/m,lookbehind:!0,inside:{pointer:{pattern:/^@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@$/,alias:"variable"}}},tag:{pattern:/(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?)\w+/m,lookbehind:!0,alias:"string"},level:{pattern:/(^[\t ]*)\d+/m,lookbehind:!0,alias:"number"},pointer:{pattern:/@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@/,alias:"variable"}}}return Jv}var eS,HO;function bye(){if(HO)return eS;HO=1,eS=e,e.displayName="gherkin",e.aliases=[];function e(t){(function(n){var r=/(?:\r?\n|\r)[ \t]*\|.+\|(?:(?!\|).)*/.source;n.languages.gherkin={pystring:{pattern:/("""|''')[\s\S]+?\1/,alias:"string"},comment:{pattern:/(^[ \t]*)#.*/m,lookbehind:!0},tag:{pattern:/(^[ \t]*)@\S*/m,lookbehind:!0},feature:{pattern:/((?:^|\r?\n|\r)[ \t]*)(?:Ability|Ahoy matey!|Arwedd|Aspekt|Besigheid Behoefte|Business Need|Caracteristica|Característica|Egenskab|Egenskap|Eiginleiki|Feature|Fīča|Fitur|Fonctionnalité|Fonksyonalite|Funcionalidade|Funcionalitat|Functionalitate|Funcţionalitate|Funcționalitate|Functionaliteit|Fungsi|Funkcia|Funkcija|Funkcionalitāte|Funkcionalnost|Funkcja|Funksie|Funktionalität|Funktionalitéit|Funzionalità|Hwaet|Hwæt|Jellemző|Karakteristik|Lastnost|Mak|Mogucnost|laH|Mogućnost|Moznosti|Možnosti|OH HAI|Omadus|Ominaisuus|Osobina|Özellik|Potrzeba biznesowa|perbogh|poQbogh malja'|Požadavek|Požiadavka|Pretty much|Qap|Qu'meH 'ut|Savybė|Tính năng|Trajto|Vermoë|Vlastnosť|Właściwość|Značilnost|Δυνατότητα|Λειτουργία|Могућност|Мөмкинлек|Особина|Свойство|Үзенчәлеклелек|Функционал|Функционалност|Функция|Функціонал|תכונה|خاصية|خصوصیت|صلاحیت|کاروبار کی ضرورت|وِیژگی|रूप लेख|ਖਾਸੀਅਤ|ਨਕਸ਼ ਨੁਹਾਰ|ਮੁਹਾਂਦਰਾ|గుణము|ಹೆಚ್ಚಳ|ความต้องการทางธุรกิจ|ความสามารถ|โครงหลัก|기능|フィーチャ|功能|機能):(?:[^:\r\n]+(?:\r?\n|\r|$))*/,lookbehind:!0,inside:{important:{pattern:/(:)[^\r\n]+/,lookbehind:!0},keyword:/[^:\r\n]+:/}},scenario:{pattern:/(^[ \t]*)(?:Abstract Scenario|Abstrakt Scenario|Achtergrond|Aer|Ær|Agtergrond|All y'all|Antecedentes|Antecedents|Atburðarás|Atburðarásir|Awww, look mate|B4|Background|Baggrund|Bakgrund|Bakgrunn|Bakgrunnur|Beispiele|Beispiller|Bối cảnh|Cefndir|Cenario|Cenário|Cenario de Fundo|Cenário de Fundo|Cenarios|Cenários|Contesto|Context|Contexte|Contexto|Conto|Contoh|Contone|Dæmi|Dasar|Dead men tell no tales|Delineacao do Cenario|Delineação do Cenário|Dis is what went down|Dữ liệu|Dyagram Senaryo|Dyagram senaryo|Egzanp|Ejemplos|Eksempler|Ekzemploj|Enghreifftiau|Esbozo do escenario|Escenari|Escenario|Esempi|Esquema de l'escenari|Esquema del escenario|Esquema do Cenario|Esquema do Cenário|EXAMPLZ|Examples|Exempel|Exemple|Exemples|Exemplos|First off|Fono|Forgatókönyv|Forgatókönyv vázlat|Fundo|Geçmiş|Grundlage|Hannergrond|ghantoH|Háttér|Heave to|Istorik|Juhtumid|Keadaan|Khung kịch bản|Khung tình huống|Kịch bản|Koncept|Konsep skenario|Kontèks|Kontekst|Kontekstas|Konteksts|Kontext|Konturo de la scenaro|Latar Belakang|lut chovnatlh|lut|lutmey|Lýsing Atburðarásar|Lýsing Dæma|MISHUN SRSLY|MISHUN|Menggariskan Senario|mo'|Náčrt Scenára|Náčrt Scénáře|Náčrt Scenáru|Oris scenarija|Örnekler|Osnova|Osnova Scenára|Osnova scénáře|Osnutek|Ozadje|Paraugs|Pavyzdžiai|Példák|Piemēri|Plan du scénario|Plan du Scénario|Plan Senaryo|Plan senaryo|Plang vum Szenario|Pozadí|Pozadie|Pozadina|Príklady|Příklady|Primer|Primeri|Primjeri|Przykłady|Raamstsenaarium|Reckon it's like|Rerefons|Scenár|Scénář|Scenarie|Scenarij|Scenarijai|Scenarijaus šablonas|Scenariji|Scenārijs|Scenārijs pēc parauga|Scenarijus|Scenario|Scénario|Scenario Amlinellol|Scenario Outline|Scenario Template|Scenariomal|Scenariomall|Scenarios|Scenariu|Scenariusz|Scenaro|Schema dello scenario|Se ðe|Se the|Se þe|Senario|Senaryo Deskripsyon|Senaryo deskripsyon|Senaryo|Senaryo taslağı|Shiver me timbers|Situācija|Situai|Situasie Uiteensetting|Situasie|Skenario konsep|Skenario|Skica|Structura scenariu|Structură scenariu|Struktura scenarija|Stsenaarium|Swa hwaer swa|Swa|Swa hwær swa|Szablon scenariusza|Szenario|Szenariogrundriss|Tapaukset|Tapaus|Tapausaihio|Taust|Tausta|Template Keadaan|Template Senario|Template Situai|The thing of it is|Tình huống|Variantai|Voorbeelde|Voorbeelden|Wharrimean is|Yo-ho-ho|You'll wanna|Założenia|Παραδείγματα|Περιγραφή Σεναρίου|Σενάρια|Σενάριο|Υπόβαθρο|Кереш|Контекст|Концепт|Мисаллар|Мисоллар|Основа|Передумова|Позадина|Предистория|Предыстория|Приклади|Пример|Примери|Примеры|Рамка на сценарий|Скица|Структура сценарија|Структура сценария|Структура сценарію|Сценарий|Сценарий структураси|Сценарийның төзелеше|Сценарији|Сценарио|Сценарій|Тарих|Үрнәкләр|דוגמאות|רקע|תבנית תרחיש|תרחיש|الخلفية|الگوی سناریو|امثلة|پس منظر|زمینه|سناریو|سيناريو|سيناريو مخطط|مثالیں|منظر نامے کا خاکہ|منظرنامہ|نمونه ها|उदाहरण|परिदृश्य|परिदृश्य रूपरेखा|पृष्ठभूमि|ਉਦਾਹਰਨਾਂ|ਪਟਕਥਾ|ਪਟਕਥਾ ਢਾਂਚਾ|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਿਛੋਕੜ|ఉదాహరణలు|కథనం|నేపథ్యం|సన్నివేశం|ಉದಾಹರಣೆಗಳು|ಕಥಾಸಾರಾಂಶ|ವಿವರಣೆ|ಹಿನ್ನೆಲೆ|โครงสร้างของเหตุการณ์|ชุดของตัวอย่าง|ชุดของเหตุการณ์|แนวคิด|สรุปเหตุการณ์|เหตุการณ์|배경|시나리오|시나리오 개요|예|サンプル|シナリオ|シナリオアウトライン|シナリオテンプレ|シナリオテンプレート|テンプレ|例|例子|剧本|剧本大纲|劇本|劇本大綱|场景|场景大纲|場景|場景大綱|背景):[^:\r\n]*/m,lookbehind:!0,inside:{important:{pattern:/(:)[^\r\n]*/,lookbehind:!0},keyword:/[^:\r\n]+:/}},"table-body":{pattern:RegExp("("+r+")(?:"+r+")+"),lookbehind:!0,inside:{outline:{pattern:/<[^>]+>/,alias:"variable"},td:{pattern:/\s*[^\s|][^|]*/,alias:"string"},punctuation:/\|/}},"table-head":{pattern:RegExp(r),inside:{th:{pattern:/\s*[^\s|][^|]*/,alias:"variable"},punctuation:/\|/}},atrule:{pattern:/(^[ \t]+)(?:'a|'ach|'ej|7|a|A také|A taktiež|A tiež|A zároveň|Aber|Ac|Adott|Akkor|Ak|Aleshores|Ale|Ali|Allora|Alors|Als|Ama|Amennyiben|Amikor|Ampak|an|AN|Ananging|And y'all|And|Angenommen|Anrhegedig a|An|Apabila|Atès|Atesa|Atunci|Avast!|Aye|A|awer|Bagi|Banjur|Bet|Biết|Blimey!|Buh|But at the end of the day I reckon|But y'all|But|BUT|Cal|Când|Cand|Cando|Ce|Cuando|Če|Ða ðe|Ða|Dadas|Dada|Dados|Dado|DaH ghu' bejlu'|dann|Dann|Dano|Dan|Dar|Dat fiind|Data|Date fiind|Date|Dati fiind|Dati|Daţi fiind|Dați fiind|DEN|Dato|De|Den youse gotta|Dengan|Diberi|Diyelim ki|Donada|Donat|Donitaĵo|Do|Dun|Duota|Ðurh|Eeldades|Ef|Eğer ki|Entao|Então|Entón|E|En|Entonces|Epi|És|Etant donnée|Etant donné|Et|Étant données|Étant donnée|Étant donné|Etant données|Etant donnés|Étant donnés|Fakat|Gangway!|Gdy|Gegeben seien|Gegeben sei|Gegeven|Gegewe|ghu' noblu'|Gitt|Given y'all|Given|Givet|Givun|Ha|Cho|I CAN HAZ|In|Ir|It's just unbelievable|I|Ja|Jeśli|Jeżeli|Kad|Kada|Kadar|Kai|Kaj|Když|Keď|Kemudian|Ketika|Khi|Kiedy|Ko|Kuid|Kui|Kun|Lan|latlh|Le sa a|Let go and haul|Le|Lè sa a|Lè|Logo|Lorsqu'<|Lorsque|mä|Maar|Mais|Mając|Ma|Majd|Maka|Manawa|Mas|Men|Menawa|Mutta|Nalika|Nalikaning|Nanging|Når|När|Nato|Nhưng|Niin|Njuk|O zaman|Och|Og|Oletetaan|Ond|Onda|Oraz|Pak|Pero|Però|Podano|Pokiaľ|Pokud|Potem|Potom|Privzeto|Pryd|Quan|Quand|Quando|qaSDI'|Så|Sed|Se|Siis|Sipoze ke|Sipoze Ke|Sipoze|Si|Şi|Și|Soit|Stel|Tada|Tad|Takrat|Tak|Tapi|Ter|Tetapi|Tha the|Tha|Then y'all|Then|Thì|Thurh|Toda|Too right|Un|Und|ugeholl|Và|vaj|Vendar|Ve|wann|Wanneer|WEN|Wenn|When y'all|When|Wtedy|Wun|Y'know|Yeah nah|Yna|Youse know like when|Youse know when youse got|Y|Za predpokladu|Za předpokladu|Zadan|Zadani|Zadano|Zadate|Zadato|Zakładając|Zaradi|Zatati|Þa þe|Þa|Þá|Þegar|Þurh|Αλλά|Δεδομένου|Και|Όταν|Τότε|А також|Агар|Але|Али|Аммо|А|Әгәр|Әйтик|Әмма|Бирок|Ва|Вә|Дадено|Дано|Допустим|Если|Задате|Задати|Задато|И|І|К тому же|Када|Кад|Когато|Когда|Коли|Ләкин|Лекин|Нәтиҗәдә|Нехай|Но|Онда|Припустимо, що|Припустимо|Пусть|Также|Та|Тогда|Тоді|То|Унда|Һәм|Якщо|אבל|אזי|אז|בהינתן|וגם|כאשר|آنگاه|اذاً|اگر|اما|اور|با فرض|بالفرض|بفرض|پھر|تب|ثم|جب|عندما|فرض کیا|لكن|لیکن|متى|هنگامی|و|अगर|और|कदा|किन्तु|चूंकि|जब|तथा|तदा|तब|परन्तु|पर|यदि|ਅਤੇ|ਜਦੋਂ|ਜਿਵੇਂ ਕਿ|ਜੇਕਰ|ਤਦ|ਪਰ|అప్పుడు|ఈ పరిస్థితిలో|కాని|చెప్పబడినది|మరియు|ಆದರೆ|ನಂತರ|ನೀಡಿದ|ಮತ್ತು|ಸ್ಥಿತಿಯನ್ನು|กำหนดให้|ดังนั้น|แต่|เมื่อ|และ|그러면<|그리고<|단<|만약<|만일<|먼저<|조건<|하지만<|かつ<|しかし<|ただし<|ならば<|もし<|並且<|但し<|但是<|假如<|假定<|假設<|假设<|前提<|同时<|同時<|并且<|当<|當<|而且<|那么<|那麼<)(?=[ \t])/m,lookbehind:!0},string:{pattern:/"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,inside:{outline:{pattern:/<[^>]+>/,alias:"variable"}}},outline:{pattern:/<[^>]+>/,alias:"variable"}}})(t)}return eS}var tS,VO;function yye(){if(VO)return tS;VO=1,tS=e,e.displayName="git",e.aliases=[];function e(t){t.languages.git={comment:/^#.*/m,deleted:/^[-–].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m}}return tS}var nS,qO;function vye(){if(qO)return nS;qO=1;var e=Ws();nS=t,t.displayName="glsl",t.aliases=[];function t(n){n.register(e),n.languages.glsl=n.languages.extend("c",{keyword:/\b(?:active|asm|atomic_uint|attribute|[ibdu]?vec[234]|bool|break|buffer|case|cast|centroid|class|coherent|common|const|continue|d?mat[234](?:x[234])?|default|discard|do|double|else|enum|extern|external|false|filter|fixed|flat|float|for|fvec[234]|goto|half|highp|hvec[234]|[iu]?sampler2DMS(?:Array)?|[iu]?sampler2DRect|[iu]?samplerBuffer|[iu]?samplerCube|[iu]?samplerCubeArray|[iu]?sampler[123]D|[iu]?sampler[12]DArray|[iu]?image2DMS(?:Array)?|[iu]?image2DRect|[iu]?imageBuffer|[iu]?imageCube|[iu]?imageCubeArray|[iu]?image[123]D|[iu]?image[12]DArray|if|in|inline|inout|input|int|interface|invariant|layout|long|lowp|mediump|namespace|noinline|noperspective|out|output|partition|patch|precise|precision|public|readonly|resource|restrict|return|sample|sampler[12]DArrayShadow|sampler[12]DShadow|sampler2DRectShadow|sampler3DRect|samplerCubeArrayShadow|samplerCubeShadow|shared|short|sizeof|smooth|static|struct|subroutine|superp|switch|template|this|true|typedef|uint|uniform|union|unsigned|using|varying|void|volatile|while|writeonly)\b/})}return nS}var rS,GO;function Sye(){if(GO)return rS;GO=1,rS=e,e.displayName="gml",e.aliases=[];function e(t){t.languages.gamemakerlanguage=t.languages.gml=t.languages.extend("clike",{keyword:/\b(?:break|case|continue|default|do|else|enum|exit|for|globalvar|if|repeat|return|switch|until|var|while)\b/,number:/(?:\b0x[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ulf]{0,4}/i,operator:/--|\+\+|[-+%/=]=?|!=|\*\*?=?|<[<=>]?|>[=>]?|&&?|\^\^?|\|\|?|~|\b(?:and|at|not|or|with|xor)\b/,constant:/\b(?:GM_build_date|GM_version|action_(?:continue|restart|reverse|stop)|all|gamespeed_(?:fps|microseconds)|global|local|noone|other|pi|pointer_(?:invalid|null)|self|timezone_(?:local|utc)|undefined|ev_(?:create|destroy|step|alarm|keyboard|mouse|collision|other|draw|draw_(?:begin|end|post|pre)|keypress|keyrelease|trigger|(?:left|middle|no|right)_button|(?:left|middle|right)_press|(?:left|middle|right)_release|mouse_(?:enter|leave|wheel_down|wheel_up)|global_(?:left|middle|right)_button|global_(?:left|middle|right)_press|global_(?:left|middle|right)_release|joystick(?:1|2)_(?:button1|button2|button3|button4|button5|button6|button7|button8|down|left|right|up)|outside|boundary|game_start|game_end|room_start|room_end|no_more_lives|animation_end|end_of_path|no_more_health|user\d|gui|gui_begin|gui_end|step_(?:begin|end|normal))|vk_(?:alt|anykey|backspace|control|delete|down|end|enter|escape|home|insert|left|nokey|pagedown|pageup|pause|printscreen|return|right|shift|space|tab|up|f\d|numpad\d|add|decimal|divide|lalt|lcontrol|lshift|multiply|ralt|rcontrol|rshift|subtract)|achievement_(?:filter_(?:all_players|favorites_only|friends_only)|friends_info|info|leaderboard_info|our_info|pic_loaded|show_(?:achievement|bank|friend_picker|leaderboard|profile|purchase_prompt|ui)|type_challenge|type_score_challenge)|asset_(?:font|object|path|room|script|shader|sound|sprite|tiles|timeline|unknown)|audio_(?:3d|falloff_(?:exponent_distance|exponent_distance_clamped|inverse_distance|inverse_distance_clamped|linear_distance|linear_distance_clamped|none)|mono|new_system|old_system|stereo)|bm_(?:add|complex|dest_alpha|dest_color|dest_colour|inv_dest_alpha|inv_dest_color|inv_dest_colour|inv_src_alpha|inv_src_color|inv_src_colour|max|normal|one|src_alpha|src_alpha_sat|src_color|src_colour|subtract|zero)|browser_(?:chrome|firefox|ie|ie_mobile|not_a_browser|opera|safari|safari_mobile|tizen|unknown|windows_store)|buffer_(?:bool|f16|f32|f64|fast|fixed|generalerror|grow|invalidtype|network|outofbounds|outofspace|s16|s32|s8|seek_end|seek_relative|seek_start|string|text|u16|u32|u64|u8|vbuffer|wrap)|c_(?:aqua|black|blue|dkgray|fuchsia|gray|green|lime|ltgray|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow)|cmpfunc_(?:always|equal|greater|greaterequal|less|lessequal|never|notequal)|cr_(?:appstart|arrow|beam|cross|default|drag|handpoint|hourglass|none|size_all|size_nesw|size_ns|size_nwse|size_we|uparrow)|cull_(?:clockwise|counterclockwise|noculling)|device_(?:emulator|tablet)|device_ios_(?:ipad|ipad_retina|iphone|iphone5|iphone6|iphone6plus|iphone_retina|unknown)|display_(?:landscape|landscape_flipped|portrait|portrait_flipped)|dll_(?:cdecl|cdel|stdcall)|ds_type_(?:grid|list|map|priority|queue|stack)|ef_(?:cloud|ellipse|explosion|firework|flare|rain|ring|smoke|smokeup|snow|spark|star)|fa_(?:archive|bottom|center|directory|hidden|left|middle|readonly|right|sysfile|top|volumeid)|fb_login_(?:default|fallback_to_webview|forcing_safari|forcing_webview|no_fallback_to_webview|use_system_account)|iap_(?:available|canceled|ev_consume|ev_product|ev_purchase|ev_restore|ev_storeload|failed|purchased|refunded|status_available|status_loading|status_processing|status_restoring|status_unavailable|status_uninitialised|storeload_failed|storeload_ok|unavailable)|leaderboard_type_(?:number|time_mins_secs)|lighttype_(?:dir|point)|matrix_(?:projection|view|world)|mb_(?:any|left|middle|none|right)|network_(?:config_(?:connect_timeout|disable_reliable_udp|enable_reliable_udp|use_non_blocking_socket)|socket_(?:bluetooth|tcp|udp)|type_(?:connect|data|disconnect|non_blocking_connect))|of_challenge_(?:lose|tie|win)|os_(?:android|ios|linux|macosx|ps3|ps4|psvita|unknown|uwp|win32|win8native|windows|winphone|xboxone)|phy_debug_render_(?:aabb|collision_pairs|coms|core_shapes|joints|obb|shapes)|phy_joint_(?:anchor_1_x|anchor_1_y|anchor_2_x|anchor_2_y|angle|angle_limits|damping_ratio|frequency|length_1|length_2|lower_angle_limit|max_force|max_length|max_motor_force|max_motor_torque|max_torque|motor_force|motor_speed|motor_torque|reaction_force_x|reaction_force_y|reaction_torque|speed|translation|upper_angle_limit)|phy_particle_data_flag_(?:category|color|colour|position|typeflags|velocity)|phy_particle_flag_(?:colormixing|colourmixing|elastic|powder|spring|tensile|viscous|wall|water|zombie)|phy_particle_group_flag_(?:rigid|solid)|pr_(?:linelist|linestrip|pointlist|trianglefan|trianglelist|trianglestrip)|ps_(?:distr|shape)_(?:diamond|ellipse|gaussian|invgaussian|line|linear|rectangle)|pt_shape_(?:circle|cloud|disk|explosion|flare|line|pixel|ring|smoke|snow|spark|sphere|square|star)|ty_(?:real|string)|gp_(?:face\d|axislh|axislv|axisrh|axisrv|padd|padl|padr|padu|select|shoulderl|shoulderlb|shoulderr|shoulderrb|start|stickl|stickr)|lb_disp_(?:none|numeric|time_ms|time_sec)|lb_sort_(?:ascending|descending|none)|ov_(?:achievements|community|friends|gamegroup|players|settings)|ugc_(?:filetype_(?:community|microtrans)|list_(?:Favorited|Followed|Published|Subscribed|UsedOrPlayed|VotedDown|VotedOn|VotedUp|WillVoteLater)|match_(?:AllGuides|Artwork|Collections|ControllerBindings|IntegratedGuides|Items|Items_Mtx|Items_ReadyToUse|Screenshots|UsableInGame|Videos|WebGuides)|query_(?:AcceptedForGameRankedByAcceptanceDate|CreatedByFriendsRankedByPublicationDate|FavoritedByFriendsRankedByPublicationDate|NotYetRated)|query_RankedBy(?:NumTimesReported|PublicationDate|TextSearch|TotalVotesAsc|Trend|Vote|VotesUp)|result_success|sortorder_CreationOrder(?:Asc|Desc)|sortorder_(?:ForModeration|LastUpdatedDesc|SubscriptionDateDesc|TitleAsc|VoteScoreDesc)|visibility_(?:friends_only|private|public))|vertex_usage_(?:binormal|blendindices|blendweight|color|colour|depth|fog|normal|position|psize|sample|tangent|texcoord|textcoord)|vertex_type_(?:float\d|color|colour|ubyte4)|input_type|layerelementtype_(?:background|instance|oldtilemap|particlesystem|sprite|tile|tilemap|undefined)|se_(?:chorus|compressor|echo|equalizer|flanger|gargle|none|reverb)|text_type|tile_(?:flip|index_mask|mirror|rotate)|(?:obj|rm|scr|spr)\w+)\b/,variable:/\b(?:alarm|application_surface|async_load|background_(?:alpha|blend|color|colour|foreground|height|hspeed|htiled|index|showcolor|showcolour|visible|vspeed|vtiled|width|x|xscale|y|yscale)|bbox_(?:bottom|left|right|top)|browser_(?:height|width)|caption_(?:health|lives|score)|current_(?:day|hour|minute|month|second|time|weekday|year)|cursor_sprite|debug_mode|delta_time|direction|display_aa|error_(?:last|occurred)|event_(?:action|number|object|type)|fps|fps_real|friction|game_(?:display|project|save)_(?:id|name)|gamemaker_(?:pro|registered|version)|gravity|gravity_direction|(?:h|v)speed|health|iap_data|id|image_(?:alpha|angle|blend|depth|index|number|speed|xscale|yscale)|instance_(?:count|id)|keyboard_(?:key|lastchar|lastkey|string)|layer|lives|mask_index|mouse_(?:button|lastbutton|x|y)|object_index|os_(?:browser|device|type|version)|path_(?:endaction|index|orientation|position|positionprevious|scale|speed)|persistent|phy_(?:rotation|(?:col_normal|collision|com|linear_velocity|position|speed)_(?:x|y)|angular_(?:damping|velocity)|position_(?:x|y)previous|speed|linear_damping|bullet|fixed_rotation|active|mass|inertia|dynamic|kinematic|sleeping|collision_points)|pointer_(?:invalid|null)|room|room_(?:caption|first|height|last|persistent|speed|width)|score|secure_mode|show_(?:health|lives|score)|solid|speed|sprite_(?:height|index|width|xoffset|yoffset)|temp_directory|timeline_(?:index|loop|position|running|speed)|transition_(?:color|kind|steps)|undefined|view_(?:angle|current|enabled|(?:h|v)(?:border|speed)|(?:h|w|x|y)port|(?:h|w|x|y)view|object|surface_id|visible)|visible|webgl_enabled|working_directory|(?:x|y)(?:previous|start)|x|y|argument(?:_relitive|_count|\d)|argument|global|local|other|self)\b/})}return rS}var aS,WO;function wye(){if(WO)return aS;WO=1,aS=e,e.displayName="gn",e.aliases=["gni"];function e(t){t.languages.gn={comment:{pattern:/#.*/,greedy:!0},"string-literal":{pattern:/(^|[^\\"])"(?:[^\r\n"\\]|\\.)*"/,lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:\{[\s\S]*?\}|[a-zA-Z_]\w*|0x[a-fA-F0-9]{2})/,lookbehind:!0,inside:{number:/^\$0x[\s\S]{2}$/,variable:/^\$\w+$/,"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}},string:/[\s\S]+/}},keyword:/\b(?:else|if)\b/,boolean:/\b(?:false|true)\b/,"builtin-function":{pattern:/\b(?:assert|defined|foreach|import|pool|print|template|tool|toolchain)(?=\s*\()/i,alias:"keyword"},function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:current_cpu|current_os|current_toolchain|default_toolchain|host_cpu|host_os|root_build_dir|root_gen_dir|root_out_dir|target_cpu|target_gen_dir|target_os|target_out_dir)\b/,number:/-?\b\d+\b/,operator:/[-+!=<>]=?|&&|\|\|/,punctuation:/[(){}[\],.]/},t.languages.gn["string-literal"].inside.interpolation.inside.expression.inside=t.languages.gn,t.languages.gni=t.languages.gn}return aS}var oS,KO;function Eye(){if(KO)return oS;KO=1,oS=e,e.displayName="goModule",e.aliases=[];function e(t){t.languages["go-mod"]=t.languages["go-module"]={comment:{pattern:/\/\/.*/,greedy:!0},version:{pattern:/(^|[\s()[\],])v\d+\.\d+\.\d+(?:[+-][-+.\w]*)?(?![^\s()[\],])/,lookbehind:!0,alias:"number"},"go-version":{pattern:/((?:^|\s)go\s+)\d+(?:\.\d+){1,2}/,lookbehind:!0,alias:"number"},keyword:{pattern:/^([ \t]*)(?:exclude|go|module|replace|require|retract)\b/m,lookbehind:!0},operator:/=>/,punctuation:/[()[\],]/}}return oS}var iS,YO;function xye(){if(YO)return iS;YO=1,iS=e,e.displayName="go",e.aliases=[];function e(t){t.languages.go=t.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),t.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete t.languages.go["class-name"]}return iS}var sS,ZO;function kye(){if(ZO)return sS;ZO=1,sS=e,e.displayName="graphql",e.aliases=[];function e(t){t.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:t.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},t.hooks.add("after-tokenize",function(r){if(r.language!=="graphql")return;var a=r.tokens.filter(function(v){return typeof v!="string"&&v.type!=="comment"&&v.type!=="scalar"}),o=0;function i(v){return a[o+v]}function s(v,h){h=h||0;for(var S=0;S0)){var b=l(/^\{$/,/^\}$/);if(b===-1)continue;for(var y=o;y=0&&c(w,"variable-input")}}}}})}return sS}var lS,XO;function Cye(){if(XO)return lS;XO=1,lS=e,e.displayName="groovy",e.aliases=[];function e(t){t.languages.groovy=t.languages.extend("clike",{string:[{pattern:/("""|''')(?:[^\\]|\\[\s\S])*?\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0},{pattern:/(["'/])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0}],keyword:/\b(?:abstract|as|assert|boolean|break|byte|case|catch|char|class|const|continue|def|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|in|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),t.languages.insertBefore("groovy","string",{shebang:{pattern:/#!.+/,alias:"comment"}}),t.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),t.languages.insertBefore("groovy","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),t.hooks.add("wrap",function(n){if(n.language==="groovy"&&n.type==="string"){var r=n.content.value[0];if(r!="'"){var a=/([^\\])(?:\$(?:\{.*?\}|[\w.]+))/;r==="$"&&(a=/([^\$])(?:\$(?:\{.*?\}|[\w.]+))/),n.content.value=n.content.value.replace(/</g,"<").replace(/&/g,"&"),n.content=t.highlight(n.content.value,{expression:{pattern:a,lookbehind:!0,inside:t.languages.groovy}}),n.classes.push(r==="/"?"regex":"gstring")}}})}return lS}var cS,QO;function _ye(){if(QO)return cS;QO=1;var e=Ah();cS=t,t.displayName="haml",t.aliases=[];function t(n){n.register(e),function(r){r.languages.haml={"multiline-comment":{pattern:/((?:^|\r?\n|\r)([\t ]*))(?:\/|-#).*(?:(?:\r?\n|\r)\2[\t ].+)*/,lookbehind:!0,alias:"comment"},"multiline-code":[{pattern:/((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*,[\t ]*(?:(?:\r?\n|\r)\2[\t ].*,[\t ]*)*(?:(?:\r?\n|\r)\2[\t ].+)/,lookbehind:!0,inside:r.languages.ruby},{pattern:/((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*\|[\t ]*(?:(?:\r?\n|\r)\2[\t ].*\|[\t ]*)*/,lookbehind:!0,inside:r.languages.ruby}],filter:{pattern:/((?:^|\r?\n|\r)([\t ]*)):[\w-]+(?:(?:\r?\n|\r)(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/,lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"symbol"}}},markup:{pattern:/((?:^|\r?\n|\r)[\t ]*)<.+/,lookbehind:!0,inside:r.languages.markup},doctype:{pattern:/((?:^|\r?\n|\r)[\t ]*)!!!(?: .+)?/,lookbehind:!0},tag:{pattern:/((?:^|\r?\n|\r)[\t ]*)[%.#][\w\-#.]*[\w\-](?:\([^)]+\)|\{(?:\{[^}]+\}|[^{}])+\}|\[[^\]]+\])*[\/<>]*/,lookbehind:!0,inside:{attributes:[{pattern:/(^|[^#])\{(?:\{[^}]+\}|[^{}])+\}/,lookbehind:!0,inside:r.languages.ruby},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*)(?:"(?:\\.|[^\\"\r\n])*"|[^)\s]+)/,lookbehind:!0},"attr-name":/[\w:-]+(?=\s*!?=|\s*[,)])/,punctuation:/[=(),]/}},{pattern:/\[[^\]]+\]/,inside:r.languages.ruby}],punctuation:/[<>]/}},code:{pattern:/((?:^|\r?\n|\r)[\t ]*(?:[~-]|[&!]?=)).+/,lookbehind:!0,inside:r.languages.ruby},interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},ruby:{pattern:/[\s\S]+/,inside:r.languages.ruby}}},punctuation:{pattern:/((?:^|\r?\n|\r)[\t ]*)[~=\-&!]+/,lookbehind:!0}};for(var a="((?:^|\\r?\\n|\\r)([\\t ]*)):{{filter_name}}(?:(?:\\r?\\n|\\r)(?:\\2[\\t ].+|\\s*?(?=\\r?\\n|\\r)))+",o=["css",{filter:"coffee",language:"coffeescript"},"erb","javascript","less","markdown","ruby","scss","textile"],i={},s=0,l=o.length;s@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},r.hooks.add("before-tokenize",function(a){var o=/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g;r.languages["markup-templating"].buildPlaceholders(a,"handlebars",o)}),r.hooks.add("after-tokenize",function(a){r.languages["markup-templating"].tokenizePlaceholders(a,"handlebars")}),r.languages.hbs=r.languages.handlebars}(n)}return uS}var dS,eD;function NA(){if(eD)return dS;eD=1,dS=e,e.displayName="haskell",e.aliases=["hs"];function e(t){t.languages.haskell={comment:{pattern:/(^|[^-!#$%*+=?&@|~.:<>^\\\/])(?:--(?:(?=.)[^-!#$%*+=?&@|~.:<>^\\\/].*|$)|\{-[\s\S]*?-\})/m,lookbehind:!0},char:{pattern:/'(?:[^\\']|\\(?:[abfnrtv\\"'&]|\^[A-Z@[\]^_]|ACK|BEL|BS|CAN|CR|DC1|DC2|DC3|DC4|DEL|DLE|EM|ENQ|EOT|ESC|ETB|ETX|FF|FS|GS|HT|LF|NAK|NUL|RS|SI|SO|SOH|SP|STX|SUB|SYN|US|VT|\d+|o[0-7]+|x[0-9a-fA-F]+))'/,alias:"string"},string:{pattern:/"(?:[^\\"]|\\(?:\S|\s+\\))*"/,greedy:!0},keyword:/\b(?:case|class|data|deriving|do|else|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b/,"import-statement":{pattern:/(^[\t ]*)import\s+(?:qualified\s+)?(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*(?:\s+as\s+(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,lookbehind:!0,inside:{keyword:/\b(?:as|hiding|import|qualified)\b/,punctuation:/\./}},builtin:/\b(?:abs|acos|acosh|all|and|any|appendFile|approxRational|asTypeOf|asin|asinh|atan|atan2|atanh|basicIORun|break|catch|ceiling|chr|compare|concat|concatMap|const|cos|cosh|curry|cycle|decodeFloat|denominator|digitToInt|div|divMod|drop|dropWhile|either|elem|encodeFloat|enumFrom|enumFromThen|enumFromThenTo|enumFromTo|error|even|exp|exponent|fail|filter|flip|floatDigits|floatRadix|floatRange|floor|fmap|foldl|foldl1|foldr|foldr1|fromDouble|fromEnum|fromInt|fromInteger|fromIntegral|fromRational|fst|gcd|getChar|getContents|getLine|group|head|id|inRange|index|init|intToDigit|interact|ioError|isAlpha|isAlphaNum|isAscii|isControl|isDenormalized|isDigit|isHexDigit|isIEEE|isInfinite|isLower|isNaN|isNegativeZero|isOctDigit|isPrint|isSpace|isUpper|iterate|last|lcm|length|lex|lexDigits|lexLitChar|lines|log|logBase|lookup|map|mapM|mapM_|max|maxBound|maximum|maybe|min|minBound|minimum|mod|negate|not|notElem|null|numerator|odd|or|ord|otherwise|pack|pi|pred|primExitWith|print|product|properFraction|putChar|putStr|putStrLn|quot|quotRem|range|rangeSize|read|readDec|readFile|readFloat|readHex|readIO|readInt|readList|readLitChar|readLn|readOct|readParen|readSigned|reads|readsPrec|realToFrac|recip|rem|repeat|replicate|return|reverse|round|scaleFloat|scanl|scanl1|scanr|scanr1|seq|sequence|sequence_|show|showChar|showInt|showList|showLitChar|showParen|showSigned|showString|shows|showsPrec|significand|signum|sin|sinh|snd|sort|span|splitAt|sqrt|subtract|succ|sum|tail|take|takeWhile|tan|tanh|threadToIOResult|toEnum|toInt|toInteger|toLower|toRational|toUpper|truncate|uncurry|undefined|unlines|until|unwords|unzip|unzip3|userError|words|writeFile|zip|zip3|zipWith|zipWith3)\b/,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0o[0-7]+|0x[0-9a-f]+)\b/i,operator:[{pattern:/`(?:[A-Z][\w']*\.)*[_a-z][\w']*`/,greedy:!0},{pattern:/(\s)\.(?=\s)/,lookbehind:!0},/[-!#$%*+=?&@|~:<>^\\\/][-!#$%*+=?&@|~.:<>^\\\/]*|\.[-!#$%*+=?&@|~.:<>^\\\/]+/],hvariable:{pattern:/\b(?:[A-Z][\w']*\.)*[_a-z][\w']*/,inside:{punctuation:/\./}},constant:{pattern:/\b(?:[A-Z][\w']*\.)*[A-Z][\w']*/,inside:{punctuation:/\./}},punctuation:/[{}[\];(),.:]/},t.languages.hs=t.languages.haskell}return dS}var fS,tD;function Tye(){if(tD)return fS;tD=1,fS=e,e.displayName="haxe",e.aliases=[];function e(t){t.languages.haxe=t.languages.extend("clike",{string:{pattern:/"(?:[^"\\]|\\[\s\S])*"/,greedy:!0},"class-name":[{pattern:/(\b(?:abstract|class|enum|extends|implements|interface|new|typedef)\s+)[A-Z_]\w*/,lookbehind:!0},/\b[A-Z]\w*/],keyword:/\bthis\b|\b(?:abstract|as|break|case|cast|catch|class|continue|default|do|dynamic|else|enum|extends|extern|final|for|from|function|if|implements|import|in|inline|interface|macro|new|null|operator|overload|override|package|private|public|return|static|super|switch|throw|to|try|typedef|untyped|using|var|while)(?!\.)\b/,function:{pattern:/\b[a-z_]\w*(?=\s*(?:<[^<>]*>\s*)?\()/i,greedy:!0},operator:/\.{3}|\+\+|--|&&|\|\||->|=>|(?:<{1,3}|[-+*/%!=&|^])=?|[?:~]/}),t.languages.insertBefore("haxe","string",{"string-interpolation":{pattern:/'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{interpolation:{pattern:/(^|[^\\])\$(?:\w+|\{[^{}]+\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:t.languages.haxe}}},string:/[\s\S]+/}}}),t.languages.insertBefore("haxe","class-name",{regex:{pattern:/~\/(?:[^\/\\\r\n]|\\.)+\/[a-z]*/,greedy:!0,inside:{"regex-flags":/\b[a-z]+$/,"regex-source":{pattern:/^(~\/)[\s\S]+(?=\/$)/,lookbehind:!0,alias:"language-regex",inside:t.languages.regex},"regex-delimiter":/^~\/|\/$/}}}),t.languages.insertBefore("haxe","keyword",{preprocessor:{pattern:/#(?:else|elseif|end|if)\b.*/,alias:"property"},metadata:{pattern:/@:?[\w.]+/,alias:"symbol"},reification:{pattern:/\$(?:\w+|(?=\{))/,alias:"important"}})}return fS}var pS,nD;function Rye(){if(nD)return pS;nD=1,pS=e,e.displayName="hcl",e.aliases=[];function e(t){t.languages.hcl={comment:/(?:\/\/|#).*|\/\*[\s\S]*?(?:\*\/|$)/,heredoc:{pattern:/<<-?(\w+\b)[\s\S]*?^[ \t]*\1/m,greedy:!0,alias:"string"},keyword:[{pattern:/(?:data|resource)\s+(?:"(?:\\[\s\S]|[^\\"])*")(?=\s+"[\w-]+"\s+\{)/i,inside:{type:{pattern:/(resource|data|\s+)(?:"(?:\\[\s\S]|[^\\"])*")/i,lookbehind:!0,alias:"variable"}}},{pattern:/(?:backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+(?=\{)/i,inside:{type:{pattern:/(backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+/i,lookbehind:!0,alias:"variable"}}},/[\w-]+(?=\s+\{)/],property:[/[-\w\.]+(?=\s*=(?!=))/,/"(?:\\[\s\S]|[^\\"])+"(?=\s*[:=])/],string:{pattern:/"(?:[^\\$"]|\\[\s\S]|\$(?:(?=")|\$+(?!\$)|[^"${])|\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\})*"/,greedy:!0,inside:{interpolation:{pattern:/(^|[^$])\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\}/,lookbehind:!0,inside:{type:{pattern:/(\b(?:count|data|local|module|path|self|terraform|var)\b\.)[\w\*]+/i,lookbehind:!0,alias:"variable"},keyword:/\b(?:count|data|local|module|path|self|terraform|var)\b/i,function:/\w+(?=\()/,string:{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,punctuation:/[!\$#%&'()*+,.\/;<=>@\[\\\]^`{|}~?:]/}}}},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,boolean:/\b(?:false|true)\b/i,punctuation:/[=\[\]{}]/}}return pS}var gS,rD;function Nye(){if(rD)return gS;rD=1;var e=Ws();gS=t,t.displayName="hlsl",t.aliases=[];function t(n){n.register(e),n.languages.hlsl=n.languages.extend("c",{"class-name":[n.languages.c["class-name"],/\b(?:AppendStructuredBuffer|BlendState|Buffer|ByteAddressBuffer|CompileShader|ComputeShader|ConsumeStructuredBuffer|DepthStencilState|DepthStencilView|DomainShader|GeometryShader|Hullshader|InputPatch|LineStream|OutputPatch|PixelShader|PointStream|RWBuffer|RWByteAddressBuffer|RWStructuredBuffer|RWTexture(?:1D|1DArray|2D|2DArray|3D)|RasterizerState|RenderTargetView|SamplerComparisonState|SamplerState|StructuredBuffer|Texture(?:1D|1DArray|2D|2DArray|2DMS|2DMSArray|3D|Cube|CubeArray)|TriangleStream|VertexShader)\b/],keyword:[/\b(?:asm|asm_fragment|auto|break|case|catch|cbuffer|centroid|char|class|column_major|compile|compile_fragment|const|const_cast|continue|default|delete|discard|do|dynamic_cast|else|enum|explicit|export|extern|for|friend|fxgroup|goto|groupshared|if|in|inline|inout|interface|line|lineadj|linear|long|matrix|mutable|namespace|new|nointerpolation|noperspective|operator|out|packoffset|pass|pixelfragment|point|precise|private|protected|public|register|reinterpret_cast|return|row_major|sample|sampler|shared|short|signed|sizeof|snorm|stateblock|stateblock_state|static|static_cast|string|struct|switch|tbuffer|technique|technique10|technique11|template|texture|this|throw|triangle|triangleadj|try|typedef|typename|uniform|union|unorm|unsigned|using|vector|vertexfragment|virtual|void|volatile|while)\b/,/\b(?:bool|double|dword|float|half|int|min(?:10float|12int|16(?:float|int|uint))|uint)(?:[1-4](?:x[1-4])?)?\b/],number:/(?:(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+)?|\b0x[\da-fA-F]+)[fFhHlLuU]?\b/,boolean:/\b(?:false|true)\b/})}return gS}var mS,aD;function Iye(){if(aD)return mS;aD=1,mS=e,e.displayName="hoon",e.aliases=[];function e(t){t.languages.hoon={comment:{pattern:/::.*/,greedy:!0},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},constant:/%(?:\.[ny]|[\w-]+)/,"class-name":/@(?:[a-z0-9-]*[a-z0-9])?|\*/i,function:/(?:\+[-+] {2})?(?:[a-z](?:[a-z0-9-]*[a-z0-9])?)/,keyword:/\.[\^\+\*=\?]|![><:\.=\?!]|=[>|:,\.\-\^<+;/~\*\?]|\?[>|:\.\-\^<\+&~=@!]|\|[\$_%:\.\-\^~\*=@\?]|\+[|\$\+\*]|:[_\-\^\+~\*]|%[_:\.\-\^\+~\*=]|\^[|:\.\-\+&~\*=\?]|\$[|_%:<>\-\^&~@=\?]|;[:<\+;\/~\*=]|~[>|\$_%<\+\/&=\?!]|--|==/}}return mS}var hS,oD;function Oye(){if(oD)return hS;oD=1,hS=e,e.displayName="hpkp",e.aliases=[];function e(t){t.languages.hpkp={directive:{pattern:/\b(?:includeSubDomains|max-age|pin-sha256|preload|report-to|report-uri|strict)(?=[\s;=]|$)/i,alias:"property"},operator:/=/,punctuation:/;/}}return hS}var bS,iD;function Dye(){if(iD)return bS;iD=1,bS=e,e.displayName="hsts",e.aliases=[];function e(t){t.languages.hsts={directive:{pattern:/\b(?:includeSubDomains|max-age|preload)(?=[\s;=]|$)/i,alias:"property"},operator:/=/,punctuation:/;/}}return bS}var yS,sD;function Lye(){if(sD)return yS;sD=1,yS=e,e.displayName="http",e.aliases=[];function e(t){(function(n){function r(d){return RegExp("(^(?:"+d+"):[ ]*(?![ ]))[^]+","i")}n.languages.http={"request-line":{pattern:/^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:n.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[\d.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[\d.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[\d.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},header:{pattern:/^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,inside:{"header-value":[{pattern:r(/Content-Security-Policy/.source),lookbehind:!0,alias:["csp","languages-csp"],inside:n.languages.csp},{pattern:r(/Public-Key-Pins(?:-Report-Only)?/.source),lookbehind:!0,alias:["hpkp","languages-hpkp"],inside:n.languages.hpkp},{pattern:r(/Strict-Transport-Security/.source),lookbehind:!0,alias:["hsts","languages-hsts"],inside:n.languages.hsts},{pattern:r(/[^:]+/.source),lookbehind:!0}],"header-name":{pattern:/^[^:]+/,alias:"keyword"},punctuation:/^:/}}};var a=n.languages,o={"application/javascript":a.javascript,"application/json":a.json||a.javascript,"application/xml":a.xml,"text/xml":a.xml,"text/html":a.html,"text/css":a.css,"text/plain":a.plain},i={"application/json":!0,"application/xml":!0};function s(d){var g=d.replace(/^[a-z]+\//,""),m="\\w+/(?:[\\w.-]+\\+)+"+g+"(?![+\\w.-])";return"(?:"+d+"|"+m+")"}var l;for(var c in o)if(o[c]){l=l||{};var u=i[c]?s(c):c;l[c.replace(/\//g,"-")]={pattern:RegExp("("+/content-type:\s*/.source+u+/(?:(?:\r\n?|\n)[\w-].*)*(?:\r(?:\n|(?!\n))|\n)/.source+")"+/[^ \t\w-][\s\S]*/.source,"i"),lookbehind:!0,inside:o[c]}}l&&n.languages.insertBefore("http","header",l)})(t)}return yS}var vS,lD;function Mye(){if(lD)return vS;lD=1,vS=e,e.displayName="ichigojam",e.aliases=[];function e(t){t.languages.ichigojam={comment:/(?:\B'|REM)(?:[^\n\r]*)/i,string:{pattern:/"(?:""|[!#$%&'()*,\/:;<=>?^\w +\-.])*"/,greedy:!0},number:/\B#[0-9A-F]+|\B`[01]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,keyword:/\b(?:BEEP|BPS|CASE|CLEAR|CLK|CLO|CLP|CLS|CLT|CLV|CONT|COPY|ELSE|END|FILE|FILES|FOR|GOSUB|GOTO|GSB|IF|INPUT|KBD|LED|LET|LIST|LOAD|LOCATE|LRUN|NEW|NEXT|OUT|PLAY|POKE|PRINT|PWM|REM|RENUM|RESET|RETURN|RIGHT|RTN|RUN|SAVE|SCROLL|SLEEP|SRND|STEP|STOP|SUB|TEMPO|THEN|TO|UART|VIDEO|WAIT)(?:\$|\b)/i,function:/\b(?:ABS|ANA|ASC|BIN|BTN|DEC|END|FREE|HELP|HEX|I2CR|I2CW|IN|INKEY|LEN|LINE|PEEK|RND|SCR|SOUND|STR|TICK|USR|VER|VPEEK|ZER)(?:\$|\b)/i,label:/(?:\B@\S+)/,operator:/<[=>]?|>=?|\|\||&&|[+\-*\/=|&^~!]|\b(?:AND|NOT|OR)\b/i,punctuation:/[\[,;:()\]]/}}return vS}var SS,cD;function Pye(){if(cD)return SS;cD=1,SS=e,e.displayName="icon",e.aliases=[];function e(t){t.languages.icon={comment:/#.*/,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n_]|\\.|_(?!\1)(?:\r\n|[\s\S]))*\1/,greedy:!0},number:/\b(?:\d+r[a-z\d]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b|\.\d+\b/i,"builtin-keyword":{pattern:/&(?:allocated|ascii|clock|collections|cset|current|date|dateline|digits|dump|e|error(?:number|text|value)?|errout|fail|features|file|host|input|lcase|letters|level|line|main|null|output|phi|pi|pos|progname|random|regions|source|storage|subject|time|trace|ucase|version)\b/,alias:"variable"},directive:{pattern:/\$\w+/,alias:"builtin"},keyword:/\b(?:break|by|case|create|default|do|else|end|every|fail|global|if|initial|invocable|link|local|next|not|of|procedure|record|repeat|return|static|suspend|then|to|until|while)\b/,function:/\b(?!\d)\w+(?=\s*[({]|\s*!\s*\[)/,operator:/[+-]:(?!=)|(?:[\/?@^%&]|\+\+?|--?|==?=?|~==?=?|\*\*?|\|\|\|?|<(?:->?|>?=?)(?::=)?|:(?:=:?)?|[!.\\|~]/,punctuation:/[\[\](){},;]/}}return SS}var wS,uD;function $ye(){if(uD)return wS;uD=1,wS=e,e.displayName="icuMessageFormat",e.aliases=[];function e(t){(function(n){function r(c,u){return u<=0?/[]/.source:c.replace(//g,function(){return r(c,u-1)})}var a=/'[{}:=,](?:[^']|'')*'(?!')/,o={pattern:/''/,greedy:!0,alias:"operator"},i={pattern:a,greedy:!0,inside:{escape:o}},s=r(/\{(?:[^{}']|'(?![{},'])|''||)*\}/.source.replace(//g,function(){return a.source}),8),l={pattern:RegExp(s),inside:{message:{pattern:/^(\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:null},"message-delimiter":{pattern:/./,alias:"punctuation"}}};n.languages["icu-message-format"]={argument:{pattern:RegExp(s),greedy:!0,inside:{content:{pattern:/^(\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:{"argument-name":{pattern:/^(\s*)[^{}:=,\s]+/,lookbehind:!0},"choice-style":{pattern:/^(\s*,\s*choice\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{punctuation:/\|/,range:{pattern:/^(\s*)[+-]?(?:\d+(?:\.\d*)?|\u221e)\s*[<#\u2264]/,lookbehind:!0,inside:{operator:/[<#\u2264]/,number:/\S+/}},rest:null}},"plural-style":{pattern:/^(\s*,\s*(?:plural|selectordinal)\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{offset:/^offset:\s*\d+/,"nested-message":l,selector:{pattern:/=\d+|[^{}:=,\s]+/,inside:{keyword:/^(?:few|many|one|other|two|zero)$/}}}},"select-style":{pattern:/^(\s*,\s*select\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{"nested-message":l,selector:{pattern:/[^{}:=,\s]+/,inside:{keyword:/^other$/}}}},keyword:/\b(?:choice|plural|select|selectordinal)\b/,"arg-type":{pattern:/\b(?:date|duration|number|ordinal|spellout|time)\b/,alias:"keyword"},"arg-skeleton":{pattern:/(,\s*)::[^{}:=,\s]+/,lookbehind:!0},"arg-style":{pattern:/(,\s*)(?:currency|full|integer|long|medium|percent|short)(?=\s*$)/,lookbehind:!0},"arg-style-text":{pattern:RegExp(/(^\s*,\s*(?=\S))/.source+r(/(?:[^{}']|'[^']*'|\{(?:)?\})+/.source,8)+"$"),lookbehind:!0,alias:"string"},punctuation:/,/}},"argument-delimiter":{pattern:/./,alias:"operator"}}},escape:o,string:i},l.inside.message.inside=n.languages["icu-message-format"],n.languages["icu-message-format"].argument.inside.content.inside["choice-style"].inside.rest=n.languages["icu-message-format"]})(t)}return wS}var ES,dD;function Fye(){if(dD)return ES;dD=1;var e=NA();ES=t,t.displayName="idris",t.aliases=["idr"];function t(n){n.register(e),n.languages.idris=n.languages.extend("haskell",{comment:{pattern:/(?:(?:--|\|\|\|).*$|\{-[\s\S]*?-\})/m},keyword:/\b(?:Type|case|class|codata|constructor|corecord|data|do|dsl|else|export|if|implementation|implicit|import|impossible|in|infix|infixl|infixr|instance|interface|let|module|mutual|namespace|of|parameters|partial|postulate|private|proof|public|quoteGoal|record|rewrite|syntax|then|total|using|where|with)\b/,builtin:void 0}),n.languages.insertBefore("idris","keyword",{"import-statement":{pattern:/(^\s*import\s+)(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*/m,lookbehind:!0,inside:{punctuation:/\./}}}),n.languages.idr=n.languages.idris}return ES}var xS,fD;function jye(){if(fD)return xS;fD=1,xS=e,e.displayName="iecst",e.aliases=[];function e(t){t.languages.iecst={comment:[{pattern:/(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\(\*[\s\S]*?(?:\*\)|$)|\{[\s\S]*?(?:\}|$))/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:[/\b(?:END_)?(?:PROGRAM|CONFIGURATION|INTERFACE|FUNCTION_BLOCK|FUNCTION|ACTION|TRANSITION|TYPE|STRUCT|(?:INITIAL_)?STEP|NAMESPACE|LIBRARY|CHANNEL|FOLDER|RESOURCE|VAR_(?:ACCESS|CONFIG|EXTERNAL|GLOBAL|INPUT|IN_OUT|OUTPUT|TEMP)|VAR|METHOD|PROPERTY)\b/i,/\b(?:AT|BY|(?:END_)?(?:CASE|FOR|IF|REPEAT|WHILE)|CONSTANT|CONTINUE|DO|ELSE|ELSIF|EXIT|EXTENDS|FROM|GET|GOTO|IMPLEMENTS|JMP|NON_RETAIN|OF|PRIVATE|PROTECTED|PUBLIC|RETAIN|RETURN|SET|TASK|THEN|TO|UNTIL|USING|WITH|__CATCH|__ENDTRY|__FINALLY|__TRY)\b/],"class-name":/\b(?:ANY|ARRAY|BOOL|BYTE|U?(?:D|L|S)?INT|(?:D|L)?WORD|DATE(?:_AND_TIME)?|DT|L?REAL|POINTER|STRING|TIME(?:_OF_DAY)?|TOD)\b/,address:{pattern:/%[IQM][XBWDL][\d.]*|%[IQ][\d.]*/,alias:"symbol"},number:/\b(?:16#[\da-f]+|2#[01_]+|0x[\da-f]+)\b|\b(?:D|DT|T|TOD)#[\d_shmd:]*|\b[A-Z]*#[\d.,_]*|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/,operator:/S?R?:?=>?|&&?|\*\*?|<[=>]?|>=?|[-:^/+#]|\b(?:AND|EQ|EXPT|GE|GT|LE|LT|MOD|NE|NOT|OR|XOR)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,punctuation:/[()[\].,;]/}}return xS}var kS,pD;function zye(){if(pD)return kS;pD=1,kS=e,e.displayName="ignore",e.aliases=["gitignore","hgignore","npmignore"];function e(t){(function(n){n.languages.ignore={comment:/^#.*/m,entry:{pattern:/\S(?:.*(?:(?:\\ )|\S))?/,alias:"string",inside:{operator:/^!|\*\*?|\?/,regex:{pattern:/(^|[^\\])\[[^\[\]]*\]/,lookbehind:!0},punctuation:/\//}}},n.languages.gitignore=n.languages.ignore,n.languages.hgignore=n.languages.ignore,n.languages.npmignore=n.languages.ignore})(t)}return kS}var CS,gD;function Uye(){if(gD)return CS;gD=1,CS=e,e.displayName="inform7",e.aliases=[];function e(t){t.languages.inform7={string:{pattern:/"[^"]*"/,inside:{substitution:{pattern:/\[[^\[\]]+\]/,inside:{delimiter:{pattern:/\[|\]/,alias:"punctuation"}}}}},comment:{pattern:/\[[^\[\]]+\]/,greedy:!0},title:{pattern:/^[ \t]*(?:book|chapter|part(?! of)|section|table|volume)\b.+/im,alias:"important"},number:{pattern:/(^|[^-])(?:\b\d+(?:\.\d+)?(?:\^\d+)?(?:(?!\d)\w+)?|\b(?:eight|eleven|five|four|nine|one|seven|six|ten|three|twelve|two))\b(?!-)/i,lookbehind:!0},verb:{pattern:/(^|[^-])\b(?:answering|applying to|are|asking|attacking|be(?:ing)?|burning|buying|called|carries|carry(?! out)|carrying|climbing|closing|conceal(?:ing|s)?|consulting|contain(?:ing|s)?|cutting|drinking|dropping|eating|enclos(?:es?|ing)|entering|examining|exiting|getting|giving|going|ha(?:s|ve|ving)|hold(?:ing|s)?|impl(?:ies|y)|incorporat(?:es?|ing)|inserting|is|jumping|kissing|listening|locking|looking|mean(?:ing|s)?|opening|provid(?:es?|ing)|pulling|pushing|putting|relat(?:es?|ing)|removing|searching|see(?:ing|s)?|setting|showing|singing|sleeping|smelling|squeezing|support(?:ing|s)?|swearing|switching|taking|tasting|telling|thinking|throwing|touching|turning|tying|unlock(?:ing|s)?|var(?:ies|y|ying)|waiting|waking|waving|wear(?:ing|s)?)\b(?!-)/i,lookbehind:!0,alias:"operator"},keyword:{pattern:/(^|[^-])\b(?:after|before|carry out|check|continue the action|definition(?= *:)|do nothing|else|end (?:if|the story|unless)|every turn|if|include|instead(?: of)?|let|move|no|now|otherwise|repeat|report|resume the story|rule for|running through|say(?:ing)?|stop the action|test|try(?:ing)?|understand|unless|use|when|while|yes)\b(?!-)/i,lookbehind:!0},property:{pattern:/(^|[^-])\b(?:adjacent(?! to)|carried|closed|concealed|contained|dark|described|edible|empty|enclosed|enterable|even|female|fixed in place|full|handled|held|improper-named|incorporated|inedible|invisible|lighted|lit|lock(?:able|ed)|male|marked for listing|mentioned|negative|neuter|non-(?:empty|full|recurring)|odd|opaque|open(?:able)?|plural-named|portable|positive|privately-named|proper-named|provided|publically-named|pushable between rooms|recurring|related|rubbing|scenery|seen|singular-named|supported|swinging|switch(?:able|ed(?: off| on)?)|touch(?:able|ed)|transparent|unconcealed|undescribed|unlit|unlocked|unmarked for listing|unmentioned|unopenable|untouchable|unvisited|variable|visible|visited|wearable|worn)\b(?!-)/i,lookbehind:!0,alias:"symbol"},position:{pattern:/(^|[^-])\b(?:above|adjacent to|back side of|below|between|down|east|everywhere|front side|here|in|inside(?: from)?|north(?:east|west)?|nowhere|on(?: top of)?|other side|outside(?: from)?|parts? of|regionally in|south(?:east|west)?|through|up|west|within)\b(?!-)/i,lookbehind:!0,alias:"keyword"},type:{pattern:/(^|[^-])\b(?:actions?|activit(?:ies|y)|actors?|animals?|backdrops?|containers?|devices?|directions?|doors?|holders?|kinds?|lists?|m[ae]n|nobody|nothing|nouns?|numbers?|objects?|people|persons?|player(?:'s holdall)?|regions?|relations?|rooms?|rule(?:book)?s?|scenes?|someone|something|supporters?|tables?|texts?|things?|time|vehicles?|wom[ae]n)\b(?!-)/i,lookbehind:!0,alias:"variable"},punctuation:/[.,:;(){}]/},t.languages.inform7.string.inside.substitution.inside.rest=t.languages.inform7,t.languages.inform7.string.inside.substitution.inside.rest.text={pattern:/\S(?:\s*\S)*/,alias:"comment"}}return CS}var _S,mD;function Bye(){if(mD)return _S;mD=1,_S=e,e.displayName="ini",e.aliases=[];function e(t){t.languages.ini={comment:{pattern:/(^[ \f\t\v]*)[#;][^\n\r]*/m,lookbehind:!0},section:{pattern:/(^[ \f\t\v]*)\[[^\n\r\]]*\]?/m,lookbehind:!0,inside:{"section-name":{pattern:/(^\[[ \f\t\v]*)[^ \f\t\v\]]+(?:[ \f\t\v]+[^ \f\t\v\]]+)*/,lookbehind:!0,alias:"selector"},punctuation:/\[|\]/}},key:{pattern:/(^[ \f\t\v]*)[^ \f\n\r\t\v=]+(?:[ \f\t\v]+[^ \f\n\r\t\v=]+)*(?=[ \f\t\v]*=)/m,lookbehind:!0,alias:"attr-name"},value:{pattern:/(=[ \f\t\v]*)[^ \f\n\r\t\v]+(?:[ \f\t\v]+[^ \f\n\r\t\v]+)*/,lookbehind:!0,alias:"attr-value",inside:{"inner-value":{pattern:/^("|').+(?=\1$)/,lookbehind:!0}}},punctuation:/=/}}return _S}var AS,hD;function Hye(){if(hD)return AS;hD=1,AS=e,e.displayName="io",e.aliases=[];function e(t){t.languages.io={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\/\/.*|#.*)/,lookbehind:!0,greedy:!0},"triple-quoted-string":{pattern:/"""(?:\\[\s\S]|(?!""")[^\\])*"""/,greedy:!0,alias:"string"},string:{pattern:/"(?:\\.|[^\\\r\n"])*"/,greedy:!0},keyword:/\b(?:activate|activeCoroCount|asString|block|break|call|catch|clone|collectGarbage|compileString|continue|do|doFile|doMessage|doString|else|elseif|exit|for|foreach|forward|getEnvironmentVariable|getSlot|hasSlot|if|ifFalse|ifNil|ifNilEval|ifTrue|isActive|isNil|isResumable|list|message|method|parent|pass|pause|perform|performWithArgList|print|println|proto|raise|raiseResumable|removeSlot|resend|resume|schedulerSleepSeconds|self|sender|setSchedulerSleepSeconds|setSlot|shallowCopy|slotNames|super|system|then|thisBlock|thisContext|try|type|uniqueId|updateSlot|wait|while|write|yield)\b/,builtin:/\b(?:Array|AudioDevice|AudioMixer|BigNum|Block|Box|Buffer|CFunction|CGI|Color|Curses|DBM|DNSResolver|DOConnection|DOProxy|DOServer|Date|Directory|Duration|DynLib|Error|Exception|FFT|File|Fnmatch|Font|Future|GL|GLE|GLScissor|GLU|GLUCylinder|GLUQuadric|GLUSphere|GLUT|Host|Image|Importer|LinkList|List|Lobby|Locals|MD5|MP3Decoder|MP3Encoder|Map|Message|Movie|Notification|Number|Object|OpenGL|Point|Protos|Random|Regex|SGML|SGMLElement|SGMLParser|SQLite|Sequence|Server|ShowMessage|SleepyCat|SleepyCatCursor|Socket|SocketManager|Sound|Soup|Store|String|Tree|UDPSender|UPDReceiver|URL|User|Warning|WeakLink)\b/,boolean:/\b(?:false|nil|true)\b/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e-?\d+)?/i,operator:/[=!*/%+\-^&|]=|>>?=?|<+*\-%$|,#][.:]?|[?^]\.?|[;\[]:?|[~}"i][.:]|[ACeEIjLor]\.|(?:[_\/\\qsux]|_?\d):)/,alias:"keyword"},number:/\b_?(?:(?!\d:)\d+(?:\.\d+)?(?:(?:ad|ar|[ejpx])_?\d+(?:\.\d+)?)*(?:b_?[\da-z]+(?:\.[\da-z]+)?)?|_\b(?!\.))/,adverb:{pattern:/[~}]|[\/\\]\.?|[bfM]\.|t[.:]/,alias:"builtin"},operator:/[=a][.:]|_\./,conjunction:{pattern:/&(?:\.:?|:)?|[.:@][.:]?|[!D][.:]|[;dHT]\.|`:?|[\^LS]:|"/,alias:"variable"},punctuation:/[()]/}}return TS}var RS,yD;function IA(){if(yD)return RS;yD=1,RS=e,e.displayName="java",e.aliases=[];function e(t){(function(n){var r=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,a=/(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,o={pattern:RegExp(a+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};n.languages.java=n.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[o,{pattern:RegExp(a+/[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source),lookbehind:!0,inside:o.inside}],keyword:r,function:[n.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),n.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),n.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":o,keyword:r,punctuation:/[<>(),.:]/,operator:/[?&|]/}},namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,function(){return r.source})),lookbehind:!0,inside:{punctuation:/\./}}})})(t)}return RS}var NS,vD;function Th(){if(vD)return NS;vD=1,NS=e,e.displayName="javadoclike",e.aliases=[];function e(t){(function(n){var r=n.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};function a(i,s){var l="doc-comment",c=n.languages[i];if(c){var u=c[l];if(!u){var d={};d[l]={pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"},c=n.languages.insertBefore(i,"comment",d),u=c[l]}if(u instanceof RegExp&&(u=c[l]={pattern:u}),Array.isArray(u))for(var g=0,m=u.length;g)?|/.source.replace(//g,function(){return i});a.languages.javadoc=a.languages.extend("javadoclike",{}),a.languages.insertBefore("javadoc","keyword",{reference:{pattern:RegExp(/(@(?:exception|link|linkplain|see|throws|value)\s+(?:\*\s*)?)/.source+"(?:"+s+")"),lookbehind:!0,inside:{function:{pattern:/(#\s*)\w+(?=\s*\()/,lookbehind:!0},field:{pattern:/(#\s*)\w+/,lookbehind:!0},namespace:{pattern:/\b(?:[a-z]\w*\s*\.\s*)+/,inside:{punctuation:/\./}},"class-name":/\b[A-Z]\w*/,keyword:a.languages.java.keyword,punctuation:/[#()[\],.]/}},"class-name":{pattern:/(@param\s+)<[A-Z]\w*>/,lookbehind:!0,inside:{punctuation:/[.<>]/}},"code-section":[{pattern:/(\{@code\s+(?!\s))(?:[^\s{}]|\s+(?![\s}])|\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\})+(?=\s*\})/,lookbehind:!0,inside:{code:{pattern:o,lookbehind:!0,inside:a.languages.java,alias:"language-java"}}},{pattern:/(<(code|pre|tt)>(?!)\s*)\S(?:\S|\s+\S)*?(?=\s*<\/\2>)/,lookbehind:!0,inside:{line:{pattern:o,lookbehind:!0,inside:{tag:a.languages.markup.tag,entity:a.languages.markup.entity,code:{pattern:/.+/,inside:a.languages.java,alias:"language-java"}}}}}],tag:a.languages.markup.tag,entity:a.languages.markup.entity}),a.languages.javadoclike.addSupport("java",a.languages.javadoc)}(r)}return IS}var OS,wD;function Gye(){if(wD)return OS;wD=1,OS=e,e.displayName="javastacktrace",e.aliases=[];function e(t){t.languages.javastacktrace={summary:{pattern:/^([\t ]*)(?:(?:Caused by:|Suppressed:|Exception in thread "[^"]*")[\t ]+)?[\w$.]+(?::.*)?$/m,lookbehind:!0,inside:{keyword:{pattern:/^([\t ]*)(?:(?:Caused by|Suppressed)(?=:)|Exception in thread)/m,lookbehind:!0},string:{pattern:/^(\s*)"[^"]*"/,lookbehind:!0},exceptions:{pattern:/^(:?\s*)[\w$.]+(?=:|$)/,lookbehind:!0,inside:{"class-name":/[\w$]+$/,namespace:/\b[a-z]\w*\b/,punctuation:/\./}},message:{pattern:/(:\s*)\S.*/,lookbehind:!0,alias:"string"},punctuation:/:/}},"stack-frame":{pattern:/^([\t ]*)at (?:[\w$./]|@[\w$.+-]*\/)+(?:)?\([^()]*\)/m,lookbehind:!0,inside:{keyword:{pattern:/^(\s*)at(?= )/,lookbehind:!0},source:[{pattern:/(\()\w+\.\w+:\d+(?=\))/,lookbehind:!0,inside:{file:/^\w+\.\w+/,punctuation:/:/,"line-number":{pattern:/\b\d+\b/,alias:"number"}}},{pattern:/(\()[^()]*(?=\))/,lookbehind:!0,inside:{keyword:/^(?:Native Method|Unknown Source)$/}}],"class-name":/[\w$]+(?=\.(?:|[\w$]+)\()/,function:/(?:|[\w$]+)(?=\()/,"class-loader":{pattern:/(\s)[a-z]\w*(?:\.[a-z]\w*)*(?=\/[\w@$.]*\/)/,lookbehind:!0,alias:"namespace",inside:{punctuation:/\./}},module:{pattern:/([\s/])[a-z]\w*(?:\.[a-z]\w*)*(?:@[\w$.+-]*)?(?=\/)/,lookbehind:!0,inside:{version:{pattern:/(@)[\s\S]+/,lookbehind:!0,alias:"number"},punctuation:/[@.]/}},namespace:{pattern:/(?:\b[a-z]\w*\.)+/,inside:{punctuation:/\./}},punctuation:/[()/.]/}},more:{pattern:/^([\t ]*)\.{3} \d+ [a-z]+(?: [a-z]+)*/m,lookbehind:!0,inside:{punctuation:/\.{3}/,number:/\d+/,keyword:/\b[a-z]+(?: [a-z]+)*\b/}}}}return OS}var DS,ED;function Wye(){if(ED)return DS;ED=1,DS=e,e.displayName="jexl",e.aliases=[];function e(t){t.languages.jexl={string:/(["'])(?:\\[\s\S]|(?!\1)[^\\])*\1/,transform:{pattern:/(\|\s*)[a-zA-Zа-яА-Я_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$][\wа-яА-Я\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$]*/,alias:"function",lookbehind:!0},function:/[a-zA-Zа-яА-Я_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$][\wа-яА-Я\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$]*\s*(?=\()/,number:/\b\d+(?:\.\d+)?\b|\B\.\d+\b/,operator:/[<>!]=?|-|\+|&&|==|\|\|?|\/\/?|[?:*^%]/,boolean:/\b(?:false|true)\b/,keyword:/\bin\b/,punctuation:/[{}[\](),.]/}}return DS}var LS,xD;function Kye(){if(xD)return LS;xD=1,LS=e,e.displayName="jolie",e.aliases=[];function e(t){t.languages.jolie=t.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\[\s\S]|[^"\\])*"/,lookbehind:!0,greedy:!0},"class-name":{pattern:/((?:\b(?:as|courier|embed|in|inputPort|outputPort|service)\b|@)[ \t]*)\w+/,lookbehind:!0},keyword:/\b(?:as|cH|comp|concurrent|constants|courier|cset|csets|default|define|else|embed|embedded|execution|exit|extender|for|foreach|forward|from|global|if|import|in|include|init|inputPort|install|instanceof|interface|is_defined|linkIn|linkOut|main|new|nullProcess|outputPort|over|private|provide|public|scope|sequential|service|single|spawn|synchronized|this|throw|throws|type|undef|until|while|with)\b/,function:/\b[a-z_]\w*(?=[ \t]*[@(])/i,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?l?/i,operator:/-[-=>]?|\+[+=]?|<[<=]?|[>=*!]=?|&&|\|\||[?\/%^@|]/,punctuation:/[()[\]{},;.:]/,builtin:/\b(?:Byte|any|bool|char|double|enum|float|int|length|long|ranges|regex|string|undefined|void)\b/}),t.languages.insertBefore("jolie","keyword",{aggregates:{pattern:/(\bAggregates\s*:\s*)(?:\w+(?:\s+with\s+\w+)?\s*,\s*)*\w+(?:\s+with\s+\w+)?/,lookbehind:!0,inside:{keyword:/\bwith\b/,"class-name":/\w+/,punctuation:/,/}},redirects:{pattern:/(\bRedirects\s*:\s*)(?:\w+\s*=>\s*\w+\s*,\s*)*(?:\w+\s*=>\s*\w+)/,lookbehind:!0,inside:{punctuation:/,/,"class-name":/\w+/,operator:/=>/}},property:{pattern:/\b(?:Aggregates|[Ii]nterfaces|Java|Javascript|Jolie|[Ll]ocation|OneWay|[Pp]rotocol|Redirects|RequestResponse)\b(?=[ \t]*:)/}})}return LS}var MS,kD;function Yye(){if(kD)return MS;kD=1,MS=e,e.displayName="jq",e.aliases=[];function e(t){(function(n){var r=/\\\((?:[^()]|\([^()]*\))*\)/.source,a=RegExp(/(^|[^\\])"(?:[^"\r\n\\]|\\[^\r\n(]|__)*"/.source.replace(/__/g,function(){return r})),o={interpolation:{pattern:RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+r),lookbehind:!0,inside:{content:{pattern:/^(\\\()[\s\S]+(?=\)$)/,lookbehind:!0,inside:null},punctuation:/^\\\(|\)$/}}},i=n.languages.jq={comment:/#.*/,property:{pattern:RegExp(a.source+/(?=\s*:(?!:))/.source),lookbehind:!0,greedy:!0,inside:o},string:{pattern:a,lookbehind:!0,greedy:!0,inside:o},function:{pattern:/(\bdef\s+)[a-z_]\w+/i,lookbehind:!0},variable:/\B\$\w+/,"property-literal":{pattern:/\b[a-z_]\w*(?=\s*:(?!:))/i,alias:"property"},keyword:/\b(?:as|break|catch|def|elif|else|end|foreach|if|import|include|label|module|modulemeta|null|reduce|then|try|while)\b/,boolean:/\b(?:false|true)\b/,number:/(?:\b\d+\.|\B\.)?\b\d+(?:[eE][+-]?\d+)?\b/,operator:[{pattern:/\|=?/,alias:"pipe"},/\.\.|[!=<>]?=|\?\/\/|\/\/=?|[-+*/%]=?|[<>?]|\b(?:and|not|or)\b/],"c-style-function":{pattern:/\b[a-z_]\w*(?=\s*\()/i,alias:"function"},punctuation:/::|[()\[\]{},:;]|\.(?=\s*[\[\w$])/,dot:{pattern:/\./,alias:"important"}};o.interpolation.inside.content.inside=i})(t)}return MS}var PS,CD;function Zye(){if(CD)return PS;CD=1,PS=e,e.displayName="jsExtras",e.aliases=[];function e(t){(function(n){n.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+n.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),n.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+n.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),n.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]});function r(c,u){return RegExp(c.replace(//g,function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source}),u)}n.languages.insertBefore("javascript","keyword",{imports:{pattern:r(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:n.languages.javascript},exports:{pattern:r(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:n.languages.javascript}}),n.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),n.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),n.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:r(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var a=["function","function-variable","method","method-variable","property-access"],o=0;o=C.length)return;var L=R[T];if(typeof L=="string"||typeof L.content=="string"){var D=C[S],H=typeof L=="string"?L:L.content,z=H.indexOf(D);if(z!==-1){++S;var M=H.substring(0,z),U=d(E[D]),X=H.substring(z+D.length),j=[];if(M&&j.push(M),j.push(U),X){var O=[X];_(O),j.push.apply(j,O)}typeof L=="string"?(R.splice.apply(R,[T,1].concat(j)),T+=j.length-1):L.content=j}}else{var A=L.content;Array.isArray(A)?_(A):_([A])}}}return _(x),new n.Token(v,x,"language-"+v,y)}var m={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};n.hooks.add("after-tokenize",function(y){if(!(y.language in m))return;function w(v){for(var h=0,S=v.length;h]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),n.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete n.languages.typescript.parameter,delete n.languages.typescript["literal-property"];var r=n.languages.extend("typescript",{});delete r["class-name"],n.languages.typescript["class-name"].inside=r,n.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:r}}}}),n.languages.ts=n.languages.typescript})(t)}return FS}var jS,TD;function Qye(){if(TD)return jS;TD=1;var e=Th(),t=OA();jS=n,n.displayName="jsdoc",n.aliases=[];function n(r){r.register(e),r.register(t),function(a){var o=a.languages.javascript,i=/\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})+\}/.source,s="(@(?:arg|argument|param|property)\\s+(?:"+i+"\\s+)?)";a.languages.jsdoc=a.languages.extend("javadoclike",{parameter:{pattern:RegExp(s+/(?:(?!\s)[$\w\xA0-\uFFFF.])+(?=\s|$)/.source),lookbehind:!0,inside:{punctuation:/\./}}}),a.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(s+/\[(?:(?!\s)[$\w\xA0-\uFFFF.])+(?:=[^[\]]+)?\](?=\s|$)/.source),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:o,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp(/(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\s+(?:\s+)?)[A-Z]\w*(?:\.[A-Z]\w*)*/.source.replace(//g,function(){return i})),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+i),lookbehind:!0,inside:{string:o.string,number:o.number,boolean:o.boolean,keyword:a.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:o,alias:"language-javascript"}}}}),a.languages.javadoclike.addSupport("javascript",a.languages.jsdoc)}(r)}return jS}var zS,RD;function DA(){if(RD)return zS;RD=1,zS=e,e.displayName="json",e.aliases=["webmanifest"];function e(t){t.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},t.languages.webmanifest=t.languages.json}return zS}var US,ND;function Jye(){if(ND)return US;ND=1;var e=DA();US=t,t.displayName="json5",t.aliases=[];function t(n){n.register(e),function(r){var a=/("|')(?:\\(?:\r\n?|\n|.)|(?!\1)[^\\\r\n])*\1/;r.languages.json5=r.languages.extend("json",{property:[{pattern:RegExp(a.source+"(?=\\s*:)"),greedy:!0},{pattern:/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/,alias:"unquoted"}],string:{pattern:a,greedy:!0},number:/[+-]?\b(?:NaN|Infinity|0x[a-fA-F\d]+)\b|[+-]?(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+\b)?/})}(n)}return US}var BS,ID;function eve(){if(ID)return BS;ID=1;var e=DA();BS=t,t.displayName="jsonp",t.aliases=[];function t(n){n.register(e),n.languages.jsonp=n.languages.extend("json",{punctuation:/[{}[\]();,.]/}),n.languages.insertBefore("jsonp","punctuation",{function:/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*\()/})}return BS}var HS,OD;function tve(){if(OD)return HS;OD=1,HS=e,e.displayName="jsstacktrace",e.aliases=[];function e(t){t.languages.jsstacktrace={"error-message":{pattern:/^\S.*/m,alias:"string"},"stack-frame":{pattern:/(^[ \t]+)at[ \t].*/m,lookbehind:!0,inside:{"not-my-code":{pattern:/^at[ \t]+(?!\s)(?:node\.js||.*(?:node_modules|\(\)|\(|$|\(internal\/|\(node\.js)).*/m,alias:"comment"},filename:{pattern:/(\bat\s+(?!\s)|\()(?:[a-zA-Z]:)?[^():]+(?=:)/,lookbehind:!0,alias:"url"},function:{pattern:/(\bat\s+(?:new\s+)?)(?!\s)[_$a-zA-Z\xA0-\uFFFF<][.$\w\xA0-\uFFFF<>]*/,lookbehind:!0,inside:{punctuation:/\./}},punctuation:/[()]/,keyword:/\b(?:at|new)\b/,alias:{pattern:/\[(?:as\s+)?(?!\s)[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\]/,alias:"variable"},"line-number":{pattern:/:\d+(?::\d+)?\b/,alias:"number",inside:{punctuation:/:/}}}}}}return HS}var VS,DD;function iz(){if(DD)return VS;DD=1,VS=e,e.displayName="jsx",e.aliases=[];function e(t){(function(n){var r=n.util.clone(n.languages.javascript),a=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,o=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,i=/(?:\{*\.{3}(?:[^{}]|)*\})/.source;function s(u,d){return u=u.replace(//g,function(){return a}).replace(//g,function(){return o}).replace(//g,function(){return i}),RegExp(u,d)}i=s(i).source,n.languages.jsx=n.languages.extend("markup",r),n.languages.jsx.tag.pattern=s(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),n.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,n.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,n.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,n.languages.jsx.tag.inside.comment=r.comment,n.languages.insertBefore("inside","attr-name",{spread:{pattern:s(//.source),inside:n.languages.jsx}},n.languages.jsx.tag),n.languages.insertBefore("inside","special-attr",{script:{pattern:s(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:n.languages.jsx}}},n.languages.jsx.tag);var l=function(u){return u?typeof u=="string"?u:typeof u.content=="string"?u.content:u.content.map(l).join(""):""},c=function(u){for(var d=[],g=0;g0&&d[d.length-1].tagName===l(m.content[0].content[1])&&d.pop():m.content[m.content.length-1].content==="/>"||d.push({tagName:l(m.content[0].content[1]),openedBraces:0}):d.length>0&&m.type==="punctuation"&&m.content==="{"?d[d.length-1].openedBraces++:d.length>0&&d[d.length-1].openedBraces>0&&m.type==="punctuation"&&m.content==="}"?d[d.length-1].openedBraces--:b=!0),(b||typeof m=="string")&&d.length>0&&d[d.length-1].openedBraces===0){var y=l(m);g0&&(typeof u[g-1]=="string"||u[g-1].type==="plain-text")&&(y=l(u[g-1])+y,u.splice(g-1,1),g--),u[g]=new n.Token("plain-text",y,null,y)}m.content&&typeof m.content!="string"&&c(m.content)}};n.hooks.add("after-tokenize",function(u){u.language!=="jsx"&&u.language!=="tsx"||c(u.tokens)})})(t)}return VS}var qS,LD;function nve(){if(LD)return qS;LD=1,qS=e,e.displayName="julia",e.aliases=[];function e(t){t.languages.julia={comment:{pattern:/(^|[^\\])(?:#=(?:[^#=]|=(?!#)|#(?!=)|#=(?:[^#=]|=(?!#)|#(?!=))*=#)*=#|#.*)/,lookbehind:!0},regex:{pattern:/r"(?:\\.|[^"\\\r\n])*"[imsx]{0,4}/,greedy:!0},string:{pattern:/"""[\s\S]+?"""|(?:\b\w+)?"(?:\\.|[^"\\\r\n])*"|`(?:[^\\`\r\n]|\\.)*`/,greedy:!0},char:{pattern:/(^|[^\w'])'(?:\\[^\r\n][^'\r\n]*|[^\\\r\n])'/,lookbehind:!0,greedy:!0},keyword:/\b(?:abstract|baremodule|begin|bitstype|break|catch|ccall|const|continue|do|else|elseif|end|export|finally|for|function|global|if|immutable|import|importall|in|let|local|macro|module|print|println|quote|return|struct|try|type|typealias|using|while)\b/,boolean:/\b(?:false|true)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[box])?(?:[\da-f]+(?:_[\da-f]+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[efp][+-]?\d+(?:_\d+)*)?j?/i,operator:/&&|\|\||[-+*^%÷⊻&$\\]=?|\/[\/=]?|!=?=?|\|[=>]?|<(?:<=?|[=:|])?|>(?:=|>>?=?)?|==?=?|[~≠≤≥'√∛]/,punctuation:/::?|[{}[\]();,.?]/,constant:/\b(?:(?:Inf|NaN)(?:16|32|64)?|im|pi)\b|[πℯ]/}}return qS}var GS,MD;function rve(){if(MD)return GS;MD=1,GS=e,e.displayName="keepalived",e.aliases=[];function e(t){t.languages.keepalived={comment:{pattern:/[#!].*/,greedy:!0},string:{pattern:/(^|[^\\])(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/,lookbehind:!0,greedy:!0},ip:{pattern:RegExp(/\b(?:(?:(?:[\da-f]{1,4}:){7}[\da-f]{1,4}|(?:[\da-f]{1,4}:){6}:[\da-f]{1,4}|(?:[\da-f]{1,4}:){5}:(?:[\da-f]{1,4}:)?[\da-f]{1,4}|(?:[\da-f]{1,4}:){4}:(?:[\da-f]{1,4}:){0,2}[\da-f]{1,4}|(?:[\da-f]{1,4}:){3}:(?:[\da-f]{1,4}:){0,3}[\da-f]{1,4}|(?:[\da-f]{1,4}:){2}:(?:[\da-f]{1,4}:){0,4}[\da-f]{1,4}|(?:[\da-f]{1,4}:){6}|(?:[\da-f]{1,4}:){0,5}:|::(?:[\da-f]{1,4}:){0,5}|[\da-f]{1,4}::(?:[\da-f]{1,4}:){0,5}[\da-f]{1,4}|::(?:[\da-f]{1,4}:){0,6}[\da-f]{1,4}|(?:[\da-f]{1,4}:){1,7}:)(?:\/\d{1,3})?|(?:\/\d{1,2})?)\b/.source.replace(//g,function(){return/(?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d))/.source}),"i"),alias:"number"},path:{pattern:/(\s)\/(?:[^\/\s]+\/)*[^\/\s]*|\b[a-zA-Z]:\\(?:[^\\\s]+\\)*[^\\\s]*/,lookbehind:!0,alias:"string"},variable:/\$\{?\w+\}?/,email:{pattern:/[\w-]+@[\w-]+(?:\.[\w-]{2,3}){1,2}/,alias:"string"},"conditional-configuration":{pattern:/@\^?[\w-]+/,alias:"variable"},operator:/=/,property:/\b(?:BFD_CHECK|DNS_CHECK|FILE_CHECK|HTTP_GET|MISC_CHECK|NAME|PING_CHECK|SCRIPTS|SMTP_CHECK|SSL|SSL_GET|TCP_CHECK|UDP_CHECK|accept|advert_int|alpha|auth_pass|auth_type|authentication|bfd_cpu_affinity|bfd_instance|bfd_no_swap|bfd_priority|bfd_process_name|bfd_rlimit_rttime|bfd_rt_priority|bind_if|bind_port|bindto|ca|certificate|check_unicast_src|checker|checker_cpu_affinity|checker_log_all_failures|checker_no_swap|checker_priority|checker_rlimit_rttime|checker_rt_priority|child_wait_time|connect_ip|connect_port|connect_timeout|dbus_service_name|debug|default_interface|delay|delay_before_retry|delay_loop|digest|dont_track_primary|dynamic|dynamic_interfaces|enable_(?:dbus|script_security|sni|snmp_checker|snmp_rfc|snmp_rfcv2|snmp_rfcv3|snmp_vrrp|traps)|end|fall|fast_recovery|file|flag-[123]|fork_delay|full_command|fwmark|garp_group|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|global_defs|global_tracking|gna_interval|group|ha_suspend|hashed|helo_name|higher_prio_send_advert|hoplimit|http_protocol|hysteresis|idle_tx|include|inhibit_on_failure|init_fail|init_file|instance|interface|interfaces|interval|ip_family|ipvs_process_name|keepalived.conf|kernel_rx_buf_size|key|linkbeat_interfaces|linkbeat_use_polling|log_all_failures|log_unknown_vrids|lower_prio_no_advert|lthreshold|lvs_flush|lvs_flush_onstop|lvs_method|lvs_netlink_cmd_rcv_bufs|lvs_netlink_cmd_rcv_bufs_force|lvs_netlink_monitor_rcv_bufs|lvs_netlink_monitor_rcv_bufs_force|lvs_notify_fifo|lvs_notify_fifo_script|lvs_sched|lvs_sync_daemon|max_auto_priority|max_hops|mcast_src_ip|mh-fallback|mh-port|min_auto_priority_delay|min_rx|min_tx|misc_dynamic|misc_path|misc_timeout|multiplier|name|namespace_with_ipsets|native_ipv6|neighbor_ip|net_namespace|net_namespace_ipvs|nftables|nftables_counters|nftables_ifindex|nftables_priority|no_accept|no_checker_emails|no_email_faults|nopreempt|notification_email|notification_email_from|notify|notify_backup|notify_deleted|notify_down|notify_fault|notify_fifo|notify_fifo_script|notify_master|notify_master_rx_lower_pri|notify_priority_changes|notify_stop|notify_up|old_unicast_checksum|omega|ops|param_match|passive|password|path|persistence_engine|persistence_granularity|persistence_timeout|preempt|preempt_delay|priority|process|process_monitor_rcv_bufs|process_monitor_rcv_bufs_force|process_name|process_names|promote_secondaries|protocol|proxy_arp|proxy_arp_pvlan|quorum|quorum_down|quorum_max|quorum_up|random_seed|real_server|regex|regex_max_offset|regex_min_offset|regex_no_match|regex_options|regex_stack|reload_repeat|reload_time_file|require_reply|retry|rise|router_id|rs_init_notifies|script|script_user|sh-fallback|sh-port|shutdown_script|shutdown_script_timeout|skip_check_adv_addr|smtp_alert|smtp_alert_checker|smtp_alert_vrrp|smtp_connect_timeout|smtp_helo_name|smtp_server|snmp_socket|sorry_server|sorry_server_inhibit|sorry_server_lvs_method|source_ip|start|startup_script|startup_script_timeout|state|static_ipaddress|static_routes|static_rules|status_code|step|strict_mode|sync_group_tracking_weight|terminate_delay|timeout|track_bfd|track_file|track_group|track_interface|track_process|track_script|track_src_ip|ttl|type|umask|unicast_peer|unicast_src_ip|unicast_ttl|url|use_ipvlan|use_pid_dir|use_vmac|user|uthreshold|val[123]|version|virtual_ipaddress|virtual_ipaddress_excluded|virtual_router_id|virtual_routes|virtual_rules|virtual_server|virtual_server_group|virtualhost|vmac_xmit_base|vrrp|vrrp_(?:check_unicast_src|cpu_affinity|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|gna_interval|higher_prio_send_advert|instance|ipsets|iptables|lower_prio_no_advert|mcast_group4|mcast_group6|min_garp|netlink_cmd_rcv_bufs|netlink_cmd_rcv_bufs_force|netlink_monitor_rcv_bufs|netlink_monitor_rcv_bufs_force|no_swap|notify_fifo|notify_fifo_script|notify_priority_changes|priority|process_name|rlimit_rttime|rt_priority|rx_bufs_multiplier|rx_bufs_policy|script|skip_check_adv_addr|startup_delay|strict|sync_group|track_process|version)|warmup|weight)\b/,constant:/\b(?:A|AAAA|AH|BACKUP|CNAME|DR|MASTER|MX|NAT|NS|PASS|SCTP|SOA|TCP|TUN|TXT|UDP|dh|fo|lblc|lblcr|lc|mh|nq|ovf|rr|sed|sh|wlc|wrr)\b/,number:{pattern:/(^|[^\w.-])-?\d+(?:\.\d+)?/,lookbehind:!0},boolean:/\b(?:false|no|off|on|true|yes)\b/,punctuation:/[\{\}]/}}return GS}var WS,PD;function ave(){if(PD)return WS;PD=1,WS=e,e.displayName="keyman",e.aliases=[];function e(t){t.languages.keyman={comment:{pattern:/\bc .*/i,greedy:!0},string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,greedy:!0},"virtual-key":{pattern:/\[\s*(?:(?:ALT|CAPS|CTRL|LALT|LCTRL|NCAPS|RALT|RCTRL|SHIFT)\s+)*(?:[TKU]_[\w?]+|[A-E]\d\d?|"[^"\r\n]*"|'[^'\r\n]*')\s*\]/i,greedy:!0,alias:"function"},"header-keyword":{pattern:/&\w+/,alias:"bold"},"header-statement":{pattern:/\b(?:bitmap|bitmaps|caps always off|caps on only|copyright|hotkey|language|layout|message|name|shift frees caps|version)\b/i,alias:"bold"},"rule-keyword":{pattern:/\b(?:any|baselayout|beep|call|context|deadkey|dk|if|index|layer|notany|nul|outs|platform|reset|return|save|set|store|use)\b/i,alias:"keyword"},"structural-keyword":{pattern:/\b(?:ansi|begin|group|match|nomatch|unicode|using keys)\b/i,alias:"keyword"},"compile-target":{pattern:/\$(?:keyman|keymanonly|keymanweb|kmfl|weaver):/i,alias:"property"},number:/\b(?:U\+[\dA-F]+|d\d+|x[\da-f]+|\d+)\b/i,operator:/[+>\\$]|\.\./,punctuation:/[()=,]/}}return WS}var KS,$D;function ove(){if($D)return KS;$D=1,KS=e,e.displayName="kotlin",e.aliases=["kt","kts"];function e(t){(function(n){n.languages.kotlin=n.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete n.languages.kotlin["class-name"];var r={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:n.languages.kotlin}};n.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:r},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:r},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete n.languages.kotlin.string,n.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),n.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),n.languages.kt=n.languages.kotlin,n.languages.kts=n.languages.kotlin})(t)}return KS}var YS,FD;function ive(){if(FD)return YS;FD=1,YS=e,e.displayName="kumir",e.aliases=["kum"];function e(t){(function(n){var r=/\s\x00-\x1f\x22-\x2f\x3a-\x3f\x5b-\x5e\x60\x7b-\x7e/.source;function a(o,i){return RegExp(o.replace(//g,r),i)}n.languages.kumir={comment:{pattern:/\|.*/},prolog:{pattern:/#.*/,greedy:!0},string:{pattern:/"[^\n\r"]*"|'[^\n\r']*'/,greedy:!0},boolean:{pattern:a(/(^|[])(?:да|нет)(?=[]|$)/.source),lookbehind:!0},"operator-word":{pattern:a(/(^|[])(?:и|или|не)(?=[]|$)/.source),lookbehind:!0,alias:"keyword"},"system-variable":{pattern:a(/(^|[])знач(?=[]|$)/.source),lookbehind:!0,alias:"keyword"},type:[{pattern:a(/(^|[])(?:вещ|лит|лог|сим|цел)(?:\x20*таб)?(?=[]|$)/.source),lookbehind:!0,alias:"builtin"},{pattern:a(/(^|[])(?:компл|сканкод|файл|цвет)(?=[]|$)/.source),lookbehind:!0,alias:"important"}],keyword:{pattern:a(/(^|[])(?:алг|арг(?:\x20*рез)?|ввод|ВКЛЮЧИТЬ|вс[её]|выбор|вывод|выход|дано|для|до|дс|если|иначе|исп|использовать|кон(?:(?:\x20+|_)исп)?|кц(?:(?:\x20+|_)при)?|надо|нач|нс|нц|от|пауза|пока|при|раза?|рез|стоп|таб|то|утв|шаг)(?=[]|$)/.source),lookbehind:!0},name:{pattern:a(/(^|[])[^\d][^]*(?:\x20+[^]+)*(?=[]|$)/.source),lookbehind:!0},number:{pattern:a(/(^|[])(?:\B\$[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)(?=[]|$)/.source,"i"),lookbehind:!0},punctuation:/:=|[(),:;\[\]]/,"operator-char":{pattern:/\*\*?|<[=>]?|>=?|[-+/=]/,alias:"operator"}},n.languages.kum=n.languages.kumir})(t)}return YS}var ZS,jD;function sve(){if(jD)return ZS;jD=1,ZS=e,e.displayName="kusto",e.aliases=[];function e(t){t.languages.kusto={comment:{pattern:/\/\/.*/,greedy:!0},string:{pattern:/```[\s\S]*?```|[hH]?(?:"(?:[^\r\n\\"]|\\.)*"|'(?:[^\r\n\\']|\\.)*'|@(?:"[^\r\n"]*"|'[^\r\n']*'))/,greedy:!0},verb:{pattern:/(\|\s*)[a-z][\w-]*/i,lookbehind:!0,alias:"keyword"},command:{pattern:/\.[a-z][a-z\d-]*\b/,alias:"keyword"},"class-name":/\b(?:bool|datetime|decimal|dynamic|guid|int|long|real|string|timespan)\b/,keyword:/\b(?:access|alias|and|anti|as|asc|auto|between|by|(?:contains|(?:ends|starts)with|has(?:perfix|suffix)?)(?:_cs)?|database|declare|desc|external|from|fullouter|has_all|in|ingestion|inline|inner|innerunique|into|(?:left|right)(?:anti(?:semi)?|inner|outer|semi)?|let|like|local|not|of|on|or|pattern|print|query_parameters|range|restrict|schema|set|step|table|tables|to|view|where|with|matches\s+regex|nulls\s+(?:first|last))(?![\w-])/,boolean:/\b(?:false|null|true)\b/,function:/\b[a-z_]\w*(?=\s*\()/,datetime:[{pattern:/\b(?:(?:Fri|Friday|Mon|Monday|Sat|Saturday|Sun|Sunday|Thu|Thursday|Tue|Tuesday|Wed|Wednesday)\s*,\s*)?\d{1,2}(?:\s+|-)(?:Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)(?:\s+|-)\d{2}\s+\d{2}:\d{2}(?::\d{2})?(?:\s*(?:\b(?:[A-Z]|(?:[ECMT][DS]|GM|U)T)|[+-]\d{4}))?\b/,alias:"number"},{pattern:/[+-]?\b(?:\d{4}-\d{2}-\d{2}(?:[ T]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?)?|\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?)Z?/,alias:"number"}],number:/\b(?:0x[0-9A-Fa-f]+|\d+(?:\.\d+)?(?:[Ee][+-]?\d+)?)(?:(?:min|sec|[mnµ]s|[dhms]|microsecond|tick)\b)?|[+-]?\binf\b/,operator:/=>|[!=]~|[!=<>]=?|[-+*/%|]|\.\./,punctuation:/[()\[\]{},;.:]/}}return ZS}var XS,zD;function lve(){if(zD)return XS;zD=1,XS=e,e.displayName="latex",e.aliases=["tex","context"];function e(t){(function(n){var r=/\\(?:[^a-z()[\]]|[a-z*]+)/i,a={"equation-command":{pattern:r,alias:"regex"}};n.languages.latex={comment:/%.*/,cdata:{pattern:/(\\begin\{((?:lstlisting|verbatim)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0},equation:[{pattern:/\$\$(?:\\[\s\S]|[^\\$])+\$\$|\$(?:\\[\s\S]|[^\\$])+\$|\\\([\s\S]*?\\\)|\\\[[\s\S]*?\\\]/,inside:a,alias:"string"},{pattern:/(\\begin\{((?:align|eqnarray|equation|gather|math|multline)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0,inside:a,alias:"string"}],keyword:{pattern:/(\\(?:begin|cite|documentclass|end|label|ref|usepackage)(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0},url:{pattern:/(\\url\{)[^}]+(?=\})/,lookbehind:!0},headline:{pattern:/(\\(?:chapter|frametitle|paragraph|part|section|subparagraph|subsection|subsubparagraph|subsubsection|subsubsubparagraph)\*?(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0,alias:"class-name"},function:{pattern:r,alias:"selector"},punctuation:/[[\]{}&]/},n.languages.tex=n.languages.latex,n.languages.context=n.languages.latex})(t)}return XS}var QS,UD;function Rh(){if(UD)return QS;UD=1;var e=mr();QS=t,t.displayName="php",t.aliases=[];function t(n){n.register(e),function(r){var a=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,o=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],i=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,s=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,l=/[{}\[\](),:;]/;r.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:a,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:o,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:i,operator:s,punctuation:l};var c={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:r.languages.php},u=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:c}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:c}}];r.languages.insertBefore("php","variable",{string:u,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:a,string:u,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:o,number:i,operator:s,punctuation:l}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),r.hooks.add("before-tokenize",function(d){if(/<\?/.test(d.code)){var g=/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g;r.languages["markup-templating"].buildPlaceholders(d,"php",g)}}),r.hooks.add("after-tokenize",function(d){r.languages["markup-templating"].tokenizePlaceholders(d,"php")})}(n)}return QS}var JS,BD;function cve(){if(BD)return JS;BD=1;var e=mr(),t=Rh();JS=n,n.displayName="latte",n.aliases=[];function n(r){r.register(e),r.register(t),function(a){a.languages.latte={comment:/^\{\*[\s\S]*/,"latte-tag":{pattern:/(^\{(?:\/(?=[a-z]))?)(?:[=_]|[a-z]\w*\b(?!\())/i,lookbehind:!0,alias:"important"},delimiter:{pattern:/^\{\/?|\}$/,alias:"punctuation"},php:{pattern:/\S(?:[\s\S]*\S)?/,alias:"language-php",inside:a.languages.php}};var o=a.languages.extend("markup",{});a.languages.insertBefore("inside","attr-value",{"n-attr":{pattern:/n:[\w-]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+))?/,inside:{"attr-name":{pattern:/^[^\s=]+/,alias:"important"},"attr-value":{pattern:/=[\s\S]+/,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}],php:{pattern:/\S(?:[\s\S]*\S)?/,inside:a.languages.php}}}}}},o.tag),a.hooks.add("before-tokenize",function(i){if(i.language==="latte"){var s=/\{\*[\s\S]*?\*\}|\{[^'"\s{}*](?:[^"'/{}]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|\/\*(?:[^*]|\*(?!\/))*\*\/)*\}/g;a.languages["markup-templating"].buildPlaceholders(i,"latte",s),i.grammar=o}}),a.hooks.add("after-tokenize",function(i){a.languages["markup-templating"].tokenizePlaceholders(i,"latte")})}(r)}return JS}var ew,HD;function uve(){if(HD)return ew;HD=1,ew=e,e.displayName="less",e.aliases=[];function e(t){t.languages.less=t.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),t.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}})}return ew}var tw,VD;function LA(){if(VD)return tw;VD=1,tw=e,e.displayName="scheme",e.aliases=[];function e(t){(function(n){n.languages.scheme={comment:/;.*|#;\s*(?:\((?:[^()]|\([^()]*\))*\)|\[(?:[^\[\]]|\[[^\[\]]*\])*\])|#\|(?:[^#|]|#(?!\|)|\|(?!#)|#\|(?:[^#|]|#(?!\|)|\|(?!#))*\|#)*\|#/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},symbol:{pattern:/'[^()\[\]#'\s]+/,greedy:!0},char:{pattern:/#\\(?:[ux][a-fA-F\d]+\b|[-a-zA-Z]+\b|[\uD800-\uDBFF][\uDC00-\uDFFF]|\S)/,greedy:!0},"lambda-parameter":[{pattern:/((?:^|[^'`#])[(\[]lambda\s+)(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)/,lookbehind:!0},{pattern:/((?:^|[^'`#])[(\[]lambda\s+[(\[])[^()\[\]']+/,lookbehind:!0}],keyword:{pattern:/((?:^|[^'`#])[(\[])(?:begin|case(?:-lambda)?|cond(?:-expand)?|define(?:-library|-macro|-record-type|-syntax|-values)?|defmacro|delay(?:-force)?|do|else|except|export|guard|if|import|include(?:-ci|-library-declarations)?|lambda|let(?:rec)?(?:-syntax|-values|\*)?|let\*-values|only|parameterize|prefix|(?:quasi-?)?quote|rename|set!|syntax-(?:case|rules)|unless|unquote(?:-splicing)?|when)(?=[()\[\]\s]|$)/,lookbehind:!0},builtin:{pattern:/((?:^|[^'`#])[(\[])(?:abs|and|append|apply|assoc|ass[qv]|binary-port\?|boolean=?\?|bytevector(?:-append|-copy|-copy!|-length|-u8-ref|-u8-set!|\?)?|caar|cadr|call-with-(?:current-continuation|port|values)|call\/cc|car|cdar|cddr|cdr|ceiling|char(?:->integer|-ready\?|\?|<\?|<=\?|=\?|>\?|>=\?)|close-(?:input-port|output-port|port)|complex\?|cons|current-(?:error|input|output)-port|denominator|dynamic-wind|eof-object\??|eq\?|equal\?|eqv\?|error|error-object(?:-irritants|-message|\?)|eval|even\?|exact(?:-integer-sqrt|-integer\?|\?)?|expt|features|file-error\?|floor(?:-quotient|-remainder|\/)?|flush-output-port|for-each|gcd|get-output-(?:bytevector|string)|inexact\??|input-port(?:-open\?|\?)|integer(?:->char|\?)|lcm|length|list(?:->string|->vector|-copy|-ref|-set!|-tail|\?)?|make-(?:bytevector|list|parameter|string|vector)|map|max|member|memq|memv|min|modulo|negative\?|newline|not|null\?|number(?:->string|\?)|numerator|odd\?|open-(?:input|output)-(?:bytevector|string)|or|output-port(?:-open\?|\?)|pair\?|peek-char|peek-u8|port\?|positive\?|procedure\?|quotient|raise|raise-continuable|rational\?|rationalize|read-(?:bytevector|bytevector!|char|error\?|line|string|u8)|real\?|remainder|reverse|round|set-c[ad]r!|square|string(?:->list|->number|->symbol|->utf8|->vector|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?|<\?|<=\?|=\?|>\?|>=\?)?|substring|symbol(?:->string|\?|=\?)|syntax-error|textual-port\?|truncate(?:-quotient|-remainder|\/)?|u8-ready\?|utf8->string|values|vector(?:->list|->string|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?)?|with-exception-handler|write-(?:bytevector|char|string|u8)|zero\?)(?=[()\[\]\s]|$)/,lookbehind:!0},operator:{pattern:/((?:^|[^'`#])[(\[])(?:[-+*%/]|[<>]=?|=>?)(?=[()\[\]\s]|$)/,lookbehind:!0},number:{pattern:RegExp(r({"":/\d+(?:\/\d+)|(?:\d+(?:\.\d*)?|\.\d+)(?:[esfdl][+-]?\d+)?/.source,"":/[+-]?|[+-](?:inf|nan)\.0/.source,"":/[+-](?:|(?:inf|nan)\.0)?i/.source,"":/(?:@|)?|/.source,"":/(?:#d(?:#[ei])?|#[ei](?:#d)?)?/.source,"":/[0-9a-f]+(?:\/[0-9a-f]+)?/.source,"":/[+-]?|[+-](?:inf|nan)\.0/.source,"":/[+-](?:|(?:inf|nan)\.0)?i/.source,"":/(?:@|)?|/.source,"":/#[box](?:#[ei])?|(?:#[ei])?#[box]/.source,"":/(^|[()\[\]\s])(?:|)(?=[()\[\]\s]|$)/.source}),"i"),lookbehind:!0},boolean:{pattern:/(^|[()\[\]\s])#(?:[ft]|false|true)(?=[()\[\]\s]|$)/,lookbehind:!0},function:{pattern:/((?:^|[^'`#])[(\[])(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)(?=[()\[\]\s]|$)/,lookbehind:!0},identifier:{pattern:/(^|[()\[\]\s])\|(?:[^\\|]|\\.)*\|(?=[()\[\]\s]|$)/,lookbehind:!0,greedy:!0},punctuation:/[()\[\]']/};function r(a){for(var o in a)a[o]=a[o].replace(/<[\w\s]+>/g,function(i){return"(?:"+a[i].trim()+")"});return a[o]}})(t)}return tw}var nw,qD;function dve(){if(qD)return nw;qD=1;var e=LA();nw=t,t.displayName="lilypond",t.aliases=[];function t(n){n.register(e),function(r){for(var a=/\((?:[^();"#\\]|\\[\s\S]|;.*(?!.)|"(?:[^"\\]|\\.)*"|#(?:\{(?:(?!#\})[\s\S])*#\}|[^{])|)*\)/.source,o=5,i=0;i/g,function(){return a});a=a.replace(//g,/[^\s\S]/.source);var s=r.languages.lilypond={comment:/%(?:(?!\{).*|\{[\s\S]*?%\})/,"embedded-scheme":{pattern:RegExp(/(^|[=\s])#(?:"(?:[^"\\]|\\.)*"|[^\s()"]*(?:[^\s()]|))/.source.replace(//g,function(){return a}),"m"),lookbehind:!0,greedy:!0,inside:{scheme:{pattern:/^(#)[\s\S]+$/,lookbehind:!0,alias:"language-scheme",inside:{"embedded-lilypond":{pattern:/#\{[\s\S]*?#\}/,greedy:!0,inside:{punctuation:/^#\{|#\}$/,lilypond:{pattern:/[\s\S]+/,alias:"language-lilypond",inside:null}}},rest:r.languages.scheme}},punctuation:/#/}},string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},"class-name":{pattern:/(\\new\s+)[\w-]+/,lookbehind:!0},keyword:{pattern:/\\[a-z][-\w]*/i,inside:{punctuation:/^\\/}},operator:/[=|]|<<|>>/,punctuation:{pattern:/(^|[a-z\d])(?:'+|,+|[_^]?-[_^]?(?:[-+^!>._]|(?=\d))|[_^]\.?|[.!])|[{}()[\]<>^~]|\\[()[\]<>\\!]|--|__/,lookbehind:!0},number:/\b\d+(?:\/\d+)?\b/};s["embedded-scheme"].inside.scheme.inside["embedded-lilypond"].inside.lilypond.inside=s,r.languages.ly=s}(n)}return nw}var rw,GD;function fve(){if(GD)return rw;GD=1;var e=mr();rw=t,t.displayName="liquid",t.aliases=[];function t(n){n.register(e),n.languages.liquid={comment:{pattern:/(^\{%\s*comment\s*%\})[\s\S]+(?=\{%\s*endcomment\s*%\}$)/,lookbehind:!0},delimiter:{pattern:/^\{(?:\{\{|[%\{])-?|-?(?:\}\}|[%\}])\}$/,alias:"punctuation"},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},keyword:/\b(?:as|assign|break|(?:end)?(?:capture|case|comment|for|form|if|paginate|raw|style|tablerow|unless)|continue|cycle|decrement|echo|else|elsif|in|include|increment|limit|liquid|offset|range|render|reversed|section|when|with)\b/,object:/\b(?:address|all_country_option_tags|article|block|blog|cart|checkout|collection|color|country|country_option_tags|currency|current_page|current_tags|customer|customer_address|date|discount_allocation|discount_application|external_video|filter|filter_value|font|forloop|fulfillment|generic_file|gift_card|group|handle|image|line_item|link|linklist|localization|location|measurement|media|metafield|model|model_source|order|page|page_description|page_image|page_title|part|policy|product|product_option|recommendations|request|robots|routes|rule|script|search|selling_plan|selling_plan_allocation|selling_plan_group|shipping_method|shop|shop_locale|sitemap|store_availability|tax_line|template|theme|transaction|unit_price_measurement|user_agent|variant|video|video_source)\b/,function:[{pattern:/(\|\s*)\w+/,lookbehind:!0,alias:"filter"},{pattern:/(\.\s*)(?:first|last|size)/,lookbehind:!0}],boolean:/\b(?:false|nil|true)\b/,range:{pattern:/\.\./,alias:"operator"},number:/\b\d+(?:\.\d+)?\b/,operator:/[!=]=|<>|[<>]=?|[|?:=-]|\b(?:and|contains(?=\s)|or)\b/,punctuation:/[.,\[\]()]/,empty:{pattern:/\bempty\b/,alias:"keyword"}},n.hooks.add("before-tokenize",function(r){var a=/\{%\s*comment\s*%\}[\s\S]*?\{%\s*endcomment\s*%\}|\{(?:%[\s\S]*?%|\{\{[\s\S]*?\}\}|\{[\s\S]*?\})\}/g,o=!1;n.languages["markup-templating"].buildPlaceholders(r,"liquid",a,function(i){var s=/^\{%-?\s*(\w+)/.exec(i);if(s){var l=s[1];if(l==="raw"&&!o)return o=!0,!0;if(l==="endraw")return o=!1,!0}return!o})}),n.hooks.add("after-tokenize",function(r){n.languages["markup-templating"].tokenizePlaceholders(r,"liquid")})}return rw}var aw,WD;function pve(){if(WD)return aw;WD=1,aw=e,e.displayName="lisp",e.aliases=[];function e(t){(function(n){function r(y){return RegExp(/(\()/.source+"(?:"+y+")"+/(?=[\s\)])/.source)}function a(y){return RegExp(/([\s([])/.source+"(?:"+y+")"+/(?=[\s)])/.source)}var o=/(?!\d)[-+*/~!@$%^=<>{}\w]+/.source,i="&"+o,s="(\\()",l="(?=\\))",c="(?=\\s)",u=/(?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\([^()]*\))*\))*\))*\))*\))*/.source,d={heading:{pattern:/;;;.*/,alias:["comment","title"]},comment:/;.*/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0,inside:{argument:/[-A-Z]+(?=[.,\s])/,symbol:RegExp("`"+o+"'")}},"quoted-symbol":{pattern:RegExp("#?'"+o),alias:["variable","symbol"]},"lisp-property":{pattern:RegExp(":"+o),alias:"property"},splice:{pattern:RegExp(",@?"+o),alias:["symbol","variable"]},keyword:[{pattern:RegExp(s+"(?:and|(?:cl-)?letf|cl-loop|cond|cons|error|if|(?:lexical-)?let\\*?|message|not|null|or|provide|require|setq|unless|use-package|when|while)"+c),lookbehind:!0},{pattern:RegExp(s+"(?:append|by|collect|concat|do|finally|for|in|return)"+c),lookbehind:!0}],declare:{pattern:r(/declare/.source),lookbehind:!0,alias:"keyword"},interactive:{pattern:r(/interactive/.source),lookbehind:!0,alias:"keyword"},boolean:{pattern:a(/nil|t/.source),lookbehind:!0},number:{pattern:a(/[-+]?\d+(?:\.\d*)?/.source),lookbehind:!0},defvar:{pattern:RegExp(s+"def(?:const|custom|group|var)\\s+"+o),lookbehind:!0,inside:{keyword:/^def[a-z]+/,variable:RegExp(o)}},defun:{pattern:RegExp(s+/(?:cl-)?(?:defmacro|defun\*?)\s+/.source+o+/\s+\(/.source+u+/\)/.source),lookbehind:!0,greedy:!0,inside:{keyword:/^(?:cl-)?def\S+/,arguments:null,function:{pattern:RegExp("(^\\s)"+o),lookbehind:!0},punctuation:/[()]/}},lambda:{pattern:RegExp(s+"lambda\\s+\\(\\s*(?:&?"+o+"(?:\\s+&?"+o+")*\\s*)?\\)"),lookbehind:!0,greedy:!0,inside:{keyword:/^lambda/,arguments:null,punctuation:/[()]/}},car:{pattern:RegExp(s+o),lookbehind:!0},punctuation:[/(?:['`,]?\(|[)\[\]])/,{pattern:/(\s)\.(?=\s)/,lookbehind:!0}]},g={"lisp-marker":RegExp(i),varform:{pattern:RegExp(/\(/.source+o+/\s+(?=\S)/.source+u+/\)/.source),inside:d},argument:{pattern:RegExp(/(^|[\s(])/.source+o),lookbehind:!0,alias:"variable"},rest:d},m="\\S+(?:\\s+\\S+)*",b={pattern:RegExp(s+u+l),lookbehind:!0,inside:{"rest-vars":{pattern:RegExp("&(?:body|rest)\\s+"+m),inside:g},"other-marker-vars":{pattern:RegExp("&(?:aux|optional)\\s+"+m),inside:g},keys:{pattern:RegExp("&key\\s+"+m+"(?:\\s+&allow-other-keys)?"),inside:g},argument:{pattern:RegExp(o),alias:"variable"},punctuation:/[()]/}};d.lambda.inside.arguments=b,d.defun.inside.arguments=n.util.clone(b),d.defun.inside.arguments.inside.sublist=b,n.languages.lisp=d,n.languages.elisp=d,n.languages.emacs=d,n.languages["emacs-lisp"]=d})(t)}return aw}var ow,KD;function gve(){if(KD)return ow;KD=1,ow=e,e.displayName="livescript",e.aliases=[];function e(t){t.languages.livescript={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\])#.*/,lookbehind:!0}],"interpolated-string":{pattern:/(^|[^"])("""|")(?:\\[\s\S]|(?!\2)[^\\])*\2(?!")/,lookbehind:!0,greedy:!0,inside:{variable:{pattern:/(^|[^\\])#[a-z_](?:-?[a-z]|[\d_])*/m,lookbehind:!0},interpolation:{pattern:/(^|[^\\])#\{[^}]+\}/m,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^#\{|\}$/,alias:"variable"}}},string:/[\s\S]+/}},string:[{pattern:/('''|')(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},{pattern:/<\[[\s\S]*?\]>/,greedy:!0},/\\[^\s,;\])}]+/],regex:[{pattern:/\/\/(?:\[[^\r\n\]]*\]|\\.|(?!\/\/)[^\\\[])+\/\/[gimyu]{0,5}/,greedy:!0,inside:{comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0}}},{pattern:/\/(?:\[[^\r\n\]]*\]|\\.|[^/\\\r\n\[])+\/[gimyu]{0,5}/,greedy:!0}],keyword:{pattern:/(^|(?!-).)\b(?:break|case|catch|class|const|continue|default|do|else|extends|fallthrough|finally|for(?: ever)?|function|if|implements|it|let|loop|new|null|otherwise|own|return|super|switch|that|then|this|throw|try|unless|until|var|void|when|while|yield)(?!-)\b/m,lookbehind:!0},"keyword-operator":{pattern:/(^|[^-])\b(?:(?:delete|require|typeof)!|(?:and|by|delete|export|from|import(?: all)?|in|instanceof|is(?: not|nt)?|not|of|or|til|to|typeof|with|xor)(?!-)\b)/m,lookbehind:!0,alias:"operator"},boolean:{pattern:/(^|[^-])\b(?:false|no|off|on|true|yes)(?!-)\b/m,lookbehind:!0},argument:{pattern:/(^|(?!\.&\.)[^&])&(?!&)\d*/m,lookbehind:!0,alias:"variable"},number:/\b(?:\d+~[\da-z]+|\d[\d_]*(?:\.\d[\d_]*)?(?:[a-z]\w*)?)/i,identifier:/[a-z_](?:-?[a-z]|[\d_])*/i,operator:[{pattern:/( )\.(?= )/,lookbehind:!0},/\.(?:[=~]|\.\.?)|\.(?:[&|^]|<<|>>>?)\.|:(?:=|:=?)|&&|\|[|>]|<(?:<[>=?]?|-(?:->?|>)?|\+\+?|@@?|%%?|\*\*?|!(?:~?=|--?>|~?~>)?|~(?:~?>|=)?|==?|\^\^?|[\/?]/],punctuation:/[(){}\[\]|.,:;`]/},t.languages.livescript["interpolated-string"].inside.interpolation.inside.rest=t.languages.livescript}return ow}var iw,YD;function mve(){if(YD)return iw;YD=1,iw=e,e.displayName="llvm",e.aliases=[];function e(t){(function(n){n.languages.llvm={comment:/;.*/,string:{pattern:/"[^"]*"/,greedy:!0},boolean:/\b(?:false|true)\b/,variable:/[%@!#](?:(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+|\d+)/i,label:/(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+:/i,type:{pattern:/\b(?:double|float|fp128|half|i[1-9]\d*|label|metadata|ppc_fp128|token|void|x86_fp80|x86_mmx)\b/,alias:"class-name"},keyword:/\b[a-z_][a-z_0-9]*\b/,number:/[+-]?\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-Fa-f]+\b|\b0xK[\dA-Fa-f]{20}\b|\b0x[ML][\dA-Fa-f]{32}\b|\b0xH[\dA-Fa-f]{4}\b/,punctuation:/[{}[\];(),.!*=<>]/}})(t)}return iw}var sw,ZD;function hve(){if(ZD)return sw;ZD=1,sw=e,e.displayName="log",e.aliases=[];function e(t){t.languages.log={string:{pattern:/"(?:[^"\\\r\n]|\\.)*"|'(?![st] | \w)(?:[^'\\\r\n]|\\.)*'/,greedy:!0},exception:{pattern:/(^|[^\w.])[a-z][\w.]*(?:Error|Exception):.*(?:(?:\r\n?|\n)[ \t]*(?:at[ \t].+|\.{3}.*|Caused by:.*))+(?:(?:\r\n?|\n)[ \t]*\.\.\. .*)?/,lookbehind:!0,greedy:!0,alias:["javastacktrace","language-javastacktrace"],inside:t.languages.javastacktrace||{keyword:/\bat\b/,function:/[a-z_][\w$]*(?=\()/,punctuation:/[.:()]/}},level:[{pattern:/\b(?:ALERT|CRIT|CRITICAL|EMERG|EMERGENCY|ERR|ERROR|FAILURE|FATAL|SEVERE)\b/,alias:["error","important"]},{pattern:/\b(?:WARN|WARNING|WRN)\b/,alias:["warning","important"]},{pattern:/\b(?:DISPLAY|INF|INFO|NOTICE|STATUS)\b/,alias:["info","keyword"]},{pattern:/\b(?:DBG|DEBUG|FINE)\b/,alias:["debug","keyword"]},{pattern:/\b(?:FINER|FINEST|TRACE|TRC|VERBOSE|VRB)\b/,alias:["trace","comment"]}],property:{pattern:/((?:^|[\]|])[ \t]*)[a-z_](?:[\w-]|\b\/\b)*(?:[. ]\(?\w(?:[\w-]|\b\/\b)*\)?)*:(?=\s)/im,lookbehind:!0},separator:{pattern:/(^|[^-+])-{3,}|={3,}|\*{3,}|- - /m,lookbehind:!0,alias:"comment"},url:/\b(?:file|ftp|https?):\/\/[^\s|,;'"]*[^\s|,;'">.]/,email:{pattern:/(^|\s)[-\w+.]+@[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+(?=\s)/,lookbehind:!0,alias:"url"},"ip-address":{pattern:/\b(?:\d{1,3}(?:\.\d{1,3}){3})\b/,alias:"constant"},"mac-address":{pattern:/\b[a-f0-9]{2}(?::[a-f0-9]{2}){5}\b/i,alias:"constant"},domain:{pattern:/(^|\s)[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)*\.[a-z][a-z0-9-]+(?=\s)/,lookbehind:!0,alias:"constant"},uuid:{pattern:/\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/i,alias:"constant"},hash:{pattern:/\b(?:[a-f0-9]{32}){1,2}\b/i,alias:"constant"},"file-path":{pattern:/\b[a-z]:[\\/][^\s|,;:(){}\[\]"']+|(^|[\s:\[\](>|])\.{0,2}\/\w[^\s|,;:(){}\[\]"']*/i,lookbehind:!0,greedy:!0,alias:"string"},date:{pattern:RegExp(/\b\d{4}[-/]\d{2}[-/]\d{2}(?:T(?=\d{1,2}:)|(?=\s\d{1,2}:))/.source+"|"+/\b\d{1,4}[-/ ](?:\d{1,2}|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)[-/ ]\d{2,4}T?\b/.source+"|"+/\b(?:(?:Fri|Mon|Sat|Sun|Thu|Tue|Wed)(?:\s{1,2}(?:Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep))?|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)\s{1,2}\d{1,2}\b/.source,"i"),alias:"number"},time:{pattern:/\b\d{1,2}:\d{1,2}:\d{1,2}(?:[.,:]\d+)?(?:\s?[+-]\d{2}:?\d{2}|Z)?\b/,alias:"number"},boolean:/\b(?:false|null|true)\b/i,number:{pattern:/(^|[^.\w])(?:0x[a-f0-9]+|0o[0-7]+|0b[01]+|v?\d[\da-f]*(?:\.\d+)*(?:e[+-]?\d+)?[a-z]{0,3}\b)\b(?!\.\w)/i,lookbehind:!0},operator:/[;:?<=>~/@!$%&+\-|^(){}*#]/,punctuation:/[\[\].,]/}}return sw}var lw,XD;function bve(){if(XD)return lw;XD=1,lw=e,e.displayName="lolcode",e.aliases=[];function e(t){t.languages.lolcode={comment:[/\bOBTW\s[\s\S]*?\sTLDR\b/,/\bBTW.+/],string:{pattern:/"(?::.|[^":])*"/,inside:{variable:/:\{[^}]+\}/,symbol:[/:\([a-f\d]+\)/i,/:\[[^\]]+\]/,/:[)>o":]/]},greedy:!0},number:/(?:\B-)?(?:\b\d+(?:\.\d*)?|\B\.\d+)/,symbol:{pattern:/(^|\s)(?:A )?(?:BUKKIT|NOOB|NUMBAR|NUMBR|TROOF|YARN)(?=\s|,|$)/,lookbehind:!0,inside:{keyword:/A(?=\s)/}},label:{pattern:/((?:^|\s)(?:IM IN YR|IM OUTTA YR) )[a-zA-Z]\w*/,lookbehind:!0,alias:"string"},function:{pattern:/((?:^|\s)(?:HOW IZ I|I IZ|IZ) )[a-zA-Z]\w*/,lookbehind:!0},keyword:[{pattern:/(^|\s)(?:AN|FOUND YR|GIMMEH|GTFO|HAI|HAS A|HOW IZ I|I HAS A|I IZ|IF U SAY SO|IM IN YR|IM OUTTA YR|IS NOW(?: A)?|ITZ(?: A)?|IZ|KTHX|KTHXBYE|LIEK(?: A)?|MAEK|MEBBE|MKAY|NERFIN|NO WAI|O HAI IM|O RLY\?|OIC|OMG|OMGWTF|R|SMOOSH|SRS|TIL|UPPIN|VISIBLE|WILE|WTF\?|YA RLY|YR)(?=\s|,|$)/,lookbehind:!0},/'Z(?=\s|,|$)/],boolean:{pattern:/(^|\s)(?:FAIL|WIN)(?=\s|,|$)/,lookbehind:!0},variable:{pattern:/(^|\s)IT(?=\s|,|$)/,lookbehind:!0},operator:{pattern:/(^|\s)(?:NOT|BOTH SAEM|DIFFRINT|(?:ALL|ANY|BIGGR|BOTH|DIFF|EITHER|MOD|PRODUKT|QUOSHUNT|SMALLR|SUM|WON) OF)(?=\s|,|$)/,lookbehind:!0},punctuation:/\.{3}|…|,|!/}}return lw}var cw,QD;function yve(){if(QD)return cw;QD=1,cw=e,e.displayName="magma",e.aliases=[];function e(t){t.languages.magma={output:{pattern:/^(>.*(?:\r(?:\n|(?!\n))|\n))(?!>)(?:.+|(?:\r(?:\n|(?!\n))|\n)(?!>).*)(?:(?:\r(?:\n|(?!\n))|\n)(?!>).*)*/m,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},string:{pattern:/(^|[^\\"])"(?:[^\r\n\\"]|\\.)*"/,lookbehind:!0,greedy:!0},keyword:/\b(?:_|adj|and|assert|assert2|assert3|assigned|break|by|case|cat|catch|clear|cmpeq|cmpne|continue|declare|default|delete|diff|div|do|elif|else|end|eq|error|eval|exists|exit|for|forall|forward|fprintf|freeze|function|ge|gt|if|iload|import|in|intrinsic|is|join|le|load|local|lt|meet|mod|ne|not|notadj|notin|notsubset|or|print|printf|procedure|quit|random|read|readi|repeat|require|requirege|requirerange|restore|return|save|sdiff|select|subset|then|time|to|try|until|vprint|vprintf|vtime|when|where|while|xor)\b/,boolean:/\b(?:false|true)\b/,generator:{pattern:/\b[a-z_]\w*(?=\s*<)/i,alias:"class-name"},function:/\b[a-z_]\w*(?=\s*\()/i,number:{pattern:/(^|[^\w.]|\.\.)(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?(?:_[a-z]?)?(?=$|[^\w.]|\.\.)/,lookbehind:!0},operator:/->|[-+*/^~!|#=]|:=|\.\./,punctuation:/[()[\]{}<>,;.:]/}}return cw}var uw,JD;function vve(){if(JD)return uw;JD=1,uw=e,e.displayName="makefile",e.aliases=[];function e(t){t.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/}}return uw}var dw,eL;function Sve(){if(eL)return dw;eL=1,dw=e,e.displayName="markdown",e.aliases=["md"];function e(t){(function(n){var r=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function a(g){return g=g.replace(//g,function(){return r}),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+g+")")}var o=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,i=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,function(){return o}),s=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;n.languages.markdown=n.languages.extend("markup",{}),n.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:n.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+i+s+"(?:"+i+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+i+s+")(?:"+i+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(o),inside:n.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+i+")"+s+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+i+"$"),inside:{"table-header":{pattern:RegExp(o),alias:"important",inside:n.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:a(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:a(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:a(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:a(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach(function(g){["url","bold","italic","strike","code-snippet"].forEach(function(m){g!==m&&(n.languages.markdown[g].inside.content.inside[m]=n.languages.markdown[m])})}),n.hooks.add("after-tokenize",function(g){if(g.language!=="markdown"&&g.language!=="md")return;function m(b){if(!(!b||typeof b=="string"))for(var y=0,w=b.length;y",quot:'"'},u=String.fromCodePoint||String.fromCharCode;function d(g){var m=g.replace(l,"");return m=m.replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,function(b,y){if(y=y.toLowerCase(),y[0]==="#"){var w;return y[1]==="x"?w=parseInt(y.slice(2),16):w=Number(y.slice(1)),u(w)}else{var v=c[y];return v||b}}),m}n.languages.md=n.languages.markdown})(t)}return dw}var fw,tL;function wve(){if(tL)return fw;tL=1,fw=e,e.displayName="matlab",e.aliases=[];function e(t){t.languages.matlab={comment:[/%\{[\s\S]*?\}%/,/%.+/],string:{pattern:/\B'(?:''|[^'\r\n])*'/,greedy:!0},number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+)?(?:[ij])?|\b[ij]\b/,keyword:/\b(?:NaN|break|case|catch|continue|else|elseif|end|for|function|if|inf|otherwise|parfor|pause|pi|return|switch|try|while)\b/,function:/\b(?!\d)\w+(?=\s*\()/,operator:/\.?[*^\/\\']|[+\-:@]|[<>=~]=?|&&?|\|\|?/,punctuation:/\.{3}|[.,;\[\](){}!]/}}return fw}var pw,nL;function Eve(){if(nL)return pw;nL=1,pw=e,e.displayName="maxscript",e.aliases=[];function e(t){(function(n){var r=/\b(?:about|and|animate|as|at|attributes|by|case|catch|collect|continue|coordsys|do|else|exit|fn|for|from|function|global|if|in|local|macroscript|mapped|max|not|of|off|on|or|parameters|persistent|plugin|rcmenu|return|rollout|set|struct|then|throw|to|tool|try|undo|utility|when|where|while|with)\b/i;n.languages.maxscript={comment:{pattern:/\/\*[\s\S]*?(?:\*\/|$)|--.*/,greedy:!0},string:{pattern:/(^|[^"\\@])(?:"(?:[^"\\]|\\[\s\S])*"|@"[^"]*")/,lookbehind:!0,greedy:!0},path:{pattern:/\$(?:[\w/\\.*?]|'[^']*')*/,greedy:!0,alias:"string"},"function-call":{pattern:RegExp("((?:"+(/^/.source+"|"+/[;=<>+\-*/^({\[]/.source+"|"+/\b(?:and|by|case|catch|collect|do|else|if|in|not|or|return|then|to|try|where|while|with)\b/.source)+")[ ]*)(?!"+r.source+")"+/[a-z_]\w*\b/.source+"(?=[ ]*(?:"+("(?!"+r.source+")"+/[a-z_]/.source+"|"+/\d|-\.?\d/.source+"|"+/[({'"$@#?]/.source)+"))","im"),lookbehind:!0,greedy:!0,alias:"function"},"function-definition":{pattern:/(\b(?:fn|function)\s+)\w+\b/i,lookbehind:!0,alias:"function"},argument:{pattern:/\b[a-z_]\w*(?=:)/i,alias:"attr-name"},keyword:r,boolean:/\b(?:false|true)\b/,time:{pattern:/(^|[^\w.])(?:(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?[msft])+|\d+:\d+(?:\.\d*)?)(?![\w.:])/,lookbehind:!0,alias:"number"},number:[{pattern:/(^|[^\w.])(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?|0x[a-fA-F0-9]+)(?![\w.:])/,lookbehind:!0},/\b(?:e|pi)\b/],constant:/\b(?:dontcollect|ok|silentValue|undefined|unsupplied)\b/,color:{pattern:/\b(?:black|blue|brown|gray|green|orange|red|white|yellow)\b/i,alias:"constant"},operator:/[-+*/<>=!]=?|[&^?]|#(?!\()/,punctuation:/[()\[\]{}.:,;]|#(?=\()|\\$/m}})(t)}return pw}var gw,rL;function xve(){if(rL)return gw;rL=1,gw=e,e.displayName="mel",e.aliases=[];function e(t){t.languages.mel={comment:/\/\/.*/,code:{pattern:/`(?:\\.|[^\\`\r\n])*`/,greedy:!0,alias:"italic",inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"}}},string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},variable:/\$\w+/,number:/\b0x[\da-fA-F]+\b|\b\d+(?:\.\d*)?|\B\.\d+/,flag:{pattern:/-[^\d\W]\w*/,alias:"operator"},keyword:/\b(?:break|case|continue|default|do|else|float|for|global|if|in|int|matrix|proc|return|string|switch|vector|while)\b/,function:/\b\w+(?=\()|\b(?:CBG|HfAddAttractorToAS|HfAssignAS|HfBuildEqualMap|HfBuildFurFiles|HfBuildFurImages|HfCancelAFR|HfConnectASToHF|HfCreateAttractor|HfDeleteAS|HfEditAS|HfPerformCreateAS|HfRemoveAttractorFromAS|HfSelectAttached|HfSelectAttractors|HfUnAssignAS|Mayatomr|about|abs|addAttr|addAttributeEditorNodeHelp|addDynamic|addNewShelfTab|addPP|addPanelCategory|addPrefixToName|advanceToNextDrivenKey|affectedNet|affects|aimConstraint|air|alias|aliasAttr|align|alignCtx|alignCurve|alignSurface|allViewFit|ambientLight|angle|angleBetween|animCone|animCurveEditor|animDisplay|animView|annotate|appendStringArray|applicationName|applyAttrPreset|applyTake|arcLenDimContext|arcLengthDimension|arclen|arrayMapper|art3dPaintCtx|artAttrCtx|artAttrPaintVertexCtx|artAttrSkinPaintCtx|artAttrTool|artBuildPaintMenu|artFluidAttrCtx|artPuttyCtx|artSelectCtx|artSetPaintCtx|artUserPaintCtx|assignCommand|assignInputDevice|assignViewportFactories|attachCurve|attachDeviceAttr|attachSurface|attrColorSliderGrp|attrCompatibility|attrControlGrp|attrEnumOptionMenu|attrEnumOptionMenuGrp|attrFieldGrp|attrFieldSliderGrp|attrNavigationControlGrp|attrPresetEditWin|attributeExists|attributeInfo|attributeMenu|attributeQuery|autoKeyframe|autoPlace|bakeClip|bakeFluidShading|bakePartialHistory|bakeResults|bakeSimulation|basename|basenameEx|batchRender|bessel|bevel|bevelPlus|binMembership|bindSkin|blend2|blendShape|blendShapeEditor|blendShapePanel|blendTwoAttr|blindDataType|boneLattice|boundary|boxDollyCtx|boxZoomCtx|bufferCurve|buildBookmarkMenu|buildKeyframeMenu|button|buttonManip|cacheFile|cacheFileCombine|cacheFileMerge|cacheFileTrack|camera|cameraView|canCreateManip|canvas|capitalizeString|catch|catchQuiet|ceil|changeSubdivComponentDisplayLevel|changeSubdivRegion|channelBox|character|characterMap|characterOutlineEditor|characterize|chdir|checkBox|checkBoxGrp|checkDefaultRenderGlobals|choice|circle|circularFillet|clamp|clear|clearCache|clip|clipEditor|clipEditorCurrentTimeCtx|clipSchedule|clipSchedulerOutliner|clipTrimBefore|closeCurve|closeSurface|cluster|cmdFileOutput|cmdScrollFieldExecuter|cmdScrollFieldReporter|cmdShell|coarsenSubdivSelectionList|collision|color|colorAtPoint|colorEditor|colorIndex|colorIndexSliderGrp|colorSliderButtonGrp|colorSliderGrp|columnLayout|commandEcho|commandLine|commandPort|compactHairSystem|componentEditor|compositingInterop|computePolysetVolume|condition|cone|confirmDialog|connectAttr|connectControl|connectDynamic|connectJoint|connectionInfo|constrain|constrainValue|constructionHistory|container|containsMultibyte|contextInfo|control|convertFromOldLayers|convertIffToPsd|convertLightmap|convertSolidTx|convertTessellation|convertUnit|copyArray|copyFlexor|copyKey|copySkinWeights|cos|cpButton|cpCache|cpClothSet|cpCollision|cpConstraint|cpConvClothToMesh|cpForces|cpGetSolverAttr|cpPanel|cpProperty|cpRigidCollisionFilter|cpSeam|cpSetEdit|cpSetSolverAttr|cpSolver|cpSolverTypes|cpTool|cpUpdateClothUVs|createDisplayLayer|createDrawCtx|createEditor|createLayeredPsdFile|createMotionField|createNewShelf|createNode|createRenderLayer|createSubdivRegion|cross|crossProduct|ctxAbort|ctxCompletion|ctxEditMode|ctxTraverse|currentCtx|currentTime|currentTimeCtx|currentUnit|curve|curveAddPtCtx|curveCVCtx|curveEPCtx|curveEditorCtx|curveIntersect|curveMoveEPCtx|curveOnSurface|curveSketchCtx|cutKey|cycleCheck|cylinder|dagPose|date|defaultLightListCheckBox|defaultNavigation|defineDataServer|defineVirtualDevice|deformer|deg_to_rad|delete|deleteAttr|deleteShadingGroupsAndMaterials|deleteShelfTab|deleteUI|deleteUnusedBrushes|delrandstr|detachCurve|detachDeviceAttr|detachSurface|deviceEditor|devicePanel|dgInfo|dgdirty|dgeval|dgtimer|dimWhen|directKeyCtx|directionalLight|dirmap|dirname|disable|disconnectAttr|disconnectJoint|diskCache|displacementToPoly|displayAffected|displayColor|displayCull|displayLevelOfDetail|displayPref|displayRGBColor|displaySmoothness|displayStats|displayString|displaySurface|distanceDimContext|distanceDimension|doBlur|dolly|dollyCtx|dopeSheetEditor|dot|dotProduct|doubleProfileBirailSurface|drag|dragAttrContext|draggerContext|dropoffLocator|duplicate|duplicateCurve|duplicateSurface|dynCache|dynControl|dynExport|dynExpression|dynGlobals|dynPaintEditor|dynParticleCtx|dynPref|dynRelEdPanel|dynRelEditor|dynamicLoad|editAttrLimits|editDisplayLayerGlobals|editDisplayLayerMembers|editRenderLayerAdjustment|editRenderLayerGlobals|editRenderLayerMembers|editor|editorTemplate|effector|emit|emitter|enableDevice|encodeString|endString|endsWith|env|equivalent|equivalentTol|erf|error|eval|evalDeferred|evalEcho|event|exactWorldBoundingBox|exclusiveLightCheckBox|exec|executeForEachObject|exists|exp|expression|expressionEditorListen|extendCurve|extendSurface|extrude|fcheck|fclose|feof|fflush|fgetline|fgetword|file|fileBrowserDialog|fileDialog|fileExtension|fileInfo|filetest|filletCurve|filter|filterCurve|filterExpand|filterStudioImport|findAllIntersections|findAnimCurves|findKeyframe|findMenuItem|findRelatedSkinCluster|finder|firstParentOf|fitBspline|flexor|floatEq|floatField|floatFieldGrp|floatScrollBar|floatSlider|floatSlider2|floatSliderButtonGrp|floatSliderGrp|floor|flow|fluidCacheInfo|fluidEmitter|fluidVoxelInfo|flushUndo|fmod|fontDialog|fopen|formLayout|format|fprint|frameLayout|fread|freeFormFillet|frewind|fromNativePath|fwrite|gamma|gauss|geometryConstraint|getApplicationVersionAsFloat|getAttr|getClassification|getDefaultBrush|getFileList|getFluidAttr|getInputDeviceRange|getMayaPanelTypes|getModifiers|getPanel|getParticleAttr|getPluginResource|getenv|getpid|glRender|glRenderEditor|globalStitch|gmatch|goal|gotoBindPose|grabColor|gradientControl|gradientControlNoAttr|graphDollyCtx|graphSelectContext|graphTrackCtx|gravity|grid|gridLayout|group|groupObjectsByName|hardenPointCurve|hardware|hardwareRenderPanel|headsUpDisplay|headsUpMessage|help|helpLine|hermite|hide|hilite|hitTest|hotBox|hotkey|hotkeyCheck|hsv_to_rgb|hudButton|hudSlider|hudSliderButton|hwReflectionMap|hwRender|hwRenderLoad|hyperGraph|hyperPanel|hyperShade|hypot|iconTextButton|iconTextCheckBox|iconTextRadioButton|iconTextRadioCollection|iconTextScrollList|iconTextStaticLabel|ikHandle|ikHandleCtx|ikHandleDisplayScale|ikSolver|ikSplineHandleCtx|ikSystem|ikSystemInfo|ikfkDisplayMethod|illustratorCurves|image|imfPlugins|inheritTransform|insertJoint|insertJointCtx|insertKeyCtx|insertKnotCurve|insertKnotSurface|instance|instanceable|instancer|intField|intFieldGrp|intScrollBar|intSlider|intSliderGrp|interToUI|internalVar|intersect|iprEngine|isAnimCurve|isConnected|isDirty|isParentOf|isSameObject|isTrue|isValidObjectName|isValidString|isValidUiName|isolateSelect|itemFilter|itemFilterAttr|itemFilterRender|itemFilterType|joint|jointCluster|jointCtx|jointDisplayScale|jointLattice|keyTangent|keyframe|keyframeOutliner|keyframeRegionCurrentTimeCtx|keyframeRegionDirectKeyCtx|keyframeRegionDollyCtx|keyframeRegionInsertKeyCtx|keyframeRegionMoveKeyCtx|keyframeRegionScaleKeyCtx|keyframeRegionSelectKeyCtx|keyframeRegionSetKeyCtx|keyframeRegionTrackCtx|keyframeStats|lassoContext|lattice|latticeDeformKeyCtx|launch|launchImageEditor|layerButton|layeredShaderPort|layeredTexturePort|layout|layoutDialog|lightList|lightListEditor|lightListPanel|lightlink|lineIntersection|linearPrecision|linstep|listAnimatable|listAttr|listCameras|listConnections|listDeviceAttachments|listHistory|listInputDeviceAxes|listInputDeviceButtons|listInputDevices|listMenuAnnotation|listNodeTypes|listPanelCategories|listRelatives|listSets|listTransforms|listUnselected|listerEditor|loadFluid|loadNewShelf|loadPlugin|loadPluginLanguageResources|loadPrefObjects|localizedPanelLabel|lockNode|loft|log|longNameOf|lookThru|ls|lsThroughFilter|lsType|lsUI|mag|makeIdentity|makeLive|makePaintable|makeRoll|makeSingleSurface|makeTubeOn|makebot|manipMoveContext|manipMoveLimitsCtx|manipOptions|manipRotateContext|manipRotateLimitsCtx|manipScaleContext|manipScaleLimitsCtx|marker|match|max|memory|menu|menuBarLayout|menuEditor|menuItem|menuItemToShelf|menuSet|menuSetPref|messageLine|min|minimizeApp|mirrorJoint|modelCurrentTimeCtx|modelEditor|modelPanel|mouse|movIn|movOut|move|moveIKtoFK|moveKeyCtx|moveVertexAlongDirection|multiProfileBirailSurface|mute|nParticle|nameCommand|nameField|namespace|namespaceInfo|newPanelItems|newton|nodeCast|nodeIconButton|nodeOutliner|nodePreset|nodeType|noise|nonLinear|normalConstraint|normalize|nurbsBoolean|nurbsCopyUVSet|nurbsCube|nurbsEditUV|nurbsPlane|nurbsSelect|nurbsSquare|nurbsToPoly|nurbsToPolygonsPref|nurbsToSubdiv|nurbsToSubdivPref|nurbsUVSet|nurbsViewDirectionVector|objExists|objectCenter|objectLayer|objectType|objectTypeUI|obsoleteProc|oceanNurbsPreviewPlane|offsetCurve|offsetCurveOnSurface|offsetSurface|openGLExtension|openMayaPref|optionMenu|optionMenuGrp|optionVar|orbit|orbitCtx|orientConstraint|outlinerEditor|outlinerPanel|overrideModifier|paintEffectsDisplay|pairBlend|palettePort|paneLayout|panel|panelConfiguration|panelHistory|paramDimContext|paramDimension|paramLocator|parent|parentConstraint|particle|particleExists|particleInstancer|particleRenderInfo|partition|pasteKey|pathAnimation|pause|pclose|percent|performanceOptions|pfxstrokes|pickWalk|picture|pixelMove|planarSrf|plane|play|playbackOptions|playblast|plugAttr|plugNode|pluginInfo|pluginResourceUtil|pointConstraint|pointCurveConstraint|pointLight|pointMatrixMult|pointOnCurve|pointOnSurface|pointPosition|poleVectorConstraint|polyAppend|polyAppendFacetCtx|polyAppendVertex|polyAutoProjection|polyAverageNormal|polyAverageVertex|polyBevel|polyBlendColor|polyBlindData|polyBoolOp|polyBridgeEdge|polyCacheMonitor|polyCheck|polyChipOff|polyClipboard|polyCloseBorder|polyCollapseEdge|polyCollapseFacet|polyColorBlindData|polyColorDel|polyColorPerVertex|polyColorSet|polyCompare|polyCone|polyCopyUV|polyCrease|polyCreaseCtx|polyCreateFacet|polyCreateFacetCtx|polyCube|polyCut|polyCutCtx|polyCylinder|polyCylindricalProjection|polyDelEdge|polyDelFacet|polyDelVertex|polyDuplicateAndConnect|polyDuplicateEdge|polyEditUV|polyEditUVShell|polyEvaluate|polyExtrudeEdge|polyExtrudeFacet|polyExtrudeVertex|polyFlipEdge|polyFlipUV|polyForceUV|polyGeoSampler|polyHelix|polyInfo|polyInstallAction|polyLayoutUV|polyListComponentConversion|polyMapCut|polyMapDel|polyMapSew|polyMapSewMove|polyMergeEdge|polyMergeEdgeCtx|polyMergeFacet|polyMergeFacetCtx|polyMergeUV|polyMergeVertex|polyMirrorFace|polyMoveEdge|polyMoveFacet|polyMoveFacetUV|polyMoveUV|polyMoveVertex|polyNormal|polyNormalPerVertex|polyNormalizeUV|polyOptUvs|polyOptions|polyOutput|polyPipe|polyPlanarProjection|polyPlane|polyPlatonicSolid|polyPoke|polyPrimitive|polyPrism|polyProjection|polyPyramid|polyQuad|polyQueryBlindData|polyReduce|polySelect|polySelectConstraint|polySelectConstraintMonitor|polySelectCtx|polySelectEditCtx|polySeparate|polySetToFaceNormal|polySewEdge|polyShortestPathCtx|polySmooth|polySoftEdge|polySphere|polySphericalProjection|polySplit|polySplitCtx|polySplitEdge|polySplitRing|polySplitVertex|polyStraightenUVBorder|polySubdivideEdge|polySubdivideFacet|polyToSubdiv|polyTorus|polyTransfer|polyTriangulate|polyUVSet|polyUnite|polyWedgeFace|popen|popupMenu|pose|pow|preloadRefEd|print|progressBar|progressWindow|projFileViewer|projectCurve|projectTangent|projectionContext|projectionManip|promptDialog|propModCtx|propMove|psdChannelOutliner|psdEditTextureFile|psdExport|psdTextureFile|putenv|pwd|python|querySubdiv|quit|rad_to_deg|radial|radioButton|radioButtonGrp|radioCollection|radioMenuItemCollection|rampColorPort|rand|randomizeFollicles|randstate|rangeControl|readTake|rebuildCurve|rebuildSurface|recordAttr|recordDevice|redo|reference|referenceEdit|referenceQuery|refineSubdivSelectionList|refresh|refreshAE|registerPluginResource|rehash|reloadImage|removeJoint|removeMultiInstance|removePanelCategory|rename|renameAttr|renameSelectionList|renameUI|render|renderGlobalsNode|renderInfo|renderLayerButton|renderLayerParent|renderLayerPostProcess|renderLayerUnparent|renderManip|renderPartition|renderQualityNode|renderSettings|renderThumbnailUpdate|renderWindowEditor|renderWindowSelectContext|renderer|reorder|reorderDeformers|requires|reroot|resampleFluid|resetAE|resetPfxToPolyCamera|resetTool|resolutionNode|retarget|reverseCurve|reverseSurface|revolve|rgb_to_hsv|rigidBody|rigidSolver|roll|rollCtx|rootOf|rot|rotate|rotationInterpolation|roundConstantRadius|rowColumnLayout|rowLayout|runTimeCommand|runup|sampleImage|saveAllShelves|saveAttrPreset|saveFluid|saveImage|saveInitialState|saveMenu|savePrefObjects|savePrefs|saveShelf|saveToolSettings|scale|scaleBrushBrightness|scaleComponents|scaleConstraint|scaleKey|scaleKeyCtx|sceneEditor|sceneUIReplacement|scmh|scriptCtx|scriptEditorInfo|scriptJob|scriptNode|scriptTable|scriptToShelf|scriptedPanel|scriptedPanelType|scrollField|scrollLayout|sculpt|searchPathArray|seed|selLoadSettings|select|selectContext|selectCurveCV|selectKey|selectKeyCtx|selectKeyframeRegionCtx|selectMode|selectPref|selectPriority|selectType|selectedNodes|selectionConnection|separator|setAttr|setAttrEnumResource|setAttrMapping|setAttrNiceNameResource|setConstraintRestPosition|setDefaultShadingGroup|setDrivenKeyframe|setDynamic|setEditCtx|setEditor|setFluidAttr|setFocus|setInfinity|setInputDeviceMapping|setKeyCtx|setKeyPath|setKeyframe|setKeyframeBlendshapeTargetWts|setMenuMode|setNodeNiceNameResource|setNodeTypeFlag|setParent|setParticleAttr|setPfxToPolyCamera|setPluginResource|setProject|setStampDensity|setStartupMessage|setState|setToolTo|setUITemplate|setXformManip|sets|shadingConnection|shadingGeometryRelCtx|shadingLightRelCtx|shadingNetworkCompare|shadingNode|shapeCompare|shelfButton|shelfLayout|shelfTabLayout|shellField|shortNameOf|showHelp|showHidden|showManipCtx|showSelectionInTitle|showShadingGroupAttrEditor|showWindow|sign|simplify|sin|singleProfileBirailSurface|size|sizeBytes|skinCluster|skinPercent|smoothCurve|smoothTangentSurface|smoothstep|snap2to2|snapKey|snapMode|snapTogetherCtx|snapshot|soft|softMod|softModCtx|sort|sound|soundControl|source|spaceLocator|sphere|sphrand|spotLight|spotLightPreviewPort|spreadSheetEditor|spring|sqrt|squareSurface|srtContext|stackTrace|startString|startsWith|stitchAndExplodeShell|stitchSurface|stitchSurfacePoints|strcmp|stringArrayCatenate|stringArrayContains|stringArrayCount|stringArrayInsertAtIndex|stringArrayIntersector|stringArrayRemove|stringArrayRemoveAtIndex|stringArrayRemoveDuplicates|stringArrayRemoveExact|stringArrayToString|stringToStringArray|strip|stripPrefixFromName|stroke|subdAutoProjection|subdCleanTopology|subdCollapse|subdDuplicateAndConnect|subdEditUV|subdListComponentConversion|subdMapCut|subdMapSewMove|subdMatchTopology|subdMirror|subdToBlind|subdToPoly|subdTransferUVsToCache|subdiv|subdivCrease|subdivDisplaySmoothness|substitute|substituteAllString|substituteGeometry|substring|surface|surfaceSampler|surfaceShaderList|swatchDisplayPort|switchTable|symbolButton|symbolCheckBox|sysFile|system|tabLayout|tan|tangentConstraint|texLatticeDeformContext|texManipContext|texMoveContext|texMoveUVShellContext|texRotateContext|texScaleContext|texSelectContext|texSelectShortestPathCtx|texSmudgeUVContext|texWinToolCtx|text|textCurves|textField|textFieldButtonGrp|textFieldGrp|textManip|textScrollList|textToShelf|textureDisplacePlane|textureHairColor|texturePlacementContext|textureWindow|threadCount|threePointArcCtx|timeControl|timePort|timerX|toNativePath|toggle|toggleAxis|toggleWindowVisibility|tokenize|tokenizeList|tolerance|tolower|toolButton|toolCollection|toolDropped|toolHasOptions|toolPropertyWindow|torus|toupper|trace|track|trackCtx|transferAttributes|transformCompare|transformLimits|translator|trim|trunc|truncateFluidCache|truncateHairCache|tumble|tumbleCtx|turbulence|twoPointArcCtx|uiRes|uiTemplate|unassignInputDevice|undo|undoInfo|ungroup|uniform|unit|unloadPlugin|untangleUV|untitledFileName|untrim|upAxis|updateAE|userCtx|uvLink|uvSnapshot|validateShelfName|vectorize|view2dToolCtx|viewCamera|viewClipPlane|viewFit|viewHeadOn|viewLookAt|viewManip|viewPlace|viewSet|visor|volumeAxis|vortex|waitCursor|warning|webBrowser|webBrowserPrefs|whatIs|window|windowPref|wire|wireContext|workspace|wrinkle|wrinkleContext|writeTake|xbmLangPathList|xform)\b/,operator:[/\+[+=]?|-[-=]?|&&|\|\||[<>]=|[*\/!=]=?|[%^]/,{pattern:/(^|[^<])<(?!<)/,lookbehind:!0},{pattern:/(^|[^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,:;?\[\](){}]/},t.languages.mel.code.inside.rest=t.languages.mel}return gw}var mw,aL;function kve(){if(aL)return mw;aL=1,mw=e,e.displayName="mermaid",e.aliases=[];function e(t){t.languages.mermaid={comment:{pattern:/%%.*/,greedy:!0},style:{pattern:/^([ \t]*(?:classDef|linkStyle|style)[ \t]+[\w$-]+[ \t]+)\w.*[^\s;]/m,lookbehind:!0,inside:{property:/\b\w[\w-]*(?=[ \t]*:)/,operator:/:/,punctuation:/,/}},"inter-arrow-label":{pattern:/([^<>ox.=-])(?:-[-.]|==)(?![<>ox.=-])[ \t]*(?:"[^"\r\n]*"|[^\s".=-](?:[^\r\n.=-]*[^\s.=-])?)[ \t]*(?:\.+->?|--+[->]|==+[=>])(?![<>ox.=-])/,lookbehind:!0,greedy:!0,inside:{arrow:{pattern:/(?:\.+->?|--+[->]|==+[=>])$/,alias:"operator"},label:{pattern:/^([\s\S]{2}[ \t]*)\S(?:[\s\S]*\S)?/,lookbehind:!0,alias:"property"},"arrow-head":{pattern:/^\S+/,alias:["arrow","operator"]}}},arrow:[{pattern:/(^|[^{}|o.-])[|}][|o](?:--|\.\.)[|o][|{](?![{}|o.-])/,lookbehind:!0,alias:"operator"},{pattern:/(^|[^<>ox.=-])(?:[ox]?|(?:==+|--+|-\.*-)[>ox]|===+|---+|-\.+-)(?![<>ox.=-])/,lookbehind:!0,alias:"operator"},{pattern:/(^|[^<>()x-])(?:--?(?:>>|[x>)])(?![<>()x])|(?:<<|[x<(])--?(?!-))/,lookbehind:!0,alias:"operator"},{pattern:/(^|[^<>|*o.-])(?:[*o]--|--[*o]|<\|?(?:--|\.\.)|(?:--|\.\.)\|?>|--|\.\.)(?![<>|*o.-])/,lookbehind:!0,alias:"operator"}],label:{pattern:/(^|[^|<])\|(?:[^\r\n"|]|"[^"\r\n]*")+\|/,lookbehind:!0,greedy:!0,alias:"property"},text:{pattern:/(?:[(\[{]+|\b>)(?:[^\r\n"()\[\]{}]|"[^"\r\n]*")+(?:[)\]}]+|>)/,alias:"string"},string:{pattern:/"[^"\r\n]*"/,greedy:!0},annotation:{pattern:/<<(?:abstract|choice|enumeration|fork|interface|join|service)>>|\[\[(?:choice|fork|join)\]\]/i,alias:"important"},keyword:[{pattern:/(^[ \t]*)(?:action|callback|class|classDef|classDiagram|click|direction|erDiagram|flowchart|gantt|gitGraph|graph|journey|link|linkStyle|pie|requirementDiagram|sequenceDiagram|stateDiagram|stateDiagram-v2|style|subgraph)(?![\w$-])/m,lookbehind:!0,greedy:!0},{pattern:/(^[ \t]*)(?:activate|alt|and|as|autonumber|deactivate|else|end(?:[ \t]+note)?|loop|opt|par|participant|rect|state|note[ \t]+(?:over|(?:left|right)[ \t]+of))(?![\w$-])/im,lookbehind:!0,greedy:!0}],entity:/#[a-z0-9]+;/,operator:{pattern:/(\w[ \t]*)&(?=[ \t]*\w)|:::|:/,lookbehind:!0},punctuation:/[(){};]/}}return mw}var hw,oL;function Cve(){if(oL)return hw;oL=1,hw=e,e.displayName="mizar",e.aliases=[];function e(t){t.languages.mizar={comment:/::.+/,keyword:/@proof\b|\b(?:according|aggregate|all|and|antonym|are|as|associativity|assume|asymmetry|attr|be|begin|being|by|canceled|case|cases|clusters?|coherence|commutativity|compatibility|connectedness|consider|consistency|constructors|contradiction|correctness|def|deffunc|define|definitions?|defpred|do|does|end|environ|equals|ex|exactly|existence|for|from|func|given|hence|hereby|holds|idempotence|identity|iff?|implies|involutiveness|irreflexivity|is|it|let|means|mode|non|not|notations?|now|of|or|otherwise|over|per|pred|prefix|projectivity|proof|provided|qua|reconsider|redefine|reduce|reducibility|reflexivity|registrations?|requirements|reserve|sch|schemes?|section|selector|set|sethood|st|struct|such|suppose|symmetry|synonym|take|that|the|then|theorems?|thesis|thus|to|transitivity|uniqueness|vocabular(?:ies|y)|when|where|with|wrt)\b/,parameter:{pattern:/\$(?:10|\d)/,alias:"variable"},variable:/\b\w+(?=:)/,number:/(?:\b|-)\d+\b/,operator:/\.\.\.|->|&|\.?=/,punctuation:/\(#|#\)|[,:;\[\](){}]/}}return hw}var bw,iL;function _ve(){if(iL)return bw;iL=1,bw=e,e.displayName="mongodb",e.aliases=[];function e(t){(function(n){var r=["$eq","$gt","$gte","$in","$lt","$lte","$ne","$nin","$and","$not","$nor","$or","$exists","$type","$expr","$jsonSchema","$mod","$regex","$text","$where","$geoIntersects","$geoWithin","$near","$nearSphere","$all","$elemMatch","$size","$bitsAllClear","$bitsAllSet","$bitsAnyClear","$bitsAnySet","$comment","$elemMatch","$meta","$slice","$currentDate","$inc","$min","$max","$mul","$rename","$set","$setOnInsert","$unset","$addToSet","$pop","$pull","$push","$pullAll","$each","$position","$slice","$sort","$bit","$addFields","$bucket","$bucketAuto","$collStats","$count","$currentOp","$facet","$geoNear","$graphLookup","$group","$indexStats","$limit","$listLocalSessions","$listSessions","$lookup","$match","$merge","$out","$planCacheStats","$project","$redact","$replaceRoot","$replaceWith","$sample","$set","$skip","$sort","$sortByCount","$unionWith","$unset","$unwind","$setWindowFields","$abs","$accumulator","$acos","$acosh","$add","$addToSet","$allElementsTrue","$and","$anyElementTrue","$arrayElemAt","$arrayToObject","$asin","$asinh","$atan","$atan2","$atanh","$avg","$binarySize","$bsonSize","$ceil","$cmp","$concat","$concatArrays","$cond","$convert","$cos","$dateFromParts","$dateToParts","$dateFromString","$dateToString","$dayOfMonth","$dayOfWeek","$dayOfYear","$degreesToRadians","$divide","$eq","$exp","$filter","$first","$floor","$function","$gt","$gte","$hour","$ifNull","$in","$indexOfArray","$indexOfBytes","$indexOfCP","$isArray","$isNumber","$isoDayOfWeek","$isoWeek","$isoWeekYear","$last","$last","$let","$literal","$ln","$log","$log10","$lt","$lte","$ltrim","$map","$max","$mergeObjects","$meta","$min","$millisecond","$minute","$mod","$month","$multiply","$ne","$not","$objectToArray","$or","$pow","$push","$radiansToDegrees","$range","$reduce","$regexFind","$regexFindAll","$regexMatch","$replaceOne","$replaceAll","$reverseArray","$round","$rtrim","$second","$setDifference","$setEquals","$setIntersection","$setIsSubset","$setUnion","$size","$sin","$slice","$split","$sqrt","$stdDevPop","$stdDevSamp","$strcasecmp","$strLenBytes","$strLenCP","$substr","$substrBytes","$substrCP","$subtract","$sum","$switch","$tan","$toBool","$toDate","$toDecimal","$toDouble","$toInt","$toLong","$toObjectId","$toString","$toLower","$toUpper","$trim","$trunc","$type","$week","$year","$zip","$count","$dateAdd","$dateDiff","$dateSubtract","$dateTrunc","$getField","$rand","$sampleRate","$setField","$unsetField","$comment","$explain","$hint","$max","$maxTimeMS","$min","$orderby","$query","$returnKey","$showDiskLoc","$natural"],a=["ObjectId","Code","BinData","DBRef","Timestamp","NumberLong","NumberDecimal","MaxKey","MinKey","RegExp","ISODate","UUID"];r=r.map(function(i){return i.replace("$","\\$")});var o="(?:"+r.join("|")+")\\b";n.languages.mongodb=n.languages.extend("javascript",{}),n.languages.insertBefore("mongodb","string",{property:{pattern:/(?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)(?=\s*:)/,greedy:!0,inside:{keyword:RegExp(`^(['"])?`+o+"(?:\\1)?$")}}}),n.languages.mongodb.string.inside={url:{pattern:/https?:\/\/[-\w@:%.+~#=]{1,256}\.[a-z0-9()]{1,6}\b[-\w()@:%+.~#?&/=]*/i,greedy:!0},entity:{pattern:/\b(?:(?:[01]?\d\d?|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d\d?|2[0-4]\d|25[0-5])\b/,greedy:!0}},n.languages.insertBefore("mongodb","constant",{builtin:{pattern:RegExp("\\b(?:"+a.join("|")+")\\b"),alias:"keyword"}})})(t)}return bw}var yw,sL;function Ave(){if(sL)return yw;sL=1,yw=e,e.displayName="monkey",e.aliases=[];function e(t){t.languages.monkey={comment:{pattern:/^#Rem\s[\s\S]*?^#End|'.+/im,greedy:!0},string:{pattern:/"[^"\r\n]*"/,greedy:!0},preprocessor:{pattern:/(^[ \t]*)#.+/m,lookbehind:!0,greedy:!0,alias:"property"},function:/\b\w+(?=\()/,"type-char":{pattern:/\b[?%#$]/,alias:"class-name"},number:{pattern:/((?:\.\.)?)(?:(?:\b|\B-\.?|\B\.)\d+(?:(?!\.\.)\.\d*)?|\$[\da-f]+)/i,lookbehind:!0},keyword:/\b(?:Abstract|Array|Bool|Case|Catch|Class|Const|Continue|Default|Eachin|Else|ElseIf|End|EndIf|Exit|Extends|Extern|False|Field|Final|Float|For|Forever|Function|Global|If|Implements|Import|Inline|Int|Interface|Local|Method|Module|New|Next|Null|Object|Private|Property|Public|Repeat|Return|Select|Self|Step|Strict|String|Super|Then|Throw|To|True|Try|Until|Void|Wend|While)\b/i,operator:/\.\.|<[=>]?|>=?|:?=|(?:[+\-*\/&~|]|\b(?:Mod|Shl|Shr)\b)=?|\b(?:And|Not|Or)\b/i,punctuation:/[.,:;()\[\]]/}}return yw}var vw,lL;function Tve(){if(lL)return vw;lL=1,vw=e,e.displayName="moonscript",e.aliases=["moon"];function e(t){t.languages.moonscript={comment:/--.*/,string:[{pattern:/'[^']*'|\[(=*)\[[\s\S]*?\]\1\]/,greedy:!0},{pattern:/"[^"]*"/,greedy:!0,inside:{interpolation:{pattern:/#\{[^{}]*\}/,inside:{moonscript:{pattern:/(^#\{)[\s\S]+(?=\})/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/#\{|\}/,alias:"punctuation"}}}}}],"class-name":[{pattern:/(\b(?:class|extends)[ \t]+)\w+/,lookbehind:!0},/\b[A-Z]\w*/],keyword:/\b(?:class|continue|do|else|elseif|export|extends|for|from|if|import|in|local|nil|return|self|super|switch|then|unless|using|when|while|with)\b/,variable:/@@?\w*/,property:{pattern:/\b(?!\d)\w+(?=:)|(:)(?!\d)\w+/,lookbehind:!0},function:{pattern:/\b(?:_G|_VERSION|assert|collectgarbage|coroutine\.(?:create|resume|running|status|wrap|yield)|debug\.(?:debug|getfenv|gethook|getinfo|getlocal|getmetatable|getregistry|getupvalue|setfenv|sethook|setlocal|setmetatable|setupvalue|traceback)|dofile|error|getfenv|getmetatable|io\.(?:close|flush|input|lines|open|output|popen|read|stderr|stdin|stdout|tmpfile|type|write)|ipairs|load|loadfile|loadstring|math\.(?:abs|acos|asin|atan|atan2|ceil|cos|cosh|deg|exp|floor|fmod|frexp|ldexp|log|log10|max|min|modf|pi|pow|rad|random|randomseed|sin|sinh|sqrt|tan|tanh)|module|next|os\.(?:clock|date|difftime|execute|exit|getenv|remove|rename|setlocale|time|tmpname)|package\.(?:cpath|loaded|loadlib|path|preload|seeall)|pairs|pcall|print|rawequal|rawget|rawset|require|select|setfenv|setmetatable|string\.(?:byte|char|dump|find|format|gmatch|gsub|len|lower|match|rep|reverse|sub|upper)|table\.(?:concat|insert|maxn|remove|sort)|tonumber|tostring|type|unpack|xpcall)\b/,inside:{punctuation:/\./}},boolean:/\b(?:false|true)\b/,number:/(?:\B\.\d+|\b\d+\.\d+|\b\d+(?=[eE]))(?:[eE][-+]?\d+)?\b|\b(?:0x[a-fA-F\d]+|\d+)(?:U?LL)?\b/,operator:/\.{3}|[-=]>|~=|(?:[-+*/%<>!=]|\.\.)=?|[:#^]|\b(?:and|or)\b=?|\b(?:not)\b/,punctuation:/[.,()[\]{}\\]/},t.languages.moonscript.string[1].inside.interpolation.inside.moonscript.inside=t.languages.moonscript,t.languages.moon=t.languages.moonscript}return vw}var Sw,cL;function Rve(){if(cL)return Sw;cL=1,Sw=e,e.displayName="n1ql",e.aliases=[];function e(t){t.languages.n1ql={comment:{pattern:/\/\*[\s\S]*?(?:$|\*\/)|--.*/,greedy:!0},string:{pattern:/(["'])(?:\\[\s\S]|(?!\1)[^\\]|\1\1)*\1/,greedy:!0},identifier:{pattern:/`(?:\\[\s\S]|[^\\`]|``)*`/,greedy:!0},parameter:/\$[\w.]+/,keyword:/\b(?:ADVISE|ALL|ALTER|ANALYZE|AS|ASC|AT|BEGIN|BINARY|BOOLEAN|BREAK|BUCKET|BUILD|BY|CALL|CAST|CLUSTER|COLLATE|COLLECTION|COMMIT|COMMITTED|CONNECT|CONTINUE|CORRELATE|CORRELATED|COVER|CREATE|CURRENT|DATABASE|DATASET|DATASTORE|DECLARE|DECREMENT|DELETE|DERIVED|DESC|DESCRIBE|DISTINCT|DO|DROP|EACH|ELEMENT|EXCEPT|EXCLUDE|EXECUTE|EXPLAIN|FETCH|FILTER|FLATTEN|FLUSH|FOLLOWING|FOR|FORCE|FROM|FTS|FUNCTION|GOLANG|GRANT|GROUP|GROUPS|GSI|HASH|HAVING|IF|IGNORE|ILIKE|INCLUDE|INCREMENT|INDEX|INFER|INLINE|INNER|INSERT|INTERSECT|INTO|IS|ISOLATION|JAVASCRIPT|JOIN|KEY|KEYS|KEYSPACE|KNOWN|LANGUAGE|LAST|LEFT|LET|LETTING|LEVEL|LIMIT|LSM|MAP|MAPPING|MATCHED|MATERIALIZED|MERGE|MINUS|MISSING|NAMESPACE|NEST|NL|NO|NTH_VALUE|NULL|NULLS|NUMBER|OBJECT|OFFSET|ON|OPTION|OPTIONS|ORDER|OTHERS|OUTER|OVER|PARSE|PARTITION|PASSWORD|PATH|POOL|PRECEDING|PREPARE|PRIMARY|PRIVATE|PRIVILEGE|PROBE|PROCEDURE|PUBLIC|RANGE|RAW|REALM|REDUCE|RENAME|RESPECT|RETURN|RETURNING|REVOKE|RIGHT|ROLE|ROLLBACK|ROW|ROWS|SATISFIES|SAVEPOINT|SCHEMA|SCOPE|SELECT|SELF|SEMI|SET|SHOW|SOME|START|STATISTICS|STRING|SYSTEM|TIES|TO|TRAN|TRANSACTION|TRIGGER|TRUNCATE|UNBOUNDED|UNDER|UNION|UNIQUE|UNKNOWN|UNNEST|UNSET|UPDATE|UPSERT|USE|USER|USING|VALIDATE|VALUE|VALUES|VIA|VIEW|WHERE|WHILE|WINDOW|WITH|WORK|XOR)\b/i,function:/\b[a-z_]\w*(?=\s*\()/i,boolean:/\b(?:FALSE|TRUE)\b/i,number:/(?:\b\d+\.|\B\.)\d+e[+\-]?\d+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/%]|!=|==?|\|\||<[>=]?|>=?|\b(?:AND|ANY|ARRAY|BETWEEN|CASE|ELSE|END|EVERY|EXISTS|FIRST|IN|LIKE|NOT|OR|THEN|VALUED|WHEN|WITHIN)\b/i,punctuation:/[;[\](),.{}:]/}}return Sw}var ww,uL;function Nve(){if(uL)return ww;uL=1,ww=e,e.displayName="n4js",e.aliases=["n4jsd"];function e(t){t.languages.n4js=t.languages.extend("javascript",{keyword:/\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),t.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),t.languages.n4jsd=t.languages.n4js}return ww}var Ew,dL;function Ive(){if(dL)return Ew;dL=1,Ew=e,e.displayName="nand2tetrisHdl",e.aliases=[];function e(t){t.languages["nand2tetris-hdl"]={comment:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,keyword:/\b(?:BUILTIN|CHIP|CLOCKED|IN|OUT|PARTS)\b/,boolean:/\b(?:false|true)\b/,function:/\b[A-Za-z][A-Za-z0-9]*(?=\()/,number:/\b\d+\b/,operator:/=|\.\./,punctuation:/[{}[\];(),:]/}}return Ew}var xw,fL;function Ove(){if(fL)return xw;fL=1,xw=e,e.displayName="naniscript",e.aliases=[];function e(t){(function(n){var r=/\{[^\r\n\[\]{}]*\}/,a={"quoted-string":{pattern:/"(?:[^"\\]|\\.)*"/,alias:"operator"},"command-param-id":{pattern:/(\s)\w+:/,lookbehind:!0,alias:"property"},"command-param-value":[{pattern:r,alias:"selector"},{pattern:/([\t ])\S+/,lookbehind:!0,greedy:!0,alias:"operator"},{pattern:/\S(?:.*\S)?/,alias:"operator"}]};n.languages.naniscript={comment:{pattern:/^([\t ]*);.*/m,lookbehind:!0},define:{pattern:/^>.+/m,alias:"tag",inside:{value:{pattern:/(^>\w+[\t ]+)(?!\s)[^{}\r\n]+/,lookbehind:!0,alias:"operator"},key:{pattern:/(^>)\w+/,lookbehind:!0}}},label:{pattern:/^([\t ]*)#[\t ]*\w+[\t ]*$/m,lookbehind:!0,alias:"regex"},command:{pattern:/^([\t ]*)@\w+(?=[\t ]|$).*/m,lookbehind:!0,alias:"function",inside:{"command-name":/^@\w+/,expression:{pattern:r,greedy:!0,alias:"selector"},"command-params":{pattern:/\s*\S[\s\S]*/,inside:a}}},"generic-text":{pattern:/(^[ \t]*)[^#@>;\s].*/m,lookbehind:!0,alias:"punctuation",inside:{"escaped-char":/\\[{}\[\]"]/,expression:{pattern:r,greedy:!0,alias:"selector"},"inline-command":{pattern:/\[[\t ]*\w[^\r\n\[\]]*\]/,greedy:!0,alias:"function",inside:{"command-params":{pattern:/(^\[[\t ]*\w+\b)[\s\S]+(?=\]$)/,lookbehind:!0,inside:a},"command-param-name":{pattern:/^(\[[\t ]*)\w+/,lookbehind:!0,alias:"name"},"start-stop-char":/[\[\]]/}}}}},n.languages.nani=n.languages.naniscript,n.hooks.add("after-tokenize",function(s){var l=s.tokens;l.forEach(function(c){if(typeof c!="string"&&c.type==="generic-text"){var u=i(c);o(u)||(c.type="bad-line",c.content=u)}})});function o(s){for(var l="[]{}",c=[],u=0;u=&|$!]/}}return kw}var Cw,gL;function Lve(){if(gL)return Cw;gL=1,Cw=e,e.displayName="neon",e.aliases=[];function e(t){t.languages.neon={comment:{pattern:/#.*/,greedy:!0},datetime:{pattern:/(^|[[{(=:,\s])\d\d\d\d-\d\d?-\d\d?(?:(?:[Tt]| +)\d\d?:\d\d:\d\d(?:\.\d*)? *(?:Z|[-+]\d\d?(?::?\d\d)?)?)?(?=$|[\]}),\s])/,lookbehind:!0,alias:"number"},key:{pattern:/(^|[[{(,\s])[^,:=[\]{}()'"\s]+(?=\s*:(?:$|[\]}),\s])|\s*=)/,lookbehind:!0,alias:"atrule"},number:{pattern:/(^|[[{(=:,\s])[+-]?(?:0x[\da-fA-F]+|0o[0-7]+|0b[01]+|(?:\d+(?:\.\d*)?|\.?\d+)(?:[eE][+-]?\d+)?)(?=$|[\]}),:=\s])/,lookbehind:!0},boolean:{pattern:/(^|[[{(=:,\s])(?:false|no|true|yes)(?=$|[\]}),:=\s])/i,lookbehind:!0},null:{pattern:/(^|[[{(=:,\s])(?:null)(?=$|[\]}),:=\s])/i,lookbehind:!0,alias:"keyword"},string:{pattern:/(^|[[{(=:,\s])(?:('''|""")\r?\n(?:(?:[^\r\n]|\r?\n(?![\t ]*\2))*\r?\n)?[\t ]*\2|'[^'\r\n]*'|"(?:\\.|[^\\"\r\n])*")/,lookbehind:!0,greedy:!0},literal:{pattern:/(^|[[{(=:,\s])(?:[^#"',:=[\]{}()\s`-]|[:-][^"',=[\]{}()\s])(?:[^,:=\]})(\s]|:(?![\s,\]})]|$)|[ \t]+[^#,:=\]})(\s])*/,lookbehind:!0,alias:"string"},punctuation:/[,:=[\]{}()-]/}}return Cw}var _w,mL;function Mve(){if(mL)return _w;mL=1,_w=e,e.displayName="nevod",e.aliases=[];function e(t){t.languages.nevod={comment:/\/\/.*|(?:\/\*[\s\S]*?(?:\*\/|$))/,string:{pattern:/(?:"(?:""|[^"])*"(?!")|'(?:''|[^'])*'(?!'))!?\*?/,greedy:!0,inside:{"string-attrs":/!$|!\*$|\*$/}},namespace:{pattern:/(@namespace\s+)[a-zA-Z0-9\-.]+(?=\s*\{)/,lookbehind:!0},pattern:{pattern:/(@pattern\s+)?#?[a-zA-Z0-9\-.]+(?:\s*\(\s*(?:~\s*)?[a-zA-Z0-9\-.]+\s*(?:,\s*(?:~\s*)?[a-zA-Z0-9\-.]*)*\))?(?=\s*=)/,lookbehind:!0,inside:{"pattern-name":{pattern:/^#?[a-zA-Z0-9\-.]+/,alias:"class-name"},fields:{pattern:/\(.*\)/,inside:{"field-name":{pattern:/[a-zA-Z0-9\-.]+/,alias:"variable"},punctuation:/[,()]/,operator:{pattern:/~/,alias:"field-hidden-mark"}}}}},search:{pattern:/(@search\s+|#)[a-zA-Z0-9\-.]+(?:\.\*)?(?=\s*;)/,alias:"function",lookbehind:!0},keyword:/@(?:having|inside|namespace|outside|pattern|require|search|where)\b/,"standard-pattern":{pattern:/\b(?:Alpha|AlphaNum|Any|Blank|End|LineBreak|Num|NumAlpha|Punct|Space|Start|Symbol|Word|WordBreak)\b(?:\([a-zA-Z0-9\-.,\s+]*\))?/,inside:{"standard-pattern-name":{pattern:/^[a-zA-Z0-9\-.]+/,alias:"builtin"},quantifier:{pattern:/\b\d+(?:\s*\+|\s*-\s*\d+)?(?!\w)/,alias:"number"},"standard-pattern-attr":{pattern:/[a-zA-Z0-9\-.]+/,alias:"builtin"},punctuation:/[,()]/}},quantifier:{pattern:/\b\d+(?:\s*\+|\s*-\s*\d+)?(?!\w)/,alias:"number"},operator:[{pattern:/=/,alias:"pattern-def"},{pattern:/&/,alias:"conjunction"},{pattern:/~/,alias:"exception"},{pattern:/\?/,alias:"optionality"},{pattern:/[[\]]/,alias:"repetition"},{pattern:/[{}]/,alias:"variation"},{pattern:/[+_]/,alias:"sequence"},{pattern:/\.{2,3}/,alias:"span"}],"field-capture":[{pattern:/([a-zA-Z0-9\-.]+\s*\()\s*[a-zA-Z0-9\-.]+\s*:\s*[a-zA-Z0-9\-.]+(?:\s*,\s*[a-zA-Z0-9\-.]+\s*:\s*[a-zA-Z0-9\-.]+)*(?=\s*\))/,lookbehind:!0,inside:{"field-name":{pattern:/[a-zA-Z0-9\-.]+/,alias:"variable"},colon:/:/}},{pattern:/[a-zA-Z0-9\-.]+\s*:/,inside:{"field-name":{pattern:/[a-zA-Z0-9\-.]+/,alias:"variable"},colon:/:/}}],punctuation:/[:;,()]/,name:/[a-zA-Z0-9\-.]+/}}return _w}var Aw,hL;function Pve(){if(hL)return Aw;hL=1,Aw=e,e.displayName="nginx",e.aliases=[];function e(t){(function(n){var r=/\$(?:\w[a-z\d]*(?:_[^\x00-\x1F\s"'\\()$]*)?|\{[^}\s"'\\]+\})/i;n.languages.nginx={comment:{pattern:/(^|[\s{};])#.*/,lookbehind:!0,greedy:!0},directive:{pattern:/(^|\s)\w(?:[^;{}"'\\\s]|\\.|"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|\s+(?:#.*(?!.)|(?![#\s])))*?(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:{string:{pattern:/((?:^|[^\\])(?:\\\\)*)(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,lookbehind:!0,greedy:!0,inside:{escape:{pattern:/\\["'\\nrt]/,alias:"entity"},variable:r}},comment:{pattern:/(\s)#.*/,lookbehind:!0,greedy:!0},keyword:{pattern:/^\S+/,greedy:!0},boolean:{pattern:/(\s)(?:off|on)(?!\S)/,lookbehind:!0},number:{pattern:/(\s)\d+[a-z]*(?!\S)/i,lookbehind:!0},variable:r}},punctuation:/[{};]/}})(t)}return Aw}var Tw,bL;function $ve(){if(bL)return Tw;bL=1,Tw=e,e.displayName="nim",e.aliases=[];function e(t){t.languages.nim={comment:{pattern:/#.*/,greedy:!0},string:{pattern:/(?:\b(?!\d)(?:\w|\\x[89a-fA-F][0-9a-fA-F])+)?(?:"""[\s\S]*?"""(?!")|"(?:\\[\s\S]|""|[^"\\])*")/,greedy:!0},char:{pattern:/'(?:\\(?:\d+|x[\da-fA-F]{0,2}|.)|[^'])'/,greedy:!0},function:{pattern:/(?:(?!\d)(?:\w|\\x[89a-fA-F][0-9a-fA-F])+|`[^`\r\n]+`)\*?(?:\[[^\]]+\])?(?=\s*\()/,greedy:!0,inside:{operator:/\*$/}},identifier:{pattern:/`[^`\r\n]+`/,greedy:!0,inside:{punctuation:/`/}},number:/\b(?:0[xXoObB][\da-fA-F_]+|\d[\d_]*(?:(?!\.\.)\.[\d_]*)?(?:[eE][+-]?\d[\d_]*)?)(?:'?[iuf]\d*)?/,keyword:/\b(?:addr|as|asm|atomic|bind|block|break|case|cast|concept|const|continue|converter|defer|discard|distinct|do|elif|else|end|enum|except|export|finally|for|from|func|generic|if|import|include|interface|iterator|let|macro|method|mixin|nil|object|out|proc|ptr|raise|ref|return|static|template|try|tuple|type|using|var|when|while|with|without|yield)\b/,operator:{pattern:/(^|[({\[](?=\.\.)|(?![({\[]\.).)(?:(?:[=+\-*\/<>@$~&%|!?^:\\]|\.\.|\.(?![)}\]]))+|\b(?:and|div|in|is|isnot|mod|not|notin|of|or|shl|shr|xor)\b)/m,lookbehind:!0},punctuation:/[({\[]\.|\.[)}\]]|[`(){}\[\],:]/}}return Tw}var Rw,yL;function Fve(){if(yL)return Rw;yL=1,Rw=e,e.displayName="nix",e.aliases=[];function e(t){t.languages.nix={comment:{pattern:/\/\*[\s\S]*?\*\/|#.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\[\s\S])*"|''(?:(?!'')[\s\S]|''(?:'|\\|\$\{))*''/,greedy:!0,inside:{interpolation:{pattern:/(^|(?:^|(?!'').)[^\\])\$\{(?:[^{}]|\{[^}]*\})*\}/,lookbehind:!0,inside:null}}},url:[/\b(?:[a-z]{3,7}:\/\/)[\w\-+%~\/.:#=?&]+/,{pattern:/([^\/])(?:[\w\-+%~.:#=?&]*(?!\/\/)[\w\-+%~\/.:#=?&])?(?!\/\/)\/[\w\-+%~\/.:#=?&]*/,lookbehind:!0}],antiquotation:{pattern:/\$(?=\{)/,alias:"important"},number:/\b\d+\b/,keyword:/\b(?:assert|builtins|else|if|in|inherit|let|null|or|then|with)\b/,function:/\b(?:abort|add|all|any|attrNames|attrValues|baseNameOf|compareVersions|concatLists|currentSystem|deepSeq|derivation|dirOf|div|elem(?:At)?|fetch(?:Tarball|url)|filter(?:Source)?|fromJSON|genList|getAttr|getEnv|hasAttr|hashString|head|import|intersectAttrs|is(?:Attrs|Bool|Function|Int|List|Null|String)|length|lessThan|listToAttrs|map|mul|parseDrvName|pathExists|read(?:Dir|File)|removeAttrs|replaceStrings|seq|sort|stringLength|sub(?:string)?|tail|throw|to(?:File|JSON|Path|String|XML)|trace|typeOf)\b|\bfoldl'\B/,boolean:/\b(?:false|true)\b/,operator:/[=!<>]=?|\+\+?|\|\||&&|\/\/|->?|[?@]/,punctuation:/[{}()[\].,:;]/},t.languages.nix.string.inside.interpolation.inside=t.languages.nix}return Rw}var Nw,vL;function jve(){if(vL)return Nw;vL=1,Nw=e,e.displayName="nsis",e.aliases=[];function e(t){t.languages.nsis={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|[#;].*)/,lookbehind:!0,greedy:!0},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:{pattern:/(^[\t ]*)(?:Abort|Add(?:BrandingImage|Size)|AdvSplash|Allow(?:RootDirInstall|SkipFiles)|AutoCloseWindow|BG(?:Font|Gradient|Image)|Banner|BrandingText|BringToFront|CRCCheck|Call(?:InstDLL)?|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|Create(?:Directory|Font|ShortCut)|Delete(?:INISec|INIStr|RegKey|RegValue)?|Detail(?:Print|sButtonText)|Dialer|Dir(?:Text|Var|Verify)|EnableWindow|Enum(?:RegKey|RegValue)|Exch|Exec(?:Shell(?:Wait)?|Wait)?|ExpandEnvStrings|File(?:BufSize|Close|ErrorText|Open|Read|ReadByte|ReadUTF16LE|ReadWord|Seek|Write|WriteByte|WriteUTF16LE|WriteWord)?|Find(?:Close|First|Next|Window)|FlushINI|Get(?:CurInstType|CurrentAddress|DLLVersion(?:Local)?|DlgItem|ErrorLevel|FileTime(?:Local)?|FullPathName|Function(?:Address|End)?|InstDirError|LabelAddress|TempFileName)|Goto|HideWindow|Icon|If(?:Abort|Errors|FileExists|RebootFlag|Silent)|InitPluginsDir|InstProgressFlags|Inst(?:Type(?:GetText|SetText)?)|Install(?:ButtonText|Colors|Dir(?:RegKey)?)|Int(?:64|Ptr)?CmpU?|Int(?:64)?Fmt|Int(?:Ptr)?Op|IsWindow|Lang(?:DLL|String)|License(?:BkColor|Data|ForceSelection|LangString|Text)|LoadLanguageFile|LockWindow|Log(?:Set|Text)|Manifest(?:DPIAware|SupportedOS)|Math|MessageBox|MiscButtonText|NSISdl|Name|Nop|OutFile|PE(?:DllCharacteristics|SubsysVer)|Page(?:Callbacks)?|Pop|Push|Quit|RMDir|Read(?:EnvStr|INIStr|RegDWORD|RegStr)|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|SearchPath|Section(?:End|GetFlags|GetInstTypes|GetSize|GetText|Group|In|SetFlags|SetInstTypes|SetSize|SetText)?|SendMessage|Set(?:AutoClose|BrandingImage|Compress|Compressor(?:DictSize)?|CtlColors|CurInstType|DatablockOptimize|DateSave|Details(?:Print|View)|ErrorLevel|Errors|FileAttributes|Font|OutPath|Overwrite|PluginUnload|RebootFlag|RegView|ShellVarContext|Silent)|Show(?:InstDetails|UninstDetails|Window)|Silent(?:Install|UnInstall)|Sleep|SpaceTexts|Splash|StartMenu|Str(?:CmpS?|Cpy|Len)|SubCaption|System|UnRegDLL|Unicode|UninstPage|Uninstall(?:ButtonText|Caption|Icon|SubCaption|Text)|UserInfo|VI(?:AddVersionKey|FileVersion|ProductVersion)|VPatch|Var|WindowIcon|Write(?:INIStr|Reg(?:Bin|DWORD|ExpandStr|MultiStr|None|Str)|Uninstaller)|XPStyle|ns(?:Dialogs|Exec))\b/m,lookbehind:!0},property:/\b(?:ARCHIVE|FILE_(?:ATTRIBUTE_ARCHIVE|ATTRIBUTE_NORMAL|ATTRIBUTE_OFFLINE|ATTRIBUTE_READONLY|ATTRIBUTE_SYSTEM|ATTRIBUTE_TEMPORARY)|HK(?:(?:CR|CU|LM)(?:32|64)?|DD|PD|U)|HKEY_(?:CLASSES_ROOT|CURRENT_CONFIG|CURRENT_USER|DYN_DATA|LOCAL_MACHINE|PERFORMANCE_DATA|USERS)|ID(?:ABORT|CANCEL|IGNORE|NO|OK|RETRY|YES)|MB_(?:ABORTRETRYIGNORE|DEFBUTTON1|DEFBUTTON2|DEFBUTTON3|DEFBUTTON4|ICONEXCLAMATION|ICONINFORMATION|ICONQUESTION|ICONSTOP|OK|OKCANCEL|RETRYCANCEL|RIGHT|RTLREADING|SETFOREGROUND|TOPMOST|USERICON|YESNO)|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SYSTEM|TEMPORARY|admin|all|auto|both|colored|false|force|hide|highest|lastused|leave|listonly|none|normal|notset|off|on|open|print|show|silent|silentlog|smooth|textonly|true|user)\b/,constant:/\$\{[!\w\.:\^-]+\}|\$\([!\w\.:\^-]+\)/,variable:/\$\w[\w\.]*/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--?|\+\+?|<=?|>=?|==?=?|&&?|\|\|?|[?*\/~^%]/,punctuation:/[{}[\];(),.:]/,important:{pattern:/(^[\t ]*)!(?:addincludedir|addplugindir|appendfile|cd|define|delfile|echo|else|endif|error|execute|finalize|getdllversion|gettlbversion|if|ifdef|ifmacrodef|ifmacrondef|ifndef|include|insertmacro|macro|macroend|makensis|packhdr|pragma|searchparse|searchreplace|system|tempfile|undef|verbose|warning)\b/im,lookbehind:!0}}}return Nw}var Iw,SL;function zve(){if(SL)return Iw;SL=1;var e=Ws();Iw=t,t.displayName="objectivec",t.aliases=["objc"];function t(n){n.register(e),n.languages.objectivec=n.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete n.languages.objectivec["class-name"],n.languages.objc=n.languages.objectivec}return Iw}var Ow,wL;function Uve(){if(wL)return Ow;wL=1,Ow=e,e.displayName="ocaml",e.aliases=[];function e(t){t.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/}}return Ow}var Dw,EL;function Bve(){if(EL)return Dw;EL=1;var e=Ws();Dw=t,t.displayName="opencl",t.aliases=[];function t(n){n.register(e),function(r){r.languages.opencl=r.languages.extend("c",{keyword:/\b(?:(?:__)?(?:constant|global|kernel|local|private|read_only|read_write|write_only)|__attribute__|auto|(?:bool|u?(?:char|int|long|short)|half|quad)(?:2|3|4|8|16)?|break|case|complex|const|continue|(?:double|float)(?:16(?:x(?:1|2|4|8|16))?|1x(?:1|2|4|8|16)|2(?:x(?:1|2|4|8|16))?|3|4(?:x(?:1|2|4|8|16))?|8(?:x(?:1|2|4|8|16))?)?|default|do|else|enum|extern|for|goto|if|imaginary|inline|packed|pipe|register|restrict|return|signed|sizeof|static|struct|switch|typedef|uniform|union|unsigned|void|volatile|while)\b/,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[fuhl]{0,4}/i,boolean:/\b(?:false|true)\b/,"constant-opencl-kernel":{pattern:/\b(?:CHAR_(?:BIT|MAX|MIN)|CLK_(?:ADDRESS_(?:CLAMP(?:_TO_EDGE)?|NONE|REPEAT)|FILTER_(?:LINEAR|NEAREST)|(?:GLOBAL|LOCAL)_MEM_FENCE|NORMALIZED_COORDS_(?:FALSE|TRUE))|CL_(?:BGRA|(?:HALF_)?FLOAT|INTENSITY|LUMINANCE|A?R?G?B?[Ax]?|(?:(?:UN)?SIGNED|[US]NORM)_(?:INT(?:8|16|32))|UNORM_(?:INT_101010|SHORT_(?:555|565)))|(?:DBL|FLT|HALF)_(?:DIG|EPSILON|(?:MAX|MIN)(?:(?:_10)?_EXP)?|MANT_DIG)|FLT_RADIX|HUGE_VALF?|(?:INT|LONG|SCHAR|SHRT)_(?:MAX|MIN)|INFINITY|MAXFLOAT|M_(?:[12]_PI|2_SQRTPI|E|LN(?:2|10)|LOG(?:2|10)E?|PI(?:_[24])?|SQRT(?:1_2|2))(?:_F|_H)?|NAN|(?:UCHAR|UINT|ULONG|USHRT)_MAX)\b/,alias:"constant"}}),r.languages.insertBefore("opencl","class-name",{"builtin-type":{pattern:/\b(?:_cl_(?:command_queue|context|device_id|event|kernel|mem|platform_id|program|sampler)|cl_(?:image_format|mem_fence_flags)|clk_event_t|event_t|image(?:1d_(?:array_|buffer_)?t|2d_(?:array_(?:depth_|msaa_depth_|msaa_)?|depth_|msaa_depth_|msaa_)?t|3d_t)|intptr_t|ndrange_t|ptrdiff_t|queue_t|reserve_id_t|sampler_t|size_t|uintptr_t)\b/,alias:"keyword"}});var a={"type-opencl-host":{pattern:/\b(?:cl_(?:GLenum|GLint|GLuin|addressing_mode|bitfield|bool|buffer_create_type|build_status|channel_(?:order|type)|(?:u?(?:char|int|long|short)|double|float)(?:2|3|4|8|16)?|command_(?:queue(?:_info|_properties)?|type)|context(?:_info|_properties)?|device_(?:exec_capabilities|fp_config|id|info|local_mem_type|mem_cache_type|type)|(?:event|sampler)(?:_info)?|filter_mode|half|image_info|kernel(?:_info|_work_group_info)?|map_flags|mem(?:_flags|_info|_object_type)?|platform_(?:id|info)|profiling_info|program(?:_build_info|_info)?))\b/,alias:"keyword"},"boolean-opencl-host":{pattern:/\bCL_(?:FALSE|TRUE)\b/,alias:"boolean"},"constant-opencl-host":{pattern:/\bCL_(?:A|ABGR|ADDRESS_(?:CLAMP(?:_TO_EDGE)?|MIRRORED_REPEAT|NONE|REPEAT)|ARGB|BGRA|BLOCKING|BUFFER_CREATE_TYPE_REGION|BUILD_(?:ERROR|IN_PROGRESS|NONE|PROGRAM_FAILURE|SUCCESS)|COMMAND_(?:ACQUIRE_GL_OBJECTS|BARRIER|COPY_(?:BUFFER(?:_RECT|_TO_IMAGE)?|IMAGE(?:_TO_BUFFER)?)|FILL_(?:BUFFER|IMAGE)|MAP(?:_BUFFER|_IMAGE)|MARKER|MIGRATE(?:_SVM)?_MEM_OBJECTS|NATIVE_KERNEL|NDRANGE_KERNEL|READ_(?:BUFFER(?:_RECT)?|IMAGE)|RELEASE_GL_OBJECTS|SVM_(?:FREE|MAP|MEMCPY|MEMFILL|UNMAP)|TASK|UNMAP_MEM_OBJECT|USER|WRITE_(?:BUFFER(?:_RECT)?|IMAGE))|COMPILER_NOT_AVAILABLE|COMPILE_PROGRAM_FAILURE|COMPLETE|CONTEXT_(?:DEVICES|INTEROP_USER_SYNC|NUM_DEVICES|PLATFORM|PROPERTIES|REFERENCE_COUNT)|DEPTH(?:_STENCIL)?|DEVICE_(?:ADDRESS_BITS|AFFINITY_DOMAIN_(?:L[1-4]_CACHE|NEXT_PARTITIONABLE|NUMA)|AVAILABLE|BUILT_IN_KERNELS|COMPILER_AVAILABLE|DOUBLE_FP_CONFIG|ENDIAN_LITTLE|ERROR_CORRECTION_SUPPORT|EXECUTION_CAPABILITIES|EXTENSIONS|GLOBAL_(?:MEM_(?:CACHELINE_SIZE|CACHE_SIZE|CACHE_TYPE|SIZE)|VARIABLE_PREFERRED_TOTAL_SIZE)|HOST_UNIFIED_MEMORY|IL_VERSION|IMAGE(?:2D_MAX_(?:HEIGHT|WIDTH)|3D_MAX_(?:DEPTH|HEIGHT|WIDTH)|_BASE_ADDRESS_ALIGNMENT|_MAX_ARRAY_SIZE|_MAX_BUFFER_SIZE|_PITCH_ALIGNMENT|_SUPPORT)|LINKER_AVAILABLE|LOCAL_MEM_SIZE|LOCAL_MEM_TYPE|MAX_(?:CLOCK_FREQUENCY|COMPUTE_UNITS|CONSTANT_ARGS|CONSTANT_BUFFER_SIZE|GLOBAL_VARIABLE_SIZE|MEM_ALLOC_SIZE|NUM_SUB_GROUPS|ON_DEVICE_(?:EVENTS|QUEUES)|PARAMETER_SIZE|PIPE_ARGS|READ_IMAGE_ARGS|READ_WRITE_IMAGE_ARGS|SAMPLERS|WORK_GROUP_SIZE|WORK_ITEM_DIMENSIONS|WORK_ITEM_SIZES|WRITE_IMAGE_ARGS)|MEM_BASE_ADDR_ALIGN|MIN_DATA_TYPE_ALIGN_SIZE|NAME|NATIVE_VECTOR_WIDTH_(?:CHAR|DOUBLE|FLOAT|HALF|INT|LONG|SHORT)|NOT_(?:AVAILABLE|FOUND)|OPENCL_C_VERSION|PARENT_DEVICE|PARTITION_(?:AFFINITY_DOMAIN|BY_AFFINITY_DOMAIN|BY_COUNTS|BY_COUNTS_LIST_END|EQUALLY|FAILED|MAX_SUB_DEVICES|PROPERTIES|TYPE)|PIPE_MAX_(?:ACTIVE_RESERVATIONS|PACKET_SIZE)|PLATFORM|PREFERRED_(?:GLOBAL_ATOMIC_ALIGNMENT|INTEROP_USER_SYNC|LOCAL_ATOMIC_ALIGNMENT|PLATFORM_ATOMIC_ALIGNMENT|VECTOR_WIDTH_(?:CHAR|DOUBLE|FLOAT|HALF|INT|LONG|SHORT))|PRINTF_BUFFER_SIZE|PROFILE|PROFILING_TIMER_RESOLUTION|QUEUE_(?:ON_(?:DEVICE_(?:MAX_SIZE|PREFERRED_SIZE|PROPERTIES)|HOST_PROPERTIES)|PROPERTIES)|REFERENCE_COUNT|SINGLE_FP_CONFIG|SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS|SVM_(?:ATOMICS|CAPABILITIES|COARSE_GRAIN_BUFFER|FINE_GRAIN_BUFFER|FINE_GRAIN_SYSTEM)|TYPE(?:_ACCELERATOR|_ALL|_CPU|_CUSTOM|_DEFAULT|_GPU)?|VENDOR(?:_ID)?|VERSION)|DRIVER_VERSION|EVENT_(?:COMMAND_(?:EXECUTION_STATUS|QUEUE|TYPE)|CONTEXT|REFERENCE_COUNT)|EXEC_(?:KERNEL|NATIVE_KERNEL|STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST)|FILTER_(?:LINEAR|NEAREST)|FLOAT|FP_(?:CORRECTLY_ROUNDED_DIVIDE_SQRT|DENORM|FMA|INF_NAN|ROUND_TO_INF|ROUND_TO_NEAREST|ROUND_TO_ZERO|SOFT_FLOAT)|GLOBAL|HALF_FLOAT|IMAGE_(?:ARRAY_SIZE|BUFFER|DEPTH|ELEMENT_SIZE|FORMAT|FORMAT_MISMATCH|FORMAT_NOT_SUPPORTED|HEIGHT|NUM_MIP_LEVELS|NUM_SAMPLES|ROW_PITCH|SLICE_PITCH|WIDTH)|INTENSITY|INVALID_(?:ARG_INDEX|ARG_SIZE|ARG_VALUE|BINARY|BUFFER_SIZE|BUILD_OPTIONS|COMMAND_QUEUE|COMPILER_OPTIONS|CONTEXT|DEVICE|DEVICE_PARTITION_COUNT|DEVICE_QUEUE|DEVICE_TYPE|EVENT|EVENT_WAIT_LIST|GLOBAL_OFFSET|GLOBAL_WORK_SIZE|GL_OBJECT|HOST_PTR|IMAGE_DESCRIPTOR|IMAGE_FORMAT_DESCRIPTOR|IMAGE_SIZE|KERNEL|KERNEL_ARGS|KERNEL_DEFINITION|KERNEL_NAME|LINKER_OPTIONS|MEM_OBJECT|MIP_LEVEL|OPERATION|PIPE_SIZE|PLATFORM|PROGRAM|PROGRAM_EXECUTABLE|PROPERTY|QUEUE_PROPERTIES|SAMPLER|VALUE|WORK_DIMENSION|WORK_GROUP_SIZE|WORK_ITEM_SIZE)|KERNEL_(?:ARG_(?:ACCESS_(?:NONE|QUALIFIER|READ_ONLY|READ_WRITE|WRITE_ONLY)|ADDRESS_(?:CONSTANT|GLOBAL|LOCAL|PRIVATE|QUALIFIER)|INFO_NOT_AVAILABLE|NAME|TYPE_(?:CONST|NAME|NONE|PIPE|QUALIFIER|RESTRICT|VOLATILE))|ATTRIBUTES|COMPILE_NUM_SUB_GROUPS|COMPILE_WORK_GROUP_SIZE|CONTEXT|EXEC_INFO_SVM_FINE_GRAIN_SYSTEM|EXEC_INFO_SVM_PTRS|FUNCTION_NAME|GLOBAL_WORK_SIZE|LOCAL_MEM_SIZE|LOCAL_SIZE_FOR_SUB_GROUP_COUNT|MAX_NUM_SUB_GROUPS|MAX_SUB_GROUP_SIZE_FOR_NDRANGE|NUM_ARGS|PREFERRED_WORK_GROUP_SIZE_MULTIPLE|PRIVATE_MEM_SIZE|PROGRAM|REFERENCE_COUNT|SUB_GROUP_COUNT_FOR_NDRANGE|WORK_GROUP_SIZE)|LINKER_NOT_AVAILABLE|LINK_PROGRAM_FAILURE|LOCAL|LUMINANCE|MAP_(?:FAILURE|READ|WRITE|WRITE_INVALIDATE_REGION)|MEM_(?:ALLOC_HOST_PTR|ASSOCIATED_MEMOBJECT|CONTEXT|COPY_HOST_PTR|COPY_OVERLAP|FLAGS|HOST_NO_ACCESS|HOST_PTR|HOST_READ_ONLY|HOST_WRITE_ONLY|KERNEL_READ_AND_WRITE|MAP_COUNT|OBJECT_(?:ALLOCATION_FAILURE|BUFFER|IMAGE1D|IMAGE1D_ARRAY|IMAGE1D_BUFFER|IMAGE2D|IMAGE2D_ARRAY|IMAGE3D|PIPE)|OFFSET|READ_ONLY|READ_WRITE|REFERENCE_COUNT|SIZE|SVM_ATOMICS|SVM_FINE_GRAIN_BUFFER|TYPE|USES_SVM_POINTER|USE_HOST_PTR|WRITE_ONLY)|MIGRATE_MEM_OBJECT_(?:CONTENT_UNDEFINED|HOST)|MISALIGNED_SUB_BUFFER_OFFSET|NONE|NON_BLOCKING|OUT_OF_(?:HOST_MEMORY|RESOURCES)|PIPE_(?:MAX_PACKETS|PACKET_SIZE)|PLATFORM_(?:EXTENSIONS|HOST_TIMER_RESOLUTION|NAME|PROFILE|VENDOR|VERSION)|PROFILING_(?:COMMAND_(?:COMPLETE|END|QUEUED|START|SUBMIT)|INFO_NOT_AVAILABLE)|PROGRAM_(?:BINARIES|BINARY_SIZES|BINARY_TYPE(?:_COMPILED_OBJECT|_EXECUTABLE|_LIBRARY|_NONE)?|BUILD_(?:GLOBAL_VARIABLE_TOTAL_SIZE|LOG|OPTIONS|STATUS)|CONTEXT|DEVICES|IL|KERNEL_NAMES|NUM_DEVICES|NUM_KERNELS|REFERENCE_COUNT|SOURCE)|QUEUED|QUEUE_(?:CONTEXT|DEVICE|DEVICE_DEFAULT|ON_DEVICE|ON_DEVICE_DEFAULT|OUT_OF_ORDER_EXEC_MODE_ENABLE|PROFILING_ENABLE|PROPERTIES|REFERENCE_COUNT|SIZE)|R|RA|READ_(?:ONLY|WRITE)_CACHE|RG|RGB|RGBA|RGBx|RGx|RUNNING|Rx|SAMPLER_(?:ADDRESSING_MODE|CONTEXT|FILTER_MODE|LOD_MAX|LOD_MIN|MIP_FILTER_MODE|NORMALIZED_COORDS|REFERENCE_COUNT)|(?:UN)?SIGNED_INT(?:8|16|32)|SNORM_INT(?:8|16)|SUBMITTED|SUCCESS|UNORM_INT(?:8|16|24|_101010|_101010_2)|UNORM_SHORT_(?:555|565)|VERSION_(?:1_0|1_1|1_2|2_0|2_1)|sBGRA|sRGB|sRGBA|sRGBx)\b/,alias:"constant"},"function-opencl-host":{pattern:/\bcl(?:BuildProgram|CloneKernel|CompileProgram|Create(?:Buffer|CommandQueue(?:WithProperties)?|Context|ContextFromType|Image|Image2D|Image3D|Kernel|KernelsInProgram|Pipe|ProgramWith(?:Binary|BuiltInKernels|IL|Source)|Sampler|SamplerWithProperties|SubBuffer|SubDevices|UserEvent)|Enqueue(?:(?:Barrier|Marker)(?:WithWaitList)?|Copy(?:Buffer(?:Rect|ToImage)?|Image(?:ToBuffer)?)|(?:Fill|Map)(?:Buffer|Image)|MigrateMemObjects|NDRangeKernel|NativeKernel|(?:Read|Write)(?:Buffer(?:Rect)?|Image)|SVM(?:Free|Map|MemFill|Memcpy|MigrateMem|Unmap)|Task|UnmapMemObject|WaitForEvents)|Finish|Flush|Get(?:CommandQueueInfo|ContextInfo|Device(?:AndHostTimer|IDs|Info)|Event(?:Profiling)?Info|ExtensionFunctionAddress(?:ForPlatform)?|HostTimer|ImageInfo|Kernel(?:ArgInfo|Info|SubGroupInfo|WorkGroupInfo)|MemObjectInfo|PipeInfo|Platform(?:IDs|Info)|Program(?:Build)?Info|SamplerInfo|SupportedImageFormats)|LinkProgram|(?:Release|Retain)(?:CommandQueue|Context|Device|Event|Kernel|MemObject|Program|Sampler)|SVM(?:Alloc|Free)|Set(?:CommandQueueProperty|DefaultDeviceCommandQueue|EventCallback|Kernel|Kernel(?:Arg(?:SVMPointer)?|ExecInfo)|MemObjectDestructorCallback|UserEventStatus)|Unload(?:Platform)?Compiler|WaitForEvents)\b/,alias:"function"}};r.languages.insertBefore("c","keyword",a),r.languages.cpp&&(a["type-opencl-host-cpp"]={pattern:/\b(?:Buffer|BufferGL|BufferRenderGL|CommandQueue|Context|Device|DeviceCommandQueue|EnqueueArgs|Event|Image|Image1D|Image1DArray|Image1DBuffer|Image2D|Image2DArray|Image2DGL|Image3D|Image3DGL|ImageFormat|ImageGL|Kernel|KernelFunctor|LocalSpaceArg|Memory|NDRange|Pipe|Platform|Program|SVMAllocator|SVMTraitAtomic|SVMTraitCoarse|SVMTraitFine|SVMTraitReadOnly|SVMTraitReadWrite|SVMTraitWriteOnly|Sampler|UserEvent)\b/,alias:"keyword"},r.languages.insertBefore("cpp","keyword",a))}(n)}return Dw}var Lw,xL;function Hve(){if(xL)return Lw;xL=1,Lw=e,e.displayName="openqasm",e.aliases=["qasm"];function e(t){t.languages.openqasm={comment:/\/\*[\s\S]*?\*\/|\/\/.*/,string:{pattern:/"[^"\r\n\t]*"|'[^'\r\n\t]*'/,greedy:!0},keyword:/\b(?:CX|OPENQASM|U|barrier|boxas|boxto|break|const|continue|ctrl|def|defcal|defcalgrammar|delay|else|end|for|gate|gphase|if|in|include|inv|kernel|lengthof|let|measure|pow|reset|return|rotary|stretchinf|while)\b|#pragma\b/,"class-name":/\b(?:angle|bit|bool|creg|fixed|float|int|length|qreg|qubit|stretch|uint)\b/,function:/\b(?:cos|exp|ln|popcount|rotl|rotr|sin|sqrt|tan)\b(?=\s*\()/,constant:/\b(?:euler|pi|tau)\b|π|𝜏|ℇ/,number:{pattern:/(^|[^.\w$])(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?(?:dt|ns|us|µs|ms|s)?/i,lookbehind:!0},operator:/->|>>=?|<<=?|&&|\|\||\+\+|--|[!=<>&|~^+\-*/%]=?|@/,punctuation:/[(){}\[\];,:.]/},t.languages.qasm=t.languages.openqasm}return Lw}var Mw,kL;function Vve(){if(kL)return Mw;kL=1,Mw=e,e.displayName="oz",e.aliases=[];function e(t){t.languages.oz={comment:{pattern:/\/\*[\s\S]*?\*\/|%.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\[\s\S])*"/,greedy:!0},atom:{pattern:/'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,alias:"builtin"},keyword:/\$|\[\]|\b(?:_|at|attr|case|catch|choice|class|cond|declare|define|dis|else(?:case|if)?|end|export|fail|false|feat|finally|from|fun|functor|if|import|in|local|lock|meth|nil|not|of|or|prepare|proc|prop|raise|require|self|skip|then|thread|true|try|unit)\b/,function:[/\b[a-z][A-Za-z\d]*(?=\()/,{pattern:/(\{)[A-Z][A-Za-z\d]*\b/,lookbehind:!0}],number:/\b(?:0[bx][\da-f]+|\d+(?:\.\d*)?(?:e~?\d+)?)\b|&(?:[^\\]|\\(?:\d{3}|.))/i,variable:/`(?:[^`\\]|\\.)+`/,"attr-name":/\b\w+(?=[ \t]*:(?![:=]))/,operator:/:(?:=|::?)|<[-:=]?|=(?:=|=?:?|\\=:?|!!?|[|#+\-*\/,~^@]|\b(?:andthen|div|mod|orelse)\b/,punctuation:/[\[\](){}.:;?]/}}return Mw}var Pw,CL;function qve(){if(CL)return Pw;CL=1,Pw=e,e.displayName="parigp",e.aliases=[];function e(t){t.languages.parigp={comment:/\/\*[\s\S]*?\*\/|\\\\.*/,string:{pattern:/"(?:[^"\\\r\n]|\\.)*"/,greedy:!0},keyword:function(){var n=["breakpoint","break","dbg_down","dbg_err","dbg_up","dbg_x","forcomposite","fordiv","forell","forpart","forprime","forstep","forsubgroup","forvec","for","iferr","if","local","my","next","return","until","while"];return n=n.map(function(r){return r.split("").join(" *")}).join("|"),RegExp("\\b(?:"+n+")\\b")}(),function:/\b\w(?:[\w ]*\w)?(?= *\()/,number:{pattern:/((?:\. *\. *)?)(?:\b\d(?: *\d)*(?: *(?!\. *\.)\.(?: *\d)*)?|\. *\d(?: *\d)*)(?: *e *(?:[+-] *)?\d(?: *\d)*)?/i,lookbehind:!0},operator:/\. *\.|[*\/!](?: *=)?|%(?: *=|(?: *#)?(?: *')*)?|\+(?: *[+=])?|-(?: *[-=>])?|<(?: *>|(?: *<)?(?: *=)?)?|>(?: *>)?(?: *=)?|=(?: *=){0,2}|\\(?: *\/)?(?: *=)?|&(?: *&)?|\| *\||['#~^]/,punctuation:/[\[\]{}().,:;|]/}}return Pw}var $w,_L;function Gve(){if(_L)return $w;_L=1,$w=e,e.displayName="parser",e.aliases=[];function e(t){(function(n){var r=n.languages.parser=n.languages.extend("markup",{keyword:{pattern:/(^|[^^])(?:\^(?:case|eval|for|if|switch|throw)\b|@(?:BASE|CLASS|GET(?:_DEFAULT)?|OPTIONS|SET_DEFAULT|USE)\b)/,lookbehind:!0},variable:{pattern:/(^|[^^])\B\$(?:\w+|(?=[.{]))(?:(?:\.|::?)\w+)*(?:\.|::?)?/,lookbehind:!0,inside:{punctuation:/\.|:+/}},function:{pattern:/(^|[^^])\B[@^]\w+(?:(?:\.|::?)\w+)*(?:\.|::?)?/,lookbehind:!0,inside:{keyword:{pattern:/(^@)(?:GET_|SET_)/,lookbehind:!0},punctuation:/\.|:+/}},escape:{pattern:/\^(?:[$^;@()\[\]{}"':]|#[a-f\d]*)/i,alias:"builtin"},punctuation:/[\[\](){};]/});r=n.languages.insertBefore("parser","keyword",{"parser-comment":{pattern:/(\s)#.*/,lookbehind:!0,alias:"comment"},expression:{pattern:/(^|[^^])\((?:[^()]|\((?:[^()]|\((?:[^()])*\))*\))*\)/,greedy:!0,lookbehind:!0,inside:{string:{pattern:/(^|[^^])(["'])(?:(?!\2)[^^]|\^[\s\S])*\2/,lookbehind:!0},keyword:r.keyword,variable:r.variable,function:r.function,boolean:/\b(?:false|true)\b/,number:/\b(?:0x[a-f\d]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?)\b/i,escape:r.escape,operator:/[~+*\/\\%]|!(?:\|\|?|=)?|&&?|\|\|?|==|<[<=]?|>[>=]?|-[fd]?|\b(?:def|eq|ge|gt|in|is|le|lt|ne)\b/,punctuation:r.punctuation}}}),n.languages.insertBefore("inside","punctuation",{expression:r.expression,keyword:r.keyword,variable:r.variable,function:r.function,escape:r.escape,"parser-punctuation":{pattern:r.punctuation,alias:"punctuation"}},r.tag.inside["attr-value"])})(t)}return $w}var Fw,AL;function Wve(){if(AL)return Fw;AL=1,Fw=e,e.displayName="pascal",e.aliases=["objectpascal"];function e(t){t.languages.pascal={directive:{pattern:/\{\$[\s\S]*?\}/,greedy:!0,alias:["marco","property"]},comment:{pattern:/\(\*[\s\S]*?\*\)|\{[\s\S]*?\}|\/\/.*/,greedy:!0},string:{pattern:/(?:'(?:''|[^'\r\n])*'(?!')|#[&$%]?[a-f\d]+)+|\^[a-z]/i,greedy:!0},asm:{pattern:/(\basm\b)[\s\S]+?(?=\bend\s*[;[])/i,lookbehind:!0,greedy:!0,inside:null},keyword:[{pattern:/(^|[^&])\b(?:absolute|array|asm|begin|case|const|constructor|destructor|do|downto|else|end|file|for|function|goto|if|implementation|inherited|inline|interface|label|nil|object|of|operator|packed|procedure|program|record|reintroduce|repeat|self|set|string|then|to|type|unit|until|uses|var|while|with)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:dispose|exit|false|new|true)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:class|dispinterface|except|exports|finalization|finally|initialization|inline|library|on|out|packed|property|raise|resourcestring|threadvar|try)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:absolute|abstract|alias|assembler|bitpacked|break|cdecl|continue|cppdecl|cvar|default|deprecated|dynamic|enumerator|experimental|export|external|far|far16|forward|generic|helper|implements|index|interrupt|iochecks|local|message|name|near|nodefault|noreturn|nostackframe|oldfpccall|otherwise|overload|override|pascal|platform|private|protected|public|published|read|register|reintroduce|result|safecall|saveregisters|softfloat|specialize|static|stdcall|stored|strict|unaligned|unimplemented|varargs|virtual|write)\b/i,lookbehind:!0}],number:[/(?:[&%]\d+|\$[a-f\d]+)/i,/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?/i],operator:[/\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=]/,{pattern:/(^|[^&])\b(?:and|as|div|exclude|in|include|is|mod|not|or|shl|shr|xor)\b/,lookbehind:!0}],punctuation:/\(\.|\.\)|[()\[\]:;,.]/},t.languages.pascal.asm.inside=t.languages.extend("pascal",{asm:void 0,keyword:void 0,operator:void 0}),t.languages.objectpascal=t.languages.pascal}return Fw}var jw,TL;function Kve(){if(TL)return jw;TL=1,jw=e,e.displayName="pascaligo",e.aliases=[];function e(t){(function(n){var r=/\((?:[^()]|\((?:[^()]|\([^()]*\))*\))*\)/.source,a=/(?:\b\w+(?:)?|)/.source.replace(//g,function(){return r}),o=n.languages.pascaligo={comment:/\(\*[\s\S]+?\*\)|\/\/.*/,string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1|\^[a-z]/i,greedy:!0},"class-name":[{pattern:RegExp(/(\btype\s+\w+\s+is\s+)/.source.replace(//g,function(){return a}),"i"),lookbehind:!0,inside:null},{pattern:RegExp(/(?=\s+is\b)/.source.replace(//g,function(){return a}),"i"),inside:null},{pattern:RegExp(/(:\s*)/.source.replace(//g,function(){return a})),lookbehind:!0,inside:null}],keyword:{pattern:/(^|[^&])\b(?:begin|block|case|const|else|end|fail|for|from|function|if|is|nil|of|remove|return|skip|then|type|var|while|with)\b/i,lookbehind:!0},boolean:{pattern:/(^|[^&])\b(?:False|True)\b/i,lookbehind:!0},builtin:{pattern:/(^|[^&])\b(?:bool|int|list|map|nat|record|string|unit)\b/i,lookbehind:!0},function:/\b\w+(?=\s*\()/,number:[/%[01]+|&[0-7]+|\$[a-f\d]+/i,/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?(?:mtz|n)?/i],operator:/->|=\/=|\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=|]|\b(?:and|mod|or)\b/,punctuation:/\(\.|\.\)|[()\[\]:;,.{}]/},i=["comment","keyword","builtin","operator","punctuation"].reduce(function(s,l){return s[l]=o[l],s},{});o["class-name"].forEach(function(s){s.inside=i})})(t)}return jw}var zw,RL;function Yve(){if(RL)return zw;RL=1,zw=e,e.displayName="pcaxis",e.aliases=["px"];function e(t){t.languages.pcaxis={string:/"[^"]*"/,keyword:{pattern:/((?:^|;)\s*)[-A-Z\d]+(?:\s*\[[-\w]+\])?(?:\s*\("[^"]*"(?:,\s*"[^"]*")*\))?(?=\s*=)/,lookbehind:!0,greedy:!0,inside:{keyword:/^[-A-Z\d]+/,language:{pattern:/^(\s*)\[[-\w]+\]/,lookbehind:!0,inside:{punctuation:/^\[|\]$/,property:/[-\w]+/}},"sub-key":{pattern:/^(\s*)\S[\s\S]*/,lookbehind:!0,inside:{parameter:{pattern:/"[^"]*"/,alias:"property"},punctuation:/^\(|\)$|,/}}}},operator:/=/,tlist:{pattern:/TLIST\s*\(\s*\w+(?:(?:\s*,\s*"[^"]*")+|\s*,\s*"[^"]*"-"[^"]*")?\s*\)/,greedy:!0,inside:{function:/^TLIST/,property:{pattern:/^(\s*\(\s*)\w+/,lookbehind:!0},string:/"[^"]*"/,punctuation:/[(),]/,operator:/-/}},punctuation:/[;,]/,number:{pattern:/(^|\s)\d+(?:\.\d+)?(?!\S)/,lookbehind:!0},boolean:/NO|YES/},t.languages.px=t.languages.pcaxis}return zw}var Uw,NL;function Zve(){if(NL)return Uw;NL=1,Uw=e,e.displayName="peoplecode",e.aliases=["pcode"];function e(t){t.languages.peoplecode={comment:RegExp([/\/\*[\s\S]*?\*\//.source,/\bREM[^;]*;/.source,/<\*(?:[^<*]|\*(?!>)|<(?!\*)|<\*(?:(?!\*>)[\s\S])*\*>)*\*>/.source,/\/\+[\s\S]*?\+\//.source].join("|")),string:{pattern:/'(?:''|[^'\r\n])*'(?!')|"(?:""|[^"\r\n])*"(?!")/,greedy:!0},variable:/%\w+/,"function-definition":{pattern:/((?:^|[^\w-])(?:function|method)\s+)\w+/i,lookbehind:!0,alias:"function"},"class-name":{pattern:/((?:^|[^-\w])(?:as|catch|class|component|create|extends|global|implements|instance|local|of|property|returns)\s+)\w+(?::\w+)*/i,lookbehind:!0,inside:{punctuation:/:/}},keyword:/\b(?:abstract|alias|as|catch|class|component|constant|create|declare|else|end-(?:class|evaluate|for|function|get|if|method|set|try|while)|evaluate|extends|for|function|get|global|if|implements|import|instance|library|local|method|null|of|out|peopleCode|private|program|property|protected|readonly|ref|repeat|returns?|set|step|then|throw|to|try|until|value|when(?:-other)?|while)\b/i,"operator-keyword":{pattern:/\b(?:and|not|or)\b/i,alias:"operator"},function:/[_a-z]\w*(?=\s*\()/i,boolean:/\b(?:false|true)\b/i,number:/\b\d+(?:\.\d+)?\b/,operator:/<>|[<>]=?|!=|\*\*|[-+*/|=@]/,punctuation:/[:.;,()[\]]/},t.languages.pcode=t.languages.peoplecode}return Uw}var Bw,IL;function Xve(){if(IL)return Bw;IL=1,Bw=e,e.displayName="perl",e.aliases=[];function e(t){(function(n){var r=/(?:\((?:[^()\\]|\\[\s\S])*\)|\{(?:[^{}\\]|\\[\s\S])*\}|\[(?:[^[\]\\]|\\[\s\S])*\]|<(?:[^<>\\]|\\[\s\S])*>)/.source;n.languages.perl={comment:[{pattern:/(^\s*)=\w[\s\S]*?=cut.*/m,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0,greedy:!0}],string:[{pattern:RegExp(/\b(?:q|qq|qw|qx)(?![a-zA-Z0-9])\s*/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/([a-zA-Z0-9])(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,r].join("|")+")"),greedy:!0},{pattern:/("|`)(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0},{pattern:/'(?:[^'\\\r\n]|\\.)*'/,greedy:!0}],regex:[{pattern:RegExp(/\b(?:m|qr)(?![a-zA-Z0-9])\s*/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/([a-zA-Z0-9])(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,r].join("|")+")"+/[msixpodualngc]*/.source),greedy:!0},{pattern:RegExp(/(^|[^-])\b(?:s|tr|y)(?![a-zA-Z0-9])\s*/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\2)[^\\]|\\[\s\S])*\2(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,/([a-zA-Z0-9])(?:(?!\3)[^\\]|\\[\s\S])*\3(?:(?!\3)[^\\]|\\[\s\S])*\3/.source,r+/\s*/.source+r].join("|")+")"+/[msixpodualngcer]*/.source),lookbehind:!0,greedy:!0},{pattern:/\/(?:[^\/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~<>!?^]|(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|x|xor)\b))/,greedy:!0}],variable:[/[&*$@%]\{\^[A-Z]+\}/,/[&*$@%]\^[A-Z_]/,/[&*$@%]#?(?=\{)/,/[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+(?![\w$]))+(?:::)*/,/[&*$@%]\d+/,/(?!%=)[$@%][!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/],filehandle:{pattern:/<(?![<=])\S*?>|\b_\b/,alias:"symbol"},"v-string":{pattern:/v\d+(?:\.\d+)*|\d+(?:\.\d+){2,}/,alias:"string"},function:{pattern:/(\bsub[ \t]+)\w+/,lookbehind:!0},keyword:/\b(?:any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|return|say|state|sub|switch|undef|unless|until|use|when|while)\b/,number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)\b/,operator:/-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|\+[+=]?|-[-=>]?|\*\*?=?|\/\/?=?|=[=~>]?|~[~=]?|\|\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\.(?:=|\.\.?)?|[\\?]|\bx(?:=|\b)|\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\b/,punctuation:/[{}[\];(),:]/}})(t)}return Bw}var Hw,OL;function Qve(){if(OL)return Hw;OL=1;var e=Rh();Hw=t,t.displayName="phpExtras",t.aliases=[];function t(n){n.register(e),n.languages.insertBefore("php","variable",{this:{pattern:/\$this\b/,alias:"keyword"},global:/\$(?:GLOBALS|HTTP_RAW_POST_DATA|_(?:COOKIE|ENV|FILES|GET|POST|REQUEST|SERVER|SESSION)|argc|argv|http_response_header|php_errormsg)\b/,scope:{pattern:/\b[\w\\]+::/,inside:{keyword:/\b(?:parent|self|static)\b/,punctuation:/::|\\/}}})}return Hw}var Vw,DL;function Jve(){if(DL)return Vw;DL=1;var e=Rh(),t=Th();Vw=n,n.displayName="phpdoc",n.aliases=[];function n(r){r.register(e),r.register(t),function(a){var o=/(?:\b[a-zA-Z]\w*|[|\\[\]])+/.source;a.languages.phpdoc=a.languages.extend("javadoclike",{parameter:{pattern:RegExp("(@(?:global|param|property(?:-read|-write)?|var)\\s+(?:"+o+"\\s+)?)\\$\\w+"),lookbehind:!0}}),a.languages.insertBefore("phpdoc","keyword",{"class-name":[{pattern:RegExp("(@(?:global|package|param|property(?:-read|-write)?|return|subpackage|throws|var)\\s+)"+o),lookbehind:!0,inside:{keyword:/\b(?:array|bool|boolean|callback|double|false|float|int|integer|mixed|null|object|resource|self|string|true|void)\b/,punctuation:/[|\\[\]()]/}}]}),a.languages.javadoclike.addSupport("php",a.languages.phpdoc)}(r)}return Vw}var qw,LL;function eSe(){if(LL)return qw;LL=1;var e=TA();qw=t,t.displayName="plsql",t.aliases=[];function t(n){n.register(e),n.languages.plsql=n.languages.extend("sql",{comment:{pattern:/\/\*[\s\S]*?\*\/|--.*/,greedy:!0},keyword:/\b(?:A|ACCESSIBLE|ADD|AGENT|AGGREGATE|ALL|ALTER|AND|ANY|ARRAY|AS|ASC|AT|ATTRIBUTE|AUTHID|AVG|BEGIN|BETWEEN|BFILE_BASE|BINARY|BLOB_BASE|BLOCK|BODY|BOTH|BOUND|BULK|BY|BYTE|C|CALL|CALLING|CASCADE|CASE|CHAR|CHARACTER|CHARSET|CHARSETFORM|CHARSETID|CHAR_BASE|CHECK|CLOB_BASE|CLONE|CLOSE|CLUSTER|CLUSTERS|COLAUTH|COLLECT|COLUMNS|COMMENT|COMMIT|COMMITTED|COMPILED|COMPRESS|CONNECT|CONSTANT|CONSTRUCTOR|CONTEXT|CONTINUE|CONVERT|COUNT|CRASH|CREATE|CREDENTIAL|CURRENT|CURSOR|CUSTOMDATUM|DANGLING|DATA|DATE|DATE_BASE|DAY|DECLARE|DEFAULT|DEFINE|DELETE|DESC|DETERMINISTIC|DIRECTORY|DISTINCT|DOUBLE|DROP|DURATION|ELEMENT|ELSE|ELSIF|EMPTY|END|ESCAPE|EXCEPT|EXCEPTION|EXCEPTIONS|EXCLUSIVE|EXECUTE|EXISTS|EXIT|EXTERNAL|FETCH|FINAL|FIRST|FIXED|FLOAT|FOR|FORALL|FORCE|FROM|FUNCTION|GENERAL|GOTO|GRANT|GROUP|HASH|HAVING|HEAP|HIDDEN|HOUR|IDENTIFIED|IF|IMMEDIATE|IMMUTABLE|IN|INCLUDING|INDEX|INDEXES|INDICATOR|INDICES|INFINITE|INSERT|INSTANTIABLE|INT|INTERFACE|INTERSECT|INTERVAL|INTO|INVALIDATE|IS|ISOLATION|JAVA|LANGUAGE|LARGE|LEADING|LENGTH|LEVEL|LIBRARY|LIKE|LIKE2|LIKE4|LIKEC|LIMIT|LIMITED|LOCAL|LOCK|LONG|LOOP|MAP|MAX|MAXLEN|MEMBER|MERGE|MIN|MINUS|MINUTE|MOD|MODE|MODIFY|MONTH|MULTISET|MUTABLE|NAME|NAN|NATIONAL|NATIVE|NCHAR|NEW|NOCOMPRESS|NOCOPY|NOT|NOWAIT|NULL|NUMBER_BASE|OBJECT|OCICOLL|OCIDATE|OCIDATETIME|OCIDURATION|OCIINTERVAL|OCILOBLOCATOR|OCINUMBER|OCIRAW|OCIREF|OCIREFCURSOR|OCIROWID|OCISTRING|OCITYPE|OF|OLD|ON|ONLY|OPAQUE|OPEN|OPERATOR|OPTION|OR|ORACLE|ORADATA|ORDER|ORGANIZATION|ORLANY|ORLVARY|OTHERS|OUT|OVERLAPS|OVERRIDING|PACKAGE|PARALLEL_ENABLE|PARAMETER|PARAMETERS|PARENT|PARTITION|PASCAL|PERSISTABLE|PIPE|PIPELINED|PLUGGABLE|POLYMORPHIC|PRAGMA|PRECISION|PRIOR|PRIVATE|PROCEDURE|PUBLIC|RAISE|RANGE|RAW|READ|RECORD|REF|REFERENCE|RELIES_ON|REM|REMAINDER|RENAME|RESOURCE|RESULT|RESULT_CACHE|RETURN|RETURNING|REVERSE|REVOKE|ROLLBACK|ROW|SAMPLE|SAVE|SAVEPOINT|SB1|SB2|SB4|SECOND|SEGMENT|SELECT|SELF|SEPARATE|SEQUENCE|SERIALIZABLE|SET|SHARE|SHORT|SIZE|SIZE_T|SOME|SPARSE|SQL|SQLCODE|SQLDATA|SQLNAME|SQLSTATE|STANDARD|START|STATIC|STDDEV|STORED|STRING|STRUCT|STYLE|SUBMULTISET|SUBPARTITION|SUBSTITUTABLE|SUBTYPE|SUM|SYNONYM|TABAUTH|TABLE|TDO|THE|THEN|TIME|TIMESTAMP|TIMEZONE_ABBR|TIMEZONE_HOUR|TIMEZONE_MINUTE|TIMEZONE_REGION|TO|TRAILING|TRANSACTION|TRANSACTIONAL|TRUSTED|TYPE|UB1|UB2|UB4|UNDER|UNION|UNIQUE|UNPLUG|UNSIGNED|UNTRUSTED|UPDATE|USE|USING|VALIST|VALUE|VALUES|VARIABLE|VARIANCE|VARRAY|VARYING|VIEW|VIEWS|VOID|WHEN|WHERE|WHILE|WITH|WORK|WRAPPED|WRITE|YEAR|ZONE)\b/i,operator:/:=?|=>|[<>^~!]=|\.\.|\|\||\*\*|[-+*/%<>=@]/}),n.languages.insertBefore("plsql","operator",{label:{pattern:/<<\s*\w+\s*>>/,alias:"symbol"}})}return qw}var Gw,ML;function tSe(){if(ML)return Gw;ML=1,Gw=e,e.displayName="powerquery",e.aliases=[];function e(t){t.languages.powerquery={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},"quoted-identifier":{pattern:/#"(?:[^"\r\n]|"")*"(?!")/,greedy:!0},string:{pattern:/(?:#!)?"(?:[^"\r\n]|"")*"(?!")/,greedy:!0},constant:[/\bDay\.(?:Friday|Monday|Saturday|Sunday|Thursday|Tuesday|Wednesday)\b/,/\bTraceLevel\.(?:Critical|Error|Information|Verbose|Warning)\b/,/\bOccurrence\.(?:All|First|Last)\b/,/\bOrder\.(?:Ascending|Descending)\b/,/\bRoundingMode\.(?:AwayFromZero|Down|ToEven|TowardZero|Up)\b/,/\bMissingField\.(?:Error|Ignore|UseNull)\b/,/\bQuoteStyle\.(?:Csv|None)\b/,/\bJoinKind\.(?:FullOuter|Inner|LeftAnti|LeftOuter|RightAnti|RightOuter)\b/,/\bGroupKind\.(?:Global|Local)\b/,/\bExtraValues\.(?:Error|Ignore|List)\b/,/\bJoinAlgorithm\.(?:Dynamic|LeftHash|LeftIndex|PairwiseHash|RightHash|RightIndex|SortMerge)\b/,/\bJoinSide\.(?:Left|Right)\b/,/\bPrecision\.(?:Decimal|Double)\b/,/\bRelativePosition\.From(?:End|Start)\b/,/\bTextEncoding\.(?:Ascii|BigEndianUnicode|Unicode|Utf16|Utf8|Windows)\b/,/\b(?:Any|Binary|Date|DateTime|DateTimeZone|Duration|Function|Int16|Int32|Int64|Int8|List|Logical|None|Number|Record|Table|Text|Time)\.Type\b/,/\bnull\b/],boolean:/\b(?:false|true)\b/,keyword:/\b(?:and|as|each|else|error|if|in|is|let|meta|not|nullable|optional|or|otherwise|section|shared|then|try|type)\b|#(?:binary|date|datetime|datetimezone|duration|infinity|nan|sections|shared|table|time)\b/,function:{pattern:/(^|[^#\w.])[a-z_][\w.]*(?=\s*\()/i,lookbehind:!0},"data-type":{pattern:/\b(?:any|anynonnull|binary|date|datetime|datetimezone|duration|function|list|logical|none|number|record|table|text|time)\b/,alias:"class-name"},number:{pattern:/\b0x[\da-f]+\b|(?:[+-]?(?:\b\d+\.)?\b\d+|[+-]\.\d+|(^|[^.])\B\.\d+)(?:e[+-]?\d+)?\b/i,lookbehind:!0},operator:/[-+*\/&?@^]|<(?:=>?|>)?|>=?|=>?|\.\.\.?/,punctuation:/[,;\[\](){}]/},t.languages.pq=t.languages.powerquery,t.languages.mscript=t.languages.powerquery}return Gw}var Ww,PL;function nSe(){if(PL)return Ww;PL=1,Ww=e,e.displayName="powershell",e.aliases=[];function e(t){(function(n){var r=n.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};r.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:r},boolean:r.boolean,variable:r.variable}})(t)}return Ww}var Kw,$L;function rSe(){if($L)return Kw;$L=1,Kw=e,e.displayName="processing",e.aliases=[];function e(t){t.languages.processing=t.languages.extend("clike",{keyword:/\b(?:break|case|catch|class|continue|default|else|extends|final|for|if|implements|import|new|null|private|public|return|static|super|switch|this|try|void|while)\b/,function:/\b\w+(?=\s*\()/,operator:/<[<=]?|>[>=]?|&&?|\|\|?|[%?]|[!=+\-*\/]=?/}),t.languages.insertBefore("processing","number",{constant:/\b(?!XML\b)[A-Z][A-Z\d_]+\b/,type:{pattern:/\b(?:boolean|byte|char|color|double|float|int|[A-Z]\w*)\b/,alias:"class-name"}})}return Kw}var Yw,FL;function aSe(){if(FL)return Yw;FL=1,Yw=e,e.displayName="prolog",e.aliases=[];function e(t){t.languages.prolog={comment:{pattern:/\/\*[\s\S]*?\*\/|%.*/,greedy:!0},string:{pattern:/(["'])(?:\1\1|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1(?!\1)/,greedy:!0},builtin:/\b(?:fx|fy|xf[xy]?|yfx?)\b/,function:/\b[a-z]\w*(?:(?=\()|\/\d+)/,number:/\b\d+(?:\.\d*)?/,operator:/[:\\=><\-?*@\/;+^|!$.]+|\b(?:is|mod|not|xor)\b/,punctuation:/[(){}\[\],]/}}return Yw}var Zw,jL;function oSe(){if(jL)return Zw;jL=1,Zw=e,e.displayName="promql",e.aliases=[];function e(t){(function(n){var r=["sum","min","max","avg","group","stddev","stdvar","count","count_values","bottomk","topk","quantile"],a=["on","ignoring","group_right","group_left","by","without"],o=["offset"],i=r.concat(a,o);n.languages.promql={comment:{pattern:/(^[ \t]*)#.*/m,lookbehind:!0},"vector-match":{pattern:new RegExp("((?:"+a.join("|")+")\\s*)\\([^)]*\\)"),lookbehind:!0,inside:{"label-key":{pattern:/\b[^,]+\b/,alias:"attr-name"},punctuation:/[(),]/}},"context-labels":{pattern:/\{[^{}]*\}/,inside:{"label-key":{pattern:/\b[a-z_]\w*(?=\s*(?:=|![=~]))/,alias:"attr-name"},"label-value":{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0,alias:"attr-value"},punctuation:/\{|\}|=~?|![=~]|,/}},"context-range":[{pattern:/\[[\w\s:]+\]/,inside:{punctuation:/\[|\]|:/,"range-duration":{pattern:/\b(?:\d+(?:[smhdwy]|ms))+\b/i,alias:"number"}}},{pattern:/(\boffset\s+)\w+/,lookbehind:!0,inside:{"range-duration":{pattern:/\b(?:\d+(?:[smhdwy]|ms))+\b/i,alias:"number"}}}],keyword:new RegExp("\\b(?:"+i.join("|")+")\\b","i"),function:/\b[a-z_]\w*(?=\s*\()/i,number:/[-+]?(?:(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[-+]?\d+)?\b|\b(?:0x[0-9a-f]+|nan|inf)\b)/i,operator:/[\^*/%+-]|==|!=|<=|<|>=|>|\b(?:and|or|unless)\b/i,punctuation:/[{};()`,.[\]]/}})(t)}return Zw}var Xw,zL;function iSe(){if(zL)return Xw;zL=1,Xw=e,e.displayName="properties",e.aliases=[];function e(t){t.languages.properties={comment:/^[ \t]*[#!].*$/m,"attr-value":{pattern:/(^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?: *[=:] *(?! )| ))(?:\\(?:\r\n|[\s\S])|[^\\\r\n])+/m,lookbehind:!0},"attr-name":/^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?= *[=:]| )/m,punctuation:/[=:]/}}return Xw}var Qw,UL;function sSe(){if(UL)return Qw;UL=1,Qw=e,e.displayName="protobuf",e.aliases=[];function e(t){(function(n){var r=/\b(?:bool|bytes|double|s?fixed(?:32|64)|float|[su]?int(?:32|64)|string)\b/;n.languages.protobuf=n.languages.extend("clike",{"class-name":[{pattern:/(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,lookbehind:!0},{pattern:/(\b(?:rpc\s+\w+|returns)\s*\(\s*(?:stream\s+)?)\.?[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s*\))/,lookbehind:!0}],keyword:/\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|returns|rpc(?=\s+\w)|service|stream|syntax|to)\b(?!\s*=\s*\d)/,function:/\b[a-z_]\w*(?=\s*\()/i}),n.languages.insertBefore("protobuf","operator",{map:{pattern:/\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/[<>.,]/,builtin:r}},builtin:r,"positional-class-name":{pattern:/(?:\b|\B\.)[a-z_]\w*(?:\.[a-z_]\w*)*(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/\./}},annotation:{pattern:/(\[\s*)[a-z_]\w*(?=\s*=)/i,lookbehind:!0}})})(t)}return Qw}var Jw,BL;function lSe(){if(BL)return Jw;BL=1,Jw=e,e.displayName="psl",e.aliases=[];function e(t){t.languages.psl={comment:{pattern:/#.*/,greedy:!0},string:{pattern:/"(?:\\.|[^\\"])*"/,greedy:!0,inside:{symbol:/\\[ntrbA-Z"\\]/}},"heredoc-string":{pattern:/<<<([a-zA-Z_]\w*)[\r\n](?:.*[\r\n])*?\1\b/,alias:"string",greedy:!0},keyword:/\b(?:__multi|__single|case|default|do|else|elsif|exit|export|for|foreach|function|if|last|line|local|next|requires|return|switch|until|while|word)\b/,constant:/\b(?:ALARM|CHART_ADD_GRAPH|CHART_DELETE_GRAPH|CHART_DESTROY|CHART_LOAD|CHART_PRINT|EOF|OFFLINE|OK|PSL_PROF_LOG|R_CHECK_HORIZ|R_CHECK_VERT|R_CLICKER|R_COLUMN|R_FRAME|R_ICON|R_LABEL|R_LABEL_CENTER|R_LIST_MULTIPLE|R_LIST_MULTIPLE_ND|R_LIST_SINGLE|R_LIST_SINGLE_ND|R_MENU|R_POPUP|R_POPUP_SCROLLED|R_RADIO_HORIZ|R_RADIO_VERT|R_ROW|R_SCALE_HORIZ|R_SCALE_VERT|R_SEP_HORIZ|R_SEP_VERT|R_SPINNER|R_TEXT_FIELD|R_TEXT_FIELD_LABEL|R_TOGGLE|TRIM_LEADING|TRIM_LEADING_AND_TRAILING|TRIM_REDUNDANT|TRIM_TRAILING|VOID|WARN)\b/,boolean:/\b(?:FALSE|False|NO|No|TRUE|True|YES|Yes|false|no|true|yes)\b/,variable:/\b(?:PslDebug|errno|exit_status)\b/,builtin:{pattern:/\b(?:PslExecute|PslFunctionCall|PslFunctionExists|PslSetOptions|_snmp_debug|acos|add_diary|annotate|annotate_get|ascii_to_ebcdic|asctime|asin|atan|atexit|batch_set|blackout|cat|ceil|chan_exists|change_state|close|code_cvt|cond_signal|cond_wait|console_type|convert_base|convert_date|convert_locale_date|cos|cosh|create|date|dcget_text|destroy|destroy_lock|dget_text|difference|dump_hist|ebcdic_to_ascii|encrypt|event_archive|event_catalog_get|event_check|event_query|event_range_manage|event_range_query|event_report|event_schedule|event_trigger|event_trigger2|execute|exists|exp|fabs|file|floor|fmod|fopen|fseek|ftell|full_discovery|get|get_chan_info|get_ranges|get_text|get_vars|getenv|gethostinfo|getpid|getpname|grep|history|history_get_retention|in_transition|index|int|internal|intersection|is_var|isnumber|join|kill|length|lines|lock|lock_info|log|log10|loge|matchline|msg_check|msg_get_format|msg_get_severity|msg_printf|msg_sprintf|ntharg|nthargf|nthline|nthlinef|num_bytes|num_consoles|pconfig|popen|poplines|pow|print|printf|proc_exists|process|random|read|readln|refresh_parameters|remote_check|remote_close|remote_event_query|remote_event_trigger|remote_file_send|remote_open|remove|replace|rindex|sec_check_priv|sec_store_get|sec_store_set|set|set_alarm_ranges|set_locale|share|sin|sinh|sleep|snmp_agent_config|snmp_agent_start|snmp_agent_stop|snmp_close|snmp_config|snmp_get|snmp_get_next|snmp_h_get|snmp_h_get_next|snmp_h_set|snmp_open|snmp_set|snmp_trap_ignore|snmp_trap_listen|snmp_trap_raise_std_trap|snmp_trap_receive|snmp_trap_register_im|snmp_trap_send|snmp_walk|sopen|sort|splitline|sprintf|sqrt|srandom|str_repeat|strcasecmp|subset|substr|system|tail|tan|tanh|text_domain|time|tmpnam|tolower|toupper|trace_psl_process|trim|union|unique|unlock|unset|va_arg|va_start|write)\b/,alias:"builtin-function"},"foreach-variable":{pattern:/(\bforeach\s+(?:(?:\w+\b|"(?:\\.|[^\\"])*")\s+){0,2})[_a-zA-Z]\w*(?=\s*\()/,lookbehind:!0,greedy:!0},function:/\b[_a-z]\w*\b(?=\s*\()/i,number:/\b(?:0x[0-9a-f]+|\d+(?:\.\d+)?)\b/i,operator:/--|\+\+|&&=?|\|\|=?|<<=?|>>=?|[=!]~|[-+*/%&|^!=<>]=?|\.|[:?]/,punctuation:/[(){}\[\];,]/}}return Jw}var e0,HL;function cSe(){if(HL)return e0;HL=1,e0=e,e.displayName="pug",e.aliases=[];function e(t){(function(n){n.languages.pug={comment:{pattern:/(^([\t ]*))\/\/.*(?:(?:\r?\n|\r)\2[\t ].+)*/m,lookbehind:!0},"multiline-script":{pattern:/(^([\t ]*)script\b.*\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0,inside:n.languages.javascript},filter:{pattern:/(^([\t ]*)):.+(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"},text:/\S[\s\S]*/}},"multiline-plain-text":{pattern:/(^([\t ]*)[\w\-#.]+\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0},markup:{pattern:/(^[\t ]*)<.+/m,lookbehind:!0,inside:n.languages.markup},doctype:{pattern:/((?:^|\n)[\t ]*)doctype(?: .+)?/,lookbehind:!0},"flow-control":{pattern:/(^[\t ]*)(?:case|default|each|else|if|unless|when|while)\b(?: .+)?/m,lookbehind:!0,inside:{each:{pattern:/^each .+? in\b/,inside:{keyword:/\b(?:each|in)\b/,punctuation:/,/}},branch:{pattern:/^(?:case|default|else|if|unless|when|while)\b/,alias:"keyword"},rest:n.languages.javascript}},keyword:{pattern:/(^[\t ]*)(?:append|block|extends|include|prepend)\b.+/m,lookbehind:!0},mixin:[{pattern:/(^[\t ]*)mixin .+/m,lookbehind:!0,inside:{keyword:/^mixin/,function:/\w+(?=\s*\(|\s*$)/,punctuation:/[(),.]/}},{pattern:/(^[\t ]*)\+.+/m,lookbehind:!0,inside:{name:{pattern:/^\+\w+/,alias:"function"},rest:n.languages.javascript}}],script:{pattern:/(^[\t ]*script(?:(?:&[^(]+)?\([^)]+\))*[\t ]).+/m,lookbehind:!0,inside:n.languages.javascript},"plain-text":{pattern:/(^[\t ]*(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?[\t ]).+/m,lookbehind:!0},tag:{pattern:/(^[\t ]*)(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?:?/m,lookbehind:!0,inside:{attributes:[{pattern:/&[^(]+\([^)]+\)/,inside:n.languages.javascript},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*(?!\s))(?:\{[^}]*\}|[^,)\r\n]+)/,lookbehind:!0,inside:n.languages.javascript},"attr-name":/[\w-]+(?=\s*!?=|\s*[,)])/,punctuation:/[!=(),]+/}}],punctuation:/:/,"attr-id":/#[\w\-]+/,"attr-class":/\.[\w\-]+/}},code:[{pattern:/(^[\t ]*(?:-|!?=)).+/m,lookbehind:!0,inside:n.languages.javascript}],punctuation:/[.\-!=|]+/};for(var r=/(^([\t ]*)):(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/.source,a=[{filter:"atpl",language:"twig"},{filter:"coffee",language:"coffeescript"},"ejs","handlebars","less","livescript","markdown",{filter:"sass",language:"scss"},"stylus"],o={},i=0,s=a.length;i",function(){return l.filter}),"m"),lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"},text:{pattern:/\S[\s\S]*/,alias:[l.language,"language-"+l.language],inside:n.languages[l.language]}}})}n.languages.insertBefore("pug","filter",o)})(t)}return e0}var t0,VL;function uSe(){if(VL)return t0;VL=1,t0=e,e.displayName="puppet",e.aliases=[];function e(t){(function(n){n.languages.puppet={heredoc:[{pattern:/(@\("([^"\r\n\/):]+)"(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r(?!\n)))*?[ \t]*(?:\|[ \t]*)?(?:-[ \t]*)?\2/,lookbehind:!0,alias:"string",inside:{punctuation:/(?=\S).*\S(?= *$)/}},{pattern:/(@\(([^"\r\n\/):]+)(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r(?!\n)))*?[ \t]*(?:\|[ \t]*)?(?:-[ \t]*)?\2/,lookbehind:!0,greedy:!0,alias:"string",inside:{punctuation:/(?=\S).*\S(?= *$)/}},{pattern:/@\("?(?:[^"\r\n\/):]+)"?(?:\/[nrts$uL]*)?\)/,alias:"string",inside:{punctuation:{pattern:/(\().+?(?=\))/,lookbehind:!0}}}],"multiline-comment":{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0,greedy:!0,alias:"comment"},regex:{pattern:/((?:\bnode\s+|[~=\(\[\{,]\s*|[=+]>\s*|^\s*))\/(?:[^\/\\]|\\[\s\S])+\/(?:[imx]+\b|\B)/,lookbehind:!0,greedy:!0,inside:{"extended-regex":{pattern:/^\/(?:[^\/\\]|\\[\s\S])+\/[im]*x[im]*$/,inside:{comment:/#.*/}}}},comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},string:{pattern:/(["'])(?:\$\{(?:[^'"}]|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}|\$(?!\{)|(?!\1)[^\\$]|\\[\s\S])*\1/,greedy:!0,inside:{"double-quoted":{pattern:/^"[\s\S]*"$/,inside:{}}}},variable:{pattern:/\$(?:::)?\w+(?:::\w+)*/,inside:{punctuation:/::/}},"attr-name":/(?:\b\w+|\*)(?=\s*=>)/,function:[{pattern:/(\.)(?!\d)\w+/,lookbehind:!0},/\b(?:contain|debug|err|fail|include|info|notice|realize|require|tag|warning)\b|\b(?!\d)\w+(?=\()/],number:/\b(?:0x[a-f\d]+|\d+(?:\.\d+)?(?:e-?\d+)?)\b/i,boolean:/\b(?:false|true)\b/,keyword:/\b(?:application|attr|case|class|consumes|default|define|else|elsif|function|if|import|inherits|node|private|produces|type|undef|unless)\b/,datatype:{pattern:/\b(?:Any|Array|Boolean|Callable|Catalogentry|Class|Collection|Data|Default|Enum|Float|Hash|Integer|NotUndef|Numeric|Optional|Pattern|Regexp|Resource|Runtime|Scalar|String|Struct|Tuple|Type|Undef|Variant)\b/,alias:"symbol"},operator:/=[=~>]?|![=~]?|<(?:<\|?|[=~|-])?|>[>=]?|->?|~>|\|>?>?|[*\/%+?]|\b(?:and|in|or)\b/,punctuation:/[\[\]{}().,;]|:+/};var r=[{pattern:/(^|[^\\])\$\{(?:[^'"{}]|\{[^}]*\}|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}/,lookbehind:!0,inside:{"short-variable":{pattern:/(^\$\{)(?!\w+\()(?:::)?\w+(?:::\w+)*/,lookbehind:!0,alias:"variable",inside:{punctuation:/::/}},delimiter:{pattern:/^\$/,alias:"variable"},rest:n.languages.puppet}},{pattern:/(^|[^\\])\$(?:::)?\w+(?:::\w+)*/,lookbehind:!0,alias:"variable",inside:{punctuation:/::/}}];n.languages.puppet.heredoc[0].inside.interpolation=r,n.languages.puppet.string.inside["double-quoted"].inside.interpolation=r})(t)}return t0}var n0,qL;function dSe(){if(qL)return n0;qL=1,n0=e,e.displayName="pure",e.aliases=[];function e(t){(function(n){n.languages.pure={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0},/#!.+/],"inline-lang":{pattern:/%<[\s\S]+?%>/,greedy:!0,inside:{lang:{pattern:/(^%< *)-\*-.+?-\*-/,lookbehind:!0,alias:"comment"},delimiter:{pattern:/^%<.*|%>$/,alias:"punctuation"}}},string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},number:{pattern:/((?:\.\.)?)(?:\b(?:inf|nan)\b|\b0x[\da-f]+|(?:\b(?:0b)?\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?L?)/i,lookbehind:!0},keyword:/\b(?:NULL|ans|break|bt|case|catch|cd|clear|const|def|del|dump|else|end|exit|extern|false|force|help|if|infix[lr]?|interface|let|ls|mem|namespace|nonfix|of|otherwise|outfix|override|postfix|prefix|private|public|pwd|quit|run|save|show|stats|then|throw|trace|true|type|underride|using|when|with)\b/,function:/\b(?:abs|add_(?:addr|constdef|(?:fundef|interface|macdef|typedef)(?:_at)?|vardef)|all|any|applp?|arity|bigintp?|blob(?:_crc|_size|p)?|boolp?|byte_c?string(?:_pointer)?|byte_(?:matrix|pointer)|calloc|cat|catmap|ceil|char[ps]?|check_ptrtag|chr|clear_sentry|clearsym|closurep?|cmatrixp?|cols?|colcat(?:map)?|colmap|colrev|colvector(?:p|seq)?|complex(?:_float_(?:matrix|pointer)|_matrix(?:_view)?|_pointer|p)?|conj|cookedp?|cst|cstring(?:_(?:dup|list|vector))?|curry3?|cyclen?|del_(?:constdef|fundef|interface|macdef|typedef|vardef)|delete|diag(?:mat)?|dim|dmatrixp?|do|double(?:_matrix(?:_view)?|_pointer|p)?|dowith3?|drop|dropwhile|eval(?:cmd)?|exactp|filter|fix|fixity|flip|float(?:_matrix|_pointer)|floor|fold[lr]1?|frac|free|funp?|functionp?|gcd|get(?:_(?:byte|constdef|double|float|fundef|int(?:64)?|interface(?:_typedef)?|long|macdef|pointer|ptrtag|sentry|short|string|typedef|vardef))?|globsym|hash|head|id|im|imatrixp?|index|inexactp|infp|init|insert|int(?:_matrix(?:_view)?|_pointer|p)?|int64_(?:matrix|pointer)|integerp?|iteraten?|iterwhile|join|keys?|lambdap?|last(?:err(?:pos)?)?|lcd|list[2p]?|listmap|make_ptrtag|malloc|map|matcat|matrixp?|max|member|min|nanp|nargs|nmatrixp?|null|numberp?|ord|pack(?:ed)?|pointer(?:_cast|_tag|_type|p)?|pow|pred|ptrtag|put(?:_(?:byte|double|float|int(?:64)?|long|pointer|short|string))?|rationalp?|re|realp?|realloc|recordp?|redim|reduce(?:_with)?|refp?|repeatn?|reverse|rlistp?|round|rows?|rowcat(?:map)?|rowmap|rowrev|rowvector(?:p|seq)?|same|scan[lr]1?|sentry|sgn|short_(?:matrix|pointer)|slice|smatrixp?|sort|split|str|strcat|stream|stride|string(?:_(?:dup|list|vector)|p)?|subdiag(?:mat)?|submat|subseq2?|substr|succ|supdiag(?:mat)?|symbolp?|tail|take|takewhile|thunkp?|transpose|trunc|tuplep?|typep|ubyte|uint(?:64)?|ulong|uncurry3?|unref|unzip3?|update|ushort|vals?|varp?|vector(?:p|seq)?|void|zip3?|zipwith3?)\b/,special:{pattern:/\b__[a-z]+__\b/i,alias:"builtin"},operator:/(?:[!"#$%&'*+,\-.\/:<=>?@\\^`|~\u00a1-\u00bf\u00d7-\u00f7\u20d0-\u2bff]|\b_+\b)+|\b(?:and|div|mod|not|or)\b/,punctuation:/[(){}\[\];,|]/};var r=["c",{lang:"c++",alias:"cpp"},"fortran"],a=/%< *-\*- *\d* *-\*-[\s\S]+?%>/.source;r.forEach(function(o){var i=o;if(typeof o!="string"&&(i=o.alias,o=o.lang),n.languages[i]){var s={};s["inline-lang-"+i]={pattern:RegExp(a.replace("",o.replace(/([.+*?\/\\(){}\[\]])/g,"\\$1")),"i"),inside:n.util.clone(n.languages.pure["inline-lang"].inside)},s["inline-lang-"+i].inside.rest=n.util.clone(n.languages[i]),n.languages.insertBefore("pure","inline-lang",s)}}),n.languages.c&&(n.languages.pure["inline-lang"].inside.rest=n.util.clone(n.languages.c))})(t)}return n0}var r0,GL;function fSe(){if(GL)return r0;GL=1,r0=e,e.displayName="purebasic",e.aliases=[];function e(t){t.languages.purebasic=t.languages.extend("clike",{comment:/;.*/,keyword:/\b(?:align|and|as|break|calldebugger|case|compilercase|compilerdefault|compilerelse|compilerelseif|compilerendif|compilerendselect|compilererror|compilerif|compilerselect|continue|data|datasection|debug|debuglevel|declare|declarec|declarecdll|declaredll|declaremodule|default|define|dim|disableasm|disabledebugger|disableexplicit|else|elseif|enableasm|enabledebugger|enableexplicit|end|enddatasection|enddeclaremodule|endenumeration|endif|endimport|endinterface|endmacro|endmodule|endprocedure|endselect|endstructure|endstructureunion|endwith|enumeration|extends|fakereturn|for|foreach|forever|global|gosub|goto|if|import|importc|includebinary|includefile|includepath|interface|macro|module|newlist|newmap|next|not|or|procedure|procedurec|procedurecdll|proceduredll|procedurereturn|protected|prototype|prototypec|read|redim|repeat|restore|return|runtime|select|shared|static|step|structure|structureunion|swap|threaded|to|until|wend|while|with|xincludefile|xor)\b/i,function:/\b\w+(?:\.\w+)?\s*(?=\()/,number:/(?:\$[\da-f]+|\b-?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)\b/i,operator:/(?:@\*?|\?|\*)\w+|-[>-]?|\+\+?|!=?|<>?=?|==?|&&?|\|?\||[~^%?*/@]/}),t.languages.insertBefore("purebasic","keyword",{tag:/#\w+\$?/,asm:{pattern:/(^[\t ]*)!.*/m,lookbehind:!0,alias:"tag",inside:{comment:/;.*/,string:{pattern:/(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},"label-reference-anonymous":{pattern:/(!\s*j[a-z]+\s+)@[fb]/i,lookbehind:!0,alias:"fasm-label"},"label-reference-addressed":{pattern:/(!\s*j[a-z]+\s+)[A-Z._?$@][\w.?$@~#]*/i,lookbehind:!0,alias:"fasm-label"},keyword:[/\b(?:extern|global)\b[^;\r\n]*/i,/\b(?:CPU|DEFAULT|FLOAT)\b.*/],function:{pattern:/^([\t ]*!\s*)[\da-z]+(?=\s|$)/im,lookbehind:!0},"function-inline":{pattern:/(:\s*)[\da-z]+(?=\s)/i,lookbehind:!0,alias:"function"},label:{pattern:/^([\t ]*!\s*)[A-Za-z._?$@][\w.?$@~#]*(?=:)/m,lookbehind:!0,alias:"fasm-label"},register:/\b(?:st\d|[xyz]mm\d\d?|[cdt]r\d|r\d\d?[bwd]?|[er]?[abcd]x|[abcd][hl]|[er]?(?:bp|di|si|sp)|[cdefgs]s|mm\d+)\b/i,number:/(?:\b|-|(?=\$))(?:0[hx](?:[\da-f]*\.)?[\da-f]+(?:p[+-]?\d+)?|\d[\da-f]+[hx]|\$\d[\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\d+|(?:\d+(?:\.\d+)?|\.\d+)(?:\.?e[+-]?\d+)?[dt]?)\b/i,operator:/[\[\]*+\-/%<>=&|$!,.:]/}}}),delete t.languages.purebasic["class-name"],delete t.languages.purebasic.boolean,t.languages.pbfasm=t.languages.purebasic}return r0}var a0,WL;function pSe(){if(WL)return a0;WL=1;var e=NA();a0=t,t.displayName="purescript",t.aliases=["purs"];function t(n){n.register(e),n.languages.purescript=n.languages.extend("haskell",{keyword:/\b(?:ado|case|class|data|derive|do|else|forall|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b|∀/,"import-statement":{pattern:/(^[\t ]*)import\s+[A-Z][\w']*(?:\.[A-Z][\w']*)*(?:\s+as\s+[A-Z][\w']*(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,lookbehind:!0,inside:{keyword:/\b(?:as|hiding|import)\b/,punctuation:/\./}},builtin:/\b(?:absurd|add|ap|append|apply|between|bind|bottom|clamp|compare|comparing|compose|conj|const|degree|discard|disj|div|eq|flap|flip|gcd|identity|ifM|join|lcm|liftA1|liftM1|map|max|mempty|min|mod|mul|negate|not|notEq|one|otherwise|recip|show|sub|top|unit|unless|unlessM|void|when|whenM|zero)\b/,operator:[n.languages.haskell.operator[0],n.languages.haskell.operator[2],/[\xa2-\xa6\xa8\xa9\xac\xae-\xb1\xb4\xb8\xd7\xf7\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u03f6\u0482\u058d-\u058f\u0606-\u0608\u060b\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u07fe\u07ff\u09f2\u09f3\u09fa\u09fb\u0af1\u0b70\u0bf3-\u0bfa\u0c7f\u0d4f\u0d79\u0e3f\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u166d\u17db\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u2044\u2052\u207a-\u207c\u208a-\u208c\u20a0-\u20bf\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u2140-\u2144\u214a-\u214d\u214f\u218a\u218b\u2190-\u2307\u230c-\u2328\u232b-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b73\u2b76-\u2b95\u2b97-\u2bff\u2ce5-\u2cea\u2e50\u2e51\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u309b\u309c\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua700-\ua716\ua720\ua721\ua789\ua78a\ua828-\ua82b\ua836-\ua839\uaa77-\uaa79\uab5b\uab6a\uab6b\ufb29\ufbb2-\ufbc1\ufdfc\ufdfd\ufe62\ufe64-\ufe66\ufe69\uff04\uff0b\uff1c-\uff1e\uff3e\uff40\uff5c\uff5e\uffe0-\uffe6\uffe8-\uffee\ufffc\ufffd]/]}),n.languages.purs=n.languages.purescript}return a0}var o0,KL;function gSe(){if(KL)return o0;KL=1,o0=e,e.displayName="python",e.aliases=["py"];function e(t){t.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},t.languages.python["string-interpolation"].inside.interpolation.inside.rest=t.languages.python,t.languages.py=t.languages.python}return o0}var i0,YL;function mSe(){if(YL)return i0;YL=1,i0=e,e.displayName="q",e.aliases=[];function e(t){t.languages.q={string:/"(?:\\.|[^"\\\r\n])*"/,comment:[{pattern:/([\t )\]}])\/.*/,lookbehind:!0,greedy:!0},{pattern:/(^|\r?\n|\r)\/[\t ]*(?:(?:\r?\n|\r)(?:.*(?:\r?\n|\r(?!\n)))*?(?:\\(?=[\t ]*(?:\r?\n|\r))|$)|\S.*)/,lookbehind:!0,greedy:!0},{pattern:/^\\[\t ]*(?:\r?\n|\r)[\s\S]+/m,greedy:!0},{pattern:/^#!.+/m,greedy:!0}],symbol:/`(?::\S+|[\w.]*)/,datetime:{pattern:/0N[mdzuvt]|0W[dtz]|\d{4}\.\d\d(?:m|\.\d\d(?:T(?:\d\d(?::\d\d(?::\d\d(?:[.:]\d\d\d)?)?)?)?)?[dz]?)|\d\d:\d\d(?::\d\d(?:[.:]\d\d\d)?)?[uvt]?/,alias:"number"},number:/\b(?![01]:)(?:0N[hje]?|0W[hj]?|0[wn]|0x[\da-fA-F]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?[hjfeb]?)/,keyword:/\\\w+\b|\b(?:abs|acos|aj0?|all|and|any|asc|asin|asof|atan|attr|avgs?|binr?|by|ceiling|cols|cor|cos|count|cov|cross|csv|cut|delete|deltas|desc|dev|differ|distinct|div|do|dsave|ej|enlist|eval|except|exec|exit|exp|fby|fills|first|fkeys|flip|floor|from|get|getenv|group|gtime|hclose|hcount|hdel|hopen|hsym|iasc|identity|idesc|if|ij|in|insert|inter|inv|keys?|last|like|list|ljf?|load|log|lower|lsq|ltime|ltrim|mavg|maxs?|mcount|md5|mdev|med|meta|mins?|mmax|mmin|mmu|mod|msum|neg|next|not|null|or|over|parse|peach|pj|plist|prds?|prev|prior|rand|rank|ratios|raze|read0|read1|reciprocal|reval|reverse|rload|rotate|rsave|rtrim|save|scan|scov|sdev|select|set|setenv|show|signum|sin|sqrt|ssr?|string|sublist|sums?|sv|svar|system|tables|tan|til|trim|txf|type|uj|ungroup|union|update|upper|upsert|value|var|views?|vs|wavg|where|while|within|wj1?|wsum|ww|xasc|xbar|xcols?|xdesc|xexp|xgroup|xkey|xlog|xprev|xrank)\b/,adverb:{pattern:/['\/\\]:?|\beach\b/,alias:"function"},verb:{pattern:/(?:\B\.\B|\b[01]:|<[=>]?|>=?|[:+\-*%,!?~=|$&#@^]):?|\b_\b:?/,alias:"operator"},punctuation:/[(){}\[\];.]/}}return i0}var s0,ZL;function hSe(){if(ZL)return s0;ZL=1,s0=e,e.displayName="qml",e.aliases=[];function e(t){(function(n){for(var r=/"(?:\\.|[^\\"\r\n])*"|'(?:\\.|[^\\'\r\n])*'/.source,a=/\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))*\*\//.source,o=/(?:[^\\()[\]{}"'/]||\/(?![*/])||\(*\)|\[*\]|\{*\}|\\[\s\S])/.source.replace(//g,function(){return r}).replace(//g,function(){return a}),i=0;i<2;i++)o=o.replace(//g,function(){return o});o=o.replace(//g,"[^\\s\\S]"),n.languages.qml={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},"javascript-function":{pattern:RegExp(/((?:^|;)[ \t]*)function\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*\(*\)\s*\{*\}/.source.replace(//g,function(){return o}),"m"),lookbehind:!0,greedy:!0,alias:"language-javascript",inside:n.languages.javascript},"class-name":{pattern:/((?:^|[:;])[ \t]*)(?!\d)\w+(?=[ \t]*\{|[ \t]+on\b)/m,lookbehind:!0},property:[{pattern:/((?:^|[;{])[ \t]*)(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,lookbehind:!0},{pattern:/((?:^|[;{])[ \t]*)property[ \t]+(?!\d)\w+(?:\.\w+)*[ \t]+(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,lookbehind:!0,inside:{keyword:/^property/,property:/\w+(?:\.\w+)*/}}],"javascript-expression":{pattern:RegExp(/(:[ \t]*)(?![\s;}[])(?:(?!$|[;}]))+/.source.replace(//g,function(){return o}),"m"),lookbehind:!0,greedy:!0,alias:"language-javascript",inside:n.languages.javascript},string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},keyword:/\b(?:as|import|on)\b/,punctuation:/[{}[\]:;,]/}})(t)}return s0}var l0,XL;function bSe(){if(XL)return l0;XL=1,l0=e,e.displayName="qore",e.aliases=[];function e(t){t.languages.qore=t.languages.extend("clike",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:\/\/|#).*)/,lookbehind:!0},string:{pattern:/("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},keyword:/\b(?:abstract|any|assert|binary|bool|boolean|break|byte|case|catch|char|class|code|const|continue|data|default|do|double|else|enum|extends|final|finally|float|for|goto|hash|if|implements|import|inherits|instanceof|int|interface|long|my|native|new|nothing|null|object|our|own|private|reference|rethrow|return|short|soft(?:bool|date|float|int|list|number|string)|static|strictfp|string|sub|super|switch|synchronized|this|throw|throws|transient|try|void|volatile|while)\b/,boolean:/\b(?:false|true)\b/i,function:/\$?\b(?!\d)\w+(?=\()/,number:/\b(?:0b[01]+|0x(?:[\da-f]*\.)?[\da-fp\-]+|(?:\d+(?:\.\d+)?|\.\d+)(?:e\d+)?[df]|(?:\d+(?:\.\d+)?|\.\d+))\b/i,operator:{pattern:/(^|[^.])(?:\+[+=]?|-[-=]?|[!=](?:==?|~)?|>>?=?|<(?:=>?|<=?)?|&[&=]?|\|[|=]?|[*\/%^]=?|[~?])/,lookbehind:!0},variable:/\$(?!\d)\w+\b/})}return l0}var c0,QL;function ySe(){if(QL)return c0;QL=1,c0=e,e.displayName="qsharp",e.aliases=["qs"];function e(t){(function(n){function r(b,y){return b.replace(/<<(\d+)>>/g,function(w,v){return"(?:"+y[+v]+")"})}function a(b,y,w){return RegExp(r(b,y),w||"")}function o(b,y){for(var w=0;w>/g,function(){return"(?:"+b+")"});return b.replace(/<>/g,"[^\\s\\S]")}var i={type:"Adj BigInt Bool Ctl Double false Int One Pauli PauliI PauliX PauliY PauliZ Qubit Range Result String true Unit Zero",other:"Adjoint adjoint apply as auto body borrow borrowing Controlled controlled distribute elif else fail fixup for function if in internal intrinsic invert is let mutable namespace new newtype open operation repeat return self set until use using while within"};function s(b){return"\\b(?:"+b.trim().replace(/ /g,"|")+")\\b"}var l=RegExp(s(i.type+" "+i.other)),c=/\b[A-Za-z_]\w*\b/.source,u=r(/<<0>>(?:\s*\.\s*<<0>>)*/.source,[c]),d={keyword:l,punctuation:/[<>()?,.:[\]]/},g=/"(?:\\.|[^\\"])*"/.source;n.languages.qsharp=n.languages.extend("clike",{comment:/\/\/.*/,string:[{pattern:a(/(^|[^$\\])<<0>>/.source,[g]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:a(/(\b(?:as|open)\s+)<<0>>(?=\s*(?:;|as\b))/.source,[u]),lookbehind:!0,inside:d},{pattern:a(/(\bnamespace\s+)<<0>>(?=\s*\{)/.source,[u]),lookbehind:!0,inside:d}],keyword:l,number:/(?:\b0(?:x[\da-f]+|b[01]+|o[0-7]+)|(?:\B\.\d+|\b\d+(?:\.\d*)?)(?:e[-+]?\d+)?)l?\b/i,operator:/\band=|\bor=|\band\b|\bnot\b|\bor\b|<[-=]|[-=]>|>>>=?|<<<=?|\^\^\^=?|\|\|\|=?|&&&=?|w\/=?|~~~|[*\/+\-^=!%]=?/,punctuation:/::|[{}[\];(),.:]/}),n.languages.insertBefore("qsharp","number",{range:{pattern:/\.\./,alias:"operator"}});var m=o(r(/\{(?:[^"{}]|<<0>>|<>)*\}/.source,[g]),2);n.languages.insertBefore("qsharp","string",{"interpolation-string":{pattern:a(/\$"(?:\\.|<<0>>|[^\\"{])*"/.source,[m]),greedy:!0,inside:{interpolation:{pattern:a(/((?:^|[^\\])(?:\\\\)*)<<0>>/.source,[m]),lookbehind:!0,inside:{punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-qsharp",inside:n.languages.qsharp}}},string:/[\s\S]+/}}})})(t),t.languages.qs=t.languages.qsharp}return c0}var u0,JL;function vSe(){if(JL)return u0;JL=1,u0=e,e.displayName="r",e.aliases=[];function e(t){t.languages.r={comment:/#.*/,string:{pattern:/(['"])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},"percent-operator":{pattern:/%[^%\s]*%/,alias:"operator"},boolean:/\b(?:FALSE|TRUE)\b/,ellipsis:/\.\.(?:\.|\d+)/,number:[/\b(?:Inf|NaN)\b/,/(?:\b0x[\dA-Fa-f]+(?:\.\d*)?|\b\d+(?:\.\d*)?|\B\.\d+)(?:[EePp][+-]?\d+)?[iL]?/],keyword:/\b(?:NA|NA_character_|NA_complex_|NA_integer_|NA_real_|NULL|break|else|for|function|if|in|next|repeat|while)\b/,operator:/->?>?|<(?:=|=!]=?|::?|&&?|\|\|?|[+*\/^$@~]/,punctuation:/[(){}\[\],;]/}}return u0}var d0,eM;function SSe(){if(eM)return d0;eM=1;var e=LA();d0=t,t.displayName="racket",t.aliases=["rkt"];function t(n){n.register(e),n.languages.racket=n.languages.extend("scheme",{"lambda-parameter":{pattern:/([(\[]lambda\s+[(\[])[^()\[\]'\s]+/,lookbehind:!0}}),n.languages.insertBefore("racket","string",{lang:{pattern:/^#lang.+/m,greedy:!0,alias:"keyword"}}),n.languages.rkt=n.languages.racket}return d0}var f0,tM;function wSe(){if(tM)return f0;tM=1,f0=e,e.displayName="reason",e.aliases=[];function e(t){t.languages.reason=t.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),t.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete t.languages.reason.function}return f0}var p0,nM;function ESe(){if(nM)return p0;nM=1,p0=e,e.displayName="regex",e.aliases=[];function e(t){(function(n){var r={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},a=/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/,o={pattern:/\.|\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},i={pattern:/\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},s="(?:[^\\\\-]|"+a.source+")",l=RegExp(s+"-"+s),c={pattern:/(<|')[^<>']+(?=[>']$)/,lookbehind:!0,alias:"variable"};n.languages.regex={"char-class":{pattern:/((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,lookbehind:!0,inside:{"char-class-negation":{pattern:/(^\[)\^/,lookbehind:!0,alias:"operator"},"char-class-punctuation":{pattern:/^\[|\]$/,alias:"punctuation"},range:{pattern:l,inside:{escape:a,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":r,"char-set":i,escape:a}},"special-escape":r,"char-set":o,backreference:[{pattern:/\\(?![123][0-7]{2})[1-9]/,alias:"keyword"},{pattern:/\\k<[^<>']+>/,alias:"keyword",inside:{"group-name":c}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:a,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|:=]=?|!=|\b_\b/,punctuation:/[,;.\[\]{}()]/}}return g0}var m0,aM;function kSe(){if(aM)return m0;aM=1,m0=e,e.displayName="renpy",e.aliases=["rpy"];function e(t){t.languages.renpy={comment:{pattern:/(^|[^\\])#.+/,lookbehind:!0},string:{pattern:/("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\])*\2|(?:^#?(?:(?:[0-9a-fA-F]){3}|[0-9a-fA-F]{6})$)/m,greedy:!0},function:/\b[a-z_]\w*(?=\()/i,property:/\b(?:Update|UpdateVersion|action|activate_sound|adv_nvl_transition|after_load_transition|align|alpha|alt|anchor|antialias|area|auto|background|bar_invert|bar_resizing|bar_vertical|black_color|bold|bottom_bar|bottom_gutter|bottom_margin|bottom_padding|box_reverse|box_wrap|can_update|caret|child|color|crop|default_afm_enable|default_afm_time|default_fullscreen|default_text_cps|developer|directory_name|drag_handle|drag_joined|drag_name|drag_raise|draggable|dragged|drop_shadow|drop_shadow_color|droppable|dropped|easein|easeout|edgescroll|end_game_transition|end_splash_transition|enter_replay_transition|enter_sound|enter_transition|enter_yesno_transition|executable_name|exit_replay_transition|exit_sound|exit_transition|exit_yesno_transition|fadein|fadeout|first_indent|first_spacing|fit_first|focus|focus_mask|font|foreground|game_main_transition|get_installed_packages|google_play_key|google_play_salt|ground|has_music|has_sound|has_voice|height|help|hinting|hover|hover_background|hover_color|hover_sound|hovered|hyperlink_functions|idle|idle_color|image_style|include_update|insensitive|insensitive_background|insensitive_color|inside|intra_transition|italic|justify|kerning|keyboard_focus|language|layer_clipping|layers|layout|left_bar|left_gutter|left_margin|left_padding|length|line_leading|line_overlap_split|line_spacing|linear|main_game_transition|main_menu_music|maximum|min_width|minimum|minwidth|modal|mouse|mousewheel|name|narrator_menu|newline_indent|nvl_adv_transition|offset|order_reverse|outlines|overlay_functions|pos|position|prefix|radius|range|rest_indent|right_bar|right_gutter|right_margin|right_padding|rotate|rotate_pad|ruby_style|sample_sound|save_directory|say_attribute_transition|screen_height|screen_width|scrollbars|selected_hover|selected_hover_color|selected_idle|selected_idle_color|selected_insensitive|show_side_image|show_two_window|side_spacing|side_xpos|side_ypos|size|size_group|slow_cps|slow_cps_multiplier|spacing|strikethrough|subpixel|text_align|text_style|text_xpos|text_y_fudge|text_ypos|thumb|thumb_offset|thumb_shadow|thumbnail_height|thumbnail_width|time|top_bar|top_gutter|top_margin|top_padding|translations|underline|unscrollable|update|value|version|version_name|version_tuple|vertical|width|window_hide_transition|window_icon|window_left_padding|window_show_transition|window_title|windows_icon|xadjustment|xalign|xanchor|xanchoraround|xaround|xcenter|xfill|xinitial|xmargin|xmaximum|xminimum|xoffset|xofsset|xpadding|xpos|xsize|xzoom|yadjustment|yalign|yanchor|yanchoraround|yaround|ycenter|yfill|yinitial|ymargin|ymaximum|yminimum|yoffset|ypadding|ypos|ysize|ysizexysize|yzoom|zoom|zorder)\b/,tag:/\b(?:bar|block|button|buttoscreenn|drag|draggroup|fixed|frame|grid|[hv]box|hotbar|hotspot|image|imagebutton|imagemap|input|key|label|menu|mm_menu_frame|mousearea|nvl|parallel|screen|self|side|tag|text|textbutton|timer|vbar|viewport|window)\b|\$/,keyword:/\b(?:None|add|adjustment|alignaround|allow|angle|animation|around|as|assert|behind|box_layout|break|build|cache|call|center|changed|child_size|choice|circles|class|clear|clicked|clipping|clockwise|config|contains|continue|corner1|corner2|counterclockwise|def|default|define|del|delay|disabled|disabled_text|dissolve|elif|else|event|except|exclude|exec|expression|fade|finally|for|from|function|global|gm_root|has|hide|id|if|import|in|init|is|jump|knot|lambda|left|less_rounded|mm_root|movie|music|null|on|onlayer|pass|pause|persistent|play|print|python|queue|raise|random|renpy|repeat|return|right|rounded_window|scene|scope|set|show|slow|slow_abortable|slow_done|sound|stop|store|style|style_group|substitute|suffix|theme|transform|transform_anchor|transpose|try|ui|unhovered|updater|use|voice|while|widget|widget_hover|widget_selected|widget_text|yield)\b/,boolean:/\b(?:[Ff]alse|[Tt]rue)\b/,number:/(?:\b(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?)|\B\.\d+)(?:e[+-]?\d+)?j?/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:and|at|not|or|with)\b/,punctuation:/[{}[\];(),.:]/},t.languages.rpy=t.languages.renpy}return m0}var h0,oM;function CSe(){if(oM)return h0;oM=1,h0=e,e.displayName="rest",e.aliases=[];function e(t){t.languages.rest={table:[{pattern:/(^[\t ]*)(?:\+[=-]+)+\+(?:\r?\n|\r)(?:\1[+|].+[+|](?:\r?\n|\r))+\1(?:\+[=-]+)+\+/m,lookbehind:!0,inside:{punctuation:/\||(?:\+[=-]+)+\+/}},{pattern:/(^[\t ]*)=+ [ =]*=(?:(?:\r?\n|\r)\1.+)+(?:\r?\n|\r)\1=+ [ =]*=(?=(?:\r?\n|\r){2}|\s*$)/m,lookbehind:!0,inside:{punctuation:/[=-]+/}}],"substitution-def":{pattern:/(^[\t ]*\.\. )\|(?:[^|\s](?:[^|]*[^|\s])?)\| [^:]+::/m,lookbehind:!0,inside:{substitution:{pattern:/^\|(?:[^|\s]|[^|\s][^|]*[^|\s])\|/,alias:"attr-value",inside:{punctuation:/^\||\|$/}},directive:{pattern:/( )(?! )[^:]+::/,lookbehind:!0,alias:"function",inside:{punctuation:/::$/}}}},"link-target":[{pattern:/(^[\t ]*\.\. )\[[^\]]+\]/m,lookbehind:!0,alias:"string",inside:{punctuation:/^\[|\]$/}},{pattern:/(^[\t ]*\.\. )_(?:`[^`]+`|(?:[^:\\]|\\.)+):/m,lookbehind:!0,alias:"string",inside:{punctuation:/^_|:$/}}],directive:{pattern:/(^[\t ]*\.\. )[^:]+::/m,lookbehind:!0,alias:"function",inside:{punctuation:/::$/}},comment:{pattern:/(^[\t ]*\.\.)(?:(?: .+)?(?:(?:\r?\n|\r).+)+| .+)(?=(?:\r?\n|\r){2}|$)/m,lookbehind:!0},title:[{pattern:/^(([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2+)(?:\r?\n|\r).+(?:\r?\n|\r)\1$/m,inside:{punctuation:/^[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+|[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+$/,important:/.+/}},{pattern:/(^|(?:\r?\n|\r){2}).+(?:\r?\n|\r)([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2+(?=\r?\n|\r|$)/,lookbehind:!0,inside:{punctuation:/[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+$/,important:/.+/}}],hr:{pattern:/((?:\r?\n|\r){2})([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2{3,}(?=(?:\r?\n|\r){2})/,lookbehind:!0,alias:"punctuation"},field:{pattern:/(^[\t ]*):[^:\r\n]+:(?= )/m,lookbehind:!0,alias:"attr-name"},"command-line-option":{pattern:/(^[\t ]*)(?:[+-][a-z\d]|(?:--|\/)[a-z\d-]+)(?:[ =](?:[a-z][\w-]*|<[^<>]+>))?(?:, (?:[+-][a-z\d]|(?:--|\/)[a-z\d-]+)(?:[ =](?:[a-z][\w-]*|<[^<>]+>))?)*(?=(?:\r?\n|\r)? {2,}\S)/im,lookbehind:!0,alias:"symbol"},"literal-block":{pattern:/::(?:\r?\n|\r){2}([ \t]+)(?![ \t]).+(?:(?:\r?\n|\r)\1.+)*/,inside:{"literal-block-punctuation":{pattern:/^::/,alias:"punctuation"}}},"quoted-literal-block":{pattern:/::(?:\r?\n|\r){2}([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]).*(?:(?:\r?\n|\r)\1.*)*/,inside:{"literal-block-punctuation":{pattern:/^(?:::|([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\1*)/m,alias:"punctuation"}}},"list-bullet":{pattern:/(^[\t ]*)(?:[*+\-•‣⁃]|\(?(?:\d+|[a-z]|[ivxdclm]+)\)|(?:\d+|[a-z]|[ivxdclm]+)\.)(?= )/im,lookbehind:!0,alias:"punctuation"},"doctest-block":{pattern:/(^[\t ]*)>>> .+(?:(?:\r?\n|\r).+)*/m,lookbehind:!0,inside:{punctuation:/^>>>/}},inline:[{pattern:/(^|[\s\-:\/'"<(\[{])(?::[^:]+:`.*?`|`.*?`:[^:]+:|(\*\*?|``?|\|)(?!\s)(?:(?!\2).)*\S\2(?=[\s\-.,:;!?\\\/'")\]}]|$))/m,lookbehind:!0,inside:{bold:{pattern:/(^\*\*).+(?=\*\*$)/,lookbehind:!0},italic:{pattern:/(^\*).+(?=\*$)/,lookbehind:!0},"inline-literal":{pattern:/(^``).+(?=``$)/,lookbehind:!0,alias:"symbol"},role:{pattern:/^:[^:]+:|:[^:]+:$/,alias:"function",inside:{punctuation:/^:|:$/}},"interpreted-text":{pattern:/(^`).+(?=`$)/,lookbehind:!0,alias:"attr-value"},substitution:{pattern:/(^\|).+(?=\|$)/,lookbehind:!0,alias:"attr-value"},punctuation:/\*\*?|``?|\|/}}],link:[{pattern:/\[[^\[\]]+\]_(?=[\s\-.,:;!?\\\/'")\]}]|$)/,alias:"string",inside:{punctuation:/^\[|\]_$/}},{pattern:/(?:\b[a-z\d]+(?:[_.:+][a-z\d]+)*_?_|`[^`]+`_?_|_`[^`]+`)(?=[\s\-.,:;!?\\\/'")\]}]|$)/i,alias:"string",inside:{punctuation:/^_?`|`$|`?_?_$/}}],punctuation:{pattern:/(^[\t ]*)(?:\|(?= |$)|(?:---?|—|\.\.|__)(?= )|\.\.$)/m,lookbehind:!0}}}return h0}var b0,iM;function _Se(){if(iM)return b0;iM=1,b0=e,e.displayName="rip",e.aliases=[];function e(t){t.languages.rip={comment:{pattern:/#.*/,greedy:!0},char:{pattern:/\B`[^\s`'",.:;#\/\\()<>\[\]{}]\b/,greedy:!0},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},regex:{pattern:/(^|[^/])\/(?!\/)(?:\[[^\n\r\]]*\]|\\.|[^/\\\r\n\[])+\/(?=\s*(?:$|[\r\n,.;})]))/,lookbehind:!0,greedy:!0},keyword:/(?:=>|->)|\b(?:case|catch|class|else|exit|finally|if|raise|return|switch|try)\b/,builtin:/@|\bSystem\b/,boolean:/\b(?:false|true)\b/,date:/\b\d{4}-\d{2}-\d{2}\b/,time:/\b\d{2}:\d{2}:\d{2}\b/,datetime:/\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\b/,symbol:/:[^\d\s`'",.:;#\/\\()<>\[\]{}][^\s`'",.:;#\/\\()<>\[\]{}]*/,number:/[+-]?\b(?:\d+\.\d+|\d+)\b/,punctuation:/(?:\.{2,3})|[`,.:;=\/\\()<>\[\]{}]/,reference:/[^\d\s`'",.:;#\/\\()<>\[\]{}][^\s`'",.:;#\/\\()<>\[\]{}]*/}}return b0}var y0,sM;function ASe(){if(sM)return y0;sM=1,y0=e,e.displayName="roboconf",e.aliases=[];function e(t){t.languages.roboconf={comment:/#.*/,keyword:{pattern:/(^|\s)(?:(?:external|import)\b|(?:facet|instance of)(?=[ \t]+[\w-]+[ \t]*\{))/,lookbehind:!0},component:{pattern:/[\w-]+(?=[ \t]*\{)/,alias:"variable"},property:/[\w.-]+(?=[ \t]*:)/,value:{pattern:/(=[ \t]*(?![ \t]))[^,;]+/,lookbehind:!0,alias:"attr-value"},optional:{pattern:/\(optional\)/,alias:"builtin"},wildcard:{pattern:/(\.)\*/,lookbehind:!0,alias:"operator"},punctuation:/[{},.;:=]/}}return y0}var v0,lM;function TSe(){if(lM)return v0;lM=1,v0=e,e.displayName="robotframework",e.aliases=[];function e(t){(function(n){var r={pattern:/(^[ \t]*| {2}|\t)#.*/m,lookbehind:!0,greedy:!0},a={pattern:/((?:^|[^\\])(?:\\{2})*)[$@&%]\{(?:[^{}\r\n]|\{[^{}\r\n]*\})*\}/,lookbehind:!0,inside:{punctuation:/^[$@&%]\{|\}$/}};function o(c,u){var d={};d["section-header"]={pattern:/^ ?\*{3}.+?\*{3}/,alias:"keyword"};for(var g in u)d[g]=u[g];return d.tag={pattern:/([\r\n](?: {2}|\t)[ \t]*)\[[-\w]+\]/,lookbehind:!0,inside:{punctuation:/\[|\]/}},d.variable=a,d.comment=r,{pattern:RegExp(/^ ?\*{3}[ \t]*[ \t]*\*{3}(?:.|[\r\n](?!\*{3}))*/.source.replace(//g,function(){return c}),"im"),alias:"section",inside:d}}var i={pattern:/(\[Documentation\](?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,lookbehind:!0,alias:"string"},s={pattern:/([\r\n] ?)(?!#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0,alias:"function",inside:{variable:a}},l={pattern:/([\r\n](?: {2}|\t)[ \t]*)(?!\[|\.{3}|#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0,inside:{variable:a}};n.languages.robotframework={settings:o("Settings",{documentation:{pattern:/([\r\n] ?Documentation(?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,lookbehind:!0,alias:"string"},property:{pattern:/([\r\n] ?)(?!\.{3}|#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0}}),variables:o("Variables"),"test-cases":o("Test Cases",{"test-name":s,documentation:i,property:l}),keywords:o("Keywords",{"keyword-name":s,documentation:i,property:l}),tasks:o("Tasks",{"task-name":s,documentation:i,property:l}),comment:r},n.languages.robot=n.languages.robotframework})(t)}return v0}var S0,cM;function RSe(){if(cM)return S0;cM=1,S0=e,e.displayName="rust",e.aliases=[];function e(t){(function(n){for(var r=/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|)*\*\//.source,a=0;a<2;a++)r=r.replace(//g,function(){return r});r=r.replace(//g,function(){return/[^\s\S]/.source}),n.languages.rust={comment:[{pattern:RegExp(/(^|[^\\])/.source+r),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?=?|[@?]/},n.languages.rust["closure-params"].inside.rest=n.languages.rust,n.languages.rust.attribute.inside.string=n.languages.rust.string})(t)}return S0}var w0,uM;function NSe(){if(uM)return w0;uM=1,w0=e,e.displayName="sas",e.aliases=[];function e(t){(function(n){var r=/(?:"(?:""|[^"])*"(?!")|'(?:''|[^'])*'(?!'))/.source,a=/\b(?:\d[\da-f]*x|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,o={pattern:RegExp(r+"[bx]"),alias:"number"},i={pattern:/&[a-z_]\w*/i},s={pattern:/((?:^|\s|=|\())%(?:ABORT|BY|CMS|COPY|DISPLAY|DO|ELSE|END|EVAL|GLOBAL|GO|GOTO|IF|INC|INCLUDE|INDEX|INPUT|KTRIM|LENGTH|LET|LIST|LOCAL|PUT|QKTRIM|QSCAN|QSUBSTR|QSYSFUNC|QUPCASE|RETURN|RUN|SCAN|SUBSTR|SUPERQ|SYMDEL|SYMEXIST|SYMGLOBL|SYMLOCAL|SYSCALL|SYSEVALF|SYSEXEC|SYSFUNC|SYSGET|SYSRPUT|THEN|TO|TSO|UNQUOTE|UNTIL|UPCASE|WHILE|WINDOW)\b/i,lookbehind:!0,alias:"keyword"},l={pattern:/(^|\s)(?:proc\s+\w+|data(?!=)|quit|run)\b/i,alias:"keyword",lookbehind:!0},c=[/\/\*[\s\S]*?\*\//,{pattern:/(^[ \t]*|;\s*)\*[^;]*;/m,lookbehind:!0}],u={pattern:RegExp(r),greedy:!0},d=/[$%@.(){}\[\];,\\]/,g={pattern:/%?\b\w+(?=\()/,alias:"keyword"},m={function:g,"arg-value":{pattern:/(=\s*)[A-Z\.]+/i,lookbehind:!0},operator:/=/,"macro-variable":i,arg:{pattern:/[A-Z]+/i,alias:"keyword"},number:a,"numeric-constant":o,punctuation:d,string:u},b={pattern:/\b(?:format|put)\b=?[\w'$.]+/i,inside:{keyword:/^(?:format|put)(?==)/i,equals:/=/,format:{pattern:/(?:\w|\$\d)+\.\d?/,alias:"number"}}},y={pattern:/\b(?:format|put)\s+[\w']+(?:\s+[$.\w]+)+(?=;)/i,inside:{keyword:/^(?:format|put)/i,format:{pattern:/[\w$]+\.\d?/,alias:"number"}}},w={pattern:/((?:^|\s)=?)(?:catname|checkpoint execute_always|dm|endsas|filename|footnote|%include|libname|%list|lock|missing|options|page|resetline|%run|sasfile|skip|sysecho|title\d?)\b/i,lookbehind:!0,alias:"keyword"},v={pattern:/(^|\s)(?:submit(?:\s+(?:load|norun|parseonly))?|endsubmit)\b/i,lookbehind:!0,alias:"keyword"},h=/aStore|accessControl|aggregation|audio|autotune|bayesianNetClassifier|bioMedImage|boolRule|builtins|cardinality|cdm|clustering|conditionalRandomFields|configuration|copula|countreg|dataDiscovery|dataPreprocess|dataSciencePilot|dataStep|decisionTree|deduplication|deepLearn|deepNeural|deepRnn|ds2|ecm|entityRes|espCluster|explainModel|factmac|fastKnn|fcmpact|fedSql|freqTab|gVarCluster|gam|gleam|graphSemiSupLearn|hiddenMarkovModel|hyperGroup|ica|image|iml|kernalPca|langModel|ldaTopic|loadStreams|mbc|mixed|mlTools|modelPublishing|network|neuralNet|nmf|nonParametricBayes|nonlinear|optNetwork|optimization|panel|pca|percentile|phreg|pls|qkb|qlim|quantreg|recommend|regression|reinforcementLearn|robustPca|ruleMining|sampling|sandwich|sccasl|search(?:Analytics)?|sentimentAnalysis|sequence|session(?:Prop)?|severity|simSystem|simple|smartData|sparkEmbeddedProcess|sparseML|spatialreg|spc|stabilityMonitoring|svDataDescription|svm|table|text(?:Filters|Frequency|Mining|Parse|Rule(?:Develop|Score)|Topic|Util)|timeData|transpose|tsInfo|tsReconcile|uniTimeSeries|varReduce/.source,S={pattern:RegExp(/(^|\s)(?:action\s+)?(?:)\.[a-z]+\b[^;]+/.source.replace(//g,function(){return h}),"i"),lookbehind:!0,inside:{keyword:RegExp(/(?:)\.[a-z]+\b/.source.replace(//g,function(){return h}),"i"),action:{pattern:/(?:action)/i,alias:"keyword"},comment:c,function:g,"arg-value":m["arg-value"],operator:m.operator,argument:m.arg,number:a,"numeric-constant":o,punctuation:d,string:u}},E={pattern:/((?:^|\s)=?)(?:after|analysis|and|array|barchart|barwidth|begingraph|by|call|cas|cbarline|cfill|class(?:lev)?|close|column|computed?|contains|continue|data(?==)|define|delete|describe|document|do\s+over|do|dol|drop|dul|else|end(?:comp|source)?|entryTitle|eval(?:uate)?|exec(?:ute)?|exit|file(?:name)?|fill(?:attrs)?|flist|fnc|function(?:list)?|global|goto|group(?:by)?|headline|headskip|histogram|if|infile|keep|keylabel|keyword|label|layout|leave|legendlabel|length|libname|loadactionset|merge|midpoints|_?null_|name|noobs|nowd|ods|options|or|otherwise|out(?:put)?|over(?:lay)?|plot|print|put|raise|ranexp|rannor|rbreak|retain|return|select|session|sessref|set|source|statgraph|sum|summarize|table|temp|terminate|then\s+do|then|title\d?|to|var|when|where|xaxisopts|y2axisopts|yaxisopts)\b/i,lookbehind:!0};n.languages.sas={datalines:{pattern:/^([ \t]*)(?:cards|(?:data)?lines);[\s\S]+?^[ \t]*;/im,lookbehind:!0,alias:"string",inside:{keyword:{pattern:/^(?:cards|(?:data)?lines)/i},punctuation:/;/}},"proc-sql":{pattern:/(^proc\s+(?:fed)?sql(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{sql:{pattern:RegExp(/^[ \t]*(?:select|alter\s+table|(?:create|describe|drop)\s+(?:index|table(?:\s+constraints)?|view)|create\s+unique\s+index|insert\s+into|update)(?:|[^;"'])+;/.source.replace(//g,function(){return r}),"im"),alias:"language-sql",inside:n.languages.sql},"global-statements":w,"sql-statements":{pattern:/(^|\s)(?:disconnect\s+from|begin|commit|exec(?:ute)?|reset|rollback|validate)\b/i,lookbehind:!0,alias:"keyword"},number:a,"numeric-constant":o,punctuation:d,string:u}},"proc-groovy":{pattern:/(^proc\s+groovy(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:c,groovy:{pattern:RegExp(/(^[ \t]*submit(?:\s+(?:load|norun|parseonly))?)(?:|[^"'])+?(?=endsubmit;)/.source.replace(//g,function(){return r}),"im"),lookbehind:!0,alias:"language-groovy",inside:n.languages.groovy},keyword:E,"submit-statement":v,"global-statements":w,number:a,"numeric-constant":o,punctuation:d,string:u}},"proc-lua":{pattern:/(^proc\s+lua(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:c,lua:{pattern:RegExp(/(^[ \t]*submit(?:\s+(?:load|norun|parseonly))?)(?:|[^"'])+?(?=endsubmit;)/.source.replace(//g,function(){return r}),"im"),lookbehind:!0,alias:"language-lua",inside:n.languages.lua},keyword:E,"submit-statement":v,"global-statements":w,number:a,"numeric-constant":o,punctuation:d,string:u}},"proc-cas":{pattern:/(^proc\s+cas(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|quit|data);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:c,"statement-var":{pattern:/((?:^|\s)=?)saveresult\s[^;]+/im,lookbehind:!0,inside:{statement:{pattern:/^saveresult\s+\S+/i,inside:{keyword:/^(?:saveresult)/i}},rest:m}},"cas-actions":S,statement:{pattern:/((?:^|\s)=?)(?:default|(?:un)?set|on|output|upload)[^;]+/im,lookbehind:!0,inside:m},step:l,keyword:E,function:g,format:b,altformat:y,"global-statements":w,number:a,"numeric-constant":o,punctuation:d,string:u}},"proc-args":{pattern:RegExp(/(^proc\s+\w+\s+)(?!\s)(?:[^;"']|)+;/.source.replace(//g,function(){return r}),"im"),lookbehind:!0,inside:m},"macro-keyword":s,"macro-variable":i,"macro-string-functions":{pattern:/((?:^|\s|=))%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)\(.*?(?:[^%]\))/i,lookbehind:!0,inside:{function:{pattern:/%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)/i,alias:"keyword"},"macro-keyword":s,"macro-variable":i,"escaped-char":{pattern:/%['"()<>=¬^~;,#]/},punctuation:d}},"macro-declaration":{pattern:/^%macro[^;]+(?=;)/im,inside:{keyword:/%macro/i}},"macro-end":{pattern:/^%mend[^;]+(?=;)/im,inside:{keyword:/%mend/i}},macro:{pattern:/%_\w+(?=\()/,alias:"keyword"},input:{pattern:/\binput\s[-\w\s/*.$&]+;/i,inside:{input:{alias:"keyword",pattern:/^input/i},comment:c,number:a,"numeric-constant":o}},"options-args":{pattern:/(^options)[-'"|/\\<>*+=:()\w\s]*(?=;)/im,lookbehind:!0,inside:m},"cas-actions":S,comment:c,function:g,format:b,altformat:y,"numeric-constant":o,datetime:{pattern:RegExp(r+"(?:dt?|t)"),alias:"number"},string:u,step:l,keyword:E,"operator-keyword":{pattern:/\b(?:eq|ge|gt|in|le|lt|ne|not)\b/i,alias:"operator"},number:a,operator:/\*\*?|\|\|?|!!?|¦¦?|<[>=]?|>[<=]?|[-+\/=&]|[~¬^]=?/,punctuation:d}})(t)}return w0}var E0,dM;function ISe(){if(dM)return E0;dM=1,E0=e,e.displayName="sass",e.aliases=[];function e(t){(function(n){n.languages.sass=n.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),n.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete n.languages.sass.atrule;var r=/\$[-\w]+|#\{\$[-\w]+\}/,a=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];n.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:r,operator:a}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:r,operator:a,important:n.languages.sass.important}}}),delete n.languages.sass.property,delete n.languages.sass.important,n.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})})(t)}return E0}var x0,fM;function OSe(){if(fM)return x0;fM=1;var e=IA();x0=t,t.displayName="scala",t.aliases=[];function t(n){n.register(e),n.languages.scala=n.languages.extend("java",{"triple-quoted-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:/<-|=>|\b(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|null|object|override|package|private|protected|return|sealed|self|super|this|throw|trait|try|type|val|var|while|with|yield)\b/,number:/\b0x(?:[\da-f]*\.)?[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e\d+)?[dfl]?/i,builtin:/\b(?:Any|AnyRef|AnyVal|Boolean|Byte|Char|Double|Float|Int|Long|Nothing|Short|String|Unit)\b/,symbol:/'[^\d\s\\]\w*/}),n.languages.insertBefore("scala","triple-quoted-string",{"string-interpolation":{pattern:/\b[a-z]\w*(?:"""(?:[^$]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*?"""|"(?:[^$"\r\n]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*")/i,greedy:!0,inside:{id:{pattern:/^\w+/,greedy:!0,alias:"function"},escape:{pattern:/\\\$"|\$[$"]/,greedy:!0,alias:"symbol"},interpolation:{pattern:/\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,greedy:!0,inside:{punctuation:/^\$\{?|\}$/,expression:{pattern:/[\s\S]+/,inside:n.languages.scala}}},string:/[\s\S]+/}}}),delete n.languages.scala["class-name"],delete n.languages.scala.function}return x0}var k0,pM;function DSe(){if(pM)return k0;pM=1,k0=e,e.displayName="scss",e.aliases=[];function e(t){t.languages.scss=t.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),t.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),t.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),t.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),t.languages.scss.atrule.inside.rest=t.languages.scss}return k0}var C0,gM;function LSe(){if(gM)return C0;gM=1;var e=rz();C0=t,t.displayName="shellSession",t.aliases=[];function t(n){n.register(e),function(r){var a=[/"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/.source,/'[^']*'/.source,/\$'(?:[^'\\]|\\[\s\S])*'/.source,/<<-?\s*(["']?)(\w+)\1\s[\s\S]*?[\r\n]\2/.source].join("|");r.languages["shell-session"]={command:{pattern:RegExp(/^/.source+"(?:"+(/[^\s@:$#%*!/\\]+@[^\r\n@:$#%*!/\\]+(?::[^\0-\x1F$#%*?"<>:;|]+)?/.source+"|"+/[/~.][^\0-\x1F$#%*?"<>@:;|]*/.source)+")?"+/[$#%](?=\s)/.source+/(?:[^\\\r\n \t'"<$]|[ \t](?:(?!#)|#.*$)|\\(?:[^\r]|\r\n?)|\$(?!')|<(?!<)|<>)+/.source.replace(/<>/g,function(){return a}),"m"),greedy:!0,inside:{info:{pattern:/^[^#$%]+/,alias:"punctuation",inside:{user:/^[^\s@:$#%*!/\\]+@[^\r\n@:$#%*!/\\]+/,punctuation:/:/,path:/[\s\S]+/}},bash:{pattern:/(^[$#%]\s*)\S[\s\S]*/,lookbehind:!0,alias:"language-bash",inside:r.languages.bash},"shell-symbol":{pattern:/^[$#%]/,alias:"important"}}},output:/.(?:.*(?:[\r\n]|.$))*/},r.languages["sh-session"]=r.languages.shellsession=r.languages["shell-session"]}(n)}return C0}var _0,mM;function MSe(){if(mM)return _0;mM=1,_0=e,e.displayName="smali",e.aliases=[];function e(t){t.languages.smali={comment:/#.*/,string:{pattern:/"(?:[^\r\n\\"]|\\.)*"|'(?:[^\r\n\\']|\\(?:.|u[\da-fA-F]{4}))'/,greedy:!0},"class-name":{pattern:/(^|[^L])L(?:(?:\w+|`[^`\r\n]*`)\/)*(?:[\w$]+|`[^`\r\n]*`)(?=\s*;)/,lookbehind:!0,inside:{"class-name":{pattern:/(^L|\/)(?:[\w$]+|`[^`\r\n]*`)$/,lookbehind:!0},namespace:{pattern:/^(L)(?:(?:\w+|`[^`\r\n]*`)\/)+/,lookbehind:!0,inside:{punctuation:/\//}},builtin:/^L/}},builtin:[{pattern:/([();\[])[BCDFIJSVZ]+/,lookbehind:!0},{pattern:/([\w$>]:)[BCDFIJSVZ]/,lookbehind:!0}],keyword:[{pattern:/(\.end\s+)[\w-]+/,lookbehind:!0},{pattern:/(^|[^\w.-])\.(?!\d)[\w-]+/,lookbehind:!0},{pattern:/(^|[^\w.-])(?:abstract|annotation|bridge|constructor|enum|final|interface|private|protected|public|runtime|static|synthetic|system|transient)(?![\w.-])/,lookbehind:!0}],function:{pattern:/(^|[^\w.-])(?:\w+|<[\w$-]+>)(?=\()/,lookbehind:!0},field:{pattern:/[\w$]+(?=:)/,alias:"variable"},register:{pattern:/(^|[^\w.-])[vp]\d(?![\w.-])/,lookbehind:!0,alias:"variable"},boolean:{pattern:/(^|[^\w.-])(?:false|true)(?![\w.-])/,lookbehind:!0},number:{pattern:/(^|[^/\w.-])-?(?:NAN|INFINITY|0x(?:[\dA-F]+(?:\.[\dA-F]*)?|\.[\dA-F]+)(?:p[+-]?[\dA-F]+)?|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)[dflst]?(?![\w.-])/i,lookbehind:!0},label:{pattern:/(:)\w+/,lookbehind:!0,alias:"property"},operator:/->|\.\.|[\[=]/,punctuation:/[{}(),;:]/}}return _0}var A0,hM;function PSe(){if(hM)return A0;hM=1,A0=e,e.displayName="smalltalk",e.aliases=[];function e(t){t.languages.smalltalk={comment:{pattern:/"(?:""|[^"])*"/,greedy:!0},char:{pattern:/\$./,greedy:!0},string:{pattern:/'(?:''|[^'])*'/,greedy:!0},symbol:/#[\da-z]+|#(?:-|([+\/\\*~<>=@%|&?!])\1?)|#(?=\()/i,"block-arguments":{pattern:/(\[\s*):[^\[|]*\|/,lookbehind:!0,inside:{variable:/:[\da-z]+/i,punctuation:/\|/}},"temporary-variables":{pattern:/\|[^|]+\|/,inside:{variable:/[\da-z]+/i,punctuation:/\|/}},keyword:/\b(?:new|nil|self|super)\b/,boolean:/\b(?:false|true)\b/,number:[/\d+r-?[\dA-Z]+(?:\.[\dA-Z]+)?(?:e-?\d+)?/,/\b\d+(?:\.\d+)?(?:e-?\d+)?/],operator:/[<=]=?|:=|~[~=]|\/\/?|\\\\|>[>=]?|[!^+\-*&|,@]/,punctuation:/[.;:?\[\](){}]/}}return A0}var T0,bM;function $Se(){if(bM)return T0;bM=1;var e=mr();T0=t,t.displayName="smarty",t.aliases=[];function t(n){n.register(e),function(r){r.languages.smarty={comment:{pattern:/^\{\*[\s\S]*?\*\}/,greedy:!0},"embedded-php":{pattern:/^\{php\}[\s\S]*?\{\/php\}/,greedy:!0,inside:{smarty:{pattern:/^\{php\}|\{\/php\}$/,inside:null},php:{pattern:/[\s\S]+/,alias:"language-php",inside:r.languages.php}}},string:[{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0,inside:{interpolation:{pattern:/\{[^{}]*\}|`[^`]*`/,inside:{"interpolation-punctuation":{pattern:/^[{`]|[`}]$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}},variable:/\$\w+/}},{pattern:/'(?:\\.|[^'\\\r\n])*'/,greedy:!0}],keyword:{pattern:/(^\{\/?)[a-z_]\w*\b(?!\()/i,lookbehind:!0,greedy:!0},delimiter:{pattern:/^\{\/?|\}$/,greedy:!0,alias:"punctuation"},number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,variable:[/\$(?!\d)\w+/,/#(?!\d)\w+#/,{pattern:/(\.|->|\w\s*=)(?!\d)\w+\b(?!\()/,lookbehind:!0},{pattern:/(\[)(?!\d)\w+(?=\])/,lookbehind:!0}],function:{pattern:/(\|\s*)@?[a-z_]\w*|\b[a-z_]\w*(?=\()/i,lookbehind:!0},"attr-name":/\b[a-z_]\w*(?=\s*=)/i,boolean:/\b(?:false|no|off|on|true|yes)\b/,punctuation:/[\[\](){}.,:`]|->/,operator:[/[+\-*\/%]|==?=?|[!<>]=?|&&|\|\|?/,/\bis\s+(?:not\s+)?(?:div|even|odd)(?:\s+by)?\b/,/\b(?:and|eq|gt?e|gt|lt?e|lt|mod|neq?|not|or)\b/]},r.languages.smarty["embedded-php"].inside.smarty.inside=r.languages.smarty,r.languages.smarty.string[0].inside.interpolation.inside.expression.inside=r.languages.smarty;var a=/"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,o=RegExp(/\{\*[\s\S]*?\*\}/.source+"|"+/\{php\}[\s\S]*?\{\/php\}/.source+"|"+/\{(?:[^{}"']||\{(?:[^{}"']||\{(?:[^{}"']|)*\})*\})*\}/.source.replace(//g,function(){return a.source}),"g");r.hooks.add("before-tokenize",function(i){var s="{literal}",l="{/literal}",c=!1;r.languages["markup-templating"].buildPlaceholders(i,"smarty",o,function(u){return u===l&&(c=!1),c?!1:(u===s&&(c=!0),!0)})}),r.hooks.add("after-tokenize",function(i){r.languages["markup-templating"].tokenizePlaceholders(i,"smarty")})}(n)}return T0}var R0,yM;function FSe(){if(yM)return R0;yM=1,R0=e,e.displayName="sml",e.aliases=["smlnj"];function e(t){(function(n){var r=/\b(?:abstype|and|andalso|as|case|datatype|do|else|end|eqtype|exception|fn|fun|functor|handle|if|in|include|infix|infixr|let|local|nonfix|of|op|open|orelse|raise|rec|sharing|sig|signature|struct|structure|then|type|val|where|while|with|withtype)\b/i;n.languages.sml={comment:/\(\*(?:[^*(]|\*(?!\))|\((?!\*)|\(\*(?:[^*(]|\*(?!\))|\((?!\*))*\*\))*\*\)/,string:{pattern:/#?"(?:[^"\\]|\\.)*"/,greedy:!0},"class-name":[{pattern:RegExp(/((?:^|[^:]):\s*)(?:\s*(?:(?:\*|->)\s*|,\s*(?:(?=)|(?!)\s+)))*/.source.replace(//g,function(){return/\s*(?:[*,]|->)/.source}).replace(//g,function(){return/(?:'[\w']*||\((?:[^()]|\([^()]*\))*\)|\{(?:[^{}]|\{[^{}]*\})*\})(?:\s+)*/.source}).replace(//g,function(){return/(?!)[a-z\d_][\w'.]*/.source}).replace(//g,function(){return r.source}),"i"),lookbehind:!0,greedy:!0,inside:null},{pattern:/((?:^|[^\w'])(?:datatype|exception|functor|signature|structure|type)\s+)[a-z_][\w'.]*/i,lookbehind:!0}],function:{pattern:/((?:^|[^\w'])fun\s+)[a-z_][\w'.]*/i,lookbehind:!0},keyword:r,variable:{pattern:/(^|[^\w'])'[\w']*/,lookbehind:!0},number:/~?\b(?:\d+(?:\.\d+)?(?:e~?\d+)?|0x[\da-f]+)\b/i,word:{pattern:/\b0w(?:\d+|x[\da-f]+)\b/i,alias:"constant"},boolean:/\b(?:false|true)\b/i,operator:/\.\.\.|:[>=:]|=>?|->|[<>]=?|[!+\-*/^#|@~]/,punctuation:/[(){}\[\].:,;]/},n.languages.sml["class-name"][0].inside=n.languages.sml,n.languages.smlnj=n.languages.sml})(t)}return R0}var N0,vM;function jSe(){if(vM)return N0;vM=1,N0=e,e.displayName="solidity",e.aliases=["sol"];function e(t){t.languages.solidity=t.languages.extend("clike",{"class-name":{pattern:/(\b(?:contract|enum|interface|library|new|struct|using)\s+)(?!\d)[\w$]+/,lookbehind:!0},keyword:/\b(?:_|anonymous|as|assembly|assert|break|calldata|case|constant|constructor|continue|contract|default|delete|do|else|emit|enum|event|external|for|from|function|if|import|indexed|inherited|interface|internal|is|let|library|mapping|memory|modifier|new|payable|pragma|private|public|pure|require|returns?|revert|selfdestruct|solidity|storage|struct|suicide|switch|this|throw|using|var|view|while)\b/,operator:/=>|->|:=|=:|\*\*|\+\+|--|\|\||&&|<<=?|>>=?|[-+*/%^&|<>!=]=?|[~?]/}),t.languages.insertBefore("solidity","keyword",{builtin:/\b(?:address|bool|byte|u?int(?:8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?|string|bytes(?:[1-9]|[12]\d|3[0-2])?)\b/}),t.languages.insertBefore("solidity","number",{version:{pattern:/([<>]=?|\^)\d+\.\d+\.\d+\b/,lookbehind:!0,alias:"number"}}),t.languages.sol=t.languages.solidity}return N0}var I0,SM;function zSe(){if(SM)return I0;SM=1,I0=e,e.displayName="solutionFile",e.aliases=[];function e(t){(function(n){var r={pattern:/\{[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}\}/i,alias:"constant",inside:{punctuation:/[{}]/}};n.languages["solution-file"]={comment:{pattern:/#.*/,greedy:!0},string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,greedy:!0,inside:{guid:r}},object:{pattern:/^([ \t]*)(?:([A-Z]\w*)\b(?=.*(?:\r\n?|\n)(?:\1[ \t].*(?:\r\n?|\n))*\1End\2(?=[ \t]*$))|End[A-Z]\w*(?=[ \t]*$))/m,lookbehind:!0,greedy:!0,alias:"keyword"},property:{pattern:/^([ \t]*)(?!\s)[^\r\n"#=()]*[^\s"#=()](?=\s*=)/m,lookbehind:!0,inside:{guid:r}},guid:r,number:/\b\d+(?:\.\d+)*\b/,boolean:/\b(?:FALSE|TRUE)\b/,operator:/=/,punctuation:/[(),]/},n.languages.sln=n.languages["solution-file"]})(t)}return I0}var O0,wM;function USe(){if(wM)return O0;wM=1;var e=mr();O0=t,t.displayName="soy",t.aliases=[];function t(n){n.register(e),function(r){var a=/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,o=/\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-F]+\b/;r.languages.soy={comment:[/\/\*[\s\S]*?\*\//,{pattern:/(\s)\/\/.*/,lookbehind:!0,greedy:!0}],"command-arg":{pattern:/(\{+\/?\s*(?:alias|call|delcall|delpackage|deltemplate|namespace|template)\s+)\.?[\w.]+/,lookbehind:!0,alias:"string",inside:{punctuation:/\./}},parameter:{pattern:/(\{+\/?\s*@?param\??\s+)\.?[\w.]+/,lookbehind:!0,alias:"variable"},keyword:[{pattern:/(\{+\/?[^\S\r\n]*)(?:\\[nrt]|alias|call|case|css|default|delcall|delpackage|deltemplate|else(?:if)?|fallbackmsg|for(?:each)?|if(?:empty)?|lb|let|literal|msg|namespace|nil|@?param\??|rb|sp|switch|template|xid)/,lookbehind:!0},/\b(?:any|as|attributes|bool|css|float|html|in|int|js|list|map|null|number|string|uri)\b/],delimiter:{pattern:/^\{+\/?|\/?\}+$/,alias:"punctuation"},property:/\w+(?==)/,variable:{pattern:/\$[^\W\d]\w*(?:\??(?:\.\w+|\[[^\]]+\]))*/,inside:{string:{pattern:a,greedy:!0},number:o,punctuation:/[\[\].?]/}},string:{pattern:a,greedy:!0},function:[/\w+(?=\()/,{pattern:/(\|[^\S\r\n]*)\w+/,lookbehind:!0}],boolean:/\b(?:false|true)\b/,number:o,operator:/\?:?|<=?|>=?|==?|!=|[+*/%-]|\b(?:and|not|or)\b/,punctuation:/[{}()\[\]|.,:]/},r.hooks.add("before-tokenize",function(i){var s=/\{\{.+?\}\}|\{.+?\}|\s\/\/.*|\/\*[\s\S]*?\*\//g,l="{literal}",c="{/literal}",u=!1;r.languages["markup-templating"].buildPlaceholders(i,"soy",s,function(d){return d===c&&(u=!1),u?!1:(d===l&&(u=!0),!0)})}),r.hooks.add("after-tokenize",function(i){r.languages["markup-templating"].tokenizePlaceholders(i,"soy")})}(n)}return O0}var D0,EM;function sz(){if(EM)return D0;EM=1,D0=e,e.displayName="turtle",e.aliases=[];function e(t){t.languages.turtle={comment:{pattern:/#.*/,greedy:!0},"multiline-string":{pattern:/"""(?:(?:""?)?(?:[^"\\]|\\.))*"""|'''(?:(?:''?)?(?:[^'\\]|\\.))*'''/,greedy:!0,alias:"string",inside:{comment:/#.*/}},string:{pattern:/"(?:[^\\"\r\n]|\\.)*"|'(?:[^\\'\r\n]|\\.)*'/,greedy:!0},url:{pattern:/<(?:[^\x00-\x20<>"{}|^`\\]|\\(?:u[\da-fA-F]{4}|U[\da-fA-F]{8}))*>/,greedy:!0,inside:{punctuation:/[<>]/}},function:{pattern:/(?:(?![-.\d\xB7])[-.\w\xB7\xC0-\uFFFD]+)?:(?:(?![-.])(?:[-.:\w\xC0-\uFFFD]|%[\da-f]{2}|\\.)+)?/i,inside:{"local-name":{pattern:/([^:]*:)[\s\S]+/,lookbehind:!0},prefix:{pattern:/[\s\S]+/,inside:{punctuation:/:/}}}},number:/[+-]?\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,punctuation:/[{}.,;()[\]]|\^\^/,boolean:/\b(?:false|true)\b/,keyword:[/(?:\ba|@prefix|@base)\b|=/,/\b(?:base|graph|prefix)\b/i],tag:{pattern:/@[a-z]+(?:-[a-z\d]+)*/i,inside:{punctuation:/@/}}},t.languages.trig=t.languages.turtle}return D0}var L0,xM;function BSe(){if(xM)return L0;xM=1;var e=sz();L0=t,t.displayName="sparql",t.aliases=["rq"];function t(n){n.register(e),n.languages.sparql=n.languages.extend("turtle",{boolean:/\b(?:false|true)\b/i,variable:{pattern:/[?$]\w+/,greedy:!0}}),n.languages.insertBefore("sparql","punctuation",{keyword:[/\b(?:A|ADD|ALL|AS|ASC|ASK|BNODE|BY|CLEAR|CONSTRUCT|COPY|CREATE|DATA|DEFAULT|DELETE|DESC|DESCRIBE|DISTINCT|DROP|EXISTS|FILTER|FROM|GROUP|HAVING|INSERT|INTO|LIMIT|LOAD|MINUS|MOVE|NAMED|NOT|NOW|OFFSET|OPTIONAL|ORDER|RAND|REDUCED|SELECT|SEPARATOR|SERVICE|SILENT|STRUUID|UNION|USING|UUID|VALUES|WHERE)\b/i,/\b(?:ABS|AVG|BIND|BOUND|CEIL|COALESCE|CONCAT|CONTAINS|COUNT|DATATYPE|DAY|ENCODE_FOR_URI|FLOOR|GROUP_CONCAT|HOURS|IF|IRI|isBLANK|isIRI|isLITERAL|isNUMERIC|isURI|LANG|LANGMATCHES|LCASE|MAX|MD5|MIN|MINUTES|MONTH|REGEX|REPLACE|ROUND|sameTerm|SAMPLE|SECONDS|SHA1|SHA256|SHA384|SHA512|STR|STRAFTER|STRBEFORE|STRDT|STRENDS|STRLANG|STRLEN|STRSTARTS|SUBSTR|SUM|TIMEZONE|TZ|UCASE|URI|YEAR)\b(?=\s*\()/i,/\b(?:BASE|GRAPH|PREFIX)\b/i]}),n.languages.rq=n.languages.sparql}return L0}var M0,kM;function HSe(){if(kM)return M0;kM=1,M0=e,e.displayName="splunkSpl",e.aliases=[];function e(t){t.languages["splunk-spl"]={comment:/`comment\("(?:\\.|[^\\"])*"\)`/,string:{pattern:/"(?:\\.|[^\\"])*"/,greedy:!0},keyword:/\b(?:abstract|accum|addcoltotals|addinfo|addtotals|analyzefields|anomalies|anomalousvalue|anomalydetection|append|appendcols|appendcsv|appendlookup|appendpipe|arules|associate|audit|autoregress|bin|bucket|bucketdir|chart|cluster|cofilter|collect|concurrency|contingency|convert|correlate|datamodel|dbinspect|dedup|delete|delta|diff|erex|eval|eventcount|eventstats|extract|fieldformat|fields|fieldsummary|filldown|fillnull|findtypes|folderize|foreach|format|from|gauge|gentimes|geom|geomfilter|geostats|head|highlight|history|iconify|input|inputcsv|inputlookup|iplocation|join|kmeans|kv|kvform|loadjob|localize|localop|lookup|makecontinuous|makemv|makeresults|map|mcollect|metadata|metasearch|meventcollect|mstats|multikv|multisearch|mvcombine|mvexpand|nomv|outlier|outputcsv|outputlookup|outputtext|overlap|pivot|predict|rangemap|rare|regex|relevancy|reltime|rename|replace|rest|return|reverse|rex|rtorder|run|savedsearch|script|scrub|search|searchtxn|selfjoin|sendemail|set|setfields|sichart|sirare|sistats|sitimechart|sitop|sort|spath|stats|strcat|streamstats|table|tags|tail|timechart|timewrap|top|transaction|transpose|trendline|tscollect|tstats|typeahead|typelearner|typer|union|uniq|untable|where|x11|xmlkv|xmlunescape|xpath|xyseries)\b/i,"operator-word":{pattern:/\b(?:and|as|by|not|or|xor)\b/i,alias:"operator"},function:/\b\w+(?=\s*\()/,property:/\b\w+(?=\s*=(?!=))/,date:{pattern:/\b\d{1,2}\/\d{1,2}\/\d{1,4}(?:(?::\d{1,2}){3})?\b/,alias:"number"},number:/\b\d+(?:\.\d+)?\b/,boolean:/\b(?:f|false|t|true)\b/i,operator:/[<>=]=?|[-+*/%|]/,punctuation:/[()[\],]/}}return M0}var P0,CM;function VSe(){if(CM)return P0;CM=1,P0=e,e.displayName="sqf",e.aliases=[];function e(t){t.languages.sqf=t.languages.extend("clike",{string:{pattern:/"(?:(?:"")?[^"])*"(?!")|'(?:[^'])*'/,greedy:!0},keyword:/\b(?:breakOut|breakTo|call|case|catch|default|do|echo|else|execFSM|execVM|exitWith|for|forEach|forEachMember|forEachMemberAgent|forEachMemberTeam|from|goto|if|nil|preprocessFile|preprocessFileLineNumbers|private|scopeName|spawn|step|switch|then|throw|to|try|while|with)\b/i,boolean:/\b(?:false|true)\b/i,function:/\b(?:abs|accTime|acos|action|actionIDs|actionKeys|actionKeysImages|actionKeysNames|actionKeysNamesArray|actionName|actionParams|activateAddons|activatedAddons|activateKey|add3DENConnection|add3DENEventHandler|add3DENLayer|addAction|addBackpack|addBackpackCargo|addBackpackCargoGlobal|addBackpackGlobal|addCamShake|addCuratorAddons|addCuratorCameraArea|addCuratorEditableObjects|addCuratorEditingArea|addCuratorPoints|addEditorObject|addEventHandler|addForce|addForceGeneratorRTD|addGoggles|addGroupIcon|addHandgunItem|addHeadgear|addItem|addItemCargo|addItemCargoGlobal|addItemPool|addItemToBackpack|addItemToUniform|addItemToVest|addLiveStats|addMagazine|addMagazineAmmoCargo|addMagazineCargo|addMagazineCargoGlobal|addMagazineGlobal|addMagazinePool|addMagazines|addMagazineTurret|addMenu|addMenuItem|addMissionEventHandler|addMPEventHandler|addMusicEventHandler|addOwnedMine|addPlayerScores|addPrimaryWeaponItem|addPublicVariableEventHandler|addRating|addResources|addScore|addScoreSide|addSecondaryWeaponItem|addSwitchableUnit|addTeamMember|addToRemainsCollector|addTorque|addUniform|addVehicle|addVest|addWaypoint|addWeapon|addWeaponCargo|addWeaponCargoGlobal|addWeaponGlobal|addWeaponItem|addWeaponPool|addWeaponTurret|admin|agent|agents|AGLToASL|aimedAtTarget|aimPos|airDensityCurveRTD|airDensityRTD|airplaneThrottle|airportSide|AISFinishHeal|alive|all3DENEntities|allAirports|allControls|allCurators|allCutLayers|allDead|allDeadMen|allDisplays|allGroups|allMapMarkers|allMines|allMissionObjects|allow3DMode|allowCrewInImmobile|allowCuratorLogicIgnoreAreas|allowDamage|allowDammage|allowFileOperations|allowFleeing|allowGetIn|allowSprint|allPlayers|allSimpleObjects|allSites|allTurrets|allUnits|allUnitsUAV|allVariables|ammo|ammoOnPylon|animate|animateBay|animateDoor|animatePylon|animateSource|animationNames|animationPhase|animationSourcePhase|animationState|append|apply|armoryPoints|arrayIntersect|asin|ASLToAGL|ASLToATL|assert|assignAsCargo|assignAsCargoIndex|assignAsCommander|assignAsDriver|assignAsGunner|assignAsTurret|assignCurator|assignedCargo|assignedCommander|assignedDriver|assignedGunner|assignedItems|assignedTarget|assignedTeam|assignedVehicle|assignedVehicleRole|assignItem|assignTeam|assignToAirport|atan|atan2|atg|ATLToASL|attachedObject|attachedObjects|attachedTo|attachObject|attachTo|attackEnabled|backpack|backpackCargo|backpackContainer|backpackItems|backpackMagazines|backpackSpaceFor|behaviour|benchmark|binocular|blufor|boundingBox|boundingBoxReal|boundingCenter|briefingName|buildingExit|buildingPos|buldozer_EnableRoadDiag|buldozer_IsEnabledRoadDiag|buldozer_LoadNewRoads|buldozer_reloadOperMap|buttonAction|buttonSetAction|cadetMode|callExtension|camCommand|camCommit|camCommitPrepared|camCommitted|camConstuctionSetParams|camCreate|camDestroy|cameraEffect|cameraEffectEnableHUD|cameraInterest|cameraOn|cameraView|campaignConfigFile|camPreload|camPreloaded|camPrepareBank|camPrepareDir|camPrepareDive|camPrepareFocus|camPrepareFov|camPrepareFovRange|camPreparePos|camPrepareRelPos|camPrepareTarget|camSetBank|camSetDir|camSetDive|camSetFocus|camSetFov|camSetFovRange|camSetPos|camSetRelPos|camSetTarget|camTarget|camUseNVG|canAdd|canAddItemToBackpack|canAddItemToUniform|canAddItemToVest|cancelSimpleTaskDestination|canFire|canMove|canSlingLoad|canStand|canSuspend|canTriggerDynamicSimulation|canUnloadInCombat|canVehicleCargo|captive|captiveNum|cbChecked|cbSetChecked|ceil|channelEnabled|cheatsEnabled|checkAIFeature|checkVisibility|civilian|className|clear3DENAttribute|clear3DENInventory|clearAllItemsFromBackpack|clearBackpackCargo|clearBackpackCargoGlobal|clearForcesRTD|clearGroupIcons|clearItemCargo|clearItemCargoGlobal|clearItemPool|clearMagazineCargo|clearMagazineCargoGlobal|clearMagazinePool|clearOverlay|clearRadio|clearVehicleInit|clearWeaponCargo|clearWeaponCargoGlobal|clearWeaponPool|clientOwner|closeDialog|closeDisplay|closeOverlay|collapseObjectTree|collect3DENHistory|collectiveRTD|combatMode|commandArtilleryFire|commandChat|commander|commandFire|commandFollow|commandFSM|commandGetOut|commandingMenu|commandMove|commandRadio|commandStop|commandSuppressiveFire|commandTarget|commandWatch|comment|commitOverlay|compile|compileFinal|completedFSM|composeText|configClasses|configFile|configHierarchy|configName|configNull|configProperties|configSourceAddonList|configSourceMod|configSourceModList|confirmSensorTarget|connectTerminalToUAV|controlNull|controlsGroupCtrl|copyFromClipboard|copyToClipboard|copyWaypoints|cos|count|countEnemy|countFriendly|countSide|countType|countUnknown|create3DENComposition|create3DENEntity|createAgent|createCenter|createDialog|createDiaryLink|createDiaryRecord|createDiarySubject|createDisplay|createGearDialog|createGroup|createGuardedPoint|createLocation|createMarker|createMarkerLocal|createMenu|createMine|createMissionDisplay|createMPCampaignDisplay|createSimpleObject|createSimpleTask|createSite|createSoundSource|createTask|createTeam|createTrigger|createUnit|createVehicle|createVehicleCrew|createVehicleLocal|crew|ctAddHeader|ctAddRow|ctClear|ctCurSel|ctData|ctFindHeaderRows|ctFindRowHeader|ctHeaderControls|ctHeaderCount|ctRemoveHeaders|ctRemoveRows|ctrlActivate|ctrlAddEventHandler|ctrlAngle|ctrlAutoScrollDelay|ctrlAutoScrollRewind|ctrlAutoScrollSpeed|ctrlChecked|ctrlClassName|ctrlCommit|ctrlCommitted|ctrlCreate|ctrlDelete|ctrlEnable|ctrlEnabled|ctrlFade|ctrlHTMLLoaded|ctrlIDC|ctrlIDD|ctrlMapAnimAdd|ctrlMapAnimClear|ctrlMapAnimCommit|ctrlMapAnimDone|ctrlMapCursor|ctrlMapMouseOver|ctrlMapScale|ctrlMapScreenToWorld|ctrlMapWorldToScreen|ctrlModel|ctrlModelDirAndUp|ctrlModelScale|ctrlParent|ctrlParentControlsGroup|ctrlPosition|ctrlRemoveAllEventHandlers|ctrlRemoveEventHandler|ctrlScale|ctrlSetActiveColor|ctrlSetAngle|ctrlSetAutoScrollDelay|ctrlSetAutoScrollRewind|ctrlSetAutoScrollSpeed|ctrlSetBackgroundColor|ctrlSetChecked|ctrlSetDisabledColor|ctrlSetEventHandler|ctrlSetFade|ctrlSetFocus|ctrlSetFont|ctrlSetFontH1|ctrlSetFontH1B|ctrlSetFontH2|ctrlSetFontH2B|ctrlSetFontH3|ctrlSetFontH3B|ctrlSetFontH4|ctrlSetFontH4B|ctrlSetFontH5|ctrlSetFontH5B|ctrlSetFontH6|ctrlSetFontH6B|ctrlSetFontHeight|ctrlSetFontHeightH1|ctrlSetFontHeightH2|ctrlSetFontHeightH3|ctrlSetFontHeightH4|ctrlSetFontHeightH5|ctrlSetFontHeightH6|ctrlSetFontHeightSecondary|ctrlSetFontP|ctrlSetFontPB|ctrlSetFontSecondary|ctrlSetForegroundColor|ctrlSetModel|ctrlSetModelDirAndUp|ctrlSetModelScale|ctrlSetPixelPrecision|ctrlSetPosition|ctrlSetScale|ctrlSetStructuredText|ctrlSetText|ctrlSetTextColor|ctrlSetTextColorSecondary|ctrlSetTextSecondary|ctrlSetTooltip|ctrlSetTooltipColorBox|ctrlSetTooltipColorShade|ctrlSetTooltipColorText|ctrlShow|ctrlShown|ctrlText|ctrlTextHeight|ctrlTextSecondary|ctrlTextWidth|ctrlType|ctrlVisible|ctRowControls|ctRowCount|ctSetCurSel|ctSetData|ctSetHeaderTemplate|ctSetRowTemplate|ctSetValue|ctValue|curatorAddons|curatorCamera|curatorCameraArea|curatorCameraAreaCeiling|curatorCoef|curatorEditableObjects|curatorEditingArea|curatorEditingAreaType|curatorMouseOver|curatorPoints|curatorRegisteredObjects|curatorSelected|curatorWaypointCost|current3DENOperation|currentChannel|currentCommand|currentMagazine|currentMagazineDetail|currentMagazineDetailTurret|currentMagazineTurret|currentMuzzle|currentNamespace|currentTask|currentTasks|currentThrowable|currentVisionMode|currentWaypoint|currentWeapon|currentWeaponMode|currentWeaponTurret|currentZeroing|cursorObject|cursorTarget|customChat|customRadio|cutFadeOut|cutObj|cutRsc|cutText|damage|date|dateToNumber|daytime|deActivateKey|debriefingText|debugFSM|debugLog|deg|delete3DENEntities|deleteAt|deleteCenter|deleteCollection|deleteEditorObject|deleteGroup|deleteGroupWhenEmpty|deleteIdentity|deleteLocation|deleteMarker|deleteMarkerLocal|deleteRange|deleteResources|deleteSite|deleteStatus|deleteTeam|deleteVehicle|deleteVehicleCrew|deleteWaypoint|detach|detectedMines|diag_activeMissionFSMs|diag_activeScripts|diag_activeSQFScripts|diag_activeSQSScripts|diag_captureFrame|diag_captureFrameToFile|diag_captureSlowFrame|diag_codePerformance|diag_drawMode|diag_dynamicSimulationEnd|diag_enable|diag_enabled|diag_fps|diag_fpsMin|diag_frameNo|diag_lightNewLoad|diag_list|diag_log|diag_logSlowFrame|diag_mergeConfigFile|diag_recordTurretLimits|diag_setLightNew|diag_tickTime|diag_toggle|dialog|diarySubjectExists|didJIP|didJIPOwner|difficulty|difficultyEnabled|difficultyEnabledRTD|difficultyOption|direction|directSay|disableAI|disableCollisionWith|disableConversation|disableDebriefingStats|disableMapIndicators|disableNVGEquipment|disableRemoteSensors|disableSerialization|disableTIEquipment|disableUAVConnectability|disableUserInput|displayAddEventHandler|displayCtrl|displayNull|displayParent|displayRemoveAllEventHandlers|displayRemoveEventHandler|displaySetEventHandler|dissolveTeam|distance|distance2D|distanceSqr|distributionRegion|do3DENAction|doArtilleryFire|doFire|doFollow|doFSM|doGetOut|doMove|doorPhase|doStop|doSuppressiveFire|doTarget|doWatch|drawArrow|drawEllipse|drawIcon|drawIcon3D|drawLine|drawLine3D|drawLink|drawLocation|drawPolygon|drawRectangle|drawTriangle|driver|drop|dynamicSimulationDistance|dynamicSimulationDistanceCoef|dynamicSimulationEnabled|dynamicSimulationSystemEnabled|east|edit3DENMissionAttributes|editObject|editorSetEventHandler|effectiveCommander|emptyPositions|enableAI|enableAIFeature|enableAimPrecision|enableAttack|enableAudioFeature|enableAutoStartUpRTD|enableAutoTrimRTD|enableCamShake|enableCaustics|enableChannel|enableCollisionWith|enableCopilot|enableDebriefingStats|enableDiagLegend|enableDynamicSimulation|enableDynamicSimulationSystem|enableEndDialog|enableEngineArtillery|enableEnvironment|enableFatigue|enableGunLights|enableInfoPanelComponent|enableIRLasers|enableMimics|enablePersonTurret|enableRadio|enableReload|enableRopeAttach|enableSatNormalOnDetail|enableSaving|enableSentences|enableSimulation|enableSimulationGlobal|enableStamina|enableStressDamage|enableTeamSwitch|enableTraffic|enableUAVConnectability|enableUAVWaypoints|enableVehicleCargo|enableVehicleSensor|enableWeaponDisassembly|endl|endLoadingScreen|endMission|engineOn|enginesIsOnRTD|enginesPowerRTD|enginesRpmRTD|enginesTorqueRTD|entities|environmentEnabled|estimatedEndServerTime|estimatedTimeLeft|evalObjectArgument|everyBackpack|everyContainer|exec|execEditorScript|exp|expectedDestination|exportJIPMessages|eyeDirection|eyePos|face|faction|fadeMusic|fadeRadio|fadeSound|fadeSpeech|failMission|fillWeaponsFromPool|find|findCover|findDisplay|findEditorObject|findEmptyPosition|findEmptyPositionReady|findIf|findNearestEnemy|finishMissionInit|finite|fire|fireAtTarget|firstBackpack|flag|flagAnimationPhase|flagOwner|flagSide|flagTexture|fleeing|floor|flyInHeight|flyInHeightASL|fog|fogForecast|fogParams|forceAddUniform|forceAtPositionRTD|forcedMap|forceEnd|forceFlagTexture|forceFollowRoad|forceGeneratorRTD|forceMap|forceRespawn|forceSpeed|forceWalk|forceWeaponFire|forceWeatherChange|forgetTarget|format|formation|formationDirection|formationLeader|formationMembers|formationPosition|formationTask|formatText|formLeader|freeLook|fromEditor|fuel|fullCrew|gearIDCAmmoCount|gearSlotAmmoCount|gearSlotData|get3DENActionState|get3DENAttribute|get3DENCamera|get3DENConnections|get3DENEntity|get3DENEntityID|get3DENGrid|get3DENIconsVisible|get3DENLayerEntities|get3DENLinesVisible|get3DENMissionAttribute|get3DENMouseOver|get3DENSelected|getAimingCoef|getAllEnvSoundControllers|getAllHitPointsDamage|getAllOwnedMines|getAllSoundControllers|getAmmoCargo|getAnimAimPrecision|getAnimSpeedCoef|getArray|getArtilleryAmmo|getArtilleryComputerSettings|getArtilleryETA|getAssignedCuratorLogic|getAssignedCuratorUnit|getBackpackCargo|getBleedingRemaining|getBurningValue|getCameraViewDirection|getCargoIndex|getCenterOfMass|getClientState|getClientStateNumber|getCompatiblePylonMagazines|getConnectedUAV|getContainerMaxLoad|getCursorObjectParams|getCustomAimCoef|getDammage|getDescription|getDir|getDirVisual|getDLCAssetsUsage|getDLCAssetsUsageByName|getDLCs|getDLCUsageTime|getEditorCamera|getEditorMode|getEditorObjectScope|getElevationOffset|getEngineTargetRpmRTD|getEnvSoundController|getFatigue|getFieldManualStartPage|getForcedFlagTexture|getFriend|getFSMVariable|getFuelCargo|getGroupIcon|getGroupIconParams|getGroupIcons|getHideFrom|getHit|getHitIndex|getHitPointDamage|getItemCargo|getMagazineCargo|getMarkerColor|getMarkerPos|getMarkerSize|getMarkerType|getMass|getMissionConfig|getMissionConfigValue|getMissionDLCs|getMissionLayerEntities|getMissionLayers|getModelInfo|getMousePosition|getMusicPlayedTime|getNumber|getObjectArgument|getObjectChildren|getObjectDLC|getObjectMaterials|getObjectProxy|getObjectTextures|getObjectType|getObjectViewDistance|getOxygenRemaining|getPersonUsedDLCs|getPilotCameraDirection|getPilotCameraPosition|getPilotCameraRotation|getPilotCameraTarget|getPlateNumber|getPlayerChannel|getPlayerScores|getPlayerUID|getPlayerUIDOld|getPos|getPosASL|getPosASLVisual|getPosASLW|getPosATL|getPosATLVisual|getPosVisual|getPosWorld|getPylonMagazines|getRelDir|getRelPos|getRemoteSensorsDisabled|getRepairCargo|getResolution|getRotorBrakeRTD|getShadowDistance|getShotParents|getSlingLoad|getSoundController|getSoundControllerResult|getSpeed|getStamina|getStatValue|getSuppression|getTerrainGrid|getTerrainHeightASL|getText|getTotalDLCUsageTime|getTrimOffsetRTD|getUnitLoadout|getUnitTrait|getUserMFDText|getUserMFDValue|getVariable|getVehicleCargo|getWeaponCargo|getWeaponSway|getWingsOrientationRTD|getWingsPositionRTD|getWPPos|glanceAt|globalChat|globalRadio|goggles|group|groupChat|groupFromNetId|groupIconSelectable|groupIconsVisible|groupId|groupOwner|groupRadio|groupSelectedUnits|groupSelectUnit|grpNull|gunner|gusts|halt|handgunItems|handgunMagazine|handgunWeapon|handsHit|hasInterface|hasPilotCamera|hasWeapon|hcAllGroups|hcGroupParams|hcLeader|hcRemoveAllGroups|hcRemoveGroup|hcSelected|hcSelectGroup|hcSetGroup|hcShowBar|hcShownBar|headgear|hideBody|hideObject|hideObjectGlobal|hideSelection|hint|hintC|hintCadet|hintSilent|hmd|hostMission|htmlLoad|HUDMovementLevels|humidity|image|importAllGroups|importance|in|inArea|inAreaArray|incapacitatedState|independent|inflame|inflamed|infoPanel|infoPanelComponentEnabled|infoPanelComponents|infoPanels|inGameUISetEventHandler|inheritsFrom|initAmbientLife|inPolygon|inputAction|inRangeOfArtillery|insertEditorObject|intersect|is3DEN|is3DENMultiplayer|isAbleToBreathe|isAgent|isAimPrecisionEnabled|isArray|isAutoHoverOn|isAutonomous|isAutoStartUpEnabledRTD|isAutotest|isAutoTrimOnRTD|isBleeding|isBurning|isClass|isCollisionLightOn|isCopilotEnabled|isDamageAllowed|isDedicated|isDLCAvailable|isEngineOn|isEqualTo|isEqualType|isEqualTypeAll|isEqualTypeAny|isEqualTypeArray|isEqualTypeParams|isFilePatchingEnabled|isFlashlightOn|isFlatEmpty|isForcedWalk|isFormationLeader|isGroupDeletedWhenEmpty|isHidden|isInRemainsCollector|isInstructorFigureEnabled|isIRLaserOn|isKeyActive|isKindOf|isLaserOn|isLightOn|isLocalized|isManualFire|isMarkedForCollection|isMultiplayer|isMultiplayerSolo|isNil|isNull|isNumber|isObjectHidden|isObjectRTD|isOnRoad|isPipEnabled|isPlayer|isRealTime|isRemoteExecuted|isRemoteExecutedJIP|isServer|isShowing3DIcons|isSimpleObject|isSprintAllowed|isStaminaEnabled|isSteamMission|isStreamFriendlyUIEnabled|isStressDamageEnabled|isText|isTouchingGround|isTurnedOut|isTutHintsEnabled|isUAVConnectable|isUAVConnected|isUIContext|isUniformAllowed|isVehicleCargo|isVehicleRadarOn|isVehicleSensorEnabled|isWalking|isWeaponDeployed|isWeaponRested|itemCargo|items|itemsWithMagazines|join|joinAs|joinAsSilent|joinSilent|joinString|kbAddDatabase|kbAddDatabaseTargets|kbAddTopic|kbHasTopic|kbReact|kbRemoveTopic|kbTell|kbWasSaid|keyImage|keyName|knowsAbout|land|landAt|landResult|language|laserTarget|lbAdd|lbClear|lbColor|lbColorRight|lbCurSel|lbData|lbDelete|lbIsSelected|lbPicture|lbPictureRight|lbSelection|lbSetColor|lbSetColorRight|lbSetCurSel|lbSetData|lbSetPicture|lbSetPictureColor|lbSetPictureColorDisabled|lbSetPictureColorSelected|lbSetPictureRight|lbSetPictureRightColor|lbSetPictureRightColorDisabled|lbSetPictureRightColorSelected|lbSetSelectColor|lbSetSelectColorRight|lbSetSelected|lbSetText|lbSetTextRight|lbSetTooltip|lbSetValue|lbSize|lbSort|lbSortByValue|lbText|lbTextRight|lbValue|leader|leaderboardDeInit|leaderboardGetRows|leaderboardInit|leaderboardRequestRowsFriends|leaderboardRequestRowsGlobal|leaderboardRequestRowsGlobalAroundUser|leaderboardsRequestUploadScore|leaderboardsRequestUploadScoreKeepBest|leaderboardState|leaveVehicle|libraryCredits|libraryDisclaimers|lifeState|lightAttachObject|lightDetachObject|lightIsOn|lightnings|limitSpeed|linearConversion|lineBreak|lineIntersects|lineIntersectsObjs|lineIntersectsSurfaces|lineIntersectsWith|linkItem|list|listObjects|listRemoteTargets|listVehicleSensors|ln|lnbAddArray|lnbAddColumn|lnbAddRow|lnbClear|lnbColor|lnbColorRight|lnbCurSelRow|lnbData|lnbDeleteColumn|lnbDeleteRow|lnbGetColumnsPosition|lnbPicture|lnbPictureRight|lnbSetColor|lnbSetColorRight|lnbSetColumnsPos|lnbSetCurSelRow|lnbSetData|lnbSetPicture|lnbSetPictureColor|lnbSetPictureColorRight|lnbSetPictureColorSelected|lnbSetPictureColorSelectedRight|lnbSetPictureRight|lnbSetText|lnbSetTextRight|lnbSetValue|lnbSize|lnbSort|lnbSortByValue|lnbText|lnbTextRight|lnbValue|load|loadAbs|loadBackpack|loadFile|loadGame|loadIdentity|loadMagazine|loadOverlay|loadStatus|loadUniform|loadVest|local|localize|locationNull|locationPosition|lock|lockCameraTo|lockCargo|lockDriver|locked|lockedCargo|lockedDriver|lockedTurret|lockIdentity|lockTurret|lockWP|log|logEntities|logNetwork|logNetworkTerminate|lookAt|lookAtPos|magazineCargo|magazines|magazinesAllTurrets|magazinesAmmo|magazinesAmmoCargo|magazinesAmmoFull|magazinesDetail|magazinesDetailBackpack|magazinesDetailUniform|magazinesDetailVest|magazinesTurret|magazineTurretAmmo|mapAnimAdd|mapAnimClear|mapAnimCommit|mapAnimDone|mapCenterOnCamera|mapGridPosition|markAsFinishedOnSteam|markerAlpha|markerBrush|markerColor|markerDir|markerPos|markerShape|markerSize|markerText|markerType|max|members|menuAction|menuAdd|menuChecked|menuClear|menuCollapse|menuData|menuDelete|menuEnable|menuEnabled|menuExpand|menuHover|menuPicture|menuSetAction|menuSetCheck|menuSetData|menuSetPicture|menuSetValue|menuShortcut|menuShortcutText|menuSize|menuSort|menuText|menuURL|menuValue|min|mineActive|mineDetectedBy|missionConfigFile|missionDifficulty|missionName|missionNamespace|missionStart|missionVersion|modelToWorld|modelToWorldVisual|modelToWorldVisualWorld|modelToWorldWorld|modParams|moonIntensity|moonPhase|morale|move|move3DENCamera|moveInAny|moveInCargo|moveInCommander|moveInDriver|moveInGunner|moveInTurret|moveObjectToEnd|moveOut|moveTime|moveTo|moveToCompleted|moveToFailed|musicVolume|name|nameSound|nearEntities|nearestBuilding|nearestLocation|nearestLocations|nearestLocationWithDubbing|nearestObject|nearestObjects|nearestTerrainObjects|nearObjects|nearObjectsReady|nearRoads|nearSupplies|nearTargets|needReload|netId|netObjNull|newOverlay|nextMenuItemIndex|nextWeatherChange|nMenuItems|numberOfEnginesRTD|numberToDate|objectCurators|objectFromNetId|objectParent|objNull|objStatus|onBriefingGear|onBriefingGroup|onBriefingNotes|onBriefingPlan|onBriefingTeamSwitch|onCommandModeChanged|onDoubleClick|onEachFrame|onGroupIconClick|onGroupIconOverEnter|onGroupIconOverLeave|onHCGroupSelectionChanged|onMapSingleClick|onPlayerConnected|onPlayerDisconnected|onPreloadFinished|onPreloadStarted|onShowNewObject|onTeamSwitch|openCuratorInterface|openDLCPage|openDSInterface|openMap|openSteamApp|openYoutubeVideo|opfor|orderGetIn|overcast|overcastForecast|owner|param|params|parseNumber|parseSimpleArray|parseText|parsingNamespace|particlesQuality|pi|pickWeaponPool|pitch|pixelGrid|pixelGridBase|pixelGridNoUIScale|pixelH|pixelW|playableSlotsNumber|playableUnits|playAction|playActionNow|player|playerRespawnTime|playerSide|playersNumber|playGesture|playMission|playMove|playMoveNow|playMusic|playScriptedMission|playSound|playSound3D|position|positionCameraToWorld|posScreenToWorld|posWorldToScreen|ppEffectAdjust|ppEffectCommit|ppEffectCommitted|ppEffectCreate|ppEffectDestroy|ppEffectEnable|ppEffectEnabled|ppEffectForceInNVG|precision|preloadCamera|preloadObject|preloadSound|preloadTitleObj|preloadTitleRsc|primaryWeapon|primaryWeaponItems|primaryWeaponMagazine|priority|processDiaryLink|processInitCommands|productVersion|profileName|profileNamespace|profileNameSteam|progressLoadingScreen|progressPosition|progressSetPosition|publicVariable|publicVariableClient|publicVariableServer|pushBack|pushBackUnique|putWeaponPool|queryItemsPool|queryMagazinePool|queryWeaponPool|rad|radioChannelAdd|radioChannelCreate|radioChannelRemove|radioChannelSetCallSign|radioChannelSetLabel|radioVolume|rain|rainbow|random|rank|rankId|rating|rectangular|registeredTasks|registerTask|reload|reloadEnabled|remoteControl|remoteExec|remoteExecCall|remoteExecutedOwner|remove3DENConnection|remove3DENEventHandler|remove3DENLayer|removeAction|removeAll3DENEventHandlers|removeAllActions|removeAllAssignedItems|removeAllContainers|removeAllCuratorAddons|removeAllCuratorCameraAreas|removeAllCuratorEditingAreas|removeAllEventHandlers|removeAllHandgunItems|removeAllItems|removeAllItemsWithMagazines|removeAllMissionEventHandlers|removeAllMPEventHandlers|removeAllMusicEventHandlers|removeAllOwnedMines|removeAllPrimaryWeaponItems|removeAllWeapons|removeBackpack|removeBackpackGlobal|removeCuratorAddons|removeCuratorCameraArea|removeCuratorEditableObjects|removeCuratorEditingArea|removeDrawIcon|removeDrawLinks|removeEventHandler|removeFromRemainsCollector|removeGoggles|removeGroupIcon|removeHandgunItem|removeHeadgear|removeItem|removeItemFromBackpack|removeItemFromUniform|removeItemFromVest|removeItems|removeMagazine|removeMagazineGlobal|removeMagazines|removeMagazinesTurret|removeMagazineTurret|removeMenuItem|removeMissionEventHandler|removeMPEventHandler|removeMusicEventHandler|removeOwnedMine|removePrimaryWeaponItem|removeSecondaryWeaponItem|removeSimpleTask|removeSwitchableUnit|removeTeamMember|removeUniform|removeVest|removeWeapon|removeWeaponAttachmentCargo|removeWeaponCargo|removeWeaponGlobal|removeWeaponTurret|reportRemoteTarget|requiredVersion|resetCamShake|resetSubgroupDirection|resistance|resize|resources|respawnVehicle|restartEditorCamera|reveal|revealMine|reverse|reversedMouseY|roadAt|roadsConnectedTo|roleDescription|ropeAttachedObjects|ropeAttachedTo|ropeAttachEnabled|ropeAttachTo|ropeCreate|ropeCut|ropeDestroy|ropeDetach|ropeEndPosition|ropeLength|ropes|ropeUnwind|ropeUnwound|rotorsForcesRTD|rotorsRpmRTD|round|runInitScript|safeZoneH|safeZoneW|safeZoneWAbs|safeZoneX|safeZoneXAbs|safeZoneY|save3DENInventory|saveGame|saveIdentity|saveJoysticks|saveOverlay|saveProfileNamespace|saveStatus|saveVar|savingEnabled|say|say2D|say3D|score|scoreSide|screenshot|screenToWorld|scriptDone|scriptName|scriptNull|scudState|secondaryWeapon|secondaryWeaponItems|secondaryWeaponMagazine|select|selectBestPlaces|selectDiarySubject|selectedEditorObjects|selectEditorObject|selectionNames|selectionPosition|selectLeader|selectMax|selectMin|selectNoPlayer|selectPlayer|selectRandom|selectRandomWeighted|selectWeapon|selectWeaponTurret|sendAUMessage|sendSimpleCommand|sendTask|sendTaskResult|sendUDPMessage|serverCommand|serverCommandAvailable|serverCommandExecutable|serverName|serverTime|set|set3DENAttribute|set3DENAttributes|set3DENGrid|set3DENIconsVisible|set3DENLayer|set3DENLinesVisible|set3DENLogicType|set3DENMissionAttribute|set3DENMissionAttributes|set3DENModelsVisible|set3DENObjectType|set3DENSelected|setAccTime|setActualCollectiveRTD|setAirplaneThrottle|setAirportSide|setAmmo|setAmmoCargo|setAmmoOnPylon|setAnimSpeedCoef|setAperture|setApertureNew|setArmoryPoints|setAttributes|setAutonomous|setBehaviour|setBleedingRemaining|setBrakesRTD|setCameraInterest|setCamShakeDefParams|setCamShakeParams|setCamUseTI|setCaptive|setCenterOfMass|setCollisionLight|setCombatMode|setCompassOscillation|setConvoySeparation|setCuratorCameraAreaCeiling|setCuratorCoef|setCuratorEditingAreaType|setCuratorWaypointCost|setCurrentChannel|setCurrentTask|setCurrentWaypoint|setCustomAimCoef|setCustomWeightRTD|setDamage|setDammage|setDate|setDebriefingText|setDefaultCamera|setDestination|setDetailMapBlendPars|setDir|setDirection|setDrawIcon|setDriveOnPath|setDropInterval|setDynamicSimulationDistance|setDynamicSimulationDistanceCoef|setEditorMode|setEditorObjectScope|setEffectCondition|setEngineRpmRTD|setFace|setFaceAnimation|setFatigue|setFeatureType|setFlagAnimationPhase|setFlagOwner|setFlagSide|setFlagTexture|setFog|setForceGeneratorRTD|setFormation|setFormationTask|setFormDir|setFriend|setFromEditor|setFSMVariable|setFuel|setFuelCargo|setGroupIcon|setGroupIconParams|setGroupIconsSelectable|setGroupIconsVisible|setGroupId|setGroupIdGlobal|setGroupOwner|setGusts|setHideBehind|setHit|setHitIndex|setHitPointDamage|setHorizonParallaxCoef|setHUDMovementLevels|setIdentity|setImportance|setInfoPanel|setLeader|setLightAmbient|setLightAttenuation|setLightBrightness|setLightColor|setLightDayLight|setLightFlareMaxDistance|setLightFlareSize|setLightIntensity|setLightnings|setLightUseFlare|setLocalWindParams|setMagazineTurretAmmo|setMarkerAlpha|setMarkerAlphaLocal|setMarkerBrush|setMarkerBrushLocal|setMarkerColor|setMarkerColorLocal|setMarkerDir|setMarkerDirLocal|setMarkerPos|setMarkerPosLocal|setMarkerShape|setMarkerShapeLocal|setMarkerSize|setMarkerSizeLocal|setMarkerText|setMarkerTextLocal|setMarkerType|setMarkerTypeLocal|setMass|setMimic|setMousePosition|setMusicEffect|setMusicEventHandler|setName|setNameSound|setObjectArguments|setObjectMaterial|setObjectMaterialGlobal|setObjectProxy|setObjectTexture|setObjectTextureGlobal|setObjectViewDistance|setOvercast|setOwner|setOxygenRemaining|setParticleCircle|setParticleClass|setParticleFire|setParticleParams|setParticleRandom|setPilotCameraDirection|setPilotCameraRotation|setPilotCameraTarget|setPilotLight|setPiPEffect|setPitch|setPlateNumber|setPlayable|setPlayerRespawnTime|setPos|setPosASL|setPosASL2|setPosASLW|setPosATL|setPosition|setPosWorld|setPylonLoadOut|setPylonsPriority|setRadioMsg|setRain|setRainbow|setRandomLip|setRank|setRectangular|setRepairCargo|setRotorBrakeRTD|setShadowDistance|setShotParents|setSide|setSimpleTaskAlwaysVisible|setSimpleTaskCustomData|setSimpleTaskDescription|setSimpleTaskDestination|setSimpleTaskTarget|setSimpleTaskType|setSimulWeatherLayers|setSize|setSkill|setSlingLoad|setSoundEffect|setSpeaker|setSpeech|setSpeedMode|setStamina|setStaminaScheme|setStatValue|setSuppression|setSystemOfUnits|setTargetAge|setTaskMarkerOffset|setTaskResult|setTaskState|setTerrainGrid|setText|setTimeMultiplier|setTitleEffect|setToneMapping|setToneMappingParams|setTrafficDensity|setTrafficDistance|setTrafficGap|setTrafficSpeed|setTriggerActivation|setTriggerArea|setTriggerStatements|setTriggerText|setTriggerTimeout|setTriggerType|setType|setUnconscious|setUnitAbility|setUnitLoadout|setUnitPos|setUnitPosWeak|setUnitRank|setUnitRecoilCoefficient|setUnitTrait|setUnloadInCombat|setUserActionText|setUserMFDText|setUserMFDValue|setVariable|setVectorDir|setVectorDirAndUp|setVectorUp|setVehicleAmmo|setVehicleAmmoDef|setVehicleArmor|setVehicleCargo|setVehicleId|setVehicleInit|setVehicleLock|setVehiclePosition|setVehicleRadar|setVehicleReceiveRemoteTargets|setVehicleReportOwnPosition|setVehicleReportRemoteTargets|setVehicleTIPars|setVehicleVarName|setVelocity|setVelocityModelSpace|setVelocityTransformation|setViewDistance|setVisibleIfTreeCollapsed|setWantedRpmRTD|setWaves|setWaypointBehaviour|setWaypointCombatMode|setWaypointCompletionRadius|setWaypointDescription|setWaypointForceBehaviour|setWaypointFormation|setWaypointHousePosition|setWaypointLoiterRadius|setWaypointLoiterType|setWaypointName|setWaypointPosition|setWaypointScript|setWaypointSpeed|setWaypointStatements|setWaypointTimeout|setWaypointType|setWaypointVisible|setWeaponReloadingTime|setWind|setWindDir|setWindForce|setWindStr|setWingForceScaleRTD|setWPPos|show3DIcons|showChat|showCinemaBorder|showCommandingMenu|showCompass|showCuratorCompass|showGPS|showHUD|showLegend|showMap|shownArtilleryComputer|shownChat|shownCompass|shownCuratorCompass|showNewEditorObject|shownGPS|shownHUD|shownMap|shownPad|shownRadio|shownScoretable|shownUAVFeed|shownWarrant|shownWatch|showPad|showRadio|showScoretable|showSubtitles|showUAVFeed|showWarrant|showWatch|showWaypoint|showWaypoints|side|sideAmbientLife|sideChat|sideEmpty|sideEnemy|sideFriendly|sideLogic|sideRadio|sideUnknown|simpleTasks|simulationEnabled|simulCloudDensity|simulCloudOcclusion|simulInClouds|simulWeatherSync|sin|size|sizeOf|skill|skillFinal|skipTime|sleep|sliderPosition|sliderRange|sliderSetPosition|sliderSetRange|sliderSetSpeed|sliderSpeed|slingLoadAssistantShown|soldierMagazines|someAmmo|sort|soundVolume|speaker|speed|speedMode|splitString|sqrt|squadParams|stance|startLoadingScreen|stop|stopEngineRTD|stopped|str|sunOrMoon|supportInfo|suppressFor|surfaceIsWater|surfaceNormal|surfaceType|swimInDepth|switchableUnits|switchAction|switchCamera|switchGesture|switchLight|switchMove|synchronizedObjects|synchronizedTriggers|synchronizedWaypoints|synchronizeObjectsAdd|synchronizeObjectsRemove|synchronizeTrigger|synchronizeWaypoint|systemChat|systemOfUnits|tan|targetKnowledge|targets|targetsAggregate|targetsQuery|taskAlwaysVisible|taskChildren|taskCompleted|taskCustomData|taskDescription|taskDestination|taskHint|taskMarkerOffset|taskNull|taskParent|taskResult|taskState|taskType|teamMember|teamMemberNull|teamName|teams|teamSwitch|teamSwitchEnabled|teamType|terminate|terrainIntersect|terrainIntersectASL|terrainIntersectAtASL|text|textLog|textLogFormat|tg|time|timeMultiplier|titleCut|titleFadeOut|titleObj|titleRsc|titleText|toArray|toFixed|toLower|toString|toUpper|triggerActivated|triggerActivation|triggerArea|triggerAttachedVehicle|triggerAttachObject|triggerAttachVehicle|triggerDynamicSimulation|triggerStatements|triggerText|triggerTimeout|triggerTimeoutCurrent|triggerType|turretLocal|turretOwner|turretUnit|tvAdd|tvClear|tvCollapse|tvCollapseAll|tvCount|tvCurSel|tvData|tvDelete|tvExpand|tvExpandAll|tvPicture|tvPictureRight|tvSetColor|tvSetCurSel|tvSetData|tvSetPicture|tvSetPictureColor|tvSetPictureColorDisabled|tvSetPictureColorSelected|tvSetPictureRight|tvSetPictureRightColor|tvSetPictureRightColorDisabled|tvSetPictureRightColorSelected|tvSetSelectColor|tvSetText|tvSetTooltip|tvSetValue|tvSort|tvSortByValue|tvText|tvTooltip|tvValue|type|typeName|typeOf|UAVControl|uiNamespace|uiSleep|unassignCurator|unassignItem|unassignTeam|unassignVehicle|underwater|uniform|uniformContainer|uniformItems|uniformMagazines|unitAddons|unitAimPosition|unitAimPositionVisual|unitBackpack|unitIsUAV|unitPos|unitReady|unitRecoilCoefficient|units|unitsBelowHeight|unlinkItem|unlockAchievement|unregisterTask|updateDrawIcon|updateMenuItem|updateObjectTree|useAIOperMapObstructionTest|useAISteeringComponent|useAudioTimeForMoves|userInputDisabled|vectorAdd|vectorCos|vectorCrossProduct|vectorDiff|vectorDir|vectorDirVisual|vectorDistance|vectorDistanceSqr|vectorDotProduct|vectorFromTo|vectorMagnitude|vectorMagnitudeSqr|vectorModelToWorld|vectorModelToWorldVisual|vectorMultiply|vectorNormalized|vectorUp|vectorUpVisual|vectorWorldToModel|vectorWorldToModelVisual|vehicle|vehicleCargoEnabled|vehicleChat|vehicleRadio|vehicleReceiveRemoteTargets|vehicleReportOwnPosition|vehicleReportRemoteTargets|vehicles|vehicleVarName|velocity|velocityModelSpace|verifySignature|vest|vestContainer|vestItems|vestMagazines|viewDistance|visibleCompass|visibleGPS|visibleMap|visiblePosition|visiblePositionASL|visibleScoretable|visibleWatch|waitUntil|waves|waypointAttachedObject|waypointAttachedVehicle|waypointAttachObject|waypointAttachVehicle|waypointBehaviour|waypointCombatMode|waypointCompletionRadius|waypointDescription|waypointForceBehaviour|waypointFormation|waypointHousePosition|waypointLoiterRadius|waypointLoiterType|waypointName|waypointPosition|waypoints|waypointScript|waypointsEnabledUAV|waypointShow|waypointSpeed|waypointStatements|waypointTimeout|waypointTimeoutCurrent|waypointType|waypointVisible|weaponAccessories|weaponAccessoriesCargo|weaponCargo|weaponDirection|weaponInertia|weaponLowered|weapons|weaponsItems|weaponsItemsCargo|weaponState|weaponsTurret|weightRTD|west|WFSideText|wind|windDir|windRTD|windStr|wingsForcesRTD|worldName|worldSize|worldToModel|worldToModelVisual|worldToScreen)\b/i,number:/(?:\$|\b0x)[\da-f]+\b|(?:\B\.\d+|\b\d+(?:\.\d+)?)(?:e[+-]?\d+)?\b/i,operator:/##|>>|&&|\|\||[!=<>]=?|[-+*/%#^]|\b(?:and|mod|not|or)\b/i,"magic-variable":{pattern:/\b(?:this|thisList|thisTrigger|_exception|_fnc_scriptName|_fnc_scriptNameParent|_forEachIndex|_this|_thisEventHandler|_thisFSM|_thisScript|_x)\b/i,alias:"keyword"},constant:/\bDIK(?:_[a-z\d]+)+\b/i}),t.languages.insertBefore("sqf","string",{macro:{pattern:/(^[ \t]*)#[a-z](?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{directive:{pattern:/#[a-z]+\b/i,alias:"keyword"},comment:t.languages.sqf.comment}}}),delete t.languages.sqf["class-name"]}return P0}var $0,_M;function qSe(){if(_M)return $0;_M=1,$0=e,e.displayName="squirrel",e.aliases=[];function e(t){t.languages.squirrel=t.languages.extend("clike",{comment:[t.languages.clike.comment[0],{pattern:/(^|[^\\:])(?:\/\/|#).*/,lookbehind:!0,greedy:!0}],string:{pattern:/(^|[^\\"'@])(?:@"(?:[^"]|"")*"(?!")|"(?:[^\\\r\n"]|\\.)*")/,lookbehind:!0,greedy:!0},"class-name":{pattern:/(\b(?:class|enum|extends|instanceof)\s+)\w+(?:\.\w+)*/,lookbehind:!0,inside:{punctuation:/\./}},keyword:/\b(?:__FILE__|__LINE__|base|break|case|catch|class|clone|const|constructor|continue|default|delete|else|enum|extends|for|foreach|function|if|in|instanceof|local|null|resume|return|static|switch|this|throw|try|typeof|while|yield)\b/,number:/\b(?:0x[0-9a-fA-F]+|\d+(?:\.(?:\d+|[eE][+-]?\d+))?)\b/,operator:/\+\+|--|<=>|<[-<]|>>>?|&&?|\|\|?|[-+*/%!=<>]=?|[~^]|::?/,punctuation:/[(){}\[\],;.]/}),t.languages.insertBefore("squirrel","string",{char:{pattern:/(^|[^\\"'])'(?:[^\\']|\\(?:[xuU][0-9a-fA-F]{0,8}|[\s\S]))'/,lookbehind:!0,greedy:!0}}),t.languages.insertBefore("squirrel","operator",{"attribute-punctuation":{pattern:/<\/|\/>/,alias:"important"},lambda:{pattern:/@(?=\()/,alias:"operator"}})}return $0}var F0,AM;function GSe(){if(AM)return F0;AM=1,F0=e,e.displayName="stan",e.aliases=[];function e(t){(function(n){var r=/\b(?:algebra_solver|algebra_solver_newton|integrate_1d|integrate_ode|integrate_ode_bdf|integrate_ode_rk45|map_rect|ode_(?:adams|bdf|ckrk|rk45)(?:_tol)?|ode_adjoint_tol_ctl|reduce_sum|reduce_sum_static)\b/;n.languages.stan={comment:/\/\/.*|\/\*[\s\S]*?\*\/|#(?!include).*/,string:{pattern:/"[\x20\x21\x23-\x5B\x5D-\x7E]*"/,greedy:!0},directive:{pattern:/^([ \t]*)#include\b.*/m,lookbehind:!0,alias:"property"},"function-arg":{pattern:RegExp("("+r.source+/\s*\(\s*/.source+")"+/[a-zA-Z]\w*/.source),lookbehind:!0,alias:"function"},constraint:{pattern:/(\b(?:int|matrix|real|row_vector|vector)\s*)<[^<>]*>/,lookbehind:!0,inside:{expression:{pattern:/(=\s*)\S(?:\S|\s+(?!\s))*?(?=\s*(?:>$|,\s*\w+\s*=))/,lookbehind:!0,inside:null},property:/\b[a-z]\w*(?=\s*=)/i,operator:/=/,punctuation:/^<|>$|,/}},keyword:[{pattern:/\bdata(?=\s*\{)|\b(?:functions|generated|model|parameters|quantities|transformed)\b/,alias:"program-block"},/\b(?:array|break|cholesky_factor_corr|cholesky_factor_cov|complex|continue|corr_matrix|cov_matrix|data|else|for|if|in|increment_log_prob|int|matrix|ordered|positive_ordered|print|real|reject|return|row_vector|simplex|target|unit_vector|vector|void|while)\b/,r],function:/\b[a-z]\w*(?=\s*\()/i,number:/(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:E[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,boolean:/\b(?:false|true)\b/,operator:/<-|\.[*/]=?|\|\|?|&&|[!=<>+\-*/]=?|['^%~?:]/,punctuation:/[()\[\]{},;]/},n.languages.stan.constraint.inside.expression.inside=n.languages.stan})(t)}return F0}var j0,TM;function WSe(){if(TM)return j0;TM=1,j0=e,e.displayName="stylus",e.aliases=[];function e(t){(function(n){var r={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},o={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:a,punctuation:/[{}()\[\];:,]/};o.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:o}},o.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:o}},n.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:o}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:o}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:o}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:o.interpolation}},rest:o}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:o.interpolation,comment:o.comment,punctuation:/[{},]/}},func:o.func,string:o.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:o.interpolation,punctuation:/[{}()\[\];:.]/}})(t)}return j0}var z0,RM;function KSe(){if(RM)return z0;RM=1,z0=e,e.displayName="swift",e.aliases=[];function e(t){t.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp(/(^|[^"#])/.source+"(?:"+/"(?:\\(?:\((?:[^()]|\([^()]*\))*\)|\r\n|[^(])|[^\\\r\n"])*"/.source+"|"+/"""(?:\\(?:\((?:[^()]|\([^()]*\))*\)|[^(])|[^\\"]|"(?!""))*"""/.source+")"+/(?!["#])/.source),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp(/(^|[^"#])(#+)/.source+"(?:"+/"(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|\r\n|[^#])|[^\\\r\n])*?"/.source+"|"+/"""(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|[^#])|[^\\])*?"""/.source+")\\2"),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp(/#/.source+"(?:"+(/(?:elseif|if)\b/.source+"(?:[ ]*"+/(?:![ \t]*)?(?:\b\w+\b(?:[ \t]*\((?:[^()]|\([^()]*\))*\))?|\((?:[^()]|\([^()]*\))*\))(?:[ \t]*(?:&&|\|\|))?/.source+")+")+"|"+/(?:else|endif)\b/.source+")"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},t.languages.swift["string-literal"].forEach(function(n){n.inside.interpolation.inside=t.languages.swift})}return z0}var U0,NM;function YSe(){if(NM)return U0;NM=1,U0=e,e.displayName="systemd",e.aliases=[];function e(t){(function(n){var r={pattern:/^[;#].*/m,greedy:!0},a=/"(?:[^\r\n"\\]|\\(?:[^\r]|\r\n?))*"(?!\S)/.source;n.languages.systemd={comment:r,section:{pattern:/^\[[^\n\r\[\]]*\](?=[ \t]*$)/m,greedy:!0,inside:{punctuation:/^\[|\]$/,"section-name":{pattern:/[\s\S]+/,alias:"selector"}}},key:{pattern:/^[^\s=]+(?=[ \t]*=)/m,greedy:!0,alias:"attr-name"},value:{pattern:RegExp(/(=[ \t]*(?!\s))/.source+"(?:"+a+`|(?=[^"\r -]))(?:`+(/[^\s\\]/.source+'|[ ]+(?:(?![ "])|'+a+")|"+/\\[\r\n]+(?:[#;].*[\r\n]+)*(?![#;])/.source)+")*"),lookbehind:!0,greedy:!0,alias:"attr-value",inside:{comment:r,quoted:{pattern:RegExp(/(^|\s)/.source+a),lookbehind:!0,greedy:!0},punctuation:/\\$/m,boolean:{pattern:/^(?:false|no|off|on|true|yes)$/,greedy:!0}}},punctuation:/=/}})(t)}return U0}var B0,IM;function MA(){if(IM)return B0;IM=1,B0=e,e.displayName="t4Templating",e.aliases=[];function e(t){(function(n){function r(o,i,s){return{pattern:RegExp("<#"+o+"[\\s\\S]*?#>"),alias:"block",inside:{delimiter:{pattern:RegExp("^<#"+o+"|#>$"),alias:"important"},content:{pattern:/[\s\S]+/,inside:i,alias:s}}}}function a(o){var i=n.languages[o],s="language-"+o;return{block:{pattern:/<#[\s\S]+?#>/,inside:{directive:r("@",{"attr-value":{pattern:/=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/,inside:{punctuation:/^=|^["']|["']$/}},keyword:/\b\w+(?=\s)/,"attr-name":/\b\w+/}),expression:r("=",i,s),"class-feature":r("\\+",i,s),standard:r("",i,s)}}}}n.languages["t4-templating"]=Object.defineProperty({},"createT4",{value:a})})(t)}return B0}var H0,OM;function ZSe(){if(OM)return H0;OM=1;var e=MA(),t=_h();H0=n,n.displayName="t4Cs",n.aliases=[];function n(r){r.register(e),r.register(t),r.languages.t4=r.languages["t4-cs"]=r.languages["t4-templating"].createT4("csharp")}return H0}var V0,DM;function lz(){if(DM)return V0;DM=1;var e=az();V0=t,t.displayName="vbnet",t.aliases=[];function t(n){n.register(e),n.languages.vbnet=n.languages.extend("basic",{comment:[{pattern:/(?:!|REM\b).+/i,inside:{keyword:/^REM/i}},{pattern:/(^|[^\\:])'.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(^|[^"])"(?:""|[^"])*"(?!")/,lookbehind:!0,greedy:!0},keyword:/(?:\b(?:ADDHANDLER|ADDRESSOF|ALIAS|AND|ANDALSO|AS|BEEP|BLOAD|BOOLEAN|BSAVE|BYREF|BYTE|BYVAL|CALL(?: ABSOLUTE)?|CASE|CATCH|CBOOL|CBYTE|CCHAR|CDATE|CDBL|CDEC|CHAIN|CHAR|CHDIR|CINT|CLASS|CLEAR|CLNG|CLOSE|CLS|COBJ|COM|COMMON|CONST|CONTINUE|CSBYTE|CSHORT|CSNG|CSTR|CTYPE|CUINT|CULNG|CUSHORT|DATA|DATE|DECIMAL|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DEFAULT|DELEGATE|DIM|DIRECTCAST|DO|DOUBLE|ELSE|ELSEIF|END|ENUM|ENVIRON|ERASE|ERROR|EVENT|EXIT|FALSE|FIELD|FILES|FINALLY|FOR(?: EACH)?|FRIEND|FUNCTION|GET|GETTYPE|GETXMLNAMESPACE|GLOBAL|GOSUB|GOTO|HANDLES|IF|IMPLEMENTS|IMPORTS|IN|INHERITS|INPUT|INTEGER|INTERFACE|IOCTL|IS|ISNOT|KEY|KILL|LET|LIB|LIKE|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|ME|MKDIR|MOD|MODULE|MUSTINHERIT|MUSTOVERRIDE|MYBASE|MYCLASS|NAME|NAMESPACE|NARROWING|NEW|NEXT|NOT|NOTHING|NOTINHERITABLE|NOTOVERRIDABLE|OBJECT|OF|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPERATOR|OPTION(?: BASE)?|OPTIONAL|OR|ORELSE|OUT|OVERLOADS|OVERRIDABLE|OVERRIDES|PARAMARRAY|PARTIAL|POKE|PRIVATE|PROPERTY|PROTECTED|PUBLIC|PUT|RAISEEVENT|READ|READONLY|REDIM|REM|REMOVEHANDLER|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SBYTE|SELECT(?: CASE)?|SET|SHADOWS|SHARED|SHELL|SHORT|SINGLE|SLEEP|STATIC|STEP|STOP|STRING|STRUCTURE|SUB|SWAP|SYNCLOCK|SYSTEM|THEN|THROW|TIMER|TO|TROFF|TRON|TRUE|TRY|TRYCAST|TYPE|TYPEOF|UINTEGER|ULONG|UNLOCK|UNTIL|USHORT|USING|VIEW PRINT|WAIT|WEND|WHEN|WHILE|WIDENING|WITH|WITHEVENTS|WRITE|WRITEONLY|XOR)|\B(?:#CONST|#ELSE|#ELSEIF|#END|#IF))(?:\$|\b)/i,punctuation:/[,;:(){}]/})}return V0}var q0,LM;function XSe(){if(LM)return q0;LM=1;var e=MA(),t=lz();q0=n,n.displayName="t4Vb",n.aliases=[];function n(r){r.register(e),r.register(t),r.languages["t4-vb"]=r.languages["t4-templating"].createT4("vbnet")}return q0}var G0,MM;function cz(){if(MM)return G0;MM=1,G0=e,e.displayName="yaml",e.aliases=["yml"];function e(t){(function(n){var r=/[*&][^\s[\]{},]+/,a=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,o="(?:"+a.source+"(?:[ ]+"+r.source+")?|"+r.source+"(?:[ ]+"+a.source+")?)",i=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source}),s=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function l(c,u){u=(u||"").replace(/m/g,"")+"m";var d=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,function(){return o}).replace(/<>/g,function(){return c});return RegExp(d,u)}n.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,function(){return o})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,function(){return o}).replace(/<>/g,function(){return"(?:"+i+"|"+s+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:l(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:l(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:l(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:l(s),lookbehind:!0,greedy:!0},number:{pattern:l(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:a,important:r,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},n.languages.yml=n.languages.yaml})(t)}return G0}var W0,PM;function QSe(){if(PM)return W0;PM=1;var e=cz();W0=t,t.displayName="tap",t.aliases=[];function t(n){n.register(e),n.languages.tap={fail:/not ok[^#{\n\r]*/,pass:/ok[^#{\n\r]*/,pragma:/pragma [+-][a-z]+/,bailout:/bail out!.*/i,version:/TAP version \d+/i,plan:/\b\d+\.\.\d+(?: +#.*)?/,subtest:{pattern:/# Subtest(?:: .*)?/,greedy:!0},punctuation:/[{}]/,directive:/#.*/,yamlish:{pattern:/(^[ \t]*)---[\s\S]*?[\r\n][ \t]*\.\.\.$/m,lookbehind:!0,inside:n.languages.yaml,alias:"language-yaml"}}}return W0}var K0,$M;function JSe(){if($M)return K0;$M=1,K0=e,e.displayName="tcl",e.aliases=[];function e(t){t.languages.tcl={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},string:{pattern:/"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*"/,greedy:!0},variable:[{pattern:/(\$)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/,lookbehind:!0},{pattern:/(\$)\{[^}]+\}/,lookbehind:!0},{pattern:/(^[\t ]*set[ \t]+)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/m,lookbehind:!0}],function:{pattern:/(^[\t ]*proc[ \t]+)\S+/m,lookbehind:!0},builtin:[{pattern:/(^[\t ]*)(?:break|class|continue|error|eval|exit|for|foreach|if|proc|return|switch|while)\b/m,lookbehind:!0},/\b(?:else|elseif)\b/],scope:{pattern:/(^[\t ]*)(?:global|upvar|variable)\b/m,lookbehind:!0,alias:"constant"},keyword:{pattern:/(^[\t ]*|\[)(?:Safe_Base|Tcl|after|append|apply|array|auto_(?:execok|import|load|mkindex|qualify|reset)|automkindex_old|bgerror|binary|catch|cd|chan|clock|close|concat|dde|dict|encoding|eof|exec|expr|fblocked|fconfigure|fcopy|file(?:event|name)?|flush|gets|glob|history|http|incr|info|interp|join|lappend|lassign|lindex|linsert|list|llength|load|lrange|lrepeat|lreplace|lreverse|lsearch|lset|lsort|math(?:func|op)|memory|msgcat|namespace|open|package|parray|pid|pkg_mkIndex|platform|puts|pwd|re_syntax|read|refchan|regexp|registry|regsub|rename|scan|seek|set|socket|source|split|string|subst|tcl(?:_endOfWord|_findLibrary|startOf(?:Next|Previous)Word|test|vars|wordBreak(?:After|Before))|tell|time|tm|trace|unknown|unload|unset|update|uplevel|vwait)\b/m,lookbehind:!0},operator:/!=?|\*\*?|==|&&?|\|\|?|<[=<]?|>[=>]?|[-+~\/%?^]|\b(?:eq|in|ne|ni)\b/,punctuation:/[{}()\[\]]/}}return K0}var Y0,FM;function ewe(){if(FM)return Y0;FM=1,Y0=e,e.displayName="textile",e.aliases=[];function e(t){(function(n){var r=/\([^|()\n]+\)|\[[^\]\n]+\]|\{[^}\n]+\}/.source,a=/\)|\((?![^|()\n]+\))/.source;function o(g,m){return RegExp(g.replace(//g,function(){return"(?:"+r+")"}).replace(//g,function(){return"(?:"+a+")"}),m||"")}var i={css:{pattern:/\{[^{}]+\}/,inside:{rest:n.languages.css}},"class-id":{pattern:/(\()[^()]+(?=\))/,lookbehind:!0,alias:"attr-value"},lang:{pattern:/(\[)[^\[\]]+(?=\])/,lookbehind:!0,alias:"attr-value"},punctuation:/[\\\/]\d+|\S/},s=n.languages.textile=n.languages.extend("markup",{phrase:{pattern:/(^|\r|\n)\S[\s\S]*?(?=$|\r?\n\r?\n|\r\r)/,lookbehind:!0,inside:{"block-tag":{pattern:o(/^[a-z]\w*(?:||[<>=])*\./.source),inside:{modifier:{pattern:o(/(^[a-z]\w*)(?:||[<>=])+(?=\.)/.source),lookbehind:!0,inside:i},tag:/^[a-z]\w*/,punctuation:/\.$/}},list:{pattern:o(/^[*#]+*\s+\S.*/.source,"m"),inside:{modifier:{pattern:o(/(^[*#]+)+/.source),lookbehind:!0,inside:i},punctuation:/^[*#]+/}},table:{pattern:o(/^(?:(?:||[<>=^~])+\.\s*)?(?:\|(?:(?:||[<>=^~_]|[\\/]\d+)+\.|(?!(?:||[<>=^~_]|[\\/]\d+)+\.))[^|]*)+\|/.source,"m"),inside:{modifier:{pattern:o(/(^|\|(?:\r?\n|\r)?)(?:||[<>=^~_]|[\\/]\d+)+(?=\.)/.source),lookbehind:!0,inside:i},punctuation:/\||^\./}},inline:{pattern:o(/(^|[^a-zA-Z\d])(\*\*|__|\?\?|[*_%@+\-^~])*.+?\2(?![a-zA-Z\d])/.source),lookbehind:!0,inside:{bold:{pattern:o(/(^(\*\*?)*).+?(?=\2)/.source),lookbehind:!0},italic:{pattern:o(/(^(__?)*).+?(?=\2)/.source),lookbehind:!0},cite:{pattern:o(/(^\?\?*).+?(?=\?\?)/.source),lookbehind:!0,alias:"string"},code:{pattern:o(/(^@*).+?(?=@)/.source),lookbehind:!0,alias:"keyword"},inserted:{pattern:o(/(^\+*).+?(?=\+)/.source),lookbehind:!0},deleted:{pattern:o(/(^-*).+?(?=-)/.source),lookbehind:!0},span:{pattern:o(/(^%*).+?(?=%)/.source),lookbehind:!0},modifier:{pattern:o(/(^\*\*|__|\?\?|[*_%@+\-^~])+/.source),lookbehind:!0,inside:i},punctuation:/[*_%?@+\-^~]+/}},"link-ref":{pattern:/^\[[^\]]+\]\S+$/m,inside:{string:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0},url:{pattern:/(^\])\S+$/,lookbehind:!0},punctuation:/[\[\]]/}},link:{pattern:o(/"*[^"]+":.+?(?=[^\w/]?(?:\s|$))/.source),inside:{text:{pattern:o(/(^"*)[^"]+(?=")/.source),lookbehind:!0},modifier:{pattern:o(/(^")+/.source),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[":]/}},image:{pattern:o(/!(?:||[<>=])*(?![<>=])[^!\s()]+(?:\([^)]+\))?!(?::.+?(?=[^\w/]?(?:\s|$)))?/.source),inside:{source:{pattern:o(/(^!(?:||[<>=])*)(?![<>=])[^!\s()]+(?:\([^)]+\))?(?=!)/.source),lookbehind:!0,alias:"url"},modifier:{pattern:o(/(^!)(?:||[<>=])+/.source),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[!:]/}},footnote:{pattern:/\b\[\d+\]/,alias:"comment",inside:{punctuation:/\[|\]/}},acronym:{pattern:/\b[A-Z\d]+\([^)]+\)/,inside:{comment:{pattern:/(\()[^()]+(?=\))/,lookbehind:!0},punctuation:/[()]/}},mark:{pattern:/\b\((?:C|R|TM)\)/,alias:"comment",inside:{punctuation:/[()]/}}}}}),l=s.phrase.inside,c={inline:l.inline,link:l.link,image:l.image,footnote:l.footnote,acronym:l.acronym,mark:l.mark};s.tag.pattern=/<\/?(?!\d)[a-z0-9]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i;var u=l.inline.inside;u.bold.inside=c,u.italic.inside=c,u.inserted.inside=c,u.deleted.inside=c,u.span.inside=c;var d=l.table.inside;d.inline=c.inline,d.link=c.link,d.image=c.image,d.footnote=c.footnote,d.acronym=c.acronym,d.mark=c.mark})(t)}return Y0}var Z0,jM;function twe(){if(jM)return Z0;jM=1,Z0=e,e.displayName="toml",e.aliases=[];function e(t){(function(n){var r=/(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;function a(o){return o.replace(/__/g,function(){return r})}n.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(a(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(a(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}})(t)}return Z0}var X0,zM;function nwe(){if(zM)return X0;zM=1,X0=e,e.displayName="tremor",e.aliases=[];function e(t){(function(n){n.languages.tremor={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},"interpolated-string":null,extractor:{pattern:/\b[a-z_]\w*\|(?:[^\r\n\\|]|\\(?:\r\n|[\s\S]))*\|/i,greedy:!0,inside:{regex:{pattern:/(^re)\|[\s\S]+/,lookbehind:!0},function:/^\w+/,value:/\|[\s\S]+/}},identifier:{pattern:/`[^`]*`/,greedy:!0},function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())\b/,keyword:/\b(?:args|as|by|case|config|connect|connector|const|copy|create|default|define|deploy|drop|each|emit|end|erase|event|flow|fn|for|from|group|having|insert|into|intrinsic|let|links|match|merge|mod|move|of|operator|patch|pipeline|recur|script|select|set|sliding|state|stream|to|tumbling|update|use|when|where|window|with)\b/,boolean:/\b(?:false|null|true)\b/i,number:/\b(?:0b[01_]*|0x[0-9a-fA-F_]*|\d[\d_]*(?:\.\d[\d_]*)?(?:[Ee][+-]?[\d_]+)?)\b/,"pattern-punctuation":{pattern:/%(?=[({[])/,alias:"punctuation"},operator:/[-+*\/%~!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?>?=?|(?:absent|and|not|or|present|xor)\b/,punctuation:/::|[;\[\]()\{\},.:]/};var r=/#\{(?:[^"{}]|\{[^{}]*\}|"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*")*\}/.source;n.languages.tremor["interpolated-string"]={pattern:RegExp(/(^|[^\\])/.source+'(?:"""(?:'+/[^"\\#]|\\[\s\S]|"(?!"")|#(?!\{)/.source+"|"+r+')*"""|"(?:'+/[^"\\\r\n#]|\\(?:\r\n|[\s\S])|#(?!\{)/.source+"|"+r+')*")'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:RegExp(r),inside:{punctuation:/^#\{|\}$/,expression:{pattern:/[\s\S]+/,inside:n.languages.tremor}}},string:/[\s\S]+/}},n.languages.troy=n.languages.tremor,n.languages.trickle=n.languages.tremor})(t)}return X0}var Q0,UM;function rwe(){if(UM)return Q0;UM=1;var e=iz(),t=OA();Q0=n,n.displayName="tsx",n.aliases=[];function n(r){r.register(e),r.register(t),function(a){var o=a.util.clone(a.languages.typescript);a.languages.tsx=a.languages.extend("jsx",o),delete a.languages.tsx.parameter,delete a.languages.tsx["literal-property"];var i=a.languages.tsx.tag;i.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+i.pattern.source+")",i.pattern.flags),i.lookbehind=!0}(r)}return Q0}var J0,BM;function awe(){if(BM)return J0;BM=1;var e=mr();J0=t,t.displayName="tt2",t.aliases=[];function t(n){n.register(e),function(r){r.languages.tt2=r.languages.extend("clike",{comment:/#.*|\[%#[\s\S]*?%\]/,keyword:/\b(?:BLOCK|CALL|CASE|CATCH|CLEAR|DEBUG|DEFAULT|ELSE|ELSIF|END|FILTER|FINAL|FOREACH|GET|IF|IN|INCLUDE|INSERT|LAST|MACRO|META|NEXT|PERL|PROCESS|RAWPERL|RETURN|SET|STOP|SWITCH|TAGS|THROW|TRY|UNLESS|USE|WHILE|WRAPPER)\b/,punctuation:/[[\]{},()]/}),r.languages.insertBefore("tt2","number",{operator:/=[>=]?|!=?|<=?|>=?|&&|\|\|?|\b(?:and|not|or)\b/,variable:{pattern:/\b[a-z]\w*(?:\s*\.\s*(?:\d+|\$?[a-z]\w*))*\b/i}}),r.languages.insertBefore("tt2","keyword",{delimiter:{pattern:/^(?:\[%|%%)-?|-?%\]$/,alias:"punctuation"}}),r.languages.insertBefore("tt2","string",{"single-quoted-string":{pattern:/'[^\\']*(?:\\[\s\S][^\\']*)*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"[^\\"]*(?:\\[\s\S][^\\"]*)*"/,greedy:!0,alias:"string",inside:{variable:{pattern:/\$(?:[a-z]\w*(?:\.(?:\d+|\$?[a-z]\w*))*)/i}}}}),delete r.languages.tt2.string,r.hooks.add("before-tokenize",function(a){var o=/\[%[\s\S]+?%\]/g;r.languages["markup-templating"].buildPlaceholders(a,"tt2",o)}),r.hooks.add("after-tokenize",function(a){r.languages["markup-templating"].tokenizePlaceholders(a,"tt2")})}(n)}return J0}var eE,HM;function owe(){if(HM)return eE;HM=1;var e=mr();eE=t,t.displayName="twig",t.aliases=[];function t(n){n.register(e),n.languages.twig={comment:/^\{#[\s\S]*?#\}$/,"tag-name":{pattern:/(^\{%-?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%]-?|-?[%}]\}$/,alias:"punctuation"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,inside:{punctuation:/^['"]|['"]$/}},keyword:/\b(?:even|if|odd)\b/,boolean:/\b(?:false|null|true)\b/,number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,operator:[{pattern:/(\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,lookbehind:!0},/[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/],punctuation:/[()\[\]{}:.,]/},n.hooks.add("before-tokenize",function(r){if(r.language==="twig"){var a=/\{(?:#[\s\S]*?#|%[\s\S]*?%|\{[\s\S]*?\})\}/g;n.languages["markup-templating"].buildPlaceholders(r,"twig",a)}}),n.hooks.add("after-tokenize",function(r){n.languages["markup-templating"].tokenizePlaceholders(r,"twig")})}return eE}var tE,VM;function iwe(){if(VM)return tE;VM=1,tE=e,e.displayName="typoscript",e.aliases=["tsconfig"];function e(t){(function(n){var r=/\b(?:ACT|ACTIFSUB|CARRAY|CASE|CLEARGIF|COA|COA_INT|CONSTANTS|CONTENT|CUR|EDITPANEL|EFFECT|EXT|FILE|FLUIDTEMPLATE|FORM|FRAME|FRAMESET|GIFBUILDER|GMENU|GMENU_FOLDOUT|GMENU_LAYERS|GP|HMENU|HRULER|HTML|IENV|IFSUB|IMAGE|IMGMENU|IMGMENUITEM|IMGTEXT|IMG_RESOURCE|INCLUDE_TYPOSCRIPT|JSMENU|JSMENUITEM|LLL|LOAD_REGISTER|NO|PAGE|RECORDS|RESTORE_REGISTER|TEMPLATE|TEXT|TMENU|TMENUITEM|TMENU_LAYERS|USER|USER_INT|_GIFBUILDER|global|globalString|globalVar)\b/;n.languages.typoscript={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:= \t]|(?:^|[^= \t])[ \t]+)\/\/.*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^"'])#.*/,lookbehind:!0,greedy:!0}],function:[{pattern://,inside:{string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,inside:{keyword:r}},keyword:{pattern:/INCLUDE_TYPOSCRIPT/}}},{pattern:/@import\s*(?:"[^"\r\n]*"|'[^'\r\n]*')/,inside:{string:/"[^"\r\n]*"|'[^'\r\n]*'/}}],string:{pattern:/^([^=]*=[< ]?)(?:(?!\]\n).)*/,lookbehind:!0,inside:{function:/\{\$.*\}/,keyword:r,number:/^\d+$/,punctuation:/[,|:]/}},keyword:r,number:{pattern:/\b\d+\s*[.{=]/,inside:{operator:/[.{=]/}},tag:{pattern:/\.?[-\w\\]+\.?/,inside:{punctuation:/\./}},punctuation:/[{}[\];(),.:|]/,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/},n.languages.tsconfig=n.languages.typoscript})(t)}return tE}var nE,qM;function swe(){if(qM)return nE;qM=1,nE=e,e.displayName="unrealscript",e.aliases=["uc","uscript"];function e(t){t.languages.unrealscript={comment:/\/\/.*|\/\*[\s\S]*?\*\//,string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},category:{pattern:/(\b(?:(?:autoexpand|hide|show)categories|var)\s*\()[^()]+(?=\))/,lookbehind:!0,greedy:!0,alias:"property"},metadata:{pattern:/(\w\s*)<\s*\w+\s*=[^<>|=\r\n]+(?:\|\s*\w+\s*=[^<>|=\r\n]+)*>/,lookbehind:!0,greedy:!0,inside:{property:/\b\w+(?=\s*=)/,operator:/=/,punctuation:/[<>|]/}},macro:{pattern:/`\w+/,alias:"property"},"class-name":{pattern:/(\b(?:class|enum|extends|interface|state(?:\(\))?|struct|within)\s+)\w+/,lookbehind:!0},keyword:/\b(?:abstract|actor|array|auto|autoexpandcategories|bool|break|byte|case|class|classgroup|client|coerce|collapsecategories|config|const|continue|default|defaultproperties|delegate|dependson|deprecated|do|dontcollapsecategories|editconst|editinlinenew|else|enum|event|exec|export|extends|final|float|for|forcescriptorder|foreach|function|goto|guid|hidecategories|hidedropdown|if|ignores|implements|inherits|input|int|interface|iterator|latent|local|material|name|native|nativereplication|noexport|nontransient|noteditinlinenew|notplaceable|operator|optional|out|pawn|perobjectconfig|perobjectlocalized|placeable|postoperator|preoperator|private|protected|reliable|replication|return|server|showcategories|simulated|singular|state|static|string|struct|structdefault|structdefaultproperties|switch|texture|transient|travel|unreliable|until|var|vector|while|within)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,boolean:/\b(?:false|true)\b/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/>>|<<|--|\+\+|\*\*|[-+*/~!=<>$@]=?|&&?|\|\|?|\^\^?|[?:%]|\b(?:ClockwiseFrom|Cross|Dot)\b/,punctuation:/[()[\]{};,.]/},t.languages.uc=t.languages.uscript=t.languages.unrealscript}return nE}var rE,GM;function lwe(){if(GM)return rE;GM=1,rE=e,e.displayName="uorazor",e.aliases=[];function e(t){t.languages.uorazor={"comment-hash":{pattern:/#.*/,alias:"comment",greedy:!0},"comment-slash":{pattern:/\/\/.*/,alias:"comment",greedy:!0},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,inside:{punctuation:/^['"]|['"]$/},greedy:!0},"source-layers":{pattern:/\b(?:arms|backpack|blue|bracelet|cancel|clear|cloak|criminal|earrings|enemy|facialhair|friend|friendly|gloves|gray|grey|ground|hair|head|innerlegs|innertorso|innocent|lefthand|middletorso|murderer|neck|nonfriendly|onehandedsecondary|outerlegs|outertorso|pants|red|righthand|ring|self|shirt|shoes|talisman|waist)\b/i,alias:"function"},"source-commands":{pattern:/\b(?:alliance|attack|cast|clearall|clearignore|clearjournal|clearlist|clearsysmsg|createlist|createtimer|dclick|dclicktype|dclickvar|dress|dressconfig|drop|droprelloc|emote|getlabel|guild|gumpclose|gumpresponse|hotkey|ignore|lasttarget|lift|lifttype|menu|menuresponse|msg|org|organize|organizer|overhead|pause|poplist|potion|promptresponse|pushlist|removelist|removetimer|rename|restock|say|scav|scavenger|script|setability|setlasttarget|setskill|settimer|setvar|sysmsg|target|targetloc|targetrelloc|targettype|undress|unignore|unsetvar|useobject|useonce|useskill|usetype|virtue|wait|waitforgump|waitformenu|waitforprompt|waitforstat|waitforsysmsg|waitfortarget|walk|wfsysmsg|wft|whisper|yell)\b/,alias:"function"},"tag-name":{pattern:/(^\{%-?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%]-?|-?[%}]\}$/,alias:"punctuation"},function:/\b(?:atlist|close|closest|count|counter|counttype|dead|dex|diffhits|diffmana|diffstam|diffweight|find|findbuff|finddebuff|findlayer|findtype|findtypelist|followers|gumpexists|hidden|hits|hp|hue|human|humanoid|ingump|inlist|insysmessage|insysmsg|int|invul|lhandempty|list|listexists|mana|maxhits|maxhp|maxmana|maxstam|maxweight|monster|mounted|name|next|noto|paralyzed|poisoned|position|prev|previous|queued|rand|random|rhandempty|skill|stam|str|targetexists|timer|timerexists|varexist|warmode|weight)\b/,keyword:/\b(?:and|as|break|continue|else|elseif|endfor|endif|endwhile|for|if|loop|not|or|replay|stop|while)\b/,boolean:/\b(?:false|null|true)\b/,number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,operator:[{pattern:/(\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,lookbehind:!0},/[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/],punctuation:/[()\[\]{}:.,]/}}return rE}var aE,WM;function cwe(){if(WM)return aE;WM=1,aE=e,e.displayName="uri",e.aliases=["url"];function e(t){t.languages.uri={scheme:{pattern:/^[a-z][a-z0-9+.-]*:/im,greedy:!0,inside:{"scheme-delimiter":/:$/}},fragment:{pattern:/#[\w\-.~!$&'()*+,;=%:@/?]*/,inside:{"fragment-delimiter":/^#/}},query:{pattern:/\?[\w\-.~!$&'()*+,;=%:@/?]*/,inside:{"query-delimiter":{pattern:/^\?/,greedy:!0},"pair-delimiter":/[&;]/,pair:{pattern:/^[^=][\s\S]*/,inside:{key:/^[^=]+/,value:{pattern:/(^=)[\s\S]+/,lookbehind:!0}}}}},authority:{pattern:RegExp(/^\/\//.source+/(?:[\w\-.~!$&'()*+,;=%:]*@)?/.source+("(?:"+/\[(?:[0-9a-fA-F:.]{2,48}|v[0-9a-fA-F]+\.[\w\-.~!$&'()*+,;=]+)\]/.source+"|"+/[\w\-.~!$&'()*+,;=%]*/.source+")")+/(?::\d*)?/.source,"m"),inside:{"authority-delimiter":/^\/\//,"user-info-segment":{pattern:/^[\w\-.~!$&'()*+,;=%:]*@/,inside:{"user-info-delimiter":/@$/,"user-info":/^[\w\-.~!$&'()*+,;=%:]+/}},"port-segment":{pattern:/:\d*$/,inside:{"port-delimiter":/^:/,port:/^\d+/}},host:{pattern:/[\s\S]+/,inside:{"ip-literal":{pattern:/^\[[\s\S]+\]$/,inside:{"ip-literal-delimiter":/^\[|\]$/,"ipv-future":/^v[\s\S]+/,"ipv6-address":/^[\s\S]+/}},"ipv4-address":/^(?:(?:[03-9]\d?|[12]\d{0,2})\.){3}(?:[03-9]\d?|[12]\d{0,2})$/}}}},path:{pattern:/^[\w\-.~!$&'()*+,;=%:@/]+/m,inside:{"path-separator":/\//}}},t.languages.url=t.languages.uri}return aE}var oE,KM;function uwe(){if(KM)return oE;KM=1,oE=e,e.displayName="v",e.aliases=[];function e(t){(function(n){var r={pattern:/[\s\S]+/,inside:null};n.languages.v=n.languages.extend("clike",{string:{pattern:/r?(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,alias:"quoted-string",greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:\{[^{}]*\}|\w+(?:\.\w+(?:\([^\(\)]*\))?|\[[^\[\]]+\])*)/,lookbehind:!0,inside:{"interpolation-variable":{pattern:/^\$\w[\s\S]*$/,alias:"variable"},"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},"interpolation-expression":r}}}},"class-name":{pattern:/(\b(?:enum|interface|struct|type)\s+)(?:C\.)?\w+/,lookbehind:!0},keyword:/(?:\b(?:__global|as|asm|assert|atomic|break|chan|const|continue|defer|else|embed|enum|fn|for|go(?:to)?|if|import|in|interface|is|lock|match|module|mut|none|or|pub|return|rlock|select|shared|sizeof|static|struct|type(?:of)?|union|unsafe)|\$(?:else|for|if)|#(?:flag|include))\b/,number:/\b(?:0x[a-f\d]+(?:_[a-f\d]+)*|0b[01]+(?:_[01]+)*|0o[0-7]+(?:_[0-7]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?)\b/i,operator:/~|\?|[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\.?/,builtin:/\b(?:any(?:_float|_int)?|bool|byte(?:ptr)?|charptr|f(?:32|64)|i(?:8|16|64|128|nt)|rune|size_t|string|u(?:16|32|64|128)|voidptr)\b/}),r.inside=n.languages.v,n.languages.insertBefore("v","string",{char:{pattern:/`(?:\\`|\\?[^`]{1,2})`/,alias:"rune"}}),n.languages.insertBefore("v","operator",{attribute:{pattern:/(^[\t ]*)\[(?:deprecated|direct_array_access|flag|inline|live|ref_only|typedef|unsafe_fn|windows_stdcall)\]/m,lookbehind:!0,alias:"annotation",inside:{punctuation:/[\[\]]/,keyword:/\w+/}},generic:{pattern:/<\w+>(?=\s*[\)\{])/,inside:{punctuation:/[<>]/,"class-name":/\w+/}}}),n.languages.insertBefore("v","function",{"generic-function":{pattern:/\b\w+\s*<\w+>(?=\()/,inside:{function:/^\w+/,generic:{pattern:/<\w+>/,inside:n.languages.v.generic.inside}}}})})(t)}return oE}var iE,YM;function dwe(){if(YM)return iE;YM=1,iE=e,e.displayName="vala",e.aliases=[];function e(t){t.languages.vala=t.languages.extend("clike",{"class-name":[{pattern:/\b[A-Z]\w*(?:\.\w+)*\b(?=(?:\?\s+|\*?\s+\*?)\w)/,inside:{punctuation:/\./}},{pattern:/(\[)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/(\b(?:class|interface)\s+[A-Z]\w*(?:\.\w+)*\s*:\s*)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/((?:\b(?:class|enum|interface|new|struct)\s+)|(?:catch\s+\())[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}}],keyword:/\b(?:abstract|as|assert|async|base|bool|break|case|catch|char|class|const|construct|continue|default|delegate|delete|do|double|dynamic|else|ensures|enum|errordomain|extern|finally|float|for|foreach|get|if|in|inline|int|int16|int32|int64|int8|interface|internal|is|lock|long|namespace|new|null|out|override|owned|params|private|protected|public|ref|requires|return|set|short|signal|sizeof|size_t|ssize_t|static|string|struct|switch|this|throw|throws|try|typeof|uchar|uint|uint16|uint32|uint64|uint8|ulong|unichar|unowned|ushort|using|value|var|virtual|void|volatile|weak|while|yield)\b/i,function:/\b\w+(?=\s*\()/,number:/(?:\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)(?:f|u?l?)?/i,operator:/\+\+|--|&&|\|\||<<=?|>>=?|=>|->|~|[+\-*\/%&^|=!<>]=?|\?\??|\.\.\./,punctuation:/[{}[\];(),.:]/,constant:/\b[A-Z0-9_]+\b/}),t.languages.insertBefore("vala","string",{"raw-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},"template-string":{pattern:/@"[\s\S]*?"/,greedy:!0,inside:{interpolation:{pattern:/\$(?:\([^)]*\)|[a-zA-Z]\w*)/,inside:{delimiter:{pattern:/^\$\(?|\)$/,alias:"punctuation"},rest:t.languages.vala}},string:/[\s\S]+/}}}),t.languages.insertBefore("vala","keyword",{regex:{pattern:/\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[imsx]{0,4}(?=\s*(?:$|[\r\n,.;})\]]))/,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:t.languages.regex},"regex-delimiter":/^\//,"regex-flags":/^[a-z]+$/}}})}return iE}var sE,ZM;function fwe(){if(ZM)return sE;ZM=1,sE=e,e.displayName="velocity",e.aliases=[];function e(t){(function(n){n.languages.velocity=n.languages.extend("markup",{});var r={variable:{pattern:/(^|[^\\](?:\\\\)*)\$!?(?:[a-z][\w-]*(?:\([^)]*\))?(?:\.[a-z][\w-]*(?:\([^)]*\))?|\[[^\]]+\])*|\{[^}]+\})/i,lookbehind:!0,inside:{}},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},number:/\b\d+\b/,boolean:/\b(?:false|true)\b/,operator:/[=!<>]=?|[+*/%-]|&&|\|\||\.\.|\b(?:eq|g[et]|l[et]|n(?:e|ot))\b/,punctuation:/[(){}[\]:,.]/};r.variable.inside={string:r.string,function:{pattern:/([^\w-])[a-z][\w-]*(?=\()/,lookbehind:!0},number:r.number,boolean:r.boolean,punctuation:r.punctuation},n.languages.insertBefore("velocity","comment",{unparsed:{pattern:/(^|[^\\])#\[\[[\s\S]*?\]\]#/,lookbehind:!0,greedy:!0,inside:{punctuation:/^#\[\[|\]\]#$/}},"velocity-comment":[{pattern:/(^|[^\\])#\*[\s\S]*?\*#/,lookbehind:!0,greedy:!0,alias:"comment"},{pattern:/(^|[^\\])##.*/,lookbehind:!0,greedy:!0,alias:"comment"}],directive:{pattern:/(^|[^\\](?:\\\\)*)#@?(?:[a-z][\w-]*|\{[a-z][\w-]*\})(?:\s*\((?:[^()]|\([^()]*\))*\))?/i,lookbehind:!0,inside:{keyword:{pattern:/^#@?(?:[a-z][\w-]*|\{[a-z][\w-]*\})|\bin\b/,inside:{punctuation:/[{}]/}},rest:r}},variable:r.variable}),n.languages.velocity.tag.inside["attr-value"].inside.rest=n.languages.velocity})(t)}return sE}var lE,XM;function pwe(){if(XM)return lE;XM=1,lE=e,e.displayName="verilog",e.aliases=[];function e(t){t.languages.verilog={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"kernel-function":{pattern:/\B\$\w+\b/,alias:"property"},constant:/\B`\w+\b/,function:/\b\w+(?=\()/,keyword:/\b(?:alias|and|assert|assign|assume|automatic|before|begin|bind|bins|binsof|bit|break|buf|bufif0|bufif1|byte|case|casex|casez|cell|chandle|class|clocking|cmos|config|const|constraint|context|continue|cover|covergroup|coverpoint|cross|deassign|default|defparam|design|disable|dist|do|edge|else|end|endcase|endclass|endclocking|endconfig|endfunction|endgenerate|endgroup|endinterface|endmodule|endpackage|endprimitive|endprogram|endproperty|endsequence|endspecify|endtable|endtask|enum|event|expect|export|extends|extern|final|first_match|for|force|foreach|forever|fork|forkjoin|function|generate|genvar|highz0|highz1|if|iff|ifnone|ignore_bins|illegal_bins|import|incdir|include|initial|inout|input|inside|instance|int|integer|interface|intersect|join|join_any|join_none|large|liblist|library|local|localparam|logic|longint|macromodule|matches|medium|modport|module|nand|negedge|new|nmos|nor|noshowcancelled|not|notif0|notif1|null|or|output|package|packed|parameter|pmos|posedge|primitive|priority|program|property|protected|pull0|pull1|pulldown|pullup|pulsestyle_ondetect|pulsestyle_onevent|pure|rand|randc|randcase|randsequence|rcmos|real|realtime|ref|reg|release|repeat|return|rnmos|rpmos|rtran|rtranif0|rtranif1|scalared|sequence|shortint|shortreal|showcancelled|signed|small|solve|specify|specparam|static|string|strong0|strong1|struct|super|supply0|supply1|table|tagged|task|this|throughout|time|timeprecision|timeunit|tran|tranif0|tranif1|tri|tri0|tri1|triand|trior|trireg|type|typedef|union|unique|unsigned|use|uwire|var|vectored|virtual|void|wait|wait_order|wand|weak0|weak1|while|wildcard|wire|with|within|wor|xnor|xor)\b/,important:/\b(?:always|always_comb|always_ff|always_latch)\b(?: *@)?/,number:/\B##?\d+|(?:\b\d+)?'[odbh] ?[\da-fzx_?]+|\b(?:\d*[._])?\d+(?:e[-+]?\d+)?/i,operator:/[-+{}^~%*\/?=!<>&|]+/,punctuation:/[[\];(),.:]/}}return lE}var cE,QM;function gwe(){if(QM)return cE;QM=1,cE=e,e.displayName="vhdl",e.aliases=[];function e(t){t.languages.vhdl={comment:/--.+/,"vhdl-vectors":{pattern:/\b[oxb]"[\da-f_]+"|"[01uxzwlh-]+"/i,alias:"number"},"quoted-function":{pattern:/"\S+?"(?=\()/,alias:"function"},string:/"(?:[^\\"\r\n]|\\(?:\r\n|[\s\S]))*"/,constant:/\b(?:library|use)\b/i,keyword:/\b(?:'active|'ascending|'base|'delayed|'driving|'driving_value|'event|'high|'image|'instance_name|'last_active|'last_event|'last_value|'left|'leftof|'length|'low|'path_name|'pos|'pred|'quiet|'range|'reverse_range|'right|'rightof|'simple_name|'stable|'succ|'transaction|'val|'value|access|after|alias|all|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|new|next|null|of|on|open|others|out|package|port|postponed|procedure|process|pure|range|record|register|reject|report|return|select|severity|shared|signal|subtype|then|to|transport|type|unaffected|units|until|use|variable|wait|when|while|with)\b/i,boolean:/\b(?:false|true)\b/i,function:/\w+(?=\()/,number:/'[01uxzwlh-]'|\b(?:\d+#[\da-f_.]+#|\d[\d_.]*)(?:e[-+]?\d+)?/i,operator:/[<>]=?|:=|[-+*/&=]|\b(?:abs|and|mod|nand|nor|not|or|rem|rol|ror|sla|sll|sra|srl|xnor|xor)\b/i,punctuation:/[{}[\];(),.:]/}}return cE}var uE,JM;function mwe(){if(JM)return uE;JM=1,uE=e,e.displayName="vim",e.aliases=[];function e(t){t.languages.vim={string:/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\r\n]|'')*'/,comment:/".*/,function:/\b\w+(?=\()/,keyword:/\b(?:N|Next|P|Print|X|XMLent|XMLns|ab|abbreviate|abc|abclear|abo|aboveleft|al|all|ar|arga|argadd|argd|argdelete|argdo|arge|argedit|argg|argglobal|argl|arglocal|args|argu|argument|as|ascii|b|bN|bNext|ba|bad|badd|ball|bd|bdelete|be|bel|belowright|bf|bfirst|bl|blast|bm|bmodified|bn|bnext|bo|botright|bp|bprevious|br|brea|break|breaka|breakadd|breakd|breakdel|breakl|breaklist|brewind|bro|browse|bufdo|buffer|buffers|bun|bunload|bw|bwipeout|c|cN|cNext|cNfcNfile|ca|cabbrev|cabc|cabclear|cad|caddb|caddbuffer|caddexpr|caddf|caddfile|cal|call|cat|catch|cb|cbuffer|cc|ccl|cclose|cd|ce|center|cex|cexpr|cf|cfile|cfir|cfirst|cg|cgetb|cgetbuffer|cgete|cgetexpr|cgetfile|change|changes|chd|chdir|che|checkpath|checkt|checktime|cl|cla|clast|clist|clo|close|cmapc|cmapclear|cn|cnew|cnewer|cnext|cnf|cnfile|cnorea|cnoreabbrev|co|col|colder|colo|colorscheme|comc|comclear|comp|compiler|con|conf|confirm|continue|cope|copen|copy|cp|cpf|cpfile|cprevious|cq|cquit|cr|crewind|cu|cuna|cunabbrev|cunmap|cw|cwindow|d|debugg|debuggreedy|delc|delcommand|delete|delf|delfunction|delm|delmarks|di|diffg|diffget|diffoff|diffpatch|diffpu|diffput|diffsplit|diffthis|diffu|diffupdate|dig|digraphs|display|dj|djump|dl|dlist|dr|drop|ds|dsearch|dsp|dsplit|e|earlier|echoe|echoerr|echom|echomsg|echon|edit|el|else|elsei|elseif|em|emenu|en|endf|endfo|endfor|endfun|endfunction|endif|endt|endtry|endw|endwhile|ene|enew|ex|exi|exit|exu|exusage|f|file|files|filetype|fin|fina|finally|find|fini|finish|fir|first|fix|fixdel|fo|fold|foldc|foldclose|foldd|folddoc|folddoclosed|folddoopen|foldo|foldopen|for|fu|fun|function|go|goto|gr|grep|grepa|grepadd|h|ha|hardcopy|help|helpf|helpfind|helpg|helpgrep|helpt|helptags|hid|hide|his|history|ia|iabbrev|iabc|iabclear|if|ij|ijump|il|ilist|imapc|imapclear|in|inorea|inoreabbrev|isearch|isp|isplit|iu|iuna|iunabbrev|iunmap|j|join|ju|jumps|k|kee|keepalt|keepj|keepjumps|keepmarks|l|lN|lNext|lNf|lNfile|la|lad|laddb|laddbuffer|laddexpr|laddf|laddfile|lan|language|last|later|lb|lbuffer|lc|lcd|lch|lchdir|lcl|lclose|left|lefta|leftabove|let|lex|lexpr|lf|lfile|lfir|lfirst|lg|lgetb|lgetbuffer|lgete|lgetexpr|lgetfile|lgr|lgrep|lgrepa|lgrepadd|lh|lhelpgrep|list|ll|lla|llast|lli|llist|lm|lmak|lmake|lmap|lmapc|lmapclear|ln|lne|lnew|lnewer|lnext|lnf|lnfile|lnoremap|lo|loadview|loc|lockmarks|lockv|lockvar|lol|lolder|lop|lopen|lp|lpf|lpfile|lprevious|lr|lrewind|ls|lt|ltag|lu|lunmap|lv|lvimgrep|lvimgrepa|lvimgrepadd|lw|lwindow|m|ma|mak|make|mark|marks|mat|match|menut|menutranslate|mk|mkexrc|mks|mksession|mksp|mkspell|mkv|mkvie|mkview|mkvimrc|mod|mode|move|mz|mzf|mzfile|mzscheme|n|nbkey|new|next|nmapc|nmapclear|noh|nohlsearch|norea|noreabbrev|nu|number|nun|nunmap|o|omapc|omapclear|on|only|open|opt|options|ou|ounmap|p|pc|pclose|pe|ped|pedit|perl|perld|perldo|po|pop|popu|popup|pp|ppop|pre|preserve|prev|previous|print|prof|profd|profdel|profile|promptf|promptfind|promptr|promptrepl|ps|psearch|ptN|ptNext|pta|ptag|ptf|ptfirst|ptj|ptjump|ptl|ptlast|ptn|ptnext|ptp|ptprevious|ptr|ptrewind|pts|ptselect|pu|put|pw|pwd|py|pyf|pyfile|python|q|qa|qall|quit|quita|quitall|r|read|rec|recover|red|redi|redir|redo|redr|redraw|redraws|redrawstatus|reg|registers|res|resize|ret|retab|retu|return|rew|rewind|ri|right|rightb|rightbelow|ru|rub|ruby|rubyd|rubydo|rubyf|rubyfile|runtime|rv|rviminfo|sN|sNext|sa|sal|sall|san|sandbox|sargument|sav|saveas|sb|sbN|sbNext|sba|sball|sbf|sbfirst|sbl|sblast|sbm|sbmodified|sbn|sbnext|sbp|sbprevious|sbr|sbrewind|sbuffer|scrip|scripte|scriptencoding|scriptnames|se|set|setf|setfiletype|setg|setglobal|setl|setlocal|sf|sfind|sfir|sfirst|sh|shell|sign|sil|silent|sim|simalt|sl|sla|slast|sleep|sm|smagic|smap|smapc|smapclear|sme|smenu|sn|snext|sni|sniff|sno|snomagic|snor|snoremap|snoreme|snoremenu|so|sor|sort|source|sp|spe|spelld|spelldump|spellgood|spelli|spellinfo|spellr|spellrepall|spellu|spellundo|spellw|spellwrong|split|spr|sprevious|sre|srewind|st|sta|stag|star|startg|startgreplace|startinsert|startr|startreplace|stj|stjump|stop|stopi|stopinsert|sts|stselect|sun|sunhide|sunm|sunmap|sus|suspend|sv|sview|syncbind|t|tN|tNext|ta|tab|tabN|tabNext|tabc|tabclose|tabd|tabdo|tabe|tabedit|tabf|tabfind|tabfir|tabfirst|tabl|tablast|tabm|tabmove|tabn|tabnew|tabnext|tabo|tabonly|tabp|tabprevious|tabr|tabrewind|tabs|tag|tags|tc|tcl|tcld|tcldo|tclf|tclfile|te|tearoff|tf|tfirst|th|throw|tj|tjump|tl|tlast|tm|tmenu|tn|tnext|to|topleft|tp|tprevious|tr|trewind|try|ts|tselect|tu|tunmenu|u|una|unabbreviate|undo|undoj|undojoin|undol|undolist|unh|unhide|unlet|unlo|unlockvar|unm|unmap|up|update|ve|verb|verbose|version|vert|vertical|vi|vie|view|vim|vimgrep|vimgrepa|vimgrepadd|visual|viu|viusage|vmapc|vmapclear|vne|vnew|vs|vsplit|vu|vunmap|w|wN|wNext|wa|wall|wh|while|win|winc|wincmd|windo|winp|winpos|winsize|wn|wnext|wp|wprevious|wq|wqa|wqall|write|ws|wsverb|wv|wviminfo|x|xa|xall|xit|xm|xmap|xmapc|xmapclear|xme|xmenu|xn|xnoremap|xnoreme|xnoremenu|xu|xunmap|y|yank)\b/,builtin:/\b(?:acd|ai|akm|aleph|allowrevins|altkeymap|ambiwidth|ambw|anti|antialias|arab|arabic|arabicshape|ari|arshape|autochdir|autocmd|autoindent|autoread|autowrite|autowriteall|aw|awa|background|backspace|backup|backupcopy|backupdir|backupext|backupskip|balloondelay|ballooneval|balloonexpr|bdir|bdlay|beval|bex|bexpr|bg|bh|bin|binary|biosk|bioskey|bk|bkc|bomb|breakat|brk|browsedir|bs|bsdir|bsk|bt|bufhidden|buflisted|buftype|casemap|ccv|cdpath|cedit|cfu|ch|charconvert|ci|cin|cindent|cink|cinkeys|cino|cinoptions|cinw|cinwords|clipboard|cmdheight|cmdwinheight|cmp|cms|columns|com|comments|commentstring|compatible|complete|completefunc|completeopt|consk|conskey|copyindent|cot|cpo|cpoptions|cpt|cscopepathcomp|cscopeprg|cscopequickfix|cscopetag|cscopetagorder|cscopeverbose|cspc|csprg|csqf|cst|csto|csverb|cuc|cul|cursorcolumn|cursorline|cwh|debug|deco|def|define|delcombine|dex|dg|dict|dictionary|diff|diffexpr|diffopt|digraph|dip|dir|directory|dy|ea|ead|eadirection|eb|ed|edcompatible|ef|efm|ei|ek|enc|encoding|endofline|eol|ep|equalalways|equalprg|errorbells|errorfile|errorformat|esckeys|et|eventignore|expandtab|exrc|fcl|fcs|fdc|fde|fdi|fdl|fdls|fdm|fdn|fdo|fdt|fen|fenc|fencs|fex|ff|ffs|fileencoding|fileencodings|fileformat|fileformats|fillchars|fk|fkmap|flp|fml|fmr|foldcolumn|foldenable|foldexpr|foldignore|foldlevel|foldlevelstart|foldmarker|foldmethod|foldminlines|foldnestmax|foldtext|formatexpr|formatlistpat|formatoptions|formatprg|fp|fs|fsync|ft|gcr|gd|gdefault|gfm|gfn|gfs|gfw|ghr|gp|grepformat|grepprg|gtl|gtt|guicursor|guifont|guifontset|guifontwide|guiheadroom|guioptions|guipty|guitablabel|guitabtooltip|helpfile|helpheight|helplang|hf|hh|hi|hidden|highlight|hk|hkmap|hkmapp|hkp|hl|hlg|hls|hlsearch|ic|icon|iconstring|ignorecase|im|imactivatekey|imak|imc|imcmdline|imd|imdisable|imi|iminsert|ims|imsearch|inc|include|includeexpr|incsearch|inde|indentexpr|indentkeys|indk|inex|inf|infercase|insertmode|invacd|invai|invakm|invallowrevins|invaltkeymap|invanti|invantialias|invar|invarab|invarabic|invarabicshape|invari|invarshape|invautochdir|invautoindent|invautoread|invautowrite|invautowriteall|invaw|invawa|invbackup|invballooneval|invbeval|invbin|invbinary|invbiosk|invbioskey|invbk|invbl|invbomb|invbuflisted|invcf|invci|invcin|invcindent|invcompatible|invconfirm|invconsk|invconskey|invcopyindent|invcp|invcscopetag|invcscopeverbose|invcst|invcsverb|invcuc|invcul|invcursorcolumn|invcursorline|invdeco|invdelcombine|invdg|invdiff|invdigraph|invdisable|invea|inveb|inved|invedcompatible|invek|invendofline|inveol|invequalalways|inverrorbells|invesckeys|invet|invex|invexpandtab|invexrc|invfen|invfk|invfkmap|invfoldenable|invgd|invgdefault|invguipty|invhid|invhidden|invhk|invhkmap|invhkmapp|invhkp|invhls|invhlsearch|invic|invicon|invignorecase|invim|invimc|invimcmdline|invimd|invincsearch|invinf|invinfercase|invinsertmode|invis|invjoinspaces|invjs|invlazyredraw|invlbr|invlinebreak|invlisp|invlist|invloadplugins|invlpl|invlz|invma|invmacatsui|invmagic|invmh|invml|invmod|invmodeline|invmodifiable|invmodified|invmore|invmousef|invmousefocus|invmousehide|invnu|invnumber|invodev|invopendevice|invpaste|invpi|invpreserveindent|invpreviewwindow|invprompt|invpvw|invreadonly|invremap|invrestorescreen|invrevins|invri|invrightleft|invrightleftcmd|invrl|invrlc|invro|invrs|invru|invruler|invsb|invsc|invscb|invscrollbind|invscs|invsecure|invsft|invshellslash|invshelltemp|invshiftround|invshortname|invshowcmd|invshowfulltag|invshowmatch|invshowmode|invsi|invsm|invsmartcase|invsmartindent|invsmarttab|invsmd|invsn|invsol|invspell|invsplitbelow|invsplitright|invspr|invsr|invssl|invsta|invstartofline|invstmp|invswapfile|invswf|invta|invtagbsearch|invtagrelative|invtagstack|invtbi|invtbidi|invtbs|invtermbidi|invterse|invtextauto|invtextmode|invtf|invtgst|invtildeop|invtimeout|invtitle|invto|invtop|invtr|invttimeout|invttybuiltin|invttyfast|invtx|invvb|invvisualbell|invwa|invwarn|invwb|invweirdinvert|invwfh|invwfw|invwildmenu|invwinfixheight|invwinfixwidth|invwiv|invwmnu|invwrap|invwrapscan|invwrite|invwriteany|invwritebackup|invws|isf|isfname|isi|isident|isk|iskeyword|isprint|joinspaces|js|key|keymap|keymodel|keywordprg|km|kmp|kp|langmap|langmenu|laststatus|lazyredraw|lbr|lcs|linebreak|lines|linespace|lisp|lispwords|listchars|loadplugins|lpl|lsp|lz|macatsui|magic|makeef|makeprg|matchpairs|matchtime|maxcombine|maxfuncdepth|maxmapdepth|maxmem|maxmempattern|maxmemtot|mco|mef|menuitems|mfd|mh|mis|mkspellmem|ml|mls|mm|mmd|mmp|mmt|modeline|modelines|modifiable|modified|more|mouse|mousef|mousefocus|mousehide|mousem|mousemodel|mouses|mouseshape|mouset|mousetime|mp|mps|msm|mzq|mzquantum|nf|noacd|noai|noakm|noallowrevins|noaltkeymap|noanti|noantialias|noar|noarab|noarabic|noarabicshape|noari|noarshape|noautochdir|noautoindent|noautoread|noautowrite|noautowriteall|noaw|noawa|nobackup|noballooneval|nobeval|nobin|nobinary|nobiosk|nobioskey|nobk|nobl|nobomb|nobuflisted|nocf|noci|nocin|nocindent|nocompatible|noconfirm|noconsk|noconskey|nocopyindent|nocp|nocscopetag|nocscopeverbose|nocst|nocsverb|nocuc|nocul|nocursorcolumn|nocursorline|nodeco|nodelcombine|nodg|nodiff|nodigraph|nodisable|noea|noeb|noed|noedcompatible|noek|noendofline|noeol|noequalalways|noerrorbells|noesckeys|noet|noex|noexpandtab|noexrc|nofen|nofk|nofkmap|nofoldenable|nogd|nogdefault|noguipty|nohid|nohidden|nohk|nohkmap|nohkmapp|nohkp|nohls|noic|noicon|noignorecase|noim|noimc|noimcmdline|noimd|noincsearch|noinf|noinfercase|noinsertmode|nois|nojoinspaces|nojs|nolazyredraw|nolbr|nolinebreak|nolisp|nolist|noloadplugins|nolpl|nolz|noma|nomacatsui|nomagic|nomh|noml|nomod|nomodeline|nomodifiable|nomodified|nomore|nomousef|nomousefocus|nomousehide|nonu|nonumber|noodev|noopendevice|nopaste|nopi|nopreserveindent|nopreviewwindow|noprompt|nopvw|noreadonly|noremap|norestorescreen|norevins|nori|norightleft|norightleftcmd|norl|norlc|noro|nors|noru|noruler|nosb|nosc|noscb|noscrollbind|noscs|nosecure|nosft|noshellslash|noshelltemp|noshiftround|noshortname|noshowcmd|noshowfulltag|noshowmatch|noshowmode|nosi|nosm|nosmartcase|nosmartindent|nosmarttab|nosmd|nosn|nosol|nospell|nosplitbelow|nosplitright|nospr|nosr|nossl|nosta|nostartofline|nostmp|noswapfile|noswf|nota|notagbsearch|notagrelative|notagstack|notbi|notbidi|notbs|notermbidi|noterse|notextauto|notextmode|notf|notgst|notildeop|notimeout|notitle|noto|notop|notr|nottimeout|nottybuiltin|nottyfast|notx|novb|novisualbell|nowa|nowarn|nowb|noweirdinvert|nowfh|nowfw|nowildmenu|nowinfixheight|nowinfixwidth|nowiv|nowmnu|nowrap|nowrapscan|nowrite|nowriteany|nowritebackup|nows|nrformats|numberwidth|nuw|odev|oft|ofu|omnifunc|opendevice|operatorfunc|opfunc|osfiletype|pa|para|paragraphs|paste|pastetoggle|patchexpr|patchmode|path|pdev|penc|pex|pexpr|pfn|ph|pheader|pi|pm|pmbcs|pmbfn|popt|preserveindent|previewheight|previewwindow|printdevice|printencoding|printexpr|printfont|printheader|printmbcharset|printmbfont|printoptions|prompt|pt|pumheight|pvh|pvw|qe|quoteescape|readonly|remap|report|restorescreen|revins|rightleft|rightleftcmd|rl|rlc|ro|rs|rtp|ruf|ruler|rulerformat|runtimepath|sbo|sc|scb|scr|scroll|scrollbind|scrolljump|scrolloff|scrollopt|scs|sect|sections|secure|sel|selection|selectmode|sessionoptions|sft|shcf|shellcmdflag|shellpipe|shellquote|shellredir|shellslash|shelltemp|shelltype|shellxquote|shiftround|shiftwidth|shm|shortmess|shortname|showbreak|showcmd|showfulltag|showmatch|showmode|showtabline|shq|si|sidescroll|sidescrolloff|siso|sj|slm|smartcase|smartindent|smarttab|smc|smd|softtabstop|sol|spc|spell|spellcapcheck|spellfile|spelllang|spellsuggest|spf|spl|splitbelow|splitright|sps|sr|srr|ss|ssl|ssop|stal|startofline|statusline|stl|stmp|su|sua|suffixes|suffixesadd|sw|swapfile|swapsync|swb|swf|switchbuf|sws|sxq|syn|synmaxcol|syntax|t_AB|t_AF|t_AL|t_CS|t_CV|t_Ce|t_Co|t_Cs|t_DL|t_EI|t_F1|t_F2|t_F3|t_F4|t_F5|t_F6|t_F7|t_F8|t_F9|t_IE|t_IS|t_K1|t_K3|t_K4|t_K5|t_K6|t_K7|t_K8|t_K9|t_KA|t_KB|t_KC|t_KD|t_KE|t_KF|t_KG|t_KH|t_KI|t_KJ|t_KK|t_KL|t_RI|t_RV|t_SI|t_Sb|t_Sf|t_WP|t_WS|t_ZH|t_ZR|t_al|t_bc|t_cd|t_ce|t_cl|t_cm|t_cs|t_da|t_db|t_dl|t_fs|t_k1|t_k2|t_k3|t_k4|t_k5|t_k6|t_k7|t_k8|t_k9|t_kB|t_kD|t_kI|t_kN|t_kP|t_kb|t_kd|t_ke|t_kh|t_kl|t_kr|t_ks|t_ku|t_le|t_mb|t_md|t_me|t_mr|t_ms|t_nd|t_op|t_se|t_so|t_sr|t_te|t_ti|t_ts|t_ue|t_us|t_ut|t_vb|t_ve|t_vi|t_vs|t_xs|tabline|tabpagemax|tabstop|tagbsearch|taglength|tagrelative|tagstack|tal|tb|tbi|tbidi|tbis|tbs|tenc|term|termbidi|termencoding|terse|textauto|textmode|textwidth|tgst|thesaurus|tildeop|timeout|timeoutlen|title|titlelen|titleold|titlestring|toolbar|toolbariconsize|top|tpm|tsl|tsr|ttimeout|ttimeoutlen|ttm|tty|ttybuiltin|ttyfast|ttym|ttymouse|ttyscroll|ttytype|tw|tx|uc|ul|undolevels|updatecount|updatetime|ut|vb|vbs|vdir|verbosefile|vfile|viewdir|viewoptions|viminfo|virtualedit|visualbell|vop|wak|warn|wb|wc|wcm|wd|weirdinvert|wfh|wfw|whichwrap|wi|wig|wildchar|wildcharm|wildignore|wildmenu|wildmode|wildoptions|wim|winaltkeys|window|winfixheight|winfixwidth|winheight|winminheight|winminwidth|winwidth|wiv|wiw|wm|wmh|wmnu|wmw|wop|wrap|wrapmargin|wrapscan|writeany|writebackup|writedelay|ww)\b/,number:/\b(?:0x[\da-f]+|\d+(?:\.\d+)?)\b/i,operator:/\|\||&&|[-+.]=?|[=!](?:[=~][#?]?)?|[<>]=?[#?]?|[*\/%?]|\b(?:is(?:not)?)\b/,punctuation:/[{}[\](),;:]/}}return uE}var dE,e5;function hwe(){if(e5)return dE;e5=1,dE=e,e.displayName="visualBasic",e.aliases=[];function e(t){t.languages["visual-basic"]={comment:{pattern:/(?:['‘’]|REM\b)(?:[^\r\n_]|_(?:\r\n?|\n)?)*/i,inside:{keyword:/^REM/i}},directive:{pattern:/#(?:Const|Else|ElseIf|End|ExternalChecksum|ExternalSource|If|Region)(?:\b_[ \t]*(?:\r\n?|\n)|.)+/i,alias:"property",greedy:!0},string:{pattern:/\$?["“”](?:["“”]{2}|[^"“”])*["“”]C?/i,greedy:!0},date:{pattern:/#[ \t]*(?:\d+([/-])\d+\1\d+(?:[ \t]+(?:\d+[ \t]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[ \t]*(?:AM|PM))?))?|\d+[ \t]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[ \t]*(?:AM|PM))?)[ \t]*#/i,alias:"number"},number:/(?:(?:\b\d+(?:\.\d+)?|\.\d+)(?:E[+-]?\d+)?|&[HO][\dA-F]+)(?:[FRD]|U?[ILS])?/i,boolean:/\b(?:False|Nothing|True)\b/i,keyword:/\b(?:AddHandler|AddressOf|Alias|And(?:Also)?|As|Boolean|ByRef|Byte|ByVal|Call|Case|Catch|C(?:Bool|Byte|Char|Date|Dbl|Dec|Int|Lng|Obj|SByte|Short|Sng|Str|Type|UInt|ULng|UShort)|Char|Class|Const|Continue|Currency|Date|Decimal|Declare|Default|Delegate|Dim|DirectCast|Do|Double|Each|Else(?:If)?|End(?:If)?|Enum|Erase|Error|Event|Exit|Finally|For|Friend|Function|Get(?:Type|XMLNamespace)?|Global|GoSub|GoTo|Handles|If|Implements|Imports|In|Inherits|Integer|Interface|Is|IsNot|Let|Lib|Like|Long|Loop|Me|Mod|Module|Must(?:Inherit|Override)|My(?:Base|Class)|Namespace|Narrowing|New|Next|Not(?:Inheritable|Overridable)?|Object|Of|On|Operator|Option(?:al)?|Or(?:Else)?|Out|Overloads|Overridable|Overrides|ParamArray|Partial|Private|Property|Protected|Public|RaiseEvent|ReadOnly|ReDim|RemoveHandler|Resume|Return|SByte|Select|Set|Shadows|Shared|short|Single|Static|Step|Stop|String|Structure|Sub|SyncLock|Then|Throw|To|Try|TryCast|Type|TypeOf|U(?:Integer|Long|Short)|Until|Using|Variant|Wend|When|While|Widening|With(?:Events)?|WriteOnly|Xor)\b/i,operator:/[+\-*/\\^<=>&#@$%!]|\b_(?=[ \t]*[\r\n])/,punctuation:/[{}().,:?]/},t.languages.vb=t.languages["visual-basic"],t.languages.vba=t.languages["visual-basic"]}return dE}var fE,t5;function bwe(){if(t5)return fE;t5=1,fE=e,e.displayName="warpscript",e.aliases=[];function e(t){t.languages.warpscript={comment:/#.*|\/\/.*|\/\*[\s\S]*?\*\//,string:{pattern:/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'|<'(?:[^\\']|'(?!>)|\\.)*'>/,greedy:!0},variable:/\$\S+/,macro:{pattern:/@\S+/,alias:"property"},keyword:/\b(?:BREAK|CHECKMACRO|CONTINUE|CUDF|DEFINED|DEFINEDMACRO|EVAL|FAIL|FOR|FOREACH|FORSTEP|IFT|IFTE|MSGFAIL|NRETURN|RETHROW|RETURN|SWITCH|TRY|UDF|UNTIL|WHILE)\b/,number:/[+-]?\b(?:NaN|Infinity|\d+(?:\.\d*)?(?:[Ee][+-]?\d+)?|0x[\da-fA-F]+|0b[01]+)\b/,boolean:/\b(?:F|T|false|true)\b/,punctuation:/<%|%>|[{}[\]()]/,operator:/==|&&?|\|\|?|\*\*?|>>>?|<<|[<>!~]=?|[-/%^]|\+!?|\b(?:AND|NOT|OR)\b/}}return fE}var pE,n5;function ywe(){if(n5)return pE;n5=1,pE=e,e.displayName="wasm",e.aliases=[];function e(t){t.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/}}return pE}var gE,r5;function vwe(){if(r5)return gE;r5=1,gE=e,e.displayName="webIdl",e.aliases=[];function e(t){(function(n){var r=/(?:\B-|\b_|\b)[A-Za-z][\w-]*(?![\w-])/.source,a="(?:"+/\b(?:unsigned\s+)?long\s+long(?![\w-])/.source+"|"+/\b(?:unrestricted|unsigned)\s+[a-z]+(?![\w-])/.source+"|"+/(?!(?:unrestricted|unsigned)\b)/.source+r+/(?:\s*<(?:[^<>]|<[^<>]*>)*>)?/.source+")"+/(?:\s*\?)?/.source,o={};n.languages["web-idl"]={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},string:{pattern:/"[^"]*"/,greedy:!0},namespace:{pattern:RegExp(/(\bnamespace\s+)/.source+r),lookbehind:!0},"class-name":[{pattern:/(^|[^\w-])(?:iterable|maplike|setlike)\s*<(?:[^<>]|<[^<>]*>)*>/,lookbehind:!0,inside:o},{pattern:RegExp(/(\b(?:attribute|const|deleter|getter|optional|setter)\s+)/.source+a),lookbehind:!0,inside:o},{pattern:RegExp("("+/\bcallback\s+/.source+r+/\s*=\s*/.source+")"+a),lookbehind:!0,inside:o},{pattern:RegExp(/(\btypedef\b\s*)/.source+a),lookbehind:!0,inside:o},{pattern:RegExp(/(\b(?:callback|dictionary|enum|interface(?:\s+mixin)?)\s+)(?!(?:interface|mixin)\b)/.source+r),lookbehind:!0},{pattern:RegExp(/(:\s*)/.source+r),lookbehind:!0},RegExp(r+/(?=\s+(?:implements|includes)\b)/.source),{pattern:RegExp(/(\b(?:implements|includes)\s+)/.source+r),lookbehind:!0},{pattern:RegExp(a+"(?="+/\s*(?:\.{3}\s*)?/.source+r+/\s*[(),;=]/.source+")"),inside:o}],builtin:/\b(?:ArrayBuffer|BigInt64Array|BigUint64Array|ByteString|DOMString|DataView|Float32Array|Float64Array|FrozenArray|Int16Array|Int32Array|Int8Array|ObservableArray|Promise|USVString|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray)\b/,keyword:[/\b(?:async|attribute|callback|const|constructor|deleter|dictionary|enum|getter|implements|includes|inherit|interface|mixin|namespace|null|optional|or|partial|readonly|required|setter|static|stringifier|typedef|unrestricted)\b/,/\b(?:any|bigint|boolean|byte|double|float|iterable|long|maplike|object|octet|record|sequence|setlike|short|symbol|undefined|unsigned|void)\b/],boolean:/\b(?:false|true)\b/,number:{pattern:/(^|[^\w-])-?(?:0x[0-9a-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|NaN|Infinity)(?![\w-])/i,lookbehind:!0},operator:/\.{3}|[=:?<>-]/,punctuation:/[(){}[\].,;]/};for(var i in n.languages["web-idl"])i!=="class-name"&&(o[i]=n.languages["web-idl"][i]);n.languages.webidl=n.languages["web-idl"]})(t)}return gE}var mE,a5;function Swe(){if(a5)return mE;a5=1,mE=e,e.displayName="wiki",e.aliases=[];function e(t){t.languages.wiki=t.languages.extend("markup",{"block-comment":{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0,alias:"comment"},heading:{pattern:/^(=+)[^=\r\n].*?\1/m,inside:{punctuation:/^=+|=+$/,important:/.+/}},emphasis:{pattern:/('{2,5}).+?\1/,inside:{"bold-italic":{pattern:/(''''').+?(?=\1)/,lookbehind:!0,alias:["bold","italic"]},bold:{pattern:/(''')[^'](?:.*?[^'])?(?=\1)/,lookbehind:!0},italic:{pattern:/('')[^'](?:.*?[^'])?(?=\1)/,lookbehind:!0},punctuation:/^''+|''+$/}},hr:{pattern:/^-{4,}/m,alias:"punctuation"},url:[/ISBN +(?:97[89][ -]?)?(?:\d[ -]?){9}[\dx]\b|(?:PMID|RFC) +\d+/i,/\[\[.+?\]\]|\[.+?\]/],variable:[/__[A-Z]+__/,/\{{3}.+?\}{3}/,/\{\{.+?\}\}/],symbol:[/^#redirect/im,/~{3,5}/],"table-tag":{pattern:/((?:^|[|!])[|!])[^|\r\n]+\|(?!\|)/m,lookbehind:!0,inside:{"table-bar":{pattern:/\|$/,alias:"punctuation"},rest:t.languages.markup.tag.inside}},punctuation:/^(?:\{\||\|\}|\|-|[*#:;!|])|\|\||!!/m}),t.languages.insertBefore("wiki","tag",{nowiki:{pattern:/<(nowiki|pre|source)\b[^>]*>[\s\S]*?<\/\1>/i,inside:{tag:{pattern:/<(?:nowiki|pre|source)\b[^>]*>|<\/(?:nowiki|pre|source)>/i,inside:t.languages.markup.tag.inside}}}})}return mE}var hE,o5;function wwe(){if(o5)return hE;o5=1,hE=e,e.displayName="wolfram",e.aliases=["mathematica","wl","nb"];function e(t){t.languages.wolfram={comment:/\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:Abs|AbsArg|Accuracy|Block|Do|For|Function|If|Manipulate|Module|Nest|NestList|None|Return|Switch|Table|Which|While)\b/,context:{pattern:/\b\w+`+\w*/,alias:"class-name"},blank:{pattern:/\b\w+_\b/,alias:"regex"},"global-variable":{pattern:/\$\w+/,alias:"variable"},boolean:/\b(?:False|True)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/\/\.|;|=\.|\^=|\^:=|:=|<<|>>|<\||\|>|:>|\|->|->|<-|@@@|@@|@|\/@|=!=|===|==|=|\+|-|\^|\[\/-+%=\]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},t.languages.mathematica=t.languages.wolfram,t.languages.wl=t.languages.wolfram,t.languages.nb=t.languages.wolfram}return hE}var bE,i5;function Ewe(){if(i5)return bE;i5=1,bE=e,e.displayName="wren",e.aliases=[];function e(t){t.languages.wren={comment:[{pattern:/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*))*\*\/)*\*\/)*\*\//,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],"triple-quoted-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},"string-literal":null,hashbang:{pattern:/^#!\/.+/,greedy:!0,alias:"comment"},attribute:{pattern:/#!?[ \t\u3000]*\w+/,alias:"keyword"},"class-name":[{pattern:/(\bclass\s+)\w+/,lookbehind:!0},/\b[A-Z][a-z\d_]*\b/],constant:/\b[A-Z][A-Z\d_]*\b/,null:{pattern:/\bnull\b/,alias:"keyword"},keyword:/\b(?:as|break|class|construct|continue|else|for|foreign|if|import|in|is|return|static|super|this|var|while)\b/,boolean:/\b(?:false|true)\b/,number:/\b(?:0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,function:/\b[a-z_]\w*(?=\s*[({])/i,operator:/<<|>>|[=!<>]=?|&&|\|\||[-+*/%~^&|?:]|\.{2,3}/,punctuation:/[\[\](){}.,;]/},t.languages.wren["string-literal"]={pattern:/(^|[^\\"])"(?:[^\\"%]|\\[\s\S]|%(?!\()|%\((?:[^()]|\((?:[^()]|\([^)]*\))*\))*\))*"/,lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)%\((?:[^()]|\((?:[^()]|\([^)]*\))*\))*\)/,lookbehind:!0,inside:{expression:{pattern:/^(%\()[\s\S]+(?=\)$)/,lookbehind:!0,inside:t.languages.wren},"interpolation-punctuation":{pattern:/^%\(|\)$/,alias:"punctuation"}}},string:/[\s\S]+/}}}return bE}var yE,s5;function xwe(){if(s5)return yE;s5=1,yE=e,e.displayName="xeora",e.aliases=["xeoracube"];function e(t){(function(n){n.languages.xeora=n.languages.extend("markup",{constant:{pattern:/\$(?:DomainContents|PageRenderDuration)\$/,inside:{punctuation:{pattern:/\$/}}},variable:{pattern:/\$@?(?:#+|[-+*~=^])?[\w.]+\$/,inside:{punctuation:{pattern:/[$.]/},operator:{pattern:/#+|[-+*~=^@]/}}},"function-inline":{pattern:/\$F:[-\w.]+\?[-\w.]+(?:,(?:(?:@[-#]*\w+\.[\w+.]\.*)*\|)*(?:(?:[\w+]|[-#*.~^]+[\w+]|=\S)(?:[^$=]|=+[^=])*=*|(?:@[-#]*\w+\.[\w+.]\.*)+(?:(?:[\w+]|[-#*~^][-#*.~^]*[\w+]|=\S)(?:[^$=]|=+[^=])*=*)?)?)?\$/,inside:{variable:{pattern:/(?:[,|])@?(?:#+|[-+*~=^])?[\w.]+/,inside:{punctuation:{pattern:/[,.|]/},operator:{pattern:/#+|[-+*~=^@]/}}},punctuation:{pattern:/\$\w:|[$:?.,|]/}},alias:"function"},"function-block":{pattern:/\$XF:\{[-\w.]+\?[-\w.]+(?:,(?:(?:@[-#]*\w+\.[\w+.]\.*)*\|)*(?:(?:[\w+]|[-#*.~^]+[\w+]|=\S)(?:[^$=]|=+[^=])*=*|(?:@[-#]*\w+\.[\w+.]\.*)+(?:(?:[\w+]|[-#*~^][-#*.~^]*[\w+]|=\S)(?:[^$=]|=+[^=])*=*)?)?)?\}:XF\$/,inside:{punctuation:{pattern:/[$:{}?.,|]/}},alias:"function"},"directive-inline":{pattern:/\$\w(?:#\d+\+?)?(?:\[[-\w.]+\])?:[-\/\w.]+\$/,inside:{punctuation:{pattern:/\$(?:\w:|C(?:\[|#\d))?|[:{[\]]/,inside:{tag:{pattern:/#\d/}}}},alias:"function"},"directive-block-open":{pattern:/\$\w+:\{|\$\w(?:#\d+\+?)?(?:\[[-\w.]+\])?:[-\w.]+:\{(?:![A-Z]+)?/,inside:{punctuation:{pattern:/\$(?:\w:|C(?:\[|#\d))?|[:{[\]]/,inside:{tag:{pattern:/#\d/}}},attribute:{pattern:/![A-Z]+$/,inside:{punctuation:{pattern:/!/}},alias:"keyword"}},alias:"function"},"directive-block-separator":{pattern:/\}:[-\w.]+:\{/,inside:{punctuation:{pattern:/[:{}]/}},alias:"function"},"directive-block-close":{pattern:/\}:[-\w.]+\$/,inside:{punctuation:{pattern:/[:{}$]/}},alias:"function"}}),n.languages.insertBefore("inside","punctuation",{variable:n.languages.xeora["function-inline"].inside.variable},n.languages.xeora["function-block"]),n.languages.xeoracube=n.languages.xeora})(t)}return yE}var vE,l5;function kwe(){if(l5)return vE;l5=1,vE=e,e.displayName="xmlDoc",e.aliases=[];function e(t){(function(n){function r(s,l){n.languages[s]&&n.languages.insertBefore(s,"comment",{"doc-comment":l})}var a=n.languages.markup.tag,o={pattern:/\/\/\/.*/,greedy:!0,alias:"comment",inside:{tag:a}},i={pattern:/'''.*/,greedy:!0,alias:"comment",inside:{tag:a}};r("csharp",o),r("fsharp",o),r("vbnet",i)})(t)}return vE}var SE,c5;function Cwe(){if(c5)return SE;c5=1,SE=e,e.displayName="xojo",e.aliases=[];function e(t){t.languages.xojo={comment:{pattern:/(?:'|\/\/|Rem\b).+/i,greedy:!0},string:{pattern:/"(?:""|[^"])*"/,greedy:!0},number:[/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,/&[bchou][a-z\d]+/i],directive:{pattern:/#(?:Else|ElseIf|Endif|If|Pragma)\b/i,alias:"property"},keyword:/\b(?:AddHandler|App|Array|As(?:signs)?|Auto|Boolean|Break|By(?:Ref|Val)|Byte|Call|Case|Catch|CFStringRef|CGFloat|Class|Color|Const|Continue|CString|Currency|CurrentMethodName|Declare|Delegate|Dim|Do(?:uble|wnTo)?|Each|Else(?:If)?|End|Enumeration|Event|Exception|Exit|Extends|False|Finally|For|Function|Get|GetTypeInfo|Global|GOTO|If|Implements|In|Inherits|Int(?:8|16|32|64|eger|erface)?|Lib|Loop|Me|Module|Next|Nil|Object|Optional|OSType|ParamArray|Private|Property|Protected|PString|Ptr|Raise(?:Event)?|ReDim|RemoveHandler|Return|Select(?:or)?|Self|Set|Shared|Short|Single|Soft|Static|Step|String|Sub|Super|Text|Then|To|True|Try|Ubound|UInt(?:8|16|32|64|eger)?|Until|Using|Var(?:iant)?|Wend|While|WindowPtr|WString)\b/i,operator:/<[=>]?|>=?|[+\-*\/\\^=]|\b(?:AddressOf|And|Ctype|IsA?|Mod|New|Not|Or|WeakAddressOf|Xor)\b/i,punctuation:/[.,;:()]/}}return SE}var wE,u5;function _we(){if(u5)return wE;u5=1,wE=e,e.displayName="xquery",e.aliases=[];function e(t){(function(n){n.languages.xquery=n.languages.extend("markup",{"xquery-comment":{pattern:/\(:[\s\S]*?:\)/,greedy:!0,alias:"comment"},string:{pattern:/(["'])(?:\1\1|(?!\1)[\s\S])*\1/,greedy:!0},extension:{pattern:/\(#.+?#\)/,alias:"symbol"},variable:/\$[-\w:]+/,axis:{pattern:/(^|[^-])(?:ancestor(?:-or-self)?|attribute|child|descendant(?:-or-self)?|following(?:-sibling)?|parent|preceding(?:-sibling)?|self)(?=::)/,lookbehind:!0,alias:"operator"},"keyword-operator":{pattern:/(^|[^:-])\b(?:and|castable as|div|eq|except|ge|gt|idiv|instance of|intersect|is|le|lt|mod|ne|or|union)\b(?=$|[^:-])/,lookbehind:!0,alias:"operator"},keyword:{pattern:/(^|[^:-])\b(?:as|ascending|at|base-uri|boundary-space|case|cast as|collation|construction|copy-namespaces|declare|default|descending|else|empty (?:greatest|least)|encoding|every|external|for|function|if|import|in|inherit|lax|let|map|module|namespace|no-inherit|no-preserve|option|order(?: by|ed|ing)?|preserve|return|satisfies|schema|some|stable|strict|strip|then|to|treat as|typeswitch|unordered|validate|variable|version|where|xquery)\b(?=$|[^:-])/,lookbehind:!0},function:/[\w-]+(?::[\w-]+)*(?=\s*\()/,"xquery-element":{pattern:/(element\s+)[\w-]+(?::[\w-]+)*/,lookbehind:!0,alias:"tag"},"xquery-attribute":{pattern:/(attribute\s+)[\w-]+(?::[\w-]+)*/,lookbehind:!0,alias:"attr-name"},builtin:{pattern:/(^|[^:-])\b(?:attribute|comment|document|element|processing-instruction|text|xs:(?:ENTITIES|ENTITY|ID|IDREFS?|NCName|NMTOKENS?|NOTATION|Name|QName|anyAtomicType|anyType|anyURI|base64Binary|boolean|byte|date|dateTime|dayTimeDuration|decimal|double|duration|float|gDay|gMonth|gMonthDay|gYear|gYearMonth|hexBinary|int|integer|language|long|negativeInteger|nonNegativeInteger|nonPositiveInteger|normalizedString|positiveInteger|short|string|time|token|unsigned(?:Byte|Int|Long|Short)|untyped(?:Atomic)?|yearMonthDuration))\b(?=$|[^:-])/,lookbehind:!0},number:/\b\d+(?:\.\d+)?(?:E[+-]?\d+)?/,operator:[/[+*=?|@]|\.\.?|:=|!=|<[=<]?|>[=>]?/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}],punctuation:/[[\](){},;:/]/}),n.languages.xquery.tag.pattern=/<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/,n.languages.xquery.tag.inside["attr-value"].pattern=/=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+)/,n.languages.xquery.tag.inside["attr-value"].inside.punctuation=/^="|"$/,n.languages.xquery.tag.inside["attr-value"].inside.expression={pattern:/\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}/,inside:n.languages.xquery,alias:"language-xquery"};var r=function(o){return typeof o=="string"?o:typeof o.content=="string"?o.content:o.content.map(r).join("")},a=function(o){for(var i=[],s=0;s0&&i[i.length-1].tagName===r(l.content[0].content[1])&&i.pop():l.content[l.content.length-1].content==="/>"||i.push({tagName:r(l.content[0].content[1]),openedBraces:0}):i.length>0&&l.type==="punctuation"&&l.content==="{"&&(!o[s+1]||o[s+1].type!=="punctuation"||o[s+1].content!=="{")&&(!o[s-1]||o[s-1].type!=="plain-text"||o[s-1].content!=="{")?i[i.length-1].openedBraces++:i.length>0&&i[i.length-1].openedBraces>0&&l.type==="punctuation"&&l.content==="}"?i[i.length-1].openedBraces--:l.type!=="comment"&&(c=!0)),(c||typeof l=="string")&&i.length>0&&i[i.length-1].openedBraces===0){var u=r(l);s0&&(typeof o[s-1]=="string"||o[s-1].type==="plain-text")&&(u=r(o[s-1])+u,o.splice(s-1,1),s--),/^\s+$/.test(u)?o[s]=u:o[s]=new n.Token("plain-text",u,null,u)}l.content&&typeof l.content!="string"&&a(l.content)}};n.hooks.add("after-tokenize",function(o){o.language==="xquery"&&a(o.tokens)})})(t)}return wE}var EE,d5;function Awe(){if(d5)return EE;d5=1,EE=e,e.displayName="yang",e.aliases=[];function e(t){t.languages.yang={comment:/\/\*[\s\S]*?\*\/|\/\/.*/,string:{pattern:/"(?:[^\\"]|\\.)*"|'[^']*'/,greedy:!0},keyword:{pattern:/(^|[{};\r\n][ \t]*)[a-z_][\w.-]*/i,lookbehind:!0},namespace:{pattern:/(\s)[a-z_][\w.-]*(?=:)/i,lookbehind:!0},boolean:/\b(?:false|true)\b/,operator:/\+/,punctuation:/[{};:]/}}return EE}var xE,f5;function Twe(){if(f5)return xE;f5=1,xE=e,e.displayName="zig",e.aliases=[];function e(t){(function(n){function r(u){return function(){return u}}var a=/\b(?:align|allowzero|and|anyframe|anytype|asm|async|await|break|cancel|catch|comptime|const|continue|defer|else|enum|errdefer|error|export|extern|fn|for|if|inline|linksection|nakedcc|noalias|nosuspend|null|or|orelse|packed|promise|pub|resume|return|stdcallcc|struct|suspend|switch|test|threadlocal|try|undefined|union|unreachable|usingnamespace|var|volatile|while)\b/,o="\\b(?!"+a.source+")(?!\\d)\\w+\\b",i=/align\s*\((?:[^()]|\([^()]*\))*\)/.source,s=/(?:\?|\bpromise->|(?:\[[^[\]]*\]|\*(?!\*)|\*\*)(?:\s*|\s*const\b|\s*volatile\b|\s*allowzero\b)*)/.source.replace(//g,r(i)),l=/(?:\bpromise\b|(?:\berror\.)?(?:\.)*(?!\s+))/.source.replace(//g,r(o)),c="(?!\\s)(?:!?\\s*(?:"+s+"\\s*)*"+l+")+";n.languages.zig={comment:[{pattern:/\/\/[/!].*/,alias:"doc-comment"},/\/{2}.*/],string:[{pattern:/(^|[^\\@])c?"(?:[^"\\\r\n]|\\.)*"/,lookbehind:!0,greedy:!0},{pattern:/([\r\n])([ \t]+c?\\{2}).*(?:(?:\r\n?|\n)\2.*)*/,lookbehind:!0,greedy:!0}],char:{pattern:/(^|[^\\])'(?:[^'\\\r\n]|[\uD800-\uDFFF]{2}|\\(?:.|x[a-fA-F\d]{2}|u\{[a-fA-F\d]{1,6}\}))'/,lookbehind:!0,greedy:!0},builtin:/\B@(?!\d)\w+(?=\s*\()/,label:{pattern:/(\b(?:break|continue)\s*:\s*)\w+\b|\b(?!\d)\w+\b(?=\s*:\s*(?:\{|while\b))/,lookbehind:!0},"class-name":[/\b(?!\d)\w+(?=\s*=\s*(?:(?:extern|packed)\s+)?(?:enum|struct|union)\s*[({])/,{pattern:RegExp(/(:\s*)(?=\s*(?:\s*)?[=;,)])|(?=\s*(?:\s*)?\{)/.source.replace(//g,r(c)).replace(//g,r(i))),lookbehind:!0,inside:null},{pattern:RegExp(/(\)\s*)(?=\s*(?:\s*)?;)/.source.replace(//g,r(c)).replace(//g,r(i))),lookbehind:!0,inside:null}],"builtin-type":{pattern:/\b(?:anyerror|bool|c_u?(?:int|long|longlong|short)|c_longdouble|c_void|comptime_(?:float|int)|f(?:16|32|64|128)|[iu](?:8|16|32|64|128|size)|noreturn|type|void)\b/,alias:"keyword"},keyword:a,function:/\b(?!\d)\w+(?=\s*\()/,number:/\b(?:0b[01]+|0o[0-7]+|0x[a-fA-F\d]+(?:\.[a-fA-F\d]*)?(?:[pP][+-]?[a-fA-F\d]+)?|\d+(?:\.\d*)?(?:[eE][+-]?\d+)?)\b/,boolean:/\b(?:false|true)\b/,operator:/\.[*?]|\.{2,3}|[-=]>|\*\*|\+\+|\|\||(?:<<|>>|[-+*]%|[-+*/%^&|<>!=])=?|[?~]/,punctuation:/[.:,;(){}[\]]/},n.languages.zig["class-name"].forEach(function(u){u.inside===null&&(u.inside=n.languages.zig)})})(t)}return xE}var I=Phe,Rwe=I;I.register(Whe());I.register(Khe());I.register(Yhe());I.register(Zhe());I.register(Xhe());I.register(Qhe());I.register(Jhe());I.register(ebe());I.register(tbe());I.register(nbe());I.register(rbe());I.register(abe());I.register(obe());I.register(ibe());I.register(sbe());I.register(lbe());I.register(cbe());I.register(ube());I.register(dbe());I.register(fbe());I.register(pbe());I.register(gbe());I.register(rz());I.register(az());I.register(mbe());I.register(hbe());I.register(bbe());I.register(ybe());I.register(vbe());I.register(Sbe());I.register(wbe());I.register(Ebe());I.register(xbe());I.register(kbe());I.register(Ws());I.register(Cbe());I.register(_be());I.register(Abe());I.register(Tbe());I.register(Rbe());I.register(Nbe());I.register(Ibe());I.register(Obe());I.register(Dbe());I.register(RA());I.register(Lbe());I.register(_h());I.register(Mbe());I.register(Pbe());I.register($be());I.register(Fbe());I.register(jbe());I.register(zbe());I.register(Ube());I.register(Bbe());I.register(Hbe());I.register(Vbe());I.register(qbe());I.register(Gbe());I.register(Wbe());I.register(Kbe());I.register(Ybe());I.register(Zbe());I.register(Xbe());I.register(Qbe());I.register(Jbe());I.register(eye());I.register(tye());I.register(nye());I.register(rye());I.register(aye());I.register(oye());I.register(iye());I.register(sye());I.register(lye());I.register(cye());I.register(uye());I.register(dye());I.register(fye());I.register(pye());I.register(gye());I.register(mye());I.register(hye());I.register(bye());I.register(yye());I.register(vye());I.register(Sye());I.register(wye());I.register(Eye());I.register(xye());I.register(kye());I.register(Cye());I.register(_ye());I.register(Aye());I.register(NA());I.register(Tye());I.register(Rye());I.register(Nye());I.register(Iye());I.register(Oye());I.register(Dye());I.register(Lye());I.register(Mye());I.register(Pye());I.register($ye());I.register(Fye());I.register(jye());I.register(zye());I.register(Uye());I.register(Bye());I.register(Hye());I.register(Vye());I.register(IA());I.register(qye());I.register(Th());I.register(Gye());I.register(Wye());I.register(Kye());I.register(Yye());I.register(Zye());I.register(Xye());I.register(Qye());I.register(DA());I.register(Jye());I.register(eve());I.register(tve());I.register(iz());I.register(nve());I.register(rve());I.register(ave());I.register(ove());I.register(ive());I.register(sve());I.register(lve());I.register(cve());I.register(uve());I.register(dve());I.register(fve());I.register(pve());I.register(gve());I.register(mve());I.register(hve());I.register(bve());I.register(oz());I.register(yve());I.register(vve());I.register(Sve());I.register(mr());I.register(wve());I.register(Eve());I.register(xve());I.register(kve());I.register(Cve());I.register(_ve());I.register(Ave());I.register(Tve());I.register(Rve());I.register(Nve());I.register(Ive());I.register(Ove());I.register(Dve());I.register(Lve());I.register(Mve());I.register(Pve());I.register($ve());I.register(Fve());I.register(jve());I.register(zve());I.register(Uve());I.register(Bve());I.register(Hve());I.register(Vve());I.register(qve());I.register(Gve());I.register(Wve());I.register(Kve());I.register(Yve());I.register(Zve());I.register(Xve());I.register(Qve());I.register(Rh());I.register(Jve());I.register(eSe());I.register(tSe());I.register(nSe());I.register(rSe());I.register(aSe());I.register(oSe());I.register(iSe());I.register(sSe());I.register(lSe());I.register(cSe());I.register(uSe());I.register(dSe());I.register(fSe());I.register(pSe());I.register(gSe());I.register(mSe());I.register(hSe());I.register(bSe());I.register(ySe());I.register(vSe());I.register(SSe());I.register(wSe());I.register(ESe());I.register(xSe());I.register(kSe());I.register(CSe());I.register(_Se());I.register(ASe());I.register(TSe());I.register(Ah());I.register(RSe());I.register(NSe());I.register(ISe());I.register(OSe());I.register(LA());I.register(DSe());I.register(LSe());I.register(MSe());I.register(PSe());I.register($Se());I.register(FSe());I.register(jSe());I.register(zSe());I.register(USe());I.register(BSe());I.register(HSe());I.register(VSe());I.register(TA());I.register(qSe());I.register(GSe());I.register(WSe());I.register(KSe());I.register(YSe());I.register(ZSe());I.register(MA());I.register(XSe());I.register(QSe());I.register(JSe());I.register(ewe());I.register(twe());I.register(nwe());I.register(rwe());I.register(awe());I.register(sz());I.register(owe());I.register(OA());I.register(iwe());I.register(swe());I.register(lwe());I.register(cwe());I.register(uwe());I.register(dwe());I.register(lz());I.register(fwe());I.register(pwe());I.register(gwe());I.register(mwe());I.register(hwe());I.register(bwe());I.register(ywe());I.register(vwe());I.register(Swe());I.register(wwe());I.register(Ewe());I.register(xwe());I.register(kwe());I.register(Cwe());I.register(_we());I.register(cz());I.register(Awe());I.register(Twe());const Nwe=Tc(Rwe);var uz=_fe(Nwe,Ghe);uz.supportedLanguages=Afe;const Iwe=uz;var dz={},fz={exports:{}};(function(e){function t(n){return n&&n.__esModule?n:{default:n}}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports})(fz);var Owe=fz.exports,kE={},p5;function Dwe(){return p5||(p5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"black",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",maxHeight:"inherit",height:"inherit",padding:"0 1em",display:"block",overflow:"auto"},'pre[class*="language-"]':{color:"black",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",position:"relative",margin:".5em 0",overflow:"visible",padding:"1px",backgroundColor:"#fdfdfd",WebkitBoxSizing:"border-box",MozBoxSizing:"border-box",boxSizing:"border-box",marginBottom:"1em"},'pre[class*="language-"] > code':{position:"relative",zIndex:"1",borderLeft:"10px solid #358ccb",boxShadow:"-1px 0px 0px 0px #358ccb, 0px 0px 0px 1px #dfdfdf",backgroundColor:"#fdfdfd",backgroundImage:"linear-gradient(transparent 50%, rgba(69, 142, 209, 0.04) 50%)",backgroundSize:"3em 3em",backgroundOrigin:"content-box",backgroundAttachment:"local"},':not(pre) > code[class*="language-"]':{backgroundColor:"#fdfdfd",WebkitBoxSizing:"border-box",MozBoxSizing:"border-box",boxSizing:"border-box",marginBottom:"1em",position:"relative",padding:".2em",borderRadius:"0.3em",color:"#c92c2c",border:"1px solid rgba(0, 0, 0, 0.1)",display:"inline",whiteSpace:"normal"},'pre[class*="language-"]:before':{content:"''",display:"block",position:"absolute",bottom:"0.75em",left:"0.18em",width:"40%",height:"20%",maxHeight:"13em",boxShadow:"0px 13px 8px #979797",WebkitTransform:"rotate(-2deg)",MozTransform:"rotate(-2deg)",msTransform:"rotate(-2deg)",OTransform:"rotate(-2deg)",transform:"rotate(-2deg)"},'pre[class*="language-"]:after':{content:"''",display:"block",position:"absolute",bottom:"0.75em",left:"auto",width:"40%",height:"20%",maxHeight:"13em",boxShadow:"0px 13px 8px #979797",WebkitTransform:"rotate(2deg)",MozTransform:"rotate(2deg)",msTransform:"rotate(2deg)",OTransform:"rotate(2deg)",transform:"rotate(2deg)",right:"0.75em"},comment:{color:"#7D8B99"},"block-comment":{color:"#7D8B99"},prolog:{color:"#7D8B99"},doctype:{color:"#7D8B99"},cdata:{color:"#7D8B99"},punctuation:{color:"#5F6364"},property:{color:"#c92c2c"},tag:{color:"#c92c2c"},boolean:{color:"#c92c2c"},number:{color:"#c92c2c"},"function-name":{color:"#c92c2c"},constant:{color:"#c92c2c"},symbol:{color:"#c92c2c"},deleted:{color:"#c92c2c"},selector:{color:"#2f9c0a"},"attr-name":{color:"#2f9c0a"},string:{color:"#2f9c0a"},char:{color:"#2f9c0a"},function:{color:"#2f9c0a"},builtin:{color:"#2f9c0a"},inserted:{color:"#2f9c0a"},operator:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},entity:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)",cursor:"help"},url:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},variable:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},atrule:{color:"#1990b8"},"attr-value":{color:"#1990b8"},keyword:{color:"#1990b8"},"class-name":{color:"#1990b8"},regex:{color:"#e90"},important:{color:"#e90",fontWeight:"normal"},".language-css .token.string":{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},".style .token.string":{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},namespace:{Opacity:".7"},'pre[class*="language-"].line-numbers.line-numbers':{paddingLeft:"0"},'pre[class*="language-"].line-numbers.line-numbers code':{paddingLeft:"3.8em"},'pre[class*="language-"].line-numbers.line-numbers .line-numbers-rows':{left:"0"},'pre[class*="language-"][data-line]':{paddingTop:"0",paddingBottom:"0",paddingLeft:"0"},"pre[data-line] code":{position:"relative",paddingLeft:"4em"},"pre .line-highlight":{marginTop:"0"}};e.default=t}(kE)),kE}var CE={},g5;function Lwe(){return g5||(g5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"white",background:"none",textShadow:"0 -.1em .2em black",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"white",background:"hsl(30, 20%, 25%)",textShadow:"0 -.1em .2em black",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",border:".3em solid hsl(30, 20%, 40%)",borderRadius:".5em",boxShadow:"1px 1px .5em black inset"},':not(pre) > code[class*="language-"]':{background:"hsl(30, 20%, 25%)",padding:".15em .2em .05em",borderRadius:".3em",border:".13em solid hsl(30, 20%, 40%)",boxShadow:"1px 1px .3em -.1em black inset",whiteSpace:"normal"},comment:{color:"hsl(30, 20%, 50%)"},prolog:{color:"hsl(30, 20%, 50%)"},doctype:{color:"hsl(30, 20%, 50%)"},cdata:{color:"hsl(30, 20%, 50%)"},punctuation:{Opacity:".7"},namespace:{Opacity:".7"},property:{color:"hsl(350, 40%, 70%)"},tag:{color:"hsl(350, 40%, 70%)"},boolean:{color:"hsl(350, 40%, 70%)"},number:{color:"hsl(350, 40%, 70%)"},constant:{color:"hsl(350, 40%, 70%)"},symbol:{color:"hsl(350, 40%, 70%)"},selector:{color:"hsl(75, 70%, 60%)"},"attr-name":{color:"hsl(75, 70%, 60%)"},string:{color:"hsl(75, 70%, 60%)"},char:{color:"hsl(75, 70%, 60%)"},builtin:{color:"hsl(75, 70%, 60%)"},inserted:{color:"hsl(75, 70%, 60%)"},operator:{color:"hsl(40, 90%, 60%)"},entity:{color:"hsl(40, 90%, 60%)",cursor:"help"},url:{color:"hsl(40, 90%, 60%)"},".language-css .token.string":{color:"hsl(40, 90%, 60%)"},".style .token.string":{color:"hsl(40, 90%, 60%)"},variable:{color:"hsl(40, 90%, 60%)"},atrule:{color:"hsl(350, 40%, 70%)"},"attr-value":{color:"hsl(350, 40%, 70%)"},keyword:{color:"hsl(350, 40%, 70%)"},regex:{color:"#e90"},important:{color:"#e90",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},deleted:{color:"red"}};e.default=t}(CE)),CE}var _E={},m5;function Mwe(){return m5||(m5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"black",color:"white",boxShadow:"-.3em 0 0 .3em black, .3em 0 0 .3em black"},'pre[class*="language-"]':{fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:".4em .8em",margin:".5em 0",overflow:"auto",background:`url('data:image/svg+xml;charset=utf-8,%0D%0A%0D%0A%0D%0A<%2Fsvg>')`,backgroundSize:"1em 1em"},':not(pre) > code[class*="language-"]':{padding:".2em",borderRadius:".3em",boxShadow:"none",whiteSpace:"normal"},comment:{color:"#aaa"},prolog:{color:"#aaa"},doctype:{color:"#aaa"},cdata:{color:"#aaa"},punctuation:{color:"#999"},namespace:{Opacity:".7"},property:{color:"#0cf"},tag:{color:"#0cf"},boolean:{color:"#0cf"},number:{color:"#0cf"},constant:{color:"#0cf"},symbol:{color:"#0cf"},selector:{color:"yellow"},"attr-name":{color:"yellow"},string:{color:"yellow"},char:{color:"yellow"},builtin:{color:"yellow"},operator:{color:"yellowgreen"},entity:{color:"yellowgreen",cursor:"help"},url:{color:"yellowgreen"},".language-css .token.string":{color:"yellowgreen"},variable:{color:"yellowgreen"},inserted:{color:"yellowgreen"},atrule:{color:"deeppink"},"attr-value":{color:"deeppink"},keyword:{color:"deeppink"},regex:{color:"orange"},important:{color:"orange",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},deleted:{color:"red"},"pre.diff-highlight.diff-highlight > code .token.deleted:not(.prefix)":{backgroundColor:"rgba(255, 0, 0, .3)",display:"inline"},"pre > code.diff-highlight.diff-highlight .token.deleted:not(.prefix)":{backgroundColor:"rgba(255, 0, 0, .3)",display:"inline"},"pre.diff-highlight.diff-highlight > code .token.inserted:not(.prefix)":{backgroundColor:"rgba(0, 255, 128, .3)",display:"inline"},"pre > code.diff-highlight.diff-highlight .token.inserted:not(.prefix)":{backgroundColor:"rgba(0, 255, 128, .3)",display:"inline"}};e.default=t}(_E)),_E}var AE={},h5;function Pwe(){return h5||(h5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#f8f8f2",background:"none",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#f8f8f2",background:"#272822",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",borderRadius:"0.3em"},':not(pre) > code[class*="language-"]':{background:"#272822",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#8292a2"},prolog:{color:"#8292a2"},doctype:{color:"#8292a2"},cdata:{color:"#8292a2"},punctuation:{color:"#f8f8f2"},namespace:{Opacity:".7"},property:{color:"#f92672"},tag:{color:"#f92672"},constant:{color:"#f92672"},symbol:{color:"#f92672"},deleted:{color:"#f92672"},boolean:{color:"#ae81ff"},number:{color:"#ae81ff"},selector:{color:"#a6e22e"},"attr-name":{color:"#a6e22e"},string:{color:"#a6e22e"},char:{color:"#a6e22e"},builtin:{color:"#a6e22e"},inserted:{color:"#a6e22e"},operator:{color:"#f8f8f2"},entity:{color:"#f8f8f2",cursor:"help"},url:{color:"#f8f8f2"},".language-css .token.string":{color:"#f8f8f2"},".style .token.string":{color:"#f8f8f2"},variable:{color:"#f8f8f2"},atrule:{color:"#e6db74"},"attr-value":{color:"#e6db74"},function:{color:"#e6db74"},"class-name":{color:"#e6db74"},keyword:{color:"#66d9ef"},regex:{color:"#fd971f"},important:{color:"#fd971f",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(AE)),AE}var TE={},b5;function $we(){return b5||(b5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#657b83",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#657b83",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",borderRadius:"0.3em",backgroundColor:"#fdf6e3"},'pre[class*="language-"]::-moz-selection':{background:"#073642"},'pre[class*="language-"] ::-moz-selection':{background:"#073642"},'code[class*="language-"]::-moz-selection':{background:"#073642"},'code[class*="language-"] ::-moz-selection':{background:"#073642"},'pre[class*="language-"]::selection':{background:"#073642"},'pre[class*="language-"] ::selection':{background:"#073642"},'code[class*="language-"]::selection':{background:"#073642"},'code[class*="language-"] ::selection':{background:"#073642"},':not(pre) > code[class*="language-"]':{backgroundColor:"#fdf6e3",padding:".1em",borderRadius:".3em"},comment:{color:"#93a1a1"},prolog:{color:"#93a1a1"},doctype:{color:"#93a1a1"},cdata:{color:"#93a1a1"},punctuation:{color:"#586e75"},namespace:{Opacity:".7"},property:{color:"#268bd2"},tag:{color:"#268bd2"},boolean:{color:"#268bd2"},number:{color:"#268bd2"},constant:{color:"#268bd2"},symbol:{color:"#268bd2"},deleted:{color:"#268bd2"},selector:{color:"#2aa198"},"attr-name":{color:"#2aa198"},string:{color:"#2aa198"},char:{color:"#2aa198"},builtin:{color:"#2aa198"},url:{color:"#2aa198"},inserted:{color:"#2aa198"},entity:{color:"#657b83",background:"#eee8d5",cursor:"help"},atrule:{color:"#859900"},"attr-value":{color:"#859900"},keyword:{color:"#859900"},function:{color:"#b58900"},"class-name":{color:"#b58900"},regex:{color:"#cb4b16"},important:{color:"#cb4b16",fontWeight:"bold"},variable:{color:"#cb4b16"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(TE)),TE}var RE={},y5;function Fwe(){return y5||(y5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#ccc",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#ccc",background:"#2d2d2d",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto"},':not(pre) > code[class*="language-"]':{background:"#2d2d2d",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#999"},"block-comment":{color:"#999"},prolog:{color:"#999"},doctype:{color:"#999"},cdata:{color:"#999"},punctuation:{color:"#ccc"},tag:{color:"#e2777a"},"attr-name":{color:"#e2777a"},namespace:{color:"#e2777a"},deleted:{color:"#e2777a"},"function-name":{color:"#6196cc"},boolean:{color:"#f08d49"},number:{color:"#f08d49"},function:{color:"#f08d49"},property:{color:"#f8c555"},"class-name":{color:"#f8c555"},constant:{color:"#f8c555"},symbol:{color:"#f8c555"},selector:{color:"#cc99cd"},important:{color:"#cc99cd",fontWeight:"bold"},atrule:{color:"#cc99cd"},keyword:{color:"#cc99cd"},builtin:{color:"#cc99cd"},string:{color:"#7ec699"},char:{color:"#7ec699"},"attr-value":{color:"#7ec699"},regex:{color:"#7ec699"},variable:{color:"#7ec699"},operator:{color:"#67cdcc"},entity:{color:"#67cdcc",cursor:"help"},url:{color:"#67cdcc"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},inserted:{color:"green"}};e.default=t}(RE)),RE}var NE={},v5;function jwe(){return v5||(v5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"white",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",textShadow:"0 -.1em .2em black",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"white",background:"hsl(0, 0%, 8%)",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",textShadow:"0 -.1em .2em black",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",borderRadius:".5em",border:".3em solid hsl(0, 0%, 33%)",boxShadow:"1px 1px .5em black inset",margin:".5em 0",overflow:"auto",padding:"1em"},':not(pre) > code[class*="language-"]':{background:"hsl(0, 0%, 8%)",borderRadius:".3em",border:".13em solid hsl(0, 0%, 33%)",boxShadow:"1px 1px .3em -.1em black inset",padding:".15em .2em .05em",whiteSpace:"normal"},'pre[class*="language-"]::-moz-selection':{background:"hsla(0, 0%, 93%, 0.15)",textShadow:"none"},'pre[class*="language-"]::selection':{background:"hsla(0, 0%, 93%, 0.15)",textShadow:"none"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},'code[class*="language-"]::selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},'code[class*="language-"] ::selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},comment:{color:"hsl(0, 0%, 47%)"},prolog:{color:"hsl(0, 0%, 47%)"},doctype:{color:"hsl(0, 0%, 47%)"},cdata:{color:"hsl(0, 0%, 47%)"},punctuation:{Opacity:".7"},namespace:{Opacity:".7"},tag:{color:"hsl(14, 58%, 55%)"},boolean:{color:"hsl(14, 58%, 55%)"},number:{color:"hsl(14, 58%, 55%)"},deleted:{color:"hsl(14, 58%, 55%)"},keyword:{color:"hsl(53, 89%, 79%)"},property:{color:"hsl(53, 89%, 79%)"},selector:{color:"hsl(53, 89%, 79%)"},constant:{color:"hsl(53, 89%, 79%)"},symbol:{color:"hsl(53, 89%, 79%)"},builtin:{color:"hsl(53, 89%, 79%)"},"attr-name":{color:"hsl(76, 21%, 52%)"},"attr-value":{color:"hsl(76, 21%, 52%)"},string:{color:"hsl(76, 21%, 52%)"},char:{color:"hsl(76, 21%, 52%)"},operator:{color:"hsl(76, 21%, 52%)"},entity:{color:"hsl(76, 21%, 52%)",cursor:"help"},url:{color:"hsl(76, 21%, 52%)"},".language-css .token.string":{color:"hsl(76, 21%, 52%)"},".style .token.string":{color:"hsl(76, 21%, 52%)"},variable:{color:"hsl(76, 21%, 52%)"},inserted:{color:"hsl(76, 21%, 52%)"},atrule:{color:"hsl(218, 22%, 55%)"},regex:{color:"hsl(42, 75%, 65%)"},important:{color:"hsl(42, 75%, 65%)",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},".language-markup .token.tag":{color:"hsl(33, 33%, 52%)"},".language-markup .token.attr-name":{color:"hsl(33, 33%, 52%)"},".language-markup .token.punctuation":{color:"hsl(33, 33%, 52%)"},"":{position:"relative",zIndex:"1"},".line-highlight.line-highlight":{background:"linear-gradient(to right, hsla(0, 0%, 33%, .1) 70%, hsla(0, 0%, 33%, 0))",borderBottom:"1px dashed hsl(0, 0%, 33%)",borderTop:"1px dashed hsl(0, 0%, 33%)",marginTop:"0.75em",zIndex:"0"},".line-highlight.line-highlight:before":{backgroundColor:"hsl(215, 15%, 59%)",color:"hsl(24, 20%, 95%)"},".line-highlight.line-highlight[data-end]:after":{backgroundColor:"hsl(215, 15%, 59%)",color:"hsl(24, 20%, 95%)"}};e.default=t}(NE)),NE}var IE={},S5;function zwe(){return S5||(S5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"black",background:"none",textShadow:"0 1px white",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"black",background:"#f5f2f0",textShadow:"0 1px white",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#b3d4fc"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#b3d4fc"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#b3d4fc"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#b3d4fc"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#b3d4fc"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#b3d4fc"},'code[class*="language-"]::selection':{textShadow:"none",background:"#b3d4fc"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#b3d4fc"},':not(pre) > code[class*="language-"]':{background:"#f5f2f0",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"slategray"},prolog:{color:"slategray"},doctype:{color:"slategray"},cdata:{color:"slategray"},punctuation:{color:"#999"},namespace:{Opacity:".7"},property:{color:"#905"},tag:{color:"#905"},boolean:{color:"#905"},number:{color:"#905"},constant:{color:"#905"},symbol:{color:"#905"},deleted:{color:"#905"},selector:{color:"#690"},"attr-name":{color:"#690"},string:{color:"#690"},char:{color:"#690"},builtin:{color:"#690"},inserted:{color:"#690"},operator:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},entity:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)",cursor:"help"},url:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},".language-css .token.string":{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},".style .token.string":{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},atrule:{color:"#07a"},"attr-value":{color:"#07a"},keyword:{color:"#07a"},function:{color:"#DD4A68"},"class-name":{color:"#DD4A68"},regex:{color:"#e90"},important:{color:"#e90",fontWeight:"bold"},variable:{color:"#e90"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(IE)),IE}var OE={},w5;function Uwe(){return w5||(w5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#f8f8f2",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#f8f8f2",background:"#2b2b2b",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto",borderRadius:"0.3em"},':not(pre) > code[class*="language-"]':{background:"#2b2b2b",padding:"0.1em",borderRadius:"0.3em",whiteSpace:"normal"},comment:{color:"#d4d0ab"},prolog:{color:"#d4d0ab"},doctype:{color:"#d4d0ab"},cdata:{color:"#d4d0ab"},punctuation:{color:"#fefefe"},property:{color:"#ffa07a"},tag:{color:"#ffa07a"},constant:{color:"#ffa07a"},symbol:{color:"#ffa07a"},deleted:{color:"#ffa07a"},boolean:{color:"#00e0e0"},number:{color:"#00e0e0"},selector:{color:"#abe338"},"attr-name":{color:"#abe338"},string:{color:"#abe338"},char:{color:"#abe338"},builtin:{color:"#abe338"},inserted:{color:"#abe338"},operator:{color:"#00e0e0"},entity:{color:"#00e0e0",cursor:"help"},url:{color:"#00e0e0"},".language-css .token.string":{color:"#00e0e0"},".style .token.string":{color:"#00e0e0"},variable:{color:"#00e0e0"},atrule:{color:"#ffd700"},"attr-value":{color:"#ffd700"},function:{color:"#ffd700"},keyword:{color:"#00e0e0"},regex:{color:"#ffd700"},important:{color:"#ffd700",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(OE)),OE}var DE={},E5;function Bwe(){return E5||(E5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#c5c8c6",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Inconsolata, Monaco, Consolas, 'Courier New', Courier, monospace",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#c5c8c6",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Inconsolata, Monaco, Consolas, 'Courier New', Courier, monospace",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",borderRadius:"0.3em",background:"#1d1f21"},':not(pre) > code[class*="language-"]':{background:"#1d1f21",padding:".1em",borderRadius:".3em"},comment:{color:"#7C7C7C"},prolog:{color:"#7C7C7C"},doctype:{color:"#7C7C7C"},cdata:{color:"#7C7C7C"},punctuation:{color:"#c5c8c6"},".namespace":{Opacity:".7"},property:{color:"#96CBFE"},keyword:{color:"#96CBFE"},tag:{color:"#96CBFE"},"class-name":{color:"#FFFFB6",textDecoration:"underline"},boolean:{color:"#99CC99"},constant:{color:"#99CC99"},symbol:{color:"#f92672"},deleted:{color:"#f92672"},number:{color:"#FF73FD"},selector:{color:"#A8FF60"},"attr-name":{color:"#A8FF60"},string:{color:"#A8FF60"},char:{color:"#A8FF60"},builtin:{color:"#A8FF60"},inserted:{color:"#A8FF60"},variable:{color:"#C6C5FE"},operator:{color:"#EDEDED"},entity:{color:"#FFFFB6",cursor:"help"},url:{color:"#96CBFE"},".language-css .token.string":{color:"#87C38A"},".style .token.string":{color:"#87C38A"},atrule:{color:"#F9EE98"},"attr-value":{color:"#F9EE98"},function:{color:"#DAD085"},regex:{color:"#E9C062"},important:{color:"#fd971f",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(DE)),DE}var LE={},x5;function Hwe(){return x5||(x5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#f5f7ff",color:"#5e6687"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#f5f7ff",color:"#5e6687",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#dfe2f1"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#dfe2f1"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#dfe2f1"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#dfe2f1"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#dfe2f1"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#dfe2f1"},'code[class*="language-"]::selection':{textShadow:"none",background:"#dfe2f1"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#dfe2f1"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#898ea4"},prolog:{color:"#898ea4"},doctype:{color:"#898ea4"},cdata:{color:"#898ea4"},punctuation:{color:"#5e6687"},namespace:{Opacity:".7"},operator:{color:"#c76b29"},boolean:{color:"#c76b29"},number:{color:"#c76b29"},property:{color:"#c08b30"},tag:{color:"#3d8fd1"},string:{color:"#22a2c9"},selector:{color:"#6679cc"},"attr-name":{color:"#c76b29"},entity:{color:"#22a2c9",cursor:"help"},url:{color:"#22a2c9"},".language-css .token.string":{color:"#22a2c9"},".style .token.string":{color:"#22a2c9"},"attr-value":{color:"#ac9739"},keyword:{color:"#ac9739"},control:{color:"#ac9739"},directive:{color:"#ac9739"},unit:{color:"#ac9739"},statement:{color:"#22a2c9"},regex:{color:"#22a2c9"},atrule:{color:"#22a2c9"},placeholder:{color:"#3d8fd1"},variable:{color:"#3d8fd1"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #202746",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#c94922"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:"0.4em solid #c94922",OutlineOffset:".4em"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"#dfe2f1"},".line-numbers .line-numbers-rows > span:before":{color:"#979db4"},".line-highlight.line-highlight":{background:"linear-gradient(to right, rgba(107, 115, 148, 0.2) 70%, rgba(107, 115, 148, 0))"}};e.default=t}(LE)),LE}var ME={},k5;function Vwe(){return k5||(k5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#fff",textShadow:"0 1px 1px #000",fontFamily:'Menlo, Monaco, "Courier New", monospace',direction:"ltr",textAlign:"left",wordSpacing:"normal",whiteSpace:"pre",wordWrap:"normal",lineHeight:"1.4",background:"none",border:"0",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#fff",textShadow:"0 1px 1px #000",fontFamily:'Menlo, Monaco, "Courier New", monospace',direction:"ltr",textAlign:"left",wordSpacing:"normal",whiteSpace:"pre",wordWrap:"normal",lineHeight:"1.4",background:"#222",border:"0",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"15px",margin:"1em 0",overflow:"auto",MozBorderRadius:"8px",WebkitBorderRadius:"8px",borderRadius:"8px"},'pre[class*="language-"] code':{float:"left",padding:"0 15px 0 0"},':not(pre) > code[class*="language-"]':{background:"#222",padding:"5px 10px",lineHeight:"1",MozBorderRadius:"3px",WebkitBorderRadius:"3px",borderRadius:"3px"},comment:{color:"#797979"},prolog:{color:"#797979"},doctype:{color:"#797979"},cdata:{color:"#797979"},selector:{color:"#fff"},operator:{color:"#fff"},punctuation:{color:"#fff"},namespace:{Opacity:".7"},tag:{color:"#ffd893"},boolean:{color:"#ffd893"},atrule:{color:"#B0C975"},"attr-value":{color:"#B0C975"},hex:{color:"#B0C975"},string:{color:"#B0C975"},property:{color:"#c27628"},entity:{color:"#c27628",cursor:"help"},url:{color:"#c27628"},"attr-name":{color:"#c27628"},keyword:{color:"#c27628"},regex:{color:"#9B71C6"},function:{color:"#e5a638"},constant:{color:"#e5a638"},variable:{color:"#fdfba8"},number:{color:"#8799B0"},important:{color:"#E45734"},deliminator:{color:"#E45734"},".line-highlight.line-highlight":{background:"rgba(255, 255, 255, .2)"},".line-highlight.line-highlight:before":{top:".3em",backgroundColor:"rgba(255, 255, 255, .3)",color:"#fff",MozBorderRadius:"8px",WebkitBorderRadius:"8px",borderRadius:"8px"},".line-highlight.line-highlight[data-end]:after":{top:".3em",backgroundColor:"rgba(255, 255, 255, .3)",color:"#fff",MozBorderRadius:"8px",WebkitBorderRadius:"8px",borderRadius:"8px"},".line-numbers .line-numbers-rows > span":{borderRight:"3px #d9d336 solid"}};e.default=t}(ME)),ME}var PE={},C5;function qwe(){return C5||(C5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#111b27",background:"none",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#111b27",background:"#e3eaf2",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto"},'pre[class*="language-"]::-moz-selection':{background:"#8da1b9"},'pre[class*="language-"] ::-moz-selection':{background:"#8da1b9"},'code[class*="language-"]::-moz-selection':{background:"#8da1b9"},'code[class*="language-"] ::-moz-selection':{background:"#8da1b9"},'pre[class*="language-"]::selection':{background:"#8da1b9"},'pre[class*="language-"] ::selection':{background:"#8da1b9"},'code[class*="language-"]::selection':{background:"#8da1b9"},'code[class*="language-"] ::selection':{background:"#8da1b9"},':not(pre) > code[class*="language-"]':{background:"#e3eaf2",padding:"0.1em 0.3em",borderRadius:"0.3em",whiteSpace:"normal"},comment:{color:"#3c526d"},prolog:{color:"#3c526d"},doctype:{color:"#3c526d"},cdata:{color:"#3c526d"},punctuation:{color:"#111b27"},"delimiter.important":{color:"#006d6d",fontWeight:"inherit"},"selector.parent":{color:"#006d6d"},tag:{color:"#006d6d"},"tag.punctuation":{color:"#006d6d"},"attr-name":{color:"#755f00"},boolean:{color:"#755f00"},"boolean.important":{color:"#755f00"},number:{color:"#755f00"},constant:{color:"#755f00"},"selector.attribute":{color:"#755f00"},"class-name":{color:"#005a8e"},key:{color:"#005a8e"},parameter:{color:"#005a8e"},property:{color:"#005a8e"},"property-access":{color:"#005a8e"},variable:{color:"#005a8e"},"attr-value":{color:"#116b00"},inserted:{color:"#116b00"},color:{color:"#116b00"},"selector.value":{color:"#116b00"},string:{color:"#116b00"},"string.url-link":{color:"#116b00"},builtin:{color:"#af00af"},"keyword-array":{color:"#af00af"},package:{color:"#af00af"},regex:{color:"#af00af"},function:{color:"#7c00aa"},"selector.class":{color:"#7c00aa"},"selector.id":{color:"#7c00aa"},"atrule.rule":{color:"#a04900"},combinator:{color:"#a04900"},keyword:{color:"#a04900"},operator:{color:"#a04900"},"pseudo-class":{color:"#a04900"},"pseudo-element":{color:"#a04900"},selector:{color:"#a04900"},unit:{color:"#a04900"},deleted:{color:"#c22f2e"},important:{color:"#c22f2e",fontWeight:"bold"},"keyword-this":{color:"#005a8e",fontWeight:"bold"},this:{color:"#005a8e",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},entity:{cursor:"help"},".language-markdown .token.title":{color:"#005a8e",fontWeight:"bold"},".language-markdown .token.title .token.punctuation":{color:"#005a8e",fontWeight:"bold"},".language-markdown .token.blockquote.punctuation":{color:"#af00af"},".language-markdown .token.code":{color:"#006d6d"},".language-markdown .token.hr.punctuation":{color:"#005a8e"},".language-markdown .token.url > .token.content":{color:"#116b00"},".language-markdown .token.url-link":{color:"#755f00"},".language-markdown .token.list.punctuation":{color:"#af00af"},".language-markdown .token.table-header":{color:"#111b27"},".language-json .token.operator":{color:"#111b27"},".language-scss .token.variable":{color:"#006d6d"},"token.tab:not(:empty):before":{color:"#3c526d"},"token.cr:before":{color:"#3c526d"},"token.lf:before":{color:"#3c526d"},"token.space:before":{color:"#3c526d"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a":{color:"#e3eaf2",background:"#005a8e"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button":{color:"#e3eaf2",background:"#005a8e"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover":{color:"#e3eaf2",background:"#005a8eda",textDecoration:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus":{color:"#e3eaf2",background:"#005a8eda",textDecoration:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover":{color:"#e3eaf2",background:"#005a8eda",textDecoration:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus":{color:"#e3eaf2",background:"#005a8eda",textDecoration:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span":{color:"#e3eaf2",background:"#3c526d"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover":{color:"#e3eaf2",background:"#3c526d"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus":{color:"#e3eaf2",background:"#3c526d"},".line-highlight.line-highlight":{background:"linear-gradient(to right, #8da1b92f 70%, #8da1b925)"},".line-highlight.line-highlight:before":{backgroundColor:"#3c526d",color:"#e3eaf2",boxShadow:"0 1px #8da1b9"},".line-highlight.line-highlight[data-end]:after":{backgroundColor:"#3c526d",color:"#e3eaf2",boxShadow:"0 1px #8da1b9"},"pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before":{backgroundColor:"#3c526d1f"},".line-numbers.line-numbers .line-numbers-rows":{borderRight:"1px solid #8da1b97a",background:"#d0dae77a"},".line-numbers .line-numbers-rows > span:before":{color:"#3c526dda"},".rainbow-braces .token.token.punctuation.brace-level-1":{color:"#755f00"},".rainbow-braces .token.token.punctuation.brace-level-5":{color:"#755f00"},".rainbow-braces .token.token.punctuation.brace-level-9":{color:"#755f00"},".rainbow-braces .token.token.punctuation.brace-level-2":{color:"#af00af"},".rainbow-braces .token.token.punctuation.brace-level-6":{color:"#af00af"},".rainbow-braces .token.token.punctuation.brace-level-10":{color:"#af00af"},".rainbow-braces .token.token.punctuation.brace-level-3":{color:"#005a8e"},".rainbow-braces .token.token.punctuation.brace-level-7":{color:"#005a8e"},".rainbow-braces .token.token.punctuation.brace-level-11":{color:"#005a8e"},".rainbow-braces .token.token.punctuation.brace-level-4":{color:"#7c00aa"},".rainbow-braces .token.token.punctuation.brace-level-8":{color:"#7c00aa"},".rainbow-braces .token.token.punctuation.brace-level-12":{color:"#7c00aa"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)":{backgroundColor:"#c22f2e1f"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)":{backgroundColor:"#c22f2e1f"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)":{backgroundColor:"#116b001f"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)":{backgroundColor:"#116b001f"},".command-line .command-line-prompt":{borderRight:"1px solid #8da1b97a"},".command-line .command-line-prompt > span:before":{color:"#3c526dda"}};e.default=t}(PE)),PE}var $E={},_5;function Gwe(){return _5||(_5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#e3eaf2",background:"none",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#e3eaf2",background:"#111b27",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto"},'pre[class*="language-"]::-moz-selection':{background:"#3c526d"},'pre[class*="language-"] ::-moz-selection':{background:"#3c526d"},'code[class*="language-"]::-moz-selection':{background:"#3c526d"},'code[class*="language-"] ::-moz-selection':{background:"#3c526d"},'pre[class*="language-"]::selection':{background:"#3c526d"},'pre[class*="language-"] ::selection':{background:"#3c526d"},'code[class*="language-"]::selection':{background:"#3c526d"},'code[class*="language-"] ::selection':{background:"#3c526d"},':not(pre) > code[class*="language-"]':{background:"#111b27",padding:"0.1em 0.3em",borderRadius:"0.3em",whiteSpace:"normal"},comment:{color:"#8da1b9"},prolog:{color:"#8da1b9"},doctype:{color:"#8da1b9"},cdata:{color:"#8da1b9"},punctuation:{color:"#e3eaf2"},"delimiter.important":{color:"#66cccc",fontWeight:"inherit"},"selector.parent":{color:"#66cccc"},tag:{color:"#66cccc"},"tag.punctuation":{color:"#66cccc"},"attr-name":{color:"#e6d37a"},boolean:{color:"#e6d37a"},"boolean.important":{color:"#e6d37a"},number:{color:"#e6d37a"},constant:{color:"#e6d37a"},"selector.attribute":{color:"#e6d37a"},"class-name":{color:"#6cb8e6"},key:{color:"#6cb8e6"},parameter:{color:"#6cb8e6"},property:{color:"#6cb8e6"},"property-access":{color:"#6cb8e6"},variable:{color:"#6cb8e6"},"attr-value":{color:"#91d076"},inserted:{color:"#91d076"},color:{color:"#91d076"},"selector.value":{color:"#91d076"},string:{color:"#91d076"},"string.url-link":{color:"#91d076"},builtin:{color:"#f4adf4"},"keyword-array":{color:"#f4adf4"},package:{color:"#f4adf4"},regex:{color:"#f4adf4"},function:{color:"#c699e3"},"selector.class":{color:"#c699e3"},"selector.id":{color:"#c699e3"},"atrule.rule":{color:"#e9ae7e"},combinator:{color:"#e9ae7e"},keyword:{color:"#e9ae7e"},operator:{color:"#e9ae7e"},"pseudo-class":{color:"#e9ae7e"},"pseudo-element":{color:"#e9ae7e"},selector:{color:"#e9ae7e"},unit:{color:"#e9ae7e"},deleted:{color:"#cd6660"},important:{color:"#cd6660",fontWeight:"bold"},"keyword-this":{color:"#6cb8e6",fontWeight:"bold"},this:{color:"#6cb8e6",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},entity:{cursor:"help"},".language-markdown .token.title":{color:"#6cb8e6",fontWeight:"bold"},".language-markdown .token.title .token.punctuation":{color:"#6cb8e6",fontWeight:"bold"},".language-markdown .token.blockquote.punctuation":{color:"#f4adf4"},".language-markdown .token.code":{color:"#66cccc"},".language-markdown .token.hr.punctuation":{color:"#6cb8e6"},".language-markdown .token.url .token.content":{color:"#91d076"},".language-markdown .token.url-link":{color:"#e6d37a"},".language-markdown .token.list.punctuation":{color:"#f4adf4"},".language-markdown .token.table-header":{color:"#e3eaf2"},".language-json .token.operator":{color:"#e3eaf2"},".language-scss .token.variable":{color:"#66cccc"},"token.tab:not(:empty):before":{color:"#8da1b9"},"token.cr:before":{color:"#8da1b9"},"token.lf:before":{color:"#8da1b9"},"token.space:before":{color:"#8da1b9"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a":{color:"#111b27",background:"#6cb8e6"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button":{color:"#111b27",background:"#6cb8e6"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover":{color:"#111b27",background:"#6cb8e6da",textDecoration:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus":{color:"#111b27",background:"#6cb8e6da",textDecoration:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover":{color:"#111b27",background:"#6cb8e6da",textDecoration:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus":{color:"#111b27",background:"#6cb8e6da",textDecoration:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span":{color:"#111b27",background:"#8da1b9"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover":{color:"#111b27",background:"#8da1b9"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus":{color:"#111b27",background:"#8da1b9"},".line-highlight.line-highlight":{background:"linear-gradient(to right, #3c526d5f 70%, #3c526d55)"},".line-highlight.line-highlight:before":{backgroundColor:"#8da1b9",color:"#111b27",boxShadow:"0 1px #3c526d"},".line-highlight.line-highlight[data-end]:after":{backgroundColor:"#8da1b9",color:"#111b27",boxShadow:"0 1px #3c526d"},"pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before":{backgroundColor:"#8da1b918"},".line-numbers.line-numbers .line-numbers-rows":{borderRight:"1px solid #0b121b",background:"#0b121b7a"},".line-numbers .line-numbers-rows > span:before":{color:"#8da1b9da"},".rainbow-braces .token.token.punctuation.brace-level-1":{color:"#e6d37a"},".rainbow-braces .token.token.punctuation.brace-level-5":{color:"#e6d37a"},".rainbow-braces .token.token.punctuation.brace-level-9":{color:"#e6d37a"},".rainbow-braces .token.token.punctuation.brace-level-2":{color:"#f4adf4"},".rainbow-braces .token.token.punctuation.brace-level-6":{color:"#f4adf4"},".rainbow-braces .token.token.punctuation.brace-level-10":{color:"#f4adf4"},".rainbow-braces .token.token.punctuation.brace-level-3":{color:"#6cb8e6"},".rainbow-braces .token.token.punctuation.brace-level-7":{color:"#6cb8e6"},".rainbow-braces .token.token.punctuation.brace-level-11":{color:"#6cb8e6"},".rainbow-braces .token.token.punctuation.brace-level-4":{color:"#c699e3"},".rainbow-braces .token.token.punctuation.brace-level-8":{color:"#c699e3"},".rainbow-braces .token.token.punctuation.brace-level-12":{color:"#c699e3"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)":{backgroundColor:"#cd66601f"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)":{backgroundColor:"#cd66601f"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)":{backgroundColor:"#91d0761f"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)":{backgroundColor:"#91d0761f"},".command-line .command-line-prompt":{borderRight:"1px solid #0b121b"},".command-line .command-line-prompt > span:before":{color:"#8da1b9da"}};e.default=t}($E)),$E}var FE={},A5;function Wwe(){return A5||(A5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"black",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"black",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",position:"relative",borderLeft:"10px solid #358ccb",boxShadow:"-1px 0 0 0 #358ccb, 0 0 0 1px #dfdfdf",backgroundColor:"#fdfdfd",backgroundImage:"linear-gradient(transparent 50%, rgba(69, 142, 209, 0.04) 50%)",backgroundSize:"3em 3em",backgroundOrigin:"content-box",backgroundAttachment:"local",margin:".5em 0",padding:"0 1em"},'pre[class*="language-"] > code':{display:"block"},':not(pre) > code[class*="language-"]':{position:"relative",padding:".2em",borderRadius:"0.3em",color:"#c92c2c",border:"1px solid rgba(0, 0, 0, 0.1)",display:"inline",whiteSpace:"normal",backgroundColor:"#fdfdfd",WebkitBoxSizing:"border-box",MozBoxSizing:"border-box",boxSizing:"border-box"},comment:{color:"#7D8B99"},"block-comment":{color:"#7D8B99"},prolog:{color:"#7D8B99"},doctype:{color:"#7D8B99"},cdata:{color:"#7D8B99"},punctuation:{color:"#5F6364"},property:{color:"#c92c2c"},tag:{color:"#c92c2c"},boolean:{color:"#c92c2c"},number:{color:"#c92c2c"},"function-name":{color:"#c92c2c"},constant:{color:"#c92c2c"},symbol:{color:"#c92c2c"},deleted:{color:"#c92c2c"},selector:{color:"#2f9c0a"},"attr-name":{color:"#2f9c0a"},string:{color:"#2f9c0a"},char:{color:"#2f9c0a"},function:{color:"#2f9c0a"},builtin:{color:"#2f9c0a"},inserted:{color:"#2f9c0a"},operator:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},entity:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)",cursor:"help"},url:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},variable:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},atrule:{color:"#1990b8"},"attr-value":{color:"#1990b8"},keyword:{color:"#1990b8"},"class-name":{color:"#1990b8"},regex:{color:"#e90"},important:{color:"#e90",fontWeight:"normal"},".language-css .token.string":{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},".style .token.string":{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},namespace:{Opacity:".7"}};e.default=t}(FE)),FE}var jE={},T5;function Kwe(){return T5||(T5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#a9b7c6",fontFamily:"Consolas, Monaco, 'Andale Mono', monospace",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#a9b7c6",fontFamily:"Consolas, Monaco, 'Andale Mono', monospace",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",background:"#2b2b2b"},'pre[class*="language-"]::-moz-selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'pre[class*="language-"] ::-moz-selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'code[class*="language-"]::-moz-selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'code[class*="language-"] ::-moz-selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'pre[class*="language-"]::selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'pre[class*="language-"] ::selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'code[class*="language-"]::selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'code[class*="language-"] ::selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},':not(pre) > code[class*="language-"]':{background:"#2b2b2b",padding:".1em",borderRadius:".3em"},comment:{color:"#808080"},prolog:{color:"#808080"},cdata:{color:"#808080"},delimiter:{color:"#cc7832"},boolean:{color:"#cc7832"},keyword:{color:"#cc7832"},selector:{color:"#cc7832"},important:{color:"#cc7832"},atrule:{color:"#cc7832"},operator:{color:"#a9b7c6"},punctuation:{color:"#a9b7c6"},"attr-name":{color:"#a9b7c6"},tag:{color:"#e8bf6a"},"tag.punctuation":{color:"#e8bf6a"},doctype:{color:"#e8bf6a"},builtin:{color:"#e8bf6a"},entity:{color:"#6897bb"},number:{color:"#6897bb"},symbol:{color:"#6897bb"},property:{color:"#9876aa"},constant:{color:"#9876aa"},variable:{color:"#9876aa"},string:{color:"#6a8759"},char:{color:"#6a8759"},"attr-value":{color:"#a5c261"},"attr-value.punctuation":{color:"#a5c261"},"attr-value.punctuation:first-child":{color:"#a9b7c6"},url:{color:"#287bde",textDecoration:"underline"},function:{color:"#ffc66d"},regex:{background:"#364135"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},inserted:{background:"#294436"},deleted:{background:"#484a4a"},"code.language-css .token.property":{color:"#a9b7c6"},"code.language-css .token.property + .token.punctuation":{color:"#a9b7c6"},"code.language-css .token.id":{color:"#ffc66d"},"code.language-css .token.selector > .token.class":{color:"#ffc66d"},"code.language-css .token.selector > .token.attribute":{color:"#ffc66d"},"code.language-css .token.selector > .token.pseudo-class":{color:"#ffc66d"},"code.language-css .token.selector > .token.pseudo-element":{color:"#ffc66d"}};e.default=t}(jE)),jE}var zE={},R5;function Ywe(){return R5||(R5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#f8f8f2",background:"none",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#f8f8f2",background:"#282a36",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",borderRadius:"0.3em"},':not(pre) > code[class*="language-"]':{background:"#282a36",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#6272a4"},prolog:{color:"#6272a4"},doctype:{color:"#6272a4"},cdata:{color:"#6272a4"},punctuation:{color:"#f8f8f2"},".namespace":{Opacity:".7"},property:{color:"#ff79c6"},tag:{color:"#ff79c6"},constant:{color:"#ff79c6"},symbol:{color:"#ff79c6"},deleted:{color:"#ff79c6"},boolean:{color:"#bd93f9"},number:{color:"#bd93f9"},selector:{color:"#50fa7b"},"attr-name":{color:"#50fa7b"},string:{color:"#50fa7b"},char:{color:"#50fa7b"},builtin:{color:"#50fa7b"},inserted:{color:"#50fa7b"},operator:{color:"#f8f8f2"},entity:{color:"#f8f8f2",cursor:"help"},url:{color:"#f8f8f2"},".language-css .token.string":{color:"#f8f8f2"},".style .token.string":{color:"#f8f8f2"},variable:{color:"#f8f8f2"},atrule:{color:"#f1fa8c"},"attr-value":{color:"#f1fa8c"},function:{color:"#f1fa8c"},"class-name":{color:"#f1fa8c"},keyword:{color:"#8be9fd"},regex:{color:"#ffb86c"},important:{color:"#ffb86c",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(zE)),zE}var UE={},N5;function Zwe(){return N5||(N5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#2a2734",color:"#9a86fd"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#2a2734",color:"#9a86fd",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#6a51e6"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#6a51e6"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#6a51e6"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#6a51e6"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#6a51e6"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#6a51e6"},'code[class*="language-"]::selection':{textShadow:"none",background:"#6a51e6"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#6a51e6"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#6c6783"},prolog:{color:"#6c6783"},doctype:{color:"#6c6783"},cdata:{color:"#6c6783"},punctuation:{color:"#6c6783"},namespace:{Opacity:".7"},tag:{color:"#e09142"},operator:{color:"#e09142"},number:{color:"#e09142"},property:{color:"#9a86fd"},function:{color:"#9a86fd"},"tag-id":{color:"#eeebff"},selector:{color:"#eeebff"},"atrule-id":{color:"#eeebff"},"code.language-javascript":{color:"#c4b9fe"},"attr-name":{color:"#c4b9fe"},"code.language-css":{color:"#ffcc99"},"code.language-scss":{color:"#ffcc99"},boolean:{color:"#ffcc99"},string:{color:"#ffcc99"},entity:{color:"#ffcc99",cursor:"help"},url:{color:"#ffcc99"},".language-css .token.string":{color:"#ffcc99"},".language-scss .token.string":{color:"#ffcc99"},".style .token.string":{color:"#ffcc99"},"attr-value":{color:"#ffcc99"},keyword:{color:"#ffcc99"},control:{color:"#ffcc99"},directive:{color:"#ffcc99"},unit:{color:"#ffcc99"},statement:{color:"#ffcc99"},regex:{color:"#ffcc99"},atrule:{color:"#ffcc99"},placeholder:{color:"#ffcc99"},variable:{color:"#ffcc99"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #eeebff",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#c4b9fe"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #8a75f5",OutlineOffset:".4em"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"#2c2937"},".line-numbers .line-numbers-rows > span:before":{color:"#3c3949"},".line-highlight.line-highlight":{background:"linear-gradient(to right, rgba(224, 145, 66, 0.2) 70%, rgba(224, 145, 66, 0))"}};e.default=t}(UE)),UE}var BE={},I5;function Xwe(){return I5||(I5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#322d29",color:"#88786d"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#322d29",color:"#88786d",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#6f5849"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#6f5849"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#6f5849"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#6f5849"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#6f5849"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#6f5849"},'code[class*="language-"]::selection':{textShadow:"none",background:"#6f5849"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#6f5849"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#6a5f58"},prolog:{color:"#6a5f58"},doctype:{color:"#6a5f58"},cdata:{color:"#6a5f58"},punctuation:{color:"#6a5f58"},namespace:{Opacity:".7"},tag:{color:"#bfa05a"},operator:{color:"#bfa05a"},number:{color:"#bfa05a"},property:{color:"#88786d"},function:{color:"#88786d"},"tag-id":{color:"#fff3eb"},selector:{color:"#fff3eb"},"atrule-id":{color:"#fff3eb"},"code.language-javascript":{color:"#a48774"},"attr-name":{color:"#a48774"},"code.language-css":{color:"#fcc440"},"code.language-scss":{color:"#fcc440"},boolean:{color:"#fcc440"},string:{color:"#fcc440"},entity:{color:"#fcc440",cursor:"help"},url:{color:"#fcc440"},".language-css .token.string":{color:"#fcc440"},".language-scss .token.string":{color:"#fcc440"},".style .token.string":{color:"#fcc440"},"attr-value":{color:"#fcc440"},keyword:{color:"#fcc440"},control:{color:"#fcc440"},directive:{color:"#fcc440"},unit:{color:"#fcc440"},statement:{color:"#fcc440"},regex:{color:"#fcc440"},atrule:{color:"#fcc440"},placeholder:{color:"#fcc440"},variable:{color:"#fcc440"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #fff3eb",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#a48774"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #816d5f",OutlineOffset:".4em"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"#35302b"},".line-numbers .line-numbers-rows > span:before":{color:"#46403d"},".line-highlight.line-highlight":{background:"linear-gradient(to right, rgba(191, 160, 90, 0.2) 70%, rgba(191, 160, 90, 0))"}};e.default=t}(BE)),BE}var HE={},O5;function Qwe(){return O5||(O5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#2a2d2a",color:"#687d68"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#2a2d2a",color:"#687d68",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#435643"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#435643"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#435643"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#435643"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#435643"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#435643"},'code[class*="language-"]::selection':{textShadow:"none",background:"#435643"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#435643"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#535f53"},prolog:{color:"#535f53"},doctype:{color:"#535f53"},cdata:{color:"#535f53"},punctuation:{color:"#535f53"},namespace:{Opacity:".7"},tag:{color:"#a2b34d"},operator:{color:"#a2b34d"},number:{color:"#a2b34d"},property:{color:"#687d68"},function:{color:"#687d68"},"tag-id":{color:"#f0fff0"},selector:{color:"#f0fff0"},"atrule-id":{color:"#f0fff0"},"code.language-javascript":{color:"#b3d6b3"},"attr-name":{color:"#b3d6b3"},"code.language-css":{color:"#e5fb79"},"code.language-scss":{color:"#e5fb79"},boolean:{color:"#e5fb79"},string:{color:"#e5fb79"},entity:{color:"#e5fb79",cursor:"help"},url:{color:"#e5fb79"},".language-css .token.string":{color:"#e5fb79"},".language-scss .token.string":{color:"#e5fb79"},".style .token.string":{color:"#e5fb79"},"attr-value":{color:"#e5fb79"},keyword:{color:"#e5fb79"},control:{color:"#e5fb79"},directive:{color:"#e5fb79"},unit:{color:"#e5fb79"},statement:{color:"#e5fb79"},regex:{color:"#e5fb79"},atrule:{color:"#e5fb79"},placeholder:{color:"#e5fb79"},variable:{color:"#e5fb79"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #f0fff0",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#b3d6b3"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #5c705c",OutlineOffset:".4em"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"#2c302c"},".line-numbers .line-numbers-rows > span:before":{color:"#3b423b"},".line-highlight.line-highlight":{background:"linear-gradient(to right, rgba(162, 179, 77, 0.2) 70%, rgba(162, 179, 77, 0))"}};e.default=t}(HE)),HE}var VE={},D5;function Jwe(){return D5||(D5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#faf8f5",color:"#728fcb"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#faf8f5",color:"#728fcb",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#faf8f5"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#faf8f5"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#faf8f5"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#faf8f5"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#faf8f5"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#faf8f5"},'code[class*="language-"]::selection':{textShadow:"none",background:"#faf8f5"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#faf8f5"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#b6ad9a"},prolog:{color:"#b6ad9a"},doctype:{color:"#b6ad9a"},cdata:{color:"#b6ad9a"},punctuation:{color:"#b6ad9a"},namespace:{Opacity:".7"},tag:{color:"#063289"},operator:{color:"#063289"},number:{color:"#063289"},property:{color:"#b29762"},function:{color:"#b29762"},"tag-id":{color:"#2d2006"},selector:{color:"#2d2006"},"atrule-id":{color:"#2d2006"},"code.language-javascript":{color:"#896724"},"attr-name":{color:"#896724"},"code.language-css":{color:"#728fcb"},"code.language-scss":{color:"#728fcb"},boolean:{color:"#728fcb"},string:{color:"#728fcb"},entity:{color:"#728fcb",cursor:"help"},url:{color:"#728fcb"},".language-css .token.string":{color:"#728fcb"},".language-scss .token.string":{color:"#728fcb"},".style .token.string":{color:"#728fcb"},"attr-value":{color:"#728fcb"},keyword:{color:"#728fcb"},control:{color:"#728fcb"},directive:{color:"#728fcb"},unit:{color:"#728fcb"},statement:{color:"#728fcb"},regex:{color:"#728fcb"},atrule:{color:"#728fcb"},placeholder:{color:"#93abdc"},variable:{color:"#93abdc"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #2d2006",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#896724"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #896724",OutlineOffset:".4em"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"#ece8de"},".line-numbers .line-numbers-rows > span:before":{color:"#cdc4b1"},".line-highlight.line-highlight":{background:"linear-gradient(to right, rgba(45, 32, 6, 0.2) 70%, rgba(45, 32, 6, 0))"}};e.default=t}(VE)),VE}var qE={},L5;function e0e(){return L5||(L5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#1d262f",color:"#57718e"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#1d262f",color:"#57718e",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#004a9e"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#004a9e"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#004a9e"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#004a9e"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#004a9e"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#004a9e"},'code[class*="language-"]::selection':{textShadow:"none",background:"#004a9e"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#004a9e"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#4a5f78"},prolog:{color:"#4a5f78"},doctype:{color:"#4a5f78"},cdata:{color:"#4a5f78"},punctuation:{color:"#4a5f78"},namespace:{Opacity:".7"},tag:{color:"#0aa370"},operator:{color:"#0aa370"},number:{color:"#0aa370"},property:{color:"#57718e"},function:{color:"#57718e"},"tag-id":{color:"#ebf4ff"},selector:{color:"#ebf4ff"},"atrule-id":{color:"#ebf4ff"},"code.language-javascript":{color:"#7eb6f6"},"attr-name":{color:"#7eb6f6"},"code.language-css":{color:"#47ebb4"},"code.language-scss":{color:"#47ebb4"},boolean:{color:"#47ebb4"},string:{color:"#47ebb4"},entity:{color:"#47ebb4",cursor:"help"},url:{color:"#47ebb4"},".language-css .token.string":{color:"#47ebb4"},".language-scss .token.string":{color:"#47ebb4"},".style .token.string":{color:"#47ebb4"},"attr-value":{color:"#47ebb4"},keyword:{color:"#47ebb4"},control:{color:"#47ebb4"},directive:{color:"#47ebb4"},unit:{color:"#47ebb4"},statement:{color:"#47ebb4"},regex:{color:"#47ebb4"},atrule:{color:"#47ebb4"},placeholder:{color:"#47ebb4"},variable:{color:"#47ebb4"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #ebf4ff",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#7eb6f6"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #34659d",OutlineOffset:".4em"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"#1f2932"},".line-numbers .line-numbers-rows > span:before":{color:"#2c3847"},".line-highlight.line-highlight":{background:"linear-gradient(to right, rgba(10, 163, 112, 0.2) 70%, rgba(10, 163, 112, 0))"}};e.default=t}(qE)),qE}var GE={},M5;function t0e(){return M5||(M5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#24242e",color:"#767693"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#24242e",color:"#767693",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#5151e6"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#5151e6"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#5151e6"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#5151e6"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#5151e6"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#5151e6"},'code[class*="language-"]::selection':{textShadow:"none",background:"#5151e6"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#5151e6"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#5b5b76"},prolog:{color:"#5b5b76"},doctype:{color:"#5b5b76"},cdata:{color:"#5b5b76"},punctuation:{color:"#5b5b76"},namespace:{Opacity:".7"},tag:{color:"#dd672c"},operator:{color:"#dd672c"},number:{color:"#dd672c"},property:{color:"#767693"},function:{color:"#767693"},"tag-id":{color:"#ebebff"},selector:{color:"#ebebff"},"atrule-id":{color:"#ebebff"},"code.language-javascript":{color:"#aaaaca"},"attr-name":{color:"#aaaaca"},"code.language-css":{color:"#fe8c52"},"code.language-scss":{color:"#fe8c52"},boolean:{color:"#fe8c52"},string:{color:"#fe8c52"},entity:{color:"#fe8c52",cursor:"help"},url:{color:"#fe8c52"},".language-css .token.string":{color:"#fe8c52"},".language-scss .token.string":{color:"#fe8c52"},".style .token.string":{color:"#fe8c52"},"attr-value":{color:"#fe8c52"},keyword:{color:"#fe8c52"},control:{color:"#fe8c52"},directive:{color:"#fe8c52"},unit:{color:"#fe8c52"},statement:{color:"#fe8c52"},regex:{color:"#fe8c52"},atrule:{color:"#fe8c52"},placeholder:{color:"#fe8c52"},variable:{color:"#fe8c52"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #ebebff",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#aaaaca"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #7676f4",OutlineOffset:".4em"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"#262631"},".line-numbers .line-numbers-rows > span:before":{color:"#393949"},".line-highlight.line-highlight":{background:"linear-gradient(to right, rgba(221, 103, 44, 0.2) 70%, rgba(221, 103, 44, 0))"}};e.default=t}(GE)),GE}var WE={},P5;function n0e(){return P5||(P5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#393A34",fontFamily:'"Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",fontSize:".9em",lineHeight:"1.2em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#393A34",fontFamily:'"Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",fontSize:".9em",lineHeight:"1.2em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",border:"1px solid #dddddd",backgroundColor:"white"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{background:"#b3d4fc"},'pre[class*="language-"] ::-moz-selection':{background:"#b3d4fc"},'code[class*="language-"]::-moz-selection':{background:"#b3d4fc"},'code[class*="language-"] ::-moz-selection':{background:"#b3d4fc"},'pre[class*="language-"]::selection':{background:"#b3d4fc"},'pre[class*="language-"] ::selection':{background:"#b3d4fc"},'code[class*="language-"]::selection':{background:"#b3d4fc"},'code[class*="language-"] ::selection':{background:"#b3d4fc"},':not(pre) > code[class*="language-"]':{padding:".2em",paddingTop:"1px",paddingBottom:"1px",background:"#f8f8f8",border:"1px solid #dddddd"},comment:{color:"#999988",fontStyle:"italic"},prolog:{color:"#999988",fontStyle:"italic"},doctype:{color:"#999988",fontStyle:"italic"},cdata:{color:"#999988",fontStyle:"italic"},namespace:{Opacity:".7"},string:{color:"#e3116c"},"attr-value":{color:"#e3116c"},punctuation:{color:"#393A34"},operator:{color:"#393A34"},entity:{color:"#36acaa"},url:{color:"#36acaa"},symbol:{color:"#36acaa"},number:{color:"#36acaa"},boolean:{color:"#36acaa"},variable:{color:"#36acaa"},constant:{color:"#36acaa"},property:{color:"#36acaa"},regex:{color:"#36acaa"},inserted:{color:"#36acaa"},atrule:{color:"#00a4db"},keyword:{color:"#00a4db"},"attr-name":{color:"#00a4db"},".language-autohotkey .token.selector":{color:"#00a4db"},function:{color:"#9a050f",fontWeight:"bold"},deleted:{color:"#9a050f"},".language-autohotkey .token.tag":{color:"#9a050f"},tag:{color:"#00009f"},selector:{color:"#00009f"},".language-autohotkey .token.keyword":{color:"#00009f"},important:{fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(WE)),WE}var KE={},$5;function r0e(){return $5||($5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#ebdbb2",fontFamily:'Consolas, Monaco, "Andale Mono", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#ebdbb2",fontFamily:'Consolas, Monaco, "Andale Mono", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto",background:"#1d2021"},'pre[class*="language-"]::-moz-selection':{color:"#fbf1c7",background:"#7c6f64"},'pre[class*="language-"] ::-moz-selection':{color:"#fbf1c7",background:"#7c6f64"},'code[class*="language-"]::-moz-selection':{color:"#fbf1c7",background:"#7c6f64"},'code[class*="language-"] ::-moz-selection':{color:"#fbf1c7",background:"#7c6f64"},'pre[class*="language-"]::selection':{color:"#fbf1c7",background:"#7c6f64"},'pre[class*="language-"] ::selection':{color:"#fbf1c7",background:"#7c6f64"},'code[class*="language-"]::selection':{color:"#fbf1c7",background:"#7c6f64"},'code[class*="language-"] ::selection':{color:"#fbf1c7",background:"#7c6f64"},':not(pre) > code[class*="language-"]':{background:"#1d2021",padding:"0.1em",borderRadius:"0.3em"},comment:{color:"#a89984"},prolog:{color:"#a89984"},cdata:{color:"#a89984"},delimiter:{color:"#fb4934"},boolean:{color:"#fb4934"},keyword:{color:"#fb4934"},selector:{color:"#fb4934"},important:{color:"#fb4934"},atrule:{color:"#fb4934"},operator:{color:"#a89984"},punctuation:{color:"#a89984"},"attr-name":{color:"#a89984"},tag:{color:"#fabd2f"},"tag.punctuation":{color:"#fabd2f"},doctype:{color:"#fabd2f"},builtin:{color:"#fabd2f"},entity:{color:"#d3869b"},number:{color:"#d3869b"},symbol:{color:"#d3869b"},property:{color:"#fb4934"},constant:{color:"#fb4934"},variable:{color:"#fb4934"},string:{color:"#b8bb26"},char:{color:"#b8bb26"},"attr-value":{color:"#a89984"},"attr-value.punctuation":{color:"#a89984"},url:{color:"#b8bb26",textDecoration:"underline"},function:{color:"#fabd2f"},regex:{background:"#b8bb26"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},inserted:{background:"#a89984"},deleted:{background:"#fb4934"}};e.default=t}(KE)),KE}var YE={},F5;function a0e(){return F5||(F5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#3c3836",fontFamily:'Consolas, Monaco, "Andale Mono", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#3c3836",fontFamily:'Consolas, Monaco, "Andale Mono", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto",background:"#f9f5d7"},'pre[class*="language-"]::-moz-selection':{color:"#282828",background:"#a89984"},'pre[class*="language-"] ::-moz-selection':{color:"#282828",background:"#a89984"},'code[class*="language-"]::-moz-selection':{color:"#282828",background:"#a89984"},'code[class*="language-"] ::-moz-selection':{color:"#282828",background:"#a89984"},'pre[class*="language-"]::selection':{color:"#282828",background:"#a89984"},'pre[class*="language-"] ::selection':{color:"#282828",background:"#a89984"},'code[class*="language-"]::selection':{color:"#282828",background:"#a89984"},'code[class*="language-"] ::selection':{color:"#282828",background:"#a89984"},':not(pre) > code[class*="language-"]':{background:"#f9f5d7",padding:"0.1em",borderRadius:"0.3em"},comment:{color:"#7c6f64"},prolog:{color:"#7c6f64"},cdata:{color:"#7c6f64"},delimiter:{color:"#9d0006"},boolean:{color:"#9d0006"},keyword:{color:"#9d0006"},selector:{color:"#9d0006"},important:{color:"#9d0006"},atrule:{color:"#9d0006"},operator:{color:"#7c6f64"},punctuation:{color:"#7c6f64"},"attr-name":{color:"#7c6f64"},tag:{color:"#b57614"},"tag.punctuation":{color:"#b57614"},doctype:{color:"#b57614"},builtin:{color:"#b57614"},entity:{color:"#8f3f71"},number:{color:"#8f3f71"},symbol:{color:"#8f3f71"},property:{color:"#9d0006"},constant:{color:"#9d0006"},variable:{color:"#9d0006"},string:{color:"#797403"},char:{color:"#797403"},"attr-value":{color:"#7c6f64"},"attr-value.punctuation":{color:"#7c6f64"},url:{color:"#797403",textDecoration:"underline"},function:{color:"#b57614"},regex:{background:"#797403"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},inserted:{background:"#7c6f64"},deleted:{background:"#9d0006"}};e.default=t}(YE)),YE}var ZE={},j5;function o0e(){return j5||(j5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={"code[class*='language-']":{color:"#d6e7ff",background:"#030314",textShadow:"none",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',fontSize:"1em",lineHeight:"1.5",letterSpacing:".2px",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",textAlign:"left",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},"pre[class*='language-']":{color:"#d6e7ff",background:"#030314",textShadow:"none",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',fontSize:"1em",lineHeight:"1.5",letterSpacing:".2px",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",textAlign:"left",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",border:"1px solid #2a4555",borderRadius:"5px",padding:"1.5em 1em",margin:"1em 0",overflow:"auto"},"pre[class*='language-']::-moz-selection":{color:"inherit",background:"#1d3b54",textShadow:"none"},"pre[class*='language-'] ::-moz-selection":{color:"inherit",background:"#1d3b54",textShadow:"none"},"code[class*='language-']::-moz-selection":{color:"inherit",background:"#1d3b54",textShadow:"none"},"code[class*='language-'] ::-moz-selection":{color:"inherit",background:"#1d3b54",textShadow:"none"},"pre[class*='language-']::selection":{color:"inherit",background:"#1d3b54",textShadow:"none"},"pre[class*='language-'] ::selection":{color:"inherit",background:"#1d3b54",textShadow:"none"},"code[class*='language-']::selection":{color:"inherit",background:"#1d3b54",textShadow:"none"},"code[class*='language-'] ::selection":{color:"inherit",background:"#1d3b54",textShadow:"none"},":not(pre) > code[class*='language-']":{color:"#f0f6f6",background:"#2a4555",padding:"0.2em 0.3em",borderRadius:"0.2em",boxDecorationBreak:"clone"},comment:{color:"#446e69"},prolog:{color:"#446e69"},doctype:{color:"#446e69"},cdata:{color:"#446e69"},punctuation:{color:"#d6b007"},property:{color:"#d6e7ff"},tag:{color:"#d6e7ff"},boolean:{color:"#d6e7ff"},number:{color:"#d6e7ff"},constant:{color:"#d6e7ff"},symbol:{color:"#d6e7ff"},deleted:{color:"#d6e7ff"},selector:{color:"#e60067"},"attr-name":{color:"#e60067"},builtin:{color:"#e60067"},inserted:{color:"#e60067"},string:{color:"#49c6ec"},char:{color:"#49c6ec"},operator:{color:"#ec8e01",background:"transparent"},entity:{color:"#ec8e01",background:"transparent"},url:{color:"#ec8e01",background:"transparent"},".language-css .token.string":{color:"#ec8e01",background:"transparent"},".style .token.string":{color:"#ec8e01",background:"transparent"},atrule:{color:"#0fe468"},"attr-value":{color:"#0fe468"},keyword:{color:"#0fe468"},function:{color:"#78f3e9"},"class-name":{color:"#78f3e9"},regex:{color:"#d6e7ff"},important:{color:"#d6e7ff"},variable:{color:"#d6e7ff"}};e.default=t}(ZE)),ZE}var XE={},z5;function i0e(){return z5||(z5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:'"Fira Mono", Menlo, Monaco, "Lucida Console", "Courier New", Courier, monospace',fontSize:"16px",lineHeight:"1.375",direction:"ltr",textAlign:"left",wordSpacing:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordBreak:"break-all",wordWrap:"break-word",background:"#322931",color:"#b9b5b8"},'pre[class*="language-"]':{fontFamily:'"Fira Mono", Menlo, Monaco, "Lucida Console", "Courier New", Courier, monospace',fontSize:"16px",lineHeight:"1.375",direction:"ltr",textAlign:"left",wordSpacing:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordBreak:"break-all",wordWrap:"break-word",background:"#322931",color:"#b9b5b8",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#797379"},prolog:{color:"#797379"},doctype:{color:"#797379"},cdata:{color:"#797379"},punctuation:{color:"#b9b5b8"},".namespace":{Opacity:".7"},null:{color:"#fd8b19"},operator:{color:"#fd8b19"},boolean:{color:"#fd8b19"},number:{color:"#fd8b19"},property:{color:"#fdcc59"},tag:{color:"#1290bf"},string:{color:"#149b93"},selector:{color:"#c85e7c"},"attr-name":{color:"#fd8b19"},entity:{color:"#149b93",cursor:"help"},url:{color:"#149b93"},".language-css .token.string":{color:"#149b93"},".style .token.string":{color:"#149b93"},"attr-value":{color:"#8fc13e"},keyword:{color:"#8fc13e"},control:{color:"#8fc13e"},directive:{color:"#8fc13e"},unit:{color:"#8fc13e"},statement:{color:"#149b93"},regex:{color:"#149b93"},atrule:{color:"#149b93"},placeholder:{color:"#1290bf"},variable:{color:"#1290bf"},important:{color:"#dd464c",fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid red",OutlineOffset:".4em"}};e.default=t}(XE)),XE}var QE={},U5;function s0e(){return U5||(U5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#f8f8f2",background:"none",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Monaco, Consolas, 'Andale Mono', 'Ubuntu Mono', monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#f8f8f2",background:"#263E52",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Monaco, Consolas, 'Andale Mono', 'Ubuntu Mono', monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",borderRadius:"0.3em"},':not(pre) > code[class*="language-"]':{background:"#263E52",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#5c98cd"},prolog:{color:"#5c98cd"},doctype:{color:"#5c98cd"},cdata:{color:"#5c98cd"},punctuation:{color:"#f8f8f2"},".namespace":{Opacity:".7"},property:{color:"#F05E5D"},tag:{color:"#F05E5D"},constant:{color:"#F05E5D"},symbol:{color:"#F05E5D"},deleted:{color:"#F05E5D"},boolean:{color:"#BC94F9"},number:{color:"#BC94F9"},selector:{color:"#FCFCD6"},"attr-name":{color:"#FCFCD6"},string:{color:"#FCFCD6"},char:{color:"#FCFCD6"},builtin:{color:"#FCFCD6"},inserted:{color:"#FCFCD6"},operator:{color:"#f8f8f2"},entity:{color:"#f8f8f2",cursor:"help"},url:{color:"#f8f8f2"},".language-css .token.string":{color:"#f8f8f2"},".style .token.string":{color:"#f8f8f2"},variable:{color:"#f8f8f2"},atrule:{color:"#66D8EF"},"attr-value":{color:"#66D8EF"},function:{color:"#66D8EF"},"class-name":{color:"#66D8EF"},keyword:{color:"#6EB26E"},regex:{color:"#F05E5D"},important:{color:"#F05E5D",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(QE)),QE}var JE={},B5;function l0e(){return B5||(B5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",color:"#eee",background:"#2f2f2f",fontFamily:"Roboto Mono, monospace",fontSize:"1em",lineHeight:"1.5em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",color:"#eee",background:"#2f2f2f",fontFamily:"Roboto Mono, monospace",fontSize:"1em",lineHeight:"1.5em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",overflow:"auto",position:"relative",margin:"0.5em 0",padding:"1.25em 1em"},'code[class*="language-"]::-moz-selection':{background:"#363636"},'pre[class*="language-"]::-moz-selection':{background:"#363636"},'code[class*="language-"] ::-moz-selection':{background:"#363636"},'pre[class*="language-"] ::-moz-selection':{background:"#363636"},'code[class*="language-"]::selection':{background:"#363636"},'pre[class*="language-"]::selection':{background:"#363636"},'code[class*="language-"] ::selection':{background:"#363636"},'pre[class*="language-"] ::selection':{background:"#363636"},':not(pre) > code[class*="language-"]':{whiteSpace:"normal",borderRadius:"0.2em",padding:"0.1em"},".language-css > code":{color:"#fd9170"},".language-sass > code":{color:"#fd9170"},".language-scss > code":{color:"#fd9170"},'[class*="language-"] .namespace':{Opacity:"0.7"},atrule:{color:"#c792ea"},"attr-name":{color:"#ffcb6b"},"attr-value":{color:"#a5e844"},attribute:{color:"#a5e844"},boolean:{color:"#c792ea"},builtin:{color:"#ffcb6b"},cdata:{color:"#80cbc4"},char:{color:"#80cbc4"},class:{color:"#ffcb6b"},"class-name":{color:"#f2ff00"},comment:{color:"#616161"},constant:{color:"#c792ea"},deleted:{color:"#ff6666"},doctype:{color:"#616161"},entity:{color:"#ff6666"},function:{color:"#c792ea"},hexcode:{color:"#f2ff00"},id:{color:"#c792ea",fontWeight:"bold"},important:{color:"#c792ea",fontWeight:"bold"},inserted:{color:"#80cbc4"},keyword:{color:"#c792ea"},number:{color:"#fd9170"},operator:{color:"#89ddff"},prolog:{color:"#616161"},property:{color:"#80cbc4"},"pseudo-class":{color:"#a5e844"},"pseudo-element":{color:"#a5e844"},punctuation:{color:"#89ddff"},regex:{color:"#f2ff00"},selector:{color:"#ff6666"},string:{color:"#a5e844"},symbol:{color:"#c792ea"},tag:{color:"#ff6666"},unit:{color:"#fd9170"},url:{color:"#ff6666"},variable:{color:"#ff6666"}};e.default=t}(JE)),JE}var ex={},H5;function c0e(){return H5||(H5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",color:"#90a4ae",background:"#fafafa",fontFamily:"Roboto Mono, monospace",fontSize:"1em",lineHeight:"1.5em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",color:"#90a4ae",background:"#fafafa",fontFamily:"Roboto Mono, monospace",fontSize:"1em",lineHeight:"1.5em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",overflow:"auto",position:"relative",margin:"0.5em 0",padding:"1.25em 1em"},'code[class*="language-"]::-moz-selection':{background:"#cceae7",color:"#263238"},'pre[class*="language-"]::-moz-selection':{background:"#cceae7",color:"#263238"},'code[class*="language-"] ::-moz-selection':{background:"#cceae7",color:"#263238"},'pre[class*="language-"] ::-moz-selection':{background:"#cceae7",color:"#263238"},'code[class*="language-"]::selection':{background:"#cceae7",color:"#263238"},'pre[class*="language-"]::selection':{background:"#cceae7",color:"#263238"},'code[class*="language-"] ::selection':{background:"#cceae7",color:"#263238"},'pre[class*="language-"] ::selection':{background:"#cceae7",color:"#263238"},':not(pre) > code[class*="language-"]':{whiteSpace:"normal",borderRadius:"0.2em",padding:"0.1em"},".language-css > code":{color:"#f76d47"},".language-sass > code":{color:"#f76d47"},".language-scss > code":{color:"#f76d47"},'[class*="language-"] .namespace':{Opacity:"0.7"},atrule:{color:"#7c4dff"},"attr-name":{color:"#39adb5"},"attr-value":{color:"#f6a434"},attribute:{color:"#f6a434"},boolean:{color:"#7c4dff"},builtin:{color:"#39adb5"},cdata:{color:"#39adb5"},char:{color:"#39adb5"},class:{color:"#39adb5"},"class-name":{color:"#6182b8"},comment:{color:"#aabfc9"},constant:{color:"#7c4dff"},deleted:{color:"#e53935"},doctype:{color:"#aabfc9"},entity:{color:"#e53935"},function:{color:"#7c4dff"},hexcode:{color:"#f76d47"},id:{color:"#7c4dff",fontWeight:"bold"},important:{color:"#7c4dff",fontWeight:"bold"},inserted:{color:"#39adb5"},keyword:{color:"#7c4dff"},number:{color:"#f76d47"},operator:{color:"#39adb5"},prolog:{color:"#aabfc9"},property:{color:"#39adb5"},"pseudo-class":{color:"#f6a434"},"pseudo-element":{color:"#f6a434"},punctuation:{color:"#39adb5"},regex:{color:"#6182b8"},selector:{color:"#e53935"},string:{color:"#f6a434"},symbol:{color:"#7c4dff"},tag:{color:"#e53935"},unit:{color:"#f76d47"},url:{color:"#e53935"},variable:{color:"#e53935"}};e.default=t}(ex)),ex}var tx={},V5;function u0e(){return V5||(V5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",color:"#c3cee3",background:"#263238",fontFamily:"Roboto Mono, monospace",fontSize:"1em",lineHeight:"1.5em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",color:"#c3cee3",background:"#263238",fontFamily:"Roboto Mono, monospace",fontSize:"1em",lineHeight:"1.5em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",overflow:"auto",position:"relative",margin:"0.5em 0",padding:"1.25em 1em"},'code[class*="language-"]::-moz-selection':{background:"#363636"},'pre[class*="language-"]::-moz-selection':{background:"#363636"},'code[class*="language-"] ::-moz-selection':{background:"#363636"},'pre[class*="language-"] ::-moz-selection':{background:"#363636"},'code[class*="language-"]::selection':{background:"#363636"},'pre[class*="language-"]::selection':{background:"#363636"},'code[class*="language-"] ::selection':{background:"#363636"},'pre[class*="language-"] ::selection':{background:"#363636"},':not(pre) > code[class*="language-"]':{whiteSpace:"normal",borderRadius:"0.2em",padding:"0.1em"},".language-css > code":{color:"#fd9170"},".language-sass > code":{color:"#fd9170"},".language-scss > code":{color:"#fd9170"},'[class*="language-"] .namespace':{Opacity:"0.7"},atrule:{color:"#c792ea"},"attr-name":{color:"#ffcb6b"},"attr-value":{color:"#c3e88d"},attribute:{color:"#c3e88d"},boolean:{color:"#c792ea"},builtin:{color:"#ffcb6b"},cdata:{color:"#80cbc4"},char:{color:"#80cbc4"},class:{color:"#ffcb6b"},"class-name":{color:"#f2ff00"},color:{color:"#f2ff00"},comment:{color:"#546e7a"},constant:{color:"#c792ea"},deleted:{color:"#f07178"},doctype:{color:"#546e7a"},entity:{color:"#f07178"},function:{color:"#c792ea"},hexcode:{color:"#f2ff00"},id:{color:"#c792ea",fontWeight:"bold"},important:{color:"#c792ea",fontWeight:"bold"},inserted:{color:"#80cbc4"},keyword:{color:"#c792ea",fontStyle:"italic"},number:{color:"#fd9170"},operator:{color:"#89ddff"},prolog:{color:"#546e7a"},property:{color:"#80cbc4"},"pseudo-class":{color:"#c3e88d"},"pseudo-element":{color:"#c3e88d"},punctuation:{color:"#89ddff"},regex:{color:"#f2ff00"},selector:{color:"#f07178"},string:{color:"#c3e88d"},symbol:{color:"#c792ea"},tag:{color:"#f07178"},unit:{color:"#f07178"},url:{color:"#fd9170"},variable:{color:"#f07178"}};e.default=t}(tx)),tx}var nx={},q5;function d0e(){return q5||(q5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#d6deeb",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",fontSize:"1em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"white",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",fontSize:"1em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto",background:"#011627"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'pre[class*="language-"]::selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'code[class*="language-"]::selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'code[class*="language-"] ::selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},':not(pre) > code[class*="language-"]':{color:"white",background:"#011627",padding:"0.1em",borderRadius:"0.3em",whiteSpace:"normal"},comment:{color:"rgb(99, 119, 119)",fontStyle:"italic"},prolog:{color:"rgb(99, 119, 119)",fontStyle:"italic"},cdata:{color:"rgb(99, 119, 119)",fontStyle:"italic"},punctuation:{color:"rgb(199, 146, 234)"},".namespace":{color:"rgb(178, 204, 214)"},deleted:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"},symbol:{color:"rgb(128, 203, 196)"},property:{color:"rgb(128, 203, 196)"},tag:{color:"rgb(127, 219, 202)"},operator:{color:"rgb(127, 219, 202)"},keyword:{color:"rgb(127, 219, 202)"},boolean:{color:"rgb(255, 88, 116)"},number:{color:"rgb(247, 140, 108)"},constant:{color:"rgb(130, 170, 255)"},function:{color:"rgb(130, 170, 255)"},builtin:{color:"rgb(130, 170, 255)"},char:{color:"rgb(130, 170, 255)"},selector:{color:"rgb(199, 146, 234)",fontStyle:"italic"},doctype:{color:"rgb(199, 146, 234)",fontStyle:"italic"},"attr-name":{color:"rgb(173, 219, 103)",fontStyle:"italic"},inserted:{color:"rgb(173, 219, 103)",fontStyle:"italic"},string:{color:"rgb(173, 219, 103)"},url:{color:"rgb(173, 219, 103)"},entity:{color:"rgb(173, 219, 103)"},".language-css .token.string":{color:"rgb(173, 219, 103)"},".style .token.string":{color:"rgb(173, 219, 103)"},"class-name":{color:"rgb(255, 203, 139)"},atrule:{color:"rgb(255, 203, 139)"},"attr-value":{color:"rgb(255, 203, 139)"},regex:{color:"rgb(214, 222, 235)"},important:{color:"rgb(214, 222, 235)",fontWeight:"bold"},variable:{color:"rgb(214, 222, 235)"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(nx)),nx}var rx={},G5;function f0e(){return G5||(G5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#f8f8f2",background:"none",fontFamily:`"Fira Code", Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace`,textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#f8f8f2",background:"#2E3440",fontFamily:`"Fira Code", Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace`,textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",borderRadius:"0.3em"},':not(pre) > code[class*="language-"]':{background:"#2E3440",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#636f88"},prolog:{color:"#636f88"},doctype:{color:"#636f88"},cdata:{color:"#636f88"},punctuation:{color:"#81A1C1"},".namespace":{Opacity:".7"},property:{color:"#81A1C1"},tag:{color:"#81A1C1"},constant:{color:"#81A1C1"},symbol:{color:"#81A1C1"},deleted:{color:"#81A1C1"},number:{color:"#B48EAD"},boolean:{color:"#81A1C1"},selector:{color:"#A3BE8C"},"attr-name":{color:"#A3BE8C"},string:{color:"#A3BE8C"},char:{color:"#A3BE8C"},builtin:{color:"#A3BE8C"},inserted:{color:"#A3BE8C"},operator:{color:"#81A1C1"},entity:{color:"#81A1C1",cursor:"help"},url:{color:"#81A1C1"},".language-css .token.string":{color:"#81A1C1"},".style .token.string":{color:"#81A1C1"},variable:{color:"#81A1C1"},atrule:{color:"#88C0D0"},"attr-value":{color:"#88C0D0"},function:{color:"#88C0D0"},"class-name":{color:"#88C0D0"},keyword:{color:"#81A1C1"},regex:{color:"#EBCB8B"},important:{color:"#EBCB8B",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(rx)),rx}var ax={},W5;function p0e(){return W5||(W5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{background:"hsl(220, 13%, 18%)",color:"hsl(220, 14%, 71%)",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:'"Fira Code", "Fira Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"2",OTabSize:"2",tabSize:"2",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{background:"hsl(220, 13%, 18%)",color:"hsl(220, 14%, 71%)",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:'"Fira Code", "Fira Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"2",OTabSize:"2",tabSize:"2",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto",borderRadius:"0.3em"},'code[class*="language-"]::-moz-selection':{background:"hsl(220, 13%, 28%)",color:"inherit",textShadow:"none"},'code[class*="language-"] *::-moz-selection':{background:"hsl(220, 13%, 28%)",color:"inherit",textShadow:"none"},'pre[class*="language-"] *::-moz-selection':{background:"hsl(220, 13%, 28%)",color:"inherit",textShadow:"none"},'code[class*="language-"]::selection':{background:"hsl(220, 13%, 28%)",color:"inherit",textShadow:"none"},'code[class*="language-"] *::selection':{background:"hsl(220, 13%, 28%)",color:"inherit",textShadow:"none"},'pre[class*="language-"] *::selection':{background:"hsl(220, 13%, 28%)",color:"inherit",textShadow:"none"},':not(pre) > code[class*="language-"]':{padding:"0.2em 0.3em",borderRadius:"0.3em",whiteSpace:"normal"},comment:{color:"hsl(220, 10%, 40%)",fontStyle:"italic"},prolog:{color:"hsl(220, 10%, 40%)"},cdata:{color:"hsl(220, 10%, 40%)"},doctype:{color:"hsl(220, 14%, 71%)"},punctuation:{color:"hsl(220, 14%, 71%)"},entity:{color:"hsl(220, 14%, 71%)",cursor:"help"},"attr-name":{color:"hsl(29, 54%, 61%)"},"class-name":{color:"hsl(29, 54%, 61%)"},boolean:{color:"hsl(29, 54%, 61%)"},constant:{color:"hsl(29, 54%, 61%)"},number:{color:"hsl(29, 54%, 61%)"},atrule:{color:"hsl(29, 54%, 61%)"},keyword:{color:"hsl(286, 60%, 67%)"},property:{color:"hsl(355, 65%, 65%)"},tag:{color:"hsl(355, 65%, 65%)"},symbol:{color:"hsl(355, 65%, 65%)"},deleted:{color:"hsl(355, 65%, 65%)"},important:{color:"hsl(355, 65%, 65%)"},selector:{color:"hsl(95, 38%, 62%)"},string:{color:"hsl(95, 38%, 62%)"},char:{color:"hsl(95, 38%, 62%)"},builtin:{color:"hsl(95, 38%, 62%)"},inserted:{color:"hsl(95, 38%, 62%)"},regex:{color:"hsl(95, 38%, 62%)"},"attr-value":{color:"hsl(95, 38%, 62%)"},"attr-value > .token.punctuation":{color:"hsl(95, 38%, 62%)"},variable:{color:"hsl(207, 82%, 66%)"},operator:{color:"hsl(207, 82%, 66%)"},function:{color:"hsl(207, 82%, 66%)"},url:{color:"hsl(187, 47%, 55%)"},"attr-value > .token.punctuation.attr-equals":{color:"hsl(220, 14%, 71%)"},"special-attr > .token.attr-value > .token.value.css":{color:"hsl(220, 14%, 71%)"},".language-css .token.selector":{color:"hsl(355, 65%, 65%)"},".language-css .token.property":{color:"hsl(220, 14%, 71%)"},".language-css .token.function":{color:"hsl(187, 47%, 55%)"},".language-css .token.url > .token.function":{color:"hsl(187, 47%, 55%)"},".language-css .token.url > .token.string.url":{color:"hsl(95, 38%, 62%)"},".language-css .token.important":{color:"hsl(286, 60%, 67%)"},".language-css .token.atrule .token.rule":{color:"hsl(286, 60%, 67%)"},".language-javascript .token.operator":{color:"hsl(286, 60%, 67%)"},".language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation":{color:"hsl(5, 48%, 51%)"},".language-json .token.operator":{color:"hsl(220, 14%, 71%)"},".language-json .token.null.keyword":{color:"hsl(29, 54%, 61%)"},".language-markdown .token.url":{color:"hsl(220, 14%, 71%)"},".language-markdown .token.url > .token.operator":{color:"hsl(220, 14%, 71%)"},".language-markdown .token.url-reference.url > .token.string":{color:"hsl(220, 14%, 71%)"},".language-markdown .token.url > .token.content":{color:"hsl(207, 82%, 66%)"},".language-markdown .token.url > .token.url":{color:"hsl(187, 47%, 55%)"},".language-markdown .token.url-reference.url":{color:"hsl(187, 47%, 55%)"},".language-markdown .token.blockquote.punctuation":{color:"hsl(220, 10%, 40%)",fontStyle:"italic"},".language-markdown .token.hr.punctuation":{color:"hsl(220, 10%, 40%)",fontStyle:"italic"},".language-markdown .token.code-snippet":{color:"hsl(95, 38%, 62%)"},".language-markdown .token.bold .token.content":{color:"hsl(29, 54%, 61%)"},".language-markdown .token.italic .token.content":{color:"hsl(286, 60%, 67%)"},".language-markdown .token.strike .token.content":{color:"hsl(355, 65%, 65%)"},".language-markdown .token.strike .token.punctuation":{color:"hsl(355, 65%, 65%)"},".language-markdown .token.list.punctuation":{color:"hsl(355, 65%, 65%)"},".language-markdown .token.title.important > .token.punctuation":{color:"hsl(355, 65%, 65%)"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},namespace:{Opacity:"0.8"},"token.tab:not(:empty):before":{color:"hsla(220, 14%, 71%, 0.15)",textShadow:"none"},"token.cr:before":{color:"hsla(220, 14%, 71%, 0.15)",textShadow:"none"},"token.lf:before":{color:"hsla(220, 14%, 71%, 0.15)",textShadow:"none"},"token.space:before":{color:"hsla(220, 14%, 71%, 0.15)",textShadow:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item":{marginRight:"0.4em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button":{background:"hsl(220, 13%, 26%)",color:"hsl(220, 9%, 55%)",padding:"0.1em 0.4em",borderRadius:"0.3em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a":{background:"hsl(220, 13%, 26%)",color:"hsl(220, 9%, 55%)",padding:"0.1em 0.4em",borderRadius:"0.3em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span":{background:"hsl(220, 13%, 26%)",color:"hsl(220, 9%, 55%)",padding:"0.1em 0.4em",borderRadius:"0.3em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover":{background:"hsl(220, 13%, 28%)",color:"hsl(220, 14%, 71%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus":{background:"hsl(220, 13%, 28%)",color:"hsl(220, 14%, 71%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover":{background:"hsl(220, 13%, 28%)",color:"hsl(220, 14%, 71%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus":{background:"hsl(220, 13%, 28%)",color:"hsl(220, 14%, 71%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover":{background:"hsl(220, 13%, 28%)",color:"hsl(220, 14%, 71%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus":{background:"hsl(220, 13%, 28%)",color:"hsl(220, 14%, 71%)"},".line-highlight.line-highlight":{background:"hsla(220, 100%, 80%, 0.04)"},".line-highlight.line-highlight:before":{background:"hsl(220, 13%, 26%)",color:"hsl(220, 14%, 71%)",padding:"0.1em 0.6em",borderRadius:"0.3em",boxShadow:"0 2px 0 0 rgba(0, 0, 0, 0.2)"},".line-highlight.line-highlight[data-end]:after":{background:"hsl(220, 13%, 26%)",color:"hsl(220, 14%, 71%)",padding:"0.1em 0.6em",borderRadius:"0.3em",boxShadow:"0 2px 0 0 rgba(0, 0, 0, 0.2)"},"pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before":{backgroundColor:"hsla(220, 100%, 80%, 0.04)"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"hsla(220, 14%, 71%, 0.15)"},".command-line .command-line-prompt":{borderRightColor:"hsla(220, 14%, 71%, 0.15)"},".line-numbers .line-numbers-rows > span:before":{color:"hsl(220, 14%, 45%)"},".command-line .command-line-prompt > span:before":{color:"hsl(220, 14%, 45%)"},".rainbow-braces .token.token.punctuation.brace-level-1":{color:"hsl(355, 65%, 65%)"},".rainbow-braces .token.token.punctuation.brace-level-5":{color:"hsl(355, 65%, 65%)"},".rainbow-braces .token.token.punctuation.brace-level-9":{color:"hsl(355, 65%, 65%)"},".rainbow-braces .token.token.punctuation.brace-level-2":{color:"hsl(95, 38%, 62%)"},".rainbow-braces .token.token.punctuation.brace-level-6":{color:"hsl(95, 38%, 62%)"},".rainbow-braces .token.token.punctuation.brace-level-10":{color:"hsl(95, 38%, 62%)"},".rainbow-braces .token.token.punctuation.brace-level-3":{color:"hsl(207, 82%, 66%)"},".rainbow-braces .token.token.punctuation.brace-level-7":{color:"hsl(207, 82%, 66%)"},".rainbow-braces .token.token.punctuation.brace-level-11":{color:"hsl(207, 82%, 66%)"},".rainbow-braces .token.token.punctuation.brace-level-4":{color:"hsl(286, 60%, 67%)"},".rainbow-braces .token.token.punctuation.brace-level-8":{color:"hsl(286, 60%, 67%)"},".rainbow-braces .token.token.punctuation.brace-level-12":{color:"hsl(286, 60%, 67%)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)":{backgroundColor:"hsla(353, 100%, 66%, 0.15)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)":{backgroundColor:"hsla(353, 100%, 66%, 0.15)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix) *::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix) *::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)":{backgroundColor:"hsla(137, 100%, 55%, 0.15)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)":{backgroundColor:"hsla(137, 100%, 55%, 0.15)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix) *::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix) *::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},".prism-previewer.prism-previewer:before":{borderColor:"hsl(224, 13%, 17%)"},".prism-previewer-gradient.prism-previewer-gradient div":{borderColor:"hsl(224, 13%, 17%)",borderRadius:"0.3em"},".prism-previewer-color.prism-previewer-color:before":{borderRadius:"0.3em"},".prism-previewer-easing.prism-previewer-easing:before":{borderRadius:"0.3em"},".prism-previewer.prism-previewer:after":{borderTopColor:"hsl(224, 13%, 17%)"},".prism-previewer-flipped.prism-previewer-flipped.after":{borderBottomColor:"hsl(224, 13%, 17%)"},".prism-previewer-angle.prism-previewer-angle:before":{background:"hsl(219, 13%, 22%)"},".prism-previewer-time.prism-previewer-time:before":{background:"hsl(219, 13%, 22%)"},".prism-previewer-easing.prism-previewer-easing":{background:"hsl(219, 13%, 22%)"},".prism-previewer-angle.prism-previewer-angle circle":{stroke:"hsl(220, 14%, 71%)",strokeOpacity:"1"},".prism-previewer-time.prism-previewer-time circle":{stroke:"hsl(220, 14%, 71%)",strokeOpacity:"1"},".prism-previewer-easing.prism-previewer-easing circle":{stroke:"hsl(220, 14%, 71%)",fill:"transparent"},".prism-previewer-easing.prism-previewer-easing path":{stroke:"hsl(220, 14%, 71%)"},".prism-previewer-easing.prism-previewer-easing line":{stroke:"hsl(220, 14%, 71%)"}};e.default=t}(ax)),ax}var ox={},K5;function g0e(){return K5||(K5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{background:"hsl(230, 1%, 98%)",color:"hsl(230, 8%, 24%)",fontFamily:'"Fira Code", "Fira Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"2",OTabSize:"2",tabSize:"2",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{background:"hsl(230, 1%, 98%)",color:"hsl(230, 8%, 24%)",fontFamily:'"Fira Code", "Fira Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"2",OTabSize:"2",tabSize:"2",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto",borderRadius:"0.3em"},'code[class*="language-"]::-moz-selection':{background:"hsl(230, 1%, 90%)",color:"inherit"},'code[class*="language-"] *::-moz-selection':{background:"hsl(230, 1%, 90%)",color:"inherit"},'pre[class*="language-"] *::-moz-selection':{background:"hsl(230, 1%, 90%)",color:"inherit"},'code[class*="language-"]::selection':{background:"hsl(230, 1%, 90%)",color:"inherit"},'code[class*="language-"] *::selection':{background:"hsl(230, 1%, 90%)",color:"inherit"},'pre[class*="language-"] *::selection':{background:"hsl(230, 1%, 90%)",color:"inherit"},':not(pre) > code[class*="language-"]':{padding:"0.2em 0.3em",borderRadius:"0.3em",whiteSpace:"normal"},comment:{color:"hsl(230, 4%, 64%)",fontStyle:"italic"},prolog:{color:"hsl(230, 4%, 64%)"},cdata:{color:"hsl(230, 4%, 64%)"},doctype:{color:"hsl(230, 8%, 24%)"},punctuation:{color:"hsl(230, 8%, 24%)"},entity:{color:"hsl(230, 8%, 24%)",cursor:"help"},"attr-name":{color:"hsl(35, 99%, 36%)"},"class-name":{color:"hsl(35, 99%, 36%)"},boolean:{color:"hsl(35, 99%, 36%)"},constant:{color:"hsl(35, 99%, 36%)"},number:{color:"hsl(35, 99%, 36%)"},atrule:{color:"hsl(35, 99%, 36%)"},keyword:{color:"hsl(301, 63%, 40%)"},property:{color:"hsl(5, 74%, 59%)"},tag:{color:"hsl(5, 74%, 59%)"},symbol:{color:"hsl(5, 74%, 59%)"},deleted:{color:"hsl(5, 74%, 59%)"},important:{color:"hsl(5, 74%, 59%)"},selector:{color:"hsl(119, 34%, 47%)"},string:{color:"hsl(119, 34%, 47%)"},char:{color:"hsl(119, 34%, 47%)"},builtin:{color:"hsl(119, 34%, 47%)"},inserted:{color:"hsl(119, 34%, 47%)"},regex:{color:"hsl(119, 34%, 47%)"},"attr-value":{color:"hsl(119, 34%, 47%)"},"attr-value > .token.punctuation":{color:"hsl(119, 34%, 47%)"},variable:{color:"hsl(221, 87%, 60%)"},operator:{color:"hsl(221, 87%, 60%)"},function:{color:"hsl(221, 87%, 60%)"},url:{color:"hsl(198, 99%, 37%)"},"attr-value > .token.punctuation.attr-equals":{color:"hsl(230, 8%, 24%)"},"special-attr > .token.attr-value > .token.value.css":{color:"hsl(230, 8%, 24%)"},".language-css .token.selector":{color:"hsl(5, 74%, 59%)"},".language-css .token.property":{color:"hsl(230, 8%, 24%)"},".language-css .token.function":{color:"hsl(198, 99%, 37%)"},".language-css .token.url > .token.function":{color:"hsl(198, 99%, 37%)"},".language-css .token.url > .token.string.url":{color:"hsl(119, 34%, 47%)"},".language-css .token.important":{color:"hsl(301, 63%, 40%)"},".language-css .token.atrule .token.rule":{color:"hsl(301, 63%, 40%)"},".language-javascript .token.operator":{color:"hsl(301, 63%, 40%)"},".language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation":{color:"hsl(344, 84%, 43%)"},".language-json .token.operator":{color:"hsl(230, 8%, 24%)"},".language-json .token.null.keyword":{color:"hsl(35, 99%, 36%)"},".language-markdown .token.url":{color:"hsl(230, 8%, 24%)"},".language-markdown .token.url > .token.operator":{color:"hsl(230, 8%, 24%)"},".language-markdown .token.url-reference.url > .token.string":{color:"hsl(230, 8%, 24%)"},".language-markdown .token.url > .token.content":{color:"hsl(221, 87%, 60%)"},".language-markdown .token.url > .token.url":{color:"hsl(198, 99%, 37%)"},".language-markdown .token.url-reference.url":{color:"hsl(198, 99%, 37%)"},".language-markdown .token.blockquote.punctuation":{color:"hsl(230, 4%, 64%)",fontStyle:"italic"},".language-markdown .token.hr.punctuation":{color:"hsl(230, 4%, 64%)",fontStyle:"italic"},".language-markdown .token.code-snippet":{color:"hsl(119, 34%, 47%)"},".language-markdown .token.bold .token.content":{color:"hsl(35, 99%, 36%)"},".language-markdown .token.italic .token.content":{color:"hsl(301, 63%, 40%)"},".language-markdown .token.strike .token.content":{color:"hsl(5, 74%, 59%)"},".language-markdown .token.strike .token.punctuation":{color:"hsl(5, 74%, 59%)"},".language-markdown .token.list.punctuation":{color:"hsl(5, 74%, 59%)"},".language-markdown .token.title.important > .token.punctuation":{color:"hsl(5, 74%, 59%)"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},namespace:{Opacity:"0.8"},"token.tab:not(:empty):before":{color:"hsla(230, 8%, 24%, 0.2)"},"token.cr:before":{color:"hsla(230, 8%, 24%, 0.2)"},"token.lf:before":{color:"hsla(230, 8%, 24%, 0.2)"},"token.space:before":{color:"hsla(230, 8%, 24%, 0.2)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item":{marginRight:"0.4em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button":{background:"hsl(230, 1%, 90%)",color:"hsl(230, 6%, 44%)",padding:"0.1em 0.4em",borderRadius:"0.3em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a":{background:"hsl(230, 1%, 90%)",color:"hsl(230, 6%, 44%)",padding:"0.1em 0.4em",borderRadius:"0.3em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span":{background:"hsl(230, 1%, 90%)",color:"hsl(230, 6%, 44%)",padding:"0.1em 0.4em",borderRadius:"0.3em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover":{background:"hsl(230, 1%, 78%)",color:"hsl(230, 8%, 24%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus":{background:"hsl(230, 1%, 78%)",color:"hsl(230, 8%, 24%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover":{background:"hsl(230, 1%, 78%)",color:"hsl(230, 8%, 24%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus":{background:"hsl(230, 1%, 78%)",color:"hsl(230, 8%, 24%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover":{background:"hsl(230, 1%, 78%)",color:"hsl(230, 8%, 24%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus":{background:"hsl(230, 1%, 78%)",color:"hsl(230, 8%, 24%)"},".line-highlight.line-highlight":{background:"hsla(230, 8%, 24%, 0.05)"},".line-highlight.line-highlight:before":{background:"hsl(230, 1%, 90%)",color:"hsl(230, 8%, 24%)",padding:"0.1em 0.6em",borderRadius:"0.3em",boxShadow:"0 2px 0 0 rgba(0, 0, 0, 0.2)"},".line-highlight.line-highlight[data-end]:after":{background:"hsl(230, 1%, 90%)",color:"hsl(230, 8%, 24%)",padding:"0.1em 0.6em",borderRadius:"0.3em",boxShadow:"0 2px 0 0 rgba(0, 0, 0, 0.2)"},"pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before":{backgroundColor:"hsla(230, 8%, 24%, 0.05)"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"hsla(230, 8%, 24%, 0.2)"},".command-line .command-line-prompt":{borderRightColor:"hsla(230, 8%, 24%, 0.2)"},".line-numbers .line-numbers-rows > span:before":{color:"hsl(230, 1%, 62%)"},".command-line .command-line-prompt > span:before":{color:"hsl(230, 1%, 62%)"},".rainbow-braces .token.token.punctuation.brace-level-1":{color:"hsl(5, 74%, 59%)"},".rainbow-braces .token.token.punctuation.brace-level-5":{color:"hsl(5, 74%, 59%)"},".rainbow-braces .token.token.punctuation.brace-level-9":{color:"hsl(5, 74%, 59%)"},".rainbow-braces .token.token.punctuation.brace-level-2":{color:"hsl(119, 34%, 47%)"},".rainbow-braces .token.token.punctuation.brace-level-6":{color:"hsl(119, 34%, 47%)"},".rainbow-braces .token.token.punctuation.brace-level-10":{color:"hsl(119, 34%, 47%)"},".rainbow-braces .token.token.punctuation.brace-level-3":{color:"hsl(221, 87%, 60%)"},".rainbow-braces .token.token.punctuation.brace-level-7":{color:"hsl(221, 87%, 60%)"},".rainbow-braces .token.token.punctuation.brace-level-11":{color:"hsl(221, 87%, 60%)"},".rainbow-braces .token.token.punctuation.brace-level-4":{color:"hsl(301, 63%, 40%)"},".rainbow-braces .token.token.punctuation.brace-level-8":{color:"hsl(301, 63%, 40%)"},".rainbow-braces .token.token.punctuation.brace-level-12":{color:"hsl(301, 63%, 40%)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)":{backgroundColor:"hsla(353, 100%, 66%, 0.15)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)":{backgroundColor:"hsla(353, 100%, 66%, 0.15)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix) *::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix) *::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)":{backgroundColor:"hsla(137, 100%, 55%, 0.15)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)":{backgroundColor:"hsla(137, 100%, 55%, 0.15)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix) *::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix) *::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},".prism-previewer.prism-previewer:before":{borderColor:"hsl(0, 0, 95%)"},".prism-previewer-gradient.prism-previewer-gradient div":{borderColor:"hsl(0, 0, 95%)",borderRadius:"0.3em"},".prism-previewer-color.prism-previewer-color:before":{borderRadius:"0.3em"},".prism-previewer-easing.prism-previewer-easing:before":{borderRadius:"0.3em"},".prism-previewer.prism-previewer:after":{borderTopColor:"hsl(0, 0, 95%)"},".prism-previewer-flipped.prism-previewer-flipped.after":{borderBottomColor:"hsl(0, 0, 95%)"},".prism-previewer-angle.prism-previewer-angle:before":{background:"hsl(0, 0%, 100%)"},".prism-previewer-time.prism-previewer-time:before":{background:"hsl(0, 0%, 100%)"},".prism-previewer-easing.prism-previewer-easing":{background:"hsl(0, 0%, 100%)"},".prism-previewer-angle.prism-previewer-angle circle":{stroke:"hsl(230, 8%, 24%)",strokeOpacity:"1"},".prism-previewer-time.prism-previewer-time circle":{stroke:"hsl(230, 8%, 24%)",strokeOpacity:"1"},".prism-previewer-easing.prism-previewer-easing circle":{stroke:"hsl(230, 8%, 24%)",fill:"transparent"},".prism-previewer-easing.prism-previewer-easing path":{stroke:"hsl(230, 8%, 24%)"},".prism-previewer-easing.prism-previewer-easing line":{stroke:"hsl(230, 8%, 24%)"}};e.default=t}(ox)),ox}var ix={},Y5;function m0e(){return Y5||(Y5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordBreak:"break-all",wordWrap:"break-word",fontFamily:'Menlo, Monaco, "Courier New", monospace',fontSize:"15px",lineHeight:"1.5",color:"#dccf8f",textShadow:"0"},'pre[class*="language-"]':{MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordBreak:"break-all",wordWrap:"break-word",fontFamily:'Menlo, Monaco, "Courier New", monospace',fontSize:"15px",lineHeight:"1.5",color:"#DCCF8F",textShadow:"0",borderRadius:"5px",border:"1px solid #000",background:"#181914 url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAMAAA/+4ADkFkb2JlAGTAAAAAAf/bAIQACQYGBgcGCQcHCQ0IBwgNDwsJCQsPEQ4ODw4OERENDg4ODg0RERQUFhQUERoaHBwaGiYmJiYmKysrKysrKysrKwEJCAgJCgkMCgoMDwwODA8TDg4ODhMVDg4PDg4VGhMRERERExoXGhYWFhoXHR0aGh0dJCQjJCQrKysrKysrKysr/8AAEQgAjACMAwEiAAIRAQMRAf/EAF4AAQEBAAAAAAAAAAAAAAAAAAABBwEBAQAAAAAAAAAAAAAAAAAAAAIQAAEDAwIHAQEAAAAAAAAAAADwAREhYaExkUFRcYGxwdHh8REBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AyGFEjHaBS2fDDs2zkhKmBKktb7km+ZwwCnXPkLVmCTMItj6AXFxRS465/BTnkAJvkLkJe+7AKKoi2AtRS2zuAWsCb5GOlBN8gKfmuGHZ8MFqIth3ALmFoFwbwKWyAlTAp17uKqBvgBD8sM4fTjhvAhkzhaRkBMKBrfs7jGPIpzy7gFrAqnC0C0gB0EWwBDW2cBVQwm+QtPpa3wBO3sVvszCnLAhkzgL5/RLf13cLQd8/AGlu0Cb5HTx9KuAEieGJEdcehS3eRTp2ATdt3CpIm+QtZwAhROXFeb7swp/ahaM3kBE/jSIUBc/AWrgBN8uNFAl+b7sAXFxFn2YLUU5Ns7gFX8C4ib+hN8gFWXwK3bZglxEJm+gKdciLPsFV/TClsgJUwKJ5FVA7tvIFrfZhVfGJDcsCKaYgAqv6YRbE+RWOWBtu7+AL3yRalXLyKqAIIfk+zARbDgFyEsncYwJvlgFRW+GEWntIi2P0BooyFxcNr8Ep3+ANLbMO+QyhvbiqdgC0kVvgUUiLYgBS2QtPbiVI1/sgOmG9uO+Y8DW+7jS2zAOnj6O2BndwuIAUtkdRN8gFoK3wwXMQyZwHVbClsuNLd4E3yAUR6FVDBR+BafQGt93LVMxJTv8ABts4CVLhcfYWsCb5kC9/BHdU8CLYFY5bMAd+eX9MGthhpbA1vu4B7+RKkaW2Yq4AQtVBBFsAJU/AuIXBhN8gGWnstefhiZyWvLAEnbYS1uzSFP6Jvn4Baxx70JKkQojLib5AVTey1jjgkKJGO0AKWyOm7N7cSpgSpAdPH0Tfd/gp1z5C1ZgKqN9J2wFxcUUuAFLZAm+QC0Fb4YUVRFsAOvj4KW2dwtYE3yAWk/wS/PLMKfmuGHZ8MAXF/Ja32Yi5haAKWz4Ydm2cSpgU693Atb7km+Zwwh+WGcPpxw3gAkzCLY+iYUDW/Z3Adc/gpzyFrAqnALkJe+7DoItgAtRS2zuKqGE3yAx0oJvkdvYrfZmALURbDuL5/RLf13cAuDeBS2RpbtAm+QFVA3wR+3fUtFHoBDJnC0jIXH0HWsgMY8inPLuOkd9chp4z20ALQLSA8cI9jYAIa2zjzjBd8gRafS1vgiUho/kAKcsCGTOGWvoOpkAtB3z8Hm8x2Ff5ADp4+lXAlIvcmwH/2Q==') repeat left top",padding:"12px",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},':not(pre) > code[class*="language-"]':{borderRadius:"5px",border:"1px solid #000",color:"#DCCF8F",background:"#181914 url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAMAAA/+4ADkFkb2JlAGTAAAAAAf/bAIQACQYGBgcGCQcHCQ0IBwgNDwsJCQsPEQ4ODw4OERENDg4ODg0RERQUFhQUERoaHBwaGiYmJiYmKysrKysrKysrKwEJCAgJCgkMCgoMDwwODA8TDg4ODhMVDg4PDg4VGhMRERERExoXGhYWFhoXHR0aGh0dJCQjJCQrKysrKysrKysr/8AAEQgAjACMAwEiAAIRAQMRAf/EAF4AAQEBAAAAAAAAAAAAAAAAAAABBwEBAQAAAAAAAAAAAAAAAAAAAAIQAAEDAwIHAQEAAAAAAAAAAADwAREhYaExkUFRcYGxwdHh8REBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AyGFEjHaBS2fDDs2zkhKmBKktb7km+ZwwCnXPkLVmCTMItj6AXFxRS465/BTnkAJvkLkJe+7AKKoi2AtRS2zuAWsCb5GOlBN8gKfmuGHZ8MFqIth3ALmFoFwbwKWyAlTAp17uKqBvgBD8sM4fTjhvAhkzhaRkBMKBrfs7jGPIpzy7gFrAqnC0C0gB0EWwBDW2cBVQwm+QtPpa3wBO3sVvszCnLAhkzgL5/RLf13cLQd8/AGlu0Cb5HTx9KuAEieGJEdcehS3eRTp2ATdt3CpIm+QtZwAhROXFeb7swp/ahaM3kBE/jSIUBc/AWrgBN8uNFAl+b7sAXFxFn2YLUU5Ns7gFX8C4ib+hN8gFWXwK3bZglxEJm+gKdciLPsFV/TClsgJUwKJ5FVA7tvIFrfZhVfGJDcsCKaYgAqv6YRbE+RWOWBtu7+AL3yRalXLyKqAIIfk+zARbDgFyEsncYwJvlgFRW+GEWntIi2P0BooyFxcNr8Ep3+ANLbMO+QyhvbiqdgC0kVvgUUiLYgBS2QtPbiVI1/sgOmG9uO+Y8DW+7jS2zAOnj6O2BndwuIAUtkdRN8gFoK3wwXMQyZwHVbClsuNLd4E3yAUR6FVDBR+BafQGt93LVMxJTv8ABts4CVLhcfYWsCb5kC9/BHdU8CLYFY5bMAd+eX9MGthhpbA1vu4B7+RKkaW2Yq4AQtVBBFsAJU/AuIXBhN8gGWnstefhiZyWvLAEnbYS1uzSFP6Jvn4Baxx70JKkQojLib5AVTey1jjgkKJGO0AKWyOm7N7cSpgSpAdPH0Tfd/gp1z5C1ZgKqN9J2wFxcUUuAFLZAm+QC0Fb4YUVRFsAOvj4KW2dwtYE3yAWk/wS/PLMKfmuGHZ8MAXF/Ja32Yi5haAKWz4Ydm2cSpgU693Atb7km+Zwwh+WGcPpxw3gAkzCLY+iYUDW/Z3Adc/gpzyFrAqnALkJe+7DoItgAtRS2zuKqGE3yAx0oJvkdvYrfZmALURbDuL5/RLf13cAuDeBS2RpbtAm+QFVA3wR+3fUtFHoBDJnC0jIXH0HWsgMY8inPLuOkd9chp4z20ALQLSA8cI9jYAIa2zjzjBd8gRafS1vgiUho/kAKcsCGTOGWvoOpkAtB3z8Hm8x2Ff5ADp4+lXAlIvcmwH/2Q==') repeat left top",padding:"2px 6px"},namespace:{Opacity:".7"},comment:{color:"#586e75",fontStyle:"italic"},prolog:{color:"#586e75",fontStyle:"italic"},doctype:{color:"#586e75",fontStyle:"italic"},cdata:{color:"#586e75",fontStyle:"italic"},number:{color:"#b89859"},string:{color:"#468966"},char:{color:"#468966"},builtin:{color:"#468966"},inserted:{color:"#468966"},"attr-name":{color:"#b89859"},operator:{color:"#dccf8f"},entity:{color:"#dccf8f",cursor:"help"},url:{color:"#dccf8f"},".language-css .token.string":{color:"#dccf8f"},".style .token.string":{color:"#dccf8f"},selector:{color:"#859900"},regex:{color:"#859900"},atrule:{color:"#cb4b16"},keyword:{color:"#cb4b16"},"attr-value":{color:"#468966"},function:{color:"#b58900"},variable:{color:"#b58900"},placeholder:{color:"#b58900"},property:{color:"#b89859"},tag:{color:"#ffb03b"},boolean:{color:"#b89859"},constant:{color:"#b89859"},symbol:{color:"#b89859"},important:{color:"#dc322f"},statement:{color:"#dc322f"},deleted:{color:"#dc322f"},punctuation:{color:"#dccf8f"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(ix)),ix}var sx={},Z5;function h0e(){return Z5||(Z5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={"code[class*='language-']":{color:"#9efeff",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",fontFamily:"'Operator Mono', 'Fira Code', Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontWeight:"400",fontSize:"17px",lineHeight:"25px",letterSpacing:"0.5px",textShadow:"0 1px #222245"},"pre[class*='language-']":{color:"#9efeff",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",fontFamily:"'Operator Mono', 'Fira Code', Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontWeight:"400",fontSize:"17px",lineHeight:"25px",letterSpacing:"0.5px",textShadow:"0 1px #222245",padding:"2em",margin:"0.5em 0",overflow:"auto",background:"#1e1e3f"},"pre[class*='language-']::-moz-selection":{color:"inherit",background:"#a599e9"},"pre[class*='language-'] ::-moz-selection":{color:"inherit",background:"#a599e9"},"code[class*='language-']::-moz-selection":{color:"inherit",background:"#a599e9"},"code[class*='language-'] ::-moz-selection":{color:"inherit",background:"#a599e9"},"pre[class*='language-']::selection":{color:"inherit",background:"#a599e9"},"pre[class*='language-'] ::selection":{color:"inherit",background:"#a599e9"},"code[class*='language-']::selection":{color:"inherit",background:"#a599e9"},"code[class*='language-'] ::selection":{color:"inherit",background:"#a599e9"},":not(pre) > code[class*='language-']":{background:"#1e1e3f",padding:"0.1em",borderRadius:"0.3em"},"":{fontWeight:"400"},comment:{color:"#b362ff"},prolog:{color:"#b362ff"},cdata:{color:"#b362ff"},delimiter:{color:"#ff9d00"},keyword:{color:"#ff9d00"},selector:{color:"#ff9d00"},important:{color:"#ff9d00"},atrule:{color:"#ff9d00"},operator:{color:"rgb(255, 180, 84)",background:"none"},"attr-name":{color:"rgb(255, 180, 84)"},punctuation:{color:"#ffffff"},boolean:{color:"rgb(255, 98, 140)"},tag:{color:"rgb(255, 157, 0)"},"tag.punctuation":{color:"rgb(255, 157, 0)"},doctype:{color:"rgb(255, 157, 0)"},builtin:{color:"rgb(255, 157, 0)"},entity:{color:"#6897bb",background:"none"},symbol:{color:"#6897bb"},number:{color:"#ff628c"},property:{color:"#ff628c"},constant:{color:"#ff628c"},variable:{color:"#ff628c"},string:{color:"#a5ff90"},char:{color:"#a5ff90"},"attr-value":{color:"#a5c261"},"attr-value.punctuation":{color:"#a5c261"},"attr-value.punctuation:first-child":{color:"#a9b7c6"},url:{color:"#287bde",textDecoration:"underline",background:"none"},function:{color:"rgb(250, 208, 0)"},regex:{background:"#364135"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},inserted:{background:"#00ff00"},deleted:{background:"#ff000d"},"code.language-css .token.property":{color:"#a9b7c6"},"code.language-css .token.property + .token.punctuation":{color:"#a9b7c6"},"code.language-css .token.id":{color:"#ffc66d"},"code.language-css .token.selector > .token.class":{color:"#ffc66d"},"code.language-css .token.selector > .token.attribute":{color:"#ffc66d"},"code.language-css .token.selector > .token.pseudo-class":{color:"#ffc66d"},"code.language-css .token.selector > .token.pseudo-element":{color:"#ffc66d"},"class-name":{color:"#fb94ff"},".language-css .token.string":{background:"none"},".style .token.string":{background:"none"},".line-highlight.line-highlight":{marginTop:"36px",background:"linear-gradient(to right, rgba(179, 98, 255, 0.17), transparent)"},".line-highlight.line-highlight:before":{content:"''"},".line-highlight.line-highlight[data-end]:after":{content:"''"}};e.default=t}(sx)),sx}var lx={},X5;function b0e(){return X5||(X5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#839496",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Inconsolata, Monaco, Consolas, 'Courier New', Courier, monospace",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#839496",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Inconsolata, Monaco, Consolas, 'Courier New', Courier, monospace",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",borderRadius:"0.3em",background:"#002b36"},':not(pre) > code[class*="language-"]':{background:"#002b36",padding:".1em",borderRadius:".3em"},comment:{color:"#586e75"},prolog:{color:"#586e75"},doctype:{color:"#586e75"},cdata:{color:"#586e75"},punctuation:{color:"#93a1a1"},".namespace":{Opacity:".7"},property:{color:"#268bd2"},keyword:{color:"#268bd2"},tag:{color:"#268bd2"},"class-name":{color:"#FFFFB6",textDecoration:"underline"},boolean:{color:"#b58900"},constant:{color:"#b58900"},symbol:{color:"#dc322f"},deleted:{color:"#dc322f"},number:{color:"#859900"},selector:{color:"#859900"},"attr-name":{color:"#859900"},string:{color:"#859900"},char:{color:"#859900"},builtin:{color:"#859900"},inserted:{color:"#859900"},variable:{color:"#268bd2"},operator:{color:"#EDEDED"},function:{color:"#268bd2"},regex:{color:"#E9C062"},important:{color:"#fd971f",fontWeight:"bold"},entity:{color:"#FFFFB6",cursor:"help"},url:{color:"#96CBFE"},".language-css .token.string":{color:"#87C38A"},".style .token.string":{color:"#87C38A"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},atrule:{color:"#F9EE98"},"attr-value":{color:"#F9EE98"}};e.default=t}(lx)),lx}var cx={},Q5;function y0e(){return Q5||(Q5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",backgroundColor:"transparent !important",backgroundImage:"linear-gradient(to bottom, #2a2139 75%, #34294f)"},':not(pre) > code[class*="language-"]':{backgroundColor:"transparent !important",backgroundImage:"linear-gradient(to bottom, #2a2139 75%, #34294f)",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#8e8e8e"},"block-comment":{color:"#8e8e8e"},prolog:{color:"#8e8e8e"},doctype:{color:"#8e8e8e"},cdata:{color:"#8e8e8e"},punctuation:{color:"#ccc"},tag:{color:"#e2777a"},"attr-name":{color:"#e2777a"},namespace:{color:"#e2777a"},number:{color:"#e2777a"},unit:{color:"#e2777a"},hexcode:{color:"#e2777a"},deleted:{color:"#e2777a"},property:{color:"#72f1b8",textShadow:"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475"},selector:{color:"#72f1b8",textShadow:"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475"},"function-name":{color:"#6196cc"},boolean:{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"},"selector.id":{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"},function:{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"},"class-name":{color:"#fff5f6",textShadow:"0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75"},constant:{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"},symbol:{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"},important:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575",fontWeight:"bold"},atrule:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"},keyword:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"},"selector.class":{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"},builtin:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"},string:{color:"#f87c32"},char:{color:"#f87c32"},"attr-value":{color:"#f87c32"},regex:{color:"#f87c32"},variable:{color:"#f87c32"},operator:{color:"#67cdcc"},entity:{color:"#67cdcc",cursor:"help"},url:{color:"#67cdcc"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},inserted:{color:"green"}};e.default=t}(cx)),cx}var ux={},J5;function v0e(){return J5||(J5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#393A34",fontFamily:'"Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",fontSize:".9em",lineHeight:"1.2em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#393A34",fontFamily:'"Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",fontSize:".9em",lineHeight:"1.2em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",border:"1px solid #dddddd",backgroundColor:"white"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{background:"#C1DEF1"},'pre[class*="language-"] ::-moz-selection':{background:"#C1DEF1"},'code[class*="language-"]::-moz-selection':{background:"#C1DEF1"},'code[class*="language-"] ::-moz-selection':{background:"#C1DEF1"},'pre[class*="language-"]::selection':{background:"#C1DEF1"},'pre[class*="language-"] ::selection':{background:"#C1DEF1"},'code[class*="language-"]::selection':{background:"#C1DEF1"},'code[class*="language-"] ::selection':{background:"#C1DEF1"},':not(pre) > code[class*="language-"]':{padding:".2em",paddingTop:"1px",paddingBottom:"1px",background:"#f8f8f8",border:"1px solid #dddddd"},comment:{color:"#008000",fontStyle:"italic"},prolog:{color:"#008000",fontStyle:"italic"},doctype:{color:"#008000",fontStyle:"italic"},cdata:{color:"#008000",fontStyle:"italic"},namespace:{Opacity:".7"},string:{color:"#A31515"},punctuation:{color:"#393A34"},operator:{color:"#393A34"},url:{color:"#36acaa"},symbol:{color:"#36acaa"},number:{color:"#36acaa"},boolean:{color:"#36acaa"},variable:{color:"#36acaa"},constant:{color:"#36acaa"},inserted:{color:"#36acaa"},atrule:{color:"#0000ff"},keyword:{color:"#0000ff"},"attr-value":{color:"#0000ff"},".language-autohotkey .token.selector":{color:"#0000ff"},".language-json .token.boolean":{color:"#0000ff"},".language-json .token.number":{color:"#0000ff"},'code[class*="language-css"]':{color:"#0000ff"},function:{color:"#393A34"},deleted:{color:"#9a050f"},".language-autohotkey .token.tag":{color:"#9a050f"},selector:{color:"#800000"},".language-autohotkey .token.keyword":{color:"#00009f"},important:{color:"#e90",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},"class-name":{color:"#2B91AF"},".language-json .token.property":{color:"#2B91AF"},tag:{color:"#800000"},"attr-name":{color:"#ff0000"},property:{color:"#ff0000"},regex:{color:"#ff0000"},entity:{color:"#ff0000"},"directive.tag.tag":{background:"#ffff00",color:"#393A34"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"#a5a5a5"},".line-numbers .line-numbers-rows > span:before":{color:"#2B91AF"},".line-highlight.line-highlight":{background:"linear-gradient(to right, rgba(193, 222, 241, 0.2) 70%, rgba(221, 222, 241, 0))"}};e.default=t}(ux)),ux}var dx={},e3;function S0e(){return e3||(e3=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'pre[class*="language-"]':{color:"#d4d4d4",fontSize:"13px",textShadow:"none",fontFamily:'Menlo, Monaco, Consolas, "Andale Mono", "Ubuntu Mono", "Courier New", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",background:"#1e1e1e"},'code[class*="language-"]':{color:"#d4d4d4",fontSize:"13px",textShadow:"none",fontFamily:'Menlo, Monaco, Consolas, "Andale Mono", "Ubuntu Mono", "Courier New", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#264F78"},'code[class*="language-"]::selection':{textShadow:"none",background:"#264F78"},'pre[class*="language-"] *::selection':{textShadow:"none",background:"#264F78"},'code[class*="language-"] *::selection':{textShadow:"none",background:"#264F78"},':not(pre) > code[class*="language-"]':{padding:".1em .3em",borderRadius:".3em",color:"#db4c69",background:"#1e1e1e"},".namespace":{Opacity:".7"},"doctype.doctype-tag":{color:"#569CD6"},"doctype.name":{color:"#9cdcfe"},comment:{color:"#6a9955"},prolog:{color:"#6a9955"},punctuation:{color:"#d4d4d4"},".language-html .language-css .token.punctuation":{color:"#d4d4d4"},".language-html .language-javascript .token.punctuation":{color:"#d4d4d4"},property:{color:"#9cdcfe"},tag:{color:"#569cd6"},boolean:{color:"#569cd6"},number:{color:"#b5cea8"},constant:{color:"#9cdcfe"},symbol:{color:"#b5cea8"},inserted:{color:"#b5cea8"},unit:{color:"#b5cea8"},selector:{color:"#d7ba7d"},"attr-name":{color:"#9cdcfe"},string:{color:"#ce9178"},char:{color:"#ce9178"},builtin:{color:"#ce9178"},deleted:{color:"#ce9178"},".language-css .token.string.url":{textDecoration:"underline"},operator:{color:"#d4d4d4"},entity:{color:"#569cd6"},"operator.arrow":{color:"#569CD6"},atrule:{color:"#ce9178"},"atrule.rule":{color:"#c586c0"},"atrule.url":{color:"#9cdcfe"},"atrule.url.function":{color:"#dcdcaa"},"atrule.url.punctuation":{color:"#d4d4d4"},keyword:{color:"#569CD6"},"keyword.module":{color:"#c586c0"},"keyword.control-flow":{color:"#c586c0"},function:{color:"#dcdcaa"},"function.maybe-class-name":{color:"#dcdcaa"},regex:{color:"#d16969"},important:{color:"#569cd6"},italic:{fontStyle:"italic"},"class-name":{color:"#4ec9b0"},"maybe-class-name":{color:"#4ec9b0"},console:{color:"#9cdcfe"},parameter:{color:"#9cdcfe"},interpolation:{color:"#9cdcfe"},"punctuation.interpolation-punctuation":{color:"#569cd6"},variable:{color:"#9cdcfe"},"imports.maybe-class-name":{color:"#9cdcfe"},"exports.maybe-class-name":{color:"#9cdcfe"},escape:{color:"#d7ba7d"},"tag.punctuation":{color:"#808080"},cdata:{color:"#808080"},"attr-value":{color:"#ce9178"},"attr-value.punctuation":{color:"#ce9178"},"attr-value.punctuation.attr-equals":{color:"#d4d4d4"},namespace:{color:"#4ec9b0"},'pre[class*="language-javascript"]':{color:"#9cdcfe"},'code[class*="language-javascript"]':{color:"#9cdcfe"},'pre[class*="language-jsx"]':{color:"#9cdcfe"},'code[class*="language-jsx"]':{color:"#9cdcfe"},'pre[class*="language-typescript"]':{color:"#9cdcfe"},'code[class*="language-typescript"]':{color:"#9cdcfe"},'pre[class*="language-tsx"]':{color:"#9cdcfe"},'code[class*="language-tsx"]':{color:"#9cdcfe"},'pre[class*="language-css"]':{color:"#ce9178"},'code[class*="language-css"]':{color:"#ce9178"},'pre[class*="language-html"]':{color:"#d4d4d4"},'code[class*="language-html"]':{color:"#d4d4d4"},".language-regex .token.anchor":{color:"#dcdcaa"},".language-html .token.punctuation":{color:"#808080"},'pre[class*="language-"] > code[class*="language-"]':{position:"relative",zIndex:"1"},".line-highlight.line-highlight":{background:"#f7ebc6",boxShadow:"inset 5px 0 0 #f7d87c",zIndex:"0"}};e.default=t}(dx)),dx}var fx={},t3;function w0e(){return t3||(t3=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{MozTabSize:"2",OTabSize:"2",tabSize:"2",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordWrap:"normal",fontFamily:'Menlo, Monaco, "Courier New", monospace',fontSize:"14px",color:"#76d9e6",textShadow:"none"},'pre[class*="language-"]':{MozTabSize:"2",OTabSize:"2",tabSize:"2",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordWrap:"normal",fontFamily:'Menlo, Monaco, "Courier New", monospace',fontSize:"14px",color:"#76d9e6",textShadow:"none",background:"#2a2a2a",padding:"15px",borderRadius:"4px",border:"1px solid #e1e1e8",overflow:"auto",position:"relative"},'pre > code[class*="language-"]':{fontSize:"1em"},':not(pre) > code[class*="language-"]':{background:"#2a2a2a",padding:"0.15em 0.2em 0.05em",borderRadius:".3em",border:"0.13em solid #7a6652",boxShadow:"1px 1px 0.3em -0.1em #000 inset"},'pre[class*="language-"] code':{whiteSpace:"pre",display:"block"},namespace:{Opacity:".7"},comment:{color:"#6f705e"},prolog:{color:"#6f705e"},doctype:{color:"#6f705e"},cdata:{color:"#6f705e"},operator:{color:"#a77afe"},boolean:{color:"#a77afe"},number:{color:"#a77afe"},"attr-name":{color:"#e6d06c"},string:{color:"#e6d06c"},entity:{color:"#e6d06c",cursor:"help"},url:{color:"#e6d06c"},".language-css .token.string":{color:"#e6d06c"},".style .token.string":{color:"#e6d06c"},selector:{color:"#a6e22d"},inserted:{color:"#a6e22d"},atrule:{color:"#ef3b7d"},"attr-value":{color:"#ef3b7d"},keyword:{color:"#ef3b7d"},important:{color:"#ef3b7d",fontWeight:"bold"},deleted:{color:"#ef3b7d"},regex:{color:"#76d9e6"},statement:{color:"#76d9e6",fontWeight:"bold"},placeholder:{color:"#fff"},variable:{color:"#fff"},bold:{fontWeight:"bold"},punctuation:{color:"#bebec5"},italic:{fontStyle:"italic"},"code.language-markup":{color:"#f9f9f9"},"code.language-markup .token.tag":{color:"#ef3b7d"},"code.language-markup .token.attr-name":{color:"#a6e22d"},"code.language-markup .token.attr-value":{color:"#e6d06c"},"code.language-markup .token.style":{color:"#76d9e6"},"code.language-markup .token.script":{color:"#76d9e6"},"code.language-markup .token.script .token.keyword":{color:"#76d9e6"},".line-highlight.line-highlight":{padding:"0",background:"rgba(255, 255, 255, 0.08)"},".line-highlight.line-highlight:before":{padding:"0.2em 0.5em",backgroundColor:"rgba(255, 255, 255, 0.4)",color:"black",height:"1em",lineHeight:"1em",boxShadow:"0 1px 1px rgba(255, 255, 255, 0.7)"},".line-highlight.line-highlight[data-end]:after":{padding:"0.2em 0.5em",backgroundColor:"rgba(255, 255, 255, 0.4)",color:"black",height:"1em",lineHeight:"1em",boxShadow:"0 1px 1px rgba(255, 255, 255, 0.7)"}};e.default=t}(fx)),fx}var px={},n3;function E0e(){return n3||(n3=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#22da17",fontFamily:"monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",lineHeight:"25px",fontSize:"18px",margin:"5px 0"},'pre[class*="language-"]':{color:"white",fontFamily:"monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",lineHeight:"25px",fontSize:"18px",margin:"0.5em 0",background:"#0a143c",padding:"1em",overflow:"auto"},'pre[class*="language-"] *':{fontFamily:"monospace"},':not(pre) > code[class*="language-"]':{color:"white",background:"#0a143c",padding:"0.1em",borderRadius:"0.3em",whiteSpace:"normal"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'pre[class*="language-"]::selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'code[class*="language-"]::selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'code[class*="language-"] ::selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},comment:{color:"rgb(99, 119, 119)",fontStyle:"italic"},prolog:{color:"rgb(99, 119, 119)",fontStyle:"italic"},cdata:{color:"rgb(99, 119, 119)",fontStyle:"italic"},punctuation:{color:"rgb(199, 146, 234)"},".namespace":{color:"rgb(178, 204, 214)"},deleted:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"},symbol:{color:"rgb(128, 203, 196)"},property:{color:"rgb(128, 203, 196)"},tag:{color:"rgb(127, 219, 202)"},operator:{color:"rgb(127, 219, 202)"},keyword:{color:"rgb(127, 219, 202)"},boolean:{color:"rgb(255, 88, 116)"},number:{color:"rgb(247, 140, 108)"},constant:{color:"rgb(34 183 199)"},function:{color:"rgb(34 183 199)"},builtin:{color:"rgb(34 183 199)"},char:{color:"rgb(34 183 199)"},selector:{color:"rgb(199, 146, 234)",fontStyle:"italic"},doctype:{color:"rgb(199, 146, 234)",fontStyle:"italic"},"attr-name":{color:"rgb(173, 219, 103)",fontStyle:"italic"},inserted:{color:"rgb(173, 219, 103)",fontStyle:"italic"},string:{color:"rgb(173, 219, 103)"},url:{color:"rgb(173, 219, 103)"},entity:{color:"rgb(173, 219, 103)"},".language-css .token.string":{color:"rgb(173, 219, 103)"},".style .token.string":{color:"rgb(173, 219, 103)"},"class-name":{color:"rgb(255, 203, 139)"},atrule:{color:"rgb(255, 203, 139)"},"attr-value":{color:"rgb(255, 203, 139)"},regex:{color:"rgb(214, 222, 235)"},important:{color:"rgb(214, 222, 235)",fontWeight:"bold"},variable:{color:"rgb(214, 222, 235)"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(px)),px}(function(e){var t=Owe;Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"a11yDark",{enumerable:!0,get:function(){return u.default}}),Object.defineProperty(e,"atomDark",{enumerable:!0,get:function(){return d.default}}),Object.defineProperty(e,"base16AteliersulphurpoolLight",{enumerable:!0,get:function(){return g.default}}),Object.defineProperty(e,"cb",{enumerable:!0,get:function(){return m.default}}),Object.defineProperty(e,"coldarkCold",{enumerable:!0,get:function(){return b.default}}),Object.defineProperty(e,"coldarkDark",{enumerable:!0,get:function(){return y.default}}),Object.defineProperty(e,"coy",{enumerable:!0,get:function(){return n.default}}),Object.defineProperty(e,"coyWithoutShadows",{enumerable:!0,get:function(){return w.default}}),Object.defineProperty(e,"darcula",{enumerable:!0,get:function(){return v.default}}),Object.defineProperty(e,"dark",{enumerable:!0,get:function(){return r.default}}),Object.defineProperty(e,"dracula",{enumerable:!0,get:function(){return h.default}}),Object.defineProperty(e,"duotoneDark",{enumerable:!0,get:function(){return S.default}}),Object.defineProperty(e,"duotoneEarth",{enumerable:!0,get:function(){return E.default}}),Object.defineProperty(e,"duotoneForest",{enumerable:!0,get:function(){return k.default}}),Object.defineProperty(e,"duotoneLight",{enumerable:!0,get:function(){return x.default}}),Object.defineProperty(e,"duotoneSea",{enumerable:!0,get:function(){return C.default}}),Object.defineProperty(e,"duotoneSpace",{enumerable:!0,get:function(){return _.default}}),Object.defineProperty(e,"funky",{enumerable:!0,get:function(){return a.default}}),Object.defineProperty(e,"ghcolors",{enumerable:!0,get:function(){return R.default}}),Object.defineProperty(e,"gruvboxDark",{enumerable:!0,get:function(){return T.default}}),Object.defineProperty(e,"gruvboxLight",{enumerable:!0,get:function(){return L.default}}),Object.defineProperty(e,"holiTheme",{enumerable:!0,get:function(){return D.default}}),Object.defineProperty(e,"hopscotch",{enumerable:!0,get:function(){return H.default}}),Object.defineProperty(e,"lucario",{enumerable:!0,get:function(){return z.default}}),Object.defineProperty(e,"materialDark",{enumerable:!0,get:function(){return M.default}}),Object.defineProperty(e,"materialLight",{enumerable:!0,get:function(){return U.default}}),Object.defineProperty(e,"materialOceanic",{enumerable:!0,get:function(){return X.default}}),Object.defineProperty(e,"nightOwl",{enumerable:!0,get:function(){return j.default}}),Object.defineProperty(e,"nord",{enumerable:!0,get:function(){return O.default}}),Object.defineProperty(e,"okaidia",{enumerable:!0,get:function(){return o.default}}),Object.defineProperty(e,"oneDark",{enumerable:!0,get:function(){return A.default}}),Object.defineProperty(e,"oneLight",{enumerable:!0,get:function(){return V.default}}),Object.defineProperty(e,"pojoaque",{enumerable:!0,get:function(){return P.default}}),Object.defineProperty(e,"prism",{enumerable:!0,get:function(){return c.default}}),Object.defineProperty(e,"shadesOfPurple",{enumerable:!0,get:function(){return N.default}}),Object.defineProperty(e,"solarizedDarkAtom",{enumerable:!0,get:function(){return K.default}}),Object.defineProperty(e,"solarizedlight",{enumerable:!0,get:function(){return i.default}}),Object.defineProperty(e,"synthwave84",{enumerable:!0,get:function(){return ae.default}}),Object.defineProperty(e,"tomorrow",{enumerable:!0,get:function(){return s.default}}),Object.defineProperty(e,"twilight",{enumerable:!0,get:function(){return l.default}}),Object.defineProperty(e,"vs",{enumerable:!0,get:function(){return ne.default}}),Object.defineProperty(e,"vscDarkPlus",{enumerable:!0,get:function(){return Q.default}}),Object.defineProperty(e,"xonokai",{enumerable:!0,get:function(){return pe.default}}),Object.defineProperty(e,"zTouch",{enumerable:!0,get:function(){return he.default}});var n=t(Dwe()),r=t(Lwe()),a=t(Mwe()),o=t(Pwe()),i=t($we()),s=t(Fwe()),l=t(jwe()),c=t(zwe()),u=t(Uwe()),d=t(Bwe()),g=t(Hwe()),m=t(Vwe()),b=t(qwe()),y=t(Gwe()),w=t(Wwe()),v=t(Kwe()),h=t(Ywe()),S=t(Zwe()),E=t(Xwe()),k=t(Qwe()),x=t(Jwe()),C=t(e0e()),_=t(t0e()),R=t(n0e()),T=t(r0e()),L=t(a0e()),D=t(o0e()),H=t(i0e()),z=t(s0e()),M=t(l0e()),U=t(c0e()),X=t(u0e()),j=t(d0e()),O=t(f0e()),A=t(p0e()),V=t(g0e()),P=t(m0e()),N=t(h0e()),K=t(b0e()),ae=t(y0e()),ne=t(v0e()),Q=t(S0e()),pe=t(w0e()),he=t(E0e())})(dz);const x0e={javascript:".js",python:".py",java:".java",c:".c",cpp:".cpp","c++":".cpp","c#":".cs",ruby:".rb",php:".php",swift:".swift","objective-c":".m",kotlin:".kt",typescript:".ts",go:".go",perl:".pl",rust:".rs",scala:".scala",haskell:".hs",lua:".lua",shell:".sh",sql:".sql",html:".html",css:".css"},k0e=(e,t=!1)=>{const n="ABCDEFGHJKLMNPQRSTUVWXY3456789";let r="";for(let a=0;a{const n=()=>{if(typeof window>"u")return;const a=x0e[e]||".file",o=`file-${k0e(3,!0)}${a}`,i=window.prompt("Enter file name",o);if(!i)return;const s=new Blob([t],{type:"text/plain"}),l=URL.createObjectURL(s),c=document.createElement("a");c.download=i,c.href=l,c.style.display="none",document.body.appendChild(c),c.click(),document.body.removeChild(c),URL.revokeObjectURL(l)},r=()=>{console.log("copy")};return f.jsxs("div",{className:"codeblock relative w-full bg-zinc-950 font-sans",children:[f.jsxs("div",{className:"flex w-full items-center justify-between bg-zinc-800 px-6 py-2 pr-4 text-zinc-100",children:[f.jsx("span",{className:"text-xs lowercase",children:e}),f.jsxs("div",{className:"flex items-center space-x-1",children:[f.jsxs(ue,{variant:"ghost",size:"icon",onClick:n,children:[f.jsx(Cq,{}),f.jsx("span",{className:"sr-only",children:"Download"})]}),f.jsxs(ue,{variant:"ghost",size:"icon",className:"text-xs hover:bg-zinc-800 focus-visible:ring-1 focus-visible:ring-slate-700 focus-visible:ring-offset-0",onClick:r,children:[f.jsx(Pm,{}),f.jsx("span",{className:"sr-only",children:"Copy code"})]})]})]}),f.jsx(Iwe,{language:e,style:dz.coldarkDark,PreTag:"div",showLineNumbers:!0,customStyle:{margin:0,width:"100%",background:"transparent",padding:"1.5rem 1rem"},lineNumberStyle:{userSelect:"none"},codeTagProps:{style:{fontSize:"0.9rem",fontFamily:"var(--font-mono)"}},children:t})]})});pz.displayName="CodeBlock";function C0e(e,t){const n=t||{};return(e[e.length-1]===""?[...e,""]:e).join((n.padRight?" ":"")+","+(n.padLeft===!1?"":" ")).trim()}const _0e=/^[$_\p{ID_Start}][$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,A0e=/^[$_\p{ID_Start}][-$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,T0e={};function r3(e,t){return((t||T0e).jsx?A0e:_0e).test(e)}const R0e=/[ \t\n\f\r]/g;function N0e(e){return typeof e=="object"?e.type==="text"?a3(e.value):!1:a3(e)}function a3(e){return e.replace(R0e,"")===""}class Cf{constructor(t,n,r){this.property=t,this.normal=n,r&&(this.space=r)}}Cf.prototype.property={};Cf.prototype.normal={};Cf.prototype.space=null;function gz(e,t){const n={},r={};let a=-1;for(;++a4&&n.slice(0,4)==="data"&&M0e.test(t)){if(t.charAt(4)==="-"){const o=t.slice(5).replace(i3,j0e);r="data"+o.charAt(0).toUpperCase()+o.slice(1)}else{const o=t.slice(4);if(!i3.test(o)){let i=o.replace(P0e,F0e);i.charAt(0)!=="-"&&(i="-"+i),t="data"+i}}a=PA}return new a(r,t)}function F0e(e){return"-"+e.toLowerCase()}function j0e(e){return e.charAt(1).toUpperCase()}const z0e={classId:"classID",dataType:"datatype",itemId:"itemID",strokeDashArray:"strokeDasharray",strokeDashOffset:"strokeDashoffset",strokeLineCap:"strokeLinecap",strokeLineJoin:"strokeLinejoin",strokeMiterLimit:"strokeMiterlimit",typeOf:"typeof",xLinkActuate:"xlinkActuate",xLinkArcRole:"xlinkArcrole",xLinkHref:"xlinkHref",xLinkRole:"xlinkRole",xLinkShow:"xlinkShow",xLinkTitle:"xlinkTitle",xLinkType:"xlinkType",xmlnsXLink:"xmlnsXlink"},U0e=gz([bz,hz,Sz,wz,D0e],"html"),$A=gz([bz,hz,Sz,wz,L0e],"svg");function B0e(e){return e.join(" ").trim()}var Ez={},s3=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,H0e=/\n/g,V0e=/^\s*/,q0e=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,G0e=/^:\s*/,W0e=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,K0e=/^[;\s]*/,Y0e=/^\s+|\s+$/g,Z0e=` -`,l3="/",c3="*",Qi="",X0e="comment",Q0e="declaration",J0e=function(e,t){if(typeof e!="string")throw new TypeError("First argument must be a string");if(!e)return[];t=t||{};var n=1,r=1;function a(b){var y=b.match(H0e);y&&(n+=y.length);var w=b.lastIndexOf(Z0e);r=~w?b.length-w:r+b.length}function o(){var b={line:n,column:r};return function(y){return y.position=new i(b),c(),y}}function i(b){this.start=b,this.end={line:n,column:r},this.source=t.source}i.prototype.content=e;function s(b){var y=new Error(t.source+":"+n+":"+r+": "+b);if(y.reason=b,y.filename=t.source,y.line=n,y.column=r,y.source=e,!t.silent)throw y}function l(b){var y=b.exec(e);if(y){var w=y[0];return a(w),e=e.slice(w.length),y}}function c(){l(V0e)}function u(b){var y;for(b=b||[];y=d();)y!==!1&&b.push(y);return b}function d(){var b=o();if(!(l3!=e.charAt(0)||c3!=e.charAt(1))){for(var y=2;Qi!=e.charAt(y)&&(c3!=e.charAt(y)||l3!=e.charAt(y+1));)++y;if(y+=2,Qi===e.charAt(y-1))return s("End of comment missing");var w=e.slice(2,y-2);return r+=2,a(w),e=e.slice(y),r+=2,b({type:X0e,comment:w})}}function g(){var b=o(),y=l(q0e);if(y){if(d(),!l(G0e))return s("property missing ':'");var w=l(W0e),v=b({type:Q0e,property:u3(y[0].replace(s3,Qi)),value:w?u3(w[0].replace(s3,Qi)):Qi});return l(K0e),v}}function m(){var b=[];u(b);for(var y;y=g();)y!==!1&&(b.push(y),u(b));return b}return c(),m()};function u3(e){return e?e.replace(Y0e,Qi):Qi}var eEe=nn&&nn.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Ez,"__esModule",{value:!0});var tEe=eEe(J0e);function nEe(e,t){var n=null;if(!e||typeof e!="string")return n;var r=(0,tEe.default)(e),a=typeof t=="function";return r.forEach(function(o){if(o.type==="declaration"){var i=o.property,s=o.value;a?t(i,s,o):s&&(n=n||{},n[i]=s)}}),n}var d3=Ez.default=nEe;const rEe=d3.default||d3,xz=kz("end"),FA=kz("start");function kz(e){return t;function t(n){const r=n&&n.position&&n.position[e]||{};if(typeof r.line=="number"&&r.line>0&&typeof r.column=="number"&&r.column>0)return{line:r.line,column:r.column,offset:typeof r.offset=="number"&&r.offset>-1?r.offset:void 0}}}function aEe(e){const t=FA(e),n=xz(e);if(t&&n)return{start:t,end:n}}function Yu(e){return!e||typeof e!="object"?"":"position"in e||"type"in e?f3(e.position):"start"in e||"end"in e?f3(e):"line"in e||"column"in e?Fk(e):""}function Fk(e){return p3(e&&e.line)+":"+p3(e&&e.column)}function f3(e){return Fk(e&&e.start)+"-"+Fk(e&&e.end)}function p3(e){return e&&typeof e=="number"?e:1}class Bn extends Error{constructor(t,n,r){super(),typeof n=="string"&&(r=n,n=void 0);let a="",o={},i=!1;if(n&&("line"in n&&"column"in n?o={place:n}:"start"in n&&"end"in n?o={place:n}:"type"in n?o={ancestors:[n],place:n.position}:o={...n}),typeof t=="string"?a=t:!o.cause&&t&&(i=!0,a=t.message,o.cause=t),!o.ruleId&&!o.source&&typeof r=="string"){const l=r.indexOf(":");l===-1?o.ruleId=r:(o.source=r.slice(0,l),o.ruleId=r.slice(l+1))}if(!o.place&&o.ancestors&&o.ancestors){const l=o.ancestors[o.ancestors.length-1];l&&(o.place=l.position)}const s=o.place&&"start"in o.place?o.place.start:o.place;this.ancestors=o.ancestors||void 0,this.cause=o.cause||void 0,this.column=s?s.column:void 0,this.fatal=void 0,this.file,this.message=a,this.line=s?s.line:void 0,this.name=Yu(o.place)||"1:1",this.place=o.place||void 0,this.reason=this.message,this.ruleId=o.ruleId||void 0,this.source=o.source||void 0,this.stack=i&&o.cause&&typeof o.cause.stack=="string"?o.cause.stack:"",this.actual,this.expected,this.note,this.url}}Bn.prototype.file="";Bn.prototype.name="";Bn.prototype.reason="";Bn.prototype.message="";Bn.prototype.stack="";Bn.prototype.column=void 0;Bn.prototype.line=void 0;Bn.prototype.ancestors=void 0;Bn.prototype.cause=void 0;Bn.prototype.fatal=void 0;Bn.prototype.place=void 0;Bn.prototype.ruleId=void 0;Bn.prototype.source=void 0;const jA={}.hasOwnProperty,oEe=new Map,iEe=/[A-Z]/g,sEe=/-([a-z])/g,lEe=new Set(["table","tbody","thead","tfoot","tr"]),cEe=new Set(["td","th"]),Cz="https://github.com/syntax-tree/hast-util-to-jsx-runtime";function uEe(e,t){if(!t||t.Fragment===void 0)throw new TypeError("Expected `Fragment` in options");const n=t.filePath||void 0;let r;if(t.development){if(typeof t.jsxDEV!="function")throw new TypeError("Expected `jsxDEV` in options when `development: true`");r=yEe(n,t.jsxDEV)}else{if(typeof t.jsx!="function")throw new TypeError("Expected `jsx` in production options");if(typeof t.jsxs!="function")throw new TypeError("Expected `jsxs` in production options");r=bEe(n,t.jsx,t.jsxs)}const a={Fragment:t.Fragment,ancestors:[],components:t.components||{},create:r,elementAttributeNameCase:t.elementAttributeNameCase||"react",evaluater:t.createEvaluater?t.createEvaluater():void 0,filePath:n,ignoreInvalidStyle:t.ignoreInvalidStyle||!1,passKeys:t.passKeys!==!1,passNode:t.passNode||!1,schema:t.space==="svg"?$A:U0e,stylePropertyNameCase:t.stylePropertyNameCase||"dom",tableCellAlignToStyle:t.tableCellAlignToStyle!==!1},o=_z(a,e,void 0);return o&&typeof o!="string"?o:a.create(e,a.Fragment,{children:o||void 0},void 0)}function _z(e,t,n){if(t.type==="element")return dEe(e,t,n);if(t.type==="mdxFlowExpression"||t.type==="mdxTextExpression")return fEe(e,t);if(t.type==="mdxJsxFlowElement"||t.type==="mdxJsxTextElement")return gEe(e,t,n);if(t.type==="mdxjsEsm")return pEe(e,t);if(t.type==="root")return mEe(e,t,n);if(t.type==="text")return hEe(e,t)}function dEe(e,t,n){const r=e.schema;let a=r;t.tagName.toLowerCase()==="svg"&&r.space==="html"&&(a=$A,e.schema=a),e.ancestors.push(t);const o=Tz(e,t.tagName,!1),i=vEe(e,t);let s=UA(e,t);return lEe.has(t.tagName)&&(s=s.filter(function(l){return typeof l=="string"?!N0e(l):!0})),Az(e,i,o,t),zA(i,s),e.ancestors.pop(),e.schema=r,e.create(t,o,i,n)}function fEe(e,t){if(t.data&&t.data.estree&&e.evaluater){const r=t.data.estree.body[0];return r.type,e.evaluater.evaluateExpression(r.expression)}Rd(e,t.position)}function pEe(e,t){if(t.data&&t.data.estree&&e.evaluater)return e.evaluater.evaluateProgram(t.data.estree);Rd(e,t.position)}function gEe(e,t,n){const r=e.schema;let a=r;t.name==="svg"&&r.space==="html"&&(a=$A,e.schema=a),e.ancestors.push(t);const o=t.name===null?e.Fragment:Tz(e,t.name,!0),i=SEe(e,t),s=UA(e,t);return Az(e,i,o,t),zA(i,s),e.ancestors.pop(),e.schema=r,e.create(t,o,i,n)}function mEe(e,t,n){const r={};return zA(r,UA(e,t)),e.create(t,e.Fragment,r,n)}function hEe(e,t){return t.value}function Az(e,t,n,r){typeof n!="string"&&n!==e.Fragment&&e.passNode&&(t.node=r)}function zA(e,t){if(t.length>0){const n=t.length>1?t:t[0];n&&(e.children=n)}}function bEe(e,t,n){return r;function r(a,o,i,s){const c=Array.isArray(i.children)?n:t;return s?c(o,i,s):c(o,i)}}function yEe(e,t){return n;function n(r,a,o,i){const s=Array.isArray(o.children),l=FA(r);return t(a,o,i,s,{columnNumber:l?l.column-1:void 0,fileName:e,lineNumber:l?l.line:void 0},void 0)}}function vEe(e,t){const n={};let r,a;for(a in t.properties)if(a!=="children"&&jA.call(t.properties,a)){const o=wEe(e,a,t.properties[a]);if(o){const[i,s]=o;e.tableCellAlignToStyle&&i==="align"&&typeof s=="string"&&cEe.has(t.tagName)?r=s:n[i]=s}}if(r){const o=n.style||(n.style={});o[e.stylePropertyNameCase==="css"?"text-align":"textAlign"]=r}return n}function SEe(e,t){const n={};for(const r of t.attributes)if(r.type==="mdxJsxExpressionAttribute")if(r.data&&r.data.estree&&e.evaluater){const o=r.data.estree.body[0];o.type;const i=o.expression;i.type;const s=i.properties[0];s.type,Object.assign(n,e.evaluater.evaluateExpression(s.argument))}else Rd(e,t.position);else{const a=r.name;let o;if(r.value&&typeof r.value=="object")if(r.value.data&&r.value.data.estree&&e.evaluater){const s=r.value.data.estree.body[0];s.type,o=e.evaluater.evaluateExpression(s.expression)}else Rd(e,t.position);else o=r.value===null?!0:r.value;n[a]=o}return n}function UA(e,t){const n=[];let r=-1;const a=e.passKeys?new Map:oEe;for(;++ri))return;const C=t.events.length;let _=C,R,T;for(;_--;)if(t.events[_][0]==="exit"&&t.events[_][1].type==="chunkFlow"){if(R){T=t.events[_][1].end;break}R=!0}for(v(r),x=C;xS;){const k=n[E];t.containerState=k[1],k[0].exit.call(t,e)}n.length=S}function h(){a.write([null]),o=void 0,a=void 0,t.containerState._closeFlow=void 0}}function IEe(e,t,n){return ct(e,e.attempt(this.parser.constructs.document,t,n),"linePrefix",this.parser.constructs.disable.null.includes("codeIndented")?void 0:4)}const OEe={tokenize:DEe};function DEe(e){const t=this,n=e.attempt(Ef,r,e.attempt(this.parser.constructs.flowInitial,a,ct(e,e.attempt(this.parser.constructs.flow,a,e.attempt(Hue,a)),"linePrefix")));return n;function r(o){if(o===null){e.consume(o);return}return e.enter("lineEndingBlank"),e.consume(o),e.exit("lineEndingBlank"),t.currentConstruct=void 0,n}function a(o){if(o===null){e.consume(o);return}return e.enter("lineEnding"),e.consume(o),e.exit("lineEnding"),t.currentConstruct=void 0,n}}const LEe={resolveAll:Nz()},MEe=Rz("string"),PEe=Rz("text");function Rz(e){return{tokenize:t,resolveAll:Nz(e==="text"?$Ee:void 0)};function t(n){const r=this,a=this.parser.constructs[e],o=n.attempt(a,i,s);return i;function i(u){return c(u)?o(u):s(u)}function s(u){if(u===null){n.consume(u);return}return n.enter("data"),n.consume(u),l}function l(u){return c(u)?(n.exit("data"),o(u)):(n.consume(u),l)}function c(u){if(u===null)return!0;const d=a[u];let g=-1;if(d)for(;++g-1){const s=i[0];typeof s=="string"?i[0]=s.slice(r):i.shift()}o>0&&i.push(e[a].slice(0,o))}return i}function zEe(e,t){let n=-1;const r=[];let a;for(;++n=s.length);u++){var d=c[u];if(typeof d=="string"||d.content&&typeof d.content=="string"){var g=s[i],m=a.tokenStack[g],b=typeof d=="string"?d:d.content,y=r(o,g),w=b.indexOf(y);if(w>-1){++i;var v=b.substring(0,w),h=new n.Token(o,n.tokenize(m,a.grammar),"language-"+o,m),S=b.substring(w+y.length),E=[];v&&E.push.apply(E,l([v])),E.push(h),S&&E.push.apply(E,l([S])),typeof d=="string"?c.splice.apply(c,[u,1].concat(E)):d.content=E}}else d.content&&l(d.content)}return c}l(a.tokens)}}})})(t)}return Tv}var Rv,bO;function Gbe(){if(bO)return Rv;bO=1;var e=mr();Rv=t,t.displayName="django",t.aliases=["jinja2"];function t(n){n.register(e),function(r){r.languages.django={comment:/^\{#[\s\S]*?#\}$/,tag:{pattern:/(^\{%[+-]?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%][+-]?|[+-]?[}%]\}$/,alias:"punctuation"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},filter:{pattern:/(\|)\w+/,lookbehind:!0,alias:"function"},test:{pattern:/(\bis\s+(?:not\s+)?)(?!not\b)\w+/,lookbehind:!0,alias:"function"},function:/\b[a-z_]\w+(?=\s*\()/i,keyword:/\b(?:and|as|by|else|for|if|import|in|is|loop|not|or|recursive|with|without)\b/,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,number:/\b\d+(?:\.\d+)?\b/,boolean:/[Ff]alse|[Nn]one|[Tt]rue/,variable:/\b\w+\b/,punctuation:/[{}[\](),.:;]/};var a=/\{\{[\s\S]*?\}\}|\{%[\s\S]*?%\}|\{#[\s\S]*?#\}/g,o=r.languages["markup-templating"];r.hooks.add("before-tokenize",function(i){o.buildPlaceholders(i,"django",a)}),r.hooks.add("after-tokenize",function(i){o.tokenizePlaceholders(i,"django")}),r.languages.jinja2=r.languages.django,r.hooks.add("before-tokenize",function(i){o.buildPlaceholders(i,"jinja2",a)}),r.hooks.add("after-tokenize",function(i){o.tokenizePlaceholders(i,"jinja2")})}(n)}return Rv}var Nv,yO;function Wbe(){if(yO)return Nv;yO=1,Nv=e,e.displayName="dnsZoneFile",e.aliases=[];function e(t){t.languages["dns-zone-file"]={comment:/;.*/,string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},variable:[{pattern:/(^\$ORIGIN[ \t]+)\S+/m,lookbehind:!0},{pattern:/(^|\s)@(?=\s|$)/,lookbehind:!0}],keyword:/^\$(?:INCLUDE|ORIGIN|TTL)(?=\s|$)/m,class:{pattern:/(^|\s)(?:CH|CS|HS|IN)(?=\s|$)/,lookbehind:!0,alias:"keyword"},type:{pattern:/(^|\s)(?:A|A6|AAAA|AFSDB|APL|ATMA|CAA|CDNSKEY|CDS|CERT|CNAME|DHCID|DLV|DNAME|DNSKEY|DS|EID|GID|GPOS|HINFO|HIP|IPSECKEY|ISDN|KEY|KX|LOC|MAILA|MAILB|MB|MD|MF|MG|MINFO|MR|MX|NAPTR|NB|NBSTAT|NIMLOC|NINFO|NS|NSAP|NSAP-PTR|NSEC|NSEC3|NSEC3PARAM|NULL|NXT|OPENPGPKEY|PTR|PX|RKEY|RP|RRSIG|RT|SIG|SINK|SMIMEA|SOA|SPF|SRV|SSHFP|TA|TKEY|TLSA|TSIG|TXT|UID|UINFO|UNSPEC|URI|WKS|X25)(?=\s|$)/,lookbehind:!0,alias:"keyword"},punctuation:/[()]/},t.languages["dns-zone"]=t.languages["dns-zone-file"]}return Nv}var Iv,vO;function Kbe(){if(vO)return Iv;vO=1,Iv=e,e.displayName="docker",e.aliases=["dockerfile"];function e(t){(function(n){var r=/\\[\r\n](?:\s|\\[\r\n]|#.*(?!.))*(?![\s#]|\\[\r\n])/.source,a=/(?:[ \t]+(?![ \t])(?:)?|)/.source.replace(//g,function(){return r}),o=/"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*"|'(?:[^'\\\r\n]|\\(?:\r\n|[\s\S]))*'/.source,i=/--[\w-]+=(?:|(?!["'])(?:[^\s\\]|\\.)+)/.source.replace(//g,function(){return o}),s={pattern:RegExp(o),greedy:!0},l={pattern:/(^[ \t]*)#.*/m,lookbehind:!0,greedy:!0};function c(u,d){return u=u.replace(//g,function(){return i}).replace(//g,function(){return a}),RegExp(u,d)}n.languages.docker={instruction:{pattern:/(^[ \t]*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)(?:\\.|[^\r\n\\])*(?:\\$(?:\s|#.*$)*(?![\s#])(?:\\.|[^\r\n\\])*)*/im,lookbehind:!0,greedy:!0,inside:{options:{pattern:c(/(^(?:ONBUILD)?\w+)(?:)*/.source,"i"),lookbehind:!0,greedy:!0,inside:{property:{pattern:/(^|\s)--[\w-]+/,lookbehind:!0},string:[s,{pattern:/(=)(?!["'])(?:[^\s\\]|\\.)+/,lookbehind:!0}],operator:/\\$/m,punctuation:/=/}},keyword:[{pattern:c(/(^(?:ONBUILD)?HEALTHCHECK(?:)*)(?:CMD|NONE)\b/.source,"i"),lookbehind:!0,greedy:!0},{pattern:c(/(^(?:ONBUILD)?FROM(?:)*(?!--)[^ \t\\]+)AS/.source,"i"),lookbehind:!0,greedy:!0},{pattern:c(/(^ONBUILD)\w+/.source,"i"),lookbehind:!0,greedy:!0},{pattern:/^\w+/,greedy:!0}],comment:l,string:s,variable:/\$(?:\w+|\{[^{}"'\\]*\})/,operator:/\\$/m}},comment:l},n.languages.dockerfile=n.languages.docker})(t)}return Iv}var Ov,SO;function Ybe(){if(SO)return Ov;SO=1,Ov=e,e.displayName="dot",e.aliases=["gv"];function e(t){(function(n){var r="(?:"+[/[a-zA-Z_\x80-\uFFFF][\w\x80-\uFFFF]*/.source,/-?(?:\.\d+|\d+(?:\.\d*)?)/.source,/"[^"\\]*(?:\\[\s\S][^"\\]*)*"/.source,/<(?:[^<>]|(?!)*>/.source].join("|")+")",a={markup:{pattern:/(^<)[\s\S]+(?=>$)/,lookbehind:!0,alias:["language-markup","language-html","language-xml"],inside:n.languages.markup}};function o(i,s){return RegExp(i.replace(//g,function(){return r}),s)}n.languages.dot={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\/|^#.*/m,greedy:!0},"graph-name":{pattern:o(/(\b(?:digraph|graph|subgraph)[ \t\r\n]+)/.source,"i"),lookbehind:!0,greedy:!0,alias:"class-name",inside:a},"attr-value":{pattern:o(/(=[ \t\r\n]*)/.source),lookbehind:!0,greedy:!0,inside:a},"attr-name":{pattern:o(/([\[;, \t\r\n])(?=[ \t\r\n]*=)/.source),lookbehind:!0,greedy:!0,inside:a},keyword:/\b(?:digraph|edge|graph|node|strict|subgraph)\b/i,"compass-point":{pattern:/(:[ \t\r\n]*)(?:[ewc_]|[ns][ew]?)(?![\w\x80-\uFFFF])/,lookbehind:!0,alias:"builtin"},node:{pattern:o(/(^|[^-.\w\x80-\uFFFF\\])/.source),lookbehind:!0,greedy:!0,inside:a},operator:/[=:]|-[->]/,punctuation:/[\[\]{};,]/},n.languages.gv=n.languages.dot})(t)}return Ov}var Dv,wO;function Zbe(){if(wO)return Dv;wO=1,Dv=e,e.displayName="ebnf",e.aliases=[];function e(t){t.languages.ebnf={comment:/\(\*[\s\S]*?\*\)/,string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,greedy:!0},special:{pattern:/\?[^?\r\n]*\?/,greedy:!0,alias:"class-name"},definition:{pattern:/^([\t ]*)[a-z]\w*(?:[ \t]+[a-z]\w*)*(?=\s*=)/im,lookbehind:!0,alias:["rule","keyword"]},rule:/\b[a-z]\w*(?:[ \t]+[a-z]\w*)*\b/i,punctuation:/\([:/]|[:/]\)|[.,;()[\]{}]/,operator:/[-=|*/!]/}}return Dv}var Lv,EO;function Xbe(){if(EO)return Lv;EO=1,Lv=e,e.displayName="editorconfig",e.aliases=[];function e(t){t.languages.editorconfig={comment:/[;#].*/,section:{pattern:/(^[ \t]*)\[.+\]/m,lookbehind:!0,alias:"selector",inside:{regex:/\\\\[\[\]{},!?.*]/,operator:/[!?]|\.\.|\*{1,2}/,punctuation:/[\[\]{},]/}},key:{pattern:/(^[ \t]*)[^\s=]+(?=[ \t]*=)/m,lookbehind:!0,alias:"attr-name"},value:{pattern:/=.*/,alias:"attr-value",inside:{punctuation:/^=/}}}}return Lv}var Mv,xO;function Qbe(){if(xO)return Mv;xO=1,Mv=e,e.displayName="eiffel",e.aliases=[];function e(t){t.languages.eiffel={comment:/--.*/,string:[{pattern:/"([^[]*)\[[\s\S]*?\]\1"/,greedy:!0},{pattern:/"([^{]*)\{[\s\S]*?\}\1"/,greedy:!0},{pattern:/"(?:%(?:(?!\n)\s)*\n\s*%|%\S|[^%"\r\n])*"/,greedy:!0}],char:/'(?:%.|[^%'\r\n])+'/,keyword:/\b(?:across|agent|alias|all|and|as|assign|attached|attribute|check|class|convert|create|Current|debug|deferred|detachable|do|else|elseif|end|ensure|expanded|export|external|feature|from|frozen|if|implies|inherit|inspect|invariant|like|local|loop|not|note|obsolete|old|once|or|Precursor|redefine|rename|require|rescue|Result|retry|select|separate|some|then|undefine|until|variant|Void|when|xor)\b/i,boolean:/\b(?:False|True)\b/i,"class-name":/\b[A-Z][\dA-Z_]*\b/,number:[/\b0[xcb][\da-f](?:_*[\da-f])*\b/i,/(?:\b\d(?:_*\d)*)?\.(?:(?:\d(?:_*\d)*)?e[+-]?)?\d(?:_*\d)*\b|\b\d(?:_*\d)*\b\.?/i],punctuation:/:=|<<|>>|\(\||\|\)|->|\.(?=\w)|[{}[\];(),:?]/,operator:/\\\\|\|\.\.\||\.\.|\/[~\/=]?|[><]=?|[-+*^=~]/}}return Mv}var Pv,kO;function Jbe(){if(kO)return Pv;kO=1;var e=mr();Pv=t,t.displayName="ejs",t.aliases=["eta"];function t(n){n.register(e),function(r){r.languages.ejs={delimiter:{pattern:/^<%[-_=]?|[-_]?%>$/,alias:"punctuation"},comment:/^#[\s\S]*/,"language-javascript":{pattern:/[\s\S]+/,inside:r.languages.javascript}},r.hooks.add("before-tokenize",function(a){var o=/<%(?!%)[\s\S]+?%>/g;r.languages["markup-templating"].buildPlaceholders(a,"ejs",o)}),r.hooks.add("after-tokenize",function(a){r.languages["markup-templating"].tokenizePlaceholders(a,"ejs")}),r.languages.eta=r.languages.ejs}(n)}return Pv}var $v,CO;function eye(){if(CO)return $v;CO=1,$v=e,e.displayName="elixir",e.aliases=[];function e(t){t.languages.elixir={doc:{pattern:/@(?:doc|moduledoc)\s+(?:("""|''')[\s\S]*?\1|("|')(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2)/,inside:{attribute:/^@\w+/,string:/['"][\s\S]+/}},comment:{pattern:/#.*/,greedy:!0},regex:{pattern:/~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,greedy:!0},string:[{pattern:/~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,greedy:!0,inside:{}},{pattern:/("""|''')[\s\S]*?\1/,greedy:!0,inside:{}},{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{}}],atom:{pattern:/(^|[^:]):\w+/,lookbehind:!0,alias:"symbol"},module:{pattern:/\b[A-Z]\w*\b/,alias:"class-name"},"attr-name":/\b\w+\??:(?!:)/,argument:{pattern:/(^|[^&])&\d+/,lookbehind:!0,alias:"variable"},attribute:{pattern:/@\w+/,alias:"variable"},function:/\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|(?=\/\d))/,number:/\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,keyword:/\b(?:after|alias|and|case|catch|cond|def(?:callback|delegate|exception|impl|macro|module|n|np|p|protocol|struct)?|do|else|end|fn|for|if|import|not|or|quote|raise|require|rescue|try|unless|unquote|use|when)\b/,boolean:/\b(?:false|nil|true)\b/,operator:[/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\[\]{}()]/},t.languages.elixir.string.forEach(function(n){n.inside={interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:t.languages.elixir}}}})}return $v}var Fv,_O;function tye(){if(_O)return Fv;_O=1,Fv=e,e.displayName="elm",e.aliases=[];function e(t){t.languages.elm={comment:/--.*|\{-[\s\S]*?-\}/,char:{pattern:/'(?:[^\\'\r\n]|\\(?:[abfnrtv\\']|\d+|x[0-9a-fA-F]+|u\{[0-9a-fA-F]+\}))'/,greedy:!0},string:[{pattern:/"""[\s\S]*?"""/,greedy:!0},{pattern:/"(?:[^\\"\r\n]|\\.)*"/,greedy:!0}],"import-statement":{pattern:/(^[\t ]*)import\s+[A-Z]\w*(?:\.[A-Z]\w*)*(?:\s+as\s+(?:[A-Z]\w*)(?:\.[A-Z]\w*)*)?(?:\s+exposing\s+)?/m,lookbehind:!0,inside:{keyword:/\b(?:as|exposing|import)\b/}},keyword:/\b(?:alias|as|case|else|exposing|if|in|infixl|infixr|let|module|of|then|type)\b/,builtin:/\b(?:abs|acos|always|asin|atan|atan2|ceiling|clamp|compare|cos|curry|degrees|e|flip|floor|fromPolar|identity|isInfinite|isNaN|logBase|max|min|negate|never|not|pi|radians|rem|round|sin|sqrt|tan|toFloat|toPolar|toString|truncate|turns|uncurry|xor)\b/,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0x[0-9a-f]+)\b/i,operator:/\s\.\s|[+\-/*=.$<>:&|^?%#@~!]{2,}|[+\-/*=$<>:&|^?%#@~!]/,hvariable:/\b(?:[A-Z]\w*\.)*[a-z]\w*\b/,constant:/\b(?:[A-Z]\w*\.)*[A-Z]\w*\b/,punctuation:/[{}[\]|(),.:]/}}return Fv}var jv,AO;function nye(){if(AO)return jv;AO=1;var e=Th(),t=mr();jv=n,n.displayName="erb",n.aliases=[];function n(r){r.register(e),r.register(t),function(a){a.languages.erb={delimiter:{pattern:/^(\s*)<%=?|%>(?=\s*$)/,lookbehind:!0,alias:"punctuation"},ruby:{pattern:/\s*\S[\s\S]*/,alias:"language-ruby",inside:a.languages.ruby}},a.hooks.add("before-tokenize",function(o){var i=/<%=?(?:[^\r\n]|[\r\n](?!=begin)|[\r\n]=begin\s(?:[^\r\n]|[\r\n](?!=end))*[\r\n]=end)+?%>/g;a.languages["markup-templating"].buildPlaceholders(o,"erb",i)}),a.hooks.add("after-tokenize",function(o){a.languages["markup-templating"].tokenizePlaceholders(o,"erb")})}(r)}return jv}var zv,TO;function rye(){if(TO)return zv;TO=1,zv=e,e.displayName="erlang",e.aliases=[];function e(t){t.languages.erlang={comment:/%.+/,string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},"quoted-function":{pattern:/'(?:\\.|[^\\'\r\n])+'(?=\()/,alias:"function"},"quoted-atom":{pattern:/'(?:\\.|[^\\'\r\n])+'/,alias:"atom"},boolean:/\b(?:false|true)\b/,keyword:/\b(?:after|case|catch|end|fun|if|of|receive|try|when)\b/,number:[/\$\\?./,/\b\d+#[a-z0-9]+/i,/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i],function:/\b[a-z][\w@]*(?=\()/,variable:{pattern:/(^|[^@])(?:\b|\?)[A-Z_][\w@]*/,lookbehind:!0},operator:[/[=\/<>:]=|=[:\/]=|\+\+?|--?|[=*\/!]|\b(?:and|andalso|band|bnot|bor|bsl|bsr|bxor|div|not|or|orelse|rem|xor)\b/,{pattern:/(^|[^<])<(?!<)/,lookbehind:!0},{pattern:/(^|[^>])>(?!>)/,lookbehind:!0}],atom:/\b[a-z][\w@]*/,punctuation:/[()[\]{}:;,.#|]|<<|>>/}}return zv}var Uv,RO;function iz(){if(RO)return Uv;RO=1,Uv=e,e.displayName="lua",e.aliases=[];function e(t){t.languages.lua={comment:/^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,greedy:!0},number:/\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,keyword:/\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,function:/(?!\d)\w+(?=\s*(?:[({]))/,operator:[/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\.\.(?!\.)/,lookbehind:!0}],punctuation:/[\[\](){},;]|\.+|:+/}}return Uv}var Bv,NO;function aye(){if(NO)return Bv;NO=1;var e=iz(),t=mr();Bv=n,n.displayName="etlua",n.aliases=[];function n(r){r.register(e),r.register(t),function(a){a.languages.etlua={delimiter:{pattern:/^<%[-=]?|-?%>$/,alias:"punctuation"},"language-lua":{pattern:/[\s\S]+/,inside:a.languages.lua}},a.hooks.add("before-tokenize",function(o){var i=/<%[\s\S]+?%>/g;a.languages["markup-templating"].buildPlaceholders(o,"etlua",i)}),a.hooks.add("after-tokenize",function(o){a.languages["markup-templating"].tokenizePlaceholders(o,"etlua")})}(r)}return Bv}var Hv,IO;function oye(){if(IO)return Hv;IO=1,Hv=e,e.displayName="excelFormula",e.aliases=[];function e(t){t.languages["excel-formula"]={comment:{pattern:/(\bN\(\s*)"(?:[^"]|"")*"(?=\s*\))/i,lookbehind:!0,greedy:!0},string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},reference:{pattern:/(?:'[^']*'|(?:[^\s()[\]{}<>*?"';,$&]*\[[^^\s()[\]{}<>*?"']+\])?\w+)!/,greedy:!0,alias:"string",inside:{operator:/!$/,punctuation:/'/,sheet:{pattern:/[^[\]]+$/,alias:"function"},file:{pattern:/\[[^[\]]+\]$/,inside:{punctuation:/[[\]]/}},path:/[\s\S]+/}},"function-name":{pattern:/\b[A-Z]\w*(?=\()/i,alias:"keyword"},range:{pattern:/\$?\b(?:[A-Z]+\$?\d+:\$?[A-Z]+\$?\d+|[A-Z]+:\$?[A-Z]+|\d+:\$?\d+)\b/i,alias:"property",inside:{operator:/:/,cell:/\$?[A-Z]+\$?\d+/i,column:/\$?[A-Z]+/i,row:/\$?\d+/}},cell:{pattern:/\b[A-Z]+\d+\b|\$[A-Za-z]+\$?\d+\b|\b[A-Za-z]+\$\d+\b/,alias:"property"},number:/(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?\b/i,boolean:/\b(?:FALSE|TRUE)\b/i,operator:/[-+*/^%=&,]|<[=>]?|>=?/,punctuation:/[[\]();{}|]/},t.languages.xlsx=t.languages.xls=t.languages["excel-formula"]}return Hv}var Vv,OO;function iye(){if(OO)return Vv;OO=1,Vv=e,e.displayName="factor",e.aliases=[];function e(t){(function(n){var r={function:/\b(?:BUGS?|FIX(?:MES?)?|NOTES?|TODOS?|XX+|HACKS?|WARN(?:ING)?|\?{2,}|!{2,})\b/},a={number:/\\[^\s']|%\w/},o={comment:[{pattern:/(^|\s)(?:! .*|!$)/,lookbehind:!0,inside:r},{pattern:/(^|\s)\/\*\s[\s\S]*?\*\/(?=\s|$)/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|\s)!\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,lookbehind:!0,greedy:!0,inside:r}],number:[{pattern:/(^|\s)[+-]?\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?0(?:b[01]+|o[0-7]+|d\d+|x[\dA-F]+)(?=\s|$)/i,lookbehind:!0},{pattern:/(^|\s)[+-]?\d+\/\d+\.?(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)\+?\d+\+\d+\/\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)-\d+-\d+\/\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?(?:\d*\.\d+|\d+\.\d*|\d+)(?:e[+-]?\d+)?(?=\s|$)/i,lookbehind:!0},{pattern:/(^|\s)NAN:\s+[\da-fA-F]+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?0(?:b1\.[01]*|o1\.[0-7]*|d1\.\d*|x1\.[\dA-F]*)p\d+(?=\s|$)/i,lookbehind:!0}],regexp:{pattern:/(^|\s)R\/\s(?:\\\S|[^\\/])*\/(?:[idmsr]*|[idmsr]+-[idmsr]+)(?=\s|$)/,lookbehind:!0,alias:"number",inside:{variable:/\\\S/,keyword:/[+?*\[\]^$(){}.|]/,operator:{pattern:/(\/)[idmsr]+(?:-[idmsr]+)?/,lookbehind:!0}}},boolean:{pattern:/(^|\s)[tf](?=\s|$)/,lookbehind:!0},"custom-string":{pattern:/(^|\s)[A-Z0-9\-]+"\s(?:\\\S|[^"\\])*"/,lookbehind:!0,greedy:!0,alias:"string",inside:{number:/\\\S|%\w|\//}},"multiline-string":[{pattern:/(^|\s)STRING:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*;(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:{number:a.number,"semicolon-or-setlocal":{pattern:/([\r\n][ \t]*);(?=\s|$)/,lookbehind:!0,alias:"function"}}},{pattern:/(^|\s)HEREDOC:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*\S+(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:a},{pattern:/(^|\s)\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:a}],"special-using":{pattern:/(^|\s)USING:(?:\s\S+)*(?=\s+;(?:\s|$))/,lookbehind:!0,alias:"function",inside:{string:{pattern:/(\s)[^:\s]+/,lookbehind:!0}}},"stack-effect-delimiter":[{pattern:/(^|\s)(?:call|eval|execute)?\((?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)--(?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)\)(?=\s|$)/,lookbehind:!0,alias:"operator"}],combinators:{pattern:null,lookbehind:!0,alias:"keyword"},"kernel-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"sequences-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"math-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"constructor-word":{pattern:/(^|\s)<(?!=+>|-+>)\S+>(?=\s|$)/,lookbehind:!0,alias:"keyword"},"other-builtin-syntax":{pattern:null,lookbehind:!0,alias:"operator"},"conventionally-named-word":{pattern:/(^|\s)(?!")(?:(?:change|new|set|with)-\S+|\$\S+|>[^>\s]+|[^:>\s]+>|[^>\s]+>[^>\s]+|\+[^+\s]+\+|[^?\s]+\?|\?[^?\s]+|[^>\s]+>>|>>[^>\s]+|[^<\s]+<<|\([^()\s]+\)|[^!\s]+!|[^*\s]\S*\*|[^.\s]\S*\.)(?=\s|$)/,lookbehind:!0,alias:"keyword"},"colon-syntax":{pattern:/(^|\s)(?:[A-Z0-9\-]+#?)?:{1,2}\s+(?:;\S+|(?!;)\S+)(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"function"},"semicolon-or-setlocal":{pattern:/(\s)(?:;|:>)(?=\s|$)/,lookbehind:!0,alias:"function"},"curly-brace-literal-delimiter":[{pattern:/(^|\s)[a-z]*\{(?=\s)/i,lookbehind:!0,alias:"operator"},{pattern:/(\s)\}(?=\s|$)/,lookbehind:!0,alias:"operator"}],"quotation-delimiter":[{pattern:/(^|\s)\[(?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)\](?=\s|$)/,lookbehind:!0,alias:"operator"}],"normal-word":{pattern:/(^|\s)[^"\s]\S*(?=\s|$)/,lookbehind:!0},string:{pattern:/"(?:\\\S|[^"\\])*"/,greedy:!0,inside:a}},i=function(u){return(u+"").replace(/([.?*+\^$\[\]\\(){}|\-])/g,"\\$1")},s=function(u){return new RegExp("(^|\\s)(?:"+u.map(i).join("|")+")(?=\\s|$)")},l={"kernel-builtin":["or","2nipd","4drop","tuck","wrapper","nip","wrapper?","callstack>array","die","dupd","callstack","callstack?","3dup","hashcode","pick","4nip","build",">boolean","nipd","clone","5nip","eq?","?","=","swapd","2over","clear","2dup","get-retainstack","not","tuple?","dup","3nipd","call","-rotd","object","drop","assert=","assert?","-rot","execute","boa","get-callstack","curried?","3drop","pickd","overd","over","roll","3nip","swap","and","2nip","rotd","throw","(clone)","hashcode*","spin","reach","4dup","equal?","get-datastack","assert","2drop","","boolean?","identity-hashcode","identity-tuple?","null","composed?","new","5drop","rot","-roll","xor","identity-tuple","boolean"],"other-builtin-syntax":["=======","recursive","flushable",">>","<<<<<<","M\\","B","PRIVATE>","\\","======","final","inline","delimiter","deprecated",">>>>>","<<<<<<<","parse-complex","malformed-complex","read-only",">>>>>>>","call-next-method","<<","foldable","$","$[","${"],"sequences-builtin":["member-eq?","mismatch","append","assert-sequence=","longer","repetition","clone-like","3sequence","assert-sequence?","last-index-from","reversed","index-from","cut*","pad-tail","join-as","remove-eq!","concat-as","but-last","snip","nths","nth","sequence","longest","slice?","","remove-nth","tail-slice","empty?","tail*","member?","virtual-sequence?","set-length","drop-prefix","iota","unclip","bounds-error?","unclip-last-slice","non-negative-integer-expected","non-negative-integer-expected?","midpoint@","longer?","?set-nth","?first","rest-slice","prepend-as","prepend","fourth","sift","subseq-start","new-sequence","?last","like","first4","1sequence","reverse","slice","virtual@","repetition?","set-last","index","4sequence","max-length","set-second","immutable-sequence","first2","first3","supremum","unclip-slice","suffix!","insert-nth","tail","3append","short","suffix","concat","flip","immutable?","reverse!","2sequence","sum","delete-all","indices","snip-slice","","check-slice","sequence?","head","append-as","halves","sequence=","collapse-slice","?second","slice-error?","product","bounds-check?","bounds-check","immutable","virtual-exemplar","harvest","remove","pad-head","last","set-fourth","cartesian-product","remove-eq","shorten","shorter","reversed?","shorter?","shortest","head-slice","pop*","tail-slice*","but-last-slice","iota?","append!","cut-slice","new-resizable","head-slice*","sequence-hashcode","pop","set-nth","?nth","second","join","immutable-sequence?","","3append-as","virtual-sequence","subseq?","remove-nth!","length","last-index","lengthen","assert-sequence","copy","move","third","first","tail?","set-first","prefix","bounds-error","","exchange","surround","cut","min-length","set-third","push-all","head?","subseq-start-from","delete-slice","rest","sum-lengths","head*","infimum","remove!","glue","slice-error","subseq","push","replace-slice","subseq-as","unclip-last"],"math-builtin":["number=","next-power-of-2","?1+","fp-special?","imaginary-part","float>bits","number?","fp-infinity?","bignum?","fp-snan?","denominator","gcd","*","+","fp-bitwise=","-","u>=","/",">=","bitand","power-of-2?","log2-expects-positive","neg?","<","log2",">","integer?","number","bits>double","2/","zero?","bits>float","float?","shift","ratio?","rect>","even?","ratio","fp-sign","bitnot",">fixnum","complex?","/i","integer>fixnum","/f","sgn",">bignum","next-float","u<","u>","mod","recip","rational",">float","2^","integer","fixnum?","neg","fixnum","sq","bignum",">rect","bit?","fp-qnan?","simple-gcd","complex","","real",">fraction","double>bits","bitor","rem","fp-nan-payload","real-part","log2-expects-positive?","prev-float","align","unordered?","float","fp-nan?","abs","bitxor","integer>fixnum-strict","u<=","odd?","<=","/mod",">integer","real?","rational?","numerator"]};Object.keys(l).forEach(function(u){o[u].pattern=s(l[u])});var c=["2bi","while","2tri","bi*","4dip","both?","same?","tri@","curry","prepose","3bi","?if","tri*","2keep","3keep","curried","2keepd","when","2bi*","2tri*","4keep","bi@","keepdd","do","unless*","tri-curry","if*","loop","bi-curry*","when*","2bi@","2tri@","with","2with","either?","bi","until","3dip","3curry","tri-curry*","tri-curry@","bi-curry","keepd","compose","2dip","if","3tri","unless","tuple","keep","2curry","tri","most","while*","dip","composed","bi-curry@","find-last-from","trim-head-slice","map-as","each-from","none?","trim-tail","partition","if-empty","accumulate*","reject!","find-from","accumulate-as","collector-for-as","reject","map","map-sum","accumulate!","2each-from","follow","supremum-by","map!","unless-empty","collector","padding","reduce-index","replicate-as","infimum-by","trim-tail-slice","count","find-index","filter","accumulate*!","reject-as","map-integers","map-find","reduce","selector","interleave","2map","filter-as","binary-reduce","map-index-as","find","produce","filter!","replicate","cartesian-map","cartesian-each","find-index-from","map-find-last","3map-as","3map","find-last","selector-as","2map-as","2map-reduce","accumulate","each","each-index","accumulate*-as","when-empty","all?","collector-as","push-either","new-like","collector-for","2selector","push-if","2all?","map-reduce","3each","any?","trim-slice","2reduce","change-nth","produce-as","2each","trim","trim-head","cartesian-find","map-index","if-zero","each-integer","unless-zero","(find-integer)","when-zero","find-last-integer","(all-integers?)","times","(each-integer)","find-integer","all-integers?","unless-negative","if-positive","when-positive","when-negative","unless-positive","if-negative","case","2cleave","cond>quot","case>quot","3cleave","wrong-values","to-fixed-point","alist>quot","cond","cleave","call-effect","recursive-hashcode","spread","deep-spread>quot","2||","0||","n||","0&&","2&&","3||","1||","1&&","n&&","3&&","smart-unless*","keep-inputs","reduce-outputs","smart-when*","cleave>array","smart-with","smart-apply","smart-if","inputs/outputs","output>sequence-n","map-outputs","map-reduce-outputs","dropping","output>array","smart-map-reduce","smart-2map-reduce","output>array-n","nullary","inputsequence"];o.combinators.pattern=s(c),n.languages.factor=o})(t)}return Vv}var qv,DO;function sye(){if(DO)return qv;DO=1,qv=e,e.displayName="$false",e.aliases=[];function e(t){(function(n){n.languages.false={comment:{pattern:/\{[^}]*\}/},string:{pattern:/"[^"]*"/,greedy:!0},"character-code":{pattern:/'(?:[^\r]|\r\n?)/,alias:"number"},"assembler-code":{pattern:/\d+`/,alias:"important"},number:/\d+/,operator:/[-!#$%&'*+,./:;=>?@\\^_`|~ßø]/,punctuation:/\[|\]/,variable:/[a-z]/,"non-standard":{pattern:/[()!=]=?|[-+*/%]|\b(?:in|is)\b/}),delete t.languages["firestore-security-rules"]["class-name"],t.languages.insertBefore("firestore-security-rules","keyword",{path:{pattern:/(^|[\s(),])(?:\/(?:[\w\xA0-\uFFFF]+|\{[\w\xA0-\uFFFF]+(?:=\*\*)?\}|\$\([\w\xA0-\uFFFF.]+\)))+/,lookbehind:!0,greedy:!0,inside:{variable:{pattern:/\{[\w\xA0-\uFFFF]+(?:=\*\*)?\}|\$\([\w\xA0-\uFFFF.]+\)/,inside:{operator:/=/,keyword:/\*\*/,punctuation:/[.$(){}]/}},punctuation:/\//}},method:{pattern:/(\ballow\s+)[a-z]+(?:\s*,\s*[a-z]+)*(?=\s*[:;])/,lookbehind:!0,alias:"builtin",inside:{punctuation:/,/}}})}return Gv}var Wv,MO;function cye(){if(MO)return Wv;MO=1,Wv=e,e.displayName="flow",e.aliases=[];function e(t){(function(n){n.languages.flow=n.languages.extend("javascript",{}),n.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|any|mixed|null|void)\b/,alias:"tag"}]}),n.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete n.languages.flow.parameter,n.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(n.languages.flow.keyword)||(n.languages.flow.keyword=[n.languages.flow.keyword]),n.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0})})(t)}return Wv}var Kv,PO;function uye(){if(PO)return Kv;PO=1,Kv=e,e.displayName="fortran",e.aliases=[];function e(t){t.languages.fortran={"quoted-number":{pattern:/[BOZ](['"])[A-F0-9]+\1/i,alias:"number"},string:{pattern:/(?:\b\w+_)?(['"])(?:\1\1|&(?:\r\n?|\n)(?:[ \t]*!.*(?:\r\n?|\n)|(?![ \t]*!))|(?!\1).)*(?:\1|&)/,inside:{comment:{pattern:/(&(?:\r\n?|\n)\s*)!.*/,lookbehind:!0}}},comment:{pattern:/!.*/,greedy:!0},boolean:/\.(?:FALSE|TRUE)\.(?:_\w+)?/i,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[ED][+-]?\d+)?(?:_\w+)?/i,keyword:[/\b(?:CHARACTER|COMPLEX|DOUBLE ?PRECISION|INTEGER|LOGICAL|REAL)\b/i,/\b(?:END ?)?(?:BLOCK ?DATA|DO|FILE|FORALL|FUNCTION|IF|INTERFACE|MODULE(?! PROCEDURE)|PROGRAM|SELECT|SUBROUTINE|TYPE|WHERE)\b/i,/\b(?:ALLOCATABLE|ALLOCATE|BACKSPACE|CALL|CASE|CLOSE|COMMON|CONTAINS|CONTINUE|CYCLE|DATA|DEALLOCATE|DIMENSION|DO|END|EQUIVALENCE|EXIT|EXTERNAL|FORMAT|GO ?TO|IMPLICIT(?: NONE)?|INQUIRE|INTENT|INTRINSIC|MODULE PROCEDURE|NAMELIST|NULLIFY|OPEN|OPTIONAL|PARAMETER|POINTER|PRINT|PRIVATE|PUBLIC|READ|RETURN|REWIND|SAVE|SELECT|STOP|TARGET|WHILE|WRITE)\b/i,/\b(?:ASSIGNMENT|DEFAULT|ELEMENTAL|ELSE|ELSEIF|ELSEWHERE|ENTRY|IN|INCLUDE|INOUT|KIND|NULL|ONLY|OPERATOR|OUT|PURE|RECURSIVE|RESULT|SEQUENCE|STAT|THEN|USE)\b/i],operator:[/\*\*|\/\/|=>|[=\/]=|[<>]=?|::|[+\-*=%]|\.[A-Z]+\./i,{pattern:/(^|(?!\().)\/(?!\))/,lookbehind:!0}],punctuation:/\(\/|\/\)|[(),;:&]/}}return Kv}var Yv,$O;function dye(){if($O)return Yv;$O=1,Yv=e,e.displayName="fsharp",e.aliases=[];function e(t){t.languages.fsharp=t.languages.extend("clike",{comment:[{pattern:/(^|[^\\])\(\*(?!\))[\s\S]*?\*\)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(?:"""[\s\S]*?"""|@"(?:""|[^"])*"|"(?:\\[\s\S]|[^\\"])*")B?/,greedy:!0},"class-name":{pattern:/(\b(?:exception|inherit|interface|new|of|type)\s+|\w\s*:\s*|\s:\??>\s*)[.\w]+\b(?:\s*(?:->|\*)\s*[.\w]+\b)*(?!\s*[:.])/,lookbehind:!0,inside:{operator:/->|\*/,punctuation:/\./}},keyword:/\b(?:let|return|use|yield)(?:!\B|\b)|\b(?:abstract|and|as|asr|assert|atomic|base|begin|break|checked|class|component|const|constraint|constructor|continue|default|delegate|do|done|downcast|downto|eager|elif|else|end|event|exception|extern|external|false|finally|fixed|for|fun|function|functor|global|if|in|include|inherit|inline|interface|internal|land|lazy|lor|lsl|lsr|lxor|match|member|method|mixin|mod|module|mutable|namespace|new|not|null|object|of|open|or|override|parallel|private|process|protected|public|pure|rec|sealed|select|sig|static|struct|tailcall|then|to|trait|true|try|type|upcast|val|virtual|void|volatile|when|while|with)\b/,number:[/\b0x[\da-fA-F]+(?:LF|lf|un)?\b/,/\b0b[01]+(?:uy|y)?\b/,/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[fm]|e[+-]?\d+)?\b/i,/\b\d+(?:[IlLsy]|UL|u[lsy]?)?\b/],operator:/([<>~&^])\1\1|([*.:<>&])\2|<-|->|[!=:]=|?|\??(?:<=|>=|<>|[-+*/%=<>])\??|[!?^&]|~[+~-]|:>|:\?>?/}),t.languages.insertBefore("fsharp","keyword",{preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(^#)\b(?:else|endif|if|light|line|nowarn)\b/,lookbehind:!0,alias:"keyword"}}}}),t.languages.insertBefore("fsharp","punctuation",{"computation-expression":{pattern:/\b[_a-z]\w*(?=\s*\{)/i,alias:"keyword"}}),t.languages.insertBefore("fsharp","string",{annotation:{pattern:/\[<.+?>\]/,greedy:!0,inside:{punctuation:/^\[<|>\]$/,"class-name":{pattern:/^\w+$|(^|;\s*)[A-Z]\w*(?=\()/,lookbehind:!0},"annotation-content":{pattern:/[\s\S]+/,inside:t.languages.fsharp}}},char:{pattern:/'(?:[^\\']|\\(?:.|\d{3}|x[a-fA-F\d]{2}|u[a-fA-F\d]{4}|U[a-fA-F\d]{8}))'B?/,greedy:!0}})}return Yv}var Zv,FO;function fye(){if(FO)return Zv;FO=1;var e=mr();Zv=t,t.displayName="ftl",t.aliases=[];function t(n){n.register(e),function(r){for(var a=/[^<()"']|\((?:)*\)|<(?!#--)|<#--(?:[^-]|-(?!->))*-->|"(?:[^\\"]|\\.)*"|'(?:[^\\']|\\.)*'/.source,o=0;o<2;o++)a=a.replace(//g,function(){return a});a=a.replace(//g,/[^\s\S]/.source);var i={comment:/<#--[\s\S]*?-->/,string:[{pattern:/\br("|')(?:(?!\1)[^\\]|\\.)*\1/,greedy:!0},{pattern:RegExp(/("|')(?:(?!\1|\$\{)[^\\]|\\.|\$\{(?:(?!\})(?:))*\})*\1/.source.replace(//g,function(){return a})),greedy:!0,inside:{interpolation:{pattern:RegExp(/((?:^|[^\\])(?:\\\\)*)\$\{(?:(?!\})(?:))*\}/.source.replace(//g,function(){return a})),lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:null}}}}],keyword:/\b(?:as)\b/,boolean:/\b(?:false|true)\b/,"builtin-function":{pattern:/((?:^|[^?])\?\s*)\w+/,lookbehind:!0,alias:"function"},function:/\b\w+(?=\s*\()/,number:/\b\d+(?:\.\d+)?\b/,operator:/\.\.[<*!]?|->|--|\+\+|&&|\|\||\?{1,2}|[-+*/%!=<>]=?|\b(?:gt|gte|lt|lte)\b/,punctuation:/[,;.:()[\]{}]/};i.string[1].inside.interpolation.inside.rest=i,r.languages.ftl={"ftl-comment":{pattern:/^<#--[\s\S]*/,alias:"comment"},"ftl-directive":{pattern:/^<[\s\S]+>$/,inside:{directive:{pattern:/(^<\/?)[#@][a-z]\w*/i,lookbehind:!0,alias:"keyword"},punctuation:/^<\/?|\/?>$/,content:{pattern:/\s*\S[\s\S]*/,alias:"ftl",inside:i}}},"ftl-interpolation":{pattern:/^\$\{[\s\S]*\}$/,inside:{punctuation:/^\$\{|\}$/,content:{pattern:/\s*\S[\s\S]*/,alias:"ftl",inside:i}}}},r.hooks.add("before-tokenize",function(s){var l=RegExp(/<#--[\s\S]*?-->|<\/?[#@][a-zA-Z](?:)*?>|\$\{(?:)*?\}/.source.replace(//g,function(){return a}),"gi");r.languages["markup-templating"].buildPlaceholders(s,"ftl",l)}),r.hooks.add("after-tokenize",function(s){r.languages["markup-templating"].tokenizePlaceholders(s,"ftl")})}(n)}return Zv}var Xv,jO;function pye(){if(jO)return Xv;jO=1,Xv=e,e.displayName="gap",e.aliases=[];function e(t){t.languages.gap={shell:{pattern:/^gap>[\s\S]*?(?=^gap>|$(?![\s\S]))/m,greedy:!0,inside:{gap:{pattern:/^(gap>).+(?:(?:\r(?:\n|(?!\n))|\n)>.*)*/,lookbehind:!0,inside:null},punctuation:/^gap>/}},comment:{pattern:/#.*/,greedy:!0},string:{pattern:/(^|[^\\'"])(?:'(?:[^\r\n\\']|\\.){1,10}'|"(?:[^\r\n\\"]|\\.)*"(?!")|"""[\s\S]*?""")/,lookbehind:!0,greedy:!0,inside:{continuation:{pattern:/([\r\n])>/,lookbehind:!0,alias:"punctuation"}}},keyword:/\b(?:Assert|Info|IsBound|QUIT|TryNextMethod|Unbind|and|atomic|break|continue|do|elif|else|end|fi|for|function|if|in|local|mod|not|od|or|quit|readonly|readwrite|rec|repeat|return|then|until|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:{pattern:/(^|[^\w.]|\.\.)(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?(?:_[a-z]?)?(?=$|[^\w.]|\.\.)/,lookbehind:!0},continuation:{pattern:/([\r\n])>/,lookbehind:!0,alias:"punctuation"},operator:/->|[-+*/^~=!]|<>|[<>]=?|:=|\.\./,punctuation:/[()[\]{},;.:]/},t.languages.gap.shell.inside.gap.inside=t.languages.gap}return Xv}var Qv,zO;function gye(){if(zO)return Qv;zO=1,Qv=e,e.displayName="gcode",e.aliases=[];function e(t){t.languages.gcode={comment:/;.*|\B\(.*?\)\B/,string:{pattern:/"(?:""|[^"])*"/,greedy:!0},keyword:/\b[GM]\d+(?:\.\d+)?\b/,property:/\b[A-Z]/,checksum:{pattern:/(\*)\d+/,lookbehind:!0,alias:"number"},punctuation:/[:*]/}}return Qv}var Jv,UO;function mye(){if(UO)return Jv;UO=1,Jv=e,e.displayName="gdscript",e.aliases=[];function e(t){t.languages.gdscript={comment:/#.*/,string:{pattern:/@?(?:("|')(?:(?!\1)[^\n\\]|\\[\s\S])*\1(?!"|')|"""(?:[^\\]|\\[\s\S])*?""")/,greedy:!0},"class-name":{pattern:/(^(?:class|class_name|extends)[ \t]+|^export\([ \t]*|\bas[ \t]+|(?:\b(?:const|var)[ \t]|[,(])[ \t]*\w+[ \t]*:[ \t]*|->[ \t]*)[a-zA-Z_]\w*/m,lookbehind:!0},keyword:/\b(?:and|as|assert|break|breakpoint|class|class_name|const|continue|elif|else|enum|export|extends|for|func|if|in|is|master|mastersync|match|not|null|onready|or|pass|preload|puppet|puppetsync|remote|remotesync|return|self|setget|signal|static|tool|var|while|yield)\b/,function:/\b[a-z_]\w*(?=[ \t]*\()/i,variable:/\$\w+/,number:[/\b0b[01_]+\b|\b0x[\da-fA-F_]+\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.[\d_]+)(?:e[+-]?[\d_]+)?\b/,/\b(?:INF|NAN|PI|TAU)\b/],constant:/\b[A-Z][A-Z_\d]*\b/,boolean:/\b(?:false|true)\b/,operator:/->|:=|&&|\|\||<<|>>|[-+*/%&|!<>=]=?|[~^]/,punctuation:/[.:,;()[\]{}]/}}return Jv}var eS,BO;function hye(){if(BO)return eS;BO=1,eS=e,e.displayName="gedcom",e.aliases=[];function e(t){t.languages.gedcom={"line-value":{pattern:/(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?\w+ ).+/m,lookbehind:!0,inside:{pointer:{pattern:/^@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@$/,alias:"variable"}}},tag:{pattern:/(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?)\w+/m,lookbehind:!0,alias:"string"},level:{pattern:/(^[\t ]*)\d+/m,lookbehind:!0,alias:"number"},pointer:{pattern:/@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@/,alias:"variable"}}}return eS}var tS,HO;function bye(){if(HO)return tS;HO=1,tS=e,e.displayName="gherkin",e.aliases=[];function e(t){(function(n){var r=/(?:\r?\n|\r)[ \t]*\|.+\|(?:(?!\|).)*/.source;n.languages.gherkin={pystring:{pattern:/("""|''')[\s\S]+?\1/,alias:"string"},comment:{pattern:/(^[ \t]*)#.*/m,lookbehind:!0},tag:{pattern:/(^[ \t]*)@\S*/m,lookbehind:!0},feature:{pattern:/((?:^|\r?\n|\r)[ \t]*)(?:Ability|Ahoy matey!|Arwedd|Aspekt|Besigheid Behoefte|Business Need|Caracteristica|Característica|Egenskab|Egenskap|Eiginleiki|Feature|Fīča|Fitur|Fonctionnalité|Fonksyonalite|Funcionalidade|Funcionalitat|Functionalitate|Funcţionalitate|Funcționalitate|Functionaliteit|Fungsi|Funkcia|Funkcija|Funkcionalitāte|Funkcionalnost|Funkcja|Funksie|Funktionalität|Funktionalitéit|Funzionalità|Hwaet|Hwæt|Jellemző|Karakteristik|Lastnost|Mak|Mogucnost|laH|Mogućnost|Moznosti|Možnosti|OH HAI|Omadus|Ominaisuus|Osobina|Özellik|Potrzeba biznesowa|perbogh|poQbogh malja'|Požadavek|Požiadavka|Pretty much|Qap|Qu'meH 'ut|Savybė|Tính năng|Trajto|Vermoë|Vlastnosť|Właściwość|Značilnost|Δυνατότητα|Λειτουργία|Могућност|Мөмкинлек|Особина|Свойство|Үзенчәлеклелек|Функционал|Функционалност|Функция|Функціонал|תכונה|خاصية|خصوصیت|صلاحیت|کاروبار کی ضرورت|وِیژگی|रूप लेख|ਖਾਸੀਅਤ|ਨਕਸ਼ ਨੁਹਾਰ|ਮੁਹਾਂਦਰਾ|గుణము|ಹೆಚ್ಚಳ|ความต้องการทางธุรกิจ|ความสามารถ|โครงหลัก|기능|フィーチャ|功能|機能):(?:[^:\r\n]+(?:\r?\n|\r|$))*/,lookbehind:!0,inside:{important:{pattern:/(:)[^\r\n]+/,lookbehind:!0},keyword:/[^:\r\n]+:/}},scenario:{pattern:/(^[ \t]*)(?:Abstract Scenario|Abstrakt Scenario|Achtergrond|Aer|Ær|Agtergrond|All y'all|Antecedentes|Antecedents|Atburðarás|Atburðarásir|Awww, look mate|B4|Background|Baggrund|Bakgrund|Bakgrunn|Bakgrunnur|Beispiele|Beispiller|Bối cảnh|Cefndir|Cenario|Cenário|Cenario de Fundo|Cenário de Fundo|Cenarios|Cenários|Contesto|Context|Contexte|Contexto|Conto|Contoh|Contone|Dæmi|Dasar|Dead men tell no tales|Delineacao do Cenario|Delineação do Cenário|Dis is what went down|Dữ liệu|Dyagram Senaryo|Dyagram senaryo|Egzanp|Ejemplos|Eksempler|Ekzemploj|Enghreifftiau|Esbozo do escenario|Escenari|Escenario|Esempi|Esquema de l'escenari|Esquema del escenario|Esquema do Cenario|Esquema do Cenário|EXAMPLZ|Examples|Exempel|Exemple|Exemples|Exemplos|First off|Fono|Forgatókönyv|Forgatókönyv vázlat|Fundo|Geçmiş|Grundlage|Hannergrond|ghantoH|Háttér|Heave to|Istorik|Juhtumid|Keadaan|Khung kịch bản|Khung tình huống|Kịch bản|Koncept|Konsep skenario|Kontèks|Kontekst|Kontekstas|Konteksts|Kontext|Konturo de la scenaro|Latar Belakang|lut chovnatlh|lut|lutmey|Lýsing Atburðarásar|Lýsing Dæma|MISHUN SRSLY|MISHUN|Menggariskan Senario|mo'|Náčrt Scenára|Náčrt Scénáře|Náčrt Scenáru|Oris scenarija|Örnekler|Osnova|Osnova Scenára|Osnova scénáře|Osnutek|Ozadje|Paraugs|Pavyzdžiai|Példák|Piemēri|Plan du scénario|Plan du Scénario|Plan Senaryo|Plan senaryo|Plang vum Szenario|Pozadí|Pozadie|Pozadina|Príklady|Příklady|Primer|Primeri|Primjeri|Przykłady|Raamstsenaarium|Reckon it's like|Rerefons|Scenár|Scénář|Scenarie|Scenarij|Scenarijai|Scenarijaus šablonas|Scenariji|Scenārijs|Scenārijs pēc parauga|Scenarijus|Scenario|Scénario|Scenario Amlinellol|Scenario Outline|Scenario Template|Scenariomal|Scenariomall|Scenarios|Scenariu|Scenariusz|Scenaro|Schema dello scenario|Se ðe|Se the|Se þe|Senario|Senaryo Deskripsyon|Senaryo deskripsyon|Senaryo|Senaryo taslağı|Shiver me timbers|Situācija|Situai|Situasie Uiteensetting|Situasie|Skenario konsep|Skenario|Skica|Structura scenariu|Structură scenariu|Struktura scenarija|Stsenaarium|Swa hwaer swa|Swa|Swa hwær swa|Szablon scenariusza|Szenario|Szenariogrundriss|Tapaukset|Tapaus|Tapausaihio|Taust|Tausta|Template Keadaan|Template Senario|Template Situai|The thing of it is|Tình huống|Variantai|Voorbeelde|Voorbeelden|Wharrimean is|Yo-ho-ho|You'll wanna|Założenia|Παραδείγματα|Περιγραφή Σεναρίου|Σενάρια|Σενάριο|Υπόβαθρο|Кереш|Контекст|Концепт|Мисаллар|Мисоллар|Основа|Передумова|Позадина|Предистория|Предыстория|Приклади|Пример|Примери|Примеры|Рамка на сценарий|Скица|Структура сценарија|Структура сценария|Структура сценарію|Сценарий|Сценарий структураси|Сценарийның төзелеше|Сценарији|Сценарио|Сценарій|Тарих|Үрнәкләр|דוגמאות|רקע|תבנית תרחיש|תרחיש|الخلفية|الگوی سناریو|امثلة|پس منظر|زمینه|سناریو|سيناريو|سيناريو مخطط|مثالیں|منظر نامے کا خاکہ|منظرنامہ|نمونه ها|उदाहरण|परिदृश्य|परिदृश्य रूपरेखा|पृष्ठभूमि|ਉਦਾਹਰਨਾਂ|ਪਟਕਥਾ|ਪਟਕਥਾ ਢਾਂਚਾ|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਿਛੋਕੜ|ఉదాహరణలు|కథనం|నేపథ్యం|సన్నివేశం|ಉದಾಹರಣೆಗಳು|ಕಥಾಸಾರಾಂಶ|ವಿವರಣೆ|ಹಿನ್ನೆಲೆ|โครงสร้างของเหตุการณ์|ชุดของตัวอย่าง|ชุดของเหตุการณ์|แนวคิด|สรุปเหตุการณ์|เหตุการณ์|배경|시나리오|시나리오 개요|예|サンプル|シナリオ|シナリオアウトライン|シナリオテンプレ|シナリオテンプレート|テンプレ|例|例子|剧本|剧本大纲|劇本|劇本大綱|场景|场景大纲|場景|場景大綱|背景):[^:\r\n]*/m,lookbehind:!0,inside:{important:{pattern:/(:)[^\r\n]*/,lookbehind:!0},keyword:/[^:\r\n]+:/}},"table-body":{pattern:RegExp("("+r+")(?:"+r+")+"),lookbehind:!0,inside:{outline:{pattern:/<[^>]+>/,alias:"variable"},td:{pattern:/\s*[^\s|][^|]*/,alias:"string"},punctuation:/\|/}},"table-head":{pattern:RegExp(r),inside:{th:{pattern:/\s*[^\s|][^|]*/,alias:"variable"},punctuation:/\|/}},atrule:{pattern:/(^[ \t]+)(?:'a|'ach|'ej|7|a|A také|A taktiež|A tiež|A zároveň|Aber|Ac|Adott|Akkor|Ak|Aleshores|Ale|Ali|Allora|Alors|Als|Ama|Amennyiben|Amikor|Ampak|an|AN|Ananging|And y'all|And|Angenommen|Anrhegedig a|An|Apabila|Atès|Atesa|Atunci|Avast!|Aye|A|awer|Bagi|Banjur|Bet|Biết|Blimey!|Buh|But at the end of the day I reckon|But y'all|But|BUT|Cal|Când|Cand|Cando|Ce|Cuando|Če|Ða ðe|Ða|Dadas|Dada|Dados|Dado|DaH ghu' bejlu'|dann|Dann|Dano|Dan|Dar|Dat fiind|Data|Date fiind|Date|Dati fiind|Dati|Daţi fiind|Dați fiind|DEN|Dato|De|Den youse gotta|Dengan|Diberi|Diyelim ki|Donada|Donat|Donitaĵo|Do|Dun|Duota|Ðurh|Eeldades|Ef|Eğer ki|Entao|Então|Entón|E|En|Entonces|Epi|És|Etant donnée|Etant donné|Et|Étant données|Étant donnée|Étant donné|Etant données|Etant donnés|Étant donnés|Fakat|Gangway!|Gdy|Gegeben seien|Gegeben sei|Gegeven|Gegewe|ghu' noblu'|Gitt|Given y'all|Given|Givet|Givun|Ha|Cho|I CAN HAZ|In|Ir|It's just unbelievable|I|Ja|Jeśli|Jeżeli|Kad|Kada|Kadar|Kai|Kaj|Když|Keď|Kemudian|Ketika|Khi|Kiedy|Ko|Kuid|Kui|Kun|Lan|latlh|Le sa a|Let go and haul|Le|Lè sa a|Lè|Logo|Lorsqu'<|Lorsque|mä|Maar|Mais|Mając|Ma|Majd|Maka|Manawa|Mas|Men|Menawa|Mutta|Nalika|Nalikaning|Nanging|Når|När|Nato|Nhưng|Niin|Njuk|O zaman|Och|Og|Oletetaan|Ond|Onda|Oraz|Pak|Pero|Però|Podano|Pokiaľ|Pokud|Potem|Potom|Privzeto|Pryd|Quan|Quand|Quando|qaSDI'|Så|Sed|Se|Siis|Sipoze ke|Sipoze Ke|Sipoze|Si|Şi|Și|Soit|Stel|Tada|Tad|Takrat|Tak|Tapi|Ter|Tetapi|Tha the|Tha|Then y'all|Then|Thì|Thurh|Toda|Too right|Un|Und|ugeholl|Và|vaj|Vendar|Ve|wann|Wanneer|WEN|Wenn|When y'all|When|Wtedy|Wun|Y'know|Yeah nah|Yna|Youse know like when|Youse know when youse got|Y|Za predpokladu|Za předpokladu|Zadan|Zadani|Zadano|Zadate|Zadato|Zakładając|Zaradi|Zatati|Þa þe|Þa|Þá|Þegar|Þurh|Αλλά|Δεδομένου|Και|Όταν|Τότε|А також|Агар|Але|Али|Аммо|А|Әгәр|Әйтик|Әмма|Бирок|Ва|Вә|Дадено|Дано|Допустим|Если|Задате|Задати|Задато|И|І|К тому же|Када|Кад|Когато|Когда|Коли|Ләкин|Лекин|Нәтиҗәдә|Нехай|Но|Онда|Припустимо, що|Припустимо|Пусть|Также|Та|Тогда|Тоді|То|Унда|Һәм|Якщо|אבל|אזי|אז|בהינתן|וגם|כאשר|آنگاه|اذاً|اگر|اما|اور|با فرض|بالفرض|بفرض|پھر|تب|ثم|جب|عندما|فرض کیا|لكن|لیکن|متى|هنگامی|و|अगर|और|कदा|किन्तु|चूंकि|जब|तथा|तदा|तब|परन्तु|पर|यदि|ਅਤੇ|ਜਦੋਂ|ਜਿਵੇਂ ਕਿ|ਜੇਕਰ|ਤਦ|ਪਰ|అప్పుడు|ఈ పరిస్థితిలో|కాని|చెప్పబడినది|మరియు|ಆದರೆ|ನಂತರ|ನೀಡಿದ|ಮತ್ತು|ಸ್ಥಿತಿಯನ್ನು|กำหนดให้|ดังนั้น|แต่|เมื่อ|และ|그러면<|그리고<|단<|만약<|만일<|먼저<|조건<|하지만<|かつ<|しかし<|ただし<|ならば<|もし<|並且<|但し<|但是<|假如<|假定<|假設<|假设<|前提<|同时<|同時<|并且<|当<|當<|而且<|那么<|那麼<)(?=[ \t])/m,lookbehind:!0},string:{pattern:/"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,inside:{outline:{pattern:/<[^>]+>/,alias:"variable"}}},outline:{pattern:/<[^>]+>/,alias:"variable"}}})(t)}return tS}var nS,VO;function yye(){if(VO)return nS;VO=1,nS=e,e.displayName="git",e.aliases=[];function e(t){t.languages.git={comment:/^#.*/m,deleted:/^[-–].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m}}return nS}var rS,qO;function vye(){if(qO)return rS;qO=1;var e=Ws();rS=t,t.displayName="glsl",t.aliases=[];function t(n){n.register(e),n.languages.glsl=n.languages.extend("c",{keyword:/\b(?:active|asm|atomic_uint|attribute|[ibdu]?vec[234]|bool|break|buffer|case|cast|centroid|class|coherent|common|const|continue|d?mat[234](?:x[234])?|default|discard|do|double|else|enum|extern|external|false|filter|fixed|flat|float|for|fvec[234]|goto|half|highp|hvec[234]|[iu]?sampler2DMS(?:Array)?|[iu]?sampler2DRect|[iu]?samplerBuffer|[iu]?samplerCube|[iu]?samplerCubeArray|[iu]?sampler[123]D|[iu]?sampler[12]DArray|[iu]?image2DMS(?:Array)?|[iu]?image2DRect|[iu]?imageBuffer|[iu]?imageCube|[iu]?imageCubeArray|[iu]?image[123]D|[iu]?image[12]DArray|if|in|inline|inout|input|int|interface|invariant|layout|long|lowp|mediump|namespace|noinline|noperspective|out|output|partition|patch|precise|precision|public|readonly|resource|restrict|return|sample|sampler[12]DArrayShadow|sampler[12]DShadow|sampler2DRectShadow|sampler3DRect|samplerCubeArrayShadow|samplerCubeShadow|shared|short|sizeof|smooth|static|struct|subroutine|superp|switch|template|this|true|typedef|uint|uniform|union|unsigned|using|varying|void|volatile|while|writeonly)\b/})}return rS}var aS,GO;function Sye(){if(GO)return aS;GO=1,aS=e,e.displayName="gml",e.aliases=[];function e(t){t.languages.gamemakerlanguage=t.languages.gml=t.languages.extend("clike",{keyword:/\b(?:break|case|continue|default|do|else|enum|exit|for|globalvar|if|repeat|return|switch|until|var|while)\b/,number:/(?:\b0x[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ulf]{0,4}/i,operator:/--|\+\+|[-+%/=]=?|!=|\*\*?=?|<[<=>]?|>[=>]?|&&?|\^\^?|\|\|?|~|\b(?:and|at|not|or|with|xor)\b/,constant:/\b(?:GM_build_date|GM_version|action_(?:continue|restart|reverse|stop)|all|gamespeed_(?:fps|microseconds)|global|local|noone|other|pi|pointer_(?:invalid|null)|self|timezone_(?:local|utc)|undefined|ev_(?:create|destroy|step|alarm|keyboard|mouse|collision|other|draw|draw_(?:begin|end|post|pre)|keypress|keyrelease|trigger|(?:left|middle|no|right)_button|(?:left|middle|right)_press|(?:left|middle|right)_release|mouse_(?:enter|leave|wheel_down|wheel_up)|global_(?:left|middle|right)_button|global_(?:left|middle|right)_press|global_(?:left|middle|right)_release|joystick(?:1|2)_(?:button1|button2|button3|button4|button5|button6|button7|button8|down|left|right|up)|outside|boundary|game_start|game_end|room_start|room_end|no_more_lives|animation_end|end_of_path|no_more_health|user\d|gui|gui_begin|gui_end|step_(?:begin|end|normal))|vk_(?:alt|anykey|backspace|control|delete|down|end|enter|escape|home|insert|left|nokey|pagedown|pageup|pause|printscreen|return|right|shift|space|tab|up|f\d|numpad\d|add|decimal|divide|lalt|lcontrol|lshift|multiply|ralt|rcontrol|rshift|subtract)|achievement_(?:filter_(?:all_players|favorites_only|friends_only)|friends_info|info|leaderboard_info|our_info|pic_loaded|show_(?:achievement|bank|friend_picker|leaderboard|profile|purchase_prompt|ui)|type_challenge|type_score_challenge)|asset_(?:font|object|path|room|script|shader|sound|sprite|tiles|timeline|unknown)|audio_(?:3d|falloff_(?:exponent_distance|exponent_distance_clamped|inverse_distance|inverse_distance_clamped|linear_distance|linear_distance_clamped|none)|mono|new_system|old_system|stereo)|bm_(?:add|complex|dest_alpha|dest_color|dest_colour|inv_dest_alpha|inv_dest_color|inv_dest_colour|inv_src_alpha|inv_src_color|inv_src_colour|max|normal|one|src_alpha|src_alpha_sat|src_color|src_colour|subtract|zero)|browser_(?:chrome|firefox|ie|ie_mobile|not_a_browser|opera|safari|safari_mobile|tizen|unknown|windows_store)|buffer_(?:bool|f16|f32|f64|fast|fixed|generalerror|grow|invalidtype|network|outofbounds|outofspace|s16|s32|s8|seek_end|seek_relative|seek_start|string|text|u16|u32|u64|u8|vbuffer|wrap)|c_(?:aqua|black|blue|dkgray|fuchsia|gray|green|lime|ltgray|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow)|cmpfunc_(?:always|equal|greater|greaterequal|less|lessequal|never|notequal)|cr_(?:appstart|arrow|beam|cross|default|drag|handpoint|hourglass|none|size_all|size_nesw|size_ns|size_nwse|size_we|uparrow)|cull_(?:clockwise|counterclockwise|noculling)|device_(?:emulator|tablet)|device_ios_(?:ipad|ipad_retina|iphone|iphone5|iphone6|iphone6plus|iphone_retina|unknown)|display_(?:landscape|landscape_flipped|portrait|portrait_flipped)|dll_(?:cdecl|cdel|stdcall)|ds_type_(?:grid|list|map|priority|queue|stack)|ef_(?:cloud|ellipse|explosion|firework|flare|rain|ring|smoke|smokeup|snow|spark|star)|fa_(?:archive|bottom|center|directory|hidden|left|middle|readonly|right|sysfile|top|volumeid)|fb_login_(?:default|fallback_to_webview|forcing_safari|forcing_webview|no_fallback_to_webview|use_system_account)|iap_(?:available|canceled|ev_consume|ev_product|ev_purchase|ev_restore|ev_storeload|failed|purchased|refunded|status_available|status_loading|status_processing|status_restoring|status_unavailable|status_uninitialised|storeload_failed|storeload_ok|unavailable)|leaderboard_type_(?:number|time_mins_secs)|lighttype_(?:dir|point)|matrix_(?:projection|view|world)|mb_(?:any|left|middle|none|right)|network_(?:config_(?:connect_timeout|disable_reliable_udp|enable_reliable_udp|use_non_blocking_socket)|socket_(?:bluetooth|tcp|udp)|type_(?:connect|data|disconnect|non_blocking_connect))|of_challenge_(?:lose|tie|win)|os_(?:android|ios|linux|macosx|ps3|ps4|psvita|unknown|uwp|win32|win8native|windows|winphone|xboxone)|phy_debug_render_(?:aabb|collision_pairs|coms|core_shapes|joints|obb|shapes)|phy_joint_(?:anchor_1_x|anchor_1_y|anchor_2_x|anchor_2_y|angle|angle_limits|damping_ratio|frequency|length_1|length_2|lower_angle_limit|max_force|max_length|max_motor_force|max_motor_torque|max_torque|motor_force|motor_speed|motor_torque|reaction_force_x|reaction_force_y|reaction_torque|speed|translation|upper_angle_limit)|phy_particle_data_flag_(?:category|color|colour|position|typeflags|velocity)|phy_particle_flag_(?:colormixing|colourmixing|elastic|powder|spring|tensile|viscous|wall|water|zombie)|phy_particle_group_flag_(?:rigid|solid)|pr_(?:linelist|linestrip|pointlist|trianglefan|trianglelist|trianglestrip)|ps_(?:distr|shape)_(?:diamond|ellipse|gaussian|invgaussian|line|linear|rectangle)|pt_shape_(?:circle|cloud|disk|explosion|flare|line|pixel|ring|smoke|snow|spark|sphere|square|star)|ty_(?:real|string)|gp_(?:face\d|axislh|axislv|axisrh|axisrv|padd|padl|padr|padu|select|shoulderl|shoulderlb|shoulderr|shoulderrb|start|stickl|stickr)|lb_disp_(?:none|numeric|time_ms|time_sec)|lb_sort_(?:ascending|descending|none)|ov_(?:achievements|community|friends|gamegroup|players|settings)|ugc_(?:filetype_(?:community|microtrans)|list_(?:Favorited|Followed|Published|Subscribed|UsedOrPlayed|VotedDown|VotedOn|VotedUp|WillVoteLater)|match_(?:AllGuides|Artwork|Collections|ControllerBindings|IntegratedGuides|Items|Items_Mtx|Items_ReadyToUse|Screenshots|UsableInGame|Videos|WebGuides)|query_(?:AcceptedForGameRankedByAcceptanceDate|CreatedByFriendsRankedByPublicationDate|FavoritedByFriendsRankedByPublicationDate|NotYetRated)|query_RankedBy(?:NumTimesReported|PublicationDate|TextSearch|TotalVotesAsc|Trend|Vote|VotesUp)|result_success|sortorder_CreationOrder(?:Asc|Desc)|sortorder_(?:ForModeration|LastUpdatedDesc|SubscriptionDateDesc|TitleAsc|VoteScoreDesc)|visibility_(?:friends_only|private|public))|vertex_usage_(?:binormal|blendindices|blendweight|color|colour|depth|fog|normal|position|psize|sample|tangent|texcoord|textcoord)|vertex_type_(?:float\d|color|colour|ubyte4)|input_type|layerelementtype_(?:background|instance|oldtilemap|particlesystem|sprite|tile|tilemap|undefined)|se_(?:chorus|compressor|echo|equalizer|flanger|gargle|none|reverb)|text_type|tile_(?:flip|index_mask|mirror|rotate)|(?:obj|rm|scr|spr)\w+)\b/,variable:/\b(?:alarm|application_surface|async_load|background_(?:alpha|blend|color|colour|foreground|height|hspeed|htiled|index|showcolor|showcolour|visible|vspeed|vtiled|width|x|xscale|y|yscale)|bbox_(?:bottom|left|right|top)|browser_(?:height|width)|caption_(?:health|lives|score)|current_(?:day|hour|minute|month|second|time|weekday|year)|cursor_sprite|debug_mode|delta_time|direction|display_aa|error_(?:last|occurred)|event_(?:action|number|object|type)|fps|fps_real|friction|game_(?:display|project|save)_(?:id|name)|gamemaker_(?:pro|registered|version)|gravity|gravity_direction|(?:h|v)speed|health|iap_data|id|image_(?:alpha|angle|blend|depth|index|number|speed|xscale|yscale)|instance_(?:count|id)|keyboard_(?:key|lastchar|lastkey|string)|layer|lives|mask_index|mouse_(?:button|lastbutton|x|y)|object_index|os_(?:browser|device|type|version)|path_(?:endaction|index|orientation|position|positionprevious|scale|speed)|persistent|phy_(?:rotation|(?:col_normal|collision|com|linear_velocity|position|speed)_(?:x|y)|angular_(?:damping|velocity)|position_(?:x|y)previous|speed|linear_damping|bullet|fixed_rotation|active|mass|inertia|dynamic|kinematic|sleeping|collision_points)|pointer_(?:invalid|null)|room|room_(?:caption|first|height|last|persistent|speed|width)|score|secure_mode|show_(?:health|lives|score)|solid|speed|sprite_(?:height|index|width|xoffset|yoffset)|temp_directory|timeline_(?:index|loop|position|running|speed)|transition_(?:color|kind|steps)|undefined|view_(?:angle|current|enabled|(?:h|v)(?:border|speed)|(?:h|w|x|y)port|(?:h|w|x|y)view|object|surface_id|visible)|visible|webgl_enabled|working_directory|(?:x|y)(?:previous|start)|x|y|argument(?:_relitive|_count|\d)|argument|global|local|other|self)\b/})}return aS}var oS,WO;function wye(){if(WO)return oS;WO=1,oS=e,e.displayName="gn",e.aliases=["gni"];function e(t){t.languages.gn={comment:{pattern:/#.*/,greedy:!0},"string-literal":{pattern:/(^|[^\\"])"(?:[^\r\n"\\]|\\.)*"/,lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:\{[\s\S]*?\}|[a-zA-Z_]\w*|0x[a-fA-F0-9]{2})/,lookbehind:!0,inside:{number:/^\$0x[\s\S]{2}$/,variable:/^\$\w+$/,"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}},string:/[\s\S]+/}},keyword:/\b(?:else|if)\b/,boolean:/\b(?:false|true)\b/,"builtin-function":{pattern:/\b(?:assert|defined|foreach|import|pool|print|template|tool|toolchain)(?=\s*\()/i,alias:"keyword"},function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:current_cpu|current_os|current_toolchain|default_toolchain|host_cpu|host_os|root_build_dir|root_gen_dir|root_out_dir|target_cpu|target_gen_dir|target_os|target_out_dir)\b/,number:/-?\b\d+\b/,operator:/[-+!=<>]=?|&&|\|\|/,punctuation:/[(){}[\],.]/},t.languages.gn["string-literal"].inside.interpolation.inside.expression.inside=t.languages.gn,t.languages.gni=t.languages.gn}return oS}var iS,KO;function Eye(){if(KO)return iS;KO=1,iS=e,e.displayName="goModule",e.aliases=[];function e(t){t.languages["go-mod"]=t.languages["go-module"]={comment:{pattern:/\/\/.*/,greedy:!0},version:{pattern:/(^|[\s()[\],])v\d+\.\d+\.\d+(?:[+-][-+.\w]*)?(?![^\s()[\],])/,lookbehind:!0,alias:"number"},"go-version":{pattern:/((?:^|\s)go\s+)\d+(?:\.\d+){1,2}/,lookbehind:!0,alias:"number"},keyword:{pattern:/^([ \t]*)(?:exclude|go|module|replace|require|retract)\b/m,lookbehind:!0},operator:/=>/,punctuation:/[()[\],]/}}return iS}var sS,YO;function xye(){if(YO)return sS;YO=1,sS=e,e.displayName="go",e.aliases=[];function e(t){t.languages.go=t.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),t.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete t.languages.go["class-name"]}return sS}var lS,ZO;function kye(){if(ZO)return lS;ZO=1,lS=e,e.displayName="graphql",e.aliases=[];function e(t){t.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:t.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},t.hooks.add("after-tokenize",function(r){if(r.language!=="graphql")return;var a=r.tokens.filter(function(v){return typeof v!="string"&&v.type!=="comment"&&v.type!=="scalar"}),o=0;function i(v){return a[o+v]}function s(v,h){h=h||0;for(var S=0;S0)){var b=l(/^\{$/,/^\}$/);if(b===-1)continue;for(var y=o;y=0&&c(w,"variable-input")}}}}})}return lS}var cS,XO;function Cye(){if(XO)return cS;XO=1,cS=e,e.displayName="groovy",e.aliases=[];function e(t){t.languages.groovy=t.languages.extend("clike",{string:[{pattern:/("""|''')(?:[^\\]|\\[\s\S])*?\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0},{pattern:/(["'/])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0}],keyword:/\b(?:abstract|as|assert|boolean|break|byte|case|catch|char|class|const|continue|def|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|in|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),t.languages.insertBefore("groovy","string",{shebang:{pattern:/#!.+/,alias:"comment"}}),t.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),t.languages.insertBefore("groovy","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),t.hooks.add("wrap",function(n){if(n.language==="groovy"&&n.type==="string"){var r=n.content.value[0];if(r!="'"){var a=/([^\\])(?:\$(?:\{.*?\}|[\w.]+))/;r==="$"&&(a=/([^\$])(?:\$(?:\{.*?\}|[\w.]+))/),n.content.value=n.content.value.replace(/</g,"<").replace(/&/g,"&"),n.content=t.highlight(n.content.value,{expression:{pattern:a,lookbehind:!0,inside:t.languages.groovy}}),n.classes.push(r==="/"?"regex":"gstring")}}})}return cS}var uS,QO;function _ye(){if(QO)return uS;QO=1;var e=Th();uS=t,t.displayName="haml",t.aliases=[];function t(n){n.register(e),function(r){r.languages.haml={"multiline-comment":{pattern:/((?:^|\r?\n|\r)([\t ]*))(?:\/|-#).*(?:(?:\r?\n|\r)\2[\t ].+)*/,lookbehind:!0,alias:"comment"},"multiline-code":[{pattern:/((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*,[\t ]*(?:(?:\r?\n|\r)\2[\t ].*,[\t ]*)*(?:(?:\r?\n|\r)\2[\t ].+)/,lookbehind:!0,inside:r.languages.ruby},{pattern:/((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*\|[\t ]*(?:(?:\r?\n|\r)\2[\t ].*\|[\t ]*)*/,lookbehind:!0,inside:r.languages.ruby}],filter:{pattern:/((?:^|\r?\n|\r)([\t ]*)):[\w-]+(?:(?:\r?\n|\r)(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/,lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"symbol"}}},markup:{pattern:/((?:^|\r?\n|\r)[\t ]*)<.+/,lookbehind:!0,inside:r.languages.markup},doctype:{pattern:/((?:^|\r?\n|\r)[\t ]*)!!!(?: .+)?/,lookbehind:!0},tag:{pattern:/((?:^|\r?\n|\r)[\t ]*)[%.#][\w\-#.]*[\w\-](?:\([^)]+\)|\{(?:\{[^}]+\}|[^{}])+\}|\[[^\]]+\])*[\/<>]*/,lookbehind:!0,inside:{attributes:[{pattern:/(^|[^#])\{(?:\{[^}]+\}|[^{}])+\}/,lookbehind:!0,inside:r.languages.ruby},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*)(?:"(?:\\.|[^\\"\r\n])*"|[^)\s]+)/,lookbehind:!0},"attr-name":/[\w:-]+(?=\s*!?=|\s*[,)])/,punctuation:/[=(),]/}},{pattern:/\[[^\]]+\]/,inside:r.languages.ruby}],punctuation:/[<>]/}},code:{pattern:/((?:^|\r?\n|\r)[\t ]*(?:[~-]|[&!]?=)).+/,lookbehind:!0,inside:r.languages.ruby},interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},ruby:{pattern:/[\s\S]+/,inside:r.languages.ruby}}},punctuation:{pattern:/((?:^|\r?\n|\r)[\t ]*)[~=\-&!]+/,lookbehind:!0}};for(var a="((?:^|\\r?\\n|\\r)([\\t ]*)):{{filter_name}}(?:(?:\\r?\\n|\\r)(?:\\2[\\t ].+|\\s*?(?=\\r?\\n|\\r)))+",o=["css",{filter:"coffee",language:"coffeescript"},"erb","javascript","less","markdown","ruby","scss","textile"],i={},s=0,l=o.length;s@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},r.hooks.add("before-tokenize",function(a){var o=/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g;r.languages["markup-templating"].buildPlaceholders(a,"handlebars",o)}),r.hooks.add("after-tokenize",function(a){r.languages["markup-templating"].tokenizePlaceholders(a,"handlebars")}),r.languages.hbs=r.languages.handlebars}(n)}return dS}var fS,eD;function NA(){if(eD)return fS;eD=1,fS=e,e.displayName="haskell",e.aliases=["hs"];function e(t){t.languages.haskell={comment:{pattern:/(^|[^-!#$%*+=?&@|~.:<>^\\\/])(?:--(?:(?=.)[^-!#$%*+=?&@|~.:<>^\\\/].*|$)|\{-[\s\S]*?-\})/m,lookbehind:!0},char:{pattern:/'(?:[^\\']|\\(?:[abfnrtv\\"'&]|\^[A-Z@[\]^_]|ACK|BEL|BS|CAN|CR|DC1|DC2|DC3|DC4|DEL|DLE|EM|ENQ|EOT|ESC|ETB|ETX|FF|FS|GS|HT|LF|NAK|NUL|RS|SI|SO|SOH|SP|STX|SUB|SYN|US|VT|\d+|o[0-7]+|x[0-9a-fA-F]+))'/,alias:"string"},string:{pattern:/"(?:[^\\"]|\\(?:\S|\s+\\))*"/,greedy:!0},keyword:/\b(?:case|class|data|deriving|do|else|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b/,"import-statement":{pattern:/(^[\t ]*)import\s+(?:qualified\s+)?(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*(?:\s+as\s+(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,lookbehind:!0,inside:{keyword:/\b(?:as|hiding|import|qualified)\b/,punctuation:/\./}},builtin:/\b(?:abs|acos|acosh|all|and|any|appendFile|approxRational|asTypeOf|asin|asinh|atan|atan2|atanh|basicIORun|break|catch|ceiling|chr|compare|concat|concatMap|const|cos|cosh|curry|cycle|decodeFloat|denominator|digitToInt|div|divMod|drop|dropWhile|either|elem|encodeFloat|enumFrom|enumFromThen|enumFromThenTo|enumFromTo|error|even|exp|exponent|fail|filter|flip|floatDigits|floatRadix|floatRange|floor|fmap|foldl|foldl1|foldr|foldr1|fromDouble|fromEnum|fromInt|fromInteger|fromIntegral|fromRational|fst|gcd|getChar|getContents|getLine|group|head|id|inRange|index|init|intToDigit|interact|ioError|isAlpha|isAlphaNum|isAscii|isControl|isDenormalized|isDigit|isHexDigit|isIEEE|isInfinite|isLower|isNaN|isNegativeZero|isOctDigit|isPrint|isSpace|isUpper|iterate|last|lcm|length|lex|lexDigits|lexLitChar|lines|log|logBase|lookup|map|mapM|mapM_|max|maxBound|maximum|maybe|min|minBound|minimum|mod|negate|not|notElem|null|numerator|odd|or|ord|otherwise|pack|pi|pred|primExitWith|print|product|properFraction|putChar|putStr|putStrLn|quot|quotRem|range|rangeSize|read|readDec|readFile|readFloat|readHex|readIO|readInt|readList|readLitChar|readLn|readOct|readParen|readSigned|reads|readsPrec|realToFrac|recip|rem|repeat|replicate|return|reverse|round|scaleFloat|scanl|scanl1|scanr|scanr1|seq|sequence|sequence_|show|showChar|showInt|showList|showLitChar|showParen|showSigned|showString|shows|showsPrec|significand|signum|sin|sinh|snd|sort|span|splitAt|sqrt|subtract|succ|sum|tail|take|takeWhile|tan|tanh|threadToIOResult|toEnum|toInt|toInteger|toLower|toRational|toUpper|truncate|uncurry|undefined|unlines|until|unwords|unzip|unzip3|userError|words|writeFile|zip|zip3|zipWith|zipWith3)\b/,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0o[0-7]+|0x[0-9a-f]+)\b/i,operator:[{pattern:/`(?:[A-Z][\w']*\.)*[_a-z][\w']*`/,greedy:!0},{pattern:/(\s)\.(?=\s)/,lookbehind:!0},/[-!#$%*+=?&@|~:<>^\\\/][-!#$%*+=?&@|~.:<>^\\\/]*|\.[-!#$%*+=?&@|~.:<>^\\\/]+/],hvariable:{pattern:/\b(?:[A-Z][\w']*\.)*[_a-z][\w']*/,inside:{punctuation:/\./}},constant:{pattern:/\b(?:[A-Z][\w']*\.)*[A-Z][\w']*/,inside:{punctuation:/\./}},punctuation:/[{}[\];(),.:]/},t.languages.hs=t.languages.haskell}return fS}var pS,tD;function Tye(){if(tD)return pS;tD=1,pS=e,e.displayName="haxe",e.aliases=[];function e(t){t.languages.haxe=t.languages.extend("clike",{string:{pattern:/"(?:[^"\\]|\\[\s\S])*"/,greedy:!0},"class-name":[{pattern:/(\b(?:abstract|class|enum|extends|implements|interface|new|typedef)\s+)[A-Z_]\w*/,lookbehind:!0},/\b[A-Z]\w*/],keyword:/\bthis\b|\b(?:abstract|as|break|case|cast|catch|class|continue|default|do|dynamic|else|enum|extends|extern|final|for|from|function|if|implements|import|in|inline|interface|macro|new|null|operator|overload|override|package|private|public|return|static|super|switch|throw|to|try|typedef|untyped|using|var|while)(?!\.)\b/,function:{pattern:/\b[a-z_]\w*(?=\s*(?:<[^<>]*>\s*)?\()/i,greedy:!0},operator:/\.{3}|\+\+|--|&&|\|\||->|=>|(?:<{1,3}|[-+*/%!=&|^])=?|[?:~]/}),t.languages.insertBefore("haxe","string",{"string-interpolation":{pattern:/'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{interpolation:{pattern:/(^|[^\\])\$(?:\w+|\{[^{}]+\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:t.languages.haxe}}},string:/[\s\S]+/}}}),t.languages.insertBefore("haxe","class-name",{regex:{pattern:/~\/(?:[^\/\\\r\n]|\\.)+\/[a-z]*/,greedy:!0,inside:{"regex-flags":/\b[a-z]+$/,"regex-source":{pattern:/^(~\/)[\s\S]+(?=\/$)/,lookbehind:!0,alias:"language-regex",inside:t.languages.regex},"regex-delimiter":/^~\/|\/$/}}}),t.languages.insertBefore("haxe","keyword",{preprocessor:{pattern:/#(?:else|elseif|end|if)\b.*/,alias:"property"},metadata:{pattern:/@:?[\w.]+/,alias:"symbol"},reification:{pattern:/\$(?:\w+|(?=\{))/,alias:"important"}})}return pS}var gS,nD;function Rye(){if(nD)return gS;nD=1,gS=e,e.displayName="hcl",e.aliases=[];function e(t){t.languages.hcl={comment:/(?:\/\/|#).*|\/\*[\s\S]*?(?:\*\/|$)/,heredoc:{pattern:/<<-?(\w+\b)[\s\S]*?^[ \t]*\1/m,greedy:!0,alias:"string"},keyword:[{pattern:/(?:data|resource)\s+(?:"(?:\\[\s\S]|[^\\"])*")(?=\s+"[\w-]+"\s+\{)/i,inside:{type:{pattern:/(resource|data|\s+)(?:"(?:\\[\s\S]|[^\\"])*")/i,lookbehind:!0,alias:"variable"}}},{pattern:/(?:backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+(?=\{)/i,inside:{type:{pattern:/(backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+/i,lookbehind:!0,alias:"variable"}}},/[\w-]+(?=\s+\{)/],property:[/[-\w\.]+(?=\s*=(?!=))/,/"(?:\\[\s\S]|[^\\"])+"(?=\s*[:=])/],string:{pattern:/"(?:[^\\$"]|\\[\s\S]|\$(?:(?=")|\$+(?!\$)|[^"${])|\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\})*"/,greedy:!0,inside:{interpolation:{pattern:/(^|[^$])\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\}/,lookbehind:!0,inside:{type:{pattern:/(\b(?:count|data|local|module|path|self|terraform|var)\b\.)[\w\*]+/i,lookbehind:!0,alias:"variable"},keyword:/\b(?:count|data|local|module|path|self|terraform|var)\b/i,function:/\w+(?=\()/,string:{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,punctuation:/[!\$#%&'()*+,.\/;<=>@\[\\\]^`{|}~?:]/}}}},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,boolean:/\b(?:false|true)\b/i,punctuation:/[=\[\]{}]/}}return gS}var mS,rD;function Nye(){if(rD)return mS;rD=1;var e=Ws();mS=t,t.displayName="hlsl",t.aliases=[];function t(n){n.register(e),n.languages.hlsl=n.languages.extend("c",{"class-name":[n.languages.c["class-name"],/\b(?:AppendStructuredBuffer|BlendState|Buffer|ByteAddressBuffer|CompileShader|ComputeShader|ConsumeStructuredBuffer|DepthStencilState|DepthStencilView|DomainShader|GeometryShader|Hullshader|InputPatch|LineStream|OutputPatch|PixelShader|PointStream|RWBuffer|RWByteAddressBuffer|RWStructuredBuffer|RWTexture(?:1D|1DArray|2D|2DArray|3D)|RasterizerState|RenderTargetView|SamplerComparisonState|SamplerState|StructuredBuffer|Texture(?:1D|1DArray|2D|2DArray|2DMS|2DMSArray|3D|Cube|CubeArray)|TriangleStream|VertexShader)\b/],keyword:[/\b(?:asm|asm_fragment|auto|break|case|catch|cbuffer|centroid|char|class|column_major|compile|compile_fragment|const|const_cast|continue|default|delete|discard|do|dynamic_cast|else|enum|explicit|export|extern|for|friend|fxgroup|goto|groupshared|if|in|inline|inout|interface|line|lineadj|linear|long|matrix|mutable|namespace|new|nointerpolation|noperspective|operator|out|packoffset|pass|pixelfragment|point|precise|private|protected|public|register|reinterpret_cast|return|row_major|sample|sampler|shared|short|signed|sizeof|snorm|stateblock|stateblock_state|static|static_cast|string|struct|switch|tbuffer|technique|technique10|technique11|template|texture|this|throw|triangle|triangleadj|try|typedef|typename|uniform|union|unorm|unsigned|using|vector|vertexfragment|virtual|void|volatile|while)\b/,/\b(?:bool|double|dword|float|half|int|min(?:10float|12int|16(?:float|int|uint))|uint)(?:[1-4](?:x[1-4])?)?\b/],number:/(?:(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+)?|\b0x[\da-fA-F]+)[fFhHlLuU]?\b/,boolean:/\b(?:false|true)\b/})}return mS}var hS,aD;function Iye(){if(aD)return hS;aD=1,hS=e,e.displayName="hoon",e.aliases=[];function e(t){t.languages.hoon={comment:{pattern:/::.*/,greedy:!0},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},constant:/%(?:\.[ny]|[\w-]+)/,"class-name":/@(?:[a-z0-9-]*[a-z0-9])?|\*/i,function:/(?:\+[-+] {2})?(?:[a-z](?:[a-z0-9-]*[a-z0-9])?)/,keyword:/\.[\^\+\*=\?]|![><:\.=\?!]|=[>|:,\.\-\^<+;/~\*\?]|\?[>|:\.\-\^<\+&~=@!]|\|[\$_%:\.\-\^~\*=@\?]|\+[|\$\+\*]|:[_\-\^\+~\*]|%[_:\.\-\^\+~\*=]|\^[|:\.\-\+&~\*=\?]|\$[|_%:<>\-\^&~@=\?]|;[:<\+;\/~\*=]|~[>|\$_%<\+\/&=\?!]|--|==/}}return hS}var bS,oD;function Oye(){if(oD)return bS;oD=1,bS=e,e.displayName="hpkp",e.aliases=[];function e(t){t.languages.hpkp={directive:{pattern:/\b(?:includeSubDomains|max-age|pin-sha256|preload|report-to|report-uri|strict)(?=[\s;=]|$)/i,alias:"property"},operator:/=/,punctuation:/;/}}return bS}var yS,iD;function Dye(){if(iD)return yS;iD=1,yS=e,e.displayName="hsts",e.aliases=[];function e(t){t.languages.hsts={directive:{pattern:/\b(?:includeSubDomains|max-age|preload)(?=[\s;=]|$)/i,alias:"property"},operator:/=/,punctuation:/;/}}return yS}var vS,sD;function Lye(){if(sD)return vS;sD=1,vS=e,e.displayName="http",e.aliases=[];function e(t){(function(n){function r(d){return RegExp("(^(?:"+d+"):[ ]*(?![ ]))[^]+","i")}n.languages.http={"request-line":{pattern:/^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:n.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[\d.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[\d.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[\d.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},header:{pattern:/^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,inside:{"header-value":[{pattern:r(/Content-Security-Policy/.source),lookbehind:!0,alias:["csp","languages-csp"],inside:n.languages.csp},{pattern:r(/Public-Key-Pins(?:-Report-Only)?/.source),lookbehind:!0,alias:["hpkp","languages-hpkp"],inside:n.languages.hpkp},{pattern:r(/Strict-Transport-Security/.source),lookbehind:!0,alias:["hsts","languages-hsts"],inside:n.languages.hsts},{pattern:r(/[^:]+/.source),lookbehind:!0}],"header-name":{pattern:/^[^:]+/,alias:"keyword"},punctuation:/^:/}}};var a=n.languages,o={"application/javascript":a.javascript,"application/json":a.json||a.javascript,"application/xml":a.xml,"text/xml":a.xml,"text/html":a.html,"text/css":a.css,"text/plain":a.plain},i={"application/json":!0,"application/xml":!0};function s(d){var g=d.replace(/^[a-z]+\//,""),m="\\w+/(?:[\\w.-]+\\+)+"+g+"(?![+\\w.-])";return"(?:"+d+"|"+m+")"}var l;for(var c in o)if(o[c]){l=l||{};var u=i[c]?s(c):c;l[c.replace(/\//g,"-")]={pattern:RegExp("("+/content-type:\s*/.source+u+/(?:(?:\r\n?|\n)[\w-].*)*(?:\r(?:\n|(?!\n))|\n)/.source+")"+/[^ \t\w-][\s\S]*/.source,"i"),lookbehind:!0,inside:o[c]}}l&&n.languages.insertBefore("http","header",l)})(t)}return vS}var SS,lD;function Mye(){if(lD)return SS;lD=1,SS=e,e.displayName="ichigojam",e.aliases=[];function e(t){t.languages.ichigojam={comment:/(?:\B'|REM)(?:[^\n\r]*)/i,string:{pattern:/"(?:""|[!#$%&'()*,\/:;<=>?^\w +\-.])*"/,greedy:!0},number:/\B#[0-9A-F]+|\B`[01]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,keyword:/\b(?:BEEP|BPS|CASE|CLEAR|CLK|CLO|CLP|CLS|CLT|CLV|CONT|COPY|ELSE|END|FILE|FILES|FOR|GOSUB|GOTO|GSB|IF|INPUT|KBD|LED|LET|LIST|LOAD|LOCATE|LRUN|NEW|NEXT|OUT|PLAY|POKE|PRINT|PWM|REM|RENUM|RESET|RETURN|RIGHT|RTN|RUN|SAVE|SCROLL|SLEEP|SRND|STEP|STOP|SUB|TEMPO|THEN|TO|UART|VIDEO|WAIT)(?:\$|\b)/i,function:/\b(?:ABS|ANA|ASC|BIN|BTN|DEC|END|FREE|HELP|HEX|I2CR|I2CW|IN|INKEY|LEN|LINE|PEEK|RND|SCR|SOUND|STR|TICK|USR|VER|VPEEK|ZER)(?:\$|\b)/i,label:/(?:\B@\S+)/,operator:/<[=>]?|>=?|\|\||&&|[+\-*\/=|&^~!]|\b(?:AND|NOT|OR)\b/i,punctuation:/[\[,;:()\]]/}}return SS}var wS,cD;function Pye(){if(cD)return wS;cD=1,wS=e,e.displayName="icon",e.aliases=[];function e(t){t.languages.icon={comment:/#.*/,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n_]|\\.|_(?!\1)(?:\r\n|[\s\S]))*\1/,greedy:!0},number:/\b(?:\d+r[a-z\d]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b|\.\d+\b/i,"builtin-keyword":{pattern:/&(?:allocated|ascii|clock|collections|cset|current|date|dateline|digits|dump|e|error(?:number|text|value)?|errout|fail|features|file|host|input|lcase|letters|level|line|main|null|output|phi|pi|pos|progname|random|regions|source|storage|subject|time|trace|ucase|version)\b/,alias:"variable"},directive:{pattern:/\$\w+/,alias:"builtin"},keyword:/\b(?:break|by|case|create|default|do|else|end|every|fail|global|if|initial|invocable|link|local|next|not|of|procedure|record|repeat|return|static|suspend|then|to|until|while)\b/,function:/\b(?!\d)\w+(?=\s*[({]|\s*!\s*\[)/,operator:/[+-]:(?!=)|(?:[\/?@^%&]|\+\+?|--?|==?=?|~==?=?|\*\*?|\|\|\|?|<(?:->?|>?=?)(?::=)?|:(?:=:?)?|[!.\\|~]/,punctuation:/[\[\](){},;]/}}return wS}var ES,uD;function $ye(){if(uD)return ES;uD=1,ES=e,e.displayName="icuMessageFormat",e.aliases=[];function e(t){(function(n){function r(c,u){return u<=0?/[]/.source:c.replace(//g,function(){return r(c,u-1)})}var a=/'[{}:=,](?:[^']|'')*'(?!')/,o={pattern:/''/,greedy:!0,alias:"operator"},i={pattern:a,greedy:!0,inside:{escape:o}},s=r(/\{(?:[^{}']|'(?![{},'])|''||)*\}/.source.replace(//g,function(){return a.source}),8),l={pattern:RegExp(s),inside:{message:{pattern:/^(\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:null},"message-delimiter":{pattern:/./,alias:"punctuation"}}};n.languages["icu-message-format"]={argument:{pattern:RegExp(s),greedy:!0,inside:{content:{pattern:/^(\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:{"argument-name":{pattern:/^(\s*)[^{}:=,\s]+/,lookbehind:!0},"choice-style":{pattern:/^(\s*,\s*choice\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{punctuation:/\|/,range:{pattern:/^(\s*)[+-]?(?:\d+(?:\.\d*)?|\u221e)\s*[<#\u2264]/,lookbehind:!0,inside:{operator:/[<#\u2264]/,number:/\S+/}},rest:null}},"plural-style":{pattern:/^(\s*,\s*(?:plural|selectordinal)\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{offset:/^offset:\s*\d+/,"nested-message":l,selector:{pattern:/=\d+|[^{}:=,\s]+/,inside:{keyword:/^(?:few|many|one|other|two|zero)$/}}}},"select-style":{pattern:/^(\s*,\s*select\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{"nested-message":l,selector:{pattern:/[^{}:=,\s]+/,inside:{keyword:/^other$/}}}},keyword:/\b(?:choice|plural|select|selectordinal)\b/,"arg-type":{pattern:/\b(?:date|duration|number|ordinal|spellout|time)\b/,alias:"keyword"},"arg-skeleton":{pattern:/(,\s*)::[^{}:=,\s]+/,lookbehind:!0},"arg-style":{pattern:/(,\s*)(?:currency|full|integer|long|medium|percent|short)(?=\s*$)/,lookbehind:!0},"arg-style-text":{pattern:RegExp(/(^\s*,\s*(?=\S))/.source+r(/(?:[^{}']|'[^']*'|\{(?:)?\})+/.source,8)+"$"),lookbehind:!0,alias:"string"},punctuation:/,/}},"argument-delimiter":{pattern:/./,alias:"operator"}}},escape:o,string:i},l.inside.message.inside=n.languages["icu-message-format"],n.languages["icu-message-format"].argument.inside.content.inside["choice-style"].inside.rest=n.languages["icu-message-format"]})(t)}return ES}var xS,dD;function Fye(){if(dD)return xS;dD=1;var e=NA();xS=t,t.displayName="idris",t.aliases=["idr"];function t(n){n.register(e),n.languages.idris=n.languages.extend("haskell",{comment:{pattern:/(?:(?:--|\|\|\|).*$|\{-[\s\S]*?-\})/m},keyword:/\b(?:Type|case|class|codata|constructor|corecord|data|do|dsl|else|export|if|implementation|implicit|import|impossible|in|infix|infixl|infixr|instance|interface|let|module|mutual|namespace|of|parameters|partial|postulate|private|proof|public|quoteGoal|record|rewrite|syntax|then|total|using|where|with)\b/,builtin:void 0}),n.languages.insertBefore("idris","keyword",{"import-statement":{pattern:/(^\s*import\s+)(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*/m,lookbehind:!0,inside:{punctuation:/\./}}}),n.languages.idr=n.languages.idris}return xS}var kS,fD;function jye(){if(fD)return kS;fD=1,kS=e,e.displayName="iecst",e.aliases=[];function e(t){t.languages.iecst={comment:[{pattern:/(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\(\*[\s\S]*?(?:\*\)|$)|\{[\s\S]*?(?:\}|$))/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:[/\b(?:END_)?(?:PROGRAM|CONFIGURATION|INTERFACE|FUNCTION_BLOCK|FUNCTION|ACTION|TRANSITION|TYPE|STRUCT|(?:INITIAL_)?STEP|NAMESPACE|LIBRARY|CHANNEL|FOLDER|RESOURCE|VAR_(?:ACCESS|CONFIG|EXTERNAL|GLOBAL|INPUT|IN_OUT|OUTPUT|TEMP)|VAR|METHOD|PROPERTY)\b/i,/\b(?:AT|BY|(?:END_)?(?:CASE|FOR|IF|REPEAT|WHILE)|CONSTANT|CONTINUE|DO|ELSE|ELSIF|EXIT|EXTENDS|FROM|GET|GOTO|IMPLEMENTS|JMP|NON_RETAIN|OF|PRIVATE|PROTECTED|PUBLIC|RETAIN|RETURN|SET|TASK|THEN|TO|UNTIL|USING|WITH|__CATCH|__ENDTRY|__FINALLY|__TRY)\b/],"class-name":/\b(?:ANY|ARRAY|BOOL|BYTE|U?(?:D|L|S)?INT|(?:D|L)?WORD|DATE(?:_AND_TIME)?|DT|L?REAL|POINTER|STRING|TIME(?:_OF_DAY)?|TOD)\b/,address:{pattern:/%[IQM][XBWDL][\d.]*|%[IQ][\d.]*/,alias:"symbol"},number:/\b(?:16#[\da-f]+|2#[01_]+|0x[\da-f]+)\b|\b(?:D|DT|T|TOD)#[\d_shmd:]*|\b[A-Z]*#[\d.,_]*|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/,operator:/S?R?:?=>?|&&?|\*\*?|<[=>]?|>=?|[-:^/+#]|\b(?:AND|EQ|EXPT|GE|GT|LE|LT|MOD|NE|NOT|OR|XOR)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,punctuation:/[()[\].,;]/}}return kS}var CS,pD;function zye(){if(pD)return CS;pD=1,CS=e,e.displayName="ignore",e.aliases=["gitignore","hgignore","npmignore"];function e(t){(function(n){n.languages.ignore={comment:/^#.*/m,entry:{pattern:/\S(?:.*(?:(?:\\ )|\S))?/,alias:"string",inside:{operator:/^!|\*\*?|\?/,regex:{pattern:/(^|[^\\])\[[^\[\]]*\]/,lookbehind:!0},punctuation:/\//}}},n.languages.gitignore=n.languages.ignore,n.languages.hgignore=n.languages.ignore,n.languages.npmignore=n.languages.ignore})(t)}return CS}var _S,gD;function Uye(){if(gD)return _S;gD=1,_S=e,e.displayName="inform7",e.aliases=[];function e(t){t.languages.inform7={string:{pattern:/"[^"]*"/,inside:{substitution:{pattern:/\[[^\[\]]+\]/,inside:{delimiter:{pattern:/\[|\]/,alias:"punctuation"}}}}},comment:{pattern:/\[[^\[\]]+\]/,greedy:!0},title:{pattern:/^[ \t]*(?:book|chapter|part(?! of)|section|table|volume)\b.+/im,alias:"important"},number:{pattern:/(^|[^-])(?:\b\d+(?:\.\d+)?(?:\^\d+)?(?:(?!\d)\w+)?|\b(?:eight|eleven|five|four|nine|one|seven|six|ten|three|twelve|two))\b(?!-)/i,lookbehind:!0},verb:{pattern:/(^|[^-])\b(?:answering|applying to|are|asking|attacking|be(?:ing)?|burning|buying|called|carries|carry(?! out)|carrying|climbing|closing|conceal(?:ing|s)?|consulting|contain(?:ing|s)?|cutting|drinking|dropping|eating|enclos(?:es?|ing)|entering|examining|exiting|getting|giving|going|ha(?:s|ve|ving)|hold(?:ing|s)?|impl(?:ies|y)|incorporat(?:es?|ing)|inserting|is|jumping|kissing|listening|locking|looking|mean(?:ing|s)?|opening|provid(?:es?|ing)|pulling|pushing|putting|relat(?:es?|ing)|removing|searching|see(?:ing|s)?|setting|showing|singing|sleeping|smelling|squeezing|support(?:ing|s)?|swearing|switching|taking|tasting|telling|thinking|throwing|touching|turning|tying|unlock(?:ing|s)?|var(?:ies|y|ying)|waiting|waking|waving|wear(?:ing|s)?)\b(?!-)/i,lookbehind:!0,alias:"operator"},keyword:{pattern:/(^|[^-])\b(?:after|before|carry out|check|continue the action|definition(?= *:)|do nothing|else|end (?:if|the story|unless)|every turn|if|include|instead(?: of)?|let|move|no|now|otherwise|repeat|report|resume the story|rule for|running through|say(?:ing)?|stop the action|test|try(?:ing)?|understand|unless|use|when|while|yes)\b(?!-)/i,lookbehind:!0},property:{pattern:/(^|[^-])\b(?:adjacent(?! to)|carried|closed|concealed|contained|dark|described|edible|empty|enclosed|enterable|even|female|fixed in place|full|handled|held|improper-named|incorporated|inedible|invisible|lighted|lit|lock(?:able|ed)|male|marked for listing|mentioned|negative|neuter|non-(?:empty|full|recurring)|odd|opaque|open(?:able)?|plural-named|portable|positive|privately-named|proper-named|provided|publically-named|pushable between rooms|recurring|related|rubbing|scenery|seen|singular-named|supported|swinging|switch(?:able|ed(?: off| on)?)|touch(?:able|ed)|transparent|unconcealed|undescribed|unlit|unlocked|unmarked for listing|unmentioned|unopenable|untouchable|unvisited|variable|visible|visited|wearable|worn)\b(?!-)/i,lookbehind:!0,alias:"symbol"},position:{pattern:/(^|[^-])\b(?:above|adjacent to|back side of|below|between|down|east|everywhere|front side|here|in|inside(?: from)?|north(?:east|west)?|nowhere|on(?: top of)?|other side|outside(?: from)?|parts? of|regionally in|south(?:east|west)?|through|up|west|within)\b(?!-)/i,lookbehind:!0,alias:"keyword"},type:{pattern:/(^|[^-])\b(?:actions?|activit(?:ies|y)|actors?|animals?|backdrops?|containers?|devices?|directions?|doors?|holders?|kinds?|lists?|m[ae]n|nobody|nothing|nouns?|numbers?|objects?|people|persons?|player(?:'s holdall)?|regions?|relations?|rooms?|rule(?:book)?s?|scenes?|someone|something|supporters?|tables?|texts?|things?|time|vehicles?|wom[ae]n)\b(?!-)/i,lookbehind:!0,alias:"variable"},punctuation:/[.,:;(){}]/},t.languages.inform7.string.inside.substitution.inside.rest=t.languages.inform7,t.languages.inform7.string.inside.substitution.inside.rest.text={pattern:/\S(?:\s*\S)*/,alias:"comment"}}return _S}var AS,mD;function Bye(){if(mD)return AS;mD=1,AS=e,e.displayName="ini",e.aliases=[];function e(t){t.languages.ini={comment:{pattern:/(^[ \f\t\v]*)[#;][^\n\r]*/m,lookbehind:!0},section:{pattern:/(^[ \f\t\v]*)\[[^\n\r\]]*\]?/m,lookbehind:!0,inside:{"section-name":{pattern:/(^\[[ \f\t\v]*)[^ \f\t\v\]]+(?:[ \f\t\v]+[^ \f\t\v\]]+)*/,lookbehind:!0,alias:"selector"},punctuation:/\[|\]/}},key:{pattern:/(^[ \f\t\v]*)[^ \f\n\r\t\v=]+(?:[ \f\t\v]+[^ \f\n\r\t\v=]+)*(?=[ \f\t\v]*=)/m,lookbehind:!0,alias:"attr-name"},value:{pattern:/(=[ \f\t\v]*)[^ \f\n\r\t\v]+(?:[ \f\t\v]+[^ \f\n\r\t\v]+)*/,lookbehind:!0,alias:"attr-value",inside:{"inner-value":{pattern:/^("|').+(?=\1$)/,lookbehind:!0}}},punctuation:/=/}}return AS}var TS,hD;function Hye(){if(hD)return TS;hD=1,TS=e,e.displayName="io",e.aliases=[];function e(t){t.languages.io={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\/\/.*|#.*)/,lookbehind:!0,greedy:!0},"triple-quoted-string":{pattern:/"""(?:\\[\s\S]|(?!""")[^\\])*"""/,greedy:!0,alias:"string"},string:{pattern:/"(?:\\.|[^\\\r\n"])*"/,greedy:!0},keyword:/\b(?:activate|activeCoroCount|asString|block|break|call|catch|clone|collectGarbage|compileString|continue|do|doFile|doMessage|doString|else|elseif|exit|for|foreach|forward|getEnvironmentVariable|getSlot|hasSlot|if|ifFalse|ifNil|ifNilEval|ifTrue|isActive|isNil|isResumable|list|message|method|parent|pass|pause|perform|performWithArgList|print|println|proto|raise|raiseResumable|removeSlot|resend|resume|schedulerSleepSeconds|self|sender|setSchedulerSleepSeconds|setSlot|shallowCopy|slotNames|super|system|then|thisBlock|thisContext|try|type|uniqueId|updateSlot|wait|while|write|yield)\b/,builtin:/\b(?:Array|AudioDevice|AudioMixer|BigNum|Block|Box|Buffer|CFunction|CGI|Color|Curses|DBM|DNSResolver|DOConnection|DOProxy|DOServer|Date|Directory|Duration|DynLib|Error|Exception|FFT|File|Fnmatch|Font|Future|GL|GLE|GLScissor|GLU|GLUCylinder|GLUQuadric|GLUSphere|GLUT|Host|Image|Importer|LinkList|List|Lobby|Locals|MD5|MP3Decoder|MP3Encoder|Map|Message|Movie|Notification|Number|Object|OpenGL|Point|Protos|Random|Regex|SGML|SGMLElement|SGMLParser|SQLite|Sequence|Server|ShowMessage|SleepyCat|SleepyCatCursor|Socket|SocketManager|Sound|Soup|Store|String|Tree|UDPSender|UPDReceiver|URL|User|Warning|WeakLink)\b/,boolean:/\b(?:false|nil|true)\b/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e-?\d+)?/i,operator:/[=!*/%+\-^&|]=|>>?=?|<+*\-%$|,#][.:]?|[?^]\.?|[;\[]:?|[~}"i][.:]|[ACeEIjLor]\.|(?:[_\/\\qsux]|_?\d):)/,alias:"keyword"},number:/\b_?(?:(?!\d:)\d+(?:\.\d+)?(?:(?:ad|ar|[ejpx])_?\d+(?:\.\d+)?)*(?:b_?[\da-z]+(?:\.[\da-z]+)?)?|_\b(?!\.))/,adverb:{pattern:/[~}]|[\/\\]\.?|[bfM]\.|t[.:]/,alias:"builtin"},operator:/[=a][.:]|_\./,conjunction:{pattern:/&(?:\.:?|:)?|[.:@][.:]?|[!D][.:]|[;dHT]\.|`:?|[\^LS]:|"/,alias:"variable"},punctuation:/[()]/}}return RS}var NS,yD;function IA(){if(yD)return NS;yD=1,NS=e,e.displayName="java",e.aliases=[];function e(t){(function(n){var r=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,a=/(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,o={pattern:RegExp(a+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};n.languages.java=n.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[o,{pattern:RegExp(a+/[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source),lookbehind:!0,inside:o.inside}],keyword:r,function:[n.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),n.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),n.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":o,keyword:r,punctuation:/[<>(),.:]/,operator:/[?&|]/}},namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,function(){return r.source})),lookbehind:!0,inside:{punctuation:/\./}}})})(t)}return NS}var IS,vD;function Rh(){if(vD)return IS;vD=1,IS=e,e.displayName="javadoclike",e.aliases=[];function e(t){(function(n){var r=n.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};function a(i,s){var l="doc-comment",c=n.languages[i];if(c){var u=c[l];if(!u){var d={};d[l]={pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"},c=n.languages.insertBefore(i,"comment",d),u=c[l]}if(u instanceof RegExp&&(u=c[l]={pattern:u}),Array.isArray(u))for(var g=0,m=u.length;g)?|/.source.replace(//g,function(){return i});a.languages.javadoc=a.languages.extend("javadoclike",{}),a.languages.insertBefore("javadoc","keyword",{reference:{pattern:RegExp(/(@(?:exception|link|linkplain|see|throws|value)\s+(?:\*\s*)?)/.source+"(?:"+s+")"),lookbehind:!0,inside:{function:{pattern:/(#\s*)\w+(?=\s*\()/,lookbehind:!0},field:{pattern:/(#\s*)\w+/,lookbehind:!0},namespace:{pattern:/\b(?:[a-z]\w*\s*\.\s*)+/,inside:{punctuation:/\./}},"class-name":/\b[A-Z]\w*/,keyword:a.languages.java.keyword,punctuation:/[#()[\],.]/}},"class-name":{pattern:/(@param\s+)<[A-Z]\w*>/,lookbehind:!0,inside:{punctuation:/[.<>]/}},"code-section":[{pattern:/(\{@code\s+(?!\s))(?:[^\s{}]|\s+(?![\s}])|\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\})+(?=\s*\})/,lookbehind:!0,inside:{code:{pattern:o,lookbehind:!0,inside:a.languages.java,alias:"language-java"}}},{pattern:/(<(code|pre|tt)>(?!)\s*)\S(?:\S|\s+\S)*?(?=\s*<\/\2>)/,lookbehind:!0,inside:{line:{pattern:o,lookbehind:!0,inside:{tag:a.languages.markup.tag,entity:a.languages.markup.entity,code:{pattern:/.+/,inside:a.languages.java,alias:"language-java"}}}}}],tag:a.languages.markup.tag,entity:a.languages.markup.entity}),a.languages.javadoclike.addSupport("java",a.languages.javadoc)}(r)}return OS}var DS,wD;function Gye(){if(wD)return DS;wD=1,DS=e,e.displayName="javastacktrace",e.aliases=[];function e(t){t.languages.javastacktrace={summary:{pattern:/^([\t ]*)(?:(?:Caused by:|Suppressed:|Exception in thread "[^"]*")[\t ]+)?[\w$.]+(?::.*)?$/m,lookbehind:!0,inside:{keyword:{pattern:/^([\t ]*)(?:(?:Caused by|Suppressed)(?=:)|Exception in thread)/m,lookbehind:!0},string:{pattern:/^(\s*)"[^"]*"/,lookbehind:!0},exceptions:{pattern:/^(:?\s*)[\w$.]+(?=:|$)/,lookbehind:!0,inside:{"class-name":/[\w$]+$/,namespace:/\b[a-z]\w*\b/,punctuation:/\./}},message:{pattern:/(:\s*)\S.*/,lookbehind:!0,alias:"string"},punctuation:/:/}},"stack-frame":{pattern:/^([\t ]*)at (?:[\w$./]|@[\w$.+-]*\/)+(?:)?\([^()]*\)/m,lookbehind:!0,inside:{keyword:{pattern:/^(\s*)at(?= )/,lookbehind:!0},source:[{pattern:/(\()\w+\.\w+:\d+(?=\))/,lookbehind:!0,inside:{file:/^\w+\.\w+/,punctuation:/:/,"line-number":{pattern:/\b\d+\b/,alias:"number"}}},{pattern:/(\()[^()]*(?=\))/,lookbehind:!0,inside:{keyword:/^(?:Native Method|Unknown Source)$/}}],"class-name":/[\w$]+(?=\.(?:|[\w$]+)\()/,function:/(?:|[\w$]+)(?=\()/,"class-loader":{pattern:/(\s)[a-z]\w*(?:\.[a-z]\w*)*(?=\/[\w@$.]*\/)/,lookbehind:!0,alias:"namespace",inside:{punctuation:/\./}},module:{pattern:/([\s/])[a-z]\w*(?:\.[a-z]\w*)*(?:@[\w$.+-]*)?(?=\/)/,lookbehind:!0,inside:{version:{pattern:/(@)[\s\S]+/,lookbehind:!0,alias:"number"},punctuation:/[@.]/}},namespace:{pattern:/(?:\b[a-z]\w*\.)+/,inside:{punctuation:/\./}},punctuation:/[()/.]/}},more:{pattern:/^([\t ]*)\.{3} \d+ [a-z]+(?: [a-z]+)*/m,lookbehind:!0,inside:{punctuation:/\.{3}/,number:/\d+/,keyword:/\b[a-z]+(?: [a-z]+)*\b/}}}}return DS}var LS,ED;function Wye(){if(ED)return LS;ED=1,LS=e,e.displayName="jexl",e.aliases=[];function e(t){t.languages.jexl={string:/(["'])(?:\\[\s\S]|(?!\1)[^\\])*\1/,transform:{pattern:/(\|\s*)[a-zA-Zа-яА-Я_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$][\wа-яА-Я\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$]*/,alias:"function",lookbehind:!0},function:/[a-zA-Zа-яА-Я_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$][\wа-яА-Я\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$]*\s*(?=\()/,number:/\b\d+(?:\.\d+)?\b|\B\.\d+\b/,operator:/[<>!]=?|-|\+|&&|==|\|\|?|\/\/?|[?:*^%]/,boolean:/\b(?:false|true)\b/,keyword:/\bin\b/,punctuation:/[{}[\](),.]/}}return LS}var MS,xD;function Kye(){if(xD)return MS;xD=1,MS=e,e.displayName="jolie",e.aliases=[];function e(t){t.languages.jolie=t.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\[\s\S]|[^"\\])*"/,lookbehind:!0,greedy:!0},"class-name":{pattern:/((?:\b(?:as|courier|embed|in|inputPort|outputPort|service)\b|@)[ \t]*)\w+/,lookbehind:!0},keyword:/\b(?:as|cH|comp|concurrent|constants|courier|cset|csets|default|define|else|embed|embedded|execution|exit|extender|for|foreach|forward|from|global|if|import|in|include|init|inputPort|install|instanceof|interface|is_defined|linkIn|linkOut|main|new|nullProcess|outputPort|over|private|provide|public|scope|sequential|service|single|spawn|synchronized|this|throw|throws|type|undef|until|while|with)\b/,function:/\b[a-z_]\w*(?=[ \t]*[@(])/i,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?l?/i,operator:/-[-=>]?|\+[+=]?|<[<=]?|[>=*!]=?|&&|\|\||[?\/%^@|]/,punctuation:/[()[\]{},;.:]/,builtin:/\b(?:Byte|any|bool|char|double|enum|float|int|length|long|ranges|regex|string|undefined|void)\b/}),t.languages.insertBefore("jolie","keyword",{aggregates:{pattern:/(\bAggregates\s*:\s*)(?:\w+(?:\s+with\s+\w+)?\s*,\s*)*\w+(?:\s+with\s+\w+)?/,lookbehind:!0,inside:{keyword:/\bwith\b/,"class-name":/\w+/,punctuation:/,/}},redirects:{pattern:/(\bRedirects\s*:\s*)(?:\w+\s*=>\s*\w+\s*,\s*)*(?:\w+\s*=>\s*\w+)/,lookbehind:!0,inside:{punctuation:/,/,"class-name":/\w+/,operator:/=>/}},property:{pattern:/\b(?:Aggregates|[Ii]nterfaces|Java|Javascript|Jolie|[Ll]ocation|OneWay|[Pp]rotocol|Redirects|RequestResponse)\b(?=[ \t]*:)/}})}return MS}var PS,kD;function Yye(){if(kD)return PS;kD=1,PS=e,e.displayName="jq",e.aliases=[];function e(t){(function(n){var r=/\\\((?:[^()]|\([^()]*\))*\)/.source,a=RegExp(/(^|[^\\])"(?:[^"\r\n\\]|\\[^\r\n(]|__)*"/.source.replace(/__/g,function(){return r})),o={interpolation:{pattern:RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+r),lookbehind:!0,inside:{content:{pattern:/^(\\\()[\s\S]+(?=\)$)/,lookbehind:!0,inside:null},punctuation:/^\\\(|\)$/}}},i=n.languages.jq={comment:/#.*/,property:{pattern:RegExp(a.source+/(?=\s*:(?!:))/.source),lookbehind:!0,greedy:!0,inside:o},string:{pattern:a,lookbehind:!0,greedy:!0,inside:o},function:{pattern:/(\bdef\s+)[a-z_]\w+/i,lookbehind:!0},variable:/\B\$\w+/,"property-literal":{pattern:/\b[a-z_]\w*(?=\s*:(?!:))/i,alias:"property"},keyword:/\b(?:as|break|catch|def|elif|else|end|foreach|if|import|include|label|module|modulemeta|null|reduce|then|try|while)\b/,boolean:/\b(?:false|true)\b/,number:/(?:\b\d+\.|\B\.)?\b\d+(?:[eE][+-]?\d+)?\b/,operator:[{pattern:/\|=?/,alias:"pipe"},/\.\.|[!=<>]?=|\?\/\/|\/\/=?|[-+*/%]=?|[<>?]|\b(?:and|not|or)\b/],"c-style-function":{pattern:/\b[a-z_]\w*(?=\s*\()/i,alias:"function"},punctuation:/::|[()\[\]{},:;]|\.(?=\s*[\[\w$])/,dot:{pattern:/\./,alias:"important"}};o.interpolation.inside.content.inside=i})(t)}return PS}var $S,CD;function Zye(){if(CD)return $S;CD=1,$S=e,e.displayName="jsExtras",e.aliases=[];function e(t){(function(n){n.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+n.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),n.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+n.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),n.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]});function r(c,u){return RegExp(c.replace(//g,function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source}),u)}n.languages.insertBefore("javascript","keyword",{imports:{pattern:r(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:n.languages.javascript},exports:{pattern:r(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:n.languages.javascript}}),n.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),n.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),n.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:r(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var a=["function","function-variable","method","method-variable","property-access"],o=0;o=C.length)return;var L=R[T];if(typeof L=="string"||typeof L.content=="string"){var D=C[S],H=typeof L=="string"?L:L.content,z=H.indexOf(D);if(z!==-1){++S;var M=H.substring(0,z),U=d(E[D]),X=H.substring(z+D.length),j=[];if(M&&j.push(M),j.push(U),X){var O=[X];_(O),j.push.apply(j,O)}typeof L=="string"?(R.splice.apply(R,[T,1].concat(j)),T+=j.length-1):L.content=j}}else{var A=L.content;Array.isArray(A)?_(A):_([A])}}}return _(x),new n.Token(v,x,"language-"+v,y)}var m={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};n.hooks.add("after-tokenize",function(y){if(!(y.language in m))return;function w(v){for(var h=0,S=v.length;h]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),n.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete n.languages.typescript.parameter,delete n.languages.typescript["literal-property"];var r=n.languages.extend("typescript",{});delete r["class-name"],n.languages.typescript["class-name"].inside=r,n.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:r}}}}),n.languages.ts=n.languages.typescript})(t)}return jS}var zS,TD;function Qye(){if(TD)return zS;TD=1;var e=Rh(),t=OA();zS=n,n.displayName="jsdoc",n.aliases=[];function n(r){r.register(e),r.register(t),function(a){var o=a.languages.javascript,i=/\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})+\}/.source,s="(@(?:arg|argument|param|property)\\s+(?:"+i+"\\s+)?)";a.languages.jsdoc=a.languages.extend("javadoclike",{parameter:{pattern:RegExp(s+/(?:(?!\s)[$\w\xA0-\uFFFF.])+(?=\s|$)/.source),lookbehind:!0,inside:{punctuation:/\./}}}),a.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(s+/\[(?:(?!\s)[$\w\xA0-\uFFFF.])+(?:=[^[\]]+)?\](?=\s|$)/.source),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:o,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp(/(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\s+(?:\s+)?)[A-Z]\w*(?:\.[A-Z]\w*)*/.source.replace(//g,function(){return i})),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+i),lookbehind:!0,inside:{string:o.string,number:o.number,boolean:o.boolean,keyword:a.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:o,alias:"language-javascript"}}}}),a.languages.javadoclike.addSupport("javascript",a.languages.jsdoc)}(r)}return zS}var US,RD;function DA(){if(RD)return US;RD=1,US=e,e.displayName="json",e.aliases=["webmanifest"];function e(t){t.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},t.languages.webmanifest=t.languages.json}return US}var BS,ND;function Jye(){if(ND)return BS;ND=1;var e=DA();BS=t,t.displayName="json5",t.aliases=[];function t(n){n.register(e),function(r){var a=/("|')(?:\\(?:\r\n?|\n|.)|(?!\1)[^\\\r\n])*\1/;r.languages.json5=r.languages.extend("json",{property:[{pattern:RegExp(a.source+"(?=\\s*:)"),greedy:!0},{pattern:/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/,alias:"unquoted"}],string:{pattern:a,greedy:!0},number:/[+-]?\b(?:NaN|Infinity|0x[a-fA-F\d]+)\b|[+-]?(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+\b)?/})}(n)}return BS}var HS,ID;function eve(){if(ID)return HS;ID=1;var e=DA();HS=t,t.displayName="jsonp",t.aliases=[];function t(n){n.register(e),n.languages.jsonp=n.languages.extend("json",{punctuation:/[{}[\]();,.]/}),n.languages.insertBefore("jsonp","punctuation",{function:/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*\()/})}return HS}var VS,OD;function tve(){if(OD)return VS;OD=1,VS=e,e.displayName="jsstacktrace",e.aliases=[];function e(t){t.languages.jsstacktrace={"error-message":{pattern:/^\S.*/m,alias:"string"},"stack-frame":{pattern:/(^[ \t]+)at[ \t].*/m,lookbehind:!0,inside:{"not-my-code":{pattern:/^at[ \t]+(?!\s)(?:node\.js||.*(?:node_modules|\(\)|\(|$|\(internal\/|\(node\.js)).*/m,alias:"comment"},filename:{pattern:/(\bat\s+(?!\s)|\()(?:[a-zA-Z]:)?[^():]+(?=:)/,lookbehind:!0,alias:"url"},function:{pattern:/(\bat\s+(?:new\s+)?)(?!\s)[_$a-zA-Z\xA0-\uFFFF<][.$\w\xA0-\uFFFF<>]*/,lookbehind:!0,inside:{punctuation:/\./}},punctuation:/[()]/,keyword:/\b(?:at|new)\b/,alias:{pattern:/\[(?:as\s+)?(?!\s)[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\]/,alias:"variable"},"line-number":{pattern:/:\d+(?::\d+)?\b/,alias:"number",inside:{punctuation:/:/}}}}}}return VS}var qS,DD;function sz(){if(DD)return qS;DD=1,qS=e,e.displayName="jsx",e.aliases=[];function e(t){(function(n){var r=n.util.clone(n.languages.javascript),a=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,o=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,i=/(?:\{*\.{3}(?:[^{}]|)*\})/.source;function s(u,d){return u=u.replace(//g,function(){return a}).replace(//g,function(){return o}).replace(//g,function(){return i}),RegExp(u,d)}i=s(i).source,n.languages.jsx=n.languages.extend("markup",r),n.languages.jsx.tag.pattern=s(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),n.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,n.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,n.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,n.languages.jsx.tag.inside.comment=r.comment,n.languages.insertBefore("inside","attr-name",{spread:{pattern:s(//.source),inside:n.languages.jsx}},n.languages.jsx.tag),n.languages.insertBefore("inside","special-attr",{script:{pattern:s(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:n.languages.jsx}}},n.languages.jsx.tag);var l=function(u){return u?typeof u=="string"?u:typeof u.content=="string"?u.content:u.content.map(l).join(""):""},c=function(u){for(var d=[],g=0;g0&&d[d.length-1].tagName===l(m.content[0].content[1])&&d.pop():m.content[m.content.length-1].content==="/>"||d.push({tagName:l(m.content[0].content[1]),openedBraces:0}):d.length>0&&m.type==="punctuation"&&m.content==="{"?d[d.length-1].openedBraces++:d.length>0&&d[d.length-1].openedBraces>0&&m.type==="punctuation"&&m.content==="}"?d[d.length-1].openedBraces--:b=!0),(b||typeof m=="string")&&d.length>0&&d[d.length-1].openedBraces===0){var y=l(m);g0&&(typeof u[g-1]=="string"||u[g-1].type==="plain-text")&&(y=l(u[g-1])+y,u.splice(g-1,1),g--),u[g]=new n.Token("plain-text",y,null,y)}m.content&&typeof m.content!="string"&&c(m.content)}};n.hooks.add("after-tokenize",function(u){u.language!=="jsx"&&u.language!=="tsx"||c(u.tokens)})})(t)}return qS}var GS,LD;function nve(){if(LD)return GS;LD=1,GS=e,e.displayName="julia",e.aliases=[];function e(t){t.languages.julia={comment:{pattern:/(^|[^\\])(?:#=(?:[^#=]|=(?!#)|#(?!=)|#=(?:[^#=]|=(?!#)|#(?!=))*=#)*=#|#.*)/,lookbehind:!0},regex:{pattern:/r"(?:\\.|[^"\\\r\n])*"[imsx]{0,4}/,greedy:!0},string:{pattern:/"""[\s\S]+?"""|(?:\b\w+)?"(?:\\.|[^"\\\r\n])*"|`(?:[^\\`\r\n]|\\.)*`/,greedy:!0},char:{pattern:/(^|[^\w'])'(?:\\[^\r\n][^'\r\n]*|[^\\\r\n])'/,lookbehind:!0,greedy:!0},keyword:/\b(?:abstract|baremodule|begin|bitstype|break|catch|ccall|const|continue|do|else|elseif|end|export|finally|for|function|global|if|immutable|import|importall|in|let|local|macro|module|print|println|quote|return|struct|try|type|typealias|using|while)\b/,boolean:/\b(?:false|true)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[box])?(?:[\da-f]+(?:_[\da-f]+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[efp][+-]?\d+(?:_\d+)*)?j?/i,operator:/&&|\|\||[-+*^%÷⊻&$\\]=?|\/[\/=]?|!=?=?|\|[=>]?|<(?:<=?|[=:|])?|>(?:=|>>?=?)?|==?=?|[~≠≤≥'√∛]/,punctuation:/::?|[{}[\]();,.?]/,constant:/\b(?:(?:Inf|NaN)(?:16|32|64)?|im|pi)\b|[πℯ]/}}return GS}var WS,MD;function rve(){if(MD)return WS;MD=1,WS=e,e.displayName="keepalived",e.aliases=[];function e(t){t.languages.keepalived={comment:{pattern:/[#!].*/,greedy:!0},string:{pattern:/(^|[^\\])(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/,lookbehind:!0,greedy:!0},ip:{pattern:RegExp(/\b(?:(?:(?:[\da-f]{1,4}:){7}[\da-f]{1,4}|(?:[\da-f]{1,4}:){6}:[\da-f]{1,4}|(?:[\da-f]{1,4}:){5}:(?:[\da-f]{1,4}:)?[\da-f]{1,4}|(?:[\da-f]{1,4}:){4}:(?:[\da-f]{1,4}:){0,2}[\da-f]{1,4}|(?:[\da-f]{1,4}:){3}:(?:[\da-f]{1,4}:){0,3}[\da-f]{1,4}|(?:[\da-f]{1,4}:){2}:(?:[\da-f]{1,4}:){0,4}[\da-f]{1,4}|(?:[\da-f]{1,4}:){6}|(?:[\da-f]{1,4}:){0,5}:|::(?:[\da-f]{1,4}:){0,5}|[\da-f]{1,4}::(?:[\da-f]{1,4}:){0,5}[\da-f]{1,4}|::(?:[\da-f]{1,4}:){0,6}[\da-f]{1,4}|(?:[\da-f]{1,4}:){1,7}:)(?:\/\d{1,3})?|(?:\/\d{1,2})?)\b/.source.replace(//g,function(){return/(?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d))/.source}),"i"),alias:"number"},path:{pattern:/(\s)\/(?:[^\/\s]+\/)*[^\/\s]*|\b[a-zA-Z]:\\(?:[^\\\s]+\\)*[^\\\s]*/,lookbehind:!0,alias:"string"},variable:/\$\{?\w+\}?/,email:{pattern:/[\w-]+@[\w-]+(?:\.[\w-]{2,3}){1,2}/,alias:"string"},"conditional-configuration":{pattern:/@\^?[\w-]+/,alias:"variable"},operator:/=/,property:/\b(?:BFD_CHECK|DNS_CHECK|FILE_CHECK|HTTP_GET|MISC_CHECK|NAME|PING_CHECK|SCRIPTS|SMTP_CHECK|SSL|SSL_GET|TCP_CHECK|UDP_CHECK|accept|advert_int|alpha|auth_pass|auth_type|authentication|bfd_cpu_affinity|bfd_instance|bfd_no_swap|bfd_priority|bfd_process_name|bfd_rlimit_rttime|bfd_rt_priority|bind_if|bind_port|bindto|ca|certificate|check_unicast_src|checker|checker_cpu_affinity|checker_log_all_failures|checker_no_swap|checker_priority|checker_rlimit_rttime|checker_rt_priority|child_wait_time|connect_ip|connect_port|connect_timeout|dbus_service_name|debug|default_interface|delay|delay_before_retry|delay_loop|digest|dont_track_primary|dynamic|dynamic_interfaces|enable_(?:dbus|script_security|sni|snmp_checker|snmp_rfc|snmp_rfcv2|snmp_rfcv3|snmp_vrrp|traps)|end|fall|fast_recovery|file|flag-[123]|fork_delay|full_command|fwmark|garp_group|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|global_defs|global_tracking|gna_interval|group|ha_suspend|hashed|helo_name|higher_prio_send_advert|hoplimit|http_protocol|hysteresis|idle_tx|include|inhibit_on_failure|init_fail|init_file|instance|interface|interfaces|interval|ip_family|ipvs_process_name|keepalived.conf|kernel_rx_buf_size|key|linkbeat_interfaces|linkbeat_use_polling|log_all_failures|log_unknown_vrids|lower_prio_no_advert|lthreshold|lvs_flush|lvs_flush_onstop|lvs_method|lvs_netlink_cmd_rcv_bufs|lvs_netlink_cmd_rcv_bufs_force|lvs_netlink_monitor_rcv_bufs|lvs_netlink_monitor_rcv_bufs_force|lvs_notify_fifo|lvs_notify_fifo_script|lvs_sched|lvs_sync_daemon|max_auto_priority|max_hops|mcast_src_ip|mh-fallback|mh-port|min_auto_priority_delay|min_rx|min_tx|misc_dynamic|misc_path|misc_timeout|multiplier|name|namespace_with_ipsets|native_ipv6|neighbor_ip|net_namespace|net_namespace_ipvs|nftables|nftables_counters|nftables_ifindex|nftables_priority|no_accept|no_checker_emails|no_email_faults|nopreempt|notification_email|notification_email_from|notify|notify_backup|notify_deleted|notify_down|notify_fault|notify_fifo|notify_fifo_script|notify_master|notify_master_rx_lower_pri|notify_priority_changes|notify_stop|notify_up|old_unicast_checksum|omega|ops|param_match|passive|password|path|persistence_engine|persistence_granularity|persistence_timeout|preempt|preempt_delay|priority|process|process_monitor_rcv_bufs|process_monitor_rcv_bufs_force|process_name|process_names|promote_secondaries|protocol|proxy_arp|proxy_arp_pvlan|quorum|quorum_down|quorum_max|quorum_up|random_seed|real_server|regex|regex_max_offset|regex_min_offset|regex_no_match|regex_options|regex_stack|reload_repeat|reload_time_file|require_reply|retry|rise|router_id|rs_init_notifies|script|script_user|sh-fallback|sh-port|shutdown_script|shutdown_script_timeout|skip_check_adv_addr|smtp_alert|smtp_alert_checker|smtp_alert_vrrp|smtp_connect_timeout|smtp_helo_name|smtp_server|snmp_socket|sorry_server|sorry_server_inhibit|sorry_server_lvs_method|source_ip|start|startup_script|startup_script_timeout|state|static_ipaddress|static_routes|static_rules|status_code|step|strict_mode|sync_group_tracking_weight|terminate_delay|timeout|track_bfd|track_file|track_group|track_interface|track_process|track_script|track_src_ip|ttl|type|umask|unicast_peer|unicast_src_ip|unicast_ttl|url|use_ipvlan|use_pid_dir|use_vmac|user|uthreshold|val[123]|version|virtual_ipaddress|virtual_ipaddress_excluded|virtual_router_id|virtual_routes|virtual_rules|virtual_server|virtual_server_group|virtualhost|vmac_xmit_base|vrrp|vrrp_(?:check_unicast_src|cpu_affinity|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|gna_interval|higher_prio_send_advert|instance|ipsets|iptables|lower_prio_no_advert|mcast_group4|mcast_group6|min_garp|netlink_cmd_rcv_bufs|netlink_cmd_rcv_bufs_force|netlink_monitor_rcv_bufs|netlink_monitor_rcv_bufs_force|no_swap|notify_fifo|notify_fifo_script|notify_priority_changes|priority|process_name|rlimit_rttime|rt_priority|rx_bufs_multiplier|rx_bufs_policy|script|skip_check_adv_addr|startup_delay|strict|sync_group|track_process|version)|warmup|weight)\b/,constant:/\b(?:A|AAAA|AH|BACKUP|CNAME|DR|MASTER|MX|NAT|NS|PASS|SCTP|SOA|TCP|TUN|TXT|UDP|dh|fo|lblc|lblcr|lc|mh|nq|ovf|rr|sed|sh|wlc|wrr)\b/,number:{pattern:/(^|[^\w.-])-?\d+(?:\.\d+)?/,lookbehind:!0},boolean:/\b(?:false|no|off|on|true|yes)\b/,punctuation:/[\{\}]/}}return WS}var KS,PD;function ave(){if(PD)return KS;PD=1,KS=e,e.displayName="keyman",e.aliases=[];function e(t){t.languages.keyman={comment:{pattern:/\bc .*/i,greedy:!0},string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,greedy:!0},"virtual-key":{pattern:/\[\s*(?:(?:ALT|CAPS|CTRL|LALT|LCTRL|NCAPS|RALT|RCTRL|SHIFT)\s+)*(?:[TKU]_[\w?]+|[A-E]\d\d?|"[^"\r\n]*"|'[^'\r\n]*')\s*\]/i,greedy:!0,alias:"function"},"header-keyword":{pattern:/&\w+/,alias:"bold"},"header-statement":{pattern:/\b(?:bitmap|bitmaps|caps always off|caps on only|copyright|hotkey|language|layout|message|name|shift frees caps|version)\b/i,alias:"bold"},"rule-keyword":{pattern:/\b(?:any|baselayout|beep|call|context|deadkey|dk|if|index|layer|notany|nul|outs|platform|reset|return|save|set|store|use)\b/i,alias:"keyword"},"structural-keyword":{pattern:/\b(?:ansi|begin|group|match|nomatch|unicode|using keys)\b/i,alias:"keyword"},"compile-target":{pattern:/\$(?:keyman|keymanonly|keymanweb|kmfl|weaver):/i,alias:"property"},number:/\b(?:U\+[\dA-F]+|d\d+|x[\da-f]+|\d+)\b/i,operator:/[+>\\$]|\.\./,punctuation:/[()=,]/}}return KS}var YS,$D;function ove(){if($D)return YS;$D=1,YS=e,e.displayName="kotlin",e.aliases=["kt","kts"];function e(t){(function(n){n.languages.kotlin=n.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete n.languages.kotlin["class-name"];var r={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:n.languages.kotlin}};n.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:r},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:r},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete n.languages.kotlin.string,n.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),n.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),n.languages.kt=n.languages.kotlin,n.languages.kts=n.languages.kotlin})(t)}return YS}var ZS,FD;function ive(){if(FD)return ZS;FD=1,ZS=e,e.displayName="kumir",e.aliases=["kum"];function e(t){(function(n){var r=/\s\x00-\x1f\x22-\x2f\x3a-\x3f\x5b-\x5e\x60\x7b-\x7e/.source;function a(o,i){return RegExp(o.replace(//g,r),i)}n.languages.kumir={comment:{pattern:/\|.*/},prolog:{pattern:/#.*/,greedy:!0},string:{pattern:/"[^\n\r"]*"|'[^\n\r']*'/,greedy:!0},boolean:{pattern:a(/(^|[])(?:да|нет)(?=[]|$)/.source),lookbehind:!0},"operator-word":{pattern:a(/(^|[])(?:и|или|не)(?=[]|$)/.source),lookbehind:!0,alias:"keyword"},"system-variable":{pattern:a(/(^|[])знач(?=[]|$)/.source),lookbehind:!0,alias:"keyword"},type:[{pattern:a(/(^|[])(?:вещ|лит|лог|сим|цел)(?:\x20*таб)?(?=[]|$)/.source),lookbehind:!0,alias:"builtin"},{pattern:a(/(^|[])(?:компл|сканкод|файл|цвет)(?=[]|$)/.source),lookbehind:!0,alias:"important"}],keyword:{pattern:a(/(^|[])(?:алг|арг(?:\x20*рез)?|ввод|ВКЛЮЧИТЬ|вс[её]|выбор|вывод|выход|дано|для|до|дс|если|иначе|исп|использовать|кон(?:(?:\x20+|_)исп)?|кц(?:(?:\x20+|_)при)?|надо|нач|нс|нц|от|пауза|пока|при|раза?|рез|стоп|таб|то|утв|шаг)(?=[]|$)/.source),lookbehind:!0},name:{pattern:a(/(^|[])[^\d][^]*(?:\x20+[^]+)*(?=[]|$)/.source),lookbehind:!0},number:{pattern:a(/(^|[])(?:\B\$[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)(?=[]|$)/.source,"i"),lookbehind:!0},punctuation:/:=|[(),:;\[\]]/,"operator-char":{pattern:/\*\*?|<[=>]?|>=?|[-+/=]/,alias:"operator"}},n.languages.kum=n.languages.kumir})(t)}return ZS}var XS,jD;function sve(){if(jD)return XS;jD=1,XS=e,e.displayName="kusto",e.aliases=[];function e(t){t.languages.kusto={comment:{pattern:/\/\/.*/,greedy:!0},string:{pattern:/```[\s\S]*?```|[hH]?(?:"(?:[^\r\n\\"]|\\.)*"|'(?:[^\r\n\\']|\\.)*'|@(?:"[^\r\n"]*"|'[^\r\n']*'))/,greedy:!0},verb:{pattern:/(\|\s*)[a-z][\w-]*/i,lookbehind:!0,alias:"keyword"},command:{pattern:/\.[a-z][a-z\d-]*\b/,alias:"keyword"},"class-name":/\b(?:bool|datetime|decimal|dynamic|guid|int|long|real|string|timespan)\b/,keyword:/\b(?:access|alias|and|anti|as|asc|auto|between|by|(?:contains|(?:ends|starts)with|has(?:perfix|suffix)?)(?:_cs)?|database|declare|desc|external|from|fullouter|has_all|in|ingestion|inline|inner|innerunique|into|(?:left|right)(?:anti(?:semi)?|inner|outer|semi)?|let|like|local|not|of|on|or|pattern|print|query_parameters|range|restrict|schema|set|step|table|tables|to|view|where|with|matches\s+regex|nulls\s+(?:first|last))(?![\w-])/,boolean:/\b(?:false|null|true)\b/,function:/\b[a-z_]\w*(?=\s*\()/,datetime:[{pattern:/\b(?:(?:Fri|Friday|Mon|Monday|Sat|Saturday|Sun|Sunday|Thu|Thursday|Tue|Tuesday|Wed|Wednesday)\s*,\s*)?\d{1,2}(?:\s+|-)(?:Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)(?:\s+|-)\d{2}\s+\d{2}:\d{2}(?::\d{2})?(?:\s*(?:\b(?:[A-Z]|(?:[ECMT][DS]|GM|U)T)|[+-]\d{4}))?\b/,alias:"number"},{pattern:/[+-]?\b(?:\d{4}-\d{2}-\d{2}(?:[ T]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?)?|\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?)Z?/,alias:"number"}],number:/\b(?:0x[0-9A-Fa-f]+|\d+(?:\.\d+)?(?:[Ee][+-]?\d+)?)(?:(?:min|sec|[mnµ]s|[dhms]|microsecond|tick)\b)?|[+-]?\binf\b/,operator:/=>|[!=]~|[!=<>]=?|[-+*/%|]|\.\./,punctuation:/[()\[\]{},;.:]/}}return XS}var QS,zD;function lve(){if(zD)return QS;zD=1,QS=e,e.displayName="latex",e.aliases=["tex","context"];function e(t){(function(n){var r=/\\(?:[^a-z()[\]]|[a-z*]+)/i,a={"equation-command":{pattern:r,alias:"regex"}};n.languages.latex={comment:/%.*/,cdata:{pattern:/(\\begin\{((?:lstlisting|verbatim)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0},equation:[{pattern:/\$\$(?:\\[\s\S]|[^\\$])+\$\$|\$(?:\\[\s\S]|[^\\$])+\$|\\\([\s\S]*?\\\)|\\\[[\s\S]*?\\\]/,inside:a,alias:"string"},{pattern:/(\\begin\{((?:align|eqnarray|equation|gather|math|multline)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0,inside:a,alias:"string"}],keyword:{pattern:/(\\(?:begin|cite|documentclass|end|label|ref|usepackage)(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0},url:{pattern:/(\\url\{)[^}]+(?=\})/,lookbehind:!0},headline:{pattern:/(\\(?:chapter|frametitle|paragraph|part|section|subparagraph|subsection|subsubparagraph|subsubsection|subsubsubparagraph)\*?(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0,alias:"class-name"},function:{pattern:r,alias:"selector"},punctuation:/[[\]{}&]/},n.languages.tex=n.languages.latex,n.languages.context=n.languages.latex})(t)}return QS}var JS,UD;function Nh(){if(UD)return JS;UD=1;var e=mr();JS=t,t.displayName="php",t.aliases=[];function t(n){n.register(e),function(r){var a=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,o=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],i=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,s=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,l=/[{}\[\](),:;]/;r.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:a,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:o,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:i,operator:s,punctuation:l};var c={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:r.languages.php},u=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:c}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:c}}];r.languages.insertBefore("php","variable",{string:u,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:a,string:u,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:o,number:i,operator:s,punctuation:l}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),r.hooks.add("before-tokenize",function(d){if(/<\?/.test(d.code)){var g=/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g;r.languages["markup-templating"].buildPlaceholders(d,"php",g)}}),r.hooks.add("after-tokenize",function(d){r.languages["markup-templating"].tokenizePlaceholders(d,"php")})}(n)}return JS}var ew,BD;function cve(){if(BD)return ew;BD=1;var e=mr(),t=Nh();ew=n,n.displayName="latte",n.aliases=[];function n(r){r.register(e),r.register(t),function(a){a.languages.latte={comment:/^\{\*[\s\S]*/,"latte-tag":{pattern:/(^\{(?:\/(?=[a-z]))?)(?:[=_]|[a-z]\w*\b(?!\())/i,lookbehind:!0,alias:"important"},delimiter:{pattern:/^\{\/?|\}$/,alias:"punctuation"},php:{pattern:/\S(?:[\s\S]*\S)?/,alias:"language-php",inside:a.languages.php}};var o=a.languages.extend("markup",{});a.languages.insertBefore("inside","attr-value",{"n-attr":{pattern:/n:[\w-]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+))?/,inside:{"attr-name":{pattern:/^[^\s=]+/,alias:"important"},"attr-value":{pattern:/=[\s\S]+/,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}],php:{pattern:/\S(?:[\s\S]*\S)?/,inside:a.languages.php}}}}}},o.tag),a.hooks.add("before-tokenize",function(i){if(i.language==="latte"){var s=/\{\*[\s\S]*?\*\}|\{[^'"\s{}*](?:[^"'/{}]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|\/\*(?:[^*]|\*(?!\/))*\*\/)*\}/g;a.languages["markup-templating"].buildPlaceholders(i,"latte",s),i.grammar=o}}),a.hooks.add("after-tokenize",function(i){a.languages["markup-templating"].tokenizePlaceholders(i,"latte")})}(r)}return ew}var tw,HD;function uve(){if(HD)return tw;HD=1,tw=e,e.displayName="less",e.aliases=[];function e(t){t.languages.less=t.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),t.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}})}return tw}var nw,VD;function LA(){if(VD)return nw;VD=1,nw=e,e.displayName="scheme",e.aliases=[];function e(t){(function(n){n.languages.scheme={comment:/;.*|#;\s*(?:\((?:[^()]|\([^()]*\))*\)|\[(?:[^\[\]]|\[[^\[\]]*\])*\])|#\|(?:[^#|]|#(?!\|)|\|(?!#)|#\|(?:[^#|]|#(?!\|)|\|(?!#))*\|#)*\|#/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},symbol:{pattern:/'[^()\[\]#'\s]+/,greedy:!0},char:{pattern:/#\\(?:[ux][a-fA-F\d]+\b|[-a-zA-Z]+\b|[\uD800-\uDBFF][\uDC00-\uDFFF]|\S)/,greedy:!0},"lambda-parameter":[{pattern:/((?:^|[^'`#])[(\[]lambda\s+)(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)/,lookbehind:!0},{pattern:/((?:^|[^'`#])[(\[]lambda\s+[(\[])[^()\[\]']+/,lookbehind:!0}],keyword:{pattern:/((?:^|[^'`#])[(\[])(?:begin|case(?:-lambda)?|cond(?:-expand)?|define(?:-library|-macro|-record-type|-syntax|-values)?|defmacro|delay(?:-force)?|do|else|except|export|guard|if|import|include(?:-ci|-library-declarations)?|lambda|let(?:rec)?(?:-syntax|-values|\*)?|let\*-values|only|parameterize|prefix|(?:quasi-?)?quote|rename|set!|syntax-(?:case|rules)|unless|unquote(?:-splicing)?|when)(?=[()\[\]\s]|$)/,lookbehind:!0},builtin:{pattern:/((?:^|[^'`#])[(\[])(?:abs|and|append|apply|assoc|ass[qv]|binary-port\?|boolean=?\?|bytevector(?:-append|-copy|-copy!|-length|-u8-ref|-u8-set!|\?)?|caar|cadr|call-with-(?:current-continuation|port|values)|call\/cc|car|cdar|cddr|cdr|ceiling|char(?:->integer|-ready\?|\?|<\?|<=\?|=\?|>\?|>=\?)|close-(?:input-port|output-port|port)|complex\?|cons|current-(?:error|input|output)-port|denominator|dynamic-wind|eof-object\??|eq\?|equal\?|eqv\?|error|error-object(?:-irritants|-message|\?)|eval|even\?|exact(?:-integer-sqrt|-integer\?|\?)?|expt|features|file-error\?|floor(?:-quotient|-remainder|\/)?|flush-output-port|for-each|gcd|get-output-(?:bytevector|string)|inexact\??|input-port(?:-open\?|\?)|integer(?:->char|\?)|lcm|length|list(?:->string|->vector|-copy|-ref|-set!|-tail|\?)?|make-(?:bytevector|list|parameter|string|vector)|map|max|member|memq|memv|min|modulo|negative\?|newline|not|null\?|number(?:->string|\?)|numerator|odd\?|open-(?:input|output)-(?:bytevector|string)|or|output-port(?:-open\?|\?)|pair\?|peek-char|peek-u8|port\?|positive\?|procedure\?|quotient|raise|raise-continuable|rational\?|rationalize|read-(?:bytevector|bytevector!|char|error\?|line|string|u8)|real\?|remainder|reverse|round|set-c[ad]r!|square|string(?:->list|->number|->symbol|->utf8|->vector|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?|<\?|<=\?|=\?|>\?|>=\?)?|substring|symbol(?:->string|\?|=\?)|syntax-error|textual-port\?|truncate(?:-quotient|-remainder|\/)?|u8-ready\?|utf8->string|values|vector(?:->list|->string|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?)?|with-exception-handler|write-(?:bytevector|char|string|u8)|zero\?)(?=[()\[\]\s]|$)/,lookbehind:!0},operator:{pattern:/((?:^|[^'`#])[(\[])(?:[-+*%/]|[<>]=?|=>?)(?=[()\[\]\s]|$)/,lookbehind:!0},number:{pattern:RegExp(r({"":/\d+(?:\/\d+)|(?:\d+(?:\.\d*)?|\.\d+)(?:[esfdl][+-]?\d+)?/.source,"":/[+-]?|[+-](?:inf|nan)\.0/.source,"":/[+-](?:|(?:inf|nan)\.0)?i/.source,"":/(?:@|)?|/.source,"":/(?:#d(?:#[ei])?|#[ei](?:#d)?)?/.source,"":/[0-9a-f]+(?:\/[0-9a-f]+)?/.source,"":/[+-]?|[+-](?:inf|nan)\.0/.source,"":/[+-](?:|(?:inf|nan)\.0)?i/.source,"":/(?:@|)?|/.source,"":/#[box](?:#[ei])?|(?:#[ei])?#[box]/.source,"":/(^|[()\[\]\s])(?:|)(?=[()\[\]\s]|$)/.source}),"i"),lookbehind:!0},boolean:{pattern:/(^|[()\[\]\s])#(?:[ft]|false|true)(?=[()\[\]\s]|$)/,lookbehind:!0},function:{pattern:/((?:^|[^'`#])[(\[])(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)(?=[()\[\]\s]|$)/,lookbehind:!0},identifier:{pattern:/(^|[()\[\]\s])\|(?:[^\\|]|\\.)*\|(?=[()\[\]\s]|$)/,lookbehind:!0,greedy:!0},punctuation:/[()\[\]']/};function r(a){for(var o in a)a[o]=a[o].replace(/<[\w\s]+>/g,function(i){return"(?:"+a[i].trim()+")"});return a[o]}})(t)}return nw}var rw,qD;function dve(){if(qD)return rw;qD=1;var e=LA();rw=t,t.displayName="lilypond",t.aliases=[];function t(n){n.register(e),function(r){for(var a=/\((?:[^();"#\\]|\\[\s\S]|;.*(?!.)|"(?:[^"\\]|\\.)*"|#(?:\{(?:(?!#\})[\s\S])*#\}|[^{])|)*\)/.source,o=5,i=0;i/g,function(){return a});a=a.replace(//g,/[^\s\S]/.source);var s=r.languages.lilypond={comment:/%(?:(?!\{).*|\{[\s\S]*?%\})/,"embedded-scheme":{pattern:RegExp(/(^|[=\s])#(?:"(?:[^"\\]|\\.)*"|[^\s()"]*(?:[^\s()]|))/.source.replace(//g,function(){return a}),"m"),lookbehind:!0,greedy:!0,inside:{scheme:{pattern:/^(#)[\s\S]+$/,lookbehind:!0,alias:"language-scheme",inside:{"embedded-lilypond":{pattern:/#\{[\s\S]*?#\}/,greedy:!0,inside:{punctuation:/^#\{|#\}$/,lilypond:{pattern:/[\s\S]+/,alias:"language-lilypond",inside:null}}},rest:r.languages.scheme}},punctuation:/#/}},string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},"class-name":{pattern:/(\\new\s+)[\w-]+/,lookbehind:!0},keyword:{pattern:/\\[a-z][-\w]*/i,inside:{punctuation:/^\\/}},operator:/[=|]|<<|>>/,punctuation:{pattern:/(^|[a-z\d])(?:'+|,+|[_^]?-[_^]?(?:[-+^!>._]|(?=\d))|[_^]\.?|[.!])|[{}()[\]<>^~]|\\[()[\]<>\\!]|--|__/,lookbehind:!0},number:/\b\d+(?:\/\d+)?\b/};s["embedded-scheme"].inside.scheme.inside["embedded-lilypond"].inside.lilypond.inside=s,r.languages.ly=s}(n)}return rw}var aw,GD;function fve(){if(GD)return aw;GD=1;var e=mr();aw=t,t.displayName="liquid",t.aliases=[];function t(n){n.register(e),n.languages.liquid={comment:{pattern:/(^\{%\s*comment\s*%\})[\s\S]+(?=\{%\s*endcomment\s*%\}$)/,lookbehind:!0},delimiter:{pattern:/^\{(?:\{\{|[%\{])-?|-?(?:\}\}|[%\}])\}$/,alias:"punctuation"},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},keyword:/\b(?:as|assign|break|(?:end)?(?:capture|case|comment|for|form|if|paginate|raw|style|tablerow|unless)|continue|cycle|decrement|echo|else|elsif|in|include|increment|limit|liquid|offset|range|render|reversed|section|when|with)\b/,object:/\b(?:address|all_country_option_tags|article|block|blog|cart|checkout|collection|color|country|country_option_tags|currency|current_page|current_tags|customer|customer_address|date|discount_allocation|discount_application|external_video|filter|filter_value|font|forloop|fulfillment|generic_file|gift_card|group|handle|image|line_item|link|linklist|localization|location|measurement|media|metafield|model|model_source|order|page|page_description|page_image|page_title|part|policy|product|product_option|recommendations|request|robots|routes|rule|script|search|selling_plan|selling_plan_allocation|selling_plan_group|shipping_method|shop|shop_locale|sitemap|store_availability|tax_line|template|theme|transaction|unit_price_measurement|user_agent|variant|video|video_source)\b/,function:[{pattern:/(\|\s*)\w+/,lookbehind:!0,alias:"filter"},{pattern:/(\.\s*)(?:first|last|size)/,lookbehind:!0}],boolean:/\b(?:false|nil|true)\b/,range:{pattern:/\.\./,alias:"operator"},number:/\b\d+(?:\.\d+)?\b/,operator:/[!=]=|<>|[<>]=?|[|?:=-]|\b(?:and|contains(?=\s)|or)\b/,punctuation:/[.,\[\]()]/,empty:{pattern:/\bempty\b/,alias:"keyword"}},n.hooks.add("before-tokenize",function(r){var a=/\{%\s*comment\s*%\}[\s\S]*?\{%\s*endcomment\s*%\}|\{(?:%[\s\S]*?%|\{\{[\s\S]*?\}\}|\{[\s\S]*?\})\}/g,o=!1;n.languages["markup-templating"].buildPlaceholders(r,"liquid",a,function(i){var s=/^\{%-?\s*(\w+)/.exec(i);if(s){var l=s[1];if(l==="raw"&&!o)return o=!0,!0;if(l==="endraw")return o=!1,!0}return!o})}),n.hooks.add("after-tokenize",function(r){n.languages["markup-templating"].tokenizePlaceholders(r,"liquid")})}return aw}var ow,WD;function pve(){if(WD)return ow;WD=1,ow=e,e.displayName="lisp",e.aliases=[];function e(t){(function(n){function r(y){return RegExp(/(\()/.source+"(?:"+y+")"+/(?=[\s\)])/.source)}function a(y){return RegExp(/([\s([])/.source+"(?:"+y+")"+/(?=[\s)])/.source)}var o=/(?!\d)[-+*/~!@$%^=<>{}\w]+/.source,i="&"+o,s="(\\()",l="(?=\\))",c="(?=\\s)",u=/(?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\([^()]*\))*\))*\))*\))*\))*/.source,d={heading:{pattern:/;;;.*/,alias:["comment","title"]},comment:/;.*/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0,inside:{argument:/[-A-Z]+(?=[.,\s])/,symbol:RegExp("`"+o+"'")}},"quoted-symbol":{pattern:RegExp("#?'"+o),alias:["variable","symbol"]},"lisp-property":{pattern:RegExp(":"+o),alias:"property"},splice:{pattern:RegExp(",@?"+o),alias:["symbol","variable"]},keyword:[{pattern:RegExp(s+"(?:and|(?:cl-)?letf|cl-loop|cond|cons|error|if|(?:lexical-)?let\\*?|message|not|null|or|provide|require|setq|unless|use-package|when|while)"+c),lookbehind:!0},{pattern:RegExp(s+"(?:append|by|collect|concat|do|finally|for|in|return)"+c),lookbehind:!0}],declare:{pattern:r(/declare/.source),lookbehind:!0,alias:"keyword"},interactive:{pattern:r(/interactive/.source),lookbehind:!0,alias:"keyword"},boolean:{pattern:a(/nil|t/.source),lookbehind:!0},number:{pattern:a(/[-+]?\d+(?:\.\d*)?/.source),lookbehind:!0},defvar:{pattern:RegExp(s+"def(?:const|custom|group|var)\\s+"+o),lookbehind:!0,inside:{keyword:/^def[a-z]+/,variable:RegExp(o)}},defun:{pattern:RegExp(s+/(?:cl-)?(?:defmacro|defun\*?)\s+/.source+o+/\s+\(/.source+u+/\)/.source),lookbehind:!0,greedy:!0,inside:{keyword:/^(?:cl-)?def\S+/,arguments:null,function:{pattern:RegExp("(^\\s)"+o),lookbehind:!0},punctuation:/[()]/}},lambda:{pattern:RegExp(s+"lambda\\s+\\(\\s*(?:&?"+o+"(?:\\s+&?"+o+")*\\s*)?\\)"),lookbehind:!0,greedy:!0,inside:{keyword:/^lambda/,arguments:null,punctuation:/[()]/}},car:{pattern:RegExp(s+o),lookbehind:!0},punctuation:[/(?:['`,]?\(|[)\[\]])/,{pattern:/(\s)\.(?=\s)/,lookbehind:!0}]},g={"lisp-marker":RegExp(i),varform:{pattern:RegExp(/\(/.source+o+/\s+(?=\S)/.source+u+/\)/.source),inside:d},argument:{pattern:RegExp(/(^|[\s(])/.source+o),lookbehind:!0,alias:"variable"},rest:d},m="\\S+(?:\\s+\\S+)*",b={pattern:RegExp(s+u+l),lookbehind:!0,inside:{"rest-vars":{pattern:RegExp("&(?:body|rest)\\s+"+m),inside:g},"other-marker-vars":{pattern:RegExp("&(?:aux|optional)\\s+"+m),inside:g},keys:{pattern:RegExp("&key\\s+"+m+"(?:\\s+&allow-other-keys)?"),inside:g},argument:{pattern:RegExp(o),alias:"variable"},punctuation:/[()]/}};d.lambda.inside.arguments=b,d.defun.inside.arguments=n.util.clone(b),d.defun.inside.arguments.inside.sublist=b,n.languages.lisp=d,n.languages.elisp=d,n.languages.emacs=d,n.languages["emacs-lisp"]=d})(t)}return ow}var iw,KD;function gve(){if(KD)return iw;KD=1,iw=e,e.displayName="livescript",e.aliases=[];function e(t){t.languages.livescript={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\])#.*/,lookbehind:!0}],"interpolated-string":{pattern:/(^|[^"])("""|")(?:\\[\s\S]|(?!\2)[^\\])*\2(?!")/,lookbehind:!0,greedy:!0,inside:{variable:{pattern:/(^|[^\\])#[a-z_](?:-?[a-z]|[\d_])*/m,lookbehind:!0},interpolation:{pattern:/(^|[^\\])#\{[^}]+\}/m,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^#\{|\}$/,alias:"variable"}}},string:/[\s\S]+/}},string:[{pattern:/('''|')(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},{pattern:/<\[[\s\S]*?\]>/,greedy:!0},/\\[^\s,;\])}]+/],regex:[{pattern:/\/\/(?:\[[^\r\n\]]*\]|\\.|(?!\/\/)[^\\\[])+\/\/[gimyu]{0,5}/,greedy:!0,inside:{comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0}}},{pattern:/\/(?:\[[^\r\n\]]*\]|\\.|[^/\\\r\n\[])+\/[gimyu]{0,5}/,greedy:!0}],keyword:{pattern:/(^|(?!-).)\b(?:break|case|catch|class|const|continue|default|do|else|extends|fallthrough|finally|for(?: ever)?|function|if|implements|it|let|loop|new|null|otherwise|own|return|super|switch|that|then|this|throw|try|unless|until|var|void|when|while|yield)(?!-)\b/m,lookbehind:!0},"keyword-operator":{pattern:/(^|[^-])\b(?:(?:delete|require|typeof)!|(?:and|by|delete|export|from|import(?: all)?|in|instanceof|is(?: not|nt)?|not|of|or|til|to|typeof|with|xor)(?!-)\b)/m,lookbehind:!0,alias:"operator"},boolean:{pattern:/(^|[^-])\b(?:false|no|off|on|true|yes)(?!-)\b/m,lookbehind:!0},argument:{pattern:/(^|(?!\.&\.)[^&])&(?!&)\d*/m,lookbehind:!0,alias:"variable"},number:/\b(?:\d+~[\da-z]+|\d[\d_]*(?:\.\d[\d_]*)?(?:[a-z]\w*)?)/i,identifier:/[a-z_](?:-?[a-z]|[\d_])*/i,operator:[{pattern:/( )\.(?= )/,lookbehind:!0},/\.(?:[=~]|\.\.?)|\.(?:[&|^]|<<|>>>?)\.|:(?:=|:=?)|&&|\|[|>]|<(?:<[>=?]?|-(?:->?|>)?|\+\+?|@@?|%%?|\*\*?|!(?:~?=|--?>|~?~>)?|~(?:~?>|=)?|==?|\^\^?|[\/?]/],punctuation:/[(){}\[\]|.,:;`]/},t.languages.livescript["interpolated-string"].inside.interpolation.inside.rest=t.languages.livescript}return iw}var sw,YD;function mve(){if(YD)return sw;YD=1,sw=e,e.displayName="llvm",e.aliases=[];function e(t){(function(n){n.languages.llvm={comment:/;.*/,string:{pattern:/"[^"]*"/,greedy:!0},boolean:/\b(?:false|true)\b/,variable:/[%@!#](?:(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+|\d+)/i,label:/(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+:/i,type:{pattern:/\b(?:double|float|fp128|half|i[1-9]\d*|label|metadata|ppc_fp128|token|void|x86_fp80|x86_mmx)\b/,alias:"class-name"},keyword:/\b[a-z_][a-z_0-9]*\b/,number:/[+-]?\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-Fa-f]+\b|\b0xK[\dA-Fa-f]{20}\b|\b0x[ML][\dA-Fa-f]{32}\b|\b0xH[\dA-Fa-f]{4}\b/,punctuation:/[{}[\];(),.!*=<>]/}})(t)}return sw}var lw,ZD;function hve(){if(ZD)return lw;ZD=1,lw=e,e.displayName="log",e.aliases=[];function e(t){t.languages.log={string:{pattern:/"(?:[^"\\\r\n]|\\.)*"|'(?![st] | \w)(?:[^'\\\r\n]|\\.)*'/,greedy:!0},exception:{pattern:/(^|[^\w.])[a-z][\w.]*(?:Error|Exception):.*(?:(?:\r\n?|\n)[ \t]*(?:at[ \t].+|\.{3}.*|Caused by:.*))+(?:(?:\r\n?|\n)[ \t]*\.\.\. .*)?/,lookbehind:!0,greedy:!0,alias:["javastacktrace","language-javastacktrace"],inside:t.languages.javastacktrace||{keyword:/\bat\b/,function:/[a-z_][\w$]*(?=\()/,punctuation:/[.:()]/}},level:[{pattern:/\b(?:ALERT|CRIT|CRITICAL|EMERG|EMERGENCY|ERR|ERROR|FAILURE|FATAL|SEVERE)\b/,alias:["error","important"]},{pattern:/\b(?:WARN|WARNING|WRN)\b/,alias:["warning","important"]},{pattern:/\b(?:DISPLAY|INF|INFO|NOTICE|STATUS)\b/,alias:["info","keyword"]},{pattern:/\b(?:DBG|DEBUG|FINE)\b/,alias:["debug","keyword"]},{pattern:/\b(?:FINER|FINEST|TRACE|TRC|VERBOSE|VRB)\b/,alias:["trace","comment"]}],property:{pattern:/((?:^|[\]|])[ \t]*)[a-z_](?:[\w-]|\b\/\b)*(?:[. ]\(?\w(?:[\w-]|\b\/\b)*\)?)*:(?=\s)/im,lookbehind:!0},separator:{pattern:/(^|[^-+])-{3,}|={3,}|\*{3,}|- - /m,lookbehind:!0,alias:"comment"},url:/\b(?:file|ftp|https?):\/\/[^\s|,;'"]*[^\s|,;'">.]/,email:{pattern:/(^|\s)[-\w+.]+@[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+(?=\s)/,lookbehind:!0,alias:"url"},"ip-address":{pattern:/\b(?:\d{1,3}(?:\.\d{1,3}){3})\b/,alias:"constant"},"mac-address":{pattern:/\b[a-f0-9]{2}(?::[a-f0-9]{2}){5}\b/i,alias:"constant"},domain:{pattern:/(^|\s)[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)*\.[a-z][a-z0-9-]+(?=\s)/,lookbehind:!0,alias:"constant"},uuid:{pattern:/\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/i,alias:"constant"},hash:{pattern:/\b(?:[a-f0-9]{32}){1,2}\b/i,alias:"constant"},"file-path":{pattern:/\b[a-z]:[\\/][^\s|,;:(){}\[\]"']+|(^|[\s:\[\](>|])\.{0,2}\/\w[^\s|,;:(){}\[\]"']*/i,lookbehind:!0,greedy:!0,alias:"string"},date:{pattern:RegExp(/\b\d{4}[-/]\d{2}[-/]\d{2}(?:T(?=\d{1,2}:)|(?=\s\d{1,2}:))/.source+"|"+/\b\d{1,4}[-/ ](?:\d{1,2}|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)[-/ ]\d{2,4}T?\b/.source+"|"+/\b(?:(?:Fri|Mon|Sat|Sun|Thu|Tue|Wed)(?:\s{1,2}(?:Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep))?|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)\s{1,2}\d{1,2}\b/.source,"i"),alias:"number"},time:{pattern:/\b\d{1,2}:\d{1,2}:\d{1,2}(?:[.,:]\d+)?(?:\s?[+-]\d{2}:?\d{2}|Z)?\b/,alias:"number"},boolean:/\b(?:false|null|true)\b/i,number:{pattern:/(^|[^.\w])(?:0x[a-f0-9]+|0o[0-7]+|0b[01]+|v?\d[\da-f]*(?:\.\d+)*(?:e[+-]?\d+)?[a-z]{0,3}\b)\b(?!\.\w)/i,lookbehind:!0},operator:/[;:?<=>~/@!$%&+\-|^(){}*#]/,punctuation:/[\[\].,]/}}return lw}var cw,XD;function bve(){if(XD)return cw;XD=1,cw=e,e.displayName="lolcode",e.aliases=[];function e(t){t.languages.lolcode={comment:[/\bOBTW\s[\s\S]*?\sTLDR\b/,/\bBTW.+/],string:{pattern:/"(?::.|[^":])*"/,inside:{variable:/:\{[^}]+\}/,symbol:[/:\([a-f\d]+\)/i,/:\[[^\]]+\]/,/:[)>o":]/]},greedy:!0},number:/(?:\B-)?(?:\b\d+(?:\.\d*)?|\B\.\d+)/,symbol:{pattern:/(^|\s)(?:A )?(?:BUKKIT|NOOB|NUMBAR|NUMBR|TROOF|YARN)(?=\s|,|$)/,lookbehind:!0,inside:{keyword:/A(?=\s)/}},label:{pattern:/((?:^|\s)(?:IM IN YR|IM OUTTA YR) )[a-zA-Z]\w*/,lookbehind:!0,alias:"string"},function:{pattern:/((?:^|\s)(?:HOW IZ I|I IZ|IZ) )[a-zA-Z]\w*/,lookbehind:!0},keyword:[{pattern:/(^|\s)(?:AN|FOUND YR|GIMMEH|GTFO|HAI|HAS A|HOW IZ I|I HAS A|I IZ|IF U SAY SO|IM IN YR|IM OUTTA YR|IS NOW(?: A)?|ITZ(?: A)?|IZ|KTHX|KTHXBYE|LIEK(?: A)?|MAEK|MEBBE|MKAY|NERFIN|NO WAI|O HAI IM|O RLY\?|OIC|OMG|OMGWTF|R|SMOOSH|SRS|TIL|UPPIN|VISIBLE|WILE|WTF\?|YA RLY|YR)(?=\s|,|$)/,lookbehind:!0},/'Z(?=\s|,|$)/],boolean:{pattern:/(^|\s)(?:FAIL|WIN)(?=\s|,|$)/,lookbehind:!0},variable:{pattern:/(^|\s)IT(?=\s|,|$)/,lookbehind:!0},operator:{pattern:/(^|\s)(?:NOT|BOTH SAEM|DIFFRINT|(?:ALL|ANY|BIGGR|BOTH|DIFF|EITHER|MOD|PRODUKT|QUOSHUNT|SMALLR|SUM|WON) OF)(?=\s|,|$)/,lookbehind:!0},punctuation:/\.{3}|…|,|!/}}return cw}var uw,QD;function yve(){if(QD)return uw;QD=1,uw=e,e.displayName="magma",e.aliases=[];function e(t){t.languages.magma={output:{pattern:/^(>.*(?:\r(?:\n|(?!\n))|\n))(?!>)(?:.+|(?:\r(?:\n|(?!\n))|\n)(?!>).*)(?:(?:\r(?:\n|(?!\n))|\n)(?!>).*)*/m,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},string:{pattern:/(^|[^\\"])"(?:[^\r\n\\"]|\\.)*"/,lookbehind:!0,greedy:!0},keyword:/\b(?:_|adj|and|assert|assert2|assert3|assigned|break|by|case|cat|catch|clear|cmpeq|cmpne|continue|declare|default|delete|diff|div|do|elif|else|end|eq|error|eval|exists|exit|for|forall|forward|fprintf|freeze|function|ge|gt|if|iload|import|in|intrinsic|is|join|le|load|local|lt|meet|mod|ne|not|notadj|notin|notsubset|or|print|printf|procedure|quit|random|read|readi|repeat|require|requirege|requirerange|restore|return|save|sdiff|select|subset|then|time|to|try|until|vprint|vprintf|vtime|when|where|while|xor)\b/,boolean:/\b(?:false|true)\b/,generator:{pattern:/\b[a-z_]\w*(?=\s*<)/i,alias:"class-name"},function:/\b[a-z_]\w*(?=\s*\()/i,number:{pattern:/(^|[^\w.]|\.\.)(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?(?:_[a-z]?)?(?=$|[^\w.]|\.\.)/,lookbehind:!0},operator:/->|[-+*/^~!|#=]|:=|\.\./,punctuation:/[()[\]{}<>,;.:]/}}return uw}var dw,JD;function vve(){if(JD)return dw;JD=1,dw=e,e.displayName="makefile",e.aliases=[];function e(t){t.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/}}return dw}var fw,eL;function Sve(){if(eL)return fw;eL=1,fw=e,e.displayName="markdown",e.aliases=["md"];function e(t){(function(n){var r=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function a(g){return g=g.replace(//g,function(){return r}),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+g+")")}var o=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,i=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,function(){return o}),s=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;n.languages.markdown=n.languages.extend("markup",{}),n.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:n.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+i+s+"(?:"+i+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+i+s+")(?:"+i+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(o),inside:n.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+i+")"+s+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+i+"$"),inside:{"table-header":{pattern:RegExp(o),alias:"important",inside:n.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:a(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:a(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:a(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:a(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach(function(g){["url","bold","italic","strike","code-snippet"].forEach(function(m){g!==m&&(n.languages.markdown[g].inside.content.inside[m]=n.languages.markdown[m])})}),n.hooks.add("after-tokenize",function(g){if(g.language!=="markdown"&&g.language!=="md")return;function m(b){if(!(!b||typeof b=="string"))for(var y=0,w=b.length;y",quot:'"'},u=String.fromCodePoint||String.fromCharCode;function d(g){var m=g.replace(l,"");return m=m.replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,function(b,y){if(y=y.toLowerCase(),y[0]==="#"){var w;return y[1]==="x"?w=parseInt(y.slice(2),16):w=Number(y.slice(1)),u(w)}else{var v=c[y];return v||b}}),m}n.languages.md=n.languages.markdown})(t)}return fw}var pw,tL;function wve(){if(tL)return pw;tL=1,pw=e,e.displayName="matlab",e.aliases=[];function e(t){t.languages.matlab={comment:[/%\{[\s\S]*?\}%/,/%.+/],string:{pattern:/\B'(?:''|[^'\r\n])*'/,greedy:!0},number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+)?(?:[ij])?|\b[ij]\b/,keyword:/\b(?:NaN|break|case|catch|continue|else|elseif|end|for|function|if|inf|otherwise|parfor|pause|pi|return|switch|try|while)\b/,function:/\b(?!\d)\w+(?=\s*\()/,operator:/\.?[*^\/\\']|[+\-:@]|[<>=~]=?|&&?|\|\|?/,punctuation:/\.{3}|[.,;\[\](){}!]/}}return pw}var gw,nL;function Eve(){if(nL)return gw;nL=1,gw=e,e.displayName="maxscript",e.aliases=[];function e(t){(function(n){var r=/\b(?:about|and|animate|as|at|attributes|by|case|catch|collect|continue|coordsys|do|else|exit|fn|for|from|function|global|if|in|local|macroscript|mapped|max|not|of|off|on|or|parameters|persistent|plugin|rcmenu|return|rollout|set|struct|then|throw|to|tool|try|undo|utility|when|where|while|with)\b/i;n.languages.maxscript={comment:{pattern:/\/\*[\s\S]*?(?:\*\/|$)|--.*/,greedy:!0},string:{pattern:/(^|[^"\\@])(?:"(?:[^"\\]|\\[\s\S])*"|@"[^"]*")/,lookbehind:!0,greedy:!0},path:{pattern:/\$(?:[\w/\\.*?]|'[^']*')*/,greedy:!0,alias:"string"},"function-call":{pattern:RegExp("((?:"+(/^/.source+"|"+/[;=<>+\-*/^({\[]/.source+"|"+/\b(?:and|by|case|catch|collect|do|else|if|in|not|or|return|then|to|try|where|while|with)\b/.source)+")[ ]*)(?!"+r.source+")"+/[a-z_]\w*\b/.source+"(?=[ ]*(?:"+("(?!"+r.source+")"+/[a-z_]/.source+"|"+/\d|-\.?\d/.source+"|"+/[({'"$@#?]/.source)+"))","im"),lookbehind:!0,greedy:!0,alias:"function"},"function-definition":{pattern:/(\b(?:fn|function)\s+)\w+\b/i,lookbehind:!0,alias:"function"},argument:{pattern:/\b[a-z_]\w*(?=:)/i,alias:"attr-name"},keyword:r,boolean:/\b(?:false|true)\b/,time:{pattern:/(^|[^\w.])(?:(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?[msft])+|\d+:\d+(?:\.\d*)?)(?![\w.:])/,lookbehind:!0,alias:"number"},number:[{pattern:/(^|[^\w.])(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?|0x[a-fA-F0-9]+)(?![\w.:])/,lookbehind:!0},/\b(?:e|pi)\b/],constant:/\b(?:dontcollect|ok|silentValue|undefined|unsupplied)\b/,color:{pattern:/\b(?:black|blue|brown|gray|green|orange|red|white|yellow)\b/i,alias:"constant"},operator:/[-+*/<>=!]=?|[&^?]|#(?!\()/,punctuation:/[()\[\]{}.:,;]|#(?=\()|\\$/m}})(t)}return gw}var mw,rL;function xve(){if(rL)return mw;rL=1,mw=e,e.displayName="mel",e.aliases=[];function e(t){t.languages.mel={comment:/\/\/.*/,code:{pattern:/`(?:\\.|[^\\`\r\n])*`/,greedy:!0,alias:"italic",inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"}}},string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},variable:/\$\w+/,number:/\b0x[\da-fA-F]+\b|\b\d+(?:\.\d*)?|\B\.\d+/,flag:{pattern:/-[^\d\W]\w*/,alias:"operator"},keyword:/\b(?:break|case|continue|default|do|else|float|for|global|if|in|int|matrix|proc|return|string|switch|vector|while)\b/,function:/\b\w+(?=\()|\b(?:CBG|HfAddAttractorToAS|HfAssignAS|HfBuildEqualMap|HfBuildFurFiles|HfBuildFurImages|HfCancelAFR|HfConnectASToHF|HfCreateAttractor|HfDeleteAS|HfEditAS|HfPerformCreateAS|HfRemoveAttractorFromAS|HfSelectAttached|HfSelectAttractors|HfUnAssignAS|Mayatomr|about|abs|addAttr|addAttributeEditorNodeHelp|addDynamic|addNewShelfTab|addPP|addPanelCategory|addPrefixToName|advanceToNextDrivenKey|affectedNet|affects|aimConstraint|air|alias|aliasAttr|align|alignCtx|alignCurve|alignSurface|allViewFit|ambientLight|angle|angleBetween|animCone|animCurveEditor|animDisplay|animView|annotate|appendStringArray|applicationName|applyAttrPreset|applyTake|arcLenDimContext|arcLengthDimension|arclen|arrayMapper|art3dPaintCtx|artAttrCtx|artAttrPaintVertexCtx|artAttrSkinPaintCtx|artAttrTool|artBuildPaintMenu|artFluidAttrCtx|artPuttyCtx|artSelectCtx|artSetPaintCtx|artUserPaintCtx|assignCommand|assignInputDevice|assignViewportFactories|attachCurve|attachDeviceAttr|attachSurface|attrColorSliderGrp|attrCompatibility|attrControlGrp|attrEnumOptionMenu|attrEnumOptionMenuGrp|attrFieldGrp|attrFieldSliderGrp|attrNavigationControlGrp|attrPresetEditWin|attributeExists|attributeInfo|attributeMenu|attributeQuery|autoKeyframe|autoPlace|bakeClip|bakeFluidShading|bakePartialHistory|bakeResults|bakeSimulation|basename|basenameEx|batchRender|bessel|bevel|bevelPlus|binMembership|bindSkin|blend2|blendShape|blendShapeEditor|blendShapePanel|blendTwoAttr|blindDataType|boneLattice|boundary|boxDollyCtx|boxZoomCtx|bufferCurve|buildBookmarkMenu|buildKeyframeMenu|button|buttonManip|cacheFile|cacheFileCombine|cacheFileMerge|cacheFileTrack|camera|cameraView|canCreateManip|canvas|capitalizeString|catch|catchQuiet|ceil|changeSubdivComponentDisplayLevel|changeSubdivRegion|channelBox|character|characterMap|characterOutlineEditor|characterize|chdir|checkBox|checkBoxGrp|checkDefaultRenderGlobals|choice|circle|circularFillet|clamp|clear|clearCache|clip|clipEditor|clipEditorCurrentTimeCtx|clipSchedule|clipSchedulerOutliner|clipTrimBefore|closeCurve|closeSurface|cluster|cmdFileOutput|cmdScrollFieldExecuter|cmdScrollFieldReporter|cmdShell|coarsenSubdivSelectionList|collision|color|colorAtPoint|colorEditor|colorIndex|colorIndexSliderGrp|colorSliderButtonGrp|colorSliderGrp|columnLayout|commandEcho|commandLine|commandPort|compactHairSystem|componentEditor|compositingInterop|computePolysetVolume|condition|cone|confirmDialog|connectAttr|connectControl|connectDynamic|connectJoint|connectionInfo|constrain|constrainValue|constructionHistory|container|containsMultibyte|contextInfo|control|convertFromOldLayers|convertIffToPsd|convertLightmap|convertSolidTx|convertTessellation|convertUnit|copyArray|copyFlexor|copyKey|copySkinWeights|cos|cpButton|cpCache|cpClothSet|cpCollision|cpConstraint|cpConvClothToMesh|cpForces|cpGetSolverAttr|cpPanel|cpProperty|cpRigidCollisionFilter|cpSeam|cpSetEdit|cpSetSolverAttr|cpSolver|cpSolverTypes|cpTool|cpUpdateClothUVs|createDisplayLayer|createDrawCtx|createEditor|createLayeredPsdFile|createMotionField|createNewShelf|createNode|createRenderLayer|createSubdivRegion|cross|crossProduct|ctxAbort|ctxCompletion|ctxEditMode|ctxTraverse|currentCtx|currentTime|currentTimeCtx|currentUnit|curve|curveAddPtCtx|curveCVCtx|curveEPCtx|curveEditorCtx|curveIntersect|curveMoveEPCtx|curveOnSurface|curveSketchCtx|cutKey|cycleCheck|cylinder|dagPose|date|defaultLightListCheckBox|defaultNavigation|defineDataServer|defineVirtualDevice|deformer|deg_to_rad|delete|deleteAttr|deleteShadingGroupsAndMaterials|deleteShelfTab|deleteUI|deleteUnusedBrushes|delrandstr|detachCurve|detachDeviceAttr|detachSurface|deviceEditor|devicePanel|dgInfo|dgdirty|dgeval|dgtimer|dimWhen|directKeyCtx|directionalLight|dirmap|dirname|disable|disconnectAttr|disconnectJoint|diskCache|displacementToPoly|displayAffected|displayColor|displayCull|displayLevelOfDetail|displayPref|displayRGBColor|displaySmoothness|displayStats|displayString|displaySurface|distanceDimContext|distanceDimension|doBlur|dolly|dollyCtx|dopeSheetEditor|dot|dotProduct|doubleProfileBirailSurface|drag|dragAttrContext|draggerContext|dropoffLocator|duplicate|duplicateCurve|duplicateSurface|dynCache|dynControl|dynExport|dynExpression|dynGlobals|dynPaintEditor|dynParticleCtx|dynPref|dynRelEdPanel|dynRelEditor|dynamicLoad|editAttrLimits|editDisplayLayerGlobals|editDisplayLayerMembers|editRenderLayerAdjustment|editRenderLayerGlobals|editRenderLayerMembers|editor|editorTemplate|effector|emit|emitter|enableDevice|encodeString|endString|endsWith|env|equivalent|equivalentTol|erf|error|eval|evalDeferred|evalEcho|event|exactWorldBoundingBox|exclusiveLightCheckBox|exec|executeForEachObject|exists|exp|expression|expressionEditorListen|extendCurve|extendSurface|extrude|fcheck|fclose|feof|fflush|fgetline|fgetword|file|fileBrowserDialog|fileDialog|fileExtension|fileInfo|filetest|filletCurve|filter|filterCurve|filterExpand|filterStudioImport|findAllIntersections|findAnimCurves|findKeyframe|findMenuItem|findRelatedSkinCluster|finder|firstParentOf|fitBspline|flexor|floatEq|floatField|floatFieldGrp|floatScrollBar|floatSlider|floatSlider2|floatSliderButtonGrp|floatSliderGrp|floor|flow|fluidCacheInfo|fluidEmitter|fluidVoxelInfo|flushUndo|fmod|fontDialog|fopen|formLayout|format|fprint|frameLayout|fread|freeFormFillet|frewind|fromNativePath|fwrite|gamma|gauss|geometryConstraint|getApplicationVersionAsFloat|getAttr|getClassification|getDefaultBrush|getFileList|getFluidAttr|getInputDeviceRange|getMayaPanelTypes|getModifiers|getPanel|getParticleAttr|getPluginResource|getenv|getpid|glRender|glRenderEditor|globalStitch|gmatch|goal|gotoBindPose|grabColor|gradientControl|gradientControlNoAttr|graphDollyCtx|graphSelectContext|graphTrackCtx|gravity|grid|gridLayout|group|groupObjectsByName|hardenPointCurve|hardware|hardwareRenderPanel|headsUpDisplay|headsUpMessage|help|helpLine|hermite|hide|hilite|hitTest|hotBox|hotkey|hotkeyCheck|hsv_to_rgb|hudButton|hudSlider|hudSliderButton|hwReflectionMap|hwRender|hwRenderLoad|hyperGraph|hyperPanel|hyperShade|hypot|iconTextButton|iconTextCheckBox|iconTextRadioButton|iconTextRadioCollection|iconTextScrollList|iconTextStaticLabel|ikHandle|ikHandleCtx|ikHandleDisplayScale|ikSolver|ikSplineHandleCtx|ikSystem|ikSystemInfo|ikfkDisplayMethod|illustratorCurves|image|imfPlugins|inheritTransform|insertJoint|insertJointCtx|insertKeyCtx|insertKnotCurve|insertKnotSurface|instance|instanceable|instancer|intField|intFieldGrp|intScrollBar|intSlider|intSliderGrp|interToUI|internalVar|intersect|iprEngine|isAnimCurve|isConnected|isDirty|isParentOf|isSameObject|isTrue|isValidObjectName|isValidString|isValidUiName|isolateSelect|itemFilter|itemFilterAttr|itemFilterRender|itemFilterType|joint|jointCluster|jointCtx|jointDisplayScale|jointLattice|keyTangent|keyframe|keyframeOutliner|keyframeRegionCurrentTimeCtx|keyframeRegionDirectKeyCtx|keyframeRegionDollyCtx|keyframeRegionInsertKeyCtx|keyframeRegionMoveKeyCtx|keyframeRegionScaleKeyCtx|keyframeRegionSelectKeyCtx|keyframeRegionSetKeyCtx|keyframeRegionTrackCtx|keyframeStats|lassoContext|lattice|latticeDeformKeyCtx|launch|launchImageEditor|layerButton|layeredShaderPort|layeredTexturePort|layout|layoutDialog|lightList|lightListEditor|lightListPanel|lightlink|lineIntersection|linearPrecision|linstep|listAnimatable|listAttr|listCameras|listConnections|listDeviceAttachments|listHistory|listInputDeviceAxes|listInputDeviceButtons|listInputDevices|listMenuAnnotation|listNodeTypes|listPanelCategories|listRelatives|listSets|listTransforms|listUnselected|listerEditor|loadFluid|loadNewShelf|loadPlugin|loadPluginLanguageResources|loadPrefObjects|localizedPanelLabel|lockNode|loft|log|longNameOf|lookThru|ls|lsThroughFilter|lsType|lsUI|mag|makeIdentity|makeLive|makePaintable|makeRoll|makeSingleSurface|makeTubeOn|makebot|manipMoveContext|manipMoveLimitsCtx|manipOptions|manipRotateContext|manipRotateLimitsCtx|manipScaleContext|manipScaleLimitsCtx|marker|match|max|memory|menu|menuBarLayout|menuEditor|menuItem|menuItemToShelf|menuSet|menuSetPref|messageLine|min|minimizeApp|mirrorJoint|modelCurrentTimeCtx|modelEditor|modelPanel|mouse|movIn|movOut|move|moveIKtoFK|moveKeyCtx|moveVertexAlongDirection|multiProfileBirailSurface|mute|nParticle|nameCommand|nameField|namespace|namespaceInfo|newPanelItems|newton|nodeCast|nodeIconButton|nodeOutliner|nodePreset|nodeType|noise|nonLinear|normalConstraint|normalize|nurbsBoolean|nurbsCopyUVSet|nurbsCube|nurbsEditUV|nurbsPlane|nurbsSelect|nurbsSquare|nurbsToPoly|nurbsToPolygonsPref|nurbsToSubdiv|nurbsToSubdivPref|nurbsUVSet|nurbsViewDirectionVector|objExists|objectCenter|objectLayer|objectType|objectTypeUI|obsoleteProc|oceanNurbsPreviewPlane|offsetCurve|offsetCurveOnSurface|offsetSurface|openGLExtension|openMayaPref|optionMenu|optionMenuGrp|optionVar|orbit|orbitCtx|orientConstraint|outlinerEditor|outlinerPanel|overrideModifier|paintEffectsDisplay|pairBlend|palettePort|paneLayout|panel|panelConfiguration|panelHistory|paramDimContext|paramDimension|paramLocator|parent|parentConstraint|particle|particleExists|particleInstancer|particleRenderInfo|partition|pasteKey|pathAnimation|pause|pclose|percent|performanceOptions|pfxstrokes|pickWalk|picture|pixelMove|planarSrf|plane|play|playbackOptions|playblast|plugAttr|plugNode|pluginInfo|pluginResourceUtil|pointConstraint|pointCurveConstraint|pointLight|pointMatrixMult|pointOnCurve|pointOnSurface|pointPosition|poleVectorConstraint|polyAppend|polyAppendFacetCtx|polyAppendVertex|polyAutoProjection|polyAverageNormal|polyAverageVertex|polyBevel|polyBlendColor|polyBlindData|polyBoolOp|polyBridgeEdge|polyCacheMonitor|polyCheck|polyChipOff|polyClipboard|polyCloseBorder|polyCollapseEdge|polyCollapseFacet|polyColorBlindData|polyColorDel|polyColorPerVertex|polyColorSet|polyCompare|polyCone|polyCopyUV|polyCrease|polyCreaseCtx|polyCreateFacet|polyCreateFacetCtx|polyCube|polyCut|polyCutCtx|polyCylinder|polyCylindricalProjection|polyDelEdge|polyDelFacet|polyDelVertex|polyDuplicateAndConnect|polyDuplicateEdge|polyEditUV|polyEditUVShell|polyEvaluate|polyExtrudeEdge|polyExtrudeFacet|polyExtrudeVertex|polyFlipEdge|polyFlipUV|polyForceUV|polyGeoSampler|polyHelix|polyInfo|polyInstallAction|polyLayoutUV|polyListComponentConversion|polyMapCut|polyMapDel|polyMapSew|polyMapSewMove|polyMergeEdge|polyMergeEdgeCtx|polyMergeFacet|polyMergeFacetCtx|polyMergeUV|polyMergeVertex|polyMirrorFace|polyMoveEdge|polyMoveFacet|polyMoveFacetUV|polyMoveUV|polyMoveVertex|polyNormal|polyNormalPerVertex|polyNormalizeUV|polyOptUvs|polyOptions|polyOutput|polyPipe|polyPlanarProjection|polyPlane|polyPlatonicSolid|polyPoke|polyPrimitive|polyPrism|polyProjection|polyPyramid|polyQuad|polyQueryBlindData|polyReduce|polySelect|polySelectConstraint|polySelectConstraintMonitor|polySelectCtx|polySelectEditCtx|polySeparate|polySetToFaceNormal|polySewEdge|polyShortestPathCtx|polySmooth|polySoftEdge|polySphere|polySphericalProjection|polySplit|polySplitCtx|polySplitEdge|polySplitRing|polySplitVertex|polyStraightenUVBorder|polySubdivideEdge|polySubdivideFacet|polyToSubdiv|polyTorus|polyTransfer|polyTriangulate|polyUVSet|polyUnite|polyWedgeFace|popen|popupMenu|pose|pow|preloadRefEd|print|progressBar|progressWindow|projFileViewer|projectCurve|projectTangent|projectionContext|projectionManip|promptDialog|propModCtx|propMove|psdChannelOutliner|psdEditTextureFile|psdExport|psdTextureFile|putenv|pwd|python|querySubdiv|quit|rad_to_deg|radial|radioButton|radioButtonGrp|radioCollection|radioMenuItemCollection|rampColorPort|rand|randomizeFollicles|randstate|rangeControl|readTake|rebuildCurve|rebuildSurface|recordAttr|recordDevice|redo|reference|referenceEdit|referenceQuery|refineSubdivSelectionList|refresh|refreshAE|registerPluginResource|rehash|reloadImage|removeJoint|removeMultiInstance|removePanelCategory|rename|renameAttr|renameSelectionList|renameUI|render|renderGlobalsNode|renderInfo|renderLayerButton|renderLayerParent|renderLayerPostProcess|renderLayerUnparent|renderManip|renderPartition|renderQualityNode|renderSettings|renderThumbnailUpdate|renderWindowEditor|renderWindowSelectContext|renderer|reorder|reorderDeformers|requires|reroot|resampleFluid|resetAE|resetPfxToPolyCamera|resetTool|resolutionNode|retarget|reverseCurve|reverseSurface|revolve|rgb_to_hsv|rigidBody|rigidSolver|roll|rollCtx|rootOf|rot|rotate|rotationInterpolation|roundConstantRadius|rowColumnLayout|rowLayout|runTimeCommand|runup|sampleImage|saveAllShelves|saveAttrPreset|saveFluid|saveImage|saveInitialState|saveMenu|savePrefObjects|savePrefs|saveShelf|saveToolSettings|scale|scaleBrushBrightness|scaleComponents|scaleConstraint|scaleKey|scaleKeyCtx|sceneEditor|sceneUIReplacement|scmh|scriptCtx|scriptEditorInfo|scriptJob|scriptNode|scriptTable|scriptToShelf|scriptedPanel|scriptedPanelType|scrollField|scrollLayout|sculpt|searchPathArray|seed|selLoadSettings|select|selectContext|selectCurveCV|selectKey|selectKeyCtx|selectKeyframeRegionCtx|selectMode|selectPref|selectPriority|selectType|selectedNodes|selectionConnection|separator|setAttr|setAttrEnumResource|setAttrMapping|setAttrNiceNameResource|setConstraintRestPosition|setDefaultShadingGroup|setDrivenKeyframe|setDynamic|setEditCtx|setEditor|setFluidAttr|setFocus|setInfinity|setInputDeviceMapping|setKeyCtx|setKeyPath|setKeyframe|setKeyframeBlendshapeTargetWts|setMenuMode|setNodeNiceNameResource|setNodeTypeFlag|setParent|setParticleAttr|setPfxToPolyCamera|setPluginResource|setProject|setStampDensity|setStartupMessage|setState|setToolTo|setUITemplate|setXformManip|sets|shadingConnection|shadingGeometryRelCtx|shadingLightRelCtx|shadingNetworkCompare|shadingNode|shapeCompare|shelfButton|shelfLayout|shelfTabLayout|shellField|shortNameOf|showHelp|showHidden|showManipCtx|showSelectionInTitle|showShadingGroupAttrEditor|showWindow|sign|simplify|sin|singleProfileBirailSurface|size|sizeBytes|skinCluster|skinPercent|smoothCurve|smoothTangentSurface|smoothstep|snap2to2|snapKey|snapMode|snapTogetherCtx|snapshot|soft|softMod|softModCtx|sort|sound|soundControl|source|spaceLocator|sphere|sphrand|spotLight|spotLightPreviewPort|spreadSheetEditor|spring|sqrt|squareSurface|srtContext|stackTrace|startString|startsWith|stitchAndExplodeShell|stitchSurface|stitchSurfacePoints|strcmp|stringArrayCatenate|stringArrayContains|stringArrayCount|stringArrayInsertAtIndex|stringArrayIntersector|stringArrayRemove|stringArrayRemoveAtIndex|stringArrayRemoveDuplicates|stringArrayRemoveExact|stringArrayToString|stringToStringArray|strip|stripPrefixFromName|stroke|subdAutoProjection|subdCleanTopology|subdCollapse|subdDuplicateAndConnect|subdEditUV|subdListComponentConversion|subdMapCut|subdMapSewMove|subdMatchTopology|subdMirror|subdToBlind|subdToPoly|subdTransferUVsToCache|subdiv|subdivCrease|subdivDisplaySmoothness|substitute|substituteAllString|substituteGeometry|substring|surface|surfaceSampler|surfaceShaderList|swatchDisplayPort|switchTable|symbolButton|symbolCheckBox|sysFile|system|tabLayout|tan|tangentConstraint|texLatticeDeformContext|texManipContext|texMoveContext|texMoveUVShellContext|texRotateContext|texScaleContext|texSelectContext|texSelectShortestPathCtx|texSmudgeUVContext|texWinToolCtx|text|textCurves|textField|textFieldButtonGrp|textFieldGrp|textManip|textScrollList|textToShelf|textureDisplacePlane|textureHairColor|texturePlacementContext|textureWindow|threadCount|threePointArcCtx|timeControl|timePort|timerX|toNativePath|toggle|toggleAxis|toggleWindowVisibility|tokenize|tokenizeList|tolerance|tolower|toolButton|toolCollection|toolDropped|toolHasOptions|toolPropertyWindow|torus|toupper|trace|track|trackCtx|transferAttributes|transformCompare|transformLimits|translator|trim|trunc|truncateFluidCache|truncateHairCache|tumble|tumbleCtx|turbulence|twoPointArcCtx|uiRes|uiTemplate|unassignInputDevice|undo|undoInfo|ungroup|uniform|unit|unloadPlugin|untangleUV|untitledFileName|untrim|upAxis|updateAE|userCtx|uvLink|uvSnapshot|validateShelfName|vectorize|view2dToolCtx|viewCamera|viewClipPlane|viewFit|viewHeadOn|viewLookAt|viewManip|viewPlace|viewSet|visor|volumeAxis|vortex|waitCursor|warning|webBrowser|webBrowserPrefs|whatIs|window|windowPref|wire|wireContext|workspace|wrinkle|wrinkleContext|writeTake|xbmLangPathList|xform)\b/,operator:[/\+[+=]?|-[-=]?|&&|\|\||[<>]=|[*\/!=]=?|[%^]/,{pattern:/(^|[^<])<(?!<)/,lookbehind:!0},{pattern:/(^|[^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,:;?\[\](){}]/},t.languages.mel.code.inside.rest=t.languages.mel}return mw}var hw,aL;function kve(){if(aL)return hw;aL=1,hw=e,e.displayName="mermaid",e.aliases=[];function e(t){t.languages.mermaid={comment:{pattern:/%%.*/,greedy:!0},style:{pattern:/^([ \t]*(?:classDef|linkStyle|style)[ \t]+[\w$-]+[ \t]+)\w.*[^\s;]/m,lookbehind:!0,inside:{property:/\b\w[\w-]*(?=[ \t]*:)/,operator:/:/,punctuation:/,/}},"inter-arrow-label":{pattern:/([^<>ox.=-])(?:-[-.]|==)(?![<>ox.=-])[ \t]*(?:"[^"\r\n]*"|[^\s".=-](?:[^\r\n.=-]*[^\s.=-])?)[ \t]*(?:\.+->?|--+[->]|==+[=>])(?![<>ox.=-])/,lookbehind:!0,greedy:!0,inside:{arrow:{pattern:/(?:\.+->?|--+[->]|==+[=>])$/,alias:"operator"},label:{pattern:/^([\s\S]{2}[ \t]*)\S(?:[\s\S]*\S)?/,lookbehind:!0,alias:"property"},"arrow-head":{pattern:/^\S+/,alias:["arrow","operator"]}}},arrow:[{pattern:/(^|[^{}|o.-])[|}][|o](?:--|\.\.)[|o][|{](?![{}|o.-])/,lookbehind:!0,alias:"operator"},{pattern:/(^|[^<>ox.=-])(?:[ox]?|(?:==+|--+|-\.*-)[>ox]|===+|---+|-\.+-)(?![<>ox.=-])/,lookbehind:!0,alias:"operator"},{pattern:/(^|[^<>()x-])(?:--?(?:>>|[x>)])(?![<>()x])|(?:<<|[x<(])--?(?!-))/,lookbehind:!0,alias:"operator"},{pattern:/(^|[^<>|*o.-])(?:[*o]--|--[*o]|<\|?(?:--|\.\.)|(?:--|\.\.)\|?>|--|\.\.)(?![<>|*o.-])/,lookbehind:!0,alias:"operator"}],label:{pattern:/(^|[^|<])\|(?:[^\r\n"|]|"[^"\r\n]*")+\|/,lookbehind:!0,greedy:!0,alias:"property"},text:{pattern:/(?:[(\[{]+|\b>)(?:[^\r\n"()\[\]{}]|"[^"\r\n]*")+(?:[)\]}]+|>)/,alias:"string"},string:{pattern:/"[^"\r\n]*"/,greedy:!0},annotation:{pattern:/<<(?:abstract|choice|enumeration|fork|interface|join|service)>>|\[\[(?:choice|fork|join)\]\]/i,alias:"important"},keyword:[{pattern:/(^[ \t]*)(?:action|callback|class|classDef|classDiagram|click|direction|erDiagram|flowchart|gantt|gitGraph|graph|journey|link|linkStyle|pie|requirementDiagram|sequenceDiagram|stateDiagram|stateDiagram-v2|style|subgraph)(?![\w$-])/m,lookbehind:!0,greedy:!0},{pattern:/(^[ \t]*)(?:activate|alt|and|as|autonumber|deactivate|else|end(?:[ \t]+note)?|loop|opt|par|participant|rect|state|note[ \t]+(?:over|(?:left|right)[ \t]+of))(?![\w$-])/im,lookbehind:!0,greedy:!0}],entity:/#[a-z0-9]+;/,operator:{pattern:/(\w[ \t]*)&(?=[ \t]*\w)|:::|:/,lookbehind:!0},punctuation:/[(){};]/}}return hw}var bw,oL;function Cve(){if(oL)return bw;oL=1,bw=e,e.displayName="mizar",e.aliases=[];function e(t){t.languages.mizar={comment:/::.+/,keyword:/@proof\b|\b(?:according|aggregate|all|and|antonym|are|as|associativity|assume|asymmetry|attr|be|begin|being|by|canceled|case|cases|clusters?|coherence|commutativity|compatibility|connectedness|consider|consistency|constructors|contradiction|correctness|def|deffunc|define|definitions?|defpred|do|does|end|environ|equals|ex|exactly|existence|for|from|func|given|hence|hereby|holds|idempotence|identity|iff?|implies|involutiveness|irreflexivity|is|it|let|means|mode|non|not|notations?|now|of|or|otherwise|over|per|pred|prefix|projectivity|proof|provided|qua|reconsider|redefine|reduce|reducibility|reflexivity|registrations?|requirements|reserve|sch|schemes?|section|selector|set|sethood|st|struct|such|suppose|symmetry|synonym|take|that|the|then|theorems?|thesis|thus|to|transitivity|uniqueness|vocabular(?:ies|y)|when|where|with|wrt)\b/,parameter:{pattern:/\$(?:10|\d)/,alias:"variable"},variable:/\b\w+(?=:)/,number:/(?:\b|-)\d+\b/,operator:/\.\.\.|->|&|\.?=/,punctuation:/\(#|#\)|[,:;\[\](){}]/}}return bw}var yw,iL;function _ve(){if(iL)return yw;iL=1,yw=e,e.displayName="mongodb",e.aliases=[];function e(t){(function(n){var r=["$eq","$gt","$gte","$in","$lt","$lte","$ne","$nin","$and","$not","$nor","$or","$exists","$type","$expr","$jsonSchema","$mod","$regex","$text","$where","$geoIntersects","$geoWithin","$near","$nearSphere","$all","$elemMatch","$size","$bitsAllClear","$bitsAllSet","$bitsAnyClear","$bitsAnySet","$comment","$elemMatch","$meta","$slice","$currentDate","$inc","$min","$max","$mul","$rename","$set","$setOnInsert","$unset","$addToSet","$pop","$pull","$push","$pullAll","$each","$position","$slice","$sort","$bit","$addFields","$bucket","$bucketAuto","$collStats","$count","$currentOp","$facet","$geoNear","$graphLookup","$group","$indexStats","$limit","$listLocalSessions","$listSessions","$lookup","$match","$merge","$out","$planCacheStats","$project","$redact","$replaceRoot","$replaceWith","$sample","$set","$skip","$sort","$sortByCount","$unionWith","$unset","$unwind","$setWindowFields","$abs","$accumulator","$acos","$acosh","$add","$addToSet","$allElementsTrue","$and","$anyElementTrue","$arrayElemAt","$arrayToObject","$asin","$asinh","$atan","$atan2","$atanh","$avg","$binarySize","$bsonSize","$ceil","$cmp","$concat","$concatArrays","$cond","$convert","$cos","$dateFromParts","$dateToParts","$dateFromString","$dateToString","$dayOfMonth","$dayOfWeek","$dayOfYear","$degreesToRadians","$divide","$eq","$exp","$filter","$first","$floor","$function","$gt","$gte","$hour","$ifNull","$in","$indexOfArray","$indexOfBytes","$indexOfCP","$isArray","$isNumber","$isoDayOfWeek","$isoWeek","$isoWeekYear","$last","$last","$let","$literal","$ln","$log","$log10","$lt","$lte","$ltrim","$map","$max","$mergeObjects","$meta","$min","$millisecond","$minute","$mod","$month","$multiply","$ne","$not","$objectToArray","$or","$pow","$push","$radiansToDegrees","$range","$reduce","$regexFind","$regexFindAll","$regexMatch","$replaceOne","$replaceAll","$reverseArray","$round","$rtrim","$second","$setDifference","$setEquals","$setIntersection","$setIsSubset","$setUnion","$size","$sin","$slice","$split","$sqrt","$stdDevPop","$stdDevSamp","$strcasecmp","$strLenBytes","$strLenCP","$substr","$substrBytes","$substrCP","$subtract","$sum","$switch","$tan","$toBool","$toDate","$toDecimal","$toDouble","$toInt","$toLong","$toObjectId","$toString","$toLower","$toUpper","$trim","$trunc","$type","$week","$year","$zip","$count","$dateAdd","$dateDiff","$dateSubtract","$dateTrunc","$getField","$rand","$sampleRate","$setField","$unsetField","$comment","$explain","$hint","$max","$maxTimeMS","$min","$orderby","$query","$returnKey","$showDiskLoc","$natural"],a=["ObjectId","Code","BinData","DBRef","Timestamp","NumberLong","NumberDecimal","MaxKey","MinKey","RegExp","ISODate","UUID"];r=r.map(function(i){return i.replace("$","\\$")});var o="(?:"+r.join("|")+")\\b";n.languages.mongodb=n.languages.extend("javascript",{}),n.languages.insertBefore("mongodb","string",{property:{pattern:/(?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)(?=\s*:)/,greedy:!0,inside:{keyword:RegExp(`^(['"])?`+o+"(?:\\1)?$")}}}),n.languages.mongodb.string.inside={url:{pattern:/https?:\/\/[-\w@:%.+~#=]{1,256}\.[a-z0-9()]{1,6}\b[-\w()@:%+.~#?&/=]*/i,greedy:!0},entity:{pattern:/\b(?:(?:[01]?\d\d?|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d\d?|2[0-4]\d|25[0-5])\b/,greedy:!0}},n.languages.insertBefore("mongodb","constant",{builtin:{pattern:RegExp("\\b(?:"+a.join("|")+")\\b"),alias:"keyword"}})})(t)}return yw}var vw,sL;function Ave(){if(sL)return vw;sL=1,vw=e,e.displayName="monkey",e.aliases=[];function e(t){t.languages.monkey={comment:{pattern:/^#Rem\s[\s\S]*?^#End|'.+/im,greedy:!0},string:{pattern:/"[^"\r\n]*"/,greedy:!0},preprocessor:{pattern:/(^[ \t]*)#.+/m,lookbehind:!0,greedy:!0,alias:"property"},function:/\b\w+(?=\()/,"type-char":{pattern:/\b[?%#$]/,alias:"class-name"},number:{pattern:/((?:\.\.)?)(?:(?:\b|\B-\.?|\B\.)\d+(?:(?!\.\.)\.\d*)?|\$[\da-f]+)/i,lookbehind:!0},keyword:/\b(?:Abstract|Array|Bool|Case|Catch|Class|Const|Continue|Default|Eachin|Else|ElseIf|End|EndIf|Exit|Extends|Extern|False|Field|Final|Float|For|Forever|Function|Global|If|Implements|Import|Inline|Int|Interface|Local|Method|Module|New|Next|Null|Object|Private|Property|Public|Repeat|Return|Select|Self|Step|Strict|String|Super|Then|Throw|To|True|Try|Until|Void|Wend|While)\b/i,operator:/\.\.|<[=>]?|>=?|:?=|(?:[+\-*\/&~|]|\b(?:Mod|Shl|Shr)\b)=?|\b(?:And|Not|Or)\b/i,punctuation:/[.,:;()\[\]]/}}return vw}var Sw,lL;function Tve(){if(lL)return Sw;lL=1,Sw=e,e.displayName="moonscript",e.aliases=["moon"];function e(t){t.languages.moonscript={comment:/--.*/,string:[{pattern:/'[^']*'|\[(=*)\[[\s\S]*?\]\1\]/,greedy:!0},{pattern:/"[^"]*"/,greedy:!0,inside:{interpolation:{pattern:/#\{[^{}]*\}/,inside:{moonscript:{pattern:/(^#\{)[\s\S]+(?=\})/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/#\{|\}/,alias:"punctuation"}}}}}],"class-name":[{pattern:/(\b(?:class|extends)[ \t]+)\w+/,lookbehind:!0},/\b[A-Z]\w*/],keyword:/\b(?:class|continue|do|else|elseif|export|extends|for|from|if|import|in|local|nil|return|self|super|switch|then|unless|using|when|while|with)\b/,variable:/@@?\w*/,property:{pattern:/\b(?!\d)\w+(?=:)|(:)(?!\d)\w+/,lookbehind:!0},function:{pattern:/\b(?:_G|_VERSION|assert|collectgarbage|coroutine\.(?:create|resume|running|status|wrap|yield)|debug\.(?:debug|getfenv|gethook|getinfo|getlocal|getmetatable|getregistry|getupvalue|setfenv|sethook|setlocal|setmetatable|setupvalue|traceback)|dofile|error|getfenv|getmetatable|io\.(?:close|flush|input|lines|open|output|popen|read|stderr|stdin|stdout|tmpfile|type|write)|ipairs|load|loadfile|loadstring|math\.(?:abs|acos|asin|atan|atan2|ceil|cos|cosh|deg|exp|floor|fmod|frexp|ldexp|log|log10|max|min|modf|pi|pow|rad|random|randomseed|sin|sinh|sqrt|tan|tanh)|module|next|os\.(?:clock|date|difftime|execute|exit|getenv|remove|rename|setlocale|time|tmpname)|package\.(?:cpath|loaded|loadlib|path|preload|seeall)|pairs|pcall|print|rawequal|rawget|rawset|require|select|setfenv|setmetatable|string\.(?:byte|char|dump|find|format|gmatch|gsub|len|lower|match|rep|reverse|sub|upper)|table\.(?:concat|insert|maxn|remove|sort)|tonumber|tostring|type|unpack|xpcall)\b/,inside:{punctuation:/\./}},boolean:/\b(?:false|true)\b/,number:/(?:\B\.\d+|\b\d+\.\d+|\b\d+(?=[eE]))(?:[eE][-+]?\d+)?\b|\b(?:0x[a-fA-F\d]+|\d+)(?:U?LL)?\b/,operator:/\.{3}|[-=]>|~=|(?:[-+*/%<>!=]|\.\.)=?|[:#^]|\b(?:and|or)\b=?|\b(?:not)\b/,punctuation:/[.,()[\]{}\\]/},t.languages.moonscript.string[1].inside.interpolation.inside.moonscript.inside=t.languages.moonscript,t.languages.moon=t.languages.moonscript}return Sw}var ww,cL;function Rve(){if(cL)return ww;cL=1,ww=e,e.displayName="n1ql",e.aliases=[];function e(t){t.languages.n1ql={comment:{pattern:/\/\*[\s\S]*?(?:$|\*\/)|--.*/,greedy:!0},string:{pattern:/(["'])(?:\\[\s\S]|(?!\1)[^\\]|\1\1)*\1/,greedy:!0},identifier:{pattern:/`(?:\\[\s\S]|[^\\`]|``)*`/,greedy:!0},parameter:/\$[\w.]+/,keyword:/\b(?:ADVISE|ALL|ALTER|ANALYZE|AS|ASC|AT|BEGIN|BINARY|BOOLEAN|BREAK|BUCKET|BUILD|BY|CALL|CAST|CLUSTER|COLLATE|COLLECTION|COMMIT|COMMITTED|CONNECT|CONTINUE|CORRELATE|CORRELATED|COVER|CREATE|CURRENT|DATABASE|DATASET|DATASTORE|DECLARE|DECREMENT|DELETE|DERIVED|DESC|DESCRIBE|DISTINCT|DO|DROP|EACH|ELEMENT|EXCEPT|EXCLUDE|EXECUTE|EXPLAIN|FETCH|FILTER|FLATTEN|FLUSH|FOLLOWING|FOR|FORCE|FROM|FTS|FUNCTION|GOLANG|GRANT|GROUP|GROUPS|GSI|HASH|HAVING|IF|IGNORE|ILIKE|INCLUDE|INCREMENT|INDEX|INFER|INLINE|INNER|INSERT|INTERSECT|INTO|IS|ISOLATION|JAVASCRIPT|JOIN|KEY|KEYS|KEYSPACE|KNOWN|LANGUAGE|LAST|LEFT|LET|LETTING|LEVEL|LIMIT|LSM|MAP|MAPPING|MATCHED|MATERIALIZED|MERGE|MINUS|MISSING|NAMESPACE|NEST|NL|NO|NTH_VALUE|NULL|NULLS|NUMBER|OBJECT|OFFSET|ON|OPTION|OPTIONS|ORDER|OTHERS|OUTER|OVER|PARSE|PARTITION|PASSWORD|PATH|POOL|PRECEDING|PREPARE|PRIMARY|PRIVATE|PRIVILEGE|PROBE|PROCEDURE|PUBLIC|RANGE|RAW|REALM|REDUCE|RENAME|RESPECT|RETURN|RETURNING|REVOKE|RIGHT|ROLE|ROLLBACK|ROW|ROWS|SATISFIES|SAVEPOINT|SCHEMA|SCOPE|SELECT|SELF|SEMI|SET|SHOW|SOME|START|STATISTICS|STRING|SYSTEM|TIES|TO|TRAN|TRANSACTION|TRIGGER|TRUNCATE|UNBOUNDED|UNDER|UNION|UNIQUE|UNKNOWN|UNNEST|UNSET|UPDATE|UPSERT|USE|USER|USING|VALIDATE|VALUE|VALUES|VIA|VIEW|WHERE|WHILE|WINDOW|WITH|WORK|XOR)\b/i,function:/\b[a-z_]\w*(?=\s*\()/i,boolean:/\b(?:FALSE|TRUE)\b/i,number:/(?:\b\d+\.|\B\.)\d+e[+\-]?\d+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/%]|!=|==?|\|\||<[>=]?|>=?|\b(?:AND|ANY|ARRAY|BETWEEN|CASE|ELSE|END|EVERY|EXISTS|FIRST|IN|LIKE|NOT|OR|THEN|VALUED|WHEN|WITHIN)\b/i,punctuation:/[;[\](),.{}:]/}}return ww}var Ew,uL;function Nve(){if(uL)return Ew;uL=1,Ew=e,e.displayName="n4js",e.aliases=["n4jsd"];function e(t){t.languages.n4js=t.languages.extend("javascript",{keyword:/\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),t.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),t.languages.n4jsd=t.languages.n4js}return Ew}var xw,dL;function Ive(){if(dL)return xw;dL=1,xw=e,e.displayName="nand2tetrisHdl",e.aliases=[];function e(t){t.languages["nand2tetris-hdl"]={comment:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,keyword:/\b(?:BUILTIN|CHIP|CLOCKED|IN|OUT|PARTS)\b/,boolean:/\b(?:false|true)\b/,function:/\b[A-Za-z][A-Za-z0-9]*(?=\()/,number:/\b\d+\b/,operator:/=|\.\./,punctuation:/[{}[\];(),:]/}}return xw}var kw,fL;function Ove(){if(fL)return kw;fL=1,kw=e,e.displayName="naniscript",e.aliases=[];function e(t){(function(n){var r=/\{[^\r\n\[\]{}]*\}/,a={"quoted-string":{pattern:/"(?:[^"\\]|\\.)*"/,alias:"operator"},"command-param-id":{pattern:/(\s)\w+:/,lookbehind:!0,alias:"property"},"command-param-value":[{pattern:r,alias:"selector"},{pattern:/([\t ])\S+/,lookbehind:!0,greedy:!0,alias:"operator"},{pattern:/\S(?:.*\S)?/,alias:"operator"}]};n.languages.naniscript={comment:{pattern:/^([\t ]*);.*/m,lookbehind:!0},define:{pattern:/^>.+/m,alias:"tag",inside:{value:{pattern:/(^>\w+[\t ]+)(?!\s)[^{}\r\n]+/,lookbehind:!0,alias:"operator"},key:{pattern:/(^>)\w+/,lookbehind:!0}}},label:{pattern:/^([\t ]*)#[\t ]*\w+[\t ]*$/m,lookbehind:!0,alias:"regex"},command:{pattern:/^([\t ]*)@\w+(?=[\t ]|$).*/m,lookbehind:!0,alias:"function",inside:{"command-name":/^@\w+/,expression:{pattern:r,greedy:!0,alias:"selector"},"command-params":{pattern:/\s*\S[\s\S]*/,inside:a}}},"generic-text":{pattern:/(^[ \t]*)[^#@>;\s].*/m,lookbehind:!0,alias:"punctuation",inside:{"escaped-char":/\\[{}\[\]"]/,expression:{pattern:r,greedy:!0,alias:"selector"},"inline-command":{pattern:/\[[\t ]*\w[^\r\n\[\]]*\]/,greedy:!0,alias:"function",inside:{"command-params":{pattern:/(^\[[\t ]*\w+\b)[\s\S]+(?=\]$)/,lookbehind:!0,inside:a},"command-param-name":{pattern:/^(\[[\t ]*)\w+/,lookbehind:!0,alias:"name"},"start-stop-char":/[\[\]]/}}}}},n.languages.nani=n.languages.naniscript,n.hooks.add("after-tokenize",function(s){var l=s.tokens;l.forEach(function(c){if(typeof c!="string"&&c.type==="generic-text"){var u=i(c);o(u)||(c.type="bad-line",c.content=u)}})});function o(s){for(var l="[]{}",c=[],u=0;u=&|$!]/}}return Cw}var _w,gL;function Lve(){if(gL)return _w;gL=1,_w=e,e.displayName="neon",e.aliases=[];function e(t){t.languages.neon={comment:{pattern:/#.*/,greedy:!0},datetime:{pattern:/(^|[[{(=:,\s])\d\d\d\d-\d\d?-\d\d?(?:(?:[Tt]| +)\d\d?:\d\d:\d\d(?:\.\d*)? *(?:Z|[-+]\d\d?(?::?\d\d)?)?)?(?=$|[\]}),\s])/,lookbehind:!0,alias:"number"},key:{pattern:/(^|[[{(,\s])[^,:=[\]{}()'"\s]+(?=\s*:(?:$|[\]}),\s])|\s*=)/,lookbehind:!0,alias:"atrule"},number:{pattern:/(^|[[{(=:,\s])[+-]?(?:0x[\da-fA-F]+|0o[0-7]+|0b[01]+|(?:\d+(?:\.\d*)?|\.?\d+)(?:[eE][+-]?\d+)?)(?=$|[\]}),:=\s])/,lookbehind:!0},boolean:{pattern:/(^|[[{(=:,\s])(?:false|no|true|yes)(?=$|[\]}),:=\s])/i,lookbehind:!0},null:{pattern:/(^|[[{(=:,\s])(?:null)(?=$|[\]}),:=\s])/i,lookbehind:!0,alias:"keyword"},string:{pattern:/(^|[[{(=:,\s])(?:('''|""")\r?\n(?:(?:[^\r\n]|\r?\n(?![\t ]*\2))*\r?\n)?[\t ]*\2|'[^'\r\n]*'|"(?:\\.|[^\\"\r\n])*")/,lookbehind:!0,greedy:!0},literal:{pattern:/(^|[[{(=:,\s])(?:[^#"',:=[\]{}()\s`-]|[:-][^"',=[\]{}()\s])(?:[^,:=\]})(\s]|:(?![\s,\]})]|$)|[ \t]+[^#,:=\]})(\s])*/,lookbehind:!0,alias:"string"},punctuation:/[,:=[\]{}()-]/}}return _w}var Aw,mL;function Mve(){if(mL)return Aw;mL=1,Aw=e,e.displayName="nevod",e.aliases=[];function e(t){t.languages.nevod={comment:/\/\/.*|(?:\/\*[\s\S]*?(?:\*\/|$))/,string:{pattern:/(?:"(?:""|[^"])*"(?!")|'(?:''|[^'])*'(?!'))!?\*?/,greedy:!0,inside:{"string-attrs":/!$|!\*$|\*$/}},namespace:{pattern:/(@namespace\s+)[a-zA-Z0-9\-.]+(?=\s*\{)/,lookbehind:!0},pattern:{pattern:/(@pattern\s+)?#?[a-zA-Z0-9\-.]+(?:\s*\(\s*(?:~\s*)?[a-zA-Z0-9\-.]+\s*(?:,\s*(?:~\s*)?[a-zA-Z0-9\-.]*)*\))?(?=\s*=)/,lookbehind:!0,inside:{"pattern-name":{pattern:/^#?[a-zA-Z0-9\-.]+/,alias:"class-name"},fields:{pattern:/\(.*\)/,inside:{"field-name":{pattern:/[a-zA-Z0-9\-.]+/,alias:"variable"},punctuation:/[,()]/,operator:{pattern:/~/,alias:"field-hidden-mark"}}}}},search:{pattern:/(@search\s+|#)[a-zA-Z0-9\-.]+(?:\.\*)?(?=\s*;)/,alias:"function",lookbehind:!0},keyword:/@(?:having|inside|namespace|outside|pattern|require|search|where)\b/,"standard-pattern":{pattern:/\b(?:Alpha|AlphaNum|Any|Blank|End|LineBreak|Num|NumAlpha|Punct|Space|Start|Symbol|Word|WordBreak)\b(?:\([a-zA-Z0-9\-.,\s+]*\))?/,inside:{"standard-pattern-name":{pattern:/^[a-zA-Z0-9\-.]+/,alias:"builtin"},quantifier:{pattern:/\b\d+(?:\s*\+|\s*-\s*\d+)?(?!\w)/,alias:"number"},"standard-pattern-attr":{pattern:/[a-zA-Z0-9\-.]+/,alias:"builtin"},punctuation:/[,()]/}},quantifier:{pattern:/\b\d+(?:\s*\+|\s*-\s*\d+)?(?!\w)/,alias:"number"},operator:[{pattern:/=/,alias:"pattern-def"},{pattern:/&/,alias:"conjunction"},{pattern:/~/,alias:"exception"},{pattern:/\?/,alias:"optionality"},{pattern:/[[\]]/,alias:"repetition"},{pattern:/[{}]/,alias:"variation"},{pattern:/[+_]/,alias:"sequence"},{pattern:/\.{2,3}/,alias:"span"}],"field-capture":[{pattern:/([a-zA-Z0-9\-.]+\s*\()\s*[a-zA-Z0-9\-.]+\s*:\s*[a-zA-Z0-9\-.]+(?:\s*,\s*[a-zA-Z0-9\-.]+\s*:\s*[a-zA-Z0-9\-.]+)*(?=\s*\))/,lookbehind:!0,inside:{"field-name":{pattern:/[a-zA-Z0-9\-.]+/,alias:"variable"},colon:/:/}},{pattern:/[a-zA-Z0-9\-.]+\s*:/,inside:{"field-name":{pattern:/[a-zA-Z0-9\-.]+/,alias:"variable"},colon:/:/}}],punctuation:/[:;,()]/,name:/[a-zA-Z0-9\-.]+/}}return Aw}var Tw,hL;function Pve(){if(hL)return Tw;hL=1,Tw=e,e.displayName="nginx",e.aliases=[];function e(t){(function(n){var r=/\$(?:\w[a-z\d]*(?:_[^\x00-\x1F\s"'\\()$]*)?|\{[^}\s"'\\]+\})/i;n.languages.nginx={comment:{pattern:/(^|[\s{};])#.*/,lookbehind:!0,greedy:!0},directive:{pattern:/(^|\s)\w(?:[^;{}"'\\\s]|\\.|"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|\s+(?:#.*(?!.)|(?![#\s])))*?(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:{string:{pattern:/((?:^|[^\\])(?:\\\\)*)(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,lookbehind:!0,greedy:!0,inside:{escape:{pattern:/\\["'\\nrt]/,alias:"entity"},variable:r}},comment:{pattern:/(\s)#.*/,lookbehind:!0,greedy:!0},keyword:{pattern:/^\S+/,greedy:!0},boolean:{pattern:/(\s)(?:off|on)(?!\S)/,lookbehind:!0},number:{pattern:/(\s)\d+[a-z]*(?!\S)/i,lookbehind:!0},variable:r}},punctuation:/[{};]/}})(t)}return Tw}var Rw,bL;function $ve(){if(bL)return Rw;bL=1,Rw=e,e.displayName="nim",e.aliases=[];function e(t){t.languages.nim={comment:{pattern:/#.*/,greedy:!0},string:{pattern:/(?:\b(?!\d)(?:\w|\\x[89a-fA-F][0-9a-fA-F])+)?(?:"""[\s\S]*?"""(?!")|"(?:\\[\s\S]|""|[^"\\])*")/,greedy:!0},char:{pattern:/'(?:\\(?:\d+|x[\da-fA-F]{0,2}|.)|[^'])'/,greedy:!0},function:{pattern:/(?:(?!\d)(?:\w|\\x[89a-fA-F][0-9a-fA-F])+|`[^`\r\n]+`)\*?(?:\[[^\]]+\])?(?=\s*\()/,greedy:!0,inside:{operator:/\*$/}},identifier:{pattern:/`[^`\r\n]+`/,greedy:!0,inside:{punctuation:/`/}},number:/\b(?:0[xXoObB][\da-fA-F_]+|\d[\d_]*(?:(?!\.\.)\.[\d_]*)?(?:[eE][+-]?\d[\d_]*)?)(?:'?[iuf]\d*)?/,keyword:/\b(?:addr|as|asm|atomic|bind|block|break|case|cast|concept|const|continue|converter|defer|discard|distinct|do|elif|else|end|enum|except|export|finally|for|from|func|generic|if|import|include|interface|iterator|let|macro|method|mixin|nil|object|out|proc|ptr|raise|ref|return|static|template|try|tuple|type|using|var|when|while|with|without|yield)\b/,operator:{pattern:/(^|[({\[](?=\.\.)|(?![({\[]\.).)(?:(?:[=+\-*\/<>@$~&%|!?^:\\]|\.\.|\.(?![)}\]]))+|\b(?:and|div|in|is|isnot|mod|not|notin|of|or|shl|shr|xor)\b)/m,lookbehind:!0},punctuation:/[({\[]\.|\.[)}\]]|[`(){}\[\],:]/}}return Rw}var Nw,yL;function Fve(){if(yL)return Nw;yL=1,Nw=e,e.displayName="nix",e.aliases=[];function e(t){t.languages.nix={comment:{pattern:/\/\*[\s\S]*?\*\/|#.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\[\s\S])*"|''(?:(?!'')[\s\S]|''(?:'|\\|\$\{))*''/,greedy:!0,inside:{interpolation:{pattern:/(^|(?:^|(?!'').)[^\\])\$\{(?:[^{}]|\{[^}]*\})*\}/,lookbehind:!0,inside:null}}},url:[/\b(?:[a-z]{3,7}:\/\/)[\w\-+%~\/.:#=?&]+/,{pattern:/([^\/])(?:[\w\-+%~.:#=?&]*(?!\/\/)[\w\-+%~\/.:#=?&])?(?!\/\/)\/[\w\-+%~\/.:#=?&]*/,lookbehind:!0}],antiquotation:{pattern:/\$(?=\{)/,alias:"important"},number:/\b\d+\b/,keyword:/\b(?:assert|builtins|else|if|in|inherit|let|null|or|then|with)\b/,function:/\b(?:abort|add|all|any|attrNames|attrValues|baseNameOf|compareVersions|concatLists|currentSystem|deepSeq|derivation|dirOf|div|elem(?:At)?|fetch(?:Tarball|url)|filter(?:Source)?|fromJSON|genList|getAttr|getEnv|hasAttr|hashString|head|import|intersectAttrs|is(?:Attrs|Bool|Function|Int|List|Null|String)|length|lessThan|listToAttrs|map|mul|parseDrvName|pathExists|read(?:Dir|File)|removeAttrs|replaceStrings|seq|sort|stringLength|sub(?:string)?|tail|throw|to(?:File|JSON|Path|String|XML)|trace|typeOf)\b|\bfoldl'\B/,boolean:/\b(?:false|true)\b/,operator:/[=!<>]=?|\+\+?|\|\||&&|\/\/|->?|[?@]/,punctuation:/[{}()[\].,:;]/},t.languages.nix.string.inside.interpolation.inside=t.languages.nix}return Nw}var Iw,vL;function jve(){if(vL)return Iw;vL=1,Iw=e,e.displayName="nsis",e.aliases=[];function e(t){t.languages.nsis={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|[#;].*)/,lookbehind:!0,greedy:!0},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:{pattern:/(^[\t ]*)(?:Abort|Add(?:BrandingImage|Size)|AdvSplash|Allow(?:RootDirInstall|SkipFiles)|AutoCloseWindow|BG(?:Font|Gradient|Image)|Banner|BrandingText|BringToFront|CRCCheck|Call(?:InstDLL)?|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|Create(?:Directory|Font|ShortCut)|Delete(?:INISec|INIStr|RegKey|RegValue)?|Detail(?:Print|sButtonText)|Dialer|Dir(?:Text|Var|Verify)|EnableWindow|Enum(?:RegKey|RegValue)|Exch|Exec(?:Shell(?:Wait)?|Wait)?|ExpandEnvStrings|File(?:BufSize|Close|ErrorText|Open|Read|ReadByte|ReadUTF16LE|ReadWord|Seek|Write|WriteByte|WriteUTF16LE|WriteWord)?|Find(?:Close|First|Next|Window)|FlushINI|Get(?:CurInstType|CurrentAddress|DLLVersion(?:Local)?|DlgItem|ErrorLevel|FileTime(?:Local)?|FullPathName|Function(?:Address|End)?|InstDirError|LabelAddress|TempFileName)|Goto|HideWindow|Icon|If(?:Abort|Errors|FileExists|RebootFlag|Silent)|InitPluginsDir|InstProgressFlags|Inst(?:Type(?:GetText|SetText)?)|Install(?:ButtonText|Colors|Dir(?:RegKey)?)|Int(?:64|Ptr)?CmpU?|Int(?:64)?Fmt|Int(?:Ptr)?Op|IsWindow|Lang(?:DLL|String)|License(?:BkColor|Data|ForceSelection|LangString|Text)|LoadLanguageFile|LockWindow|Log(?:Set|Text)|Manifest(?:DPIAware|SupportedOS)|Math|MessageBox|MiscButtonText|NSISdl|Name|Nop|OutFile|PE(?:DllCharacteristics|SubsysVer)|Page(?:Callbacks)?|Pop|Push|Quit|RMDir|Read(?:EnvStr|INIStr|RegDWORD|RegStr)|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|SearchPath|Section(?:End|GetFlags|GetInstTypes|GetSize|GetText|Group|In|SetFlags|SetInstTypes|SetSize|SetText)?|SendMessage|Set(?:AutoClose|BrandingImage|Compress|Compressor(?:DictSize)?|CtlColors|CurInstType|DatablockOptimize|DateSave|Details(?:Print|View)|ErrorLevel|Errors|FileAttributes|Font|OutPath|Overwrite|PluginUnload|RebootFlag|RegView|ShellVarContext|Silent)|Show(?:InstDetails|UninstDetails|Window)|Silent(?:Install|UnInstall)|Sleep|SpaceTexts|Splash|StartMenu|Str(?:CmpS?|Cpy|Len)|SubCaption|System|UnRegDLL|Unicode|UninstPage|Uninstall(?:ButtonText|Caption|Icon|SubCaption|Text)|UserInfo|VI(?:AddVersionKey|FileVersion|ProductVersion)|VPatch|Var|WindowIcon|Write(?:INIStr|Reg(?:Bin|DWORD|ExpandStr|MultiStr|None|Str)|Uninstaller)|XPStyle|ns(?:Dialogs|Exec))\b/m,lookbehind:!0},property:/\b(?:ARCHIVE|FILE_(?:ATTRIBUTE_ARCHIVE|ATTRIBUTE_NORMAL|ATTRIBUTE_OFFLINE|ATTRIBUTE_READONLY|ATTRIBUTE_SYSTEM|ATTRIBUTE_TEMPORARY)|HK(?:(?:CR|CU|LM)(?:32|64)?|DD|PD|U)|HKEY_(?:CLASSES_ROOT|CURRENT_CONFIG|CURRENT_USER|DYN_DATA|LOCAL_MACHINE|PERFORMANCE_DATA|USERS)|ID(?:ABORT|CANCEL|IGNORE|NO|OK|RETRY|YES)|MB_(?:ABORTRETRYIGNORE|DEFBUTTON1|DEFBUTTON2|DEFBUTTON3|DEFBUTTON4|ICONEXCLAMATION|ICONINFORMATION|ICONQUESTION|ICONSTOP|OK|OKCANCEL|RETRYCANCEL|RIGHT|RTLREADING|SETFOREGROUND|TOPMOST|USERICON|YESNO)|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SYSTEM|TEMPORARY|admin|all|auto|both|colored|false|force|hide|highest|lastused|leave|listonly|none|normal|notset|off|on|open|print|show|silent|silentlog|smooth|textonly|true|user)\b/,constant:/\$\{[!\w\.:\^-]+\}|\$\([!\w\.:\^-]+\)/,variable:/\$\w[\w\.]*/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--?|\+\+?|<=?|>=?|==?=?|&&?|\|\|?|[?*\/~^%]/,punctuation:/[{}[\];(),.:]/,important:{pattern:/(^[\t ]*)!(?:addincludedir|addplugindir|appendfile|cd|define|delfile|echo|else|endif|error|execute|finalize|getdllversion|gettlbversion|if|ifdef|ifmacrodef|ifmacrondef|ifndef|include|insertmacro|macro|macroend|makensis|packhdr|pragma|searchparse|searchreplace|system|tempfile|undef|verbose|warning)\b/im,lookbehind:!0}}}return Iw}var Ow,SL;function zve(){if(SL)return Ow;SL=1;var e=Ws();Ow=t,t.displayName="objectivec",t.aliases=["objc"];function t(n){n.register(e),n.languages.objectivec=n.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete n.languages.objectivec["class-name"],n.languages.objc=n.languages.objectivec}return Ow}var Dw,wL;function Uve(){if(wL)return Dw;wL=1,Dw=e,e.displayName="ocaml",e.aliases=[];function e(t){t.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/}}return Dw}var Lw,EL;function Bve(){if(EL)return Lw;EL=1;var e=Ws();Lw=t,t.displayName="opencl",t.aliases=[];function t(n){n.register(e),function(r){r.languages.opencl=r.languages.extend("c",{keyword:/\b(?:(?:__)?(?:constant|global|kernel|local|private|read_only|read_write|write_only)|__attribute__|auto|(?:bool|u?(?:char|int|long|short)|half|quad)(?:2|3|4|8|16)?|break|case|complex|const|continue|(?:double|float)(?:16(?:x(?:1|2|4|8|16))?|1x(?:1|2|4|8|16)|2(?:x(?:1|2|4|8|16))?|3|4(?:x(?:1|2|4|8|16))?|8(?:x(?:1|2|4|8|16))?)?|default|do|else|enum|extern|for|goto|if|imaginary|inline|packed|pipe|register|restrict|return|signed|sizeof|static|struct|switch|typedef|uniform|union|unsigned|void|volatile|while)\b/,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[fuhl]{0,4}/i,boolean:/\b(?:false|true)\b/,"constant-opencl-kernel":{pattern:/\b(?:CHAR_(?:BIT|MAX|MIN)|CLK_(?:ADDRESS_(?:CLAMP(?:_TO_EDGE)?|NONE|REPEAT)|FILTER_(?:LINEAR|NEAREST)|(?:GLOBAL|LOCAL)_MEM_FENCE|NORMALIZED_COORDS_(?:FALSE|TRUE))|CL_(?:BGRA|(?:HALF_)?FLOAT|INTENSITY|LUMINANCE|A?R?G?B?[Ax]?|(?:(?:UN)?SIGNED|[US]NORM)_(?:INT(?:8|16|32))|UNORM_(?:INT_101010|SHORT_(?:555|565)))|(?:DBL|FLT|HALF)_(?:DIG|EPSILON|(?:MAX|MIN)(?:(?:_10)?_EXP)?|MANT_DIG)|FLT_RADIX|HUGE_VALF?|(?:INT|LONG|SCHAR|SHRT)_(?:MAX|MIN)|INFINITY|MAXFLOAT|M_(?:[12]_PI|2_SQRTPI|E|LN(?:2|10)|LOG(?:2|10)E?|PI(?:_[24])?|SQRT(?:1_2|2))(?:_F|_H)?|NAN|(?:UCHAR|UINT|ULONG|USHRT)_MAX)\b/,alias:"constant"}}),r.languages.insertBefore("opencl","class-name",{"builtin-type":{pattern:/\b(?:_cl_(?:command_queue|context|device_id|event|kernel|mem|platform_id|program|sampler)|cl_(?:image_format|mem_fence_flags)|clk_event_t|event_t|image(?:1d_(?:array_|buffer_)?t|2d_(?:array_(?:depth_|msaa_depth_|msaa_)?|depth_|msaa_depth_|msaa_)?t|3d_t)|intptr_t|ndrange_t|ptrdiff_t|queue_t|reserve_id_t|sampler_t|size_t|uintptr_t)\b/,alias:"keyword"}});var a={"type-opencl-host":{pattern:/\b(?:cl_(?:GLenum|GLint|GLuin|addressing_mode|bitfield|bool|buffer_create_type|build_status|channel_(?:order|type)|(?:u?(?:char|int|long|short)|double|float)(?:2|3|4|8|16)?|command_(?:queue(?:_info|_properties)?|type)|context(?:_info|_properties)?|device_(?:exec_capabilities|fp_config|id|info|local_mem_type|mem_cache_type|type)|(?:event|sampler)(?:_info)?|filter_mode|half|image_info|kernel(?:_info|_work_group_info)?|map_flags|mem(?:_flags|_info|_object_type)?|platform_(?:id|info)|profiling_info|program(?:_build_info|_info)?))\b/,alias:"keyword"},"boolean-opencl-host":{pattern:/\bCL_(?:FALSE|TRUE)\b/,alias:"boolean"},"constant-opencl-host":{pattern:/\bCL_(?:A|ABGR|ADDRESS_(?:CLAMP(?:_TO_EDGE)?|MIRRORED_REPEAT|NONE|REPEAT)|ARGB|BGRA|BLOCKING|BUFFER_CREATE_TYPE_REGION|BUILD_(?:ERROR|IN_PROGRESS|NONE|PROGRAM_FAILURE|SUCCESS)|COMMAND_(?:ACQUIRE_GL_OBJECTS|BARRIER|COPY_(?:BUFFER(?:_RECT|_TO_IMAGE)?|IMAGE(?:_TO_BUFFER)?)|FILL_(?:BUFFER|IMAGE)|MAP(?:_BUFFER|_IMAGE)|MARKER|MIGRATE(?:_SVM)?_MEM_OBJECTS|NATIVE_KERNEL|NDRANGE_KERNEL|READ_(?:BUFFER(?:_RECT)?|IMAGE)|RELEASE_GL_OBJECTS|SVM_(?:FREE|MAP|MEMCPY|MEMFILL|UNMAP)|TASK|UNMAP_MEM_OBJECT|USER|WRITE_(?:BUFFER(?:_RECT)?|IMAGE))|COMPILER_NOT_AVAILABLE|COMPILE_PROGRAM_FAILURE|COMPLETE|CONTEXT_(?:DEVICES|INTEROP_USER_SYNC|NUM_DEVICES|PLATFORM|PROPERTIES|REFERENCE_COUNT)|DEPTH(?:_STENCIL)?|DEVICE_(?:ADDRESS_BITS|AFFINITY_DOMAIN_(?:L[1-4]_CACHE|NEXT_PARTITIONABLE|NUMA)|AVAILABLE|BUILT_IN_KERNELS|COMPILER_AVAILABLE|DOUBLE_FP_CONFIG|ENDIAN_LITTLE|ERROR_CORRECTION_SUPPORT|EXECUTION_CAPABILITIES|EXTENSIONS|GLOBAL_(?:MEM_(?:CACHELINE_SIZE|CACHE_SIZE|CACHE_TYPE|SIZE)|VARIABLE_PREFERRED_TOTAL_SIZE)|HOST_UNIFIED_MEMORY|IL_VERSION|IMAGE(?:2D_MAX_(?:HEIGHT|WIDTH)|3D_MAX_(?:DEPTH|HEIGHT|WIDTH)|_BASE_ADDRESS_ALIGNMENT|_MAX_ARRAY_SIZE|_MAX_BUFFER_SIZE|_PITCH_ALIGNMENT|_SUPPORT)|LINKER_AVAILABLE|LOCAL_MEM_SIZE|LOCAL_MEM_TYPE|MAX_(?:CLOCK_FREQUENCY|COMPUTE_UNITS|CONSTANT_ARGS|CONSTANT_BUFFER_SIZE|GLOBAL_VARIABLE_SIZE|MEM_ALLOC_SIZE|NUM_SUB_GROUPS|ON_DEVICE_(?:EVENTS|QUEUES)|PARAMETER_SIZE|PIPE_ARGS|READ_IMAGE_ARGS|READ_WRITE_IMAGE_ARGS|SAMPLERS|WORK_GROUP_SIZE|WORK_ITEM_DIMENSIONS|WORK_ITEM_SIZES|WRITE_IMAGE_ARGS)|MEM_BASE_ADDR_ALIGN|MIN_DATA_TYPE_ALIGN_SIZE|NAME|NATIVE_VECTOR_WIDTH_(?:CHAR|DOUBLE|FLOAT|HALF|INT|LONG|SHORT)|NOT_(?:AVAILABLE|FOUND)|OPENCL_C_VERSION|PARENT_DEVICE|PARTITION_(?:AFFINITY_DOMAIN|BY_AFFINITY_DOMAIN|BY_COUNTS|BY_COUNTS_LIST_END|EQUALLY|FAILED|MAX_SUB_DEVICES|PROPERTIES|TYPE)|PIPE_MAX_(?:ACTIVE_RESERVATIONS|PACKET_SIZE)|PLATFORM|PREFERRED_(?:GLOBAL_ATOMIC_ALIGNMENT|INTEROP_USER_SYNC|LOCAL_ATOMIC_ALIGNMENT|PLATFORM_ATOMIC_ALIGNMENT|VECTOR_WIDTH_(?:CHAR|DOUBLE|FLOAT|HALF|INT|LONG|SHORT))|PRINTF_BUFFER_SIZE|PROFILE|PROFILING_TIMER_RESOLUTION|QUEUE_(?:ON_(?:DEVICE_(?:MAX_SIZE|PREFERRED_SIZE|PROPERTIES)|HOST_PROPERTIES)|PROPERTIES)|REFERENCE_COUNT|SINGLE_FP_CONFIG|SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS|SVM_(?:ATOMICS|CAPABILITIES|COARSE_GRAIN_BUFFER|FINE_GRAIN_BUFFER|FINE_GRAIN_SYSTEM)|TYPE(?:_ACCELERATOR|_ALL|_CPU|_CUSTOM|_DEFAULT|_GPU)?|VENDOR(?:_ID)?|VERSION)|DRIVER_VERSION|EVENT_(?:COMMAND_(?:EXECUTION_STATUS|QUEUE|TYPE)|CONTEXT|REFERENCE_COUNT)|EXEC_(?:KERNEL|NATIVE_KERNEL|STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST)|FILTER_(?:LINEAR|NEAREST)|FLOAT|FP_(?:CORRECTLY_ROUNDED_DIVIDE_SQRT|DENORM|FMA|INF_NAN|ROUND_TO_INF|ROUND_TO_NEAREST|ROUND_TO_ZERO|SOFT_FLOAT)|GLOBAL|HALF_FLOAT|IMAGE_(?:ARRAY_SIZE|BUFFER|DEPTH|ELEMENT_SIZE|FORMAT|FORMAT_MISMATCH|FORMAT_NOT_SUPPORTED|HEIGHT|NUM_MIP_LEVELS|NUM_SAMPLES|ROW_PITCH|SLICE_PITCH|WIDTH)|INTENSITY|INVALID_(?:ARG_INDEX|ARG_SIZE|ARG_VALUE|BINARY|BUFFER_SIZE|BUILD_OPTIONS|COMMAND_QUEUE|COMPILER_OPTIONS|CONTEXT|DEVICE|DEVICE_PARTITION_COUNT|DEVICE_QUEUE|DEVICE_TYPE|EVENT|EVENT_WAIT_LIST|GLOBAL_OFFSET|GLOBAL_WORK_SIZE|GL_OBJECT|HOST_PTR|IMAGE_DESCRIPTOR|IMAGE_FORMAT_DESCRIPTOR|IMAGE_SIZE|KERNEL|KERNEL_ARGS|KERNEL_DEFINITION|KERNEL_NAME|LINKER_OPTIONS|MEM_OBJECT|MIP_LEVEL|OPERATION|PIPE_SIZE|PLATFORM|PROGRAM|PROGRAM_EXECUTABLE|PROPERTY|QUEUE_PROPERTIES|SAMPLER|VALUE|WORK_DIMENSION|WORK_GROUP_SIZE|WORK_ITEM_SIZE)|KERNEL_(?:ARG_(?:ACCESS_(?:NONE|QUALIFIER|READ_ONLY|READ_WRITE|WRITE_ONLY)|ADDRESS_(?:CONSTANT|GLOBAL|LOCAL|PRIVATE|QUALIFIER)|INFO_NOT_AVAILABLE|NAME|TYPE_(?:CONST|NAME|NONE|PIPE|QUALIFIER|RESTRICT|VOLATILE))|ATTRIBUTES|COMPILE_NUM_SUB_GROUPS|COMPILE_WORK_GROUP_SIZE|CONTEXT|EXEC_INFO_SVM_FINE_GRAIN_SYSTEM|EXEC_INFO_SVM_PTRS|FUNCTION_NAME|GLOBAL_WORK_SIZE|LOCAL_MEM_SIZE|LOCAL_SIZE_FOR_SUB_GROUP_COUNT|MAX_NUM_SUB_GROUPS|MAX_SUB_GROUP_SIZE_FOR_NDRANGE|NUM_ARGS|PREFERRED_WORK_GROUP_SIZE_MULTIPLE|PRIVATE_MEM_SIZE|PROGRAM|REFERENCE_COUNT|SUB_GROUP_COUNT_FOR_NDRANGE|WORK_GROUP_SIZE)|LINKER_NOT_AVAILABLE|LINK_PROGRAM_FAILURE|LOCAL|LUMINANCE|MAP_(?:FAILURE|READ|WRITE|WRITE_INVALIDATE_REGION)|MEM_(?:ALLOC_HOST_PTR|ASSOCIATED_MEMOBJECT|CONTEXT|COPY_HOST_PTR|COPY_OVERLAP|FLAGS|HOST_NO_ACCESS|HOST_PTR|HOST_READ_ONLY|HOST_WRITE_ONLY|KERNEL_READ_AND_WRITE|MAP_COUNT|OBJECT_(?:ALLOCATION_FAILURE|BUFFER|IMAGE1D|IMAGE1D_ARRAY|IMAGE1D_BUFFER|IMAGE2D|IMAGE2D_ARRAY|IMAGE3D|PIPE)|OFFSET|READ_ONLY|READ_WRITE|REFERENCE_COUNT|SIZE|SVM_ATOMICS|SVM_FINE_GRAIN_BUFFER|TYPE|USES_SVM_POINTER|USE_HOST_PTR|WRITE_ONLY)|MIGRATE_MEM_OBJECT_(?:CONTENT_UNDEFINED|HOST)|MISALIGNED_SUB_BUFFER_OFFSET|NONE|NON_BLOCKING|OUT_OF_(?:HOST_MEMORY|RESOURCES)|PIPE_(?:MAX_PACKETS|PACKET_SIZE)|PLATFORM_(?:EXTENSIONS|HOST_TIMER_RESOLUTION|NAME|PROFILE|VENDOR|VERSION)|PROFILING_(?:COMMAND_(?:COMPLETE|END|QUEUED|START|SUBMIT)|INFO_NOT_AVAILABLE)|PROGRAM_(?:BINARIES|BINARY_SIZES|BINARY_TYPE(?:_COMPILED_OBJECT|_EXECUTABLE|_LIBRARY|_NONE)?|BUILD_(?:GLOBAL_VARIABLE_TOTAL_SIZE|LOG|OPTIONS|STATUS)|CONTEXT|DEVICES|IL|KERNEL_NAMES|NUM_DEVICES|NUM_KERNELS|REFERENCE_COUNT|SOURCE)|QUEUED|QUEUE_(?:CONTEXT|DEVICE|DEVICE_DEFAULT|ON_DEVICE|ON_DEVICE_DEFAULT|OUT_OF_ORDER_EXEC_MODE_ENABLE|PROFILING_ENABLE|PROPERTIES|REFERENCE_COUNT|SIZE)|R|RA|READ_(?:ONLY|WRITE)_CACHE|RG|RGB|RGBA|RGBx|RGx|RUNNING|Rx|SAMPLER_(?:ADDRESSING_MODE|CONTEXT|FILTER_MODE|LOD_MAX|LOD_MIN|MIP_FILTER_MODE|NORMALIZED_COORDS|REFERENCE_COUNT)|(?:UN)?SIGNED_INT(?:8|16|32)|SNORM_INT(?:8|16)|SUBMITTED|SUCCESS|UNORM_INT(?:8|16|24|_101010|_101010_2)|UNORM_SHORT_(?:555|565)|VERSION_(?:1_0|1_1|1_2|2_0|2_1)|sBGRA|sRGB|sRGBA|sRGBx)\b/,alias:"constant"},"function-opencl-host":{pattern:/\bcl(?:BuildProgram|CloneKernel|CompileProgram|Create(?:Buffer|CommandQueue(?:WithProperties)?|Context|ContextFromType|Image|Image2D|Image3D|Kernel|KernelsInProgram|Pipe|ProgramWith(?:Binary|BuiltInKernels|IL|Source)|Sampler|SamplerWithProperties|SubBuffer|SubDevices|UserEvent)|Enqueue(?:(?:Barrier|Marker)(?:WithWaitList)?|Copy(?:Buffer(?:Rect|ToImage)?|Image(?:ToBuffer)?)|(?:Fill|Map)(?:Buffer|Image)|MigrateMemObjects|NDRangeKernel|NativeKernel|(?:Read|Write)(?:Buffer(?:Rect)?|Image)|SVM(?:Free|Map|MemFill|Memcpy|MigrateMem|Unmap)|Task|UnmapMemObject|WaitForEvents)|Finish|Flush|Get(?:CommandQueueInfo|ContextInfo|Device(?:AndHostTimer|IDs|Info)|Event(?:Profiling)?Info|ExtensionFunctionAddress(?:ForPlatform)?|HostTimer|ImageInfo|Kernel(?:ArgInfo|Info|SubGroupInfo|WorkGroupInfo)|MemObjectInfo|PipeInfo|Platform(?:IDs|Info)|Program(?:Build)?Info|SamplerInfo|SupportedImageFormats)|LinkProgram|(?:Release|Retain)(?:CommandQueue|Context|Device|Event|Kernel|MemObject|Program|Sampler)|SVM(?:Alloc|Free)|Set(?:CommandQueueProperty|DefaultDeviceCommandQueue|EventCallback|Kernel|Kernel(?:Arg(?:SVMPointer)?|ExecInfo)|MemObjectDestructorCallback|UserEventStatus)|Unload(?:Platform)?Compiler|WaitForEvents)\b/,alias:"function"}};r.languages.insertBefore("c","keyword",a),r.languages.cpp&&(a["type-opencl-host-cpp"]={pattern:/\b(?:Buffer|BufferGL|BufferRenderGL|CommandQueue|Context|Device|DeviceCommandQueue|EnqueueArgs|Event|Image|Image1D|Image1DArray|Image1DBuffer|Image2D|Image2DArray|Image2DGL|Image3D|Image3DGL|ImageFormat|ImageGL|Kernel|KernelFunctor|LocalSpaceArg|Memory|NDRange|Pipe|Platform|Program|SVMAllocator|SVMTraitAtomic|SVMTraitCoarse|SVMTraitFine|SVMTraitReadOnly|SVMTraitReadWrite|SVMTraitWriteOnly|Sampler|UserEvent)\b/,alias:"keyword"},r.languages.insertBefore("cpp","keyword",a))}(n)}return Lw}var Mw,xL;function Hve(){if(xL)return Mw;xL=1,Mw=e,e.displayName="openqasm",e.aliases=["qasm"];function e(t){t.languages.openqasm={comment:/\/\*[\s\S]*?\*\/|\/\/.*/,string:{pattern:/"[^"\r\n\t]*"|'[^'\r\n\t]*'/,greedy:!0},keyword:/\b(?:CX|OPENQASM|U|barrier|boxas|boxto|break|const|continue|ctrl|def|defcal|defcalgrammar|delay|else|end|for|gate|gphase|if|in|include|inv|kernel|lengthof|let|measure|pow|reset|return|rotary|stretchinf|while)\b|#pragma\b/,"class-name":/\b(?:angle|bit|bool|creg|fixed|float|int|length|qreg|qubit|stretch|uint)\b/,function:/\b(?:cos|exp|ln|popcount|rotl|rotr|sin|sqrt|tan)\b(?=\s*\()/,constant:/\b(?:euler|pi|tau)\b|π|𝜏|ℇ/,number:{pattern:/(^|[^.\w$])(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?(?:dt|ns|us|µs|ms|s)?/i,lookbehind:!0},operator:/->|>>=?|<<=?|&&|\|\||\+\+|--|[!=<>&|~^+\-*/%]=?|@/,punctuation:/[(){}\[\];,:.]/},t.languages.qasm=t.languages.openqasm}return Mw}var Pw,kL;function Vve(){if(kL)return Pw;kL=1,Pw=e,e.displayName="oz",e.aliases=[];function e(t){t.languages.oz={comment:{pattern:/\/\*[\s\S]*?\*\/|%.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\[\s\S])*"/,greedy:!0},atom:{pattern:/'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,alias:"builtin"},keyword:/\$|\[\]|\b(?:_|at|attr|case|catch|choice|class|cond|declare|define|dis|else(?:case|if)?|end|export|fail|false|feat|finally|from|fun|functor|if|import|in|local|lock|meth|nil|not|of|or|prepare|proc|prop|raise|require|self|skip|then|thread|true|try|unit)\b/,function:[/\b[a-z][A-Za-z\d]*(?=\()/,{pattern:/(\{)[A-Z][A-Za-z\d]*\b/,lookbehind:!0}],number:/\b(?:0[bx][\da-f]+|\d+(?:\.\d*)?(?:e~?\d+)?)\b|&(?:[^\\]|\\(?:\d{3}|.))/i,variable:/`(?:[^`\\]|\\.)+`/,"attr-name":/\b\w+(?=[ \t]*:(?![:=]))/,operator:/:(?:=|::?)|<[-:=]?|=(?:=|=?:?|\\=:?|!!?|[|#+\-*\/,~^@]|\b(?:andthen|div|mod|orelse)\b/,punctuation:/[\[\](){}.:;?]/}}return Pw}var $w,CL;function qve(){if(CL)return $w;CL=1,$w=e,e.displayName="parigp",e.aliases=[];function e(t){t.languages.parigp={comment:/\/\*[\s\S]*?\*\/|\\\\.*/,string:{pattern:/"(?:[^"\\\r\n]|\\.)*"/,greedy:!0},keyword:function(){var n=["breakpoint","break","dbg_down","dbg_err","dbg_up","dbg_x","forcomposite","fordiv","forell","forpart","forprime","forstep","forsubgroup","forvec","for","iferr","if","local","my","next","return","until","while"];return n=n.map(function(r){return r.split("").join(" *")}).join("|"),RegExp("\\b(?:"+n+")\\b")}(),function:/\b\w(?:[\w ]*\w)?(?= *\()/,number:{pattern:/((?:\. *\. *)?)(?:\b\d(?: *\d)*(?: *(?!\. *\.)\.(?: *\d)*)?|\. *\d(?: *\d)*)(?: *e *(?:[+-] *)?\d(?: *\d)*)?/i,lookbehind:!0},operator:/\. *\.|[*\/!](?: *=)?|%(?: *=|(?: *#)?(?: *')*)?|\+(?: *[+=])?|-(?: *[-=>])?|<(?: *>|(?: *<)?(?: *=)?)?|>(?: *>)?(?: *=)?|=(?: *=){0,2}|\\(?: *\/)?(?: *=)?|&(?: *&)?|\| *\||['#~^]/,punctuation:/[\[\]{}().,:;|]/}}return $w}var Fw,_L;function Gve(){if(_L)return Fw;_L=1,Fw=e,e.displayName="parser",e.aliases=[];function e(t){(function(n){var r=n.languages.parser=n.languages.extend("markup",{keyword:{pattern:/(^|[^^])(?:\^(?:case|eval|for|if|switch|throw)\b|@(?:BASE|CLASS|GET(?:_DEFAULT)?|OPTIONS|SET_DEFAULT|USE)\b)/,lookbehind:!0},variable:{pattern:/(^|[^^])\B\$(?:\w+|(?=[.{]))(?:(?:\.|::?)\w+)*(?:\.|::?)?/,lookbehind:!0,inside:{punctuation:/\.|:+/}},function:{pattern:/(^|[^^])\B[@^]\w+(?:(?:\.|::?)\w+)*(?:\.|::?)?/,lookbehind:!0,inside:{keyword:{pattern:/(^@)(?:GET_|SET_)/,lookbehind:!0},punctuation:/\.|:+/}},escape:{pattern:/\^(?:[$^;@()\[\]{}"':]|#[a-f\d]*)/i,alias:"builtin"},punctuation:/[\[\](){};]/});r=n.languages.insertBefore("parser","keyword",{"parser-comment":{pattern:/(\s)#.*/,lookbehind:!0,alias:"comment"},expression:{pattern:/(^|[^^])\((?:[^()]|\((?:[^()]|\((?:[^()])*\))*\))*\)/,greedy:!0,lookbehind:!0,inside:{string:{pattern:/(^|[^^])(["'])(?:(?!\2)[^^]|\^[\s\S])*\2/,lookbehind:!0},keyword:r.keyword,variable:r.variable,function:r.function,boolean:/\b(?:false|true)\b/,number:/\b(?:0x[a-f\d]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?)\b/i,escape:r.escape,operator:/[~+*\/\\%]|!(?:\|\|?|=)?|&&?|\|\|?|==|<[<=]?|>[>=]?|-[fd]?|\b(?:def|eq|ge|gt|in|is|le|lt|ne)\b/,punctuation:r.punctuation}}}),n.languages.insertBefore("inside","punctuation",{expression:r.expression,keyword:r.keyword,variable:r.variable,function:r.function,escape:r.escape,"parser-punctuation":{pattern:r.punctuation,alias:"punctuation"}},r.tag.inside["attr-value"])})(t)}return Fw}var jw,AL;function Wve(){if(AL)return jw;AL=1,jw=e,e.displayName="pascal",e.aliases=["objectpascal"];function e(t){t.languages.pascal={directive:{pattern:/\{\$[\s\S]*?\}/,greedy:!0,alias:["marco","property"]},comment:{pattern:/\(\*[\s\S]*?\*\)|\{[\s\S]*?\}|\/\/.*/,greedy:!0},string:{pattern:/(?:'(?:''|[^'\r\n])*'(?!')|#[&$%]?[a-f\d]+)+|\^[a-z]/i,greedy:!0},asm:{pattern:/(\basm\b)[\s\S]+?(?=\bend\s*[;[])/i,lookbehind:!0,greedy:!0,inside:null},keyword:[{pattern:/(^|[^&])\b(?:absolute|array|asm|begin|case|const|constructor|destructor|do|downto|else|end|file|for|function|goto|if|implementation|inherited|inline|interface|label|nil|object|of|operator|packed|procedure|program|record|reintroduce|repeat|self|set|string|then|to|type|unit|until|uses|var|while|with)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:dispose|exit|false|new|true)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:class|dispinterface|except|exports|finalization|finally|initialization|inline|library|on|out|packed|property|raise|resourcestring|threadvar|try)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:absolute|abstract|alias|assembler|bitpacked|break|cdecl|continue|cppdecl|cvar|default|deprecated|dynamic|enumerator|experimental|export|external|far|far16|forward|generic|helper|implements|index|interrupt|iochecks|local|message|name|near|nodefault|noreturn|nostackframe|oldfpccall|otherwise|overload|override|pascal|platform|private|protected|public|published|read|register|reintroduce|result|safecall|saveregisters|softfloat|specialize|static|stdcall|stored|strict|unaligned|unimplemented|varargs|virtual|write)\b/i,lookbehind:!0}],number:[/(?:[&%]\d+|\$[a-f\d]+)/i,/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?/i],operator:[/\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=]/,{pattern:/(^|[^&])\b(?:and|as|div|exclude|in|include|is|mod|not|or|shl|shr|xor)\b/,lookbehind:!0}],punctuation:/\(\.|\.\)|[()\[\]:;,.]/},t.languages.pascal.asm.inside=t.languages.extend("pascal",{asm:void 0,keyword:void 0,operator:void 0}),t.languages.objectpascal=t.languages.pascal}return jw}var zw,TL;function Kve(){if(TL)return zw;TL=1,zw=e,e.displayName="pascaligo",e.aliases=[];function e(t){(function(n){var r=/\((?:[^()]|\((?:[^()]|\([^()]*\))*\))*\)/.source,a=/(?:\b\w+(?:)?|)/.source.replace(//g,function(){return r}),o=n.languages.pascaligo={comment:/\(\*[\s\S]+?\*\)|\/\/.*/,string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1|\^[a-z]/i,greedy:!0},"class-name":[{pattern:RegExp(/(\btype\s+\w+\s+is\s+)/.source.replace(//g,function(){return a}),"i"),lookbehind:!0,inside:null},{pattern:RegExp(/(?=\s+is\b)/.source.replace(//g,function(){return a}),"i"),inside:null},{pattern:RegExp(/(:\s*)/.source.replace(//g,function(){return a})),lookbehind:!0,inside:null}],keyword:{pattern:/(^|[^&])\b(?:begin|block|case|const|else|end|fail|for|from|function|if|is|nil|of|remove|return|skip|then|type|var|while|with)\b/i,lookbehind:!0},boolean:{pattern:/(^|[^&])\b(?:False|True)\b/i,lookbehind:!0},builtin:{pattern:/(^|[^&])\b(?:bool|int|list|map|nat|record|string|unit)\b/i,lookbehind:!0},function:/\b\w+(?=\s*\()/,number:[/%[01]+|&[0-7]+|\$[a-f\d]+/i,/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?(?:mtz|n)?/i],operator:/->|=\/=|\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=|]|\b(?:and|mod|or)\b/,punctuation:/\(\.|\.\)|[()\[\]:;,.{}]/},i=["comment","keyword","builtin","operator","punctuation"].reduce(function(s,l){return s[l]=o[l],s},{});o["class-name"].forEach(function(s){s.inside=i})})(t)}return zw}var Uw,RL;function Yve(){if(RL)return Uw;RL=1,Uw=e,e.displayName="pcaxis",e.aliases=["px"];function e(t){t.languages.pcaxis={string:/"[^"]*"/,keyword:{pattern:/((?:^|;)\s*)[-A-Z\d]+(?:\s*\[[-\w]+\])?(?:\s*\("[^"]*"(?:,\s*"[^"]*")*\))?(?=\s*=)/,lookbehind:!0,greedy:!0,inside:{keyword:/^[-A-Z\d]+/,language:{pattern:/^(\s*)\[[-\w]+\]/,lookbehind:!0,inside:{punctuation:/^\[|\]$/,property:/[-\w]+/}},"sub-key":{pattern:/^(\s*)\S[\s\S]*/,lookbehind:!0,inside:{parameter:{pattern:/"[^"]*"/,alias:"property"},punctuation:/^\(|\)$|,/}}}},operator:/=/,tlist:{pattern:/TLIST\s*\(\s*\w+(?:(?:\s*,\s*"[^"]*")+|\s*,\s*"[^"]*"-"[^"]*")?\s*\)/,greedy:!0,inside:{function:/^TLIST/,property:{pattern:/^(\s*\(\s*)\w+/,lookbehind:!0},string:/"[^"]*"/,punctuation:/[(),]/,operator:/-/}},punctuation:/[;,]/,number:{pattern:/(^|\s)\d+(?:\.\d+)?(?!\S)/,lookbehind:!0},boolean:/NO|YES/},t.languages.px=t.languages.pcaxis}return Uw}var Bw,NL;function Zve(){if(NL)return Bw;NL=1,Bw=e,e.displayName="peoplecode",e.aliases=["pcode"];function e(t){t.languages.peoplecode={comment:RegExp([/\/\*[\s\S]*?\*\//.source,/\bREM[^;]*;/.source,/<\*(?:[^<*]|\*(?!>)|<(?!\*)|<\*(?:(?!\*>)[\s\S])*\*>)*\*>/.source,/\/\+[\s\S]*?\+\//.source].join("|")),string:{pattern:/'(?:''|[^'\r\n])*'(?!')|"(?:""|[^"\r\n])*"(?!")/,greedy:!0},variable:/%\w+/,"function-definition":{pattern:/((?:^|[^\w-])(?:function|method)\s+)\w+/i,lookbehind:!0,alias:"function"},"class-name":{pattern:/((?:^|[^-\w])(?:as|catch|class|component|create|extends|global|implements|instance|local|of|property|returns)\s+)\w+(?::\w+)*/i,lookbehind:!0,inside:{punctuation:/:/}},keyword:/\b(?:abstract|alias|as|catch|class|component|constant|create|declare|else|end-(?:class|evaluate|for|function|get|if|method|set|try|while)|evaluate|extends|for|function|get|global|if|implements|import|instance|library|local|method|null|of|out|peopleCode|private|program|property|protected|readonly|ref|repeat|returns?|set|step|then|throw|to|try|until|value|when(?:-other)?|while)\b/i,"operator-keyword":{pattern:/\b(?:and|not|or)\b/i,alias:"operator"},function:/[_a-z]\w*(?=\s*\()/i,boolean:/\b(?:false|true)\b/i,number:/\b\d+(?:\.\d+)?\b/,operator:/<>|[<>]=?|!=|\*\*|[-+*/|=@]/,punctuation:/[:.;,()[\]]/},t.languages.pcode=t.languages.peoplecode}return Bw}var Hw,IL;function Xve(){if(IL)return Hw;IL=1,Hw=e,e.displayName="perl",e.aliases=[];function e(t){(function(n){var r=/(?:\((?:[^()\\]|\\[\s\S])*\)|\{(?:[^{}\\]|\\[\s\S])*\}|\[(?:[^[\]\\]|\\[\s\S])*\]|<(?:[^<>\\]|\\[\s\S])*>)/.source;n.languages.perl={comment:[{pattern:/(^\s*)=\w[\s\S]*?=cut.*/m,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0,greedy:!0}],string:[{pattern:RegExp(/\b(?:q|qq|qw|qx)(?![a-zA-Z0-9])\s*/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/([a-zA-Z0-9])(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,r].join("|")+")"),greedy:!0},{pattern:/("|`)(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0},{pattern:/'(?:[^'\\\r\n]|\\.)*'/,greedy:!0}],regex:[{pattern:RegExp(/\b(?:m|qr)(?![a-zA-Z0-9])\s*/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/([a-zA-Z0-9])(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,r].join("|")+")"+/[msixpodualngc]*/.source),greedy:!0},{pattern:RegExp(/(^|[^-])\b(?:s|tr|y)(?![a-zA-Z0-9])\s*/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\2)[^\\]|\\[\s\S])*\2(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,/([a-zA-Z0-9])(?:(?!\3)[^\\]|\\[\s\S])*\3(?:(?!\3)[^\\]|\\[\s\S])*\3/.source,r+/\s*/.source+r].join("|")+")"+/[msixpodualngcer]*/.source),lookbehind:!0,greedy:!0},{pattern:/\/(?:[^\/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~<>!?^]|(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|x|xor)\b))/,greedy:!0}],variable:[/[&*$@%]\{\^[A-Z]+\}/,/[&*$@%]\^[A-Z_]/,/[&*$@%]#?(?=\{)/,/[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+(?![\w$]))+(?:::)*/,/[&*$@%]\d+/,/(?!%=)[$@%][!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/],filehandle:{pattern:/<(?![<=])\S*?>|\b_\b/,alias:"symbol"},"v-string":{pattern:/v\d+(?:\.\d+)*|\d+(?:\.\d+){2,}/,alias:"string"},function:{pattern:/(\bsub[ \t]+)\w+/,lookbehind:!0},keyword:/\b(?:any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|return|say|state|sub|switch|undef|unless|until|use|when|while)\b/,number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)\b/,operator:/-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|\+[+=]?|-[-=>]?|\*\*?=?|\/\/?=?|=[=~>]?|~[~=]?|\|\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\.(?:=|\.\.?)?|[\\?]|\bx(?:=|\b)|\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\b/,punctuation:/[{}[\];(),:]/}})(t)}return Hw}var Vw,OL;function Qve(){if(OL)return Vw;OL=1;var e=Nh();Vw=t,t.displayName="phpExtras",t.aliases=[];function t(n){n.register(e),n.languages.insertBefore("php","variable",{this:{pattern:/\$this\b/,alias:"keyword"},global:/\$(?:GLOBALS|HTTP_RAW_POST_DATA|_(?:COOKIE|ENV|FILES|GET|POST|REQUEST|SERVER|SESSION)|argc|argv|http_response_header|php_errormsg)\b/,scope:{pattern:/\b[\w\\]+::/,inside:{keyword:/\b(?:parent|self|static)\b/,punctuation:/::|\\/}}})}return Vw}var qw,DL;function Jve(){if(DL)return qw;DL=1;var e=Nh(),t=Rh();qw=n,n.displayName="phpdoc",n.aliases=[];function n(r){r.register(e),r.register(t),function(a){var o=/(?:\b[a-zA-Z]\w*|[|\\[\]])+/.source;a.languages.phpdoc=a.languages.extend("javadoclike",{parameter:{pattern:RegExp("(@(?:global|param|property(?:-read|-write)?|var)\\s+(?:"+o+"\\s+)?)\\$\\w+"),lookbehind:!0}}),a.languages.insertBefore("phpdoc","keyword",{"class-name":[{pattern:RegExp("(@(?:global|package|param|property(?:-read|-write)?|return|subpackage|throws|var)\\s+)"+o),lookbehind:!0,inside:{keyword:/\b(?:array|bool|boolean|callback|double|false|float|int|integer|mixed|null|object|resource|self|string|true|void)\b/,punctuation:/[|\\[\]()]/}}]}),a.languages.javadoclike.addSupport("php",a.languages.phpdoc)}(r)}return qw}var Gw,LL;function eSe(){if(LL)return Gw;LL=1;var e=TA();Gw=t,t.displayName="plsql",t.aliases=[];function t(n){n.register(e),n.languages.plsql=n.languages.extend("sql",{comment:{pattern:/\/\*[\s\S]*?\*\/|--.*/,greedy:!0},keyword:/\b(?:A|ACCESSIBLE|ADD|AGENT|AGGREGATE|ALL|ALTER|AND|ANY|ARRAY|AS|ASC|AT|ATTRIBUTE|AUTHID|AVG|BEGIN|BETWEEN|BFILE_BASE|BINARY|BLOB_BASE|BLOCK|BODY|BOTH|BOUND|BULK|BY|BYTE|C|CALL|CALLING|CASCADE|CASE|CHAR|CHARACTER|CHARSET|CHARSETFORM|CHARSETID|CHAR_BASE|CHECK|CLOB_BASE|CLONE|CLOSE|CLUSTER|CLUSTERS|COLAUTH|COLLECT|COLUMNS|COMMENT|COMMIT|COMMITTED|COMPILED|COMPRESS|CONNECT|CONSTANT|CONSTRUCTOR|CONTEXT|CONTINUE|CONVERT|COUNT|CRASH|CREATE|CREDENTIAL|CURRENT|CURSOR|CUSTOMDATUM|DANGLING|DATA|DATE|DATE_BASE|DAY|DECLARE|DEFAULT|DEFINE|DELETE|DESC|DETERMINISTIC|DIRECTORY|DISTINCT|DOUBLE|DROP|DURATION|ELEMENT|ELSE|ELSIF|EMPTY|END|ESCAPE|EXCEPT|EXCEPTION|EXCEPTIONS|EXCLUSIVE|EXECUTE|EXISTS|EXIT|EXTERNAL|FETCH|FINAL|FIRST|FIXED|FLOAT|FOR|FORALL|FORCE|FROM|FUNCTION|GENERAL|GOTO|GRANT|GROUP|HASH|HAVING|HEAP|HIDDEN|HOUR|IDENTIFIED|IF|IMMEDIATE|IMMUTABLE|IN|INCLUDING|INDEX|INDEXES|INDICATOR|INDICES|INFINITE|INSERT|INSTANTIABLE|INT|INTERFACE|INTERSECT|INTERVAL|INTO|INVALIDATE|IS|ISOLATION|JAVA|LANGUAGE|LARGE|LEADING|LENGTH|LEVEL|LIBRARY|LIKE|LIKE2|LIKE4|LIKEC|LIMIT|LIMITED|LOCAL|LOCK|LONG|LOOP|MAP|MAX|MAXLEN|MEMBER|MERGE|MIN|MINUS|MINUTE|MOD|MODE|MODIFY|MONTH|MULTISET|MUTABLE|NAME|NAN|NATIONAL|NATIVE|NCHAR|NEW|NOCOMPRESS|NOCOPY|NOT|NOWAIT|NULL|NUMBER_BASE|OBJECT|OCICOLL|OCIDATE|OCIDATETIME|OCIDURATION|OCIINTERVAL|OCILOBLOCATOR|OCINUMBER|OCIRAW|OCIREF|OCIREFCURSOR|OCIROWID|OCISTRING|OCITYPE|OF|OLD|ON|ONLY|OPAQUE|OPEN|OPERATOR|OPTION|OR|ORACLE|ORADATA|ORDER|ORGANIZATION|ORLANY|ORLVARY|OTHERS|OUT|OVERLAPS|OVERRIDING|PACKAGE|PARALLEL_ENABLE|PARAMETER|PARAMETERS|PARENT|PARTITION|PASCAL|PERSISTABLE|PIPE|PIPELINED|PLUGGABLE|POLYMORPHIC|PRAGMA|PRECISION|PRIOR|PRIVATE|PROCEDURE|PUBLIC|RAISE|RANGE|RAW|READ|RECORD|REF|REFERENCE|RELIES_ON|REM|REMAINDER|RENAME|RESOURCE|RESULT|RESULT_CACHE|RETURN|RETURNING|REVERSE|REVOKE|ROLLBACK|ROW|SAMPLE|SAVE|SAVEPOINT|SB1|SB2|SB4|SECOND|SEGMENT|SELECT|SELF|SEPARATE|SEQUENCE|SERIALIZABLE|SET|SHARE|SHORT|SIZE|SIZE_T|SOME|SPARSE|SQL|SQLCODE|SQLDATA|SQLNAME|SQLSTATE|STANDARD|START|STATIC|STDDEV|STORED|STRING|STRUCT|STYLE|SUBMULTISET|SUBPARTITION|SUBSTITUTABLE|SUBTYPE|SUM|SYNONYM|TABAUTH|TABLE|TDO|THE|THEN|TIME|TIMESTAMP|TIMEZONE_ABBR|TIMEZONE_HOUR|TIMEZONE_MINUTE|TIMEZONE_REGION|TO|TRAILING|TRANSACTION|TRANSACTIONAL|TRUSTED|TYPE|UB1|UB2|UB4|UNDER|UNION|UNIQUE|UNPLUG|UNSIGNED|UNTRUSTED|UPDATE|USE|USING|VALIST|VALUE|VALUES|VARIABLE|VARIANCE|VARRAY|VARYING|VIEW|VIEWS|VOID|WHEN|WHERE|WHILE|WITH|WORK|WRAPPED|WRITE|YEAR|ZONE)\b/i,operator:/:=?|=>|[<>^~!]=|\.\.|\|\||\*\*|[-+*/%<>=@]/}),n.languages.insertBefore("plsql","operator",{label:{pattern:/<<\s*\w+\s*>>/,alias:"symbol"}})}return Gw}var Ww,ML;function tSe(){if(ML)return Ww;ML=1,Ww=e,e.displayName="powerquery",e.aliases=[];function e(t){t.languages.powerquery={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},"quoted-identifier":{pattern:/#"(?:[^"\r\n]|"")*"(?!")/,greedy:!0},string:{pattern:/(?:#!)?"(?:[^"\r\n]|"")*"(?!")/,greedy:!0},constant:[/\bDay\.(?:Friday|Monday|Saturday|Sunday|Thursday|Tuesday|Wednesday)\b/,/\bTraceLevel\.(?:Critical|Error|Information|Verbose|Warning)\b/,/\bOccurrence\.(?:All|First|Last)\b/,/\bOrder\.(?:Ascending|Descending)\b/,/\bRoundingMode\.(?:AwayFromZero|Down|ToEven|TowardZero|Up)\b/,/\bMissingField\.(?:Error|Ignore|UseNull)\b/,/\bQuoteStyle\.(?:Csv|None)\b/,/\bJoinKind\.(?:FullOuter|Inner|LeftAnti|LeftOuter|RightAnti|RightOuter)\b/,/\bGroupKind\.(?:Global|Local)\b/,/\bExtraValues\.(?:Error|Ignore|List)\b/,/\bJoinAlgorithm\.(?:Dynamic|LeftHash|LeftIndex|PairwiseHash|RightHash|RightIndex|SortMerge)\b/,/\bJoinSide\.(?:Left|Right)\b/,/\bPrecision\.(?:Decimal|Double)\b/,/\bRelativePosition\.From(?:End|Start)\b/,/\bTextEncoding\.(?:Ascii|BigEndianUnicode|Unicode|Utf16|Utf8|Windows)\b/,/\b(?:Any|Binary|Date|DateTime|DateTimeZone|Duration|Function|Int16|Int32|Int64|Int8|List|Logical|None|Number|Record|Table|Text|Time)\.Type\b/,/\bnull\b/],boolean:/\b(?:false|true)\b/,keyword:/\b(?:and|as|each|else|error|if|in|is|let|meta|not|nullable|optional|or|otherwise|section|shared|then|try|type)\b|#(?:binary|date|datetime|datetimezone|duration|infinity|nan|sections|shared|table|time)\b/,function:{pattern:/(^|[^#\w.])[a-z_][\w.]*(?=\s*\()/i,lookbehind:!0},"data-type":{pattern:/\b(?:any|anynonnull|binary|date|datetime|datetimezone|duration|function|list|logical|none|number|record|table|text|time)\b/,alias:"class-name"},number:{pattern:/\b0x[\da-f]+\b|(?:[+-]?(?:\b\d+\.)?\b\d+|[+-]\.\d+|(^|[^.])\B\.\d+)(?:e[+-]?\d+)?\b/i,lookbehind:!0},operator:/[-+*\/&?@^]|<(?:=>?|>)?|>=?|=>?|\.\.\.?/,punctuation:/[,;\[\](){}]/},t.languages.pq=t.languages.powerquery,t.languages.mscript=t.languages.powerquery}return Ww}var Kw,PL;function nSe(){if(PL)return Kw;PL=1,Kw=e,e.displayName="powershell",e.aliases=[];function e(t){(function(n){var r=n.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};r.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:r},boolean:r.boolean,variable:r.variable}})(t)}return Kw}var Yw,$L;function rSe(){if($L)return Yw;$L=1,Yw=e,e.displayName="processing",e.aliases=[];function e(t){t.languages.processing=t.languages.extend("clike",{keyword:/\b(?:break|case|catch|class|continue|default|else|extends|final|for|if|implements|import|new|null|private|public|return|static|super|switch|this|try|void|while)\b/,function:/\b\w+(?=\s*\()/,operator:/<[<=]?|>[>=]?|&&?|\|\|?|[%?]|[!=+\-*\/]=?/}),t.languages.insertBefore("processing","number",{constant:/\b(?!XML\b)[A-Z][A-Z\d_]+\b/,type:{pattern:/\b(?:boolean|byte|char|color|double|float|int|[A-Z]\w*)\b/,alias:"class-name"}})}return Yw}var Zw,FL;function aSe(){if(FL)return Zw;FL=1,Zw=e,e.displayName="prolog",e.aliases=[];function e(t){t.languages.prolog={comment:{pattern:/\/\*[\s\S]*?\*\/|%.*/,greedy:!0},string:{pattern:/(["'])(?:\1\1|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1(?!\1)/,greedy:!0},builtin:/\b(?:fx|fy|xf[xy]?|yfx?)\b/,function:/\b[a-z]\w*(?:(?=\()|\/\d+)/,number:/\b\d+(?:\.\d*)?/,operator:/[:\\=><\-?*@\/;+^|!$.]+|\b(?:is|mod|not|xor)\b/,punctuation:/[(){}\[\],]/}}return Zw}var Xw,jL;function oSe(){if(jL)return Xw;jL=1,Xw=e,e.displayName="promql",e.aliases=[];function e(t){(function(n){var r=["sum","min","max","avg","group","stddev","stdvar","count","count_values","bottomk","topk","quantile"],a=["on","ignoring","group_right","group_left","by","without"],o=["offset"],i=r.concat(a,o);n.languages.promql={comment:{pattern:/(^[ \t]*)#.*/m,lookbehind:!0},"vector-match":{pattern:new RegExp("((?:"+a.join("|")+")\\s*)\\([^)]*\\)"),lookbehind:!0,inside:{"label-key":{pattern:/\b[^,]+\b/,alias:"attr-name"},punctuation:/[(),]/}},"context-labels":{pattern:/\{[^{}]*\}/,inside:{"label-key":{pattern:/\b[a-z_]\w*(?=\s*(?:=|![=~]))/,alias:"attr-name"},"label-value":{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0,alias:"attr-value"},punctuation:/\{|\}|=~?|![=~]|,/}},"context-range":[{pattern:/\[[\w\s:]+\]/,inside:{punctuation:/\[|\]|:/,"range-duration":{pattern:/\b(?:\d+(?:[smhdwy]|ms))+\b/i,alias:"number"}}},{pattern:/(\boffset\s+)\w+/,lookbehind:!0,inside:{"range-duration":{pattern:/\b(?:\d+(?:[smhdwy]|ms))+\b/i,alias:"number"}}}],keyword:new RegExp("\\b(?:"+i.join("|")+")\\b","i"),function:/\b[a-z_]\w*(?=\s*\()/i,number:/[-+]?(?:(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[-+]?\d+)?\b|\b(?:0x[0-9a-f]+|nan|inf)\b)/i,operator:/[\^*/%+-]|==|!=|<=|<|>=|>|\b(?:and|or|unless)\b/i,punctuation:/[{};()`,.[\]]/}})(t)}return Xw}var Qw,zL;function iSe(){if(zL)return Qw;zL=1,Qw=e,e.displayName="properties",e.aliases=[];function e(t){t.languages.properties={comment:/^[ \t]*[#!].*$/m,"attr-value":{pattern:/(^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?: *[=:] *(?! )| ))(?:\\(?:\r\n|[\s\S])|[^\\\r\n])+/m,lookbehind:!0},"attr-name":/^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?= *[=:]| )/m,punctuation:/[=:]/}}return Qw}var Jw,UL;function sSe(){if(UL)return Jw;UL=1,Jw=e,e.displayName="protobuf",e.aliases=[];function e(t){(function(n){var r=/\b(?:bool|bytes|double|s?fixed(?:32|64)|float|[su]?int(?:32|64)|string)\b/;n.languages.protobuf=n.languages.extend("clike",{"class-name":[{pattern:/(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,lookbehind:!0},{pattern:/(\b(?:rpc\s+\w+|returns)\s*\(\s*(?:stream\s+)?)\.?[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s*\))/,lookbehind:!0}],keyword:/\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|returns|rpc(?=\s+\w)|service|stream|syntax|to)\b(?!\s*=\s*\d)/,function:/\b[a-z_]\w*(?=\s*\()/i}),n.languages.insertBefore("protobuf","operator",{map:{pattern:/\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/[<>.,]/,builtin:r}},builtin:r,"positional-class-name":{pattern:/(?:\b|\B\.)[a-z_]\w*(?:\.[a-z_]\w*)*(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/\./}},annotation:{pattern:/(\[\s*)[a-z_]\w*(?=\s*=)/i,lookbehind:!0}})})(t)}return Jw}var e0,BL;function lSe(){if(BL)return e0;BL=1,e0=e,e.displayName="psl",e.aliases=[];function e(t){t.languages.psl={comment:{pattern:/#.*/,greedy:!0},string:{pattern:/"(?:\\.|[^\\"])*"/,greedy:!0,inside:{symbol:/\\[ntrbA-Z"\\]/}},"heredoc-string":{pattern:/<<<([a-zA-Z_]\w*)[\r\n](?:.*[\r\n])*?\1\b/,alias:"string",greedy:!0},keyword:/\b(?:__multi|__single|case|default|do|else|elsif|exit|export|for|foreach|function|if|last|line|local|next|requires|return|switch|until|while|word)\b/,constant:/\b(?:ALARM|CHART_ADD_GRAPH|CHART_DELETE_GRAPH|CHART_DESTROY|CHART_LOAD|CHART_PRINT|EOF|OFFLINE|OK|PSL_PROF_LOG|R_CHECK_HORIZ|R_CHECK_VERT|R_CLICKER|R_COLUMN|R_FRAME|R_ICON|R_LABEL|R_LABEL_CENTER|R_LIST_MULTIPLE|R_LIST_MULTIPLE_ND|R_LIST_SINGLE|R_LIST_SINGLE_ND|R_MENU|R_POPUP|R_POPUP_SCROLLED|R_RADIO_HORIZ|R_RADIO_VERT|R_ROW|R_SCALE_HORIZ|R_SCALE_VERT|R_SEP_HORIZ|R_SEP_VERT|R_SPINNER|R_TEXT_FIELD|R_TEXT_FIELD_LABEL|R_TOGGLE|TRIM_LEADING|TRIM_LEADING_AND_TRAILING|TRIM_REDUNDANT|TRIM_TRAILING|VOID|WARN)\b/,boolean:/\b(?:FALSE|False|NO|No|TRUE|True|YES|Yes|false|no|true|yes)\b/,variable:/\b(?:PslDebug|errno|exit_status)\b/,builtin:{pattern:/\b(?:PslExecute|PslFunctionCall|PslFunctionExists|PslSetOptions|_snmp_debug|acos|add_diary|annotate|annotate_get|ascii_to_ebcdic|asctime|asin|atan|atexit|batch_set|blackout|cat|ceil|chan_exists|change_state|close|code_cvt|cond_signal|cond_wait|console_type|convert_base|convert_date|convert_locale_date|cos|cosh|create|date|dcget_text|destroy|destroy_lock|dget_text|difference|dump_hist|ebcdic_to_ascii|encrypt|event_archive|event_catalog_get|event_check|event_query|event_range_manage|event_range_query|event_report|event_schedule|event_trigger|event_trigger2|execute|exists|exp|fabs|file|floor|fmod|fopen|fseek|ftell|full_discovery|get|get_chan_info|get_ranges|get_text|get_vars|getenv|gethostinfo|getpid|getpname|grep|history|history_get_retention|in_transition|index|int|internal|intersection|is_var|isnumber|join|kill|length|lines|lock|lock_info|log|log10|loge|matchline|msg_check|msg_get_format|msg_get_severity|msg_printf|msg_sprintf|ntharg|nthargf|nthline|nthlinef|num_bytes|num_consoles|pconfig|popen|poplines|pow|print|printf|proc_exists|process|random|read|readln|refresh_parameters|remote_check|remote_close|remote_event_query|remote_event_trigger|remote_file_send|remote_open|remove|replace|rindex|sec_check_priv|sec_store_get|sec_store_set|set|set_alarm_ranges|set_locale|share|sin|sinh|sleep|snmp_agent_config|snmp_agent_start|snmp_agent_stop|snmp_close|snmp_config|snmp_get|snmp_get_next|snmp_h_get|snmp_h_get_next|snmp_h_set|snmp_open|snmp_set|snmp_trap_ignore|snmp_trap_listen|snmp_trap_raise_std_trap|snmp_trap_receive|snmp_trap_register_im|snmp_trap_send|snmp_walk|sopen|sort|splitline|sprintf|sqrt|srandom|str_repeat|strcasecmp|subset|substr|system|tail|tan|tanh|text_domain|time|tmpnam|tolower|toupper|trace_psl_process|trim|union|unique|unlock|unset|va_arg|va_start|write)\b/,alias:"builtin-function"},"foreach-variable":{pattern:/(\bforeach\s+(?:(?:\w+\b|"(?:\\.|[^\\"])*")\s+){0,2})[_a-zA-Z]\w*(?=\s*\()/,lookbehind:!0,greedy:!0},function:/\b[_a-z]\w*\b(?=\s*\()/i,number:/\b(?:0x[0-9a-f]+|\d+(?:\.\d+)?)\b/i,operator:/--|\+\+|&&=?|\|\|=?|<<=?|>>=?|[=!]~|[-+*/%&|^!=<>]=?|\.|[:?]/,punctuation:/[(){}\[\];,]/}}return e0}var t0,HL;function cSe(){if(HL)return t0;HL=1,t0=e,e.displayName="pug",e.aliases=[];function e(t){(function(n){n.languages.pug={comment:{pattern:/(^([\t ]*))\/\/.*(?:(?:\r?\n|\r)\2[\t ].+)*/m,lookbehind:!0},"multiline-script":{pattern:/(^([\t ]*)script\b.*\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0,inside:n.languages.javascript},filter:{pattern:/(^([\t ]*)):.+(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"},text:/\S[\s\S]*/}},"multiline-plain-text":{pattern:/(^([\t ]*)[\w\-#.]+\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0},markup:{pattern:/(^[\t ]*)<.+/m,lookbehind:!0,inside:n.languages.markup},doctype:{pattern:/((?:^|\n)[\t ]*)doctype(?: .+)?/,lookbehind:!0},"flow-control":{pattern:/(^[\t ]*)(?:case|default|each|else|if|unless|when|while)\b(?: .+)?/m,lookbehind:!0,inside:{each:{pattern:/^each .+? in\b/,inside:{keyword:/\b(?:each|in)\b/,punctuation:/,/}},branch:{pattern:/^(?:case|default|else|if|unless|when|while)\b/,alias:"keyword"},rest:n.languages.javascript}},keyword:{pattern:/(^[\t ]*)(?:append|block|extends|include|prepend)\b.+/m,lookbehind:!0},mixin:[{pattern:/(^[\t ]*)mixin .+/m,lookbehind:!0,inside:{keyword:/^mixin/,function:/\w+(?=\s*\(|\s*$)/,punctuation:/[(),.]/}},{pattern:/(^[\t ]*)\+.+/m,lookbehind:!0,inside:{name:{pattern:/^\+\w+/,alias:"function"},rest:n.languages.javascript}}],script:{pattern:/(^[\t ]*script(?:(?:&[^(]+)?\([^)]+\))*[\t ]).+/m,lookbehind:!0,inside:n.languages.javascript},"plain-text":{pattern:/(^[\t ]*(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?[\t ]).+/m,lookbehind:!0},tag:{pattern:/(^[\t ]*)(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?:?/m,lookbehind:!0,inside:{attributes:[{pattern:/&[^(]+\([^)]+\)/,inside:n.languages.javascript},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*(?!\s))(?:\{[^}]*\}|[^,)\r\n]+)/,lookbehind:!0,inside:n.languages.javascript},"attr-name":/[\w-]+(?=\s*!?=|\s*[,)])/,punctuation:/[!=(),]+/}}],punctuation:/:/,"attr-id":/#[\w\-]+/,"attr-class":/\.[\w\-]+/}},code:[{pattern:/(^[\t ]*(?:-|!?=)).+/m,lookbehind:!0,inside:n.languages.javascript}],punctuation:/[.\-!=|]+/};for(var r=/(^([\t ]*)):(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/.source,a=[{filter:"atpl",language:"twig"},{filter:"coffee",language:"coffeescript"},"ejs","handlebars","less","livescript","markdown",{filter:"sass",language:"scss"},"stylus"],o={},i=0,s=a.length;i",function(){return l.filter}),"m"),lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"},text:{pattern:/\S[\s\S]*/,alias:[l.language,"language-"+l.language],inside:n.languages[l.language]}}})}n.languages.insertBefore("pug","filter",o)})(t)}return t0}var n0,VL;function uSe(){if(VL)return n0;VL=1,n0=e,e.displayName="puppet",e.aliases=[];function e(t){(function(n){n.languages.puppet={heredoc:[{pattern:/(@\("([^"\r\n\/):]+)"(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r(?!\n)))*?[ \t]*(?:\|[ \t]*)?(?:-[ \t]*)?\2/,lookbehind:!0,alias:"string",inside:{punctuation:/(?=\S).*\S(?= *$)/}},{pattern:/(@\(([^"\r\n\/):]+)(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r(?!\n)))*?[ \t]*(?:\|[ \t]*)?(?:-[ \t]*)?\2/,lookbehind:!0,greedy:!0,alias:"string",inside:{punctuation:/(?=\S).*\S(?= *$)/}},{pattern:/@\("?(?:[^"\r\n\/):]+)"?(?:\/[nrts$uL]*)?\)/,alias:"string",inside:{punctuation:{pattern:/(\().+?(?=\))/,lookbehind:!0}}}],"multiline-comment":{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0,greedy:!0,alias:"comment"},regex:{pattern:/((?:\bnode\s+|[~=\(\[\{,]\s*|[=+]>\s*|^\s*))\/(?:[^\/\\]|\\[\s\S])+\/(?:[imx]+\b|\B)/,lookbehind:!0,greedy:!0,inside:{"extended-regex":{pattern:/^\/(?:[^\/\\]|\\[\s\S])+\/[im]*x[im]*$/,inside:{comment:/#.*/}}}},comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},string:{pattern:/(["'])(?:\$\{(?:[^'"}]|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}|\$(?!\{)|(?!\1)[^\\$]|\\[\s\S])*\1/,greedy:!0,inside:{"double-quoted":{pattern:/^"[\s\S]*"$/,inside:{}}}},variable:{pattern:/\$(?:::)?\w+(?:::\w+)*/,inside:{punctuation:/::/}},"attr-name":/(?:\b\w+|\*)(?=\s*=>)/,function:[{pattern:/(\.)(?!\d)\w+/,lookbehind:!0},/\b(?:contain|debug|err|fail|include|info|notice|realize|require|tag|warning)\b|\b(?!\d)\w+(?=\()/],number:/\b(?:0x[a-f\d]+|\d+(?:\.\d+)?(?:e-?\d+)?)\b/i,boolean:/\b(?:false|true)\b/,keyword:/\b(?:application|attr|case|class|consumes|default|define|else|elsif|function|if|import|inherits|node|private|produces|type|undef|unless)\b/,datatype:{pattern:/\b(?:Any|Array|Boolean|Callable|Catalogentry|Class|Collection|Data|Default|Enum|Float|Hash|Integer|NotUndef|Numeric|Optional|Pattern|Regexp|Resource|Runtime|Scalar|String|Struct|Tuple|Type|Undef|Variant)\b/,alias:"symbol"},operator:/=[=~>]?|![=~]?|<(?:<\|?|[=~|-])?|>[>=]?|->?|~>|\|>?>?|[*\/%+?]|\b(?:and|in|or)\b/,punctuation:/[\[\]{}().,;]|:+/};var r=[{pattern:/(^|[^\\])\$\{(?:[^'"{}]|\{[^}]*\}|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}/,lookbehind:!0,inside:{"short-variable":{pattern:/(^\$\{)(?!\w+\()(?:::)?\w+(?:::\w+)*/,lookbehind:!0,alias:"variable",inside:{punctuation:/::/}},delimiter:{pattern:/^\$/,alias:"variable"},rest:n.languages.puppet}},{pattern:/(^|[^\\])\$(?:::)?\w+(?:::\w+)*/,lookbehind:!0,alias:"variable",inside:{punctuation:/::/}}];n.languages.puppet.heredoc[0].inside.interpolation=r,n.languages.puppet.string.inside["double-quoted"].inside.interpolation=r})(t)}return n0}var r0,qL;function dSe(){if(qL)return r0;qL=1,r0=e,e.displayName="pure",e.aliases=[];function e(t){(function(n){n.languages.pure={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0},/#!.+/],"inline-lang":{pattern:/%<[\s\S]+?%>/,greedy:!0,inside:{lang:{pattern:/(^%< *)-\*-.+?-\*-/,lookbehind:!0,alias:"comment"},delimiter:{pattern:/^%<.*|%>$/,alias:"punctuation"}}},string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},number:{pattern:/((?:\.\.)?)(?:\b(?:inf|nan)\b|\b0x[\da-f]+|(?:\b(?:0b)?\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?L?)/i,lookbehind:!0},keyword:/\b(?:NULL|ans|break|bt|case|catch|cd|clear|const|def|del|dump|else|end|exit|extern|false|force|help|if|infix[lr]?|interface|let|ls|mem|namespace|nonfix|of|otherwise|outfix|override|postfix|prefix|private|public|pwd|quit|run|save|show|stats|then|throw|trace|true|type|underride|using|when|with)\b/,function:/\b(?:abs|add_(?:addr|constdef|(?:fundef|interface|macdef|typedef)(?:_at)?|vardef)|all|any|applp?|arity|bigintp?|blob(?:_crc|_size|p)?|boolp?|byte_c?string(?:_pointer)?|byte_(?:matrix|pointer)|calloc|cat|catmap|ceil|char[ps]?|check_ptrtag|chr|clear_sentry|clearsym|closurep?|cmatrixp?|cols?|colcat(?:map)?|colmap|colrev|colvector(?:p|seq)?|complex(?:_float_(?:matrix|pointer)|_matrix(?:_view)?|_pointer|p)?|conj|cookedp?|cst|cstring(?:_(?:dup|list|vector))?|curry3?|cyclen?|del_(?:constdef|fundef|interface|macdef|typedef|vardef)|delete|diag(?:mat)?|dim|dmatrixp?|do|double(?:_matrix(?:_view)?|_pointer|p)?|dowith3?|drop|dropwhile|eval(?:cmd)?|exactp|filter|fix|fixity|flip|float(?:_matrix|_pointer)|floor|fold[lr]1?|frac|free|funp?|functionp?|gcd|get(?:_(?:byte|constdef|double|float|fundef|int(?:64)?|interface(?:_typedef)?|long|macdef|pointer|ptrtag|sentry|short|string|typedef|vardef))?|globsym|hash|head|id|im|imatrixp?|index|inexactp|infp|init|insert|int(?:_matrix(?:_view)?|_pointer|p)?|int64_(?:matrix|pointer)|integerp?|iteraten?|iterwhile|join|keys?|lambdap?|last(?:err(?:pos)?)?|lcd|list[2p]?|listmap|make_ptrtag|malloc|map|matcat|matrixp?|max|member|min|nanp|nargs|nmatrixp?|null|numberp?|ord|pack(?:ed)?|pointer(?:_cast|_tag|_type|p)?|pow|pred|ptrtag|put(?:_(?:byte|double|float|int(?:64)?|long|pointer|short|string))?|rationalp?|re|realp?|realloc|recordp?|redim|reduce(?:_with)?|refp?|repeatn?|reverse|rlistp?|round|rows?|rowcat(?:map)?|rowmap|rowrev|rowvector(?:p|seq)?|same|scan[lr]1?|sentry|sgn|short_(?:matrix|pointer)|slice|smatrixp?|sort|split|str|strcat|stream|stride|string(?:_(?:dup|list|vector)|p)?|subdiag(?:mat)?|submat|subseq2?|substr|succ|supdiag(?:mat)?|symbolp?|tail|take|takewhile|thunkp?|transpose|trunc|tuplep?|typep|ubyte|uint(?:64)?|ulong|uncurry3?|unref|unzip3?|update|ushort|vals?|varp?|vector(?:p|seq)?|void|zip3?|zipwith3?)\b/,special:{pattern:/\b__[a-z]+__\b/i,alias:"builtin"},operator:/(?:[!"#$%&'*+,\-.\/:<=>?@\\^`|~\u00a1-\u00bf\u00d7-\u00f7\u20d0-\u2bff]|\b_+\b)+|\b(?:and|div|mod|not|or)\b/,punctuation:/[(){}\[\];,|]/};var r=["c",{lang:"c++",alias:"cpp"},"fortran"],a=/%< *-\*- *\d* *-\*-[\s\S]+?%>/.source;r.forEach(function(o){var i=o;if(typeof o!="string"&&(i=o.alias,o=o.lang),n.languages[i]){var s={};s["inline-lang-"+i]={pattern:RegExp(a.replace("",o.replace(/([.+*?\/\\(){}\[\]])/g,"\\$1")),"i"),inside:n.util.clone(n.languages.pure["inline-lang"].inside)},s["inline-lang-"+i].inside.rest=n.util.clone(n.languages[i]),n.languages.insertBefore("pure","inline-lang",s)}}),n.languages.c&&(n.languages.pure["inline-lang"].inside.rest=n.util.clone(n.languages.c))})(t)}return r0}var a0,GL;function fSe(){if(GL)return a0;GL=1,a0=e,e.displayName="purebasic",e.aliases=[];function e(t){t.languages.purebasic=t.languages.extend("clike",{comment:/;.*/,keyword:/\b(?:align|and|as|break|calldebugger|case|compilercase|compilerdefault|compilerelse|compilerelseif|compilerendif|compilerendselect|compilererror|compilerif|compilerselect|continue|data|datasection|debug|debuglevel|declare|declarec|declarecdll|declaredll|declaremodule|default|define|dim|disableasm|disabledebugger|disableexplicit|else|elseif|enableasm|enabledebugger|enableexplicit|end|enddatasection|enddeclaremodule|endenumeration|endif|endimport|endinterface|endmacro|endmodule|endprocedure|endselect|endstructure|endstructureunion|endwith|enumeration|extends|fakereturn|for|foreach|forever|global|gosub|goto|if|import|importc|includebinary|includefile|includepath|interface|macro|module|newlist|newmap|next|not|or|procedure|procedurec|procedurecdll|proceduredll|procedurereturn|protected|prototype|prototypec|read|redim|repeat|restore|return|runtime|select|shared|static|step|structure|structureunion|swap|threaded|to|until|wend|while|with|xincludefile|xor)\b/i,function:/\b\w+(?:\.\w+)?\s*(?=\()/,number:/(?:\$[\da-f]+|\b-?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)\b/i,operator:/(?:@\*?|\?|\*)\w+|-[>-]?|\+\+?|!=?|<>?=?|==?|&&?|\|?\||[~^%?*/@]/}),t.languages.insertBefore("purebasic","keyword",{tag:/#\w+\$?/,asm:{pattern:/(^[\t ]*)!.*/m,lookbehind:!0,alias:"tag",inside:{comment:/;.*/,string:{pattern:/(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},"label-reference-anonymous":{pattern:/(!\s*j[a-z]+\s+)@[fb]/i,lookbehind:!0,alias:"fasm-label"},"label-reference-addressed":{pattern:/(!\s*j[a-z]+\s+)[A-Z._?$@][\w.?$@~#]*/i,lookbehind:!0,alias:"fasm-label"},keyword:[/\b(?:extern|global)\b[^;\r\n]*/i,/\b(?:CPU|DEFAULT|FLOAT)\b.*/],function:{pattern:/^([\t ]*!\s*)[\da-z]+(?=\s|$)/im,lookbehind:!0},"function-inline":{pattern:/(:\s*)[\da-z]+(?=\s)/i,lookbehind:!0,alias:"function"},label:{pattern:/^([\t ]*!\s*)[A-Za-z._?$@][\w.?$@~#]*(?=:)/m,lookbehind:!0,alias:"fasm-label"},register:/\b(?:st\d|[xyz]mm\d\d?|[cdt]r\d|r\d\d?[bwd]?|[er]?[abcd]x|[abcd][hl]|[er]?(?:bp|di|si|sp)|[cdefgs]s|mm\d+)\b/i,number:/(?:\b|-|(?=\$))(?:0[hx](?:[\da-f]*\.)?[\da-f]+(?:p[+-]?\d+)?|\d[\da-f]+[hx]|\$\d[\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\d+|(?:\d+(?:\.\d+)?|\.\d+)(?:\.?e[+-]?\d+)?[dt]?)\b/i,operator:/[\[\]*+\-/%<>=&|$!,.:]/}}}),delete t.languages.purebasic["class-name"],delete t.languages.purebasic.boolean,t.languages.pbfasm=t.languages.purebasic}return a0}var o0,WL;function pSe(){if(WL)return o0;WL=1;var e=NA();o0=t,t.displayName="purescript",t.aliases=["purs"];function t(n){n.register(e),n.languages.purescript=n.languages.extend("haskell",{keyword:/\b(?:ado|case|class|data|derive|do|else|forall|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b|∀/,"import-statement":{pattern:/(^[\t ]*)import\s+[A-Z][\w']*(?:\.[A-Z][\w']*)*(?:\s+as\s+[A-Z][\w']*(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,lookbehind:!0,inside:{keyword:/\b(?:as|hiding|import)\b/,punctuation:/\./}},builtin:/\b(?:absurd|add|ap|append|apply|between|bind|bottom|clamp|compare|comparing|compose|conj|const|degree|discard|disj|div|eq|flap|flip|gcd|identity|ifM|join|lcm|liftA1|liftM1|map|max|mempty|min|mod|mul|negate|not|notEq|one|otherwise|recip|show|sub|top|unit|unless|unlessM|void|when|whenM|zero)\b/,operator:[n.languages.haskell.operator[0],n.languages.haskell.operator[2],/[\xa2-\xa6\xa8\xa9\xac\xae-\xb1\xb4\xb8\xd7\xf7\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u03f6\u0482\u058d-\u058f\u0606-\u0608\u060b\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u07fe\u07ff\u09f2\u09f3\u09fa\u09fb\u0af1\u0b70\u0bf3-\u0bfa\u0c7f\u0d4f\u0d79\u0e3f\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u166d\u17db\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u2044\u2052\u207a-\u207c\u208a-\u208c\u20a0-\u20bf\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u2140-\u2144\u214a-\u214d\u214f\u218a\u218b\u2190-\u2307\u230c-\u2328\u232b-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b73\u2b76-\u2b95\u2b97-\u2bff\u2ce5-\u2cea\u2e50\u2e51\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u309b\u309c\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua700-\ua716\ua720\ua721\ua789\ua78a\ua828-\ua82b\ua836-\ua839\uaa77-\uaa79\uab5b\uab6a\uab6b\ufb29\ufbb2-\ufbc1\ufdfc\ufdfd\ufe62\ufe64-\ufe66\ufe69\uff04\uff0b\uff1c-\uff1e\uff3e\uff40\uff5c\uff5e\uffe0-\uffe6\uffe8-\uffee\ufffc\ufffd]/]}),n.languages.purs=n.languages.purescript}return o0}var i0,KL;function gSe(){if(KL)return i0;KL=1,i0=e,e.displayName="python",e.aliases=["py"];function e(t){t.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},t.languages.python["string-interpolation"].inside.interpolation.inside.rest=t.languages.python,t.languages.py=t.languages.python}return i0}var s0,YL;function mSe(){if(YL)return s0;YL=1,s0=e,e.displayName="q",e.aliases=[];function e(t){t.languages.q={string:/"(?:\\.|[^"\\\r\n])*"/,comment:[{pattern:/([\t )\]}])\/.*/,lookbehind:!0,greedy:!0},{pattern:/(^|\r?\n|\r)\/[\t ]*(?:(?:\r?\n|\r)(?:.*(?:\r?\n|\r(?!\n)))*?(?:\\(?=[\t ]*(?:\r?\n|\r))|$)|\S.*)/,lookbehind:!0,greedy:!0},{pattern:/^\\[\t ]*(?:\r?\n|\r)[\s\S]+/m,greedy:!0},{pattern:/^#!.+/m,greedy:!0}],symbol:/`(?::\S+|[\w.]*)/,datetime:{pattern:/0N[mdzuvt]|0W[dtz]|\d{4}\.\d\d(?:m|\.\d\d(?:T(?:\d\d(?::\d\d(?::\d\d(?:[.:]\d\d\d)?)?)?)?)?[dz]?)|\d\d:\d\d(?::\d\d(?:[.:]\d\d\d)?)?[uvt]?/,alias:"number"},number:/\b(?![01]:)(?:0N[hje]?|0W[hj]?|0[wn]|0x[\da-fA-F]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?[hjfeb]?)/,keyword:/\\\w+\b|\b(?:abs|acos|aj0?|all|and|any|asc|asin|asof|atan|attr|avgs?|binr?|by|ceiling|cols|cor|cos|count|cov|cross|csv|cut|delete|deltas|desc|dev|differ|distinct|div|do|dsave|ej|enlist|eval|except|exec|exit|exp|fby|fills|first|fkeys|flip|floor|from|get|getenv|group|gtime|hclose|hcount|hdel|hopen|hsym|iasc|identity|idesc|if|ij|in|insert|inter|inv|keys?|last|like|list|ljf?|load|log|lower|lsq|ltime|ltrim|mavg|maxs?|mcount|md5|mdev|med|meta|mins?|mmax|mmin|mmu|mod|msum|neg|next|not|null|or|over|parse|peach|pj|plist|prds?|prev|prior|rand|rank|ratios|raze|read0|read1|reciprocal|reval|reverse|rload|rotate|rsave|rtrim|save|scan|scov|sdev|select|set|setenv|show|signum|sin|sqrt|ssr?|string|sublist|sums?|sv|svar|system|tables|tan|til|trim|txf|type|uj|ungroup|union|update|upper|upsert|value|var|views?|vs|wavg|where|while|within|wj1?|wsum|ww|xasc|xbar|xcols?|xdesc|xexp|xgroup|xkey|xlog|xprev|xrank)\b/,adverb:{pattern:/['\/\\]:?|\beach\b/,alias:"function"},verb:{pattern:/(?:\B\.\B|\b[01]:|<[=>]?|>=?|[:+\-*%,!?~=|$&#@^]):?|\b_\b:?/,alias:"operator"},punctuation:/[(){}\[\];.]/}}return s0}var l0,ZL;function hSe(){if(ZL)return l0;ZL=1,l0=e,e.displayName="qml",e.aliases=[];function e(t){(function(n){for(var r=/"(?:\\.|[^\\"\r\n])*"|'(?:\\.|[^\\'\r\n])*'/.source,a=/\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))*\*\//.source,o=/(?:[^\\()[\]{}"'/]||\/(?![*/])||\(*\)|\[*\]|\{*\}|\\[\s\S])/.source.replace(//g,function(){return r}).replace(//g,function(){return a}),i=0;i<2;i++)o=o.replace(//g,function(){return o});o=o.replace(//g,"[^\\s\\S]"),n.languages.qml={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},"javascript-function":{pattern:RegExp(/((?:^|;)[ \t]*)function\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*\(*\)\s*\{*\}/.source.replace(//g,function(){return o}),"m"),lookbehind:!0,greedy:!0,alias:"language-javascript",inside:n.languages.javascript},"class-name":{pattern:/((?:^|[:;])[ \t]*)(?!\d)\w+(?=[ \t]*\{|[ \t]+on\b)/m,lookbehind:!0},property:[{pattern:/((?:^|[;{])[ \t]*)(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,lookbehind:!0},{pattern:/((?:^|[;{])[ \t]*)property[ \t]+(?!\d)\w+(?:\.\w+)*[ \t]+(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,lookbehind:!0,inside:{keyword:/^property/,property:/\w+(?:\.\w+)*/}}],"javascript-expression":{pattern:RegExp(/(:[ \t]*)(?![\s;}[])(?:(?!$|[;}]))+/.source.replace(//g,function(){return o}),"m"),lookbehind:!0,greedy:!0,alias:"language-javascript",inside:n.languages.javascript},string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},keyword:/\b(?:as|import|on)\b/,punctuation:/[{}[\]:;,]/}})(t)}return l0}var c0,XL;function bSe(){if(XL)return c0;XL=1,c0=e,e.displayName="qore",e.aliases=[];function e(t){t.languages.qore=t.languages.extend("clike",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:\/\/|#).*)/,lookbehind:!0},string:{pattern:/("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},keyword:/\b(?:abstract|any|assert|binary|bool|boolean|break|byte|case|catch|char|class|code|const|continue|data|default|do|double|else|enum|extends|final|finally|float|for|goto|hash|if|implements|import|inherits|instanceof|int|interface|long|my|native|new|nothing|null|object|our|own|private|reference|rethrow|return|short|soft(?:bool|date|float|int|list|number|string)|static|strictfp|string|sub|super|switch|synchronized|this|throw|throws|transient|try|void|volatile|while)\b/,boolean:/\b(?:false|true)\b/i,function:/\$?\b(?!\d)\w+(?=\()/,number:/\b(?:0b[01]+|0x(?:[\da-f]*\.)?[\da-fp\-]+|(?:\d+(?:\.\d+)?|\.\d+)(?:e\d+)?[df]|(?:\d+(?:\.\d+)?|\.\d+))\b/i,operator:{pattern:/(^|[^.])(?:\+[+=]?|-[-=]?|[!=](?:==?|~)?|>>?=?|<(?:=>?|<=?)?|&[&=]?|\|[|=]?|[*\/%^]=?|[~?])/,lookbehind:!0},variable:/\$(?!\d)\w+\b/})}return c0}var u0,QL;function ySe(){if(QL)return u0;QL=1,u0=e,e.displayName="qsharp",e.aliases=["qs"];function e(t){(function(n){function r(b,y){return b.replace(/<<(\d+)>>/g,function(w,v){return"(?:"+y[+v]+")"})}function a(b,y,w){return RegExp(r(b,y),w||"")}function o(b,y){for(var w=0;w>/g,function(){return"(?:"+b+")"});return b.replace(/<>/g,"[^\\s\\S]")}var i={type:"Adj BigInt Bool Ctl Double false Int One Pauli PauliI PauliX PauliY PauliZ Qubit Range Result String true Unit Zero",other:"Adjoint adjoint apply as auto body borrow borrowing Controlled controlled distribute elif else fail fixup for function if in internal intrinsic invert is let mutable namespace new newtype open operation repeat return self set until use using while within"};function s(b){return"\\b(?:"+b.trim().replace(/ /g,"|")+")\\b"}var l=RegExp(s(i.type+" "+i.other)),c=/\b[A-Za-z_]\w*\b/.source,u=r(/<<0>>(?:\s*\.\s*<<0>>)*/.source,[c]),d={keyword:l,punctuation:/[<>()?,.:[\]]/},g=/"(?:\\.|[^\\"])*"/.source;n.languages.qsharp=n.languages.extend("clike",{comment:/\/\/.*/,string:[{pattern:a(/(^|[^$\\])<<0>>/.source,[g]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:a(/(\b(?:as|open)\s+)<<0>>(?=\s*(?:;|as\b))/.source,[u]),lookbehind:!0,inside:d},{pattern:a(/(\bnamespace\s+)<<0>>(?=\s*\{)/.source,[u]),lookbehind:!0,inside:d}],keyword:l,number:/(?:\b0(?:x[\da-f]+|b[01]+|o[0-7]+)|(?:\B\.\d+|\b\d+(?:\.\d*)?)(?:e[-+]?\d+)?)l?\b/i,operator:/\band=|\bor=|\band\b|\bnot\b|\bor\b|<[-=]|[-=]>|>>>=?|<<<=?|\^\^\^=?|\|\|\|=?|&&&=?|w\/=?|~~~|[*\/+\-^=!%]=?/,punctuation:/::|[{}[\];(),.:]/}),n.languages.insertBefore("qsharp","number",{range:{pattern:/\.\./,alias:"operator"}});var m=o(r(/\{(?:[^"{}]|<<0>>|<>)*\}/.source,[g]),2);n.languages.insertBefore("qsharp","string",{"interpolation-string":{pattern:a(/\$"(?:\\.|<<0>>|[^\\"{])*"/.source,[m]),greedy:!0,inside:{interpolation:{pattern:a(/((?:^|[^\\])(?:\\\\)*)<<0>>/.source,[m]),lookbehind:!0,inside:{punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-qsharp",inside:n.languages.qsharp}}},string:/[\s\S]+/}}})})(t),t.languages.qs=t.languages.qsharp}return u0}var d0,JL;function vSe(){if(JL)return d0;JL=1,d0=e,e.displayName="r",e.aliases=[];function e(t){t.languages.r={comment:/#.*/,string:{pattern:/(['"])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},"percent-operator":{pattern:/%[^%\s]*%/,alias:"operator"},boolean:/\b(?:FALSE|TRUE)\b/,ellipsis:/\.\.(?:\.|\d+)/,number:[/\b(?:Inf|NaN)\b/,/(?:\b0x[\dA-Fa-f]+(?:\.\d*)?|\b\d+(?:\.\d*)?|\B\.\d+)(?:[EePp][+-]?\d+)?[iL]?/],keyword:/\b(?:NA|NA_character_|NA_complex_|NA_integer_|NA_real_|NULL|break|else|for|function|if|in|next|repeat|while)\b/,operator:/->?>?|<(?:=|=!]=?|::?|&&?|\|\|?|[+*\/^$@~]/,punctuation:/[(){}\[\],;]/}}return d0}var f0,eM;function SSe(){if(eM)return f0;eM=1;var e=LA();f0=t,t.displayName="racket",t.aliases=["rkt"];function t(n){n.register(e),n.languages.racket=n.languages.extend("scheme",{"lambda-parameter":{pattern:/([(\[]lambda\s+[(\[])[^()\[\]'\s]+/,lookbehind:!0}}),n.languages.insertBefore("racket","string",{lang:{pattern:/^#lang.+/m,greedy:!0,alias:"keyword"}}),n.languages.rkt=n.languages.racket}return f0}var p0,tM;function wSe(){if(tM)return p0;tM=1,p0=e,e.displayName="reason",e.aliases=[];function e(t){t.languages.reason=t.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),t.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete t.languages.reason.function}return p0}var g0,nM;function ESe(){if(nM)return g0;nM=1,g0=e,e.displayName="regex",e.aliases=[];function e(t){(function(n){var r={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},a=/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/,o={pattern:/\.|\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},i={pattern:/\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},s="(?:[^\\\\-]|"+a.source+")",l=RegExp(s+"-"+s),c={pattern:/(<|')[^<>']+(?=[>']$)/,lookbehind:!0,alias:"variable"};n.languages.regex={"char-class":{pattern:/((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,lookbehind:!0,inside:{"char-class-negation":{pattern:/(^\[)\^/,lookbehind:!0,alias:"operator"},"char-class-punctuation":{pattern:/^\[|\]$/,alias:"punctuation"},range:{pattern:l,inside:{escape:a,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":r,"char-set":i,escape:a}},"special-escape":r,"char-set":o,backreference:[{pattern:/\\(?![123][0-7]{2})[1-9]/,alias:"keyword"},{pattern:/\\k<[^<>']+>/,alias:"keyword",inside:{"group-name":c}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:a,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|:=]=?|!=|\b_\b/,punctuation:/[,;.\[\]{}()]/}}return m0}var h0,aM;function kSe(){if(aM)return h0;aM=1,h0=e,e.displayName="renpy",e.aliases=["rpy"];function e(t){t.languages.renpy={comment:{pattern:/(^|[^\\])#.+/,lookbehind:!0},string:{pattern:/("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\])*\2|(?:^#?(?:(?:[0-9a-fA-F]){3}|[0-9a-fA-F]{6})$)/m,greedy:!0},function:/\b[a-z_]\w*(?=\()/i,property:/\b(?:Update|UpdateVersion|action|activate_sound|adv_nvl_transition|after_load_transition|align|alpha|alt|anchor|antialias|area|auto|background|bar_invert|bar_resizing|bar_vertical|black_color|bold|bottom_bar|bottom_gutter|bottom_margin|bottom_padding|box_reverse|box_wrap|can_update|caret|child|color|crop|default_afm_enable|default_afm_time|default_fullscreen|default_text_cps|developer|directory_name|drag_handle|drag_joined|drag_name|drag_raise|draggable|dragged|drop_shadow|drop_shadow_color|droppable|dropped|easein|easeout|edgescroll|end_game_transition|end_splash_transition|enter_replay_transition|enter_sound|enter_transition|enter_yesno_transition|executable_name|exit_replay_transition|exit_sound|exit_transition|exit_yesno_transition|fadein|fadeout|first_indent|first_spacing|fit_first|focus|focus_mask|font|foreground|game_main_transition|get_installed_packages|google_play_key|google_play_salt|ground|has_music|has_sound|has_voice|height|help|hinting|hover|hover_background|hover_color|hover_sound|hovered|hyperlink_functions|idle|idle_color|image_style|include_update|insensitive|insensitive_background|insensitive_color|inside|intra_transition|italic|justify|kerning|keyboard_focus|language|layer_clipping|layers|layout|left_bar|left_gutter|left_margin|left_padding|length|line_leading|line_overlap_split|line_spacing|linear|main_game_transition|main_menu_music|maximum|min_width|minimum|minwidth|modal|mouse|mousewheel|name|narrator_menu|newline_indent|nvl_adv_transition|offset|order_reverse|outlines|overlay_functions|pos|position|prefix|radius|range|rest_indent|right_bar|right_gutter|right_margin|right_padding|rotate|rotate_pad|ruby_style|sample_sound|save_directory|say_attribute_transition|screen_height|screen_width|scrollbars|selected_hover|selected_hover_color|selected_idle|selected_idle_color|selected_insensitive|show_side_image|show_two_window|side_spacing|side_xpos|side_ypos|size|size_group|slow_cps|slow_cps_multiplier|spacing|strikethrough|subpixel|text_align|text_style|text_xpos|text_y_fudge|text_ypos|thumb|thumb_offset|thumb_shadow|thumbnail_height|thumbnail_width|time|top_bar|top_gutter|top_margin|top_padding|translations|underline|unscrollable|update|value|version|version_name|version_tuple|vertical|width|window_hide_transition|window_icon|window_left_padding|window_show_transition|window_title|windows_icon|xadjustment|xalign|xanchor|xanchoraround|xaround|xcenter|xfill|xinitial|xmargin|xmaximum|xminimum|xoffset|xofsset|xpadding|xpos|xsize|xzoom|yadjustment|yalign|yanchor|yanchoraround|yaround|ycenter|yfill|yinitial|ymargin|ymaximum|yminimum|yoffset|ypadding|ypos|ysize|ysizexysize|yzoom|zoom|zorder)\b/,tag:/\b(?:bar|block|button|buttoscreenn|drag|draggroup|fixed|frame|grid|[hv]box|hotbar|hotspot|image|imagebutton|imagemap|input|key|label|menu|mm_menu_frame|mousearea|nvl|parallel|screen|self|side|tag|text|textbutton|timer|vbar|viewport|window)\b|\$/,keyword:/\b(?:None|add|adjustment|alignaround|allow|angle|animation|around|as|assert|behind|box_layout|break|build|cache|call|center|changed|child_size|choice|circles|class|clear|clicked|clipping|clockwise|config|contains|continue|corner1|corner2|counterclockwise|def|default|define|del|delay|disabled|disabled_text|dissolve|elif|else|event|except|exclude|exec|expression|fade|finally|for|from|function|global|gm_root|has|hide|id|if|import|in|init|is|jump|knot|lambda|left|less_rounded|mm_root|movie|music|null|on|onlayer|pass|pause|persistent|play|print|python|queue|raise|random|renpy|repeat|return|right|rounded_window|scene|scope|set|show|slow|slow_abortable|slow_done|sound|stop|store|style|style_group|substitute|suffix|theme|transform|transform_anchor|transpose|try|ui|unhovered|updater|use|voice|while|widget|widget_hover|widget_selected|widget_text|yield)\b/,boolean:/\b(?:[Ff]alse|[Tt]rue)\b/,number:/(?:\b(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?)|\B\.\d+)(?:e[+-]?\d+)?j?/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:and|at|not|or|with)\b/,punctuation:/[{}[\];(),.:]/},t.languages.rpy=t.languages.renpy}return h0}var b0,oM;function CSe(){if(oM)return b0;oM=1,b0=e,e.displayName="rest",e.aliases=[];function e(t){t.languages.rest={table:[{pattern:/(^[\t ]*)(?:\+[=-]+)+\+(?:\r?\n|\r)(?:\1[+|].+[+|](?:\r?\n|\r))+\1(?:\+[=-]+)+\+/m,lookbehind:!0,inside:{punctuation:/\||(?:\+[=-]+)+\+/}},{pattern:/(^[\t ]*)=+ [ =]*=(?:(?:\r?\n|\r)\1.+)+(?:\r?\n|\r)\1=+ [ =]*=(?=(?:\r?\n|\r){2}|\s*$)/m,lookbehind:!0,inside:{punctuation:/[=-]+/}}],"substitution-def":{pattern:/(^[\t ]*\.\. )\|(?:[^|\s](?:[^|]*[^|\s])?)\| [^:]+::/m,lookbehind:!0,inside:{substitution:{pattern:/^\|(?:[^|\s]|[^|\s][^|]*[^|\s])\|/,alias:"attr-value",inside:{punctuation:/^\||\|$/}},directive:{pattern:/( )(?! )[^:]+::/,lookbehind:!0,alias:"function",inside:{punctuation:/::$/}}}},"link-target":[{pattern:/(^[\t ]*\.\. )\[[^\]]+\]/m,lookbehind:!0,alias:"string",inside:{punctuation:/^\[|\]$/}},{pattern:/(^[\t ]*\.\. )_(?:`[^`]+`|(?:[^:\\]|\\.)+):/m,lookbehind:!0,alias:"string",inside:{punctuation:/^_|:$/}}],directive:{pattern:/(^[\t ]*\.\. )[^:]+::/m,lookbehind:!0,alias:"function",inside:{punctuation:/::$/}},comment:{pattern:/(^[\t ]*\.\.)(?:(?: .+)?(?:(?:\r?\n|\r).+)+| .+)(?=(?:\r?\n|\r){2}|$)/m,lookbehind:!0},title:[{pattern:/^(([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2+)(?:\r?\n|\r).+(?:\r?\n|\r)\1$/m,inside:{punctuation:/^[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+|[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+$/,important:/.+/}},{pattern:/(^|(?:\r?\n|\r){2}).+(?:\r?\n|\r)([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2+(?=\r?\n|\r|$)/,lookbehind:!0,inside:{punctuation:/[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+$/,important:/.+/}}],hr:{pattern:/((?:\r?\n|\r){2})([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2{3,}(?=(?:\r?\n|\r){2})/,lookbehind:!0,alias:"punctuation"},field:{pattern:/(^[\t ]*):[^:\r\n]+:(?= )/m,lookbehind:!0,alias:"attr-name"},"command-line-option":{pattern:/(^[\t ]*)(?:[+-][a-z\d]|(?:--|\/)[a-z\d-]+)(?:[ =](?:[a-z][\w-]*|<[^<>]+>))?(?:, (?:[+-][a-z\d]|(?:--|\/)[a-z\d-]+)(?:[ =](?:[a-z][\w-]*|<[^<>]+>))?)*(?=(?:\r?\n|\r)? {2,}\S)/im,lookbehind:!0,alias:"symbol"},"literal-block":{pattern:/::(?:\r?\n|\r){2}([ \t]+)(?![ \t]).+(?:(?:\r?\n|\r)\1.+)*/,inside:{"literal-block-punctuation":{pattern:/^::/,alias:"punctuation"}}},"quoted-literal-block":{pattern:/::(?:\r?\n|\r){2}([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]).*(?:(?:\r?\n|\r)\1.*)*/,inside:{"literal-block-punctuation":{pattern:/^(?:::|([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\1*)/m,alias:"punctuation"}}},"list-bullet":{pattern:/(^[\t ]*)(?:[*+\-•‣⁃]|\(?(?:\d+|[a-z]|[ivxdclm]+)\)|(?:\d+|[a-z]|[ivxdclm]+)\.)(?= )/im,lookbehind:!0,alias:"punctuation"},"doctest-block":{pattern:/(^[\t ]*)>>> .+(?:(?:\r?\n|\r).+)*/m,lookbehind:!0,inside:{punctuation:/^>>>/}},inline:[{pattern:/(^|[\s\-:\/'"<(\[{])(?::[^:]+:`.*?`|`.*?`:[^:]+:|(\*\*?|``?|\|)(?!\s)(?:(?!\2).)*\S\2(?=[\s\-.,:;!?\\\/'")\]}]|$))/m,lookbehind:!0,inside:{bold:{pattern:/(^\*\*).+(?=\*\*$)/,lookbehind:!0},italic:{pattern:/(^\*).+(?=\*$)/,lookbehind:!0},"inline-literal":{pattern:/(^``).+(?=``$)/,lookbehind:!0,alias:"symbol"},role:{pattern:/^:[^:]+:|:[^:]+:$/,alias:"function",inside:{punctuation:/^:|:$/}},"interpreted-text":{pattern:/(^`).+(?=`$)/,lookbehind:!0,alias:"attr-value"},substitution:{pattern:/(^\|).+(?=\|$)/,lookbehind:!0,alias:"attr-value"},punctuation:/\*\*?|``?|\|/}}],link:[{pattern:/\[[^\[\]]+\]_(?=[\s\-.,:;!?\\\/'")\]}]|$)/,alias:"string",inside:{punctuation:/^\[|\]_$/}},{pattern:/(?:\b[a-z\d]+(?:[_.:+][a-z\d]+)*_?_|`[^`]+`_?_|_`[^`]+`)(?=[\s\-.,:;!?\\\/'")\]}]|$)/i,alias:"string",inside:{punctuation:/^_?`|`$|`?_?_$/}}],punctuation:{pattern:/(^[\t ]*)(?:\|(?= |$)|(?:---?|—|\.\.|__)(?= )|\.\.$)/m,lookbehind:!0}}}return b0}var y0,iM;function _Se(){if(iM)return y0;iM=1,y0=e,e.displayName="rip",e.aliases=[];function e(t){t.languages.rip={comment:{pattern:/#.*/,greedy:!0},char:{pattern:/\B`[^\s`'",.:;#\/\\()<>\[\]{}]\b/,greedy:!0},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},regex:{pattern:/(^|[^/])\/(?!\/)(?:\[[^\n\r\]]*\]|\\.|[^/\\\r\n\[])+\/(?=\s*(?:$|[\r\n,.;})]))/,lookbehind:!0,greedy:!0},keyword:/(?:=>|->)|\b(?:case|catch|class|else|exit|finally|if|raise|return|switch|try)\b/,builtin:/@|\bSystem\b/,boolean:/\b(?:false|true)\b/,date:/\b\d{4}-\d{2}-\d{2}\b/,time:/\b\d{2}:\d{2}:\d{2}\b/,datetime:/\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\b/,symbol:/:[^\d\s`'",.:;#\/\\()<>\[\]{}][^\s`'",.:;#\/\\()<>\[\]{}]*/,number:/[+-]?\b(?:\d+\.\d+|\d+)\b/,punctuation:/(?:\.{2,3})|[`,.:;=\/\\()<>\[\]{}]/,reference:/[^\d\s`'",.:;#\/\\()<>\[\]{}][^\s`'",.:;#\/\\()<>\[\]{}]*/}}return y0}var v0,sM;function ASe(){if(sM)return v0;sM=1,v0=e,e.displayName="roboconf",e.aliases=[];function e(t){t.languages.roboconf={comment:/#.*/,keyword:{pattern:/(^|\s)(?:(?:external|import)\b|(?:facet|instance of)(?=[ \t]+[\w-]+[ \t]*\{))/,lookbehind:!0},component:{pattern:/[\w-]+(?=[ \t]*\{)/,alias:"variable"},property:/[\w.-]+(?=[ \t]*:)/,value:{pattern:/(=[ \t]*(?![ \t]))[^,;]+/,lookbehind:!0,alias:"attr-value"},optional:{pattern:/\(optional\)/,alias:"builtin"},wildcard:{pattern:/(\.)\*/,lookbehind:!0,alias:"operator"},punctuation:/[{},.;:=]/}}return v0}var S0,lM;function TSe(){if(lM)return S0;lM=1,S0=e,e.displayName="robotframework",e.aliases=[];function e(t){(function(n){var r={pattern:/(^[ \t]*| {2}|\t)#.*/m,lookbehind:!0,greedy:!0},a={pattern:/((?:^|[^\\])(?:\\{2})*)[$@&%]\{(?:[^{}\r\n]|\{[^{}\r\n]*\})*\}/,lookbehind:!0,inside:{punctuation:/^[$@&%]\{|\}$/}};function o(c,u){var d={};d["section-header"]={pattern:/^ ?\*{3}.+?\*{3}/,alias:"keyword"};for(var g in u)d[g]=u[g];return d.tag={pattern:/([\r\n](?: {2}|\t)[ \t]*)\[[-\w]+\]/,lookbehind:!0,inside:{punctuation:/\[|\]/}},d.variable=a,d.comment=r,{pattern:RegExp(/^ ?\*{3}[ \t]*[ \t]*\*{3}(?:.|[\r\n](?!\*{3}))*/.source.replace(//g,function(){return c}),"im"),alias:"section",inside:d}}var i={pattern:/(\[Documentation\](?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,lookbehind:!0,alias:"string"},s={pattern:/([\r\n] ?)(?!#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0,alias:"function",inside:{variable:a}},l={pattern:/([\r\n](?: {2}|\t)[ \t]*)(?!\[|\.{3}|#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0,inside:{variable:a}};n.languages.robotframework={settings:o("Settings",{documentation:{pattern:/([\r\n] ?Documentation(?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,lookbehind:!0,alias:"string"},property:{pattern:/([\r\n] ?)(?!\.{3}|#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0}}),variables:o("Variables"),"test-cases":o("Test Cases",{"test-name":s,documentation:i,property:l}),keywords:o("Keywords",{"keyword-name":s,documentation:i,property:l}),tasks:o("Tasks",{"task-name":s,documentation:i,property:l}),comment:r},n.languages.robot=n.languages.robotframework})(t)}return S0}var w0,cM;function RSe(){if(cM)return w0;cM=1,w0=e,e.displayName="rust",e.aliases=[];function e(t){(function(n){for(var r=/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|)*\*\//.source,a=0;a<2;a++)r=r.replace(//g,function(){return r});r=r.replace(//g,function(){return/[^\s\S]/.source}),n.languages.rust={comment:[{pattern:RegExp(/(^|[^\\])/.source+r),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?=?|[@?]/},n.languages.rust["closure-params"].inside.rest=n.languages.rust,n.languages.rust.attribute.inside.string=n.languages.rust.string})(t)}return w0}var E0,uM;function NSe(){if(uM)return E0;uM=1,E0=e,e.displayName="sas",e.aliases=[];function e(t){(function(n){var r=/(?:"(?:""|[^"])*"(?!")|'(?:''|[^'])*'(?!'))/.source,a=/\b(?:\d[\da-f]*x|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,o={pattern:RegExp(r+"[bx]"),alias:"number"},i={pattern:/&[a-z_]\w*/i},s={pattern:/((?:^|\s|=|\())%(?:ABORT|BY|CMS|COPY|DISPLAY|DO|ELSE|END|EVAL|GLOBAL|GO|GOTO|IF|INC|INCLUDE|INDEX|INPUT|KTRIM|LENGTH|LET|LIST|LOCAL|PUT|QKTRIM|QSCAN|QSUBSTR|QSYSFUNC|QUPCASE|RETURN|RUN|SCAN|SUBSTR|SUPERQ|SYMDEL|SYMEXIST|SYMGLOBL|SYMLOCAL|SYSCALL|SYSEVALF|SYSEXEC|SYSFUNC|SYSGET|SYSRPUT|THEN|TO|TSO|UNQUOTE|UNTIL|UPCASE|WHILE|WINDOW)\b/i,lookbehind:!0,alias:"keyword"},l={pattern:/(^|\s)(?:proc\s+\w+|data(?!=)|quit|run)\b/i,alias:"keyword",lookbehind:!0},c=[/\/\*[\s\S]*?\*\//,{pattern:/(^[ \t]*|;\s*)\*[^;]*;/m,lookbehind:!0}],u={pattern:RegExp(r),greedy:!0},d=/[$%@.(){}\[\];,\\]/,g={pattern:/%?\b\w+(?=\()/,alias:"keyword"},m={function:g,"arg-value":{pattern:/(=\s*)[A-Z\.]+/i,lookbehind:!0},operator:/=/,"macro-variable":i,arg:{pattern:/[A-Z]+/i,alias:"keyword"},number:a,"numeric-constant":o,punctuation:d,string:u},b={pattern:/\b(?:format|put)\b=?[\w'$.]+/i,inside:{keyword:/^(?:format|put)(?==)/i,equals:/=/,format:{pattern:/(?:\w|\$\d)+\.\d?/,alias:"number"}}},y={pattern:/\b(?:format|put)\s+[\w']+(?:\s+[$.\w]+)+(?=;)/i,inside:{keyword:/^(?:format|put)/i,format:{pattern:/[\w$]+\.\d?/,alias:"number"}}},w={pattern:/((?:^|\s)=?)(?:catname|checkpoint execute_always|dm|endsas|filename|footnote|%include|libname|%list|lock|missing|options|page|resetline|%run|sasfile|skip|sysecho|title\d?)\b/i,lookbehind:!0,alias:"keyword"},v={pattern:/(^|\s)(?:submit(?:\s+(?:load|norun|parseonly))?|endsubmit)\b/i,lookbehind:!0,alias:"keyword"},h=/aStore|accessControl|aggregation|audio|autotune|bayesianNetClassifier|bioMedImage|boolRule|builtins|cardinality|cdm|clustering|conditionalRandomFields|configuration|copula|countreg|dataDiscovery|dataPreprocess|dataSciencePilot|dataStep|decisionTree|deduplication|deepLearn|deepNeural|deepRnn|ds2|ecm|entityRes|espCluster|explainModel|factmac|fastKnn|fcmpact|fedSql|freqTab|gVarCluster|gam|gleam|graphSemiSupLearn|hiddenMarkovModel|hyperGroup|ica|image|iml|kernalPca|langModel|ldaTopic|loadStreams|mbc|mixed|mlTools|modelPublishing|network|neuralNet|nmf|nonParametricBayes|nonlinear|optNetwork|optimization|panel|pca|percentile|phreg|pls|qkb|qlim|quantreg|recommend|regression|reinforcementLearn|robustPca|ruleMining|sampling|sandwich|sccasl|search(?:Analytics)?|sentimentAnalysis|sequence|session(?:Prop)?|severity|simSystem|simple|smartData|sparkEmbeddedProcess|sparseML|spatialreg|spc|stabilityMonitoring|svDataDescription|svm|table|text(?:Filters|Frequency|Mining|Parse|Rule(?:Develop|Score)|Topic|Util)|timeData|transpose|tsInfo|tsReconcile|uniTimeSeries|varReduce/.source,S={pattern:RegExp(/(^|\s)(?:action\s+)?(?:)\.[a-z]+\b[^;]+/.source.replace(//g,function(){return h}),"i"),lookbehind:!0,inside:{keyword:RegExp(/(?:)\.[a-z]+\b/.source.replace(//g,function(){return h}),"i"),action:{pattern:/(?:action)/i,alias:"keyword"},comment:c,function:g,"arg-value":m["arg-value"],operator:m.operator,argument:m.arg,number:a,"numeric-constant":o,punctuation:d,string:u}},E={pattern:/((?:^|\s)=?)(?:after|analysis|and|array|barchart|barwidth|begingraph|by|call|cas|cbarline|cfill|class(?:lev)?|close|column|computed?|contains|continue|data(?==)|define|delete|describe|document|do\s+over|do|dol|drop|dul|else|end(?:comp|source)?|entryTitle|eval(?:uate)?|exec(?:ute)?|exit|file(?:name)?|fill(?:attrs)?|flist|fnc|function(?:list)?|global|goto|group(?:by)?|headline|headskip|histogram|if|infile|keep|keylabel|keyword|label|layout|leave|legendlabel|length|libname|loadactionset|merge|midpoints|_?null_|name|noobs|nowd|ods|options|or|otherwise|out(?:put)?|over(?:lay)?|plot|print|put|raise|ranexp|rannor|rbreak|retain|return|select|session|sessref|set|source|statgraph|sum|summarize|table|temp|terminate|then\s+do|then|title\d?|to|var|when|where|xaxisopts|y2axisopts|yaxisopts)\b/i,lookbehind:!0};n.languages.sas={datalines:{pattern:/^([ \t]*)(?:cards|(?:data)?lines);[\s\S]+?^[ \t]*;/im,lookbehind:!0,alias:"string",inside:{keyword:{pattern:/^(?:cards|(?:data)?lines)/i},punctuation:/;/}},"proc-sql":{pattern:/(^proc\s+(?:fed)?sql(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{sql:{pattern:RegExp(/^[ \t]*(?:select|alter\s+table|(?:create|describe|drop)\s+(?:index|table(?:\s+constraints)?|view)|create\s+unique\s+index|insert\s+into|update)(?:|[^;"'])+;/.source.replace(//g,function(){return r}),"im"),alias:"language-sql",inside:n.languages.sql},"global-statements":w,"sql-statements":{pattern:/(^|\s)(?:disconnect\s+from|begin|commit|exec(?:ute)?|reset|rollback|validate)\b/i,lookbehind:!0,alias:"keyword"},number:a,"numeric-constant":o,punctuation:d,string:u}},"proc-groovy":{pattern:/(^proc\s+groovy(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:c,groovy:{pattern:RegExp(/(^[ \t]*submit(?:\s+(?:load|norun|parseonly))?)(?:|[^"'])+?(?=endsubmit;)/.source.replace(//g,function(){return r}),"im"),lookbehind:!0,alias:"language-groovy",inside:n.languages.groovy},keyword:E,"submit-statement":v,"global-statements":w,number:a,"numeric-constant":o,punctuation:d,string:u}},"proc-lua":{pattern:/(^proc\s+lua(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:c,lua:{pattern:RegExp(/(^[ \t]*submit(?:\s+(?:load|norun|parseonly))?)(?:|[^"'])+?(?=endsubmit;)/.source.replace(//g,function(){return r}),"im"),lookbehind:!0,alias:"language-lua",inside:n.languages.lua},keyword:E,"submit-statement":v,"global-statements":w,number:a,"numeric-constant":o,punctuation:d,string:u}},"proc-cas":{pattern:/(^proc\s+cas(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|quit|data);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:c,"statement-var":{pattern:/((?:^|\s)=?)saveresult\s[^;]+/im,lookbehind:!0,inside:{statement:{pattern:/^saveresult\s+\S+/i,inside:{keyword:/^(?:saveresult)/i}},rest:m}},"cas-actions":S,statement:{pattern:/((?:^|\s)=?)(?:default|(?:un)?set|on|output|upload)[^;]+/im,lookbehind:!0,inside:m},step:l,keyword:E,function:g,format:b,altformat:y,"global-statements":w,number:a,"numeric-constant":o,punctuation:d,string:u}},"proc-args":{pattern:RegExp(/(^proc\s+\w+\s+)(?!\s)(?:[^;"']|)+;/.source.replace(//g,function(){return r}),"im"),lookbehind:!0,inside:m},"macro-keyword":s,"macro-variable":i,"macro-string-functions":{pattern:/((?:^|\s|=))%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)\(.*?(?:[^%]\))/i,lookbehind:!0,inside:{function:{pattern:/%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)/i,alias:"keyword"},"macro-keyword":s,"macro-variable":i,"escaped-char":{pattern:/%['"()<>=¬^~;,#]/},punctuation:d}},"macro-declaration":{pattern:/^%macro[^;]+(?=;)/im,inside:{keyword:/%macro/i}},"macro-end":{pattern:/^%mend[^;]+(?=;)/im,inside:{keyword:/%mend/i}},macro:{pattern:/%_\w+(?=\()/,alias:"keyword"},input:{pattern:/\binput\s[-\w\s/*.$&]+;/i,inside:{input:{alias:"keyword",pattern:/^input/i},comment:c,number:a,"numeric-constant":o}},"options-args":{pattern:/(^options)[-'"|/\\<>*+=:()\w\s]*(?=;)/im,lookbehind:!0,inside:m},"cas-actions":S,comment:c,function:g,format:b,altformat:y,"numeric-constant":o,datetime:{pattern:RegExp(r+"(?:dt?|t)"),alias:"number"},string:u,step:l,keyword:E,"operator-keyword":{pattern:/\b(?:eq|ge|gt|in|le|lt|ne|not)\b/i,alias:"operator"},number:a,operator:/\*\*?|\|\|?|!!?|¦¦?|<[>=]?|>[<=]?|[-+\/=&]|[~¬^]=?/,punctuation:d}})(t)}return E0}var x0,dM;function ISe(){if(dM)return x0;dM=1,x0=e,e.displayName="sass",e.aliases=[];function e(t){(function(n){n.languages.sass=n.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),n.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete n.languages.sass.atrule;var r=/\$[-\w]+|#\{\$[-\w]+\}/,a=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];n.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:r,operator:a}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:r,operator:a,important:n.languages.sass.important}}}),delete n.languages.sass.property,delete n.languages.sass.important,n.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})})(t)}return x0}var k0,fM;function OSe(){if(fM)return k0;fM=1;var e=IA();k0=t,t.displayName="scala",t.aliases=[];function t(n){n.register(e),n.languages.scala=n.languages.extend("java",{"triple-quoted-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:/<-|=>|\b(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|null|object|override|package|private|protected|return|sealed|self|super|this|throw|trait|try|type|val|var|while|with|yield)\b/,number:/\b0x(?:[\da-f]*\.)?[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e\d+)?[dfl]?/i,builtin:/\b(?:Any|AnyRef|AnyVal|Boolean|Byte|Char|Double|Float|Int|Long|Nothing|Short|String|Unit)\b/,symbol:/'[^\d\s\\]\w*/}),n.languages.insertBefore("scala","triple-quoted-string",{"string-interpolation":{pattern:/\b[a-z]\w*(?:"""(?:[^$]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*?"""|"(?:[^$"\r\n]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*")/i,greedy:!0,inside:{id:{pattern:/^\w+/,greedy:!0,alias:"function"},escape:{pattern:/\\\$"|\$[$"]/,greedy:!0,alias:"symbol"},interpolation:{pattern:/\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,greedy:!0,inside:{punctuation:/^\$\{?|\}$/,expression:{pattern:/[\s\S]+/,inside:n.languages.scala}}},string:/[\s\S]+/}}}),delete n.languages.scala["class-name"],delete n.languages.scala.function}return k0}var C0,pM;function DSe(){if(pM)return C0;pM=1,C0=e,e.displayName="scss",e.aliases=[];function e(t){t.languages.scss=t.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),t.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),t.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),t.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),t.languages.scss.atrule.inside.rest=t.languages.scss}return C0}var _0,gM;function LSe(){if(gM)return _0;gM=1;var e=az();_0=t,t.displayName="shellSession",t.aliases=[];function t(n){n.register(e),function(r){var a=[/"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/.source,/'[^']*'/.source,/\$'(?:[^'\\]|\\[\s\S])*'/.source,/<<-?\s*(["']?)(\w+)\1\s[\s\S]*?[\r\n]\2/.source].join("|");r.languages["shell-session"]={command:{pattern:RegExp(/^/.source+"(?:"+(/[^\s@:$#%*!/\\]+@[^\r\n@:$#%*!/\\]+(?::[^\0-\x1F$#%*?"<>:;|]+)?/.source+"|"+/[/~.][^\0-\x1F$#%*?"<>@:;|]*/.source)+")?"+/[$#%](?=\s)/.source+/(?:[^\\\r\n \t'"<$]|[ \t](?:(?!#)|#.*$)|\\(?:[^\r]|\r\n?)|\$(?!')|<(?!<)|<>)+/.source.replace(/<>/g,function(){return a}),"m"),greedy:!0,inside:{info:{pattern:/^[^#$%]+/,alias:"punctuation",inside:{user:/^[^\s@:$#%*!/\\]+@[^\r\n@:$#%*!/\\]+/,punctuation:/:/,path:/[\s\S]+/}},bash:{pattern:/(^[$#%]\s*)\S[\s\S]*/,lookbehind:!0,alias:"language-bash",inside:r.languages.bash},"shell-symbol":{pattern:/^[$#%]/,alias:"important"}}},output:/.(?:.*(?:[\r\n]|.$))*/},r.languages["sh-session"]=r.languages.shellsession=r.languages["shell-session"]}(n)}return _0}var A0,mM;function MSe(){if(mM)return A0;mM=1,A0=e,e.displayName="smali",e.aliases=[];function e(t){t.languages.smali={comment:/#.*/,string:{pattern:/"(?:[^\r\n\\"]|\\.)*"|'(?:[^\r\n\\']|\\(?:.|u[\da-fA-F]{4}))'/,greedy:!0},"class-name":{pattern:/(^|[^L])L(?:(?:\w+|`[^`\r\n]*`)\/)*(?:[\w$]+|`[^`\r\n]*`)(?=\s*;)/,lookbehind:!0,inside:{"class-name":{pattern:/(^L|\/)(?:[\w$]+|`[^`\r\n]*`)$/,lookbehind:!0},namespace:{pattern:/^(L)(?:(?:\w+|`[^`\r\n]*`)\/)+/,lookbehind:!0,inside:{punctuation:/\//}},builtin:/^L/}},builtin:[{pattern:/([();\[])[BCDFIJSVZ]+/,lookbehind:!0},{pattern:/([\w$>]:)[BCDFIJSVZ]/,lookbehind:!0}],keyword:[{pattern:/(\.end\s+)[\w-]+/,lookbehind:!0},{pattern:/(^|[^\w.-])\.(?!\d)[\w-]+/,lookbehind:!0},{pattern:/(^|[^\w.-])(?:abstract|annotation|bridge|constructor|enum|final|interface|private|protected|public|runtime|static|synthetic|system|transient)(?![\w.-])/,lookbehind:!0}],function:{pattern:/(^|[^\w.-])(?:\w+|<[\w$-]+>)(?=\()/,lookbehind:!0},field:{pattern:/[\w$]+(?=:)/,alias:"variable"},register:{pattern:/(^|[^\w.-])[vp]\d(?![\w.-])/,lookbehind:!0,alias:"variable"},boolean:{pattern:/(^|[^\w.-])(?:false|true)(?![\w.-])/,lookbehind:!0},number:{pattern:/(^|[^/\w.-])-?(?:NAN|INFINITY|0x(?:[\dA-F]+(?:\.[\dA-F]*)?|\.[\dA-F]+)(?:p[+-]?[\dA-F]+)?|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)[dflst]?(?![\w.-])/i,lookbehind:!0},label:{pattern:/(:)\w+/,lookbehind:!0,alias:"property"},operator:/->|\.\.|[\[=]/,punctuation:/[{}(),;:]/}}return A0}var T0,hM;function PSe(){if(hM)return T0;hM=1,T0=e,e.displayName="smalltalk",e.aliases=[];function e(t){t.languages.smalltalk={comment:{pattern:/"(?:""|[^"])*"/,greedy:!0},char:{pattern:/\$./,greedy:!0},string:{pattern:/'(?:''|[^'])*'/,greedy:!0},symbol:/#[\da-z]+|#(?:-|([+\/\\*~<>=@%|&?!])\1?)|#(?=\()/i,"block-arguments":{pattern:/(\[\s*):[^\[|]*\|/,lookbehind:!0,inside:{variable:/:[\da-z]+/i,punctuation:/\|/}},"temporary-variables":{pattern:/\|[^|]+\|/,inside:{variable:/[\da-z]+/i,punctuation:/\|/}},keyword:/\b(?:new|nil|self|super)\b/,boolean:/\b(?:false|true)\b/,number:[/\d+r-?[\dA-Z]+(?:\.[\dA-Z]+)?(?:e-?\d+)?/,/\b\d+(?:\.\d+)?(?:e-?\d+)?/],operator:/[<=]=?|:=|~[~=]|\/\/?|\\\\|>[>=]?|[!^+\-*&|,@]/,punctuation:/[.;:?\[\](){}]/}}return T0}var R0,bM;function $Se(){if(bM)return R0;bM=1;var e=mr();R0=t,t.displayName="smarty",t.aliases=[];function t(n){n.register(e),function(r){r.languages.smarty={comment:{pattern:/^\{\*[\s\S]*?\*\}/,greedy:!0},"embedded-php":{pattern:/^\{php\}[\s\S]*?\{\/php\}/,greedy:!0,inside:{smarty:{pattern:/^\{php\}|\{\/php\}$/,inside:null},php:{pattern:/[\s\S]+/,alias:"language-php",inside:r.languages.php}}},string:[{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0,inside:{interpolation:{pattern:/\{[^{}]*\}|`[^`]*`/,inside:{"interpolation-punctuation":{pattern:/^[{`]|[`}]$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}},variable:/\$\w+/}},{pattern:/'(?:\\.|[^'\\\r\n])*'/,greedy:!0}],keyword:{pattern:/(^\{\/?)[a-z_]\w*\b(?!\()/i,lookbehind:!0,greedy:!0},delimiter:{pattern:/^\{\/?|\}$/,greedy:!0,alias:"punctuation"},number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,variable:[/\$(?!\d)\w+/,/#(?!\d)\w+#/,{pattern:/(\.|->|\w\s*=)(?!\d)\w+\b(?!\()/,lookbehind:!0},{pattern:/(\[)(?!\d)\w+(?=\])/,lookbehind:!0}],function:{pattern:/(\|\s*)@?[a-z_]\w*|\b[a-z_]\w*(?=\()/i,lookbehind:!0},"attr-name":/\b[a-z_]\w*(?=\s*=)/i,boolean:/\b(?:false|no|off|on|true|yes)\b/,punctuation:/[\[\](){}.,:`]|->/,operator:[/[+\-*\/%]|==?=?|[!<>]=?|&&|\|\|?/,/\bis\s+(?:not\s+)?(?:div|even|odd)(?:\s+by)?\b/,/\b(?:and|eq|gt?e|gt|lt?e|lt|mod|neq?|not|or)\b/]},r.languages.smarty["embedded-php"].inside.smarty.inside=r.languages.smarty,r.languages.smarty.string[0].inside.interpolation.inside.expression.inside=r.languages.smarty;var a=/"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,o=RegExp(/\{\*[\s\S]*?\*\}/.source+"|"+/\{php\}[\s\S]*?\{\/php\}/.source+"|"+/\{(?:[^{}"']||\{(?:[^{}"']||\{(?:[^{}"']|)*\})*\})*\}/.source.replace(//g,function(){return a.source}),"g");r.hooks.add("before-tokenize",function(i){var s="{literal}",l="{/literal}",c=!1;r.languages["markup-templating"].buildPlaceholders(i,"smarty",o,function(u){return u===l&&(c=!1),c?!1:(u===s&&(c=!0),!0)})}),r.hooks.add("after-tokenize",function(i){r.languages["markup-templating"].tokenizePlaceholders(i,"smarty")})}(n)}return R0}var N0,yM;function FSe(){if(yM)return N0;yM=1,N0=e,e.displayName="sml",e.aliases=["smlnj"];function e(t){(function(n){var r=/\b(?:abstype|and|andalso|as|case|datatype|do|else|end|eqtype|exception|fn|fun|functor|handle|if|in|include|infix|infixr|let|local|nonfix|of|op|open|orelse|raise|rec|sharing|sig|signature|struct|structure|then|type|val|where|while|with|withtype)\b/i;n.languages.sml={comment:/\(\*(?:[^*(]|\*(?!\))|\((?!\*)|\(\*(?:[^*(]|\*(?!\))|\((?!\*))*\*\))*\*\)/,string:{pattern:/#?"(?:[^"\\]|\\.)*"/,greedy:!0},"class-name":[{pattern:RegExp(/((?:^|[^:]):\s*)(?:\s*(?:(?:\*|->)\s*|,\s*(?:(?=)|(?!)\s+)))*/.source.replace(//g,function(){return/\s*(?:[*,]|->)/.source}).replace(//g,function(){return/(?:'[\w']*||\((?:[^()]|\([^()]*\))*\)|\{(?:[^{}]|\{[^{}]*\})*\})(?:\s+)*/.source}).replace(//g,function(){return/(?!)[a-z\d_][\w'.]*/.source}).replace(//g,function(){return r.source}),"i"),lookbehind:!0,greedy:!0,inside:null},{pattern:/((?:^|[^\w'])(?:datatype|exception|functor|signature|structure|type)\s+)[a-z_][\w'.]*/i,lookbehind:!0}],function:{pattern:/((?:^|[^\w'])fun\s+)[a-z_][\w'.]*/i,lookbehind:!0},keyword:r,variable:{pattern:/(^|[^\w'])'[\w']*/,lookbehind:!0},number:/~?\b(?:\d+(?:\.\d+)?(?:e~?\d+)?|0x[\da-f]+)\b/i,word:{pattern:/\b0w(?:\d+|x[\da-f]+)\b/i,alias:"constant"},boolean:/\b(?:false|true)\b/i,operator:/\.\.\.|:[>=:]|=>?|->|[<>]=?|[!+\-*/^#|@~]/,punctuation:/[(){}\[\].:,;]/},n.languages.sml["class-name"][0].inside=n.languages.sml,n.languages.smlnj=n.languages.sml})(t)}return N0}var I0,vM;function jSe(){if(vM)return I0;vM=1,I0=e,e.displayName="solidity",e.aliases=["sol"];function e(t){t.languages.solidity=t.languages.extend("clike",{"class-name":{pattern:/(\b(?:contract|enum|interface|library|new|struct|using)\s+)(?!\d)[\w$]+/,lookbehind:!0},keyword:/\b(?:_|anonymous|as|assembly|assert|break|calldata|case|constant|constructor|continue|contract|default|delete|do|else|emit|enum|event|external|for|from|function|if|import|indexed|inherited|interface|internal|is|let|library|mapping|memory|modifier|new|payable|pragma|private|public|pure|require|returns?|revert|selfdestruct|solidity|storage|struct|suicide|switch|this|throw|using|var|view|while)\b/,operator:/=>|->|:=|=:|\*\*|\+\+|--|\|\||&&|<<=?|>>=?|[-+*/%^&|<>!=]=?|[~?]/}),t.languages.insertBefore("solidity","keyword",{builtin:/\b(?:address|bool|byte|u?int(?:8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?|string|bytes(?:[1-9]|[12]\d|3[0-2])?)\b/}),t.languages.insertBefore("solidity","number",{version:{pattern:/([<>]=?|\^)\d+\.\d+\.\d+\b/,lookbehind:!0,alias:"number"}}),t.languages.sol=t.languages.solidity}return I0}var O0,SM;function zSe(){if(SM)return O0;SM=1,O0=e,e.displayName="solutionFile",e.aliases=[];function e(t){(function(n){var r={pattern:/\{[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}\}/i,alias:"constant",inside:{punctuation:/[{}]/}};n.languages["solution-file"]={comment:{pattern:/#.*/,greedy:!0},string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,greedy:!0,inside:{guid:r}},object:{pattern:/^([ \t]*)(?:([A-Z]\w*)\b(?=.*(?:\r\n?|\n)(?:\1[ \t].*(?:\r\n?|\n))*\1End\2(?=[ \t]*$))|End[A-Z]\w*(?=[ \t]*$))/m,lookbehind:!0,greedy:!0,alias:"keyword"},property:{pattern:/^([ \t]*)(?!\s)[^\r\n"#=()]*[^\s"#=()](?=\s*=)/m,lookbehind:!0,inside:{guid:r}},guid:r,number:/\b\d+(?:\.\d+)*\b/,boolean:/\b(?:FALSE|TRUE)\b/,operator:/=/,punctuation:/[(),]/},n.languages.sln=n.languages["solution-file"]})(t)}return O0}var D0,wM;function USe(){if(wM)return D0;wM=1;var e=mr();D0=t,t.displayName="soy",t.aliases=[];function t(n){n.register(e),function(r){var a=/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,o=/\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-F]+\b/;r.languages.soy={comment:[/\/\*[\s\S]*?\*\//,{pattern:/(\s)\/\/.*/,lookbehind:!0,greedy:!0}],"command-arg":{pattern:/(\{+\/?\s*(?:alias|call|delcall|delpackage|deltemplate|namespace|template)\s+)\.?[\w.]+/,lookbehind:!0,alias:"string",inside:{punctuation:/\./}},parameter:{pattern:/(\{+\/?\s*@?param\??\s+)\.?[\w.]+/,lookbehind:!0,alias:"variable"},keyword:[{pattern:/(\{+\/?[^\S\r\n]*)(?:\\[nrt]|alias|call|case|css|default|delcall|delpackage|deltemplate|else(?:if)?|fallbackmsg|for(?:each)?|if(?:empty)?|lb|let|literal|msg|namespace|nil|@?param\??|rb|sp|switch|template|xid)/,lookbehind:!0},/\b(?:any|as|attributes|bool|css|float|html|in|int|js|list|map|null|number|string|uri)\b/],delimiter:{pattern:/^\{+\/?|\/?\}+$/,alias:"punctuation"},property:/\w+(?==)/,variable:{pattern:/\$[^\W\d]\w*(?:\??(?:\.\w+|\[[^\]]+\]))*/,inside:{string:{pattern:a,greedy:!0},number:o,punctuation:/[\[\].?]/}},string:{pattern:a,greedy:!0},function:[/\w+(?=\()/,{pattern:/(\|[^\S\r\n]*)\w+/,lookbehind:!0}],boolean:/\b(?:false|true)\b/,number:o,operator:/\?:?|<=?|>=?|==?|!=|[+*/%-]|\b(?:and|not|or)\b/,punctuation:/[{}()\[\]|.,:]/},r.hooks.add("before-tokenize",function(i){var s=/\{\{.+?\}\}|\{.+?\}|\s\/\/.*|\/\*[\s\S]*?\*\//g,l="{literal}",c="{/literal}",u=!1;r.languages["markup-templating"].buildPlaceholders(i,"soy",s,function(d){return d===c&&(u=!1),u?!1:(d===l&&(u=!0),!0)})}),r.hooks.add("after-tokenize",function(i){r.languages["markup-templating"].tokenizePlaceholders(i,"soy")})}(n)}return D0}var L0,EM;function lz(){if(EM)return L0;EM=1,L0=e,e.displayName="turtle",e.aliases=[];function e(t){t.languages.turtle={comment:{pattern:/#.*/,greedy:!0},"multiline-string":{pattern:/"""(?:(?:""?)?(?:[^"\\]|\\.))*"""|'''(?:(?:''?)?(?:[^'\\]|\\.))*'''/,greedy:!0,alias:"string",inside:{comment:/#.*/}},string:{pattern:/"(?:[^\\"\r\n]|\\.)*"|'(?:[^\\'\r\n]|\\.)*'/,greedy:!0},url:{pattern:/<(?:[^\x00-\x20<>"{}|^`\\]|\\(?:u[\da-fA-F]{4}|U[\da-fA-F]{8}))*>/,greedy:!0,inside:{punctuation:/[<>]/}},function:{pattern:/(?:(?![-.\d\xB7])[-.\w\xB7\xC0-\uFFFD]+)?:(?:(?![-.])(?:[-.:\w\xC0-\uFFFD]|%[\da-f]{2}|\\.)+)?/i,inside:{"local-name":{pattern:/([^:]*:)[\s\S]+/,lookbehind:!0},prefix:{pattern:/[\s\S]+/,inside:{punctuation:/:/}}}},number:/[+-]?\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,punctuation:/[{}.,;()[\]]|\^\^/,boolean:/\b(?:false|true)\b/,keyword:[/(?:\ba|@prefix|@base)\b|=/,/\b(?:base|graph|prefix)\b/i],tag:{pattern:/@[a-z]+(?:-[a-z\d]+)*/i,inside:{punctuation:/@/}}},t.languages.trig=t.languages.turtle}return L0}var M0,xM;function BSe(){if(xM)return M0;xM=1;var e=lz();M0=t,t.displayName="sparql",t.aliases=["rq"];function t(n){n.register(e),n.languages.sparql=n.languages.extend("turtle",{boolean:/\b(?:false|true)\b/i,variable:{pattern:/[?$]\w+/,greedy:!0}}),n.languages.insertBefore("sparql","punctuation",{keyword:[/\b(?:A|ADD|ALL|AS|ASC|ASK|BNODE|BY|CLEAR|CONSTRUCT|COPY|CREATE|DATA|DEFAULT|DELETE|DESC|DESCRIBE|DISTINCT|DROP|EXISTS|FILTER|FROM|GROUP|HAVING|INSERT|INTO|LIMIT|LOAD|MINUS|MOVE|NAMED|NOT|NOW|OFFSET|OPTIONAL|ORDER|RAND|REDUCED|SELECT|SEPARATOR|SERVICE|SILENT|STRUUID|UNION|USING|UUID|VALUES|WHERE)\b/i,/\b(?:ABS|AVG|BIND|BOUND|CEIL|COALESCE|CONCAT|CONTAINS|COUNT|DATATYPE|DAY|ENCODE_FOR_URI|FLOOR|GROUP_CONCAT|HOURS|IF|IRI|isBLANK|isIRI|isLITERAL|isNUMERIC|isURI|LANG|LANGMATCHES|LCASE|MAX|MD5|MIN|MINUTES|MONTH|REGEX|REPLACE|ROUND|sameTerm|SAMPLE|SECONDS|SHA1|SHA256|SHA384|SHA512|STR|STRAFTER|STRBEFORE|STRDT|STRENDS|STRLANG|STRLEN|STRSTARTS|SUBSTR|SUM|TIMEZONE|TZ|UCASE|URI|YEAR)\b(?=\s*\()/i,/\b(?:BASE|GRAPH|PREFIX)\b/i]}),n.languages.rq=n.languages.sparql}return M0}var P0,kM;function HSe(){if(kM)return P0;kM=1,P0=e,e.displayName="splunkSpl",e.aliases=[];function e(t){t.languages["splunk-spl"]={comment:/`comment\("(?:\\.|[^\\"])*"\)`/,string:{pattern:/"(?:\\.|[^\\"])*"/,greedy:!0},keyword:/\b(?:abstract|accum|addcoltotals|addinfo|addtotals|analyzefields|anomalies|anomalousvalue|anomalydetection|append|appendcols|appendcsv|appendlookup|appendpipe|arules|associate|audit|autoregress|bin|bucket|bucketdir|chart|cluster|cofilter|collect|concurrency|contingency|convert|correlate|datamodel|dbinspect|dedup|delete|delta|diff|erex|eval|eventcount|eventstats|extract|fieldformat|fields|fieldsummary|filldown|fillnull|findtypes|folderize|foreach|format|from|gauge|gentimes|geom|geomfilter|geostats|head|highlight|history|iconify|input|inputcsv|inputlookup|iplocation|join|kmeans|kv|kvform|loadjob|localize|localop|lookup|makecontinuous|makemv|makeresults|map|mcollect|metadata|metasearch|meventcollect|mstats|multikv|multisearch|mvcombine|mvexpand|nomv|outlier|outputcsv|outputlookup|outputtext|overlap|pivot|predict|rangemap|rare|regex|relevancy|reltime|rename|replace|rest|return|reverse|rex|rtorder|run|savedsearch|script|scrub|search|searchtxn|selfjoin|sendemail|set|setfields|sichart|sirare|sistats|sitimechart|sitop|sort|spath|stats|strcat|streamstats|table|tags|tail|timechart|timewrap|top|transaction|transpose|trendline|tscollect|tstats|typeahead|typelearner|typer|union|uniq|untable|where|x11|xmlkv|xmlunescape|xpath|xyseries)\b/i,"operator-word":{pattern:/\b(?:and|as|by|not|or|xor)\b/i,alias:"operator"},function:/\b\w+(?=\s*\()/,property:/\b\w+(?=\s*=(?!=))/,date:{pattern:/\b\d{1,2}\/\d{1,2}\/\d{1,4}(?:(?::\d{1,2}){3})?\b/,alias:"number"},number:/\b\d+(?:\.\d+)?\b/,boolean:/\b(?:f|false|t|true)\b/i,operator:/[<>=]=?|[-+*/%|]/,punctuation:/[()[\],]/}}return P0}var $0,CM;function VSe(){if(CM)return $0;CM=1,$0=e,e.displayName="sqf",e.aliases=[];function e(t){t.languages.sqf=t.languages.extend("clike",{string:{pattern:/"(?:(?:"")?[^"])*"(?!")|'(?:[^'])*'/,greedy:!0},keyword:/\b(?:breakOut|breakTo|call|case|catch|default|do|echo|else|execFSM|execVM|exitWith|for|forEach|forEachMember|forEachMemberAgent|forEachMemberTeam|from|goto|if|nil|preprocessFile|preprocessFileLineNumbers|private|scopeName|spawn|step|switch|then|throw|to|try|while|with)\b/i,boolean:/\b(?:false|true)\b/i,function:/\b(?:abs|accTime|acos|action|actionIDs|actionKeys|actionKeysImages|actionKeysNames|actionKeysNamesArray|actionName|actionParams|activateAddons|activatedAddons|activateKey|add3DENConnection|add3DENEventHandler|add3DENLayer|addAction|addBackpack|addBackpackCargo|addBackpackCargoGlobal|addBackpackGlobal|addCamShake|addCuratorAddons|addCuratorCameraArea|addCuratorEditableObjects|addCuratorEditingArea|addCuratorPoints|addEditorObject|addEventHandler|addForce|addForceGeneratorRTD|addGoggles|addGroupIcon|addHandgunItem|addHeadgear|addItem|addItemCargo|addItemCargoGlobal|addItemPool|addItemToBackpack|addItemToUniform|addItemToVest|addLiveStats|addMagazine|addMagazineAmmoCargo|addMagazineCargo|addMagazineCargoGlobal|addMagazineGlobal|addMagazinePool|addMagazines|addMagazineTurret|addMenu|addMenuItem|addMissionEventHandler|addMPEventHandler|addMusicEventHandler|addOwnedMine|addPlayerScores|addPrimaryWeaponItem|addPublicVariableEventHandler|addRating|addResources|addScore|addScoreSide|addSecondaryWeaponItem|addSwitchableUnit|addTeamMember|addToRemainsCollector|addTorque|addUniform|addVehicle|addVest|addWaypoint|addWeapon|addWeaponCargo|addWeaponCargoGlobal|addWeaponGlobal|addWeaponItem|addWeaponPool|addWeaponTurret|admin|agent|agents|AGLToASL|aimedAtTarget|aimPos|airDensityCurveRTD|airDensityRTD|airplaneThrottle|airportSide|AISFinishHeal|alive|all3DENEntities|allAirports|allControls|allCurators|allCutLayers|allDead|allDeadMen|allDisplays|allGroups|allMapMarkers|allMines|allMissionObjects|allow3DMode|allowCrewInImmobile|allowCuratorLogicIgnoreAreas|allowDamage|allowDammage|allowFileOperations|allowFleeing|allowGetIn|allowSprint|allPlayers|allSimpleObjects|allSites|allTurrets|allUnits|allUnitsUAV|allVariables|ammo|ammoOnPylon|animate|animateBay|animateDoor|animatePylon|animateSource|animationNames|animationPhase|animationSourcePhase|animationState|append|apply|armoryPoints|arrayIntersect|asin|ASLToAGL|ASLToATL|assert|assignAsCargo|assignAsCargoIndex|assignAsCommander|assignAsDriver|assignAsGunner|assignAsTurret|assignCurator|assignedCargo|assignedCommander|assignedDriver|assignedGunner|assignedItems|assignedTarget|assignedTeam|assignedVehicle|assignedVehicleRole|assignItem|assignTeam|assignToAirport|atan|atan2|atg|ATLToASL|attachedObject|attachedObjects|attachedTo|attachObject|attachTo|attackEnabled|backpack|backpackCargo|backpackContainer|backpackItems|backpackMagazines|backpackSpaceFor|behaviour|benchmark|binocular|blufor|boundingBox|boundingBoxReal|boundingCenter|briefingName|buildingExit|buildingPos|buldozer_EnableRoadDiag|buldozer_IsEnabledRoadDiag|buldozer_LoadNewRoads|buldozer_reloadOperMap|buttonAction|buttonSetAction|cadetMode|callExtension|camCommand|camCommit|camCommitPrepared|camCommitted|camConstuctionSetParams|camCreate|camDestroy|cameraEffect|cameraEffectEnableHUD|cameraInterest|cameraOn|cameraView|campaignConfigFile|camPreload|camPreloaded|camPrepareBank|camPrepareDir|camPrepareDive|camPrepareFocus|camPrepareFov|camPrepareFovRange|camPreparePos|camPrepareRelPos|camPrepareTarget|camSetBank|camSetDir|camSetDive|camSetFocus|camSetFov|camSetFovRange|camSetPos|camSetRelPos|camSetTarget|camTarget|camUseNVG|canAdd|canAddItemToBackpack|canAddItemToUniform|canAddItemToVest|cancelSimpleTaskDestination|canFire|canMove|canSlingLoad|canStand|canSuspend|canTriggerDynamicSimulation|canUnloadInCombat|canVehicleCargo|captive|captiveNum|cbChecked|cbSetChecked|ceil|channelEnabled|cheatsEnabled|checkAIFeature|checkVisibility|civilian|className|clear3DENAttribute|clear3DENInventory|clearAllItemsFromBackpack|clearBackpackCargo|clearBackpackCargoGlobal|clearForcesRTD|clearGroupIcons|clearItemCargo|clearItemCargoGlobal|clearItemPool|clearMagazineCargo|clearMagazineCargoGlobal|clearMagazinePool|clearOverlay|clearRadio|clearVehicleInit|clearWeaponCargo|clearWeaponCargoGlobal|clearWeaponPool|clientOwner|closeDialog|closeDisplay|closeOverlay|collapseObjectTree|collect3DENHistory|collectiveRTD|combatMode|commandArtilleryFire|commandChat|commander|commandFire|commandFollow|commandFSM|commandGetOut|commandingMenu|commandMove|commandRadio|commandStop|commandSuppressiveFire|commandTarget|commandWatch|comment|commitOverlay|compile|compileFinal|completedFSM|composeText|configClasses|configFile|configHierarchy|configName|configNull|configProperties|configSourceAddonList|configSourceMod|configSourceModList|confirmSensorTarget|connectTerminalToUAV|controlNull|controlsGroupCtrl|copyFromClipboard|copyToClipboard|copyWaypoints|cos|count|countEnemy|countFriendly|countSide|countType|countUnknown|create3DENComposition|create3DENEntity|createAgent|createCenter|createDialog|createDiaryLink|createDiaryRecord|createDiarySubject|createDisplay|createGearDialog|createGroup|createGuardedPoint|createLocation|createMarker|createMarkerLocal|createMenu|createMine|createMissionDisplay|createMPCampaignDisplay|createSimpleObject|createSimpleTask|createSite|createSoundSource|createTask|createTeam|createTrigger|createUnit|createVehicle|createVehicleCrew|createVehicleLocal|crew|ctAddHeader|ctAddRow|ctClear|ctCurSel|ctData|ctFindHeaderRows|ctFindRowHeader|ctHeaderControls|ctHeaderCount|ctRemoveHeaders|ctRemoveRows|ctrlActivate|ctrlAddEventHandler|ctrlAngle|ctrlAutoScrollDelay|ctrlAutoScrollRewind|ctrlAutoScrollSpeed|ctrlChecked|ctrlClassName|ctrlCommit|ctrlCommitted|ctrlCreate|ctrlDelete|ctrlEnable|ctrlEnabled|ctrlFade|ctrlHTMLLoaded|ctrlIDC|ctrlIDD|ctrlMapAnimAdd|ctrlMapAnimClear|ctrlMapAnimCommit|ctrlMapAnimDone|ctrlMapCursor|ctrlMapMouseOver|ctrlMapScale|ctrlMapScreenToWorld|ctrlMapWorldToScreen|ctrlModel|ctrlModelDirAndUp|ctrlModelScale|ctrlParent|ctrlParentControlsGroup|ctrlPosition|ctrlRemoveAllEventHandlers|ctrlRemoveEventHandler|ctrlScale|ctrlSetActiveColor|ctrlSetAngle|ctrlSetAutoScrollDelay|ctrlSetAutoScrollRewind|ctrlSetAutoScrollSpeed|ctrlSetBackgroundColor|ctrlSetChecked|ctrlSetDisabledColor|ctrlSetEventHandler|ctrlSetFade|ctrlSetFocus|ctrlSetFont|ctrlSetFontH1|ctrlSetFontH1B|ctrlSetFontH2|ctrlSetFontH2B|ctrlSetFontH3|ctrlSetFontH3B|ctrlSetFontH4|ctrlSetFontH4B|ctrlSetFontH5|ctrlSetFontH5B|ctrlSetFontH6|ctrlSetFontH6B|ctrlSetFontHeight|ctrlSetFontHeightH1|ctrlSetFontHeightH2|ctrlSetFontHeightH3|ctrlSetFontHeightH4|ctrlSetFontHeightH5|ctrlSetFontHeightH6|ctrlSetFontHeightSecondary|ctrlSetFontP|ctrlSetFontPB|ctrlSetFontSecondary|ctrlSetForegroundColor|ctrlSetModel|ctrlSetModelDirAndUp|ctrlSetModelScale|ctrlSetPixelPrecision|ctrlSetPosition|ctrlSetScale|ctrlSetStructuredText|ctrlSetText|ctrlSetTextColor|ctrlSetTextColorSecondary|ctrlSetTextSecondary|ctrlSetTooltip|ctrlSetTooltipColorBox|ctrlSetTooltipColorShade|ctrlSetTooltipColorText|ctrlShow|ctrlShown|ctrlText|ctrlTextHeight|ctrlTextSecondary|ctrlTextWidth|ctrlType|ctrlVisible|ctRowControls|ctRowCount|ctSetCurSel|ctSetData|ctSetHeaderTemplate|ctSetRowTemplate|ctSetValue|ctValue|curatorAddons|curatorCamera|curatorCameraArea|curatorCameraAreaCeiling|curatorCoef|curatorEditableObjects|curatorEditingArea|curatorEditingAreaType|curatorMouseOver|curatorPoints|curatorRegisteredObjects|curatorSelected|curatorWaypointCost|current3DENOperation|currentChannel|currentCommand|currentMagazine|currentMagazineDetail|currentMagazineDetailTurret|currentMagazineTurret|currentMuzzle|currentNamespace|currentTask|currentTasks|currentThrowable|currentVisionMode|currentWaypoint|currentWeapon|currentWeaponMode|currentWeaponTurret|currentZeroing|cursorObject|cursorTarget|customChat|customRadio|cutFadeOut|cutObj|cutRsc|cutText|damage|date|dateToNumber|daytime|deActivateKey|debriefingText|debugFSM|debugLog|deg|delete3DENEntities|deleteAt|deleteCenter|deleteCollection|deleteEditorObject|deleteGroup|deleteGroupWhenEmpty|deleteIdentity|deleteLocation|deleteMarker|deleteMarkerLocal|deleteRange|deleteResources|deleteSite|deleteStatus|deleteTeam|deleteVehicle|deleteVehicleCrew|deleteWaypoint|detach|detectedMines|diag_activeMissionFSMs|diag_activeScripts|diag_activeSQFScripts|diag_activeSQSScripts|diag_captureFrame|diag_captureFrameToFile|diag_captureSlowFrame|diag_codePerformance|diag_drawMode|diag_dynamicSimulationEnd|diag_enable|diag_enabled|diag_fps|diag_fpsMin|diag_frameNo|diag_lightNewLoad|diag_list|diag_log|diag_logSlowFrame|diag_mergeConfigFile|diag_recordTurretLimits|diag_setLightNew|diag_tickTime|diag_toggle|dialog|diarySubjectExists|didJIP|didJIPOwner|difficulty|difficultyEnabled|difficultyEnabledRTD|difficultyOption|direction|directSay|disableAI|disableCollisionWith|disableConversation|disableDebriefingStats|disableMapIndicators|disableNVGEquipment|disableRemoteSensors|disableSerialization|disableTIEquipment|disableUAVConnectability|disableUserInput|displayAddEventHandler|displayCtrl|displayNull|displayParent|displayRemoveAllEventHandlers|displayRemoveEventHandler|displaySetEventHandler|dissolveTeam|distance|distance2D|distanceSqr|distributionRegion|do3DENAction|doArtilleryFire|doFire|doFollow|doFSM|doGetOut|doMove|doorPhase|doStop|doSuppressiveFire|doTarget|doWatch|drawArrow|drawEllipse|drawIcon|drawIcon3D|drawLine|drawLine3D|drawLink|drawLocation|drawPolygon|drawRectangle|drawTriangle|driver|drop|dynamicSimulationDistance|dynamicSimulationDistanceCoef|dynamicSimulationEnabled|dynamicSimulationSystemEnabled|east|edit3DENMissionAttributes|editObject|editorSetEventHandler|effectiveCommander|emptyPositions|enableAI|enableAIFeature|enableAimPrecision|enableAttack|enableAudioFeature|enableAutoStartUpRTD|enableAutoTrimRTD|enableCamShake|enableCaustics|enableChannel|enableCollisionWith|enableCopilot|enableDebriefingStats|enableDiagLegend|enableDynamicSimulation|enableDynamicSimulationSystem|enableEndDialog|enableEngineArtillery|enableEnvironment|enableFatigue|enableGunLights|enableInfoPanelComponent|enableIRLasers|enableMimics|enablePersonTurret|enableRadio|enableReload|enableRopeAttach|enableSatNormalOnDetail|enableSaving|enableSentences|enableSimulation|enableSimulationGlobal|enableStamina|enableStressDamage|enableTeamSwitch|enableTraffic|enableUAVConnectability|enableUAVWaypoints|enableVehicleCargo|enableVehicleSensor|enableWeaponDisassembly|endl|endLoadingScreen|endMission|engineOn|enginesIsOnRTD|enginesPowerRTD|enginesRpmRTD|enginesTorqueRTD|entities|environmentEnabled|estimatedEndServerTime|estimatedTimeLeft|evalObjectArgument|everyBackpack|everyContainer|exec|execEditorScript|exp|expectedDestination|exportJIPMessages|eyeDirection|eyePos|face|faction|fadeMusic|fadeRadio|fadeSound|fadeSpeech|failMission|fillWeaponsFromPool|find|findCover|findDisplay|findEditorObject|findEmptyPosition|findEmptyPositionReady|findIf|findNearestEnemy|finishMissionInit|finite|fire|fireAtTarget|firstBackpack|flag|flagAnimationPhase|flagOwner|flagSide|flagTexture|fleeing|floor|flyInHeight|flyInHeightASL|fog|fogForecast|fogParams|forceAddUniform|forceAtPositionRTD|forcedMap|forceEnd|forceFlagTexture|forceFollowRoad|forceGeneratorRTD|forceMap|forceRespawn|forceSpeed|forceWalk|forceWeaponFire|forceWeatherChange|forgetTarget|format|formation|formationDirection|formationLeader|formationMembers|formationPosition|formationTask|formatText|formLeader|freeLook|fromEditor|fuel|fullCrew|gearIDCAmmoCount|gearSlotAmmoCount|gearSlotData|get3DENActionState|get3DENAttribute|get3DENCamera|get3DENConnections|get3DENEntity|get3DENEntityID|get3DENGrid|get3DENIconsVisible|get3DENLayerEntities|get3DENLinesVisible|get3DENMissionAttribute|get3DENMouseOver|get3DENSelected|getAimingCoef|getAllEnvSoundControllers|getAllHitPointsDamage|getAllOwnedMines|getAllSoundControllers|getAmmoCargo|getAnimAimPrecision|getAnimSpeedCoef|getArray|getArtilleryAmmo|getArtilleryComputerSettings|getArtilleryETA|getAssignedCuratorLogic|getAssignedCuratorUnit|getBackpackCargo|getBleedingRemaining|getBurningValue|getCameraViewDirection|getCargoIndex|getCenterOfMass|getClientState|getClientStateNumber|getCompatiblePylonMagazines|getConnectedUAV|getContainerMaxLoad|getCursorObjectParams|getCustomAimCoef|getDammage|getDescription|getDir|getDirVisual|getDLCAssetsUsage|getDLCAssetsUsageByName|getDLCs|getDLCUsageTime|getEditorCamera|getEditorMode|getEditorObjectScope|getElevationOffset|getEngineTargetRpmRTD|getEnvSoundController|getFatigue|getFieldManualStartPage|getForcedFlagTexture|getFriend|getFSMVariable|getFuelCargo|getGroupIcon|getGroupIconParams|getGroupIcons|getHideFrom|getHit|getHitIndex|getHitPointDamage|getItemCargo|getMagazineCargo|getMarkerColor|getMarkerPos|getMarkerSize|getMarkerType|getMass|getMissionConfig|getMissionConfigValue|getMissionDLCs|getMissionLayerEntities|getMissionLayers|getModelInfo|getMousePosition|getMusicPlayedTime|getNumber|getObjectArgument|getObjectChildren|getObjectDLC|getObjectMaterials|getObjectProxy|getObjectTextures|getObjectType|getObjectViewDistance|getOxygenRemaining|getPersonUsedDLCs|getPilotCameraDirection|getPilotCameraPosition|getPilotCameraRotation|getPilotCameraTarget|getPlateNumber|getPlayerChannel|getPlayerScores|getPlayerUID|getPlayerUIDOld|getPos|getPosASL|getPosASLVisual|getPosASLW|getPosATL|getPosATLVisual|getPosVisual|getPosWorld|getPylonMagazines|getRelDir|getRelPos|getRemoteSensorsDisabled|getRepairCargo|getResolution|getRotorBrakeRTD|getShadowDistance|getShotParents|getSlingLoad|getSoundController|getSoundControllerResult|getSpeed|getStamina|getStatValue|getSuppression|getTerrainGrid|getTerrainHeightASL|getText|getTotalDLCUsageTime|getTrimOffsetRTD|getUnitLoadout|getUnitTrait|getUserMFDText|getUserMFDValue|getVariable|getVehicleCargo|getWeaponCargo|getWeaponSway|getWingsOrientationRTD|getWingsPositionRTD|getWPPos|glanceAt|globalChat|globalRadio|goggles|group|groupChat|groupFromNetId|groupIconSelectable|groupIconsVisible|groupId|groupOwner|groupRadio|groupSelectedUnits|groupSelectUnit|grpNull|gunner|gusts|halt|handgunItems|handgunMagazine|handgunWeapon|handsHit|hasInterface|hasPilotCamera|hasWeapon|hcAllGroups|hcGroupParams|hcLeader|hcRemoveAllGroups|hcRemoveGroup|hcSelected|hcSelectGroup|hcSetGroup|hcShowBar|hcShownBar|headgear|hideBody|hideObject|hideObjectGlobal|hideSelection|hint|hintC|hintCadet|hintSilent|hmd|hostMission|htmlLoad|HUDMovementLevels|humidity|image|importAllGroups|importance|in|inArea|inAreaArray|incapacitatedState|independent|inflame|inflamed|infoPanel|infoPanelComponentEnabled|infoPanelComponents|infoPanels|inGameUISetEventHandler|inheritsFrom|initAmbientLife|inPolygon|inputAction|inRangeOfArtillery|insertEditorObject|intersect|is3DEN|is3DENMultiplayer|isAbleToBreathe|isAgent|isAimPrecisionEnabled|isArray|isAutoHoverOn|isAutonomous|isAutoStartUpEnabledRTD|isAutotest|isAutoTrimOnRTD|isBleeding|isBurning|isClass|isCollisionLightOn|isCopilotEnabled|isDamageAllowed|isDedicated|isDLCAvailable|isEngineOn|isEqualTo|isEqualType|isEqualTypeAll|isEqualTypeAny|isEqualTypeArray|isEqualTypeParams|isFilePatchingEnabled|isFlashlightOn|isFlatEmpty|isForcedWalk|isFormationLeader|isGroupDeletedWhenEmpty|isHidden|isInRemainsCollector|isInstructorFigureEnabled|isIRLaserOn|isKeyActive|isKindOf|isLaserOn|isLightOn|isLocalized|isManualFire|isMarkedForCollection|isMultiplayer|isMultiplayerSolo|isNil|isNull|isNumber|isObjectHidden|isObjectRTD|isOnRoad|isPipEnabled|isPlayer|isRealTime|isRemoteExecuted|isRemoteExecutedJIP|isServer|isShowing3DIcons|isSimpleObject|isSprintAllowed|isStaminaEnabled|isSteamMission|isStreamFriendlyUIEnabled|isStressDamageEnabled|isText|isTouchingGround|isTurnedOut|isTutHintsEnabled|isUAVConnectable|isUAVConnected|isUIContext|isUniformAllowed|isVehicleCargo|isVehicleRadarOn|isVehicleSensorEnabled|isWalking|isWeaponDeployed|isWeaponRested|itemCargo|items|itemsWithMagazines|join|joinAs|joinAsSilent|joinSilent|joinString|kbAddDatabase|kbAddDatabaseTargets|kbAddTopic|kbHasTopic|kbReact|kbRemoveTopic|kbTell|kbWasSaid|keyImage|keyName|knowsAbout|land|landAt|landResult|language|laserTarget|lbAdd|lbClear|lbColor|lbColorRight|lbCurSel|lbData|lbDelete|lbIsSelected|lbPicture|lbPictureRight|lbSelection|lbSetColor|lbSetColorRight|lbSetCurSel|lbSetData|lbSetPicture|lbSetPictureColor|lbSetPictureColorDisabled|lbSetPictureColorSelected|lbSetPictureRight|lbSetPictureRightColor|lbSetPictureRightColorDisabled|lbSetPictureRightColorSelected|lbSetSelectColor|lbSetSelectColorRight|lbSetSelected|lbSetText|lbSetTextRight|lbSetTooltip|lbSetValue|lbSize|lbSort|lbSortByValue|lbText|lbTextRight|lbValue|leader|leaderboardDeInit|leaderboardGetRows|leaderboardInit|leaderboardRequestRowsFriends|leaderboardRequestRowsGlobal|leaderboardRequestRowsGlobalAroundUser|leaderboardsRequestUploadScore|leaderboardsRequestUploadScoreKeepBest|leaderboardState|leaveVehicle|libraryCredits|libraryDisclaimers|lifeState|lightAttachObject|lightDetachObject|lightIsOn|lightnings|limitSpeed|linearConversion|lineBreak|lineIntersects|lineIntersectsObjs|lineIntersectsSurfaces|lineIntersectsWith|linkItem|list|listObjects|listRemoteTargets|listVehicleSensors|ln|lnbAddArray|lnbAddColumn|lnbAddRow|lnbClear|lnbColor|lnbColorRight|lnbCurSelRow|lnbData|lnbDeleteColumn|lnbDeleteRow|lnbGetColumnsPosition|lnbPicture|lnbPictureRight|lnbSetColor|lnbSetColorRight|lnbSetColumnsPos|lnbSetCurSelRow|lnbSetData|lnbSetPicture|lnbSetPictureColor|lnbSetPictureColorRight|lnbSetPictureColorSelected|lnbSetPictureColorSelectedRight|lnbSetPictureRight|lnbSetText|lnbSetTextRight|lnbSetValue|lnbSize|lnbSort|lnbSortByValue|lnbText|lnbTextRight|lnbValue|load|loadAbs|loadBackpack|loadFile|loadGame|loadIdentity|loadMagazine|loadOverlay|loadStatus|loadUniform|loadVest|local|localize|locationNull|locationPosition|lock|lockCameraTo|lockCargo|lockDriver|locked|lockedCargo|lockedDriver|lockedTurret|lockIdentity|lockTurret|lockWP|log|logEntities|logNetwork|logNetworkTerminate|lookAt|lookAtPos|magazineCargo|magazines|magazinesAllTurrets|magazinesAmmo|magazinesAmmoCargo|magazinesAmmoFull|magazinesDetail|magazinesDetailBackpack|magazinesDetailUniform|magazinesDetailVest|magazinesTurret|magazineTurretAmmo|mapAnimAdd|mapAnimClear|mapAnimCommit|mapAnimDone|mapCenterOnCamera|mapGridPosition|markAsFinishedOnSteam|markerAlpha|markerBrush|markerColor|markerDir|markerPos|markerShape|markerSize|markerText|markerType|max|members|menuAction|menuAdd|menuChecked|menuClear|menuCollapse|menuData|menuDelete|menuEnable|menuEnabled|menuExpand|menuHover|menuPicture|menuSetAction|menuSetCheck|menuSetData|menuSetPicture|menuSetValue|menuShortcut|menuShortcutText|menuSize|menuSort|menuText|menuURL|menuValue|min|mineActive|mineDetectedBy|missionConfigFile|missionDifficulty|missionName|missionNamespace|missionStart|missionVersion|modelToWorld|modelToWorldVisual|modelToWorldVisualWorld|modelToWorldWorld|modParams|moonIntensity|moonPhase|morale|move|move3DENCamera|moveInAny|moveInCargo|moveInCommander|moveInDriver|moveInGunner|moveInTurret|moveObjectToEnd|moveOut|moveTime|moveTo|moveToCompleted|moveToFailed|musicVolume|name|nameSound|nearEntities|nearestBuilding|nearestLocation|nearestLocations|nearestLocationWithDubbing|nearestObject|nearestObjects|nearestTerrainObjects|nearObjects|nearObjectsReady|nearRoads|nearSupplies|nearTargets|needReload|netId|netObjNull|newOverlay|nextMenuItemIndex|nextWeatherChange|nMenuItems|numberOfEnginesRTD|numberToDate|objectCurators|objectFromNetId|objectParent|objNull|objStatus|onBriefingGear|onBriefingGroup|onBriefingNotes|onBriefingPlan|onBriefingTeamSwitch|onCommandModeChanged|onDoubleClick|onEachFrame|onGroupIconClick|onGroupIconOverEnter|onGroupIconOverLeave|onHCGroupSelectionChanged|onMapSingleClick|onPlayerConnected|onPlayerDisconnected|onPreloadFinished|onPreloadStarted|onShowNewObject|onTeamSwitch|openCuratorInterface|openDLCPage|openDSInterface|openMap|openSteamApp|openYoutubeVideo|opfor|orderGetIn|overcast|overcastForecast|owner|param|params|parseNumber|parseSimpleArray|parseText|parsingNamespace|particlesQuality|pi|pickWeaponPool|pitch|pixelGrid|pixelGridBase|pixelGridNoUIScale|pixelH|pixelW|playableSlotsNumber|playableUnits|playAction|playActionNow|player|playerRespawnTime|playerSide|playersNumber|playGesture|playMission|playMove|playMoveNow|playMusic|playScriptedMission|playSound|playSound3D|position|positionCameraToWorld|posScreenToWorld|posWorldToScreen|ppEffectAdjust|ppEffectCommit|ppEffectCommitted|ppEffectCreate|ppEffectDestroy|ppEffectEnable|ppEffectEnabled|ppEffectForceInNVG|precision|preloadCamera|preloadObject|preloadSound|preloadTitleObj|preloadTitleRsc|primaryWeapon|primaryWeaponItems|primaryWeaponMagazine|priority|processDiaryLink|processInitCommands|productVersion|profileName|profileNamespace|profileNameSteam|progressLoadingScreen|progressPosition|progressSetPosition|publicVariable|publicVariableClient|publicVariableServer|pushBack|pushBackUnique|putWeaponPool|queryItemsPool|queryMagazinePool|queryWeaponPool|rad|radioChannelAdd|radioChannelCreate|radioChannelRemove|radioChannelSetCallSign|radioChannelSetLabel|radioVolume|rain|rainbow|random|rank|rankId|rating|rectangular|registeredTasks|registerTask|reload|reloadEnabled|remoteControl|remoteExec|remoteExecCall|remoteExecutedOwner|remove3DENConnection|remove3DENEventHandler|remove3DENLayer|removeAction|removeAll3DENEventHandlers|removeAllActions|removeAllAssignedItems|removeAllContainers|removeAllCuratorAddons|removeAllCuratorCameraAreas|removeAllCuratorEditingAreas|removeAllEventHandlers|removeAllHandgunItems|removeAllItems|removeAllItemsWithMagazines|removeAllMissionEventHandlers|removeAllMPEventHandlers|removeAllMusicEventHandlers|removeAllOwnedMines|removeAllPrimaryWeaponItems|removeAllWeapons|removeBackpack|removeBackpackGlobal|removeCuratorAddons|removeCuratorCameraArea|removeCuratorEditableObjects|removeCuratorEditingArea|removeDrawIcon|removeDrawLinks|removeEventHandler|removeFromRemainsCollector|removeGoggles|removeGroupIcon|removeHandgunItem|removeHeadgear|removeItem|removeItemFromBackpack|removeItemFromUniform|removeItemFromVest|removeItems|removeMagazine|removeMagazineGlobal|removeMagazines|removeMagazinesTurret|removeMagazineTurret|removeMenuItem|removeMissionEventHandler|removeMPEventHandler|removeMusicEventHandler|removeOwnedMine|removePrimaryWeaponItem|removeSecondaryWeaponItem|removeSimpleTask|removeSwitchableUnit|removeTeamMember|removeUniform|removeVest|removeWeapon|removeWeaponAttachmentCargo|removeWeaponCargo|removeWeaponGlobal|removeWeaponTurret|reportRemoteTarget|requiredVersion|resetCamShake|resetSubgroupDirection|resistance|resize|resources|respawnVehicle|restartEditorCamera|reveal|revealMine|reverse|reversedMouseY|roadAt|roadsConnectedTo|roleDescription|ropeAttachedObjects|ropeAttachedTo|ropeAttachEnabled|ropeAttachTo|ropeCreate|ropeCut|ropeDestroy|ropeDetach|ropeEndPosition|ropeLength|ropes|ropeUnwind|ropeUnwound|rotorsForcesRTD|rotorsRpmRTD|round|runInitScript|safeZoneH|safeZoneW|safeZoneWAbs|safeZoneX|safeZoneXAbs|safeZoneY|save3DENInventory|saveGame|saveIdentity|saveJoysticks|saveOverlay|saveProfileNamespace|saveStatus|saveVar|savingEnabled|say|say2D|say3D|score|scoreSide|screenshot|screenToWorld|scriptDone|scriptName|scriptNull|scudState|secondaryWeapon|secondaryWeaponItems|secondaryWeaponMagazine|select|selectBestPlaces|selectDiarySubject|selectedEditorObjects|selectEditorObject|selectionNames|selectionPosition|selectLeader|selectMax|selectMin|selectNoPlayer|selectPlayer|selectRandom|selectRandomWeighted|selectWeapon|selectWeaponTurret|sendAUMessage|sendSimpleCommand|sendTask|sendTaskResult|sendUDPMessage|serverCommand|serverCommandAvailable|serverCommandExecutable|serverName|serverTime|set|set3DENAttribute|set3DENAttributes|set3DENGrid|set3DENIconsVisible|set3DENLayer|set3DENLinesVisible|set3DENLogicType|set3DENMissionAttribute|set3DENMissionAttributes|set3DENModelsVisible|set3DENObjectType|set3DENSelected|setAccTime|setActualCollectiveRTD|setAirplaneThrottle|setAirportSide|setAmmo|setAmmoCargo|setAmmoOnPylon|setAnimSpeedCoef|setAperture|setApertureNew|setArmoryPoints|setAttributes|setAutonomous|setBehaviour|setBleedingRemaining|setBrakesRTD|setCameraInterest|setCamShakeDefParams|setCamShakeParams|setCamUseTI|setCaptive|setCenterOfMass|setCollisionLight|setCombatMode|setCompassOscillation|setConvoySeparation|setCuratorCameraAreaCeiling|setCuratorCoef|setCuratorEditingAreaType|setCuratorWaypointCost|setCurrentChannel|setCurrentTask|setCurrentWaypoint|setCustomAimCoef|setCustomWeightRTD|setDamage|setDammage|setDate|setDebriefingText|setDefaultCamera|setDestination|setDetailMapBlendPars|setDir|setDirection|setDrawIcon|setDriveOnPath|setDropInterval|setDynamicSimulationDistance|setDynamicSimulationDistanceCoef|setEditorMode|setEditorObjectScope|setEffectCondition|setEngineRpmRTD|setFace|setFaceAnimation|setFatigue|setFeatureType|setFlagAnimationPhase|setFlagOwner|setFlagSide|setFlagTexture|setFog|setForceGeneratorRTD|setFormation|setFormationTask|setFormDir|setFriend|setFromEditor|setFSMVariable|setFuel|setFuelCargo|setGroupIcon|setGroupIconParams|setGroupIconsSelectable|setGroupIconsVisible|setGroupId|setGroupIdGlobal|setGroupOwner|setGusts|setHideBehind|setHit|setHitIndex|setHitPointDamage|setHorizonParallaxCoef|setHUDMovementLevels|setIdentity|setImportance|setInfoPanel|setLeader|setLightAmbient|setLightAttenuation|setLightBrightness|setLightColor|setLightDayLight|setLightFlareMaxDistance|setLightFlareSize|setLightIntensity|setLightnings|setLightUseFlare|setLocalWindParams|setMagazineTurretAmmo|setMarkerAlpha|setMarkerAlphaLocal|setMarkerBrush|setMarkerBrushLocal|setMarkerColor|setMarkerColorLocal|setMarkerDir|setMarkerDirLocal|setMarkerPos|setMarkerPosLocal|setMarkerShape|setMarkerShapeLocal|setMarkerSize|setMarkerSizeLocal|setMarkerText|setMarkerTextLocal|setMarkerType|setMarkerTypeLocal|setMass|setMimic|setMousePosition|setMusicEffect|setMusicEventHandler|setName|setNameSound|setObjectArguments|setObjectMaterial|setObjectMaterialGlobal|setObjectProxy|setObjectTexture|setObjectTextureGlobal|setObjectViewDistance|setOvercast|setOwner|setOxygenRemaining|setParticleCircle|setParticleClass|setParticleFire|setParticleParams|setParticleRandom|setPilotCameraDirection|setPilotCameraRotation|setPilotCameraTarget|setPilotLight|setPiPEffect|setPitch|setPlateNumber|setPlayable|setPlayerRespawnTime|setPos|setPosASL|setPosASL2|setPosASLW|setPosATL|setPosition|setPosWorld|setPylonLoadOut|setPylonsPriority|setRadioMsg|setRain|setRainbow|setRandomLip|setRank|setRectangular|setRepairCargo|setRotorBrakeRTD|setShadowDistance|setShotParents|setSide|setSimpleTaskAlwaysVisible|setSimpleTaskCustomData|setSimpleTaskDescription|setSimpleTaskDestination|setSimpleTaskTarget|setSimpleTaskType|setSimulWeatherLayers|setSize|setSkill|setSlingLoad|setSoundEffect|setSpeaker|setSpeech|setSpeedMode|setStamina|setStaminaScheme|setStatValue|setSuppression|setSystemOfUnits|setTargetAge|setTaskMarkerOffset|setTaskResult|setTaskState|setTerrainGrid|setText|setTimeMultiplier|setTitleEffect|setToneMapping|setToneMappingParams|setTrafficDensity|setTrafficDistance|setTrafficGap|setTrafficSpeed|setTriggerActivation|setTriggerArea|setTriggerStatements|setTriggerText|setTriggerTimeout|setTriggerType|setType|setUnconscious|setUnitAbility|setUnitLoadout|setUnitPos|setUnitPosWeak|setUnitRank|setUnitRecoilCoefficient|setUnitTrait|setUnloadInCombat|setUserActionText|setUserMFDText|setUserMFDValue|setVariable|setVectorDir|setVectorDirAndUp|setVectorUp|setVehicleAmmo|setVehicleAmmoDef|setVehicleArmor|setVehicleCargo|setVehicleId|setVehicleInit|setVehicleLock|setVehiclePosition|setVehicleRadar|setVehicleReceiveRemoteTargets|setVehicleReportOwnPosition|setVehicleReportRemoteTargets|setVehicleTIPars|setVehicleVarName|setVelocity|setVelocityModelSpace|setVelocityTransformation|setViewDistance|setVisibleIfTreeCollapsed|setWantedRpmRTD|setWaves|setWaypointBehaviour|setWaypointCombatMode|setWaypointCompletionRadius|setWaypointDescription|setWaypointForceBehaviour|setWaypointFormation|setWaypointHousePosition|setWaypointLoiterRadius|setWaypointLoiterType|setWaypointName|setWaypointPosition|setWaypointScript|setWaypointSpeed|setWaypointStatements|setWaypointTimeout|setWaypointType|setWaypointVisible|setWeaponReloadingTime|setWind|setWindDir|setWindForce|setWindStr|setWingForceScaleRTD|setWPPos|show3DIcons|showChat|showCinemaBorder|showCommandingMenu|showCompass|showCuratorCompass|showGPS|showHUD|showLegend|showMap|shownArtilleryComputer|shownChat|shownCompass|shownCuratorCompass|showNewEditorObject|shownGPS|shownHUD|shownMap|shownPad|shownRadio|shownScoretable|shownUAVFeed|shownWarrant|shownWatch|showPad|showRadio|showScoretable|showSubtitles|showUAVFeed|showWarrant|showWatch|showWaypoint|showWaypoints|side|sideAmbientLife|sideChat|sideEmpty|sideEnemy|sideFriendly|sideLogic|sideRadio|sideUnknown|simpleTasks|simulationEnabled|simulCloudDensity|simulCloudOcclusion|simulInClouds|simulWeatherSync|sin|size|sizeOf|skill|skillFinal|skipTime|sleep|sliderPosition|sliderRange|sliderSetPosition|sliderSetRange|sliderSetSpeed|sliderSpeed|slingLoadAssistantShown|soldierMagazines|someAmmo|sort|soundVolume|speaker|speed|speedMode|splitString|sqrt|squadParams|stance|startLoadingScreen|stop|stopEngineRTD|stopped|str|sunOrMoon|supportInfo|suppressFor|surfaceIsWater|surfaceNormal|surfaceType|swimInDepth|switchableUnits|switchAction|switchCamera|switchGesture|switchLight|switchMove|synchronizedObjects|synchronizedTriggers|synchronizedWaypoints|synchronizeObjectsAdd|synchronizeObjectsRemove|synchronizeTrigger|synchronizeWaypoint|systemChat|systemOfUnits|tan|targetKnowledge|targets|targetsAggregate|targetsQuery|taskAlwaysVisible|taskChildren|taskCompleted|taskCustomData|taskDescription|taskDestination|taskHint|taskMarkerOffset|taskNull|taskParent|taskResult|taskState|taskType|teamMember|teamMemberNull|teamName|teams|teamSwitch|teamSwitchEnabled|teamType|terminate|terrainIntersect|terrainIntersectASL|terrainIntersectAtASL|text|textLog|textLogFormat|tg|time|timeMultiplier|titleCut|titleFadeOut|titleObj|titleRsc|titleText|toArray|toFixed|toLower|toString|toUpper|triggerActivated|triggerActivation|triggerArea|triggerAttachedVehicle|triggerAttachObject|triggerAttachVehicle|triggerDynamicSimulation|triggerStatements|triggerText|triggerTimeout|triggerTimeoutCurrent|triggerType|turretLocal|turretOwner|turretUnit|tvAdd|tvClear|tvCollapse|tvCollapseAll|tvCount|tvCurSel|tvData|tvDelete|tvExpand|tvExpandAll|tvPicture|tvPictureRight|tvSetColor|tvSetCurSel|tvSetData|tvSetPicture|tvSetPictureColor|tvSetPictureColorDisabled|tvSetPictureColorSelected|tvSetPictureRight|tvSetPictureRightColor|tvSetPictureRightColorDisabled|tvSetPictureRightColorSelected|tvSetSelectColor|tvSetText|tvSetTooltip|tvSetValue|tvSort|tvSortByValue|tvText|tvTooltip|tvValue|type|typeName|typeOf|UAVControl|uiNamespace|uiSleep|unassignCurator|unassignItem|unassignTeam|unassignVehicle|underwater|uniform|uniformContainer|uniformItems|uniformMagazines|unitAddons|unitAimPosition|unitAimPositionVisual|unitBackpack|unitIsUAV|unitPos|unitReady|unitRecoilCoefficient|units|unitsBelowHeight|unlinkItem|unlockAchievement|unregisterTask|updateDrawIcon|updateMenuItem|updateObjectTree|useAIOperMapObstructionTest|useAISteeringComponent|useAudioTimeForMoves|userInputDisabled|vectorAdd|vectorCos|vectorCrossProduct|vectorDiff|vectorDir|vectorDirVisual|vectorDistance|vectorDistanceSqr|vectorDotProduct|vectorFromTo|vectorMagnitude|vectorMagnitudeSqr|vectorModelToWorld|vectorModelToWorldVisual|vectorMultiply|vectorNormalized|vectorUp|vectorUpVisual|vectorWorldToModel|vectorWorldToModelVisual|vehicle|vehicleCargoEnabled|vehicleChat|vehicleRadio|vehicleReceiveRemoteTargets|vehicleReportOwnPosition|vehicleReportRemoteTargets|vehicles|vehicleVarName|velocity|velocityModelSpace|verifySignature|vest|vestContainer|vestItems|vestMagazines|viewDistance|visibleCompass|visibleGPS|visibleMap|visiblePosition|visiblePositionASL|visibleScoretable|visibleWatch|waitUntil|waves|waypointAttachedObject|waypointAttachedVehicle|waypointAttachObject|waypointAttachVehicle|waypointBehaviour|waypointCombatMode|waypointCompletionRadius|waypointDescription|waypointForceBehaviour|waypointFormation|waypointHousePosition|waypointLoiterRadius|waypointLoiterType|waypointName|waypointPosition|waypoints|waypointScript|waypointsEnabledUAV|waypointShow|waypointSpeed|waypointStatements|waypointTimeout|waypointTimeoutCurrent|waypointType|waypointVisible|weaponAccessories|weaponAccessoriesCargo|weaponCargo|weaponDirection|weaponInertia|weaponLowered|weapons|weaponsItems|weaponsItemsCargo|weaponState|weaponsTurret|weightRTD|west|WFSideText|wind|windDir|windRTD|windStr|wingsForcesRTD|worldName|worldSize|worldToModel|worldToModelVisual|worldToScreen)\b/i,number:/(?:\$|\b0x)[\da-f]+\b|(?:\B\.\d+|\b\d+(?:\.\d+)?)(?:e[+-]?\d+)?\b/i,operator:/##|>>|&&|\|\||[!=<>]=?|[-+*/%#^]|\b(?:and|mod|not|or)\b/i,"magic-variable":{pattern:/\b(?:this|thisList|thisTrigger|_exception|_fnc_scriptName|_fnc_scriptNameParent|_forEachIndex|_this|_thisEventHandler|_thisFSM|_thisScript|_x)\b/i,alias:"keyword"},constant:/\bDIK(?:_[a-z\d]+)+\b/i}),t.languages.insertBefore("sqf","string",{macro:{pattern:/(^[ \t]*)#[a-z](?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{directive:{pattern:/#[a-z]+\b/i,alias:"keyword"},comment:t.languages.sqf.comment}}}),delete t.languages.sqf["class-name"]}return $0}var F0,_M;function qSe(){if(_M)return F0;_M=1,F0=e,e.displayName="squirrel",e.aliases=[];function e(t){t.languages.squirrel=t.languages.extend("clike",{comment:[t.languages.clike.comment[0],{pattern:/(^|[^\\:])(?:\/\/|#).*/,lookbehind:!0,greedy:!0}],string:{pattern:/(^|[^\\"'@])(?:@"(?:[^"]|"")*"(?!")|"(?:[^\\\r\n"]|\\.)*")/,lookbehind:!0,greedy:!0},"class-name":{pattern:/(\b(?:class|enum|extends|instanceof)\s+)\w+(?:\.\w+)*/,lookbehind:!0,inside:{punctuation:/\./}},keyword:/\b(?:__FILE__|__LINE__|base|break|case|catch|class|clone|const|constructor|continue|default|delete|else|enum|extends|for|foreach|function|if|in|instanceof|local|null|resume|return|static|switch|this|throw|try|typeof|while|yield)\b/,number:/\b(?:0x[0-9a-fA-F]+|\d+(?:\.(?:\d+|[eE][+-]?\d+))?)\b/,operator:/\+\+|--|<=>|<[-<]|>>>?|&&?|\|\|?|[-+*/%!=<>]=?|[~^]|::?/,punctuation:/[(){}\[\],;.]/}),t.languages.insertBefore("squirrel","string",{char:{pattern:/(^|[^\\"'])'(?:[^\\']|\\(?:[xuU][0-9a-fA-F]{0,8}|[\s\S]))'/,lookbehind:!0,greedy:!0}}),t.languages.insertBefore("squirrel","operator",{"attribute-punctuation":{pattern:/<\/|\/>/,alias:"important"},lambda:{pattern:/@(?=\()/,alias:"operator"}})}return F0}var j0,AM;function GSe(){if(AM)return j0;AM=1,j0=e,e.displayName="stan",e.aliases=[];function e(t){(function(n){var r=/\b(?:algebra_solver|algebra_solver_newton|integrate_1d|integrate_ode|integrate_ode_bdf|integrate_ode_rk45|map_rect|ode_(?:adams|bdf|ckrk|rk45)(?:_tol)?|ode_adjoint_tol_ctl|reduce_sum|reduce_sum_static)\b/;n.languages.stan={comment:/\/\/.*|\/\*[\s\S]*?\*\/|#(?!include).*/,string:{pattern:/"[\x20\x21\x23-\x5B\x5D-\x7E]*"/,greedy:!0},directive:{pattern:/^([ \t]*)#include\b.*/m,lookbehind:!0,alias:"property"},"function-arg":{pattern:RegExp("("+r.source+/\s*\(\s*/.source+")"+/[a-zA-Z]\w*/.source),lookbehind:!0,alias:"function"},constraint:{pattern:/(\b(?:int|matrix|real|row_vector|vector)\s*)<[^<>]*>/,lookbehind:!0,inside:{expression:{pattern:/(=\s*)\S(?:\S|\s+(?!\s))*?(?=\s*(?:>$|,\s*\w+\s*=))/,lookbehind:!0,inside:null},property:/\b[a-z]\w*(?=\s*=)/i,operator:/=/,punctuation:/^<|>$|,/}},keyword:[{pattern:/\bdata(?=\s*\{)|\b(?:functions|generated|model|parameters|quantities|transformed)\b/,alias:"program-block"},/\b(?:array|break|cholesky_factor_corr|cholesky_factor_cov|complex|continue|corr_matrix|cov_matrix|data|else|for|if|in|increment_log_prob|int|matrix|ordered|positive_ordered|print|real|reject|return|row_vector|simplex|target|unit_vector|vector|void|while)\b/,r],function:/\b[a-z]\w*(?=\s*\()/i,number:/(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:E[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,boolean:/\b(?:false|true)\b/,operator:/<-|\.[*/]=?|\|\|?|&&|[!=<>+\-*/]=?|['^%~?:]/,punctuation:/[()\[\]{},;]/},n.languages.stan.constraint.inside.expression.inside=n.languages.stan})(t)}return j0}var z0,TM;function WSe(){if(TM)return z0;TM=1,z0=e,e.displayName="stylus",e.aliases=[];function e(t){(function(n){var r={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},o={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:a,punctuation:/[{}()\[\];:,]/};o.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:o}},o.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:o}},n.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:o}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:o}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:o}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:o.interpolation}},rest:o}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:o.interpolation,comment:o.comment,punctuation:/[{},]/}},func:o.func,string:o.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:o.interpolation,punctuation:/[{}()\[\];:.]/}})(t)}return z0}var U0,RM;function KSe(){if(RM)return U0;RM=1,U0=e,e.displayName="swift",e.aliases=[];function e(t){t.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp(/(^|[^"#])/.source+"(?:"+/"(?:\\(?:\((?:[^()]|\([^()]*\))*\)|\r\n|[^(])|[^\\\r\n"])*"/.source+"|"+/"""(?:\\(?:\((?:[^()]|\([^()]*\))*\)|[^(])|[^\\"]|"(?!""))*"""/.source+")"+/(?!["#])/.source),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp(/(^|[^"#])(#+)/.source+"(?:"+/"(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|\r\n|[^#])|[^\\\r\n])*?"/.source+"|"+/"""(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|[^#])|[^\\])*?"""/.source+")\\2"),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp(/#/.source+"(?:"+(/(?:elseif|if)\b/.source+"(?:[ ]*"+/(?:![ \t]*)?(?:\b\w+\b(?:[ \t]*\((?:[^()]|\([^()]*\))*\))?|\((?:[^()]|\([^()]*\))*\))(?:[ \t]*(?:&&|\|\|))?/.source+")+")+"|"+/(?:else|endif)\b/.source+")"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},t.languages.swift["string-literal"].forEach(function(n){n.inside.interpolation.inside=t.languages.swift})}return U0}var B0,NM;function YSe(){if(NM)return B0;NM=1,B0=e,e.displayName="systemd",e.aliases=[];function e(t){(function(n){var r={pattern:/^[;#].*/m,greedy:!0},a=/"(?:[^\r\n"\\]|\\(?:[^\r]|\r\n?))*"(?!\S)/.source;n.languages.systemd={comment:r,section:{pattern:/^\[[^\n\r\[\]]*\](?=[ \t]*$)/m,greedy:!0,inside:{punctuation:/^\[|\]$/,"section-name":{pattern:/[\s\S]+/,alias:"selector"}}},key:{pattern:/^[^\s=]+(?=[ \t]*=)/m,greedy:!0,alias:"attr-name"},value:{pattern:RegExp(/(=[ \t]*(?!\s))/.source+"(?:"+a+`|(?=[^"\r +]))(?:`+(/[^\s\\]/.source+'|[ ]+(?:(?![ "])|'+a+")|"+/\\[\r\n]+(?:[#;].*[\r\n]+)*(?![#;])/.source)+")*"),lookbehind:!0,greedy:!0,alias:"attr-value",inside:{comment:r,quoted:{pattern:RegExp(/(^|\s)/.source+a),lookbehind:!0,greedy:!0},punctuation:/\\$/m,boolean:{pattern:/^(?:false|no|off|on|true|yes)$/,greedy:!0}}},punctuation:/=/}})(t)}return B0}var H0,IM;function MA(){if(IM)return H0;IM=1,H0=e,e.displayName="t4Templating",e.aliases=[];function e(t){(function(n){function r(o,i,s){return{pattern:RegExp("<#"+o+"[\\s\\S]*?#>"),alias:"block",inside:{delimiter:{pattern:RegExp("^<#"+o+"|#>$"),alias:"important"},content:{pattern:/[\s\S]+/,inside:i,alias:s}}}}function a(o){var i=n.languages[o],s="language-"+o;return{block:{pattern:/<#[\s\S]+?#>/,inside:{directive:r("@",{"attr-value":{pattern:/=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/,inside:{punctuation:/^=|^["']|["']$/}},keyword:/\b\w+(?=\s)/,"attr-name":/\b\w+/}),expression:r("=",i,s),"class-feature":r("\\+",i,s),standard:r("",i,s)}}}}n.languages["t4-templating"]=Object.defineProperty({},"createT4",{value:a})})(t)}return H0}var V0,OM;function ZSe(){if(OM)return V0;OM=1;var e=MA(),t=Ah();V0=n,n.displayName="t4Cs",n.aliases=[];function n(r){r.register(e),r.register(t),r.languages.t4=r.languages["t4-cs"]=r.languages["t4-templating"].createT4("csharp")}return V0}var q0,DM;function cz(){if(DM)return q0;DM=1;var e=oz();q0=t,t.displayName="vbnet",t.aliases=[];function t(n){n.register(e),n.languages.vbnet=n.languages.extend("basic",{comment:[{pattern:/(?:!|REM\b).+/i,inside:{keyword:/^REM/i}},{pattern:/(^|[^\\:])'.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(^|[^"])"(?:""|[^"])*"(?!")/,lookbehind:!0,greedy:!0},keyword:/(?:\b(?:ADDHANDLER|ADDRESSOF|ALIAS|AND|ANDALSO|AS|BEEP|BLOAD|BOOLEAN|BSAVE|BYREF|BYTE|BYVAL|CALL(?: ABSOLUTE)?|CASE|CATCH|CBOOL|CBYTE|CCHAR|CDATE|CDBL|CDEC|CHAIN|CHAR|CHDIR|CINT|CLASS|CLEAR|CLNG|CLOSE|CLS|COBJ|COM|COMMON|CONST|CONTINUE|CSBYTE|CSHORT|CSNG|CSTR|CTYPE|CUINT|CULNG|CUSHORT|DATA|DATE|DECIMAL|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DEFAULT|DELEGATE|DIM|DIRECTCAST|DO|DOUBLE|ELSE|ELSEIF|END|ENUM|ENVIRON|ERASE|ERROR|EVENT|EXIT|FALSE|FIELD|FILES|FINALLY|FOR(?: EACH)?|FRIEND|FUNCTION|GET|GETTYPE|GETXMLNAMESPACE|GLOBAL|GOSUB|GOTO|HANDLES|IF|IMPLEMENTS|IMPORTS|IN|INHERITS|INPUT|INTEGER|INTERFACE|IOCTL|IS|ISNOT|KEY|KILL|LET|LIB|LIKE|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|ME|MKDIR|MOD|MODULE|MUSTINHERIT|MUSTOVERRIDE|MYBASE|MYCLASS|NAME|NAMESPACE|NARROWING|NEW|NEXT|NOT|NOTHING|NOTINHERITABLE|NOTOVERRIDABLE|OBJECT|OF|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPERATOR|OPTION(?: BASE)?|OPTIONAL|OR|ORELSE|OUT|OVERLOADS|OVERRIDABLE|OVERRIDES|PARAMARRAY|PARTIAL|POKE|PRIVATE|PROPERTY|PROTECTED|PUBLIC|PUT|RAISEEVENT|READ|READONLY|REDIM|REM|REMOVEHANDLER|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SBYTE|SELECT(?: CASE)?|SET|SHADOWS|SHARED|SHELL|SHORT|SINGLE|SLEEP|STATIC|STEP|STOP|STRING|STRUCTURE|SUB|SWAP|SYNCLOCK|SYSTEM|THEN|THROW|TIMER|TO|TROFF|TRON|TRUE|TRY|TRYCAST|TYPE|TYPEOF|UINTEGER|ULONG|UNLOCK|UNTIL|USHORT|USING|VIEW PRINT|WAIT|WEND|WHEN|WHILE|WIDENING|WITH|WITHEVENTS|WRITE|WRITEONLY|XOR)|\B(?:#CONST|#ELSE|#ELSEIF|#END|#IF))(?:\$|\b)/i,punctuation:/[,;:(){}]/})}return q0}var G0,LM;function XSe(){if(LM)return G0;LM=1;var e=MA(),t=cz();G0=n,n.displayName="t4Vb",n.aliases=[];function n(r){r.register(e),r.register(t),r.languages["t4-vb"]=r.languages["t4-templating"].createT4("vbnet")}return G0}var W0,MM;function uz(){if(MM)return W0;MM=1,W0=e,e.displayName="yaml",e.aliases=["yml"];function e(t){(function(n){var r=/[*&][^\s[\]{},]+/,a=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,o="(?:"+a.source+"(?:[ ]+"+r.source+")?|"+r.source+"(?:[ ]+"+a.source+")?)",i=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source}),s=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function l(c,u){u=(u||"").replace(/m/g,"")+"m";var d=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,function(){return o}).replace(/<>/g,function(){return c});return RegExp(d,u)}n.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,function(){return o})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,function(){return o}).replace(/<>/g,function(){return"(?:"+i+"|"+s+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:l(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:l(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:l(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:l(s),lookbehind:!0,greedy:!0},number:{pattern:l(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:a,important:r,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},n.languages.yml=n.languages.yaml})(t)}return W0}var K0,PM;function QSe(){if(PM)return K0;PM=1;var e=uz();K0=t,t.displayName="tap",t.aliases=[];function t(n){n.register(e),n.languages.tap={fail:/not ok[^#{\n\r]*/,pass:/ok[^#{\n\r]*/,pragma:/pragma [+-][a-z]+/,bailout:/bail out!.*/i,version:/TAP version \d+/i,plan:/\b\d+\.\.\d+(?: +#.*)?/,subtest:{pattern:/# Subtest(?:: .*)?/,greedy:!0},punctuation:/[{}]/,directive:/#.*/,yamlish:{pattern:/(^[ \t]*)---[\s\S]*?[\r\n][ \t]*\.\.\.$/m,lookbehind:!0,inside:n.languages.yaml,alias:"language-yaml"}}}return K0}var Y0,$M;function JSe(){if($M)return Y0;$M=1,Y0=e,e.displayName="tcl",e.aliases=[];function e(t){t.languages.tcl={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},string:{pattern:/"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*"/,greedy:!0},variable:[{pattern:/(\$)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/,lookbehind:!0},{pattern:/(\$)\{[^}]+\}/,lookbehind:!0},{pattern:/(^[\t ]*set[ \t]+)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/m,lookbehind:!0}],function:{pattern:/(^[\t ]*proc[ \t]+)\S+/m,lookbehind:!0},builtin:[{pattern:/(^[\t ]*)(?:break|class|continue|error|eval|exit|for|foreach|if|proc|return|switch|while)\b/m,lookbehind:!0},/\b(?:else|elseif)\b/],scope:{pattern:/(^[\t ]*)(?:global|upvar|variable)\b/m,lookbehind:!0,alias:"constant"},keyword:{pattern:/(^[\t ]*|\[)(?:Safe_Base|Tcl|after|append|apply|array|auto_(?:execok|import|load|mkindex|qualify|reset)|automkindex_old|bgerror|binary|catch|cd|chan|clock|close|concat|dde|dict|encoding|eof|exec|expr|fblocked|fconfigure|fcopy|file(?:event|name)?|flush|gets|glob|history|http|incr|info|interp|join|lappend|lassign|lindex|linsert|list|llength|load|lrange|lrepeat|lreplace|lreverse|lsearch|lset|lsort|math(?:func|op)|memory|msgcat|namespace|open|package|parray|pid|pkg_mkIndex|platform|puts|pwd|re_syntax|read|refchan|regexp|registry|regsub|rename|scan|seek|set|socket|source|split|string|subst|tcl(?:_endOfWord|_findLibrary|startOf(?:Next|Previous)Word|test|vars|wordBreak(?:After|Before))|tell|time|tm|trace|unknown|unload|unset|update|uplevel|vwait)\b/m,lookbehind:!0},operator:/!=?|\*\*?|==|&&?|\|\|?|<[=<]?|>[=>]?|[-+~\/%?^]|\b(?:eq|in|ne|ni)\b/,punctuation:/[{}()\[\]]/}}return Y0}var Z0,FM;function ewe(){if(FM)return Z0;FM=1,Z0=e,e.displayName="textile",e.aliases=[];function e(t){(function(n){var r=/\([^|()\n]+\)|\[[^\]\n]+\]|\{[^}\n]+\}/.source,a=/\)|\((?![^|()\n]+\))/.source;function o(g,m){return RegExp(g.replace(//g,function(){return"(?:"+r+")"}).replace(//g,function(){return"(?:"+a+")"}),m||"")}var i={css:{pattern:/\{[^{}]+\}/,inside:{rest:n.languages.css}},"class-id":{pattern:/(\()[^()]+(?=\))/,lookbehind:!0,alias:"attr-value"},lang:{pattern:/(\[)[^\[\]]+(?=\])/,lookbehind:!0,alias:"attr-value"},punctuation:/[\\\/]\d+|\S/},s=n.languages.textile=n.languages.extend("markup",{phrase:{pattern:/(^|\r|\n)\S[\s\S]*?(?=$|\r?\n\r?\n|\r\r)/,lookbehind:!0,inside:{"block-tag":{pattern:o(/^[a-z]\w*(?:||[<>=])*\./.source),inside:{modifier:{pattern:o(/(^[a-z]\w*)(?:||[<>=])+(?=\.)/.source),lookbehind:!0,inside:i},tag:/^[a-z]\w*/,punctuation:/\.$/}},list:{pattern:o(/^[*#]+*\s+\S.*/.source,"m"),inside:{modifier:{pattern:o(/(^[*#]+)+/.source),lookbehind:!0,inside:i},punctuation:/^[*#]+/}},table:{pattern:o(/^(?:(?:||[<>=^~])+\.\s*)?(?:\|(?:(?:||[<>=^~_]|[\\/]\d+)+\.|(?!(?:||[<>=^~_]|[\\/]\d+)+\.))[^|]*)+\|/.source,"m"),inside:{modifier:{pattern:o(/(^|\|(?:\r?\n|\r)?)(?:||[<>=^~_]|[\\/]\d+)+(?=\.)/.source),lookbehind:!0,inside:i},punctuation:/\||^\./}},inline:{pattern:o(/(^|[^a-zA-Z\d])(\*\*|__|\?\?|[*_%@+\-^~])*.+?\2(?![a-zA-Z\d])/.source),lookbehind:!0,inside:{bold:{pattern:o(/(^(\*\*?)*).+?(?=\2)/.source),lookbehind:!0},italic:{pattern:o(/(^(__?)*).+?(?=\2)/.source),lookbehind:!0},cite:{pattern:o(/(^\?\?*).+?(?=\?\?)/.source),lookbehind:!0,alias:"string"},code:{pattern:o(/(^@*).+?(?=@)/.source),lookbehind:!0,alias:"keyword"},inserted:{pattern:o(/(^\+*).+?(?=\+)/.source),lookbehind:!0},deleted:{pattern:o(/(^-*).+?(?=-)/.source),lookbehind:!0},span:{pattern:o(/(^%*).+?(?=%)/.source),lookbehind:!0},modifier:{pattern:o(/(^\*\*|__|\?\?|[*_%@+\-^~])+/.source),lookbehind:!0,inside:i},punctuation:/[*_%?@+\-^~]+/}},"link-ref":{pattern:/^\[[^\]]+\]\S+$/m,inside:{string:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0},url:{pattern:/(^\])\S+$/,lookbehind:!0},punctuation:/[\[\]]/}},link:{pattern:o(/"*[^"]+":.+?(?=[^\w/]?(?:\s|$))/.source),inside:{text:{pattern:o(/(^"*)[^"]+(?=")/.source),lookbehind:!0},modifier:{pattern:o(/(^")+/.source),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[":]/}},image:{pattern:o(/!(?:||[<>=])*(?![<>=])[^!\s()]+(?:\([^)]+\))?!(?::.+?(?=[^\w/]?(?:\s|$)))?/.source),inside:{source:{pattern:o(/(^!(?:||[<>=])*)(?![<>=])[^!\s()]+(?:\([^)]+\))?(?=!)/.source),lookbehind:!0,alias:"url"},modifier:{pattern:o(/(^!)(?:||[<>=])+/.source),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[!:]/}},footnote:{pattern:/\b\[\d+\]/,alias:"comment",inside:{punctuation:/\[|\]/}},acronym:{pattern:/\b[A-Z\d]+\([^)]+\)/,inside:{comment:{pattern:/(\()[^()]+(?=\))/,lookbehind:!0},punctuation:/[()]/}},mark:{pattern:/\b\((?:C|R|TM)\)/,alias:"comment",inside:{punctuation:/[()]/}}}}}),l=s.phrase.inside,c={inline:l.inline,link:l.link,image:l.image,footnote:l.footnote,acronym:l.acronym,mark:l.mark};s.tag.pattern=/<\/?(?!\d)[a-z0-9]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i;var u=l.inline.inside;u.bold.inside=c,u.italic.inside=c,u.inserted.inside=c,u.deleted.inside=c,u.span.inside=c;var d=l.table.inside;d.inline=c.inline,d.link=c.link,d.image=c.image,d.footnote=c.footnote,d.acronym=c.acronym,d.mark=c.mark})(t)}return Z0}var X0,jM;function twe(){if(jM)return X0;jM=1,X0=e,e.displayName="toml",e.aliases=[];function e(t){(function(n){var r=/(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;function a(o){return o.replace(/__/g,function(){return r})}n.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(a(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(a(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}})(t)}return X0}var Q0,zM;function nwe(){if(zM)return Q0;zM=1,Q0=e,e.displayName="tremor",e.aliases=[];function e(t){(function(n){n.languages.tremor={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},"interpolated-string":null,extractor:{pattern:/\b[a-z_]\w*\|(?:[^\r\n\\|]|\\(?:\r\n|[\s\S]))*\|/i,greedy:!0,inside:{regex:{pattern:/(^re)\|[\s\S]+/,lookbehind:!0},function:/^\w+/,value:/\|[\s\S]+/}},identifier:{pattern:/`[^`]*`/,greedy:!0},function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())\b/,keyword:/\b(?:args|as|by|case|config|connect|connector|const|copy|create|default|define|deploy|drop|each|emit|end|erase|event|flow|fn|for|from|group|having|insert|into|intrinsic|let|links|match|merge|mod|move|of|operator|patch|pipeline|recur|script|select|set|sliding|state|stream|to|tumbling|update|use|when|where|window|with)\b/,boolean:/\b(?:false|null|true)\b/i,number:/\b(?:0b[01_]*|0x[0-9a-fA-F_]*|\d[\d_]*(?:\.\d[\d_]*)?(?:[Ee][+-]?[\d_]+)?)\b/,"pattern-punctuation":{pattern:/%(?=[({[])/,alias:"punctuation"},operator:/[-+*\/%~!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?>?=?|(?:absent|and|not|or|present|xor)\b/,punctuation:/::|[;\[\]()\{\},.:]/};var r=/#\{(?:[^"{}]|\{[^{}]*\}|"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*")*\}/.source;n.languages.tremor["interpolated-string"]={pattern:RegExp(/(^|[^\\])/.source+'(?:"""(?:'+/[^"\\#]|\\[\s\S]|"(?!"")|#(?!\{)/.source+"|"+r+')*"""|"(?:'+/[^"\\\r\n#]|\\(?:\r\n|[\s\S])|#(?!\{)/.source+"|"+r+')*")'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:RegExp(r),inside:{punctuation:/^#\{|\}$/,expression:{pattern:/[\s\S]+/,inside:n.languages.tremor}}},string:/[\s\S]+/}},n.languages.troy=n.languages.tremor,n.languages.trickle=n.languages.tremor})(t)}return Q0}var J0,UM;function rwe(){if(UM)return J0;UM=1;var e=sz(),t=OA();J0=n,n.displayName="tsx",n.aliases=[];function n(r){r.register(e),r.register(t),function(a){var o=a.util.clone(a.languages.typescript);a.languages.tsx=a.languages.extend("jsx",o),delete a.languages.tsx.parameter,delete a.languages.tsx["literal-property"];var i=a.languages.tsx.tag;i.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+i.pattern.source+")",i.pattern.flags),i.lookbehind=!0}(r)}return J0}var eE,BM;function awe(){if(BM)return eE;BM=1;var e=mr();eE=t,t.displayName="tt2",t.aliases=[];function t(n){n.register(e),function(r){r.languages.tt2=r.languages.extend("clike",{comment:/#.*|\[%#[\s\S]*?%\]/,keyword:/\b(?:BLOCK|CALL|CASE|CATCH|CLEAR|DEBUG|DEFAULT|ELSE|ELSIF|END|FILTER|FINAL|FOREACH|GET|IF|IN|INCLUDE|INSERT|LAST|MACRO|META|NEXT|PERL|PROCESS|RAWPERL|RETURN|SET|STOP|SWITCH|TAGS|THROW|TRY|UNLESS|USE|WHILE|WRAPPER)\b/,punctuation:/[[\]{},()]/}),r.languages.insertBefore("tt2","number",{operator:/=[>=]?|!=?|<=?|>=?|&&|\|\|?|\b(?:and|not|or)\b/,variable:{pattern:/\b[a-z]\w*(?:\s*\.\s*(?:\d+|\$?[a-z]\w*))*\b/i}}),r.languages.insertBefore("tt2","keyword",{delimiter:{pattern:/^(?:\[%|%%)-?|-?%\]$/,alias:"punctuation"}}),r.languages.insertBefore("tt2","string",{"single-quoted-string":{pattern:/'[^\\']*(?:\\[\s\S][^\\']*)*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"[^\\"]*(?:\\[\s\S][^\\"]*)*"/,greedy:!0,alias:"string",inside:{variable:{pattern:/\$(?:[a-z]\w*(?:\.(?:\d+|\$?[a-z]\w*))*)/i}}}}),delete r.languages.tt2.string,r.hooks.add("before-tokenize",function(a){var o=/\[%[\s\S]+?%\]/g;r.languages["markup-templating"].buildPlaceholders(a,"tt2",o)}),r.hooks.add("after-tokenize",function(a){r.languages["markup-templating"].tokenizePlaceholders(a,"tt2")})}(n)}return eE}var tE,HM;function owe(){if(HM)return tE;HM=1;var e=mr();tE=t,t.displayName="twig",t.aliases=[];function t(n){n.register(e),n.languages.twig={comment:/^\{#[\s\S]*?#\}$/,"tag-name":{pattern:/(^\{%-?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%]-?|-?[%}]\}$/,alias:"punctuation"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,inside:{punctuation:/^['"]|['"]$/}},keyword:/\b(?:even|if|odd)\b/,boolean:/\b(?:false|null|true)\b/,number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,operator:[{pattern:/(\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,lookbehind:!0},/[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/],punctuation:/[()\[\]{}:.,]/},n.hooks.add("before-tokenize",function(r){if(r.language==="twig"){var a=/\{(?:#[\s\S]*?#|%[\s\S]*?%|\{[\s\S]*?\})\}/g;n.languages["markup-templating"].buildPlaceholders(r,"twig",a)}}),n.hooks.add("after-tokenize",function(r){n.languages["markup-templating"].tokenizePlaceholders(r,"twig")})}return tE}var nE,VM;function iwe(){if(VM)return nE;VM=1,nE=e,e.displayName="typoscript",e.aliases=["tsconfig"];function e(t){(function(n){var r=/\b(?:ACT|ACTIFSUB|CARRAY|CASE|CLEARGIF|COA|COA_INT|CONSTANTS|CONTENT|CUR|EDITPANEL|EFFECT|EXT|FILE|FLUIDTEMPLATE|FORM|FRAME|FRAMESET|GIFBUILDER|GMENU|GMENU_FOLDOUT|GMENU_LAYERS|GP|HMENU|HRULER|HTML|IENV|IFSUB|IMAGE|IMGMENU|IMGMENUITEM|IMGTEXT|IMG_RESOURCE|INCLUDE_TYPOSCRIPT|JSMENU|JSMENUITEM|LLL|LOAD_REGISTER|NO|PAGE|RECORDS|RESTORE_REGISTER|TEMPLATE|TEXT|TMENU|TMENUITEM|TMENU_LAYERS|USER|USER_INT|_GIFBUILDER|global|globalString|globalVar)\b/;n.languages.typoscript={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:= \t]|(?:^|[^= \t])[ \t]+)\/\/.*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^"'])#.*/,lookbehind:!0,greedy:!0}],function:[{pattern://,inside:{string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,inside:{keyword:r}},keyword:{pattern:/INCLUDE_TYPOSCRIPT/}}},{pattern:/@import\s*(?:"[^"\r\n]*"|'[^'\r\n]*')/,inside:{string:/"[^"\r\n]*"|'[^'\r\n]*'/}}],string:{pattern:/^([^=]*=[< ]?)(?:(?!\]\n).)*/,lookbehind:!0,inside:{function:/\{\$.*\}/,keyword:r,number:/^\d+$/,punctuation:/[,|:]/}},keyword:r,number:{pattern:/\b\d+\s*[.{=]/,inside:{operator:/[.{=]/}},tag:{pattern:/\.?[-\w\\]+\.?/,inside:{punctuation:/\./}},punctuation:/[{}[\];(),.:|]/,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/},n.languages.tsconfig=n.languages.typoscript})(t)}return nE}var rE,qM;function swe(){if(qM)return rE;qM=1,rE=e,e.displayName="unrealscript",e.aliases=["uc","uscript"];function e(t){t.languages.unrealscript={comment:/\/\/.*|\/\*[\s\S]*?\*\//,string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},category:{pattern:/(\b(?:(?:autoexpand|hide|show)categories|var)\s*\()[^()]+(?=\))/,lookbehind:!0,greedy:!0,alias:"property"},metadata:{pattern:/(\w\s*)<\s*\w+\s*=[^<>|=\r\n]+(?:\|\s*\w+\s*=[^<>|=\r\n]+)*>/,lookbehind:!0,greedy:!0,inside:{property:/\b\w+(?=\s*=)/,operator:/=/,punctuation:/[<>|]/}},macro:{pattern:/`\w+/,alias:"property"},"class-name":{pattern:/(\b(?:class|enum|extends|interface|state(?:\(\))?|struct|within)\s+)\w+/,lookbehind:!0},keyword:/\b(?:abstract|actor|array|auto|autoexpandcategories|bool|break|byte|case|class|classgroup|client|coerce|collapsecategories|config|const|continue|default|defaultproperties|delegate|dependson|deprecated|do|dontcollapsecategories|editconst|editinlinenew|else|enum|event|exec|export|extends|final|float|for|forcescriptorder|foreach|function|goto|guid|hidecategories|hidedropdown|if|ignores|implements|inherits|input|int|interface|iterator|latent|local|material|name|native|nativereplication|noexport|nontransient|noteditinlinenew|notplaceable|operator|optional|out|pawn|perobjectconfig|perobjectlocalized|placeable|postoperator|preoperator|private|protected|reliable|replication|return|server|showcategories|simulated|singular|state|static|string|struct|structdefault|structdefaultproperties|switch|texture|transient|travel|unreliable|until|var|vector|while|within)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,boolean:/\b(?:false|true)\b/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/>>|<<|--|\+\+|\*\*|[-+*/~!=<>$@]=?|&&?|\|\|?|\^\^?|[?:%]|\b(?:ClockwiseFrom|Cross|Dot)\b/,punctuation:/[()[\]{};,.]/},t.languages.uc=t.languages.uscript=t.languages.unrealscript}return rE}var aE,GM;function lwe(){if(GM)return aE;GM=1,aE=e,e.displayName="uorazor",e.aliases=[];function e(t){t.languages.uorazor={"comment-hash":{pattern:/#.*/,alias:"comment",greedy:!0},"comment-slash":{pattern:/\/\/.*/,alias:"comment",greedy:!0},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,inside:{punctuation:/^['"]|['"]$/},greedy:!0},"source-layers":{pattern:/\b(?:arms|backpack|blue|bracelet|cancel|clear|cloak|criminal|earrings|enemy|facialhair|friend|friendly|gloves|gray|grey|ground|hair|head|innerlegs|innertorso|innocent|lefthand|middletorso|murderer|neck|nonfriendly|onehandedsecondary|outerlegs|outertorso|pants|red|righthand|ring|self|shirt|shoes|talisman|waist)\b/i,alias:"function"},"source-commands":{pattern:/\b(?:alliance|attack|cast|clearall|clearignore|clearjournal|clearlist|clearsysmsg|createlist|createtimer|dclick|dclicktype|dclickvar|dress|dressconfig|drop|droprelloc|emote|getlabel|guild|gumpclose|gumpresponse|hotkey|ignore|lasttarget|lift|lifttype|menu|menuresponse|msg|org|organize|organizer|overhead|pause|poplist|potion|promptresponse|pushlist|removelist|removetimer|rename|restock|say|scav|scavenger|script|setability|setlasttarget|setskill|settimer|setvar|sysmsg|target|targetloc|targetrelloc|targettype|undress|unignore|unsetvar|useobject|useonce|useskill|usetype|virtue|wait|waitforgump|waitformenu|waitforprompt|waitforstat|waitforsysmsg|waitfortarget|walk|wfsysmsg|wft|whisper|yell)\b/,alias:"function"},"tag-name":{pattern:/(^\{%-?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%]-?|-?[%}]\}$/,alias:"punctuation"},function:/\b(?:atlist|close|closest|count|counter|counttype|dead|dex|diffhits|diffmana|diffstam|diffweight|find|findbuff|finddebuff|findlayer|findtype|findtypelist|followers|gumpexists|hidden|hits|hp|hue|human|humanoid|ingump|inlist|insysmessage|insysmsg|int|invul|lhandempty|list|listexists|mana|maxhits|maxhp|maxmana|maxstam|maxweight|monster|mounted|name|next|noto|paralyzed|poisoned|position|prev|previous|queued|rand|random|rhandempty|skill|stam|str|targetexists|timer|timerexists|varexist|warmode|weight)\b/,keyword:/\b(?:and|as|break|continue|else|elseif|endfor|endif|endwhile|for|if|loop|not|or|replay|stop|while)\b/,boolean:/\b(?:false|null|true)\b/,number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,operator:[{pattern:/(\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,lookbehind:!0},/[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/],punctuation:/[()\[\]{}:.,]/}}return aE}var oE,WM;function cwe(){if(WM)return oE;WM=1,oE=e,e.displayName="uri",e.aliases=["url"];function e(t){t.languages.uri={scheme:{pattern:/^[a-z][a-z0-9+.-]*:/im,greedy:!0,inside:{"scheme-delimiter":/:$/}},fragment:{pattern:/#[\w\-.~!$&'()*+,;=%:@/?]*/,inside:{"fragment-delimiter":/^#/}},query:{pattern:/\?[\w\-.~!$&'()*+,;=%:@/?]*/,inside:{"query-delimiter":{pattern:/^\?/,greedy:!0},"pair-delimiter":/[&;]/,pair:{pattern:/^[^=][\s\S]*/,inside:{key:/^[^=]+/,value:{pattern:/(^=)[\s\S]+/,lookbehind:!0}}}}},authority:{pattern:RegExp(/^\/\//.source+/(?:[\w\-.~!$&'()*+,;=%:]*@)?/.source+("(?:"+/\[(?:[0-9a-fA-F:.]{2,48}|v[0-9a-fA-F]+\.[\w\-.~!$&'()*+,;=]+)\]/.source+"|"+/[\w\-.~!$&'()*+,;=%]*/.source+")")+/(?::\d*)?/.source,"m"),inside:{"authority-delimiter":/^\/\//,"user-info-segment":{pattern:/^[\w\-.~!$&'()*+,;=%:]*@/,inside:{"user-info-delimiter":/@$/,"user-info":/^[\w\-.~!$&'()*+,;=%:]+/}},"port-segment":{pattern:/:\d*$/,inside:{"port-delimiter":/^:/,port:/^\d+/}},host:{pattern:/[\s\S]+/,inside:{"ip-literal":{pattern:/^\[[\s\S]+\]$/,inside:{"ip-literal-delimiter":/^\[|\]$/,"ipv-future":/^v[\s\S]+/,"ipv6-address":/^[\s\S]+/}},"ipv4-address":/^(?:(?:[03-9]\d?|[12]\d{0,2})\.){3}(?:[03-9]\d?|[12]\d{0,2})$/}}}},path:{pattern:/^[\w\-.~!$&'()*+,;=%:@/]+/m,inside:{"path-separator":/\//}}},t.languages.url=t.languages.uri}return oE}var iE,KM;function uwe(){if(KM)return iE;KM=1,iE=e,e.displayName="v",e.aliases=[];function e(t){(function(n){var r={pattern:/[\s\S]+/,inside:null};n.languages.v=n.languages.extend("clike",{string:{pattern:/r?(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,alias:"quoted-string",greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:\{[^{}]*\}|\w+(?:\.\w+(?:\([^\(\)]*\))?|\[[^\[\]]+\])*)/,lookbehind:!0,inside:{"interpolation-variable":{pattern:/^\$\w[\s\S]*$/,alias:"variable"},"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},"interpolation-expression":r}}}},"class-name":{pattern:/(\b(?:enum|interface|struct|type)\s+)(?:C\.)?\w+/,lookbehind:!0},keyword:/(?:\b(?:__global|as|asm|assert|atomic|break|chan|const|continue|defer|else|embed|enum|fn|for|go(?:to)?|if|import|in|interface|is|lock|match|module|mut|none|or|pub|return|rlock|select|shared|sizeof|static|struct|type(?:of)?|union|unsafe)|\$(?:else|for|if)|#(?:flag|include))\b/,number:/\b(?:0x[a-f\d]+(?:_[a-f\d]+)*|0b[01]+(?:_[01]+)*|0o[0-7]+(?:_[0-7]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?)\b/i,operator:/~|\?|[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\.?/,builtin:/\b(?:any(?:_float|_int)?|bool|byte(?:ptr)?|charptr|f(?:32|64)|i(?:8|16|64|128|nt)|rune|size_t|string|u(?:16|32|64|128)|voidptr)\b/}),r.inside=n.languages.v,n.languages.insertBefore("v","string",{char:{pattern:/`(?:\\`|\\?[^`]{1,2})`/,alias:"rune"}}),n.languages.insertBefore("v","operator",{attribute:{pattern:/(^[\t ]*)\[(?:deprecated|direct_array_access|flag|inline|live|ref_only|typedef|unsafe_fn|windows_stdcall)\]/m,lookbehind:!0,alias:"annotation",inside:{punctuation:/[\[\]]/,keyword:/\w+/}},generic:{pattern:/<\w+>(?=\s*[\)\{])/,inside:{punctuation:/[<>]/,"class-name":/\w+/}}}),n.languages.insertBefore("v","function",{"generic-function":{pattern:/\b\w+\s*<\w+>(?=\()/,inside:{function:/^\w+/,generic:{pattern:/<\w+>/,inside:n.languages.v.generic.inside}}}})})(t)}return iE}var sE,YM;function dwe(){if(YM)return sE;YM=1,sE=e,e.displayName="vala",e.aliases=[];function e(t){t.languages.vala=t.languages.extend("clike",{"class-name":[{pattern:/\b[A-Z]\w*(?:\.\w+)*\b(?=(?:\?\s+|\*?\s+\*?)\w)/,inside:{punctuation:/\./}},{pattern:/(\[)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/(\b(?:class|interface)\s+[A-Z]\w*(?:\.\w+)*\s*:\s*)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/((?:\b(?:class|enum|interface|new|struct)\s+)|(?:catch\s+\())[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}}],keyword:/\b(?:abstract|as|assert|async|base|bool|break|case|catch|char|class|const|construct|continue|default|delegate|delete|do|double|dynamic|else|ensures|enum|errordomain|extern|finally|float|for|foreach|get|if|in|inline|int|int16|int32|int64|int8|interface|internal|is|lock|long|namespace|new|null|out|override|owned|params|private|protected|public|ref|requires|return|set|short|signal|sizeof|size_t|ssize_t|static|string|struct|switch|this|throw|throws|try|typeof|uchar|uint|uint16|uint32|uint64|uint8|ulong|unichar|unowned|ushort|using|value|var|virtual|void|volatile|weak|while|yield)\b/i,function:/\b\w+(?=\s*\()/,number:/(?:\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)(?:f|u?l?)?/i,operator:/\+\+|--|&&|\|\||<<=?|>>=?|=>|->|~|[+\-*\/%&^|=!<>]=?|\?\??|\.\.\./,punctuation:/[{}[\];(),.:]/,constant:/\b[A-Z0-9_]+\b/}),t.languages.insertBefore("vala","string",{"raw-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},"template-string":{pattern:/@"[\s\S]*?"/,greedy:!0,inside:{interpolation:{pattern:/\$(?:\([^)]*\)|[a-zA-Z]\w*)/,inside:{delimiter:{pattern:/^\$\(?|\)$/,alias:"punctuation"},rest:t.languages.vala}},string:/[\s\S]+/}}}),t.languages.insertBefore("vala","keyword",{regex:{pattern:/\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[imsx]{0,4}(?=\s*(?:$|[\r\n,.;})\]]))/,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:t.languages.regex},"regex-delimiter":/^\//,"regex-flags":/^[a-z]+$/}}})}return sE}var lE,ZM;function fwe(){if(ZM)return lE;ZM=1,lE=e,e.displayName="velocity",e.aliases=[];function e(t){(function(n){n.languages.velocity=n.languages.extend("markup",{});var r={variable:{pattern:/(^|[^\\](?:\\\\)*)\$!?(?:[a-z][\w-]*(?:\([^)]*\))?(?:\.[a-z][\w-]*(?:\([^)]*\))?|\[[^\]]+\])*|\{[^}]+\})/i,lookbehind:!0,inside:{}},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},number:/\b\d+\b/,boolean:/\b(?:false|true)\b/,operator:/[=!<>]=?|[+*/%-]|&&|\|\||\.\.|\b(?:eq|g[et]|l[et]|n(?:e|ot))\b/,punctuation:/[(){}[\]:,.]/};r.variable.inside={string:r.string,function:{pattern:/([^\w-])[a-z][\w-]*(?=\()/,lookbehind:!0},number:r.number,boolean:r.boolean,punctuation:r.punctuation},n.languages.insertBefore("velocity","comment",{unparsed:{pattern:/(^|[^\\])#\[\[[\s\S]*?\]\]#/,lookbehind:!0,greedy:!0,inside:{punctuation:/^#\[\[|\]\]#$/}},"velocity-comment":[{pattern:/(^|[^\\])#\*[\s\S]*?\*#/,lookbehind:!0,greedy:!0,alias:"comment"},{pattern:/(^|[^\\])##.*/,lookbehind:!0,greedy:!0,alias:"comment"}],directive:{pattern:/(^|[^\\](?:\\\\)*)#@?(?:[a-z][\w-]*|\{[a-z][\w-]*\})(?:\s*\((?:[^()]|\([^()]*\))*\))?/i,lookbehind:!0,inside:{keyword:{pattern:/^#@?(?:[a-z][\w-]*|\{[a-z][\w-]*\})|\bin\b/,inside:{punctuation:/[{}]/}},rest:r}},variable:r.variable}),n.languages.velocity.tag.inside["attr-value"].inside.rest=n.languages.velocity})(t)}return lE}var cE,XM;function pwe(){if(XM)return cE;XM=1,cE=e,e.displayName="verilog",e.aliases=[];function e(t){t.languages.verilog={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"kernel-function":{pattern:/\B\$\w+\b/,alias:"property"},constant:/\B`\w+\b/,function:/\b\w+(?=\()/,keyword:/\b(?:alias|and|assert|assign|assume|automatic|before|begin|bind|bins|binsof|bit|break|buf|bufif0|bufif1|byte|case|casex|casez|cell|chandle|class|clocking|cmos|config|const|constraint|context|continue|cover|covergroup|coverpoint|cross|deassign|default|defparam|design|disable|dist|do|edge|else|end|endcase|endclass|endclocking|endconfig|endfunction|endgenerate|endgroup|endinterface|endmodule|endpackage|endprimitive|endprogram|endproperty|endsequence|endspecify|endtable|endtask|enum|event|expect|export|extends|extern|final|first_match|for|force|foreach|forever|fork|forkjoin|function|generate|genvar|highz0|highz1|if|iff|ifnone|ignore_bins|illegal_bins|import|incdir|include|initial|inout|input|inside|instance|int|integer|interface|intersect|join|join_any|join_none|large|liblist|library|local|localparam|logic|longint|macromodule|matches|medium|modport|module|nand|negedge|new|nmos|nor|noshowcancelled|not|notif0|notif1|null|or|output|package|packed|parameter|pmos|posedge|primitive|priority|program|property|protected|pull0|pull1|pulldown|pullup|pulsestyle_ondetect|pulsestyle_onevent|pure|rand|randc|randcase|randsequence|rcmos|real|realtime|ref|reg|release|repeat|return|rnmos|rpmos|rtran|rtranif0|rtranif1|scalared|sequence|shortint|shortreal|showcancelled|signed|small|solve|specify|specparam|static|string|strong0|strong1|struct|super|supply0|supply1|table|tagged|task|this|throughout|time|timeprecision|timeunit|tran|tranif0|tranif1|tri|tri0|tri1|triand|trior|trireg|type|typedef|union|unique|unsigned|use|uwire|var|vectored|virtual|void|wait|wait_order|wand|weak0|weak1|while|wildcard|wire|with|within|wor|xnor|xor)\b/,important:/\b(?:always|always_comb|always_ff|always_latch)\b(?: *@)?/,number:/\B##?\d+|(?:\b\d+)?'[odbh] ?[\da-fzx_?]+|\b(?:\d*[._])?\d+(?:e[-+]?\d+)?/i,operator:/[-+{}^~%*\/?=!<>&|]+/,punctuation:/[[\];(),.:]/}}return cE}var uE,QM;function gwe(){if(QM)return uE;QM=1,uE=e,e.displayName="vhdl",e.aliases=[];function e(t){t.languages.vhdl={comment:/--.+/,"vhdl-vectors":{pattern:/\b[oxb]"[\da-f_]+"|"[01uxzwlh-]+"/i,alias:"number"},"quoted-function":{pattern:/"\S+?"(?=\()/,alias:"function"},string:/"(?:[^\\"\r\n]|\\(?:\r\n|[\s\S]))*"/,constant:/\b(?:library|use)\b/i,keyword:/\b(?:'active|'ascending|'base|'delayed|'driving|'driving_value|'event|'high|'image|'instance_name|'last_active|'last_event|'last_value|'left|'leftof|'length|'low|'path_name|'pos|'pred|'quiet|'range|'reverse_range|'right|'rightof|'simple_name|'stable|'succ|'transaction|'val|'value|access|after|alias|all|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|new|next|null|of|on|open|others|out|package|port|postponed|procedure|process|pure|range|record|register|reject|report|return|select|severity|shared|signal|subtype|then|to|transport|type|unaffected|units|until|use|variable|wait|when|while|with)\b/i,boolean:/\b(?:false|true)\b/i,function:/\w+(?=\()/,number:/'[01uxzwlh-]'|\b(?:\d+#[\da-f_.]+#|\d[\d_.]*)(?:e[-+]?\d+)?/i,operator:/[<>]=?|:=|[-+*/&=]|\b(?:abs|and|mod|nand|nor|not|or|rem|rol|ror|sla|sll|sra|srl|xnor|xor)\b/i,punctuation:/[{}[\];(),.:]/}}return uE}var dE,JM;function mwe(){if(JM)return dE;JM=1,dE=e,e.displayName="vim",e.aliases=[];function e(t){t.languages.vim={string:/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\r\n]|'')*'/,comment:/".*/,function:/\b\w+(?=\()/,keyword:/\b(?:N|Next|P|Print|X|XMLent|XMLns|ab|abbreviate|abc|abclear|abo|aboveleft|al|all|ar|arga|argadd|argd|argdelete|argdo|arge|argedit|argg|argglobal|argl|arglocal|args|argu|argument|as|ascii|b|bN|bNext|ba|bad|badd|ball|bd|bdelete|be|bel|belowright|bf|bfirst|bl|blast|bm|bmodified|bn|bnext|bo|botright|bp|bprevious|br|brea|break|breaka|breakadd|breakd|breakdel|breakl|breaklist|brewind|bro|browse|bufdo|buffer|buffers|bun|bunload|bw|bwipeout|c|cN|cNext|cNfcNfile|ca|cabbrev|cabc|cabclear|cad|caddb|caddbuffer|caddexpr|caddf|caddfile|cal|call|cat|catch|cb|cbuffer|cc|ccl|cclose|cd|ce|center|cex|cexpr|cf|cfile|cfir|cfirst|cg|cgetb|cgetbuffer|cgete|cgetexpr|cgetfile|change|changes|chd|chdir|che|checkpath|checkt|checktime|cl|cla|clast|clist|clo|close|cmapc|cmapclear|cn|cnew|cnewer|cnext|cnf|cnfile|cnorea|cnoreabbrev|co|col|colder|colo|colorscheme|comc|comclear|comp|compiler|con|conf|confirm|continue|cope|copen|copy|cp|cpf|cpfile|cprevious|cq|cquit|cr|crewind|cu|cuna|cunabbrev|cunmap|cw|cwindow|d|debugg|debuggreedy|delc|delcommand|delete|delf|delfunction|delm|delmarks|di|diffg|diffget|diffoff|diffpatch|diffpu|diffput|diffsplit|diffthis|diffu|diffupdate|dig|digraphs|display|dj|djump|dl|dlist|dr|drop|ds|dsearch|dsp|dsplit|e|earlier|echoe|echoerr|echom|echomsg|echon|edit|el|else|elsei|elseif|em|emenu|en|endf|endfo|endfor|endfun|endfunction|endif|endt|endtry|endw|endwhile|ene|enew|ex|exi|exit|exu|exusage|f|file|files|filetype|fin|fina|finally|find|fini|finish|fir|first|fix|fixdel|fo|fold|foldc|foldclose|foldd|folddoc|folddoclosed|folddoopen|foldo|foldopen|for|fu|fun|function|go|goto|gr|grep|grepa|grepadd|h|ha|hardcopy|help|helpf|helpfind|helpg|helpgrep|helpt|helptags|hid|hide|his|history|ia|iabbrev|iabc|iabclear|if|ij|ijump|il|ilist|imapc|imapclear|in|inorea|inoreabbrev|isearch|isp|isplit|iu|iuna|iunabbrev|iunmap|j|join|ju|jumps|k|kee|keepalt|keepj|keepjumps|keepmarks|l|lN|lNext|lNf|lNfile|la|lad|laddb|laddbuffer|laddexpr|laddf|laddfile|lan|language|last|later|lb|lbuffer|lc|lcd|lch|lchdir|lcl|lclose|left|lefta|leftabove|let|lex|lexpr|lf|lfile|lfir|lfirst|lg|lgetb|lgetbuffer|lgete|lgetexpr|lgetfile|lgr|lgrep|lgrepa|lgrepadd|lh|lhelpgrep|list|ll|lla|llast|lli|llist|lm|lmak|lmake|lmap|lmapc|lmapclear|ln|lne|lnew|lnewer|lnext|lnf|lnfile|lnoremap|lo|loadview|loc|lockmarks|lockv|lockvar|lol|lolder|lop|lopen|lp|lpf|lpfile|lprevious|lr|lrewind|ls|lt|ltag|lu|lunmap|lv|lvimgrep|lvimgrepa|lvimgrepadd|lw|lwindow|m|ma|mak|make|mark|marks|mat|match|menut|menutranslate|mk|mkexrc|mks|mksession|mksp|mkspell|mkv|mkvie|mkview|mkvimrc|mod|mode|move|mz|mzf|mzfile|mzscheme|n|nbkey|new|next|nmapc|nmapclear|noh|nohlsearch|norea|noreabbrev|nu|number|nun|nunmap|o|omapc|omapclear|on|only|open|opt|options|ou|ounmap|p|pc|pclose|pe|ped|pedit|perl|perld|perldo|po|pop|popu|popup|pp|ppop|pre|preserve|prev|previous|print|prof|profd|profdel|profile|promptf|promptfind|promptr|promptrepl|ps|psearch|ptN|ptNext|pta|ptag|ptf|ptfirst|ptj|ptjump|ptl|ptlast|ptn|ptnext|ptp|ptprevious|ptr|ptrewind|pts|ptselect|pu|put|pw|pwd|py|pyf|pyfile|python|q|qa|qall|quit|quita|quitall|r|read|rec|recover|red|redi|redir|redo|redr|redraw|redraws|redrawstatus|reg|registers|res|resize|ret|retab|retu|return|rew|rewind|ri|right|rightb|rightbelow|ru|rub|ruby|rubyd|rubydo|rubyf|rubyfile|runtime|rv|rviminfo|sN|sNext|sa|sal|sall|san|sandbox|sargument|sav|saveas|sb|sbN|sbNext|sba|sball|sbf|sbfirst|sbl|sblast|sbm|sbmodified|sbn|sbnext|sbp|sbprevious|sbr|sbrewind|sbuffer|scrip|scripte|scriptencoding|scriptnames|se|set|setf|setfiletype|setg|setglobal|setl|setlocal|sf|sfind|sfir|sfirst|sh|shell|sign|sil|silent|sim|simalt|sl|sla|slast|sleep|sm|smagic|smap|smapc|smapclear|sme|smenu|sn|snext|sni|sniff|sno|snomagic|snor|snoremap|snoreme|snoremenu|so|sor|sort|source|sp|spe|spelld|spelldump|spellgood|spelli|spellinfo|spellr|spellrepall|spellu|spellundo|spellw|spellwrong|split|spr|sprevious|sre|srewind|st|sta|stag|star|startg|startgreplace|startinsert|startr|startreplace|stj|stjump|stop|stopi|stopinsert|sts|stselect|sun|sunhide|sunm|sunmap|sus|suspend|sv|sview|syncbind|t|tN|tNext|ta|tab|tabN|tabNext|tabc|tabclose|tabd|tabdo|tabe|tabedit|tabf|tabfind|tabfir|tabfirst|tabl|tablast|tabm|tabmove|tabn|tabnew|tabnext|tabo|tabonly|tabp|tabprevious|tabr|tabrewind|tabs|tag|tags|tc|tcl|tcld|tcldo|tclf|tclfile|te|tearoff|tf|tfirst|th|throw|tj|tjump|tl|tlast|tm|tmenu|tn|tnext|to|topleft|tp|tprevious|tr|trewind|try|ts|tselect|tu|tunmenu|u|una|unabbreviate|undo|undoj|undojoin|undol|undolist|unh|unhide|unlet|unlo|unlockvar|unm|unmap|up|update|ve|verb|verbose|version|vert|vertical|vi|vie|view|vim|vimgrep|vimgrepa|vimgrepadd|visual|viu|viusage|vmapc|vmapclear|vne|vnew|vs|vsplit|vu|vunmap|w|wN|wNext|wa|wall|wh|while|win|winc|wincmd|windo|winp|winpos|winsize|wn|wnext|wp|wprevious|wq|wqa|wqall|write|ws|wsverb|wv|wviminfo|x|xa|xall|xit|xm|xmap|xmapc|xmapclear|xme|xmenu|xn|xnoremap|xnoreme|xnoremenu|xu|xunmap|y|yank)\b/,builtin:/\b(?:acd|ai|akm|aleph|allowrevins|altkeymap|ambiwidth|ambw|anti|antialias|arab|arabic|arabicshape|ari|arshape|autochdir|autocmd|autoindent|autoread|autowrite|autowriteall|aw|awa|background|backspace|backup|backupcopy|backupdir|backupext|backupskip|balloondelay|ballooneval|balloonexpr|bdir|bdlay|beval|bex|bexpr|bg|bh|bin|binary|biosk|bioskey|bk|bkc|bomb|breakat|brk|browsedir|bs|bsdir|bsk|bt|bufhidden|buflisted|buftype|casemap|ccv|cdpath|cedit|cfu|ch|charconvert|ci|cin|cindent|cink|cinkeys|cino|cinoptions|cinw|cinwords|clipboard|cmdheight|cmdwinheight|cmp|cms|columns|com|comments|commentstring|compatible|complete|completefunc|completeopt|consk|conskey|copyindent|cot|cpo|cpoptions|cpt|cscopepathcomp|cscopeprg|cscopequickfix|cscopetag|cscopetagorder|cscopeverbose|cspc|csprg|csqf|cst|csto|csverb|cuc|cul|cursorcolumn|cursorline|cwh|debug|deco|def|define|delcombine|dex|dg|dict|dictionary|diff|diffexpr|diffopt|digraph|dip|dir|directory|dy|ea|ead|eadirection|eb|ed|edcompatible|ef|efm|ei|ek|enc|encoding|endofline|eol|ep|equalalways|equalprg|errorbells|errorfile|errorformat|esckeys|et|eventignore|expandtab|exrc|fcl|fcs|fdc|fde|fdi|fdl|fdls|fdm|fdn|fdo|fdt|fen|fenc|fencs|fex|ff|ffs|fileencoding|fileencodings|fileformat|fileformats|fillchars|fk|fkmap|flp|fml|fmr|foldcolumn|foldenable|foldexpr|foldignore|foldlevel|foldlevelstart|foldmarker|foldmethod|foldminlines|foldnestmax|foldtext|formatexpr|formatlistpat|formatoptions|formatprg|fp|fs|fsync|ft|gcr|gd|gdefault|gfm|gfn|gfs|gfw|ghr|gp|grepformat|grepprg|gtl|gtt|guicursor|guifont|guifontset|guifontwide|guiheadroom|guioptions|guipty|guitablabel|guitabtooltip|helpfile|helpheight|helplang|hf|hh|hi|hidden|highlight|hk|hkmap|hkmapp|hkp|hl|hlg|hls|hlsearch|ic|icon|iconstring|ignorecase|im|imactivatekey|imak|imc|imcmdline|imd|imdisable|imi|iminsert|ims|imsearch|inc|include|includeexpr|incsearch|inde|indentexpr|indentkeys|indk|inex|inf|infercase|insertmode|invacd|invai|invakm|invallowrevins|invaltkeymap|invanti|invantialias|invar|invarab|invarabic|invarabicshape|invari|invarshape|invautochdir|invautoindent|invautoread|invautowrite|invautowriteall|invaw|invawa|invbackup|invballooneval|invbeval|invbin|invbinary|invbiosk|invbioskey|invbk|invbl|invbomb|invbuflisted|invcf|invci|invcin|invcindent|invcompatible|invconfirm|invconsk|invconskey|invcopyindent|invcp|invcscopetag|invcscopeverbose|invcst|invcsverb|invcuc|invcul|invcursorcolumn|invcursorline|invdeco|invdelcombine|invdg|invdiff|invdigraph|invdisable|invea|inveb|inved|invedcompatible|invek|invendofline|inveol|invequalalways|inverrorbells|invesckeys|invet|invex|invexpandtab|invexrc|invfen|invfk|invfkmap|invfoldenable|invgd|invgdefault|invguipty|invhid|invhidden|invhk|invhkmap|invhkmapp|invhkp|invhls|invhlsearch|invic|invicon|invignorecase|invim|invimc|invimcmdline|invimd|invincsearch|invinf|invinfercase|invinsertmode|invis|invjoinspaces|invjs|invlazyredraw|invlbr|invlinebreak|invlisp|invlist|invloadplugins|invlpl|invlz|invma|invmacatsui|invmagic|invmh|invml|invmod|invmodeline|invmodifiable|invmodified|invmore|invmousef|invmousefocus|invmousehide|invnu|invnumber|invodev|invopendevice|invpaste|invpi|invpreserveindent|invpreviewwindow|invprompt|invpvw|invreadonly|invremap|invrestorescreen|invrevins|invri|invrightleft|invrightleftcmd|invrl|invrlc|invro|invrs|invru|invruler|invsb|invsc|invscb|invscrollbind|invscs|invsecure|invsft|invshellslash|invshelltemp|invshiftround|invshortname|invshowcmd|invshowfulltag|invshowmatch|invshowmode|invsi|invsm|invsmartcase|invsmartindent|invsmarttab|invsmd|invsn|invsol|invspell|invsplitbelow|invsplitright|invspr|invsr|invssl|invsta|invstartofline|invstmp|invswapfile|invswf|invta|invtagbsearch|invtagrelative|invtagstack|invtbi|invtbidi|invtbs|invtermbidi|invterse|invtextauto|invtextmode|invtf|invtgst|invtildeop|invtimeout|invtitle|invto|invtop|invtr|invttimeout|invttybuiltin|invttyfast|invtx|invvb|invvisualbell|invwa|invwarn|invwb|invweirdinvert|invwfh|invwfw|invwildmenu|invwinfixheight|invwinfixwidth|invwiv|invwmnu|invwrap|invwrapscan|invwrite|invwriteany|invwritebackup|invws|isf|isfname|isi|isident|isk|iskeyword|isprint|joinspaces|js|key|keymap|keymodel|keywordprg|km|kmp|kp|langmap|langmenu|laststatus|lazyredraw|lbr|lcs|linebreak|lines|linespace|lisp|lispwords|listchars|loadplugins|lpl|lsp|lz|macatsui|magic|makeef|makeprg|matchpairs|matchtime|maxcombine|maxfuncdepth|maxmapdepth|maxmem|maxmempattern|maxmemtot|mco|mef|menuitems|mfd|mh|mis|mkspellmem|ml|mls|mm|mmd|mmp|mmt|modeline|modelines|modifiable|modified|more|mouse|mousef|mousefocus|mousehide|mousem|mousemodel|mouses|mouseshape|mouset|mousetime|mp|mps|msm|mzq|mzquantum|nf|noacd|noai|noakm|noallowrevins|noaltkeymap|noanti|noantialias|noar|noarab|noarabic|noarabicshape|noari|noarshape|noautochdir|noautoindent|noautoread|noautowrite|noautowriteall|noaw|noawa|nobackup|noballooneval|nobeval|nobin|nobinary|nobiosk|nobioskey|nobk|nobl|nobomb|nobuflisted|nocf|noci|nocin|nocindent|nocompatible|noconfirm|noconsk|noconskey|nocopyindent|nocp|nocscopetag|nocscopeverbose|nocst|nocsverb|nocuc|nocul|nocursorcolumn|nocursorline|nodeco|nodelcombine|nodg|nodiff|nodigraph|nodisable|noea|noeb|noed|noedcompatible|noek|noendofline|noeol|noequalalways|noerrorbells|noesckeys|noet|noex|noexpandtab|noexrc|nofen|nofk|nofkmap|nofoldenable|nogd|nogdefault|noguipty|nohid|nohidden|nohk|nohkmap|nohkmapp|nohkp|nohls|noic|noicon|noignorecase|noim|noimc|noimcmdline|noimd|noincsearch|noinf|noinfercase|noinsertmode|nois|nojoinspaces|nojs|nolazyredraw|nolbr|nolinebreak|nolisp|nolist|noloadplugins|nolpl|nolz|noma|nomacatsui|nomagic|nomh|noml|nomod|nomodeline|nomodifiable|nomodified|nomore|nomousef|nomousefocus|nomousehide|nonu|nonumber|noodev|noopendevice|nopaste|nopi|nopreserveindent|nopreviewwindow|noprompt|nopvw|noreadonly|noremap|norestorescreen|norevins|nori|norightleft|norightleftcmd|norl|norlc|noro|nors|noru|noruler|nosb|nosc|noscb|noscrollbind|noscs|nosecure|nosft|noshellslash|noshelltemp|noshiftround|noshortname|noshowcmd|noshowfulltag|noshowmatch|noshowmode|nosi|nosm|nosmartcase|nosmartindent|nosmarttab|nosmd|nosn|nosol|nospell|nosplitbelow|nosplitright|nospr|nosr|nossl|nosta|nostartofline|nostmp|noswapfile|noswf|nota|notagbsearch|notagrelative|notagstack|notbi|notbidi|notbs|notermbidi|noterse|notextauto|notextmode|notf|notgst|notildeop|notimeout|notitle|noto|notop|notr|nottimeout|nottybuiltin|nottyfast|notx|novb|novisualbell|nowa|nowarn|nowb|noweirdinvert|nowfh|nowfw|nowildmenu|nowinfixheight|nowinfixwidth|nowiv|nowmnu|nowrap|nowrapscan|nowrite|nowriteany|nowritebackup|nows|nrformats|numberwidth|nuw|odev|oft|ofu|omnifunc|opendevice|operatorfunc|opfunc|osfiletype|pa|para|paragraphs|paste|pastetoggle|patchexpr|patchmode|path|pdev|penc|pex|pexpr|pfn|ph|pheader|pi|pm|pmbcs|pmbfn|popt|preserveindent|previewheight|previewwindow|printdevice|printencoding|printexpr|printfont|printheader|printmbcharset|printmbfont|printoptions|prompt|pt|pumheight|pvh|pvw|qe|quoteescape|readonly|remap|report|restorescreen|revins|rightleft|rightleftcmd|rl|rlc|ro|rs|rtp|ruf|ruler|rulerformat|runtimepath|sbo|sc|scb|scr|scroll|scrollbind|scrolljump|scrolloff|scrollopt|scs|sect|sections|secure|sel|selection|selectmode|sessionoptions|sft|shcf|shellcmdflag|shellpipe|shellquote|shellredir|shellslash|shelltemp|shelltype|shellxquote|shiftround|shiftwidth|shm|shortmess|shortname|showbreak|showcmd|showfulltag|showmatch|showmode|showtabline|shq|si|sidescroll|sidescrolloff|siso|sj|slm|smartcase|smartindent|smarttab|smc|smd|softtabstop|sol|spc|spell|spellcapcheck|spellfile|spelllang|spellsuggest|spf|spl|splitbelow|splitright|sps|sr|srr|ss|ssl|ssop|stal|startofline|statusline|stl|stmp|su|sua|suffixes|suffixesadd|sw|swapfile|swapsync|swb|swf|switchbuf|sws|sxq|syn|synmaxcol|syntax|t_AB|t_AF|t_AL|t_CS|t_CV|t_Ce|t_Co|t_Cs|t_DL|t_EI|t_F1|t_F2|t_F3|t_F4|t_F5|t_F6|t_F7|t_F8|t_F9|t_IE|t_IS|t_K1|t_K3|t_K4|t_K5|t_K6|t_K7|t_K8|t_K9|t_KA|t_KB|t_KC|t_KD|t_KE|t_KF|t_KG|t_KH|t_KI|t_KJ|t_KK|t_KL|t_RI|t_RV|t_SI|t_Sb|t_Sf|t_WP|t_WS|t_ZH|t_ZR|t_al|t_bc|t_cd|t_ce|t_cl|t_cm|t_cs|t_da|t_db|t_dl|t_fs|t_k1|t_k2|t_k3|t_k4|t_k5|t_k6|t_k7|t_k8|t_k9|t_kB|t_kD|t_kI|t_kN|t_kP|t_kb|t_kd|t_ke|t_kh|t_kl|t_kr|t_ks|t_ku|t_le|t_mb|t_md|t_me|t_mr|t_ms|t_nd|t_op|t_se|t_so|t_sr|t_te|t_ti|t_ts|t_ue|t_us|t_ut|t_vb|t_ve|t_vi|t_vs|t_xs|tabline|tabpagemax|tabstop|tagbsearch|taglength|tagrelative|tagstack|tal|tb|tbi|tbidi|tbis|tbs|tenc|term|termbidi|termencoding|terse|textauto|textmode|textwidth|tgst|thesaurus|tildeop|timeout|timeoutlen|title|titlelen|titleold|titlestring|toolbar|toolbariconsize|top|tpm|tsl|tsr|ttimeout|ttimeoutlen|ttm|tty|ttybuiltin|ttyfast|ttym|ttymouse|ttyscroll|ttytype|tw|tx|uc|ul|undolevels|updatecount|updatetime|ut|vb|vbs|vdir|verbosefile|vfile|viewdir|viewoptions|viminfo|virtualedit|visualbell|vop|wak|warn|wb|wc|wcm|wd|weirdinvert|wfh|wfw|whichwrap|wi|wig|wildchar|wildcharm|wildignore|wildmenu|wildmode|wildoptions|wim|winaltkeys|window|winfixheight|winfixwidth|winheight|winminheight|winminwidth|winwidth|wiv|wiw|wm|wmh|wmnu|wmw|wop|wrap|wrapmargin|wrapscan|writeany|writebackup|writedelay|ww)\b/,number:/\b(?:0x[\da-f]+|\d+(?:\.\d+)?)\b/i,operator:/\|\||&&|[-+.]=?|[=!](?:[=~][#?]?)?|[<>]=?[#?]?|[*\/%?]|\b(?:is(?:not)?)\b/,punctuation:/[{}[\](),;:]/}}return dE}var fE,e5;function hwe(){if(e5)return fE;e5=1,fE=e,e.displayName="visualBasic",e.aliases=[];function e(t){t.languages["visual-basic"]={comment:{pattern:/(?:['‘’]|REM\b)(?:[^\r\n_]|_(?:\r\n?|\n)?)*/i,inside:{keyword:/^REM/i}},directive:{pattern:/#(?:Const|Else|ElseIf|End|ExternalChecksum|ExternalSource|If|Region)(?:\b_[ \t]*(?:\r\n?|\n)|.)+/i,alias:"property",greedy:!0},string:{pattern:/\$?["“”](?:["“”]{2}|[^"“”])*["“”]C?/i,greedy:!0},date:{pattern:/#[ \t]*(?:\d+([/-])\d+\1\d+(?:[ \t]+(?:\d+[ \t]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[ \t]*(?:AM|PM))?))?|\d+[ \t]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[ \t]*(?:AM|PM))?)[ \t]*#/i,alias:"number"},number:/(?:(?:\b\d+(?:\.\d+)?|\.\d+)(?:E[+-]?\d+)?|&[HO][\dA-F]+)(?:[FRD]|U?[ILS])?/i,boolean:/\b(?:False|Nothing|True)\b/i,keyword:/\b(?:AddHandler|AddressOf|Alias|And(?:Also)?|As|Boolean|ByRef|Byte|ByVal|Call|Case|Catch|C(?:Bool|Byte|Char|Date|Dbl|Dec|Int|Lng|Obj|SByte|Short|Sng|Str|Type|UInt|ULng|UShort)|Char|Class|Const|Continue|Currency|Date|Decimal|Declare|Default|Delegate|Dim|DirectCast|Do|Double|Each|Else(?:If)?|End(?:If)?|Enum|Erase|Error|Event|Exit|Finally|For|Friend|Function|Get(?:Type|XMLNamespace)?|Global|GoSub|GoTo|Handles|If|Implements|Imports|In|Inherits|Integer|Interface|Is|IsNot|Let|Lib|Like|Long|Loop|Me|Mod|Module|Must(?:Inherit|Override)|My(?:Base|Class)|Namespace|Narrowing|New|Next|Not(?:Inheritable|Overridable)?|Object|Of|On|Operator|Option(?:al)?|Or(?:Else)?|Out|Overloads|Overridable|Overrides|ParamArray|Partial|Private|Property|Protected|Public|RaiseEvent|ReadOnly|ReDim|RemoveHandler|Resume|Return|SByte|Select|Set|Shadows|Shared|short|Single|Static|Step|Stop|String|Structure|Sub|SyncLock|Then|Throw|To|Try|TryCast|Type|TypeOf|U(?:Integer|Long|Short)|Until|Using|Variant|Wend|When|While|Widening|With(?:Events)?|WriteOnly|Xor)\b/i,operator:/[+\-*/\\^<=>&#@$%!]|\b_(?=[ \t]*[\r\n])/,punctuation:/[{}().,:?]/},t.languages.vb=t.languages["visual-basic"],t.languages.vba=t.languages["visual-basic"]}return fE}var pE,t5;function bwe(){if(t5)return pE;t5=1,pE=e,e.displayName="warpscript",e.aliases=[];function e(t){t.languages.warpscript={comment:/#.*|\/\/.*|\/\*[\s\S]*?\*\//,string:{pattern:/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'|<'(?:[^\\']|'(?!>)|\\.)*'>/,greedy:!0},variable:/\$\S+/,macro:{pattern:/@\S+/,alias:"property"},keyword:/\b(?:BREAK|CHECKMACRO|CONTINUE|CUDF|DEFINED|DEFINEDMACRO|EVAL|FAIL|FOR|FOREACH|FORSTEP|IFT|IFTE|MSGFAIL|NRETURN|RETHROW|RETURN|SWITCH|TRY|UDF|UNTIL|WHILE)\b/,number:/[+-]?\b(?:NaN|Infinity|\d+(?:\.\d*)?(?:[Ee][+-]?\d+)?|0x[\da-fA-F]+|0b[01]+)\b/,boolean:/\b(?:F|T|false|true)\b/,punctuation:/<%|%>|[{}[\]()]/,operator:/==|&&?|\|\|?|\*\*?|>>>?|<<|[<>!~]=?|[-/%^]|\+!?|\b(?:AND|NOT|OR)\b/}}return pE}var gE,n5;function ywe(){if(n5)return gE;n5=1,gE=e,e.displayName="wasm",e.aliases=[];function e(t){t.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/}}return gE}var mE,r5;function vwe(){if(r5)return mE;r5=1,mE=e,e.displayName="webIdl",e.aliases=[];function e(t){(function(n){var r=/(?:\B-|\b_|\b)[A-Za-z][\w-]*(?![\w-])/.source,a="(?:"+/\b(?:unsigned\s+)?long\s+long(?![\w-])/.source+"|"+/\b(?:unrestricted|unsigned)\s+[a-z]+(?![\w-])/.source+"|"+/(?!(?:unrestricted|unsigned)\b)/.source+r+/(?:\s*<(?:[^<>]|<[^<>]*>)*>)?/.source+")"+/(?:\s*\?)?/.source,o={};n.languages["web-idl"]={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},string:{pattern:/"[^"]*"/,greedy:!0},namespace:{pattern:RegExp(/(\bnamespace\s+)/.source+r),lookbehind:!0},"class-name":[{pattern:/(^|[^\w-])(?:iterable|maplike|setlike)\s*<(?:[^<>]|<[^<>]*>)*>/,lookbehind:!0,inside:o},{pattern:RegExp(/(\b(?:attribute|const|deleter|getter|optional|setter)\s+)/.source+a),lookbehind:!0,inside:o},{pattern:RegExp("("+/\bcallback\s+/.source+r+/\s*=\s*/.source+")"+a),lookbehind:!0,inside:o},{pattern:RegExp(/(\btypedef\b\s*)/.source+a),lookbehind:!0,inside:o},{pattern:RegExp(/(\b(?:callback|dictionary|enum|interface(?:\s+mixin)?)\s+)(?!(?:interface|mixin)\b)/.source+r),lookbehind:!0},{pattern:RegExp(/(:\s*)/.source+r),lookbehind:!0},RegExp(r+/(?=\s+(?:implements|includes)\b)/.source),{pattern:RegExp(/(\b(?:implements|includes)\s+)/.source+r),lookbehind:!0},{pattern:RegExp(a+"(?="+/\s*(?:\.{3}\s*)?/.source+r+/\s*[(),;=]/.source+")"),inside:o}],builtin:/\b(?:ArrayBuffer|BigInt64Array|BigUint64Array|ByteString|DOMString|DataView|Float32Array|Float64Array|FrozenArray|Int16Array|Int32Array|Int8Array|ObservableArray|Promise|USVString|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray)\b/,keyword:[/\b(?:async|attribute|callback|const|constructor|deleter|dictionary|enum|getter|implements|includes|inherit|interface|mixin|namespace|null|optional|or|partial|readonly|required|setter|static|stringifier|typedef|unrestricted)\b/,/\b(?:any|bigint|boolean|byte|double|float|iterable|long|maplike|object|octet|record|sequence|setlike|short|symbol|undefined|unsigned|void)\b/],boolean:/\b(?:false|true)\b/,number:{pattern:/(^|[^\w-])-?(?:0x[0-9a-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|NaN|Infinity)(?![\w-])/i,lookbehind:!0},operator:/\.{3}|[=:?<>-]/,punctuation:/[(){}[\].,;]/};for(var i in n.languages["web-idl"])i!=="class-name"&&(o[i]=n.languages["web-idl"][i]);n.languages.webidl=n.languages["web-idl"]})(t)}return mE}var hE,a5;function Swe(){if(a5)return hE;a5=1,hE=e,e.displayName="wiki",e.aliases=[];function e(t){t.languages.wiki=t.languages.extend("markup",{"block-comment":{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0,alias:"comment"},heading:{pattern:/^(=+)[^=\r\n].*?\1/m,inside:{punctuation:/^=+|=+$/,important:/.+/}},emphasis:{pattern:/('{2,5}).+?\1/,inside:{"bold-italic":{pattern:/(''''').+?(?=\1)/,lookbehind:!0,alias:["bold","italic"]},bold:{pattern:/(''')[^'](?:.*?[^'])?(?=\1)/,lookbehind:!0},italic:{pattern:/('')[^'](?:.*?[^'])?(?=\1)/,lookbehind:!0},punctuation:/^''+|''+$/}},hr:{pattern:/^-{4,}/m,alias:"punctuation"},url:[/ISBN +(?:97[89][ -]?)?(?:\d[ -]?){9}[\dx]\b|(?:PMID|RFC) +\d+/i,/\[\[.+?\]\]|\[.+?\]/],variable:[/__[A-Z]+__/,/\{{3}.+?\}{3}/,/\{\{.+?\}\}/],symbol:[/^#redirect/im,/~{3,5}/],"table-tag":{pattern:/((?:^|[|!])[|!])[^|\r\n]+\|(?!\|)/m,lookbehind:!0,inside:{"table-bar":{pattern:/\|$/,alias:"punctuation"},rest:t.languages.markup.tag.inside}},punctuation:/^(?:\{\||\|\}|\|-|[*#:;!|])|\|\||!!/m}),t.languages.insertBefore("wiki","tag",{nowiki:{pattern:/<(nowiki|pre|source)\b[^>]*>[\s\S]*?<\/\1>/i,inside:{tag:{pattern:/<(?:nowiki|pre|source)\b[^>]*>|<\/(?:nowiki|pre|source)>/i,inside:t.languages.markup.tag.inside}}}})}return hE}var bE,o5;function wwe(){if(o5)return bE;o5=1,bE=e,e.displayName="wolfram",e.aliases=["mathematica","wl","nb"];function e(t){t.languages.wolfram={comment:/\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:Abs|AbsArg|Accuracy|Block|Do|For|Function|If|Manipulate|Module|Nest|NestList|None|Return|Switch|Table|Which|While)\b/,context:{pattern:/\b\w+`+\w*/,alias:"class-name"},blank:{pattern:/\b\w+_\b/,alias:"regex"},"global-variable":{pattern:/\$\w+/,alias:"variable"},boolean:/\b(?:False|True)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/\/\.|;|=\.|\^=|\^:=|:=|<<|>>|<\||\|>|:>|\|->|->|<-|@@@|@@|@|\/@|=!=|===|==|=|\+|-|\^|\[\/-+%=\]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},t.languages.mathematica=t.languages.wolfram,t.languages.wl=t.languages.wolfram,t.languages.nb=t.languages.wolfram}return bE}var yE,i5;function Ewe(){if(i5)return yE;i5=1,yE=e,e.displayName="wren",e.aliases=[];function e(t){t.languages.wren={comment:[{pattern:/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*))*\*\/)*\*\/)*\*\//,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],"triple-quoted-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},"string-literal":null,hashbang:{pattern:/^#!\/.+/,greedy:!0,alias:"comment"},attribute:{pattern:/#!?[ \t\u3000]*\w+/,alias:"keyword"},"class-name":[{pattern:/(\bclass\s+)\w+/,lookbehind:!0},/\b[A-Z][a-z\d_]*\b/],constant:/\b[A-Z][A-Z\d_]*\b/,null:{pattern:/\bnull\b/,alias:"keyword"},keyword:/\b(?:as|break|class|construct|continue|else|for|foreign|if|import|in|is|return|static|super|this|var|while)\b/,boolean:/\b(?:false|true)\b/,number:/\b(?:0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,function:/\b[a-z_]\w*(?=\s*[({])/i,operator:/<<|>>|[=!<>]=?|&&|\|\||[-+*/%~^&|?:]|\.{2,3}/,punctuation:/[\[\](){}.,;]/},t.languages.wren["string-literal"]={pattern:/(^|[^\\"])"(?:[^\\"%]|\\[\s\S]|%(?!\()|%\((?:[^()]|\((?:[^()]|\([^)]*\))*\))*\))*"/,lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)%\((?:[^()]|\((?:[^()]|\([^)]*\))*\))*\)/,lookbehind:!0,inside:{expression:{pattern:/^(%\()[\s\S]+(?=\)$)/,lookbehind:!0,inside:t.languages.wren},"interpolation-punctuation":{pattern:/^%\(|\)$/,alias:"punctuation"}}},string:/[\s\S]+/}}}return yE}var vE,s5;function xwe(){if(s5)return vE;s5=1,vE=e,e.displayName="xeora",e.aliases=["xeoracube"];function e(t){(function(n){n.languages.xeora=n.languages.extend("markup",{constant:{pattern:/\$(?:DomainContents|PageRenderDuration)\$/,inside:{punctuation:{pattern:/\$/}}},variable:{pattern:/\$@?(?:#+|[-+*~=^])?[\w.]+\$/,inside:{punctuation:{pattern:/[$.]/},operator:{pattern:/#+|[-+*~=^@]/}}},"function-inline":{pattern:/\$F:[-\w.]+\?[-\w.]+(?:,(?:(?:@[-#]*\w+\.[\w+.]\.*)*\|)*(?:(?:[\w+]|[-#*.~^]+[\w+]|=\S)(?:[^$=]|=+[^=])*=*|(?:@[-#]*\w+\.[\w+.]\.*)+(?:(?:[\w+]|[-#*~^][-#*.~^]*[\w+]|=\S)(?:[^$=]|=+[^=])*=*)?)?)?\$/,inside:{variable:{pattern:/(?:[,|])@?(?:#+|[-+*~=^])?[\w.]+/,inside:{punctuation:{pattern:/[,.|]/},operator:{pattern:/#+|[-+*~=^@]/}}},punctuation:{pattern:/\$\w:|[$:?.,|]/}},alias:"function"},"function-block":{pattern:/\$XF:\{[-\w.]+\?[-\w.]+(?:,(?:(?:@[-#]*\w+\.[\w+.]\.*)*\|)*(?:(?:[\w+]|[-#*.~^]+[\w+]|=\S)(?:[^$=]|=+[^=])*=*|(?:@[-#]*\w+\.[\w+.]\.*)+(?:(?:[\w+]|[-#*~^][-#*.~^]*[\w+]|=\S)(?:[^$=]|=+[^=])*=*)?)?)?\}:XF\$/,inside:{punctuation:{pattern:/[$:{}?.,|]/}},alias:"function"},"directive-inline":{pattern:/\$\w(?:#\d+\+?)?(?:\[[-\w.]+\])?:[-\/\w.]+\$/,inside:{punctuation:{pattern:/\$(?:\w:|C(?:\[|#\d))?|[:{[\]]/,inside:{tag:{pattern:/#\d/}}}},alias:"function"},"directive-block-open":{pattern:/\$\w+:\{|\$\w(?:#\d+\+?)?(?:\[[-\w.]+\])?:[-\w.]+:\{(?:![A-Z]+)?/,inside:{punctuation:{pattern:/\$(?:\w:|C(?:\[|#\d))?|[:{[\]]/,inside:{tag:{pattern:/#\d/}}},attribute:{pattern:/![A-Z]+$/,inside:{punctuation:{pattern:/!/}},alias:"keyword"}},alias:"function"},"directive-block-separator":{pattern:/\}:[-\w.]+:\{/,inside:{punctuation:{pattern:/[:{}]/}},alias:"function"},"directive-block-close":{pattern:/\}:[-\w.]+\$/,inside:{punctuation:{pattern:/[:{}$]/}},alias:"function"}}),n.languages.insertBefore("inside","punctuation",{variable:n.languages.xeora["function-inline"].inside.variable},n.languages.xeora["function-block"]),n.languages.xeoracube=n.languages.xeora})(t)}return vE}var SE,l5;function kwe(){if(l5)return SE;l5=1,SE=e,e.displayName="xmlDoc",e.aliases=[];function e(t){(function(n){function r(s,l){n.languages[s]&&n.languages.insertBefore(s,"comment",{"doc-comment":l})}var a=n.languages.markup.tag,o={pattern:/\/\/\/.*/,greedy:!0,alias:"comment",inside:{tag:a}},i={pattern:/'''.*/,greedy:!0,alias:"comment",inside:{tag:a}};r("csharp",o),r("fsharp",o),r("vbnet",i)})(t)}return SE}var wE,c5;function Cwe(){if(c5)return wE;c5=1,wE=e,e.displayName="xojo",e.aliases=[];function e(t){t.languages.xojo={comment:{pattern:/(?:'|\/\/|Rem\b).+/i,greedy:!0},string:{pattern:/"(?:""|[^"])*"/,greedy:!0},number:[/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,/&[bchou][a-z\d]+/i],directive:{pattern:/#(?:Else|ElseIf|Endif|If|Pragma)\b/i,alias:"property"},keyword:/\b(?:AddHandler|App|Array|As(?:signs)?|Auto|Boolean|Break|By(?:Ref|Val)|Byte|Call|Case|Catch|CFStringRef|CGFloat|Class|Color|Const|Continue|CString|Currency|CurrentMethodName|Declare|Delegate|Dim|Do(?:uble|wnTo)?|Each|Else(?:If)?|End|Enumeration|Event|Exception|Exit|Extends|False|Finally|For|Function|Get|GetTypeInfo|Global|GOTO|If|Implements|In|Inherits|Int(?:8|16|32|64|eger|erface)?|Lib|Loop|Me|Module|Next|Nil|Object|Optional|OSType|ParamArray|Private|Property|Protected|PString|Ptr|Raise(?:Event)?|ReDim|RemoveHandler|Return|Select(?:or)?|Self|Set|Shared|Short|Single|Soft|Static|Step|String|Sub|Super|Text|Then|To|True|Try|Ubound|UInt(?:8|16|32|64|eger)?|Until|Using|Var(?:iant)?|Wend|While|WindowPtr|WString)\b/i,operator:/<[=>]?|>=?|[+\-*\/\\^=]|\b(?:AddressOf|And|Ctype|IsA?|Mod|New|Not|Or|WeakAddressOf|Xor)\b/i,punctuation:/[.,;:()]/}}return wE}var EE,u5;function _we(){if(u5)return EE;u5=1,EE=e,e.displayName="xquery",e.aliases=[];function e(t){(function(n){n.languages.xquery=n.languages.extend("markup",{"xquery-comment":{pattern:/\(:[\s\S]*?:\)/,greedy:!0,alias:"comment"},string:{pattern:/(["'])(?:\1\1|(?!\1)[\s\S])*\1/,greedy:!0},extension:{pattern:/\(#.+?#\)/,alias:"symbol"},variable:/\$[-\w:]+/,axis:{pattern:/(^|[^-])(?:ancestor(?:-or-self)?|attribute|child|descendant(?:-or-self)?|following(?:-sibling)?|parent|preceding(?:-sibling)?|self)(?=::)/,lookbehind:!0,alias:"operator"},"keyword-operator":{pattern:/(^|[^:-])\b(?:and|castable as|div|eq|except|ge|gt|idiv|instance of|intersect|is|le|lt|mod|ne|or|union)\b(?=$|[^:-])/,lookbehind:!0,alias:"operator"},keyword:{pattern:/(^|[^:-])\b(?:as|ascending|at|base-uri|boundary-space|case|cast as|collation|construction|copy-namespaces|declare|default|descending|else|empty (?:greatest|least)|encoding|every|external|for|function|if|import|in|inherit|lax|let|map|module|namespace|no-inherit|no-preserve|option|order(?: by|ed|ing)?|preserve|return|satisfies|schema|some|stable|strict|strip|then|to|treat as|typeswitch|unordered|validate|variable|version|where|xquery)\b(?=$|[^:-])/,lookbehind:!0},function:/[\w-]+(?::[\w-]+)*(?=\s*\()/,"xquery-element":{pattern:/(element\s+)[\w-]+(?::[\w-]+)*/,lookbehind:!0,alias:"tag"},"xquery-attribute":{pattern:/(attribute\s+)[\w-]+(?::[\w-]+)*/,lookbehind:!0,alias:"attr-name"},builtin:{pattern:/(^|[^:-])\b(?:attribute|comment|document|element|processing-instruction|text|xs:(?:ENTITIES|ENTITY|ID|IDREFS?|NCName|NMTOKENS?|NOTATION|Name|QName|anyAtomicType|anyType|anyURI|base64Binary|boolean|byte|date|dateTime|dayTimeDuration|decimal|double|duration|float|gDay|gMonth|gMonthDay|gYear|gYearMonth|hexBinary|int|integer|language|long|negativeInteger|nonNegativeInteger|nonPositiveInteger|normalizedString|positiveInteger|short|string|time|token|unsigned(?:Byte|Int|Long|Short)|untyped(?:Atomic)?|yearMonthDuration))\b(?=$|[^:-])/,lookbehind:!0},number:/\b\d+(?:\.\d+)?(?:E[+-]?\d+)?/,operator:[/[+*=?|@]|\.\.?|:=|!=|<[=<]?|>[=>]?/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}],punctuation:/[[\](){},;:/]/}),n.languages.xquery.tag.pattern=/<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/,n.languages.xquery.tag.inside["attr-value"].pattern=/=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+)/,n.languages.xquery.tag.inside["attr-value"].inside.punctuation=/^="|"$/,n.languages.xquery.tag.inside["attr-value"].inside.expression={pattern:/\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}/,inside:n.languages.xquery,alias:"language-xquery"};var r=function(o){return typeof o=="string"?o:typeof o.content=="string"?o.content:o.content.map(r).join("")},a=function(o){for(var i=[],s=0;s0&&i[i.length-1].tagName===r(l.content[0].content[1])&&i.pop():l.content[l.content.length-1].content==="/>"||i.push({tagName:r(l.content[0].content[1]),openedBraces:0}):i.length>0&&l.type==="punctuation"&&l.content==="{"&&(!o[s+1]||o[s+1].type!=="punctuation"||o[s+1].content!=="{")&&(!o[s-1]||o[s-1].type!=="plain-text"||o[s-1].content!=="{")?i[i.length-1].openedBraces++:i.length>0&&i[i.length-1].openedBraces>0&&l.type==="punctuation"&&l.content==="}"?i[i.length-1].openedBraces--:l.type!=="comment"&&(c=!0)),(c||typeof l=="string")&&i.length>0&&i[i.length-1].openedBraces===0){var u=r(l);s0&&(typeof o[s-1]=="string"||o[s-1].type==="plain-text")&&(u=r(o[s-1])+u,o.splice(s-1,1),s--),/^\s+$/.test(u)?o[s]=u:o[s]=new n.Token("plain-text",u,null,u)}l.content&&typeof l.content!="string"&&a(l.content)}};n.hooks.add("after-tokenize",function(o){o.language==="xquery"&&a(o.tokens)})})(t)}return EE}var xE,d5;function Awe(){if(d5)return xE;d5=1,xE=e,e.displayName="yang",e.aliases=[];function e(t){t.languages.yang={comment:/\/\*[\s\S]*?\*\/|\/\/.*/,string:{pattern:/"(?:[^\\"]|\\.)*"|'[^']*'/,greedy:!0},keyword:{pattern:/(^|[{};\r\n][ \t]*)[a-z_][\w.-]*/i,lookbehind:!0},namespace:{pattern:/(\s)[a-z_][\w.-]*(?=:)/i,lookbehind:!0},boolean:/\b(?:false|true)\b/,operator:/\+/,punctuation:/[{};:]/}}return xE}var kE,f5;function Twe(){if(f5)return kE;f5=1,kE=e,e.displayName="zig",e.aliases=[];function e(t){(function(n){function r(u){return function(){return u}}var a=/\b(?:align|allowzero|and|anyframe|anytype|asm|async|await|break|cancel|catch|comptime|const|continue|defer|else|enum|errdefer|error|export|extern|fn|for|if|inline|linksection|nakedcc|noalias|nosuspend|null|or|orelse|packed|promise|pub|resume|return|stdcallcc|struct|suspend|switch|test|threadlocal|try|undefined|union|unreachable|usingnamespace|var|volatile|while)\b/,o="\\b(?!"+a.source+")(?!\\d)\\w+\\b",i=/align\s*\((?:[^()]|\([^()]*\))*\)/.source,s=/(?:\?|\bpromise->|(?:\[[^[\]]*\]|\*(?!\*)|\*\*)(?:\s*|\s*const\b|\s*volatile\b|\s*allowzero\b)*)/.source.replace(//g,r(i)),l=/(?:\bpromise\b|(?:\berror\.)?(?:\.)*(?!\s+))/.source.replace(//g,r(o)),c="(?!\\s)(?:!?\\s*(?:"+s+"\\s*)*"+l+")+";n.languages.zig={comment:[{pattern:/\/\/[/!].*/,alias:"doc-comment"},/\/{2}.*/],string:[{pattern:/(^|[^\\@])c?"(?:[^"\\\r\n]|\\.)*"/,lookbehind:!0,greedy:!0},{pattern:/([\r\n])([ \t]+c?\\{2}).*(?:(?:\r\n?|\n)\2.*)*/,lookbehind:!0,greedy:!0}],char:{pattern:/(^|[^\\])'(?:[^'\\\r\n]|[\uD800-\uDFFF]{2}|\\(?:.|x[a-fA-F\d]{2}|u\{[a-fA-F\d]{1,6}\}))'/,lookbehind:!0,greedy:!0},builtin:/\B@(?!\d)\w+(?=\s*\()/,label:{pattern:/(\b(?:break|continue)\s*:\s*)\w+\b|\b(?!\d)\w+\b(?=\s*:\s*(?:\{|while\b))/,lookbehind:!0},"class-name":[/\b(?!\d)\w+(?=\s*=\s*(?:(?:extern|packed)\s+)?(?:enum|struct|union)\s*[({])/,{pattern:RegExp(/(:\s*)(?=\s*(?:\s*)?[=;,)])|(?=\s*(?:\s*)?\{)/.source.replace(//g,r(c)).replace(//g,r(i))),lookbehind:!0,inside:null},{pattern:RegExp(/(\)\s*)(?=\s*(?:\s*)?;)/.source.replace(//g,r(c)).replace(//g,r(i))),lookbehind:!0,inside:null}],"builtin-type":{pattern:/\b(?:anyerror|bool|c_u?(?:int|long|longlong|short)|c_longdouble|c_void|comptime_(?:float|int)|f(?:16|32|64|128)|[iu](?:8|16|32|64|128|size)|noreturn|type|void)\b/,alias:"keyword"},keyword:a,function:/\b(?!\d)\w+(?=\s*\()/,number:/\b(?:0b[01]+|0o[0-7]+|0x[a-fA-F\d]+(?:\.[a-fA-F\d]*)?(?:[pP][+-]?[a-fA-F\d]+)?|\d+(?:\.\d*)?(?:[eE][+-]?\d+)?)\b/,boolean:/\b(?:false|true)\b/,operator:/\.[*?]|\.{2,3}|[-=]>|\*\*|\+\+|\|\||(?:<<|>>|[-+*]%|[-+*/%^&|<>!=])=?|[?~]/,punctuation:/[.:,;(){}[\]]/},n.languages.zig["class-name"].forEach(function(u){u.inside===null&&(u.inside=n.languages.zig)})})(t)}return kE}var I=Phe,Rwe=I;I.register(Whe());I.register(Khe());I.register(Yhe());I.register(Zhe());I.register(Xhe());I.register(Qhe());I.register(Jhe());I.register(ebe());I.register(tbe());I.register(nbe());I.register(rbe());I.register(abe());I.register(obe());I.register(ibe());I.register(sbe());I.register(lbe());I.register(cbe());I.register(ube());I.register(dbe());I.register(fbe());I.register(pbe());I.register(gbe());I.register(az());I.register(oz());I.register(mbe());I.register(hbe());I.register(bbe());I.register(ybe());I.register(vbe());I.register(Sbe());I.register(wbe());I.register(Ebe());I.register(xbe());I.register(kbe());I.register(Ws());I.register(Cbe());I.register(_be());I.register(Abe());I.register(Tbe());I.register(Rbe());I.register(Nbe());I.register(Ibe());I.register(Obe());I.register(Dbe());I.register(RA());I.register(Lbe());I.register(Ah());I.register(Mbe());I.register(Pbe());I.register($be());I.register(Fbe());I.register(jbe());I.register(zbe());I.register(Ube());I.register(Bbe());I.register(Hbe());I.register(Vbe());I.register(qbe());I.register(Gbe());I.register(Wbe());I.register(Kbe());I.register(Ybe());I.register(Zbe());I.register(Xbe());I.register(Qbe());I.register(Jbe());I.register(eye());I.register(tye());I.register(nye());I.register(rye());I.register(aye());I.register(oye());I.register(iye());I.register(sye());I.register(lye());I.register(cye());I.register(uye());I.register(dye());I.register(fye());I.register(pye());I.register(gye());I.register(mye());I.register(hye());I.register(bye());I.register(yye());I.register(vye());I.register(Sye());I.register(wye());I.register(Eye());I.register(xye());I.register(kye());I.register(Cye());I.register(_ye());I.register(Aye());I.register(NA());I.register(Tye());I.register(Rye());I.register(Nye());I.register(Iye());I.register(Oye());I.register(Dye());I.register(Lye());I.register(Mye());I.register(Pye());I.register($ye());I.register(Fye());I.register(jye());I.register(zye());I.register(Uye());I.register(Bye());I.register(Hye());I.register(Vye());I.register(IA());I.register(qye());I.register(Rh());I.register(Gye());I.register(Wye());I.register(Kye());I.register(Yye());I.register(Zye());I.register(Xye());I.register(Qye());I.register(DA());I.register(Jye());I.register(eve());I.register(tve());I.register(sz());I.register(nve());I.register(rve());I.register(ave());I.register(ove());I.register(ive());I.register(sve());I.register(lve());I.register(cve());I.register(uve());I.register(dve());I.register(fve());I.register(pve());I.register(gve());I.register(mve());I.register(hve());I.register(bve());I.register(iz());I.register(yve());I.register(vve());I.register(Sve());I.register(mr());I.register(wve());I.register(Eve());I.register(xve());I.register(kve());I.register(Cve());I.register(_ve());I.register(Ave());I.register(Tve());I.register(Rve());I.register(Nve());I.register(Ive());I.register(Ove());I.register(Dve());I.register(Lve());I.register(Mve());I.register(Pve());I.register($ve());I.register(Fve());I.register(jve());I.register(zve());I.register(Uve());I.register(Bve());I.register(Hve());I.register(Vve());I.register(qve());I.register(Gve());I.register(Wve());I.register(Kve());I.register(Yve());I.register(Zve());I.register(Xve());I.register(Qve());I.register(Nh());I.register(Jve());I.register(eSe());I.register(tSe());I.register(nSe());I.register(rSe());I.register(aSe());I.register(oSe());I.register(iSe());I.register(sSe());I.register(lSe());I.register(cSe());I.register(uSe());I.register(dSe());I.register(fSe());I.register(pSe());I.register(gSe());I.register(mSe());I.register(hSe());I.register(bSe());I.register(ySe());I.register(vSe());I.register(SSe());I.register(wSe());I.register(ESe());I.register(xSe());I.register(kSe());I.register(CSe());I.register(_Se());I.register(ASe());I.register(TSe());I.register(Th());I.register(RSe());I.register(NSe());I.register(ISe());I.register(OSe());I.register(LA());I.register(DSe());I.register(LSe());I.register(MSe());I.register(PSe());I.register($Se());I.register(FSe());I.register(jSe());I.register(zSe());I.register(USe());I.register(BSe());I.register(HSe());I.register(VSe());I.register(TA());I.register(qSe());I.register(GSe());I.register(WSe());I.register(KSe());I.register(YSe());I.register(ZSe());I.register(MA());I.register(XSe());I.register(QSe());I.register(JSe());I.register(ewe());I.register(twe());I.register(nwe());I.register(rwe());I.register(awe());I.register(lz());I.register(owe());I.register(OA());I.register(iwe());I.register(swe());I.register(lwe());I.register(cwe());I.register(uwe());I.register(dwe());I.register(cz());I.register(fwe());I.register(pwe());I.register(gwe());I.register(mwe());I.register(hwe());I.register(bwe());I.register(ywe());I.register(vwe());I.register(Swe());I.register(wwe());I.register(Ewe());I.register(xwe());I.register(kwe());I.register(Cwe());I.register(_we());I.register(uz());I.register(Awe());I.register(Twe());const Nwe=Tc(Rwe);var dz=_fe(Nwe,Ghe);dz.supportedLanguages=Afe;const Iwe=dz;var fz={},pz={exports:{}};(function(e){function t(n){return n&&n.__esModule?n:{default:n}}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports})(pz);var Owe=pz.exports,CE={},p5;function Dwe(){return p5||(p5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"black",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",maxHeight:"inherit",height:"inherit",padding:"0 1em",display:"block",overflow:"auto"},'pre[class*="language-"]':{color:"black",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",position:"relative",margin:".5em 0",overflow:"visible",padding:"1px",backgroundColor:"#fdfdfd",WebkitBoxSizing:"border-box",MozBoxSizing:"border-box",boxSizing:"border-box",marginBottom:"1em"},'pre[class*="language-"] > code':{position:"relative",zIndex:"1",borderLeft:"10px solid #358ccb",boxShadow:"-1px 0px 0px 0px #358ccb, 0px 0px 0px 1px #dfdfdf",backgroundColor:"#fdfdfd",backgroundImage:"linear-gradient(transparent 50%, rgba(69, 142, 209, 0.04) 50%)",backgroundSize:"3em 3em",backgroundOrigin:"content-box",backgroundAttachment:"local"},':not(pre) > code[class*="language-"]':{backgroundColor:"#fdfdfd",WebkitBoxSizing:"border-box",MozBoxSizing:"border-box",boxSizing:"border-box",marginBottom:"1em",position:"relative",padding:".2em",borderRadius:"0.3em",color:"#c92c2c",border:"1px solid rgba(0, 0, 0, 0.1)",display:"inline",whiteSpace:"normal"},'pre[class*="language-"]:before':{content:"''",display:"block",position:"absolute",bottom:"0.75em",left:"0.18em",width:"40%",height:"20%",maxHeight:"13em",boxShadow:"0px 13px 8px #979797",WebkitTransform:"rotate(-2deg)",MozTransform:"rotate(-2deg)",msTransform:"rotate(-2deg)",OTransform:"rotate(-2deg)",transform:"rotate(-2deg)"},'pre[class*="language-"]:after':{content:"''",display:"block",position:"absolute",bottom:"0.75em",left:"auto",width:"40%",height:"20%",maxHeight:"13em",boxShadow:"0px 13px 8px #979797",WebkitTransform:"rotate(2deg)",MozTransform:"rotate(2deg)",msTransform:"rotate(2deg)",OTransform:"rotate(2deg)",transform:"rotate(2deg)",right:"0.75em"},comment:{color:"#7D8B99"},"block-comment":{color:"#7D8B99"},prolog:{color:"#7D8B99"},doctype:{color:"#7D8B99"},cdata:{color:"#7D8B99"},punctuation:{color:"#5F6364"},property:{color:"#c92c2c"},tag:{color:"#c92c2c"},boolean:{color:"#c92c2c"},number:{color:"#c92c2c"},"function-name":{color:"#c92c2c"},constant:{color:"#c92c2c"},symbol:{color:"#c92c2c"},deleted:{color:"#c92c2c"},selector:{color:"#2f9c0a"},"attr-name":{color:"#2f9c0a"},string:{color:"#2f9c0a"},char:{color:"#2f9c0a"},function:{color:"#2f9c0a"},builtin:{color:"#2f9c0a"},inserted:{color:"#2f9c0a"},operator:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},entity:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)",cursor:"help"},url:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},variable:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},atrule:{color:"#1990b8"},"attr-value":{color:"#1990b8"},keyword:{color:"#1990b8"},"class-name":{color:"#1990b8"},regex:{color:"#e90"},important:{color:"#e90",fontWeight:"normal"},".language-css .token.string":{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},".style .token.string":{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},namespace:{Opacity:".7"},'pre[class*="language-"].line-numbers.line-numbers':{paddingLeft:"0"},'pre[class*="language-"].line-numbers.line-numbers code':{paddingLeft:"3.8em"},'pre[class*="language-"].line-numbers.line-numbers .line-numbers-rows':{left:"0"},'pre[class*="language-"][data-line]':{paddingTop:"0",paddingBottom:"0",paddingLeft:"0"},"pre[data-line] code":{position:"relative",paddingLeft:"4em"},"pre .line-highlight":{marginTop:"0"}};e.default=t}(CE)),CE}var _E={},g5;function Lwe(){return g5||(g5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"white",background:"none",textShadow:"0 -.1em .2em black",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"white",background:"hsl(30, 20%, 25%)",textShadow:"0 -.1em .2em black",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",border:".3em solid hsl(30, 20%, 40%)",borderRadius:".5em",boxShadow:"1px 1px .5em black inset"},':not(pre) > code[class*="language-"]':{background:"hsl(30, 20%, 25%)",padding:".15em .2em .05em",borderRadius:".3em",border:".13em solid hsl(30, 20%, 40%)",boxShadow:"1px 1px .3em -.1em black inset",whiteSpace:"normal"},comment:{color:"hsl(30, 20%, 50%)"},prolog:{color:"hsl(30, 20%, 50%)"},doctype:{color:"hsl(30, 20%, 50%)"},cdata:{color:"hsl(30, 20%, 50%)"},punctuation:{Opacity:".7"},namespace:{Opacity:".7"},property:{color:"hsl(350, 40%, 70%)"},tag:{color:"hsl(350, 40%, 70%)"},boolean:{color:"hsl(350, 40%, 70%)"},number:{color:"hsl(350, 40%, 70%)"},constant:{color:"hsl(350, 40%, 70%)"},symbol:{color:"hsl(350, 40%, 70%)"},selector:{color:"hsl(75, 70%, 60%)"},"attr-name":{color:"hsl(75, 70%, 60%)"},string:{color:"hsl(75, 70%, 60%)"},char:{color:"hsl(75, 70%, 60%)"},builtin:{color:"hsl(75, 70%, 60%)"},inserted:{color:"hsl(75, 70%, 60%)"},operator:{color:"hsl(40, 90%, 60%)"},entity:{color:"hsl(40, 90%, 60%)",cursor:"help"},url:{color:"hsl(40, 90%, 60%)"},".language-css .token.string":{color:"hsl(40, 90%, 60%)"},".style .token.string":{color:"hsl(40, 90%, 60%)"},variable:{color:"hsl(40, 90%, 60%)"},atrule:{color:"hsl(350, 40%, 70%)"},"attr-value":{color:"hsl(350, 40%, 70%)"},keyword:{color:"hsl(350, 40%, 70%)"},regex:{color:"#e90"},important:{color:"#e90",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},deleted:{color:"red"}};e.default=t}(_E)),_E}var AE={},m5;function Mwe(){return m5||(m5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"black",color:"white",boxShadow:"-.3em 0 0 .3em black, .3em 0 0 .3em black"},'pre[class*="language-"]':{fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:".4em .8em",margin:".5em 0",overflow:"auto",background:`url('data:image/svg+xml;charset=utf-8,%0D%0A%0D%0A%0D%0A<%2Fsvg>')`,backgroundSize:"1em 1em"},':not(pre) > code[class*="language-"]':{padding:".2em",borderRadius:".3em",boxShadow:"none",whiteSpace:"normal"},comment:{color:"#aaa"},prolog:{color:"#aaa"},doctype:{color:"#aaa"},cdata:{color:"#aaa"},punctuation:{color:"#999"},namespace:{Opacity:".7"},property:{color:"#0cf"},tag:{color:"#0cf"},boolean:{color:"#0cf"},number:{color:"#0cf"},constant:{color:"#0cf"},symbol:{color:"#0cf"},selector:{color:"yellow"},"attr-name":{color:"yellow"},string:{color:"yellow"},char:{color:"yellow"},builtin:{color:"yellow"},operator:{color:"yellowgreen"},entity:{color:"yellowgreen",cursor:"help"},url:{color:"yellowgreen"},".language-css .token.string":{color:"yellowgreen"},variable:{color:"yellowgreen"},inserted:{color:"yellowgreen"},atrule:{color:"deeppink"},"attr-value":{color:"deeppink"},keyword:{color:"deeppink"},regex:{color:"orange"},important:{color:"orange",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},deleted:{color:"red"},"pre.diff-highlight.diff-highlight > code .token.deleted:not(.prefix)":{backgroundColor:"rgba(255, 0, 0, .3)",display:"inline"},"pre > code.diff-highlight.diff-highlight .token.deleted:not(.prefix)":{backgroundColor:"rgba(255, 0, 0, .3)",display:"inline"},"pre.diff-highlight.diff-highlight > code .token.inserted:not(.prefix)":{backgroundColor:"rgba(0, 255, 128, .3)",display:"inline"},"pre > code.diff-highlight.diff-highlight .token.inserted:not(.prefix)":{backgroundColor:"rgba(0, 255, 128, .3)",display:"inline"}};e.default=t}(AE)),AE}var TE={},h5;function Pwe(){return h5||(h5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#f8f8f2",background:"none",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#f8f8f2",background:"#272822",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",borderRadius:"0.3em"},':not(pre) > code[class*="language-"]':{background:"#272822",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#8292a2"},prolog:{color:"#8292a2"},doctype:{color:"#8292a2"},cdata:{color:"#8292a2"},punctuation:{color:"#f8f8f2"},namespace:{Opacity:".7"},property:{color:"#f92672"},tag:{color:"#f92672"},constant:{color:"#f92672"},symbol:{color:"#f92672"},deleted:{color:"#f92672"},boolean:{color:"#ae81ff"},number:{color:"#ae81ff"},selector:{color:"#a6e22e"},"attr-name":{color:"#a6e22e"},string:{color:"#a6e22e"},char:{color:"#a6e22e"},builtin:{color:"#a6e22e"},inserted:{color:"#a6e22e"},operator:{color:"#f8f8f2"},entity:{color:"#f8f8f2",cursor:"help"},url:{color:"#f8f8f2"},".language-css .token.string":{color:"#f8f8f2"},".style .token.string":{color:"#f8f8f2"},variable:{color:"#f8f8f2"},atrule:{color:"#e6db74"},"attr-value":{color:"#e6db74"},function:{color:"#e6db74"},"class-name":{color:"#e6db74"},keyword:{color:"#66d9ef"},regex:{color:"#fd971f"},important:{color:"#fd971f",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(TE)),TE}var RE={},b5;function $we(){return b5||(b5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#657b83",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#657b83",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",borderRadius:"0.3em",backgroundColor:"#fdf6e3"},'pre[class*="language-"]::-moz-selection':{background:"#073642"},'pre[class*="language-"] ::-moz-selection':{background:"#073642"},'code[class*="language-"]::-moz-selection':{background:"#073642"},'code[class*="language-"] ::-moz-selection':{background:"#073642"},'pre[class*="language-"]::selection':{background:"#073642"},'pre[class*="language-"] ::selection':{background:"#073642"},'code[class*="language-"]::selection':{background:"#073642"},'code[class*="language-"] ::selection':{background:"#073642"},':not(pre) > code[class*="language-"]':{backgroundColor:"#fdf6e3",padding:".1em",borderRadius:".3em"},comment:{color:"#93a1a1"},prolog:{color:"#93a1a1"},doctype:{color:"#93a1a1"},cdata:{color:"#93a1a1"},punctuation:{color:"#586e75"},namespace:{Opacity:".7"},property:{color:"#268bd2"},tag:{color:"#268bd2"},boolean:{color:"#268bd2"},number:{color:"#268bd2"},constant:{color:"#268bd2"},symbol:{color:"#268bd2"},deleted:{color:"#268bd2"},selector:{color:"#2aa198"},"attr-name":{color:"#2aa198"},string:{color:"#2aa198"},char:{color:"#2aa198"},builtin:{color:"#2aa198"},url:{color:"#2aa198"},inserted:{color:"#2aa198"},entity:{color:"#657b83",background:"#eee8d5",cursor:"help"},atrule:{color:"#859900"},"attr-value":{color:"#859900"},keyword:{color:"#859900"},function:{color:"#b58900"},"class-name":{color:"#b58900"},regex:{color:"#cb4b16"},important:{color:"#cb4b16",fontWeight:"bold"},variable:{color:"#cb4b16"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(RE)),RE}var NE={},y5;function Fwe(){return y5||(y5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#ccc",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#ccc",background:"#2d2d2d",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto"},':not(pre) > code[class*="language-"]':{background:"#2d2d2d",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#999"},"block-comment":{color:"#999"},prolog:{color:"#999"},doctype:{color:"#999"},cdata:{color:"#999"},punctuation:{color:"#ccc"},tag:{color:"#e2777a"},"attr-name":{color:"#e2777a"},namespace:{color:"#e2777a"},deleted:{color:"#e2777a"},"function-name":{color:"#6196cc"},boolean:{color:"#f08d49"},number:{color:"#f08d49"},function:{color:"#f08d49"},property:{color:"#f8c555"},"class-name":{color:"#f8c555"},constant:{color:"#f8c555"},symbol:{color:"#f8c555"},selector:{color:"#cc99cd"},important:{color:"#cc99cd",fontWeight:"bold"},atrule:{color:"#cc99cd"},keyword:{color:"#cc99cd"},builtin:{color:"#cc99cd"},string:{color:"#7ec699"},char:{color:"#7ec699"},"attr-value":{color:"#7ec699"},regex:{color:"#7ec699"},variable:{color:"#7ec699"},operator:{color:"#67cdcc"},entity:{color:"#67cdcc",cursor:"help"},url:{color:"#67cdcc"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},inserted:{color:"green"}};e.default=t}(NE)),NE}var IE={},v5;function jwe(){return v5||(v5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"white",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",textShadow:"0 -.1em .2em black",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"white",background:"hsl(0, 0%, 8%)",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",textShadow:"0 -.1em .2em black",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",borderRadius:".5em",border:".3em solid hsl(0, 0%, 33%)",boxShadow:"1px 1px .5em black inset",margin:".5em 0",overflow:"auto",padding:"1em"},':not(pre) > code[class*="language-"]':{background:"hsl(0, 0%, 8%)",borderRadius:".3em",border:".13em solid hsl(0, 0%, 33%)",boxShadow:"1px 1px .3em -.1em black inset",padding:".15em .2em .05em",whiteSpace:"normal"},'pre[class*="language-"]::-moz-selection':{background:"hsla(0, 0%, 93%, 0.15)",textShadow:"none"},'pre[class*="language-"]::selection':{background:"hsla(0, 0%, 93%, 0.15)",textShadow:"none"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},'code[class*="language-"]::selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},'code[class*="language-"] ::selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},comment:{color:"hsl(0, 0%, 47%)"},prolog:{color:"hsl(0, 0%, 47%)"},doctype:{color:"hsl(0, 0%, 47%)"},cdata:{color:"hsl(0, 0%, 47%)"},punctuation:{Opacity:".7"},namespace:{Opacity:".7"},tag:{color:"hsl(14, 58%, 55%)"},boolean:{color:"hsl(14, 58%, 55%)"},number:{color:"hsl(14, 58%, 55%)"},deleted:{color:"hsl(14, 58%, 55%)"},keyword:{color:"hsl(53, 89%, 79%)"},property:{color:"hsl(53, 89%, 79%)"},selector:{color:"hsl(53, 89%, 79%)"},constant:{color:"hsl(53, 89%, 79%)"},symbol:{color:"hsl(53, 89%, 79%)"},builtin:{color:"hsl(53, 89%, 79%)"},"attr-name":{color:"hsl(76, 21%, 52%)"},"attr-value":{color:"hsl(76, 21%, 52%)"},string:{color:"hsl(76, 21%, 52%)"},char:{color:"hsl(76, 21%, 52%)"},operator:{color:"hsl(76, 21%, 52%)"},entity:{color:"hsl(76, 21%, 52%)",cursor:"help"},url:{color:"hsl(76, 21%, 52%)"},".language-css .token.string":{color:"hsl(76, 21%, 52%)"},".style .token.string":{color:"hsl(76, 21%, 52%)"},variable:{color:"hsl(76, 21%, 52%)"},inserted:{color:"hsl(76, 21%, 52%)"},atrule:{color:"hsl(218, 22%, 55%)"},regex:{color:"hsl(42, 75%, 65%)"},important:{color:"hsl(42, 75%, 65%)",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},".language-markup .token.tag":{color:"hsl(33, 33%, 52%)"},".language-markup .token.attr-name":{color:"hsl(33, 33%, 52%)"},".language-markup .token.punctuation":{color:"hsl(33, 33%, 52%)"},"":{position:"relative",zIndex:"1"},".line-highlight.line-highlight":{background:"linear-gradient(to right, hsla(0, 0%, 33%, .1) 70%, hsla(0, 0%, 33%, 0))",borderBottom:"1px dashed hsl(0, 0%, 33%)",borderTop:"1px dashed hsl(0, 0%, 33%)",marginTop:"0.75em",zIndex:"0"},".line-highlight.line-highlight:before":{backgroundColor:"hsl(215, 15%, 59%)",color:"hsl(24, 20%, 95%)"},".line-highlight.line-highlight[data-end]:after":{backgroundColor:"hsl(215, 15%, 59%)",color:"hsl(24, 20%, 95%)"}};e.default=t}(IE)),IE}var OE={},S5;function zwe(){return S5||(S5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"black",background:"none",textShadow:"0 1px white",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"black",background:"#f5f2f0",textShadow:"0 1px white",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#b3d4fc"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#b3d4fc"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#b3d4fc"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#b3d4fc"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#b3d4fc"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#b3d4fc"},'code[class*="language-"]::selection':{textShadow:"none",background:"#b3d4fc"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#b3d4fc"},':not(pre) > code[class*="language-"]':{background:"#f5f2f0",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"slategray"},prolog:{color:"slategray"},doctype:{color:"slategray"},cdata:{color:"slategray"},punctuation:{color:"#999"},namespace:{Opacity:".7"},property:{color:"#905"},tag:{color:"#905"},boolean:{color:"#905"},number:{color:"#905"},constant:{color:"#905"},symbol:{color:"#905"},deleted:{color:"#905"},selector:{color:"#690"},"attr-name":{color:"#690"},string:{color:"#690"},char:{color:"#690"},builtin:{color:"#690"},inserted:{color:"#690"},operator:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},entity:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)",cursor:"help"},url:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},".language-css .token.string":{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},".style .token.string":{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},atrule:{color:"#07a"},"attr-value":{color:"#07a"},keyword:{color:"#07a"},function:{color:"#DD4A68"},"class-name":{color:"#DD4A68"},regex:{color:"#e90"},important:{color:"#e90",fontWeight:"bold"},variable:{color:"#e90"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(OE)),OE}var DE={},w5;function Uwe(){return w5||(w5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#f8f8f2",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#f8f8f2",background:"#2b2b2b",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto",borderRadius:"0.3em"},':not(pre) > code[class*="language-"]':{background:"#2b2b2b",padding:"0.1em",borderRadius:"0.3em",whiteSpace:"normal"},comment:{color:"#d4d0ab"},prolog:{color:"#d4d0ab"},doctype:{color:"#d4d0ab"},cdata:{color:"#d4d0ab"},punctuation:{color:"#fefefe"},property:{color:"#ffa07a"},tag:{color:"#ffa07a"},constant:{color:"#ffa07a"},symbol:{color:"#ffa07a"},deleted:{color:"#ffa07a"},boolean:{color:"#00e0e0"},number:{color:"#00e0e0"},selector:{color:"#abe338"},"attr-name":{color:"#abe338"},string:{color:"#abe338"},char:{color:"#abe338"},builtin:{color:"#abe338"},inserted:{color:"#abe338"},operator:{color:"#00e0e0"},entity:{color:"#00e0e0",cursor:"help"},url:{color:"#00e0e0"},".language-css .token.string":{color:"#00e0e0"},".style .token.string":{color:"#00e0e0"},variable:{color:"#00e0e0"},atrule:{color:"#ffd700"},"attr-value":{color:"#ffd700"},function:{color:"#ffd700"},keyword:{color:"#00e0e0"},regex:{color:"#ffd700"},important:{color:"#ffd700",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(DE)),DE}var LE={},E5;function Bwe(){return E5||(E5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#c5c8c6",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Inconsolata, Monaco, Consolas, 'Courier New', Courier, monospace",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#c5c8c6",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Inconsolata, Monaco, Consolas, 'Courier New', Courier, monospace",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",borderRadius:"0.3em",background:"#1d1f21"},':not(pre) > code[class*="language-"]':{background:"#1d1f21",padding:".1em",borderRadius:".3em"},comment:{color:"#7C7C7C"},prolog:{color:"#7C7C7C"},doctype:{color:"#7C7C7C"},cdata:{color:"#7C7C7C"},punctuation:{color:"#c5c8c6"},".namespace":{Opacity:".7"},property:{color:"#96CBFE"},keyword:{color:"#96CBFE"},tag:{color:"#96CBFE"},"class-name":{color:"#FFFFB6",textDecoration:"underline"},boolean:{color:"#99CC99"},constant:{color:"#99CC99"},symbol:{color:"#f92672"},deleted:{color:"#f92672"},number:{color:"#FF73FD"},selector:{color:"#A8FF60"},"attr-name":{color:"#A8FF60"},string:{color:"#A8FF60"},char:{color:"#A8FF60"},builtin:{color:"#A8FF60"},inserted:{color:"#A8FF60"},variable:{color:"#C6C5FE"},operator:{color:"#EDEDED"},entity:{color:"#FFFFB6",cursor:"help"},url:{color:"#96CBFE"},".language-css .token.string":{color:"#87C38A"},".style .token.string":{color:"#87C38A"},atrule:{color:"#F9EE98"},"attr-value":{color:"#F9EE98"},function:{color:"#DAD085"},regex:{color:"#E9C062"},important:{color:"#fd971f",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(LE)),LE}var ME={},x5;function Hwe(){return x5||(x5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#f5f7ff",color:"#5e6687"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#f5f7ff",color:"#5e6687",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#dfe2f1"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#dfe2f1"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#dfe2f1"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#dfe2f1"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#dfe2f1"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#dfe2f1"},'code[class*="language-"]::selection':{textShadow:"none",background:"#dfe2f1"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#dfe2f1"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#898ea4"},prolog:{color:"#898ea4"},doctype:{color:"#898ea4"},cdata:{color:"#898ea4"},punctuation:{color:"#5e6687"},namespace:{Opacity:".7"},operator:{color:"#c76b29"},boolean:{color:"#c76b29"},number:{color:"#c76b29"},property:{color:"#c08b30"},tag:{color:"#3d8fd1"},string:{color:"#22a2c9"},selector:{color:"#6679cc"},"attr-name":{color:"#c76b29"},entity:{color:"#22a2c9",cursor:"help"},url:{color:"#22a2c9"},".language-css .token.string":{color:"#22a2c9"},".style .token.string":{color:"#22a2c9"},"attr-value":{color:"#ac9739"},keyword:{color:"#ac9739"},control:{color:"#ac9739"},directive:{color:"#ac9739"},unit:{color:"#ac9739"},statement:{color:"#22a2c9"},regex:{color:"#22a2c9"},atrule:{color:"#22a2c9"},placeholder:{color:"#3d8fd1"},variable:{color:"#3d8fd1"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #202746",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#c94922"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:"0.4em solid #c94922",OutlineOffset:".4em"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"#dfe2f1"},".line-numbers .line-numbers-rows > span:before":{color:"#979db4"},".line-highlight.line-highlight":{background:"linear-gradient(to right, rgba(107, 115, 148, 0.2) 70%, rgba(107, 115, 148, 0))"}};e.default=t}(ME)),ME}var PE={},k5;function Vwe(){return k5||(k5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#fff",textShadow:"0 1px 1px #000",fontFamily:'Menlo, Monaco, "Courier New", monospace',direction:"ltr",textAlign:"left",wordSpacing:"normal",whiteSpace:"pre",wordWrap:"normal",lineHeight:"1.4",background:"none",border:"0",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#fff",textShadow:"0 1px 1px #000",fontFamily:'Menlo, Monaco, "Courier New", monospace',direction:"ltr",textAlign:"left",wordSpacing:"normal",whiteSpace:"pre",wordWrap:"normal",lineHeight:"1.4",background:"#222",border:"0",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"15px",margin:"1em 0",overflow:"auto",MozBorderRadius:"8px",WebkitBorderRadius:"8px",borderRadius:"8px"},'pre[class*="language-"] code':{float:"left",padding:"0 15px 0 0"},':not(pre) > code[class*="language-"]':{background:"#222",padding:"5px 10px",lineHeight:"1",MozBorderRadius:"3px",WebkitBorderRadius:"3px",borderRadius:"3px"},comment:{color:"#797979"},prolog:{color:"#797979"},doctype:{color:"#797979"},cdata:{color:"#797979"},selector:{color:"#fff"},operator:{color:"#fff"},punctuation:{color:"#fff"},namespace:{Opacity:".7"},tag:{color:"#ffd893"},boolean:{color:"#ffd893"},atrule:{color:"#B0C975"},"attr-value":{color:"#B0C975"},hex:{color:"#B0C975"},string:{color:"#B0C975"},property:{color:"#c27628"},entity:{color:"#c27628",cursor:"help"},url:{color:"#c27628"},"attr-name":{color:"#c27628"},keyword:{color:"#c27628"},regex:{color:"#9B71C6"},function:{color:"#e5a638"},constant:{color:"#e5a638"},variable:{color:"#fdfba8"},number:{color:"#8799B0"},important:{color:"#E45734"},deliminator:{color:"#E45734"},".line-highlight.line-highlight":{background:"rgba(255, 255, 255, .2)"},".line-highlight.line-highlight:before":{top:".3em",backgroundColor:"rgba(255, 255, 255, .3)",color:"#fff",MozBorderRadius:"8px",WebkitBorderRadius:"8px",borderRadius:"8px"},".line-highlight.line-highlight[data-end]:after":{top:".3em",backgroundColor:"rgba(255, 255, 255, .3)",color:"#fff",MozBorderRadius:"8px",WebkitBorderRadius:"8px",borderRadius:"8px"},".line-numbers .line-numbers-rows > span":{borderRight:"3px #d9d336 solid"}};e.default=t}(PE)),PE}var $E={},C5;function qwe(){return C5||(C5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#111b27",background:"none",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#111b27",background:"#e3eaf2",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto"},'pre[class*="language-"]::-moz-selection':{background:"#8da1b9"},'pre[class*="language-"] ::-moz-selection':{background:"#8da1b9"},'code[class*="language-"]::-moz-selection':{background:"#8da1b9"},'code[class*="language-"] ::-moz-selection':{background:"#8da1b9"},'pre[class*="language-"]::selection':{background:"#8da1b9"},'pre[class*="language-"] ::selection':{background:"#8da1b9"},'code[class*="language-"]::selection':{background:"#8da1b9"},'code[class*="language-"] ::selection':{background:"#8da1b9"},':not(pre) > code[class*="language-"]':{background:"#e3eaf2",padding:"0.1em 0.3em",borderRadius:"0.3em",whiteSpace:"normal"},comment:{color:"#3c526d"},prolog:{color:"#3c526d"},doctype:{color:"#3c526d"},cdata:{color:"#3c526d"},punctuation:{color:"#111b27"},"delimiter.important":{color:"#006d6d",fontWeight:"inherit"},"selector.parent":{color:"#006d6d"},tag:{color:"#006d6d"},"tag.punctuation":{color:"#006d6d"},"attr-name":{color:"#755f00"},boolean:{color:"#755f00"},"boolean.important":{color:"#755f00"},number:{color:"#755f00"},constant:{color:"#755f00"},"selector.attribute":{color:"#755f00"},"class-name":{color:"#005a8e"},key:{color:"#005a8e"},parameter:{color:"#005a8e"},property:{color:"#005a8e"},"property-access":{color:"#005a8e"},variable:{color:"#005a8e"},"attr-value":{color:"#116b00"},inserted:{color:"#116b00"},color:{color:"#116b00"},"selector.value":{color:"#116b00"},string:{color:"#116b00"},"string.url-link":{color:"#116b00"},builtin:{color:"#af00af"},"keyword-array":{color:"#af00af"},package:{color:"#af00af"},regex:{color:"#af00af"},function:{color:"#7c00aa"},"selector.class":{color:"#7c00aa"},"selector.id":{color:"#7c00aa"},"atrule.rule":{color:"#a04900"},combinator:{color:"#a04900"},keyword:{color:"#a04900"},operator:{color:"#a04900"},"pseudo-class":{color:"#a04900"},"pseudo-element":{color:"#a04900"},selector:{color:"#a04900"},unit:{color:"#a04900"},deleted:{color:"#c22f2e"},important:{color:"#c22f2e",fontWeight:"bold"},"keyword-this":{color:"#005a8e",fontWeight:"bold"},this:{color:"#005a8e",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},entity:{cursor:"help"},".language-markdown .token.title":{color:"#005a8e",fontWeight:"bold"},".language-markdown .token.title .token.punctuation":{color:"#005a8e",fontWeight:"bold"},".language-markdown .token.blockquote.punctuation":{color:"#af00af"},".language-markdown .token.code":{color:"#006d6d"},".language-markdown .token.hr.punctuation":{color:"#005a8e"},".language-markdown .token.url > .token.content":{color:"#116b00"},".language-markdown .token.url-link":{color:"#755f00"},".language-markdown .token.list.punctuation":{color:"#af00af"},".language-markdown .token.table-header":{color:"#111b27"},".language-json .token.operator":{color:"#111b27"},".language-scss .token.variable":{color:"#006d6d"},"token.tab:not(:empty):before":{color:"#3c526d"},"token.cr:before":{color:"#3c526d"},"token.lf:before":{color:"#3c526d"},"token.space:before":{color:"#3c526d"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a":{color:"#e3eaf2",background:"#005a8e"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button":{color:"#e3eaf2",background:"#005a8e"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover":{color:"#e3eaf2",background:"#005a8eda",textDecoration:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus":{color:"#e3eaf2",background:"#005a8eda",textDecoration:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover":{color:"#e3eaf2",background:"#005a8eda",textDecoration:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus":{color:"#e3eaf2",background:"#005a8eda",textDecoration:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span":{color:"#e3eaf2",background:"#3c526d"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover":{color:"#e3eaf2",background:"#3c526d"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus":{color:"#e3eaf2",background:"#3c526d"},".line-highlight.line-highlight":{background:"linear-gradient(to right, #8da1b92f 70%, #8da1b925)"},".line-highlight.line-highlight:before":{backgroundColor:"#3c526d",color:"#e3eaf2",boxShadow:"0 1px #8da1b9"},".line-highlight.line-highlight[data-end]:after":{backgroundColor:"#3c526d",color:"#e3eaf2",boxShadow:"0 1px #8da1b9"},"pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before":{backgroundColor:"#3c526d1f"},".line-numbers.line-numbers .line-numbers-rows":{borderRight:"1px solid #8da1b97a",background:"#d0dae77a"},".line-numbers .line-numbers-rows > span:before":{color:"#3c526dda"},".rainbow-braces .token.token.punctuation.brace-level-1":{color:"#755f00"},".rainbow-braces .token.token.punctuation.brace-level-5":{color:"#755f00"},".rainbow-braces .token.token.punctuation.brace-level-9":{color:"#755f00"},".rainbow-braces .token.token.punctuation.brace-level-2":{color:"#af00af"},".rainbow-braces .token.token.punctuation.brace-level-6":{color:"#af00af"},".rainbow-braces .token.token.punctuation.brace-level-10":{color:"#af00af"},".rainbow-braces .token.token.punctuation.brace-level-3":{color:"#005a8e"},".rainbow-braces .token.token.punctuation.brace-level-7":{color:"#005a8e"},".rainbow-braces .token.token.punctuation.brace-level-11":{color:"#005a8e"},".rainbow-braces .token.token.punctuation.brace-level-4":{color:"#7c00aa"},".rainbow-braces .token.token.punctuation.brace-level-8":{color:"#7c00aa"},".rainbow-braces .token.token.punctuation.brace-level-12":{color:"#7c00aa"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)":{backgroundColor:"#c22f2e1f"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)":{backgroundColor:"#c22f2e1f"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)":{backgroundColor:"#116b001f"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)":{backgroundColor:"#116b001f"},".command-line .command-line-prompt":{borderRight:"1px solid #8da1b97a"},".command-line .command-line-prompt > span:before":{color:"#3c526dda"}};e.default=t}($E)),$E}var FE={},_5;function Gwe(){return _5||(_5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#e3eaf2",background:"none",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#e3eaf2",background:"#111b27",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto"},'pre[class*="language-"]::-moz-selection':{background:"#3c526d"},'pre[class*="language-"] ::-moz-selection':{background:"#3c526d"},'code[class*="language-"]::-moz-selection':{background:"#3c526d"},'code[class*="language-"] ::-moz-selection':{background:"#3c526d"},'pre[class*="language-"]::selection':{background:"#3c526d"},'pre[class*="language-"] ::selection':{background:"#3c526d"},'code[class*="language-"]::selection':{background:"#3c526d"},'code[class*="language-"] ::selection':{background:"#3c526d"},':not(pre) > code[class*="language-"]':{background:"#111b27",padding:"0.1em 0.3em",borderRadius:"0.3em",whiteSpace:"normal"},comment:{color:"#8da1b9"},prolog:{color:"#8da1b9"},doctype:{color:"#8da1b9"},cdata:{color:"#8da1b9"},punctuation:{color:"#e3eaf2"},"delimiter.important":{color:"#66cccc",fontWeight:"inherit"},"selector.parent":{color:"#66cccc"},tag:{color:"#66cccc"},"tag.punctuation":{color:"#66cccc"},"attr-name":{color:"#e6d37a"},boolean:{color:"#e6d37a"},"boolean.important":{color:"#e6d37a"},number:{color:"#e6d37a"},constant:{color:"#e6d37a"},"selector.attribute":{color:"#e6d37a"},"class-name":{color:"#6cb8e6"},key:{color:"#6cb8e6"},parameter:{color:"#6cb8e6"},property:{color:"#6cb8e6"},"property-access":{color:"#6cb8e6"},variable:{color:"#6cb8e6"},"attr-value":{color:"#91d076"},inserted:{color:"#91d076"},color:{color:"#91d076"},"selector.value":{color:"#91d076"},string:{color:"#91d076"},"string.url-link":{color:"#91d076"},builtin:{color:"#f4adf4"},"keyword-array":{color:"#f4adf4"},package:{color:"#f4adf4"},regex:{color:"#f4adf4"},function:{color:"#c699e3"},"selector.class":{color:"#c699e3"},"selector.id":{color:"#c699e3"},"atrule.rule":{color:"#e9ae7e"},combinator:{color:"#e9ae7e"},keyword:{color:"#e9ae7e"},operator:{color:"#e9ae7e"},"pseudo-class":{color:"#e9ae7e"},"pseudo-element":{color:"#e9ae7e"},selector:{color:"#e9ae7e"},unit:{color:"#e9ae7e"},deleted:{color:"#cd6660"},important:{color:"#cd6660",fontWeight:"bold"},"keyword-this":{color:"#6cb8e6",fontWeight:"bold"},this:{color:"#6cb8e6",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},entity:{cursor:"help"},".language-markdown .token.title":{color:"#6cb8e6",fontWeight:"bold"},".language-markdown .token.title .token.punctuation":{color:"#6cb8e6",fontWeight:"bold"},".language-markdown .token.blockquote.punctuation":{color:"#f4adf4"},".language-markdown .token.code":{color:"#66cccc"},".language-markdown .token.hr.punctuation":{color:"#6cb8e6"},".language-markdown .token.url .token.content":{color:"#91d076"},".language-markdown .token.url-link":{color:"#e6d37a"},".language-markdown .token.list.punctuation":{color:"#f4adf4"},".language-markdown .token.table-header":{color:"#e3eaf2"},".language-json .token.operator":{color:"#e3eaf2"},".language-scss .token.variable":{color:"#66cccc"},"token.tab:not(:empty):before":{color:"#8da1b9"},"token.cr:before":{color:"#8da1b9"},"token.lf:before":{color:"#8da1b9"},"token.space:before":{color:"#8da1b9"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a":{color:"#111b27",background:"#6cb8e6"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button":{color:"#111b27",background:"#6cb8e6"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover":{color:"#111b27",background:"#6cb8e6da",textDecoration:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus":{color:"#111b27",background:"#6cb8e6da",textDecoration:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover":{color:"#111b27",background:"#6cb8e6da",textDecoration:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus":{color:"#111b27",background:"#6cb8e6da",textDecoration:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span":{color:"#111b27",background:"#8da1b9"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover":{color:"#111b27",background:"#8da1b9"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus":{color:"#111b27",background:"#8da1b9"},".line-highlight.line-highlight":{background:"linear-gradient(to right, #3c526d5f 70%, #3c526d55)"},".line-highlight.line-highlight:before":{backgroundColor:"#8da1b9",color:"#111b27",boxShadow:"0 1px #3c526d"},".line-highlight.line-highlight[data-end]:after":{backgroundColor:"#8da1b9",color:"#111b27",boxShadow:"0 1px #3c526d"},"pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before":{backgroundColor:"#8da1b918"},".line-numbers.line-numbers .line-numbers-rows":{borderRight:"1px solid #0b121b",background:"#0b121b7a"},".line-numbers .line-numbers-rows > span:before":{color:"#8da1b9da"},".rainbow-braces .token.token.punctuation.brace-level-1":{color:"#e6d37a"},".rainbow-braces .token.token.punctuation.brace-level-5":{color:"#e6d37a"},".rainbow-braces .token.token.punctuation.brace-level-9":{color:"#e6d37a"},".rainbow-braces .token.token.punctuation.brace-level-2":{color:"#f4adf4"},".rainbow-braces .token.token.punctuation.brace-level-6":{color:"#f4adf4"},".rainbow-braces .token.token.punctuation.brace-level-10":{color:"#f4adf4"},".rainbow-braces .token.token.punctuation.brace-level-3":{color:"#6cb8e6"},".rainbow-braces .token.token.punctuation.brace-level-7":{color:"#6cb8e6"},".rainbow-braces .token.token.punctuation.brace-level-11":{color:"#6cb8e6"},".rainbow-braces .token.token.punctuation.brace-level-4":{color:"#c699e3"},".rainbow-braces .token.token.punctuation.brace-level-8":{color:"#c699e3"},".rainbow-braces .token.token.punctuation.brace-level-12":{color:"#c699e3"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)":{backgroundColor:"#cd66601f"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)":{backgroundColor:"#cd66601f"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)":{backgroundColor:"#91d0761f"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)":{backgroundColor:"#91d0761f"},".command-line .command-line-prompt":{borderRight:"1px solid #0b121b"},".command-line .command-line-prompt > span:before":{color:"#8da1b9da"}};e.default=t}(FE)),FE}var jE={},A5;function Wwe(){return A5||(A5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"black",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"black",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",position:"relative",borderLeft:"10px solid #358ccb",boxShadow:"-1px 0 0 0 #358ccb, 0 0 0 1px #dfdfdf",backgroundColor:"#fdfdfd",backgroundImage:"linear-gradient(transparent 50%, rgba(69, 142, 209, 0.04) 50%)",backgroundSize:"3em 3em",backgroundOrigin:"content-box",backgroundAttachment:"local",margin:".5em 0",padding:"0 1em"},'pre[class*="language-"] > code':{display:"block"},':not(pre) > code[class*="language-"]':{position:"relative",padding:".2em",borderRadius:"0.3em",color:"#c92c2c",border:"1px solid rgba(0, 0, 0, 0.1)",display:"inline",whiteSpace:"normal",backgroundColor:"#fdfdfd",WebkitBoxSizing:"border-box",MozBoxSizing:"border-box",boxSizing:"border-box"},comment:{color:"#7D8B99"},"block-comment":{color:"#7D8B99"},prolog:{color:"#7D8B99"},doctype:{color:"#7D8B99"},cdata:{color:"#7D8B99"},punctuation:{color:"#5F6364"},property:{color:"#c92c2c"},tag:{color:"#c92c2c"},boolean:{color:"#c92c2c"},number:{color:"#c92c2c"},"function-name":{color:"#c92c2c"},constant:{color:"#c92c2c"},symbol:{color:"#c92c2c"},deleted:{color:"#c92c2c"},selector:{color:"#2f9c0a"},"attr-name":{color:"#2f9c0a"},string:{color:"#2f9c0a"},char:{color:"#2f9c0a"},function:{color:"#2f9c0a"},builtin:{color:"#2f9c0a"},inserted:{color:"#2f9c0a"},operator:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},entity:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)",cursor:"help"},url:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},variable:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},atrule:{color:"#1990b8"},"attr-value":{color:"#1990b8"},keyword:{color:"#1990b8"},"class-name":{color:"#1990b8"},regex:{color:"#e90"},important:{color:"#e90",fontWeight:"normal"},".language-css .token.string":{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},".style .token.string":{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},namespace:{Opacity:".7"}};e.default=t}(jE)),jE}var zE={},T5;function Kwe(){return T5||(T5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#a9b7c6",fontFamily:"Consolas, Monaco, 'Andale Mono', monospace",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#a9b7c6",fontFamily:"Consolas, Monaco, 'Andale Mono', monospace",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",background:"#2b2b2b"},'pre[class*="language-"]::-moz-selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'pre[class*="language-"] ::-moz-selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'code[class*="language-"]::-moz-selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'code[class*="language-"] ::-moz-selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'pre[class*="language-"]::selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'pre[class*="language-"] ::selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'code[class*="language-"]::selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'code[class*="language-"] ::selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},':not(pre) > code[class*="language-"]':{background:"#2b2b2b",padding:".1em",borderRadius:".3em"},comment:{color:"#808080"},prolog:{color:"#808080"},cdata:{color:"#808080"},delimiter:{color:"#cc7832"},boolean:{color:"#cc7832"},keyword:{color:"#cc7832"},selector:{color:"#cc7832"},important:{color:"#cc7832"},atrule:{color:"#cc7832"},operator:{color:"#a9b7c6"},punctuation:{color:"#a9b7c6"},"attr-name":{color:"#a9b7c6"},tag:{color:"#e8bf6a"},"tag.punctuation":{color:"#e8bf6a"},doctype:{color:"#e8bf6a"},builtin:{color:"#e8bf6a"},entity:{color:"#6897bb"},number:{color:"#6897bb"},symbol:{color:"#6897bb"},property:{color:"#9876aa"},constant:{color:"#9876aa"},variable:{color:"#9876aa"},string:{color:"#6a8759"},char:{color:"#6a8759"},"attr-value":{color:"#a5c261"},"attr-value.punctuation":{color:"#a5c261"},"attr-value.punctuation:first-child":{color:"#a9b7c6"},url:{color:"#287bde",textDecoration:"underline"},function:{color:"#ffc66d"},regex:{background:"#364135"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},inserted:{background:"#294436"},deleted:{background:"#484a4a"},"code.language-css .token.property":{color:"#a9b7c6"},"code.language-css .token.property + .token.punctuation":{color:"#a9b7c6"},"code.language-css .token.id":{color:"#ffc66d"},"code.language-css .token.selector > .token.class":{color:"#ffc66d"},"code.language-css .token.selector > .token.attribute":{color:"#ffc66d"},"code.language-css .token.selector > .token.pseudo-class":{color:"#ffc66d"},"code.language-css .token.selector > .token.pseudo-element":{color:"#ffc66d"}};e.default=t}(zE)),zE}var UE={},R5;function Ywe(){return R5||(R5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#f8f8f2",background:"none",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#f8f8f2",background:"#282a36",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",borderRadius:"0.3em"},':not(pre) > code[class*="language-"]':{background:"#282a36",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#6272a4"},prolog:{color:"#6272a4"},doctype:{color:"#6272a4"},cdata:{color:"#6272a4"},punctuation:{color:"#f8f8f2"},".namespace":{Opacity:".7"},property:{color:"#ff79c6"},tag:{color:"#ff79c6"},constant:{color:"#ff79c6"},symbol:{color:"#ff79c6"},deleted:{color:"#ff79c6"},boolean:{color:"#bd93f9"},number:{color:"#bd93f9"},selector:{color:"#50fa7b"},"attr-name":{color:"#50fa7b"},string:{color:"#50fa7b"},char:{color:"#50fa7b"},builtin:{color:"#50fa7b"},inserted:{color:"#50fa7b"},operator:{color:"#f8f8f2"},entity:{color:"#f8f8f2",cursor:"help"},url:{color:"#f8f8f2"},".language-css .token.string":{color:"#f8f8f2"},".style .token.string":{color:"#f8f8f2"},variable:{color:"#f8f8f2"},atrule:{color:"#f1fa8c"},"attr-value":{color:"#f1fa8c"},function:{color:"#f1fa8c"},"class-name":{color:"#f1fa8c"},keyword:{color:"#8be9fd"},regex:{color:"#ffb86c"},important:{color:"#ffb86c",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(UE)),UE}var BE={},N5;function Zwe(){return N5||(N5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#2a2734",color:"#9a86fd"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#2a2734",color:"#9a86fd",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#6a51e6"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#6a51e6"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#6a51e6"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#6a51e6"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#6a51e6"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#6a51e6"},'code[class*="language-"]::selection':{textShadow:"none",background:"#6a51e6"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#6a51e6"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#6c6783"},prolog:{color:"#6c6783"},doctype:{color:"#6c6783"},cdata:{color:"#6c6783"},punctuation:{color:"#6c6783"},namespace:{Opacity:".7"},tag:{color:"#e09142"},operator:{color:"#e09142"},number:{color:"#e09142"},property:{color:"#9a86fd"},function:{color:"#9a86fd"},"tag-id":{color:"#eeebff"},selector:{color:"#eeebff"},"atrule-id":{color:"#eeebff"},"code.language-javascript":{color:"#c4b9fe"},"attr-name":{color:"#c4b9fe"},"code.language-css":{color:"#ffcc99"},"code.language-scss":{color:"#ffcc99"},boolean:{color:"#ffcc99"},string:{color:"#ffcc99"},entity:{color:"#ffcc99",cursor:"help"},url:{color:"#ffcc99"},".language-css .token.string":{color:"#ffcc99"},".language-scss .token.string":{color:"#ffcc99"},".style .token.string":{color:"#ffcc99"},"attr-value":{color:"#ffcc99"},keyword:{color:"#ffcc99"},control:{color:"#ffcc99"},directive:{color:"#ffcc99"},unit:{color:"#ffcc99"},statement:{color:"#ffcc99"},regex:{color:"#ffcc99"},atrule:{color:"#ffcc99"},placeholder:{color:"#ffcc99"},variable:{color:"#ffcc99"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #eeebff",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#c4b9fe"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #8a75f5",OutlineOffset:".4em"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"#2c2937"},".line-numbers .line-numbers-rows > span:before":{color:"#3c3949"},".line-highlight.line-highlight":{background:"linear-gradient(to right, rgba(224, 145, 66, 0.2) 70%, rgba(224, 145, 66, 0))"}};e.default=t}(BE)),BE}var HE={},I5;function Xwe(){return I5||(I5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#322d29",color:"#88786d"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#322d29",color:"#88786d",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#6f5849"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#6f5849"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#6f5849"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#6f5849"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#6f5849"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#6f5849"},'code[class*="language-"]::selection':{textShadow:"none",background:"#6f5849"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#6f5849"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#6a5f58"},prolog:{color:"#6a5f58"},doctype:{color:"#6a5f58"},cdata:{color:"#6a5f58"},punctuation:{color:"#6a5f58"},namespace:{Opacity:".7"},tag:{color:"#bfa05a"},operator:{color:"#bfa05a"},number:{color:"#bfa05a"},property:{color:"#88786d"},function:{color:"#88786d"},"tag-id":{color:"#fff3eb"},selector:{color:"#fff3eb"},"atrule-id":{color:"#fff3eb"},"code.language-javascript":{color:"#a48774"},"attr-name":{color:"#a48774"},"code.language-css":{color:"#fcc440"},"code.language-scss":{color:"#fcc440"},boolean:{color:"#fcc440"},string:{color:"#fcc440"},entity:{color:"#fcc440",cursor:"help"},url:{color:"#fcc440"},".language-css .token.string":{color:"#fcc440"},".language-scss .token.string":{color:"#fcc440"},".style .token.string":{color:"#fcc440"},"attr-value":{color:"#fcc440"},keyword:{color:"#fcc440"},control:{color:"#fcc440"},directive:{color:"#fcc440"},unit:{color:"#fcc440"},statement:{color:"#fcc440"},regex:{color:"#fcc440"},atrule:{color:"#fcc440"},placeholder:{color:"#fcc440"},variable:{color:"#fcc440"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #fff3eb",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#a48774"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #816d5f",OutlineOffset:".4em"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"#35302b"},".line-numbers .line-numbers-rows > span:before":{color:"#46403d"},".line-highlight.line-highlight":{background:"linear-gradient(to right, rgba(191, 160, 90, 0.2) 70%, rgba(191, 160, 90, 0))"}};e.default=t}(HE)),HE}var VE={},O5;function Qwe(){return O5||(O5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#2a2d2a",color:"#687d68"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#2a2d2a",color:"#687d68",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#435643"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#435643"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#435643"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#435643"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#435643"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#435643"},'code[class*="language-"]::selection':{textShadow:"none",background:"#435643"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#435643"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#535f53"},prolog:{color:"#535f53"},doctype:{color:"#535f53"},cdata:{color:"#535f53"},punctuation:{color:"#535f53"},namespace:{Opacity:".7"},tag:{color:"#a2b34d"},operator:{color:"#a2b34d"},number:{color:"#a2b34d"},property:{color:"#687d68"},function:{color:"#687d68"},"tag-id":{color:"#f0fff0"},selector:{color:"#f0fff0"},"atrule-id":{color:"#f0fff0"},"code.language-javascript":{color:"#b3d6b3"},"attr-name":{color:"#b3d6b3"},"code.language-css":{color:"#e5fb79"},"code.language-scss":{color:"#e5fb79"},boolean:{color:"#e5fb79"},string:{color:"#e5fb79"},entity:{color:"#e5fb79",cursor:"help"},url:{color:"#e5fb79"},".language-css .token.string":{color:"#e5fb79"},".language-scss .token.string":{color:"#e5fb79"},".style .token.string":{color:"#e5fb79"},"attr-value":{color:"#e5fb79"},keyword:{color:"#e5fb79"},control:{color:"#e5fb79"},directive:{color:"#e5fb79"},unit:{color:"#e5fb79"},statement:{color:"#e5fb79"},regex:{color:"#e5fb79"},atrule:{color:"#e5fb79"},placeholder:{color:"#e5fb79"},variable:{color:"#e5fb79"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #f0fff0",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#b3d6b3"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #5c705c",OutlineOffset:".4em"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"#2c302c"},".line-numbers .line-numbers-rows > span:before":{color:"#3b423b"},".line-highlight.line-highlight":{background:"linear-gradient(to right, rgba(162, 179, 77, 0.2) 70%, rgba(162, 179, 77, 0))"}};e.default=t}(VE)),VE}var qE={},D5;function Jwe(){return D5||(D5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#faf8f5",color:"#728fcb"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#faf8f5",color:"#728fcb",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#faf8f5"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#faf8f5"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#faf8f5"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#faf8f5"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#faf8f5"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#faf8f5"},'code[class*="language-"]::selection':{textShadow:"none",background:"#faf8f5"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#faf8f5"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#b6ad9a"},prolog:{color:"#b6ad9a"},doctype:{color:"#b6ad9a"},cdata:{color:"#b6ad9a"},punctuation:{color:"#b6ad9a"},namespace:{Opacity:".7"},tag:{color:"#063289"},operator:{color:"#063289"},number:{color:"#063289"},property:{color:"#b29762"},function:{color:"#b29762"},"tag-id":{color:"#2d2006"},selector:{color:"#2d2006"},"atrule-id":{color:"#2d2006"},"code.language-javascript":{color:"#896724"},"attr-name":{color:"#896724"},"code.language-css":{color:"#728fcb"},"code.language-scss":{color:"#728fcb"},boolean:{color:"#728fcb"},string:{color:"#728fcb"},entity:{color:"#728fcb",cursor:"help"},url:{color:"#728fcb"},".language-css .token.string":{color:"#728fcb"},".language-scss .token.string":{color:"#728fcb"},".style .token.string":{color:"#728fcb"},"attr-value":{color:"#728fcb"},keyword:{color:"#728fcb"},control:{color:"#728fcb"},directive:{color:"#728fcb"},unit:{color:"#728fcb"},statement:{color:"#728fcb"},regex:{color:"#728fcb"},atrule:{color:"#728fcb"},placeholder:{color:"#93abdc"},variable:{color:"#93abdc"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #2d2006",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#896724"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #896724",OutlineOffset:".4em"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"#ece8de"},".line-numbers .line-numbers-rows > span:before":{color:"#cdc4b1"},".line-highlight.line-highlight":{background:"linear-gradient(to right, rgba(45, 32, 6, 0.2) 70%, rgba(45, 32, 6, 0))"}};e.default=t}(qE)),qE}var GE={},L5;function e0e(){return L5||(L5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#1d262f",color:"#57718e"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#1d262f",color:"#57718e",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#004a9e"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#004a9e"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#004a9e"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#004a9e"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#004a9e"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#004a9e"},'code[class*="language-"]::selection':{textShadow:"none",background:"#004a9e"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#004a9e"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#4a5f78"},prolog:{color:"#4a5f78"},doctype:{color:"#4a5f78"},cdata:{color:"#4a5f78"},punctuation:{color:"#4a5f78"},namespace:{Opacity:".7"},tag:{color:"#0aa370"},operator:{color:"#0aa370"},number:{color:"#0aa370"},property:{color:"#57718e"},function:{color:"#57718e"},"tag-id":{color:"#ebf4ff"},selector:{color:"#ebf4ff"},"atrule-id":{color:"#ebf4ff"},"code.language-javascript":{color:"#7eb6f6"},"attr-name":{color:"#7eb6f6"},"code.language-css":{color:"#47ebb4"},"code.language-scss":{color:"#47ebb4"},boolean:{color:"#47ebb4"},string:{color:"#47ebb4"},entity:{color:"#47ebb4",cursor:"help"},url:{color:"#47ebb4"},".language-css .token.string":{color:"#47ebb4"},".language-scss .token.string":{color:"#47ebb4"},".style .token.string":{color:"#47ebb4"},"attr-value":{color:"#47ebb4"},keyword:{color:"#47ebb4"},control:{color:"#47ebb4"},directive:{color:"#47ebb4"},unit:{color:"#47ebb4"},statement:{color:"#47ebb4"},regex:{color:"#47ebb4"},atrule:{color:"#47ebb4"},placeholder:{color:"#47ebb4"},variable:{color:"#47ebb4"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #ebf4ff",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#7eb6f6"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #34659d",OutlineOffset:".4em"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"#1f2932"},".line-numbers .line-numbers-rows > span:before":{color:"#2c3847"},".line-highlight.line-highlight":{background:"linear-gradient(to right, rgba(10, 163, 112, 0.2) 70%, rgba(10, 163, 112, 0))"}};e.default=t}(GE)),GE}var WE={},M5;function t0e(){return M5||(M5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#24242e",color:"#767693"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#24242e",color:"#767693",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#5151e6"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#5151e6"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#5151e6"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#5151e6"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#5151e6"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#5151e6"},'code[class*="language-"]::selection':{textShadow:"none",background:"#5151e6"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#5151e6"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#5b5b76"},prolog:{color:"#5b5b76"},doctype:{color:"#5b5b76"},cdata:{color:"#5b5b76"},punctuation:{color:"#5b5b76"},namespace:{Opacity:".7"},tag:{color:"#dd672c"},operator:{color:"#dd672c"},number:{color:"#dd672c"},property:{color:"#767693"},function:{color:"#767693"},"tag-id":{color:"#ebebff"},selector:{color:"#ebebff"},"atrule-id":{color:"#ebebff"},"code.language-javascript":{color:"#aaaaca"},"attr-name":{color:"#aaaaca"},"code.language-css":{color:"#fe8c52"},"code.language-scss":{color:"#fe8c52"},boolean:{color:"#fe8c52"},string:{color:"#fe8c52"},entity:{color:"#fe8c52",cursor:"help"},url:{color:"#fe8c52"},".language-css .token.string":{color:"#fe8c52"},".language-scss .token.string":{color:"#fe8c52"},".style .token.string":{color:"#fe8c52"},"attr-value":{color:"#fe8c52"},keyword:{color:"#fe8c52"},control:{color:"#fe8c52"},directive:{color:"#fe8c52"},unit:{color:"#fe8c52"},statement:{color:"#fe8c52"},regex:{color:"#fe8c52"},atrule:{color:"#fe8c52"},placeholder:{color:"#fe8c52"},variable:{color:"#fe8c52"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #ebebff",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#aaaaca"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #7676f4",OutlineOffset:".4em"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"#262631"},".line-numbers .line-numbers-rows > span:before":{color:"#393949"},".line-highlight.line-highlight":{background:"linear-gradient(to right, rgba(221, 103, 44, 0.2) 70%, rgba(221, 103, 44, 0))"}};e.default=t}(WE)),WE}var KE={},P5;function n0e(){return P5||(P5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#393A34",fontFamily:'"Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",fontSize:".9em",lineHeight:"1.2em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#393A34",fontFamily:'"Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",fontSize:".9em",lineHeight:"1.2em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",border:"1px solid #dddddd",backgroundColor:"white"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{background:"#b3d4fc"},'pre[class*="language-"] ::-moz-selection':{background:"#b3d4fc"},'code[class*="language-"]::-moz-selection':{background:"#b3d4fc"},'code[class*="language-"] ::-moz-selection':{background:"#b3d4fc"},'pre[class*="language-"]::selection':{background:"#b3d4fc"},'pre[class*="language-"] ::selection':{background:"#b3d4fc"},'code[class*="language-"]::selection':{background:"#b3d4fc"},'code[class*="language-"] ::selection':{background:"#b3d4fc"},':not(pre) > code[class*="language-"]':{padding:".2em",paddingTop:"1px",paddingBottom:"1px",background:"#f8f8f8",border:"1px solid #dddddd"},comment:{color:"#999988",fontStyle:"italic"},prolog:{color:"#999988",fontStyle:"italic"},doctype:{color:"#999988",fontStyle:"italic"},cdata:{color:"#999988",fontStyle:"italic"},namespace:{Opacity:".7"},string:{color:"#e3116c"},"attr-value":{color:"#e3116c"},punctuation:{color:"#393A34"},operator:{color:"#393A34"},entity:{color:"#36acaa"},url:{color:"#36acaa"},symbol:{color:"#36acaa"},number:{color:"#36acaa"},boolean:{color:"#36acaa"},variable:{color:"#36acaa"},constant:{color:"#36acaa"},property:{color:"#36acaa"},regex:{color:"#36acaa"},inserted:{color:"#36acaa"},atrule:{color:"#00a4db"},keyword:{color:"#00a4db"},"attr-name":{color:"#00a4db"},".language-autohotkey .token.selector":{color:"#00a4db"},function:{color:"#9a050f",fontWeight:"bold"},deleted:{color:"#9a050f"},".language-autohotkey .token.tag":{color:"#9a050f"},tag:{color:"#00009f"},selector:{color:"#00009f"},".language-autohotkey .token.keyword":{color:"#00009f"},important:{fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(KE)),KE}var YE={},$5;function r0e(){return $5||($5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#ebdbb2",fontFamily:'Consolas, Monaco, "Andale Mono", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#ebdbb2",fontFamily:'Consolas, Monaco, "Andale Mono", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto",background:"#1d2021"},'pre[class*="language-"]::-moz-selection':{color:"#fbf1c7",background:"#7c6f64"},'pre[class*="language-"] ::-moz-selection':{color:"#fbf1c7",background:"#7c6f64"},'code[class*="language-"]::-moz-selection':{color:"#fbf1c7",background:"#7c6f64"},'code[class*="language-"] ::-moz-selection':{color:"#fbf1c7",background:"#7c6f64"},'pre[class*="language-"]::selection':{color:"#fbf1c7",background:"#7c6f64"},'pre[class*="language-"] ::selection':{color:"#fbf1c7",background:"#7c6f64"},'code[class*="language-"]::selection':{color:"#fbf1c7",background:"#7c6f64"},'code[class*="language-"] ::selection':{color:"#fbf1c7",background:"#7c6f64"},':not(pre) > code[class*="language-"]':{background:"#1d2021",padding:"0.1em",borderRadius:"0.3em"},comment:{color:"#a89984"},prolog:{color:"#a89984"},cdata:{color:"#a89984"},delimiter:{color:"#fb4934"},boolean:{color:"#fb4934"},keyword:{color:"#fb4934"},selector:{color:"#fb4934"},important:{color:"#fb4934"},atrule:{color:"#fb4934"},operator:{color:"#a89984"},punctuation:{color:"#a89984"},"attr-name":{color:"#a89984"},tag:{color:"#fabd2f"},"tag.punctuation":{color:"#fabd2f"},doctype:{color:"#fabd2f"},builtin:{color:"#fabd2f"},entity:{color:"#d3869b"},number:{color:"#d3869b"},symbol:{color:"#d3869b"},property:{color:"#fb4934"},constant:{color:"#fb4934"},variable:{color:"#fb4934"},string:{color:"#b8bb26"},char:{color:"#b8bb26"},"attr-value":{color:"#a89984"},"attr-value.punctuation":{color:"#a89984"},url:{color:"#b8bb26",textDecoration:"underline"},function:{color:"#fabd2f"},regex:{background:"#b8bb26"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},inserted:{background:"#a89984"},deleted:{background:"#fb4934"}};e.default=t}(YE)),YE}var ZE={},F5;function a0e(){return F5||(F5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#3c3836",fontFamily:'Consolas, Monaco, "Andale Mono", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#3c3836",fontFamily:'Consolas, Monaco, "Andale Mono", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto",background:"#f9f5d7"},'pre[class*="language-"]::-moz-selection':{color:"#282828",background:"#a89984"},'pre[class*="language-"] ::-moz-selection':{color:"#282828",background:"#a89984"},'code[class*="language-"]::-moz-selection':{color:"#282828",background:"#a89984"},'code[class*="language-"] ::-moz-selection':{color:"#282828",background:"#a89984"},'pre[class*="language-"]::selection':{color:"#282828",background:"#a89984"},'pre[class*="language-"] ::selection':{color:"#282828",background:"#a89984"},'code[class*="language-"]::selection':{color:"#282828",background:"#a89984"},'code[class*="language-"] ::selection':{color:"#282828",background:"#a89984"},':not(pre) > code[class*="language-"]':{background:"#f9f5d7",padding:"0.1em",borderRadius:"0.3em"},comment:{color:"#7c6f64"},prolog:{color:"#7c6f64"},cdata:{color:"#7c6f64"},delimiter:{color:"#9d0006"},boolean:{color:"#9d0006"},keyword:{color:"#9d0006"},selector:{color:"#9d0006"},important:{color:"#9d0006"},atrule:{color:"#9d0006"},operator:{color:"#7c6f64"},punctuation:{color:"#7c6f64"},"attr-name":{color:"#7c6f64"},tag:{color:"#b57614"},"tag.punctuation":{color:"#b57614"},doctype:{color:"#b57614"},builtin:{color:"#b57614"},entity:{color:"#8f3f71"},number:{color:"#8f3f71"},symbol:{color:"#8f3f71"},property:{color:"#9d0006"},constant:{color:"#9d0006"},variable:{color:"#9d0006"},string:{color:"#797403"},char:{color:"#797403"},"attr-value":{color:"#7c6f64"},"attr-value.punctuation":{color:"#7c6f64"},url:{color:"#797403",textDecoration:"underline"},function:{color:"#b57614"},regex:{background:"#797403"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},inserted:{background:"#7c6f64"},deleted:{background:"#9d0006"}};e.default=t}(ZE)),ZE}var XE={},j5;function o0e(){return j5||(j5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={"code[class*='language-']":{color:"#d6e7ff",background:"#030314",textShadow:"none",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',fontSize:"1em",lineHeight:"1.5",letterSpacing:".2px",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",textAlign:"left",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},"pre[class*='language-']":{color:"#d6e7ff",background:"#030314",textShadow:"none",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',fontSize:"1em",lineHeight:"1.5",letterSpacing:".2px",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",textAlign:"left",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",border:"1px solid #2a4555",borderRadius:"5px",padding:"1.5em 1em",margin:"1em 0",overflow:"auto"},"pre[class*='language-']::-moz-selection":{color:"inherit",background:"#1d3b54",textShadow:"none"},"pre[class*='language-'] ::-moz-selection":{color:"inherit",background:"#1d3b54",textShadow:"none"},"code[class*='language-']::-moz-selection":{color:"inherit",background:"#1d3b54",textShadow:"none"},"code[class*='language-'] ::-moz-selection":{color:"inherit",background:"#1d3b54",textShadow:"none"},"pre[class*='language-']::selection":{color:"inherit",background:"#1d3b54",textShadow:"none"},"pre[class*='language-'] ::selection":{color:"inherit",background:"#1d3b54",textShadow:"none"},"code[class*='language-']::selection":{color:"inherit",background:"#1d3b54",textShadow:"none"},"code[class*='language-'] ::selection":{color:"inherit",background:"#1d3b54",textShadow:"none"},":not(pre) > code[class*='language-']":{color:"#f0f6f6",background:"#2a4555",padding:"0.2em 0.3em",borderRadius:"0.2em",boxDecorationBreak:"clone"},comment:{color:"#446e69"},prolog:{color:"#446e69"},doctype:{color:"#446e69"},cdata:{color:"#446e69"},punctuation:{color:"#d6b007"},property:{color:"#d6e7ff"},tag:{color:"#d6e7ff"},boolean:{color:"#d6e7ff"},number:{color:"#d6e7ff"},constant:{color:"#d6e7ff"},symbol:{color:"#d6e7ff"},deleted:{color:"#d6e7ff"},selector:{color:"#e60067"},"attr-name":{color:"#e60067"},builtin:{color:"#e60067"},inserted:{color:"#e60067"},string:{color:"#49c6ec"},char:{color:"#49c6ec"},operator:{color:"#ec8e01",background:"transparent"},entity:{color:"#ec8e01",background:"transparent"},url:{color:"#ec8e01",background:"transparent"},".language-css .token.string":{color:"#ec8e01",background:"transparent"},".style .token.string":{color:"#ec8e01",background:"transparent"},atrule:{color:"#0fe468"},"attr-value":{color:"#0fe468"},keyword:{color:"#0fe468"},function:{color:"#78f3e9"},"class-name":{color:"#78f3e9"},regex:{color:"#d6e7ff"},important:{color:"#d6e7ff"},variable:{color:"#d6e7ff"}};e.default=t}(XE)),XE}var QE={},z5;function i0e(){return z5||(z5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:'"Fira Mono", Menlo, Monaco, "Lucida Console", "Courier New", Courier, monospace',fontSize:"16px",lineHeight:"1.375",direction:"ltr",textAlign:"left",wordSpacing:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordBreak:"break-all",wordWrap:"break-word",background:"#322931",color:"#b9b5b8"},'pre[class*="language-"]':{fontFamily:'"Fira Mono", Menlo, Monaco, "Lucida Console", "Courier New", Courier, monospace',fontSize:"16px",lineHeight:"1.375",direction:"ltr",textAlign:"left",wordSpacing:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordBreak:"break-all",wordWrap:"break-word",background:"#322931",color:"#b9b5b8",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#797379"},prolog:{color:"#797379"},doctype:{color:"#797379"},cdata:{color:"#797379"},punctuation:{color:"#b9b5b8"},".namespace":{Opacity:".7"},null:{color:"#fd8b19"},operator:{color:"#fd8b19"},boolean:{color:"#fd8b19"},number:{color:"#fd8b19"},property:{color:"#fdcc59"},tag:{color:"#1290bf"},string:{color:"#149b93"},selector:{color:"#c85e7c"},"attr-name":{color:"#fd8b19"},entity:{color:"#149b93",cursor:"help"},url:{color:"#149b93"},".language-css .token.string":{color:"#149b93"},".style .token.string":{color:"#149b93"},"attr-value":{color:"#8fc13e"},keyword:{color:"#8fc13e"},control:{color:"#8fc13e"},directive:{color:"#8fc13e"},unit:{color:"#8fc13e"},statement:{color:"#149b93"},regex:{color:"#149b93"},atrule:{color:"#149b93"},placeholder:{color:"#1290bf"},variable:{color:"#1290bf"},important:{color:"#dd464c",fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid red",OutlineOffset:".4em"}};e.default=t}(QE)),QE}var JE={},U5;function s0e(){return U5||(U5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#f8f8f2",background:"none",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Monaco, Consolas, 'Andale Mono', 'Ubuntu Mono', monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#f8f8f2",background:"#263E52",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Monaco, Consolas, 'Andale Mono', 'Ubuntu Mono', monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",borderRadius:"0.3em"},':not(pre) > code[class*="language-"]':{background:"#263E52",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#5c98cd"},prolog:{color:"#5c98cd"},doctype:{color:"#5c98cd"},cdata:{color:"#5c98cd"},punctuation:{color:"#f8f8f2"},".namespace":{Opacity:".7"},property:{color:"#F05E5D"},tag:{color:"#F05E5D"},constant:{color:"#F05E5D"},symbol:{color:"#F05E5D"},deleted:{color:"#F05E5D"},boolean:{color:"#BC94F9"},number:{color:"#BC94F9"},selector:{color:"#FCFCD6"},"attr-name":{color:"#FCFCD6"},string:{color:"#FCFCD6"},char:{color:"#FCFCD6"},builtin:{color:"#FCFCD6"},inserted:{color:"#FCFCD6"},operator:{color:"#f8f8f2"},entity:{color:"#f8f8f2",cursor:"help"},url:{color:"#f8f8f2"},".language-css .token.string":{color:"#f8f8f2"},".style .token.string":{color:"#f8f8f2"},variable:{color:"#f8f8f2"},atrule:{color:"#66D8EF"},"attr-value":{color:"#66D8EF"},function:{color:"#66D8EF"},"class-name":{color:"#66D8EF"},keyword:{color:"#6EB26E"},regex:{color:"#F05E5D"},important:{color:"#F05E5D",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(JE)),JE}var ex={},B5;function l0e(){return B5||(B5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",color:"#eee",background:"#2f2f2f",fontFamily:"Roboto Mono, monospace",fontSize:"1em",lineHeight:"1.5em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",color:"#eee",background:"#2f2f2f",fontFamily:"Roboto Mono, monospace",fontSize:"1em",lineHeight:"1.5em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",overflow:"auto",position:"relative",margin:"0.5em 0",padding:"1.25em 1em"},'code[class*="language-"]::-moz-selection':{background:"#363636"},'pre[class*="language-"]::-moz-selection':{background:"#363636"},'code[class*="language-"] ::-moz-selection':{background:"#363636"},'pre[class*="language-"] ::-moz-selection':{background:"#363636"},'code[class*="language-"]::selection':{background:"#363636"},'pre[class*="language-"]::selection':{background:"#363636"},'code[class*="language-"] ::selection':{background:"#363636"},'pre[class*="language-"] ::selection':{background:"#363636"},':not(pre) > code[class*="language-"]':{whiteSpace:"normal",borderRadius:"0.2em",padding:"0.1em"},".language-css > code":{color:"#fd9170"},".language-sass > code":{color:"#fd9170"},".language-scss > code":{color:"#fd9170"},'[class*="language-"] .namespace':{Opacity:"0.7"},atrule:{color:"#c792ea"},"attr-name":{color:"#ffcb6b"},"attr-value":{color:"#a5e844"},attribute:{color:"#a5e844"},boolean:{color:"#c792ea"},builtin:{color:"#ffcb6b"},cdata:{color:"#80cbc4"},char:{color:"#80cbc4"},class:{color:"#ffcb6b"},"class-name":{color:"#f2ff00"},comment:{color:"#616161"},constant:{color:"#c792ea"},deleted:{color:"#ff6666"},doctype:{color:"#616161"},entity:{color:"#ff6666"},function:{color:"#c792ea"},hexcode:{color:"#f2ff00"},id:{color:"#c792ea",fontWeight:"bold"},important:{color:"#c792ea",fontWeight:"bold"},inserted:{color:"#80cbc4"},keyword:{color:"#c792ea"},number:{color:"#fd9170"},operator:{color:"#89ddff"},prolog:{color:"#616161"},property:{color:"#80cbc4"},"pseudo-class":{color:"#a5e844"},"pseudo-element":{color:"#a5e844"},punctuation:{color:"#89ddff"},regex:{color:"#f2ff00"},selector:{color:"#ff6666"},string:{color:"#a5e844"},symbol:{color:"#c792ea"},tag:{color:"#ff6666"},unit:{color:"#fd9170"},url:{color:"#ff6666"},variable:{color:"#ff6666"}};e.default=t}(ex)),ex}var tx={},H5;function c0e(){return H5||(H5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",color:"#90a4ae",background:"#fafafa",fontFamily:"Roboto Mono, monospace",fontSize:"1em",lineHeight:"1.5em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",color:"#90a4ae",background:"#fafafa",fontFamily:"Roboto Mono, monospace",fontSize:"1em",lineHeight:"1.5em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",overflow:"auto",position:"relative",margin:"0.5em 0",padding:"1.25em 1em"},'code[class*="language-"]::-moz-selection':{background:"#cceae7",color:"#263238"},'pre[class*="language-"]::-moz-selection':{background:"#cceae7",color:"#263238"},'code[class*="language-"] ::-moz-selection':{background:"#cceae7",color:"#263238"},'pre[class*="language-"] ::-moz-selection':{background:"#cceae7",color:"#263238"},'code[class*="language-"]::selection':{background:"#cceae7",color:"#263238"},'pre[class*="language-"]::selection':{background:"#cceae7",color:"#263238"},'code[class*="language-"] ::selection':{background:"#cceae7",color:"#263238"},'pre[class*="language-"] ::selection':{background:"#cceae7",color:"#263238"},':not(pre) > code[class*="language-"]':{whiteSpace:"normal",borderRadius:"0.2em",padding:"0.1em"},".language-css > code":{color:"#f76d47"},".language-sass > code":{color:"#f76d47"},".language-scss > code":{color:"#f76d47"},'[class*="language-"] .namespace':{Opacity:"0.7"},atrule:{color:"#7c4dff"},"attr-name":{color:"#39adb5"},"attr-value":{color:"#f6a434"},attribute:{color:"#f6a434"},boolean:{color:"#7c4dff"},builtin:{color:"#39adb5"},cdata:{color:"#39adb5"},char:{color:"#39adb5"},class:{color:"#39adb5"},"class-name":{color:"#6182b8"},comment:{color:"#aabfc9"},constant:{color:"#7c4dff"},deleted:{color:"#e53935"},doctype:{color:"#aabfc9"},entity:{color:"#e53935"},function:{color:"#7c4dff"},hexcode:{color:"#f76d47"},id:{color:"#7c4dff",fontWeight:"bold"},important:{color:"#7c4dff",fontWeight:"bold"},inserted:{color:"#39adb5"},keyword:{color:"#7c4dff"},number:{color:"#f76d47"},operator:{color:"#39adb5"},prolog:{color:"#aabfc9"},property:{color:"#39adb5"},"pseudo-class":{color:"#f6a434"},"pseudo-element":{color:"#f6a434"},punctuation:{color:"#39adb5"},regex:{color:"#6182b8"},selector:{color:"#e53935"},string:{color:"#f6a434"},symbol:{color:"#7c4dff"},tag:{color:"#e53935"},unit:{color:"#f76d47"},url:{color:"#e53935"},variable:{color:"#e53935"}};e.default=t}(tx)),tx}var nx={},V5;function u0e(){return V5||(V5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",color:"#c3cee3",background:"#263238",fontFamily:"Roboto Mono, monospace",fontSize:"1em",lineHeight:"1.5em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",color:"#c3cee3",background:"#263238",fontFamily:"Roboto Mono, monospace",fontSize:"1em",lineHeight:"1.5em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",overflow:"auto",position:"relative",margin:"0.5em 0",padding:"1.25em 1em"},'code[class*="language-"]::-moz-selection':{background:"#363636"},'pre[class*="language-"]::-moz-selection':{background:"#363636"},'code[class*="language-"] ::-moz-selection':{background:"#363636"},'pre[class*="language-"] ::-moz-selection':{background:"#363636"},'code[class*="language-"]::selection':{background:"#363636"},'pre[class*="language-"]::selection':{background:"#363636"},'code[class*="language-"] ::selection':{background:"#363636"},'pre[class*="language-"] ::selection':{background:"#363636"},':not(pre) > code[class*="language-"]':{whiteSpace:"normal",borderRadius:"0.2em",padding:"0.1em"},".language-css > code":{color:"#fd9170"},".language-sass > code":{color:"#fd9170"},".language-scss > code":{color:"#fd9170"},'[class*="language-"] .namespace':{Opacity:"0.7"},atrule:{color:"#c792ea"},"attr-name":{color:"#ffcb6b"},"attr-value":{color:"#c3e88d"},attribute:{color:"#c3e88d"},boolean:{color:"#c792ea"},builtin:{color:"#ffcb6b"},cdata:{color:"#80cbc4"},char:{color:"#80cbc4"},class:{color:"#ffcb6b"},"class-name":{color:"#f2ff00"},color:{color:"#f2ff00"},comment:{color:"#546e7a"},constant:{color:"#c792ea"},deleted:{color:"#f07178"},doctype:{color:"#546e7a"},entity:{color:"#f07178"},function:{color:"#c792ea"},hexcode:{color:"#f2ff00"},id:{color:"#c792ea",fontWeight:"bold"},important:{color:"#c792ea",fontWeight:"bold"},inserted:{color:"#80cbc4"},keyword:{color:"#c792ea",fontStyle:"italic"},number:{color:"#fd9170"},operator:{color:"#89ddff"},prolog:{color:"#546e7a"},property:{color:"#80cbc4"},"pseudo-class":{color:"#c3e88d"},"pseudo-element":{color:"#c3e88d"},punctuation:{color:"#89ddff"},regex:{color:"#f2ff00"},selector:{color:"#f07178"},string:{color:"#c3e88d"},symbol:{color:"#c792ea"},tag:{color:"#f07178"},unit:{color:"#f07178"},url:{color:"#fd9170"},variable:{color:"#f07178"}};e.default=t}(nx)),nx}var rx={},q5;function d0e(){return q5||(q5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#d6deeb",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",fontSize:"1em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"white",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",fontSize:"1em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto",background:"#011627"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'pre[class*="language-"]::selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'code[class*="language-"]::selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'code[class*="language-"] ::selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},':not(pre) > code[class*="language-"]':{color:"white",background:"#011627",padding:"0.1em",borderRadius:"0.3em",whiteSpace:"normal"},comment:{color:"rgb(99, 119, 119)",fontStyle:"italic"},prolog:{color:"rgb(99, 119, 119)",fontStyle:"italic"},cdata:{color:"rgb(99, 119, 119)",fontStyle:"italic"},punctuation:{color:"rgb(199, 146, 234)"},".namespace":{color:"rgb(178, 204, 214)"},deleted:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"},symbol:{color:"rgb(128, 203, 196)"},property:{color:"rgb(128, 203, 196)"},tag:{color:"rgb(127, 219, 202)"},operator:{color:"rgb(127, 219, 202)"},keyword:{color:"rgb(127, 219, 202)"},boolean:{color:"rgb(255, 88, 116)"},number:{color:"rgb(247, 140, 108)"},constant:{color:"rgb(130, 170, 255)"},function:{color:"rgb(130, 170, 255)"},builtin:{color:"rgb(130, 170, 255)"},char:{color:"rgb(130, 170, 255)"},selector:{color:"rgb(199, 146, 234)",fontStyle:"italic"},doctype:{color:"rgb(199, 146, 234)",fontStyle:"italic"},"attr-name":{color:"rgb(173, 219, 103)",fontStyle:"italic"},inserted:{color:"rgb(173, 219, 103)",fontStyle:"italic"},string:{color:"rgb(173, 219, 103)"},url:{color:"rgb(173, 219, 103)"},entity:{color:"rgb(173, 219, 103)"},".language-css .token.string":{color:"rgb(173, 219, 103)"},".style .token.string":{color:"rgb(173, 219, 103)"},"class-name":{color:"rgb(255, 203, 139)"},atrule:{color:"rgb(255, 203, 139)"},"attr-value":{color:"rgb(255, 203, 139)"},regex:{color:"rgb(214, 222, 235)"},important:{color:"rgb(214, 222, 235)",fontWeight:"bold"},variable:{color:"rgb(214, 222, 235)"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(rx)),rx}var ax={},G5;function f0e(){return G5||(G5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#f8f8f2",background:"none",fontFamily:`"Fira Code", Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace`,textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#f8f8f2",background:"#2E3440",fontFamily:`"Fira Code", Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace`,textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",borderRadius:"0.3em"},':not(pre) > code[class*="language-"]':{background:"#2E3440",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#636f88"},prolog:{color:"#636f88"},doctype:{color:"#636f88"},cdata:{color:"#636f88"},punctuation:{color:"#81A1C1"},".namespace":{Opacity:".7"},property:{color:"#81A1C1"},tag:{color:"#81A1C1"},constant:{color:"#81A1C1"},symbol:{color:"#81A1C1"},deleted:{color:"#81A1C1"},number:{color:"#B48EAD"},boolean:{color:"#81A1C1"},selector:{color:"#A3BE8C"},"attr-name":{color:"#A3BE8C"},string:{color:"#A3BE8C"},char:{color:"#A3BE8C"},builtin:{color:"#A3BE8C"},inserted:{color:"#A3BE8C"},operator:{color:"#81A1C1"},entity:{color:"#81A1C1",cursor:"help"},url:{color:"#81A1C1"},".language-css .token.string":{color:"#81A1C1"},".style .token.string":{color:"#81A1C1"},variable:{color:"#81A1C1"},atrule:{color:"#88C0D0"},"attr-value":{color:"#88C0D0"},function:{color:"#88C0D0"},"class-name":{color:"#88C0D0"},keyword:{color:"#81A1C1"},regex:{color:"#EBCB8B"},important:{color:"#EBCB8B",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(ax)),ax}var ox={},W5;function p0e(){return W5||(W5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{background:"hsl(220, 13%, 18%)",color:"hsl(220, 14%, 71%)",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:'"Fira Code", "Fira Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"2",OTabSize:"2",tabSize:"2",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{background:"hsl(220, 13%, 18%)",color:"hsl(220, 14%, 71%)",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:'"Fira Code", "Fira Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"2",OTabSize:"2",tabSize:"2",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto",borderRadius:"0.3em"},'code[class*="language-"]::-moz-selection':{background:"hsl(220, 13%, 28%)",color:"inherit",textShadow:"none"},'code[class*="language-"] *::-moz-selection':{background:"hsl(220, 13%, 28%)",color:"inherit",textShadow:"none"},'pre[class*="language-"] *::-moz-selection':{background:"hsl(220, 13%, 28%)",color:"inherit",textShadow:"none"},'code[class*="language-"]::selection':{background:"hsl(220, 13%, 28%)",color:"inherit",textShadow:"none"},'code[class*="language-"] *::selection':{background:"hsl(220, 13%, 28%)",color:"inherit",textShadow:"none"},'pre[class*="language-"] *::selection':{background:"hsl(220, 13%, 28%)",color:"inherit",textShadow:"none"},':not(pre) > code[class*="language-"]':{padding:"0.2em 0.3em",borderRadius:"0.3em",whiteSpace:"normal"},comment:{color:"hsl(220, 10%, 40%)",fontStyle:"italic"},prolog:{color:"hsl(220, 10%, 40%)"},cdata:{color:"hsl(220, 10%, 40%)"},doctype:{color:"hsl(220, 14%, 71%)"},punctuation:{color:"hsl(220, 14%, 71%)"},entity:{color:"hsl(220, 14%, 71%)",cursor:"help"},"attr-name":{color:"hsl(29, 54%, 61%)"},"class-name":{color:"hsl(29, 54%, 61%)"},boolean:{color:"hsl(29, 54%, 61%)"},constant:{color:"hsl(29, 54%, 61%)"},number:{color:"hsl(29, 54%, 61%)"},atrule:{color:"hsl(29, 54%, 61%)"},keyword:{color:"hsl(286, 60%, 67%)"},property:{color:"hsl(355, 65%, 65%)"},tag:{color:"hsl(355, 65%, 65%)"},symbol:{color:"hsl(355, 65%, 65%)"},deleted:{color:"hsl(355, 65%, 65%)"},important:{color:"hsl(355, 65%, 65%)"},selector:{color:"hsl(95, 38%, 62%)"},string:{color:"hsl(95, 38%, 62%)"},char:{color:"hsl(95, 38%, 62%)"},builtin:{color:"hsl(95, 38%, 62%)"},inserted:{color:"hsl(95, 38%, 62%)"},regex:{color:"hsl(95, 38%, 62%)"},"attr-value":{color:"hsl(95, 38%, 62%)"},"attr-value > .token.punctuation":{color:"hsl(95, 38%, 62%)"},variable:{color:"hsl(207, 82%, 66%)"},operator:{color:"hsl(207, 82%, 66%)"},function:{color:"hsl(207, 82%, 66%)"},url:{color:"hsl(187, 47%, 55%)"},"attr-value > .token.punctuation.attr-equals":{color:"hsl(220, 14%, 71%)"},"special-attr > .token.attr-value > .token.value.css":{color:"hsl(220, 14%, 71%)"},".language-css .token.selector":{color:"hsl(355, 65%, 65%)"},".language-css .token.property":{color:"hsl(220, 14%, 71%)"},".language-css .token.function":{color:"hsl(187, 47%, 55%)"},".language-css .token.url > .token.function":{color:"hsl(187, 47%, 55%)"},".language-css .token.url > .token.string.url":{color:"hsl(95, 38%, 62%)"},".language-css .token.important":{color:"hsl(286, 60%, 67%)"},".language-css .token.atrule .token.rule":{color:"hsl(286, 60%, 67%)"},".language-javascript .token.operator":{color:"hsl(286, 60%, 67%)"},".language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation":{color:"hsl(5, 48%, 51%)"},".language-json .token.operator":{color:"hsl(220, 14%, 71%)"},".language-json .token.null.keyword":{color:"hsl(29, 54%, 61%)"},".language-markdown .token.url":{color:"hsl(220, 14%, 71%)"},".language-markdown .token.url > .token.operator":{color:"hsl(220, 14%, 71%)"},".language-markdown .token.url-reference.url > .token.string":{color:"hsl(220, 14%, 71%)"},".language-markdown .token.url > .token.content":{color:"hsl(207, 82%, 66%)"},".language-markdown .token.url > .token.url":{color:"hsl(187, 47%, 55%)"},".language-markdown .token.url-reference.url":{color:"hsl(187, 47%, 55%)"},".language-markdown .token.blockquote.punctuation":{color:"hsl(220, 10%, 40%)",fontStyle:"italic"},".language-markdown .token.hr.punctuation":{color:"hsl(220, 10%, 40%)",fontStyle:"italic"},".language-markdown .token.code-snippet":{color:"hsl(95, 38%, 62%)"},".language-markdown .token.bold .token.content":{color:"hsl(29, 54%, 61%)"},".language-markdown .token.italic .token.content":{color:"hsl(286, 60%, 67%)"},".language-markdown .token.strike .token.content":{color:"hsl(355, 65%, 65%)"},".language-markdown .token.strike .token.punctuation":{color:"hsl(355, 65%, 65%)"},".language-markdown .token.list.punctuation":{color:"hsl(355, 65%, 65%)"},".language-markdown .token.title.important > .token.punctuation":{color:"hsl(355, 65%, 65%)"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},namespace:{Opacity:"0.8"},"token.tab:not(:empty):before":{color:"hsla(220, 14%, 71%, 0.15)",textShadow:"none"},"token.cr:before":{color:"hsla(220, 14%, 71%, 0.15)",textShadow:"none"},"token.lf:before":{color:"hsla(220, 14%, 71%, 0.15)",textShadow:"none"},"token.space:before":{color:"hsla(220, 14%, 71%, 0.15)",textShadow:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item":{marginRight:"0.4em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button":{background:"hsl(220, 13%, 26%)",color:"hsl(220, 9%, 55%)",padding:"0.1em 0.4em",borderRadius:"0.3em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a":{background:"hsl(220, 13%, 26%)",color:"hsl(220, 9%, 55%)",padding:"0.1em 0.4em",borderRadius:"0.3em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span":{background:"hsl(220, 13%, 26%)",color:"hsl(220, 9%, 55%)",padding:"0.1em 0.4em",borderRadius:"0.3em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover":{background:"hsl(220, 13%, 28%)",color:"hsl(220, 14%, 71%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus":{background:"hsl(220, 13%, 28%)",color:"hsl(220, 14%, 71%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover":{background:"hsl(220, 13%, 28%)",color:"hsl(220, 14%, 71%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus":{background:"hsl(220, 13%, 28%)",color:"hsl(220, 14%, 71%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover":{background:"hsl(220, 13%, 28%)",color:"hsl(220, 14%, 71%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus":{background:"hsl(220, 13%, 28%)",color:"hsl(220, 14%, 71%)"},".line-highlight.line-highlight":{background:"hsla(220, 100%, 80%, 0.04)"},".line-highlight.line-highlight:before":{background:"hsl(220, 13%, 26%)",color:"hsl(220, 14%, 71%)",padding:"0.1em 0.6em",borderRadius:"0.3em",boxShadow:"0 2px 0 0 rgba(0, 0, 0, 0.2)"},".line-highlight.line-highlight[data-end]:after":{background:"hsl(220, 13%, 26%)",color:"hsl(220, 14%, 71%)",padding:"0.1em 0.6em",borderRadius:"0.3em",boxShadow:"0 2px 0 0 rgba(0, 0, 0, 0.2)"},"pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before":{backgroundColor:"hsla(220, 100%, 80%, 0.04)"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"hsla(220, 14%, 71%, 0.15)"},".command-line .command-line-prompt":{borderRightColor:"hsla(220, 14%, 71%, 0.15)"},".line-numbers .line-numbers-rows > span:before":{color:"hsl(220, 14%, 45%)"},".command-line .command-line-prompt > span:before":{color:"hsl(220, 14%, 45%)"},".rainbow-braces .token.token.punctuation.brace-level-1":{color:"hsl(355, 65%, 65%)"},".rainbow-braces .token.token.punctuation.brace-level-5":{color:"hsl(355, 65%, 65%)"},".rainbow-braces .token.token.punctuation.brace-level-9":{color:"hsl(355, 65%, 65%)"},".rainbow-braces .token.token.punctuation.brace-level-2":{color:"hsl(95, 38%, 62%)"},".rainbow-braces .token.token.punctuation.brace-level-6":{color:"hsl(95, 38%, 62%)"},".rainbow-braces .token.token.punctuation.brace-level-10":{color:"hsl(95, 38%, 62%)"},".rainbow-braces .token.token.punctuation.brace-level-3":{color:"hsl(207, 82%, 66%)"},".rainbow-braces .token.token.punctuation.brace-level-7":{color:"hsl(207, 82%, 66%)"},".rainbow-braces .token.token.punctuation.brace-level-11":{color:"hsl(207, 82%, 66%)"},".rainbow-braces .token.token.punctuation.brace-level-4":{color:"hsl(286, 60%, 67%)"},".rainbow-braces .token.token.punctuation.brace-level-8":{color:"hsl(286, 60%, 67%)"},".rainbow-braces .token.token.punctuation.brace-level-12":{color:"hsl(286, 60%, 67%)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)":{backgroundColor:"hsla(353, 100%, 66%, 0.15)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)":{backgroundColor:"hsla(353, 100%, 66%, 0.15)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix) *::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix) *::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)":{backgroundColor:"hsla(137, 100%, 55%, 0.15)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)":{backgroundColor:"hsla(137, 100%, 55%, 0.15)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix) *::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix) *::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},".prism-previewer.prism-previewer:before":{borderColor:"hsl(224, 13%, 17%)"},".prism-previewer-gradient.prism-previewer-gradient div":{borderColor:"hsl(224, 13%, 17%)",borderRadius:"0.3em"},".prism-previewer-color.prism-previewer-color:before":{borderRadius:"0.3em"},".prism-previewer-easing.prism-previewer-easing:before":{borderRadius:"0.3em"},".prism-previewer.prism-previewer:after":{borderTopColor:"hsl(224, 13%, 17%)"},".prism-previewer-flipped.prism-previewer-flipped.after":{borderBottomColor:"hsl(224, 13%, 17%)"},".prism-previewer-angle.prism-previewer-angle:before":{background:"hsl(219, 13%, 22%)"},".prism-previewer-time.prism-previewer-time:before":{background:"hsl(219, 13%, 22%)"},".prism-previewer-easing.prism-previewer-easing":{background:"hsl(219, 13%, 22%)"},".prism-previewer-angle.prism-previewer-angle circle":{stroke:"hsl(220, 14%, 71%)",strokeOpacity:"1"},".prism-previewer-time.prism-previewer-time circle":{stroke:"hsl(220, 14%, 71%)",strokeOpacity:"1"},".prism-previewer-easing.prism-previewer-easing circle":{stroke:"hsl(220, 14%, 71%)",fill:"transparent"},".prism-previewer-easing.prism-previewer-easing path":{stroke:"hsl(220, 14%, 71%)"},".prism-previewer-easing.prism-previewer-easing line":{stroke:"hsl(220, 14%, 71%)"}};e.default=t}(ox)),ox}var ix={},K5;function g0e(){return K5||(K5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{background:"hsl(230, 1%, 98%)",color:"hsl(230, 8%, 24%)",fontFamily:'"Fira Code", "Fira Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"2",OTabSize:"2",tabSize:"2",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{background:"hsl(230, 1%, 98%)",color:"hsl(230, 8%, 24%)",fontFamily:'"Fira Code", "Fira Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"2",OTabSize:"2",tabSize:"2",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto",borderRadius:"0.3em"},'code[class*="language-"]::-moz-selection':{background:"hsl(230, 1%, 90%)",color:"inherit"},'code[class*="language-"] *::-moz-selection':{background:"hsl(230, 1%, 90%)",color:"inherit"},'pre[class*="language-"] *::-moz-selection':{background:"hsl(230, 1%, 90%)",color:"inherit"},'code[class*="language-"]::selection':{background:"hsl(230, 1%, 90%)",color:"inherit"},'code[class*="language-"] *::selection':{background:"hsl(230, 1%, 90%)",color:"inherit"},'pre[class*="language-"] *::selection':{background:"hsl(230, 1%, 90%)",color:"inherit"},':not(pre) > code[class*="language-"]':{padding:"0.2em 0.3em",borderRadius:"0.3em",whiteSpace:"normal"},comment:{color:"hsl(230, 4%, 64%)",fontStyle:"italic"},prolog:{color:"hsl(230, 4%, 64%)"},cdata:{color:"hsl(230, 4%, 64%)"},doctype:{color:"hsl(230, 8%, 24%)"},punctuation:{color:"hsl(230, 8%, 24%)"},entity:{color:"hsl(230, 8%, 24%)",cursor:"help"},"attr-name":{color:"hsl(35, 99%, 36%)"},"class-name":{color:"hsl(35, 99%, 36%)"},boolean:{color:"hsl(35, 99%, 36%)"},constant:{color:"hsl(35, 99%, 36%)"},number:{color:"hsl(35, 99%, 36%)"},atrule:{color:"hsl(35, 99%, 36%)"},keyword:{color:"hsl(301, 63%, 40%)"},property:{color:"hsl(5, 74%, 59%)"},tag:{color:"hsl(5, 74%, 59%)"},symbol:{color:"hsl(5, 74%, 59%)"},deleted:{color:"hsl(5, 74%, 59%)"},important:{color:"hsl(5, 74%, 59%)"},selector:{color:"hsl(119, 34%, 47%)"},string:{color:"hsl(119, 34%, 47%)"},char:{color:"hsl(119, 34%, 47%)"},builtin:{color:"hsl(119, 34%, 47%)"},inserted:{color:"hsl(119, 34%, 47%)"},regex:{color:"hsl(119, 34%, 47%)"},"attr-value":{color:"hsl(119, 34%, 47%)"},"attr-value > .token.punctuation":{color:"hsl(119, 34%, 47%)"},variable:{color:"hsl(221, 87%, 60%)"},operator:{color:"hsl(221, 87%, 60%)"},function:{color:"hsl(221, 87%, 60%)"},url:{color:"hsl(198, 99%, 37%)"},"attr-value > .token.punctuation.attr-equals":{color:"hsl(230, 8%, 24%)"},"special-attr > .token.attr-value > .token.value.css":{color:"hsl(230, 8%, 24%)"},".language-css .token.selector":{color:"hsl(5, 74%, 59%)"},".language-css .token.property":{color:"hsl(230, 8%, 24%)"},".language-css .token.function":{color:"hsl(198, 99%, 37%)"},".language-css .token.url > .token.function":{color:"hsl(198, 99%, 37%)"},".language-css .token.url > .token.string.url":{color:"hsl(119, 34%, 47%)"},".language-css .token.important":{color:"hsl(301, 63%, 40%)"},".language-css .token.atrule .token.rule":{color:"hsl(301, 63%, 40%)"},".language-javascript .token.operator":{color:"hsl(301, 63%, 40%)"},".language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation":{color:"hsl(344, 84%, 43%)"},".language-json .token.operator":{color:"hsl(230, 8%, 24%)"},".language-json .token.null.keyword":{color:"hsl(35, 99%, 36%)"},".language-markdown .token.url":{color:"hsl(230, 8%, 24%)"},".language-markdown .token.url > .token.operator":{color:"hsl(230, 8%, 24%)"},".language-markdown .token.url-reference.url > .token.string":{color:"hsl(230, 8%, 24%)"},".language-markdown .token.url > .token.content":{color:"hsl(221, 87%, 60%)"},".language-markdown .token.url > .token.url":{color:"hsl(198, 99%, 37%)"},".language-markdown .token.url-reference.url":{color:"hsl(198, 99%, 37%)"},".language-markdown .token.blockquote.punctuation":{color:"hsl(230, 4%, 64%)",fontStyle:"italic"},".language-markdown .token.hr.punctuation":{color:"hsl(230, 4%, 64%)",fontStyle:"italic"},".language-markdown .token.code-snippet":{color:"hsl(119, 34%, 47%)"},".language-markdown .token.bold .token.content":{color:"hsl(35, 99%, 36%)"},".language-markdown .token.italic .token.content":{color:"hsl(301, 63%, 40%)"},".language-markdown .token.strike .token.content":{color:"hsl(5, 74%, 59%)"},".language-markdown .token.strike .token.punctuation":{color:"hsl(5, 74%, 59%)"},".language-markdown .token.list.punctuation":{color:"hsl(5, 74%, 59%)"},".language-markdown .token.title.important > .token.punctuation":{color:"hsl(5, 74%, 59%)"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},namespace:{Opacity:"0.8"},"token.tab:not(:empty):before":{color:"hsla(230, 8%, 24%, 0.2)"},"token.cr:before":{color:"hsla(230, 8%, 24%, 0.2)"},"token.lf:before":{color:"hsla(230, 8%, 24%, 0.2)"},"token.space:before":{color:"hsla(230, 8%, 24%, 0.2)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item":{marginRight:"0.4em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button":{background:"hsl(230, 1%, 90%)",color:"hsl(230, 6%, 44%)",padding:"0.1em 0.4em",borderRadius:"0.3em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a":{background:"hsl(230, 1%, 90%)",color:"hsl(230, 6%, 44%)",padding:"0.1em 0.4em",borderRadius:"0.3em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span":{background:"hsl(230, 1%, 90%)",color:"hsl(230, 6%, 44%)",padding:"0.1em 0.4em",borderRadius:"0.3em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover":{background:"hsl(230, 1%, 78%)",color:"hsl(230, 8%, 24%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus":{background:"hsl(230, 1%, 78%)",color:"hsl(230, 8%, 24%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover":{background:"hsl(230, 1%, 78%)",color:"hsl(230, 8%, 24%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus":{background:"hsl(230, 1%, 78%)",color:"hsl(230, 8%, 24%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover":{background:"hsl(230, 1%, 78%)",color:"hsl(230, 8%, 24%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus":{background:"hsl(230, 1%, 78%)",color:"hsl(230, 8%, 24%)"},".line-highlight.line-highlight":{background:"hsla(230, 8%, 24%, 0.05)"},".line-highlight.line-highlight:before":{background:"hsl(230, 1%, 90%)",color:"hsl(230, 8%, 24%)",padding:"0.1em 0.6em",borderRadius:"0.3em",boxShadow:"0 2px 0 0 rgba(0, 0, 0, 0.2)"},".line-highlight.line-highlight[data-end]:after":{background:"hsl(230, 1%, 90%)",color:"hsl(230, 8%, 24%)",padding:"0.1em 0.6em",borderRadius:"0.3em",boxShadow:"0 2px 0 0 rgba(0, 0, 0, 0.2)"},"pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before":{backgroundColor:"hsla(230, 8%, 24%, 0.05)"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"hsla(230, 8%, 24%, 0.2)"},".command-line .command-line-prompt":{borderRightColor:"hsla(230, 8%, 24%, 0.2)"},".line-numbers .line-numbers-rows > span:before":{color:"hsl(230, 1%, 62%)"},".command-line .command-line-prompt > span:before":{color:"hsl(230, 1%, 62%)"},".rainbow-braces .token.token.punctuation.brace-level-1":{color:"hsl(5, 74%, 59%)"},".rainbow-braces .token.token.punctuation.brace-level-5":{color:"hsl(5, 74%, 59%)"},".rainbow-braces .token.token.punctuation.brace-level-9":{color:"hsl(5, 74%, 59%)"},".rainbow-braces .token.token.punctuation.brace-level-2":{color:"hsl(119, 34%, 47%)"},".rainbow-braces .token.token.punctuation.brace-level-6":{color:"hsl(119, 34%, 47%)"},".rainbow-braces .token.token.punctuation.brace-level-10":{color:"hsl(119, 34%, 47%)"},".rainbow-braces .token.token.punctuation.brace-level-3":{color:"hsl(221, 87%, 60%)"},".rainbow-braces .token.token.punctuation.brace-level-7":{color:"hsl(221, 87%, 60%)"},".rainbow-braces .token.token.punctuation.brace-level-11":{color:"hsl(221, 87%, 60%)"},".rainbow-braces .token.token.punctuation.brace-level-4":{color:"hsl(301, 63%, 40%)"},".rainbow-braces .token.token.punctuation.brace-level-8":{color:"hsl(301, 63%, 40%)"},".rainbow-braces .token.token.punctuation.brace-level-12":{color:"hsl(301, 63%, 40%)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)":{backgroundColor:"hsla(353, 100%, 66%, 0.15)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)":{backgroundColor:"hsla(353, 100%, 66%, 0.15)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix) *::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix) *::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)":{backgroundColor:"hsla(137, 100%, 55%, 0.15)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)":{backgroundColor:"hsla(137, 100%, 55%, 0.15)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix) *::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix) *::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},".prism-previewer.prism-previewer:before":{borderColor:"hsl(0, 0, 95%)"},".prism-previewer-gradient.prism-previewer-gradient div":{borderColor:"hsl(0, 0, 95%)",borderRadius:"0.3em"},".prism-previewer-color.prism-previewer-color:before":{borderRadius:"0.3em"},".prism-previewer-easing.prism-previewer-easing:before":{borderRadius:"0.3em"},".prism-previewer.prism-previewer:after":{borderTopColor:"hsl(0, 0, 95%)"},".prism-previewer-flipped.prism-previewer-flipped.after":{borderBottomColor:"hsl(0, 0, 95%)"},".prism-previewer-angle.prism-previewer-angle:before":{background:"hsl(0, 0%, 100%)"},".prism-previewer-time.prism-previewer-time:before":{background:"hsl(0, 0%, 100%)"},".prism-previewer-easing.prism-previewer-easing":{background:"hsl(0, 0%, 100%)"},".prism-previewer-angle.prism-previewer-angle circle":{stroke:"hsl(230, 8%, 24%)",strokeOpacity:"1"},".prism-previewer-time.prism-previewer-time circle":{stroke:"hsl(230, 8%, 24%)",strokeOpacity:"1"},".prism-previewer-easing.prism-previewer-easing circle":{stroke:"hsl(230, 8%, 24%)",fill:"transparent"},".prism-previewer-easing.prism-previewer-easing path":{stroke:"hsl(230, 8%, 24%)"},".prism-previewer-easing.prism-previewer-easing line":{stroke:"hsl(230, 8%, 24%)"}};e.default=t}(ix)),ix}var sx={},Y5;function m0e(){return Y5||(Y5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordBreak:"break-all",wordWrap:"break-word",fontFamily:'Menlo, Monaco, "Courier New", monospace',fontSize:"15px",lineHeight:"1.5",color:"#dccf8f",textShadow:"0"},'pre[class*="language-"]':{MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordBreak:"break-all",wordWrap:"break-word",fontFamily:'Menlo, Monaco, "Courier New", monospace',fontSize:"15px",lineHeight:"1.5",color:"#DCCF8F",textShadow:"0",borderRadius:"5px",border:"1px solid #000",background:"#181914 url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAMAAA/+4ADkFkb2JlAGTAAAAAAf/bAIQACQYGBgcGCQcHCQ0IBwgNDwsJCQsPEQ4ODw4OERENDg4ODg0RERQUFhQUERoaHBwaGiYmJiYmKysrKysrKysrKwEJCAgJCgkMCgoMDwwODA8TDg4ODhMVDg4PDg4VGhMRERERExoXGhYWFhoXHR0aGh0dJCQjJCQrKysrKysrKysr/8AAEQgAjACMAwEiAAIRAQMRAf/EAF4AAQEBAAAAAAAAAAAAAAAAAAABBwEBAQAAAAAAAAAAAAAAAAAAAAIQAAEDAwIHAQEAAAAAAAAAAADwAREhYaExkUFRcYGxwdHh8REBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AyGFEjHaBS2fDDs2zkhKmBKktb7km+ZwwCnXPkLVmCTMItj6AXFxRS465/BTnkAJvkLkJe+7AKKoi2AtRS2zuAWsCb5GOlBN8gKfmuGHZ8MFqIth3ALmFoFwbwKWyAlTAp17uKqBvgBD8sM4fTjhvAhkzhaRkBMKBrfs7jGPIpzy7gFrAqnC0C0gB0EWwBDW2cBVQwm+QtPpa3wBO3sVvszCnLAhkzgL5/RLf13cLQd8/AGlu0Cb5HTx9KuAEieGJEdcehS3eRTp2ATdt3CpIm+QtZwAhROXFeb7swp/ahaM3kBE/jSIUBc/AWrgBN8uNFAl+b7sAXFxFn2YLUU5Ns7gFX8C4ib+hN8gFWXwK3bZglxEJm+gKdciLPsFV/TClsgJUwKJ5FVA7tvIFrfZhVfGJDcsCKaYgAqv6YRbE+RWOWBtu7+AL3yRalXLyKqAIIfk+zARbDgFyEsncYwJvlgFRW+GEWntIi2P0BooyFxcNr8Ep3+ANLbMO+QyhvbiqdgC0kVvgUUiLYgBS2QtPbiVI1/sgOmG9uO+Y8DW+7jS2zAOnj6O2BndwuIAUtkdRN8gFoK3wwXMQyZwHVbClsuNLd4E3yAUR6FVDBR+BafQGt93LVMxJTv8ABts4CVLhcfYWsCb5kC9/BHdU8CLYFY5bMAd+eX9MGthhpbA1vu4B7+RKkaW2Yq4AQtVBBFsAJU/AuIXBhN8gGWnstefhiZyWvLAEnbYS1uzSFP6Jvn4Baxx70JKkQojLib5AVTey1jjgkKJGO0AKWyOm7N7cSpgSpAdPH0Tfd/gp1z5C1ZgKqN9J2wFxcUUuAFLZAm+QC0Fb4YUVRFsAOvj4KW2dwtYE3yAWk/wS/PLMKfmuGHZ8MAXF/Ja32Yi5haAKWz4Ydm2cSpgU693Atb7km+Zwwh+WGcPpxw3gAkzCLY+iYUDW/Z3Adc/gpzyFrAqnALkJe+7DoItgAtRS2zuKqGE3yAx0oJvkdvYrfZmALURbDuL5/RLf13cAuDeBS2RpbtAm+QFVA3wR+3fUtFHoBDJnC0jIXH0HWsgMY8inPLuOkd9chp4z20ALQLSA8cI9jYAIa2zjzjBd8gRafS1vgiUho/kAKcsCGTOGWvoOpkAtB3z8Hm8x2Ff5ADp4+lXAlIvcmwH/2Q==') repeat left top",padding:"12px",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},':not(pre) > code[class*="language-"]':{borderRadius:"5px",border:"1px solid #000",color:"#DCCF8F",background:"#181914 url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAMAAA/+4ADkFkb2JlAGTAAAAAAf/bAIQACQYGBgcGCQcHCQ0IBwgNDwsJCQsPEQ4ODw4OERENDg4ODg0RERQUFhQUERoaHBwaGiYmJiYmKysrKysrKysrKwEJCAgJCgkMCgoMDwwODA8TDg4ODhMVDg4PDg4VGhMRERERExoXGhYWFhoXHR0aGh0dJCQjJCQrKysrKysrKysr/8AAEQgAjACMAwEiAAIRAQMRAf/EAF4AAQEBAAAAAAAAAAAAAAAAAAABBwEBAQAAAAAAAAAAAAAAAAAAAAIQAAEDAwIHAQEAAAAAAAAAAADwAREhYaExkUFRcYGxwdHh8REBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AyGFEjHaBS2fDDs2zkhKmBKktb7km+ZwwCnXPkLVmCTMItj6AXFxRS465/BTnkAJvkLkJe+7AKKoi2AtRS2zuAWsCb5GOlBN8gKfmuGHZ8MFqIth3ALmFoFwbwKWyAlTAp17uKqBvgBD8sM4fTjhvAhkzhaRkBMKBrfs7jGPIpzy7gFrAqnC0C0gB0EWwBDW2cBVQwm+QtPpa3wBO3sVvszCnLAhkzgL5/RLf13cLQd8/AGlu0Cb5HTx9KuAEieGJEdcehS3eRTp2ATdt3CpIm+QtZwAhROXFeb7swp/ahaM3kBE/jSIUBc/AWrgBN8uNFAl+b7sAXFxFn2YLUU5Ns7gFX8C4ib+hN8gFWXwK3bZglxEJm+gKdciLPsFV/TClsgJUwKJ5FVA7tvIFrfZhVfGJDcsCKaYgAqv6YRbE+RWOWBtu7+AL3yRalXLyKqAIIfk+zARbDgFyEsncYwJvlgFRW+GEWntIi2P0BooyFxcNr8Ep3+ANLbMO+QyhvbiqdgC0kVvgUUiLYgBS2QtPbiVI1/sgOmG9uO+Y8DW+7jS2zAOnj6O2BndwuIAUtkdRN8gFoK3wwXMQyZwHVbClsuNLd4E3yAUR6FVDBR+BafQGt93LVMxJTv8ABts4CVLhcfYWsCb5kC9/BHdU8CLYFY5bMAd+eX9MGthhpbA1vu4B7+RKkaW2Yq4AQtVBBFsAJU/AuIXBhN8gGWnstefhiZyWvLAEnbYS1uzSFP6Jvn4Baxx70JKkQojLib5AVTey1jjgkKJGO0AKWyOm7N7cSpgSpAdPH0Tfd/gp1z5C1ZgKqN9J2wFxcUUuAFLZAm+QC0Fb4YUVRFsAOvj4KW2dwtYE3yAWk/wS/PLMKfmuGHZ8MAXF/Ja32Yi5haAKWz4Ydm2cSpgU693Atb7km+Zwwh+WGcPpxw3gAkzCLY+iYUDW/Z3Adc/gpzyFrAqnALkJe+7DoItgAtRS2zuKqGE3yAx0oJvkdvYrfZmALURbDuL5/RLf13cAuDeBS2RpbtAm+QFVA3wR+3fUtFHoBDJnC0jIXH0HWsgMY8inPLuOkd9chp4z20ALQLSA8cI9jYAIa2zjzjBd8gRafS1vgiUho/kAKcsCGTOGWvoOpkAtB3z8Hm8x2Ff5ADp4+lXAlIvcmwH/2Q==') repeat left top",padding:"2px 6px"},namespace:{Opacity:".7"},comment:{color:"#586e75",fontStyle:"italic"},prolog:{color:"#586e75",fontStyle:"italic"},doctype:{color:"#586e75",fontStyle:"italic"},cdata:{color:"#586e75",fontStyle:"italic"},number:{color:"#b89859"},string:{color:"#468966"},char:{color:"#468966"},builtin:{color:"#468966"},inserted:{color:"#468966"},"attr-name":{color:"#b89859"},operator:{color:"#dccf8f"},entity:{color:"#dccf8f",cursor:"help"},url:{color:"#dccf8f"},".language-css .token.string":{color:"#dccf8f"},".style .token.string":{color:"#dccf8f"},selector:{color:"#859900"},regex:{color:"#859900"},atrule:{color:"#cb4b16"},keyword:{color:"#cb4b16"},"attr-value":{color:"#468966"},function:{color:"#b58900"},variable:{color:"#b58900"},placeholder:{color:"#b58900"},property:{color:"#b89859"},tag:{color:"#ffb03b"},boolean:{color:"#b89859"},constant:{color:"#b89859"},symbol:{color:"#b89859"},important:{color:"#dc322f"},statement:{color:"#dc322f"},deleted:{color:"#dc322f"},punctuation:{color:"#dccf8f"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(sx)),sx}var lx={},Z5;function h0e(){return Z5||(Z5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={"code[class*='language-']":{color:"#9efeff",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",fontFamily:"'Operator Mono', 'Fira Code', Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontWeight:"400",fontSize:"17px",lineHeight:"25px",letterSpacing:"0.5px",textShadow:"0 1px #222245"},"pre[class*='language-']":{color:"#9efeff",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",fontFamily:"'Operator Mono', 'Fira Code', Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontWeight:"400",fontSize:"17px",lineHeight:"25px",letterSpacing:"0.5px",textShadow:"0 1px #222245",padding:"2em",margin:"0.5em 0",overflow:"auto",background:"#1e1e3f"},"pre[class*='language-']::-moz-selection":{color:"inherit",background:"#a599e9"},"pre[class*='language-'] ::-moz-selection":{color:"inherit",background:"#a599e9"},"code[class*='language-']::-moz-selection":{color:"inherit",background:"#a599e9"},"code[class*='language-'] ::-moz-selection":{color:"inherit",background:"#a599e9"},"pre[class*='language-']::selection":{color:"inherit",background:"#a599e9"},"pre[class*='language-'] ::selection":{color:"inherit",background:"#a599e9"},"code[class*='language-']::selection":{color:"inherit",background:"#a599e9"},"code[class*='language-'] ::selection":{color:"inherit",background:"#a599e9"},":not(pre) > code[class*='language-']":{background:"#1e1e3f",padding:"0.1em",borderRadius:"0.3em"},"":{fontWeight:"400"},comment:{color:"#b362ff"},prolog:{color:"#b362ff"},cdata:{color:"#b362ff"},delimiter:{color:"#ff9d00"},keyword:{color:"#ff9d00"},selector:{color:"#ff9d00"},important:{color:"#ff9d00"},atrule:{color:"#ff9d00"},operator:{color:"rgb(255, 180, 84)",background:"none"},"attr-name":{color:"rgb(255, 180, 84)"},punctuation:{color:"#ffffff"},boolean:{color:"rgb(255, 98, 140)"},tag:{color:"rgb(255, 157, 0)"},"tag.punctuation":{color:"rgb(255, 157, 0)"},doctype:{color:"rgb(255, 157, 0)"},builtin:{color:"rgb(255, 157, 0)"},entity:{color:"#6897bb",background:"none"},symbol:{color:"#6897bb"},number:{color:"#ff628c"},property:{color:"#ff628c"},constant:{color:"#ff628c"},variable:{color:"#ff628c"},string:{color:"#a5ff90"},char:{color:"#a5ff90"},"attr-value":{color:"#a5c261"},"attr-value.punctuation":{color:"#a5c261"},"attr-value.punctuation:first-child":{color:"#a9b7c6"},url:{color:"#287bde",textDecoration:"underline",background:"none"},function:{color:"rgb(250, 208, 0)"},regex:{background:"#364135"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},inserted:{background:"#00ff00"},deleted:{background:"#ff000d"},"code.language-css .token.property":{color:"#a9b7c6"},"code.language-css .token.property + .token.punctuation":{color:"#a9b7c6"},"code.language-css .token.id":{color:"#ffc66d"},"code.language-css .token.selector > .token.class":{color:"#ffc66d"},"code.language-css .token.selector > .token.attribute":{color:"#ffc66d"},"code.language-css .token.selector > .token.pseudo-class":{color:"#ffc66d"},"code.language-css .token.selector > .token.pseudo-element":{color:"#ffc66d"},"class-name":{color:"#fb94ff"},".language-css .token.string":{background:"none"},".style .token.string":{background:"none"},".line-highlight.line-highlight":{marginTop:"36px",background:"linear-gradient(to right, rgba(179, 98, 255, 0.17), transparent)"},".line-highlight.line-highlight:before":{content:"''"},".line-highlight.line-highlight[data-end]:after":{content:"''"}};e.default=t}(lx)),lx}var cx={},X5;function b0e(){return X5||(X5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#839496",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Inconsolata, Monaco, Consolas, 'Courier New', Courier, monospace",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#839496",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Inconsolata, Monaco, Consolas, 'Courier New', Courier, monospace",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",borderRadius:"0.3em",background:"#002b36"},':not(pre) > code[class*="language-"]':{background:"#002b36",padding:".1em",borderRadius:".3em"},comment:{color:"#586e75"},prolog:{color:"#586e75"},doctype:{color:"#586e75"},cdata:{color:"#586e75"},punctuation:{color:"#93a1a1"},".namespace":{Opacity:".7"},property:{color:"#268bd2"},keyword:{color:"#268bd2"},tag:{color:"#268bd2"},"class-name":{color:"#FFFFB6",textDecoration:"underline"},boolean:{color:"#b58900"},constant:{color:"#b58900"},symbol:{color:"#dc322f"},deleted:{color:"#dc322f"},number:{color:"#859900"},selector:{color:"#859900"},"attr-name":{color:"#859900"},string:{color:"#859900"},char:{color:"#859900"},builtin:{color:"#859900"},inserted:{color:"#859900"},variable:{color:"#268bd2"},operator:{color:"#EDEDED"},function:{color:"#268bd2"},regex:{color:"#E9C062"},important:{color:"#fd971f",fontWeight:"bold"},entity:{color:"#FFFFB6",cursor:"help"},url:{color:"#96CBFE"},".language-css .token.string":{color:"#87C38A"},".style .token.string":{color:"#87C38A"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},atrule:{color:"#F9EE98"},"attr-value":{color:"#F9EE98"}};e.default=t}(cx)),cx}var ux={},Q5;function y0e(){return Q5||(Q5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",backgroundColor:"transparent !important",backgroundImage:"linear-gradient(to bottom, #2a2139 75%, #34294f)"},':not(pre) > code[class*="language-"]':{backgroundColor:"transparent !important",backgroundImage:"linear-gradient(to bottom, #2a2139 75%, #34294f)",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#8e8e8e"},"block-comment":{color:"#8e8e8e"},prolog:{color:"#8e8e8e"},doctype:{color:"#8e8e8e"},cdata:{color:"#8e8e8e"},punctuation:{color:"#ccc"},tag:{color:"#e2777a"},"attr-name":{color:"#e2777a"},namespace:{color:"#e2777a"},number:{color:"#e2777a"},unit:{color:"#e2777a"},hexcode:{color:"#e2777a"},deleted:{color:"#e2777a"},property:{color:"#72f1b8",textShadow:"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475"},selector:{color:"#72f1b8",textShadow:"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475"},"function-name":{color:"#6196cc"},boolean:{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"},"selector.id":{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"},function:{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"},"class-name":{color:"#fff5f6",textShadow:"0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75"},constant:{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"},symbol:{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"},important:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575",fontWeight:"bold"},atrule:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"},keyword:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"},"selector.class":{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"},builtin:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"},string:{color:"#f87c32"},char:{color:"#f87c32"},"attr-value":{color:"#f87c32"},regex:{color:"#f87c32"},variable:{color:"#f87c32"},operator:{color:"#67cdcc"},entity:{color:"#67cdcc",cursor:"help"},url:{color:"#67cdcc"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},inserted:{color:"green"}};e.default=t}(ux)),ux}var dx={},J5;function v0e(){return J5||(J5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#393A34",fontFamily:'"Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",fontSize:".9em",lineHeight:"1.2em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#393A34",fontFamily:'"Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",fontSize:".9em",lineHeight:"1.2em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",border:"1px solid #dddddd",backgroundColor:"white"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{background:"#C1DEF1"},'pre[class*="language-"] ::-moz-selection':{background:"#C1DEF1"},'code[class*="language-"]::-moz-selection':{background:"#C1DEF1"},'code[class*="language-"] ::-moz-selection':{background:"#C1DEF1"},'pre[class*="language-"]::selection':{background:"#C1DEF1"},'pre[class*="language-"] ::selection':{background:"#C1DEF1"},'code[class*="language-"]::selection':{background:"#C1DEF1"},'code[class*="language-"] ::selection':{background:"#C1DEF1"},':not(pre) > code[class*="language-"]':{padding:".2em",paddingTop:"1px",paddingBottom:"1px",background:"#f8f8f8",border:"1px solid #dddddd"},comment:{color:"#008000",fontStyle:"italic"},prolog:{color:"#008000",fontStyle:"italic"},doctype:{color:"#008000",fontStyle:"italic"},cdata:{color:"#008000",fontStyle:"italic"},namespace:{Opacity:".7"},string:{color:"#A31515"},punctuation:{color:"#393A34"},operator:{color:"#393A34"},url:{color:"#36acaa"},symbol:{color:"#36acaa"},number:{color:"#36acaa"},boolean:{color:"#36acaa"},variable:{color:"#36acaa"},constant:{color:"#36acaa"},inserted:{color:"#36acaa"},atrule:{color:"#0000ff"},keyword:{color:"#0000ff"},"attr-value":{color:"#0000ff"},".language-autohotkey .token.selector":{color:"#0000ff"},".language-json .token.boolean":{color:"#0000ff"},".language-json .token.number":{color:"#0000ff"},'code[class*="language-css"]':{color:"#0000ff"},function:{color:"#393A34"},deleted:{color:"#9a050f"},".language-autohotkey .token.tag":{color:"#9a050f"},selector:{color:"#800000"},".language-autohotkey .token.keyword":{color:"#00009f"},important:{color:"#e90",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},"class-name":{color:"#2B91AF"},".language-json .token.property":{color:"#2B91AF"},tag:{color:"#800000"},"attr-name":{color:"#ff0000"},property:{color:"#ff0000"},regex:{color:"#ff0000"},entity:{color:"#ff0000"},"directive.tag.tag":{background:"#ffff00",color:"#393A34"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"#a5a5a5"},".line-numbers .line-numbers-rows > span:before":{color:"#2B91AF"},".line-highlight.line-highlight":{background:"linear-gradient(to right, rgba(193, 222, 241, 0.2) 70%, rgba(221, 222, 241, 0))"}};e.default=t}(dx)),dx}var fx={},e3;function S0e(){return e3||(e3=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'pre[class*="language-"]':{color:"#d4d4d4",fontSize:"13px",textShadow:"none",fontFamily:'Menlo, Monaco, Consolas, "Andale Mono", "Ubuntu Mono", "Courier New", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",background:"#1e1e1e"},'code[class*="language-"]':{color:"#d4d4d4",fontSize:"13px",textShadow:"none",fontFamily:'Menlo, Monaco, Consolas, "Andale Mono", "Ubuntu Mono", "Courier New", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#264F78"},'code[class*="language-"]::selection':{textShadow:"none",background:"#264F78"},'pre[class*="language-"] *::selection':{textShadow:"none",background:"#264F78"},'code[class*="language-"] *::selection':{textShadow:"none",background:"#264F78"},':not(pre) > code[class*="language-"]':{padding:".1em .3em",borderRadius:".3em",color:"#db4c69",background:"#1e1e1e"},".namespace":{Opacity:".7"},"doctype.doctype-tag":{color:"#569CD6"},"doctype.name":{color:"#9cdcfe"},comment:{color:"#6a9955"},prolog:{color:"#6a9955"},punctuation:{color:"#d4d4d4"},".language-html .language-css .token.punctuation":{color:"#d4d4d4"},".language-html .language-javascript .token.punctuation":{color:"#d4d4d4"},property:{color:"#9cdcfe"},tag:{color:"#569cd6"},boolean:{color:"#569cd6"},number:{color:"#b5cea8"},constant:{color:"#9cdcfe"},symbol:{color:"#b5cea8"},inserted:{color:"#b5cea8"},unit:{color:"#b5cea8"},selector:{color:"#d7ba7d"},"attr-name":{color:"#9cdcfe"},string:{color:"#ce9178"},char:{color:"#ce9178"},builtin:{color:"#ce9178"},deleted:{color:"#ce9178"},".language-css .token.string.url":{textDecoration:"underline"},operator:{color:"#d4d4d4"},entity:{color:"#569cd6"},"operator.arrow":{color:"#569CD6"},atrule:{color:"#ce9178"},"atrule.rule":{color:"#c586c0"},"atrule.url":{color:"#9cdcfe"},"atrule.url.function":{color:"#dcdcaa"},"atrule.url.punctuation":{color:"#d4d4d4"},keyword:{color:"#569CD6"},"keyword.module":{color:"#c586c0"},"keyword.control-flow":{color:"#c586c0"},function:{color:"#dcdcaa"},"function.maybe-class-name":{color:"#dcdcaa"},regex:{color:"#d16969"},important:{color:"#569cd6"},italic:{fontStyle:"italic"},"class-name":{color:"#4ec9b0"},"maybe-class-name":{color:"#4ec9b0"},console:{color:"#9cdcfe"},parameter:{color:"#9cdcfe"},interpolation:{color:"#9cdcfe"},"punctuation.interpolation-punctuation":{color:"#569cd6"},variable:{color:"#9cdcfe"},"imports.maybe-class-name":{color:"#9cdcfe"},"exports.maybe-class-name":{color:"#9cdcfe"},escape:{color:"#d7ba7d"},"tag.punctuation":{color:"#808080"},cdata:{color:"#808080"},"attr-value":{color:"#ce9178"},"attr-value.punctuation":{color:"#ce9178"},"attr-value.punctuation.attr-equals":{color:"#d4d4d4"},namespace:{color:"#4ec9b0"},'pre[class*="language-javascript"]':{color:"#9cdcfe"},'code[class*="language-javascript"]':{color:"#9cdcfe"},'pre[class*="language-jsx"]':{color:"#9cdcfe"},'code[class*="language-jsx"]':{color:"#9cdcfe"},'pre[class*="language-typescript"]':{color:"#9cdcfe"},'code[class*="language-typescript"]':{color:"#9cdcfe"},'pre[class*="language-tsx"]':{color:"#9cdcfe"},'code[class*="language-tsx"]':{color:"#9cdcfe"},'pre[class*="language-css"]':{color:"#ce9178"},'code[class*="language-css"]':{color:"#ce9178"},'pre[class*="language-html"]':{color:"#d4d4d4"},'code[class*="language-html"]':{color:"#d4d4d4"},".language-regex .token.anchor":{color:"#dcdcaa"},".language-html .token.punctuation":{color:"#808080"},'pre[class*="language-"] > code[class*="language-"]':{position:"relative",zIndex:"1"},".line-highlight.line-highlight":{background:"#f7ebc6",boxShadow:"inset 5px 0 0 #f7d87c",zIndex:"0"}};e.default=t}(fx)),fx}var px={},t3;function w0e(){return t3||(t3=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{MozTabSize:"2",OTabSize:"2",tabSize:"2",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordWrap:"normal",fontFamily:'Menlo, Monaco, "Courier New", monospace',fontSize:"14px",color:"#76d9e6",textShadow:"none"},'pre[class*="language-"]':{MozTabSize:"2",OTabSize:"2",tabSize:"2",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordWrap:"normal",fontFamily:'Menlo, Monaco, "Courier New", monospace',fontSize:"14px",color:"#76d9e6",textShadow:"none",background:"#2a2a2a",padding:"15px",borderRadius:"4px",border:"1px solid #e1e1e8",overflow:"auto",position:"relative"},'pre > code[class*="language-"]':{fontSize:"1em"},':not(pre) > code[class*="language-"]':{background:"#2a2a2a",padding:"0.15em 0.2em 0.05em",borderRadius:".3em",border:"0.13em solid #7a6652",boxShadow:"1px 1px 0.3em -0.1em #000 inset"},'pre[class*="language-"] code':{whiteSpace:"pre",display:"block"},namespace:{Opacity:".7"},comment:{color:"#6f705e"},prolog:{color:"#6f705e"},doctype:{color:"#6f705e"},cdata:{color:"#6f705e"},operator:{color:"#a77afe"},boolean:{color:"#a77afe"},number:{color:"#a77afe"},"attr-name":{color:"#e6d06c"},string:{color:"#e6d06c"},entity:{color:"#e6d06c",cursor:"help"},url:{color:"#e6d06c"},".language-css .token.string":{color:"#e6d06c"},".style .token.string":{color:"#e6d06c"},selector:{color:"#a6e22d"},inserted:{color:"#a6e22d"},atrule:{color:"#ef3b7d"},"attr-value":{color:"#ef3b7d"},keyword:{color:"#ef3b7d"},important:{color:"#ef3b7d",fontWeight:"bold"},deleted:{color:"#ef3b7d"},regex:{color:"#76d9e6"},statement:{color:"#76d9e6",fontWeight:"bold"},placeholder:{color:"#fff"},variable:{color:"#fff"},bold:{fontWeight:"bold"},punctuation:{color:"#bebec5"},italic:{fontStyle:"italic"},"code.language-markup":{color:"#f9f9f9"},"code.language-markup .token.tag":{color:"#ef3b7d"},"code.language-markup .token.attr-name":{color:"#a6e22d"},"code.language-markup .token.attr-value":{color:"#e6d06c"},"code.language-markup .token.style":{color:"#76d9e6"},"code.language-markup .token.script":{color:"#76d9e6"},"code.language-markup .token.script .token.keyword":{color:"#76d9e6"},".line-highlight.line-highlight":{padding:"0",background:"rgba(255, 255, 255, 0.08)"},".line-highlight.line-highlight:before":{padding:"0.2em 0.5em",backgroundColor:"rgba(255, 255, 255, 0.4)",color:"black",height:"1em",lineHeight:"1em",boxShadow:"0 1px 1px rgba(255, 255, 255, 0.7)"},".line-highlight.line-highlight[data-end]:after":{padding:"0.2em 0.5em",backgroundColor:"rgba(255, 255, 255, 0.4)",color:"black",height:"1em",lineHeight:"1em",boxShadow:"0 1px 1px rgba(255, 255, 255, 0.7)"}};e.default=t}(px)),px}var gx={},n3;function E0e(){return n3||(n3=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#22da17",fontFamily:"monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",lineHeight:"25px",fontSize:"18px",margin:"5px 0"},'pre[class*="language-"]':{color:"white",fontFamily:"monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",lineHeight:"25px",fontSize:"18px",margin:"0.5em 0",background:"#0a143c",padding:"1em",overflow:"auto"},'pre[class*="language-"] *':{fontFamily:"monospace"},':not(pre) > code[class*="language-"]':{color:"white",background:"#0a143c",padding:"0.1em",borderRadius:"0.3em",whiteSpace:"normal"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'pre[class*="language-"]::selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'code[class*="language-"]::selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'code[class*="language-"] ::selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},comment:{color:"rgb(99, 119, 119)",fontStyle:"italic"},prolog:{color:"rgb(99, 119, 119)",fontStyle:"italic"},cdata:{color:"rgb(99, 119, 119)",fontStyle:"italic"},punctuation:{color:"rgb(199, 146, 234)"},".namespace":{color:"rgb(178, 204, 214)"},deleted:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"},symbol:{color:"rgb(128, 203, 196)"},property:{color:"rgb(128, 203, 196)"},tag:{color:"rgb(127, 219, 202)"},operator:{color:"rgb(127, 219, 202)"},keyword:{color:"rgb(127, 219, 202)"},boolean:{color:"rgb(255, 88, 116)"},number:{color:"rgb(247, 140, 108)"},constant:{color:"rgb(34 183 199)"},function:{color:"rgb(34 183 199)"},builtin:{color:"rgb(34 183 199)"},char:{color:"rgb(34 183 199)"},selector:{color:"rgb(199, 146, 234)",fontStyle:"italic"},doctype:{color:"rgb(199, 146, 234)",fontStyle:"italic"},"attr-name":{color:"rgb(173, 219, 103)",fontStyle:"italic"},inserted:{color:"rgb(173, 219, 103)",fontStyle:"italic"},string:{color:"rgb(173, 219, 103)"},url:{color:"rgb(173, 219, 103)"},entity:{color:"rgb(173, 219, 103)"},".language-css .token.string":{color:"rgb(173, 219, 103)"},".style .token.string":{color:"rgb(173, 219, 103)"},"class-name":{color:"rgb(255, 203, 139)"},atrule:{color:"rgb(255, 203, 139)"},"attr-value":{color:"rgb(255, 203, 139)"},regex:{color:"rgb(214, 222, 235)"},important:{color:"rgb(214, 222, 235)",fontWeight:"bold"},variable:{color:"rgb(214, 222, 235)"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(gx)),gx}(function(e){var t=Owe;Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"a11yDark",{enumerable:!0,get:function(){return u.default}}),Object.defineProperty(e,"atomDark",{enumerable:!0,get:function(){return d.default}}),Object.defineProperty(e,"base16AteliersulphurpoolLight",{enumerable:!0,get:function(){return g.default}}),Object.defineProperty(e,"cb",{enumerable:!0,get:function(){return m.default}}),Object.defineProperty(e,"coldarkCold",{enumerable:!0,get:function(){return b.default}}),Object.defineProperty(e,"coldarkDark",{enumerable:!0,get:function(){return y.default}}),Object.defineProperty(e,"coy",{enumerable:!0,get:function(){return n.default}}),Object.defineProperty(e,"coyWithoutShadows",{enumerable:!0,get:function(){return w.default}}),Object.defineProperty(e,"darcula",{enumerable:!0,get:function(){return v.default}}),Object.defineProperty(e,"dark",{enumerable:!0,get:function(){return r.default}}),Object.defineProperty(e,"dracula",{enumerable:!0,get:function(){return h.default}}),Object.defineProperty(e,"duotoneDark",{enumerable:!0,get:function(){return S.default}}),Object.defineProperty(e,"duotoneEarth",{enumerable:!0,get:function(){return E.default}}),Object.defineProperty(e,"duotoneForest",{enumerable:!0,get:function(){return k.default}}),Object.defineProperty(e,"duotoneLight",{enumerable:!0,get:function(){return x.default}}),Object.defineProperty(e,"duotoneSea",{enumerable:!0,get:function(){return C.default}}),Object.defineProperty(e,"duotoneSpace",{enumerable:!0,get:function(){return _.default}}),Object.defineProperty(e,"funky",{enumerable:!0,get:function(){return a.default}}),Object.defineProperty(e,"ghcolors",{enumerable:!0,get:function(){return R.default}}),Object.defineProperty(e,"gruvboxDark",{enumerable:!0,get:function(){return T.default}}),Object.defineProperty(e,"gruvboxLight",{enumerable:!0,get:function(){return L.default}}),Object.defineProperty(e,"holiTheme",{enumerable:!0,get:function(){return D.default}}),Object.defineProperty(e,"hopscotch",{enumerable:!0,get:function(){return H.default}}),Object.defineProperty(e,"lucario",{enumerable:!0,get:function(){return z.default}}),Object.defineProperty(e,"materialDark",{enumerable:!0,get:function(){return M.default}}),Object.defineProperty(e,"materialLight",{enumerable:!0,get:function(){return U.default}}),Object.defineProperty(e,"materialOceanic",{enumerable:!0,get:function(){return X.default}}),Object.defineProperty(e,"nightOwl",{enumerable:!0,get:function(){return j.default}}),Object.defineProperty(e,"nord",{enumerable:!0,get:function(){return O.default}}),Object.defineProperty(e,"okaidia",{enumerable:!0,get:function(){return o.default}}),Object.defineProperty(e,"oneDark",{enumerable:!0,get:function(){return A.default}}),Object.defineProperty(e,"oneLight",{enumerable:!0,get:function(){return V.default}}),Object.defineProperty(e,"pojoaque",{enumerable:!0,get:function(){return P.default}}),Object.defineProperty(e,"prism",{enumerable:!0,get:function(){return c.default}}),Object.defineProperty(e,"shadesOfPurple",{enumerable:!0,get:function(){return N.default}}),Object.defineProperty(e,"solarizedDarkAtom",{enumerable:!0,get:function(){return K.default}}),Object.defineProperty(e,"solarizedlight",{enumerable:!0,get:function(){return i.default}}),Object.defineProperty(e,"synthwave84",{enumerable:!0,get:function(){return ae.default}}),Object.defineProperty(e,"tomorrow",{enumerable:!0,get:function(){return s.default}}),Object.defineProperty(e,"twilight",{enumerable:!0,get:function(){return l.default}}),Object.defineProperty(e,"vs",{enumerable:!0,get:function(){return ne.default}}),Object.defineProperty(e,"vscDarkPlus",{enumerable:!0,get:function(){return Q.default}}),Object.defineProperty(e,"xonokai",{enumerable:!0,get:function(){return pe.default}}),Object.defineProperty(e,"zTouch",{enumerable:!0,get:function(){return he.default}});var n=t(Dwe()),r=t(Lwe()),a=t(Mwe()),o=t(Pwe()),i=t($we()),s=t(Fwe()),l=t(jwe()),c=t(zwe()),u=t(Uwe()),d=t(Bwe()),g=t(Hwe()),m=t(Vwe()),b=t(qwe()),y=t(Gwe()),w=t(Wwe()),v=t(Kwe()),h=t(Ywe()),S=t(Zwe()),E=t(Xwe()),k=t(Qwe()),x=t(Jwe()),C=t(e0e()),_=t(t0e()),R=t(n0e()),T=t(r0e()),L=t(a0e()),D=t(o0e()),H=t(i0e()),z=t(s0e()),M=t(l0e()),U=t(c0e()),X=t(u0e()),j=t(d0e()),O=t(f0e()),A=t(p0e()),V=t(g0e()),P=t(m0e()),N=t(h0e()),K=t(b0e()),ae=t(y0e()),ne=t(v0e()),Q=t(S0e()),pe=t(w0e()),he=t(E0e())})(fz);const x0e={javascript:".js",python:".py",java:".java",c:".c",cpp:".cpp","c++":".cpp","c#":".cs",ruby:".rb",php:".php",swift:".swift","objective-c":".m",kotlin:".kt",typescript:".ts",go:".go",perl:".pl",rust:".rs",scala:".scala",haskell:".hs",lua:".lua",shell:".sh",sql:".sql",html:".html",css:".css"},k0e=(e,t=!1)=>{const n="ABCDEFGHJKLMNPQRSTUVWXY3456789";let r="";for(let a=0;a{const n=()=>{if(typeof window>"u")return;const a=x0e[e]||".file",o=`file-${k0e(3,!0)}${a}`,i=window.prompt("Enter file name",o);if(!i)return;const s=new Blob([t],{type:"text/plain"}),l=URL.createObjectURL(s),c=document.createElement("a");c.download=i,c.href=l,c.style.display="none",document.body.appendChild(c),c.click(),document.body.removeChild(c),URL.revokeObjectURL(l)},r=()=>{console.log("copy")};return f.jsxs("div",{className:"codeblock relative w-full bg-zinc-950 font-sans",children:[f.jsxs("div",{className:"flex w-full items-center justify-between bg-zinc-800 px-6 py-2 pr-4 text-zinc-100",children:[f.jsx("span",{className:"text-xs lowercase",children:e}),f.jsxs("div",{className:"flex items-center space-x-1",children:[f.jsxs(ue,{variant:"ghost",size:"icon",onClick:n,children:[f.jsx(Cq,{}),f.jsx("span",{className:"sr-only",children:"Download"})]}),f.jsxs(ue,{variant:"ghost",size:"icon",className:"text-xs hover:bg-zinc-800 focus-visible:ring-1 focus-visible:ring-slate-700 focus-visible:ring-offset-0",onClick:r,children:[f.jsx(Pm,{}),f.jsx("span",{className:"sr-only",children:"Copy code"})]})]})]}),f.jsx(Iwe,{language:e,style:fz.coldarkDark,PreTag:"div",showLineNumbers:!0,customStyle:{margin:0,width:"100%",background:"transparent",padding:"1.5rem 1rem"},lineNumberStyle:{userSelect:"none"},codeTagProps:{style:{fontSize:"0.9rem",fontFamily:"var(--font-mono)"}},children:t})]})});gz.displayName="CodeBlock";function C0e(e,t){const n=t||{};return(e[e.length-1]===""?[...e,""]:e).join((n.padRight?" ":"")+","+(n.padLeft===!1?"":" ")).trim()}const _0e=/^[$_\p{ID_Start}][$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,A0e=/^[$_\p{ID_Start}][-$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,T0e={};function r3(e,t){return((t||T0e).jsx?A0e:_0e).test(e)}const R0e=/[ \t\n\f\r]/g;function N0e(e){return typeof e=="object"?e.type==="text"?a3(e.value):!1:a3(e)}function a3(e){return e.replace(R0e,"")===""}class Cf{constructor(t,n,r){this.property=t,this.normal=n,r&&(this.space=r)}}Cf.prototype.property={};Cf.prototype.normal={};Cf.prototype.space=null;function mz(e,t){const n={},r={};let a=-1;for(;++a4&&n.slice(0,4)==="data"&&M0e.test(t)){if(t.charAt(4)==="-"){const o=t.slice(5).replace(i3,j0e);r="data"+o.charAt(0).toUpperCase()+o.slice(1)}else{const o=t.slice(4);if(!i3.test(o)){let i=o.replace(P0e,F0e);i.charAt(0)!=="-"&&(i="-"+i),t="data"+i}}a=PA}return new a(r,t)}function F0e(e){return"-"+e.toLowerCase()}function j0e(e){return e.charAt(1).toUpperCase()}const z0e={classId:"classID",dataType:"datatype",itemId:"itemID",strokeDashArray:"strokeDasharray",strokeDashOffset:"strokeDashoffset",strokeLineCap:"strokeLinecap",strokeLineJoin:"strokeLinejoin",strokeMiterLimit:"strokeMiterlimit",typeOf:"typeof",xLinkActuate:"xlinkActuate",xLinkArcRole:"xlinkArcrole",xLinkHref:"xlinkHref",xLinkRole:"xlinkRole",xLinkShow:"xlinkShow",xLinkTitle:"xlinkTitle",xLinkType:"xlinkType",xmlnsXLink:"xmlnsXlink"},U0e=mz([yz,bz,wz,Ez,D0e],"html"),$A=mz([yz,bz,wz,Ez,L0e],"svg");function B0e(e){return e.join(" ").trim()}var xz={},s3=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,H0e=/\n/g,V0e=/^\s*/,q0e=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,G0e=/^:\s*/,W0e=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,K0e=/^[;\s]*/,Y0e=/^\s+|\s+$/g,Z0e=` +`,l3="/",c3="*",Qi="",X0e="comment",Q0e="declaration",J0e=function(e,t){if(typeof e!="string")throw new TypeError("First argument must be a string");if(!e)return[];t=t||{};var n=1,r=1;function a(b){var y=b.match(H0e);y&&(n+=y.length);var w=b.lastIndexOf(Z0e);r=~w?b.length-w:r+b.length}function o(){var b={line:n,column:r};return function(y){return y.position=new i(b),c(),y}}function i(b){this.start=b,this.end={line:n,column:r},this.source=t.source}i.prototype.content=e;function s(b){var y=new Error(t.source+":"+n+":"+r+": "+b);if(y.reason=b,y.filename=t.source,y.line=n,y.column=r,y.source=e,!t.silent)throw y}function l(b){var y=b.exec(e);if(y){var w=y[0];return a(w),e=e.slice(w.length),y}}function c(){l(V0e)}function u(b){var y;for(b=b||[];y=d();)y!==!1&&b.push(y);return b}function d(){var b=o();if(!(l3!=e.charAt(0)||c3!=e.charAt(1))){for(var y=2;Qi!=e.charAt(y)&&(c3!=e.charAt(y)||l3!=e.charAt(y+1));)++y;if(y+=2,Qi===e.charAt(y-1))return s("End of comment missing");var w=e.slice(2,y-2);return r+=2,a(w),e=e.slice(y),r+=2,b({type:X0e,comment:w})}}function g(){var b=o(),y=l(q0e);if(y){if(d(),!l(G0e))return s("property missing ':'");var w=l(W0e),v=b({type:Q0e,property:u3(y[0].replace(s3,Qi)),value:w?u3(w[0].replace(s3,Qi)):Qi});return l(K0e),v}}function m(){var b=[];u(b);for(var y;y=g();)y!==!1&&(b.push(y),u(b));return b}return c(),m()};function u3(e){return e?e.replace(Y0e,Qi):Qi}var eEe=nn&&nn.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(xz,"__esModule",{value:!0});var tEe=eEe(J0e);function nEe(e,t){var n=null;if(!e||typeof e!="string")return n;var r=(0,tEe.default)(e),a=typeof t=="function";return r.forEach(function(o){if(o.type==="declaration"){var i=o.property,s=o.value;a?t(i,s,o):s&&(n=n||{},n[i]=s)}}),n}var d3=xz.default=nEe;const rEe=d3.default||d3,kz=Cz("end"),FA=Cz("start");function Cz(e){return t;function t(n){const r=n&&n.position&&n.position[e]||{};if(typeof r.line=="number"&&r.line>0&&typeof r.column=="number"&&r.column>0)return{line:r.line,column:r.column,offset:typeof r.offset=="number"&&r.offset>-1?r.offset:void 0}}}function aEe(e){const t=FA(e),n=kz(e);if(t&&n)return{start:t,end:n}}function Yu(e){return!e||typeof e!="object"?"":"position"in e||"type"in e?f3(e.position):"start"in e||"end"in e?f3(e):"line"in e||"column"in e?jk(e):""}function jk(e){return p3(e&&e.line)+":"+p3(e&&e.column)}function f3(e){return jk(e&&e.start)+"-"+jk(e&&e.end)}function p3(e){return e&&typeof e=="number"?e:1}class Bn extends Error{constructor(t,n,r){super(),typeof n=="string"&&(r=n,n=void 0);let a="",o={},i=!1;if(n&&("line"in n&&"column"in n?o={place:n}:"start"in n&&"end"in n?o={place:n}:"type"in n?o={ancestors:[n],place:n.position}:o={...n}),typeof t=="string"?a=t:!o.cause&&t&&(i=!0,a=t.message,o.cause=t),!o.ruleId&&!o.source&&typeof r=="string"){const l=r.indexOf(":");l===-1?o.ruleId=r:(o.source=r.slice(0,l),o.ruleId=r.slice(l+1))}if(!o.place&&o.ancestors&&o.ancestors){const l=o.ancestors[o.ancestors.length-1];l&&(o.place=l.position)}const s=o.place&&"start"in o.place?o.place.start:o.place;this.ancestors=o.ancestors||void 0,this.cause=o.cause||void 0,this.column=s?s.column:void 0,this.fatal=void 0,this.file,this.message=a,this.line=s?s.line:void 0,this.name=Yu(o.place)||"1:1",this.place=o.place||void 0,this.reason=this.message,this.ruleId=o.ruleId||void 0,this.source=o.source||void 0,this.stack=i&&o.cause&&typeof o.cause.stack=="string"?o.cause.stack:"",this.actual,this.expected,this.note,this.url}}Bn.prototype.file="";Bn.prototype.name="";Bn.prototype.reason="";Bn.prototype.message="";Bn.prototype.stack="";Bn.prototype.column=void 0;Bn.prototype.line=void 0;Bn.prototype.ancestors=void 0;Bn.prototype.cause=void 0;Bn.prototype.fatal=void 0;Bn.prototype.place=void 0;Bn.prototype.ruleId=void 0;Bn.prototype.source=void 0;const jA={}.hasOwnProperty,oEe=new Map,iEe=/[A-Z]/g,sEe=/-([a-z])/g,lEe=new Set(["table","tbody","thead","tfoot","tr"]),cEe=new Set(["td","th"]),_z="https://github.com/syntax-tree/hast-util-to-jsx-runtime";function uEe(e,t){if(!t||t.Fragment===void 0)throw new TypeError("Expected `Fragment` in options");const n=t.filePath||void 0;let r;if(t.development){if(typeof t.jsxDEV!="function")throw new TypeError("Expected `jsxDEV` in options when `development: true`");r=yEe(n,t.jsxDEV)}else{if(typeof t.jsx!="function")throw new TypeError("Expected `jsx` in production options");if(typeof t.jsxs!="function")throw new TypeError("Expected `jsxs` in production options");r=bEe(n,t.jsx,t.jsxs)}const a={Fragment:t.Fragment,ancestors:[],components:t.components||{},create:r,elementAttributeNameCase:t.elementAttributeNameCase||"react",evaluater:t.createEvaluater?t.createEvaluater():void 0,filePath:n,ignoreInvalidStyle:t.ignoreInvalidStyle||!1,passKeys:t.passKeys!==!1,passNode:t.passNode||!1,schema:t.space==="svg"?$A:U0e,stylePropertyNameCase:t.stylePropertyNameCase||"dom",tableCellAlignToStyle:t.tableCellAlignToStyle!==!1},o=Az(a,e,void 0);return o&&typeof o!="string"?o:a.create(e,a.Fragment,{children:o||void 0},void 0)}function Az(e,t,n){if(t.type==="element")return dEe(e,t,n);if(t.type==="mdxFlowExpression"||t.type==="mdxTextExpression")return fEe(e,t);if(t.type==="mdxJsxFlowElement"||t.type==="mdxJsxTextElement")return gEe(e,t,n);if(t.type==="mdxjsEsm")return pEe(e,t);if(t.type==="root")return mEe(e,t,n);if(t.type==="text")return hEe(e,t)}function dEe(e,t,n){const r=e.schema;let a=r;t.tagName.toLowerCase()==="svg"&&r.space==="html"&&(a=$A,e.schema=a),e.ancestors.push(t);const o=Rz(e,t.tagName,!1),i=vEe(e,t);let s=UA(e,t);return lEe.has(t.tagName)&&(s=s.filter(function(l){return typeof l=="string"?!N0e(l):!0})),Tz(e,i,o,t),zA(i,s),e.ancestors.pop(),e.schema=r,e.create(t,o,i,n)}function fEe(e,t){if(t.data&&t.data.estree&&e.evaluater){const r=t.data.estree.body[0];return r.type,e.evaluater.evaluateExpression(r.expression)}Rd(e,t.position)}function pEe(e,t){if(t.data&&t.data.estree&&e.evaluater)return e.evaluater.evaluateProgram(t.data.estree);Rd(e,t.position)}function gEe(e,t,n){const r=e.schema;let a=r;t.name==="svg"&&r.space==="html"&&(a=$A,e.schema=a),e.ancestors.push(t);const o=t.name===null?e.Fragment:Rz(e,t.name,!0),i=SEe(e,t),s=UA(e,t);return Tz(e,i,o,t),zA(i,s),e.ancestors.pop(),e.schema=r,e.create(t,o,i,n)}function mEe(e,t,n){const r={};return zA(r,UA(e,t)),e.create(t,e.Fragment,r,n)}function hEe(e,t){return t.value}function Tz(e,t,n,r){typeof n!="string"&&n!==e.Fragment&&e.passNode&&(t.node=r)}function zA(e,t){if(t.length>0){const n=t.length>1?t:t[0];n&&(e.children=n)}}function bEe(e,t,n){return r;function r(a,o,i,s){const c=Array.isArray(i.children)?n:t;return s?c(o,i,s):c(o,i)}}function yEe(e,t){return n;function n(r,a,o,i){const s=Array.isArray(o.children),l=FA(r);return t(a,o,i,s,{columnNumber:l?l.column-1:void 0,fileName:e,lineNumber:l?l.line:void 0},void 0)}}function vEe(e,t){const n={};let r,a;for(a in t.properties)if(a!=="children"&&jA.call(t.properties,a)){const o=wEe(e,a,t.properties[a]);if(o){const[i,s]=o;e.tableCellAlignToStyle&&i==="align"&&typeof s=="string"&&cEe.has(t.tagName)?r=s:n[i]=s}}if(r){const o=n.style||(n.style={});o[e.stylePropertyNameCase==="css"?"text-align":"textAlign"]=r}return n}function SEe(e,t){const n={};for(const r of t.attributes)if(r.type==="mdxJsxExpressionAttribute")if(r.data&&r.data.estree&&e.evaluater){const o=r.data.estree.body[0];o.type;const i=o.expression;i.type;const s=i.properties[0];s.type,Object.assign(n,e.evaluater.evaluateExpression(s.argument))}else Rd(e,t.position);else{const a=r.name;let o;if(r.value&&typeof r.value=="object")if(r.value.data&&r.value.data.estree&&e.evaluater){const s=r.value.data.estree.body[0];s.type,o=e.evaluater.evaluateExpression(s.expression)}else Rd(e,t.position);else o=r.value===null?!0:r.value;n[a]=o}return n}function UA(e,t){const n=[];let r=-1;const a=e.passKeys?new Map:oEe;for(;++ri))return;const C=t.events.length;let _=C,R,T;for(;_--;)if(t.events[_][0]==="exit"&&t.events[_][1].type==="chunkFlow"){if(R){T=t.events[_][1].end;break}R=!0}for(v(r),x=C;xS;){const k=n[E];t.containerState=k[1],k[0].exit.call(t,e)}n.length=S}function h(){a.write([null]),o=void 0,a=void 0,t.containerState._closeFlow=void 0}}function IEe(e,t,n){return ct(e,e.attempt(this.parser.constructs.document,t,n),"linePrefix",this.parser.constructs.disable.null.includes("codeIndented")?void 0:4)}const OEe={tokenize:DEe};function DEe(e){const t=this,n=e.attempt(Ef,r,e.attempt(this.parser.constructs.flowInitial,a,ct(e,e.attempt(this.parser.constructs.flow,a,e.attempt(Hue,a)),"linePrefix")));return n;function r(o){if(o===null){e.consume(o);return}return e.enter("lineEndingBlank"),e.consume(o),e.exit("lineEndingBlank"),t.currentConstruct=void 0,n}function a(o){if(o===null){e.consume(o);return}return e.enter("lineEnding"),e.consume(o),e.exit("lineEnding"),t.currentConstruct=void 0,n}}const LEe={resolveAll:Iz()},MEe=Nz("string"),PEe=Nz("text");function Nz(e){return{tokenize:t,resolveAll:Iz(e==="text"?$Ee:void 0)};function t(n){const r=this,a=this.parser.constructs[e],o=n.attempt(a,i,s);return i;function i(u){return c(u)?o(u):s(u)}function s(u){if(u===null){n.consume(u);return}return n.enter("data"),n.consume(u),l}function l(u){return c(u)?(n.exit("data"),o(u)):(n.consume(u),l)}function c(u){if(u===null)return!0;const d=a[u];let g=-1;if(d)for(;++g-1){const s=i[0];typeof s=="string"?i[0]=s.slice(r):i.shift()}o>0&&i.push(e[a].slice(0,o))}return i}function zEe(e,t){let n=-1;const r=[];let a;for(;++n0){const Tn=De.tokenStack[De.tokenStack.length-1];(Tn[1]||h3).call(De,void 0,Tn[0])}for(le.position={start:Fo(Z.length>0?Z[0][1].start:{line:1,column:1,offset:0}),end:Fo(Z.length>0?Z[Z.length-2][1].end:{line:1,column:1,offset:0})},ft=-1;++ft0){const Tn=De.tokenStack[De.tokenStack.length-1];(Tn[1]||h3).call(De,void 0,Tn[0])}for(le.position={start:Fo(Z.length>0?Z[0][1].start:{line:1,column:1,offset:0}),end:Fo(Z.length>0?Z[Z.length-2][1].end:{line:1,column:1,offset:0})},ft=-1;++ft1?"-"+s:""),dataFootnoteRef:!0,ariaDescribedBy:["footnote-label"]},children:[{type:"text",value:String(i)}]};e.patch(t,l);const c={type:"element",tagName:"sup",properties:{},children:[l]};return e.patch(t,c),e.applyData(t,c)}function uxe(e,t){const n={type:"element",tagName:"h"+t.depth,properties:{},children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}function dxe(e,t){if(e.options.allowDangerousHtml){const n={type:"raw",value:t.value};return e.patch(t,n),e.applyData(t,n)}}function Dz(e,t){const n=t.referenceType;let r="]";if(n==="collapsed"?r+="[]":n==="full"&&(r+="["+(t.label||t.identifier)+"]"),t.type==="imageReference")return[{type:"text",value:"!["+t.alt+r}];const a=e.all(t),o=a[0];o&&o.type==="text"?o.value="["+o.value:a.unshift({type:"text",value:"["});const i=a[a.length-1];return i&&i.type==="text"?i.value+=r:a.push({type:"text",value:r}),a}function fxe(e,t){const n=String(t.identifier).toUpperCase(),r=e.definitionById.get(n);if(!r)return Dz(e,t);const a={src:Hc(r.url||""),alt:t.alt};r.title!==null&&r.title!==void 0&&(a.title=r.title);const o={type:"element",tagName:"img",properties:a,children:[]};return e.patch(t,o),e.applyData(t,o)}function pxe(e,t){const n={src:Hc(t.url)};t.alt!==null&&t.alt!==void 0&&(n.alt=t.alt),t.title!==null&&t.title!==void 0&&(n.title=t.title);const r={type:"element",tagName:"img",properties:n,children:[]};return e.patch(t,r),e.applyData(t,r)}function gxe(e,t){const n={type:"text",value:t.value.replace(/\r?\n|\r/g," ")};e.patch(t,n);const r={type:"element",tagName:"code",properties:{},children:[n]};return e.patch(t,r),e.applyData(t,r)}function mxe(e,t){const n=String(t.identifier).toUpperCase(),r=e.definitionById.get(n);if(!r)return Dz(e,t);const a={href:Hc(r.url||"")};r.title!==null&&r.title!==void 0&&(a.title=r.title);const o={type:"element",tagName:"a",properties:a,children:e.all(t)};return e.patch(t,o),e.applyData(t,o)}function hxe(e,t){const n={href:Hc(t.url)};t.title!==null&&t.title!==void 0&&(n.title=t.title);const r={type:"element",tagName:"a",properties:n,children:e.all(t)};return e.patch(t,r),e.applyData(t,r)}function bxe(e,t,n){const r=e.all(t),a=n?yxe(n):Lz(t),o={},i=[];if(typeof t.checked=="boolean"){const u=r[0];let d;u&&u.type==="element"&&u.tagName==="p"?d=u:(d={type:"element",tagName:"p",properties:{},children:[]},r.unshift(d)),d.children.length>0&&d.children.unshift({type:"text",value:" "}),d.children.unshift({type:"element",tagName:"input",properties:{type:"checkbox",checked:t.checked,disabled:!0},children:[]}),o.className=["task-list-item"]}let s=-1;for(;++s1?"-"+s:""),dataFootnoteRef:!0,ariaDescribedBy:["footnote-label"]},children:[{type:"text",value:String(i)}]};e.patch(t,l);const c={type:"element",tagName:"sup",properties:{},children:[l]};return e.patch(t,c),e.applyData(t,c)}function uxe(e,t){const n={type:"element",tagName:"h"+t.depth,properties:{},children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}function dxe(e,t){if(e.options.allowDangerousHtml){const n={type:"raw",value:t.value};return e.patch(t,n),e.applyData(t,n)}}function Lz(e,t){const n=t.referenceType;let r="]";if(n==="collapsed"?r+="[]":n==="full"&&(r+="["+(t.label||t.identifier)+"]"),t.type==="imageReference")return[{type:"text",value:"!["+t.alt+r}];const a=e.all(t),o=a[0];o&&o.type==="text"?o.value="["+o.value:a.unshift({type:"text",value:"["});const i=a[a.length-1];return i&&i.type==="text"?i.value+=r:a.push({type:"text",value:r}),a}function fxe(e,t){const n=String(t.identifier).toUpperCase(),r=e.definitionById.get(n);if(!r)return Lz(e,t);const a={src:Hc(r.url||""),alt:t.alt};r.title!==null&&r.title!==void 0&&(a.title=r.title);const o={type:"element",tagName:"img",properties:a,children:[]};return e.patch(t,o),e.applyData(t,o)}function pxe(e,t){const n={src:Hc(t.url)};t.alt!==null&&t.alt!==void 0&&(n.alt=t.alt),t.title!==null&&t.title!==void 0&&(n.title=t.title);const r={type:"element",tagName:"img",properties:n,children:[]};return e.patch(t,r),e.applyData(t,r)}function gxe(e,t){const n={type:"text",value:t.value.replace(/\r?\n|\r/g," ")};e.patch(t,n);const r={type:"element",tagName:"code",properties:{},children:[n]};return e.patch(t,r),e.applyData(t,r)}function mxe(e,t){const n=String(t.identifier).toUpperCase(),r=e.definitionById.get(n);if(!r)return Lz(e,t);const a={href:Hc(r.url||"")};r.title!==null&&r.title!==void 0&&(a.title=r.title);const o={type:"element",tagName:"a",properties:a,children:e.all(t)};return e.patch(t,o),e.applyData(t,o)}function hxe(e,t){const n={href:Hc(t.url)};t.title!==null&&t.title!==void 0&&(n.title=t.title);const r={type:"element",tagName:"a",properties:n,children:e.all(t)};return e.patch(t,r),e.applyData(t,r)}function bxe(e,t,n){const r=e.all(t),a=n?yxe(n):Mz(t),o={},i=[];if(typeof t.checked=="boolean"){const u=r[0];let d;u&&u.type==="element"&&u.tagName==="p"?d=u:(d={type:"element",tagName:"p",properties:{},children:[]},r.unshift(d)),d.children.length>0&&d.children.unshift({type:"text",value:" "}),d.children.unshift({type:"element",tagName:"input",properties:{type:"checkbox",checked:t.checked,disabled:!0},children:[]}),o.className=["task-list-item"]}let s=-1;for(;++s1}function vxe(e,t){const n={},r=e.all(t);let a=-1;for(typeof t.start=="number"&&t.start!==1&&(n.start=t.start);++a0){const i={type:"element",tagName:"tbody",properties:{},children:e.wrap(n,!0)},s=FA(t.children[1]),l=xz(t.children[t.children.length-1]);s&&l&&(i.position={start:s,end:l}),a.push(i)}const o={type:"element",tagName:"table",properties:{},children:e.wrap(a,!0)};return e.patch(t,o),e.applyData(t,o)}function kxe(e,t,n){const r=n?n.children:void 0,o=(r?r.indexOf(t):1)===0?"th":"td",i=n&&n.type==="table"?n.align:void 0,s=i?i.length:t.children.length;let l=-1;const c=[];for(;++l0,!0),r[0]),a=r.index+r[0].length,r=n.exec(t);return o.push(v3(t.slice(a),a>0,!1)),o.join("")}function v3(e,t,n){let r=0,a=e.length;if(t){let o=e.codePointAt(r);for(;o===b3||o===y3;)r++,o=e.codePointAt(r)}if(n){let o=e.codePointAt(a-1);for(;o===b3||o===y3;)a--,o=e.codePointAt(a-1)}return a>r?e.slice(r,a):""}function Axe(e,t){const n={type:"text",value:_xe(String(t.value))};return e.patch(t,n),e.applyData(t,n)}function Txe(e,t){const n={type:"element",tagName:"hr",properties:{},children:[]};return e.patch(t,n),e.applyData(t,n)}const Rxe={blockquote:axe,break:oxe,code:ixe,delete:sxe,emphasis:lxe,footnoteReference:cxe,heading:uxe,html:dxe,imageReference:fxe,image:pxe,inlineCode:gxe,linkReference:mxe,link:hxe,listItem:bxe,list:vxe,paragraph:Sxe,root:wxe,strong:Exe,table:xxe,tableCell:Cxe,tableRow:kxe,text:Axe,thematicBreak:Txe,toml:mp,yaml:mp,definition:mp,footnoteDefinition:mp};function mp(){}const Mz=-1,Nh=0,am=1,om=2,BA=3,HA=4,VA=5,qA=6,Pz=7,$z=8,S3=typeof self=="object"?self:globalThis,Nxe=(e,t)=>{const n=(a,o)=>(e.set(o,a),a),r=a=>{if(e.has(a))return e.get(a);const[o,i]=t[a];switch(o){case Nh:case Mz:return n(i,a);case am:{const s=n([],a);for(const l of i)s.push(r(l));return s}case om:{const s=n({},a);for(const[l,c]of i)s[r(l)]=r(c);return s}case BA:return n(new Date(i),a);case HA:{const{source:s,flags:l}=i;return n(new RegExp(s,l),a)}case VA:{const s=n(new Map,a);for(const[l,c]of i)s.set(r(l),r(c));return s}case qA:{const s=n(new Set,a);for(const l of i)s.add(r(l));return s}case Pz:{const{name:s,message:l}=i;return n(new S3[s](l),a)}case $z:return n(BigInt(i),a);case"BigInt":return n(Object(BigInt(i)),a)}return n(new S3[o](i),a)};return r},w3=e=>Nxe(new Map,e)(0),il="",{toString:Ixe}={},{keys:Oxe}=Object,bu=e=>{const t=typeof e;if(t!=="object"||!e)return[Nh,t];const n=Ixe.call(e).slice(8,-1);switch(n){case"Array":return[am,il];case"Object":return[om,il];case"Date":return[BA,il];case"RegExp":return[HA,il];case"Map":return[VA,il];case"Set":return[qA,il]}return n.includes("Array")?[am,n]:n.includes("Error")?[Pz,n]:[om,n]},hp=([e,t])=>e===Nh&&(t==="function"||t==="symbol"),Dxe=(e,t,n,r)=>{const a=(i,s)=>{const l=r.push(i)-1;return n.set(s,l),l},o=i=>{if(n.has(i))return n.get(i);let[s,l]=bu(i);switch(s){case Nh:{let u=i;switch(l){case"bigint":s=$z,u=i.toString();break;case"function":case"symbol":if(e)throw new TypeError("unable to serialize "+l);u=null;break;case"undefined":return a([Mz],i)}return a([s,u],i)}case am:{if(l)return a([l,[...i]],i);const u=[],d=a([s,u],i);for(const g of i)u.push(o(g));return d}case om:{if(l)switch(l){case"BigInt":return a([l,i.toString()],i);case"Boolean":case"Number":case"String":return a([l,i.valueOf()],i)}if(t&&"toJSON"in i)return o(i.toJSON());const u=[],d=a([s,u],i);for(const g of Oxe(i))(e||!hp(bu(i[g])))&&u.push([o(g),o(i[g])]);return d}case BA:return a([s,i.toISOString()],i);case HA:{const{source:u,flags:d}=i;return a([s,{source:u,flags:d}],i)}case VA:{const u=[],d=a([s,u],i);for(const[g,m]of i)(e||!(hp(bu(g))||hp(bu(m))))&&u.push([o(g),o(m)]);return d}case qA:{const u=[],d=a([s,u],i);for(const g of i)(e||!hp(bu(g)))&&u.push(o(g));return d}}const{message:c}=i;return a([s,{name:l,message:c}],i)};return o},E3=(e,{json:t,lossy:n}={})=>{const r=[];return Dxe(!(t||n),!!t,new Map,r)(e),r},im=typeof structuredClone=="function"?(e,t)=>t&&("json"in t||"lossy"in t)?w3(E3(e,t)):structuredClone(e):(e,t)=>w3(E3(e,t));function Lxe(e,t){const n=[{type:"text",value:"↩"}];return t>1&&n.push({type:"element",tagName:"sup",properties:{},children:[{type:"text",value:String(t)}]}),n}function Mxe(e,t){return"Back to reference "+(e+1)+(t>1?"-"+t:"")}function Pxe(e){const t=typeof e.options.clobberPrefix=="string"?e.options.clobberPrefix:"user-content-",n=e.options.footnoteBackContent||Lxe,r=e.options.footnoteBackLabel||Mxe,a=e.options.footnoteLabel||"Footnotes",o=e.options.footnoteLabelTagName||"h2",i=e.options.footnoteLabelProperties||{className:["sr-only"]},s=[];let l=-1;for(;++l0&&b.push({type:"text",value:" "});let h=typeof n=="string"?n:n(l,m);typeof h=="string"&&(h={type:"text",value:h}),b.push({type:"element",tagName:"a",properties:{href:"#"+t+"fnref-"+g+(m>1?"-"+m:""),dataFootnoteBackref:"",ariaLabel:typeof r=="string"?r:r(l,m),className:["data-footnote-backref"]},children:Array.isArray(h)?h:[h]})}const w=u[u.length-1];if(w&&w.type==="element"&&w.tagName==="p"){const h=w.children[w.children.length-1];h&&h.type==="text"?h.value+=" ":w.children.push({type:"text",value:" "}),w.children.push(...b)}else u.push(...b);const v={type:"element",tagName:"li",properties:{id:t+"fn-"+g},children:e.wrap(u,!0)};e.patch(c,v),s.push(v)}if(s.length!==0)return{type:"element",tagName:"section",properties:{dataFootnotes:!0,className:["footnotes"]},children:[{type:"element",tagName:o,properties:{...im(i),id:"footnote-label"},children:[{type:"text",value:a}]},{type:"text",value:` +`});const c={type:"element",tagName:"li",properties:o,children:i};return e.patch(t,c),e.applyData(t,c)}function yxe(e){let t=!1;if(e.type==="list"){t=e.spread||!1;const n=e.children;let r=-1;for(;!t&&++r1}function vxe(e,t){const n={},r=e.all(t);let a=-1;for(typeof t.start=="number"&&t.start!==1&&(n.start=t.start);++a0){const i={type:"element",tagName:"tbody",properties:{},children:e.wrap(n,!0)},s=FA(t.children[1]),l=kz(t.children[t.children.length-1]);s&&l&&(i.position={start:s,end:l}),a.push(i)}const o={type:"element",tagName:"table",properties:{},children:e.wrap(a,!0)};return e.patch(t,o),e.applyData(t,o)}function kxe(e,t,n){const r=n?n.children:void 0,o=(r?r.indexOf(t):1)===0?"th":"td",i=n&&n.type==="table"?n.align:void 0,s=i?i.length:t.children.length;let l=-1;const c=[];for(;++l0,!0),r[0]),a=r.index+r[0].length,r=n.exec(t);return o.push(v3(t.slice(a),a>0,!1)),o.join("")}function v3(e,t,n){let r=0,a=e.length;if(t){let o=e.codePointAt(r);for(;o===b3||o===y3;)r++,o=e.codePointAt(r)}if(n){let o=e.codePointAt(a-1);for(;o===b3||o===y3;)a--,o=e.codePointAt(a-1)}return a>r?e.slice(r,a):""}function Axe(e,t){const n={type:"text",value:_xe(String(t.value))};return e.patch(t,n),e.applyData(t,n)}function Txe(e,t){const n={type:"element",tagName:"hr",properties:{},children:[]};return e.patch(t,n),e.applyData(t,n)}const Rxe={blockquote:axe,break:oxe,code:ixe,delete:sxe,emphasis:lxe,footnoteReference:cxe,heading:uxe,html:dxe,imageReference:fxe,image:pxe,inlineCode:gxe,linkReference:mxe,link:hxe,listItem:bxe,list:vxe,paragraph:Sxe,root:wxe,strong:Exe,table:xxe,tableCell:Cxe,tableRow:kxe,text:Axe,thematicBreak:Txe,toml:mp,yaml:mp,definition:mp,footnoteDefinition:mp};function mp(){}const Pz=-1,Ih=0,am=1,om=2,BA=3,HA=4,VA=5,qA=6,$z=7,Fz=8,S3=typeof self=="object"?self:globalThis,Nxe=(e,t)=>{const n=(a,o)=>(e.set(o,a),a),r=a=>{if(e.has(a))return e.get(a);const[o,i]=t[a];switch(o){case Ih:case Pz:return n(i,a);case am:{const s=n([],a);for(const l of i)s.push(r(l));return s}case om:{const s=n({},a);for(const[l,c]of i)s[r(l)]=r(c);return s}case BA:return n(new Date(i),a);case HA:{const{source:s,flags:l}=i;return n(new RegExp(s,l),a)}case VA:{const s=n(new Map,a);for(const[l,c]of i)s.set(r(l),r(c));return s}case qA:{const s=n(new Set,a);for(const l of i)s.add(r(l));return s}case $z:{const{name:s,message:l}=i;return n(new S3[s](l),a)}case Fz:return n(BigInt(i),a);case"BigInt":return n(Object(BigInt(i)),a)}return n(new S3[o](i),a)};return r},w3=e=>Nxe(new Map,e)(0),il="",{toString:Ixe}={},{keys:Oxe}=Object,bu=e=>{const t=typeof e;if(t!=="object"||!e)return[Ih,t];const n=Ixe.call(e).slice(8,-1);switch(n){case"Array":return[am,il];case"Object":return[om,il];case"Date":return[BA,il];case"RegExp":return[HA,il];case"Map":return[VA,il];case"Set":return[qA,il]}return n.includes("Array")?[am,n]:n.includes("Error")?[$z,n]:[om,n]},hp=([e,t])=>e===Ih&&(t==="function"||t==="symbol"),Dxe=(e,t,n,r)=>{const a=(i,s)=>{const l=r.push(i)-1;return n.set(s,l),l},o=i=>{if(n.has(i))return n.get(i);let[s,l]=bu(i);switch(s){case Ih:{let u=i;switch(l){case"bigint":s=Fz,u=i.toString();break;case"function":case"symbol":if(e)throw new TypeError("unable to serialize "+l);u=null;break;case"undefined":return a([Pz],i)}return a([s,u],i)}case am:{if(l)return a([l,[...i]],i);const u=[],d=a([s,u],i);for(const g of i)u.push(o(g));return d}case om:{if(l)switch(l){case"BigInt":return a([l,i.toString()],i);case"Boolean":case"Number":case"String":return a([l,i.valueOf()],i)}if(t&&"toJSON"in i)return o(i.toJSON());const u=[],d=a([s,u],i);for(const g of Oxe(i))(e||!hp(bu(i[g])))&&u.push([o(g),o(i[g])]);return d}case BA:return a([s,i.toISOString()],i);case HA:{const{source:u,flags:d}=i;return a([s,{source:u,flags:d}],i)}case VA:{const u=[],d=a([s,u],i);for(const[g,m]of i)(e||!(hp(bu(g))||hp(bu(m))))&&u.push([o(g),o(m)]);return d}case qA:{const u=[],d=a([s,u],i);for(const g of i)(e||!hp(bu(g)))&&u.push(o(g));return d}}const{message:c}=i;return a([s,{name:l,message:c}],i)};return o},E3=(e,{json:t,lossy:n}={})=>{const r=[];return Dxe(!(t||n),!!t,new Map,r)(e),r},im=typeof structuredClone=="function"?(e,t)=>t&&("json"in t||"lossy"in t)?w3(E3(e,t)):structuredClone(e):(e,t)=>w3(E3(e,t));function Lxe(e,t){const n=[{type:"text",value:"↩"}];return t>1&&n.push({type:"element",tagName:"sup",properties:{},children:[{type:"text",value:String(t)}]}),n}function Mxe(e,t){return"Back to reference "+(e+1)+(t>1?"-"+t:"")}function Pxe(e){const t=typeof e.options.clobberPrefix=="string"?e.options.clobberPrefix:"user-content-",n=e.options.footnoteBackContent||Lxe,r=e.options.footnoteBackLabel||Mxe,a=e.options.footnoteLabel||"Footnotes",o=e.options.footnoteLabelTagName||"h2",i=e.options.footnoteLabelProperties||{className:["sr-only"]},s=[];let l=-1;for(;++l0&&b.push({type:"text",value:" "});let h=typeof n=="string"?n:n(l,m);typeof h=="string"&&(h={type:"text",value:h}),b.push({type:"element",tagName:"a",properties:{href:"#"+t+"fnref-"+g+(m>1?"-"+m:""),dataFootnoteBackref:"",ariaLabel:typeof r=="string"?r:r(l,m),className:["data-footnote-backref"]},children:Array.isArray(h)?h:[h]})}const w=u[u.length-1];if(w&&w.type==="element"&&w.tagName==="p"){const h=w.children[w.children.length-1];h&&h.type==="text"?h.value+=" ":w.children.push({type:"text",value:" "}),w.children.push(...b)}else u.push(...b);const v={type:"element",tagName:"li",properties:{id:t+"fn-"+g},children:e.wrap(u,!0)};e.patch(c,v),s.push(v)}if(s.length!==0)return{type:"element",tagName:"section",properties:{dataFootnotes:!0,className:["footnotes"]},children:[{type:"element",tagName:o,properties:{...im(i),id:"footnote-label"},children:[{type:"text",value:a}]},{type:"text",value:` `},{type:"element",tagName:"ol",properties:{},children:e.wrap(s,!0)},{type:"text",value:` -`}]}}const jk={}.hasOwnProperty,$xe={};function Fxe(e,t){const n=t||$xe,r=new Map,a=new Map,o=new Map,i={...Rxe,...n.handlers},s={all:c,applyData:zxe,definitionById:r,footnoteById:a,footnoteCounts:o,footnoteOrder:[],handlers:i,one:l,options:n,patch:jxe,wrap:Bxe};return sA(e,function(u){if(u.type==="definition"||u.type==="footnoteDefinition"){const d=u.type==="definition"?r:a,g=String(u.identifier).toUpperCase();d.has(g)||d.set(g,u)}}),s;function l(u,d){const g=u.type,m=s.handlers[g];if(jk.call(s.handlers,g)&&m)return m(s,u,d);if(s.options.passThrough&&s.options.passThrough.includes(g)){if("children"in u){const{children:y,...w}=u,v=im(w);return v.children=s.all(u),v}return im(u)}return(s.options.unknownHandler||Uxe)(s,u,d)}function c(u){const d=[];if("children"in u){const g=u.children;let m=-1;for(;++m0&&n.push({type:"text",value:` `}),n}function x3(e){let t=0,n=e.charCodeAt(t);for(;n===9||n===32;)t++,n=e.charCodeAt(t);return e.slice(t)}function k3(e,t){const n=Fxe(e,t),r=n.one(e,void 0),a=Pxe(n),o=Array.isArray(r)?{type:"root",children:r}:r||{type:"root",children:[]};return a&&o.children.push({type:"text",value:` -`},a),o}function Hxe(e,t){return e&&"run"in e?async function(n,r){const a=k3(n,{file:r,...t});await e.run(a,r)}:function(n,r){return k3(n,{file:r,...t||e})}}function C3(e){if(e)throw e}var Xp=Object.prototype.hasOwnProperty,Fz=Object.prototype.toString,_3=Object.defineProperty,A3=Object.getOwnPropertyDescriptor,T3=function(t){return typeof Array.isArray=="function"?Array.isArray(t):Fz.call(t)==="[object Array]"},R3=function(t){if(!t||Fz.call(t)!=="[object Object]")return!1;var n=Xp.call(t,"constructor"),r=t.constructor&&t.constructor.prototype&&Xp.call(t.constructor.prototype,"isPrototypeOf");if(t.constructor&&!n&&!r)return!1;var a;for(a in t);return typeof a>"u"||Xp.call(t,a)},N3=function(t,n){_3&&n.name==="__proto__"?_3(t,n.name,{enumerable:!0,configurable:!0,value:n.newValue,writable:!0}):t[n.name]=n.newValue},I3=function(t,n){if(n==="__proto__")if(Xp.call(t,n)){if(A3)return A3(t,n).value}else return;return t[n]},Vxe=function e(){var t,n,r,a,o,i,s=arguments[0],l=1,c=arguments.length,u=!1;for(typeof s=="boolean"&&(u=s,s=arguments[1]||{},l=2),(s==null||typeof s!="object"&&typeof s!="function")&&(s={});li.length;let l;s&&i.push(a);try{l=e.apply(this,i)}catch(c){const u=c;if(s&&n)throw u;return a(u)}s||(l&&l.then&&typeof l.then=="function"?l.then(o,a):l instanceof Error?a(l):o(l))}function a(i,...s){n||(n=!0,t(i,...s))}function o(i){a(null,i)}}const ka={basename:Wxe,dirname:Kxe,extname:Yxe,join:Zxe,sep:"/"};function Wxe(e,t){if(t!==void 0&&typeof t!="string")throw new TypeError('"ext" argument must be a string');_f(e);let n=0,r=-1,a=e.length,o;if(t===void 0||t.length===0||t.length>e.length){for(;a--;)if(e.codePointAt(a)===47){if(o){n=a+1;break}}else r<0&&(o=!0,r=a+1);return r<0?"":e.slice(n,r)}if(t===e)return"";let i=-1,s=t.length-1;for(;a--;)if(e.codePointAt(a)===47){if(o){n=a+1;break}}else i<0&&(o=!0,i=a+1),s>-1&&(e.codePointAt(a)===t.codePointAt(s--)?s<0&&(r=a):(s=-1,r=i));return n===r?r=i:r<0&&(r=e.length),e.slice(n,r)}function Kxe(e){if(_f(e),e.length===0)return".";let t=-1,n=e.length,r;for(;--n;)if(e.codePointAt(n)===47){if(r){t=n;break}}else r||(r=!0);return t<0?e.codePointAt(0)===47?"/":".":t===1&&e.codePointAt(0)===47?"//":e.slice(0,t)}function Yxe(e){_f(e);let t=e.length,n=-1,r=0,a=-1,o=0,i;for(;t--;){const s=e.codePointAt(t);if(s===47){if(i){r=t+1;break}continue}n<0&&(i=!0,n=t+1),s===46?a<0?a=t:o!==1&&(o=1):a>-1&&(o=-1)}return a<0||n<0||o===0||o===1&&a===n-1&&a===r+1?"":e.slice(a,n)}function Zxe(...e){let t=-1,n;for(;++t0&&e.codePointAt(e.length-1)===47&&(n+="/"),t?"/"+n:n}function Qxe(e,t){let n="",r=0,a=-1,o=0,i=-1,s,l;for(;++i<=e.length;){if(i2){if(l=n.lastIndexOf("/"),l!==n.length-1){l<0?(n="",r=0):(n=n.slice(0,l),r=n.length-1-n.lastIndexOf("/")),a=i,o=0;continue}}else if(n.length>0){n="",r=0,a=i,o=0;continue}}t&&(n=n.length>0?n+"/..":"..",r=2)}else n.length>0?n+="/"+e.slice(a+1,i):n=e.slice(a+1,i),r=i-a-1;a=i,o=0}else s===46&&o>-1?o++:o=-1}return n}function _f(e){if(typeof e!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}const Jxe={cwd:e1e};function e1e(){return"/"}function Uk(e){return!!(e!==null&&typeof e=="object"&&"href"in e&&e.href&&"protocol"in e&&e.protocol&&e.auth===void 0)}function t1e(e){if(typeof e=="string")e=new URL(e);else if(!Uk(e)){const t=new TypeError('The "path" argument must be of type string or an instance of URL. Received `'+e+"`");throw t.code="ERR_INVALID_ARG_TYPE",t}if(e.protocol!=="file:"){const t=new TypeError("The URL must be of scheme file");throw t.code="ERR_INVALID_URL_SCHEME",t}return n1e(e)}function n1e(e){if(e.hostname!==""){const r=new TypeError('File URL host must be "localhost" or empty on darwin');throw r.code="ERR_INVALID_FILE_URL_HOST",r}const t=e.pathname;let n=-1;for(;++n0){let[m,...b]=u;const y=r[g][1];zk(y)&&zk(m)&&(m=hx(!0,y,m)),r[g]=[c,m,...b]}}}}const i1e=new GA().freeze();function Sx(e,t){if(typeof t!="function")throw new TypeError("Cannot `"+e+"` without `parser`")}function wx(e,t){if(typeof t!="function")throw new TypeError("Cannot `"+e+"` without `compiler`")}function Ex(e,t){if(t)throw new Error("Cannot call `"+e+"` on a frozen processor.\nCreate a new processor first, by calling it: use `processor()` instead of `processor`.")}function D3(e){if(!zk(e)||typeof e.type!="string")throw new TypeError("Expected node, got `"+e+"`")}function L3(e,t,n){if(!n)throw new Error("`"+e+"` finished async. Use `"+t+"` instead")}function bp(e){return s1e(e)?e:new jz(e)}function s1e(e){return!!(e&&typeof e=="object"&&"message"in e&&"messages"in e)}function l1e(e){return typeof e=="string"||c1e(e)}function c1e(e){return!!(e&&typeof e=="object"&&"byteLength"in e&&"byteOffset"in e)}const u1e="https://github.com/remarkjs/react-markdown/blob/main/changelog.md",M3=[],P3={allowDangerousHtml:!0},d1e=/^(https?|ircs?|mailto|xmpp)$/i,f1e=[{from:"astPlugins",id:"remove-buggy-html-in-markdown-parser"},{from:"allowDangerousHtml",id:"remove-buggy-html-in-markdown-parser"},{from:"allowNode",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"allowElement"},{from:"allowedTypes",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"allowedElements"},{from:"disallowedTypes",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"disallowedElements"},{from:"escapeHtml",id:"remove-buggy-html-in-markdown-parser"},{from:"includeElementIndex",id:"#remove-includeelementindex"},{from:"includeNodeIndex",id:"change-includenodeindex-to-includeelementindex"},{from:"linkTarget",id:"remove-linktarget"},{from:"plugins",id:"change-plugins-to-remarkplugins",to:"remarkPlugins"},{from:"rawSourcePos",id:"#remove-rawsourcepos"},{from:"renderers",id:"change-renderers-to-components",to:"components"},{from:"source",id:"change-source-to-children",to:"children"},{from:"sourcePos",id:"#remove-sourcepos"},{from:"transformImageUri",id:"#add-urltransform",to:"urlTransform"},{from:"transformLinkUri",id:"#add-urltransform",to:"urlTransform"}];function p1e(e){const t=e.allowedElements,n=e.allowElement,r=e.children||"",a=e.className,o=e.components,i=e.disallowedElements,s=e.rehypePlugins||M3,l=e.remarkPlugins||M3,c=e.remarkRehypeOptions?{...e.remarkRehypeOptions,...P3}:P3,u=e.skipHtml,d=e.unwrapDisallowed,g=e.urlTransform||g1e,m=i1e().use(rxe).use(l).use(Hxe,c).use(s),b=new jz;typeof r=="string"&&(b.value=r);for(const h of f1e)Object.hasOwn(e,h.from)&&(""+h.from+(h.to?"use `"+h.to+"` instead":"remove it")+u1e+h.id,void 0);const y=m.parse(b);let w=m.runSync(y,b);return a&&(w={type:"element",tagName:"div",properties:{className:a},children:w.type==="root"?w.children:[w]}),sA(w,v),uEe(w,{Fragment:f.Fragment,components:o,ignoreInvalidStyle:!0,jsx:f.jsx,jsxs:f.jsxs,passKeys:!0,passNode:!0});function v(h,S,E){if(h.type==="raw"&&E&&typeof S=="number")return u?E.children.splice(S,1):E.children[S]={type:"text",value:h.value},S;if(h.type==="element"){let k;for(k in mx)if(Object.hasOwn(mx,k)&&Object.hasOwn(h.properties,k)){const x=h.properties[k],C=mx[k];(C===null||C.includes(h.tagName))&&(h.properties[k]=g(String(x||""),k,h))}}if(h.type==="element"){let k=t?!t.includes(h.tagName):i?i.includes(h.tagName):!1;if(!k&&n&&typeof S=="number"&&(k=!n(h,S,E)),k&&E&&typeof S=="number")return d&&h.children?E.children.splice(S,1,...h.children):E.children.splice(S,1),S}}}function g1e(e){const t=e.indexOf(":"),n=e.indexOf("?"),r=e.indexOf("#"),a=e.indexOf("/");return t<0||a>-1&&t>a||n>-1&&t>n||r>-1&&t>r||d1e.test(e.slice(0,t))?e:""}const m1e=p.memo(p1e,(e,t)=>e.children===t.children&&e.className===t.className),zz=({message:e,className:t})=>f.jsx(m1e,{className:ee("prose-sm whitespace-pre-wrap break-words prose-p:m-0 prose-p:leading-relaxed prose-pre:p-0 prose-li:list-disc",t),remarkPlugins:[ofe,Rle],components:{p({children:n}){return f.jsx("p",{children:n})},code({node:n,className:r,children:a,...o}){if(!a)return null;const i=!String(a).includes(` -`),s=/language-(\w+)/.exec(r||"");return i?f.jsx("code",{className:r,...o,children:a}):f.jsx(pz,{language:s&&s[1]||"",value:String(a).replace(/\n$/,""),...o},Math.random())}},children:e}),h1e=e=>f.jsx("div",{className:ee("flex min-h-8 max-w-lg items-end justify-start pl-10",e.className),children:f.jsx(zz,{message:e.message,className:"whitespace-pre-wrap text-sm"})}),b1e=e=>f.jsxs(E_,{className:"w-fit max-w-lg p-2 text-xs [&>svg]:left-2.5 [&>svg]:top-2.5",variant:"destructive",children:[f.jsx(hq,{className:"h-4 w-4"}),f.jsx(j6,{children:"Something went wrong..."}),f.jsx(z6,{className:"text-xs",children:e.message})]}),y1e=({id:e,message:t})=>f.jsx("pre",{className:pie("mb-2 ml-8 w-fit max-w-xl overflow-x-scroll whitespace-pre-line rounded-lg border bg-muted p-2 text-xs font-normal text-muted-foreground"),children:t}),v1e=({message:e})=>f.jsx("p",{className:Tt("relative mb-2 ml-6 w-fit max-w-lg rounded-2xl border border-white bg-muted px-4 py-2 text-sm italic"),children:e}),S1e=({id:e,date:t})=>f.jsxs("span",{className:"!-mt-4 max-w-xl pr-6 text-right text-xs uppercase tracking-tight text-muted-foreground",children:["Message Receipt from ",t?Bs(t,"M/d/yy, h:mm a"):"Unknown"]}),w1e=()=>f.jsx("div",{className:"flex items-end justify-end",children:f.jsx("p",{className:"mb-2 w-fit max-w-lg rounded-2xl rounded-br-none border border-white bg-muted px-4 py-2 text-sm italic",children:"First login"})}),E1e=e=>f.jsx("div",{className:`${e.className} flex items-end justify-end`,children:f.jsxs("div",{className:"order-2 mx-2 flex max-w-lg flex-col items-end space-y-1 text-sm",children:[f.jsx("div",{className:"pr-1.5 text-xs text-muted-foreground",children:Bs(e.date,"MMM d yy, h:mm a")}),f.jsx(zz,{message:e.message,className:"min-h-8 rounded-2xl rounded-br-none bg-white px-5 py-3 text-black"})]})}),x1e=({type:e,message:t,date:n,id:r},a,o=!0,i=!0,s=!0)=>{const l=e+t+n+r;if(e==="login")return f.jsx(w1e,{},l);if(e==="user")return f.jsx(E1e,{id:r,date:n,message:t??""},l);if(e==="error")return f.jsx(b1e,{date:n,message:t??""},l);if(e==="assistant")return f.jsx(h1e,{id:r,date:n,message:t??""},l);if(s&&e==="message-receipt")return f.jsx(S1e,{date:n},l);if(i&&e==="function-call")return f.jsx(y1e,{id:r,message:t},l);if(o&&e==="internal-monologue")return f.jsx(v1e,{message:t},l)};class sl extends Error{constructor(t,n){super(t+" at position "+n),this.position=n}}const yp=92,xx=47,k1e=42,$3=123,vp=125,F3=91,Sp=93,C1e=40,_1e=41,A1e=32,WA=10,Uz=9,Bz=13,T1e=8,R1e=12,sm=34,j3=43,z3=45,Hz=39,Vz=48,qz=57,Hi=44,wp=46,N1e=58,I1e=59,O1e=65,D1e=97,L1e=69,M1e=101,P1e=70,$1e=102,F1e=160,j1e=8192,z1e=8202,U1e=8239,B1e=8287,H1e=12288,V1e=8220,q1e=8221,G1e=8216,W1e=8217,K1e=96,Y1e=180;function Z1e(e){return e>=Vz&&e<=qz||e>=O1e&&e<=P1e||e>=D1e&&e<=$1e}function Vi(e){return e>=Vz&&e<=qz}function X1e(e){return e>=32&&e<=1114111}function ml(e){return Q1e.test(e)}const Q1e=/^[,:[\]/{}()\n+]$/;function J1e(e){return ml(e)&&e!=="/"}function U3(e){return eke.test(e)||e&&Qp(e.charCodeAt(0))}const eke=/^[[{\w-]$/;function tke(e){return e===WA||e===Bz||e===Uz||e===T1e||e===R1e}function Ol(e){return e===A1e||e===WA||e===Uz||e===Bz}function nke(e){return e===F1e||e>=j1e&&e<=z1e||e===U1e||e===B1e||e===H1e}function Qp(e){return Gz(e)||Bk(e)}function Gz(e){return e===sm||e===V1e||e===q1e}function B3(e){return e===sm}function Bk(e){return e===Hz||e===G1e||e===W1e||e===K1e||e===Y1e}function H3(e){return e===Hz}function yu(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1;const r=e.lastIndexOf(t);return r!==-1?e.substring(0,r)+(n?"":e.substring(r+1)):e}function Ea(e,t){let n=e.length;if(!Ol(e.charCodeAt(n-1)))return e+t;for(;Ol(e.charCodeAt(n-1));)n--;return e.substring(0,n)+t+e.substring(n)}function rke(e,t,n){return e.substring(0,t)+e.substring(t+n)}function ake(e){return/[,\n][ \t\r]*$/.test(e)}function oke(e){return/^\w+$/.test(e)}const ike={"\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r"," ":"\\t"},ske={'"':'"',"\\":"\\","/":"/",b:"\b",f:"\f",n:` -`,r:"\r",t:" "};function lke(e){let t=0,n="";o()||L();const a=c(Hi);for(a&&i(),U3(e[t])&&ake(n)?(a||(n=Ea(n,",")),y()):a&&(n=yu(n,","));e.charCodeAt(t)===vp||e.charCodeAt(t)===Sp;)t++,i();if(t>=e.length)return n;T();function o(){i();const M=m()||b()||w()||h()||S()||k();return i(),M}function i(){const M=t;let U=s();do U=l(),U&&(U=s());while(U);return t>M}function s(){let M="",U;for(;(U=Ol(e.charCodeAt(t)))||nke(e.charCodeAt(t));)U?M+=e[t]:M+=" ",t++;return M.length>0?(n+=M,!0):!1}function l(){if(e.charCodeAt(t)===xx&&e.charCodeAt(t+1)===k1e){for(;t=e.length;j||(U3(e[t])||O?n=Ea(n,":"):H()),o()||(j||O?n+="null":H())}return e.charCodeAt(t)===vp?(n+="}",t++):n=Ea(n,"}"),!0}return!1}function b(){if(e.charCodeAt(t)===F3){n+="[",t++,i(),u(Hi)&&i();let M=!0;for(;t"u"||Xp.call(t,a)},N3=function(t,n){_3&&n.name==="__proto__"?_3(t,n.name,{enumerable:!0,configurable:!0,value:n.newValue,writable:!0}):t[n.name]=n.newValue},I3=function(t,n){if(n==="__proto__")if(Xp.call(t,n)){if(A3)return A3(t,n).value}else return;return t[n]},Vxe=function e(){var t,n,r,a,o,i,s=arguments[0],l=1,c=arguments.length,u=!1;for(typeof s=="boolean"&&(u=s,s=arguments[1]||{},l=2),(s==null||typeof s!="object"&&typeof s!="function")&&(s={});li.length;let l;s&&i.push(a);try{l=e.apply(this,i)}catch(c){const u=c;if(s&&n)throw u;return a(u)}s||(l&&l.then&&typeof l.then=="function"?l.then(o,a):l instanceof Error?a(l):o(l))}function a(i,...s){n||(n=!0,t(i,...s))}function o(i){a(null,i)}}const ka={basename:Wxe,dirname:Kxe,extname:Yxe,join:Zxe,sep:"/"};function Wxe(e,t){if(t!==void 0&&typeof t!="string")throw new TypeError('"ext" argument must be a string');_f(e);let n=0,r=-1,a=e.length,o;if(t===void 0||t.length===0||t.length>e.length){for(;a--;)if(e.codePointAt(a)===47){if(o){n=a+1;break}}else r<0&&(o=!0,r=a+1);return r<0?"":e.slice(n,r)}if(t===e)return"";let i=-1,s=t.length-1;for(;a--;)if(e.codePointAt(a)===47){if(o){n=a+1;break}}else i<0&&(o=!0,i=a+1),s>-1&&(e.codePointAt(a)===t.codePointAt(s--)?s<0&&(r=a):(s=-1,r=i));return n===r?r=i:r<0&&(r=e.length),e.slice(n,r)}function Kxe(e){if(_f(e),e.length===0)return".";let t=-1,n=e.length,r;for(;--n;)if(e.codePointAt(n)===47){if(r){t=n;break}}else r||(r=!0);return t<0?e.codePointAt(0)===47?"/":".":t===1&&e.codePointAt(0)===47?"//":e.slice(0,t)}function Yxe(e){_f(e);let t=e.length,n=-1,r=0,a=-1,o=0,i;for(;t--;){const s=e.codePointAt(t);if(s===47){if(i){r=t+1;break}continue}n<0&&(i=!0,n=t+1),s===46?a<0?a=t:o!==1&&(o=1):a>-1&&(o=-1)}return a<0||n<0||o===0||o===1&&a===n-1&&a===r+1?"":e.slice(a,n)}function Zxe(...e){let t=-1,n;for(;++t0&&e.codePointAt(e.length-1)===47&&(n+="/"),t?"/"+n:n}function Qxe(e,t){let n="",r=0,a=-1,o=0,i=-1,s,l;for(;++i<=e.length;){if(i2){if(l=n.lastIndexOf("/"),l!==n.length-1){l<0?(n="",r=0):(n=n.slice(0,l),r=n.length-1-n.lastIndexOf("/")),a=i,o=0;continue}}else if(n.length>0){n="",r=0,a=i,o=0;continue}}t&&(n=n.length>0?n+"/..":"..",r=2)}else n.length>0?n+="/"+e.slice(a+1,i):n=e.slice(a+1,i),r=i-a-1;a=i,o=0}else s===46&&o>-1?o++:o=-1}return n}function _f(e){if(typeof e!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}const Jxe={cwd:e1e};function e1e(){return"/"}function Bk(e){return!!(e!==null&&typeof e=="object"&&"href"in e&&e.href&&"protocol"in e&&e.protocol&&e.auth===void 0)}function t1e(e){if(typeof e=="string")e=new URL(e);else if(!Bk(e)){const t=new TypeError('The "path" argument must be of type string or an instance of URL. Received `'+e+"`");throw t.code="ERR_INVALID_ARG_TYPE",t}if(e.protocol!=="file:"){const t=new TypeError("The URL must be of scheme file");throw t.code="ERR_INVALID_URL_SCHEME",t}return n1e(e)}function n1e(e){if(e.hostname!==""){const r=new TypeError('File URL host must be "localhost" or empty on darwin');throw r.code="ERR_INVALID_FILE_URL_HOST",r}const t=e.pathname;let n=-1;for(;++n0){let[m,...b]=u;const y=r[g][1];Uk(y)&&Uk(m)&&(m=bx(!0,y,m)),r[g]=[c,m,...b]}}}}const i1e=new GA().freeze();function wx(e,t){if(typeof t!="function")throw new TypeError("Cannot `"+e+"` without `parser`")}function Ex(e,t){if(typeof t!="function")throw new TypeError("Cannot `"+e+"` without `compiler`")}function xx(e,t){if(t)throw new Error("Cannot call `"+e+"` on a frozen processor.\nCreate a new processor first, by calling it: use `processor()` instead of `processor`.")}function D3(e){if(!Uk(e)||typeof e.type!="string")throw new TypeError("Expected node, got `"+e+"`")}function L3(e,t,n){if(!n)throw new Error("`"+e+"` finished async. Use `"+t+"` instead")}function bp(e){return s1e(e)?e:new zz(e)}function s1e(e){return!!(e&&typeof e=="object"&&"message"in e&&"messages"in e)}function l1e(e){return typeof e=="string"||c1e(e)}function c1e(e){return!!(e&&typeof e=="object"&&"byteLength"in e&&"byteOffset"in e)}const u1e="https://github.com/remarkjs/react-markdown/blob/main/changelog.md",M3=[],P3={allowDangerousHtml:!0},d1e=/^(https?|ircs?|mailto|xmpp)$/i,f1e=[{from:"astPlugins",id:"remove-buggy-html-in-markdown-parser"},{from:"allowDangerousHtml",id:"remove-buggy-html-in-markdown-parser"},{from:"allowNode",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"allowElement"},{from:"allowedTypes",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"allowedElements"},{from:"disallowedTypes",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"disallowedElements"},{from:"escapeHtml",id:"remove-buggy-html-in-markdown-parser"},{from:"includeElementIndex",id:"#remove-includeelementindex"},{from:"includeNodeIndex",id:"change-includenodeindex-to-includeelementindex"},{from:"linkTarget",id:"remove-linktarget"},{from:"plugins",id:"change-plugins-to-remarkplugins",to:"remarkPlugins"},{from:"rawSourcePos",id:"#remove-rawsourcepos"},{from:"renderers",id:"change-renderers-to-components",to:"components"},{from:"source",id:"change-source-to-children",to:"children"},{from:"sourcePos",id:"#remove-sourcepos"},{from:"transformImageUri",id:"#add-urltransform",to:"urlTransform"},{from:"transformLinkUri",id:"#add-urltransform",to:"urlTransform"}];function p1e(e){const t=e.allowedElements,n=e.allowElement,r=e.children||"",a=e.className,o=e.components,i=e.disallowedElements,s=e.rehypePlugins||M3,l=e.remarkPlugins||M3,c=e.remarkRehypeOptions?{...e.remarkRehypeOptions,...P3}:P3,u=e.skipHtml,d=e.unwrapDisallowed,g=e.urlTransform||g1e,m=i1e().use(rxe).use(l).use(Hxe,c).use(s),b=new zz;typeof r=="string"&&(b.value=r);for(const h of f1e)Object.hasOwn(e,h.from)&&(""+h.from+(h.to?"use `"+h.to+"` instead":"remove it")+u1e+h.id,void 0);const y=m.parse(b);let w=m.runSync(y,b);return a&&(w={type:"element",tagName:"div",properties:{className:a},children:w.type==="root"?w.children:[w]}),sA(w,v),uEe(w,{Fragment:f.Fragment,components:o,ignoreInvalidStyle:!0,jsx:f.jsx,jsxs:f.jsxs,passKeys:!0,passNode:!0});function v(h,S,E){if(h.type==="raw"&&E&&typeof S=="number")return u?E.children.splice(S,1):E.children[S]={type:"text",value:h.value},S;if(h.type==="element"){let k;for(k in hx)if(Object.hasOwn(hx,k)&&Object.hasOwn(h.properties,k)){const x=h.properties[k],C=hx[k];(C===null||C.includes(h.tagName))&&(h.properties[k]=g(String(x||""),k,h))}}if(h.type==="element"){let k=t?!t.includes(h.tagName):i?i.includes(h.tagName):!1;if(!k&&n&&typeof S=="number"&&(k=!n(h,S,E)),k&&E&&typeof S=="number")return d&&h.children?E.children.splice(S,1,...h.children):E.children.splice(S,1),S}}}function g1e(e){const t=e.indexOf(":"),n=e.indexOf("?"),r=e.indexOf("#"),a=e.indexOf("/");return t<0||a>-1&&t>a||n>-1&&t>n||r>-1&&t>r||d1e.test(e.slice(0,t))?e:""}const m1e=p.memo(p1e,(e,t)=>e.children===t.children&&e.className===t.className),Uz=({message:e,className:t})=>f.jsx(m1e,{className:ee("prose-sm whitespace-pre-wrap break-words prose-p:m-0 prose-p:leading-relaxed prose-pre:p-0 prose-li:list-disc",t),remarkPlugins:[ofe,Rle],components:{p({children:n}){return f.jsx("p",{children:n})},code({node:n,className:r,children:a,...o}){if(!a)return null;const i=!String(a).includes(` +`),s=/language-(\w+)/.exec(r||"");return i?f.jsx("code",{className:r,...o,children:a}):f.jsx(gz,{language:s&&s[1]||"",value:String(a).replace(/\n$/,""),...o},Math.random())}},children:e}),h1e=e=>f.jsx("div",{className:ee("flex min-h-8 max-w-lg items-end justify-start pl-10",e.className),children:f.jsx(Uz,{message:e.message,className:"whitespace-pre-wrap text-sm"})}),b1e=e=>f.jsxs(Jm,{className:"w-fit max-w-lg p-2 text-xs [&>svg]:left-2.5 [&>svg]:top-2.5",variant:"destructive",children:[f.jsx(X4,{className:"h-4 w-4"}),f.jsx(z6,{children:"Something went wrong..."}),f.jsx(U6,{className:"text-xs",children:e.message})]}),y1e=({id:e,message:t})=>f.jsx("pre",{className:pie("mb-2 ml-8 w-fit max-w-xl overflow-x-scroll whitespace-pre-line rounded-lg border bg-muted p-2 text-xs font-normal text-muted-foreground"),children:t}),v1e=({message:e})=>f.jsx("p",{className:Tt("relative mb-2 ml-6 w-fit max-w-lg rounded-2xl border border-white bg-muted px-4 py-2 text-sm italic"),children:e}),S1e=({id:e,date:t})=>f.jsxs("span",{className:"!-mt-4 max-w-xl pr-6 text-right text-xs uppercase tracking-tight text-muted-foreground",children:["Message Receipt from ",t?Bs(t,"M/d/yy, h:mm a"):"Unknown"]}),w1e=()=>f.jsx("div",{className:"flex items-end justify-end",children:f.jsx("p",{className:"mb-2 w-fit max-w-lg rounded-2xl rounded-br-none border border-white bg-muted px-4 py-2 text-sm italic",children:"First login"})}),E1e=e=>f.jsx("div",{className:`${e.className} flex items-end justify-end`,children:f.jsxs("div",{className:"order-2 mx-2 flex max-w-lg flex-col items-end space-y-1 text-sm",children:[f.jsx("div",{className:"pr-1.5 text-xs text-muted-foreground",children:Bs(e.date,"MMM d yy, h:mm a")}),f.jsx(Uz,{message:e.message,className:"min-h-8 rounded-2xl rounded-br-none bg-white px-5 py-3 text-black"})]})}),x1e=({type:e,message:t,date:n,id:r},a,o=!0,i=!0,s=!0)=>{const l=e+t+n+r;if(e==="login")return f.jsx(w1e,{},l);if(e==="user")return f.jsx(E1e,{id:r,date:n,message:t??""},l);if(e==="error")return f.jsx(b1e,{date:n,message:t??""},l);if(e==="assistant")return f.jsx(h1e,{id:r,date:n,message:t??""},l);if(s&&e==="message-receipt")return f.jsx(S1e,{date:n},l);if(i&&e==="function-call")return f.jsx(y1e,{id:r,message:t},l);if(o&&e==="internal-monologue")return f.jsx(v1e,{message:t},l)};class sl extends Error{constructor(t,n){super(t+" at position "+n),this.position=n}}const yp=92,kx=47,k1e=42,$3=123,vp=125,F3=91,Sp=93,C1e=40,_1e=41,A1e=32,WA=10,Bz=9,Hz=13,T1e=8,R1e=12,sm=34,j3=43,z3=45,Vz=39,qz=48,Gz=57,Hi=44,wp=46,N1e=58,I1e=59,O1e=65,D1e=97,L1e=69,M1e=101,P1e=70,$1e=102,F1e=160,j1e=8192,z1e=8202,U1e=8239,B1e=8287,H1e=12288,V1e=8220,q1e=8221,G1e=8216,W1e=8217,K1e=96,Y1e=180;function Z1e(e){return e>=qz&&e<=Gz||e>=O1e&&e<=P1e||e>=D1e&&e<=$1e}function Vi(e){return e>=qz&&e<=Gz}function X1e(e){return e>=32&&e<=1114111}function ml(e){return Q1e.test(e)}const Q1e=/^[,:[\]/{}()\n+]$/;function J1e(e){return ml(e)&&e!=="/"}function U3(e){return eke.test(e)||e&&Qp(e.charCodeAt(0))}const eke=/^[[{\w-]$/;function tke(e){return e===WA||e===Hz||e===Bz||e===T1e||e===R1e}function Ol(e){return e===A1e||e===WA||e===Bz||e===Hz}function nke(e){return e===F1e||e>=j1e&&e<=z1e||e===U1e||e===B1e||e===H1e}function Qp(e){return Wz(e)||Hk(e)}function Wz(e){return e===sm||e===V1e||e===q1e}function B3(e){return e===sm}function Hk(e){return e===Vz||e===G1e||e===W1e||e===K1e||e===Y1e}function H3(e){return e===Vz}function yu(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1;const r=e.lastIndexOf(t);return r!==-1?e.substring(0,r)+(n?"":e.substring(r+1)):e}function Ea(e,t){let n=e.length;if(!Ol(e.charCodeAt(n-1)))return e+t;for(;Ol(e.charCodeAt(n-1));)n--;return e.substring(0,n)+t+e.substring(n)}function rke(e,t,n){return e.substring(0,t)+e.substring(t+n)}function ake(e){return/[,\n][ \t\r]*$/.test(e)}function oke(e){return/^\w+$/.test(e)}const ike={"\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r"," ":"\\t"},ske={'"':'"',"\\":"\\","/":"/",b:"\b",f:"\f",n:` +`,r:"\r",t:" "};function lke(e){let t=0,n="";o()||L();const a=c(Hi);for(a&&i(),U3(e[t])&&ake(n)?(a||(n=Ea(n,",")),y()):a&&(n=yu(n,","));e.charCodeAt(t)===vp||e.charCodeAt(t)===Sp;)t++,i();if(t>=e.length)return n;T();function o(){i();const M=m()||b()||w()||h()||S()||k();return i(),M}function i(){const M=t;let U=s();do U=l(),U&&(U=s());while(U);return t>M}function s(){let M="",U;for(;(U=Ol(e.charCodeAt(t)))||nke(e.charCodeAt(t));)U?M+=e[t]:M+=" ",t++;return M.length>0?(n+=M,!0):!1}function l(){if(e.charCodeAt(t)===kx&&e.charCodeAt(t+1)===k1e){for(;t=e.length;j||(U3(e[t])||O?n=Ea(n,":"):H()),o()||(j||O?n+="null":H())}return e.charCodeAt(t)===vp?(n+="}",t++):n=Ea(n,"}"),!0}return!1}function b(){if(e.charCodeAt(t)===F3){n+="[",t++,i(),u(Hi)&&i();let M=!0;for(;t0&&arguments[0]!==void 0?arguments[0]:!1,U=e.charCodeAt(t)===yp;if(U&&(t++,U=!0),Qp(e.charCodeAt(t))){const X=B3(e.charCodeAt(t))?B3:H3(e.charCodeAt(t))?H3:Bk(e.charCodeAt(t))?Bk:Gz,j=t,O=n.length;let A='"';for(t++;;){if(t>=e.length){const V=x(t-1);return!M&&ml(e.charAt(V))?(t=j,n=n.substring(0,O),w(!0)):(A=Ea(A,'"'),n+=A,!0)}else if(X(e.charCodeAt(t))){const V=t,P=A.length;if(A+='"',t++,n+=A,i(),M||t>=e.length||ml(e.charAt(t))||Qp(e.charCodeAt(t))||Vi(e.charCodeAt(t)))return v(),!0;if(ml(e.charAt(x(V-1))))return t=j,n=n.substring(0,O),w(!0);n=n.substring(0,O),t=V+1,A=A.substring(0,P)+"\\"+A.substring(P)}else{if(M&&ml(e[t]))return A=Ea(A,'"'),n+=A,v(),!0;if(e.charCodeAt(t)===yp){const V=e.charAt(t+1);if(ske[V]!==void 0)A+=e.slice(t,t+2),t+=2;else if(V==="u"){let N=2;for(;N<6&&Z1e(e.charCodeAt(t+N));)N++;N===6?(A+=e.slice(t,t+6),t+=6):t+N>=e.length?t=e.length:z()}else A+=V,t+=2}else{const V=e.charAt(t),P=e.charCodeAt(t);P===sm&&e.charCodeAt(t-1)!==yp?(A+="\\"+V,t++):tke(P)?(A+=ike[V],t++):(X1e(P)||R(V),A+=V,t++)}}U&&d()}}return!1}function v(){let M=!1;for(i();e.charCodeAt(t)===j3;){M=!0,t++,i(),n=yu(n,'"',!0);const U=n.length;w()?n=rke(n,U,1):n=Ea(n,'"')}return M}function h(){const M=t;if(e.charCodeAt(t)===z3){if(t++,C())return _(M),!0;if(!Vi(e.charCodeAt(t)))return t=M,!1}for(;Vi(e.charCodeAt(t));)t++;if(e.charCodeAt(t)===wp){if(t++,C())return _(M),!0;if(!Vi(e.charCodeAt(t)))return t=M,!1;for(;Vi(e.charCodeAt(t));)t++}if(e.charCodeAt(t)===M1e||e.charCodeAt(t)===L1e){if(t++,(e.charCodeAt(t)===z3||e.charCodeAt(t)===j3)&&t++,C())return _(M),!0;if(!Vi(e.charCodeAt(t)))return t=M,!1;for(;Vi(e.charCodeAt(t));)t++}if(!C())return t=M,!1;if(t>M){const U=e.slice(M,t),X=/^0\d/.test(U);return n+=X?'"'.concat(U,'"'):U,!0}return!1}function S(){return E("true","true")||E("false","false")||E("null","null")||E("True","true")||E("False","false")||E("None","null")}function E(M,U){return e.slice(t,t+M.length)===M?(n+=U,t+=M.length,!0):!1}function k(){const M=t;for(;tM){if(e.charCodeAt(t)===C1e&&oke(e.slice(M,t).trim()))return t++,o(),e.charCodeAt(t)===_1e&&(t++,e.charCodeAt(t)===I1e&&t++),!0;{for(;Ol(e.charCodeAt(t-1))&&t>0;)t--;const U=e.slice(M,t);return n+=U==="undefined"?"null":JSON.stringify(U),e.charCodeAt(t)===sm&&t++,!0}}}function x(M){let U=M;for(;U>0&&Ol(e.charCodeAt(U));)U--;return U}function C(){return t>=e.length||ml(e[t])||Ol(e.charCodeAt(t))}function _(M){n+=e.slice(M,t)+"0"}function R(M){throw new sl("Invalid character "+JSON.stringify(M),t)}function T(){throw new sl("Unexpected character "+JSON.stringify(e[t]),t)}function L(){throw new sl("Unexpected end of json string",e.length)}function D(){throw new sl("Object key expected",t)}function H(){throw new sl("Colon expected",t)}function z(){const M=e.slice(t,t+6);throw new sl('Invalid unicode character "'.concat(M,'"'),t)}}function cke(e,t){return e[t]==="*"&&e[t+1]==="/"}const uke=e=>{const t="api",n=[];if(e.role==="system")return n;if(e.role==="assistant")return n.push({id:e.id,source:t,type:"internal-monologue",message:e.text??"",date:new Date(e.created_at||"")}),(e.tool_calls??[]).forEach((o,i)=>{var s,l,c;if(o.type==="function"){const u=new Date(e.created_at||"");if(((s=o.function)==null?void 0:s.name)==="send_message"){let d={};try{d=JSON.parse(lke(o.function.arguments))}catch(g){console.error("failed to parse send message arguments",g,o.function.arguments)}n.push({id:e.id,source:t,type:"assistant",date:u,message:(d==null?void 0:d.message)??""})}else n.push({id:e.id,source:t,type:"function-call",date:u,message:`${(l=o.function)==null?void 0:l.name}(${(c=o.function)==null?void 0:c.arguments})`??""})}}),n;if(e.role==="tool")return e.name==="send_message"?(n.push({id:e.id,source:t,type:"message-receipt",message:(e==null?void 0:e.text)||"",date:new Date(e.created_at||"")}),n):(n.push({id:e.id,source:t,type:"function-call",message:(e==null?void 0:e.text)||"",date:new Date(e.created_at||"")}),n);const r=new Date(e.created_at||""),a=JSON.parse((e==null?void 0:e.text)||"");return a.type==="login"&&n.push({id:e.id,source:t,type:"login",date:r,message:a.message}),a.type==="user_message"&&n.push({id:e.id,source:t,type:"user",date:r,message:a.message}),n},Wz=p.forwardRef(({className:e,...t},n)=>f.jsx("div",{ref:n,className:ee("rounded-lg border bg-card text-card-foreground shadow-sm",e),...t}));Wz.displayName="Card";const Kz=p.forwardRef(({className:e,...t},n)=>f.jsx("div",{ref:n,className:ee("flex flex-col space-y-1.5 p-6",e),...t}));Kz.displayName="CardHeader";const Yz=p.forwardRef(({className:e,...t},n)=>f.jsx("h3",{ref:n,className:ee("text-2xl font-semibold leading-none tracking-tight",e),...t}));Yz.displayName="CardTitle";const Zz=p.forwardRef(({className:e,...t},n)=>f.jsx("p",{ref:n,className:ee("text-sm text-muted-foreground",e),...t}));Zz.displayName="CardDescription";const Xz=p.forwardRef(({className:e,...t},n)=>f.jsx("div",{ref:n,className:ee("p-6 pt-0",e),...t}));Xz.displayName="CardContent";const Qz=p.forwardRef(({className:e,...t},n)=>f.jsx("div",{ref:n,className:ee("flex items-center p-6 pt-0",e),...t}));Qz.displayName="CardFooter";const dke=()=>{const{data:e}=Qm(),[t,n]=p.useState(null),{setAgent:r}=fh();return f.jsxs(Wz,{className:"mx-4 my-10 w-fit bg-background duration-700 animate-in slide-in-from-top slide-out-to-top sm:mx-auto ",children:[f.jsxs(Kz,{className:"pb-3",children:[f.jsx(Yz,{children:"Choose Agent"}),f.jsx(Zz,{children:"Pick an agent to start a conversation..."})]}),f.jsx(Xz,{className:"grid gap-1",children:(e??[]).map((a,o)=>{var i,s,l,c;return f.jsxs("button",{onClick:()=>n(a),className:ee("-mx-2 flex items-start space-x-4 rounded-md p-2 text-left transition-all",(t==null?void 0:t.name)===a.name?"bg-accent text-accent-foreground":"hover:bg-accent hover:text-accent-foreground"),children:[f.jsx(jq,{className:"mt-px h-5 w-5"}),f.jsxs("div",{className:"space-y-1",children:[f.jsx("p",{className:"text-sm font-medium leading-none",children:a.name}),f.jsxs("p",{className:"text-sm text-muted-foreground",children:[((s=(i=a.memory)==null?void 0:i.memory)==null?void 0:s[fr].name)||""," | ",((c=(l=a.memory)==null?void 0:l.memory)==null?void 0:c[Qr].name)||""," | ",a.created_at]})]})]},o)})}),f.jsx(Qz,{children:f.jsx(ue,{onClick:()=>t&&r(t),className:"w-full",children:"Start Chat"})})]})},fke=({className:e})=>f.jsxs("div",{className:e,children:[f.jsxs("span",{className:"relative flex h-4 w-4",children:[f.jsx("span",{className:"absolute inline-flex h-full w-full animate-ping rounded-full bg-blue-400 opacity-75"}),f.jsx("span",{className:"relative inline-flex h-4 w-4 rounded-full bg-blue-600"})]}),f.jsx("span",{className:Tt("ml-4"),children:"Thinking..."})]}),pke=({currentAgent:e,isLoading:t,previousMessages:n})=>{const{messagesRef:r,scrollRef:a,visibilityRef:o}=fle(),i=w9(),s=S9(),l=Qie(),c=n.flatMap(uke),u=dle(c);return e?f.jsx("div",{ref:a,className:"relative flex-1 overflow-auto",children:f.jsxs("div",{className:"flex flex-1 flex-col gap-4 px-4 pb-10 pt-6",ref:r,children:[u.map((d,g)=>{var y;return[((y=u[g-1])==null?void 0:y.type)==="user"||g===0?f.jsx(gle,{name:e.name,date:d.date},d.id+(e.id||"")+g):null,x1e(d,g,s,i,l)]}),t?f.jsx(fke,{className:"flex items-center px-3 py-3"}):null,f.jsx("div",{className:"h-px w-full",ref:o})]})}):f.jsx(ple,{children:f.jsx(dke,{})})},gke=Xe({message:Ce().min(1,"Message cannot be empty...")}),mke=e=>{const{formRef:t,onKeyDown:n}=die(),r=bn({resolver:yn(gke),defaultValues:{message:""}});function a(o){e.onSend(o.message),r.reset()}return f.jsx(vn,{...r,children:f.jsx("form",{ref:t,onSubmit:r.handleSubmit(a),className:"mx-4 mb-8 flex-none",children:f.jsx(ut,{control:r.control,name:"message",render:({field:o})=>f.jsxs(ot,{className:"w-full",children:[f.jsx(yt,{className:"sr-only",children:"What's on your mind"}),f.jsx(pt,{className:"w-full",children:f.jsxs("div",{className:"relative overflow-hidden rounded-md border bg-background p-0.5 has-[:focus]:ring-2 has-[:focus]:ring-ring has-[:focus]:ring-offset-2 ",children:[f.jsx(qs,{onKeyDown:n,className:"h-20 w-full resize-none scroll-pb-10 rounded-none border-none pb-10 pt-4 focus-visible:ring-0",placeholder:"Type your message",...o}),f.jsxs("div",{className:"flex items-center justify-between p-4",children:[f.jsx("div",{}),f.jsxs(ue,{disabled:!e.enabled,type:"submit",children:[f.jsx(Pq,{className:"mr-2 size-5"})," Send"]})]})]})}),f.jsx(lt,{})]})})})})},hke=(e,t,n)=>p.useCallback((r,a="user")=>{var s,l;if(!((l=(s=e==null?void 0:e.memory)==null?void 0:s.memory)!=null&&l[fr]))return;const o=new Date;o.setMilliseconds(0);const i=t({agentId:e.id||"",message:r,role:a,memoryName:e.memory.memory[fr].label||""});n(e.id||"",{id:i,type:a==="user"?"user_message":"system_message",message_type:"user_message",message:r,date:o})},[e,t,n]);function bke(e,t,n,r,a,o,i,s){p.useEffect(()=>(e.current||(e.current=!0,setTimeout(()=>{!t||!n||(r.length===0||(a==null?void 0:a.agentId)!==n.id)&&(o({date:new Date,agentId:n.id||""}),i(s,"system"))},300)),()=>{e.current=!0}),[n,a==null?void 0:a.agentId,r.length,i,o,t])}const yke=["internal_monologue","function_call","function_return"],vke=()=>{const[e,t]=p.useState([]),n=To(),[r,a]=p.useState(!1),o=p.useCallback(async i=>{var g,m;const s=new AbortController,l=s.signal;t(b=>{var y,w;return[...b,{id:Wu(),name:(w=(y=n==null?void 0:n.memory)==null?void 0:y.memory)==null?void 0:w[fr].label,role:"user",text:JSON.stringify({type:"user_message",message:i,time:new Date().toISOString()}),created_at:new Date().toISOString()}]});const c={messages:[{role:"user",name:(m=(g=n==null?void 0:n.memory)==null?void 0:g.memory)==null?void 0:m[fr].label,text:i}],stream_steps:!0,stream_tokens:!0};a(!0);let u="",d=!1;y9(`${v9}/agents/${(n==null?void 0:n.id)||""}/messages`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"text/event-stream",Authorization:"Bearer password"},body:JSON.stringify(c),signal:l,onerror:()=>{s.abort(),a(!1)},onmessage:async b=>{if(["[DONE]","[DONE_GEN]","[DONE_STEP]"].includes(b.data)){a(!1);return}d||(t(h=>{var S,E;return[...h,{name:(E=(S=n==null?void 0:n.memory)==null?void 0:S.memory)==null?void 0:E[Qr].label,role:"assistant",id:Wu(),text:"",created_at:new Date().toISOString()}]}),d=!0);const y=Xe({internal_monologue:Ce()}).or(Xe({function_call:Xe({name:Ce(),arguments:Ce()})})).or(Xe({function_call:Xe({name:Ce()})})).or(Xe({function_call:Xe({arguments:Ce()})})).or(Xe({function_return:Ce(),status:Ce(),id:Ce()})).or(Xe({function_return:Ce(),date:Ce(),status:Ce(),id:Ce()})).and(Xe({date:Ce().optional().transform(h=>h?new Date(h):new Date)})).safeParse(JSON.parse(b.data));if(!y.success){console.log("error",y.error.message,b.data),s.abort();return}const w=y.data,v=Object.keys(w).find(h=>yke.includes(h));if(v&&("internal_monologue"in w&&(u&&u!=="internal_monologue"&&t(h=>{var S,E;return[...h,{name:(E=(S=n==null?void 0:n.memory)==null?void 0:S.memory)==null?void 0:E[Qr].label,role:"assistant",id:Wu(),text:"",created_at:new Date().toISOString()}]}),t(h=>[...h.slice(0,h.length-1),{...h[h.length-1],text:(h[h.length-1].text||"")+w.internal_monologue}])),"function_call"in w&&t(h=>{var k,x,C;const S=h[h.length-1];let E=(k=S==null?void 0:S.tool_calls)==null?void 0:k[((S==null?void 0:S.tool_calls)||[]).length-1];return"name"in w.function_call&&(E={id:"1",type:"function",function:{name:w.function_call.name,arguments:""}}),"arguments"in w.function_call&&(E={...E,id:"1",function:{name:((x=E==null?void 0:E.function)==null?void 0:x.name)||"",arguments:((C=E==null?void 0:E.function)==null?void 0:C.arguments)+w.function_call.arguments}}),E?[...h.slice(0,h.length-1),{...S,tool_calls:[...(S.tool_calls||[]).slice(0,(S.tool_calls||[]).length-1),E]}]:h}),u=v,"function_return"in w)){if(w.function_return==="None")return;t(h=>{const S=h[h.length-1];return[...h.slice(0,h.length-1),{...S,tool_calls:[...S.tool_calls||[],{id:"1",type:"function",function:{name:"",arguments:JSON.stringify(w,null,2)}}]}]})}}})},[n]);return{isLoading:r,streamedMessages:e,getMessageResponse:o}},Ske=()=>{const e=To(),t=p.useRef(!1),n=Fre(),r=$ie((e==null?void 0:e.id)??""),{autoMessage:a,shouldSendAutoMessage:o}=E9(),{setLastAgentInitMessage:i}=fh(),{sendMessage:s}=AN(),{registerOnMessageCallback:l,registerOnLastMessageReplaceCallback:c,registerOnReplaceTemporaryIdsWithReturnedIdsCallback:u,abortStream:d}=AN(),{addMessage:g,replaceLastMessage:m,replaceMessageIds:b}=Fie(),y=hke(e,s,g),{streamedMessages:w,isLoading:v,getMessageResponse:h}=vke(),S=iX({agentId:(e==null?void 0:e.id)??"",msgObject:!0,limit:1e3}),E=p.useCallback(_=>_?_.endsWith("Z")?_:`${_}Z`:"",[]),k=(S.data||[]).map(_=>({..._,created_at:E(_.created_at)}),[S.data]);bke(t,o,e,r,n,i,y,a);const[x,C]=p.useState(!1);return p.useEffect(()=>{e&&d()},[d,e]),p.useEffect(()=>{l(_=>{e&&g(e.id||"",_)}),c(_=>{e&&m(e.id||"",_)}),u((_,R)=>{e&&b(e.id||"",_,R)})},[d,l,c,u,e,g,m,b]),f.jsxs(Fs,{className:"flex flex-col overflow-hidden",children:[f.jsxs("div",{className:"flex flex-none items-center space-x-2 border-b p-4",children:[f.jsx(ue,{className:"mr-2",asChild:!0,size:"iconSm",variant:"outline",children:f.jsx(bd,{to:"..",children:f.jsx(Sq,{className:"size-5"})})}),f.jsxs("div",{className:"flex w-full items-center justify-between",children:[f.jsxs("div",{children:[f.jsx("h1",{className:Tt(),children:"Agent Chat"}),f.jsx("h2",{className:fie("text-foreground"),children:(e==null?void 0:e.name)??"Letta"})]}),e?f.jsxs("button",{onClick:async()=>{await navigator.clipboard.writeText((e==null?void 0:e.id)||""),C(!0),setTimeout(()=>C(!1),2e3)},className:ee(m9({variant:"secondary"}),"ml-2 opacity-80 hover:opacity-100"),children:[f.jsxs("span",{children:["Agent ID: ",e==null?void 0:e.id]}),x?f.jsx(Pm,{className:"ml-2 h-3 w-3"}):f.jsx(xq,{className:"ml-2 h-3 w-3"})]}):null]})]}),f.jsxs("div",{className:"relative flex min-h-0 flex-1",children:[f.jsx(ule,{currentAgentId:e==null?void 0:e.id}),f.jsx("div",{className:"flex flex-1 border-l bg-muted/50",children:f.jsxs("div",{className:"relative mx-auto flex max-w-screen-lg flex-1 flex-col overflow-hidden",children:[f.jsx(use,{}),f.jsx(pke,{currentAgent:e,isLoading:v,previousMessages:[...k,...w],messages:r}),f.jsx(mke,{enabled:!v,onSend:_=>{h(_)}})]})})]})]})},wke={path:"agents/:agentName/chat",element:f.jsx(Ske,{})};function Eke(e,t,n){var r=this,a=p.useRef(null),o=p.useRef(0),i=p.useRef(null),s=p.useRef([]),l=p.useRef(),c=p.useRef(),u=p.useRef(e),d=p.useRef(!0);u.current=e;var g=typeof window<"u",m=!t&&t!==0&&g;if(typeof e!="function")throw new TypeError("Expected a function");t=+t||0;var b=!!(n=n||{}).leading,y=!("trailing"in n)||!!n.trailing,w="maxWait"in n,v="debounceOnServer"in n&&!!n.debounceOnServer,h=w?Math.max(+n.maxWait||0,t):null;p.useEffect(function(){return d.current=!0,function(){d.current=!1}},[]);var S=p.useMemo(function(){var E=function(T){var L=s.current,D=l.current;return s.current=l.current=null,o.current=T,c.current=u.current.apply(D,L)},k=function(T,L){m&&cancelAnimationFrame(i.current),i.current=m?requestAnimationFrame(T):setTimeout(T,L)},x=function(T){if(!d.current)return!1;var L=T-a.current;return!a.current||L>=t||L<0||w&&T-o.current>=h},C=function(T){return i.current=null,y&&s.current?E(T):(s.current=l.current=null,c.current)},_=function T(){var L=Date.now();if(x(L))return C(L);if(d.current){var D=t-(L-a.current),H=w?Math.min(D,h-(L-o.current)):D;k(T,H)}},R=function(){if(g||v){var T=Date.now(),L=x(T);if(s.current=[].slice.call(arguments),l.current=r,a.current=T,L){if(!i.current&&d.current)return o.current=a.current,k(_,t),b?E(a.current):c.current;if(w)return k(_,t),E(a.current)}return i.current||k(_,t),c.current}};return R.cancel=function(){i.current&&(m?cancelAnimationFrame(i.current):clearTimeout(i.current)),o.current=0,s.current=a.current=l.current=i.current=null},R.isPending=function(){return!!i.current},R.flush=function(){return i.current?C(Date.now()):c.current},R},[b,w,t,h,y,m,g,v]);return S}function xke(e,t){return e===t}function kke(e,t){return t}function Ih(e,t,n){var r=n&&n.equalityFn||xke,a=p.useReducer(kke,e),o=a[0],i=a[1],s=Eke(p.useCallback(function(c){return i(c)},[i]),t,n),l=p.useRef(e);return r(l.current,e)||(s(e),l.current=e),[o,s]}const Cke=Xe({agentId:Ce()});function _ke({source:e,closeDialog:t}){const{data:n,isLoading:r}=Qm(),a=E6(),{toast:o}=An(),i=Bt(),s=bn({resolver:yn(Cke),mode:"onChange"}),l=c=>{a.mutate({agentId:c.agentId,sourceId:e.id||""},{onSuccess:()=>{t(),i.invalidateQueries({queryKey:sf()}),o({title:"Agent attached successfully!",duration:5e3})},onError:u=>{o({title:"Error attaching agent...",duration:5e3})}})};return f.jsx(vn,{...s,children:f.jsxs("form",{onSubmit:s.handleSubmit(l,c=>console.log(c)),className:"space-y-8",children:[f.jsx(ut,{control:s.control,name:"agentId",render:({field:c})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Agent to Attach to"}),f.jsxs(So,{disabled:r,onValueChange:c.onChange,value:c.value,children:[f.jsx(pt,{children:f.jsx(za,{children:f.jsx(wo,{placeholder:r?"Loading agents...":"Select an agent"})})}),f.jsx(Ua,{className:"max-h-[200px] overflow-y-auto",children:(n??[]).map(u=>f.jsx(Fn,{value:u.id||"",children:u.name},u.id))})]}),f.jsx(Mt,{children:"Select an agent to attach your data source to."}),f.jsx(lt,{})]})}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Attach to Agent"}),a.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Attaching agent to data source..."})]})]})]})})}const Ake=({open:e,onOpenChange:t,source:n})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsxs($t,{children:["Attach Agent to ",(n==null?void 0:n.name)??"Source"]}),f.jsx(dn,{children:"The datasource will then become available to the agent to use for information."})]}),n?f.jsx(_ke,{source:n,closeDialog:()=>t(!1)}):f.jsx("p",{children:"No source and agent..."})]})}),Tke=Xe({name:Ce().min(1,{message:"Name must be at least 1 character."}).max(30,{message:"Name must not be longer than 30 characters."}),description:Ce().max(2e3).min(0)}),Rke={name:"",description:""};function Nke({closeDialog:e}){const t=cX(),n=Bt(),{toast:r}=An(),a=bn({resolver:yn(Tke),defaultValues:Rke,mode:"onChange"}),o=i=>{t.mutate({requestBody:{name:i.name,description:i.description}},{onSuccess:()=>{n.invalidateQueries({queryKey:sf()}),e(),r({title:"Source created successfully!",duration:5e3})},onError:s=>{r({title:"Error creating source",duration:5e3})}})};return f.jsx(vn,{...a,children:f.jsxs("form",{onSubmit:a.handleSubmit(o,i=>console.log(i)),className:"space-y-8",children:[f.jsx(ut,{control:a.control,name:"name",render:({field:i})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Name"}),f.jsx(pt,{children:f.jsx(_n,{...i})}),f.jsx(Mt,{children:"This is your sources display name. It can be a real name or a pseudonym."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:a.control,name:"description",render:({field:i})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Description"}),f.jsx(pt,{children:f.jsx(qs,{placeholder:"Describe your source here",className:"resize-none",...i})}),f.jsx(lt,{})]})}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Create Source"}),t.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Creating Source..."})]})]})]})})}const Ike=({open:e,onOpenChange:t})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Create Data Source"}),f.jsx(dn,{children:"Add a new data source here. Click create when you're done."})]}),f.jsx(Nke,{closeDialog:()=>t(!1)})]})}),Oke=({value:e,onValueChange:t})=>f.jsx("form",{children:f.jsxs("div",{className:"relative",children:[f.jsx(Ms,{className:"pointer-events-none absolute left-[12px] top-3 h-4 w-4 text-muted-foreground"}),f.jsx(_n,{placeholder:"Search data source",value:e,onChange:n=>t(n.target.value),className:"w-52 pl-8 lg:w-80"})]})}),Dke=(e,t,n,r,a)=>[{accessorKey:"actions",header:"",cell:({row:o})=>f.jsx(Dn,{isLoading:a,children:f.jsxs("span",{className:"flex space-x-2",children:[f.jsx(ue,{onClick:()=>e(o.original),className:"!h-6 !w-6 !p-1",variant:"ghost",children:f.jsx(J4,{className:"h-3.5 w-3.5"})}),f.jsx(ue,{onClick:()=>t(o.original),className:"!h-6 !w-6 !p-1",variant:"ghost",children:f.jsx(Fm,{className:"h-3.5 w-3.5"})})]})})},{accessorKey:"name",header:"Name",cell:({row:o})=>f.jsx(Dn,{isLoading:a,children:o.getValue("name")})},{accessorFn:o=>{var i;return(i=o.embedding_config)==null?void 0:i.embedding_model},accessorKey:"embedding_model",header:"Embedding Model",cell:({row:o})=>f.jsx(Dn,{isLoading:a,children:o.getValue("embedding_model")})},{accessorFn:o=>{var i;return((i=o.embedding_config)==null?void 0:i.embedding_dim)??0},accessorKey:"embedding_dim",header:"Embedding Dimensions",cell:({row:o})=>f.jsx(Dn,{isLoading:a,children:o.getValue("embedding_dim")})},{accessorFn:o=>{var i;return((i=o.metadata_)==null?void 0:i.num_documents)??0},accessorKey:"num_documents",header:"Documents",cell:({row:o})=>f.jsx(Dn,{isLoading:a,children:o.getValue("num_documents")})},{accessorFn:o=>{var i;return((i=o.metadata_)==null?void 0:i.num_passages)??0},accessorKey:"num_passages",header:"Passages",cell:({row:o})=>f.jsx(Dn,{isLoading:a,children:o.getValue("num_passages")})},{accessorKey:"created_at",header:"Created At",cell:({row:o})=>f.jsx(Dn,{isLoading:a,children:Mre(o,"created_at","Unknown")})},{accessorFn:o=>{var i;return(i=o.metadata_)==null?void 0:i.attached_agents},accessorKey:"attached_agents",header:"Attached To",cell:({row:o})=>{const i=o.getValue("attached_agents")??[];return f.jsx(Dn,{isLoading:a,children:f.jsxs("div",{className:"flex flex-wrap items-baseline",children:[f.jsxs(ue,{onClick:()=>n(o.original),variant:"ghost",className:"mr-1 h-5 !p-1 text-xs",size:"sm",children:[f.jsx("span",{className:"sr-only",children:"attach another agent"}),f.jsx(Dq,{className:"h-3 w-3"})]}),i.map(s=>f.jsxs(ue,{onClick:()=>r(o.original,s),variant:"ghost",className:"mr-1 h-5 !p-1 text-xs",size:"sm",children:[s.name,f.jsx(Iq,{className:"ml-2 h-3 w-3"})]},s.id)),i.length===0&&f.jsx("span",{className:"text-xs",children:"- None"})]})})}}],Lke=({nameFilter:e,className:t,onSourceUpload:n,onSourceEdit:r,onAttachAgent:a,onDetachAgent:o})=>{const{data:i,isError:s,isLoading:l}=h_(),c=(i??[]).filter(u=>u.name.includes(e));return f.jsx("div",{className:t,children:f.jsx(uf,{columns:Dke(n,r,a,o,l),isLoading:l,error:s?"Failed to load sources":void 0,data:c,renderPagination:u=>f.jsx(df,{className:"mt-4",table:u})})})},Mke=({open:e,onOpenChange:t,source:n,agent:r})=>{const a=Bt(),o=x6(),{toast:i}=An(),s=()=>{!n||!r||o.mutate({agentId:r.id,sourceId:n.id||""},{onSuccess:()=>{t(!1),a.invalidateQueries({queryKey:sf()}),i({title:"Agent detached successfully!",duration:3e3})},onError:l=>i({title:"Failed to detach agent!",duration:3e3})})};return f.jsx(Kt,{open:n&&r&&e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsx(Pt,{children:f.jsxs($t,{children:["Detach Agent from ",(n==null?void 0:n.name)??"Source"]})}),f.jsx("p",{className:"pb-10",children:"The data source will then no longer be available to the agent to use for information."}),f.jsxs("div",{className:"flex space-x-2",children:[f.jsx(ue,{variant:"ghost",onClick:()=>t(!1),children:"Cancel"}),f.jsxs(ue,{onClick:s,children:[o.isPending?"Detaching":"Detach"," Agent"]})]})]})})},Pke=Xe({name:Ce().min(1,{message:"Name must be at least 1 character."}).max(30,{message:"Name must not be longer than 30 characters."}),description:Ce().max(2e3).min(0)});function $ke({source:e,closeDialog:t}){const n=pX(),r=Bt(),{toast:a}=An(),o={name:e.name,description:e.description??""},i=bn({resolver:yn(Pke),defaultValues:o,mode:"onChange"}),s=l=>{n.mutate({sourceId:e.id||"",requestBody:{id:e.id||"",name:l.name||"",description:l.description}},{onSuccess:()=>{r.invalidateQueries({queryKey:sf()}),t(),a({title:"Source editd successfully!",duration:5e3})},onError:c=>{a({title:"Error creating source",duration:5e3})}})};return f.jsx(vn,{...i,children:f.jsxs("form",{onSubmit:i.handleSubmit(s,l=>console.log(l)),className:"space-y-8",children:[f.jsx(ut,{control:i.control,name:"name",render:({field:l})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Name"}),f.jsx(pt,{children:f.jsx(_n,{...l})}),f.jsx(Mt,{children:"This is your sources display name. It can be a real name or a pseudonym."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:i.control,name:"description",render:({field:l})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Description"}),f.jsx(pt,{children:f.jsx(qs,{placeholder:"Describe your source here",className:"resize-none",...l})}),f.jsx(lt,{})]})}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Edit Source"}),n.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Edit Source..."})]})]})]})})}const Fke=({open:e,onOpenChange:t,source:n})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Edit Data Source"}),f.jsx(dn,{children:"Edit an existing data source here."})]}),n?f.jsx($ke,{source:n,closeDialog:()=>t(!1)}):f.jsx("p",{children:"No source..."})]})}),jke=Xe({file:Tie(e=>e instanceof File)}),zke=e=>{const t=k6(),{toast:n}=An(),r=Bt(),a=bn({resolver:yn(jke),mode:"onChange"}),o=i=>{t.mutate({sourceId:e.source.id||"",formData:{file:i.file}},{onSuccess:()=>{r.invalidateQueries({queryKey:BZ()}),e.onComplete()},onError:s=>n({title:"Failed to upload file...",duration:5e3})})};return f.jsx(vn,{...a,children:f.jsxs("form",{onSubmit:a.handleSubmit(o),className:"space-y-8",children:[f.jsx(ut,{control:a.control,name:"file",render:({field:i})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"File"}),f.jsx(pt,{children:f.jsx(_n,{type:"file",ref:i.ref,disabled:i.disabled,name:i.name,onBlur:i.onBlur,onChange:s=>{var l,c;i.onChange((c=(l=s.target)==null?void 0:l.files)==null?void 0:c[0])}})}),f.jsx(Mt,{children:"File to upload."}),f.jsx(lt,{})]})}),f.jsxs("div",{className:"flex space-x-4",children:[f.jsx(ue,{children:"Upload File"}),t.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Creating Job to ingest file..."})]}),t.isSuccess&&f.jsxs("div",{className:Tt("ml-4 flex items-center text-emerald-600 animate-in slide-in-from-bottom-2"),children:[f.jsx(Mm,{className:"mr-2 h-4 w-4 "}),f.jsx("span",{children:"Job created! File ingestion started!"})]})]})]})})},Uke=Xe({sourceId:Ce(),file:Rie()}),Bke=({onComplete:e})=>{const t=h_(),n=k6(),{toast:r}=An(),a=bn({resolver:yn(Uke),defaultValues:{sourceId:"",file:void 0},mode:"onChange"}),o=Bt(),i=s=>{n.mutate({sourceId:s.sourceId,formData:{file:s.file}},{onSuccess:()=>{o.invalidateQueries({queryKey:h6()}),e()},onError:l=>r({title:"Failed to upload file...",duration:5e3})})};return f.jsx(vn,{...a,children:f.jsxs("form",{onSubmit:a.handleSubmit(i),className:"space-y-8",children:[f.jsx(ut,{control:a.control,name:"sourceId",render:({field:s})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Upload to"}),f.jsx(pt,{children:f.jsxs(So,{value:s.value,name:s.name,onValueChange:s.onChange,disabled:t.isLoading,children:[f.jsx(za,{className:"w-full",children:f.jsx(wo,{placeholder:"Select a source"})}),f.jsx(Ua,{children:(t.data??[]).map(l=>f.jsx(Fn,{value:l.id||"",children:l.name},l.id))})]})}),f.jsx(Mt,{children:"Upload your data to this source."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:a.control,name:"file",render:({field:s})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"File"}),f.jsx(pt,{children:f.jsx(_n,{type:"file",ref:s.ref,disabled:s.disabled,name:s.name,onBlur:s.onBlur,onChange:l=>{var c,u;s.onChange((u=(c=l.target)==null?void 0:c.files)==null?void 0:u[0])}})}),f.jsx(Mt,{children:"File to upload."}),f.jsx(lt,{})]})}),f.jsxs("div",{className:"flex space-x-4",children:[f.jsx(ue,{children:"Upload File"}),n.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Creating Job to ingest file..."})]}),n.isSuccess&&f.jsxs("div",{className:Tt("ml-4 flex items-center text-emerald-600 animate-in slide-in-from-bottom-2"),children:[f.jsx(Mm,{className:"mr-2 h-4 w-4 "}),f.jsx("span",{children:"Job created! File ingestion started!"})]})]})]})})},Hke=({source:e,open:t,onOpenChange:n})=>f.jsx(Kt,{open:t,onOpenChange:n,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsx(Pt,{children:f.jsxs($t,{children:["Upload Data ",e&&`to ${e.name}`]})}),e?f.jsx(zke,{onComplete:()=>n(!1),source:e}):f.jsx(Bke,{onComplete:()=>n(!1)})]})}),Jz="Progress",Oh=100,[Vke,gTe]=zn(Jz),[qke,Gke]=Vke(Jz),eU=p.forwardRef((e,t)=>{const{__scopeProgress:n,value:r,max:a,getValueLabel:o=Yke,...i}=e,s=Hk(a)?a:Oh,l=nU(r,s)?r:null,c=lm(l)?o(l,s):void 0;return p.createElement(qke,{scope:n,value:l,max:s},p.createElement(ze.div,W({"aria-valuemax":s,"aria-valuemin":0,"aria-valuenow":lm(l)?l:void 0,"aria-valuetext":c,role:"progressbar","data-state":tU(l,s),"data-value":l??void 0,"data-max":s},i,{ref:t})))});eU.propTypes={max(e,t,n){const r=e[t],a=String(r);return r&&!Hk(r)?new Error(Zke(a,n)):null},value(e,t,n){const r=e[t],a=String(r),o=Hk(e.max)?e.max:Oh;return r!=null&&!nU(r,o)?new Error(Xke(a,n)):null}};const Wke="ProgressIndicator",Kke=p.forwardRef((e,t)=>{var n;const{__scopeProgress:r,...a}=e,o=Gke(Wke,r);return p.createElement(ze.div,W({"data-state":tU(o.value,o.max),"data-value":(n=o.value)!==null&&n!==void 0?n:void 0,"data-max":o.max},a,{ref:t}))});function Yke(e,t){return`${Math.round(e/t*100)}%`}function tU(e,t){return e==null?"indeterminate":e===t?"complete":"loading"}function lm(e){return typeof e=="number"}function Hk(e){return lm(e)&&!isNaN(e)&&e>0}function nU(e,t){return lm(e)&&!isNaN(e)&&e<=t&&e>=0}function Zke(e,t){return`Invalid prop \`max\` of value \`${e}\` supplied to \`${t}\`. Only numbers greater than 0 are valid max values. Defaulting to \`${Oh}\`.`}function Xke(e,t){return`Invalid prop \`value\` of value \`${e}\` supplied to \`${t}\`. The \`value\` prop must be: +]`)}function w(){let M=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,U=e.charCodeAt(t)===yp;if(U&&(t++,U=!0),Qp(e.charCodeAt(t))){const X=B3(e.charCodeAt(t))?B3:H3(e.charCodeAt(t))?H3:Hk(e.charCodeAt(t))?Hk:Wz,j=t,O=n.length;let A='"';for(t++;;){if(t>=e.length){const V=x(t-1);return!M&&ml(e.charAt(V))?(t=j,n=n.substring(0,O),w(!0)):(A=Ea(A,'"'),n+=A,!0)}else if(X(e.charCodeAt(t))){const V=t,P=A.length;if(A+='"',t++,n+=A,i(),M||t>=e.length||ml(e.charAt(t))||Qp(e.charCodeAt(t))||Vi(e.charCodeAt(t)))return v(),!0;if(ml(e.charAt(x(V-1))))return t=j,n=n.substring(0,O),w(!0);n=n.substring(0,O),t=V+1,A=A.substring(0,P)+"\\"+A.substring(P)}else{if(M&&ml(e[t]))return A=Ea(A,'"'),n+=A,v(),!0;if(e.charCodeAt(t)===yp){const V=e.charAt(t+1);if(ske[V]!==void 0)A+=e.slice(t,t+2),t+=2;else if(V==="u"){let N=2;for(;N<6&&Z1e(e.charCodeAt(t+N));)N++;N===6?(A+=e.slice(t,t+6),t+=6):t+N>=e.length?t=e.length:z()}else A+=V,t+=2}else{const V=e.charAt(t),P=e.charCodeAt(t);P===sm&&e.charCodeAt(t-1)!==yp?(A+="\\"+V,t++):tke(P)?(A+=ike[V],t++):(X1e(P)||R(V),A+=V,t++)}}U&&d()}}return!1}function v(){let M=!1;for(i();e.charCodeAt(t)===j3;){M=!0,t++,i(),n=yu(n,'"',!0);const U=n.length;w()?n=rke(n,U,1):n=Ea(n,'"')}return M}function h(){const M=t;if(e.charCodeAt(t)===z3){if(t++,C())return _(M),!0;if(!Vi(e.charCodeAt(t)))return t=M,!1}for(;Vi(e.charCodeAt(t));)t++;if(e.charCodeAt(t)===wp){if(t++,C())return _(M),!0;if(!Vi(e.charCodeAt(t)))return t=M,!1;for(;Vi(e.charCodeAt(t));)t++}if(e.charCodeAt(t)===M1e||e.charCodeAt(t)===L1e){if(t++,(e.charCodeAt(t)===z3||e.charCodeAt(t)===j3)&&t++,C())return _(M),!0;if(!Vi(e.charCodeAt(t)))return t=M,!1;for(;Vi(e.charCodeAt(t));)t++}if(!C())return t=M,!1;if(t>M){const U=e.slice(M,t),X=/^0\d/.test(U);return n+=X?'"'.concat(U,'"'):U,!0}return!1}function S(){return E("true","true")||E("false","false")||E("null","null")||E("True","true")||E("False","false")||E("None","null")}function E(M,U){return e.slice(t,t+M.length)===M?(n+=U,t+=M.length,!0):!1}function k(){const M=t;for(;tM){if(e.charCodeAt(t)===C1e&&oke(e.slice(M,t).trim()))return t++,o(),e.charCodeAt(t)===_1e&&(t++,e.charCodeAt(t)===I1e&&t++),!0;{for(;Ol(e.charCodeAt(t-1))&&t>0;)t--;const U=e.slice(M,t);return n+=U==="undefined"?"null":JSON.stringify(U),e.charCodeAt(t)===sm&&t++,!0}}}function x(M){let U=M;for(;U>0&&Ol(e.charCodeAt(U));)U--;return U}function C(){return t>=e.length||ml(e[t])||Ol(e.charCodeAt(t))}function _(M){n+=e.slice(M,t)+"0"}function R(M){throw new sl("Invalid character "+JSON.stringify(M),t)}function T(){throw new sl("Unexpected character "+JSON.stringify(e[t]),t)}function L(){throw new sl("Unexpected end of json string",e.length)}function D(){throw new sl("Object key expected",t)}function H(){throw new sl("Colon expected",t)}function z(){const M=e.slice(t,t+6);throw new sl('Invalid unicode character "'.concat(M,'"'),t)}}function cke(e,t){return e[t]==="*"&&e[t+1]==="/"}const uke=e=>{const t="api",n=[];if(e.role==="system")return n;if(e.role==="assistant")return n.push({id:e.id,source:t,type:"internal-monologue",message:e.text??"",date:new Date(e.created_at||"")}),(e.tool_calls??[]).forEach((o,i)=>{var s,l,c;if(o.type==="function"){const u=new Date(e.created_at||"");if(((s=o.function)==null?void 0:s.name)==="send_message"){let d={};try{d=JSON.parse(lke(o.function.arguments))}catch(g){console.error("failed to parse send message arguments",g,o.function.arguments)}n.push({id:e.id,source:t,type:"assistant",date:u,message:(d==null?void 0:d.message)??""})}else n.push({id:e.id,source:t,type:"function-call",date:u,message:`${(l=o.function)==null?void 0:l.name}(${(c=o.function)==null?void 0:c.arguments})`??""})}}),n;if(e.role==="tool")return e.name==="send_message"?(n.push({id:e.id,source:t,type:"message-receipt",message:(e==null?void 0:e.text)||"",date:new Date(e.created_at||"")}),n):(n.push({id:e.id,source:t,type:"function-call",message:(e==null?void 0:e.text)||"",date:new Date(e.created_at||"")}),n);const r=new Date(e.created_at||""),a=JSON.parse((e==null?void 0:e.text)||"");return a.type==="login"&&n.push({id:e.id,source:t,type:"login",date:r,message:a.message}),a.type==="user_message"&&n.push({id:e.id,source:t,type:"user",date:r,message:a.message}),n},Kz=p.forwardRef(({className:e,...t},n)=>f.jsx("div",{ref:n,className:ee("rounded-lg border bg-card text-card-foreground shadow-sm",e),...t}));Kz.displayName="Card";const Yz=p.forwardRef(({className:e,...t},n)=>f.jsx("div",{ref:n,className:ee("flex flex-col space-y-1.5 p-6",e),...t}));Yz.displayName="CardHeader";const Zz=p.forwardRef(({className:e,...t},n)=>f.jsx("h3",{ref:n,className:ee("text-2xl font-semibold leading-none tracking-tight",e),...t}));Zz.displayName="CardTitle";const Xz=p.forwardRef(({className:e,...t},n)=>f.jsx("p",{ref:n,className:ee("text-sm text-muted-foreground",e),...t}));Xz.displayName="CardDescription";const Qz=p.forwardRef(({className:e,...t},n)=>f.jsx("div",{ref:n,className:ee("p-6 pt-0",e),...t}));Qz.displayName="CardContent";const Jz=p.forwardRef(({className:e,...t},n)=>f.jsx("div",{ref:n,className:ee("flex items-center p-6 pt-0",e),...t}));Jz.displayName="CardFooter";const dke=()=>{const{data:e}=Qm(),[t,n]=p.useState(null),{setAgent:r}=ph();return f.jsxs(Kz,{className:"mx-4 my-10 w-fit bg-background duration-700 animate-in slide-in-from-top slide-out-to-top sm:mx-auto ",children:[f.jsxs(Yz,{className:"pb-3",children:[f.jsx(Zz,{children:"Choose Agent"}),f.jsx(Xz,{children:"Pick an agent to start a conversation..."})]}),f.jsx(Qz,{className:"grid gap-1",children:(e??[]).map((a,o)=>{var i,s,l,c;return f.jsxs("button",{onClick:()=>n(a),className:ee("-mx-2 flex items-start space-x-4 rounded-md p-2 text-left transition-all",(t==null?void 0:t.name)===a.name?"bg-accent text-accent-foreground":"hover:bg-accent hover:text-accent-foreground"),children:[f.jsx(jq,{className:"mt-px h-5 w-5"}),f.jsxs("div",{className:"space-y-1",children:[f.jsx("p",{className:"text-sm font-medium leading-none",children:a.name}),f.jsxs("p",{className:"text-sm text-muted-foreground",children:[((s=(i=a.memory)==null?void 0:i.memory)==null?void 0:s[fr].name)||""," | ",((c=(l=a.memory)==null?void 0:l.memory)==null?void 0:c[Qr].name)||""," | ",a.created_at]})]})]},o)})}),f.jsx(Jz,{children:f.jsx(ue,{onClick:()=>t&&r(t),className:"w-full",children:"Start Chat"})})]})},fke=({className:e})=>f.jsxs("div",{className:e,children:[f.jsxs("span",{className:"relative flex h-4 w-4",children:[f.jsx("span",{className:"absolute inline-flex h-full w-full animate-ping rounded-full bg-blue-400 opacity-75"}),f.jsx("span",{className:"relative inline-flex h-4 w-4 rounded-full bg-blue-600"})]}),f.jsx("span",{className:Tt("ml-4"),children:"Thinking..."})]}),pke=({currentAgent:e,isLoading:t,previousMessages:n})=>{const{messagesRef:r,scrollRef:a,visibilityRef:o}=fle(),i=E9(),s=w9(),l=Qie(),c=n.flatMap(uke),u=dle(c);return e?f.jsx("div",{ref:a,className:"relative flex-1 overflow-auto",children:f.jsxs("div",{className:"flex flex-1 flex-col gap-4 px-4 pb-10 pt-6",ref:r,children:[u.map((d,g)=>{var y;return[((y=u[g-1])==null?void 0:y.type)==="user"||g===0?f.jsx(gle,{name:e.name,date:d.date},d.id+(e.id||"")+g):null,x1e(d,g,s,i,l)]}),t?f.jsx(fke,{className:"flex items-center px-3 py-3"}):null,f.jsx("div",{className:"h-px w-full",ref:o})]})}):f.jsx(ple,{children:f.jsx(dke,{})})},gke=Xe({message:Ce().min(1,"Message cannot be empty...")}),mke=e=>{const{formRef:t,onKeyDown:n}=die(),r=bn({resolver:yn(gke),defaultValues:{message:""}});function a(o){e.onSend(o.message),r.reset()}return f.jsx(vn,{...r,children:f.jsx("form",{ref:t,onSubmit:r.handleSubmit(a),className:"mx-4 mb-8 flex-none",children:f.jsx(ut,{control:r.control,name:"message",render:({field:o})=>f.jsxs(ot,{className:"w-full",children:[f.jsx(yt,{className:"sr-only",children:"What's on your mind"}),f.jsx(pt,{className:"w-full",children:f.jsxs("div",{className:"relative overflow-hidden rounded-md border bg-background p-0.5 has-[:focus]:ring-2 has-[:focus]:ring-ring has-[:focus]:ring-offset-2 ",children:[f.jsx(qs,{onKeyDown:n,className:"h-20 w-full resize-none scroll-pb-10 rounded-none border-none pb-10 pt-4 focus-visible:ring-0",placeholder:"Type your message",...o}),f.jsxs("div",{className:"flex items-center justify-between p-4",children:[f.jsx("div",{}),f.jsxs(ue,{disabled:!e.enabled,type:"submit",children:[f.jsx(Pq,{className:"mr-2 size-5"})," Send"]})]})]})}),f.jsx(lt,{})]})})})})},hke=(e,t,n)=>p.useCallback((r,a="user")=>{var s,l;if(!((l=(s=e==null?void 0:e.memory)==null?void 0:s.memory)!=null&&l[fr]))return;const o=new Date;o.setMilliseconds(0);const i=t({agentId:e.id||"",message:r,role:a,memoryName:e.memory.memory[fr].label||""});n(e.id||"",{id:i,type:a==="user"?"user_message":"system_message",message_type:"user_message",message:r,date:o})},[e,t,n]);function bke(e,t,n,r,a,o,i,s){p.useEffect(()=>(e.current||(e.current=!0,setTimeout(()=>{!t||!n||(r.length===0||(a==null?void 0:a.agentId)!==n.id)&&(o({date:new Date,agentId:n.id||""}),i(s,"system"))},300)),()=>{e.current=!0}),[n,a==null?void 0:a.agentId,r.length,i,o,t])}const yke=["internal_monologue","function_call","function_return"],vke=()=>{const[e,t]=p.useState([]),n=To(),[r,a]=p.useState(!1),o=p.useCallback(async i=>{var g,m;const s=new AbortController,l=s.signal;t(b=>{var y,w;return[...b,{id:Wu(),name:(w=(y=n==null?void 0:n.memory)==null?void 0:y.memory)==null?void 0:w[fr].label,role:"user",text:JSON.stringify({type:"user_message",message:i,time:new Date().toISOString()}),created_at:new Date().toISOString()}]});const c={messages:[{role:"user",name:(m=(g=n==null?void 0:n.memory)==null?void 0:g.memory)==null?void 0:m[fr].label,text:i}],stream_steps:!0,stream_tokens:!0};a(!0);let u="",d=!1;v9(`${S9}/agents/${(n==null?void 0:n.id)||""}/messages`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"text/event-stream",Authorization:"Bearer password"},body:JSON.stringify(c),signal:l,onerror:()=>{s.abort(),a(!1)},onmessage:async b=>{if(["[DONE]","[DONE_GEN]","[DONE_STEP]"].includes(b.data)){a(!1);return}d||(t(h=>{var S,E;return[...h,{name:(E=(S=n==null?void 0:n.memory)==null?void 0:S.memory)==null?void 0:E[Qr].label,role:"assistant",id:Wu(),text:"",created_at:new Date().toISOString()}]}),d=!0);const y=Xe({internal_monologue:Ce()}).or(Xe({function_call:Xe({name:Ce(),arguments:Ce()})})).or(Xe({function_call:Xe({name:Ce()})})).or(Xe({function_call:Xe({arguments:Ce()})})).or(Xe({function_return:Ce(),status:Ce(),id:Ce()})).or(Xe({function_return:Ce(),date:Ce(),status:Ce(),id:Ce()})).and(Xe({date:Ce().optional().transform(h=>h?new Date(h):new Date)})).safeParse(JSON.parse(b.data));if(!y.success){console.log("error",y.error.message,b.data),s.abort();return}const w=y.data,v=Object.keys(w).find(h=>yke.includes(h));if(v&&("internal_monologue"in w&&(u&&u!=="internal_monologue"&&t(h=>{var S,E;return[...h,{name:(E=(S=n==null?void 0:n.memory)==null?void 0:S.memory)==null?void 0:E[Qr].label,role:"assistant",id:Wu(),text:"",created_at:new Date().toISOString()}]}),t(h=>[...h.slice(0,h.length-1),{...h[h.length-1],text:(h[h.length-1].text||"")+w.internal_monologue}])),"function_call"in w&&t(h=>{var k,x,C;const S=h[h.length-1];let E=(k=S==null?void 0:S.tool_calls)==null?void 0:k[((S==null?void 0:S.tool_calls)||[]).length-1];return"name"in w.function_call&&(E={id:"1",type:"function",function:{name:w.function_call.name,arguments:""}}),"arguments"in w.function_call&&(E={...E,id:"1",function:{name:((x=E==null?void 0:E.function)==null?void 0:x.name)||"",arguments:((C=E==null?void 0:E.function)==null?void 0:C.arguments)+w.function_call.arguments}}),E?[...h.slice(0,h.length-1),{...S,tool_calls:[...(S.tool_calls||[]).slice(0,(S.tool_calls||[]).length-1),E]}]:h}),u=v,"function_return"in w)){if(w.function_return==="None")return;t(h=>{const S=h[h.length-1];return[...h.slice(0,h.length-1),{...S,tool_calls:[...S.tool_calls||[],{id:"1",type:"function",function:{name:"",arguments:JSON.stringify(w,null,2)}}]}]})}}})},[n]);return{isLoading:r,streamedMessages:e,getMessageResponse:o}},Ske=()=>{const e=To(),t=p.useRef(!1),n=Fre(),r=$ie((e==null?void 0:e.id)??""),{autoMessage:a,shouldSendAutoMessage:o}=x9(),{setLastAgentInitMessage:i}=ph(),{sendMessage:s}=AN(),{registerOnMessageCallback:l,registerOnLastMessageReplaceCallback:c,registerOnReplaceTemporaryIdsWithReturnedIdsCallback:u,abortStream:d}=AN(),{addMessage:g,replaceLastMessage:m,replaceMessageIds:b}=Fie(),y=hke(e,s,g),{streamedMessages:w,isLoading:v,getMessageResponse:h}=vke(),S=iX({agentId:(e==null?void 0:e.id)??"",msgObject:!0,limit:1e3}),E=p.useCallback(_=>_?_.endsWith("Z")?_:`${_}Z`:"",[]),k=(S.data||[]).map(_=>({..._,created_at:E(_.created_at)}),[S.data]);bke(t,o,e,r,n,i,y,a);const[x,C]=p.useState(!1);return p.useEffect(()=>{e&&d()},[d,e]),p.useEffect(()=>{l(_=>{e&&g(e.id||"",_)}),c(_=>{e&&m(e.id||"",_)}),u((_,R)=>{e&&b(e.id||"",_,R)})},[d,l,c,u,e,g,m,b]),f.jsxs(Fs,{className:"flex flex-col overflow-hidden",children:[f.jsxs("div",{className:"flex flex-none items-center space-x-2 border-b p-4",children:[f.jsx(ue,{className:"mr-2",asChild:!0,size:"iconSm",variant:"outline",children:f.jsx(bd,{to:"..",children:f.jsx(Sq,{className:"size-5"})})}),f.jsxs("div",{className:"flex w-full items-center justify-between",children:[f.jsxs("div",{children:[f.jsx("h1",{className:Tt(),children:"Agent Chat"}),f.jsx("h2",{className:fie("text-foreground"),children:(e==null?void 0:e.name)??"Letta"})]}),e?f.jsxs("button",{onClick:async()=>{await navigator.clipboard.writeText((e==null?void 0:e.id)||""),C(!0),setTimeout(()=>C(!1),2e3)},className:ee(h9({variant:"secondary"}),"ml-2 opacity-80 hover:opacity-100"),children:[f.jsxs("span",{children:["Agent ID: ",e==null?void 0:e.id]}),x?f.jsx(Pm,{className:"ml-2 h-3 w-3"}):f.jsx(xq,{className:"ml-2 h-3 w-3"})]}):null]})]}),f.jsxs("div",{className:"relative flex min-h-0 flex-1",children:[f.jsx(ule,{currentAgentId:e==null?void 0:e.id}),f.jsx("div",{className:"flex flex-1 border-l bg-muted/50",children:f.jsxs("div",{className:"relative mx-auto flex max-w-screen-lg flex-1 flex-col overflow-hidden",children:[f.jsx(use,{}),f.jsx(pke,{currentAgent:e,isLoading:v,previousMessages:[...k,...w],messages:r}),f.jsx(mke,{enabled:!v,onSend:_=>{h(_)}})]})})]})]})},wke={path:"agents/:agentName/chat",element:f.jsx(Ske,{})};function Eke(e,t,n){var r=this,a=p.useRef(null),o=p.useRef(0),i=p.useRef(null),s=p.useRef([]),l=p.useRef(),c=p.useRef(),u=p.useRef(e),d=p.useRef(!0);u.current=e;var g=typeof window<"u",m=!t&&t!==0&&g;if(typeof e!="function")throw new TypeError("Expected a function");t=+t||0;var b=!!(n=n||{}).leading,y=!("trailing"in n)||!!n.trailing,w="maxWait"in n,v="debounceOnServer"in n&&!!n.debounceOnServer,h=w?Math.max(+n.maxWait||0,t):null;p.useEffect(function(){return d.current=!0,function(){d.current=!1}},[]);var S=p.useMemo(function(){var E=function(T){var L=s.current,D=l.current;return s.current=l.current=null,o.current=T,c.current=u.current.apply(D,L)},k=function(T,L){m&&cancelAnimationFrame(i.current),i.current=m?requestAnimationFrame(T):setTimeout(T,L)},x=function(T){if(!d.current)return!1;var L=T-a.current;return!a.current||L>=t||L<0||w&&T-o.current>=h},C=function(T){return i.current=null,y&&s.current?E(T):(s.current=l.current=null,c.current)},_=function T(){var L=Date.now();if(x(L))return C(L);if(d.current){var D=t-(L-a.current),H=w?Math.min(D,h-(L-o.current)):D;k(T,H)}},R=function(){if(g||v){var T=Date.now(),L=x(T);if(s.current=[].slice.call(arguments),l.current=r,a.current=T,L){if(!i.current&&d.current)return o.current=a.current,k(_,t),b?E(a.current):c.current;if(w)return k(_,t),E(a.current)}return i.current||k(_,t),c.current}};return R.cancel=function(){i.current&&(m?cancelAnimationFrame(i.current):clearTimeout(i.current)),o.current=0,s.current=a.current=l.current=i.current=null},R.isPending=function(){return!!i.current},R.flush=function(){return i.current?C(Date.now()):c.current},R},[b,w,t,h,y,m,g,v]);return S}function xke(e,t){return e===t}function kke(e,t){return t}function Oh(e,t,n){var r=n&&n.equalityFn||xke,a=p.useReducer(kke,e),o=a[0],i=a[1],s=Eke(p.useCallback(function(c){return i(c)},[i]),t,n),l=p.useRef(e);return r(l.current,e)||(s(e),l.current=e),[o,s]}const Cke=Xe({agentId:Ce()});function _ke({source:e,closeDialog:t}){const{data:n,isLoading:r}=Qm(),a=x6(),{toast:o}=An(),i=Bt(),s=bn({resolver:yn(Cke),mode:"onChange"}),l=c=>{a.mutate({agentId:c.agentId,sourceId:e.id||""},{onSuccess:()=>{t(),i.invalidateQueries({queryKey:sf()}),o({title:"Agent attached successfully!",duration:5e3})},onError:u=>{o({title:"Error attaching agent...",duration:5e3})}})};return f.jsx(vn,{...s,children:f.jsxs("form",{onSubmit:s.handleSubmit(l,c=>console.log(c)),className:"space-y-8",children:[f.jsx(ut,{control:s.control,name:"agentId",render:({field:c})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Agent to Attach to"}),f.jsxs(So,{disabled:r,onValueChange:c.onChange,value:c.value,children:[f.jsx(pt,{children:f.jsx(za,{children:f.jsx(wo,{placeholder:r?"Loading agents...":"Select an agent"})})}),f.jsx(Ua,{className:"max-h-[200px] overflow-y-auto",children:(n??[]).map(u=>f.jsx(Fn,{value:u.id||"",children:u.name},u.id))})]}),f.jsx(Mt,{children:"Select an agent to attach your data source to."}),f.jsx(lt,{})]})}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Attach to Agent"}),a.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Attaching agent to data source..."})]})]})]})})}const Ake=({open:e,onOpenChange:t,source:n})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsxs($t,{children:["Attach Agent to ",(n==null?void 0:n.name)??"Source"]}),f.jsx(dn,{children:"The datasource will then become available to the agent to use for information."})]}),n?f.jsx(_ke,{source:n,closeDialog:()=>t(!1)}):f.jsx("p",{children:"No source and agent..."})]})}),Tke=Xe({name:Ce().min(1,{message:"Name must be at least 1 character."}).max(30,{message:"Name must not be longer than 30 characters."}),description:Ce().max(2e3).min(0)}),Rke={name:"",description:""};function Nke({closeDialog:e}){const t=cX(),n=Bt(),{toast:r}=An(),a=bn({resolver:yn(Tke),defaultValues:Rke,mode:"onChange"}),o=i=>{t.mutate({requestBody:{name:i.name,description:i.description}},{onSuccess:()=>{n.invalidateQueries({queryKey:sf()}),e(),r({title:"Source created successfully!",duration:5e3})},onError:s=>{r({title:"Error creating source",duration:5e3})}})};return f.jsx(vn,{...a,children:f.jsxs("form",{onSubmit:a.handleSubmit(o,i=>console.log(i)),className:"space-y-8",children:[f.jsx(ut,{control:a.control,name:"name",render:({field:i})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Name"}),f.jsx(pt,{children:f.jsx(_n,{...i})}),f.jsx(Mt,{children:"This is your sources display name. It can be a real name or a pseudonym."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:a.control,name:"description",render:({field:i})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Description"}),f.jsx(pt,{children:f.jsx(qs,{placeholder:"Describe your source here",className:"resize-none",...i})}),f.jsx(lt,{})]})}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Create Source"}),t.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Creating Source..."})]})]})]})})}const Ike=({open:e,onOpenChange:t})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Create Data Source"}),f.jsx(dn,{children:"Add a new data source here. Click create when you're done."})]}),f.jsx(Nke,{closeDialog:()=>t(!1)})]})}),Oke=({value:e,onValueChange:t})=>f.jsx("form",{children:f.jsxs("div",{className:"relative",children:[f.jsx(Ms,{className:"pointer-events-none absolute left-[12px] top-3 h-4 w-4 text-muted-foreground"}),f.jsx(_n,{placeholder:"Search data source",value:e,onChange:n=>t(n.target.value),className:"w-52 pl-8 lg:w-80"})]})}),Dke=(e,t,n,r,a)=>[{accessorKey:"actions",header:"",cell:({row:o})=>f.jsx(Dn,{isLoading:a,children:f.jsxs("span",{className:"flex space-x-2",children:[f.jsx(ue,{onClick:()=>e(o.original),className:"!h-6 !w-6 !p-1",variant:"ghost",children:f.jsx(eF,{className:"h-3.5 w-3.5"})}),f.jsx(ue,{onClick:()=>t(o.original),className:"!h-6 !w-6 !p-1",variant:"ghost",children:f.jsx(Fm,{className:"h-3.5 w-3.5"})})]})})},{accessorKey:"name",header:"Name",cell:({row:o})=>f.jsx(Dn,{isLoading:a,children:o.getValue("name")})},{accessorFn:o=>{var i;return(i=o.embedding_config)==null?void 0:i.embedding_model},accessorKey:"embedding_model",header:"Embedding Model",cell:({row:o})=>f.jsx(Dn,{isLoading:a,children:o.getValue("embedding_model")})},{accessorFn:o=>{var i;return((i=o.embedding_config)==null?void 0:i.embedding_dim)??0},accessorKey:"embedding_dim",header:"Embedding Dimensions",cell:({row:o})=>f.jsx(Dn,{isLoading:a,children:o.getValue("embedding_dim")})},{accessorFn:o=>{var i;return((i=o.metadata_)==null?void 0:i.num_documents)??0},accessorKey:"num_documents",header:"Documents",cell:({row:o})=>f.jsx(Dn,{isLoading:a,children:o.getValue("num_documents")})},{accessorFn:o=>{var i;return((i=o.metadata_)==null?void 0:i.num_passages)??0},accessorKey:"num_passages",header:"Passages",cell:({row:o})=>f.jsx(Dn,{isLoading:a,children:o.getValue("num_passages")})},{accessorKey:"created_at",header:"Created At",cell:({row:o})=>f.jsx(Dn,{isLoading:a,children:Mre(o,"created_at","Unknown")})},{accessorFn:o=>{var i;return(i=o.metadata_)==null?void 0:i.attached_agents},accessorKey:"attached_agents",header:"Attached To",cell:({row:o})=>{const i=o.getValue("attached_agents")??[];return f.jsx(Dn,{isLoading:a,children:f.jsxs("div",{className:"flex flex-wrap items-baseline",children:[f.jsxs(ue,{onClick:()=>n(o.original),variant:"ghost",className:"mr-1 h-5 !p-1 text-xs",size:"sm",children:[f.jsx("span",{className:"sr-only",children:"attach another agent"}),f.jsx(Dq,{className:"h-3 w-3"})]}),i.map(s=>f.jsxs(ue,{onClick:()=>r(o.original,s),variant:"ghost",className:"mr-1 h-5 !p-1 text-xs",size:"sm",children:[s.name,f.jsx(Iq,{className:"ml-2 h-3 w-3"})]},s.id)),i.length===0&&f.jsx("span",{className:"text-xs",children:"- None"})]})})}}],Lke=({nameFilter:e,className:t,onSourceUpload:n,onSourceEdit:r,onAttachAgent:a,onDetachAgent:o})=>{const{data:i,isError:s,isLoading:l}=b_(),c=(i??[]).filter(u=>u.name.includes(e));return f.jsx("div",{className:t,children:f.jsx(uf,{columns:Dke(n,r,a,o,l),isLoading:l,error:s?"Failed to load sources":void 0,data:c,renderPagination:u=>f.jsx(df,{className:"mt-4",table:u})})})},Mke=({open:e,onOpenChange:t,source:n,agent:r})=>{const a=Bt(),o=k6(),{toast:i}=An(),s=()=>{!n||!r||o.mutate({agentId:r.id,sourceId:n.id||""},{onSuccess:()=>{t(!1),a.invalidateQueries({queryKey:sf()}),i({title:"Agent detached successfully!",duration:3e3})},onError:l=>i({title:"Failed to detach agent!",duration:3e3})})};return f.jsx(Kt,{open:n&&r&&e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsx(Pt,{children:f.jsxs($t,{children:["Detach Agent from ",(n==null?void 0:n.name)??"Source"]})}),f.jsx("p",{className:"pb-10",children:"The data source will then no longer be available to the agent to use for information."}),f.jsxs("div",{className:"flex space-x-2",children:[f.jsx(ue,{variant:"ghost",onClick:()=>t(!1),children:"Cancel"}),f.jsxs(ue,{onClick:s,children:[o.isPending?"Detaching":"Detach"," Agent"]})]})]})})},Pke=Xe({name:Ce().min(1,{message:"Name must be at least 1 character."}).max(30,{message:"Name must not be longer than 30 characters."}),description:Ce().max(2e3).min(0)});function $ke({source:e,closeDialog:t}){const n=pX(),r=Bt(),{toast:a}=An(),o={name:e.name,description:e.description??""},i=bn({resolver:yn(Pke),defaultValues:o,mode:"onChange"}),s=l=>{n.mutate({sourceId:e.id||"",requestBody:{id:e.id||"",name:l.name||"",description:l.description}},{onSuccess:()=>{r.invalidateQueries({queryKey:sf()}),t(),a({title:"Source editd successfully!",duration:5e3})},onError:c=>{a({title:"Error creating source",duration:5e3})}})};return f.jsx(vn,{...i,children:f.jsxs("form",{onSubmit:i.handleSubmit(s,l=>console.log(l)),className:"space-y-8",children:[f.jsx(ut,{control:i.control,name:"name",render:({field:l})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Name"}),f.jsx(pt,{children:f.jsx(_n,{...l})}),f.jsx(Mt,{children:"This is your sources display name. It can be a real name or a pseudonym."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:i.control,name:"description",render:({field:l})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Description"}),f.jsx(pt,{children:f.jsx(qs,{placeholder:"Describe your source here",className:"resize-none",...l})}),f.jsx(lt,{})]})}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Edit Source"}),n.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Edit Source..."})]})]})]})})}const Fke=({open:e,onOpenChange:t,source:n})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Edit Data Source"}),f.jsx(dn,{children:"Edit an existing data source here."})]}),n?f.jsx($ke,{source:n,closeDialog:()=>t(!1)}):f.jsx("p",{children:"No source..."})]})}),jke=Xe({file:Tie(e=>e instanceof File)}),zke=e=>{const t=C6(),{toast:n}=An(),r=Bt(),a=bn({resolver:yn(jke),mode:"onChange"}),o=i=>{t.mutate({sourceId:e.source.id||"",formData:{file:i.file}},{onSuccess:()=>{r.invalidateQueries({queryKey:BZ()}),e.onComplete()},onError:s=>n({title:"Failed to upload file...",duration:5e3})})};return f.jsx(vn,{...a,children:f.jsxs("form",{onSubmit:a.handleSubmit(o),className:"space-y-8",children:[f.jsx(ut,{control:a.control,name:"file",render:({field:i})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"File"}),f.jsx(pt,{children:f.jsx(_n,{type:"file",ref:i.ref,disabled:i.disabled,name:i.name,onBlur:i.onBlur,onChange:s=>{var l,c;i.onChange((c=(l=s.target)==null?void 0:l.files)==null?void 0:c[0])}})}),f.jsx(Mt,{children:"File to upload."}),f.jsx(lt,{})]})}),f.jsxs("div",{className:"flex space-x-4",children:[f.jsx(ue,{children:"Upload File"}),t.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Creating Job to ingest file..."})]}),t.isSuccess&&f.jsxs("div",{className:Tt("ml-4 flex items-center text-emerald-600 animate-in slide-in-from-bottom-2"),children:[f.jsx(Mm,{className:"mr-2 h-4 w-4 "}),f.jsx("span",{children:"Job created! File ingestion started!"})]})]})]})})},Uke=Xe({sourceId:Ce(),file:Rie()}),Bke=({onComplete:e})=>{const t=b_(),n=C6(),{toast:r}=An(),a=bn({resolver:yn(Uke),defaultValues:{sourceId:"",file:void 0},mode:"onChange"}),o=Bt(),i=s=>{n.mutate({sourceId:s.sourceId,formData:{file:s.file}},{onSuccess:()=>{o.invalidateQueries({queryKey:b6()}),e()},onError:l=>r({title:"Failed to upload file...",duration:5e3})})};return f.jsx(vn,{...a,children:f.jsxs("form",{onSubmit:a.handleSubmit(i),className:"space-y-8",children:[f.jsx(ut,{control:a.control,name:"sourceId",render:({field:s})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Upload to"}),f.jsx(pt,{children:f.jsxs(So,{value:s.value,name:s.name,onValueChange:s.onChange,disabled:t.isLoading,children:[f.jsx(za,{className:"w-full",children:f.jsx(wo,{placeholder:"Select a source"})}),f.jsx(Ua,{children:(t.data??[]).map(l=>f.jsx(Fn,{value:l.id||"",children:l.name},l.id))})]})}),f.jsx(Mt,{children:"Upload your data to this source."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:a.control,name:"file",render:({field:s})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"File"}),f.jsx(pt,{children:f.jsx(_n,{type:"file",ref:s.ref,disabled:s.disabled,name:s.name,onBlur:s.onBlur,onChange:l=>{var c,u;s.onChange((u=(c=l.target)==null?void 0:c.files)==null?void 0:u[0])}})}),f.jsx(Mt,{children:"File to upload."}),f.jsx(lt,{})]})}),f.jsxs("div",{className:"flex space-x-4",children:[f.jsx(ue,{children:"Upload File"}),n.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Creating Job to ingest file..."})]}),n.isSuccess&&f.jsxs("div",{className:Tt("ml-4 flex items-center text-emerald-600 animate-in slide-in-from-bottom-2"),children:[f.jsx(Mm,{className:"mr-2 h-4 w-4 "}),f.jsx("span",{children:"Job created! File ingestion started!"})]})]})]})})},Hke=({source:e,open:t,onOpenChange:n})=>f.jsx(Kt,{open:t,onOpenChange:n,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsx(Pt,{children:f.jsxs($t,{children:["Upload Data ",e&&`to ${e.name}`]})}),e?f.jsx(zke,{onComplete:()=>n(!1),source:e}):f.jsx(Bke,{onComplete:()=>n(!1)})]})}),eU="Progress",Dh=100,[Vke,mTe]=zn(eU),[qke,Gke]=Vke(eU),tU=p.forwardRef((e,t)=>{const{__scopeProgress:n,value:r,max:a,getValueLabel:o=Yke,...i}=e,s=Vk(a)?a:Dh,l=rU(r,s)?r:null,c=lm(l)?o(l,s):void 0;return p.createElement(qke,{scope:n,value:l,max:s},p.createElement(ze.div,W({"aria-valuemax":s,"aria-valuemin":0,"aria-valuenow":lm(l)?l:void 0,"aria-valuetext":c,role:"progressbar","data-state":nU(l,s),"data-value":l??void 0,"data-max":s},i,{ref:t})))});tU.propTypes={max(e,t,n){const r=e[t],a=String(r);return r&&!Vk(r)?new Error(Zke(a,n)):null},value(e,t,n){const r=e[t],a=String(r),o=Vk(e.max)?e.max:Dh;return r!=null&&!rU(r,o)?new Error(Xke(a,n)):null}};const Wke="ProgressIndicator",Kke=p.forwardRef((e,t)=>{var n;const{__scopeProgress:r,...a}=e,o=Gke(Wke,r);return p.createElement(ze.div,W({"data-state":nU(o.value,o.max),"data-value":(n=o.value)!==null&&n!==void 0?n:void 0,"data-max":o.max},a,{ref:t}))});function Yke(e,t){return`${Math.round(e/t*100)}%`}function nU(e,t){return e==null?"indeterminate":e===t?"complete":"loading"}function lm(e){return typeof e=="number"}function Vk(e){return lm(e)&&!isNaN(e)&&e>0}function rU(e,t){return lm(e)&&!isNaN(e)&&e<=t&&e>=0}function Zke(e,t){return`Invalid prop \`max\` of value \`${e}\` supplied to \`${t}\`. Only numbers greater than 0 are valid max values. Defaulting to \`${Dh}\`.`}function Xke(e,t){return`Invalid prop \`value\` of value \`${e}\` supplied to \`${t}\`. The \`value\` prop must be: - a positive number - - less than the value passed to \`max\` (or ${Oh} if no \`max\` prop is set) + - less than the value passed to \`max\` (or ${Dh} if no \`max\` prop is set) - \`null\` if the progress is indeterminate. -Defaulting to \`null\`.`}const rU=eU,Qke=Kke,aU=p.forwardRef(({className:e,value:t,indeterminate:n=!1,...r},a)=>f.jsx(rU,{ref:a,className:ee("relative h-4 w-full overflow-hidden rounded-full bg-secondary",e),...r,children:f.jsx(Qke,{className:ee("h-full w-full flex-1 bg-primary transition-all",n&&"animate-progress origin-left"),style:{transform:`translateX(-${100-(t||0)}%)`}})}));aU.displayName=rU.displayName;function Jke({job:e}){var n;const t=p.useMemo(()=>{var a;const r=(a=e==null?void 0:e.metadata_)==null?void 0:a.filename;return typeof r=="string"?r:"Unknown"},[(n=e==null?void 0:e.metadata_)==null?void 0:n.filename]);return f.jsx("div",{className:"border rounded-sm p-3 gap-3 flex flex-col",children:f.jsxs("div",{className:"text-sm whitespace-nowrap gap-4 text-muted-foreground items-center flex flex-row justify-between",children:[f.jsxs("div",{children:["Uploading ",t]}),f.jsx(aU,{className:"h-2",indeterminate:!0}),f.jsx("div",{children:"Indeterminate time to upload"})]})})}function eCe(){const{data:e}=sX({userId:""},void 0,{refetchInterval:2e3}),t=p.useMemo(()=>e||[],[e]);return f.jsx("div",{className:"mx-4 my-4 rounded flex flex-col gap-2",children:f.jsx("div",{className:"flex flex-col gap-3",children:t.map(n=>f.jsx(Jke,{job:n},n.id))})})}const tCe=()=>{const[e,t]=p.useState(!1),[n,r]=p.useState(!1),[a,o]=p.useState(),[i,s]=p.useState(!1),[l,c]=p.useState(),[u,d]=p.useState(!1),[g,m]=p.useState(),[b,y]=p.useState(!1),[w,v]=p.useState(),[h,S]=p.useState(""),[E]=Ih(h,300),k=T=>{c(T),s(!0)},x=T=>{o(T),r(!0)},C=T=>{s(T),T||setTimeout(()=>c(void 0),300)},_=T=>{v(T),d(!0)},R=(T,L)=>{m({source:T,agent:L}),y(!0)};return f.jsxs(Fs,{children:[f.jsxs("div",{className:"flex items-center justify-between bg-background/95 px-4 pb-3 pt-2.5 backdrop-blur supports-[backdrop-filter]:bg-background/60",children:[f.jsx(Oke,{value:h,onValueChange:S}),f.jsxs("div",{className:"flex items-center space-x-2",children:[f.jsxs(ue,{onClick:()=>s(!0),size:"sm",children:[f.jsx(J4,{className:"mr-2 h-4 w-4"}),"Upload Data"]}),f.jsxs(ue,{onClick:()=>t(!0),size:"sm",children:[f.jsx(ya,{className:"mr-2 h-4 w-4"}),"Create Data Source"]})]})]}),f.jsx(eCe,{}),f.jsx(Lke,{onSourceUpload:k,onSourceEdit:x,onAttachAgent:_,onDetachAgent:R,className:"mx-4",nameFilter:E}),f.jsx(Ike,{open:e,onOpenChange:t}),f.jsx(Fke,{source:a,open:n,onOpenChange:r}),f.jsx(Hke,{source:l,open:i,onOpenChange:C}),f.jsx(Ake,{source:w,open:u,onOpenChange:d}),f.jsx(Mke,{source:g==null?void 0:g.source,agent:g==null?void 0:g.agent,open:b,onOpenChange:y})]})},nCe={path:"data-sources",element:f.jsx(tCe,{})},rCe=Xe({name:Ce().min(1,{message:"Name must be at least 1 character."}).max(30,{message:"Name must not be longer than 30 characters."}),text:Ce().max(2e3).min(0)}),aCe={name:"",text:""};function oCe({closeDialog:e}){const t=C6(),{toast:n}=An(),r=rCe.extend({text:Ce().max(2e3).min(0)}),a=Bt(),o=bn({resolver:yn(r),defaultValues:aCe,mode:"onChange"}),i=s=>{t.mutate({requestBody:{label:Qr,name:s.name,value:s.text}},{onSuccess:()=>{a.invalidateQueries({queryKey:lf({label:Qr})}),e(),n({title:"Persona created successfully!",duration:5e3})},onError:l=>{n({title:"Error creating persona",duration:5e3})}})};return f.jsx(vn,{...o,children:f.jsxs("form",{onSubmit:o.handleSubmit(i,s=>console.log(s)),className:"space-y-8",children:[f.jsx(ut,{control:o.control,name:"name",render:({field:s})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Name"}),f.jsx(pt,{children:f.jsx(_n,{...s})}),f.jsx(Mt,{children:"This is your personas display name. It can be a real name or a pseudonym."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:o.control,name:"text",render:({field:s})=>{var l;return f.jsxs(ot,{children:[f.jsx(pt,{children:f.jsx(Ai,{placeholder:"Describe your persona here",charCount:(l=s.value)==null?void 0:l.length,limit:2e3,...s})}),f.jsxs(Mt,{children:["You can use no more than ",2e3," characters."]}),f.jsx(lt,{})]})}}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Create Persona"}),t.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Creating Persona..."})]})]})]})})}const iCe=({open:e,onOpenChange:t})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Create Persona"}),f.jsx(dn,{children:"Add a new persona here. Click create when you're done."})]}),f.jsx(oCe,{closeDialog:()=>t(!1)})]})}),sCe=Xe({text:Ce().max(2e3).min(0)});function lCe({persona:e,closeDialog:t}){const n=y_(),r=Bt(),{toast:a}=An(),o=sCe.extend({text:Ce().max(2e3).min(0)}),i={text:e.value||""},s=bn({resolver:yn(o),defaultValues:i,mode:"onChange"}),l=c=>{n.mutate({blockId:e.id||"",requestBody:{id:e.id||"",value:c.text||""}},{onSuccess:()=>{r.invalidateQueries({queryKey:lf({label:Qr})}),t(),a({title:"Persona updated successfully!",duration:5e3})},onError:u=>{a({title:"Error updating persona",duration:5e3})}})};return f.jsx(vn,{...s,children:f.jsxs("form",{onSubmit:s.handleSubmit(l,c=>console.log(c)),className:"space-y-8",children:[f.jsx(ut,{control:s.control,name:"text",render:({field:c})=>{var u;return f.jsxs(ot,{children:[f.jsx(pt,{children:f.jsx(Ai,{placeholder:"Describe your persona here",charCount:(u=c.value)==null?void 0:u.length,limit:2e3,...c})}),f.jsxs(Mt,{children:["You can use no more than ",2e3," characters."]}),f.jsx(lt,{})]})}}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Update Persona"}),n.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Updating Persona..."})]})]})]})})}const cCe=({persona:e,open:t,onOpenChange:n})=>f.jsx(Kt,{open:t,onOpenChange:n,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsxs($t,{children:["Edit ",(e==null?void 0:e.name)??"Persona"]}),f.jsx(dn,{children:"Edit existing agent template here. Click create when you're done."})]}),e?f.jsx(lCe,{persona:e,closeDialog:()=>n(!1)}):f.jsx("p",{children:"No Persona...."})]})}),uCe=({value:e,onValueChange:t})=>f.jsx("form",{children:f.jsxs("div",{className:"relative",children:[f.jsx(Ms,{className:"pointer-events-none absolute left-[12px] top-3 h-4 w-4 text-muted-foreground"}),f.jsx(_n,{placeholder:"Search persona",value:e,onChange:n=>t(n.target.value),className:"w-52 pl-8 lg:w-80"})]})});let kx;const oU="HoverCard",[iU,mTe]=zn(oU,[qa]),KA=qa(),[dCe,YA]=iU(oU),fCe=e=>{const{__scopeHoverCard:t,children:n,open:r,defaultOpen:a,onOpenChange:o,openDelay:i=700,closeDelay:s=300}=e,l=KA(t),c=p.useRef(0),u=p.useRef(0),d=p.useRef(!1),g=p.useRef(!1),[m=!1,b]=Fa({prop:r,defaultProp:a,onChange:o}),y=p.useCallback(()=>{clearTimeout(u.current),c.current=window.setTimeout(()=>b(!0),i)},[i,b]),w=p.useCallback(()=>{clearTimeout(c.current),!d.current&&!g.current&&(u.current=window.setTimeout(()=>b(!1),s))},[s,b]),v=p.useCallback(()=>b(!1),[b]);return p.useEffect(()=>()=>{clearTimeout(c.current),clearTimeout(u.current)},[]),p.createElement(dCe,{scope:t,open:m,onOpenChange:b,onOpen:y,onClose:w,onDismiss:v,hasSelectionRef:d,isPointerDownOnContentRef:g},p.createElement(rh,l,n))},pCe="HoverCardTrigger",gCe=p.forwardRef((e,t)=>{const{__scopeHoverCard:n,...r}=e,a=YA(pCe,n),o=KA(n);return p.createElement(pf,W({asChild:!0},o),p.createElement(ze.a,W({"data-state":a.open?"open":"closed"},r,{ref:t,onPointerEnter:fe(e.onPointerEnter,cm(a.onOpen)),onPointerLeave:fe(e.onPointerLeave,cm(a.onClose)),onFocus:fe(e.onFocus,a.onOpen),onBlur:fe(e.onBlur,a.onClose),onTouchStart:fe(e.onTouchStart,i=>i.preventDefault())})))}),mCe="HoverCardPortal",[hTe,hCe]=iU(mCe,{forceMount:void 0}),Vk="HoverCardContent",bCe=p.forwardRef((e,t)=>{const n=hCe(Vk,e.__scopeHoverCard),{forceMount:r=n.forceMount,...a}=e,o=YA(Vk,e.__scopeHoverCard);return p.createElement(pr,{present:r||o.open},p.createElement(yCe,W({"data-state":o.open?"open":"closed"},a,{onPointerEnter:fe(e.onPointerEnter,cm(o.onOpen)),onPointerLeave:fe(e.onPointerLeave,cm(o.onClose)),ref:t})))}),yCe=p.forwardRef((e,t)=>{const{__scopeHoverCard:n,onEscapeKeyDown:r,onPointerDownOutside:a,onFocusOutside:o,onInteractOutside:i,...s}=e,l=YA(Vk,n),c=KA(n),u=p.useRef(null),d=nt(t,u),[g,m]=p.useState(!1);return p.useEffect(()=>{if(g){const b=document.body;return kx=b.style.userSelect||b.style.webkitUserSelect,b.style.userSelect="none",b.style.webkitUserSelect="none",()=>{b.style.userSelect=kx,b.style.webkitUserSelect=kx}}},[g]),p.useEffect(()=>{if(u.current){const b=()=>{m(!1),l.isPointerDownOnContentRef.current=!1,setTimeout(()=>{var y;((y=document.getSelection())===null||y===void 0?void 0:y.toString())!==""&&(l.hasSelectionRef.current=!0)})};return document.addEventListener("pointerup",b),()=>{document.removeEventListener("pointerup",b),l.hasSelectionRef.current=!1,l.isPointerDownOnContentRef.current=!1}}},[l.isPointerDownOnContentRef,l.hasSelectionRef]),p.useEffect(()=>{u.current&&vCe(u.current).forEach(y=>y.setAttribute("tabindex","-1"))}),p.createElement(Ls,{asChild:!0,disableOutsidePointerEvents:!1,onInteractOutside:i,onEscapeKeyDown:r,onPointerDownOutside:a,onFocusOutside:fe(o,b=>{b.preventDefault()}),onDismiss:l.onDismiss},p.createElement(gf,W({},c,s,{onPointerDown:fe(s.onPointerDown,b=>{b.currentTarget.contains(b.target)&&m(!0),l.hasSelectionRef.current=!1,l.isPointerDownOnContentRef.current=!0}),ref:d,style:{...s.style,userSelect:g?"text":void 0,WebkitUserSelect:g?"text":void 0,"--radix-hover-card-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-hover-card-content-available-width":"var(--radix-popper-available-width)","--radix-hover-card-content-available-height":"var(--radix-popper-available-height)","--radix-hover-card-trigger-width":"var(--radix-popper-anchor-width)","--radix-hover-card-trigger-height":"var(--radix-popper-anchor-height)"}})))});function cm(e){return t=>t.pointerType==="touch"?void 0:e()}function vCe(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP});for(;n.nextNode();)t.push(n.currentNode);return t}const SCe=fCe,wCe=gCe,sU=bCe,ECe=SCe,xCe=wCe,lU=p.forwardRef(({className:e,align:t="center",sideOffset:n=4,...r},a)=>f.jsx(sU,{ref:a,align:t,sideOffset:n,className:ee("z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...r}));lU.displayName=sU.displayName;const ZA=({text:e})=>f.jsxs(ECe,{children:[f.jsx(xCe,{asChild:!0,children:f.jsx(ue,{size:"sm",variant:"ghost",className:"-mx-4 w-96 text-left font-normal",children:f.jsx("span",{className:"h-6 w-full truncate text-left",children:f.jsx("span",{className:"whitespace-pre",children:e})})})}),f.jsx(lU,{className:"w-[300px] p-4 sm:w-[500px]",children:f.jsx("div",{className:"max-h-[400px] overflow-y-auto",children:f.jsx("p",{className:"whitespace-pre-wrap",children:e})})})]}),kCe=(e,t)=>[{accessorKey:"edit",header:"",size:20,cell:({row:n})=>t?f.jsx(Pi,{className:"h-6 w-6"}):f.jsx(ue,{onClick:()=>e(n.original),className:"!h-6 !w-6 !p-1",variant:"ghost",children:f.jsx(Fm,{className:"h-3.5 w-3.5"})})},{accessorKey:"name",header:"Name",cell:({row:n})=>f.jsx(Dn,{isLoading:t,children:n.getValue("name")})},{accessorKey:"value",header:"Value",cell:({row:n})=>f.jsx(Dn,{isLoading:t,children:f.jsx(ZA,{text:n.getValue("value")})})}],CCe=({onPersonaEdit:e,nameFilter:t,className:n})=>{const{data:r,isLoading:a,isError:o}=Ng({label:Qr}),i=p.useMemo(()=>(r??[]).filter(s=>{var l;return(l=s.name)==null?void 0:l.includes(t)}),[r,t]);return f.jsx("div",{className:n,children:f.jsx(uf,{columns:kCe(e,a),isLoading:a,error:o?"Error loading agent templates":void 0,data:i,renderPagination:s=>f.jsx(df,{className:"mt-4",table:s})})})},_Ce=()=>{const[e,t]=p.useState(""),[n]=Ih(e,300),r=Li(),[a,o]=p.useState(r.search.includes("openCreatePersona")??!1),[i,s]=p.useState(null),[l,c]=p.useState(!1),u=d=>{s(d),c(!0)};return f.jsxs(Fs,{children:[f.jsxs("div",{className:"flex items-center justify-between bg-background/95 px-4 pb-3 pt-2.5 backdrop-blur supports-[backdrop-filter]:bg-background/60",children:[f.jsx(uCe,{value:e,onValueChange:t}),f.jsxs(ue,{onClick:()=>o(!0),size:"sm",children:[f.jsx(ya,{className:"mr-2 h-4 w-4"}),"Create Persona"]})]}),f.jsx(CCe,{onPersonaEdit:u,nameFilter:n,className:"mx-4"}),f.jsx(iCe,{open:a,onOpenChange:d=>o(d)}),f.jsx(cCe,{persona:i,open:l,onOpenChange:d=>c(d)})]})},ACe={path:"agent-templates",element:f.jsx(_Ce,{})},cU="Radio",[TCe,uU]=zn(cU),[RCe,NCe]=TCe(cU),ICe=p.forwardRef((e,t)=>{const{__scopeRadio:n,name:r,checked:a=!1,required:o,disabled:i,value:s="on",onCheck:l,...c}=e,[u,d]=p.useState(null),g=nt(t,y=>d(y)),m=p.useRef(!1),b=u?!!u.closest("form"):!0;return p.createElement(RCe,{scope:n,checked:a,disabled:i},p.createElement(ze.button,W({type:"button",role:"radio","aria-checked":a,"data-state":dU(a),"data-disabled":i?"":void 0,disabled:i,value:s},c,{ref:g,onClick:fe(e.onClick,y=>{a||l==null||l(),b&&(m.current=y.isPropagationStopped(),m.current||y.stopPropagation())})})),b&&p.createElement(LCe,{control:u,bubbles:!m.current,name:r,value:s,checked:a,required:o,disabled:i,style:{transform:"translateX(-100%)"}}))}),OCe="RadioIndicator",DCe=p.forwardRef((e,t)=>{const{__scopeRadio:n,forceMount:r,...a}=e,o=NCe(OCe,n);return p.createElement(pr,{present:r||o.checked},p.createElement(ze.span,W({"data-state":dU(o.checked),"data-disabled":o.disabled?"":void 0},a,{ref:t})))}),LCe=e=>{const{control:t,checked:n,bubbles:r=!0,...a}=e,o=p.useRef(null),i=F_(n),s=N_(t);return p.useEffect(()=>{const l=o.current,c=window.HTMLInputElement.prototype,d=Object.getOwnPropertyDescriptor(c,"checked").set;if(i!==n&&d){const g=new Event("click",{bubbles:r});d.call(l,n),l.dispatchEvent(g)}},[i,n,r]),p.createElement("input",W({type:"radio","aria-hidden":!0,defaultChecked:n},a,{tabIndex:-1,ref:o,style:{...e.style,...s,position:"absolute",pointerEvents:"none",opacity:0,margin:0}}))};function dU(e){return e?"checked":"unchecked"}const MCe=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"],fU="RadioGroup",[PCe,bTe]=zn(fU,[ah,uU]),pU=ah(),gU=uU(),[$Ce,FCe]=PCe(fU),jCe=p.forwardRef((e,t)=>{const{__scopeRadioGroup:n,name:r,defaultValue:a,value:o,required:i=!1,disabled:s=!1,orientation:l,dir:c,loop:u=!0,onValueChange:d,...g}=e,m=pU(n),b=x_(c),[y,w]=Fa({prop:o,defaultProp:a,onChange:d});return p.createElement($Ce,{scope:n,name:r,required:i,disabled:s,value:y,onValueChange:w},p.createElement(a7,W({asChild:!0},m,{orientation:l,dir:b,loop:u}),p.createElement(ze.div,W({role:"radiogroup","aria-required":i,"aria-orientation":l,"data-disabled":s?"":void 0,dir:b},g,{ref:t}))))}),zCe="RadioGroupItem",UCe=p.forwardRef((e,t)=>{const{__scopeRadioGroup:n,disabled:r,...a}=e,o=FCe(zCe,n),i=o.disabled||r,s=pU(n),l=gU(n),c=p.useRef(null),u=nt(t,c),d=o.value===a.value,g=p.useRef(!1);return p.useEffect(()=>{const m=y=>{MCe.includes(y.key)&&(g.current=!0)},b=()=>g.current=!1;return document.addEventListener("keydown",m),document.addEventListener("keyup",b),()=>{document.removeEventListener("keydown",m),document.removeEventListener("keyup",b)}},[]),p.createElement(o7,W({asChild:!0},s,{focusable:!i,active:d}),p.createElement(ICe,W({disabled:i,required:o.required,checked:d},l,a,{name:o.name,ref:u,onCheck:()=>o.onValueChange(a.value),onKeyDown:fe(m=>{m.key==="Enter"&&m.preventDefault()}),onFocus:fe(a.onFocus,()=>{var m;g.current&&((m=c.current)===null||m===void 0||m.click())})})))}),BCe=p.forwardRef((e,t)=>{const{__scopeRadioGroup:n,...r}=e,a=gU(n);return p.createElement(DCe,W({},a,r,{ref:t}))}),mU=jCe,hU=UCe,HCe=BCe,bU=p.forwardRef(({className:e,...t},n)=>f.jsx(mU,{className:ee("grid gap-2",e),...t,ref:n}));bU.displayName=mU.displayName;const yU=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(hU,{ref:r,className:ee("aspect-square h-4 w-4 rounded-full border border-primary text-primary ring-offset-background focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),...n,children:f.jsx(HCe,{className:"flex items-center justify-center",children:f.jsx(X4,{className:"h-2.5 w-2.5 fill-current text-current"})})}));yU.displayName=hU.displayName;const qk="horizontal",VCe=["horizontal","vertical"],vU=p.forwardRef((e,t)=>{const{decorative:n,orientation:r=qk,...a}=e,o=SU(r)?r:qk,s=n?{role:"none"}:{"aria-orientation":o==="vertical"?o:void 0,role:"separator"};return p.createElement(ze.div,W({"data-orientation":o},s,a,{ref:t}))});vU.propTypes={orientation(e,t,n){const r=e[t],a=String(r);return r&&!SU(r)?new Error(qCe(a,n)):null}};function qCe(e,t){return`Invalid prop \`orientation\` of value \`${e}\` supplied to \`${t}\`, expected one of: +Defaulting to \`null\`.`}const aU=tU,Qke=Kke,oU=p.forwardRef(({className:e,value:t,indeterminate:n=!1,...r},a)=>f.jsx(aU,{ref:a,className:ee("relative h-4 w-full overflow-hidden rounded-full bg-secondary",e),...r,children:f.jsx(Qke,{className:ee("h-full w-full flex-1 bg-primary transition-all",n&&"animate-progress origin-left"),style:{transform:`translateX(-${100-(t||0)}%)`}})}));oU.displayName=aU.displayName;function Jke({job:e}){var n;const t=p.useMemo(()=>{var a;const r=(a=e==null?void 0:e.metadata_)==null?void 0:a.filename;return typeof r=="string"?r:"Unknown"},[(n=e==null?void 0:e.metadata_)==null?void 0:n.filename]);return f.jsx("div",{className:"border rounded-sm p-3 gap-3 flex flex-col",children:f.jsxs("div",{className:"text-sm whitespace-nowrap gap-4 text-muted-foreground items-center flex flex-row justify-between",children:[f.jsxs("div",{children:["Uploading ",t]}),f.jsx(oU,{className:"h-2",indeterminate:!0}),f.jsx("div",{children:"Indeterminate time to upload"})]})})}function eCe(){const{data:e}=sX({userId:""},void 0,{refetchInterval:2e3}),t=p.useMemo(()=>e||[],[e]);return f.jsx("div",{className:"mx-4 my-4 rounded flex flex-col gap-2",children:f.jsx("div",{className:"flex flex-col gap-3",children:t.map(n=>f.jsx(Jke,{job:n},n.id))})})}const tCe=()=>{const[e,t]=p.useState(!1),[n,r]=p.useState(!1),[a,o]=p.useState(),[i,s]=p.useState(!1),[l,c]=p.useState(),[u,d]=p.useState(!1),[g,m]=p.useState(),[b,y]=p.useState(!1),[w,v]=p.useState(),[h,S]=p.useState(""),[E]=Oh(h,300),k=T=>{c(T),s(!0)},x=T=>{o(T),r(!0)},C=T=>{s(T),T||setTimeout(()=>c(void 0),300)},_=T=>{v(T),d(!0)},R=(T,L)=>{m({source:T,agent:L}),y(!0)};return f.jsxs(Fs,{children:[f.jsxs("div",{className:"flex items-center justify-between bg-background/95 px-4 pb-3 pt-2.5 backdrop-blur supports-[backdrop-filter]:bg-background/60",children:[f.jsx(Oke,{value:h,onValueChange:S}),f.jsxs("div",{className:"flex items-center space-x-2",children:[f.jsxs(ue,{onClick:()=>s(!0),size:"sm",children:[f.jsx(eF,{className:"mr-2 h-4 w-4"}),"Upload Data"]}),f.jsxs(ue,{onClick:()=>t(!0),size:"sm",children:[f.jsx(ya,{className:"mr-2 h-4 w-4"}),"Create Data Source"]})]})]}),f.jsx(eCe,{}),f.jsx(Lke,{onSourceUpload:k,onSourceEdit:x,onAttachAgent:_,onDetachAgent:R,className:"mx-4",nameFilter:E}),f.jsx(Ike,{open:e,onOpenChange:t}),f.jsx(Fke,{source:a,open:n,onOpenChange:r}),f.jsx(Hke,{source:l,open:i,onOpenChange:C}),f.jsx(Ake,{source:w,open:u,onOpenChange:d}),f.jsx(Mke,{source:g==null?void 0:g.source,agent:g==null?void 0:g.agent,open:b,onOpenChange:y})]})},nCe={path:"data-sources",element:f.jsx(tCe,{})},rCe=Xe({name:Ce().min(1,{message:"Name must be at least 1 character."}).max(30,{message:"Name must not be longer than 30 characters."}),text:Ce().max(2e3).min(0)}),aCe={name:"",text:""};function oCe({closeDialog:e}){const t=_6(),{toast:n}=An(),r=rCe.extend({text:Ce().max(2e3).min(0)}),a=Bt(),o=bn({resolver:yn(r),defaultValues:aCe,mode:"onChange"}),i=s=>{t.mutate({requestBody:{label:Qr,name:s.name,value:s.text}},{onSuccess:()=>{a.invalidateQueries({queryKey:lf({label:Qr})}),e(),n({title:"Persona created successfully!",duration:5e3})},onError:l=>{n({title:"Error creating persona",duration:5e3})}})};return f.jsx(vn,{...o,children:f.jsxs("form",{onSubmit:o.handleSubmit(i,s=>console.log(s)),className:"space-y-8",children:[f.jsx(ut,{control:o.control,name:"name",render:({field:s})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Name"}),f.jsx(pt,{children:f.jsx(_n,{...s})}),f.jsx(Mt,{children:"This is your personas display name. It can be a real name or a pseudonym."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:o.control,name:"text",render:({field:s})=>{var l;return f.jsxs(ot,{children:[f.jsx(pt,{children:f.jsx(Ai,{placeholder:"Describe your persona here",charCount:(l=s.value)==null?void 0:l.length,limit:2e3,...s})}),f.jsxs(Mt,{children:["You can use no more than ",2e3," characters."]}),f.jsx(lt,{})]})}}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Create Persona"}),t.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Creating Persona..."})]})]})]})})}const iCe=({open:e,onOpenChange:t})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Create Persona"}),f.jsx(dn,{children:"Add a new persona here. Click create when you're done."})]}),f.jsx(oCe,{closeDialog:()=>t(!1)})]})}),sCe=Xe({text:Ce().max(2e3).min(0)});function lCe({persona:e,closeDialog:t}){const n=v_(),r=Bt(),{toast:a}=An(),o=sCe.extend({text:Ce().max(2e3).min(0)}),i={text:e.value||""},s=bn({resolver:yn(o),defaultValues:i,mode:"onChange"}),l=c=>{n.mutate({blockId:e.id||"",requestBody:{id:e.id||"",value:c.text||""}},{onSuccess:()=>{r.invalidateQueries({queryKey:lf({label:Qr})}),t(),a({title:"Persona updated successfully!",duration:5e3})},onError:u=>{a({title:"Error updating persona",duration:5e3})}})};return f.jsx(vn,{...s,children:f.jsxs("form",{onSubmit:s.handleSubmit(l,c=>console.log(c)),className:"space-y-8",children:[f.jsx(ut,{control:s.control,name:"text",render:({field:c})=>{var u;return f.jsxs(ot,{children:[f.jsx(pt,{children:f.jsx(Ai,{placeholder:"Describe your persona here",charCount:(u=c.value)==null?void 0:u.length,limit:2e3,...c})}),f.jsxs(Mt,{children:["You can use no more than ",2e3," characters."]}),f.jsx(lt,{})]})}}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Update Persona"}),n.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Updating Persona..."})]})]})]})})}const cCe=({persona:e,open:t,onOpenChange:n})=>f.jsx(Kt,{open:t,onOpenChange:n,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsxs($t,{children:["Edit ",(e==null?void 0:e.name)??"Persona"]}),f.jsx(dn,{children:"Edit existing agent template here. Click create when you're done."})]}),e?f.jsx(lCe,{persona:e,closeDialog:()=>n(!1)}):f.jsx("p",{children:"No Persona...."})]})}),uCe=({value:e,onValueChange:t})=>f.jsx("form",{children:f.jsxs("div",{className:"relative",children:[f.jsx(Ms,{className:"pointer-events-none absolute left-[12px] top-3 h-4 w-4 text-muted-foreground"}),f.jsx(_n,{placeholder:"Search persona",value:e,onChange:n=>t(n.target.value),className:"w-52 pl-8 lg:w-80"})]})});let Cx;const iU="HoverCard",[sU,hTe]=zn(iU,[qa]),KA=qa(),[dCe,YA]=sU(iU),fCe=e=>{const{__scopeHoverCard:t,children:n,open:r,defaultOpen:a,onOpenChange:o,openDelay:i=700,closeDelay:s=300}=e,l=KA(t),c=p.useRef(0),u=p.useRef(0),d=p.useRef(!1),g=p.useRef(!1),[m=!1,b]=Fa({prop:r,defaultProp:a,onChange:o}),y=p.useCallback(()=>{clearTimeout(u.current),c.current=window.setTimeout(()=>b(!0),i)},[i,b]),w=p.useCallback(()=>{clearTimeout(c.current),!d.current&&!g.current&&(u.current=window.setTimeout(()=>b(!1),s))},[s,b]),v=p.useCallback(()=>b(!1),[b]);return p.useEffect(()=>()=>{clearTimeout(c.current),clearTimeout(u.current)},[]),p.createElement(dCe,{scope:t,open:m,onOpenChange:b,onOpen:y,onClose:w,onDismiss:v,hasSelectionRef:d,isPointerDownOnContentRef:g},p.createElement(ah,l,n))},pCe="HoverCardTrigger",gCe=p.forwardRef((e,t)=>{const{__scopeHoverCard:n,...r}=e,a=YA(pCe,n),o=KA(n);return p.createElement(pf,W({asChild:!0},o),p.createElement(ze.a,W({"data-state":a.open?"open":"closed"},r,{ref:t,onPointerEnter:fe(e.onPointerEnter,cm(a.onOpen)),onPointerLeave:fe(e.onPointerLeave,cm(a.onClose)),onFocus:fe(e.onFocus,a.onOpen),onBlur:fe(e.onBlur,a.onClose),onTouchStart:fe(e.onTouchStart,i=>i.preventDefault())})))}),mCe="HoverCardPortal",[bTe,hCe]=sU(mCe,{forceMount:void 0}),qk="HoverCardContent",bCe=p.forwardRef((e,t)=>{const n=hCe(qk,e.__scopeHoverCard),{forceMount:r=n.forceMount,...a}=e,o=YA(qk,e.__scopeHoverCard);return p.createElement(pr,{present:r||o.open},p.createElement(yCe,W({"data-state":o.open?"open":"closed"},a,{onPointerEnter:fe(e.onPointerEnter,cm(o.onOpen)),onPointerLeave:fe(e.onPointerLeave,cm(o.onClose)),ref:t})))}),yCe=p.forwardRef((e,t)=>{const{__scopeHoverCard:n,onEscapeKeyDown:r,onPointerDownOutside:a,onFocusOutside:o,onInteractOutside:i,...s}=e,l=YA(qk,n),c=KA(n),u=p.useRef(null),d=nt(t,u),[g,m]=p.useState(!1);return p.useEffect(()=>{if(g){const b=document.body;return Cx=b.style.userSelect||b.style.webkitUserSelect,b.style.userSelect="none",b.style.webkitUserSelect="none",()=>{b.style.userSelect=Cx,b.style.webkitUserSelect=Cx}}},[g]),p.useEffect(()=>{if(u.current){const b=()=>{m(!1),l.isPointerDownOnContentRef.current=!1,setTimeout(()=>{var y;((y=document.getSelection())===null||y===void 0?void 0:y.toString())!==""&&(l.hasSelectionRef.current=!0)})};return document.addEventListener("pointerup",b),()=>{document.removeEventListener("pointerup",b),l.hasSelectionRef.current=!1,l.isPointerDownOnContentRef.current=!1}}},[l.isPointerDownOnContentRef,l.hasSelectionRef]),p.useEffect(()=>{u.current&&vCe(u.current).forEach(y=>y.setAttribute("tabindex","-1"))}),p.createElement(Ls,{asChild:!0,disableOutsidePointerEvents:!1,onInteractOutside:i,onEscapeKeyDown:r,onPointerDownOutside:a,onFocusOutside:fe(o,b=>{b.preventDefault()}),onDismiss:l.onDismiss},p.createElement(gf,W({},c,s,{onPointerDown:fe(s.onPointerDown,b=>{b.currentTarget.contains(b.target)&&m(!0),l.hasSelectionRef.current=!1,l.isPointerDownOnContentRef.current=!0}),ref:d,style:{...s.style,userSelect:g?"text":void 0,WebkitUserSelect:g?"text":void 0,"--radix-hover-card-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-hover-card-content-available-width":"var(--radix-popper-available-width)","--radix-hover-card-content-available-height":"var(--radix-popper-available-height)","--radix-hover-card-trigger-width":"var(--radix-popper-anchor-width)","--radix-hover-card-trigger-height":"var(--radix-popper-anchor-height)"}})))});function cm(e){return t=>t.pointerType==="touch"?void 0:e()}function vCe(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP});for(;n.nextNode();)t.push(n.currentNode);return t}const SCe=fCe,wCe=gCe,lU=bCe,ECe=SCe,xCe=wCe,cU=p.forwardRef(({className:e,align:t="center",sideOffset:n=4,...r},a)=>f.jsx(lU,{ref:a,align:t,sideOffset:n,className:ee("z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...r}));cU.displayName=lU.displayName;const ZA=({text:e})=>f.jsxs(ECe,{children:[f.jsx(xCe,{asChild:!0,children:f.jsx(ue,{size:"sm",variant:"ghost",className:"-mx-4 w-96 text-left font-normal",children:f.jsx("span",{className:"h-6 w-full truncate text-left",children:f.jsx("span",{className:"whitespace-pre",children:e})})})}),f.jsx(cU,{className:"w-[300px] p-4 sm:w-[500px]",children:f.jsx("div",{className:"max-h-[400px] overflow-y-auto",children:f.jsx("p",{className:"whitespace-pre-wrap",children:e})})})]}),kCe=(e,t)=>[{accessorKey:"edit",header:"",size:20,cell:({row:n})=>t?f.jsx(Pi,{className:"h-6 w-6"}):f.jsx(ue,{onClick:()=>e(n.original),className:"!h-6 !w-6 !p-1",variant:"ghost",children:f.jsx(Fm,{className:"h-3.5 w-3.5"})})},{accessorKey:"name",header:"Name",cell:({row:n})=>f.jsx(Dn,{isLoading:t,children:n.getValue("name")})},{accessorKey:"value",header:"Value",cell:({row:n})=>f.jsx(Dn,{isLoading:t,children:f.jsx(ZA,{text:n.getValue("value")})})}],CCe=({onPersonaEdit:e,nameFilter:t,className:n})=>{const{data:r,isLoading:a,isError:o}=Ng({label:Qr}),i=p.useMemo(()=>(r??[]).filter(s=>{var l;return(l=s.name)==null?void 0:l.includes(t)}),[r,t]);return f.jsx("div",{className:n,children:f.jsx(uf,{columns:kCe(e,a),isLoading:a,error:o?"Error loading agent templates":void 0,data:i,renderPagination:s=>f.jsx(df,{className:"mt-4",table:s})})})},_Ce=()=>{const[e,t]=p.useState(""),[n]=Oh(e,300),r=Li(),[a,o]=p.useState(r.search.includes("openCreatePersona")??!1),[i,s]=p.useState(null),[l,c]=p.useState(!1),u=d=>{s(d),c(!0)};return f.jsxs(Fs,{children:[f.jsxs("div",{className:"flex items-center justify-between bg-background/95 px-4 pb-3 pt-2.5 backdrop-blur supports-[backdrop-filter]:bg-background/60",children:[f.jsx(uCe,{value:e,onValueChange:t}),f.jsxs(ue,{onClick:()=>o(!0),size:"sm",children:[f.jsx(ya,{className:"mr-2 h-4 w-4"}),"Create Persona"]})]}),f.jsx(CCe,{onPersonaEdit:u,nameFilter:n,className:"mx-4"}),f.jsx(iCe,{open:a,onOpenChange:d=>o(d)}),f.jsx(cCe,{persona:i,open:l,onOpenChange:d=>c(d)})]})},ACe={path:"agent-templates",element:f.jsx(_Ce,{})},uU="Radio",[TCe,dU]=zn(uU),[RCe,NCe]=TCe(uU),ICe=p.forwardRef((e,t)=>{const{__scopeRadio:n,name:r,checked:a=!1,required:o,disabled:i,value:s="on",onCheck:l,...c}=e,[u,d]=p.useState(null),g=nt(t,y=>d(y)),m=p.useRef(!1),b=u?!!u.closest("form"):!0;return p.createElement(RCe,{scope:n,checked:a,disabled:i},p.createElement(ze.button,W({type:"button",role:"radio","aria-checked":a,"data-state":fU(a),"data-disabled":i?"":void 0,disabled:i,value:s},c,{ref:g,onClick:fe(e.onClick,y=>{a||l==null||l(),b&&(m.current=y.isPropagationStopped(),m.current||y.stopPropagation())})})),b&&p.createElement(LCe,{control:u,bubbles:!m.current,name:r,value:s,checked:a,required:o,disabled:i,style:{transform:"translateX(-100%)"}}))}),OCe="RadioIndicator",DCe=p.forwardRef((e,t)=>{const{__scopeRadio:n,forceMount:r,...a}=e,o=NCe(OCe,n);return p.createElement(pr,{present:r||o.checked},p.createElement(ze.span,W({"data-state":fU(o.checked),"data-disabled":o.disabled?"":void 0},a,{ref:t})))}),LCe=e=>{const{control:t,checked:n,bubbles:r=!0,...a}=e,o=p.useRef(null),i=F_(n),s=N_(t);return p.useEffect(()=>{const l=o.current,c=window.HTMLInputElement.prototype,d=Object.getOwnPropertyDescriptor(c,"checked").set;if(i!==n&&d){const g=new Event("click",{bubbles:r});d.call(l,n),l.dispatchEvent(g)}},[i,n,r]),p.createElement("input",W({type:"radio","aria-hidden":!0,defaultChecked:n},a,{tabIndex:-1,ref:o,style:{...e.style,...s,position:"absolute",pointerEvents:"none",opacity:0,margin:0}}))};function fU(e){return e?"checked":"unchecked"}const MCe=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"],pU="RadioGroup",[PCe,yTe]=zn(pU,[oh,dU]),gU=oh(),mU=dU(),[$Ce,FCe]=PCe(pU),jCe=p.forwardRef((e,t)=>{const{__scopeRadioGroup:n,name:r,defaultValue:a,value:o,required:i=!1,disabled:s=!1,orientation:l,dir:c,loop:u=!0,onValueChange:d,...g}=e,m=gU(n),b=x_(c),[y,w]=Fa({prop:o,defaultProp:a,onChange:d});return p.createElement($Ce,{scope:n,name:r,required:i,disabled:s,value:y,onValueChange:w},p.createElement(o7,W({asChild:!0},m,{orientation:l,dir:b,loop:u}),p.createElement(ze.div,W({role:"radiogroup","aria-required":i,"aria-orientation":l,"data-disabled":s?"":void 0,dir:b},g,{ref:t}))))}),zCe="RadioGroupItem",UCe=p.forwardRef((e,t)=>{const{__scopeRadioGroup:n,disabled:r,...a}=e,o=FCe(zCe,n),i=o.disabled||r,s=gU(n),l=mU(n),c=p.useRef(null),u=nt(t,c),d=o.value===a.value,g=p.useRef(!1);return p.useEffect(()=>{const m=y=>{MCe.includes(y.key)&&(g.current=!0)},b=()=>g.current=!1;return document.addEventListener("keydown",m),document.addEventListener("keyup",b),()=>{document.removeEventListener("keydown",m),document.removeEventListener("keyup",b)}},[]),p.createElement(i7,W({asChild:!0},s,{focusable:!i,active:d}),p.createElement(ICe,W({disabled:i,required:o.required,checked:d},l,a,{name:o.name,ref:u,onCheck:()=>o.onValueChange(a.value),onKeyDown:fe(m=>{m.key==="Enter"&&m.preventDefault()}),onFocus:fe(a.onFocus,()=>{var m;g.current&&((m=c.current)===null||m===void 0||m.click())})})))}),BCe=p.forwardRef((e,t)=>{const{__scopeRadioGroup:n,...r}=e,a=mU(n);return p.createElement(DCe,W({},a,r,{ref:t}))}),hU=jCe,bU=UCe,HCe=BCe,yU=p.forwardRef(({className:e,...t},n)=>f.jsx(hU,{className:ee("grid gap-2",e),...t,ref:n}));yU.displayName=hU.displayName;const vU=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(bU,{ref:r,className:ee("aspect-square h-4 w-4 rounded-full border border-primary text-primary ring-offset-background focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),...n,children:f.jsx(HCe,{className:"flex items-center justify-center",children:f.jsx(Q4,{className:"h-2.5 w-2.5 fill-current text-current"})})}));vU.displayName=bU.displayName;const Gk="horizontal",VCe=["horizontal","vertical"],SU=p.forwardRef((e,t)=>{const{decorative:n,orientation:r=Gk,...a}=e,o=wU(r)?r:Gk,s=n?{role:"none"}:{"aria-orientation":o==="vertical"?o:void 0,role:"separator"};return p.createElement(ze.div,W({"data-orientation":o},s,a,{ref:t}))});SU.propTypes={orientation(e,t,n){const r=e[t],a=String(r);return r&&!wU(r)?new Error(qCe(a,n)):null}};function qCe(e,t){return`Invalid prop \`orientation\` of value \`${e}\` supplied to \`${t}\`, expected one of: - horizontal - vertical -Defaulting to \`${qk}\`.`}function SU(e){return VCe.includes(e)}const wU=vU,Nd=p.forwardRef(({className:e,orientation:t="horizontal",decorative:n=!0,...r},a)=>f.jsx(wU,{ref:a,decorative:n,orientation:t,className:ee("shrink-0 bg-border",t==="horizontal"?"h-[1px] w-full":"h-full w-[1px]",e),...r}));Nd.displayName=wU.displayName;const EU=({children:e,title:t,description:n})=>f.jsxs("div",{className:"space-y-6",children:[f.jsxs("div",{children:[f.jsx("h3",{className:"text-lg font-medium",children:t}),f.jsx("p",{className:"text-sm text-muted-foreground",children:n})]}),f.jsx(Nd,{}),e]}),GCe=Xe({currentAgentId:Ce({required_error:"Please select an agent."})}),WCe=e=>({currentAgentId:e??""});function KCe(){const{data:e}=Qm(),t=To(),{setAgent:n}=fh(),r=bn({resolver:yn(GCe),defaultValues:WCe(t==null?void 0:t.id)});function a(o){const i=(e??[]).find(s=>s.id===o.currentAgentId);i&&(n(i),JC({title:"Agent updated successfully!",description:"You can now continue your conversation with them!"}))}return f.jsx(EU,{title:"Agents",description:"Manage the agents you chat with...",children:f.jsx(vn,{...r,children:f.jsxs("form",{onSubmit:r.handleSubmit(a),className:"space-y-8",children:[f.jsx(ut,{control:r.control,name:"currentAgentId",render:({field:o})=>f.jsxs(ot,{className:"space-y-1",children:[f.jsx(yt,{children:"Current Agent"}),f.jsx(Mt,{children:"Agent you are currently chatting with..."}),f.jsx(lt,{}),f.jsx(bU,{onValueChange:o.onChange,defaultValue:o.value,className:"flex flex-wrap gap-8 pt-2",children:e==null?void 0:e.map((i,s)=>f.jsx(ot,{children:f.jsxs(yt,{className:"[&:has([data-state=checked])>div]:border-primary",children:[f.jsx(pt,{children:f.jsx(yU,{value:i.id||"",className:"sr-only"})}),f.jsx("div",{className:"items-center rounded-md border-2 border-muted p-1 hover:border-accent",children:f.jsxs("div",{className:"space-y-2 rounded-sm bg-[#ecedef] p-2",children:[f.jsxs("div",{className:"space-y-2 rounded-md bg-white p-2 shadow-sm",children:[f.jsx("div",{className:"h-2 w-[80px] rounded-lg bg-[#ecedef]"}),f.jsx("div",{className:"h-2 w-[100px] rounded-lg bg-[#ecedef]"})]}),f.jsxs("div",{className:"flex items-center space-x-2 rounded-md bg-white p-2 shadow-sm",children:[f.jsx("div",{className:"h-4 w-4 rounded-full bg-[#ecedef]"}),f.jsx("div",{className:"h-2 w-[100px] rounded-lg bg-[#ecedef]"})]}),f.jsxs("div",{className:"flex items-center space-x-2 rounded-md bg-white p-2 shadow-sm",children:[f.jsx("div",{className:"h-4 w-4 rounded-full bg-[#ecedef]"}),f.jsx("div",{className:"h-2 w-[100px] rounded-lg bg-[#ecedef]"})]})]})}),f.jsx("span",{className:"block w-full p-2 text-center font-normal",children:i.name})]})},s))})]})}),f.jsx(ue,{type:"submit",children:"Update agent"})]})})})}const YCe=Xe({username:Ce().min(2,{message:"Username must be at least 2 characters."}).max(30,{message:"Username must not be longer than 30 characters."}),email:Ce({required_error:"Please select an email to display."}).email(),bio:Ce().max(160).min(4),urls:nA(Xe({value:Ce().url({message:"Please enter a valid URL."})})).optional()}),ZCe={bio:"Build LLM agents using Letta.",urls:[{value:"https://memgpt.ai"},{value:"http://twitter.com/MemGPT"}]};function XCe(){const e=bn({resolver:yn(YCe),defaultValues:ZCe,mode:"onChange"}),{fields:t,append:n}=vae({name:"urls",control:e.control});function r(a){JC({title:"You submitted the following values:",description:f.jsx("pre",{className:"mt-2 w-[340px] rounded-md bg-slate-950 p-4",children:f.jsx("code",{className:"text-white",children:JSON.stringify(a,null,2)})})})}return f.jsx(EU,{title:"Profile",description:"This is how others will see you in the MemGPT community.",children:f.jsx(vn,{...e,children:f.jsxs("form",{onSubmit:e.handleSubmit(r),className:"space-y-8",children:[f.jsx(ut,{control:e.control,name:"username",render:({field:a})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Username"}),f.jsx(pt,{children:f.jsx(_n,{placeholder:"memgpt",...a})}),f.jsx(Mt,{children:"This is your public display name. It can be your real name or a pseudonym. You can only change this once every 30 days."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:e.control,name:"email",render:({field:a})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Email"}),f.jsxs(So,{onValueChange:a.onChange,defaultValue:a.value,children:[f.jsx(pt,{children:f.jsx(za,{children:f.jsx(wo,{placeholder:"Select a verified email to display"})})}),f.jsxs(Ua,{children:[f.jsx(Fn,{value:"m@example.com",children:"m@example.com"}),f.jsx(Fn,{value:"m@google.com",children:"m@google.com"}),f.jsx(Fn,{value:"m@support.com",children:"m@support.com"})]})]}),f.jsxs(Mt,{children:["You can manage verified email addresses in your ",f.jsx(bd,{to:"/examples/forms",children:"email settings"}),"."]}),f.jsx(lt,{})]})}),f.jsx(ut,{control:e.control,name:"bio",render:({field:a})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Bio"}),f.jsx(pt,{children:f.jsx(qs,{placeholder:"Tell us a little bit about yourself",className:"resize-none",...a})}),f.jsxs(Mt,{children:["You can ",f.jsx("span",{children:"@mention"})," other users and organizations to link to them."]}),f.jsx(lt,{})]})}),f.jsxs("div",{children:[t.map((a,o)=>f.jsx(ut,{control:e.control,name:`urls.${o}.value`,render:({field:i})=>f.jsxs(ot,{children:[f.jsx(yt,{className:ee(o!==0&&"sr-only"),children:"URLs"}),f.jsx(Mt,{className:ee(o!==0&&"sr-only"),children:"Add links to your website, blog, or social media profiles."}),f.jsx(pt,{children:f.jsx(_n,{...i})}),f.jsx(lt,{})]})},a.id)),f.jsx(ue,{type:"button",variant:"outline",size:"sm",className:"mt-2",onClick:()=>n({value:""}),children:"Add URL"})]}),f.jsx(ue,{type:"submit",children:"Update profile"})]})})})}function QCe({className:e,items:t,...n}){return f.jsx("nav",{className:ee("flex space-x-2 lg:flex-col lg:space-x-0 lg:space-y-1",e),...n,children:t.map((r,a)=>f.jsx(FF,{relative:"path",to:r.to,className:ee(yc({variant:"ghost"}),"hover:bg-transparent hover:underline","[&.active]:bg-muted [&.active]:hover:bg-muted [&.active]:hover:no-underline","justify-start"),children:r.title},a))})}const JCe=[{title:"Profile",to:"./profile"}];function e_e(){return f.jsx(Fs,{children:f.jsxs("div",{className:"h-full space-y-6 overflow-y-auto p-10 pb-16",children:[f.jsxs("div",{className:"space-y-0.5",children:[f.jsx("h1",{className:"text-2xl font-bold tracking-tight",children:"Settings"}),f.jsx("p",{className:"text-muted-foreground",children:"Manage your Letta settings, like agents, prompts, and history."})]}),f.jsx(Nd,{className:"my-6"}),f.jsxs("div",{className:"flex flex-col space-y-8 lg:flex-row lg:space-x-12 lg:space-y-0",children:[f.jsx("aside",{className:"-mx-4 lg:w-1/5",children:f.jsx(QCe,{items:JCe})}),f.jsx("div",{className:"flex-1 lg:max-w-4xl",children:f.jsx(MF,{})})]})]})})}const t_e={path:"settings",element:f.jsx(e_e,{}),children:[{path:"",element:f.jsx(LF,{to:"profile"})},{path:"agents",element:f.jsx(KCe,{})},{path:"profile",element:f.jsx(XCe,{})}]};var xU={exports:{}};(function(e){var t=typeof window<"u"?window:typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope?self:{};/** +Defaulting to \`${Gk}\`.`}function wU(e){return VCe.includes(e)}const EU=SU,Nd=p.forwardRef(({className:e,orientation:t="horizontal",decorative:n=!0,...r},a)=>f.jsx(EU,{ref:a,decorative:n,orientation:t,className:ee("shrink-0 bg-border",t==="horizontal"?"h-[1px] w-full":"h-full w-[1px]",e),...r}));Nd.displayName=EU.displayName;const xU=({children:e,title:t,description:n})=>f.jsxs("div",{className:"space-y-6",children:[f.jsxs("div",{children:[f.jsx("h3",{className:"text-lg font-medium",children:t}),f.jsx("p",{className:"text-sm text-muted-foreground",children:n})]}),f.jsx(Nd,{}),e]}),GCe=Xe({currentAgentId:Ce({required_error:"Please select an agent."})}),WCe=e=>({currentAgentId:e??""});function KCe(){const{data:e}=Qm(),t=To(),{setAgent:n}=ph(),r=bn({resolver:yn(GCe),defaultValues:WCe(t==null?void 0:t.id)});function a(o){const i=(e??[]).find(s=>s.id===o.currentAgentId);i&&(n(i),e_({title:"Agent updated successfully!",description:"You can now continue your conversation with them!"}))}return f.jsx(xU,{title:"Agents",description:"Manage the agents you chat with...",children:f.jsx(vn,{...r,children:f.jsxs("form",{onSubmit:r.handleSubmit(a),className:"space-y-8",children:[f.jsx(ut,{control:r.control,name:"currentAgentId",render:({field:o})=>f.jsxs(ot,{className:"space-y-1",children:[f.jsx(yt,{children:"Current Agent"}),f.jsx(Mt,{children:"Agent you are currently chatting with..."}),f.jsx(lt,{}),f.jsx(yU,{onValueChange:o.onChange,defaultValue:o.value,className:"flex flex-wrap gap-8 pt-2",children:e==null?void 0:e.map((i,s)=>f.jsx(ot,{children:f.jsxs(yt,{className:"[&:has([data-state=checked])>div]:border-primary",children:[f.jsx(pt,{children:f.jsx(vU,{value:i.id||"",className:"sr-only"})}),f.jsx("div",{className:"items-center rounded-md border-2 border-muted p-1 hover:border-accent",children:f.jsxs("div",{className:"space-y-2 rounded-sm bg-[#ecedef] p-2",children:[f.jsxs("div",{className:"space-y-2 rounded-md bg-white p-2 shadow-sm",children:[f.jsx("div",{className:"h-2 w-[80px] rounded-lg bg-[#ecedef]"}),f.jsx("div",{className:"h-2 w-[100px] rounded-lg bg-[#ecedef]"})]}),f.jsxs("div",{className:"flex items-center space-x-2 rounded-md bg-white p-2 shadow-sm",children:[f.jsx("div",{className:"h-4 w-4 rounded-full bg-[#ecedef]"}),f.jsx("div",{className:"h-2 w-[100px] rounded-lg bg-[#ecedef]"})]}),f.jsxs("div",{className:"flex items-center space-x-2 rounded-md bg-white p-2 shadow-sm",children:[f.jsx("div",{className:"h-4 w-4 rounded-full bg-[#ecedef]"}),f.jsx("div",{className:"h-2 w-[100px] rounded-lg bg-[#ecedef]"})]})]})}),f.jsx("span",{className:"block w-full p-2 text-center font-normal",children:i.name})]})},s))})]})}),f.jsx(ue,{type:"submit",children:"Update agent"})]})})})}const YCe=Xe({username:Ce().min(2,{message:"Username must be at least 2 characters."}).max(30,{message:"Username must not be longer than 30 characters."}),email:Ce({required_error:"Please select an email to display."}).email(),bio:Ce().max(160).min(4),urls:nA(Xe({value:Ce().url({message:"Please enter a valid URL."})})).optional()}),ZCe={bio:"Build LLM agents using Letta.",urls:[{value:"https://memgpt.ai"},{value:"http://twitter.com/MemGPT"}]};function XCe(){const e=bn({resolver:yn(YCe),defaultValues:ZCe,mode:"onChange"}),{fields:t,append:n}=vae({name:"urls",control:e.control});function r(a){e_({title:"You submitted the following values:",description:f.jsx("pre",{className:"mt-2 w-[340px] rounded-md bg-slate-950 p-4",children:f.jsx("code",{className:"text-white",children:JSON.stringify(a,null,2)})})})}return f.jsx(xU,{title:"Profile",description:"This is how others will see you in the MemGPT community.",children:f.jsx(vn,{...e,children:f.jsxs("form",{onSubmit:e.handleSubmit(r),className:"space-y-8",children:[f.jsx(ut,{control:e.control,name:"username",render:({field:a})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Username"}),f.jsx(pt,{children:f.jsx(_n,{placeholder:"memgpt",...a})}),f.jsx(Mt,{children:"This is your public display name. It can be your real name or a pseudonym. You can only change this once every 30 days."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:e.control,name:"email",render:({field:a})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Email"}),f.jsxs(So,{onValueChange:a.onChange,defaultValue:a.value,children:[f.jsx(pt,{children:f.jsx(za,{children:f.jsx(wo,{placeholder:"Select a verified email to display"})})}),f.jsxs(Ua,{children:[f.jsx(Fn,{value:"m@example.com",children:"m@example.com"}),f.jsx(Fn,{value:"m@google.com",children:"m@google.com"}),f.jsx(Fn,{value:"m@support.com",children:"m@support.com"})]})]}),f.jsxs(Mt,{children:["You can manage verified email addresses in your ",f.jsx(bd,{to:"/examples/forms",children:"email settings"}),"."]}),f.jsx(lt,{})]})}),f.jsx(ut,{control:e.control,name:"bio",render:({field:a})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Bio"}),f.jsx(pt,{children:f.jsx(qs,{placeholder:"Tell us a little bit about yourself",className:"resize-none",...a})}),f.jsxs(Mt,{children:["You can ",f.jsx("span",{children:"@mention"})," other users and organizations to link to them."]}),f.jsx(lt,{})]})}),f.jsxs("div",{children:[t.map((a,o)=>f.jsx(ut,{control:e.control,name:`urls.${o}.value`,render:({field:i})=>f.jsxs(ot,{children:[f.jsx(yt,{className:ee(o!==0&&"sr-only"),children:"URLs"}),f.jsx(Mt,{className:ee(o!==0&&"sr-only"),children:"Add links to your website, blog, or social media profiles."}),f.jsx(pt,{children:f.jsx(_n,{...i})}),f.jsx(lt,{})]})},a.id)),f.jsx(ue,{type:"button",variant:"outline",size:"sm",className:"mt-2",onClick:()=>n({value:""}),children:"Add URL"})]}),f.jsx(ue,{type:"submit",children:"Update profile"})]})})})}function QCe({className:e,items:t,...n}){return f.jsx("nav",{className:ee("flex space-x-2 lg:flex-col lg:space-x-0 lg:space-y-1",e),...n,children:t.map((r,a)=>f.jsx(jF,{relative:"path",to:r.to,className:ee(yc({variant:"ghost"}),"hover:bg-transparent hover:underline","[&.active]:bg-muted [&.active]:hover:bg-muted [&.active]:hover:no-underline","justify-start"),children:r.title},a))})}const JCe=[{title:"Profile",to:"./profile"}];function e_e(){return f.jsx(Fs,{children:f.jsxs("div",{className:"h-full space-y-6 overflow-y-auto p-10 pb-16",children:[f.jsxs("div",{className:"space-y-0.5",children:[f.jsx("h1",{className:"text-2xl font-bold tracking-tight",children:"Settings"}),f.jsx("p",{className:"text-muted-foreground",children:"Manage your Letta settings, like agents, prompts, and history."})]}),f.jsx(Nd,{className:"my-6"}),f.jsxs("div",{className:"flex flex-col space-y-8 lg:flex-row lg:space-x-12 lg:space-y-0",children:[f.jsx("aside",{className:"-mx-4 lg:w-1/5",children:f.jsx(QCe,{items:JCe})}),f.jsx("div",{className:"flex-1 lg:max-w-4xl",children:f.jsx(PF,{})})]})]})})}const t_e={path:"settings",element:f.jsx(e_e,{}),children:[{path:"",element:f.jsx(MF,{to:"profile"})},{path:"agents",element:f.jsx(KCe,{})},{path:"profile",element:f.jsx(XCe,{})}]};var kU={exports:{}};(function(e){var t=typeof window<"u"?window:typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope?self:{};/** * Prism: Lightweight, robust, elegant syntax highlighting * * @license MIT @@ -218,7 +218,7 @@ Defaulting to \`${qk}\`.`}function SU(e){return VCe.includes(e)}const wU=vU,Nd=p * @namespace * @public */var n=function(r){var a=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,o=0,i={},s={manual:r.Prism&&r.Prism.manual,disableWorkerMessageHandler:r.Prism&&r.Prism.disableWorkerMessageHandler,util:{encode:function h(S){return S instanceof l?new l(S.type,h(S.content),S.alias):Array.isArray(S)?S.map(h):S.replace(/&/g,"&").replace(/"u")return null;if("currentScript"in document&&1<2)return document.currentScript;try{throw new Error}catch(k){var h=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(k.stack)||[])[1];if(h){var S=document.getElementsByTagName("script");for(var E in S)if(S[E].src==h)return S[E]}return null}},isActive:function(h,S,E){for(var k="no-"+S;h;){var x=h.classList;if(x.contains(S))return!0;if(x.contains(k))return!1;h=h.parentElement}return!!E}},languages:{plain:i,plaintext:i,text:i,txt:i,extend:function(h,S){var E=s.util.clone(s.languages[h]);for(var k in S)E[k]=S[k];return E},insertBefore:function(h,S,E,k){k=k||s.languages;var x=k[h],C={};for(var _ in x)if(x.hasOwnProperty(_)){if(_==S)for(var R in E)E.hasOwnProperty(R)&&(C[R]=E[R]);E.hasOwnProperty(_)||(C[_]=x[_])}var T=k[h];return k[h]=C,s.languages.DFS(s.languages,function(L,D){D===T&&L!=h&&(this[L]=C)}),C},DFS:function h(S,E,k,x){x=x||{};var C=s.util.objId;for(var _ in S)if(S.hasOwnProperty(_)){E.call(S,_,S[_],k||_);var R=S[_],T=s.util.type(R);T==="Object"&&!x[C(R)]?(x[C(R)]=!0,h(R,E,null,x)):T==="Array"&&!x[C(R)]&&(x[C(R)]=!0,h(R,E,_,x))}}},plugins:{},highlightAll:function(h,S){s.highlightAllUnder(document,h,S)},highlightAllUnder:function(h,S,E){var k={callback:E,container:h,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};s.hooks.run("before-highlightall",k),k.elements=Array.prototype.slice.apply(k.container.querySelectorAll(k.selector)),s.hooks.run("before-all-elements-highlight",k);for(var x=0,C;C=k.elements[x++];)s.highlightElement(C,S===!0,k.callback)},highlightElement:function(h,S,E){var k=s.util.getLanguage(h),x=s.languages[k];s.util.setLanguage(h,k);var C=h.parentElement;C&&C.nodeName.toLowerCase()==="pre"&&s.util.setLanguage(C,k);var _=h.textContent,R={element:h,language:k,grammar:x,code:_};function T(D){R.highlightedCode=D,s.hooks.run("before-insert",R),R.element.innerHTML=R.highlightedCode,s.hooks.run("after-highlight",R),s.hooks.run("complete",R),E&&E.call(R.element)}if(s.hooks.run("before-sanity-check",R),C=R.element.parentElement,C&&C.nodeName.toLowerCase()==="pre"&&!C.hasAttribute("tabindex")&&C.setAttribute("tabindex","0"),!R.code){s.hooks.run("complete",R),E&&E.call(R.element);return}if(s.hooks.run("before-highlight",R),!R.grammar){T(s.util.encode(R.code));return}if(S&&r.Worker){var L=new Worker(s.filename);L.onmessage=function(D){T(D.data)},L.postMessage(JSON.stringify({language:R.language,code:R.code,immediateClose:!0}))}else T(s.highlight(R.code,R.grammar,R.language))},highlight:function(h,S,E){var k={code:h,grammar:S,language:E};if(s.hooks.run("before-tokenize",k),!k.grammar)throw new Error('The language "'+k.language+'" has no grammar.');return k.tokens=s.tokenize(k.code,k.grammar),s.hooks.run("after-tokenize",k),l.stringify(s.util.encode(k.tokens),k.language)},tokenize:function(h,S){var E=S.rest;if(E){for(var k in E)S[k]=E[k];delete S.rest}var x=new d;return g(x,x.head,h),u(h,x,S,x.head,0),b(x)},hooks:{all:{},add:function(h,S){var E=s.hooks.all;E[h]=E[h]||[],E[h].push(S)},run:function(h,S){var E=s.hooks.all[h];if(!(!E||!E.length))for(var k=0,x;x=E[k++];)x(S)}},Token:l};r.Prism=s;function l(h,S,E,k){this.type=h,this.content=S,this.alias=E,this.length=(k||"").length|0}l.stringify=function h(S,E){if(typeof S=="string")return S;if(Array.isArray(S)){var k="";return S.forEach(function(T){k+=h(T,E)}),k}var x={type:S.type,content:h(S.content,E),tag:"span",classes:["token",S.type],attributes:{},language:E},C=S.alias;C&&(Array.isArray(C)?Array.prototype.push.apply(x.classes,C):x.classes.push(C)),s.hooks.run("wrap",x);var _="";for(var R in x.attributes)_+=" "+R+'="'+(x.attributes[R]||"").replace(/"/g,""")+'"';return"<"+x.tag+' class="'+x.classes.join(" ")+'"'+_+">"+x.content+""};function c(h,S,E,k){h.lastIndex=S;var x=h.exec(E);if(x&&k&&x[1]){var C=x[1].length;x.index+=C,x[0]=x[0].slice(C)}return x}function u(h,S,E,k,x,C){for(var _ in E)if(!(!E.hasOwnProperty(_)||!E[_])){var R=E[_];R=Array.isArray(R)?R:[R];for(var T=0;T=C.reach);O+=j.value.length,j=j.next){var A=j.value;if(S.length>h.length)return;if(!(A instanceof l)){var V=1,P;if(z){if(P=c(X,O,h,H),!P||P.index>=h.length)break;var ne=P.index,N=P.index+P[0].length,K=O;for(K+=j.value.length;ne>=K;)j=j.next,K+=j.value.length;if(K-=j.value.length,O=K,j.value instanceof l)continue;for(var ae=j;ae!==S.tail&&(KC.reach&&(C.reach=re);var Ee=j.prev;pe&&(Ee=g(S,Ee,pe),O+=pe.length),m(S,Ee,V);var ke=new l(_,D?s.tokenize(Q,D):Q,M,Q);if(j=g(S,Ee,ke),he&&g(S,j,he),V>1){var We={cause:_+","+T,reach:re};u(h,S,E,j.prev,O,We),C&&We.reach>C.reach&&(C.reach=We.reach)}}}}}}function d(){var h={value:null,prev:null,next:null},S={value:null,prev:h,next:null};h.next=S,this.head=h,this.tail=S,this.length=0}function g(h,S,E){var k=S.next,x={value:E,prev:S,next:k};return S.next=x,k.prev=x,h.length++,x}function m(h,S,E){for(var k=S.next,x=0;x/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},n.languages.markup.tag.inside["attr-value"].inside.entity=n.languages.markup.entity,n.languages.markup.doctype.inside["internal-subset"].inside=n.languages.markup,n.hooks.add("wrap",function(r){r.type==="entity"&&(r.attributes.title=r.content.replace(/&/,"&"))}),Object.defineProperty(n.languages.markup.tag,"addInlined",{value:function(a,o){var i={};i["language-"+o]={pattern:/(^$)/i,lookbehind:!0,inside:n.languages[o]},i.cdata=/^$/i;var s={"included-cdata":{pattern://i,inside:i}};s["language-"+o]={pattern:/[\s\S]+/,inside:n.languages[o]};var l={};l[a]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:s},n.languages.insertBefore("markup","cdata",l)}}),Object.defineProperty(n.languages.markup.tag,"addAttribute",{value:function(r,a){n.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+r+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[a,"language-"+a],inside:n.languages[a]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),n.languages.html=n.languages.markup,n.languages.mathml=n.languages.markup,n.languages.svg=n.languages.markup,n.languages.xml=n.languages.extend("markup",{}),n.languages.ssml=n.languages.xml,n.languages.atom=n.languages.xml,n.languages.rss=n.languages.xml,function(r){var a=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;r.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+a.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+a.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+a.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+a.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:a,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},r.languages.css.atrule.inside.rest=r.languages.css;var o=r.languages.markup;o&&(o.tag.addInlined("style","css"),o.tag.addAttribute("style","css"))}(n),n.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},n.languages.javascript=n.languages.extend("clike",{"class-name":[n.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+(/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source)+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),n.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,n.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:n.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:n.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:n.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:n.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:n.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),n.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:n.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),n.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),n.languages.markup&&(n.languages.markup.tag.addInlined("script","javascript"),n.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),n.languages.js=n.languages.javascript,function(){if(typeof n>"u"||typeof document>"u")return;Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var r="Loading…",a=function(y,w){return"✖ Error "+y+" while fetching file: "+w},o="✖ Error: File does not exist or is empty",i={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},s="data-src-status",l="loading",c="loaded",u="failed",d="pre[data-src]:not(["+s+'="'+c+'"]):not(['+s+'="'+l+'"])';function g(y,w,v){var h=new XMLHttpRequest;h.open("GET",y,!0),h.onreadystatechange=function(){h.readyState==4&&(h.status<400&&h.responseText?w(h.responseText):h.status>=400?v(a(h.status,h.statusText)):v(o))},h.send(null)}function m(y){var w=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(y||"");if(w){var v=Number(w[1]),h=w[2],S=w[3];return h?S?[v,Number(S)]:[v,void 0]:[v,v]}}n.hooks.add("before-highlightall",function(y){y.selector+=", "+d}),n.hooks.add("before-sanity-check",function(y){var w=y.element;if(w.matches(d)){y.code="",w.setAttribute(s,l);var v=w.appendChild(document.createElement("CODE"));v.textContent=r;var h=w.getAttribute("data-src"),S=y.language;if(S==="none"){var E=(/\.(\w+)$/.exec(h)||[,"none"])[1];S=i[E]||E}n.util.setLanguage(v,S),n.util.setLanguage(w,S);var k=n.plugins.autoloader;k&&k.loadLanguages(S),g(h,function(x){w.setAttribute(s,c);var C=m(w.getAttribute("data-range"));if(C){var _=x.split(/\r\n?|\n/g),R=C[0],T=C[1]==null?_.length:C[1];R<0&&(R+=_.length),R=Math.max(0,Math.min(R-1,_.length)),T<0&&(T+=_.length),T=Math.max(0,Math.min(T,_.length)),x=_.slice(R,T).join(` -`),w.hasAttribute("data-start")||w.setAttribute("data-start",String(R+1))}v.textContent=x,n.highlightElement(v)},function(x){w.setAttribute(s,u),v.textContent=x})}}),n.plugins.fileHighlight={highlight:function(w){for(var v=(w||document).querySelectorAll(d),h=0,S;S=v[h++];)n.highlightElement(S)}};var b=!1;n.fileHighlight=function(){b||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),b=!0),n.plugins.fileHighlight.highlight.apply(this,arguments)}}()})(xU);var V3=xU.exports;Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/};Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python;Prism.languages.py=Prism.languages.python;var kU={},n_e=nn&&nn.__extends||function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,a){r.__proto__=a}||function(r,a){for(var o in a)Object.prototype.hasOwnProperty.call(a,o)&&(r[o]=a[o])},e(t,n)};return function(t,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}}(),fn=nn&&nn.__assign||function(){return fn=Object.assign||function(e){for(var t,n=1,r=arguments.length;n]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/};Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python;Prism.languages.py=Prism.languages.python;var CU={},n_e=nn&&nn.__extends||function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,a){r.__proto__=a}||function(r,a){for(var o in a)Object.prototype.hasOwnProperty.call(a,o)&&(r[o]=a[o])},e(t,n)};return function(t,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}}(),fn=nn&&nn.__assign||function(){return fn=Object.assign||function(e){for(var t,n=1,r=arguments.length;n=S&&M<=E?m+z:z}).join(` `),selectionStart:h&&/\S/.test(h)?d+m.length:d,selectionEnd:g+m.length*(E-S+1)})}else{var k=d+m.length;n._applyEdits({value:u.substring(0,d)+m+u.substring(g),selectionStart:k,selectionEnd:k})}else if(r.keyCode===c_e){var x=d!==g,C=u.substring(0,d);if(C.endsWith(m)&&!x){r.preventDefault();var k=d-m.length;n._applyEdits({value:u.substring(0,d-m.length)+u.substring(g),selectionStart:k,selectionEnd:k})}}else if(r.keyCode===s_e){if(d===g){var _=n._getLines(u,d).pop(),R=_==null?void 0:_.match(/^\s+/);if(R!=null&&R[0]){r.preventDefault();var T=` -`+R[0],k=d+T.length;n._applyEdits({value:u.substring(0,d)+T+u.substring(g),selectionStart:k,selectionEnd:k})}}}else if(r.keyCode===q3||r.keyCode===G3||r.keyCode===W3||r.keyCode===K3){var L=void 0;r.keyCode===q3&&r.shiftKey?L=["(",")"]:r.keyCode===G3?r.shiftKey?L=["{","}"]:L=["[","]"]:r.keyCode===W3?r.shiftKey?L=['"','"']:L=["'","'"]:r.keyCode===K3&&!r.shiftKey&&(L=["`","`"]),d!==g&&L&&(r.preventDefault(),n._applyEdits({value:u.substring(0,d)+L[0]+u.substring(d,g)+L[1]+u.substring(g),selectionStart:d,selectionEnd:g+2}))}else(Cx?r.metaKey&&r.keyCode===Ep:r.ctrlKey&&r.keyCode===Ep)&&!r.shiftKey&&!r.altKey?(r.preventDefault(),n._undoEdit()):(Cx?r.metaKey&&r.keyCode===Ep&&r.shiftKey:g_e?r.ctrlKey&&r.keyCode===u_e:r.ctrlKey&&r.keyCode===Ep&&r.shiftKey)&&!r.altKey?(r.preventDefault(),n._redoEdit()):r.keyCode===d_e&&r.ctrlKey&&(!Cx||r.shiftKey)&&(r.preventDefault(),n.setState(function(D){return{capture:!D.capture}}))}},n._handleChange=function(r){var a=r.currentTarget,o=a.value,i=a.selectionStart,s=a.selectionEnd;n._recordChange({value:o,selectionStart:i,selectionEnd:s},!0),n.props.onValueChange(o)},n._history={stack:[],offset:-1},n._input=null,n}return t.prototype.componentDidMount=function(){this._recordCurrentState()},Object.defineProperty(t.prototype,"session",{get:function(){return{history:this._history}},set:function(n){this._history=n.history},enumerable:!1,configurable:!0}),t.prototype.render=function(){var n=this,r=this.props,a=r.value,o=r.style,i=r.padding,s=r.highlight,l=r.textareaId,c=r.textareaClassName,u=r.autoFocus,d=r.disabled,g=r.form,m=r.maxLength,b=r.minLength,y=r.name,w=r.placeholder,v=r.readOnly,h=r.required,S=r.onClick,E=r.onFocus,k=r.onBlur,x=r.onKeyUp;r.onKeyDown,r.onValueChange,r.tabSize,r.insertSpaces,r.ignoreTabKey;var C=r.preClassName,_=i_e(r,["value","style","padding","highlight","textareaId","textareaClassName","autoFocus","disabled","form","maxLength","minLength","name","placeholder","readOnly","required","onClick","onFocus","onBlur","onKeyUp","onKeyDown","onValueChange","tabSize","insertSpaces","ignoreTabKey","preClassName"]),R={paddingTop:typeof i=="object"?i.top:i,paddingRight:typeof i=="object"?i.right:i,paddingBottom:typeof i=="object"?i.bottom:i,paddingLeft:typeof i=="object"?i.left:i},T=s(a);return vu.createElement("div",fn({},_,{style:fn(fn({},Su.container),o)}),vu.createElement("pre",fn({className:C,"aria-hidden":"true",style:fn(fn(fn({},Su.editor),Su.highlight),R)},typeof T=="string"?{dangerouslySetInnerHTML:{__html:T+"
"}}:{children:T})),vu.createElement("textarea",{ref:function(L){return n._input=L},style:fn(fn(fn({},Su.editor),Su.textarea),R),className:Jp+(c?" ".concat(c):""),id:l,value:a,onChange:this._handleChange,onKeyDown:this._handleKeyDown,onClick:S,onKeyUp:x,onFocus:E,onBlur:k,disabled:d,form:g,maxLength:m,minLength:b,name:y,placeholder:w,readOnly:v,required:h,autoFocus:u,autoCapitalize:"off",autoComplete:"off",autoCorrect:"off",spellCheck:!1,"data-gramm":!1}),vu.createElement("style",{dangerouslySetInnerHTML:{__html:m_e}}))},t.defaultProps={tabSize:2,insertSpaces:!0,ignoreTabKey:!1,padding:0},t}(vu.Component),b_e=kU.default=h_e,Su={container:{position:"relative",textAlign:"left",boxSizing:"border-box",padding:0,overflow:"hidden"},textarea:{position:"absolute",top:0,left:0,height:"100%",width:"100%",resize:"none",color:"inherit",overflow:"hidden",MozOsxFontSmoothing:"grayscale",WebkitFontSmoothing:"antialiased",WebkitTextFillColor:"transparent"},highlight:{position:"relative",pointerEvents:"none"},editor:{margin:0,border:0,background:"none",boxSizing:"inherit",display:"inherit",fontFamily:"inherit",fontSize:"inherit",fontStyle:"inherit",fontVariantLigatures:"inherit",fontWeight:"inherit",letterSpacing:"inherit",lineHeight:"inherit",tabSize:"inherit",textIndent:"inherit",textRendering:"inherit",textTransform:"inherit",whiteSpace:"pre-wrap",wordBreak:"keep-all",overflowWrap:"break-word"}};const CU=({ref:e,value:t,onChange:n})=>f.jsx(b_e,{ref:e,className:"min-h-96 rounded-md border border-input bg-gray-800 text-gray-100 has-[:disabled]:opacity-50",textareaClassName:"focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50",value:t,onValueChange:n,highlight:r=>V3.highlight(r,V3.languages.py,"py"),padding:10,style:{fontFamily:'"Fira code", "Fira Mono", monospace',fontSize:12}}),y_e=Xe({name:Ce().min(1,{message:"Name must be at least 1 character."}).max(30,{message:"Name must not be longer than 30 characters."}),code:Ce()}),v_e={name:"",code:`import random +`+R[0],k=d+T.length;n._applyEdits({value:u.substring(0,d)+T+u.substring(g),selectionStart:k,selectionEnd:k})}}}else if(r.keyCode===q3||r.keyCode===G3||r.keyCode===W3||r.keyCode===K3){var L=void 0;r.keyCode===q3&&r.shiftKey?L=["(",")"]:r.keyCode===G3?r.shiftKey?L=["{","}"]:L=["[","]"]:r.keyCode===W3?r.shiftKey?L=['"','"']:L=["'","'"]:r.keyCode===K3&&!r.shiftKey&&(L=["`","`"]),d!==g&&L&&(r.preventDefault(),n._applyEdits({value:u.substring(0,d)+L[0]+u.substring(d,g)+L[1]+u.substring(g),selectionStart:d,selectionEnd:g+2}))}else(_x?r.metaKey&&r.keyCode===Ep:r.ctrlKey&&r.keyCode===Ep)&&!r.shiftKey&&!r.altKey?(r.preventDefault(),n._undoEdit()):(_x?r.metaKey&&r.keyCode===Ep&&r.shiftKey:g_e?r.ctrlKey&&r.keyCode===u_e:r.ctrlKey&&r.keyCode===Ep&&r.shiftKey)&&!r.altKey?(r.preventDefault(),n._redoEdit()):r.keyCode===d_e&&r.ctrlKey&&(!_x||r.shiftKey)&&(r.preventDefault(),n.setState(function(D){return{capture:!D.capture}}))}},n._handleChange=function(r){var a=r.currentTarget,o=a.value,i=a.selectionStart,s=a.selectionEnd;n._recordChange({value:o,selectionStart:i,selectionEnd:s},!0),n.props.onValueChange(o)},n._history={stack:[],offset:-1},n._input=null,n}return t.prototype.componentDidMount=function(){this._recordCurrentState()},Object.defineProperty(t.prototype,"session",{get:function(){return{history:this._history}},set:function(n){this._history=n.history},enumerable:!1,configurable:!0}),t.prototype.render=function(){var n=this,r=this.props,a=r.value,o=r.style,i=r.padding,s=r.highlight,l=r.textareaId,c=r.textareaClassName,u=r.autoFocus,d=r.disabled,g=r.form,m=r.maxLength,b=r.minLength,y=r.name,w=r.placeholder,v=r.readOnly,h=r.required,S=r.onClick,E=r.onFocus,k=r.onBlur,x=r.onKeyUp;r.onKeyDown,r.onValueChange,r.tabSize,r.insertSpaces,r.ignoreTabKey;var C=r.preClassName,_=i_e(r,["value","style","padding","highlight","textareaId","textareaClassName","autoFocus","disabled","form","maxLength","minLength","name","placeholder","readOnly","required","onClick","onFocus","onBlur","onKeyUp","onKeyDown","onValueChange","tabSize","insertSpaces","ignoreTabKey","preClassName"]),R={paddingTop:typeof i=="object"?i.top:i,paddingRight:typeof i=="object"?i.right:i,paddingBottom:typeof i=="object"?i.bottom:i,paddingLeft:typeof i=="object"?i.left:i},T=s(a);return vu.createElement("div",fn({},_,{style:fn(fn({},Su.container),o)}),vu.createElement("pre",fn({className:C,"aria-hidden":"true",style:fn(fn(fn({},Su.editor),Su.highlight),R)},typeof T=="string"?{dangerouslySetInnerHTML:{__html:T+"
"}}:{children:T})),vu.createElement("textarea",{ref:function(L){return n._input=L},style:fn(fn(fn({},Su.editor),Su.textarea),R),className:Jp+(c?" ".concat(c):""),id:l,value:a,onChange:this._handleChange,onKeyDown:this._handleKeyDown,onClick:S,onKeyUp:x,onFocus:E,onBlur:k,disabled:d,form:g,maxLength:m,minLength:b,name:y,placeholder:w,readOnly:v,required:h,autoFocus:u,autoCapitalize:"off",autoComplete:"off",autoCorrect:"off",spellCheck:!1,"data-gramm":!1}),vu.createElement("style",{dangerouslySetInnerHTML:{__html:m_e}}))},t.defaultProps={tabSize:2,insertSpaces:!0,ignoreTabKey:!1,padding:0},t}(vu.Component),b_e=CU.default=h_e,Su={container:{position:"relative",textAlign:"left",boxSizing:"border-box",padding:0,overflow:"hidden"},textarea:{position:"absolute",top:0,left:0,height:"100%",width:"100%",resize:"none",color:"inherit",overflow:"hidden",MozOsxFontSmoothing:"grayscale",WebkitFontSmoothing:"antialiased",WebkitTextFillColor:"transparent"},highlight:{position:"relative",pointerEvents:"none"},editor:{margin:0,border:0,background:"none",boxSizing:"inherit",display:"inherit",fontFamily:"inherit",fontSize:"inherit",fontStyle:"inherit",fontVariantLigatures:"inherit",fontWeight:"inherit",letterSpacing:"inherit",lineHeight:"inherit",tabSize:"inherit",textIndent:"inherit",textRendering:"inherit",textTransform:"inherit",whiteSpace:"pre-wrap",wordBreak:"keep-all",overflowWrap:"break-word"}};const _U=({ref:e,value:t,onChange:n})=>f.jsx(b_e,{ref:e,className:"min-h-96 rounded-md border border-input bg-gray-800 text-gray-100 has-[:disabled]:opacity-50",textareaClassName:"focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50",value:t,onValueChange:n,highlight:r=>V3.highlight(r,V3.languages.py,"py"),padding:10,style:{fontFamily:'"Fira code", "Fira Mono", monospace',fontSize:12}}),y_e=Xe({name:Ce().min(1,{message:"Name must be at least 1 character."}).max(30,{message:"Name must not be longer than 30 characters."}),code:Ce()}),v_e={name:"",code:`import random def roll_d20(self) -> str: """ @@ -268,4 +268,4 @@ def roll_d20(self) -> str: """ dice_role_outcome = random.randint(1, 20) output_string = f"You rolled a {dice_role_outcome}" - return output_string`};function S_e({closeDialog:e}){const t=lX(),n=Bt(),{toast:r}=An(),a=bn({resolver:yn(y_e),defaultValues:v_e,mode:"onChange"}),o=i=>{t.mutate({requestBody:{name:i.name,tags:[],source_code:i.code}},{onSuccess:()=>{n.invalidateQueries({queryKey:p_()}),e(),r({title:"Tool created successfully!",duration:5e3})},onError:s=>{r({title:"Error creating tool",duration:5e3})}})};return f.jsx(vn,{...a,children:f.jsxs("form",{onSubmit:a.handleSubmit(o,i=>console.log(i)),className:"space-y-8",children:[f.jsx(ut,{control:a.control,name:"name",render:({field:i})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Name"}),f.jsx(pt,{children:f.jsx(_n,{...i})}),f.jsx(Mt,{children:"This is your tools display name. It can be a real name or a pseudonym."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:a.control,name:"code",render:({field:i})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Source Code"}),f.jsx(pt,{children:f.jsx(CU,{...i})}),f.jsx(Mt,{children:"Write the source code for your tool. Custom tools must be valid Python code, and all arguments must be type annotated, and you must include a docstring."}),f.jsx(lt,{})]})}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Create Tool"}),t.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Creating Tool..."})]})]})]})})}const w_e=({open:e,onOpenChange:t})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full overflow-y-auto sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Create Tool"}),f.jsx(dn,{children:"Add a new tool here. Click create when you're done."})]}),f.jsx(S_e,{closeDialog:()=>t(!1)})]})}),E_e=Xe({source_code:Ce()});function x_e({tool:e,closeDialog:t}){const n=fX(),r=Bt(),{toast:a}=An(),o={...e},i=bn({resolver:yn(E_e),defaultValues:o,mode:"onChange"}),s=l=>{n.mutate({toolId:e.id||"",requestBody:{id:e.id||"",source_code:l.source_code}},{onSuccess:()=>{t(),r.invalidateQueries({queryKey:p_()}),a({title:"Tool updated successfully!",duration:5e3})},onError:c=>{a({title:"Error updating tool",duration:5e3})}})};return f.jsx(vn,{...i,children:f.jsxs("form",{onSubmit:i.handleSubmit(s,l=>console.log(l)),className:"space-y-8",children:[f.jsx(ut,{control:i.control,name:"source_code",render:({field:l})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Source Code"}),f.jsx(pt,{children:f.jsx(CU,{...l})}),f.jsx(lt,{})]})}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Update Tool"}),n.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Updating Tool..."})]})]})]})})}const k_e=({tool:e,open:t,onOpenChange:n})=>f.jsx(Kt,{open:t,onOpenChange:n,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full overflow-y-auto sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsxs($t,{children:["Edit ",(e==null?void 0:e.name)??"Tool"]}),f.jsx(dn,{children:"Edit existing tool here. Click create when you're done."})]}),e?f.jsx(x_e,{tool:e,closeDialog:()=>n(!1)}):f.jsx("p",{children:"No Tool...."})]})}),C_e=({value:e,onValueChange:t})=>f.jsx("form",{children:f.jsxs("div",{className:"relative",children:[f.jsx(Ms,{className:"pointer-events-none absolute left-[12px] top-3 h-4 w-4 text-muted-foreground"}),f.jsx(_n,{placeholder:"Search tool",value:e,onChange:n=>t(n.target.value),className:"w-52 pl-8 lg:w-80"})]})}),__e=(e,t)=>[{accessorKey:"edit",header:"",size:20,cell:({row:n})=>t?f.jsx(Pi,{className:"h-6 w-6"}):f.jsx(ue,{onClick:()=>e(n.original),className:"!h-6 !w-6 !p-1",variant:"ghost",children:f.jsx(Fm,{className:"h-3.5 w-3.5"})})},{accessorKey:"name",header:"Name",cell:({row:n})=>f.jsx(Dn,{isLoading:t,children:n.getValue("name")})},{accessorFn:n=>{var r;return(r=n.json_schema)==null?void 0:r.description},accessorKey:"docstring",header:"Docstring",cell:({row:n})=>f.jsx(Dn,{isLoading:t,children:f.jsx(ZA,{text:n.getValue("docstring")})})},{accessorFn:n=>{var r,a;return(a=(r=n.tags)==null?void 0:r[0])==null?void 0:a.replace("memgpt-","")},accessorKey:"library",header:"Library",cell:({row:n})=>{const r=n.getValue("library");return f.jsx(Dn,{isLoading:t,children:r==="base"?f.jsx(h9,{className:"-ml-2",variant:"secondary",children:r}):f.jsx("span",{className:"text-xs",children:r})})}},{accessorKey:"last_edited",header:"Last Edited",cell:({row:n})=>f.jsx(Dn,{isLoading:t,children:n.getValue("last_edited")??"Never"})}],A_e=({onToolEdit:e,nameFilter:t,className:n})=>{const{data:r,isError:a,isLoading:o}=Xm(),i=(r??[]).filter(s=>s.name.includes(t));return f.jsx("div",{className:n,children:f.jsx(uf,{columns:__e(e,o),isLoading:o,error:a?"Error loading tools":void 0,data:i,renderPagination:s=>f.jsx(df,{className:"mt-4",table:s})})})},T_e=()=>{const[e,t]=p.useState(""),[n]=Ih(e,300),[r,a]=p.useState(!1),[o,i]=p.useState(null),[s,l]=p.useState(!1),c=u=>{i(u),l(!0)};return f.jsxs(Fs,{children:[f.jsxs("div",{className:"flex items-center justify-between bg-background/95 px-4 pb-3 pt-2.5 backdrop-blur supports-[backdrop-filter]:bg-background/60",children:[f.jsx(C_e,{value:e,onValueChange:t}),f.jsxs(ue,{onClick:()=>a(!0),size:"sm",children:[f.jsx(ya,{className:"mr-2 h-4 w-4"}),"Create Tool"]})]}),f.jsx(A_e,{className:"mx-4",onToolEdit:c,nameFilter:n}),f.jsx(w_e,{open:r,onOpenChange:u=>a(u)}),f.jsx(k_e,{tool:o,open:s,onOpenChange:u=>l(u)})]})},R_e={path:"tools",element:f.jsx(T_e,{})},N_e=Xe({name:Ce().min(1,{message:"Name must be at least 1 character."}).max(30,{message:"Name must not be longer than 30 characters."}),text:Ce().max(2e3).min(0)}),I_e={name:"",text:""};function O_e({closeDialog:e}){const t=Bt(),n=C6(),{toast:r}=An(),a=2e3,o=N_e.extend({text:Ce().max(a).min(0)}),i=bn({resolver:yn(o),defaultValues:I_e,mode:"onChange"}),s=l=>{n.mutate({requestBody:{value:l.text||"",label:fr,name:l.name||""}},{onSuccess:()=>{e(),t.invalidateQueries({queryKey:lf({label:fr})}),r({title:"Human created successfully!",duration:5e3})},onError:c=>{let u="Error creating human";const d=`${u}: Unspecified error.`;try{r({title:"Error updating human",duration:5e3})}catch{u=d}r({title:u,duration:5e3})}})};return f.jsx(vn,{...i,children:f.jsxs("form",{onSubmit:i.handleSubmit(s,l=>console.log(l)),className:"space-y-8",children:[f.jsx(ut,{control:i.control,name:"name",render:({field:l})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Name"}),f.jsx(pt,{children:f.jsx(_n,{...l})}),f.jsx(Mt,{children:"This is your humans display name. It can be a real name or a pseudonym."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:i.control,name:"text",render:({field:l})=>{var c;return f.jsxs(ot,{children:[f.jsx(pt,{children:f.jsx(Ai,{placeholder:"Describe your human here",...l,charCount:(c=l.value)==null?void 0:c.length,limit:a})}),f.jsxs(Mt,{children:["You can use no more than ",a," characters."]}),f.jsx(lt,{})]})}}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Create Persona"}),n.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Creating Persona..."})]})]})]})})}const D_e=({open:e,onOpenChange:t})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Create Human"}),f.jsx(dn,{children:"Add a new human here. Click create when you're done."})]}),f.jsx(O_e,{closeDialog:()=>t(!1)})]})}),L_e=Xe({text:Ce().max(2e3).min(0)});function M_e({human:e,closeDialog:t}){const n=y_(),r=Bt(),{toast:a}=An(),o=2e3,i=L_e.extend({text:Ce().max(o).min(0)}),s={text:e.value||""},l=bn({resolver:yn(i),defaultValues:s,mode:"onChange"}),c=u=>{n.mutate({blockId:e.id||"",requestBody:{id:e.id||"",value:u.text||""}},{onSuccess:()=>{t(),r.invalidateQueries({queryKey:lf({label:fr})}),a({title:"Human updated successfully!",duration:5e3})},onError:d=>{a({title:"Error updating human",duration:5e3})}})};return f.jsx(vn,{...l,children:f.jsxs("form",{onSubmit:l.handleSubmit(c,u=>console.log(u)),className:"space-y-8",children:[f.jsx(ut,{control:l.control,name:"text",render:({field:u})=>{var d;return f.jsxs(ot,{children:[f.jsx(pt,{children:f.jsx(Ai,{placeholder:"Describe your human here",...u,charCount:(d=u.value)==null?void 0:d.length,limit:o})}),f.jsxs(Mt,{children:["You can use no more than ",o," characters."]}),f.jsx(lt,{})]})}}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Update Persona"}),n.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Updating Human..."})]})]})]})})}const P_e=({human:e,open:t,onOpenChange:n})=>f.jsx(Kt,{open:t,onOpenChange:n,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsxs($t,{children:["Edit ",(e==null?void 0:e.name)??"Human"]}),f.jsx(dn,{children:"Edit existing human here. Click create when you're done."})]}),e?f.jsx(M_e,{human:e,closeDialog:()=>n(!1)}):f.jsx("p",{children:"No Human...."})]})}),$_e=({value:e,onValueChange:t})=>f.jsx("form",{children:f.jsxs("div",{className:"relative",children:[f.jsx(Ms,{className:"pointer-events-none absolute left-[12px] top-3 h-4 w-4 text-muted-foreground"}),f.jsx(_n,{placeholder:"Search user",value:e,onChange:n=>t(n.target.value),className:"w-52 pl-8 lg:w-80"})]})}),F_e=(e,t)=>[{accessorKey:"edit",header:"",size:20,cell:({row:n})=>t?f.jsx(Pi,{className:"h-6 w-6"}):f.jsx(ue,{onClick:()=>e(n.original),className:"!h-6 !w-6 !p-1",variant:"ghost",children:f.jsx(Fm,{className:"h-3.5 w-3.5"})})},{accessorKey:"name",header:"Name",cell:({row:n})=>f.jsx(Dn,{isLoading:t,children:n.getValue("name")})},{accessorKey:"value",header:"Text",cell:({row:n})=>f.jsx(Dn,{isLoading:t,children:f.jsx(ZA,{text:n.getValue("value")})})}],j_e=({onHumanEdit:e,nameFilter:t,className:n})=>{const{data:r,isError:a,isLoading:o}=Ng({label:fr}),i=(r??[]).filter(s=>{var l;return(l=s.name)==null?void 0:l.includes(t)});return f.jsx("div",{className:n,children:f.jsx(uf,{isLoading:o,error:a?"Error loading humans":void 0,columns:F_e(e,o),data:i,renderPagination:s=>f.jsx(df,{className:"mt-4",table:s})})})},z_e=()=>{const[e,t]=p.useState(""),[n]=Ih(e,300),[r,a]=p.useState(!1),[o,i]=p.useState(null),[s,l]=p.useState(!1),c=u=>{i(u),l(!0)};return f.jsxs(Fs,{children:[f.jsxs("div",{className:"flex items-center justify-between bg-background/95 px-4 pb-3 pt-2.5 backdrop-blur supports-[backdrop-filter]:bg-background/60",children:[f.jsx($_e,{value:e,onValueChange:t}),f.jsxs(ue,{onClick:()=>a(!0),size:"sm",children:[f.jsx(ya,{className:"mr-2 h-4 w-4"}),"Create Human"]})]}),f.jsx(j_e,{onHumanEdit:c,nameFilter:n,className:"mx-4"}),f.jsx(D_e,{open:r,onOpenChange:u=>a(u)}),f.jsx(P_e,{human:o,open:s,onOpenChange:u=>l(u)})]})},U_e={path:"human-templates",element:f.jsx(z_e,{})},{createElement:Ac,createContext:B_e,createRef:yTe,forwardRef:_U,useCallback:hr,useContext:AU,useEffect:ys,useImperativeHandle:TU,useLayoutEffect:H_e,useMemo:V_e,useRef:ar,useState:Zu}=Kd,Z3=Kd["useId".toString()],q_e=H_e,Dh=B_e(null);Dh.displayName="PanelGroupContext";const vs=q_e,G_e=typeof Z3=="function"?Z3:()=>null;let W_e=0;function XA(e=null){const t=G_e(),n=ar(e||t||null);return n.current===null&&(n.current=""+W_e++),e??n.current}function RU({children:e,className:t="",collapsedSize:n,collapsible:r,defaultSize:a,forwardedRef:o,id:i,maxSize:s,minSize:l,onCollapse:c,onExpand:u,onResize:d,order:g,style:m,tagName:b="div",...y}){const w=AU(Dh);if(w===null)throw Error("Panel components must be rendered within a PanelGroup container");const{collapsePanel:v,expandPanel:h,getPanelSize:S,getPanelStyle:E,groupId:k,isPanelCollapsed:x,reevaluatePanelConstraints:C,registerPanel:_,resizePanel:R,unregisterPanel:T}=w,L=XA(i),D=ar({callbacks:{onCollapse:c,onExpand:u,onResize:d},constraints:{collapsedSize:n,collapsible:r,defaultSize:a,maxSize:s,minSize:l},id:L,idIsFromProps:i!==void 0,order:g});ar({didLogMissingDefaultSizeWarning:!1}),vs(()=>{const{callbacks:z,constraints:M}=D.current,U={...M};D.current.id=L,D.current.idIsFromProps=i!==void 0,D.current.order=g,z.onCollapse=c,z.onExpand=u,z.onResize=d,M.collapsedSize=n,M.collapsible=r,M.defaultSize=a,M.maxSize=s,M.minSize=l,(U.collapsedSize!==M.collapsedSize||U.collapsible!==M.collapsible||U.maxSize!==M.maxSize||U.minSize!==M.minSize)&&C(D.current,U)}),vs(()=>{const z=D.current;return _(z),()=>{T(z)}},[g,L,_,T]),TU(o,()=>({collapse:()=>{v(D.current)},expand:()=>{h(D.current)},getId(){return L},getSize(){return S(D.current)},isCollapsed(){return x(D.current)},isExpanded(){return!x(D.current)},resize:z=>{R(D.current,z)}}),[v,h,S,x,L,R]);const H=E(D.current,a);return Ac(b,{...y,children:e,className:t,id:i,style:{...H,...m},"data-panel":"","data-panel-collapsible":r||void 0,"data-panel-group-id":k,"data-panel-id":L,"data-panel-size":parseFloat(""+H.flexGrow).toFixed(1)})}const NU=_U((e,t)=>Ac(RU,{...e,forwardedRef:t}));RU.displayName="Panel";NU.displayName="forwardRef(Panel)";let Gk=null,is=null;function K_e(e,t){if(t){const n=(t&MU)!==0,r=(t&PU)!==0,a=(t&$U)!==0,o=(t&FU)!==0;if(n)return a?"se-resize":o?"ne-resize":"e-resize";if(r)return a?"sw-resize":o?"nw-resize":"w-resize";if(a)return"s-resize";if(o)return"n-resize"}switch(e){case"horizontal":return"ew-resize";case"intersection":return"move";case"vertical":return"ns-resize"}}function Y_e(){is!==null&&(document.head.removeChild(is),Gk=null,is=null)}function _x(e,t){const n=K_e(e,t);Gk!==n&&(Gk=n,is===null&&(is=document.createElement("style"),document.head.appendChild(is)),is.innerHTML=`*{cursor: ${n}!important;}`)}function IU(e){return e.type==="keydown"}function OU(e){return e.type.startsWith("mouse")}function DU(e){return e.type.startsWith("touch")}function Lh(e){if(OU(e))return{x:e.pageX,y:e.pageY};if(DU(e)){const t=e.touches[0];if(t&&t.pageX&&t.pageY)return{x:t.pageX,y:t.pageY}}return{x:1/0,y:1/0}}function Z_e(){if(typeof matchMedia=="function")return matchMedia("(pointer:coarse)").matches?"coarse":"fine"}function X_e(e,t,n){return n?e.xt.x&&e.yt.y:e.x<=t.x+t.width&&e.x+e.width>=t.x&&e.y<=t.y+t.height&&e.y+e.height>=t.y}function Q_e(e,t){if(e===t)throw new Error("Cannot compare node with itself");const n={a:J3(e),b:J3(t)};let r;for(;n.a.at(-1)===n.b.at(-1);)e=n.a.pop(),t=n.b.pop(),r=e;Ye(r);const a={a:Q3(X3(n.a)),b:Q3(X3(n.b))};if(a.a===a.b){const o=r.childNodes,i={a:n.a.at(-1),b:n.b.at(-1)};let s=o.length;for(;s--;){const l=o[s];if(l===i.a)return 1;if(l===i.b)return-1}}return Math.sign(a.a-a.b)}const J_e=/\b(?:position|zIndex|opacity|transform|webkitTransform|mixBlendMode|filter|webkitFilter|isolation)\b/;function eAe(e){const t=getComputedStyle(LU(e)).display;return t==="flex"||t==="inline-flex"}function tAe(e){const t=getComputedStyle(e);return!!(t.position==="fixed"||t.zIndex!=="auto"&&(t.position!=="static"||eAe(e))||+t.opacity<1||"transform"in t&&t.transform!=="none"||"webkitTransform"in t&&t.webkitTransform!=="none"||"mixBlendMode"in t&&t.mixBlendMode!=="normal"||"filter"in t&&t.filter!=="none"||"webkitFilter"in t&&t.webkitFilter!=="none"||"isolation"in t&&t.isolation==="isolate"||J_e.test(t.willChange)||t.webkitOverflowScrolling==="touch")}function X3(e){let t=e.length;for(;t--;){const n=e[t];if(Ye(n),tAe(n))return n}return null}function Q3(e){return e&&Number(getComputedStyle(e).zIndex)||0}function J3(e){const t=[];for(;e;)t.push(e),e=LU(e);return t}function LU(e){var t;return((t=e.parentNode)===null||t===void 0?void 0:t.host)||e.parentNode}const MU=1,PU=2,$U=4,FU=8,nAe=Z_e()==="coarse";let Ri=[],Mh=!1,Yo=new Map,Ph=new Map;const Id=new Set;function rAe(e,t,n,r,a){var o;const{ownerDocument:i}=t,s={direction:n,element:t,hitAreaMargins:r,setResizeHandlerState:a},l=(o=Yo.get(i))!==null&&o!==void 0?o:0;return Yo.set(i,l+1),Id.add(s),um(),function(){var u;Ph.delete(e),Id.delete(s);const d=(u=Yo.get(i))!==null&&u!==void 0?u:1;Yo.set(i,d-1),um(),d===1&&Yo.delete(i)}}function xp(e){const{target:t}=e,{x:n,y:r}=Lh(e);Mh=!0,QA({target:t,x:n,y:r}),um(),Ri.length>0&&(JA("down",e),e.preventDefault())}function jo(e){const{x:t,y:n}=Lh(e);if(!Mh){const{target:r}=e;QA({target:r,x:t,y:n})}JA("move",e),jU(),Ri.length>0&&e.preventDefault()}function zo(e){const{target:t}=e,{x:n,y:r}=Lh(e);Ph.clear(),Mh=!1,Ri.length>0&&e.preventDefault(),JA("up",e),QA({target:t,x:n,y:r}),jU(),um()}function QA({target:e,x:t,y:n}){Ri.splice(0);let r=null;e instanceof HTMLElement&&(r=e),Id.forEach(a=>{const{element:o,hitAreaMargins:i}=a,s=o.getBoundingClientRect(),{bottom:l,left:c,right:u,top:d}=s,g=nAe?i.coarse:i.fine;if(t>=c-g&&t<=u+g&&n>=d-g&&n<=l+g){if(r!==null&&o!==r&&!o.contains(r)&&!r.contains(o)&&Q_e(r,o)>0){let b=r,y=!1;for(;b&&!b.contains(o);){if(X_e(b.getBoundingClientRect(),s,!0)){y=!0;break}b=b.parentElement}if(y)return}Ri.push(a)}})}function Ax(e,t){Ph.set(e,t)}function jU(){let e=!1,t=!1;Ri.forEach(r=>{const{direction:a}=r;a==="horizontal"?e=!0:t=!0});let n=0;Ph.forEach(r=>{n|=r}),e&&t?_x("intersection",n):e?_x("horizontal",n):t?_x("vertical",n):Y_e()}function um(){Yo.forEach((e,t)=>{const{body:n}=t;n.removeEventListener("contextmenu",zo),n.removeEventListener("mousedown",xp),n.removeEventListener("mouseleave",jo),n.removeEventListener("mousemove",jo),n.removeEventListener("touchmove",jo),n.removeEventListener("touchstart",xp)}),window.removeEventListener("mouseup",zo),window.removeEventListener("touchcancel",zo),window.removeEventListener("touchend",zo),Id.size>0&&(Mh?(Ri.length>0&&Yo.forEach((e,t)=>{const{body:n}=t;e>0&&(n.addEventListener("contextmenu",zo),n.addEventListener("mouseleave",jo),n.addEventListener("mousemove",jo),n.addEventListener("touchmove",jo,{passive:!1}))}),window.addEventListener("mouseup",zo),window.addEventListener("touchcancel",zo),window.addEventListener("touchend",zo)):Yo.forEach((e,t)=>{const{body:n}=t;e>0&&(n.addEventListener("mousedown",xp),n.addEventListener("mousemove",jo),n.addEventListener("touchmove",jo,{passive:!1}),n.addEventListener("touchstart",xp))}))}function JA(e,t){Id.forEach(n=>{const{setResizeHandlerState:r}=n,a=Ri.includes(n);r(e,a,t)})}function Ye(e,t="Assertion failed!"){if(!e)throw console.error(t),Error(t)}const zU=10;function Od(e,t,n=zU){e=parseFloat(e.toFixed(n)),t=parseFloat(t.toFixed(n));const r=e-t;return r===0?0:r>0?1:-1}function vr(e,t,n){return Od(e,t,n)===0}function Dl({panelConstraints:e,panelIndex:t,size:n}){const r=e[t];Ye(r!=null);let{collapsedSize:a=0,collapsible:o,maxSize:i=100,minSize:s=0}=r;if(Od(n,s)<0)if(o){const l=(a+s)/2;Od(n,l)<0?n=a:n=s}else n=s;return n=Math.min(i,n),n=parseFloat(n.toFixed(zU)),n}function Ru({delta:e,layout:t,panelConstraints:n,pivotIndices:r,trigger:a}){if(vr(e,0))return t;const o=[...t],[i,s]=r;Ye(i!=null),Ye(s!=null);let l=0;if(a==="keyboard"){{const u=e<0?s:i,d=n[u];if(Ye(d),d.collapsible){const g=t[u];Ye(g!=null);const m=n[u];Ye(m);const{collapsedSize:b=0,minSize:y=0}=m;if(vr(g,b)){const w=y-g;Od(w,Math.abs(e))>0&&(e=e<0?0-w:w)}}}{const u=e<0?i:s,d=n[u];Ye(d);const{collapsible:g}=d;if(g){const m=t[u];Ye(m!=null);const b=n[u];Ye(b);const{collapsedSize:y=0,minSize:w=0}=b;if(vr(m,w)){const v=m-y;Od(v,Math.abs(e))>0&&(e=e<0?0-v:v)}}}}{const u=e<0?1:-1;let d=e<0?s:i,g=0;for(;;){const b=t[d];Ye(b!=null);const w=Dl({panelConstraints:n,panelIndex:d,size:100})-b;if(g+=w,d+=u,d<0||d>=n.length)break}const m=Math.min(Math.abs(e),Math.abs(g));e=e<0?0-m:m}{let d=e<0?i:s;for(;d>=0&&d=0))break;e<0?d--:d++}}if(vr(l,0))return t;{const u=e<0?s:i,d=t[u];Ye(d!=null);const g=d+l,m=Dl({panelConstraints:n,panelIndex:u,size:g});if(o[u]=m,!vr(m,g)){let b=g-m,w=e<0?s:i;for(;w>=0&&w0?w--:w++}}}const c=o.reduce((u,d)=>d+u,0);return vr(c,100)?o:t}function aAe({layout:e,panelsArray:t,pivotIndices:n}){let r=0,a=100,o=0,i=0;const s=n[0];Ye(s!=null),t.forEach((d,g)=>{const{constraints:m}=d,{maxSize:b=100,minSize:y=0}=m;g===s?(r=y,a=b):(o+=y,i+=b)});const l=Math.min(a,100-o),c=Math.max(r,100-i),u=e[s];return{valueMax:l,valueMin:c,valueNow:u}}function Dd(e,t=document){return Array.from(t.querySelectorAll(`[data-panel-resize-handle-id][data-panel-group-id="${e}"]`))}function UU(e,t,n=document){const a=Dd(e,n).findIndex(o=>o.getAttribute("data-panel-resize-handle-id")===t);return a??null}function BU(e,t,n){const r=UU(e,t,n);return r!=null?[r,r+1]:[-1,-1]}function HU(e,t=document){var n;if(t instanceof HTMLElement&&(t==null||(n=t.dataset)===null||n===void 0?void 0:n.panelGroupId)==e)return t;const r=t.querySelector(`[data-panel-group][data-panel-group-id="${e}"]`);return r||null}function $h(e,t=document){const n=t.querySelector(`[data-panel-resize-handle-id="${e}"]`);return n||null}function oAe(e,t,n,r=document){var a,o,i,s;const l=$h(t,r),c=Dd(e,r),u=l?c.indexOf(l):-1,d=(a=(o=n[u])===null||o===void 0?void 0:o.id)!==null&&a!==void 0?a:null,g=(i=(s=n[u+1])===null||s===void 0?void 0:s.id)!==null&&i!==void 0?i:null;return[d,g]}function iAe({committedValuesRef:e,eagerValuesRef:t,groupId:n,layout:r,panelDataArray:a,panelGroupElement:o,setLayout:i}){ar({didWarnAboutMissingResizeHandle:!1}),vs(()=>{if(!o)return;const s=Dd(n,o);for(let l=0;l{s.forEach((l,c)=>{l.removeAttribute("aria-controls"),l.removeAttribute("aria-valuemax"),l.removeAttribute("aria-valuemin"),l.removeAttribute("aria-valuenow")})}},[n,r,a,o]),ys(()=>{if(!o)return;const s=t.current;Ye(s);const{panelDataArray:l}=s,c=HU(n,o);Ye(c!=null,`No group found for id "${n}"`);const u=Dd(n,o);Ye(u);const d=u.map(g=>{const m=g.getAttribute("data-panel-resize-handle-id");Ye(m);const[b,y]=oAe(n,m,l,o);if(b==null||y==null)return()=>{};const w=v=>{if(!v.defaultPrevented)switch(v.key){case"Enter":{v.preventDefault();const h=l.findIndex(S=>S.id===b);if(h>=0){const S=l[h];Ye(S);const E=r[h],{collapsedSize:k=0,collapsible:x,minSize:C=0}=S.constraints;if(E!=null&&x){const _=Ru({delta:vr(E,k)?C-k:k-E,layout:r,panelConstraints:l.map(R=>R.constraints),pivotIndices:BU(n,m,o),trigger:"keyboard"});r!==_&&i(_)}}break}}};return g.addEventListener("keydown",w),()=>{g.removeEventListener("keydown",w)}});return()=>{d.forEach(g=>g())}},[o,e,t,n,r,a,i])}function eP(e,t){if(e.length!==t.length)return!1;for(let n=0;no.constraints);let r=0,a=100;for(let o=0;o{const o=e[a];Ye(o);const{callbacks:i,constraints:s,id:l}=o,{collapsedSize:c=0,collapsible:u}=s,d=n[l];if(d==null||r!==d){n[l]=r;const{onCollapse:g,onExpand:m,onResize:b}=i;b&&b(r,d),u&&(g||m)&&(m&&(d==null||d===c)&&r!==c&&m(),g&&(d==null||d!==c)&&r===c&&g())}})}function kp(e,t){if(e.length!==t.length)return!1;for(let n=0;n{n!==null&&clearTimeout(n),n=setTimeout(()=>{e(...a)},t)}}function tP(e){try{if(typeof localStorage<"u")e.getItem=t=>localStorage.getItem(t),e.setItem=(t,n)=>{localStorage.setItem(t,n)};else throw new Error("localStorage not supported in this environment")}catch(t){console.error(t),e.getItem=()=>null,e.setItem=()=>{}}}function qU(e){return`react-resizable-panels:${e}`}function GU(e){return e.map(t=>{const{constraints:n,id:r,idIsFromProps:a,order:o}=t;return a?r:o?`${o}:${JSON.stringify(n)}`:JSON.stringify(n)}).sort((t,n)=>t.localeCompare(n)).join(",")}function WU(e,t){try{const n=qU(e),r=t.getItem(n);if(r){const a=JSON.parse(r);if(typeof a=="object"&&a!=null)return a}}catch{}return null}function fAe(e,t,n){var r,a;const o=(r=WU(e,n))!==null&&r!==void 0?r:{},i=GU(t);return(a=o[i])!==null&&a!==void 0?a:null}function pAe(e,t,n,r,a){var o;const i=qU(e),s=GU(t),l=(o=WU(e,a))!==null&&o!==void 0?o:{};l[s]={expandToSizes:Object.fromEntries(n.entries()),layout:r};try{a.setItem(i,JSON.stringify(l))}catch(c){console.error(c)}}function nP({layout:e,panelConstraints:t}){const n=[...e],r=n.reduce((o,i)=>o+i,0);if(n.length!==t.length)throw Error(`Invalid ${t.length} panel layout: ${n.map(o=>`${o}%`).join(", ")}`);if(!vr(r,100))for(let o=0;o(tP(Nu),Nu.getItem(e)),setItem:(e,t)=>{tP(Nu),Nu.setItem(e,t)}},rP={};function KU({autoSaveId:e=null,children:t,className:n="",direction:r,forwardedRef:a,id:o=null,onLayout:i=null,keyboardResizeBy:s=null,storage:l=Nu,style:c,tagName:u="div",...d}){const g=XA(o),m=ar(null),[b,y]=Zu(null),[w,v]=Zu([]),h=ar({}),S=ar(new Map),E=ar(0),k=ar({autoSaveId:e,direction:r,dragState:b,id:g,keyboardResizeBy:s,onLayout:i,storage:l}),x=ar({layout:w,panelDataArray:[],panelDataArrayChanged:!1});ar({didLogIdAndOrderWarning:!1,didLogPanelConstraintsWarning:!1,prevPanelIds:[]}),TU(a,()=>({getId:()=>k.current.id,getLayout:()=>{const{layout:P}=x.current;return P},setLayout:P=>{const{onLayout:N}=k.current,{layout:K,panelDataArray:ae}=x.current,ne=nP({layout:P,panelConstraints:ae.map(Q=>Q.constraints)});eP(K,ne)||(v(ne),x.current.layout=ne,N&&N(ne),ll(ae,ne,h.current))}}),[]),vs(()=>{k.current.autoSaveId=e,k.current.direction=r,k.current.dragState=b,k.current.id=g,k.current.onLayout=i,k.current.storage=l}),iAe({committedValuesRef:k,eagerValuesRef:x,groupId:g,layout:w,panelDataArray:x.current.panelDataArray,setLayout:v,panelGroupElement:m.current}),ys(()=>{const{panelDataArray:P}=x.current;if(e){if(w.length===0||w.length!==P.length)return;let N=rP[e];N==null&&(N=dAe(pAe,gAe),rP[e]=N);const K=[...P],ae=new Map(S.current);N(e,K,ae,w,l)}},[e,w,l]),ys(()=>{});const C=hr(P=>{const{onLayout:N}=k.current,{layout:K,panelDataArray:ae}=x.current;if(P.constraints.collapsible){const ne=ae.map(re=>re.constraints),{collapsedSize:Q=0,panelSize:pe,pivotIndices:he}=qi(ae,P,K);if(Ye(pe!=null),pe!==Q){S.current.set(P.id,pe);const Ee=hl(ae,P)===ae.length-1?pe-Q:Q-pe,ke=Ru({delta:Ee,layout:K,panelConstraints:ne,pivotIndices:he,trigger:"imperative-api"});kp(K,ke)||(v(ke),x.current.layout=ke,N&&N(ke),ll(ae,ke,h.current))}}},[]),_=hr(P=>{const{onLayout:N}=k.current,{layout:K,panelDataArray:ae}=x.current;if(P.constraints.collapsible){const ne=ae.map(Ee=>Ee.constraints),{collapsedSize:Q=0,panelSize:pe,minSize:he=0,pivotIndices:re}=qi(ae,P,K);if(pe===Q){const Ee=S.current.get(P.id),ke=Ee!=null&&Ee>=he?Ee:he,Vt=hl(ae,P)===ae.length-1?pe-ke:ke-pe,mt=Ru({delta:Vt,layout:K,panelConstraints:ne,pivotIndices:re,trigger:"imperative-api"});kp(K,mt)||(v(mt),x.current.layout=mt,N&&N(mt),ll(ae,mt,h.current))}}},[]),R=hr(P=>{const{layout:N,panelDataArray:K}=x.current,{panelSize:ae}=qi(K,P,N);return Ye(ae!=null),ae},[]),T=hr((P,N)=>{const{panelDataArray:K}=x.current,ae=hl(K,P);return uAe({defaultSize:N,dragState:b,layout:w,panelData:K,panelIndex:ae})},[b,w]),L=hr(P=>{const{layout:N,panelDataArray:K}=x.current,{collapsedSize:ae=0,collapsible:ne,panelSize:Q}=qi(K,P,N);return ne===!0&&Q===ae},[]),D=hr(P=>{const{layout:N,panelDataArray:K}=x.current,{collapsedSize:ae=0,collapsible:ne,panelSize:Q}=qi(K,P,N);return Ye(Q!=null),!ne||Q>ae},[]),H=hr(P=>{const{panelDataArray:N}=x.current;N.push(P),N.sort((K,ae)=>{const ne=K.order,Q=ae.order;return ne==null&&Q==null?0:ne==null?-1:Q==null?1:ne-Q}),x.current.panelDataArrayChanged=!0},[]);vs(()=>{if(x.current.panelDataArrayChanged){x.current.panelDataArrayChanged=!1;const{autoSaveId:P,onLayout:N,storage:K}=k.current,{layout:ae,panelDataArray:ne}=x.current;let Q=null;if(P){const he=fAe(P,ne,K);he&&(S.current=new Map(Object.entries(he.expandToSizes)),Q=he.layout)}Q==null&&(Q=cAe({panelDataArray:ne}));const pe=nP({layout:Q,panelConstraints:ne.map(he=>he.constraints)});eP(ae,pe)||(v(pe),x.current.layout=pe,N&&N(pe),ll(ne,pe,h.current))}}),vs(()=>{const P=x.current;return()=>{P.layout=[]}},[]);const z=hr(P=>function(K){K.preventDefault();const ae=m.current;if(!ae)return()=>null;const{direction:ne,dragState:Q,id:pe,keyboardResizeBy:he,onLayout:re}=k.current,{layout:Ee,panelDataArray:ke}=x.current,{initialLayout:We}=Q??{},Vt=BU(pe,P,ae);let mt=lAe(K,P,ne,Q,he,ae);if(mt===0)return;const Hn=ne==="horizontal";document.dir==="rtl"&&Hn&&(mt=-mt);const F=ke.map(ye=>ye.constraints),q=Ru({delta:mt,layout:We??Ee,panelConstraints:F,pivotIndices:Vt,trigger:IU(K)?"keyboard":"mouse-or-touch"}),Y=!kp(Ee,q);(OU(K)||DU(K))&&E.current!=mt&&(E.current=mt,Y?Ax(P,0):Hn?Ax(P,mt<0?MU:PU):Ax(P,mt<0?$U:FU)),Y&&(v(q),x.current.layout=q,re&&re(q),ll(ke,q,h.current))},[]),M=hr((P,N)=>{const{onLayout:K}=k.current,{layout:ae,panelDataArray:ne}=x.current,Q=ne.map(We=>We.constraints),{panelSize:pe,pivotIndices:he}=qi(ne,P,ae);Ye(pe!=null);const Ee=hl(ne,P)===ne.length-1?pe-N:N-pe,ke=Ru({delta:Ee,layout:ae,panelConstraints:Q,pivotIndices:he,trigger:"imperative-api"});kp(ae,ke)||(v(ke),x.current.layout=ke,K&&K(ke),ll(ne,ke,h.current))},[]),U=hr((P,N)=>{const{layout:K,panelDataArray:ae}=x.current,{collapsedSize:ne=0,collapsible:Q}=N,{collapsedSize:pe=0,collapsible:he,maxSize:re=100,minSize:Ee=0}=P.constraints,{panelSize:ke}=qi(ae,P,K);Ye(ke!=null),Q&&he&&ke===ne?ne!==pe&&M(P,pe):kere&&M(P,re)},[M]),X=hr((P,N)=>{const{direction:K}=k.current,{layout:ae}=x.current;if(!m.current)return;const ne=$h(P,m.current);Ye(ne);const Q=VU(K,N);y({dragHandleId:P,dragHandleRect:ne.getBoundingClientRect(),initialCursorPosition:Q,initialLayout:ae})},[]),j=hr(()=>{y(null)},[]),O=hr(P=>{const{panelDataArray:N}=x.current,K=hl(N,P);K>=0&&(N.splice(K,1),delete h.current[P.id],x.current.panelDataArrayChanged=!0)},[]),A=V_e(()=>({collapsePanel:C,direction:r,dragState:b,expandPanel:_,getPanelSize:R,getPanelStyle:T,groupId:g,isPanelCollapsed:L,isPanelExpanded:D,reevaluatePanelConstraints:U,registerPanel:H,registerResizeHandle:z,resizePanel:M,startDragging:X,stopDragging:j,unregisterPanel:O,panelGroupElement:m.current}),[C,b,r,_,R,T,g,L,D,U,H,z,M,X,j,O]),V={display:"flex",flexDirection:r==="horizontal"?"row":"column",height:"100%",overflow:"hidden",width:"100%"};return Ac(Dh.Provider,{value:A},Ac(u,{...d,children:t,className:n,id:o,ref:m,style:{...V,...c},"data-panel-group":"","data-panel-group-direction":r,"data-panel-group-id":g}))}const YU=_U((e,t)=>Ac(KU,{...e,forwardedRef:t}));KU.displayName="PanelGroup";YU.displayName="forwardRef(PanelGroup)";function hl(e,t){return e.findIndex(n=>n===t||n.id===t.id)}function qi(e,t,n){const r=hl(e,t),o=r===e.length-1?[r-1,r]:[r,r+1],i=n[r];return{...t.constraints,panelSize:i,pivotIndices:o}}function mAe({disabled:e,handleId:t,resizeHandler:n,panelGroupElement:r}){ys(()=>{if(e||n==null||r==null)return;const a=$h(t,r);if(a==null)return;const o=i=>{if(!i.defaultPrevented)switch(i.key){case"ArrowDown":case"ArrowLeft":case"ArrowRight":case"ArrowUp":case"End":case"Home":{i.preventDefault(),n(i);break}case"F6":{i.preventDefault();const s=a.getAttribute("data-panel-group-id");Ye(s);const l=Dd(s,r),c=UU(s,t,r);Ye(c!==null);const u=i.shiftKey?c>0?c-1:l.length-1:c+1{a.removeEventListener("keydown",o)}},[r,e,t,n])}function ZU({children:e=null,className:t="",disabled:n=!1,hitAreaMargins:r,id:a,onDragging:o,style:i={},tabIndex:s=0,tagName:l="div",...c}){const u=ar(null),d=ar({onDragging:o});ys(()=>{d.current.onDragging=o});const g=AU(Dh);if(g===null)throw Error("PanelResizeHandle components must be rendered within a PanelGroup container");const{direction:m,groupId:b,registerResizeHandle:y,startDragging:w,stopDragging:v,panelGroupElement:h}=g,S=XA(a),[E,k]=Zu("inactive"),[x,C]=Zu(!1),[_,R]=Zu(null),T=ar({state:E});return vs(()=>{T.current.state=E}),ys(()=>{if(n)R(null);else{const D=y(S);R(()=>D)}},[n,S,y]),ys(()=>{var D,H;if(n||_==null)return;const z=u.current;Ye(z);const M=(U,X,j)=>{if(X)switch(U){case"down":{k("drag"),w(S,j);const{onDragging:O}=d.current;O&&O(!0);break}case"move":{const{state:O}=T.current;O!=="drag"&&k("hover"),_(j);break}case"up":{k("hover"),v();const{onDragging:O}=d.current;O&&O(!1);break}}else k("inactive")};return rAe(S,z,m,{coarse:(D=r==null?void 0:r.coarse)!==null&&D!==void 0?D:15,fine:(H=r==null?void 0:r.fine)!==null&&H!==void 0?H:5},M)},[m,n,r,y,S,_,w,v]),mAe({disabled:n,handleId:S,resizeHandler:_,panelGroupElement:h}),Ac(l,{...c,children:e,className:t,id:a,onBlur:()=>C(!1),onFocus:()=>C(!0),ref:u,role:"separator",style:{...{touchAction:"none",userSelect:"none"},...i},tabIndex:s,"data-panel-group-direction":m,"data-panel-group-id":b,"data-resize-handle":"","data-resize-handle-active":E==="drag"?"pointer":x?"keyboard":void 0,"data-resize-handle-state":E,"data-panel-resize-handle-enabled":!n,"data-panel-resize-handle-id":S})}ZU.displayName="PanelResizeHandle";const hAe=({className:e,...t})=>f.jsx(YU,{className:ee("flex h-full w-full data-[panel-group-direction=vertical]:flex-col",e),...t}),aP=NU,bAe=({withHandle:e,className:t,...n})=>f.jsx(ZU,{className:ee("relative flex w-px items-center justify-center bg-border after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:-translate-y-1/2 data-[panel-group-direction=vertical]:after:translate-x-0 [&[data-panel-group-direction=vertical]>div]:rotate-90",t),...n,children:e&&f.jsx("div",{className:"z-10 flex h-4 w-3 items-center justify-center rounded-sm border bg-border",children:f.jsx(Aq,{className:"h-2.5 w-2.5"})})}),[Fh,vTe]=zn("Tooltip",[qa]),eT=qa(),yAe="TooltipProvider",vAe=700,Wk="tooltip.open",[SAe,tT]=Fh(yAe),wAe=e=>{const{__scopeTooltip:t,delayDuration:n=vAe,skipDelayDuration:r=300,disableHoverableContent:a=!1,children:o}=e,[i,s]=p.useState(!0),l=p.useRef(!1),c=p.useRef(0);return p.useEffect(()=>{const u=c.current;return()=>window.clearTimeout(u)},[]),p.createElement(SAe,{scope:t,isOpenDelayed:i,delayDuration:n,onOpen:p.useCallback(()=>{window.clearTimeout(c.current),s(!1)},[]),onClose:p.useCallback(()=>{window.clearTimeout(c.current),c.current=window.setTimeout(()=>s(!0),r)},[r]),isPointerInTransitRef:l,onPointerInTransitChange:p.useCallback(u=>{l.current=u},[]),disableHoverableContent:a},o)},nT="Tooltip",[EAe,jh]=Fh(nT),xAe=e=>{const{__scopeTooltip:t,children:n,open:r,defaultOpen:a=!1,onOpenChange:o,disableHoverableContent:i,delayDuration:s}=e,l=tT(nT,e.__scopeTooltip),c=eT(t),[u,d]=p.useState(null),g=bi(),m=p.useRef(0),b=i??l.disableHoverableContent,y=s??l.delayDuration,w=p.useRef(!1),[v=!1,h]=Fa({prop:r,defaultProp:a,onChange:C=>{C?(l.onOpen(),document.dispatchEvent(new CustomEvent(Wk))):l.onClose(),o==null||o(C)}}),S=p.useMemo(()=>v?w.current?"delayed-open":"instant-open":"closed",[v]),E=p.useCallback(()=>{window.clearTimeout(m.current),w.current=!1,h(!0)},[h]),k=p.useCallback(()=>{window.clearTimeout(m.current),h(!1)},[h]),x=p.useCallback(()=>{window.clearTimeout(m.current),m.current=window.setTimeout(()=>{w.current=!0,h(!0)},y)},[y,h]);return p.useEffect(()=>()=>window.clearTimeout(m.current),[]),p.createElement(rh,c,p.createElement(EAe,{scope:t,contentId:g,open:v,stateAttribute:S,trigger:u,onTriggerChange:d,onTriggerEnter:p.useCallback(()=>{l.isOpenDelayed?x():E()},[l.isOpenDelayed,x,E]),onTriggerLeave:p.useCallback(()=>{b?k():window.clearTimeout(m.current)},[k,b]),onOpen:E,onClose:k,disableHoverableContent:b},n))},oP="TooltipTrigger",kAe=p.forwardRef((e,t)=>{const{__scopeTooltip:n,...r}=e,a=jh(oP,n),o=tT(oP,n),i=eT(n),s=p.useRef(null),l=nt(t,s,a.onTriggerChange),c=p.useRef(!1),u=p.useRef(!1),d=p.useCallback(()=>c.current=!1,[]);return p.useEffect(()=>()=>document.removeEventListener("pointerup",d),[d]),p.createElement(pf,W({asChild:!0},i),p.createElement(ze.button,W({"aria-describedby":a.open?a.contentId:void 0,"data-state":a.stateAttribute},r,{ref:l,onPointerMove:fe(e.onPointerMove,g=>{g.pointerType!=="touch"&&!u.current&&!o.isPointerInTransitRef.current&&(a.onTriggerEnter(),u.current=!0)}),onPointerLeave:fe(e.onPointerLeave,()=>{a.onTriggerLeave(),u.current=!1}),onPointerDown:fe(e.onPointerDown,()=>{c.current=!0,document.addEventListener("pointerup",d,{once:!0})}),onFocus:fe(e.onFocus,()=>{c.current||a.onOpen()}),onBlur:fe(e.onBlur,a.onClose),onClick:fe(e.onClick,a.onClose)})))}),CAe="TooltipPortal",[STe,_Ae]=Fh(CAe,{forceMount:void 0}),Ld="TooltipContent",AAe=p.forwardRef((e,t)=>{const n=_Ae(Ld,e.__scopeTooltip),{forceMount:r=n.forceMount,side:a="top",...o}=e,i=jh(Ld,e.__scopeTooltip);return p.createElement(pr,{present:r||i.open},i.disableHoverableContent?p.createElement(XU,W({side:a},o,{ref:t})):p.createElement(TAe,W({side:a},o,{ref:t})))}),TAe=p.forwardRef((e,t)=>{const n=jh(Ld,e.__scopeTooltip),r=tT(Ld,e.__scopeTooltip),a=p.useRef(null),o=nt(t,a),[i,s]=p.useState(null),{trigger:l,onClose:c}=n,u=a.current,{onPointerInTransitChange:d}=r,g=p.useCallback(()=>{s(null),d(!1)},[d]),m=p.useCallback((b,y)=>{const w=b.currentTarget,v={x:b.clientX,y:b.clientY},h=NAe(v,w.getBoundingClientRect()),S=IAe(v,h),E=OAe(y.getBoundingClientRect()),k=LAe([...S,...E]);s(k),d(!0)},[d]);return p.useEffect(()=>()=>g(),[g]),p.useEffect(()=>{if(l&&u){const b=w=>m(w,u),y=w=>m(w,l);return l.addEventListener("pointerleave",b),u.addEventListener("pointerleave",y),()=>{l.removeEventListener("pointerleave",b),u.removeEventListener("pointerleave",y)}}},[l,u,m,g]),p.useEffect(()=>{if(i){const b=y=>{const w=y.target,v={x:y.clientX,y:y.clientY},h=(l==null?void 0:l.contains(w))||(u==null?void 0:u.contains(w)),S=!DAe(v,i);h?g():S&&(g(),c())};return document.addEventListener("pointermove",b),()=>document.removeEventListener("pointermove",b)}},[l,u,i,c,g]),p.createElement(XU,W({},e,{ref:o}))}),[RAe,wTe]=Fh(nT,{isInside:!1}),XU=p.forwardRef((e,t)=>{const{__scopeTooltip:n,children:r,"aria-label":a,onEscapeKeyDown:o,onPointerDownOutside:i,...s}=e,l=jh(Ld,n),c=eT(n),{onClose:u}=l;return p.useEffect(()=>(document.addEventListener(Wk,u),()=>document.removeEventListener(Wk,u)),[u]),p.useEffect(()=>{if(l.trigger){const d=g=>{const m=g.target;m!=null&&m.contains(l.trigger)&&u()};return window.addEventListener("scroll",d,{capture:!0}),()=>window.removeEventListener("scroll",d,{capture:!0})}},[l.trigger,u]),p.createElement(Ls,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:o,onPointerDownOutside:i,onFocusOutside:d=>d.preventDefault(),onDismiss:u},p.createElement(gf,W({"data-state":l.stateAttribute},c,s,{ref:t,style:{...s.style,"--radix-tooltip-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-tooltip-content-available-width":"var(--radix-popper-available-width)","--radix-tooltip-content-available-height":"var(--radix-popper-available-height)","--radix-tooltip-trigger-width":"var(--radix-popper-anchor-width)","--radix-tooltip-trigger-height":"var(--radix-popper-anchor-height)"}}),p.createElement(Rm,null,r),p.createElement(RAe,{scope:n,isInside:!0},p.createElement(VV,{id:l.contentId,role:"tooltip"},a||r))))});function NAe(e,t){const n=Math.abs(t.top-e.y),r=Math.abs(t.bottom-e.y),a=Math.abs(t.right-e.x),o=Math.abs(t.left-e.x);switch(Math.min(n,r,a,o)){case o:return"left";case a:return"right";case n:return"top";case r:return"bottom";default:throw new Error("unreachable")}}function IAe(e,t,n=5){const r=[];switch(t){case"top":r.push({x:e.x-n,y:e.y+n},{x:e.x+n,y:e.y+n});break;case"bottom":r.push({x:e.x-n,y:e.y-n},{x:e.x+n,y:e.y-n});break;case"left":r.push({x:e.x+n,y:e.y-n},{x:e.x+n,y:e.y+n});break;case"right":r.push({x:e.x-n,y:e.y-n},{x:e.x-n,y:e.y+n});break}return r}function OAe(e){const{top:t,right:n,bottom:r,left:a}=e;return[{x:a,y:t},{x:n,y:t},{x:n,y:r},{x:a,y:r}]}function DAe(e,t){const{x:n,y:r}=e;let a=!1;for(let o=0,i=t.length-1;or!=u>r&&n<(c-s)*(r-l)/(u-l)+s&&(a=!a)}return a}function LAe(e){const t=e.slice();return t.sort((n,r)=>n.xr.x?1:n.yr.y?1:0),MAe(t)}function MAe(e){if(e.length<=1)return e.slice();const t=[];for(let r=0;r=2;){const o=t[t.length-1],i=t[t.length-2];if((o.x-i.x)*(a.y-i.y)>=(o.y-i.y)*(a.x-i.x))t.pop();else break}t.push(a)}t.pop();const n=[];for(let r=e.length-1;r>=0;r--){const a=e[r];for(;n.length>=2;){const o=n[n.length-1],i=n[n.length-2];if((o.x-i.x)*(a.y-i.y)>=(o.y-i.y)*(a.x-i.x))n.pop();else break}n.push(a)}return n.pop(),t.length===1&&n.length===1&&t[0].x===n[0].x&&t[0].y===n[0].y?t:t.concat(n)}const PAe=wAe,$Ae=xAe,FAe=kAe,QU=AAe,jAe=PAe,Kk=$Ae,Yk=FAe,dm=p.forwardRef(({className:e,sideOffset:t=4,...n},r)=>f.jsx(QU,{ref:r,sideOffset:t,className:ee("z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...n}));dm.displayName=QU.displayName;const JU=p.createContext({setTheme(e){},toggleTheme(){},theme:localStorage.getItem("theme")==="dark"?"dark":"light"});function zAe({children:e}){const[t,n]=p.useState(localStorage.getItem("theme")==="dark"?"dark":"light"),r=p.useCallback(()=>n(o=>o==="light"?"dark":"light"),[n]),a=p.useMemo(()=>({theme:t,setTheme:n,toggleTheme:r}),[t,n,r]);return p.useEffect(()=>{t==="light"?(document.documentElement.classList.remove("dark"),document.documentElement.classList.add("light")):(document.documentElement.classList.remove("light"),document.documentElement.classList.add("dark")),localStorage.setItem("theme",t)},[t]),f.jsx(JU.Provider,{value:a,children:e})}const UAe=()=>p.useContext(JU);function iP({links:e,isCollapsed:t}){return f.jsx("div",{"data-collapsed":t,className:"group flex flex-col gap-4 py-2 data-[collapsed=true]:py-2",children:f.jsx("nav",{className:"grid gap-1 px-2 group-[[data-collapsed=true]]:justify-center group-[[data-collapsed=true]]:px-2",children:e.map((n,r)=>t?f.jsxs(Kk,{delayDuration:0,children:[f.jsx(Yk,{asChild:!0,children:f.jsxs(bd,{to:n.to,className:ee(yc({variant:n.variant,size:"icon"}),"h-9 w-9",n.variant==="default"&&"bg-background-darker text-black dark:bg-muted dark:text-muted-foreground dark:hover:bg-muted dark:hover:text-white"),children:[f.jsx(n.icon,{className:"h-4 w-4"}),f.jsx("span",{className:"sr-only",children:n.title})]})}),f.jsxs(dm,{side:"right",className:"flex items-center gap-4",children:[n.title,n.label&&f.jsx("span",{className:"ml-auto text-muted-foreground",children:n.label})]})]},r):f.jsxs(bd,{to:n.to,className:ee(yc({variant:n.variant,size:"sm"}),n.variant==="default"&&"bg-background-darker hover:text-background text-foreground dark:bg-muted dark:text-white dark:hover:bg-muted dark:hover:text-white","justify-start"),children:[f.jsx(n.icon,{className:"mr-2 h-4 w-4"}),n.title,n.label&&f.jsx("span",{className:ee("ml-auto",n.variant==="default"&&"text-background dark:text-white"),children:n.label})]},r))})})}function BAe(e){const{className:t,collapse:n}=e;return f.jsxs("svg",{className:t,height:"28",...n?{width:28,viewBox:"0 0 28 28"}:{width:96,viewBox:"0 0 96 28"},fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[f.jsx("path",{d:"M16.9282 11.2005H11.2857V16.8003H16.9282V11.2005Z",fill:"currentColor"}),f.jsx("path",{d:"M22.5705 3.81489V0H5.64243V3.81489C5.64243 4.80109 4.8376 5.59984 3.84391 5.59984H0V22.4002H3.84391C4.8376 22.4002 5.64243 23.1989 5.64243 24.1851V28H22.5705V24.1851C22.5705 23.1989 23.3753 22.4002 24.369 22.4002H28.213V5.59984H24.369C23.3753 5.59984 22.5705 4.80109 22.5705 3.81489ZM22.5705 20.6144C22.5705 21.6006 21.7657 22.3994 20.772 22.3994H7.44174C6.44805 22.3994 5.64322 21.6006 5.64322 20.6144V7.3848C5.64322 6.3986 6.44805 5.59984 7.44174 5.59984H20.772C21.7657 5.59984 22.5705 6.3986 22.5705 7.3848V20.6144Z",fill:"currentColor"}),!n&&f.jsxs(f.Fragment,{children:[f.jsx("path",{d:"M44.8064 5.59982H42.3182V22.3994H53.3766V20.0233H44.8064V5.59982Z",fill:"currentColor"}),f.jsx("path",{d:"M60.5503 10.5463H59.6655C57.0057 10.5463 54.3224 12.1648 54.3224 15.7798V17.5368C54.3224 20.8134 56.233 22.7703 59.4327 22.7703H60.7838C63.4835 22.7703 65.4043 21.193 65.7985 18.6528L65.833 18.4288H63.2704L63.2281 18.5673C62.8488 19.8133 61.8574 20.3942 60.1083 20.3942C57.838 20.3942 56.7667 19.3933 56.7408 17.2459H65.8933V15.7798C65.8933 12.1648 63.21 10.5463 60.5503 10.5463ZM56.8145 15.1459C57.0684 13.5702 58.0394 12.9223 60.1075 12.9223C62.1756 12.9223 63.1458 13.5702 63.3997 15.1459H56.8145Z",fill:"currentColor"}),f.jsx("path",{d:"M70.8579 5.59982H68.3705V10.5463H66.717V12.9224H68.3705V17.6286C68.3705 21.7795 70.9151 22.3994 72.4323 22.3994H74.002V20.0233H73.1078C71.5099 20.0233 70.8579 19.2222 70.8579 17.2592V12.9232H74.002V10.5471H70.8579V5.59982Z",fill:"currentColor"}),f.jsx("path",{d:"M79.2637 5.59982H76.7764V10.5463H75.1228V12.9224H76.7764V17.6286C76.7764 21.7795 79.3209 22.3994 80.8381 22.3994H82.4078V20.0233H81.5137C79.9158 20.0233 79.2637 19.2222 79.2637 17.2592V12.9232H82.4078V10.5471H79.2637V5.59982Z",fill:"currentColor"}),f.jsx("path",{d:"M95.2238 20.0232C94.7309 20.0232 94.5115 19.8195 94.5115 19.3622V15.317C94.5115 11.1662 91.9669 10.5463 90.4497 10.5463H88.1676C86.1944 10.5463 84.0824 11.9805 84.0824 14.1154V14.3098H86.5697V14.1154C86.5697 13.4574 87.3808 12.9231 88.3769 12.9231H89.7742C91.5594 12.9231 91.9449 13.5609 92.0163 14.9849H88.4231C85.645 14.9849 83.7791 16.4565 83.7791 18.6466V18.9009C83.7791 20.0575 84.2313 22.7477 88.4231 22.7477C89.4936 22.7477 91.3642 22.5618 92.3705 21.3765C92.9802 22.4008 94.2646 22.4008 95.2238 22.4008H95.4197V20.0248H95.2238V20.0232ZM92.0233 18.7609C92.0233 20.0808 89.9121 20.3694 89.0979 20.3694C86.7288 20.3694 86.2657 19.7961 86.2657 18.8068C86.2657 17.7086 87.2453 17.1284 89.0979 17.1284H92.0233V18.7609Z",fill:"currentColor"})]})]})}function HAe({defaultLayout:e=[265,440,655],defaultCollapsed:t=!1,navCollapsedSize:n,children:r}){const a=Li(),o=b=>{var y;return((y=a.pathname.split("/"))==null?void 0:y[1])===b?"default":"ghost"},i=[{title:"Agents",icon:Lm,variant:o("agents"),to:"agents"},{title:"Data Sources",icon:_q,variant:o("files"),to:"data-sources"},{title:"Tool Builder",icon:zq,variant:o("tools"),to:"tools"},{title:"Agent Templates",icon:kq,variant:o("agent-templates"),to:"agent-templates"},{title:"User Templates",icon:XC,variant:o("human-templates"),to:"human-templates"}],{theme:s,toggleTheme:l}=UAe(),[c,u]=p.useState(t),{logout:d}=iY(),g=Mi(),m=()=>{d(),g("/login")};return f.jsx(jAe,{delayDuration:0,children:f.jsxs(hAe,{direction:"horizontal",onLayout:b=>{document.cookie=`react-resizable-panels:layout=${JSON.stringify(b)}`},className:"h-full items-stretch",children:[f.jsxs(aP,{defaultSize:e[0],collapsedSize:n,collapsible:!0,minSize:14,maxSize:20,onCollapse:()=>{u(!0),document.cookie=`react-resizable-panels:collapsed=${JSON.stringify(!0)}`},onExpand:()=>{u(!1),document.cookie=`react-resizable-panels:collapsed=${JSON.stringify(!1)}`},className:ee("flex flex-col",c&&"min-w-[50px] transition-all duration-300 ease-in-out"),children:[f.jsx(FF,{to:"/",className:ee("flex h-[56px] items-center",c?"h-[56px] justify-center":"px-2"),children:f.jsx(BAe,{collapse:c,className:"h-[24px] dark:text-white"})}),f.jsx(Nd,{}),f.jsx(iP,{isCollapsed:c,links:i}),f.jsx(Nd,{}),f.jsx(iP,{isCollapsed:c,links:[{title:"Settings",icon:Eq,variant:o("settings"),to:"settings"}]}),f.jsx("div",{className:ee("flex flex-1 items-end",c&&"justify-center p-2.5"),children:f.jsxs("div",{className:"grid gap-2",children:[c?f.jsxs(Kk,{delayDuration:0,children:[f.jsx(Yk,{asChild:!0,children:f.jsxs(ue,{variant:"ghost",onClick:l,size:"icon",className:"h-9 w-9",children:[f.jsx("span",{className:"sr-only",children:"Toggle Dark Mode"}),s==="light"?f.jsx(wR,{className:"h-4 w-4"}):f.jsx(ER,{className:"w-4 w-4"})]})}),f.jsx(dm,{side:"right",className:"flex items-center gap-4",children:"Toggle Dark Mode"})]}):f.jsx(ue,{className:"m-2.5",variant:"ghost",size:c?"icon":"sm",onClick:l,children:s==="light"?f.jsx(wR,{className:"h-4 w-4"}):f.jsx(ER,{className:"w-4 w-4"})}),c?f.jsxs(Kk,{delayDuration:0,children:[f.jsx(Yk,{asChild:!0,children:f.jsxs(ue,{variant:"ghost",onClick:m,size:"icon",className:"h-9 w-9",children:[f.jsx("span",{className:"sr-only",children:"Sign Out"}),f.jsx(SR,{className:"h-4 w-4"})]})}),f.jsx(dm,{side:"right",className:"flex items-center gap-4",children:"Sign Out"})]}):f.jsx(ue,{className:"m-2.5",variant:"ghost",size:c?"icon":"sm",onClick:m,children:f.jsx(SR,{className:"h-4 w-4"})})]})})]}),f.jsx(bAe,{withHandle:!0}),f.jsx(aP,{className:"h-full",defaultSize:e[1],minSize:30,children:r})]})})}/*! js-cookie v3.0.5 | MIT */function Cp(e){for(var t=1;t"u")){i=Cp({},t,i),typeof i.expires=="number"&&(i.expires=new Date(Date.now()+i.expires*864e5)),i.expires&&(i.expires=i.expires.toUTCString()),a=encodeURIComponent(a).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var s="";for(var l in i)i[l]&&(s+="; "+l,i[l]!==!0&&(s+="="+i[l].split(";")[0]));return document.cookie=a+"="+e.write(o,a)+s}}function r(a){if(!(typeof document>"u"||arguments.length&&!a)){for(var o=document.cookie?document.cookie.split("; "):[],i={},s=0;s{const e=sP.get("react-resizable-panels:layout"),t=sP.get("react-resizable-panels:collapsed"),n=e?JSON.parse(e):void 0,r=t?JSON.parse(t):void 0;return{defaultLayout:n,defaultCollapsed:r}},GAe=()=>{const{defaultCollapsed:e,defaultLayout:t}=qAe();return f.jsx(AZ,{children:f.jsx(hX,{children:f.jsx(HAe,{defaultLayout:t,defaultCollapsed:e,navCollapsedSize:4,children:f.jsx(MF,{})})})})},WAe=bK([{path:"/",element:GAe(),children:[{path:"",element:f.jsx(LF,{to:"/agents",replace:!0})},Mie,wke,nCe,ACe,t_e,R_e,U_e]}]),KAe=new zG;function YAe(){return f.jsxs(qG,{client:KAe,children:[f.jsxs(zAe,{children:[f.jsx(CK,{router:WAe}),f.jsx(CG,{})]}),f.jsx(oW,{initialIsOpen:!1})]})}const ZAe=O4(document.getElementById("root"));ZAe.render(f.jsx(p.StrictMode,{children:f.jsx(YAe,{})})); + return output_string`};function S_e({closeDialog:e}){const t=lX(),n=Bt(),{toast:r}=An(),a=bn({resolver:yn(y_e),defaultValues:v_e,mode:"onChange"}),o=i=>{t.mutate({requestBody:{name:i.name,tags:[],source_code:i.code}},{onSuccess:()=>{n.invalidateQueries({queryKey:g_()}),e(),r({title:"Tool created successfully!",duration:5e3})},onError:s=>{r({title:"Error creating tool",duration:5e3})}})};return f.jsx(vn,{...a,children:f.jsxs("form",{onSubmit:a.handleSubmit(o,i=>console.log(i)),className:"space-y-8",children:[f.jsx(ut,{control:a.control,name:"name",render:({field:i})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Name"}),f.jsx(pt,{children:f.jsx(_n,{...i})}),f.jsx(Mt,{children:"This is your tools display name. It can be a real name or a pseudonym."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:a.control,name:"code",render:({field:i})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Source Code"}),f.jsx(pt,{children:f.jsx(_U,{...i})}),f.jsx(Mt,{children:"Write the source code for your tool. Custom tools must be valid Python code, and all arguments must be type annotated, and you must include a docstring."}),f.jsx(lt,{})]})}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Create Tool"}),t.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Creating Tool..."})]})]})]})})}const w_e=({open:e,onOpenChange:t})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full overflow-y-auto sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Create Tool"}),f.jsx(dn,{children:"Add a new tool here. Click create when you're done."})]}),f.jsx(S_e,{closeDialog:()=>t(!1)})]})}),E_e=Xe({source_code:Ce()});function x_e({tool:e,closeDialog:t}){const n=fX(),r=Bt(),{toast:a}=An(),o={...e},i=bn({resolver:yn(E_e),defaultValues:o,mode:"onChange"}),s=l=>{n.mutate({toolId:e.id||"",requestBody:{id:e.id||"",source_code:l.source_code}},{onSuccess:()=>{t(),r.invalidateQueries({queryKey:g_()}),a({title:"Tool updated successfully!",duration:5e3})},onError:c=>{a({title:"Error updating tool",duration:5e3})}})};return f.jsx(vn,{...i,children:f.jsxs("form",{onSubmit:i.handleSubmit(s,l=>console.log(l)),className:"space-y-8",children:[f.jsx(ut,{control:i.control,name:"source_code",render:({field:l})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Source Code"}),f.jsx(pt,{children:f.jsx(_U,{...l})}),f.jsx(lt,{})]})}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Update Tool"}),n.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Updating Tool..."})]})]})]})})}const k_e=({tool:e,open:t,onOpenChange:n})=>f.jsx(Kt,{open:t,onOpenChange:n,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full overflow-y-auto sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsxs($t,{children:["Edit ",(e==null?void 0:e.name)??"Tool"]}),f.jsx(dn,{children:"Edit existing tool here. Click create when you're done."})]}),e?f.jsx(x_e,{tool:e,closeDialog:()=>n(!1)}):f.jsx("p",{children:"No Tool...."})]})}),C_e=({value:e,onValueChange:t})=>f.jsx("form",{children:f.jsxs("div",{className:"relative",children:[f.jsx(Ms,{className:"pointer-events-none absolute left-[12px] top-3 h-4 w-4 text-muted-foreground"}),f.jsx(_n,{placeholder:"Search tool",value:e,onChange:n=>t(n.target.value),className:"w-52 pl-8 lg:w-80"})]})}),__e=(e,t)=>[{accessorKey:"edit",header:"",size:20,cell:({row:n})=>t?f.jsx(Pi,{className:"h-6 w-6"}):f.jsx(ue,{onClick:()=>e(n.original),className:"!h-6 !w-6 !p-1",variant:"ghost",children:f.jsx(Fm,{className:"h-3.5 w-3.5"})})},{accessorKey:"name",header:"Name",cell:({row:n})=>f.jsx(Dn,{isLoading:t,children:n.getValue("name")})},{accessorFn:n=>{var r;return(r=n.json_schema)==null?void 0:r.description},accessorKey:"docstring",header:"Docstring",cell:({row:n})=>f.jsx(Dn,{isLoading:t,children:f.jsx(ZA,{text:n.getValue("docstring")})})},{accessorFn:n=>{var r,a;return(a=(r=n.tags)==null?void 0:r[0])==null?void 0:a.replace("memgpt-","")},accessorKey:"library",header:"Library",cell:({row:n})=>{const r=n.getValue("library");return f.jsx(Dn,{isLoading:t,children:r==="base"?f.jsx(b9,{className:"-ml-2",variant:"secondary",children:r}):f.jsx("span",{className:"text-xs",children:r})})}},{accessorKey:"last_edited",header:"Last Edited",cell:({row:n})=>f.jsx(Dn,{isLoading:t,children:n.getValue("last_edited")??"Never"})}],A_e=({onToolEdit:e,nameFilter:t,className:n})=>{const{data:r,isError:a,isLoading:o}=Xm(),i=(r??[]).filter(s=>s.name.includes(t));return f.jsx("div",{className:n,children:f.jsx(uf,{columns:__e(e,o),isLoading:o,error:a?"Error loading tools":void 0,data:i,renderPagination:s=>f.jsx(df,{className:"mt-4",table:s})})})},T_e=()=>{const[e,t]=p.useState(""),[n]=Oh(e,300),[r,a]=p.useState(!1),[o,i]=p.useState(null),[s,l]=p.useState(!1),c=u=>{i(u),l(!0)};return f.jsxs(Fs,{children:[f.jsxs("div",{className:"flex items-center justify-between bg-background/95 px-4 pb-3 pt-2.5 backdrop-blur supports-[backdrop-filter]:bg-background/60",children:[f.jsx(C_e,{value:e,onValueChange:t}),f.jsxs(ue,{onClick:()=>a(!0),size:"sm",children:[f.jsx(ya,{className:"mr-2 h-4 w-4"}),"Create Tool"]})]}),f.jsx(A_e,{className:"mx-4",onToolEdit:c,nameFilter:n}),f.jsx(w_e,{open:r,onOpenChange:u=>a(u)}),f.jsx(k_e,{tool:o,open:s,onOpenChange:u=>l(u)})]})},R_e={path:"tools",element:f.jsx(T_e,{})},N_e=Xe({name:Ce().min(1,{message:"Name must be at least 1 character."}).max(30,{message:"Name must not be longer than 30 characters."}),text:Ce().max(2e3).min(0)}),I_e={name:"",text:""};function O_e({closeDialog:e}){const t=Bt(),n=_6(),{toast:r}=An(),a=2e3,o=N_e.extend({text:Ce().max(a).min(0)}),i=bn({resolver:yn(o),defaultValues:I_e,mode:"onChange"}),s=l=>{n.mutate({requestBody:{value:l.text||"",label:fr,name:l.name||""}},{onSuccess:()=>{e(),t.invalidateQueries({queryKey:lf({label:fr})}),r({title:"Human created successfully!",duration:5e3})},onError:c=>{let u="Error creating human";const d=`${u}: Unspecified error.`;try{r({title:"Error updating human",duration:5e3})}catch{u=d}r({title:u,duration:5e3})}})};return f.jsx(vn,{...i,children:f.jsxs("form",{onSubmit:i.handleSubmit(s,l=>console.log(l)),className:"space-y-8",children:[f.jsx(ut,{control:i.control,name:"name",render:({field:l})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Name"}),f.jsx(pt,{children:f.jsx(_n,{...l})}),f.jsx(Mt,{children:"This is your humans display name. It can be a real name or a pseudonym."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:i.control,name:"text",render:({field:l})=>{var c;return f.jsxs(ot,{children:[f.jsx(pt,{children:f.jsx(Ai,{placeholder:"Describe your human here",...l,charCount:(c=l.value)==null?void 0:c.length,limit:a})}),f.jsxs(Mt,{children:["You can use no more than ",a," characters."]}),f.jsx(lt,{})]})}}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Create Persona"}),n.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Creating Persona..."})]})]})]})})}const D_e=({open:e,onOpenChange:t})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Create Human"}),f.jsx(dn,{children:"Add a new human here. Click create when you're done."})]}),f.jsx(O_e,{closeDialog:()=>t(!1)})]})}),L_e=Xe({text:Ce().max(2e3).min(0)});function M_e({human:e,closeDialog:t}){const n=v_(),r=Bt(),{toast:a}=An(),o=2e3,i=L_e.extend({text:Ce().max(o).min(0)}),s={text:e.value||""},l=bn({resolver:yn(i),defaultValues:s,mode:"onChange"}),c=u=>{n.mutate({blockId:e.id||"",requestBody:{id:e.id||"",value:u.text||""}},{onSuccess:()=>{t(),r.invalidateQueries({queryKey:lf({label:fr})}),a({title:"Human updated successfully!",duration:5e3})},onError:d=>{a({title:"Error updating human",duration:5e3})}})};return f.jsx(vn,{...l,children:f.jsxs("form",{onSubmit:l.handleSubmit(c,u=>console.log(u)),className:"space-y-8",children:[f.jsx(ut,{control:l.control,name:"text",render:({field:u})=>{var d;return f.jsxs(ot,{children:[f.jsx(pt,{children:f.jsx(Ai,{placeholder:"Describe your human here",...u,charCount:(d=u.value)==null?void 0:d.length,limit:o})}),f.jsxs(Mt,{children:["You can use no more than ",o," characters."]}),f.jsx(lt,{})]})}}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Update Persona"}),n.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Updating Human..."})]})]})]})})}const P_e=({human:e,open:t,onOpenChange:n})=>f.jsx(Kt,{open:t,onOpenChange:n,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsxs($t,{children:["Edit ",(e==null?void 0:e.name)??"Human"]}),f.jsx(dn,{children:"Edit existing human here. Click create when you're done."})]}),e?f.jsx(M_e,{human:e,closeDialog:()=>n(!1)}):f.jsx("p",{children:"No Human...."})]})}),$_e=({value:e,onValueChange:t})=>f.jsx("form",{children:f.jsxs("div",{className:"relative",children:[f.jsx(Ms,{className:"pointer-events-none absolute left-[12px] top-3 h-4 w-4 text-muted-foreground"}),f.jsx(_n,{placeholder:"Search user",value:e,onChange:n=>t(n.target.value),className:"w-52 pl-8 lg:w-80"})]})}),F_e=(e,t)=>[{accessorKey:"edit",header:"",size:20,cell:({row:n})=>t?f.jsx(Pi,{className:"h-6 w-6"}):f.jsx(ue,{onClick:()=>e(n.original),className:"!h-6 !w-6 !p-1",variant:"ghost",children:f.jsx(Fm,{className:"h-3.5 w-3.5"})})},{accessorKey:"name",header:"Name",cell:({row:n})=>f.jsx(Dn,{isLoading:t,children:n.getValue("name")})},{accessorKey:"value",header:"Text",cell:({row:n})=>f.jsx(Dn,{isLoading:t,children:f.jsx(ZA,{text:n.getValue("value")})})}],j_e=({onHumanEdit:e,nameFilter:t,className:n})=>{const{data:r,isError:a,isLoading:o}=Ng({label:fr}),i=(r??[]).filter(s=>{var l;return(l=s.name)==null?void 0:l.includes(t)});return f.jsx("div",{className:n,children:f.jsx(uf,{isLoading:o,error:a?"Error loading humans":void 0,columns:F_e(e,o),data:i,renderPagination:s=>f.jsx(df,{className:"mt-4",table:s})})})},z_e=()=>{const[e,t]=p.useState(""),[n]=Oh(e,300),[r,a]=p.useState(!1),[o,i]=p.useState(null),[s,l]=p.useState(!1),c=u=>{i(u),l(!0)};return f.jsxs(Fs,{children:[f.jsxs("div",{className:"flex items-center justify-between bg-background/95 px-4 pb-3 pt-2.5 backdrop-blur supports-[backdrop-filter]:bg-background/60",children:[f.jsx($_e,{value:e,onValueChange:t}),f.jsxs(ue,{onClick:()=>a(!0),size:"sm",children:[f.jsx(ya,{className:"mr-2 h-4 w-4"}),"Create Human"]})]}),f.jsx(j_e,{onHumanEdit:c,nameFilter:n,className:"mx-4"}),f.jsx(D_e,{open:r,onOpenChange:u=>a(u)}),f.jsx(P_e,{human:o,open:s,onOpenChange:u=>l(u)})]})},U_e={path:"human-templates",element:f.jsx(z_e,{})},{createElement:Ac,createContext:B_e,createRef:vTe,forwardRef:AU,useCallback:hr,useContext:TU,useEffect:ys,useImperativeHandle:RU,useLayoutEffect:H_e,useMemo:V_e,useRef:ar,useState:Zu}=Kd,Z3=Kd["useId".toString()],q_e=H_e,Lh=B_e(null);Lh.displayName="PanelGroupContext";const vs=q_e,G_e=typeof Z3=="function"?Z3:()=>null;let W_e=0;function XA(e=null){const t=G_e(),n=ar(e||t||null);return n.current===null&&(n.current=""+W_e++),e??n.current}function NU({children:e,className:t="",collapsedSize:n,collapsible:r,defaultSize:a,forwardedRef:o,id:i,maxSize:s,minSize:l,onCollapse:c,onExpand:u,onResize:d,order:g,style:m,tagName:b="div",...y}){const w=TU(Lh);if(w===null)throw Error("Panel components must be rendered within a PanelGroup container");const{collapsePanel:v,expandPanel:h,getPanelSize:S,getPanelStyle:E,groupId:k,isPanelCollapsed:x,reevaluatePanelConstraints:C,registerPanel:_,resizePanel:R,unregisterPanel:T}=w,L=XA(i),D=ar({callbacks:{onCollapse:c,onExpand:u,onResize:d},constraints:{collapsedSize:n,collapsible:r,defaultSize:a,maxSize:s,minSize:l},id:L,idIsFromProps:i!==void 0,order:g});ar({didLogMissingDefaultSizeWarning:!1}),vs(()=>{const{callbacks:z,constraints:M}=D.current,U={...M};D.current.id=L,D.current.idIsFromProps=i!==void 0,D.current.order=g,z.onCollapse=c,z.onExpand=u,z.onResize=d,M.collapsedSize=n,M.collapsible=r,M.defaultSize=a,M.maxSize=s,M.minSize=l,(U.collapsedSize!==M.collapsedSize||U.collapsible!==M.collapsible||U.maxSize!==M.maxSize||U.minSize!==M.minSize)&&C(D.current,U)}),vs(()=>{const z=D.current;return _(z),()=>{T(z)}},[g,L,_,T]),RU(o,()=>({collapse:()=>{v(D.current)},expand:()=>{h(D.current)},getId(){return L},getSize(){return S(D.current)},isCollapsed(){return x(D.current)},isExpanded(){return!x(D.current)},resize:z=>{R(D.current,z)}}),[v,h,S,x,L,R]);const H=E(D.current,a);return Ac(b,{...y,children:e,className:t,id:i,style:{...H,...m},"data-panel":"","data-panel-collapsible":r||void 0,"data-panel-group-id":k,"data-panel-id":L,"data-panel-size":parseFloat(""+H.flexGrow).toFixed(1)})}const IU=AU((e,t)=>Ac(NU,{...e,forwardedRef:t}));NU.displayName="Panel";IU.displayName="forwardRef(Panel)";let Wk=null,is=null;function K_e(e,t){if(t){const n=(t&PU)!==0,r=(t&$U)!==0,a=(t&FU)!==0,o=(t&jU)!==0;if(n)return a?"se-resize":o?"ne-resize":"e-resize";if(r)return a?"sw-resize":o?"nw-resize":"w-resize";if(a)return"s-resize";if(o)return"n-resize"}switch(e){case"horizontal":return"ew-resize";case"intersection":return"move";case"vertical":return"ns-resize"}}function Y_e(){is!==null&&(document.head.removeChild(is),Wk=null,is=null)}function Ax(e,t){const n=K_e(e,t);Wk!==n&&(Wk=n,is===null&&(is=document.createElement("style"),document.head.appendChild(is)),is.innerHTML=`*{cursor: ${n}!important;}`)}function OU(e){return e.type==="keydown"}function DU(e){return e.type.startsWith("mouse")}function LU(e){return e.type.startsWith("touch")}function Mh(e){if(DU(e))return{x:e.pageX,y:e.pageY};if(LU(e)){const t=e.touches[0];if(t&&t.pageX&&t.pageY)return{x:t.pageX,y:t.pageY}}return{x:1/0,y:1/0}}function Z_e(){if(typeof matchMedia=="function")return matchMedia("(pointer:coarse)").matches?"coarse":"fine"}function X_e(e,t,n){return n?e.xt.x&&e.yt.y:e.x<=t.x+t.width&&e.x+e.width>=t.x&&e.y<=t.y+t.height&&e.y+e.height>=t.y}function Q_e(e,t){if(e===t)throw new Error("Cannot compare node with itself");const n={a:J3(e),b:J3(t)};let r;for(;n.a.at(-1)===n.b.at(-1);)e=n.a.pop(),t=n.b.pop(),r=e;Ye(r);const a={a:Q3(X3(n.a)),b:Q3(X3(n.b))};if(a.a===a.b){const o=r.childNodes,i={a:n.a.at(-1),b:n.b.at(-1)};let s=o.length;for(;s--;){const l=o[s];if(l===i.a)return 1;if(l===i.b)return-1}}return Math.sign(a.a-a.b)}const J_e=/\b(?:position|zIndex|opacity|transform|webkitTransform|mixBlendMode|filter|webkitFilter|isolation)\b/;function eAe(e){const t=getComputedStyle(MU(e)).display;return t==="flex"||t==="inline-flex"}function tAe(e){const t=getComputedStyle(e);return!!(t.position==="fixed"||t.zIndex!=="auto"&&(t.position!=="static"||eAe(e))||+t.opacity<1||"transform"in t&&t.transform!=="none"||"webkitTransform"in t&&t.webkitTransform!=="none"||"mixBlendMode"in t&&t.mixBlendMode!=="normal"||"filter"in t&&t.filter!=="none"||"webkitFilter"in t&&t.webkitFilter!=="none"||"isolation"in t&&t.isolation==="isolate"||J_e.test(t.willChange)||t.webkitOverflowScrolling==="touch")}function X3(e){let t=e.length;for(;t--;){const n=e[t];if(Ye(n),tAe(n))return n}return null}function Q3(e){return e&&Number(getComputedStyle(e).zIndex)||0}function J3(e){const t=[];for(;e;)t.push(e),e=MU(e);return t}function MU(e){var t;return((t=e.parentNode)===null||t===void 0?void 0:t.host)||e.parentNode}const PU=1,$U=2,FU=4,jU=8,nAe=Z_e()==="coarse";let Ri=[],Ph=!1,Yo=new Map,$h=new Map;const Id=new Set;function rAe(e,t,n,r,a){var o;const{ownerDocument:i}=t,s={direction:n,element:t,hitAreaMargins:r,setResizeHandlerState:a},l=(o=Yo.get(i))!==null&&o!==void 0?o:0;return Yo.set(i,l+1),Id.add(s),um(),function(){var u;$h.delete(e),Id.delete(s);const d=(u=Yo.get(i))!==null&&u!==void 0?u:1;Yo.set(i,d-1),um(),d===1&&Yo.delete(i)}}function xp(e){const{target:t}=e,{x:n,y:r}=Mh(e);Ph=!0,QA({target:t,x:n,y:r}),um(),Ri.length>0&&(JA("down",e),e.preventDefault())}function jo(e){const{x:t,y:n}=Mh(e);if(!Ph){const{target:r}=e;QA({target:r,x:t,y:n})}JA("move",e),zU(),Ri.length>0&&e.preventDefault()}function zo(e){const{target:t}=e,{x:n,y:r}=Mh(e);$h.clear(),Ph=!1,Ri.length>0&&e.preventDefault(),JA("up",e),QA({target:t,x:n,y:r}),zU(),um()}function QA({target:e,x:t,y:n}){Ri.splice(0);let r=null;e instanceof HTMLElement&&(r=e),Id.forEach(a=>{const{element:o,hitAreaMargins:i}=a,s=o.getBoundingClientRect(),{bottom:l,left:c,right:u,top:d}=s,g=nAe?i.coarse:i.fine;if(t>=c-g&&t<=u+g&&n>=d-g&&n<=l+g){if(r!==null&&o!==r&&!o.contains(r)&&!r.contains(o)&&Q_e(r,o)>0){let b=r,y=!1;for(;b&&!b.contains(o);){if(X_e(b.getBoundingClientRect(),s,!0)){y=!0;break}b=b.parentElement}if(y)return}Ri.push(a)}})}function Tx(e,t){$h.set(e,t)}function zU(){let e=!1,t=!1;Ri.forEach(r=>{const{direction:a}=r;a==="horizontal"?e=!0:t=!0});let n=0;$h.forEach(r=>{n|=r}),e&&t?Ax("intersection",n):e?Ax("horizontal",n):t?Ax("vertical",n):Y_e()}function um(){Yo.forEach((e,t)=>{const{body:n}=t;n.removeEventListener("contextmenu",zo),n.removeEventListener("mousedown",xp),n.removeEventListener("mouseleave",jo),n.removeEventListener("mousemove",jo),n.removeEventListener("touchmove",jo),n.removeEventListener("touchstart",xp)}),window.removeEventListener("mouseup",zo),window.removeEventListener("touchcancel",zo),window.removeEventListener("touchend",zo),Id.size>0&&(Ph?(Ri.length>0&&Yo.forEach((e,t)=>{const{body:n}=t;e>0&&(n.addEventListener("contextmenu",zo),n.addEventListener("mouseleave",jo),n.addEventListener("mousemove",jo),n.addEventListener("touchmove",jo,{passive:!1}))}),window.addEventListener("mouseup",zo),window.addEventListener("touchcancel",zo),window.addEventListener("touchend",zo)):Yo.forEach((e,t)=>{const{body:n}=t;e>0&&(n.addEventListener("mousedown",xp),n.addEventListener("mousemove",jo),n.addEventListener("touchmove",jo,{passive:!1}),n.addEventListener("touchstart",xp))}))}function JA(e,t){Id.forEach(n=>{const{setResizeHandlerState:r}=n,a=Ri.includes(n);r(e,a,t)})}function Ye(e,t="Assertion failed!"){if(!e)throw console.error(t),Error(t)}const UU=10;function Od(e,t,n=UU){e=parseFloat(e.toFixed(n)),t=parseFloat(t.toFixed(n));const r=e-t;return r===0?0:r>0?1:-1}function vr(e,t,n){return Od(e,t,n)===0}function Dl({panelConstraints:e,panelIndex:t,size:n}){const r=e[t];Ye(r!=null);let{collapsedSize:a=0,collapsible:o,maxSize:i=100,minSize:s=0}=r;if(Od(n,s)<0)if(o){const l=(a+s)/2;Od(n,l)<0?n=a:n=s}else n=s;return n=Math.min(i,n),n=parseFloat(n.toFixed(UU)),n}function Ru({delta:e,layout:t,panelConstraints:n,pivotIndices:r,trigger:a}){if(vr(e,0))return t;const o=[...t],[i,s]=r;Ye(i!=null),Ye(s!=null);let l=0;if(a==="keyboard"){{const u=e<0?s:i,d=n[u];if(Ye(d),d.collapsible){const g=t[u];Ye(g!=null);const m=n[u];Ye(m);const{collapsedSize:b=0,minSize:y=0}=m;if(vr(g,b)){const w=y-g;Od(w,Math.abs(e))>0&&(e=e<0?0-w:w)}}}{const u=e<0?i:s,d=n[u];Ye(d);const{collapsible:g}=d;if(g){const m=t[u];Ye(m!=null);const b=n[u];Ye(b);const{collapsedSize:y=0,minSize:w=0}=b;if(vr(m,w)){const v=m-y;Od(v,Math.abs(e))>0&&(e=e<0?0-v:v)}}}}{const u=e<0?1:-1;let d=e<0?s:i,g=0;for(;;){const b=t[d];Ye(b!=null);const w=Dl({panelConstraints:n,panelIndex:d,size:100})-b;if(g+=w,d+=u,d<0||d>=n.length)break}const m=Math.min(Math.abs(e),Math.abs(g));e=e<0?0-m:m}{let d=e<0?i:s;for(;d>=0&&d=0))break;e<0?d--:d++}}if(vr(l,0))return t;{const u=e<0?s:i,d=t[u];Ye(d!=null);const g=d+l,m=Dl({panelConstraints:n,panelIndex:u,size:g});if(o[u]=m,!vr(m,g)){let b=g-m,w=e<0?s:i;for(;w>=0&&w0?w--:w++}}}const c=o.reduce((u,d)=>d+u,0);return vr(c,100)?o:t}function aAe({layout:e,panelsArray:t,pivotIndices:n}){let r=0,a=100,o=0,i=0;const s=n[0];Ye(s!=null),t.forEach((d,g)=>{const{constraints:m}=d,{maxSize:b=100,minSize:y=0}=m;g===s?(r=y,a=b):(o+=y,i+=b)});const l=Math.min(a,100-o),c=Math.max(r,100-i),u=e[s];return{valueMax:l,valueMin:c,valueNow:u}}function Dd(e,t=document){return Array.from(t.querySelectorAll(`[data-panel-resize-handle-id][data-panel-group-id="${e}"]`))}function BU(e,t,n=document){const a=Dd(e,n).findIndex(o=>o.getAttribute("data-panel-resize-handle-id")===t);return a??null}function HU(e,t,n){const r=BU(e,t,n);return r!=null?[r,r+1]:[-1,-1]}function VU(e,t=document){var n;if(t instanceof HTMLElement&&(t==null||(n=t.dataset)===null||n===void 0?void 0:n.panelGroupId)==e)return t;const r=t.querySelector(`[data-panel-group][data-panel-group-id="${e}"]`);return r||null}function Fh(e,t=document){const n=t.querySelector(`[data-panel-resize-handle-id="${e}"]`);return n||null}function oAe(e,t,n,r=document){var a,o,i,s;const l=Fh(t,r),c=Dd(e,r),u=l?c.indexOf(l):-1,d=(a=(o=n[u])===null||o===void 0?void 0:o.id)!==null&&a!==void 0?a:null,g=(i=(s=n[u+1])===null||s===void 0?void 0:s.id)!==null&&i!==void 0?i:null;return[d,g]}function iAe({committedValuesRef:e,eagerValuesRef:t,groupId:n,layout:r,panelDataArray:a,panelGroupElement:o,setLayout:i}){ar({didWarnAboutMissingResizeHandle:!1}),vs(()=>{if(!o)return;const s=Dd(n,o);for(let l=0;l{s.forEach((l,c)=>{l.removeAttribute("aria-controls"),l.removeAttribute("aria-valuemax"),l.removeAttribute("aria-valuemin"),l.removeAttribute("aria-valuenow")})}},[n,r,a,o]),ys(()=>{if(!o)return;const s=t.current;Ye(s);const{panelDataArray:l}=s,c=VU(n,o);Ye(c!=null,`No group found for id "${n}"`);const u=Dd(n,o);Ye(u);const d=u.map(g=>{const m=g.getAttribute("data-panel-resize-handle-id");Ye(m);const[b,y]=oAe(n,m,l,o);if(b==null||y==null)return()=>{};const w=v=>{if(!v.defaultPrevented)switch(v.key){case"Enter":{v.preventDefault();const h=l.findIndex(S=>S.id===b);if(h>=0){const S=l[h];Ye(S);const E=r[h],{collapsedSize:k=0,collapsible:x,minSize:C=0}=S.constraints;if(E!=null&&x){const _=Ru({delta:vr(E,k)?C-k:k-E,layout:r,panelConstraints:l.map(R=>R.constraints),pivotIndices:HU(n,m,o),trigger:"keyboard"});r!==_&&i(_)}}break}}};return g.addEventListener("keydown",w),()=>{g.removeEventListener("keydown",w)}});return()=>{d.forEach(g=>g())}},[o,e,t,n,r,a,i])}function eP(e,t){if(e.length!==t.length)return!1;for(let n=0;no.constraints);let r=0,a=100;for(let o=0;o{const o=e[a];Ye(o);const{callbacks:i,constraints:s,id:l}=o,{collapsedSize:c=0,collapsible:u}=s,d=n[l];if(d==null||r!==d){n[l]=r;const{onCollapse:g,onExpand:m,onResize:b}=i;b&&b(r,d),u&&(g||m)&&(m&&(d==null||d===c)&&r!==c&&m(),g&&(d==null||d!==c)&&r===c&&g())}})}function kp(e,t){if(e.length!==t.length)return!1;for(let n=0;n{n!==null&&clearTimeout(n),n=setTimeout(()=>{e(...a)},t)}}function tP(e){try{if(typeof localStorage<"u")e.getItem=t=>localStorage.getItem(t),e.setItem=(t,n)=>{localStorage.setItem(t,n)};else throw new Error("localStorage not supported in this environment")}catch(t){console.error(t),e.getItem=()=>null,e.setItem=()=>{}}}function GU(e){return`react-resizable-panels:${e}`}function WU(e){return e.map(t=>{const{constraints:n,id:r,idIsFromProps:a,order:o}=t;return a?r:o?`${o}:${JSON.stringify(n)}`:JSON.stringify(n)}).sort((t,n)=>t.localeCompare(n)).join(",")}function KU(e,t){try{const n=GU(e),r=t.getItem(n);if(r){const a=JSON.parse(r);if(typeof a=="object"&&a!=null)return a}}catch{}return null}function fAe(e,t,n){var r,a;const o=(r=KU(e,n))!==null&&r!==void 0?r:{},i=WU(t);return(a=o[i])!==null&&a!==void 0?a:null}function pAe(e,t,n,r,a){var o;const i=GU(e),s=WU(t),l=(o=KU(e,a))!==null&&o!==void 0?o:{};l[s]={expandToSizes:Object.fromEntries(n.entries()),layout:r};try{a.setItem(i,JSON.stringify(l))}catch(c){console.error(c)}}function nP({layout:e,panelConstraints:t}){const n=[...e],r=n.reduce((o,i)=>o+i,0);if(n.length!==t.length)throw Error(`Invalid ${t.length} panel layout: ${n.map(o=>`${o}%`).join(", ")}`);if(!vr(r,100))for(let o=0;o(tP(Nu),Nu.getItem(e)),setItem:(e,t)=>{tP(Nu),Nu.setItem(e,t)}},rP={};function YU({autoSaveId:e=null,children:t,className:n="",direction:r,forwardedRef:a,id:o=null,onLayout:i=null,keyboardResizeBy:s=null,storage:l=Nu,style:c,tagName:u="div",...d}){const g=XA(o),m=ar(null),[b,y]=Zu(null),[w,v]=Zu([]),h=ar({}),S=ar(new Map),E=ar(0),k=ar({autoSaveId:e,direction:r,dragState:b,id:g,keyboardResizeBy:s,onLayout:i,storage:l}),x=ar({layout:w,panelDataArray:[],panelDataArrayChanged:!1});ar({didLogIdAndOrderWarning:!1,didLogPanelConstraintsWarning:!1,prevPanelIds:[]}),RU(a,()=>({getId:()=>k.current.id,getLayout:()=>{const{layout:P}=x.current;return P},setLayout:P=>{const{onLayout:N}=k.current,{layout:K,panelDataArray:ae}=x.current,ne=nP({layout:P,panelConstraints:ae.map(Q=>Q.constraints)});eP(K,ne)||(v(ne),x.current.layout=ne,N&&N(ne),ll(ae,ne,h.current))}}),[]),vs(()=>{k.current.autoSaveId=e,k.current.direction=r,k.current.dragState=b,k.current.id=g,k.current.onLayout=i,k.current.storage=l}),iAe({committedValuesRef:k,eagerValuesRef:x,groupId:g,layout:w,panelDataArray:x.current.panelDataArray,setLayout:v,panelGroupElement:m.current}),ys(()=>{const{panelDataArray:P}=x.current;if(e){if(w.length===0||w.length!==P.length)return;let N=rP[e];N==null&&(N=dAe(pAe,gAe),rP[e]=N);const K=[...P],ae=new Map(S.current);N(e,K,ae,w,l)}},[e,w,l]),ys(()=>{});const C=hr(P=>{const{onLayout:N}=k.current,{layout:K,panelDataArray:ae}=x.current;if(P.constraints.collapsible){const ne=ae.map(re=>re.constraints),{collapsedSize:Q=0,panelSize:pe,pivotIndices:he}=qi(ae,P,K);if(Ye(pe!=null),pe!==Q){S.current.set(P.id,pe);const Ee=hl(ae,P)===ae.length-1?pe-Q:Q-pe,ke=Ru({delta:Ee,layout:K,panelConstraints:ne,pivotIndices:he,trigger:"imperative-api"});kp(K,ke)||(v(ke),x.current.layout=ke,N&&N(ke),ll(ae,ke,h.current))}}},[]),_=hr(P=>{const{onLayout:N}=k.current,{layout:K,panelDataArray:ae}=x.current;if(P.constraints.collapsible){const ne=ae.map(Ee=>Ee.constraints),{collapsedSize:Q=0,panelSize:pe,minSize:he=0,pivotIndices:re}=qi(ae,P,K);if(pe===Q){const Ee=S.current.get(P.id),ke=Ee!=null&&Ee>=he?Ee:he,Vt=hl(ae,P)===ae.length-1?pe-ke:ke-pe,mt=Ru({delta:Vt,layout:K,panelConstraints:ne,pivotIndices:re,trigger:"imperative-api"});kp(K,mt)||(v(mt),x.current.layout=mt,N&&N(mt),ll(ae,mt,h.current))}}},[]),R=hr(P=>{const{layout:N,panelDataArray:K}=x.current,{panelSize:ae}=qi(K,P,N);return Ye(ae!=null),ae},[]),T=hr((P,N)=>{const{panelDataArray:K}=x.current,ae=hl(K,P);return uAe({defaultSize:N,dragState:b,layout:w,panelData:K,panelIndex:ae})},[b,w]),L=hr(P=>{const{layout:N,panelDataArray:K}=x.current,{collapsedSize:ae=0,collapsible:ne,panelSize:Q}=qi(K,P,N);return ne===!0&&Q===ae},[]),D=hr(P=>{const{layout:N,panelDataArray:K}=x.current,{collapsedSize:ae=0,collapsible:ne,panelSize:Q}=qi(K,P,N);return Ye(Q!=null),!ne||Q>ae},[]),H=hr(P=>{const{panelDataArray:N}=x.current;N.push(P),N.sort((K,ae)=>{const ne=K.order,Q=ae.order;return ne==null&&Q==null?0:ne==null?-1:Q==null?1:ne-Q}),x.current.panelDataArrayChanged=!0},[]);vs(()=>{if(x.current.panelDataArrayChanged){x.current.panelDataArrayChanged=!1;const{autoSaveId:P,onLayout:N,storage:K}=k.current,{layout:ae,panelDataArray:ne}=x.current;let Q=null;if(P){const he=fAe(P,ne,K);he&&(S.current=new Map(Object.entries(he.expandToSizes)),Q=he.layout)}Q==null&&(Q=cAe({panelDataArray:ne}));const pe=nP({layout:Q,panelConstraints:ne.map(he=>he.constraints)});eP(ae,pe)||(v(pe),x.current.layout=pe,N&&N(pe),ll(ne,pe,h.current))}}),vs(()=>{const P=x.current;return()=>{P.layout=[]}},[]);const z=hr(P=>function(K){K.preventDefault();const ae=m.current;if(!ae)return()=>null;const{direction:ne,dragState:Q,id:pe,keyboardResizeBy:he,onLayout:re}=k.current,{layout:Ee,panelDataArray:ke}=x.current,{initialLayout:We}=Q??{},Vt=HU(pe,P,ae);let mt=lAe(K,P,ne,Q,he,ae);if(mt===0)return;const Hn=ne==="horizontal";document.dir==="rtl"&&Hn&&(mt=-mt);const F=ke.map(ye=>ye.constraints),q=Ru({delta:mt,layout:We??Ee,panelConstraints:F,pivotIndices:Vt,trigger:OU(K)?"keyboard":"mouse-or-touch"}),Y=!kp(Ee,q);(DU(K)||LU(K))&&E.current!=mt&&(E.current=mt,Y?Tx(P,0):Hn?Tx(P,mt<0?PU:$U):Tx(P,mt<0?FU:jU)),Y&&(v(q),x.current.layout=q,re&&re(q),ll(ke,q,h.current))},[]),M=hr((P,N)=>{const{onLayout:K}=k.current,{layout:ae,panelDataArray:ne}=x.current,Q=ne.map(We=>We.constraints),{panelSize:pe,pivotIndices:he}=qi(ne,P,ae);Ye(pe!=null);const Ee=hl(ne,P)===ne.length-1?pe-N:N-pe,ke=Ru({delta:Ee,layout:ae,panelConstraints:Q,pivotIndices:he,trigger:"imperative-api"});kp(ae,ke)||(v(ke),x.current.layout=ke,K&&K(ke),ll(ne,ke,h.current))},[]),U=hr((P,N)=>{const{layout:K,panelDataArray:ae}=x.current,{collapsedSize:ne=0,collapsible:Q}=N,{collapsedSize:pe=0,collapsible:he,maxSize:re=100,minSize:Ee=0}=P.constraints,{panelSize:ke}=qi(ae,P,K);Ye(ke!=null),Q&&he&&ke===ne?ne!==pe&&M(P,pe):kere&&M(P,re)},[M]),X=hr((P,N)=>{const{direction:K}=k.current,{layout:ae}=x.current;if(!m.current)return;const ne=Fh(P,m.current);Ye(ne);const Q=qU(K,N);y({dragHandleId:P,dragHandleRect:ne.getBoundingClientRect(),initialCursorPosition:Q,initialLayout:ae})},[]),j=hr(()=>{y(null)},[]),O=hr(P=>{const{panelDataArray:N}=x.current,K=hl(N,P);K>=0&&(N.splice(K,1),delete h.current[P.id],x.current.panelDataArrayChanged=!0)},[]),A=V_e(()=>({collapsePanel:C,direction:r,dragState:b,expandPanel:_,getPanelSize:R,getPanelStyle:T,groupId:g,isPanelCollapsed:L,isPanelExpanded:D,reevaluatePanelConstraints:U,registerPanel:H,registerResizeHandle:z,resizePanel:M,startDragging:X,stopDragging:j,unregisterPanel:O,panelGroupElement:m.current}),[C,b,r,_,R,T,g,L,D,U,H,z,M,X,j,O]),V={display:"flex",flexDirection:r==="horizontal"?"row":"column",height:"100%",overflow:"hidden",width:"100%"};return Ac(Lh.Provider,{value:A},Ac(u,{...d,children:t,className:n,id:o,ref:m,style:{...V,...c},"data-panel-group":"","data-panel-group-direction":r,"data-panel-group-id":g}))}const ZU=AU((e,t)=>Ac(YU,{...e,forwardedRef:t}));YU.displayName="PanelGroup";ZU.displayName="forwardRef(PanelGroup)";function hl(e,t){return e.findIndex(n=>n===t||n.id===t.id)}function qi(e,t,n){const r=hl(e,t),o=r===e.length-1?[r-1,r]:[r,r+1],i=n[r];return{...t.constraints,panelSize:i,pivotIndices:o}}function mAe({disabled:e,handleId:t,resizeHandler:n,panelGroupElement:r}){ys(()=>{if(e||n==null||r==null)return;const a=Fh(t,r);if(a==null)return;const o=i=>{if(!i.defaultPrevented)switch(i.key){case"ArrowDown":case"ArrowLeft":case"ArrowRight":case"ArrowUp":case"End":case"Home":{i.preventDefault(),n(i);break}case"F6":{i.preventDefault();const s=a.getAttribute("data-panel-group-id");Ye(s);const l=Dd(s,r),c=BU(s,t,r);Ye(c!==null);const u=i.shiftKey?c>0?c-1:l.length-1:c+1{a.removeEventListener("keydown",o)}},[r,e,t,n])}function XU({children:e=null,className:t="",disabled:n=!1,hitAreaMargins:r,id:a,onDragging:o,style:i={},tabIndex:s=0,tagName:l="div",...c}){const u=ar(null),d=ar({onDragging:o});ys(()=>{d.current.onDragging=o});const g=TU(Lh);if(g===null)throw Error("PanelResizeHandle components must be rendered within a PanelGroup container");const{direction:m,groupId:b,registerResizeHandle:y,startDragging:w,stopDragging:v,panelGroupElement:h}=g,S=XA(a),[E,k]=Zu("inactive"),[x,C]=Zu(!1),[_,R]=Zu(null),T=ar({state:E});return vs(()=>{T.current.state=E}),ys(()=>{if(n)R(null);else{const D=y(S);R(()=>D)}},[n,S,y]),ys(()=>{var D,H;if(n||_==null)return;const z=u.current;Ye(z);const M=(U,X,j)=>{if(X)switch(U){case"down":{k("drag"),w(S,j);const{onDragging:O}=d.current;O&&O(!0);break}case"move":{const{state:O}=T.current;O!=="drag"&&k("hover"),_(j);break}case"up":{k("hover"),v();const{onDragging:O}=d.current;O&&O(!1);break}}else k("inactive")};return rAe(S,z,m,{coarse:(D=r==null?void 0:r.coarse)!==null&&D!==void 0?D:15,fine:(H=r==null?void 0:r.fine)!==null&&H!==void 0?H:5},M)},[m,n,r,y,S,_,w,v]),mAe({disabled:n,handleId:S,resizeHandler:_,panelGroupElement:h}),Ac(l,{...c,children:e,className:t,id:a,onBlur:()=>C(!1),onFocus:()=>C(!0),ref:u,role:"separator",style:{...{touchAction:"none",userSelect:"none"},...i},tabIndex:s,"data-panel-group-direction":m,"data-panel-group-id":b,"data-resize-handle":"","data-resize-handle-active":E==="drag"?"pointer":x?"keyboard":void 0,"data-resize-handle-state":E,"data-panel-resize-handle-enabled":!n,"data-panel-resize-handle-id":S})}XU.displayName="PanelResizeHandle";const hAe=({className:e,...t})=>f.jsx(ZU,{className:ee("flex h-full w-full data-[panel-group-direction=vertical]:flex-col",e),...t}),aP=IU,bAe=({withHandle:e,className:t,...n})=>f.jsx(XU,{className:ee("relative flex w-px items-center justify-center bg-border after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:-translate-y-1/2 data-[panel-group-direction=vertical]:after:translate-x-0 [&[data-panel-group-direction=vertical]>div]:rotate-90",t),...n,children:e&&f.jsx("div",{className:"z-10 flex h-4 w-3 items-center justify-center rounded-sm border bg-border",children:f.jsx(Aq,{className:"h-2.5 w-2.5"})})}),[jh,STe]=zn("Tooltip",[qa]),eT=qa(),yAe="TooltipProvider",vAe=700,Kk="tooltip.open",[SAe,tT]=jh(yAe),wAe=e=>{const{__scopeTooltip:t,delayDuration:n=vAe,skipDelayDuration:r=300,disableHoverableContent:a=!1,children:o}=e,[i,s]=p.useState(!0),l=p.useRef(!1),c=p.useRef(0);return p.useEffect(()=>{const u=c.current;return()=>window.clearTimeout(u)},[]),p.createElement(SAe,{scope:t,isOpenDelayed:i,delayDuration:n,onOpen:p.useCallback(()=>{window.clearTimeout(c.current),s(!1)},[]),onClose:p.useCallback(()=>{window.clearTimeout(c.current),c.current=window.setTimeout(()=>s(!0),r)},[r]),isPointerInTransitRef:l,onPointerInTransitChange:p.useCallback(u=>{l.current=u},[]),disableHoverableContent:a},o)},nT="Tooltip",[EAe,zh]=jh(nT),xAe=e=>{const{__scopeTooltip:t,children:n,open:r,defaultOpen:a=!1,onOpenChange:o,disableHoverableContent:i,delayDuration:s}=e,l=tT(nT,e.__scopeTooltip),c=eT(t),[u,d]=p.useState(null),g=bi(),m=p.useRef(0),b=i??l.disableHoverableContent,y=s??l.delayDuration,w=p.useRef(!1),[v=!1,h]=Fa({prop:r,defaultProp:a,onChange:C=>{C?(l.onOpen(),document.dispatchEvent(new CustomEvent(Kk))):l.onClose(),o==null||o(C)}}),S=p.useMemo(()=>v?w.current?"delayed-open":"instant-open":"closed",[v]),E=p.useCallback(()=>{window.clearTimeout(m.current),w.current=!1,h(!0)},[h]),k=p.useCallback(()=>{window.clearTimeout(m.current),h(!1)},[h]),x=p.useCallback(()=>{window.clearTimeout(m.current),m.current=window.setTimeout(()=>{w.current=!0,h(!0)},y)},[y,h]);return p.useEffect(()=>()=>window.clearTimeout(m.current),[]),p.createElement(ah,c,p.createElement(EAe,{scope:t,contentId:g,open:v,stateAttribute:S,trigger:u,onTriggerChange:d,onTriggerEnter:p.useCallback(()=>{l.isOpenDelayed?x():E()},[l.isOpenDelayed,x,E]),onTriggerLeave:p.useCallback(()=>{b?k():window.clearTimeout(m.current)},[k,b]),onOpen:E,onClose:k,disableHoverableContent:b},n))},oP="TooltipTrigger",kAe=p.forwardRef((e,t)=>{const{__scopeTooltip:n,...r}=e,a=zh(oP,n),o=tT(oP,n),i=eT(n),s=p.useRef(null),l=nt(t,s,a.onTriggerChange),c=p.useRef(!1),u=p.useRef(!1),d=p.useCallback(()=>c.current=!1,[]);return p.useEffect(()=>()=>document.removeEventListener("pointerup",d),[d]),p.createElement(pf,W({asChild:!0},i),p.createElement(ze.button,W({"aria-describedby":a.open?a.contentId:void 0,"data-state":a.stateAttribute},r,{ref:l,onPointerMove:fe(e.onPointerMove,g=>{g.pointerType!=="touch"&&!u.current&&!o.isPointerInTransitRef.current&&(a.onTriggerEnter(),u.current=!0)}),onPointerLeave:fe(e.onPointerLeave,()=>{a.onTriggerLeave(),u.current=!1}),onPointerDown:fe(e.onPointerDown,()=>{c.current=!0,document.addEventListener("pointerup",d,{once:!0})}),onFocus:fe(e.onFocus,()=>{c.current||a.onOpen()}),onBlur:fe(e.onBlur,a.onClose),onClick:fe(e.onClick,a.onClose)})))}),CAe="TooltipPortal",[wTe,_Ae]=jh(CAe,{forceMount:void 0}),Ld="TooltipContent",AAe=p.forwardRef((e,t)=>{const n=_Ae(Ld,e.__scopeTooltip),{forceMount:r=n.forceMount,side:a="top",...o}=e,i=zh(Ld,e.__scopeTooltip);return p.createElement(pr,{present:r||i.open},i.disableHoverableContent?p.createElement(QU,W({side:a},o,{ref:t})):p.createElement(TAe,W({side:a},o,{ref:t})))}),TAe=p.forwardRef((e,t)=>{const n=zh(Ld,e.__scopeTooltip),r=tT(Ld,e.__scopeTooltip),a=p.useRef(null),o=nt(t,a),[i,s]=p.useState(null),{trigger:l,onClose:c}=n,u=a.current,{onPointerInTransitChange:d}=r,g=p.useCallback(()=>{s(null),d(!1)},[d]),m=p.useCallback((b,y)=>{const w=b.currentTarget,v={x:b.clientX,y:b.clientY},h=NAe(v,w.getBoundingClientRect()),S=IAe(v,h),E=OAe(y.getBoundingClientRect()),k=LAe([...S,...E]);s(k),d(!0)},[d]);return p.useEffect(()=>()=>g(),[g]),p.useEffect(()=>{if(l&&u){const b=w=>m(w,u),y=w=>m(w,l);return l.addEventListener("pointerleave",b),u.addEventListener("pointerleave",y),()=>{l.removeEventListener("pointerleave",b),u.removeEventListener("pointerleave",y)}}},[l,u,m,g]),p.useEffect(()=>{if(i){const b=y=>{const w=y.target,v={x:y.clientX,y:y.clientY},h=(l==null?void 0:l.contains(w))||(u==null?void 0:u.contains(w)),S=!DAe(v,i);h?g():S&&(g(),c())};return document.addEventListener("pointermove",b),()=>document.removeEventListener("pointermove",b)}},[l,u,i,c,g]),p.createElement(QU,W({},e,{ref:o}))}),[RAe,ETe]=jh(nT,{isInside:!1}),QU=p.forwardRef((e,t)=>{const{__scopeTooltip:n,children:r,"aria-label":a,onEscapeKeyDown:o,onPointerDownOutside:i,...s}=e,l=zh(Ld,n),c=eT(n),{onClose:u}=l;return p.useEffect(()=>(document.addEventListener(Kk,u),()=>document.removeEventListener(Kk,u)),[u]),p.useEffect(()=>{if(l.trigger){const d=g=>{const m=g.target;m!=null&&m.contains(l.trigger)&&u()};return window.addEventListener("scroll",d,{capture:!0}),()=>window.removeEventListener("scroll",d,{capture:!0})}},[l.trigger,u]),p.createElement(Ls,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:o,onPointerDownOutside:i,onFocusOutside:d=>d.preventDefault(),onDismiss:u},p.createElement(gf,W({"data-state":l.stateAttribute},c,s,{ref:t,style:{...s.style,"--radix-tooltip-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-tooltip-content-available-width":"var(--radix-popper-available-width)","--radix-tooltip-content-available-height":"var(--radix-popper-available-height)","--radix-tooltip-trigger-width":"var(--radix-popper-anchor-width)","--radix-tooltip-trigger-height":"var(--radix-popper-anchor-height)"}}),p.createElement(Rm,null,r),p.createElement(RAe,{scope:n,isInside:!0},p.createElement(qV,{id:l.contentId,role:"tooltip"},a||r))))});function NAe(e,t){const n=Math.abs(t.top-e.y),r=Math.abs(t.bottom-e.y),a=Math.abs(t.right-e.x),o=Math.abs(t.left-e.x);switch(Math.min(n,r,a,o)){case o:return"left";case a:return"right";case n:return"top";case r:return"bottom";default:throw new Error("unreachable")}}function IAe(e,t,n=5){const r=[];switch(t){case"top":r.push({x:e.x-n,y:e.y+n},{x:e.x+n,y:e.y+n});break;case"bottom":r.push({x:e.x-n,y:e.y-n},{x:e.x+n,y:e.y-n});break;case"left":r.push({x:e.x+n,y:e.y-n},{x:e.x+n,y:e.y+n});break;case"right":r.push({x:e.x-n,y:e.y-n},{x:e.x-n,y:e.y+n});break}return r}function OAe(e){const{top:t,right:n,bottom:r,left:a}=e;return[{x:a,y:t},{x:n,y:t},{x:n,y:r},{x:a,y:r}]}function DAe(e,t){const{x:n,y:r}=e;let a=!1;for(let o=0,i=t.length-1;or!=u>r&&n<(c-s)*(r-l)/(u-l)+s&&(a=!a)}return a}function LAe(e){const t=e.slice();return t.sort((n,r)=>n.xr.x?1:n.yr.y?1:0),MAe(t)}function MAe(e){if(e.length<=1)return e.slice();const t=[];for(let r=0;r=2;){const o=t[t.length-1],i=t[t.length-2];if((o.x-i.x)*(a.y-i.y)>=(o.y-i.y)*(a.x-i.x))t.pop();else break}t.push(a)}t.pop();const n=[];for(let r=e.length-1;r>=0;r--){const a=e[r];for(;n.length>=2;){const o=n[n.length-1],i=n[n.length-2];if((o.x-i.x)*(a.y-i.y)>=(o.y-i.y)*(a.x-i.x))n.pop();else break}n.push(a)}return n.pop(),t.length===1&&n.length===1&&t[0].x===n[0].x&&t[0].y===n[0].y?t:t.concat(n)}const PAe=wAe,$Ae=xAe,FAe=kAe,JU=AAe,jAe=PAe,Yk=$Ae,Zk=FAe,dm=p.forwardRef(({className:e,sideOffset:t=4,...n},r)=>f.jsx(JU,{ref:r,sideOffset:t,className:ee("z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...n}));dm.displayName=JU.displayName;const eB=p.createContext({setTheme(e){},toggleTheme(){},theme:localStorage.getItem("theme")==="dark"?"dark":"light"});function zAe({children:e}){const[t,n]=p.useState(localStorage.getItem("theme")==="dark"?"dark":"light"),r=p.useCallback(()=>n(o=>o==="light"?"dark":"light"),[n]),a=p.useMemo(()=>({theme:t,setTheme:n,toggleTheme:r}),[t,n,r]);return p.useEffect(()=>{t==="light"?(document.documentElement.classList.remove("dark"),document.documentElement.classList.add("light")):(document.documentElement.classList.remove("light"),document.documentElement.classList.add("dark")),localStorage.setItem("theme",t)},[t]),f.jsx(eB.Provider,{value:a,children:e})}const UAe=()=>p.useContext(eB);function iP({links:e,isCollapsed:t}){return f.jsx("div",{"data-collapsed":t,className:"group flex flex-col gap-4 py-2 data-[collapsed=true]:py-2",children:f.jsx("nav",{className:"grid gap-1 px-2 group-[[data-collapsed=true]]:justify-center group-[[data-collapsed=true]]:px-2",children:e.map((n,r)=>t?f.jsxs(Yk,{delayDuration:0,children:[f.jsx(Zk,{asChild:!0,children:f.jsxs(bd,{to:n.to,className:ee(yc({variant:n.variant,size:"icon"}),"h-9 w-9",n.variant==="default"&&"bg-background-darker text-black dark:bg-muted dark:text-muted-foreground dark:hover:bg-muted dark:hover:text-white"),children:[f.jsx(n.icon,{className:"h-4 w-4"}),f.jsx("span",{className:"sr-only",children:n.title})]})}),f.jsxs(dm,{side:"right",className:"flex items-center gap-4",children:[n.title,n.label&&f.jsx("span",{className:"ml-auto text-muted-foreground",children:n.label})]})]},r):f.jsxs(bd,{to:n.to,className:ee(yc({variant:n.variant,size:"sm"}),n.variant==="default"&&"bg-background-darker hover:text-background text-foreground dark:bg-muted dark:text-white dark:hover:bg-muted dark:hover:text-white","justify-start"),children:[f.jsx(n.icon,{className:"mr-2 h-4 w-4"}),n.title,n.label&&f.jsx("span",{className:ee("ml-auto",n.variant==="default"&&"text-background dark:text-white"),children:n.label})]},r))})})}function BAe(e){const{className:t,collapse:n}=e;return f.jsxs("svg",{className:t,height:"28",...n?{width:28,viewBox:"0 0 28 28"}:{width:96,viewBox:"0 0 96 28"},fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[f.jsx("path",{d:"M16.9282 11.2005H11.2857V16.8003H16.9282V11.2005Z",fill:"currentColor"}),f.jsx("path",{d:"M22.5705 3.81489V0H5.64243V3.81489C5.64243 4.80109 4.8376 5.59984 3.84391 5.59984H0V22.4002H3.84391C4.8376 22.4002 5.64243 23.1989 5.64243 24.1851V28H22.5705V24.1851C22.5705 23.1989 23.3753 22.4002 24.369 22.4002H28.213V5.59984H24.369C23.3753 5.59984 22.5705 4.80109 22.5705 3.81489ZM22.5705 20.6144C22.5705 21.6006 21.7657 22.3994 20.772 22.3994H7.44174C6.44805 22.3994 5.64322 21.6006 5.64322 20.6144V7.3848C5.64322 6.3986 6.44805 5.59984 7.44174 5.59984H20.772C21.7657 5.59984 22.5705 6.3986 22.5705 7.3848V20.6144Z",fill:"currentColor"}),!n&&f.jsxs(f.Fragment,{children:[f.jsx("path",{d:"M44.8064 5.59982H42.3182V22.3994H53.3766V20.0233H44.8064V5.59982Z",fill:"currentColor"}),f.jsx("path",{d:"M60.5503 10.5463H59.6655C57.0057 10.5463 54.3224 12.1648 54.3224 15.7798V17.5368C54.3224 20.8134 56.233 22.7703 59.4327 22.7703H60.7838C63.4835 22.7703 65.4043 21.193 65.7985 18.6528L65.833 18.4288H63.2704L63.2281 18.5673C62.8488 19.8133 61.8574 20.3942 60.1083 20.3942C57.838 20.3942 56.7667 19.3933 56.7408 17.2459H65.8933V15.7798C65.8933 12.1648 63.21 10.5463 60.5503 10.5463ZM56.8145 15.1459C57.0684 13.5702 58.0394 12.9223 60.1075 12.9223C62.1756 12.9223 63.1458 13.5702 63.3997 15.1459H56.8145Z",fill:"currentColor"}),f.jsx("path",{d:"M70.8579 5.59982H68.3705V10.5463H66.717V12.9224H68.3705V17.6286C68.3705 21.7795 70.9151 22.3994 72.4323 22.3994H74.002V20.0233H73.1078C71.5099 20.0233 70.8579 19.2222 70.8579 17.2592V12.9232H74.002V10.5471H70.8579V5.59982Z",fill:"currentColor"}),f.jsx("path",{d:"M79.2637 5.59982H76.7764V10.5463H75.1228V12.9224H76.7764V17.6286C76.7764 21.7795 79.3209 22.3994 80.8381 22.3994H82.4078V20.0233H81.5137C79.9158 20.0233 79.2637 19.2222 79.2637 17.2592V12.9232H82.4078V10.5471H79.2637V5.59982Z",fill:"currentColor"}),f.jsx("path",{d:"M95.2238 20.0232C94.7309 20.0232 94.5115 19.8195 94.5115 19.3622V15.317C94.5115 11.1662 91.9669 10.5463 90.4497 10.5463H88.1676C86.1944 10.5463 84.0824 11.9805 84.0824 14.1154V14.3098H86.5697V14.1154C86.5697 13.4574 87.3808 12.9231 88.3769 12.9231H89.7742C91.5594 12.9231 91.9449 13.5609 92.0163 14.9849H88.4231C85.645 14.9849 83.7791 16.4565 83.7791 18.6466V18.9009C83.7791 20.0575 84.2313 22.7477 88.4231 22.7477C89.4936 22.7477 91.3642 22.5618 92.3705 21.3765C92.9802 22.4008 94.2646 22.4008 95.2238 22.4008H95.4197V20.0248H95.2238V20.0232ZM92.0233 18.7609C92.0233 20.0808 89.9121 20.3694 89.0979 20.3694C86.7288 20.3694 86.2657 19.7961 86.2657 18.8068C86.2657 17.7086 87.2453 17.1284 89.0979 17.1284H92.0233V18.7609Z",fill:"currentColor"})]})]})}function HAe({defaultLayout:e=[265,440,655],defaultCollapsed:t=!1,navCollapsedSize:n,children:r}){const a=Li(),o=b=>{var y;return((y=a.pathname.split("/"))==null?void 0:y[1])===b?"default":"ghost"},i=[{title:"Agents",icon:Lm,variant:o("agents"),to:"agents"},{title:"Data Sources",icon:_q,variant:o("files"),to:"data-sources"},{title:"Tool Builder",icon:zq,variant:o("tools"),to:"tools"},{title:"Agent Templates",icon:kq,variant:o("agent-templates"),to:"agent-templates"},{title:"User Templates",icon:QC,variant:o("human-templates"),to:"human-templates"}],{theme:s,toggleTheme:l}=UAe(),[c,u]=p.useState(t),{logout:d}=iY(),g=Mi(),m=()=>{d(),g("/login")};return f.jsx(jAe,{delayDuration:0,children:f.jsxs(hAe,{direction:"horizontal",onLayout:b=>{document.cookie=`react-resizable-panels:layout=${JSON.stringify(b)}`},className:"h-full items-stretch",children:[f.jsxs(aP,{defaultSize:e[0],collapsedSize:n,collapsible:!0,minSize:14,maxSize:20,onCollapse:()=>{u(!0),document.cookie=`react-resizable-panels:collapsed=${JSON.stringify(!0)}`},onExpand:()=>{u(!1),document.cookie=`react-resizable-panels:collapsed=${JSON.stringify(!1)}`},className:ee("flex flex-col",c&&"min-w-[50px] transition-all duration-300 ease-in-out"),children:[f.jsx(jF,{to:"/",className:ee("flex h-[56px] items-center",c?"h-[56px] justify-center":"px-2"),children:f.jsx(BAe,{collapse:c,className:"h-[24px] dark:text-white"})}),f.jsx(Nd,{}),f.jsx(iP,{isCollapsed:c,links:i}),f.jsx(Nd,{}),f.jsx(iP,{isCollapsed:c,links:[{title:"Settings",icon:Eq,variant:o("settings"),to:"settings"}]}),f.jsx("div",{className:ee("flex flex-1 items-end",c&&"justify-center p-2.5"),children:f.jsxs("div",{className:"grid gap-2",children:[c?f.jsxs(Yk,{delayDuration:0,children:[f.jsx(Zk,{asChild:!0,children:f.jsxs(ue,{variant:"ghost",onClick:l,size:"icon",className:"h-9 w-9",children:[f.jsx("span",{className:"sr-only",children:"Toggle Dark Mode"}),s==="light"?f.jsx(wR,{className:"h-4 w-4"}):f.jsx(ER,{className:"w-4 w-4"})]})}),f.jsx(dm,{side:"right",className:"flex items-center gap-4",children:"Toggle Dark Mode"})]}):f.jsx(ue,{className:"m-2.5",variant:"ghost",size:c?"icon":"sm",onClick:l,children:s==="light"?f.jsx(wR,{className:"h-4 w-4"}):f.jsx(ER,{className:"w-4 w-4"})}),c?f.jsxs(Yk,{delayDuration:0,children:[f.jsx(Zk,{asChild:!0,children:f.jsxs(ue,{variant:"ghost",onClick:m,size:"icon",className:"h-9 w-9",children:[f.jsx("span",{className:"sr-only",children:"Sign Out"}),f.jsx(SR,{className:"h-4 w-4"})]})}),f.jsx(dm,{side:"right",className:"flex items-center gap-4",children:"Sign Out"})]}):f.jsx(ue,{className:"m-2.5",variant:"ghost",size:c?"icon":"sm",onClick:m,children:f.jsx(SR,{className:"h-4 w-4"})})]})})]}),f.jsx(bAe,{withHandle:!0}),f.jsx(aP,{className:"h-full",defaultSize:e[1],minSize:30,children:r})]})})}/*! js-cookie v3.0.5 | MIT */function Cp(e){for(var t=1;t"u")){i=Cp({},t,i),typeof i.expires=="number"&&(i.expires=new Date(Date.now()+i.expires*864e5)),i.expires&&(i.expires=i.expires.toUTCString()),a=encodeURIComponent(a).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var s="";for(var l in i)i[l]&&(s+="; "+l,i[l]!==!0&&(s+="="+i[l].split(";")[0]));return document.cookie=a+"="+e.write(o,a)+s}}function r(a){if(!(typeof document>"u"||arguments.length&&!a)){for(var o=document.cookie?document.cookie.split("; "):[],i={},s=0;s{const e=sP.get("react-resizable-panels:layout"),t=sP.get("react-resizable-panels:collapsed"),n=e?JSON.parse(e):void 0,r=t?JSON.parse(t):void 0;return{defaultLayout:n,defaultCollapsed:r}},GAe=()=>{const{defaultCollapsed:e,defaultLayout:t}=qAe();return f.jsx(AZ,{children:f.jsx(hX,{children:f.jsx(HAe,{defaultLayout:t,defaultCollapsed:e,navCollapsedSize:4,children:f.jsx(PF,{})})})})},WAe=bK([{path:"/",element:GAe(),children:[{path:"",element:f.jsx(MF,{to:"/agents",replace:!0})},Mie,wke,nCe,ACe,t_e,R_e,U_e]}]),KAe=new zG;function YAe(){return f.jsx(Jm,{className:"bg-red-600 text-white rounded-none",children:f.jsxs("div",{children:[f.jsxs("div",{className:"flex items-center mb-3 gap-2",children:[f.jsx(X4,{className:"w-6 h-6"}),f.jsx("div",{className:"font-bold",children:"DEPRECATION NOTICE"})]}),"The self-hosted Letta dev portal is deprecated and will not work as intended with newer versions of Letta (",">","v0.5.0). Please use our new Agent Development Environment at ",f.jsx("a",{className:"underline",href:"https://app.letta.com",children:"https://app.letta.com"})]})})}function ZAe(){return f.jsxs(qG,{client:KAe,children:[f.jsxs(zAe,{children:[f.jsx(YAe,{}),f.jsx(CK,{router:WAe}),f.jsx(CG,{})]}),f.jsx(oW,{initialIsOpen:!1})]})}const XAe=O4(document.getElementById("root"));XAe.render(f.jsx(p.StrictMode,{children:f.jsx(ZAe,{})})); diff --git a/letta/server/static_files/assets/index-3ab03d5b.css b/letta/server/static_files/assets/index-3ab03d5b.css deleted file mode 100644 index bb60d84cb5..0000000000 --- a/letta/server/static_files/assets/index-3ab03d5b.css +++ /dev/null @@ -1 +0,0 @@ -*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}:root{--background: 210, 10%, 92%;--background-lighter: 0, 0%, 100%;--background-darker: 210, 6%, 86%;--foreground: 224 71.4% 4.1%;--card: 0 0% 100%;--card-foreground: 224 71.4% 4.1%;--popover: 0 0% 100%;--popover-foreground: 224 71.4% 4.1%;--primary: 220.9 39.3% 11%;--primary-foreground: 210 20% 98%;--secondary: 240, 92%, 35%;--secondary-foreground: 0, 0%, 100%;--muted: 220 14.3% 95.9%;--muted-foreground: 220 8.9% 46.1%;--accent: 220 14.3% 95.9%;--accent-foreground: 220.9 39.3% 11%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 210 20% 98%;--border: 210, 6%, 86%;--input: 210, 6%, 86%;--ring: 224 71.4% 4.1%;--radius: .5rem}.dark{--background: 224 71.4% 4.1%;--background-lighter: 224 71.4% 4.1%;--background-darker: 224 71.4% 4.1%;--foreground: 210 20% 98%;--card: 224 71.4% 4.1%;--card-foreground: 210 20% 98%;--popover: 224 71.4% 4.1%;--popover-foreground: 210 20% 98%;--primary: 210 20% 98%;--primary-foreground: 220.9 39.3% 11%;--secondary: 10, 100%, 60%;--secondary-foreground: 210 20% 98%;--muted: 215 27.9% 16.9%;--muted-foreground: 217.9 10.6% 64.9%;--accent: 215 27.9% 16.9%;--accent-foreground: 210 20% 98%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 210 20% 98%;--border: 215 27.9% 16.9%;--input: 215 27.9% 16.9%;--ring: 216 12.2% 83.9%}*{border-color:hsl(var(--border))}html{height:100%}body{height:100%;width:100%;background-color:hsl(var(--background));color:hsl(var(--foreground));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}input::file-selector-button{color:hsl(var(--foreground))}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.prose-sm{font-size:.875rem;line-height:1.7142857}.prose-sm :where(p):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm :where([class~="lead"]):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:1.2857143em;line-height:1.5555556;margin-top:.8888889em;margin-bottom:.8888889em}.prose-sm :where(blockquote):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.3333333em;margin-bottom:1.3333333em;padding-inline-start:1.1111111em}.prose-sm :where(h1):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:2.1428571em;margin-top:0;margin-bottom:.8em;line-height:1.2}.prose-sm :where(h2):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:1.4285714em;margin-top:1.6em;margin-bottom:.8em;line-height:1.4}.prose-sm :where(h3):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:1.2857143em;margin-top:1.5555556em;margin-bottom:.4444444em;line-height:1.5555556}.prose-sm :where(h4):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.4285714em;margin-bottom:.5714286em;line-height:1.4285714}.prose-sm :where(img):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(picture):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(picture > img):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:0;margin-bottom:0}.prose-sm :where(video):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(kbd):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:.8571429em;border-radius:.3125rem;padding-top:.1428571em;padding-inline-end:.3571429em;padding-bottom:.1428571em;padding-inline-start:.3571429em}.prose-sm :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:.8571429em}.prose-sm :where(h2 code):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:.9em}.prose-sm :where(h3 code):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:.8888889em}.prose-sm :where(pre):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:.8571429em;line-height:1.6666667;margin-top:1.6666667em;margin-bottom:1.6666667em;border-radius:.25rem;padding-top:.6666667em;padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(ol):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.1428571em;margin-bottom:1.1428571em;padding-inline-start:1.5714286em}.prose-sm :where(ul):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.1428571em;margin-bottom:1.1428571em;padding-inline-start:1.5714286em}.prose-sm :where(li):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:.2857143em;margin-bottom:.2857143em}.prose-sm :where(ol > li):not(:where([class~="not-prose"],[class~="not-prose"] *)){padding-inline-start:.4285714em}.prose-sm :where(ul > li):not(:where([class~="not-prose"],[class~="not-prose"] *)){padding-inline-start:.4285714em}.prose-sm :where(.prose-sm > ul > li p):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:.5714286em;margin-bottom:.5714286em}.prose-sm :where(.prose-sm > ul > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.1428571em}.prose-sm :where(.prose-sm > ul > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-bottom:1.1428571em}.prose-sm :where(.prose-sm > ol > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.1428571em}.prose-sm :where(.prose-sm > ol > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-bottom:1.1428571em}.prose-sm :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:.5714286em;margin-bottom:.5714286em}.prose-sm :where(dl):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm :where(dt):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.1428571em}.prose-sm :where(dd):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:.2857143em;padding-inline-start:1.5714286em}.prose-sm :where(hr):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:2.8571429em;margin-bottom:2.8571429em}.prose-sm :where(hr + *):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:0}.prose-sm :where(h2 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:0}.prose-sm :where(h3 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:0}.prose-sm :where(h4 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:0}.prose-sm :where(table):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:.8571429em;line-height:1.5}.prose-sm :where(thead th):not(:where([class~="not-prose"],[class~="not-prose"] *)){padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(thead th:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){padding-inline-start:0}.prose-sm :where(thead th:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){padding-inline-end:0}.prose-sm :where(tbody td,tfoot td):not(:where([class~="not-prose"],[class~="not-prose"] *)){padding-top:.6666667em;padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(tbody td:first-child,tfoot td:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){padding-inline-start:0}.prose-sm :where(tbody td:last-child,tfoot td:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){padding-inline-end:0}.prose-sm :where(figure):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(figure > *):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:0;margin-bottom:0}.prose-sm :where(figcaption):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:.8571429em;line-height:1.3333333;margin-top:.6666667em}.prose-sm :where(.prose-sm > :first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:0}.prose-sm :where(.prose-sm > :last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-bottom:0}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.\!collapse{visibility:collapse!important}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0px}.bottom-0{bottom:0px}.bottom-2{bottom:.5rem}.left-2{left:.5rem}.left-3{left:.75rem}.left-\[12px\]{left:12px}.left-\[50\%\]{left:50%}.right-0{right:0px}.right-2{right:.5rem}.right-2\.5{right:.625rem}.right-3{right:.75rem}.right-4{right:1rem}.top-0{top:0px}.top-2{top:.5rem}.top-2\.5{top:.625rem}.top-3{top:.75rem}.top-4{top:1rem}.top-\[50\%\]{top:50%}.z-10{z-index:10}.z-50{z-index:50}.z-\[100\]{z-index:100}.order-2{order:2}.m-2{margin:.5rem}.m-2\.5{margin:.625rem}.\!my-4{margin-top:1rem!important;margin-bottom:1rem!important}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.-mx-4{margin-left:-1rem;margin-right:-1rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-10{margin-top:2.5rem;margin-bottom:2.5rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.\!-mt-4{margin-top:-1rem!important}.-ml-1{margin-left:-.25rem}.-ml-2{margin-left:-.5rem}.-ml-3{margin-left:-.75rem}.-mt-2{margin-top:-.5rem}.-mt-8{margin-top:-2rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-6{margin-left:1.5rem}.ml-8{margin-left:2rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-4{margin-right:1rem}.mt-0{margin-top:0}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-px{margin-top:1px}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.\!table{display:table!important}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.aspect-square{aspect-ratio:1 / 1}.size-3{width:.75rem;height:.75rem}.size-3\.5{width:.875rem;height:.875rem}.size-4{width:1rem;height:1rem}.size-5{width:1.25rem;height:1.25rem}.size-6{width:1.5rem;height:1.5rem}.\!h-6{height:1.5rem!important}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[1px\]{height:1px}.h-\[24px\]{height:24px}.h-\[35px\]{height:35px}.h-\[56px\]{height:56px}.h-\[70px\]{height:70px}.h-\[78px\]{height:78px}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-full{height:100%}.h-px{height:1px}.max-h-\[200px\]{max-height:200px}.max-h-\[400px\]{max-height:400px}.max-h-\[95svh\]{max-height:95svh}.max-h-screen{max-height:100vh}.min-h-0{min-height:0px}.min-h-40{min-height:10rem}.min-h-8{min-height:2rem}.min-h-80{min-height:20rem}.min-h-96{min-height:24rem}.min-h-\[10rem\]{min-height:10rem}.min-h-\[60vh\]{min-height:60vh}.min-h-\[80px\]{min-height:80px}.\!w-6{width:1.5rem!important}.w-10{width:2.5rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-52{width:13rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-96{width:24rem}.w-\[100px\]{width:100px}.w-\[150px\]{width:150px}.w-\[1px\]{width:1px}.w-\[300px\]{width:300px}.w-\[340px\]{width:340px}.w-\[44px\]{width:44px}.w-\[70px\]{width:70px}.w-\[80px\]{width:80px}.w-\[95\%\]{width:95%}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-min{width:-moz-min-content;width:min-content}.w-px{width:1px}.min-w-\[50px\]{min-width:50px}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.max-w-80{max-width:20rem}.max-w-lg{max-width:32rem}.max-w-screen-lg{max-width:1024px}.max-w-xl{max-width:36rem}.flex-1{flex:1 1 0%}.flex-none{flex:none}.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.origin-left{transform-origin:left}.translate-x-\[-50\%\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes ping{75%,to{transform:scale(2);opacity:0}}.animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}@keyframes progress{0%{transform:translate(0) scaleX(0)}40%{transform:translate(0) scaleX(.4)}to{transform:translate(100%) scaleX(.5)}}.animate-progress{animation:progress 1.5s infinite linear}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.scroll-m-20{scroll-margin:5rem}.scroll-pb-10{scroll-padding-bottom:2.5rem}.list-disc{list-style-type:disc}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-8{gap:2rem}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.25rem * var(--tw-space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(1rem * var(--tw-space-x-reverse));margin-left:calc(1rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(1.5rem * var(--tw-space-x-reverse));margin-left:calc(1.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-x-scroll{overflow-x:scroll}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-none{border-radius:0}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-br-none{border-bottom-right-radius:0}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-0{border-bottom-width:0px}.border-b-\[1px\]{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-r-2{border-right-width:2px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-destructive{border-color:hsl(var(--destructive))}.border-destructive\/50{border-color:hsl(var(--destructive) / .5)}.border-input{border-color:hsl(var(--input))}.border-muted{border-color:hsl(var(--muted))}.border-primary{border-color:hsl(var(--primary))}.border-transparent{border-color:transparent}.border-white{--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity))}.bg-\[\#ecedef\]{--tw-bg-opacity: 1;background-color:rgb(236 237 239 / var(--tw-bg-opacity))}.bg-accent{background-color:hsl(var(--accent))}.bg-background{background-color:hsl(var(--background))}.bg-background-darker{background-color:hsl(var(--background-darker))}.bg-background-lighter{background-color:hsl(var(--background-lighter))}.bg-background\/80{background-color:hsl(var(--background) / .8)}.bg-background\/95{background-color:hsl(var(--background) / .95)}.bg-blue-400{--tw-bg-opacity: 1;background-color:rgb(96 165 250 / var(--tw-bg-opacity))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity))}.bg-border{background-color:hsl(var(--border))}.bg-card{background-color:hsl(var(--card))}.bg-destructive{background-color:hsl(var(--destructive))}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity))}.bg-muted{background-color:hsl(var(--muted))}.bg-muted\/50{background-color:hsl(var(--muted) / .5)}.bg-popover{background-color:hsl(var(--popover))}.bg-primary{background-color:hsl(var(--primary))}.bg-secondary{background-color:hsl(var(--secondary))}.bg-slate-950{--tw-bg-opacity: 1;background-color:rgb(2 6 23 / var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.bg-zinc-800{--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity))}.bg-zinc-950{--tw-bg-opacity: 1;background-color:rgb(9 9 11 / var(--tw-bg-opacity))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-transparent{--tw-gradient-from: transparent var(--tw-gradient-from-position);--tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-background{--tw-gradient-to: hsl(var(--background)) var(--tw-gradient-to-position)}.to-55\%{--tw-gradient-to-position: 55%}.fill-current{fill:currentColor}.\!p-1{padding:.25rem!important}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-20{padding:5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-0{padding-left:0;padding-right:0}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.px-\[0\.3rem\]{padding-left:.3rem;padding-right:.3rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-\[0\.2rem\]{padding-top:.2rem;padding-bottom:.2rem}.pb-10{padding-bottom:2.5rem}.pb-16{padding-bottom:4rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-6{padding-bottom:1.5rem}.pl-10{padding-left:2.5rem}.pl-6{padding-left:1.5rem}.pl-7{padding-left:1.75rem}.pl-8{padding-left:2rem}.pl-9{padding-left:2.25rem}.pr-1{padding-right:.25rem}.pr-1\.5{padding-right:.375rem}.pr-10{padding-right:2.5rem}.pr-2{padding-right:.5rem}.pr-4{padding-right:1rem}.pr-6{padding-right:1.5rem}.pr-8{padding-right:2rem}.pt-0{padding-top:0}.pt-2{padding-top:.5rem}.pt-2\.5{padding-top:.625rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.pt-8{padding-top:2rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.font-sans{font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji"}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-7{line-height:1.75rem}.leading-none{line-height:1}.tracking-tight{letter-spacing:-.025em}.tracking-widest{letter-spacing:.1em}.text-accent-foreground{color:hsl(var(--accent-foreground))}.text-background{color:hsl(var(--background))}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity))}.text-card-foreground{color:hsl(var(--card-foreground))}.text-current{color:currentColor}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-emerald-600{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity))}.text-foreground{color:hsl(var(--foreground))}.text-foreground\/50{color:hsl(var(--foreground) / .5)}.text-gray-100{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-muted-foreground\/60{color:hsl(var(--muted-foreground) / .6)}.text-muted-foreground\/70{color:hsl(var(--muted-foreground) / .7)}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.text-zinc-100{--tw-text-opacity: 1;color:rgb(244 244 245 / var(--tw-text-opacity))}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-0{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur{--tw-backdrop-blur: blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-700{transition-duration:.7s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.animate-in{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.fade-in-0{--tw-enter-opacity: 0}.zoom-in-95{--tw-enter-scale: .95}.slide-in-from-bottom-2{--tw-enter-translate-y: .5rem}.slide-in-from-top{--tw-enter-translate-y: -100%}.slide-out-to-top{--tw-exit-translate-y: -100%}.duration-200{animation-duration:.2s}.duration-300{animation-duration:.3s}.duration-700{animation-duration:.7s}.ease-in-out{animation-timing-function:cubic-bezier(.4,0,.2,1)}.running{animation-play-state:running}.PopoverContent{width:var(--radix-popover-trigger-width);max-height:var(--radix-popover-content-available-height)}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:inset-y-0:after{content:var(--tw-content);top:0px;bottom:0px}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:w-1:after{content:var(--tw-content);width:.25rem}.after\:-translate-x-1\/2:after{content:var(--tw-content);--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.first\:mt-0:first-child{margin-top:0}.hover\:border-accent:hover{border-color:hsl(var(--accent))}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-destructive\/80:hover{background-color:hsl(var(--destructive) / .8)}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-muted:hover{background-color:hsl(var(--muted))}.hover\:bg-muted\/50:hover{background-color:hsl(var(--muted) / .5)}.hover\:bg-primary\/80:hover{background-color:hsl(var(--primary) / .8)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary) / .9)}.hover\:bg-secondary:hover{background-color:hsl(var(--secondary))}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary) / .8)}.hover\:bg-transparent:hover{background-color:transparent}.hover\:bg-zinc-800:hover{--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity))}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-background:hover{color:hsl(var(--background))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:opacity-100:focus{opacity:1}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color: hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-0:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.focus-visible\:ring-slate-700:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: rgb(51 65 85 / var(--tw-ring-opacity))}.focus-visible\:ring-offset-0:focus-visible{--tw-ring-offset-width: 0px}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width: 1px}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color: hsl(var(--background))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:opacity-100{opacity:1}.group[data-collapsed=true] .group-\[\[data-collapsed\=true\]\]\:justify-center{justify-content:center}.group.destructive .group-\[\.destructive\]\:border-muted\/40{border-color:hsl(var(--muted) / .4)}.group[data-collapsed=true] .group-\[\[data-collapsed\=true\]\]\:px-2{padding-left:.5rem;padding-right:.5rem}.group.destructive .group-\[\.destructive\]\:text-red-300{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity))}.group.destructive .group-\[\.destructive\]\:hover\:border-destructive\/30:hover{border-color:hsl(var(--destructive) / .3)}.group.destructive .group-\[\.destructive\]\:hover\:bg-destructive:hover{background-color:hsl(var(--destructive))}.group.destructive .group-\[\.destructive\]\:hover\:text-destructive-foreground:hover{color:hsl(var(--destructive-foreground))}.group.destructive .group-\[\.destructive\]\:hover\:text-red-50:hover{--tw-text-opacity: 1;color:rgb(254 242 242 / var(--tw-text-opacity))}.group.destructive .group-\[\.destructive\]\:focus\:ring-destructive:focus{--tw-ring-color: hsl(var(--destructive))}.group.destructive .group-\[\.destructive\]\:focus\:ring-red-400:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(248 113 113 / var(--tw-ring-opacity))}.group.destructive .group-\[\.destructive\]\:focus\:ring-offset-red-600:focus{--tw-ring-offset-color: #dc2626}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.has-\[\:disabled\]\:opacity-50:has(:disabled){opacity:.5}.has-\[\:focus\]\:ring-2:has(:focus){--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.has-\[\:focus\]\:ring-ring:has(:focus){--tw-ring-color: hsl(var(--ring))}.has-\[\:focus\]\:ring-offset-2:has(:focus){--tw-ring-offset-width: 2px}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[panel-group-direction\=vertical\]\:h-px[data-panel-group-direction=vertical]{height:1px}.data-\[panel-group-direction\=vertical\]\:w-full[data-panel-group-direction=vertical]{width:100%}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=checked\]\:translate-x-5[data-state=checked]{--tw-translate-x: 1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked],.data-\[swipe\=cancel\]\:translate-x-0[data-swipe=cancel]{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[swipe\=end\]\:translate-x-\[var\(--radix-toast-swipe-end-x\)\][data-swipe=end]{--tw-translate-x: var(--radix-toast-swipe-end-x);transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[swipe\=move\]\:translate-x-\[var\(--radix-toast-swipe-move-x\)\][data-swipe=move]{--tw-translate-x: var(--radix-toast-swipe-move-x);transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[panel-group-direction\=vertical\]\:flex-col[data-panel-group-direction=vertical]{flex-direction:column}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:hsl(var(--primary))}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:hsl(var(--muted))}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:hsl(var(--input))}.data-\[collapsed\=true\]\:py-2[data-collapsed=true]{padding-top:.5rem;padding-bottom:.5rem}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:hsl(var(--muted-foreground))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[swipe\=move\]\:transition-none[data-swipe=move]{transition-property:none}.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.data-\[state\=closed\]\:animate-out[data-state=closed],.data-\[swipe\=end\]\:animate-out[data-swipe=end]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity: initial;--tw-exit-scale: initial;--tw-exit-rotate: initial;--tw-exit-translate-x: initial;--tw-exit-translate-y: initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity: 0}.data-\[state\=closed\]\:fade-out-80[data-state=closed]{--tw-exit-opacity: .8}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity: 0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale: .95}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale: .95}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y: -.5rem}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x: .5rem}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x: -.5rem}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y: .5rem}.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x: -50%}.data-\[state\=closed\]\:slide-out-to-right-full[data-state=closed]{--tw-exit-translate-x: 100%}.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y: -48%}.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x: -50%}.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y: -48%}.data-\[state\=open\]\:slide-in-from-top-full[data-state=open]{--tw-enter-translate-y: -100%}.data-\[panel-group-direction\=vertical\]\:after\:left-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);left:0px}.data-\[panel-group-direction\=vertical\]\:after\:h-1[data-panel-group-direction=vertical]:after{content:var(--tw-content);height:.25rem}.data-\[panel-group-direction\=vertical\]\:after\:w-full[data-panel-group-direction=vertical]:after{content:var(--tw-content);width:100%}.data-\[panel-group-direction\=vertical\]\:after\:-translate-y-1\/2[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[panel-group-direction\=vertical\]\:after\:translate-x-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.prose-p\:m-0 :is(:where(p):not(:where([class~="not-prose"],[class~="not-prose"] *))){margin:0}.prose-p\:leading-relaxed :is(:where(p):not(:where([class~="not-prose"],[class~="not-prose"] *))){line-height:1.625}.prose-pre\:p-0 :is(:where(pre):not(:where([class~="not-prose"],[class~="not-prose"] *))){padding:0}.prose-li\:list-disc :is(:where(li):not(:where([class~="not-prose"],[class~="not-prose"] *))){list-style-type:disc}@supports ((-webkit-backdrop-filter: var(--tw)) or (backdrop-filter: var(--tw))){.supports-\[backdrop-filter\]\:bg-background\/60{background-color:hsl(var(--background) / .6)}}:is(.dark .dark\:border-destructive){border-color:hsl(var(--destructive))}:is(.dark .dark\:bg-muted){background-color:hsl(var(--muted))}:is(.dark .dark\:text-muted-foreground){color:hsl(var(--muted-foreground))}:is(.dark .dark\:text-white){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}:is(.dark .dark\:hover\:bg-muted:hover){background-color:hsl(var(--muted))}:is(.dark .dark\:hover\:text-white:hover){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}@media (min-width: 640px){.sm\:bottom-0{bottom:0px}.sm\:right-0{right:0px}.sm\:top-auto{top:auto}.sm\:mx-auto{margin-left:auto;margin-right:auto}.sm\:mt-0{margin-top:0}.sm\:w-\[500px\]{width:500px}.sm\:max-w-\[350px\]{max-width:350px}.sm\:max-w-\[800px\]{max-width:800px}.sm\:flex-row{flex-direction:row}.sm\:flex-col{flex-direction:column}.sm\:justify-end{justify-content:flex-end}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:text-left{text-align:left}.data-\[state\=open\]\:sm\:slide-in-from-bottom-full[data-state=open]{--tw-enter-translate-y: 100%}}@media (min-width: 768px){.md\:w-52{width:13rem}.md\:w-full{width:100%}.md\:max-w-\[420px\]{max-width:420px}}@media (min-width: 1024px){.lg\:flex{display:flex}.lg\:w-1\/5{width:20%}.lg\:w-80{width:20rem}.lg\:max-w-4xl{max-width:56rem}.lg\:flex-row{flex-direction:row}.lg\:flex-col{flex-direction:column}.lg\:space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(0px * var(--tw-space-x-reverse));margin-left:calc(0px * calc(1 - var(--tw-space-x-reverse)))}.lg\:space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(3rem * var(--tw-space-x-reverse));margin-left:calc(3rem * calc(1 - var(--tw-space-x-reverse)))}.lg\:space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(2rem * var(--tw-space-x-reverse));margin-left:calc(2rem * calc(1 - var(--tw-space-x-reverse)))}.lg\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.lg\:space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.lg\:text-5xl{font-size:3rem;line-height:1}}.\[\&\.active\]\:bg-muted.active,.\[\&\.active\]\:hover\:bg-muted:hover.active{background-color:hsl(var(--muted))}.\[\&\.active\]\:hover\:no-underline:hover.active{text-decoration-line:none}.\[\&\:has\(\[data-state\=checked\]\)\>div\]\:border-primary:has([data-state=checked])>div{border-color:hsl(var(--primary))}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\&\:not\(\:first-child\)\]\:mt-6:not(:first-child){margin-top:1.5rem}.\[\&\>li\]\:mt-2>li{margin-top:.5rem}.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div{--tw-translate-y: -3px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\[\&\>svg\]\:absolute>svg{position:absolute}.\[\&\>svg\]\:left-2\.5>svg{left:.625rem}.\[\&\>svg\]\:left-4>svg{left:1rem}.\[\&\>svg\]\:top-2\.5>svg{top:.625rem}.\[\&\>svg\]\:top-4>svg{top:1rem}.\[\&\>svg\]\:text-destructive>svg{color:hsl(var(--destructive))}.\[\&\>svg\]\:text-foreground>svg{color:hsl(var(--foreground))}.\[\&\>svg\~\*\]\:pl-7>svg~*{padding-left:1.75rem}.\[\&\[data-panel-group-direction\=vertical\]\>div\]\:rotate-90[data-panel-group-direction=vertical]>div{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\[\&_p\]\:leading-relaxed p{line-height:1.625}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-width:0px}.\[\&_tr\]\:border-b tr{border-bottom-width:1px}code[class*=language-],pre[class*=language-]{color:#fff;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;text-shadow:0 -.1em .2em black;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}pre[class*=language-],:not(pre)>code[class*=language-]{background:hsl(0,0%,8%)}pre[class*=language-]{border-radius:.5em;border:.3em solid hsl(0,0%,33%);box-shadow:1px 1px .5em #000 inset;margin:.5em 0;overflow:auto;padding:1em}pre[class*=language-]::-moz-selection{background:hsl(200,4%,16%)}pre[class*=language-]::selection{background:hsl(200,4%,16%)}pre[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,code[class*=language-] ::-moz-selection{text-shadow:none;background:hsla(0,0%,93%,.15)}pre[class*=language-]::selection,pre[class*=language-] ::selection,code[class*=language-]::selection,code[class*=language-] ::selection{text-shadow:none;background:hsla(0,0%,93%,.15)}:not(pre)>code[class*=language-]{border-radius:.3em;border:.13em solid hsl(0,0%,33%);box-shadow:1px 1px .3em -.1em #000 inset;padding:.15em .2em .05em;white-space:normal}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:#787878}.token.punctuation,.token.namespace{opacity:.7}.token.tag,.token.boolean,.token.number,.token.deleted{color:#cf694a}.token.keyword,.token.property,.token.selector,.token.constant,.token.symbol,.token.builtin{color:#f9ee9a}.token.attr-name,.token.attr-value,.token.string,.token.char,.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string,.token.variable,.token.inserted{color:#919e6b}.token.atrule{color:#7386a5}.token.regex,.token.important{color:#e9c163}.token.important,.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.language-markup .token.tag,.language-markup .token.attr-name,.language-markup .token.punctuation{color:#ad895c}.token{position:relative;z-index:1}.line-highlight.line-highlight{background:hsla(0,0%,33%,.25);background:linear-gradient(to right,hsla(0,0%,33%,.1) 70%,hsla(0,0%,33%,0));border-bottom:1px dashed hsl(0,0%,33%);border-top:1px dashed hsl(0,0%,33%);margin-top:.75em;z-index:0}.line-highlight.line-highlight:before,.line-highlight.line-highlight[data-end]:after{background-color:#8794a6;color:#f5f2f0} diff --git a/letta/server/static_files/assets/index-56a3f8c6.css b/letta/server/static_files/assets/index-56a3f8c6.css new file mode 100644 index 0000000000..c8f2a7f16f --- /dev/null +++ b/letta/server/static_files/assets/index-56a3f8c6.css @@ -0,0 +1 @@ +*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}:root{--background: 210, 10%, 92%;--background-lighter: 0, 0%, 100%;--background-darker: 210, 6%, 86%;--foreground: 224 71.4% 4.1%;--card: 0 0% 100%;--card-foreground: 224 71.4% 4.1%;--popover: 0 0% 100%;--popover-foreground: 224 71.4% 4.1%;--primary: 220.9 39.3% 11%;--primary-foreground: 210 20% 98%;--secondary: 240, 92%, 35%;--secondary-foreground: 0, 0%, 100%;--muted: 220 14.3% 95.9%;--muted-foreground: 220 8.9% 46.1%;--accent: 220 14.3% 95.9%;--accent-foreground: 220.9 39.3% 11%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 210 20% 98%;--border: 210, 6%, 86%;--input: 210, 6%, 86%;--ring: 224 71.4% 4.1%;--radius: .5rem}.dark{--background: 224 71.4% 4.1%;--background-lighter: 224 71.4% 4.1%;--background-darker: 224 71.4% 4.1%;--foreground: 210 20% 98%;--card: 224 71.4% 4.1%;--card-foreground: 210 20% 98%;--popover: 224 71.4% 4.1%;--popover-foreground: 210 20% 98%;--primary: 210 20% 98%;--primary-foreground: 220.9 39.3% 11%;--secondary: 10, 100%, 60%;--secondary-foreground: 210 20% 98%;--muted: 215 27.9% 16.9%;--muted-foreground: 217.9 10.6% 64.9%;--accent: 215 27.9% 16.9%;--accent-foreground: 210 20% 98%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 210 20% 98%;--border: 215 27.9% 16.9%;--input: 215 27.9% 16.9%;--ring: 216 12.2% 83.9%}*{border-color:hsl(var(--border))}html{height:100%}body{height:100%;width:100%;background-color:hsl(var(--background));color:hsl(var(--foreground));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}input::file-selector-button{color:hsl(var(--foreground))}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.prose-sm{font-size:.875rem;line-height:1.7142857}.prose-sm :where(p):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm :where([class~="lead"]):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:1.2857143em;line-height:1.5555556;margin-top:.8888889em;margin-bottom:.8888889em}.prose-sm :where(blockquote):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.3333333em;margin-bottom:1.3333333em;padding-inline-start:1.1111111em}.prose-sm :where(h1):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:2.1428571em;margin-top:0;margin-bottom:.8em;line-height:1.2}.prose-sm :where(h2):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:1.4285714em;margin-top:1.6em;margin-bottom:.8em;line-height:1.4}.prose-sm :where(h3):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:1.2857143em;margin-top:1.5555556em;margin-bottom:.4444444em;line-height:1.5555556}.prose-sm :where(h4):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.4285714em;margin-bottom:.5714286em;line-height:1.4285714}.prose-sm :where(img):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(picture):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(picture > img):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:0;margin-bottom:0}.prose-sm :where(video):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(kbd):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:.8571429em;border-radius:.3125rem;padding-top:.1428571em;padding-inline-end:.3571429em;padding-bottom:.1428571em;padding-inline-start:.3571429em}.prose-sm :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:.8571429em}.prose-sm :where(h2 code):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:.9em}.prose-sm :where(h3 code):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:.8888889em}.prose-sm :where(pre):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:.8571429em;line-height:1.6666667;margin-top:1.6666667em;margin-bottom:1.6666667em;border-radius:.25rem;padding-top:.6666667em;padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(ol):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.1428571em;margin-bottom:1.1428571em;padding-inline-start:1.5714286em}.prose-sm :where(ul):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.1428571em;margin-bottom:1.1428571em;padding-inline-start:1.5714286em}.prose-sm :where(li):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:.2857143em;margin-bottom:.2857143em}.prose-sm :where(ol > li):not(:where([class~="not-prose"],[class~="not-prose"] *)){padding-inline-start:.4285714em}.prose-sm :where(ul > li):not(:where([class~="not-prose"],[class~="not-prose"] *)){padding-inline-start:.4285714em}.prose-sm :where(.prose-sm > ul > li p):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:.5714286em;margin-bottom:.5714286em}.prose-sm :where(.prose-sm > ul > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.1428571em}.prose-sm :where(.prose-sm > ul > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-bottom:1.1428571em}.prose-sm :where(.prose-sm > ol > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.1428571em}.prose-sm :where(.prose-sm > ol > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-bottom:1.1428571em}.prose-sm :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:.5714286em;margin-bottom:.5714286em}.prose-sm :where(dl):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm :where(dt):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.1428571em}.prose-sm :where(dd):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:.2857143em;padding-inline-start:1.5714286em}.prose-sm :where(hr):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:2.8571429em;margin-bottom:2.8571429em}.prose-sm :where(hr + *):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:0}.prose-sm :where(h2 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:0}.prose-sm :where(h3 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:0}.prose-sm :where(h4 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:0}.prose-sm :where(table):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:.8571429em;line-height:1.5}.prose-sm :where(thead th):not(:where([class~="not-prose"],[class~="not-prose"] *)){padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(thead th:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){padding-inline-start:0}.prose-sm :where(thead th:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){padding-inline-end:0}.prose-sm :where(tbody td,tfoot td):not(:where([class~="not-prose"],[class~="not-prose"] *)){padding-top:.6666667em;padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(tbody td:first-child,tfoot td:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){padding-inline-start:0}.prose-sm :where(tbody td:last-child,tfoot td:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){padding-inline-end:0}.prose-sm :where(figure):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(figure > *):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:0;margin-bottom:0}.prose-sm :where(figcaption):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:.8571429em;line-height:1.3333333;margin-top:.6666667em}.prose-sm :where(.prose-sm > :first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:0}.prose-sm :where(.prose-sm > :last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-bottom:0}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.\!collapse{visibility:collapse!important}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0px}.bottom-0{bottom:0px}.bottom-2{bottom:.5rem}.left-2{left:.5rem}.left-3{left:.75rem}.left-\[12px\]{left:12px}.left-\[50\%\]{left:50%}.right-0{right:0px}.right-2{right:.5rem}.right-2\.5{right:.625rem}.right-3{right:.75rem}.right-4{right:1rem}.top-0{top:0px}.top-2{top:.5rem}.top-2\.5{top:.625rem}.top-3{top:.75rem}.top-4{top:1rem}.top-\[50\%\]{top:50%}.z-10{z-index:10}.z-50{z-index:50}.z-\[100\]{z-index:100}.order-2{order:2}.m-2{margin:.5rem}.m-2\.5{margin:.625rem}.\!my-4{margin-top:1rem!important;margin-bottom:1rem!important}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.-mx-4{margin-left:-1rem;margin-right:-1rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-10{margin-top:2.5rem;margin-bottom:2.5rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.\!-mt-4{margin-top:-1rem!important}.-ml-1{margin-left:-.25rem}.-ml-2{margin-left:-.5rem}.-ml-3{margin-left:-.75rem}.-mt-2{margin-top:-.5rem}.-mt-8{margin-top:-2rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-6{margin-left:1.5rem}.ml-8{margin-left:2rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-4{margin-right:1rem}.mt-0{margin-top:0}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-px{margin-top:1px}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.\!table{display:table!important}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.aspect-square{aspect-ratio:1 / 1}.size-3{width:.75rem;height:.75rem}.size-3\.5{width:.875rem;height:.875rem}.size-4{width:1rem;height:1rem}.size-5{width:1.25rem;height:1.25rem}.size-6{width:1.5rem;height:1.5rem}.\!h-6{height:1.5rem!important}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[1px\]{height:1px}.h-\[24px\]{height:24px}.h-\[35px\]{height:35px}.h-\[56px\]{height:56px}.h-\[70px\]{height:70px}.h-\[78px\]{height:78px}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-full{height:100%}.h-px{height:1px}.max-h-\[200px\]{max-height:200px}.max-h-\[400px\]{max-height:400px}.max-h-\[95svh\]{max-height:95svh}.max-h-screen{max-height:100vh}.min-h-0{min-height:0px}.min-h-40{min-height:10rem}.min-h-8{min-height:2rem}.min-h-80{min-height:20rem}.min-h-96{min-height:24rem}.min-h-\[10rem\]{min-height:10rem}.min-h-\[60vh\]{min-height:60vh}.min-h-\[80px\]{min-height:80px}.\!w-6{width:1.5rem!important}.w-10{width:2.5rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-52{width:13rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-96{width:24rem}.w-\[100px\]{width:100px}.w-\[150px\]{width:150px}.w-\[1px\]{width:1px}.w-\[300px\]{width:300px}.w-\[340px\]{width:340px}.w-\[44px\]{width:44px}.w-\[70px\]{width:70px}.w-\[80px\]{width:80px}.w-\[95\%\]{width:95%}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-min{width:-moz-min-content;width:min-content}.w-px{width:1px}.min-w-\[50px\]{min-width:50px}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.max-w-80{max-width:20rem}.max-w-lg{max-width:32rem}.max-w-screen-lg{max-width:1024px}.max-w-xl{max-width:36rem}.flex-1{flex:1 1 0%}.flex-none{flex:none}.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.origin-left{transform-origin:left}.translate-x-\[-50\%\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes ping{75%,to{transform:scale(2);opacity:0}}.animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}@keyframes progress{0%{transform:translate(0) scaleX(0)}40%{transform:translate(0) scaleX(.4)}to{transform:translate(100%) scaleX(.5)}}.animate-progress{animation:progress 1.5s infinite linear}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.scroll-m-20{scroll-margin:5rem}.scroll-pb-10{scroll-padding-bottom:2.5rem}.list-disc{list-style-type:disc}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-8{gap:2rem}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.25rem * var(--tw-space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(1rem * var(--tw-space-x-reverse));margin-left:calc(1rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(1.5rem * var(--tw-space-x-reverse));margin-left:calc(1.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-x-scroll{overflow-x:scroll}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-none{border-radius:0}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-br-none{border-bottom-right-radius:0}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-0{border-bottom-width:0px}.border-b-\[1px\]{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-r-2{border-right-width:2px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-destructive{border-color:hsl(var(--destructive))}.border-destructive\/50{border-color:hsl(var(--destructive) / .5)}.border-input{border-color:hsl(var(--input))}.border-muted{border-color:hsl(var(--muted))}.border-primary{border-color:hsl(var(--primary))}.border-transparent{border-color:transparent}.border-white{--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity))}.bg-\[\#ecedef\]{--tw-bg-opacity: 1;background-color:rgb(236 237 239 / var(--tw-bg-opacity))}.bg-accent{background-color:hsl(var(--accent))}.bg-background{background-color:hsl(var(--background))}.bg-background-darker{background-color:hsl(var(--background-darker))}.bg-background-lighter{background-color:hsl(var(--background-lighter))}.bg-background\/80{background-color:hsl(var(--background) / .8)}.bg-background\/95{background-color:hsl(var(--background) / .95)}.bg-blue-400{--tw-bg-opacity: 1;background-color:rgb(96 165 250 / var(--tw-bg-opacity))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity))}.bg-border{background-color:hsl(var(--border))}.bg-card{background-color:hsl(var(--card))}.bg-destructive{background-color:hsl(var(--destructive))}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity))}.bg-muted{background-color:hsl(var(--muted))}.bg-muted\/50{background-color:hsl(var(--muted) / .5)}.bg-popover{background-color:hsl(var(--popover))}.bg-primary{background-color:hsl(var(--primary))}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity))}.bg-secondary{background-color:hsl(var(--secondary))}.bg-slate-950{--tw-bg-opacity: 1;background-color:rgb(2 6 23 / var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.bg-zinc-800{--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity))}.bg-zinc-950{--tw-bg-opacity: 1;background-color:rgb(9 9 11 / var(--tw-bg-opacity))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-transparent{--tw-gradient-from: transparent var(--tw-gradient-from-position);--tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-background{--tw-gradient-to: hsl(var(--background)) var(--tw-gradient-to-position)}.to-55\%{--tw-gradient-to-position: 55%}.fill-current{fill:currentColor}.\!p-1{padding:.25rem!important}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-20{padding:5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-0{padding-left:0;padding-right:0}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.px-\[0\.3rem\]{padding-left:.3rem;padding-right:.3rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-\[0\.2rem\]{padding-top:.2rem;padding-bottom:.2rem}.pb-10{padding-bottom:2.5rem}.pb-16{padding-bottom:4rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-6{padding-bottom:1.5rem}.pl-10{padding-left:2.5rem}.pl-6{padding-left:1.5rem}.pl-7{padding-left:1.75rem}.pl-8{padding-left:2rem}.pl-9{padding-left:2.25rem}.pr-1{padding-right:.25rem}.pr-1\.5{padding-right:.375rem}.pr-10{padding-right:2.5rem}.pr-2{padding-right:.5rem}.pr-4{padding-right:1rem}.pr-6{padding-right:1.5rem}.pr-8{padding-right:2rem}.pt-0{padding-top:0}.pt-2{padding-top:.5rem}.pt-2\.5{padding-top:.625rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.pt-8{padding-top:2rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.font-sans{font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji"}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-7{line-height:1.75rem}.leading-none{line-height:1}.tracking-tight{letter-spacing:-.025em}.tracking-widest{letter-spacing:.1em}.text-accent-foreground{color:hsl(var(--accent-foreground))}.text-background{color:hsl(var(--background))}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity))}.text-card-foreground{color:hsl(var(--card-foreground))}.text-current{color:currentColor}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-emerald-600{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity))}.text-foreground{color:hsl(var(--foreground))}.text-foreground\/50{color:hsl(var(--foreground) / .5)}.text-gray-100{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-muted-foreground\/60{color:hsl(var(--muted-foreground) / .6)}.text-muted-foreground\/70{color:hsl(var(--muted-foreground) / .7)}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.text-zinc-100{--tw-text-opacity: 1;color:rgb(244 244 245 / var(--tw-text-opacity))}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-0{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur{--tw-backdrop-blur: blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-700{transition-duration:.7s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.animate-in{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.fade-in-0{--tw-enter-opacity: 0}.zoom-in-95{--tw-enter-scale: .95}.slide-in-from-bottom-2{--tw-enter-translate-y: .5rem}.slide-in-from-top{--tw-enter-translate-y: -100%}.slide-out-to-top{--tw-exit-translate-y: -100%}.duration-200{animation-duration:.2s}.duration-300{animation-duration:.3s}.duration-700{animation-duration:.7s}.ease-in-out{animation-timing-function:cubic-bezier(.4,0,.2,1)}.running{animation-play-state:running}.PopoverContent{width:var(--radix-popover-trigger-width);max-height:var(--radix-popover-content-available-height)}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:inset-y-0:after{content:var(--tw-content);top:0px;bottom:0px}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:w-1:after{content:var(--tw-content);width:.25rem}.after\:-translate-x-1\/2:after{content:var(--tw-content);--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.first\:mt-0:first-child{margin-top:0}.hover\:border-accent:hover{border-color:hsl(var(--accent))}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-destructive\/80:hover{background-color:hsl(var(--destructive) / .8)}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-muted:hover{background-color:hsl(var(--muted))}.hover\:bg-muted\/50:hover{background-color:hsl(var(--muted) / .5)}.hover\:bg-primary\/80:hover{background-color:hsl(var(--primary) / .8)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary) / .9)}.hover\:bg-secondary:hover{background-color:hsl(var(--secondary))}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary) / .8)}.hover\:bg-transparent:hover{background-color:transparent}.hover\:bg-zinc-800:hover{--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity))}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-background:hover{color:hsl(var(--background))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:opacity-100:focus{opacity:1}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color: hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-0:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.focus-visible\:ring-slate-700:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: rgb(51 65 85 / var(--tw-ring-opacity))}.focus-visible\:ring-offset-0:focus-visible{--tw-ring-offset-width: 0px}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width: 1px}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color: hsl(var(--background))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:opacity-100{opacity:1}.group[data-collapsed=true] .group-\[\[data-collapsed\=true\]\]\:justify-center{justify-content:center}.group.destructive .group-\[\.destructive\]\:border-muted\/40{border-color:hsl(var(--muted) / .4)}.group[data-collapsed=true] .group-\[\[data-collapsed\=true\]\]\:px-2{padding-left:.5rem;padding-right:.5rem}.group.destructive .group-\[\.destructive\]\:text-red-300{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity))}.group.destructive .group-\[\.destructive\]\:hover\:border-destructive\/30:hover{border-color:hsl(var(--destructive) / .3)}.group.destructive .group-\[\.destructive\]\:hover\:bg-destructive:hover{background-color:hsl(var(--destructive))}.group.destructive .group-\[\.destructive\]\:hover\:text-destructive-foreground:hover{color:hsl(var(--destructive-foreground))}.group.destructive .group-\[\.destructive\]\:hover\:text-red-50:hover{--tw-text-opacity: 1;color:rgb(254 242 242 / var(--tw-text-opacity))}.group.destructive .group-\[\.destructive\]\:focus\:ring-destructive:focus{--tw-ring-color: hsl(var(--destructive))}.group.destructive .group-\[\.destructive\]\:focus\:ring-red-400:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(248 113 113 / var(--tw-ring-opacity))}.group.destructive .group-\[\.destructive\]\:focus\:ring-offset-red-600:focus{--tw-ring-offset-color: #dc2626}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.has-\[\:disabled\]\:opacity-50:has(:disabled){opacity:.5}.has-\[\:focus\]\:ring-2:has(:focus){--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.has-\[\:focus\]\:ring-ring:has(:focus){--tw-ring-color: hsl(var(--ring))}.has-\[\:focus\]\:ring-offset-2:has(:focus){--tw-ring-offset-width: 2px}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[panel-group-direction\=vertical\]\:h-px[data-panel-group-direction=vertical]{height:1px}.data-\[panel-group-direction\=vertical\]\:w-full[data-panel-group-direction=vertical]{width:100%}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=checked\]\:translate-x-5[data-state=checked]{--tw-translate-x: 1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked],.data-\[swipe\=cancel\]\:translate-x-0[data-swipe=cancel]{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[swipe\=end\]\:translate-x-\[var\(--radix-toast-swipe-end-x\)\][data-swipe=end]{--tw-translate-x: var(--radix-toast-swipe-end-x);transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[swipe\=move\]\:translate-x-\[var\(--radix-toast-swipe-move-x\)\][data-swipe=move]{--tw-translate-x: var(--radix-toast-swipe-move-x);transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[panel-group-direction\=vertical\]\:flex-col[data-panel-group-direction=vertical]{flex-direction:column}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:hsl(var(--primary))}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:hsl(var(--muted))}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:hsl(var(--input))}.data-\[collapsed\=true\]\:py-2[data-collapsed=true]{padding-top:.5rem;padding-bottom:.5rem}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:hsl(var(--muted-foreground))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[swipe\=move\]\:transition-none[data-swipe=move]{transition-property:none}.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.data-\[state\=closed\]\:animate-out[data-state=closed],.data-\[swipe\=end\]\:animate-out[data-swipe=end]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity: initial;--tw-exit-scale: initial;--tw-exit-rotate: initial;--tw-exit-translate-x: initial;--tw-exit-translate-y: initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity: 0}.data-\[state\=closed\]\:fade-out-80[data-state=closed]{--tw-exit-opacity: .8}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity: 0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale: .95}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale: .95}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y: -.5rem}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x: .5rem}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x: -.5rem}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y: .5rem}.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x: -50%}.data-\[state\=closed\]\:slide-out-to-right-full[data-state=closed]{--tw-exit-translate-x: 100%}.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y: -48%}.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x: -50%}.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y: -48%}.data-\[state\=open\]\:slide-in-from-top-full[data-state=open]{--tw-enter-translate-y: -100%}.data-\[panel-group-direction\=vertical\]\:after\:left-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);left:0px}.data-\[panel-group-direction\=vertical\]\:after\:h-1[data-panel-group-direction=vertical]:after{content:var(--tw-content);height:.25rem}.data-\[panel-group-direction\=vertical\]\:after\:w-full[data-panel-group-direction=vertical]:after{content:var(--tw-content);width:100%}.data-\[panel-group-direction\=vertical\]\:after\:-translate-y-1\/2[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[panel-group-direction\=vertical\]\:after\:translate-x-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.prose-p\:m-0 :is(:where(p):not(:where([class~="not-prose"],[class~="not-prose"] *))){margin:0}.prose-p\:leading-relaxed :is(:where(p):not(:where([class~="not-prose"],[class~="not-prose"] *))){line-height:1.625}.prose-pre\:p-0 :is(:where(pre):not(:where([class~="not-prose"],[class~="not-prose"] *))){padding:0}.prose-li\:list-disc :is(:where(li):not(:where([class~="not-prose"],[class~="not-prose"] *))){list-style-type:disc}@supports ((-webkit-backdrop-filter: var(--tw)) or (backdrop-filter: var(--tw))){.supports-\[backdrop-filter\]\:bg-background\/60{background-color:hsl(var(--background) / .6)}}:is(.dark .dark\:border-destructive){border-color:hsl(var(--destructive))}:is(.dark .dark\:bg-muted){background-color:hsl(var(--muted))}:is(.dark .dark\:text-muted-foreground){color:hsl(var(--muted-foreground))}:is(.dark .dark\:text-white){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}:is(.dark .dark\:hover\:bg-muted:hover){background-color:hsl(var(--muted))}:is(.dark .dark\:hover\:text-white:hover){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}@media (min-width: 640px){.sm\:bottom-0{bottom:0px}.sm\:right-0{right:0px}.sm\:top-auto{top:auto}.sm\:mx-auto{margin-left:auto;margin-right:auto}.sm\:mt-0{margin-top:0}.sm\:w-\[500px\]{width:500px}.sm\:max-w-\[350px\]{max-width:350px}.sm\:max-w-\[800px\]{max-width:800px}.sm\:flex-row{flex-direction:row}.sm\:flex-col{flex-direction:column}.sm\:justify-end{justify-content:flex-end}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:text-left{text-align:left}.data-\[state\=open\]\:sm\:slide-in-from-bottom-full[data-state=open]{--tw-enter-translate-y: 100%}}@media (min-width: 768px){.md\:w-52{width:13rem}.md\:w-full{width:100%}.md\:max-w-\[420px\]{max-width:420px}}@media (min-width: 1024px){.lg\:flex{display:flex}.lg\:w-1\/5{width:20%}.lg\:w-80{width:20rem}.lg\:max-w-4xl{max-width:56rem}.lg\:flex-row{flex-direction:row}.lg\:flex-col{flex-direction:column}.lg\:space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(0px * var(--tw-space-x-reverse));margin-left:calc(0px * calc(1 - var(--tw-space-x-reverse)))}.lg\:space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(3rem * var(--tw-space-x-reverse));margin-left:calc(3rem * calc(1 - var(--tw-space-x-reverse)))}.lg\:space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(2rem * var(--tw-space-x-reverse));margin-left:calc(2rem * calc(1 - var(--tw-space-x-reverse)))}.lg\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.lg\:space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.lg\:text-5xl{font-size:3rem;line-height:1}}.\[\&\.active\]\:bg-muted.active,.\[\&\.active\]\:hover\:bg-muted:hover.active{background-color:hsl(var(--muted))}.\[\&\.active\]\:hover\:no-underline:hover.active{text-decoration-line:none}.\[\&\:has\(\[data-state\=checked\]\)\>div\]\:border-primary:has([data-state=checked])>div{border-color:hsl(var(--primary))}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\&\:not\(\:first-child\)\]\:mt-6:not(:first-child){margin-top:1.5rem}.\[\&\>li\]\:mt-2>li{margin-top:.5rem}.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div{--tw-translate-y: -3px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\[\&\>svg\]\:absolute>svg{position:absolute}.\[\&\>svg\]\:left-2\.5>svg{left:.625rem}.\[\&\>svg\]\:left-4>svg{left:1rem}.\[\&\>svg\]\:top-2\.5>svg{top:.625rem}.\[\&\>svg\]\:top-4>svg{top:1rem}.\[\&\>svg\]\:text-destructive>svg{color:hsl(var(--destructive))}.\[\&\>svg\]\:text-foreground>svg{color:hsl(var(--foreground))}.\[\&\>svg\~\*\]\:pl-7>svg~*{padding-left:1.75rem}.\[\&\[data-panel-group-direction\=vertical\]\>div\]\:rotate-90[data-panel-group-direction=vertical]>div{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\[\&_p\]\:leading-relaxed p{line-height:1.625}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-width:0px}.\[\&_tr\]\:border-b tr{border-bottom-width:1px}code[class*=language-],pre[class*=language-]{color:#fff;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;text-shadow:0 -.1em .2em black;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}pre[class*=language-],:not(pre)>code[class*=language-]{background:hsl(0,0%,8%)}pre[class*=language-]{border-radius:.5em;border:.3em solid hsl(0,0%,33%);box-shadow:1px 1px .5em #000 inset;margin:.5em 0;overflow:auto;padding:1em}pre[class*=language-]::-moz-selection{background:hsl(200,4%,16%)}pre[class*=language-]::selection{background:hsl(200,4%,16%)}pre[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,code[class*=language-] ::-moz-selection{text-shadow:none;background:hsla(0,0%,93%,.15)}pre[class*=language-]::selection,pre[class*=language-] ::selection,code[class*=language-]::selection,code[class*=language-] ::selection{text-shadow:none;background:hsla(0,0%,93%,.15)}:not(pre)>code[class*=language-]{border-radius:.3em;border:.13em solid hsl(0,0%,33%);box-shadow:1px 1px .3em -.1em #000 inset;padding:.15em .2em .05em;white-space:normal}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:#787878}.token.punctuation,.token.namespace{opacity:.7}.token.tag,.token.boolean,.token.number,.token.deleted{color:#cf694a}.token.keyword,.token.property,.token.selector,.token.constant,.token.symbol,.token.builtin{color:#f9ee9a}.token.attr-name,.token.attr-value,.token.string,.token.char,.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string,.token.variable,.token.inserted{color:#919e6b}.token.atrule{color:#7386a5}.token.regex,.token.important{color:#e9c163}.token.important,.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.language-markup .token.tag,.language-markup .token.attr-name,.language-markup .token.punctuation{color:#ad895c}.token{position:relative;z-index:1}.line-highlight.line-highlight{background:hsla(0,0%,33%,.25);background:linear-gradient(to right,hsla(0,0%,33%,.1) 70%,hsla(0,0%,33%,0));border-bottom:1px dashed hsl(0,0%,33%);border-top:1px dashed hsl(0,0%,33%);margin-top:.75em;z-index:0}.line-highlight.line-highlight:before,.line-highlight.line-highlight[data-end]:after{background-color:#8794a6;color:#f5f2f0} diff --git a/letta/server/static_files/index.html b/letta/server/static_files/index.html index 26b0f65259..a16f6d7b7f 100644 --- a/letta/server/static_files/index.html +++ b/letta/server/static_files/index.html @@ -29,8 +29,8 @@ } } - - + +
From e7f7286f28adf2a32e0ec77e7240a6e5e7c0dd04 Mon Sep 17 00:00:00 2001 From: Shubham Naik Date: Thu, 5 Dec 2024 16:07:34 -0800 Subject: [PATCH 022/280] feat: add sentry logging (optional) (#2172) Co-authored-by: Shubham Naik --- letta/server/rest_api/app.py | 11 ++ poetry.lock | 202 ++++++++++++++++------------------- pyproject.toml | 1 + 3 files changed, 104 insertions(+), 110 deletions(-) diff --git a/letta/server/rest_api/app.py b/letta/server/rest_api/app.py index c8f2cdf044..ab2c340ef7 100644 --- a/letta/server/rest_api/app.py +++ b/letta/server/rest_api/app.py @@ -124,6 +124,17 @@ def create_application() -> "FastAPI": # server = SyncServer(default_interface_factory=lambda: interface()) print(f"\n[[ Letta server // v{__version__} ]]") + if (os.getenv("SENTRY_DSN") is not None) and (os.getenv("SENTRY_DSN") != ""): + import sentry_sdk + + sentry_sdk.init( + dsn=os.getenv("SENTRY_DSN"), + traces_sample_rate=1.0, + _experiments={ + "continuous_profiling_auto_start": True, + }, + ) + app = FastAPI( swagger_ui_parameters={"docExpansion": "none"}, # openapi_tags=TAGS_METADATA, diff --git a/poetry.lock b/poetry.lock index 3ed6715d6d..84716f7004 100644 --- a/poetry.lock +++ b/poetry.lock @@ -13,87 +13,87 @@ files = [ [[package]] name = "aiohttp" -version = "3.11.9" +version = "3.11.10" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.9" files = [ - {file = "aiohttp-3.11.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0411777249f25d11bd2964a230b3ffafcbed6cd65d0f2b132bc2b8f5b8c347c7"}, - {file = "aiohttp-3.11.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:499368eb904566fbdf1a3836a1532000ef1308f34a1bcbf36e6351904cced771"}, - {file = "aiohttp-3.11.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0b5a5009b0159a8f707879dc102b139466d8ec6db05103ec1520394fdd8ea02c"}, - {file = "aiohttp-3.11.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:176f8bb8931da0613bb0ed16326d01330066bb1e172dd97e1e02b1c27383277b"}, - {file = "aiohttp-3.11.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6435a66957cdba1a0b16f368bde03ce9c79c57306b39510da6ae5312a1a5b2c1"}, - {file = "aiohttp-3.11.9-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:202f40fb686e5f93908eee0c75d1e6fbe50a43e9bd4909bf3bf4a56b560ca180"}, - {file = "aiohttp-3.11.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39625703540feb50b6b7f938b3856d1f4886d2e585d88274e62b1bd273fae09b"}, - {file = "aiohttp-3.11.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6beeac698671baa558e82fa160be9761cf0eb25861943f4689ecf9000f8ebd0"}, - {file = "aiohttp-3.11.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:96726839a42429318017e67a42cca75d4f0d5248a809b3cc2e125445edd7d50d"}, - {file = "aiohttp-3.11.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3f5461c77649358610fb9694e790956b4238ac5d9e697a17f63619c096469afe"}, - {file = "aiohttp-3.11.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4313f3bc901255b22f01663eeeae167468264fdae0d32c25fc631d5d6e15b502"}, - {file = "aiohttp-3.11.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:d6e274661c74195708fc4380a4ef64298926c5a50bb10fbae3d01627d7a075b7"}, - {file = "aiohttp-3.11.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:db2914de2559809fdbcf3e48f41b17a493b58cb7988d3e211f6b63126c55fe82"}, - {file = "aiohttp-3.11.9-cp310-cp310-win32.whl", hash = "sha256:27935716f8d62c1c73010428db310fd10136002cfc6d52b0ba7bdfa752d26066"}, - {file = "aiohttp-3.11.9-cp310-cp310-win_amd64.whl", hash = "sha256:afbe85b50ade42ddff5669947afde9e8a610e64d2c80be046d67ec4368e555fa"}, - {file = "aiohttp-3.11.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:afcda759a69c6a8be3aae764ec6733155aa4a5ad9aad4f398b52ba4037942fe3"}, - {file = "aiohttp-3.11.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5bba6b83fde4ca233cfda04cbd4685ab88696b0c8eaf76f7148969eab5e248a"}, - {file = "aiohttp-3.11.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:442356e8924fe1a121f8c87866b0ecdc785757fd28924b17c20493961b3d6697"}, - {file = "aiohttp-3.11.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f737fef6e117856400afee4f17774cdea392b28ecf058833f5eca368a18cf1bf"}, - {file = "aiohttp-3.11.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea142255d4901b03f89cb6a94411ecec117786a76fc9ab043af8f51dd50b5313"}, - {file = "aiohttp-3.11.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e1e9e447856e9b7b3d38e1316ae9a8c92e7536ef48373de758ea055edfd5db5"}, - {file = "aiohttp-3.11.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7f6173302f8a329ca5d1ee592af9e628d3ade87816e9958dcf7cdae2841def7"}, - {file = "aiohttp-3.11.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7c6147c6306f537cff59409609508a1d2eff81199f0302dd456bb9e7ea50c39"}, - {file = "aiohttp-3.11.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e9d036a9a41fc78e8a3f10a86c2fc1098fca8fab8715ba9eb999ce4788d35df0"}, - {file = "aiohttp-3.11.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2ac9fd83096df36728da8e2f4488ac3b5602238f602706606f3702f07a13a409"}, - {file = "aiohttp-3.11.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d3108f0ad5c6b6d78eec5273219a5bbd884b4aacec17883ceefaac988850ce6e"}, - {file = "aiohttp-3.11.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:96bbec47beb131bbf4bae05d8ef99ad9e5738f12717cfbbf16648b78b0232e87"}, - {file = "aiohttp-3.11.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:fc726c3fa8f606d07bd2b500e5dc4c0fd664c59be7788a16b9e34352c50b6b6b"}, - {file = "aiohttp-3.11.9-cp311-cp311-win32.whl", hash = "sha256:5720ebbc7a1b46c33a42d489d25d36c64c419f52159485e55589fbec648ea49a"}, - {file = "aiohttp-3.11.9-cp311-cp311-win_amd64.whl", hash = "sha256:17af09d963fa1acd7e4c280e9354aeafd9e3d47eaa4a6bfbd2171ad7da49f0c5"}, - {file = "aiohttp-3.11.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c1f2d7fd583fc79c240094b3e7237d88493814d4b300d013a42726c35a734bc9"}, - {file = "aiohttp-3.11.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d4b8a1b6c7a68c73191f2ebd3bf66f7ce02f9c374e309bdb68ba886bbbf1b938"}, - {file = "aiohttp-3.11.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd3f711f4c99da0091ced41dccdc1bcf8be0281dc314d6d9c6b6cf5df66f37a9"}, - {file = "aiohttp-3.11.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44cb1a1326a0264480a789e6100dc3e07122eb8cd1ad6b784a3d47d13ed1d89c"}, - {file = "aiohttp-3.11.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a7ddf981a0b953ade1c2379052d47ccda2f58ab678fca0671c7c7ca2f67aac2"}, - {file = "aiohttp-3.11.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ffa45cc55b18d4ac1396d1ddb029f139b1d3480f1594130e62bceadf2e1a838"}, - {file = "aiohttp-3.11.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cca505829cdab58c2495ff418c96092d225a1bbd486f79017f6de915580d3c44"}, - {file = "aiohttp-3.11.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44d323aa80a867cb6db6bebb4bbec677c6478e38128847f2c6b0f70eae984d72"}, - {file = "aiohttp-3.11.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b2fab23003c4bb2249729a7290a76c1dda38c438300fdf97d4e42bf78b19c810"}, - {file = "aiohttp-3.11.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:be0c7c98e38a1e3ad7a6ff64af8b6d6db34bf5a41b1478e24c3c74d9e7f8ed42"}, - {file = "aiohttp-3.11.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5cc5e0d069c56645446c45a4b5010d4b33ac6c5ebfd369a791b5f097e46a3c08"}, - {file = "aiohttp-3.11.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9bcf97b971289be69638d8b1b616f7e557e1342debc7fc86cf89d3f08960e411"}, - {file = "aiohttp-3.11.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c7333e7239415076d1418dbfb7fa4df48f3a5b00f8fdf854fca549080455bc14"}, - {file = "aiohttp-3.11.9-cp312-cp312-win32.whl", hash = "sha256:9384b07cfd3045b37b05ed002d1c255db02fb96506ad65f0f9b776b762a7572e"}, - {file = "aiohttp-3.11.9-cp312-cp312-win_amd64.whl", hash = "sha256:f5252ba8b43906f206048fa569debf2cd0da0316e8d5b4d25abe53307f573941"}, - {file = "aiohttp-3.11.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:282e0a7ddd36ebc411f156aeaa0491e8fe7f030e2a95da532cf0c84b0b70bc66"}, - {file = "aiohttp-3.11.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ebd3e6b0c7d4954cca59d241970011f8d3327633d555051c430bd09ff49dc494"}, - {file = "aiohttp-3.11.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:30f9f89ae625d412043f12ca3771b2ccec227cc93b93bb1f994db6e1af40a7d3"}, - {file = "aiohttp-3.11.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a3b5b2c012d70c63d9d13c57ed1603709a4d9d7d473e4a9dfece0e4ea3d5f51"}, - {file = "aiohttp-3.11.9-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ef1550bb5f55f71b97a6a395286db07f7f2c01c8890e613556df9a51da91e8d"}, - {file = "aiohttp-3.11.9-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:317251b9c9a2f1a9ff9cd093775b34c6861d1d7df9439ce3d32a88c275c995cd"}, - {file = "aiohttp-3.11.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21cbe97839b009826a61b143d3ca4964c8590d7aed33d6118125e5b71691ca46"}, - {file = "aiohttp-3.11.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:618b18c3a2360ac940a5503da14fa4f880c5b9bc315ec20a830357bcc62e6bae"}, - {file = "aiohttp-3.11.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a0cf4d814689e58f57ecd5d8c523e6538417ca2e72ff52c007c64065cef50fb2"}, - {file = "aiohttp-3.11.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:15c4e489942d987d5dac0ba39e5772dcbed4cc9ae3710d1025d5ba95e4a5349c"}, - {file = "aiohttp-3.11.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ec8df0ff5a911c6d21957a9182402aad7bf060eaeffd77c9ea1c16aecab5adbf"}, - {file = "aiohttp-3.11.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ed95d66745f53e129e935ad726167d3a6cb18c5d33df3165974d54742c373868"}, - {file = "aiohttp-3.11.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:647ec5bee7e4ec9f1034ab48173b5fa970d9a991e565549b965e93331f1328fe"}, - {file = "aiohttp-3.11.9-cp313-cp313-win32.whl", hash = "sha256:ef2c9499b7bd1e24e473dc1a85de55d72fd084eea3d8bdeec7ee0720decb54fa"}, - {file = "aiohttp-3.11.9-cp313-cp313-win_amd64.whl", hash = "sha256:84de955314aa5e8d469b00b14d6d714b008087a0222b0f743e7ffac34ef56aff"}, - {file = "aiohttp-3.11.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e738aabff3586091221044b7a584865ddc4d6120346d12e28e788307cd731043"}, - {file = "aiohttp-3.11.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:28f29bce89c3b401a53d6fd4bee401ee943083bf2bdc12ef297c1d63155070b0"}, - {file = "aiohttp-3.11.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31de2f10f63f96cc19e04bd2df9549559beadd0b2ee2da24a17e7ed877ca8c60"}, - {file = "aiohttp-3.11.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f31cebd8c27a36af6c7346055ac564946e562080ee1a838da724585c67474f"}, - {file = "aiohttp-3.11.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0bcb7f6976dc0b6b56efde13294862adf68dd48854111b422a336fa729a82ea6"}, - {file = "aiohttp-3.11.9-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8b13b9950d8b2f8f58b6e5842c4b842b5887e2c32e3f4644d6642f1659a530"}, - {file = "aiohttp-3.11.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9c23e62f3545c2216100603614f9e019e41b9403c47dd85b8e7e5015bf1bde0"}, - {file = "aiohttp-3.11.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec656680fc53a13f849c71afd0c84a55c536206d524cbc831cde80abbe80489e"}, - {file = "aiohttp-3.11.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:36df00e0541f264ce42d62280281541a47474dfda500bc5b7f24f70a7f87be7a"}, - {file = "aiohttp-3.11.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:8dcfd14c712aa9dd18049280bfb2f95700ff6a8bde645e09f17c3ed3f05a0130"}, - {file = "aiohttp-3.11.9-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:14624d96f0d69cf451deed3173079a68c322279be6030208b045ab77e1e8d550"}, - {file = "aiohttp-3.11.9-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4b01d9cfcb616eeb6d40f02e66bebfe7b06d9f2ef81641fdd50b8dd981166e0b"}, - {file = "aiohttp-3.11.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:928f92f80e2e8d6567b87d3316c1fd9860ccfe36e87a9a7f5237d4cda8baa1ba"}, - {file = "aiohttp-3.11.9-cp39-cp39-win32.whl", hash = "sha256:c8a02f74ae419e3955af60f570d83187423e42e672a6433c5e292f1d23619269"}, - {file = "aiohttp-3.11.9-cp39-cp39-win_amd64.whl", hash = "sha256:0a97d657f6cf8782a830bb476c13f7d777cfcab8428ac49dde15c22babceb361"}, - {file = "aiohttp-3.11.9.tar.gz", hash = "sha256:a9266644064779840feec0e34f10a89b3ff1d2d6b751fe90017abcad1864fa7c"}, + {file = "aiohttp-3.11.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cbad88a61fa743c5d283ad501b01c153820734118b65aee2bd7dbb735475ce0d"}, + {file = "aiohttp-3.11.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80886dac673ceaef499de2f393fc80bb4481a129e6cb29e624a12e3296cc088f"}, + {file = "aiohttp-3.11.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:61b9bae80ed1f338c42f57c16918853dc51775fb5cb61da70d590de14d8b5fb4"}, + {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e2e576caec5c6a6b93f41626c9c02fc87cd91538b81a3670b2e04452a63def6"}, + {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02c13415b5732fb6ee7ff64583a5e6ed1c57aa68f17d2bda79c04888dfdc2769"}, + {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfce37f31f20800a6a6620ce2cdd6737b82e42e06e6e9bd1b36f546feb3c44f"}, + {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3bbbfff4c679c64e6e23cb213f57cc2c9165c9a65d63717108a644eb5a7398df"}, + {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49c7dbbc1a559ae14fc48387a115b7d4bbc84b4a2c3b9299c31696953c2a5219"}, + {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:68386d78743e6570f054fe7949d6cb37ef2b672b4d3405ce91fafa996f7d9b4d"}, + {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9ef405356ba989fb57f84cac66f7b0260772836191ccefbb987f414bcd2979d9"}, + {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5d6958671b296febe7f5f859bea581a21c1d05430d1bbdcf2b393599b1cdce77"}, + {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:99b7920e7165be5a9e9a3a7f1b680f06f68ff0d0328ff4079e5163990d046767"}, + {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0dc49f42422163efb7e6f1df2636fe3db72713f6cd94688e339dbe33fe06d61d"}, + {file = "aiohttp-3.11.10-cp310-cp310-win32.whl", hash = "sha256:40d1c7a7f750b5648642586ba7206999650208dbe5afbcc5284bcec6579c9b91"}, + {file = "aiohttp-3.11.10-cp310-cp310-win_amd64.whl", hash = "sha256:68ff6f48b51bd78ea92b31079817aff539f6c8fc80b6b8d6ca347d7c02384e33"}, + {file = "aiohttp-3.11.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:77c4aa15a89847b9891abf97f3d4048f3c2d667e00f8a623c89ad2dccee6771b"}, + {file = "aiohttp-3.11.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:909af95a72cedbefe5596f0bdf3055740f96c1a4baa0dd11fd74ca4de0b4e3f1"}, + {file = "aiohttp-3.11.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:386fbe79863eb564e9f3615b959e28b222259da0c48fd1be5929ac838bc65683"}, + {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3de34936eb1a647aa919655ff8d38b618e9f6b7f250cc19a57a4bf7fd2062b6d"}, + {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c9527819b29cd2b9f52033e7fb9ff08073df49b4799c89cb5754624ecd98299"}, + {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a96e3e03300b41f261bbfd40dfdbf1c301e87eab7cd61c054b1f2e7c89b9e8"}, + {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98f5635f7b74bcd4f6f72fcd85bea2154b323a9f05226a80bc7398d0c90763b0"}, + {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:03b6002e20938fc6ee0918c81d9e776bebccc84690e2b03ed132331cca065ee5"}, + {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6362cc6c23c08d18ddbf0e8c4d5159b5df74fea1a5278ff4f2c79aed3f4e9f46"}, + {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3691ed7726fef54e928fe26344d930c0c8575bc968c3e239c2e1a04bd8cf7838"}, + {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31d5093d3acd02b31c649d3a69bb072d539d4c7659b87caa4f6d2bcf57c2fa2b"}, + {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8b3cf2dc0f0690a33f2d2b2cb15db87a65f1c609f53c37e226f84edb08d10f52"}, + {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:fbbaea811a2bba171197b08eea288b9402faa2bab2ba0858eecdd0a4105753a3"}, + {file = "aiohttp-3.11.10-cp311-cp311-win32.whl", hash = "sha256:4b2c7ac59c5698a7a8207ba72d9e9c15b0fc484a560be0788b31312c2c5504e4"}, + {file = "aiohttp-3.11.10-cp311-cp311-win_amd64.whl", hash = "sha256:974d3a2cce5fcfa32f06b13ccc8f20c6ad9c51802bb7f829eae8a1845c4019ec"}, + {file = "aiohttp-3.11.10-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b78f053a7ecfc35f0451d961dacdc671f4bcbc2f58241a7c820e9d82559844cf"}, + {file = "aiohttp-3.11.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab7485222db0959a87fbe8125e233b5a6f01f4400785b36e8a7878170d8c3138"}, + {file = "aiohttp-3.11.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cf14627232dfa8730453752e9cdc210966490992234d77ff90bc8dc0dce361d5"}, + {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:076bc454a7e6fd646bc82ea7f98296be0b1219b5e3ef8a488afbdd8e81fbac50"}, + {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:482cafb7dc886bebeb6c9ba7925e03591a62ab34298ee70d3dd47ba966370d2c"}, + {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf3d1a519a324af764a46da4115bdbd566b3c73fb793ffb97f9111dbc684fc4d"}, + {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24213ba85a419103e641e55c27dc7ff03536c4873470c2478cce3311ba1eee7b"}, + {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b99acd4730ad1b196bfb03ee0803e4adac371ae8efa7e1cbc820200fc5ded109"}, + {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:14cdb5a9570be5a04eec2ace174a48ae85833c2aadc86de68f55541f66ce42ab"}, + {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7e97d622cb083e86f18317282084bc9fbf261801b0192c34fe4b1febd9f7ae69"}, + {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:012f176945af138abc10c4a48743327a92b4ca9adc7a0e078077cdb5dbab7be0"}, + {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44224d815853962f48fe124748227773acd9686eba6dc102578defd6fc99e8d9"}, + {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c87bf31b7fdab94ae3adbe4a48e711bfc5f89d21cf4c197e75561def39e223bc"}, + {file = "aiohttp-3.11.10-cp312-cp312-win32.whl", hash = "sha256:06a8e2ee1cbac16fe61e51e0b0c269400e781b13bcfc33f5425912391a542985"}, + {file = "aiohttp-3.11.10-cp312-cp312-win_amd64.whl", hash = "sha256:be2b516f56ea883a3e14dda17059716593526e10fb6303189aaf5503937db408"}, + {file = "aiohttp-3.11.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8cc5203b817b748adccb07f36390feb730b1bc5f56683445bfe924fc270b8816"}, + {file = "aiohttp-3.11.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ef359ebc6949e3a34c65ce20230fae70920714367c63afd80ea0c2702902ccf"}, + {file = "aiohttp-3.11.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9bca390cb247dbfaec3c664326e034ef23882c3f3bfa5fbf0b56cad0320aaca5"}, + {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811f23b3351ca532af598405db1093f018edf81368e689d1b508c57dcc6b6a32"}, + {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddf5f7d877615f6a1e75971bfa5ac88609af3b74796ff3e06879e8422729fd01"}, + {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ab29b8a0beb6f8eaf1e5049252cfe74adbaafd39ba91e10f18caeb0e99ffb34"}, + {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c49a76c1038c2dd116fa443eba26bbb8e6c37e924e2513574856de3b6516be99"}, + {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f3dc0e330575f5b134918976a645e79adf333c0a1439dcf6899a80776c9ab39"}, + {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:efb15a17a12497685304b2d976cb4939e55137df7b09fa53f1b6a023f01fcb4e"}, + {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:db1d0b28fcb7f1d35600150c3e4b490775251dea70f894bf15c678fdd84eda6a"}, + {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:15fccaf62a4889527539ecb86834084ecf6e9ea70588efde86e8bc775e0e7542"}, + {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:593c114a2221444f30749cc5e5f4012488f56bd14de2af44fe23e1e9894a9c60"}, + {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7852bbcb4d0d2f0c4d583f40c3bc750ee033265d80598d0f9cb6f372baa6b836"}, + {file = "aiohttp-3.11.10-cp313-cp313-win32.whl", hash = "sha256:65e55ca7debae8faaffee0ebb4b47a51b4075f01e9b641c31e554fd376595c6c"}, + {file = "aiohttp-3.11.10-cp313-cp313-win_amd64.whl", hash = "sha256:beb39a6d60a709ae3fb3516a1581777e7e8b76933bb88c8f4420d875bb0267c6"}, + {file = "aiohttp-3.11.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0580f2e12de2138f34debcd5d88894786453a76e98febaf3e8fe5db62d01c9bf"}, + {file = "aiohttp-3.11.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a55d2ad345684e7c3dd2c20d2f9572e9e1d5446d57200ff630e6ede7612e307f"}, + {file = "aiohttp-3.11.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04814571cb72d65a6899db6099e377ed00710bf2e3eafd2985166f2918beaf59"}, + {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e44a9a3c053b90c6f09b1bb4edd880959f5328cf63052503f892c41ea786d99f"}, + {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:502a1464ccbc800b4b1995b302efaf426e8763fadf185e933c2931df7db9a199"}, + {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:613e5169f8ae77b1933e42e418a95931fb4867b2991fc311430b15901ed67079"}, + {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cca22a61b7fe45da8fc73c3443150c3608750bbe27641fc7558ec5117b27fdf"}, + {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:86a5dfcc39309470bd7b68c591d84056d195428d5d2e0b5ccadfbaf25b026ebc"}, + {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:77ae58586930ee6b2b6f696c82cf8e78c8016ec4795c53e36718365f6959dc82"}, + {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:78153314f26d5abef3239b4a9af20c229c6f3ecb97d4c1c01b22c4f87669820c"}, + {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:98283b94cc0e11c73acaf1c9698dea80c830ca476492c0fe2622bd931f34b487"}, + {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:53bf2097e05c2accc166c142a2090e4c6fd86581bde3fd9b2d3f9e93dda66ac1"}, + {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c5532f0441fc09c119e1dca18fbc0687e64fbeb45aa4d6a87211ceaee50a74c4"}, + {file = "aiohttp-3.11.10-cp39-cp39-win32.whl", hash = "sha256:47ad15a65fb41c570cd0ad9a9ff8012489e68176e7207ec7b82a0940dddfd8be"}, + {file = "aiohttp-3.11.10-cp39-cp39-win_amd64.whl", hash = "sha256:c6b9e6d7e41656d78e37ce754813fa44b455c3d0d0dced2a047def7dc5570b74"}, + {file = "aiohttp-3.11.10.tar.gz", hash = "sha256:b1fc6b45010a8d0ff9e88f9f2418c6fd408c99c211257334aff41597ebece42e"}, ] [package.dependencies] @@ -884,13 +884,13 @@ test = ["pytest"] [[package]] name = "composio-core" -version = "0.5.50" +version = "0.5.51" description = "Core package to act as a bridge between composio platform and other services." optional = false python-versions = "<4,>=3.9" files = [ - {file = "composio_core-0.5.50-py3-none-any.whl", hash = "sha256:405d7884992a916a706cc29a795d3cf79b8b3c51bb3f30f202a1ca97f8e6b5ae"}, - {file = "composio_core-0.5.50.tar.gz", hash = "sha256:45eb33117ecce4292e13af1b6dc7ed51ec04870669591bc35dd8551c9823c17e"}, + {file = "composio_core-0.5.51-py3-none-any.whl", hash = "sha256:9bde524029967d8ff86a97986ce68cc4797c9b7ad6ea00450844af1238033a83"}, + {file = "composio_core-0.5.51.tar.gz", hash = "sha256:052f8af227d1a8121a2475ddce96ba09d5d556ad34cc091672dfe14b297c6742"}, ] [package.dependencies] @@ -920,17 +920,17 @@ tools = ["diskcache", "flake8", "networkx", "pathspec", "pygments", "ruff", "tra [[package]] name = "composio-langchain" -version = "0.5.50" +version = "0.5.51" description = "Use Composio to get an array of tools with your LangChain agent." optional = false python-versions = "<4,>=3.9" files = [ - {file = "composio_langchain-0.5.50-py3-none-any.whl", hash = "sha256:14091593ca594978714bc97c3e065519daf42740f6963f4554e9193482e8eeab"}, - {file = "composio_langchain-0.5.50.tar.gz", hash = "sha256:f1b74739860d1dde76e99c57961df63629ccd9fe6f4f71d667a51e8af915f3ab"}, + {file = "composio_langchain-0.5.51-py3-none-any.whl", hash = "sha256:dc0e91b0b890ba5306bc096fcca376c3b0191d649c485300f477c0e5578deaa5"}, + {file = "composio_langchain-0.5.51.tar.gz", hash = "sha256:332bb3482ab293f45acf07ad0cf988e7a101f88caaaec818395663e4a6269432"}, ] [package.dependencies] -composio_core = ">=0.5.40,<=0.5.50" +composio_core = ">=0.5.50,<=0.5.51" langchain = ">=0.1.0" langchain-openai = ">=0.0.2.post1" langchainhub = ">=0.1.15" @@ -3910,13 +3910,13 @@ sympy = "*" [[package]] name = "openai" -version = "1.56.2" +version = "1.57.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" files = [ - {file = "openai-1.56.2-py3-none-any.whl", hash = "sha256:82d0c48f9504e04c7797e9b799dcf7f49a246d99b6cbfd90f3193ea80815b69e"}, - {file = "openai-1.56.2.tar.gz", hash = "sha256:17312af69bc7670d4048f98ab5849f8784d98c39ac64fcde19406e3774a0c1e5"}, + {file = "openai-1.57.0-py3-none-any.whl", hash = "sha256:972e36960b821797952da3dc4532f486c28e28a2a332d7d0c5407f242e9d9c39"}, + {file = "openai-1.57.0.tar.gz", hash = "sha256:76f91971c4bdbd78380c9970581075e0337b5d497c2fbf7b5255078f4b31abf9"}, ] [package.dependencies] @@ -6094,17 +6094,18 @@ files = [ [[package]] name = "sentry-sdk" -version = "2.19.0" +version = "2.19.1" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = ">=3.6" files = [ - {file = "sentry_sdk-2.19.0-py2.py3-none-any.whl", hash = "sha256:7b0b3b709dee051337244a09a30dbf6e95afe0d34a1f8b430d45e0982a7c125b"}, - {file = "sentry_sdk-2.19.0.tar.gz", hash = "sha256:ee4a4d2ae8bfe3cac012dcf3e4607975904c137e1738116549fc3dbbb6ff0e36"}, + {file = "sentry_sdk-2.19.1-py2.py3-none-any.whl", hash = "sha256:b056e04b766f805fdf0aa620482cafe2ff000c8fcb51cb266cdb90873e93837b"}, + {file = "sentry_sdk-2.19.1.tar.gz", hash = "sha256:6ad8507457a379b72f832aca55787b21e7391751892faef1fd8bace350aa5e17"}, ] [package.dependencies] certifi = "*" +fastapi = {version = ">=0.79.0", optional = true, markers = "extra == \"fastapi\""} urllib3 = ">=1.26.11" [package.extras] @@ -6213,58 +6214,39 @@ description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.36-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:59b8f3adb3971929a3e660337f5dacc5942c2cdb760afcabb2614ffbda9f9f72"}, - {file = "SQLAlchemy-2.0.36-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37350015056a553e442ff672c2d20e6f4b6d0b2495691fa239d8aa18bb3bc908"}, {file = "SQLAlchemy-2.0.36-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8318f4776c85abc3f40ab185e388bee7a6ea99e7fa3a30686580b209eaa35c08"}, {file = "SQLAlchemy-2.0.36-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c245b1fbade9c35e5bd3b64270ab49ce990369018289ecfde3f9c318411aaa07"}, {file = "SQLAlchemy-2.0.36-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:69f93723edbca7342624d09f6704e7126b152eaed3cdbb634cb657a54332a3c5"}, {file = "SQLAlchemy-2.0.36-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f9511d8dd4a6e9271d07d150fb2f81874a3c8c95e11ff9af3a2dfc35fe42ee44"}, {file = "SQLAlchemy-2.0.36-cp310-cp310-win32.whl", hash = "sha256:c3f3631693003d8e585d4200730616b78fafd5a01ef8b698f6967da5c605b3fa"}, {file = "SQLAlchemy-2.0.36-cp310-cp310-win_amd64.whl", hash = "sha256:a86bfab2ef46d63300c0f06936bd6e6c0105faa11d509083ba8f2f9d237fb5b5"}, - {file = "SQLAlchemy-2.0.36-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fd3a55deef00f689ce931d4d1b23fa9f04c880a48ee97af488fd215cf24e2a6c"}, - {file = "SQLAlchemy-2.0.36-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f5e9cd989b45b73bd359f693b935364f7e1f79486e29015813c338450aa5a71"}, {file = "SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ddd9db6e59c44875211bc4c7953a9f6638b937b0a88ae6d09eb46cced54eff"}, {file = "SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2519f3a5d0517fc159afab1015e54bb81b4406c278749779be57a569d8d1bb0d"}, {file = "SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59b1ee96617135f6e1d6f275bbe988f419c5178016f3d41d3c0abb0c819f75bb"}, {file = "SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:39769a115f730d683b0eb7b694db9789267bcd027326cccc3125e862eb03bfd8"}, {file = "SQLAlchemy-2.0.36-cp311-cp311-win32.whl", hash = "sha256:66bffbad8d6271bb1cc2f9a4ea4f86f80fe5e2e3e501a5ae2a3dc6a76e604e6f"}, {file = "SQLAlchemy-2.0.36-cp311-cp311-win_amd64.whl", hash = "sha256:23623166bfefe1487d81b698c423f8678e80df8b54614c2bf4b4cfcd7c711959"}, - {file = "SQLAlchemy-2.0.36-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7b64e6ec3f02c35647be6b4851008b26cff592a95ecb13b6788a54ef80bbdd4"}, - {file = "SQLAlchemy-2.0.36-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:46331b00096a6db1fdc052d55b101dbbfc99155a548e20a0e4a8e5e4d1362855"}, {file = "SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdf3386a801ea5aba17c6410dd1dc8d39cf454ca2565541b5ac42a84e1e28f53"}, {file = "SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9dfa18ff2a67b09b372d5db8743c27966abf0e5344c555d86cc7199f7ad83a"}, {file = "SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:90812a8933df713fdf748b355527e3af257a11e415b613dd794512461eb8a686"}, {file = "SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1bc330d9d29c7f06f003ab10e1eaced295e87940405afe1b110f2eb93a233588"}, {file = "SQLAlchemy-2.0.36-cp312-cp312-win32.whl", hash = "sha256:79d2e78abc26d871875b419e1fd3c0bca31a1cb0043277d0d850014599626c2e"}, {file = "SQLAlchemy-2.0.36-cp312-cp312-win_amd64.whl", hash = "sha256:b544ad1935a8541d177cb402948b94e871067656b3a0b9e91dbec136b06a2ff5"}, - {file = "SQLAlchemy-2.0.36-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b5cc79df7f4bc3d11e4b542596c03826063092611e481fcf1c9dfee3c94355ef"}, - {file = "SQLAlchemy-2.0.36-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3c01117dd36800f2ecaa238c65365b7b16497adc1522bf84906e5710ee9ba0e8"}, {file = "SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bc633f4ee4b4c46e7adcb3a9b5ec083bf1d9a97c1d3854b92749d935de40b9b"}, {file = "SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e46ed38affdfc95d2c958de328d037d87801cfcbea6d421000859e9789e61c2"}, {file = "SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b2985c0b06e989c043f1dc09d4fe89e1616aadd35392aea2844f0458a989eacf"}, {file = "SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a121d62ebe7d26fec9155f83f8be5189ef1405f5973ea4874a26fab9f1e262c"}, {file = "SQLAlchemy-2.0.36-cp313-cp313-win32.whl", hash = "sha256:0572f4bd6f94752167adfd7c1bed84f4b240ee6203a95e05d1e208d488d0d436"}, {file = "SQLAlchemy-2.0.36-cp313-cp313-win_amd64.whl", hash = "sha256:8c78ac40bde930c60e0f78b3cd184c580f89456dd87fc08f9e3ee3ce8765ce88"}, - {file = "SQLAlchemy-2.0.36-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:be9812b766cad94a25bc63bec11f88c4ad3629a0cec1cd5d4ba48dc23860486b"}, - {file = "SQLAlchemy-2.0.36-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aae840ebbd6cdd41af1c14590e5741665e5272d2fee999306673a1bb1fdb4d"}, {file = "SQLAlchemy-2.0.36-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4557e1f11c5f653ebfdd924f3f9d5ebfc718283b0b9beebaa5dd6b77ec290971"}, - {file = "SQLAlchemy-2.0.36-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:07b441f7d03b9a66299ce7ccf3ef2900abc81c0db434f42a5694a37bd73870f2"}, {file = "SQLAlchemy-2.0.36-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:28120ef39c92c2dd60f2721af9328479516844c6b550b077ca450c7d7dc68575"}, {file = "SQLAlchemy-2.0.36-cp37-cp37m-win32.whl", hash = "sha256:b81ee3d84803fd42d0b154cb6892ae57ea6b7c55d8359a02379965706c7efe6c"}, {file = "SQLAlchemy-2.0.36-cp37-cp37m-win_amd64.whl", hash = "sha256:f942a799516184c855e1a32fbc7b29d7e571b52612647866d4ec1c3242578fcb"}, - {file = "SQLAlchemy-2.0.36-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3d6718667da04294d7df1670d70eeddd414f313738d20a6f1d1f379e3139a545"}, - {file = "SQLAlchemy-2.0.36-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:72c28b84b174ce8af8504ca28ae9347d317f9dba3999e5981a3cd441f3712e24"}, - {file = "SQLAlchemy-2.0.36-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b11d0cfdd2b095e7b0686cf5fabeb9c67fae5b06d265d8180715b8cfa86522e3"}, {file = "SQLAlchemy-2.0.36-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e32092c47011d113dc01ab3e1d3ce9f006a47223b18422c5c0d150af13a00687"}, - {file = "SQLAlchemy-2.0.36-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6a440293d802d3011028e14e4226da1434b373cbaf4a4bbb63f845761a708346"}, {file = "SQLAlchemy-2.0.36-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c54a1e53a0c308a8e8a7dffb59097bff7facda27c70c286f005327f21b2bd6b1"}, {file = "SQLAlchemy-2.0.36-cp38-cp38-win32.whl", hash = "sha256:1e0d612a17581b6616ff03c8e3d5eff7452f34655c901f75d62bd86449d9750e"}, {file = "SQLAlchemy-2.0.36-cp38-cp38-win_amd64.whl", hash = "sha256:8958b10490125124463095bbdadda5aa22ec799f91958e410438ad6c97a7b793"}, - {file = "SQLAlchemy-2.0.36-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc022184d3e5cacc9579e41805a681187650e170eb2fd70e28b86192a479dcaa"}, - {file = "SQLAlchemy-2.0.36-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b817d41d692bf286abc181f8af476c4fbef3fd05e798777492618378448ee689"}, - {file = "SQLAlchemy-2.0.36-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4e46a888b54be23d03a89be510f24a7652fe6ff660787b96cd0e57a4ebcb46d"}, {file = "SQLAlchemy-2.0.36-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4ae3005ed83f5967f961fd091f2f8c5329161f69ce8480aa8168b2d7fe37f06"}, - {file = "SQLAlchemy-2.0.36-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:03e08af7a5f9386a43919eda9de33ffda16b44eb11f3b313e6822243770e9763"}, {file = "SQLAlchemy-2.0.36-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3dbb986bad3ed5ceaf090200eba750b5245150bd97d3e67343a3cfed06feecf7"}, {file = "SQLAlchemy-2.0.36-cp39-cp39-win32.whl", hash = "sha256:9fe53b404f24789b5ea9003fc25b9a3988feddebd7e7b369c8fac27ad6f52f28"}, {file = "SQLAlchemy-2.0.36-cp39-cp39-win_amd64.whl", hash = "sha256:af148a33ff0349f53512a049c6406923e4e02bf2f26c5fb285f143faf4f0e46a"}, @@ -7553,4 +7535,4 @@ tests = ["wikipedia"] [metadata] lock-version = "2.0" python-versions = "<3.13,>=3.10" -content-hash = "0445ec55b5a9d9a1112768cadb11f9fe1b5f92b8322a9208868111c792da4f81" +content-hash = "55f9fdb8f904ae60aa7b871f9b45a4da17e505c1efa96b6e373f39904f57a684" diff --git a/pyproject.toml b/pyproject.toml index 17793a2635..ef6b97966b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -76,6 +76,7 @@ e2b-code-interpreter = {version = "^1.0.1", optional = true} pathvalidate = "^3.2.1" langchain-community = {version = "^0.3.7", optional = true} langchain = {version = "^0.3.7", optional = true} +sentry-sdk = {extras = ["fastapi"], version = "2.19.1"} [tool.poetry.extras] #local = ["llama-index-embeddings-huggingface"] From a01f1fd5d3c8cbf512af00db9585880411cfb837 Mon Sep 17 00:00:00 2001 From: mlong93 <35275280+mlong93@users.noreply.github.com> Date: Thu, 5 Dec 2024 17:47:22 -0800 Subject: [PATCH 023/280] feat: orm ToolsAgents migration (#2173) Co-authored-by: Mindy Long --- .gitignore | 1 + .../08b2f8225812_adding_toolsagents_orm.py | 44 ++++++ letta/functions/function_sets/base.py | 8 +- letta/orm/__init__.py | 1 + letta/orm/tool.py | 23 ++- letta/orm/tools_agents.py | 32 ++++ letta/schemas/tools_agents.py | 32 ++++ letta/server/server.py | 2 + letta/services/tool_manager.py | 2 +- letta/services/tools_agents_manager.py | 94 ++++++++++++ tests/test_managers.py | 137 +++++++++++++++++- 11 files changed, 369 insertions(+), 7 deletions(-) create mode 100644 alembic/versions/08b2f8225812_adding_toolsagents_orm.py create mode 100644 letta/orm/tools_agents.py create mode 100644 letta/schemas/tools_agents.py create mode 100644 letta/services/tools_agents_manager.py diff --git a/.gitignore b/.gitignore index 9fb91c2bb0..12042451e0 100644 --- a/.gitignore +++ b/.gitignore @@ -551,6 +551,7 @@ tags [._]*.un~ ### VisualStudioCode ### +.vscode/ .vscode/* !.vscode/settings.json !.vscode/tasks.json diff --git a/alembic/versions/08b2f8225812_adding_toolsagents_orm.py b/alembic/versions/08b2f8225812_adding_toolsagents_orm.py new file mode 100644 index 0000000000..902225ab19 --- /dev/null +++ b/alembic/versions/08b2f8225812_adding_toolsagents_orm.py @@ -0,0 +1,44 @@ +"""adding ToolsAgents ORM + +Revision ID: 08b2f8225812 +Revises: 3c683a662c82 +Create Date: 2024-12-05 16:46:51.258831 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '08b2f8225812' +down_revision: Union[str, None] = '3c683a662c82' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('tools_agents', + sa.Column('agent_id', sa.String(), nullable=False), + sa.Column('tool_id', sa.String(), nullable=False), + sa.Column('tool_name', sa.String(), nullable=False), + sa.Column('id', sa.String(), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), + sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), + sa.Column('is_deleted', sa.Boolean(), server_default=sa.text('FALSE'), nullable=False), + sa.Column('_created_by_id', sa.String(), nullable=True), + sa.Column('_last_updated_by_id', sa.String(), nullable=True), + sa.ForeignKeyConstraint(['agent_id'], ['agents.id'], ), + sa.ForeignKeyConstraint(['tool_id'], ['tools.id'], name='fk_tool_id'), + sa.PrimaryKeyConstraint('agent_id', 'tool_id', 'tool_name', 'id'), + sa.UniqueConstraint('agent_id', 'tool_name', name='unique_tool_per_agent') + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('tools_agents') + # ### end Alembic commands ### diff --git a/letta/functions/function_sets/base.py b/letta/functions/function_sets/base.py index e7bd4a9d94..6e9631282f 100644 --- a/letta/functions/function_sets/base.py +++ b/letta/functions/function_sets/base.py @@ -56,7 +56,7 @@ def pause_heartbeats(self: Agent, minutes: int) -> Optional[str]: pause_heartbeats.__doc__ = pause_heartbeats_docstring -def conversation_search(self: Agent, query: str, page: Optional[int] = 0) -> Optional[str]: +def conversation_search(self: "Agent", query: str, page: Optional[int] = 0) -> Optional[str]: """ Search prior conversation history using case-insensitive string matching. @@ -91,7 +91,7 @@ def conversation_search(self: Agent, query: str, page: Optional[int] = 0) -> Opt return results_str -def conversation_search_date(self: Agent, start_date: str, end_date: str, page: Optional[int] = 0) -> Optional[str]: +def conversation_search_date(self: "Agent", start_date: str, end_date: str, page: Optional[int] = 0) -> Optional[str]: """ Search prior conversation history using a date range. @@ -126,7 +126,7 @@ def conversation_search_date(self: Agent, start_date: str, end_date: str, page: return results_str -def archival_memory_insert(self: Agent, content: str) -> Optional[str]: +def archival_memory_insert(self: "Agent", content: str) -> Optional[str]: """ Add to archival memory. Make sure to phrase the memory contents such that it can be easily queried later. @@ -140,7 +140,7 @@ def archival_memory_insert(self: Agent, content: str) -> Optional[str]: return None -def archival_memory_search(self: Agent, query: str, page: Optional[int] = 0) -> Optional[str]: +def archival_memory_search(self: "Agent", query: str, page: Optional[int] = 0) -> Optional[str]: """ Search archival memory using semantic (embedding-based) search. diff --git a/letta/orm/__init__.py b/letta/orm/__init__.py index 4298811263..8d47ba4591 100644 --- a/letta/orm/__init__.py +++ b/letta/orm/__init__.py @@ -7,4 +7,5 @@ from letta.orm.sandbox_config import SandboxConfig, SandboxEnvironmentVariable from letta.orm.source import Source from letta.orm.tool import Tool +from letta.orm.tools_agents import ToolsAgents from letta.orm.user import User diff --git a/letta/orm/tool.py b/letta/orm/tool.py index d86fffa2ee..00038fe000 100644 --- a/letta/orm/tool.py +++ b/letta/orm/tool.py @@ -1,6 +1,6 @@ from typing import TYPE_CHECKING, List, Optional -from sqlalchemy import JSON, String, UniqueConstraint +from sqlalchemy import JSON, String, UniqueConstraint, event from sqlalchemy.orm import Mapped, mapped_column, relationship # TODO everything in functions should live in this model @@ -11,6 +11,7 @@ if TYPE_CHECKING: from letta.orm.organization import Organization + from letta.orm.tools_agents import ToolsAgents class Tool(SqlalchemyBase, OrganizationMixin): @@ -40,3 +41,23 @@ class Tool(SqlalchemyBase, OrganizationMixin): # relationships organization: Mapped["Organization"] = relationship("Organization", back_populates="tools", lazy="selectin") + tools_agents: Mapped[List["ToolsAgents"]] = relationship("ToolsAgents", back_populates="tool", cascade="all, delete-orphan") + + +# Add event listener to update tool_name in ToolsAgents when Tool name changes +@event.listens_for(Tool, 'before_update') +def update_tool_name_in_tools_agents(mapper, connection, target): + """Update tool_name in ToolsAgents when Tool name changes.""" + state = target._sa_instance_state + history = state.get_history('name', passive=True) + if not history.has_changes(): + return + + # Get the new name and update all associated ToolsAgents records + new_name = target.name + from letta.orm.tools_agents import ToolsAgents + connection.execute( + ToolsAgents.__table__.update().where( + ToolsAgents.tool_id == target.id + ).values(tool_name=new_name) + ) diff --git a/letta/orm/tools_agents.py b/letta/orm/tools_agents.py new file mode 100644 index 0000000000..dfb8a9a704 --- /dev/null +++ b/letta/orm/tools_agents.py @@ -0,0 +1,32 @@ +from sqlalchemy import ForeignKey, ForeignKeyConstraint, String, UniqueConstraint +from sqlalchemy.orm import Mapped, mapped_column, relationship + +from letta.orm.sqlalchemy_base import SqlalchemyBase +from letta.schemas.tools_agents import ToolsAgents as PydanticToolsAgents + + +class ToolsAgents(SqlalchemyBase): + """Agents can have one or many tools associated with them.""" + + __tablename__ = "tools_agents" + __pydantic_model__ = PydanticToolsAgents + __table_args__ = ( + UniqueConstraint( + "agent_id", + "tool_name", + name="unique_tool_per_agent", + ), + ForeignKeyConstraint( + ["tool_id"], + ["tools.id"], + name="fk_tool_id", + ), + ) + + # Each agent must have unique tool names + agent_id: Mapped[str] = mapped_column(String, ForeignKey("agents.id"), primary_key=True) + tool_id: Mapped[str] = mapped_column(String, primary_key=True) + tool_name: Mapped[str] = mapped_column(String, primary_key=True) + + # relationships + tool: Mapped["Tool"] = relationship("Tool", back_populates="tools_agents") # agent: Mapped["Agent"] = relationship("Agent", back_populates="tools_agents") diff --git a/letta/schemas/tools_agents.py b/letta/schemas/tools_agents.py new file mode 100644 index 0000000000..b7e8bdcf61 --- /dev/null +++ b/letta/schemas/tools_agents.py @@ -0,0 +1,32 @@ +from datetime import datetime +from typing import Optional + +from pydantic import Field + +from letta.schemas.letta_base import LettaBase + + +class ToolsAgentsBase(LettaBase): + __id_prefix__ = "tools_agents" + + +class ToolsAgents(ToolsAgentsBase): + """ + Schema representing the relationship between tools and agents. + + Parameters: + agent_id (str): The ID of the associated agent. + tool_id (str): The ID of the associated tool. + tool_name (str): The name of the tool. + created_at (datetime): The date this relationship was created. + updated_at (datetime): The date this relationship was last updated. + is_deleted (bool): Whether this tool-agent relationship is deleted or not. + """ + + id: str = ToolsAgentsBase.generate_id_field() + agent_id: str = Field(..., description="The ID of the associated agent.") + tool_id: str = Field(..., description="The ID of the associated tool.") + tool_name: str = Field(..., description="The name of the tool.") + created_at: Optional[datetime] = Field(None, description="The creation date of the association.") + updated_at: Optional[datetime] = Field(None, description="The update date of the association.") + is_deleted: bool = Field(False, description="Whether this tool-agent relationship is deleted or not.") diff --git a/letta/server/server.py b/letta/server/server.py index 23e5f211d0..d12e0f3b27 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -77,6 +77,7 @@ from letta.services.agents_tags_manager import AgentsTagsManager from letta.services.block_manager import BlockManager from letta.services.blocks_agents_manager import BlocksAgentsManager +from letta.services.tools_agents_manager import ToolsAgentsManager from letta.services.job_manager import JobManager from letta.services.organization_manager import OrganizationManager from letta.services.per_agent_lock_manager import PerAgentLockManager @@ -259,6 +260,7 @@ def __init__( self.agents_tags_manager = AgentsTagsManager() self.sandbox_config_manager = SandboxConfigManager(tool_settings) self.blocks_agents_manager = BlocksAgentsManager() + self.tools_agents_manager = ToolsAgentsManager() self.job_manager = JobManager() # Managers that interface with parallelism diff --git a/letta/services/tool_manager.py b/letta/services/tool_manager.py index 7acf4fa52f..33b1afd719 100644 --- a/letta/services/tool_manager.py +++ b/letta/services/tool_manager.py @@ -130,7 +130,7 @@ def delete_tool_by_id(self, tool_id: str, actor: PydanticUser) -> None: with self.session_maker() as session: try: tool = ToolModel.read(db_session=session, identifier=tool_id, actor=actor) - tool.delete(db_session=session, actor=actor) + tool.hard_delete(db_session=session, actor=actor) except NoResultFound: raise ValueError(f"Tool with id {tool_id} not found.") diff --git a/letta/services/tools_agents_manager.py b/letta/services/tools_agents_manager.py new file mode 100644 index 0000000000..35b24e5aa8 --- /dev/null +++ b/letta/services/tools_agents_manager.py @@ -0,0 +1,94 @@ +import warnings +from typing import List, Optional + +from sqlalchemy import select +from sqlalchemy.exc import IntegrityError +from sqlalchemy.orm import Session + +from letta.orm.errors import NoResultFound +from letta.orm.organization import Organization +from letta.orm.tool import Tool +from letta.orm.tools_agents import ToolsAgents as ToolsAgentsModel +from letta.schemas.tools_agents import ToolsAgents as PydanticToolsAgents + +class ToolsAgentsManager: + """Manages the relationship between tools and agents.""" + + def __init__(self): + from letta.server.server import db_context + self.session_maker = db_context + + def add_tool_to_agent(self, agent_id: str, tool_id: str, tool_name: str) -> PydanticToolsAgents: + """Add a tool to an agent. + + When a tool is added to an agent, it will be added to all agents in the same organization. + """ + with self.session_maker() as session: + try: + # Check if the tool-agent combination already exists for this agent + tools_agents_record = ToolsAgentsModel.read(db_session=session, agent_id=agent_id, tool_name=tool_name) + warnings.warn(f"Tool name '{tool_name}' already exists for agent '{agent_id}'.") + except NoResultFound: + tools_agents_record = PydanticToolsAgents(agent_id=agent_id, tool_id=tool_id, tool_name=tool_name) + tools_agents_record = ToolsAgentsModel(**tools_agents_record.model_dump(exclude_none=True)) + tools_agents_record.create(session) + + return tools_agents_record.to_pydantic() + + def remove_tool_with_name_from_agent(self, agent_id: str, tool_name: str) -> None: + """Remove a tool from an agent by its name. + + When a tool is removed from an agent, it will be removed from all agents in the same organization. + """ + with self.session_maker() as session: + try: + # Find and delete the tool-agent association for the agent + tools_agents_record = ToolsAgentsModel.read(db_session=session, agent_id=agent_id, tool_name=tool_name) + tools_agents_record.hard_delete(session) + return tools_agents_record.to_pydantic() + except NoResultFound: + raise ValueError(f"Tool name '{tool_name}' not found for agent '{agent_id}'.") + + def remove_tool_with_id_from_agent(self, agent_id: str, tool_id: str) -> PydanticToolsAgents: + """Remove a tool with an ID from an agent.""" + with self.session_maker() as session: + try: + tools_agents_record = ToolsAgentsModel.read(db_session=session, agent_id=agent_id, tool_id=tool_id) + tools_agents_record.hard_delete(session) + return tools_agents_record.to_pydantic() + except NoResultFound: + raise ValueError(f"Tool ID '{tool_id}' not found for agent '{agent_id}'.") + + def list_tool_ids_for_agent(self, agent_id: str) -> List[str]: + """List all tool IDs associated with a specific agent.""" + with self.session_maker() as session: + tools_agents_record = ToolsAgentsModel.list(db_session=session, agent_id=agent_id) + return [record.tool_id for record in tools_agents_record] + + def list_tool_names_for_agent(self, agent_id: str) -> List[str]: + """List all tool names associated with a specific agent.""" + with self.session_maker() as session: + tools_agents_record = ToolsAgentsModel.list(db_session=session, agent_id=agent_id) + return [record.tool_name for record in tools_agents_record] + + def list_agent_ids_with_tool(self, tool_id: str) -> List[str]: + """List all agents associated with a specific tool.""" + with self.session_maker() as session: + tools_agents_record = ToolsAgentsModel.list(db_session=session, tool_id=tool_id) + return [record.agent_id for record in tools_agents_record] + + def get_tool_id_for_name(self, agent_id: str, tool_name: str) -> str: + """Get the tool ID for a specific tool name for an agent.""" + with self.session_maker() as session: + try: + tools_agents_record = ToolsAgentsModel.read(db_session=session, agent_id=agent_id, tool_name=tool_name) + return tools_agents_record.tool_id + except NoResultFound: + raise ValueError(f"Tool name '{tool_name}' not found for agent '{agent_id}'.") + + def remove_all_agent_tools(self, agent_id: str) -> None: + """Remove all tools associated with an agent.""" + with self.session_maker() as session: + tools_agents_records = ToolsAgentsModel.list(db_session=session, agent_id=agent_id) + for record in tools_agents_records: + record.hard_delete(session) \ No newline at end of file diff --git a/tests/test_managers.py b/tests/test_managers.py index 7b5f86f2ed..20022cccd9 100644 --- a/tests/test_managers.py +++ b/tests/test_managers.py @@ -16,6 +16,7 @@ SandboxEnvironmentVariable, Source, Tool, + ToolsAgents, User, ) from letta.orm.agents_tags import AgentsTags @@ -46,9 +47,10 @@ from letta.schemas.source import Source as PydanticSource from letta.schemas.source import SourceUpdate from letta.schemas.tool import Tool as PydanticTool -from letta.schemas.tool import ToolUpdate +from letta.schemas.tool import ToolCreate, ToolUpdate from letta.services.block_manager import BlockManager from letta.services.organization_manager import OrganizationManager +from letta.services.tool_manager import ToolManager from letta.settings import tool_settings utils.DEBUG = True @@ -76,6 +78,7 @@ def clear_tables(server: SyncServer): """Fixture to clear the organization table before each test.""" with server.organization_manager.session_maker() as session: session.execute(delete(Job)) + session.execute(delete(ToolsAgents)) # Clear ToolsAgents first session.execute(delete(BlocksAgents)) session.execute(delete(AgentsTags)) session.execute(delete(SandboxEnvironmentVariable)) @@ -240,6 +243,37 @@ def other_block(server: SyncServer, default_user): yield block +@pytest.fixture +def other_tool(server: SyncServer, default_user, default_organization): + def print_other_tool(message: str): + """ + Args: + message (str): The message to print. + + Returns: + str: The message that was printed. + """ + print(message) + return message + + # Set up tool details + source_code = parse_source_code(print_other_tool) + source_type = "python" + description = "other_tool_description" + tags = ["test"] + + tool = PydanticTool(description=description, tags=tags, source_code=source_code, source_type=source_type) + derived_json_schema = derive_openai_json_schema(source_code=tool.source_code, name=tool.name) + + derived_name = derived_json_schema["name"] + tool.json_schema = derived_json_schema + tool.name = derived_name + + tool = server.tool_manager.create_tool(tool, actor=default_user) + + # Yield the created tool + yield tool + @pytest.fixture(scope="module") def server(): config = LettaConfig.load() @@ -1155,6 +1189,107 @@ def test_add_block_to_agent_with_deleted_block(server, sarah_agent, default_user server.blocks_agents_manager.add_block_to_agent(agent_id=sarah_agent.id, block_id=default_block.id, block_label=default_block.label) +# ====================================================================================================================== +# ToolsAgentsManager Tests +# ====================================================================================================================== +def test_add_tool_to_agent(server, sarah_agent, default_user, print_tool): + tool_association = server.tools_agents_manager.add_tool_to_agent( + agent_id=sarah_agent.id, tool_id=print_tool.id, tool_name=print_tool.name + ) + + assert tool_association.agent_id == sarah_agent.id + assert tool_association.tool_id == print_tool.id + assert tool_association.tool_name == print_tool.name + + +def test_change_name_on_tool_reflects_in_tool_agents_table(server, sarah_agent, default_user, print_tool): + # Add the tool + tool_association = server.tools_agents_manager.add_tool_to_agent( + agent_id=sarah_agent.id, tool_id=print_tool.id, tool_name=print_tool.name + ) + assert tool_association.tool_name == print_tool.name + + # Change the tool name + new_name = "banana" + tool = server.tool_manager.update_tool_by_id( + tool_id=print_tool.id, tool_update=ToolUpdate(name=new_name), actor=default_user + ) + assert tool.name == new_name + + # Get the association + names = server.tools_agents_manager.list_tool_names_for_agent(agent_id=sarah_agent.id) + assert new_name in names + assert print_tool.name not in names + + +@pytest.mark.skipif(using_sqlite, reason="Skipped because using SQLite") +def test_add_tool_to_agent_nonexistent_tool(server, sarah_agent, default_user): + with pytest.raises(ForeignKeyConstraintViolationError): + server.tools_agents_manager.add_tool_to_agent( + agent_id=sarah_agent.id, tool_id="nonexistent_tool", tool_name="nonexistent_name" + ) + + +def test_add_tool_to_agent_duplicate_name(server, sarah_agent, default_user, print_tool, other_tool): + server.tools_agents_manager.add_tool_to_agent(agent_id=sarah_agent.id, tool_id=print_tool.id, tool_name=print_tool.name) + + with pytest.warns(UserWarning, match=f"Tool name '{print_tool.name}' already exists for agent '{sarah_agent.id}'"): + server.tools_agents_manager.add_tool_to_agent(agent_id=sarah_agent.id, tool_id=other_tool.id, tool_name=print_tool.name) + + +def test_remove_tool_with_name_from_agent(server, sarah_agent, default_user, print_tool): + server.tools_agents_manager.add_tool_to_agent(agent_id=sarah_agent.id, tool_id=print_tool.id, tool_name=print_tool.name) + + removed_tool = server.tools_agents_manager.remove_tool_with_name_from_agent( + agent_id=sarah_agent.id, tool_name=print_tool.name + ) + + assert removed_tool.tool_name == print_tool.name + assert removed_tool.tool_id == print_tool.id + assert removed_tool.agent_id == sarah_agent.id + + with pytest.raises(ValueError, match=f"Tool name '{print_tool.name}' not found for agent '{sarah_agent.id}'"): + server.tools_agents_manager.remove_tool_with_name_from_agent(agent_id=sarah_agent.id, tool_name=print_tool.name) + + +def test_list_tool_ids_for_agent(server, sarah_agent, default_user, print_tool, other_tool): + server.tools_agents_manager.add_tool_to_agent(agent_id=sarah_agent.id, tool_id=print_tool.id, tool_name=print_tool.name) + server.tools_agents_manager.add_tool_to_agent(agent_id=sarah_agent.id, tool_id=other_tool.id, tool_name=other_tool.name) + + retrieved_tool_ids = server.tools_agents_manager.list_tool_ids_for_agent(agent_id=sarah_agent.id) + + assert set(retrieved_tool_ids) == {print_tool.id, other_tool.id} + + +def test_list_agent_ids_with_tool(server, sarah_agent, charles_agent, default_user, print_tool): + server.tools_agents_manager.add_tool_to_agent(agent_id=sarah_agent.id, tool_id=print_tool.id, tool_name=print_tool.name) + server.tools_agents_manager.add_tool_to_agent(agent_id=charles_agent.id, tool_id=print_tool.id, tool_name=print_tool.name) + + agent_ids = server.tools_agents_manager.list_agent_ids_with_tool(tool_id=print_tool.id) + + assert sarah_agent.id in agent_ids + assert charles_agent.id in agent_ids + assert len(agent_ids) == 2 + + +@pytest.mark.skipif(using_sqlite, reason="Skipped because using SQLite") +def test_add_tool_to_agent_with_deleted_tool(server, sarah_agent, default_user, print_tool): + tool_manager = ToolManager() + tool_manager.delete_tool_by_id(tool_id=print_tool.id, actor=default_user) + + with pytest.raises(ForeignKeyConstraintViolationError): + server.tools_agents_manager.add_tool_to_agent(agent_id=sarah_agent.id, tool_id=print_tool.id, tool_name=print_tool.name) + +def test_remove_all_agent_tools(server, sarah_agent, default_user, print_tool, other_tool): + server.tools_agents_manager.add_tool_to_agent(agent_id=sarah_agent.id, tool_id=print_tool.id, tool_name=print_tool.name) + server.tools_agents_manager.add_tool_to_agent(agent_id=sarah_agent.id, tool_id=other_tool.id, tool_name=other_tool.name) + + server.tools_agents_manager.remove_all_agent_tools(agent_id=sarah_agent.id) + + retrieved_tool_ids = server.tools_agents_manager.list_tool_ids_for_agent(agent_id=sarah_agent.id) + + assert not retrieved_tool_ids + # ====================================================================================================================== # JobManager Tests # ====================================================================================================================== From 552ac09392c3d3e871764aec0d379e6cac43a08f Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Thu, 5 Dec 2024 18:14:24 -0800 Subject: [PATCH 024/280] chore: add workflow files for closing stale issues (#2174) --- .github/workflows/close_stale_issues.yml | 22 +++++++++++++++++ .../workflows/manually_clear_old_issues.yml | 24 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 .github/workflows/close_stale_issues.yml create mode 100644 .github/workflows/manually_clear_old_issues.yml diff --git a/.github/workflows/close_stale_issues.yml b/.github/workflows/close_stale_issues.yml new file mode 100644 index 0000000000..d5cd3cf15c --- /dev/null +++ b/.github/workflows/close_stale_issues.yml @@ -0,0 +1,22 @@ +name: Close inactive issues +on: + schedule: + - cron: "30 1 * * *" + +jobs: + close-issues: + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + steps: + - uses: actions/stale@v5 + with: + days-before-issue-stale: 30 + days-before-issue-close: 14 + stale-issue-label: "stale" + stale-issue-message: "This issue is stale because it has been open for 30 days with no activity." + close-issue-message: "This issue was closed because it has been inactive for 14 days since being marked as stale." + days-before-pr-stale: -1 + days-before-pr-close: -1 + repo-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/manually_clear_old_issues.yml b/.github/workflows/manually_clear_old_issues.yml new file mode 100644 index 0000000000..0a5861a6b1 --- /dev/null +++ b/.github/workflows/manually_clear_old_issues.yml @@ -0,0 +1,24 @@ +name: Clear Old Issues +on: + workflow_dispatch: + +jobs: + cleanup-old-issues: + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + steps: + - uses: actions/stale@v5 + with: + days-before-issue-stale: 60 + days-before-issue-close: 0 + stale-issue-label: "auto-closed" + stale-issue-message: "" + close-issue-message: "This issue has been automatically closed due to 60 days of inactivity." + days-before-pr-stale: -1 + days-before-pr-close: -1 + exempt-issue-labels: "" + only-issue-labels: "" + remove-stale-when-updated: true + repo-token: ${{ secrets.GITHUB_TOKEN }} From dae05b4f2f9e0355d3f1ff9c78039c130894c1a5 Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Thu, 5 Dec 2024 18:21:01 -0800 Subject: [PATCH 025/280] chore: update workflow (#2175) --- .github/workflows/manually_clear_old_issues.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/manually_clear_old_issues.yml b/.github/workflows/manually_clear_old_issues.yml index 0a5861a6b1..74f7734272 100644 --- a/.github/workflows/manually_clear_old_issues.yml +++ b/.github/workflows/manually_clear_old_issues.yml @@ -21,4 +21,5 @@ jobs: exempt-issue-labels: "" only-issue-labels: "" remove-stale-when-updated: true + operations-per-run: 1000 repo-token: ${{ secrets.GITHUB_TOKEN }} From d71f435feadb85092502a7218a3a93ac6ec24fa6 Mon Sep 17 00:00:00 2001 From: mlong93 <35275280+mlong93@users.noreply.github.com> Date: Fri, 6 Dec 2024 11:50:15 -0800 Subject: [PATCH 026/280] feat: message orm migration (#2144) Co-authored-by: Mindy Long Co-authored-by: Sarah Wooders Co-authored-by: Matt Zhou --- .github/workflows/check_for_new_prints.yml | 5 + .github/workflows/tests.yml | 3 +- .../95badb46fdf9_migrate_message_to_orm.py | 63 ++++ ...505cc7eca9_create_a_baseline_migrations.py | 2 +- letta/agent.py | 91 +++-- letta/agent_store/db.py | 78 +---- letta/agent_store/lancedb.py | 177 ---------- letta/agent_store/storage.py | 5 - letta/cli/cli.py | 1 - letta/client/client.py | 10 +- letta/constants.py | 1 + letta/functions/function_sets/base.py | 38 ++- letta/main.py | 4 +- letta/memory.py | 86 +---- letta/metadata.py | 35 -- letta/o1_agent.py | 9 +- letta/offline_memory_agent.py | 6 + letta/orm/__init__.py | 2 + letta/orm/file.py | 2 +- letta/orm/message.py | 66 ++++ letta/orm/mixins.py | 16 + letta/orm/organization.py | 1 + letta/orm/sqlalchemy_base.py | 144 ++++++-- letta/persistence_manager.py | 149 -------- letta/schemas/letta_base.py | 13 +- letta/schemas/message.py | 8 +- letta/server/rest_api/routers/v1/agents.py | 2 +- letta/server/server.py | 102 +++--- letta/services/block_manager.py | 2 +- letta/services/message_manager.py | 182 ++++++++++ letta/services/organization_manager.py | 15 +- letta/services/source_manager.py | 2 +- letta/services/tool_manager.py | 2 +- letta/services/user_manager.py | 2 +- tests/conftest.py | 19 ++ ...integration_test_tool_execution_sandbox.py | 15 - tests/test_agent_tool_graph.py | 16 - tests/test_client.py | 18 +- tests/test_client_legacy.py | 65 ++-- tests/test_local_client.py | 92 ++--- tests/test_managers.py | 195 ++++++++++- tests/test_offline_memory_agent.py | 54 +-- tests/test_server.py | 117 ++----- tests/test_storage.py | 318 ------------------ tests/test_summarize.py | 18 - 45 files changed, 985 insertions(+), 1266 deletions(-) create mode 100644 alembic/versions/95badb46fdf9_migrate_message_to_orm.py delete mode 100644 letta/agent_store/lancedb.py create mode 100644 letta/orm/message.py delete mode 100644 letta/persistence_manager.py create mode 100644 letta/services/message_manager.py delete mode 100644 tests/test_storage.py diff --git a/.github/workflows/check_for_new_prints.yml b/.github/workflows/check_for_new_prints.yml index 75ef2e27b5..470f5a4faf 100644 --- a/.github/workflows/check_for_new_prints.yml +++ b/.github/workflows/check_for_new_prints.yml @@ -31,6 +31,11 @@ jobs: # Check each changed Python file while IFS= read -r file; do + if [ "$file" == "letta/main.py" ]; then + echo "Skipping $file for print statement checks." + continue + fi + if [ -f "$file" ]; then echo "Checking $file for new print statements..." diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index eade4661a7..1a027a56b4 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -31,6 +31,7 @@ jobs: - "test_utils.py" - "test_tool_schema_parsing.py" - "test_v1_routes.py" + - "test_offline_memory_agent.py" services: qdrant: image: qdrant/qdrant @@ -133,4 +134,4 @@ jobs: LETTA_SERVER_PASS: test_server_token PYTHONPATH: ${{ github.workspace }}:${{ env.PYTHONPATH }} run: | - poetry run pytest -s -vv -k "not test_v1_routes.py and not test_model_letta_perfomance.py and not test_utils.py and not test_client.py and not integration_test_tool_execution_sandbox.py and not integration_test_summarizer.py and not test_agent_tool_graph.py and not test_tool_rule_solver.py and not test_local_client.py and not test_o1_agent.py and not test_cli.py and not test_concurrent_connections.py and not test_quickstart and not test_model_letta_performance and not test_storage and not test_server and not test_openai_client and not test_providers and not test_client_legacy.py" tests + poetry run pytest -s -vv -k "not test_offline_memory_agent.py and not test_v1_routes.py and not test_model_letta_perfomance.py and not test_utils.py and not test_client.py and not integration_test_tool_execution_sandbox.py and not integration_test_summarizer.py and not test_agent_tool_graph.py and not test_tool_rule_solver.py and not test_local_client.py and not test_o1_agent.py and not test_cli.py and not test_concurrent_connections.py and not test_quickstart and not test_model_letta_performance and not test_storage and not test_server and not test_openai_client and not test_providers and not test_client_legacy.py" tests diff --git a/alembic/versions/95badb46fdf9_migrate_message_to_orm.py b/alembic/versions/95badb46fdf9_migrate_message_to_orm.py new file mode 100644 index 0000000000..73254e39ea --- /dev/null +++ b/alembic/versions/95badb46fdf9_migrate_message_to_orm.py @@ -0,0 +1,63 @@ +"""Migrate message to orm + +Revision ID: 95badb46fdf9 +Revises: 3c683a662c82 +Create Date: 2024-12-05 14:02:04.163150 + +""" + +from typing import Sequence, Union + +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = "95badb46fdf9" +down_revision: Union[str, None] = "08b2f8225812" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column("messages", sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=True)) + op.add_column("messages", sa.Column("is_deleted", sa.Boolean(), server_default=sa.text("FALSE"), nullable=False)) + op.add_column("messages", sa.Column("_created_by_id", sa.String(), nullable=True)) + op.add_column("messages", sa.Column("_last_updated_by_id", sa.String(), nullable=True)) + op.add_column("messages", sa.Column("organization_id", sa.String(), nullable=True)) + # Populate `organization_id` based on `user_id` + # Use a raw SQL query to update the organization_id + op.execute( + """ + UPDATE messages + SET organization_id = users.organization_id + FROM users + WHERE messages.user_id = users.id + """ + ) + op.alter_column("messages", "organization_id", nullable=False) + op.alter_column("messages", "tool_calls", existing_type=postgresql.JSON(astext_type=sa.Text()), nullable=False) + op.alter_column("messages", "created_at", existing_type=postgresql.TIMESTAMP(timezone=True), nullable=False) + op.drop_index("message_idx_user", table_name="messages") + op.create_foreign_key(None, "messages", "agents", ["agent_id"], ["id"]) + op.create_foreign_key(None, "messages", "organizations", ["organization_id"], ["id"]) + op.drop_column("messages", "user_id") + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column("messages", sa.Column("user_id", sa.VARCHAR(), autoincrement=False, nullable=False)) + op.drop_constraint(None, "messages", type_="foreignkey") + op.drop_constraint(None, "messages", type_="foreignkey") + op.create_index("message_idx_user", "messages", ["user_id", "agent_id"], unique=False) + op.alter_column("messages", "created_at", existing_type=postgresql.TIMESTAMP(timezone=True), nullable=True) + op.alter_column("messages", "tool_calls", existing_type=postgresql.JSON(astext_type=sa.Text()), nullable=True) + op.drop_column("messages", "organization_id") + op.drop_column("messages", "_last_updated_by_id") + op.drop_column("messages", "_created_by_id") + op.drop_column("messages", "is_deleted") + op.drop_column("messages", "updated_at") + # ### end Alembic commands ### diff --git a/alembic/versions/9a505cc7eca9_create_a_baseline_migrations.py b/alembic/versions/9a505cc7eca9_create_a_baseline_migrations.py index 765e6d7382..479ca223e0 100644 --- a/alembic/versions/9a505cc7eca9_create_a_baseline_migrations.py +++ b/alembic/versions/9a505cc7eca9_create_a_baseline_migrations.py @@ -97,7 +97,7 @@ def upgrade() -> None: sa.Column("text", sa.String(), nullable=True), sa.Column("model", sa.String(), nullable=True), sa.Column("name", sa.String(), nullable=True), - sa.Column("tool_calls", letta.metadata.ToolCallColumn(), nullable=True), + sa.Column("tool_calls", letta.orm.message.ToolCallColumn(), nullable=True), sa.Column("tool_call_id", sa.String(), nullable=True), sa.Column("created_at", sa.DateTime(timezone=True), nullable=True), sa.PrimaryKeyConstraint("id"), diff --git a/letta/agent.py b/letta/agent.py index 6aea282964..3e619ea5bd 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -19,6 +19,7 @@ MESSAGE_SUMMARY_TRUNC_KEEP_N_LAST, MESSAGE_SUMMARY_TRUNC_TOKEN_FRAC, MESSAGE_SUMMARY_WARNING_FRAC, + O1_BASE_TOOLS, REQ_HEARTBEAT_MESSAGE, ) from letta.errors import LLMError @@ -27,10 +28,9 @@ from letta.llm_api.helpers import is_context_overflow_error from letta.llm_api.llm_api_tools import create from letta.local_llm.utils import num_tokens_from_functions, num_tokens_from_messages -from letta.memory import ArchivalMemory, RecallMemory, summarize_messages +from letta.memory import ArchivalMemory, EmbeddingArchivalMemory, summarize_messages from letta.metadata import MetadataStore from letta.orm import User -from letta.persistence_manager import LocalStateManager from letta.schemas.agent import AgentState, AgentStepResponse from letta.schemas.block import BlockUpdate from letta.schemas.embedding_config import EmbeddingConfig @@ -49,7 +49,9 @@ from letta.schemas.tool import Tool from letta.schemas.tool_rule import TerminalToolRule from letta.schemas.usage import LettaUsageStatistics +from letta.schemas.user import User as PydanticUser from letta.services.block_manager import BlockManager +from letta.services.message_manager import MessageManager from letta.services.source_manager import SourceManager from letta.services.tool_execution_sandbox import ToolExecutionSandbox from letta.services.user_manager import UserManager @@ -80,9 +82,11 @@ def compile_memory_metadata_block( + actor: PydanticUser, + agent_id: str, memory_edit_timestamp: datetime.datetime, archival_memory: Optional[ArchivalMemory] = None, - recall_memory: Optional[RecallMemory] = None, + message_manager: Optional[MessageManager] = None, ) -> str: # Put the timestamp in the local timezone (mimicking get_local_time()) timestamp_str = memory_edit_timestamp.astimezone().strftime("%Y-%m-%d %I:%M:%S %p %Z%z").strip() @@ -91,7 +95,7 @@ def compile_memory_metadata_block( memory_metadata_block = "\n".join( [ f"### Memory [last modified: {timestamp_str}]", - f"{recall_memory.count() if recall_memory else 0} previous messages between you and the user are stored in recall memory (use functions to access them)", + f"{message_manager.size(actor=actor, agent_id=agent_id) if message_manager else 0} previous messages between you and the user are stored in recall memory (use functions to access them)", f"{archival_memory.count() if archival_memory else 0} total memories you created are stored in archival memory (use functions to access them)", "\nCore memory shown below (limited in size, additional information stored in archival / recall memory):", ] @@ -101,10 +105,12 @@ def compile_memory_metadata_block( def compile_system_message( system_prompt: str, + agent_id: str, in_context_memory: Memory, in_context_memory_last_edit: datetime.datetime, # TODO move this inside of BaseMemory? + actor: PydanticUser, archival_memory: Optional[ArchivalMemory] = None, - recall_memory: Optional[RecallMemory] = None, + message_manager: Optional[MessageManager] = None, user_defined_variables: Optional[dict] = None, append_icm_if_missing: bool = True, template_format: Literal["f-string", "mustache", "jinja2"] = "f-string", @@ -129,9 +135,11 @@ def compile_system_message( else: # TODO should this all put into the memory.__repr__ function? memory_metadata_string = compile_memory_metadata_block( + actor=actor, + agent_id=agent_id, memory_edit_timestamp=in_context_memory_last_edit, archival_memory=archival_memory, - recall_memory=recall_memory, + message_manager=message_manager, ) full_memory_string = memory_metadata_string + "\n" + in_context_memory.compile() @@ -164,9 +172,11 @@ def compile_system_message( def initialize_message_sequence( model: str, system: str, + agent_id: str, memory: Memory, + actor: PydanticUser, archival_memory: Optional[ArchivalMemory] = None, - recall_memory: Optional[RecallMemory] = None, + message_manager: Optional[MessageManager] = None, memory_edit_timestamp: Optional[datetime.datetime] = None, include_initial_boot_message: bool = True, ) -> List[dict]: @@ -177,11 +187,13 @@ def initialize_message_sequence( # system, memory, memory_edit_timestamp, archival_memory=archival_memory, recall_memory=recall_memory # ) full_system_message = compile_system_message( + agent_id=agent_id, system_prompt=system, in_context_memory=memory, in_context_memory_last_edit=memory_edit_timestamp, + actor=actor, archival_memory=archival_memory, - recall_memory=recall_memory, + message_manager=message_manager, user_defined_variables=None, append_icm_if_missing=True, ) @@ -282,7 +294,8 @@ def __init__( self.interface = interface # Create the persistence manager object based on the AgentState info - self.persistence_manager = LocalStateManager(agent_state=self.agent_state) + self.archival_memory = EmbeddingArchivalMemory(agent_state) + self.message_manager = MessageManager() # State needed for heartbeat pausing self.pause_heartbeats_start = None @@ -309,9 +322,11 @@ def __init__( init_messages = initialize_message_sequence( model=self.model, system=self.agent_state.system, + agent_id=self.agent_state.id, memory=self.agent_state.memory, + actor=self.user, archival_memory=None, - recall_memory=None, + message_manager=None, memory_edit_timestamp=get_utc_time(), include_initial_boot_message=True, ) @@ -333,8 +348,10 @@ def __init__( model=self.model, system=self.agent_state.system, memory=self.agent_state.memory, + agent_id=self.agent_state.id, + actor=self.user, archival_memory=None, - recall_memory=None, + message_manager=None, memory_edit_timestamp=get_utc_time(), include_initial_boot_message=True, ) @@ -356,7 +373,6 @@ def __init__( # Put the messages inside the message buffer self.messages_total = 0 - # self._append_to_messages(added_messages=[cast(Message, msg) for msg in init_messages_objs if msg is not None]) self._append_to_messages(added_messages=init_messages_objs) self._validate_message_buffer_is_utc() @@ -413,7 +429,10 @@ def execute_tool_and_persist_state(self, function_name, function_to_call, functi # TODO: need to have an AgentState object that actually has full access to the block data # this is because the sandbox tools need to be able to access block.value to edit this data try: - if function_name in BASE_TOOLS: + # TODO: This is NO BUENO + # TODO: Matching purely by names is extremely problematic, users can create tools with these names and run them in the agent loop + # TODO: We will have probably have to match the function strings exactly for safety + if function_name in BASE_TOOLS or function_name in O1_BASE_TOOLS: # base tools are allowed to access the `Agent` object and run on the database function_args["self"] = self # need to attach self to arg since it's dynamically linked function_response = function_to_call(**function_args) @@ -474,7 +493,7 @@ def _load_messages_from_recall(self, message_ids: List[str]) -> List[Message]: # Pull the message objects from the database message_objs = [] for msg_id in message_ids: - msg_obj = self.persistence_manager.recall_memory.storage.get(msg_id) + msg_obj = self.message_manager.get_message_by_id(msg_id, actor=self.user) if msg_obj: if isinstance(msg_obj, Message): message_objs.append(msg_obj) @@ -522,16 +541,13 @@ def refresh_message_buffer(self): def _trim_messages(self, num): """Trim messages from the front, not including the system message""" - self.persistence_manager.trim_messages(num) - new_messages = [self._messages[0]] + self._messages[num:] self._messages = new_messages def _prepend_to_messages(self, added_messages: List[Message]): """Wrapper around self.messages.prepend to allow additional calls to a state/persistence manager""" assert all([isinstance(msg, Message) for msg in added_messages]) - - self.persistence_manager.prepend_to_messages(added_messages) + self.message_manager.create_many_messages(added_messages, actor=self.user) new_messages = [self._messages[0]] + added_messages + self._messages[1:] # prepend (no system) self._messages = new_messages @@ -540,8 +556,7 @@ def _prepend_to_messages(self, added_messages: List[Message]): def _append_to_messages(self, added_messages: List[Message]): """Wrapper around self.messages.append to allow additional calls to a state/persistence manager""" assert all([isinstance(msg, Message) for msg in added_messages]) - - self.persistence_manager.append_to_messages(added_messages) + self.message_manager.create_many_messages(added_messages, actor=self.user) # strip extra metadata if it exists # for msg in added_messages: @@ -885,7 +900,6 @@ def step( messages=next_input_message, **kwargs, ) - step_response.messages heartbeat_request = step_response.heartbeat_request function_failed = step_response.function_failed token_warning = step_response.in_context_memory_warning @@ -1247,7 +1261,7 @@ def _swap_system_message_in_buffer(self, new_system_message: str): assert new_system_message_obj.role == "system", new_system_message_obj assert self._messages[0].role == "system", self._messages - self.persistence_manager.swap_system_message(new_system_message_obj) + self.message_manager.create_message(new_system_message_obj, actor=self.user) new_messages = [new_system_message_obj] + self._messages[1:] # swap index 0 (system) self._messages = new_messages @@ -1280,11 +1294,13 @@ def rebuild_system_prompt(self, force=False, update_timestamp=True): # update memory (TODO: potentially update recall/archival stats seperately) new_system_message_str = compile_system_message( + agent_id=self.agent_state.id, system_prompt=self.agent_state.system, in_context_memory=self.agent_state.memory, in_context_memory_last_edit=memory_edit_timestamp, - archival_memory=self.persistence_manager.archival_memory, - recall_memory=self.persistence_manager.recall_memory, + actor=self.user, + archival_memory=self.archival_memory, + message_manager=self.message_manager, user_defined_variables=None, append_icm_if_missing=True, ) @@ -1370,20 +1386,20 @@ def attach_source(self, source_id: str, source_connector: StorageConnector, ms: # passage.id = create_uuid_from_string(f"{source_id}_{str(passage.agent_id)}_{passage.text}") # insert into agent archival memory - self.persistence_manager.archival_memory.storage.insert_many(passages) + self.archival_memory.storage.insert_many(passages) all_passages += passages assert size == len(all_passages), f"Expected {size} passages, but only got {len(all_passages)}" # save destination storage - self.persistence_manager.archival_memory.storage.save() + self.archival_memory.storage.save() # attach to agent source = SourceManager().get_source_by_id(source_id=source_id, actor=user) assert source is not None, f"Source {source_id} not found in metadata store" ms.attach_source(agent_id=self.agent_state.id, source_id=source_id, user_id=self.agent_state.user_id) - total_agent_passages = self.persistence_manager.archival_memory.storage.size() + total_agent_passages = self.archival_memory.storage.size() printd( f"Attached data source {source.name} to agent {self.agent_state.name}, consisting of {len(all_passages)}. Agent now has {total_agent_passages} embeddings in archival memory.", @@ -1392,7 +1408,7 @@ def attach_source(self, source_id: str, source_connector: StorageConnector, ms: def update_message(self, request: UpdateMessage) -> Message: """Update the details of a message associated with an agent""" - message = self.persistence_manager.recall_memory.storage.get(id=request.id) + message = self.message_manager.get_message_by_id(message_id=request.id, actor=self.user) if message is None: raise ValueError(f"Message with id {request.id} not found") assert isinstance(message, Message), f"Message is not a Message object: {type(message)}" @@ -1413,10 +1429,10 @@ def update_message(self, request: UpdateMessage) -> Message: message.tool_call_id = request.tool_call_id # Save the updated message - self.persistence_manager.recall_memory.storage.update(record=message) + self.message_manager.update_message_by_id(message_id=message.id, message=message, actor=self.user) # Return the updated message - updated_message = self.persistence_manager.recall_memory.storage.get(id=message.id) + updated_message = self.message_manager.get_message_by_id(message_id=message.id, actor=self.user) if updated_message is None: raise ValueError(f"Error persisting message - message with id {request.id} not found") return updated_message @@ -1496,7 +1512,7 @@ def pop_message(self, count: int = 1) -> List[Message]: deleted_message = self._messages.pop() # then also remove it from recall storage try: - self.persistence_manager.recall_memory.storage.delete(filters={"id": deleted_message.id}) + self.message_manager.delete_message_by_id(deleted_message.id, actor=self.user) popped_messages.append(deleted_message) except Exception as e: warnings.warn(f"Error deleting message {deleted_message.id} from recall memory: {e}") @@ -1522,7 +1538,6 @@ def pop_until_user(self) -> List[Message]: def retry_message(self) -> List[Message]: """Retry / regenerate the last message""" - self.pop_until_user() user_message = self.pop_message(count=1)[0] assert user_message.text is not None, "User message text is None" @@ -1569,12 +1584,14 @@ def get_context_window(self) -> ContextWindowOverview: num_tokens_from_messages(messages=messages_openai_format[1:], model=self.model) if len(messages_openai_format) > 1 else 0 ) - num_archival_memory = self.persistence_manager.archival_memory.storage.size() - num_recall_memory = self.persistence_manager.recall_memory.storage.size() + num_archival_memory = self.archival_memory.storage.size() + message_manager_size = self.message_manager.size(actor=self.user, agent_id=self.agent_state.id) external_memory_summary = compile_memory_metadata_block( + actor=self.user, + agent_id=self.agent_state.id, memory_edit_timestamp=get_utc_time(), # dummy timestamp - archival_memory=self.persistence_manager.archival_memory, - recall_memory=self.persistence_manager.recall_memory, + archival_memory=self.archival_memory, + message_manager=self.message_manager, ) num_tokens_external_memory_summary = count_tokens(external_memory_summary) @@ -1600,7 +1617,7 @@ def get_context_window(self) -> ContextWindowOverview: # context window breakdown (in messages) num_messages=len(self._messages), num_archival_memory=num_archival_memory, - num_recall_memory=num_recall_memory, + num_recall_memory=message_manager_size, num_tokens_external_memory_summary=num_tokens_external_memory_summary, # top-level information context_window_size_max=self.agent_state.llm_config.context_window, diff --git a/letta/agent_store/db.py b/letta/agent_store/db.py index 5b676dc072..56d35edc74 100644 --- a/letta/agent_store/db.py +++ b/letta/agent_store/db.py @@ -27,13 +27,11 @@ from letta.agent_store.storage import StorageConnector, TableType from letta.config import LettaConfig from letta.constants import MAX_EMBEDDING_DIM -from letta.metadata import EmbeddingConfigColumn, ToolCallColumn +from letta.metadata import EmbeddingConfigColumn from letta.orm.base import Base from letta.orm.file import FileMetadata as FileMetadataModel # from letta.schemas.message import Message, Passage, Record, RecordType, ToolCall -from letta.schemas.message import Message -from letta.schemas.openai.chat_completions import ToolCall from letta.schemas.passage import Passage from letta.settings import settings @@ -69,69 +67,6 @@ def process_result_value(self, value, dialect): return np.frombuffer(value, dtype=np.float32) -class MessageModel(Base): - """Defines data model for storing Message objects""" - - __tablename__ = "messages" - __table_args__ = {"extend_existing": True} - - # Assuming message_id is the primary key - id = Column(String, primary_key=True) - user_id = Column(String, nullable=False) - agent_id = Column(String, nullable=False) - - # openai info - role = Column(String, nullable=False) - text = Column(String) # optional: can be null if function call - model = Column(String) # optional: can be null if LLM backend doesn't require specifying - name = Column(String) # optional: multi-agent only - - # tool call request info - # if role == "assistant", this MAY be specified - # if role != "assistant", this must be null - # TODO align with OpenAI spec of multiple tool calls - # tool_calls = Column(ToolCallColumn) - tool_calls = Column(ToolCallColumn) - - # tool call response info - # if role == "tool", then this must be specified - # if role != "tool", this must be null - tool_call_id = Column(String) - - # Add a datetime column, with default value as the current time - created_at = Column(DateTime(timezone=True)) - Index("message_idx_user", user_id, agent_id), - - def __repr__(self): - return f"" - - def to_record(self): - # calls = ( - # [ToolCall(id=tool_call["id"], function=ToolCallFunction(**tool_call["function"])) for tool_call in self.tool_calls] - # if self.tool_calls - # else None - # ) - # if calls: - # assert isinstance(calls[0], ToolCall) - if self.tool_calls and len(self.tool_calls) > 0: - assert isinstance(self.tool_calls[0], ToolCall), type(self.tool_calls[0]) - for tool in self.tool_calls: - assert isinstance(tool, ToolCall), type(tool) - return Message( - user_id=self.user_id, - agent_id=self.agent_id, - role=self.role, - name=self.name, - text=self.text, - model=self.model, - # tool_calls=[ToolCall(id=tool_call["id"], function=ToolCallFunction(**tool_call["function"])) for tool_call in self.tool_calls] if self.tool_calls else None, - tool_calls=self.tool_calls, - tool_call_id=self.tool_call_id, - created_at=self.created_at, - id=self.id, - ) - - class PassageModel(Base): """Defines data model for storing Passages (consisting of text, embedding)""" @@ -367,11 +302,6 @@ def __init__(self, table_type: str, config: LettaConfig, user_id, agent_id=None) self.db_model = PassageModel if self.config.archival_storage_uri is None: raise ValueError(f"Must specify archival_storage_uri in config {self.config.config_path}") - elif table_type == TableType.RECALL_MEMORY: - self.uri = self.config.recall_storage_uri - self.db_model = MessageModel - if self.config.recall_storage_uri is None: - raise ValueError(f"Must specify recall_storage_uri in config {self.config.config_path}") elif table_type == TableType.FILES: self.uri = self.config.metadata_storage_uri self.db_model = FileMetadataModel @@ -490,12 +420,6 @@ def __init__(self, table_type: str, config: LettaConfig, user_id, agent_id=None) # get storage URI if table_type == TableType.ARCHIVAL_MEMORY or table_type == TableType.PASSAGES: raise ValueError(f"Table type {table_type} not implemented") - elif table_type == TableType.RECALL_MEMORY: - # TODO: eventually implement URI option - self.path = self.config.recall_storage_path - if self.path is None: - raise ValueError(f"Must specify recall_storage_path in config.") - self.db_model = MessageModel elif table_type == TableType.FILES: self.path = self.config.metadata_storage_path if self.path is None: diff --git a/letta/agent_store/lancedb.py b/letta/agent_store/lancedb.py deleted file mode 100644 index b4a56b57ea..0000000000 --- a/letta/agent_store/lancedb.py +++ /dev/null @@ -1,177 +0,0 @@ -# type: ignore - -import uuid -from datetime import datetime -from typing import Dict, Iterator, List, Optional - -from lancedb.pydantic import LanceModel, Vector - -from letta.agent_store.storage import StorageConnector, TableType -from letta.config import AgentConfig, LettaConfig -from letta.schemas.message import Message, Passage, Record - -""" Initial implementation - not complete """ - - -def get_db_model(table_name: str, table_type: TableType): - config = LettaConfig.load() - - if table_type == TableType.ARCHIVAL_MEMORY or table_type == TableType.PASSAGES: - # create schema for archival memory - class PassageModel(LanceModel): - """Defines data model for storing Passages (consisting of text, embedding)""" - - id: uuid.UUID - user_id: str - text: str - file_id: str - agent_id: str - data_source: str - embedding: Vector(config.default_embedding_config.embedding_dim) - metadata_: Dict - - def __repr__(self): - return f" Optional[str]: Returns: Optional[str]: None is always returned as this function does not produce a response. """ - self.persistence_manager.archival_memory.insert(content) + self.archival_memory.insert(content) return None @@ -163,7 +191,7 @@ def archival_memory_search(self: "Agent", query: str, page: Optional[int] = 0) - except: raise ValueError(f"'page' argument must be an integer") count = RETRIEVAL_QUERY_DEFAULT_PAGE_SIZE - results, total = self.persistence_manager.archival_memory.search(query, count=count, start=page * count) + results, total = self.archival_memory.search(query, count=count, start=page * count) num_pages = math.ceil(total / count) - 1 # 0 index if len(results) == 0: results_str = f"No results found." diff --git a/letta/main.py b/letta/main.py index 88d20e08b0..1f8e19efa9 100644 --- a/letta/main.py +++ b/letta/main.py @@ -190,8 +190,8 @@ def run_agent_loop( elif user_input.lower() == "/memory": print(f"\nDumping memory contents:\n") print(f"{letta_agent.agent_state.memory.compile()}") - print(f"{letta_agent.persistence_manager.archival_memory.compile()}") - print(f"{letta_agent.persistence_manager.recall_memory.compile()}") + print(f"{letta_agent.archival_memory.compile()}") + print(f"{letta_agent.recall_memory.compile()}") continue elif user_input.lower() == "/model": diff --git a/letta/memory.py b/letta/memory.py index a873226e5d..8325de316f 100644 --- a/letta/memory.py +++ b/letta/memory.py @@ -67,14 +67,12 @@ def summarize_messages( + message_sequence_to_summarize[cutoff:] ) - dummy_user_id = agent_state.user_id + agent_state.user_id dummy_agent_id = agent_state.id message_sequence = [] - message_sequence.append(Message(user_id=dummy_user_id, agent_id=dummy_agent_id, role=MessageRole.system, text=summary_prompt)) - message_sequence.append( - Message(user_id=dummy_user_id, agent_id=dummy_agent_id, role=MessageRole.assistant, text=MESSAGE_SUMMARY_REQUEST_ACK) - ) - message_sequence.append(Message(user_id=dummy_user_id, agent_id=dummy_agent_id, role=MessageRole.user, text=summary_input)) + message_sequence.append(Message(agent_id=dummy_agent_id, role=MessageRole.system, text=summary_prompt)) + message_sequence.append(Message(agent_id=dummy_agent_id, role=MessageRole.assistant, text=MESSAGE_SUMMARY_REQUEST_ACK)) + message_sequence.append(Message(agent_id=dummy_agent_id, role=MessageRole.user, text=summary_input)) # TODO: We need to eventually have a separate LLM config for the summarizer LLM llm_config_no_inner_thoughts = agent_state.llm_config.model_copy(deep=True) @@ -252,82 +250,6 @@ def date_search(self, start_date, end_date, count=None, start=None): return matches, len(matches) -class BaseRecallMemory(RecallMemory): - """Recall memory based on base functions implemented by storage connectors""" - - def __init__(self, agent_state, restrict_search_to_summaries=False): - # If true, the pool of messages that can be queried are the automated summaries only - # (generated when the conversation window needs to be shortened) - self.restrict_search_to_summaries = restrict_search_to_summaries - from letta.agent_store.storage import StorageConnector - - self.agent_state = agent_state - - # create embedding model - self.embed_model = embedding_model(agent_state.embedding_config) - self.embedding_chunk_size = agent_state.embedding_config.embedding_chunk_size - - # create storage backend - self.storage = StorageConnector.get_recall_storage_connector(user_id=agent_state.user_id, agent_id=agent_state.id) - # TODO: have some mechanism for cleanup otherwise will lead to OOM - self.cache = {} - - def get_all(self, start=0, count=None): - start = 0 if start is None else int(start) - count = 0 if count is None else int(count) - results = self.storage.get_all(start, count) - results_json = [message.to_openai_dict() for message in results] - return results_json, len(results) - - def text_search(self, query_string, count=None, start=None): - start = 0 if start is None else int(start) - count = 0 if count is None else int(count) - results = self.storage.query_text(query_string, count, start) - results_json = [message.to_openai_dict_search_results() for message in results] - return results_json, len(results) - - def date_search(self, start_date, end_date, count=None, start=None): - start = 0 if start is None else int(start) - count = 0 if count is None else int(count) - results = self.storage.query_date(start_date, end_date, count, start) - results_json = [message.to_openai_dict_search_results() for message in results] - return results_json, len(results) - - def compile(self) -> str: - total = self.storage.size() - system_count = self.storage.size(filters={"role": "system"}) - user_count = self.storage.size(filters={"role": "user"}) - assistant_count = self.storage.size(filters={"role": "assistant"}) - function_count = self.storage.size(filters={"role": "function"}) - other_count = total - (system_count + user_count + assistant_count + function_count) - - memory_str = ( - f"Statistics:" - + f"\n{total} total messages" - + f"\n{system_count} system" - + f"\n{user_count} user" - + f"\n{assistant_count} assistant" - + f"\n{function_count} function" - + f"\n{other_count} other" - ) - return f"\n### RECALL MEMORY ###" + f"\n{memory_str}" - - def insert(self, message: Message): - self.storage.insert(message) - - def insert_many(self, messages: List[Message]): - self.storage.insert_many(messages) - - def save(self): - self.storage.save() - - def __len__(self): - return self.storage.size() - - def count(self) -> int: - return len(self) - - class EmbeddingArchivalMemory(ArchivalMemory): """Archival memory with embedding based search""" diff --git a/letta/metadata.py b/letta/metadata.py index 210f091c15..56d852eaca 100644 --- a/letta/metadata.py +++ b/letta/metadata.py @@ -14,7 +14,6 @@ from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.enums import ToolRuleType from letta.schemas.llm_config import LLMConfig -from letta.schemas.openai.chat_completions import ToolCall, ToolCallFunction from letta.schemas.tool_rule import ChildToolRule, InitToolRule, TerminalToolRule from letta.schemas.user import User from letta.services.per_agent_lock_manager import PerAgentLockManager @@ -66,40 +65,6 @@ def process_result_value(self, value, dialect): return value -class ToolCallColumn(TypeDecorator): - - impl = JSON - cache_ok = True - - def load_dialect_impl(self, dialect): - return dialect.type_descriptor(JSON()) - - def process_bind_param(self, value, dialect): - if value: - values = [] - for v in value: - if isinstance(v, ToolCall): - values.append(v.model_dump()) - else: - values.append(v) - return values - - return value - - def process_result_value(self, value, dialect): - if value: - tools = [] - for tool_value in value: - if "function" in tool_value: - tool_call_function = ToolCallFunction(**tool_value["function"]) - del tool_value["function"] - else: - tool_call_function = None - tools.append(ToolCall(function=tool_call_function, **tool_value)) - return tools - return value - - # TODO: eventually store providers? # class Provider(Base): # __tablename__ = "providers" diff --git a/letta/o1_agent.py b/letta/o1_agent.py index a6b70b595f..cef2769d4a 100644 --- a/letta/o1_agent.py +++ b/letta/o1_agent.py @@ -20,7 +20,7 @@ def send_thinking_message(self: "Agent", message: str) -> Optional[str]: Returns: Optional[str]: None is always returned as this function does not produce a response. """ - self.interface.internal_monologue(message, msg_obj=self._messages[-1]) + self.interface.internal_monologue(message) return None @@ -34,7 +34,7 @@ def send_final_message(self: "Agent", message: str) -> Optional[str]: Returns: Optional[str]: None is always returned as this function does not produce a response. """ - self.interface.internal_monologue(message, msg_obj=self._messages[-1]) + self.interface.internal_monologue(message) return None @@ -62,10 +62,15 @@ def step( """Run Agent.inner_step in a loop, terminate when final thinking message is sent or max_thinking_steps is reached""" # assert ms is not None, "MetadataStore is required" next_input_message = messages if isinstance(messages, list) else [messages] + counter = 0 total_usage = UsageStatistics() step_count = 0 while step_count < self.max_thinking_steps: + # This is hacky but we need to do this for now + for m in next_input_message: + m.id = m._generate_id() + kwargs["ms"] = ms kwargs["first_message"] = False step_response = self.inner_step( diff --git a/letta/offline_memory_agent.py b/letta/offline_memory_agent.py index 16447c4614..b8f68ea7f2 100644 --- a/letta/offline_memory_agent.py +++ b/letta/offline_memory_agent.py @@ -18,6 +18,7 @@ def trigger_rethink_memory(agent_state: "AgentState", message: Optional[str]) -> """ from letta import create_client + client = create_client() agents = client.list_agents() for agent in agents: @@ -149,6 +150,11 @@ def step( step_count = 0 while counter < self.max_memory_rethinks: + # This is hacky but we need to do this for now + # TODO: REMOVE THIS + for m in next_input_message: + m.id = m._generate_id() + kwargs["ms"] = ms kwargs["first_message"] = False step_response = self.inner_step( diff --git a/letta/orm/__init__.py b/letta/orm/__init__.py index 8d47ba4591..85b4b7eb3c 100644 --- a/letta/orm/__init__.py +++ b/letta/orm/__init__.py @@ -1,8 +1,10 @@ +from letta.orm.agents_tags import AgentsTags from letta.orm.base import Base from letta.orm.block import Block from letta.orm.blocks_agents import BlocksAgents from letta.orm.file import FileMetadata from letta.orm.job import Job +from letta.orm.message import Message from letta.orm.organization import Organization from letta.orm.sandbox_config import SandboxConfig, SandboxEnvironmentVariable from letta.orm.source import Source diff --git a/letta/orm/file.py b/letta/orm/file.py index aec468819e..187ebbd88f 100644 --- a/letta/orm/file.py +++ b/letta/orm/file.py @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING, Optional +from typing import TYPE_CHECKING, Optional, List from sqlalchemy import Integer, String from sqlalchemy.orm import Mapped, mapped_column, relationship diff --git a/letta/orm/message.py b/letta/orm/message.py new file mode 100644 index 0000000000..3f0b56c791 --- /dev/null +++ b/letta/orm/message.py @@ -0,0 +1,66 @@ +from datetime import datetime +from typing import Optional + +from sqlalchemy import JSON, DateTime, TypeDecorator +from sqlalchemy.orm import Mapped, mapped_column, relationship + +from letta.orm.mixins import AgentMixin, OrganizationMixin +from letta.orm.sqlalchemy_base import SqlalchemyBase +from letta.schemas.message import Message as PydanticMessage +from letta.schemas.openai.chat_completions import ToolCall, ToolCallFunction + + +class ToolCallColumn(TypeDecorator): + + impl = JSON + cache_ok = True + + def load_dialect_impl(self, dialect): + return dialect.type_descriptor(JSON()) + + def process_bind_param(self, value, dialect): + if value: + values = [] + for v in value: + if isinstance(v, ToolCall): + values.append(v.model_dump()) + else: + values.append(v) + return values + + return value + + def process_result_value(self, value, dialect): + if value: + tools = [] + for tool_value in value: + if "function" in tool_value: + tool_call_function = ToolCallFunction(**tool_value["function"]) + del tool_value["function"] + else: + tool_call_function = None + tools.append(ToolCall(function=tool_call_function, **tool_value)) + return tools + return value + + +class Message(SqlalchemyBase, OrganizationMixin, AgentMixin): + """Defines data model for storing Message objects""" + + __tablename__ = "messages" + __table_args__ = {"extend_existing": True} + __pydantic_model__ = PydanticMessage + + id: Mapped[str] = mapped_column(primary_key=True, doc="Unique message identifier") + role: Mapped[str] = mapped_column(doc="Message role (user/assistant/system/tool)") + text: Mapped[Optional[str]] = mapped_column(nullable=True, doc="Message content") + model: Mapped[Optional[str]] = mapped_column(nullable=True, doc="LLM model used") + name: Mapped[Optional[str]] = mapped_column(nullable=True, doc="Name for multi-agent scenarios") + tool_calls: Mapped[ToolCall] = mapped_column(ToolCallColumn, doc="Tool call information") + tool_call_id: Mapped[Optional[str]] = mapped_column(nullable=True, doc="ID of the tool call") + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=datetime.utcnow) + + # Relationships + # TODO: Add in after Agent ORM is created + # agent: Mapped["Agent"] = relationship("Agent", back_populates="messages", lazy="selectin") + organization: Mapped["Organization"] = relationship("Organization", back_populates="messages", lazy="selectin") diff --git a/letta/orm/mixins.py b/letta/orm/mixins.py index 0d0b576f5b..355a8b2ce4 100644 --- a/letta/orm/mixins.py +++ b/letta/orm/mixins.py @@ -31,6 +31,22 @@ class UserMixin(Base): user_id: Mapped[str] = mapped_column(String, ForeignKey("users.id")) +class AgentMixin(Base): + """Mixin for models that belong to an agent.""" + + __abstract__ = True + + agent_id: Mapped[str] = mapped_column(String, ForeignKey("agents.id")) + + +class FileMixin(Base): + """Mixin for models that belong to a file.""" + + __abstract__ = True + + file_id: Mapped[str] = mapped_column(String, ForeignKey("files.id")) + + class SourceMixin(Base): """Mixin for models (e.g. file) that belong to a source.""" diff --git a/letta/orm/organization.py b/letta/orm/organization.py index 0cd32f9891..4e5b6d12cb 100644 --- a/letta/orm/organization.py +++ b/letta/orm/organization.py @@ -33,6 +33,7 @@ class Organization(SqlalchemyBase): sandbox_environment_variables: Mapped[List["SandboxEnvironmentVariable"]] = relationship( "SandboxEnvironmentVariable", back_populates="organization", cascade="all, delete-orphan" ) + messages: Mapped[List["Message"]] = relationship("Message", back_populates="organization", cascade="all, delete-orphan") # TODO: Map these relationships later when we actually make these models # below is just a suggestion diff --git a/letta/orm/sqlalchemy_base.py b/letta/orm/sqlalchemy_base.py index c968fce1b7..2fd6394724 100644 --- a/letta/orm/sqlalchemy_base.py +++ b/letta/orm/sqlalchemy_base.py @@ -1,8 +1,10 @@ +from datetime import datetime +from enum import Enum from typing import TYPE_CHECKING, List, Literal, Optional, Type -from sqlalchemy import String, select +from sqlalchemy import String, func, select from sqlalchemy.exc import DBAPIError -from sqlalchemy.orm import Mapped, mapped_column +from sqlalchemy.orm import Mapped, Session, mapped_column from letta.log import get_logger from letta.orm.base import Base, CommonSqlalchemyMetaMixins @@ -20,6 +22,11 @@ logger = get_logger(__name__) +class AccessType(str, Enum): + ORGANIZATION = "organization" + USER = "user" + + class SqlalchemyBase(CommonSqlalchemyMetaMixins, Base): __abstract__ = True @@ -28,46 +35,68 @@ class SqlalchemyBase(CommonSqlalchemyMetaMixins, Base): id: Mapped[str] = mapped_column(String, primary_key=True) @classmethod - def list( - cls, *, db_session: "Session", cursor: Optional[str] = None, limit: Optional[int] = 50, **kwargs - ) -> List[Type["SqlalchemyBase"]]: - """ - List records with optional cursor (for pagination), limit, and automatic filtering. + def get(cls, *, db_session: Session, id: str) -> Optional["SqlalchemyBase"]: + """Get a record by ID. Args: - db_session: The database session to use. - cursor: Optional ID to start pagination from. - limit: Maximum number of records to return. - **kwargs: Filters passed as equality conditions or iterable for IN filtering. + db_session: SQLAlchemy session + id: Record ID to retrieve Returns: - A list of model instances matching the filters. + Optional[SqlalchemyBase]: The record if found, None otherwise """ - logger.debug(f"Listing {cls.__name__} with filters {kwargs}") + try: + return db_session.query(cls).filter(cls.id == id).first() + except DBAPIError: + return None + + @classmethod + def list( + cls, + *, + db_session: "Session", + cursor: Optional[str] = None, + start_date: Optional[datetime] = None, + end_date: Optional[datetime] = None, + limit: Optional[int] = 50, + query_text: Optional[str] = None, + **kwargs, + ) -> List[Type["SqlalchemyBase"]]: + """List records with advanced filtering and pagination options.""" + if start_date and end_date and start_date > end_date: + raise ValueError("start_date must be earlier than or equal to end_date") + + logger.debug(f"Listing {cls.__name__} with kwarg filters {kwargs}") with db_session as session: - # Start with a base query query = select(cls) # Apply filtering logic for key, value in kwargs.items(): column = getattr(cls, key) - if isinstance(value, (list, tuple, set)): # Check for iterables + if isinstance(value, (list, tuple, set)): query = query.where(column.in_(value)) - else: # Single value for equality filtering + else: query = query.where(column == value) - # Apply cursor for pagination + # Date range filtering + if start_date: + query = query.filter(cls.created_at >= start_date) + if end_date: + query = query.filter(cls.created_at <= end_date) + + # Cursor-based pagination if cursor: query = query.where(cls.id > cursor) - # Handle soft deletes if the class has the 'is_deleted' attribute + # Apply text search + if query_text: + query = query.filter(func.lower(cls.text).contains(func.lower(query_text))) + + # Handle ordering and soft deletes if hasattr(cls, "is_deleted"): query = query.where(cls.is_deleted == False) - - # Add ordering and limit query = query.order_by(cls.id).limit(limit) - # Execute the query and return results as model instances return list(session.execute(query).scalars()) @classmethod @@ -77,6 +106,7 @@ def read( identifier: Optional[str] = None, actor: Optional["User"] = None, access: Optional[List[Literal["read", "write", "admin"]]] = ["read"], + access_type: AccessType = AccessType.ORGANIZATION, **kwargs, ) -> Type["SqlalchemyBase"]: """The primary accessor for an ORM record. @@ -108,7 +138,7 @@ def read( query_conditions.append(", ".join(f"{key}='{value}'" for key, value in kwargs.items())) if actor: - query = cls.apply_access_predicate(query, actor, access) + query = cls.apply_access_predicate(query, actor, access, access_type) query_conditions.append(f"access level in {access} for actor='{actor}'") if hasattr(cls, "is_deleted"): @@ -170,12 +200,66 @@ def update(self, db_session: "Session", actor: Optional["User"] = None) -> Type[ session.refresh(self) return self + @classmethod + def size( + cls, + *, + db_session: "Session", + actor: Optional["User"] = None, + access: Optional[List[Literal["read", "write", "admin"]]] = ["read"], + access_type: AccessType = AccessType.ORGANIZATION, + **kwargs, + ) -> int: + """ + Get the count of rows that match the provided filters. + + Args: + db_session: SQLAlchemy session + **kwargs: Filters to apply to the query (e.g., column_name=value) + + Returns: + int: The count of rows that match the filters + + Raises: + DBAPIError: If a database error occurs + """ + logger.debug(f"Calculating size for {cls.__name__} with filters {kwargs}") + + with db_session as session: + query = select(func.count()).select_from(cls) + + if actor: + query = cls.apply_access_predicate(query, actor, access, access_type) + + # Apply filtering logic based on kwargs + for key, value in kwargs.items(): + if value: + column = getattr(cls, key, None) + if not column: + raise AttributeError(f"{cls.__name__} has no attribute '{key}'") + if isinstance(value, (list, tuple, set)): # Check for iterables + query = query.where(column.in_(value)) + else: # Single value for equality filtering + query = query.where(column == value) + + # Handle soft deletes if the class has the 'is_deleted' attribute + if hasattr(cls, "is_deleted"): + query = query.where(cls.is_deleted == False) + + try: + count = session.execute(query).scalar() + return count if count else 0 + except DBAPIError as e: + logger.exception(f"Failed to calculate size for {cls.__name__}") + raise e + @classmethod def apply_access_predicate( cls, query: "Select", actor: "User", access: List[Literal["read", "write", "admin"]], + access_type: AccessType = AccessType.ORGANIZATION, ) -> "Select": """applies a WHERE clause restricting results to the given actor and access level Args: @@ -189,10 +273,18 @@ def apply_access_predicate( the sqlalchemy select statement restricted to the given access. """ del access # entrypoint for row-level permissions. Defaults to "same org as the actor, all permissions" at the moment - org_id = getattr(actor, "organization_id", None) - if not org_id: - raise ValueError(f"object {actor} has no organization accessor") - return query.where(cls.organization_id == org_id, cls.is_deleted == False) + if access_type == AccessType.ORGANIZATION: + org_id = getattr(actor, "organization_id", None) + if not org_id: + raise ValueError(f"object {actor} has no organization accessor") + return query.where(cls.organization_id == org_id, cls.is_deleted == False) + elif access_type == AccessType.USER: + user_id = getattr(actor, "id", None) + if not user_id: + raise ValueError(f"object {actor} has no user accessor") + return query.where(cls.user_id == user_id, cls.is_deleted == False) + else: + raise ValueError(f"unknown access_type: {access_type}") @classmethod def _handle_dbapi_error(cls, e: DBAPIError): diff --git a/letta/persistence_manager.py b/letta/persistence_manager.py deleted file mode 100644 index 7dd22a998f..0000000000 --- a/letta/persistence_manager.py +++ /dev/null @@ -1,149 +0,0 @@ -from abc import ABC, abstractmethod -from datetime import datetime -from typing import List - -from letta.memory import BaseRecallMemory, EmbeddingArchivalMemory -from letta.schemas.agent import AgentState -from letta.schemas.memory import Memory -from letta.schemas.message import Message -from letta.utils import printd - - -def parse_formatted_time(formatted_time: str): - # parse times returned by letta.utils.get_formatted_time() - try: - return datetime.strptime(formatted_time.strip(), "%Y-%m-%d %I:%M:%S %p %Z%z") - except: - return datetime.strptime(formatted_time.strip(), "%Y-%m-%d %I:%M:%S %p") - - -class PersistenceManager(ABC): - @abstractmethod - def trim_messages(self, num): - pass - - @abstractmethod - def prepend_to_messages(self, added_messages): - pass - - @abstractmethod - def append_to_messages(self, added_messages): - pass - - @abstractmethod - def swap_system_message(self, new_system_message): - pass - - @abstractmethod - def update_memory(self, new_memory): - pass - - -class LocalStateManager(PersistenceManager): - """In-memory state manager has nothing to manage, all agents are held in-memory""" - - recall_memory_cls = BaseRecallMemory - archival_memory_cls = EmbeddingArchivalMemory - - def __init__(self, agent_state: AgentState): - # Memory held in-state useful for debugging stateful versions - self.memory = agent_state.memory - # self.messages = [] # current in-context messages - # self.all_messages = [] # all messages seen in current session (needed if lazily synchronizing state with DB) - self.archival_memory = EmbeddingArchivalMemory(agent_state) - self.recall_memory = BaseRecallMemory(agent_state) - # self.agent_state = agent_state - - def save(self): - """Ensure storage connectors save data""" - self.archival_memory.save() - self.recall_memory.save() - - ''' - def json_to_message(self, message_json) -> Message: - """Convert agent message JSON into Message object""" - - # get message - if "message" in message_json: - message = message_json["message"] - else: - message = message_json - - # get timestamp - if "timestamp" in message_json: - timestamp = parse_formatted_time(message_json["timestamp"]) - else: - timestamp = get_local_time() - - # TODO: change this when we fully migrate to tool calls API - if "function_call" in message: - tool_calls = [ - ToolCall( - id=message["tool_call_id"], - tool_call_type="function", - function={ - "name": message["function_call"]["name"], - "arguments": message["function_call"]["arguments"], - }, - ) - ] - printd(f"Saving tool calls {[vars(tc) for tc in tool_calls]}") - else: - tool_calls = None - - # if message["role"] == "function": - # message["role"] = "tool" - - return Message( - user_id=self.agent_state.user_id, - agent_id=self.agent_state.id, - role=message["role"], - text=message["content"], - name=message["name"] if "name" in message else None, - model=self.agent_state.llm_config.model, - created_at=timestamp, - tool_calls=tool_calls, - tool_call_id=message["tool_call_id"] if "tool_call_id" in message else None, - id=message["id"] if "id" in message else None, - ) - ''' - - def trim_messages(self, num): - # printd(f"InMemoryStateManager.trim_messages") - # self.messages = [self.messages[0]] + self.messages[num:] - pass - - def prepend_to_messages(self, added_messages: List[Message]): - # first tag with timestamps - # added_messages = [{"timestamp": get_local_time(), "message": msg} for msg in added_messages] - - printd(f"{self.__class__.__name__}.prepend_to_message") - # self.messages = [self.messages[0]] + added_messages + self.messages[1:] - - # add to recall memory - self.recall_memory.insert_many([m for m in added_messages]) - - def append_to_messages(self, added_messages: List[Message]): - # first tag with timestamps - # added_messages = [{"timestamp": get_local_time(), "message": msg} for msg in added_messages] - - printd(f"{self.__class__.__name__}.append_to_messages") - # self.messages = self.messages + added_messages - - # add to recall memory - self.recall_memory.insert_many([m for m in added_messages]) - - def swap_system_message(self, new_system_message: Message): - # first tag with timestamps - # new_system_message = {"timestamp": get_local_time(), "message": new_system_message} - - printd(f"{self.__class__.__name__}.swap_system_message") - # self.messages[0] = new_system_message - - # add to recall memory - self.recall_memory.insert(new_system_message) - - def update_memory(self, new_memory: Memory): - printd(f"{self.__class__.__name__}.update_memory") - assert isinstance(new_memory, Memory), type(new_memory) - self.memory = new_memory diff --git a/letta/schemas/letta_base.py b/letta/schemas/letta_base.py index 67d8237ed6..dce2b02ded 100644 --- a/letta/schemas/letta_base.py +++ b/letta/schemas/letta_base.py @@ -33,18 +33,19 @@ class LettaBase(BaseModel): def generate_id_field(cls, prefix: Optional[str] = None) -> "Field": prefix = prefix or cls.__id_prefix__ - # TODO: generate ID from regex pattern? - def _generate_id() -> str: - return f"{prefix}-{uuid.uuid4()}" - return Field( ..., description=cls._id_description(prefix), pattern=cls._id_regex_pattern(prefix), examples=[cls._id_example(prefix)], - default_factory=_generate_id, + default_factory=cls._generate_id, ) + @classmethod + def _generate_id(cls, prefix: Optional[str] = None) -> str: + prefix = prefix or cls.__id_prefix__ + return f"{prefix}-{uuid.uuid4()}" + # def _generate_id(self) -> str: # return f"{self.__id_prefix__}-{uuid.uuid4()}" @@ -78,7 +79,7 @@ def allow_bare_uuids(cls, v, values): """ _ = values # for SCA if isinstance(v, UUID): - logger.warning(f"Bare UUIDs are deprecated, please use the full prefixed id ({cls.__id_prefix__})!") + logger.debug(f"Bare UUIDs are deprecated, please use the full prefixed id ({cls.__id_prefix__})!") return f"{cls.__id_prefix__}-{v}" return v diff --git a/letta/schemas/message.py b/letta/schemas/message.py index e4c668c1ec..a9e2fcb888 100644 --- a/letta/schemas/message.py +++ b/letta/schemas/message.py @@ -105,7 +105,7 @@ class Message(BaseMessage): id: str = BaseMessage.generate_id_field() role: MessageRole = Field(..., description="The role of the participant.") text: Optional[str] = Field(None, description="The text of the message.") - user_id: Optional[str] = Field(None, description="The unique identifier of the user.") + organization_id: Optional[str] = Field(None, description="The unique identifier of the organization.") agent_id: Optional[str] = Field(None, description="The unique identifier of the agent.") model: Optional[str] = Field(None, description="The model used to make the function call.") name: Optional[str] = Field(None, description="The name of the participant.") @@ -281,7 +281,6 @@ def dict_to_message( ) if id is not None: return Message( - user_id=user_id, agent_id=agent_id, model=model, # standard fields expected in an OpenAI ChatCompletion message object @@ -295,7 +294,6 @@ def dict_to_message( ) else: return Message( - user_id=user_id, agent_id=agent_id, model=model, # standard fields expected in an OpenAI ChatCompletion message object @@ -328,7 +326,6 @@ def dict_to_message( if id is not None: return Message( - user_id=user_id, agent_id=agent_id, model=model, # standard fields expected in an OpenAI ChatCompletion message object @@ -342,7 +339,6 @@ def dict_to_message( ) else: return Message( - user_id=user_id, agent_id=agent_id, model=model, # standard fields expected in an OpenAI ChatCompletion message object @@ -375,7 +371,6 @@ def dict_to_message( # If we're going from tool-call style if id is not None: return Message( - user_id=user_id, agent_id=agent_id, model=model, # standard fields expected in an OpenAI ChatCompletion message object @@ -389,7 +384,6 @@ def dict_to_message( ) else: return Message( - user_id=user_id, agent_id=agent_id, model=model, # standard fields expected in an OpenAI ChatCompletion message object diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index 9e64ea5dfd..6a583c3a3c 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -409,7 +409,7 @@ def get_agent_messages( return server.get_agent_recall_cursor( user_id=actor.id, agent_id=agent_id, - before=before, + cursor=before, limit=limit, reverse=True, return_message_object=msg_object, diff --git a/letta/server/server.py b/letta/server/server.py index d12e0f3b27..7a430862e4 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -77,14 +77,15 @@ from letta.services.agents_tags_manager import AgentsTagsManager from letta.services.block_manager import BlockManager from letta.services.blocks_agents_manager import BlocksAgentsManager -from letta.services.tools_agents_manager import ToolsAgentsManager from letta.services.job_manager import JobManager +from letta.services.message_manager import MessageManager from letta.services.organization_manager import OrganizationManager from letta.services.per_agent_lock_manager import PerAgentLockManager from letta.services.sandbox_config_manager import SandboxConfigManager from letta.services.source_manager import SourceManager from letta.services.tool_execution_sandbox import ToolExecutionSandbox from letta.services.tool_manager import ToolManager +from letta.services.tools_agents_manager import ToolsAgentsManager from letta.services.user_manager import UserManager from letta.utils import create_random_username, get_utc_time, json_dumps, json_loads @@ -260,6 +261,7 @@ def __init__( self.agents_tags_manager = AgentsTagsManager() self.sandbox_config_manager = SandboxConfigManager(tool_settings) self.blocks_agents_manager = BlocksAgentsManager() + self.message_manager = MessageManager() self.tools_agents_manager = ToolsAgentsManager() self.job_manager = JobManager() @@ -414,7 +416,7 @@ def load_agent(self, agent_id: str, interface: Union[AgentInterface, None] = Non agent = OfflineMemoryAgent(agent_state=agent_state, interface=interface, user=actor) elif agent_state.agent_type == AgentType.chat_only_agent: agent = ChatOnlyAgent(agent_state=agent_state, interface=interface, user=actor) - else: + else: raise ValueError(f"Invalid agent type {agent_state.agent_type}") # Rebuild the system prompt - may be linked to new blocks now @@ -422,7 +424,7 @@ def load_agent(self, agent_id: str, interface: Union[AgentInterface, None] = Non # Persist to agent save_agent(agent, self.ms) - return agent + return agent def _step( self, @@ -518,12 +520,7 @@ def _command(self, user_id: str, agent_id: str, command: str) -> LettaUsageStati letta_agent.interface.print_messages_raw(letta_agent.messages) elif command.lower() == "memory": - ret_str = ( - f"\nDumping memory contents:\n" - + f"\n{str(letta_agent.agent_state.memory)}" - + f"\n{str(letta_agent.persistence_manager.archival_memory)}" - + f"\n{str(letta_agent.persistence_manager.recall_memory)}" - ) + ret_str = f"\nDumping memory contents:\n" + f"\n{str(letta_agent.agent_state.memory)}" + f"\n{str(letta_agent.archival_memory)}" return ret_str elif command.lower() == "pop" or command.lower().startswith("pop "): @@ -625,7 +622,6 @@ def user_message( # Convert to a Message object if timestamp: message = Message( - user_id=user_id, agent_id=agent_id, role="user", text=packaged_user_message, @@ -633,7 +629,6 @@ def user_message( ) else: message = Message( - user_id=user_id, agent_id=agent_id, role="user", text=packaged_user_message, @@ -672,7 +667,6 @@ def system_message( if timestamp: message = Message( - user_id=user_id, agent_id=agent_id, role="system", text=packaged_system_message, @@ -680,7 +674,6 @@ def system_message( ) else: message = Message( - user_id=user_id, agent_id=agent_id, role="system", text=packaged_system_message, @@ -743,7 +736,6 @@ def send_messages( # Create the Message object message_objects.append( Message( - user_id=user_id, agent_id=agent_id, role=message.role, text=message.text, @@ -876,7 +868,7 @@ def create_agent( else: raise ValueError(f"Invalid message role: {message.role}") - init_messages.append(Message(role=message.role, text=packed_message, user_id=user_id, agent_id=agent_state.id)) + init_messages.append(Message(role=message.role, text=packed_message, agent_id=agent_state.id)) # init_messages = [Message.dict_to_message(user_id=user_id, agent_id=agent_state.id, openai_message_dict=message.model_dump()) for message in request.initial_message_sequence] else: init_messages = None @@ -1160,11 +1152,11 @@ def get_agent_memory(self, agent_id: str) -> Memory: def get_archival_memory_summary(self, agent_id: str) -> ArchivalMemorySummary: agent = self.load_agent(agent_id=agent_id) - return ArchivalMemorySummary(size=len(agent.persistence_manager.archival_memory)) + return ArchivalMemorySummary(size=len(agent.archival_memory)) def get_recall_memory_summary(self, agent_id: str) -> RecallMemorySummary: agent = self.load_agent(agent_id=agent_id) - return RecallMemorySummary(size=len(agent.persistence_manager.recall_memory)) + return RecallMemorySummary(size=len(agent.message_manager)) def get_in_context_message_ids(self, agent_id: str) -> List[str]: """Get the message ids of the in-context messages in the agent's memory""" @@ -1182,7 +1174,7 @@ def get_agent_message(self, agent_id: str, message_id: str) -> Message: """Get a single message from the agent's memory""" # Get the agent object (loaded in memory) agent = self.load_agent(agent_id=agent_id) - message = agent.persistence_manager.recall_memory.storage.get(id=message_id) + message = agent.message_manager.get_message_by_id(id=message_id, actor=self.default_user) return message def get_agent_messages( @@ -1213,14 +1205,16 @@ def get_agent_messages( else: # need to access persistence manager for additional messages - db_iterator = letta_agent.persistence_manager.recall_memory.storage.get_all_paginated(page_size=count, offset=start) - # get a single page of messages - # TODO: handle stop iteration - page = next(db_iterator, []) + # get messages using message manager + page = letta_agent.message_manager.list_user_messages_for_agent( + agent_id=agent_id, + actor=self.default_user, + cursor=start, + limit=count, + ) - # return messages in reverse chronological order - messages = sorted(page, key=lambda x: x.created_at, reverse=True) + messages = page assert all(isinstance(m, Message) for m in messages) ## Convert to json @@ -1243,7 +1237,7 @@ def get_agent_archival(self, user_id: str, agent_id: str, start: int, count: int letta_agent = self.load_agent(agent_id=agent_id) # iterate over records - db_iterator = letta_agent.persistence_manager.archival_memory.storage.get_all_paginated(page_size=count, offset=start) + db_iterator = letta_agent.archival_memory.storage.get_all_paginated(page_size=count, offset=start) # get a single page of messages page = next(db_iterator, []) @@ -1268,7 +1262,7 @@ def get_agent_archival_cursor( letta_agent = self.load_agent(agent_id=agent_id) # iterate over recorde - cursor, records = letta_agent.persistence_manager.archival_memory.storage.get_all_cursor( + cursor, records = letta_agent.archival_memory.storage.get_all_cursor( after=after, before=before, limit=limit, order_by=order_by, reverse=reverse ) return records @@ -1283,14 +1277,14 @@ def insert_archival_memory(self, user_id: str, agent_id: str, memory_contents: s letta_agent = self.load_agent(agent_id=agent_id) # Insert into archival memory - passage_ids = letta_agent.persistence_manager.archival_memory.insert(memory_string=memory_contents, return_ids=True) + passage_ids = letta_agent.archival_memory.insert(memory_string=memory_contents, return_ids=True) # Update the agent # TODO: should this update the system prompt? save_agent(letta_agent, self.ms) # TODO: this is gross, fix - return [letta_agent.persistence_manager.archival_memory.storage.get(id=passage_id) for passage_id in passage_ids] + return [letta_agent.archival_memory.storage.get(id=passage_id) for passage_id in passage_ids] def delete_archival_memory(self, user_id: str, agent_id: str, memory_id: str): if self.user_manager.get_user_by_id(user_id=user_id) is None: @@ -1305,7 +1299,7 @@ def delete_archival_memory(self, user_id: str, agent_id: str, memory_id: str): # Delete by ID # TODO check if it exists first, and throw error if not - letta_agent.persistence_manager.archival_memory.storage.delete({"id": memory_id}) + letta_agent.archival_memory.storage.delete({"id": memory_id}) # TODO: return archival memory @@ -1313,17 +1307,15 @@ def get_agent_recall_cursor( self, user_id: str, agent_id: str, - after: Optional[str] = None, - before: Optional[str] = None, + cursor: Optional[str] = None, limit: Optional[int] = 100, - order_by: Optional[str] = "created_at", - order: Optional[str] = "asc", reverse: Optional[bool] = False, return_message_object: bool = True, assistant_message_tool_name: str = constants.DEFAULT_MESSAGE_TOOL, assistant_message_tool_kwarg: str = constants.DEFAULT_MESSAGE_TOOL_KWARG, ) -> Union[List[Message], List[LettaMessage]]: - if self.user_manager.get_user_by_id(user_id=user_id) is None: + actor = self.user_manager.get_user_by_id(user_id=user_id) + if actor is None: raise ValueError(f"User user_id={user_id} does not exist") if self.ms.get_agent(agent_id=agent_id, user_id=user_id) is None: raise ValueError(f"Agent agent_id={agent_id} does not exist") @@ -1332,8 +1324,12 @@ def get_agent_recall_cursor( letta_agent = self.load_agent(agent_id=agent_id) # iterate over records - cursor, records = letta_agent.persistence_manager.recall_memory.storage.get_all_cursor( - after=after, before=before, limit=limit, order_by=order_by, reverse=reverse + # TODO: Check "order_by", "order" + records = letta_agent.message_manager.list_messages_for_agent( + agent_id=agent_id, + actor=actor, + cursor=cursor, + limit=limit, ) assert all(isinstance(m, Message) for m in records) @@ -1353,7 +1349,7 @@ def get_agent_recall_cursor( records = records[::-1] return records - + def get_server_config(self, include_defaults: bool = False) -> dict: """Return the base config""" @@ -1425,19 +1421,25 @@ def delete_agent(self, user_id: str, agent_id: str): self.agents_tags_manager.delete_all_tags_from_agent(agent_id=agent_id, actor=actor) self.blocks_agents_manager.remove_all_agent_blocks(agent_id=agent_id) - if self.ms.get_agent(agent_id=agent_id, user_id=user_id) is None: - raise ValueError(f"Agent agent_id={agent_id} does not exist") - # Verify that the agent exists and belongs to the org of the user agent_state = self.ms.get_agent(agent_id=agent_id, user_id=user_id) - if not agent_state: + if agent_state is None: raise ValueError(f"Could not find agent_id={agent_id} under user_id={user_id}") - agent_state_user = self.user_manager.get_user_by_id(user_id=agent_state.user_id) - if agent_state_user.organization_id != actor.organization_id: - raise ValueError( - f"Could not authorize agent_id={agent_id} with user_id={user_id} because of differing organizations; agent_id was created in {agent_state_user.organization_id} while user belongs to {actor.organization_id}. How did they get the agent id?" - ) + # TODO: REMOVE THIS ONCE WE MIGRATE AGENTMODEL TO ORM MODEL + messages = self.message_manager.list_messages_for_agent(agent_id=agent_state.id) + for message in messages: + self.message_manager.delete_message_by_id(message.id, actor=actor) + + # TODO: REMOVE THIS ONCE WE MIGRATE AGENTMODEL TO ORM + try: + agent_state_user = self.user_manager.get_user_by_id(user_id=agent_state.user_id) + if agent_state_user.organization_id != actor.organization_id: + raise ValueError( + f"Could not authorize agent_id={agent_id} with user_id={user_id} because of differing organizations; agent_id was created in {agent_state_user.organization_id} while user belongs to {actor.organization_id}. How did they get the agent id?" + ) + except NoResultFound: + logger.error(f"Agent with id {agent_state.id} has nonexistent user {agent_state.user_id}") # First, if the agent is in the in-memory cache we should remove it # List of {'user_id': user_id, 'agent_id': agent_id, 'agent': agent_obj} dicts @@ -1582,7 +1584,7 @@ def detach_source_from_agent( # delete all Passage objects with source_id==source_id from agent's archival memory agent = self.load_agent(agent_id=agent_id) - archival_memory = agent.persistence_manager.archival_memory + archival_memory = agent.archival_memory archival_memory.storage.delete({"source_id": source_id}) # delete agent-source mapping @@ -1661,7 +1663,7 @@ def get_agent_message(self, agent_id: str, message_id: str) -> Optional[Message] """Get a single message from the agent's memory""" # Get the agent object (loaded in memory) letta_agent = self.load_agent(agent_id=agent_id) - message = letta_agent.persistence_manager.recall_memory.storage.get(id=message_id) + message = letta_agent.message_manager.get_message_by_id(id=message_id) save_agent(letta_agent, self.ms) return message @@ -1705,7 +1707,7 @@ def get_user_or_default(self, user_id: Optional[str]) -> User: try: return self.user_manager.get_user_by_id(user_id=user_id) - except ValueError: + except NoResultFound: raise HTTPException(status_code=404, detail=f"User with id {user_id} not found") def get_organization_or_default(self, org_id: Optional[str]) -> Organization: @@ -1715,7 +1717,7 @@ def get_organization_or_default(self, org_id: Optional[str]) -> Organization: try: return self.organization_manager.get_organization_by_id(org_id=org_id) - except ValueError: + except NoResultFound: raise HTTPException(status_code=404, detail=f"Organization with id {org_id} not found") def list_llm_models(self) -> List[LLMConfig]: diff --git a/letta/services/block_manager.py b/letta/services/block_manager.py index ac6e42b861..65f6c79e55 100644 --- a/letta/services/block_manager.py +++ b/letta/services/block_manager.py @@ -102,7 +102,7 @@ def get_blocks( return [block.to_pydantic() for block in blocks] @enforce_types - def get_block_by_id(self, block_id, actor: PydanticUser) -> Optional[PydanticBlock]: + def get_block_by_id(self, block_id: str, actor: Optional[PydanticUser] = None) -> Optional[PydanticBlock]: """Retrieve a block by its name.""" with self.session_maker() as session: try: diff --git a/letta/services/message_manager.py b/letta/services/message_manager.py new file mode 100644 index 0000000000..7a46ddba0d --- /dev/null +++ b/letta/services/message_manager.py @@ -0,0 +1,182 @@ +from datetime import datetime +from typing import Dict, List, Optional + +from letta.orm.errors import NoResultFound +from letta.orm.message import Message as MessageModel +from letta.schemas.enums import MessageRole +from letta.schemas.message import Message as PydanticMessage +from letta.schemas.user import User as PydanticUser +from letta.utils import enforce_types + + +class MessageManager: + """Manager class to handle business logic related to Messages.""" + + def __init__(self): + from letta.server.server import db_context + + self.session_maker = db_context + + @enforce_types + def get_message_by_id(self, message_id: str, actor: PydanticUser) -> Optional[PydanticMessage]: + """Fetch a message by ID.""" + with self.session_maker() as session: + try: + message = MessageModel.read(db_session=session, identifier=message_id, actor=actor) + return message.to_pydantic() + except NoResultFound: + return None + + @enforce_types + def create_message(self, pydantic_msg: PydanticMessage, actor: PydanticUser) -> PydanticMessage: + """Create a new message.""" + with self.session_maker() as session: + # Set the organization id of the Pydantic message + pydantic_msg.organization_id = actor.organization_id + msg_data = pydantic_msg.model_dump() + msg = MessageModel(**msg_data) + msg.create(session, actor=actor) # Persist to database + return msg.to_pydantic() + + @enforce_types + def create_many_messages(self, pydantic_msgs: List[PydanticMessage], actor: PydanticUser) -> List[PydanticMessage]: + """Create multiple messages.""" + return [self.create_message(m, actor=actor) for m in pydantic_msgs] + + @enforce_types + def update_message_by_id(self, message_id: str, message: PydanticMessage, actor: PydanticUser) -> PydanticMessage: + """ + Updates an existing record in the database with values from the provided record object. + """ + with self.session_maker() as session: + # Fetch existing message from database + msg = MessageModel.read( + db_session=session, + identifier=message_id, + actor=actor, + ) + + # Update the database record with values from the provided record + for column in MessageModel.__table__.columns: + column_name = column.name + if hasattr(message, column_name): + new_value = getattr(message, column_name) + setattr(msg, column_name, new_value) + + # Commit changes + return msg.update(db_session=session, actor=actor).to_pydantic() + + @enforce_types + def delete_message_by_id(self, message_id: str, actor: PydanticUser) -> bool: + """Delete a message.""" + with self.session_maker() as session: + try: + msg = MessageModel.read( + db_session=session, + identifier=message_id, + actor=actor, + ) + msg.hard_delete(session, actor=actor) + except NoResultFound: + raise ValueError(f"Message with id {message_id} not found.") + + @enforce_types + def size( + self, + actor: PydanticUser, + role: Optional[MessageRole] = None, + agent_id: Optional[str] = None, + ) -> int: + """Get the total count of messages with optional filters. + + Args: + actor: The user requesting the count + role: The role of the message + """ + with self.session_maker() as session: + return MessageModel.size(db_session=session, actor=actor, role=role, agent_id=agent_id) + + @enforce_types + def list_user_messages_for_agent( + self, + agent_id: str, + actor: Optional[PydanticUser] = None, + cursor: Optional[str] = None, + start_date: Optional[datetime] = None, + end_date: Optional[datetime] = None, + limit: Optional[int] = 50, + filters: Optional[Dict] = None, + query_text: Optional[str] = None, + ) -> List[PydanticMessage]: + """List user messages with flexible filtering and pagination options. + + Args: + cursor: Cursor-based pagination - return records after this ID (exclusive) + start_date: Filter records created after this date + end_date: Filter records created before this date + limit: Maximum number of records to return + filters: Additional filters to apply + query_text: Optional text to search for in message content + + Returns: + List[PydanticMessage] - List of messages matching the criteria + """ + message_filters = {"role": "user"} + if filters: + message_filters.update(filters) + + return self.list_messages_for_agent( + agent_id=agent_id, + actor=actor, + cursor=cursor, + start_date=start_date, + end_date=end_date, + limit=limit, + filters=message_filters, + query_text=query_text, + ) + + @enforce_types + def list_messages_for_agent( + self, + agent_id: str, + actor: Optional[PydanticUser] = None, + cursor: Optional[str] = None, + start_date: Optional[datetime] = None, + end_date: Optional[datetime] = None, + limit: Optional[int] = 50, + filters: Optional[Dict] = None, + query_text: Optional[str] = None, + ) -> List[PydanticMessage]: + """List messages with flexible filtering and pagination options. + + Args: + cursor: Cursor-based pagination - return records after this ID (exclusive) + start_date: Filter records created after this date + end_date: Filter records created before this date + limit: Maximum number of records to return + filters: Additional filters to apply + query_text: Optional text to search for in message content + + Returns: + List[PydanticMessage] - List of messages matching the criteria + """ + with self.session_maker() as session: + # Start with base filters + message_filters = {"agent_id": agent_id} + if actor: + message_filters.update({"organization_id": actor.organization_id}) + if filters: + message_filters.update(filters) + + results = MessageModel.list( + db_session=session, + cursor=cursor, + start_date=start_date, + end_date=end_date, + limit=limit, + query_text=query_text, + **message_filters, + ) + + return [msg.to_pydantic() for msg in results] diff --git a/letta/services/organization_manager.py b/letta/services/organization_manager.py index 1b7f18b6d8..f98ba65dba 100644 --- a/letta/services/organization_manager.py +++ b/letta/services/organization_manager.py @@ -30,19 +30,16 @@ def get_default_organization(self) -> PydanticOrganization: def get_organization_by_id(self, org_id: str) -> Optional[PydanticOrganization]: """Fetch an organization by ID.""" with self.session_maker() as session: - try: - organization = OrganizationModel.read(db_session=session, identifier=org_id) - return organization.to_pydantic() - except NoResultFound: - return None + organization = OrganizationModel.read(db_session=session, identifier=org_id) + return organization.to_pydantic() @enforce_types def create_organization(self, pydantic_org: PydanticOrganization) -> PydanticOrganization: - """Create a new organization. If a name is provided, it is used, otherwise, a random one is generated.""" - org = self.get_organization_by_id(pydantic_org.id) - if org: + """Create a new organization.""" + try: + org = self.get_organization_by_id(pydantic_org.id) return org - else: + except NoResultFound: return self._create_organization(pydantic_org=pydantic_org) @enforce_types diff --git a/letta/services/source_manager.py b/letta/services/source_manager.py index 03684d2367..f2b48e9bad 100644 --- a/letta/services/source_manager.py +++ b/letta/services/source_manager.py @@ -141,5 +141,5 @@ def delete_file(self, file_id: str, actor: PydanticUser) -> PydanticFileMetadata """Delete a file by its ID.""" with self.session_maker() as session: file = FileMetadataModel.read(db_session=session, identifier=file_id) - file.delete(db_session=session, actor=actor) + file.hard_delete(db_session=session, actor=actor) return file.to_pydantic() diff --git a/letta/services/tool_manager.py b/letta/services/tool_manager.py index 33b1afd719..6e1818e3ba 100644 --- a/letta/services/tool_manager.py +++ b/letta/services/tool_manager.py @@ -122,7 +122,7 @@ def update_tool_by_id(self, tool_id: str, tool_update: ToolUpdate, actor: Pydant tool.json_schema = new_schema # Save the updated tool to the database - return tool.update(db_session=session, actor=actor) + return tool.update(db_session=session, actor=actor).to_pydantic() @enforce_types def delete_tool_by_id(self, tool_id: str, actor: PydanticUser) -> None: diff --git a/letta/services/user_manager.py b/letta/services/user_manager.py index 42df72fae8..cc99ad8ca0 100644 --- a/letta/services/user_manager.py +++ b/letta/services/user_manager.py @@ -71,7 +71,7 @@ def delete_user_by_id(self, user_id: str): with self.session_maker() as session: # Delete from user table user = UserModel.read(db_session=session, identifier=user_id) - user.delete(session) + user.hard_delete(session) # TODO: Integrate this via the ORM models for the Agent, Source, and AgentSourceMapping # Cascade delete for related models: Agent, Source, AgentSourceMapping diff --git a/tests/conftest.py b/tests/conftest.py index 90916a6ecd..899a74af38 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,5 +1,24 @@ import logging +import pytest + +from letta.settings import tool_settings + def pytest_configure(config): logging.basicConfig(level=logging.DEBUG) + + +@pytest.fixture +def mock_e2b_api_key_none(): + # Store the original value of e2b_api_key + original_api_key = tool_settings.e2b_api_key + + # Set e2b_api_key to None + tool_settings.e2b_api_key = None + + # Yield control to the test + yield + + # Restore the original value of e2b_api_key + tool_settings.e2b_api_key = original_api_key diff --git a/tests/integration_test_tool_execution_sandbox.py b/tests/integration_test_tool_execution_sandbox.py index 20df005164..0574e43cae 100644 --- a/tests/integration_test_tool_execution_sandbox.py +++ b/tests/integration_test_tool_execution_sandbox.py @@ -58,21 +58,6 @@ def clear_tables(): Sandbox.connect(sandbox.sandbox_id).kill() -@pytest.fixture -def mock_e2b_api_key_none(): - # Store the original value of e2b_api_key - original_api_key = tool_settings.e2b_api_key - - # Set e2b_api_key to None - tool_settings.e2b_api_key = None - - # Yield control to the test - yield - - # Restore the original value of e2b_api_key - tool_settings.e2b_api_key = original_api_key - - @pytest.fixture def check_e2b_key_is_set(): original_api_key = tool_settings.e2b_api_key diff --git a/tests/test_agent_tool_graph.py b/tests/test_agent_tool_graph.py index 1d5dbcdcc8..7774977c75 100644 --- a/tests/test_agent_tool_graph.py +++ b/tests/test_agent_tool_graph.py @@ -5,7 +5,6 @@ from letta import create_client from letta.schemas.letta_message import FunctionCallMessage from letta.schemas.tool_rule import ChildToolRule, InitToolRule, TerminalToolRule -from letta.settings import tool_settings from tests.helpers.endpoints_helper import ( assert_invoked_function_call, assert_invoked_send_message_with_keyword, @@ -20,21 +19,6 @@ config_file = "tests/configs/llm_model_configs/openai-gpt-4o.json" -@pytest.fixture -def mock_e2b_api_key_none(): - # Store the original value of e2b_api_key - original_api_key = tool_settings.e2b_api_key - - # Set e2b_api_key to None - tool_settings.e2b_api_key = None - - # Yield control to the test - yield - - # Restore the original value of e2b_api_key - tool_settings.e2b_api_key = original_api_key - - """Contrived tools for this test case""" diff --git a/tests/test_client.py b/tests/test_client.py index 4ccf41ea3b..6a0db9933b 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -16,7 +16,6 @@ from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.llm_config import LLMConfig from letta.schemas.sandbox_config import LocalSandboxConfig, SandboxType -from letta.settings import tool_settings from letta.utils import create_random_username # Constants @@ -40,7 +39,7 @@ def run_server(): @pytest.fixture( - params=[{"server": False}], # whether to use REST API server + params=[{"server": False}, {"server": True}], # whether to use REST API server scope="module", ) def client(request): @@ -83,21 +82,6 @@ def clear_tables(): session.commit() -@pytest.fixture -def mock_e2b_api_key_none(): - # Store the original value of e2b_api_key - original_api_key = tool_settings.e2b_api_key - - # Set e2b_api_key to None - tool_settings.e2b_api_key = None - - # Yield control to the test - yield - - # Restore the original value of e2b_api_key - tool_settings.e2b_api_key = original_api_key - - def test_sandbox_config_and_env_var_basic(client: Union[LocalClient, RESTClient]): """ Test sandbox config and environment variable functions for both LocalClient and RESTClient. diff --git a/tests/test_client_legacy.py b/tests/test_client_legacy.py index f49e56ab77..b5bad0d869 100644 --- a/tests/test_client_legacy.py +++ b/tests/test_client_legacy.py @@ -27,9 +27,12 @@ ) from letta.schemas.letta_response import LettaResponse, LettaStreamingResponse from letta.schemas.llm_config import LLMConfig +from letta.schemas.message import Message from letta.schemas.usage import LettaUsageStatistics +from letta.services.organization_manager import OrganizationManager from letta.services.tool_manager import ToolManager -from letta.settings import model_settings, tool_settings +from letta.services.user_manager import UserManager +from letta.settings import model_settings from tests.helpers.client_helper import upload_file_using_client # from tests.utils import create_config @@ -54,21 +57,6 @@ def run_server(): start_server(debug=True) -@pytest.fixture -def mock_e2b_api_key_none(): - # Store the original value of e2b_api_key - original_api_key = tool_settings.e2b_api_key - - # Set e2b_api_key to None - tool_settings.e2b_api_key = None - - # Yield control to the test - yield - - # Restore the original value of e2b_api_key - tool_settings.e2b_api_key = original_api_key - - # Fixture to create clients with different configurations @pytest.fixture( # params=[{"server": True}, {"server": False}], # whether to use REST API server @@ -119,6 +107,22 @@ def agent(client: Union[LocalClient, RESTClient]): client.delete_agent(agent_state.id) +@pytest.fixture +def default_organization(): + """Fixture to create and return the default organization.""" + manager = OrganizationManager() + org = manager.create_default_organization() + yield org + + +@pytest.fixture +def default_user(default_organization): + """Fixture to create and return the default user within the default organization.""" + manager = UserManager() + user = manager.create_default_user(org_id=default_organization.id) + yield user + + def test_agent(mock_e2b_api_key_none, client: Union[LocalClient, RESTClient], agent: AgentState): # test client.rename_agent @@ -612,7 +616,7 @@ def test_shared_blocks(mock_e2b_api_key_none, client: Union[LocalClient, RESTCli @pytest.fixture -def cleanup_agents(): +def cleanup_agents(client): created_agents = [] yield created_agents # Cleanup will run even if test fails @@ -624,7 +628,7 @@ def cleanup_agents(): # NOTE: we need to add this back once agents can also create blocks during agent creation -def test_initial_message_sequence(client: Union[LocalClient, RESTClient], agent: AgentState, cleanup_agents: List[str]): +def test_initial_message_sequence(client: Union[LocalClient, RESTClient], agent: AgentState, cleanup_agents: List[str], default_user): """Test that we can set an initial message sequence If we pass in None, we should get a "default" message sequence @@ -638,11 +642,12 @@ def test_initial_message_sequence(client: Union[LocalClient, RESTClient], agent: reference_init_messages = initialize_message_sequence( model=agent.llm_config.model, system=agent.system, + agent_id=agent.id, memory=agent.memory, archival_memory=None, - recall_memory=None, memory_edit_timestamp=get_utc_time(), include_initial_boot_message=True, + actor=default_user, ) # system, login message, send_message test, send_message receipt @@ -661,24 +666,8 @@ def test_initial_message_sequence(client: Union[LocalClient, RESTClient], agent: # Test with empty sequence empty_agent_state = client.create_agent(name="test-empty-message-sequence", initial_message_sequence=[]) cleanup_agents.append(empty_agent_state.id) - # NOTE: allowed to be None initially - # assert empty_agent_state.message_ids is not None - # assert len(empty_agent_state.message_ids) == 1, f"Expected 0 messages, got {len(empty_agent_state.message_ids)}" - - # Test with custom sequence - # custom_sequence = [ - # Message( - # role=MessageRole.user, - # text="Hello, how are you?", - # user_id=agent.user_id, - # agent_id=agent.id, - # model=agent.llm_config.model, - # name=None, - # tool_calls=None, - # tool_call_id=None, - # ), - # ] - custom_sequence = [{"text": "Hello, how are you?", "role": "user"}] + + custom_sequence = [Message(**{"text": "Hello, how are you?", "role": "user"})] custom_agent_state = client.create_agent(name="test-custom-message-sequence", initial_message_sequence=custom_sequence) cleanup_agents.append(custom_agent_state.id) assert custom_agent_state.message_ids is not None @@ -687,7 +676,7 @@ def test_initial_message_sequence(client: Union[LocalClient, RESTClient], agent: ), f"Expected {len(custom_sequence) + 1} messages, got {len(custom_agent_state.message_ids)}" # assert custom_agent_state.message_ids[1:] == [msg.id for msg in custom_sequence] # shoule be contained in second message (after system message) - assert custom_sequence[0]["text"] in client.get_in_context_messages(custom_agent_state.id)[1].text + assert custom_sequence[0].text in client.get_in_context_messages(custom_agent_state.id)[1].text def test_add_and_manage_tags_for_agent(client: Union[LocalClient, RESTClient], agent: AgentState): diff --git a/tests/test_local_client.py b/tests/test_local_client.py index 74ab87afef..3aa947ba6d 100644 --- a/tests/test_local_client.py +++ b/tests/test_local_client.py @@ -8,7 +8,6 @@ from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import BasicBlockMemory, ChatMemory, Memory -from letta.schemas.tool import ToolCreate @pytest.fixture(scope="module") @@ -293,6 +292,10 @@ def print_tool2(msg: str): """ print(msg) + # Clean all tools first + for tool in client.list_tools(): + client.delete_tool(tool.id) + # create tool tool = client.create_or_update_tool(func=print_tool, tags=["extras"]) @@ -330,49 +333,50 @@ def test_tools_from_composio_basic(client: LocalClient): # The tool creation includes a compile safety check, so if this test doesn't error out, at least the code is compilable -def test_tools_from_langchain(client: LocalClient): - # create langchain tool - from langchain_community.tools import WikipediaQueryRun - from langchain_community.utilities import WikipediaAPIWrapper - - api_wrapper = WikipediaAPIWrapper(top_k_results=1, doc_content_chars_max=100) - langchain_tool = WikipediaQueryRun(api_wrapper=api_wrapper) - - # Add the tool - tool = client.load_langchain_tool( - langchain_tool, additional_imports_module_attr_map={"langchain_community.utilities": "WikipediaAPIWrapper"} - ) - - # list tools - tools = client.list_tools() - assert tool.name in [t.name for t in tools] - - # get tool - tool_id = client.get_tool_id(name=tool.name) - retrieved_tool = client.get_tool(tool_id) - source_code = retrieved_tool.source_code - - # Parse the function and attempt to use it - local_scope = {} - exec(source_code, {}, local_scope) - func = local_scope[tool.name] - - expected_content = "Albert Einstein" - assert expected_content in func(query="Albert Einstein") - - -def test_tool_creation_langchain_missing_imports(client: LocalClient): - # create langchain tool - from langchain_community.tools import WikipediaQueryRun - from langchain_community.utilities import WikipediaAPIWrapper - - api_wrapper = WikipediaAPIWrapper(top_k_results=1, doc_content_chars_max=100) - langchain_tool = WikipediaQueryRun(api_wrapper=api_wrapper) - - # Translate to memGPT Tool - # Intentionally missing {"langchain_community.utilities": "WikipediaAPIWrapper"} - with pytest.raises(RuntimeError): - ToolCreate.from_langchain(langchain_tool) +# TODO: Langchain seems to have issues with Pydantic +# TODO: Langchain tools are breaking every two weeks bc of changes on their side +# def test_tools_from_langchain(client: LocalClient): +# # create langchain tool +# from langchain_community.tools import WikipediaQueryRun +# from langchain_community.utilities import WikipediaAPIWrapper +# +# langchain_tool = WikipediaQueryRun(api_wrapper=WikipediaAPIWrapper()) +# +# # Add the tool +# tool = client.load_langchain_tool( +# langchain_tool, additional_imports_module_attr_map={"langchain_community.utilities": "WikipediaAPIWrapper"} +# ) +# +# # list tools +# tools = client.list_tools() +# assert tool.name in [t.name for t in tools] +# +# # get tool +# tool_id = client.get_tool_id(name=tool.name) +# retrieved_tool = client.get_tool(tool_id) +# source_code = retrieved_tool.source_code +# +# # Parse the function and attempt to use it +# local_scope = {} +# exec(source_code, {}, local_scope) +# func = local_scope[tool.name] +# +# expected_content = "Albert Einstein" +# assert expected_content in func(query="Albert Einstein") +# +# +# def test_tool_creation_langchain_missing_imports(client: LocalClient): +# # create langchain tool +# from langchain_community.tools import WikipediaQueryRun +# from langchain_community.utilities import WikipediaAPIWrapper +# +# api_wrapper = WikipediaAPIWrapper(top_k_results=1, doc_content_chars_max=100) +# langchain_tool = WikipediaQueryRun(api_wrapper=api_wrapper) +# +# # Translate to memGPT Tool +# # Intentionally missing {"langchain_community.utilities": "WikipediaAPIWrapper"} +# with pytest.raises(RuntimeError): +# ToolCreate.from_langchain(langchain_tool) def test_shared_blocks_without_send_message(client: LocalClient): diff --git a/tests/test_managers.py b/tests/test_managers.py index 20022cccd9..53107dfed5 100644 --- a/tests/test_managers.py +++ b/tests/test_managers.py @@ -1,4 +1,5 @@ import os +from datetime import datetime, timedelta import pytest from sqlalchemy import delete @@ -11,6 +12,7 @@ BlocksAgents, FileMetadata, Job, + Message, Organization, SandboxConfig, SandboxEnvironmentVariable, @@ -29,11 +31,12 @@ from letta.schemas.block import Block as PydanticBlock from letta.schemas.block import BlockUpdate, CreateBlock from letta.schemas.embedding_config import EmbeddingConfig -from letta.schemas.enums import JobStatus +from letta.schemas.enums import JobStatus, MessageRole from letta.schemas.file import FileMetadata as PydanticFileMetadata from letta.schemas.job import Job as PydanticJob from letta.schemas.job import JobUpdate from letta.schemas.llm_config import LLMConfig +from letta.schemas.message import Message as PydanticMessage from letta.schemas.organization import Organization as PydanticOrganization from letta.schemas.sandbox_config import ( E2BSandboxConfig, @@ -47,7 +50,7 @@ from letta.schemas.source import Source as PydanticSource from letta.schemas.source import SourceUpdate from letta.schemas.tool import Tool as PydanticTool -from letta.schemas.tool import ToolCreate, ToolUpdate +from letta.schemas.tool import ToolUpdate from letta.services.block_manager import BlockManager from letta.services.organization_manager import OrganizationManager from letta.services.tool_manager import ToolManager @@ -77,6 +80,7 @@ def clear_tables(server: SyncServer): """Fixture to clear the organization table before each test.""" with server.organization_manager.session_maker() as session: + session.execute(delete(Message)) session.execute(delete(Job)) session.execute(delete(ToolsAgents)) # Clear ToolsAgents first session.execute(delete(BlocksAgents)) @@ -191,6 +195,21 @@ def print_tool(message: str): yield tool +@pytest.fixture +def hello_world_message_fixture(server: SyncServer, default_user, sarah_agent): + """Fixture to create a tool with default settings and clean up after the test.""" + # Set up message + message = PydanticMessage( + organization_id=default_user.organization_id, + agent_id=sarah_agent.id, + role="user", + text="Hello, world!", + ) + + msg = server.message_manager.create_message(message, actor=default_user) + yield msg + + @pytest.fixture def sandbox_config_fixture(server: SyncServer, default_user): sandbox_config_create = SandboxConfigCreate( @@ -274,6 +293,7 @@ def print_other_tool(message: str): # Yield the created tool yield tool + @pytest.fixture(scope="module") def server(): config = LettaConfig.load() @@ -548,6 +568,163 @@ def test_delete_tool_by_id(server: SyncServer, print_tool, default_user): assert len(tools) == 0 +# ====================================================================================================================== +# Message Manager Tests +# ====================================================================================================================== + + +def test_message_create(server: SyncServer, hello_world_message_fixture, default_user): + """Test creating a message using hello_world_message_fixture fixture""" + assert hello_world_message_fixture.id is not None + assert hello_world_message_fixture.text == "Hello, world!" + assert hello_world_message_fixture.role == "user" + + # Verify we can retrieve it + retrieved = server.message_manager.get_message_by_id( + hello_world_message_fixture.id, + actor=default_user, + ) + assert retrieved is not None + assert retrieved.id == hello_world_message_fixture.id + assert retrieved.text == hello_world_message_fixture.text + assert retrieved.role == hello_world_message_fixture.role + + +def test_message_get_by_id(server: SyncServer, hello_world_message_fixture, default_user): + """Test retrieving a message by ID""" + retrieved = server.message_manager.get_message_by_id(hello_world_message_fixture.id, actor=default_user) + assert retrieved is not None + assert retrieved.id == hello_world_message_fixture.id + assert retrieved.text == hello_world_message_fixture.text + + +def test_message_update(server: SyncServer, hello_world_message_fixture, default_user): + """Test updating a message""" + new_text = "Updated text" + hello_world_message_fixture.text = new_text + updated = server.message_manager.update_message_by_id(hello_world_message_fixture.id, hello_world_message_fixture, actor=default_user) + assert updated is not None + assert updated.text == new_text + retrieved = server.message_manager.get_message_by_id(hello_world_message_fixture.id, actor=default_user) + assert retrieved.text == new_text + + +def test_message_delete(server: SyncServer, hello_world_message_fixture, default_user): + """Test deleting a message""" + server.message_manager.delete_message_by_id(hello_world_message_fixture.id, actor=default_user) + retrieved = server.message_manager.get_message_by_id(hello_world_message_fixture.id, actor=default_user) + assert retrieved is None + + +def test_message_size(server: SyncServer, hello_world_message_fixture, default_user): + """Test counting messages with filters""" + base_message = hello_world_message_fixture + + # Create additional test messages + messages = [ + PydanticMessage( + organization_id=default_user.organization_id, agent_id=base_message.agent_id, role=base_message.role, text=f"Test message {i}" + ) + for i in range(4) + ] + server.message_manager.create_many_messages(messages, actor=default_user) + + # Test total count + total = server.message_manager.size(actor=default_user, role=MessageRole.user) + assert total == 6 # login message + base message + 4 test messages + # TODO: change login message to be a system not user message + + # Test count with agent filter + agent_count = server.message_manager.size(actor=default_user, agent_id=base_message.agent_id, role=MessageRole.user) + assert agent_count == 6 + + # Test count with role filter + role_count = server.message_manager.size(actor=default_user, role=base_message.role) + assert role_count == 6 + + # Test count with non-existent filter + empty_count = server.message_manager.size(actor=default_user, agent_id="non-existent", role=MessageRole.user) + assert empty_count == 0 + + +def create_test_messages(server: SyncServer, base_message: PydanticMessage, default_user) -> list[PydanticMessage]: + """Helper function to create test messages for all tests""" + messages = [ + PydanticMessage( + organization_id=default_user.organization_id, agent_id=base_message.agent_id, role=base_message.role, text=f"Test message {i}" + ) + for i in range(4) + ] + server.message_manager.create_many_messages(messages, actor=default_user) + return messages + + +def test_message_listing_basic(server: SyncServer, hello_world_message_fixture, default_user, sarah_agent): + """Test basic message listing with limit""" + create_test_messages(server, hello_world_message_fixture, default_user) + + results = server.message_manager.list_user_messages_for_agent(agent_id=sarah_agent.id, limit=3, actor=default_user) + assert len(results) == 3 + + +def test_message_listing_cursor(server: SyncServer, hello_world_message_fixture, default_user, sarah_agent): + """Test cursor-based pagination functionality""" + create_test_messages(server, hello_world_message_fixture, default_user) + + # Make sure there are 5 messages + assert server.message_manager.size(actor=default_user, role=MessageRole.user) == 6 + + # Get first page + first_page = server.message_manager.list_user_messages_for_agent(agent_id=sarah_agent.id, actor=default_user, limit=3) + assert len(first_page) == 3 + + last_id_on_first_page = first_page[-1].id + + # Get second page + second_page = server.message_manager.list_user_messages_for_agent( + agent_id=sarah_agent.id, actor=default_user, cursor=last_id_on_first_page, limit=3 + ) + assert len(second_page) == 3 # Should have 2 remaining messages + assert all(r1.id != r2.id for r1 in first_page for r2 in second_page) + + +def test_message_listing_filtering(server: SyncServer, hello_world_message_fixture, default_user, sarah_agent): + """Test filtering messages by agent ID""" + create_test_messages(server, hello_world_message_fixture, default_user) + + agent_results = server.message_manager.list_user_messages_for_agent(agent_id=sarah_agent.id, actor=default_user, limit=10) + assert len(agent_results) == 6 # login message + base message + 4 test messages + assert all(msg.agent_id == hello_world_message_fixture.agent_id for msg in agent_results) + + +def test_message_listing_text_search(server: SyncServer, hello_world_message_fixture, default_user, sarah_agent): + """Test searching messages by text content""" + create_test_messages(server, hello_world_message_fixture, default_user) + + search_results = server.message_manager.list_user_messages_for_agent( + agent_id=sarah_agent.id, actor=default_user, query_text="Test message", limit=10 + ) + assert len(search_results) == 4 + assert all("Test message" in msg.text for msg in search_results) + + # Test no results + search_results = server.message_manager.list_user_messages_for_agent( + agent_id=sarah_agent.id, actor=default_user, query_text="Letta", limit=10 + ) + assert len(search_results) == 0 + + +def test_message_listing_date_range_filtering(server: SyncServer, hello_world_message_fixture, default_user, sarah_agent): + """Test filtering messages by date range""" + create_test_messages(server, hello_world_message_fixture, default_user) + now = datetime.utcnow() + + date_results = server.message_manager.list_user_messages_for_agent( + agent_id=sarah_agent.id, actor=default_user, start_date=now - timedelta(minutes=1), end_date=now + timedelta(minutes=1), limit=10 + ) + assert len(date_results) > 0 + + # ====================================================================================================================== # Block Manager Tests # ====================================================================================================================== @@ -1211,9 +1388,7 @@ def test_change_name_on_tool_reflects_in_tool_agents_table(server, sarah_agent, # Change the tool name new_name = "banana" - tool = server.tool_manager.update_tool_by_id( - tool_id=print_tool.id, tool_update=ToolUpdate(name=new_name), actor=default_user - ) + tool = server.tool_manager.update_tool_by_id(tool_id=print_tool.id, tool_update=ToolUpdate(name=new_name), actor=default_user) assert tool.name == new_name # Get the association @@ -1225,9 +1400,7 @@ def test_change_name_on_tool_reflects_in_tool_agents_table(server, sarah_agent, @pytest.mark.skipif(using_sqlite, reason="Skipped because using SQLite") def test_add_tool_to_agent_nonexistent_tool(server, sarah_agent, default_user): with pytest.raises(ForeignKeyConstraintViolationError): - server.tools_agents_manager.add_tool_to_agent( - agent_id=sarah_agent.id, tool_id="nonexistent_tool", tool_name="nonexistent_name" - ) + server.tools_agents_manager.add_tool_to_agent(agent_id=sarah_agent.id, tool_id="nonexistent_tool", tool_name="nonexistent_name") def test_add_tool_to_agent_duplicate_name(server, sarah_agent, default_user, print_tool, other_tool): @@ -1240,9 +1413,7 @@ def test_add_tool_to_agent_duplicate_name(server, sarah_agent, default_user, pri def test_remove_tool_with_name_from_agent(server, sarah_agent, default_user, print_tool): server.tools_agents_manager.add_tool_to_agent(agent_id=sarah_agent.id, tool_id=print_tool.id, tool_name=print_tool.name) - removed_tool = server.tools_agents_manager.remove_tool_with_name_from_agent( - agent_id=sarah_agent.id, tool_name=print_tool.name - ) + removed_tool = server.tools_agents_manager.remove_tool_with_name_from_agent(agent_id=sarah_agent.id, tool_name=print_tool.name) assert removed_tool.tool_name == print_tool.name assert removed_tool.tool_id == print_tool.id @@ -1280,6 +1451,7 @@ def test_add_tool_to_agent_with_deleted_tool(server, sarah_agent, default_user, with pytest.raises(ForeignKeyConstraintViolationError): server.tools_agents_manager.add_tool_to_agent(agent_id=sarah_agent.id, tool_id=print_tool.id, tool_name=print_tool.name) + def test_remove_all_agent_tools(server, sarah_agent, default_user, print_tool, other_tool): server.tools_agents_manager.add_tool_to_agent(agent_id=sarah_agent.id, tool_id=print_tool.id, tool_name=print_tool.name) server.tools_agents_manager.add_tool_to_agent(agent_id=sarah_agent.id, tool_id=other_tool.id, tool_name=other_tool.name) @@ -1290,6 +1462,7 @@ def test_remove_all_agent_tools(server, sarah_agent, default_user, print_tool, o assert not retrieved_tool_ids + # ====================================================================================================================== # JobManager Tests # ====================================================================================================================== diff --git a/tests/test_offline_memory_agent.py b/tests/test_offline_memory_agent.py index b78e2274c8..d642d159c6 100644 --- a/tests/test_offline_memory_agent.py +++ b/tests/test_offline_memory_agent.py @@ -1,30 +1,40 @@ -import json +import pytest from letta import BasicBlockMemory -from letta import offline_memory_agent from letta.client.client import Block, create_client from letta.constants import DEFAULT_HUMAN, DEFAULT_PERSONA from letta.offline_memory_agent import ( - rethink_memory, finish_rethinking_memory, - rethink_memory_convo, finish_rethinking_memory_convo, + rethink_memory, + rethink_memory_convo, trigger_rethink_memory, - trigger_rethink_memory_convo, ) from letta.prompts import gpt_system from letta.schemas.agent import AgentType from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.llm_config import LLMConfig -from letta.schemas.message import MessageCreate from letta.schemas.tool_rule import TerminalToolRule from letta.utils import get_human_text, get_persona_text -def test_ripple_edit(): +@pytest.fixture(scope="module") +def client(): client = create_client() - assert client is not None - trigger_rethink_memory_tool = client.create_tool(trigger_rethink_memory) + client.set_default_llm_config(LLMConfig.default_config("gpt-4o-mini")) + client.set_default_embedding_config(EmbeddingConfig.default_config(provider="openai")) + + yield client + + +@pytest.fixture(autouse=True) +def clear_agents(client): + for agent in client.list_agents(): + client.delete_agent(agent.id) + + +def test_ripple_edit(client, mock_e2b_api_key_none): + trigger_rethink_memory_tool = client.create_or_update_tool(trigger_rethink_memory) conversation_human_block = Block(name="human", label="human", value=get_human_text(DEFAULT_HUMAN), limit=2000) conversation_persona_block = Block(name="persona", label="persona", value=get_persona_text(DEFAULT_PERSONA), limit=2000) @@ -61,12 +71,7 @@ def test_ripple_edit(): ) assert conversation_agent is not None - assert set(conversation_agent.memory.list_block_labels()) == set([ - "persona", - "human", - "fact_block", - "rethink_memory_block", - ]) + assert set(conversation_agent.memory.list_block_labels()) == {"persona", "human", "fact_block", "rethink_memory_block"} rethink_memory_tool = client.create_tool(rethink_memory) finish_rethinking_memory_tool = client.create_tool(finish_rethinking_memory) @@ -82,7 +87,7 @@ def test_ripple_edit(): include_base_tools=False, ) assert offline_memory_agent is not None - assert set(offline_memory_agent.memory.list_block_labels())== set(["persona", "human", "fact_block", "rethink_memory_block"]) + assert set(offline_memory_agent.memory.list_block_labels()) == {"persona", "human", "fact_block", "rethink_memory_block"} response = client.user_message( agent_id=conversation_agent.id, message="[trigger_rethink_memory]: Messi has now moved to playing for Inter Miami" ) @@ -92,12 +97,14 @@ def test_ripple_edit(): conversation_agent = client.get_agent(agent_id=conversation_agent.id) assert conversation_agent.memory.get_block("rethink_memory_block").value != "[empty]" + # Clean up agent + client.create_agent(conversation_agent.id) + client.delete_agent(offline_memory_agent.id) -def test_chat_only_agent(): - client = create_client() - rethink_memory = client.create_tool(rethink_memory_convo) - finish_rethinking_memory = client.create_tool(finish_rethinking_memory_convo) +def test_chat_only_agent(client, mock_e2b_api_key_none): + rethink_memory = client.create_or_update_tool(rethink_memory_convo) + finish_rethinking_memory = client.create_or_update_tool(finish_rethinking_memory_convo) conversation_human_block = Block(name="chat_agent_human", label="chat_agent_human", value=get_human_text(DEFAULT_HUMAN), limit=2000) conversation_persona_block = Block( @@ -114,10 +121,10 @@ def test_chat_only_agent(): tools=["send_message"], memory=conversation_memory, include_base_tools=False, - metadata = {"offline_memory_tools": [rethink_memory.name, finish_rethinking_memory.name]} + metadata={"offline_memory_tools": [rethink_memory.name, finish_rethinking_memory.name]}, ) assert chat_only_agent is not None - assert set(chat_only_agent.memory.list_block_labels()) == set(["chat_agent_persona", "chat_agent_human"]) + assert set(chat_only_agent.memory.list_block_labels()) == {"chat_agent_persona", "chat_agent_human"} for message in ["hello", "my name is not chad, my name is swoodily"]: client.send_message(agent_id=chat_only_agent.id, message=message, role="user") @@ -125,3 +132,6 @@ def test_chat_only_agent(): chat_only_agent = client.get_agent(agent_id=chat_only_agent.id) assert chat_only_agent.memory.get_block("chat_agent_human").value != get_human_text(DEFAULT_HUMAN) + + # Clean up agent + client.delete_agent(chat_only_agent.id) diff --git a/tests/test_server.py b/tests/test_server.py index 44c08c5cdb..c85f12ca38 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -17,7 +17,6 @@ SystemMessage, UserMessage, ) -from letta.schemas.message import Message from letta.schemas.user import User from .test_managers import DEFAULT_EMBEDDING_CONFIG @@ -91,7 +90,7 @@ def agent_id(server, user_id): def test_error_on_nonexistent_agent(server, user_id, agent_id): try: - fake_agent_id = uuid.uuid4() + fake_agent_id = str(uuid.uuid4()) server.user_message(user_id=user_id, agent_id=fake_agent_id, message="Hello?") raise Exception("user_message call should have failed") except (KeyError, ValueError) as e: @@ -388,7 +387,7 @@ def _test_get_messages_letta_format( agent_id, reverse=False, ): - """Reverse is off by default, the GET goes in chronological order""" + """Test mapping between messages and letta_messages with reverse=False.""" messages = server.get_agent_recall_cursor( user_id=user_id, @@ -397,7 +396,6 @@ def _test_get_messages_letta_format( reverse=reverse, return_message_object=True, ) - # messages = server.get_agent_messages(agent_id=agent_id, start=0, count=1000) assert all(isinstance(m, Message) for m in messages) letta_messages = server.get_agent_recall_cursor( @@ -407,140 +405,96 @@ def _test_get_messages_letta_format( reverse=reverse, return_message_object=False, ) - # letta_messages = server.get_agent_messages(agent_id=agent_id, start=0, count=1000, return_message_object=False) assert all(isinstance(m, LettaMessage) for m in letta_messages) - # Loop through `messages` while also looping through `letta_messages` - # Each message in `messages` should have 1+ corresponding messages in `letta_messages` - # If role of message (in `messages`) is `assistant`, - # then there should be two messages in `letta_messages`, one which is type InternalMonologue and one which is type FunctionCallMessage. - # If role of message (in `messages`) is `user`, then there should be one message in `letta_messages` which is type UserMessage. - # If role of message (in `messages`) is `system`, then there should be one message in `letta_messages` which is type SystemMessage. - # If role of message (in `messages`) is `tool`, then there should be one message in `letta_messages` which is type FunctionReturn. - - print("MESSAGES (obj):") - for i, m in enumerate(messages): - # print(m) - print(f"{i}: {m.role}, {m.text[:50]}...") - # print(m.role) - - print("MEMGPT_MESSAGES:") - for i, m in enumerate(letta_messages): - print(f"{i}: {type(m)} ...{str(m)[-50:]}") - - # Collect system messages and their texts - system_messages = [m for m in messages if m.role == MessageRole.system] - system_texts = [m.text for m in system_messages] - - # If there are multiple system messages, print the diff - if len(system_messages) > 1: - print("Differences between system messages:") - for i in range(len(system_texts) - 1): - for j in range(i + 1, len(system_texts)): - import difflib - - diff = difflib.unified_diff( - system_texts[i].splitlines(), - system_texts[j].splitlines(), - fromfile=f"System Message {i+1}", - tofile=f"System Message {j+1}", - lineterm="", - ) - print("\n".join(diff)) - else: - print("There is only one or no system message.") + print(f"Messages: {len(messages)}, LettaMessages: {len(letta_messages)}") letta_message_index = 0 for i, message in enumerate(messages): assert isinstance(message, Message) - print(f"\n\nmessage {i}: {message.role}, {message.text[:50] if message.text else 'null'}") + # Defensive bounds check for letta_messages + if letta_message_index >= len(letta_messages): + print(f"Error: letta_message_index out of range. Expected more letta_messages for message {i}: {message.role}") + raise ValueError(f"Mismatch in letta_messages length. Index: {letta_message_index}, Length: {len(letta_messages)}") + + print(f"Processing message {i}: {message.role}, {message.text[:50] if message.text else 'null'}") while letta_message_index < len(letta_messages): letta_message = letta_messages[letta_message_index] - print(f"letta_message {letta_message_index}: {str(letta_message)[:50]}") + # Validate mappings for assistant role if message.role == MessageRole.assistant: - print(f"i={i}, M=assistant, MM={type(letta_message)}") + print(f"Assistant Message at {i}: {type(letta_message)}") - # If reverse, function call will come first if reverse: - - # If there are multiple tool calls, we should have multiple back to back FunctionCallMessages - if message.tool_calls is not None: + # Reverse handling: FunctionCallMessages come first + if message.tool_calls: for tool_call in message.tool_calls: - - # Try to parse the tool call args try: json.loads(tool_call.function.arguments) - except: - warnings.warn(f"Function call arguments are not valid JSON: {tool_call.function.arguments}") - + except json.JSONDecodeError: + warnings.warn(f"Invalid JSON in function arguments: {tool_call.function.arguments}") assert isinstance(letta_message, FunctionCallMessage) letta_message_index += 1 + if letta_message_index >= len(letta_messages): + break letta_message = letta_messages[letta_message_index] - if message.text is not None: + if message.text: assert isinstance(letta_message, InternalMonologue) letta_message_index += 1 - letta_message = letta_messages[letta_message_index] else: - # If there's no inner thoughts then there needs to be a tool call assert message.tool_calls is not None - else: - - if message.text is not None: + else: # Non-reverse handling + if message.text: assert isinstance(letta_message, InternalMonologue) letta_message_index += 1 + if letta_message_index >= len(letta_messages): + break letta_message = letta_messages[letta_message_index] - else: - # If there's no inner thoughts then there needs to be a tool call - assert message.tool_calls is not None - # If there are multiple tool calls, we should have multiple back to back FunctionCallMessages - if message.tool_calls is not None: + if message.tool_calls: for tool_call in message.tool_calls: - - # Try to parse the tool call args try: json.loads(tool_call.function.arguments) - except: - warnings.warn(f"Function call arguments are not valid JSON: {tool_call.function.arguments}") - + except json.JSONDecodeError: + warnings.warn(f"Invalid JSON in function arguments: {tool_call.function.arguments}") assert isinstance(letta_message, FunctionCallMessage) assert tool_call.function.name == letta_message.function_call.name assert tool_call.function.arguments == letta_message.function_call.arguments letta_message_index += 1 + if letta_message_index >= len(letta_messages): + break letta_message = letta_messages[letta_message_index] elif message.role == MessageRole.user: - print(f"i={i}, M=user, MM={type(letta_message)}") assert isinstance(letta_message, UserMessage) assert message.text == letta_message.message letta_message_index += 1 elif message.role == MessageRole.system: - print(f"i={i}, M=system, MM={type(letta_message)}") assert isinstance(letta_message, SystemMessage) assert message.text == letta_message.message letta_message_index += 1 elif message.role == MessageRole.tool: - print(f"i={i}, M=tool, MM={type(letta_message)}") assert isinstance(letta_message, FunctionReturn) - # Check the the value in `text` is the same assert message.text == letta_message.function_return letta_message_index += 1 else: raise ValueError(f"Unexpected message role: {message.role}") - # Move to the next message in the original messages list - break + break # Exit the letta_messages loop after processing one mapping + + if letta_message_index < len(letta_messages): + warnings.warn(f"Extra letta_messages found: {len(letta_messages) - letta_message_index}") def test_get_messages_letta_format(server, user_id, agent_id): - for reverse in [False, True]: + # for reverse in [False, True]: + for reverse in [False]: _test_get_messages_letta_format(server, user_id, agent_id, reverse=reverse) @@ -586,7 +540,7 @@ def ingest(message: str): ''' -def test_tool_run(server, user_id, agent_id): +def test_tool_run(server, mock_e2b_api_key_none, user_id, agent_id): """Test that the server can run tools""" result = server.run_tool_from_source( @@ -672,7 +626,7 @@ def test_composio_client_simple(server): assert len(actions) > 0 -def test_memory_rebuild_count(server, user_id): +def test_memory_rebuild_count(server, user_id, mock_e2b_api_key_none): """Test that the memory rebuild is generating the correct number of role=system messages""" # create agent @@ -712,7 +666,6 @@ def count_system_messages_in_recall() -> Tuple[int, List[LettaMessage]]: return len(system_messages), letta_messages try: - # At this stage, there should only be 1 system message inside of recall storage num_system_messages, all_messages = count_system_messages_in_recall() # assert num_system_messages == 1, (num_system_messages, all_messages) diff --git a/tests/test_storage.py b/tests/test_storage.py deleted file mode 100644 index 1726e91279..0000000000 --- a/tests/test_storage.py +++ /dev/null @@ -1,318 +0,0 @@ -# TODO: add back post DB refactor - -# import os -# import uuid -# from datetime import datetime, timedelta -# -# import pytest -# from sqlalchemy.ext.declarative import declarative_base -# -# from letta.agent_store.storage import StorageConnector, TableType -# from letta.config import LettaConfig -# from letta.constants import BASE_TOOLS, MAX_EMBEDDING_DIM -# from letta.credentials import LettaCredentials -# from letta.embeddings import embedding_model, query_embedding -# from letta.metadata import MetadataStore -# from letta.settings import settings -# from tests import TEST_MEMGPT_CONFIG -# from tests.utils import create_config, wipe_config -# -# from .utils import with_qdrant_storage -# -# from letta.schemas.agent import AgentState -# from letta.schemas.message import Message -# from letta.schemas.passage import Passage -# from letta.schemas.user import User -# -# -## Note: the database will filter out rows that do not correspond to agent1 and test_user by default. -# texts = ["This is a test passage", "This is another test passage", "Cinderella wept"] -# start_date = datetime(2009, 10, 5, 18, 00) -# dates = [start_date, start_date - timedelta(weeks=1), start_date + timedelta(weeks=1)] -# roles = ["user", "assistant", "assistant"] -# agent_1_id = uuid.uuid4() -# agent_2_id = uuid.uuid4() -# agent_ids = [agent_1_id, agent_2_id, agent_1_id] -# ids = [uuid.uuid4(), uuid.uuid4(), uuid.uuid4()] -# user_id = uuid.uuid4() -# -# -## Data generation functions: Passages -# def generate_passages(embed_model): -# """Generate list of 3 Passage objects""" -# # embeddings: use openai if env is set, otherwise local -# passages = [] -# for text, _, _, agent_id, id in zip(texts, dates, roles, agent_ids, ids): -# embedding, embedding_model, embedding_dim = None, None, None -# if embed_model: -# embedding = embed_model.get_text_embedding(text) -# embedding_model = "gpt-4" -# embedding_dim = len(embedding) -# passages.append( -# Passage( -# user_id=user_id, -# text=text, -# agent_id=agent_id, -# embedding=embedding, -# data_source="test_source", -# id=id, -# embedding_dim=embedding_dim, -# embedding_model=embedding_model, -# ) -# ) -# return passages -# -# -## Data generation functions: Messages -# def generate_messages(embed_model): -# """Generate list of 3 Message objects""" -# messages = [] -# for text, date, role, agent_id, id in zip(texts, dates, roles, agent_ids, ids): -# embedding, embedding_model, embedding_dim = None, None, None -# if embed_model: -# embedding = embed_model.get_text_embedding(text) -# embedding_model = "gpt-4" -# embedding_dim = len(embedding) -# messages.append( -# Message( -# user_id=user_id, -# text=text, -# agent_id=agent_id, -# role=role, -# created_at=date, -# id=id, -# model="gpt-4", -# embedding=embedding, -# embedding_model=embedding_model, -# embedding_dim=embedding_dim, -# ) -# ) -# print(messages[-1].text) -# return messages -# -# -# @pytest.fixture(autouse=True) -# def clear_dynamically_created_models(): -# """Wipe globals for SQLAlchemy""" -# yield -# for key in list(globals().keys()): -# if key.endswith("Model"): -# del globals()[key] -# -# -# @pytest.fixture(autouse=True) -# def recreate_declarative_base(): -# """Recreate the declarative base before each test""" -# global Base -# Base = declarative_base() -# yield -# Base.metadata.clear() -# -# -# @pytest.mark.parametrize("storage_connector", with_qdrant_storage(["postgres", "chroma", "sqlite", "milvus"])) -## @pytest.mark.parametrize("storage_connector", ["sqlite", "chroma"]) -## @pytest.mark.parametrize("storage_connector", ["postgres"]) -# @pytest.mark.parametrize("table_type", [TableType.RECALL_MEMORY, TableType.ARCHIVAL_MEMORY]) -# def test_storage( -# storage_connector, -# table_type, -# clear_dynamically_created_models, -# recreate_declarative_base, -# ): -# # setup letta config -# # TODO: set env for different config path -# -# # hacky way to cleanup globals that scruw up tests -# # for table_name in ['Message']: -# # if 'Message' in globals(): -# # print("Removing messages", globals()['Message']) -# # del globals()['Message'] -# -# wipe_config() -# if os.getenv("OPENAI_API_KEY"): -# create_config("openai") -# credentials = LettaCredentials( -# openai_key=os.getenv("OPENAI_API_KEY"), -# ) -# else: # hosted -# create_config("letta_hosted") -# LettaCredentials() -# -# config = LettaConfig.load() -# TEST_MEMGPT_CONFIG.default_embedding_config = config.default_embedding_config -# TEST_MEMGPT_CONFIG.default_llm_config = config.default_llm_config -# -# if storage_connector == "postgres": -# TEST_MEMGPT_CONFIG.archival_storage_uri = settings.letta_pg_uri -# TEST_MEMGPT_CONFIG.recall_storage_uri = settings.letta_pg_uri -# TEST_MEMGPT_CONFIG.archival_storage_type = "postgres" -# TEST_MEMGPT_CONFIG.recall_storage_type = "postgres" -# if storage_connector == "lancedb": -# # TODO: complete lancedb implementation -# if not os.getenv("LANCEDB_TEST_URL"): -# print("Skipping test, missing LanceDB URI") -# return -# TEST_MEMGPT_CONFIG.archival_storage_uri = os.environ["LANCEDB_TEST_URL"] -# TEST_MEMGPT_CONFIG.recall_storage_uri = os.environ["LANCEDB_TEST_URL"] -# TEST_MEMGPT_CONFIG.archival_storage_type = "lancedb" -# TEST_MEMGPT_CONFIG.recall_storage_type = "lancedb" -# if storage_connector == "chroma": -# if table_type == TableType.RECALL_MEMORY: -# print("Skipping test, chroma only supported for archival memory") -# return -# TEST_MEMGPT_CONFIG.archival_storage_type = "chroma" -# TEST_MEMGPT_CONFIG.archival_storage_path = "./test_chroma" -# if storage_connector == "sqlite": -# if table_type == TableType.ARCHIVAL_MEMORY: -# print("Skipping test, sqlite only supported for recall memory") -# return -# TEST_MEMGPT_CONFIG.recall_storage_type = "sqlite" -# if storage_connector == "qdrant": -# if table_type == TableType.RECALL_MEMORY: -# print("Skipping test, Qdrant only supports archival memory") -# return -# TEST_MEMGPT_CONFIG.archival_storage_type = "qdrant" -# TEST_MEMGPT_CONFIG.archival_storage_uri = "localhost:6333" -# if storage_connector == "milvus": -# if table_type == TableType.RECALL_MEMORY: -# print("Skipping test, Milvus only supports archival memory") -# return -# TEST_MEMGPT_CONFIG.archival_storage_type = "milvus" -# TEST_MEMGPT_CONFIG.archival_storage_uri = "./milvus.db" -# # get embedding model -# embedding_config = TEST_MEMGPT_CONFIG.default_embedding_config -# embed_model = embedding_model(TEST_MEMGPT_CONFIG.default_embedding_config) -# -# # create user -# ms = MetadataStore(TEST_MEMGPT_CONFIG) -# ms.delete_user(user_id) -# user = User(id=user_id) -# agent = AgentState( -# user_id=user_id, -# name="agent_1", -# id=agent_1_id, -# llm_config=TEST_MEMGPT_CONFIG.default_llm_config, -# embedding_config=TEST_MEMGPT_CONFIG.default_embedding_config, -# system="", -# tools=BASE_TOOLS, -# state={ -# "persona": "", -# "human": "", -# "messages": None, -# }, -# ) -# ms.create_user(user) -# ms.create_agent(agent) -# -# # create storage connector -# conn = StorageConnector.get_storage_connector(table_type, config=TEST_MEMGPT_CONFIG, user_id=user_id, agent_id=agent.id) -# # conn.client.delete_collection(conn.collection.name) # clear out data -# conn.delete_table() -# conn = StorageConnector.get_storage_connector(table_type, config=TEST_MEMGPT_CONFIG, user_id=user_id, agent_id=agent.id) -# -# # generate data -# if table_type == TableType.ARCHIVAL_MEMORY: -# records = generate_passages(embed_model) -# elif table_type == TableType.RECALL_MEMORY: -# records = generate_messages(embed_model) -# else: -# raise NotImplementedError(f"Table type {table_type} not implemented") -# -# # check record dimentions -# print("TABLE TYPE", table_type, type(records[0]), len(records[0].embedding)) -# if embed_model: -# assert len(records[0].embedding) == MAX_EMBEDDING_DIM, f"Expected {MAX_EMBEDDING_DIM}, got {len(records[0].embedding)}" -# assert ( -# records[0].embedding_dim == embedding_config.embedding_dim -# ), f"Expected {embedding_config.embedding_dim}, got {records[0].embedding_dim}" -# -# # test: insert -# conn.insert(records[0]) -# assert conn.size() == 1, f"Expected 1 record, got {conn.size()}: {conn.get_all()}" -# -# # test: insert_many -# conn.insert_many(records[1:]) -# assert ( -# conn.size() == 2 -# ), f"Expected 2 records, got {conn.size()}: {conn.get_all()}" # expect 2, since storage connector filters for agent1 -# -# # test: update -# # NOTE: only testing with messages -# if table_type == TableType.RECALL_MEMORY: -# TEST_STRING = "hello world" -# -# updated_record = records[1] -# updated_record.text = TEST_STRING -# -# current_record = conn.get(id=updated_record.id) -# assert current_record is not None, f"Couldn't find {updated_record.id}" -# assert current_record.text != TEST_STRING, (current_record.text, TEST_STRING) -# -# conn.update(updated_record) -# new_record = conn.get(id=updated_record.id) -# assert new_record is not None, f"Couldn't find {updated_record.id}" -# assert new_record.text == TEST_STRING, (new_record.text, TEST_STRING) -# -# # test: list_loaded_data -# # TODO: add back -# # if table_type == TableType.ARCHIVAL_MEMORY: -# # sources = StorageConnector.list_loaded_data(storage_type=storage_connector) -# # assert len(sources) == 1, f"Expected 1 source, got {len(sources)}" -# # assert sources[0] == "test_source", f"Expected 'test_source', got {sources[0]}" -# -# # test: get_all_paginated -# paginated_total = 0 -# for page in conn.get_all_paginated(page_size=1): -# paginated_total += len(page) -# assert paginated_total == 2, f"Expected 2 records, got {paginated_total}" -# -# # test: get_all -# all_records = conn.get_all() -# assert len(all_records) == 2, f"Expected 2 records, got {len(all_records)}" -# all_records = conn.get_all(limit=1) -# assert len(all_records) == 1, f"Expected 1 records, got {len(all_records)}" -# -# # test: get -# print("GET ID", ids[0], records) -# res = conn.get(id=ids[0]) -# assert res.text == texts[0], f"Expected {texts[0]}, got {res.text}" -# -# # test: size -# assert conn.size() == 2, f"Expected 2 records, got {conn.size()}" -# assert conn.size(filters={"agent_id": agent.id}) == 2, f"Expected 2 records, got {conn.size(filters={'agent_id', agent.id})}" -# if table_type == TableType.RECALL_MEMORY: -# assert conn.size(filters={"role": "user"}) == 1, f"Expected 1 record, got {conn.size(filters={'role': 'user'})}" -# -# # test: query (vector) -# if table_type == TableType.ARCHIVAL_MEMORY: -# query = "why was she crying" -# query_vec = query_embedding(embed_model, query) -# res = conn.query(None, query_vec, top_k=2) -# assert len(res) == 2, f"Expected 2 results, got {len(res)}" -# print("Archival memory results", res) -# assert "wept" in res[0].text, f"Expected 'wept' in results, but got {res[0].text}" -# -# # test optional query functions for recall memory -# if table_type == TableType.RECALL_MEMORY: -# # test: query_text -# query = "CindereLLa" -# res = conn.query_text(query) -# assert len(res) == 1, f"Expected 1 result, got {len(res)}" -# assert "Cinderella" in res[0].text, f"Expected 'Cinderella' in results, but got {res[0].text}" -# -# # test: query_date (recall memory only) -# print("Testing recall memory date search") -# start_date = datetime(2009, 10, 5, 18, 00) -# start_date = start_date - timedelta(days=1) -# end_date = start_date + timedelta(days=1) -# res = conn.query_date(start_date=start_date, end_date=end_date) -# print("DATE", res) -# assert len(res) == 1, f"Expected 1 result, got {len(res)}: {res}" -# -# # test: delete -# conn.delete({"id": ids[0]}) -# assert conn.size() == 1, f"Expected 2 records, got {conn.size()}" -# -# # cleanup -# ms.delete_user(user_id) -# diff --git a/tests/test_summarize.py b/tests/test_summarize.py index 90499d5fb3..4bf180e108 100644 --- a/tests/test_summarize.py +++ b/tests/test_summarize.py @@ -1,14 +1,11 @@ import uuid from typing import List -import pytest - from letta import create_client from letta.client.client import LocalClient from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.llm_config import LLMConfig from letta.schemas.message import Message -from letta.settings import tool_settings from .utils import wipe_config @@ -21,21 +18,6 @@ # TODO: these tests should add function calls into the summarized message sequence:W -@pytest.fixture -def mock_e2b_api_key_none(): - # Store the original value of e2b_api_key - original_api_key = tool_settings.e2b_api_key - - # Set e2b_api_key to None - tool_settings.e2b_api_key = None - - # Yield control to the test - yield - - # Restore the original value of e2b_api_key - tool_settings.e2b_api_key = original_api_key - - def create_test_agent(): """Create a test agent that we can call functions on""" wipe_config() From 48f38e6286b87270aa0041da0f833b39e96f5b51 Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Fri, 6 Dec 2024 13:04:31 -0800 Subject: [PATCH 027/280] feat: added new workflow to warn about poetry diffs (#2179) --- .github/workflows/warn_poetry_updates.yml | 63 +++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 .github/workflows/warn_poetry_updates.yml diff --git a/.github/workflows/warn_poetry_updates.yml b/.github/workflows/warn_poetry_updates.yml new file mode 100644 index 0000000000..74478c9943 --- /dev/null +++ b/.github/workflows/warn_poetry_updates.yml @@ -0,0 +1,63 @@ +name: Check Poetry Dependencies Changes + +on: + pull_request: + paths: + - 'poetry.lock' + - 'pyproject.toml' + +jobs: + check-poetry-changes: + runs-on: ubuntu-latest + permissions: + pull-requests: write + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Check for poetry.lock changes + id: check-poetry-lock + run: | + if git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ github.event.pull_request.head.sha }} | grep -q "poetry.lock"; then + echo "poetry_lock_changed=true" >> $GITHUB_OUTPUT + else + echo "poetry_lock_changed=false" >> $GITHUB_OUTPUT + fi + + - name: Check for pyproject.toml changes + id: check-pyproject + run: | + if git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ github.event.pull_request.head.sha }} | grep -q "pyproject.toml"; then + echo "pyproject_changed=true" >> $GITHUB_OUTPUT + else + echo "pyproject_changed=false" >> $GITHUB_OUTPUT + fi + + - name: Create PR comment + if: steps.check-poetry-lock.outputs.poetry_lock_changed == 'true' || steps.check-pyproject.outputs.pyproject_changed == 'true' + uses: actions/github-script@v7 + with: + script: | + const poetryLockChanged = ${{ steps.check-poetry-lock.outputs.poetry_lock_changed }}; + const pyprojectChanged = ${{ steps.check-pyproject.outputs.pyproject_changed }}; + + let message = '📦 Dependencies Alert:\n\n'; + + if (poetryLockChanged && pyprojectChanged) { + message += '- Both `poetry.lock` and `pyproject.toml` have been modified\n'; + } else if (poetryLockChanged) { + message += '- `poetry.lock` has been modified\n'; + } else if (pyprojectChanged) { + message += '- `pyproject.toml` has been modified\n'; + } + + message += '\nPlease review these changes carefully to ensure they are intended (cc @sarahwooders @cpacker).'; + + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: message + }); From d0ad9bddd9ada11dab0a3e36fd94d4ee51ec0297 Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Fri, 6 Dec 2024 13:05:30 -0800 Subject: [PATCH 028/280] fix: fix runtime warnings with the server (#2178) --- letta/server/rest_api/routers/v1/agents.py | 2 +- letta/server/rest_api/routers/v1/blocks.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index 6a583c3a3c..20661ef9b7 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -465,7 +465,7 @@ async def send_message( @router.post( "/{agent_id}/messages/stream", response_model=None, - operation_id="create_agent_message", + operation_id="create_agent_message_stream", responses={ 200: { "description": "Successful response", diff --git a/letta/server/rest_api/routers/v1/blocks.py b/letta/server/rest_api/routers/v1/blocks.py index 798e7aa4ac..f58172d6f2 100644 --- a/letta/server/rest_api/routers/v1/blocks.py +++ b/letta/server/rest_api/routers/v1/blocks.py @@ -76,7 +76,7 @@ def get_block( raise HTTPException(status_code=404, detail="Block not found") -@router.patch("/{block_id}/attach", response_model=Block, operation_id="update_agent_memory_block") +@router.patch("/{block_id}/attach", response_model=Block, operation_id="link_agent_memory_block") def link_agent_memory_block( block_id: str, agent_id: str = Query(..., description="The unique identifier of the agent to attach the source to."), @@ -96,7 +96,7 @@ def link_agent_memory_block( return block -@router.patch("/{block_id}/detach", response_model=Memory, operation_id="update_agent_memory_block") +@router.patch("/{block_id}/detach", response_model=Memory, operation_id="unlink_agent_memory_block") def unlink_agent_memory_block( block_id: str, agent_id: str = Query(..., description="The unique identifier of the agent to attach the source to."), From b7105a2e375a45e8a636274b1b9e9a6a1883819b Mon Sep 17 00:00:00 2001 From: Shubham Naik Date: Fri, 6 Dec 2024 19:56:02 -0800 Subject: [PATCH 029/280] chore: add new ui (#2182) Co-authored-by: Shubham Naik --- .../static_files/assets/index-1b5d1a41.js | 271 ------------------ .../static_files/assets/index-43ab4d62.css | 1 + .../static_files/assets/index-4848e3d7.js | 40 +++ .../static_files/assets/index-56a3f8c6.css | 1 - letta/server/static_files/index.html | 4 +- 5 files changed, 43 insertions(+), 274 deletions(-) delete mode 100644 letta/server/static_files/assets/index-1b5d1a41.js create mode 100644 letta/server/static_files/assets/index-43ab4d62.css create mode 100644 letta/server/static_files/assets/index-4848e3d7.js delete mode 100644 letta/server/static_files/assets/index-56a3f8c6.css diff --git a/letta/server/static_files/assets/index-1b5d1a41.js b/letta/server/static_files/assets/index-1b5d1a41.js deleted file mode 100644 index 076048c044..0000000000 --- a/letta/server/static_files/assets/index-1b5d1a41.js +++ /dev/null @@ -1,271 +0,0 @@ -var qh=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)};var $=(e,t,n)=>(qh(e,t,"read from private field"),n?n.call(e):t.get(e)),xe=(e,t,n)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,n)},me=(e,t,n,r)=>(qh(e,t,"write to private field"),r?r.call(e,n):t.set(e,n),n),Tf=(e,t,n,r)=>({set _(a){me(e,t,a,n)},get _(){return $(e,t,r)}}),Ue=(e,t,n)=>(qh(e,t,"access private method"),n);function yP(e,t){for(var n=0;nr[a]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))r(a);new MutationObserver(a=>{for(const o of a)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function n(a){const o={};return a.integrity&&(o.integrity=a.integrity),a.referrerPolicy&&(o.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?o.credentials="include":a.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(a){if(a.ep)return;a.ep=!0;const o=n(a);fetch(a.href,o)}})();var nn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Tc(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var vP={exports:{}},pm={},SP={exports:{}},at={};/** - * @license React - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Wd=Symbol.for("react.element"),rB=Symbol.for("react.portal"),aB=Symbol.for("react.fragment"),oB=Symbol.for("react.strict_mode"),iB=Symbol.for("react.profiler"),sB=Symbol.for("react.provider"),lB=Symbol.for("react.context"),cB=Symbol.for("react.forward_ref"),uB=Symbol.for("react.suspense"),dB=Symbol.for("react.memo"),fB=Symbol.for("react.lazy"),oT=Symbol.iterator;function pB(e){return e===null||typeof e!="object"?null:(e=oT&&e[oT]||e["@@iterator"],typeof e=="function"?e:null)}var wP={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},EP=Object.assign,xP={};function Rc(e,t,n){this.props=e,this.context=t,this.refs=xP,this.updater=n||wP}Rc.prototype.isReactComponent={};Rc.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};Rc.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function kP(){}kP.prototype=Rc.prototype;function Qk(e,t,n){this.props=e,this.context=t,this.refs=xP,this.updater=n||wP}var Jk=Qk.prototype=new kP;Jk.constructor=Qk;EP(Jk,Rc.prototype);Jk.isPureReactComponent=!0;var iT=Array.isArray,CP=Object.prototype.hasOwnProperty,eC={current:null},_P={key:!0,ref:!0,__self:!0,__source:!0};function AP(e,t,n){var r,a={},o=null,i=null;if(t!=null)for(r in t.ref!==void 0&&(i=t.ref),t.key!==void 0&&(o=""+t.key),t)CP.call(t,r)&&!_P.hasOwnProperty(r)&&(a[r]=t[r]);var s=arguments.length-2;if(s===1)a.children=n;else if(1>>1,P=j[V];if(0>>1;Va(ae,A))nea(Q,ae)?(j[V]=Q,j[ne]=A,V=ne):(j[V]=ae,j[K]=A,V=K);else if(nea(Q,A))j[V]=Q,j[ne]=A,V=ne;else break e}}return O}function a(j,O){var A=j.sortIndex-O.sortIndex;return A!==0?A:j.id-O.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var i=Date,s=i.now();e.unstable_now=function(){return i.now()-s}}var l=[],c=[],u=1,d=null,g=3,m=!1,b=!1,y=!1,w=typeof setTimeout=="function"?setTimeout:null,v=typeof clearTimeout=="function"?clearTimeout:null,h=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function S(j){for(var O=n(c);O!==null;){if(O.callback===null)r(c);else if(O.startTime<=j)r(c),O.sortIndex=O.expirationTime,t(l,O);else break;O=n(c)}}function E(j){if(y=!1,S(j),!b)if(n(l)!==null)b=!0,U(k);else{var O=n(c);O!==null&&X(E,O.startTime-j)}}function k(j,O){b=!1,y&&(y=!1,v(_),_=-1),m=!0;var A=g;try{for(S(O),d=n(l);d!==null&&(!(d.expirationTime>O)||j&&!L());){var V=d.callback;if(typeof V=="function"){d.callback=null,g=d.priorityLevel;var P=V(d.expirationTime<=O);O=e.unstable_now(),typeof P=="function"?d.callback=P:d===n(l)&&r(l),S(O)}else r(l);d=n(l)}if(d!==null)var N=!0;else{var K=n(c);K!==null&&X(E,K.startTime-O),N=!1}return N}finally{d=null,g=A,m=!1}}var x=!1,C=null,_=-1,R=5,T=-1;function L(){return!(e.unstable_now()-Tj||125V?(j.sortIndex=A,t(c,j),n(l)===null&&j===n(c)&&(y?(v(_),_=-1):y=!0,X(E,A-V))):(j.sortIndex=P,t(l,j),b||m||(b=!0,U(k))),j},e.unstable_shouldYield=L,e.unstable_wrapCallback=function(j){var O=g;return function(){var A=g;g=O;try{return j.apply(this,arguments)}finally{g=A}}}})(IP);NP.exports=IP;var kB=NP.exports;/** - * @license React - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var OP=p,Ar=kB;function ie(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Rx=Object.prototype.hasOwnProperty,CB=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,lT={},cT={};function _B(e){return Rx.call(cT,e)?!0:Rx.call(lT,e)?!1:CB.test(e)?cT[e]=!0:(lT[e]=!0,!1)}function AB(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function TB(e,t,n,r){if(t===null||typeof t>"u"||AB(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function er(e,t,n,r,a,o,i){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=a,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=i}var Cn={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){Cn[e]=new er(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];Cn[t]=new er(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){Cn[e]=new er(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){Cn[e]=new er(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){Cn[e]=new er(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){Cn[e]=new er(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){Cn[e]=new er(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){Cn[e]=new er(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){Cn[e]=new er(e,5,!1,e.toLowerCase(),null,!1,!1)});var nC=/[\-:]([a-z])/g;function rC(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(nC,rC);Cn[t]=new er(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(nC,rC);Cn[t]=new er(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(nC,rC);Cn[t]=new er(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){Cn[e]=new er(e,1,!1,e.toLowerCase(),null,!1,!1)});Cn.xlinkHref=new er("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){Cn[e]=new er(e,1,!1,e.toLowerCase(),null,!0,!0)});function aC(e,t,n,r){var a=Cn.hasOwnProperty(t)?Cn[t]:null;(a!==null?a.type!==0:r||!(2s||a[i]!==o[s]){var l=` -`+a[i].replace(" at new "," at ");return e.displayName&&l.includes("")&&(l=l.replace("",e.displayName)),l}while(1<=i&&0<=s);break}}}finally{Kh=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?wu(e):""}function RB(e){switch(e.tag){case 5:return wu(e.type);case 16:return wu("Lazy");case 13:return wu("Suspense");case 19:return wu("SuspenseList");case 0:case 2:case 15:return e=Yh(e.type,!1),e;case 11:return e=Yh(e.type.render,!1),e;case 1:return e=Yh(e.type,!0),e;default:return""}}function Dx(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case yl:return"Fragment";case bl:return"Portal";case Nx:return"Profiler";case oC:return"StrictMode";case Ix:return"Suspense";case Ox:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case MP:return(e.displayName||"Context")+".Consumer";case LP:return(e._context.displayName||"Context")+".Provider";case iC:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case sC:return t=e.displayName||null,t!==null?t:Dx(e.type)||"Memo";case qo:t=e._payload,e=e._init;try{return Dx(e(t))}catch{}}return null}function NB(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Dx(t);case 8:return t===oC?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function vi(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function $P(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function IB(e){var t=$P(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var a=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return a.call(this)},set:function(i){r=""+i,o.call(this,i)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(i){r=""+i},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function If(e){e._valueTracker||(e._valueTracker=IB(e))}function FP(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=$P(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function eg(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Lx(e,t){var n=t.checked;return Ut({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function dT(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=vi(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function jP(e,t){t=t.checked,t!=null&&aC(e,"checked",t,!1)}function Mx(e,t){jP(e,t);var n=vi(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Px(e,t.type,n):t.hasOwnProperty("defaultValue")&&Px(e,t.type,vi(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function fT(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function Px(e,t,n){(t!=="number"||eg(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var Eu=Array.isArray;function Ll(e,t,n,r){if(e=e.options,t){t={};for(var a=0;a"+t.valueOf().toString()+"",t=Of.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Qu(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Iu={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},OB=["Webkit","ms","Moz","O"];Object.keys(Iu).forEach(function(e){OB.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Iu[t]=Iu[e]})});function HP(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Iu.hasOwnProperty(e)&&Iu[e]?(""+t).trim():t+"px"}function VP(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,a=HP(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,a):e[n]=a}}var DB=Ut({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function jx(e,t){if(t){if(DB[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(ie(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(ie(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(ie(61))}if(t.style!=null&&typeof t.style!="object")throw Error(ie(62))}}function zx(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Ux=null;function lC(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Bx=null,Ml=null,Pl=null;function mT(e){if(e=Xd(e)){if(typeof Bx!="function")throw Error(ie(280));var t=e.stateNode;t&&(t=ym(t),Bx(e.stateNode,e.type,t))}}function qP(e){Ml?Pl?Pl.push(e):Pl=[e]:Ml=e}function GP(){if(Ml){var e=Ml,t=Pl;if(Pl=Ml=null,mT(e),t)for(e=0;e>>=0,e===0?32:31-(VB(e)/qB|0)|0}var Df=64,Lf=4194304;function xu(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function ag(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,a=e.suspendedLanes,o=e.pingedLanes,i=n&268435455;if(i!==0){var s=i&~a;s!==0?r=xu(s):(o&=i,o!==0&&(r=xu(o)))}else i=n&~a,i!==0?r=xu(i):o!==0&&(r=xu(o));if(r===0)return 0;if(t!==0&&t!==r&&!(t&a)&&(a=r&-r,o=t&-t,a>=o||a===16&&(o&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function Yd(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-da(t),e[t]=n}function YB(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=Du),kT=String.fromCharCode(32),CT=!1;function f$(e,t){switch(e){case"keyup":return xH.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function p$(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var vl=!1;function CH(e,t){switch(e){case"compositionend":return p$(t);case"keypress":return t.which!==32?null:(CT=!0,kT);case"textInput":return e=t.data,e===kT&&CT?null:e;default:return null}}function _H(e,t){if(vl)return e==="compositionend"||!hC&&f$(e,t)?(e=u$(),Rp=pC=ai=null,vl=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=RT(n)}}function b$(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?b$(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function y$(){for(var e=window,t=eg();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=eg(e.document)}return t}function bC(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function MH(e){var t=y$(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&b$(n.ownerDocument.documentElement,n)){if(r!==null&&bC(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var a=n.textContent.length,o=Math.min(r.start,a);r=r.end===void 0?o:Math.min(r.end,a),!e.extend&&o>r&&(a=r,r=o,o=a),a=NT(n,o);var i=NT(n,r);a&&i&&(e.rangeCount!==1||e.anchorNode!==a.node||e.anchorOffset!==a.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&(t=t.createRange(),t.setStart(a.node,a.offset),e.removeAllRanges(),o>r?(e.addRange(t),e.extend(i.node,i.offset)):(t.setEnd(i.node,i.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,Sl=null,Kx=null,Mu=null,Yx=!1;function IT(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Yx||Sl==null||Sl!==eg(r)||(r=Sl,"selectionStart"in r&&bC(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Mu&&ad(Mu,r)||(Mu=r,r=sg(Kx,"onSelect"),0xl||(e.current=t1[xl],t1[xl]=null,xl--)}function At(e,t){xl++,t1[xl]=e.current,e.current=t}var Si={},jn=Ii(Si),sr=Ii(!1),Ss=Si;function lc(e,t){var n=e.type.contextTypes;if(!n)return Si;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var a={},o;for(o in n)a[o]=t[o];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=a),a}function lr(e){return e=e.childContextTypes,e!=null}function cg(){Dt(sr),Dt(jn)}function FT(e,t,n){if(jn.current!==Si)throw Error(ie(168));At(jn,t),At(sr,n)}function A$(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var a in r)if(!(a in t))throw Error(ie(108,NB(e)||"Unknown",a));return Ut({},n,r)}function ug(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Si,Ss=jn.current,At(jn,e),At(sr,sr.current),!0}function jT(e,t,n){var r=e.stateNode;if(!r)throw Error(ie(169));n?(e=A$(e,t,Ss),r.__reactInternalMemoizedMergedChildContext=e,Dt(sr),Dt(jn),At(jn,e)):Dt(sr),At(sr,n)}var ao=null,vm=!1,cb=!1;function T$(e){ao===null?ao=[e]:ao.push(e)}function WH(e){vm=!0,T$(e)}function Oi(){if(!cb&&ao!==null){cb=!0;var e=0,t=vt;try{var n=ao;for(vt=1;e>=i,a-=i,io=1<<32-da(t)+a|n<_?(R=C,C=null):R=C.sibling;var T=g(v,C,S[_],E);if(T===null){C===null&&(C=R);break}e&&C&&T.alternate===null&&t(v,C),h=o(T,h,_),x===null?k=T:x.sibling=T,x=T,C=R}if(_===S.length)return n(v,C),Lt&&Gi(v,_),k;if(C===null){for(;__?(R=C,C=null):R=C.sibling;var L=g(v,C,T.value,E);if(L===null){C===null&&(C=R);break}e&&C&&L.alternate===null&&t(v,C),h=o(L,h,_),x===null?k=L:x.sibling=L,x=L,C=R}if(T.done)return n(v,C),Lt&&Gi(v,_),k;if(C===null){for(;!T.done;_++,T=S.next())T=d(v,T.value,E),T!==null&&(h=o(T,h,_),x===null?k=T:x.sibling=T,x=T);return Lt&&Gi(v,_),k}for(C=r(v,C);!T.done;_++,T=S.next())T=m(C,v,_,T.value,E),T!==null&&(e&&T.alternate!==null&&C.delete(T.key===null?_:T.key),h=o(T,h,_),x===null?k=T:x.sibling=T,x=T);return e&&C.forEach(function(D){return t(v,D)}),Lt&&Gi(v,_),k}function w(v,h,S,E){if(typeof S=="object"&&S!==null&&S.type===yl&&S.key===null&&(S=S.props.children),typeof S=="object"&&S!==null){switch(S.$$typeof){case Nf:e:{for(var k=S.key,x=h;x!==null;){if(x.key===k){if(k=S.type,k===yl){if(x.tag===7){n(v,x.sibling),h=a(x,S.props.children),h.return=v,v=h;break e}}else if(x.elementType===k||typeof k=="object"&&k!==null&&k.$$typeof===qo&>(k)===x.type){n(v,x.sibling),h=a(x,S.props),h.ref=Qc(v,x,S),h.return=v,v=h;break e}n(v,x);break}else t(v,x);x=x.sibling}S.type===yl?(h=bs(S.props.children,v.mode,E,S.key),h.return=v,v=h):(E=$p(S.type,S.key,S.props,null,v.mode,E),E.ref=Qc(v,h,S),E.return=v,v=E)}return i(v);case bl:e:{for(x=S.key;h!==null;){if(h.key===x)if(h.tag===4&&h.stateNode.containerInfo===S.containerInfo&&h.stateNode.implementation===S.implementation){n(v,h.sibling),h=a(h,S.children||[]),h.return=v,v=h;break e}else{n(v,h);break}else t(v,h);h=h.sibling}h=bb(S,v.mode,E),h.return=v,v=h}return i(v);case qo:return x=S._init,w(v,h,x(S._payload),E)}if(Eu(S))return b(v,h,S,E);if(Wc(S))return y(v,h,S,E);Uf(v,S)}return typeof S=="string"&&S!==""||typeof S=="number"?(S=""+S,h!==null&&h.tag===6?(n(v,h.sibling),h=a(h,S),h.return=v,v=h):(n(v,h),h=hb(S,v.mode,E),h.return=v,v=h),i(v)):n(v,h)}return w}var uc=P$(!0),$$=P$(!1),Qd={},La=Ii(Qd),ld=Ii(Qd),cd=Ii(Qd);function ts(e){if(e===Qd)throw Error(ie(174));return e}function _C(e,t){switch(At(cd,t),At(ld,e),At(La,Qd),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:Fx(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=Fx(t,e)}Dt(La),At(La,t)}function dc(){Dt(La),Dt(ld),Dt(cd)}function F$(e){ts(cd.current);var t=ts(La.current),n=Fx(t,e.type);t!==n&&(At(ld,e),At(La,n))}function AC(e){ld.current===e&&(Dt(La),Dt(ld))}var jt=Ii(0);function hg(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data==="$?"||n.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if(t.flags&128)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var ub=[];function TC(){for(var e=0;en?n:4,e(!0);var r=db.transition;db.transition={};try{e(!1),t()}finally{vt=n,db.transition=r}}function e4(){return Yr().memoizedState}function XH(e,t,n){var r=mi(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},t4(e))n4(t,n);else if(n=O$(e,t,n,r),n!==null){var a=Xn();fa(n,e,r,a),r4(n,t,r)}}function QH(e,t,n){var r=mi(e),a={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(t4(e))n4(t,a);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=t.lastRenderedReducer,o!==null))try{var i=t.lastRenderedState,s=o(i,n);if(a.hasEagerState=!0,a.eagerState=s,ha(s,i)){var l=t.interleaved;l===null?(a.next=a,kC(t)):(a.next=l.next,l.next=a),t.interleaved=a;return}}catch{}finally{}n=O$(e,t,a,r),n!==null&&(a=Xn(),fa(n,e,r,a),r4(n,t,r))}}function t4(e){var t=e.alternate;return e===zt||t!==null&&t===zt}function n4(e,t){Pu=bg=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function r4(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,uC(e,n)}}var yg={readContext:Kr,useCallback:Rn,useContext:Rn,useEffect:Rn,useImperativeHandle:Rn,useInsertionEffect:Rn,useLayoutEffect:Rn,useMemo:Rn,useReducer:Rn,useRef:Rn,useState:Rn,useDebugValue:Rn,useDeferredValue:Rn,useTransition:Rn,useMutableSource:Rn,useSyncExternalStore:Rn,useId:Rn,unstable_isNewReconciler:!1},JH={readContext:Kr,useCallback:function(e,t){return xa().memoizedState=[e,t===void 0?null:t],e},useContext:Kr,useEffect:KT,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,Dp(4194308,4,Y$.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Dp(4194308,4,e,t)},useInsertionEffect:function(e,t){return Dp(4,2,e,t)},useMemo:function(e,t){var n=xa();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=xa();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=XH.bind(null,zt,e),[r.memoizedState,e]},useRef:function(e){var t=xa();return e={current:e},t.memoizedState=e},useState:WT,useDebugValue:DC,useDeferredValue:function(e){return xa().memoizedState=e},useTransition:function(){var e=WT(!1),t=e[0];return e=ZH.bind(null,e[1]),xa().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=zt,a=xa();if(Lt){if(n===void 0)throw Error(ie(407));n=n()}else{if(n=t(),hn===null)throw Error(ie(349));Es&30||U$(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,KT(H$.bind(null,r,o,e),[e]),r.flags|=2048,fd(9,B$.bind(null,r,o,n,t),void 0,null),n},useId:function(){var e=xa(),t=hn.identifierPrefix;if(Lt){var n=so,r=io;n=(r&~(1<<32-da(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=ud++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=i.createElement(n,{is:r.is}):(e=i.createElement(n),n==="select"&&(i=e,r.multiple?i.multiple=!0:r.size&&(i.size=r.size))):e=i.createElementNS(e,n),e[Na]=t,e[sd]=r,f4(e,t,!1,!1),t.stateNode=e;e:{switch(i=zx(n,r),n){case"dialog":It("cancel",e),It("close",e),a=r;break;case"iframe":case"object":case"embed":It("load",e),a=r;break;case"video":case"audio":for(a=0;apc&&(t.flags|=128,r=!0,Jc(o,!1),t.lanes=4194304)}else{if(!r)if(e=hg(i),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),Jc(o,!0),o.tail===null&&o.tailMode==="hidden"&&!i.alternate&&!Lt)return Nn(t),null}else 2*Xt()-o.renderingStartTime>pc&&n!==1073741824&&(t.flags|=128,r=!0,Jc(o,!1),t.lanes=4194304);o.isBackwards?(i.sibling=t.child,t.child=i):(n=o.last,n!==null?n.sibling=i:t.child=i,o.last=i)}return o.tail!==null?(t=o.tail,o.rendering=t,o.tail=t.sibling,o.renderingStartTime=Xt(),t.sibling=null,n=jt.current,At(jt,r?n&1|2:n&1),t):(Nn(t),null);case 22:case 23:return jC(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?Sr&1073741824&&(Nn(t),t.subtreeFlags&6&&(t.flags|=8192)):Nn(t),null;case 24:return null;case 25:return null}throw Error(ie(156,t.tag))}function sV(e,t){switch(vC(t),t.tag){case 1:return lr(t.type)&&cg(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return dc(),Dt(sr),Dt(jn),TC(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return AC(t),null;case 13:if(Dt(jt),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(ie(340));cc()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Dt(jt),null;case 4:return dc(),null;case 10:return xC(t.type._context),null;case 22:case 23:return jC(),null;case 24:return null;default:return null}}var Hf=!1,Mn=!1,lV=typeof WeakSet=="function"?WeakSet:Set,Se=null;function Al(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){Gt(e,t,r)}else n.current=null}function p1(e,t,n){try{n()}catch(r){Gt(e,t,r)}}var rR=!1;function cV(e,t){if(Zx=og,e=y$(),bC(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var a=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break e}var i=0,s=-1,l=-1,c=0,u=0,d=e,g=null;t:for(;;){for(var m;d!==n||a!==0&&d.nodeType!==3||(s=i+a),d!==o||r!==0&&d.nodeType!==3||(l=i+r),d.nodeType===3&&(i+=d.nodeValue.length),(m=d.firstChild)!==null;)g=d,d=m;for(;;){if(d===e)break t;if(g===n&&++c===a&&(s=i),g===o&&++u===r&&(l=i),(m=d.nextSibling)!==null)break;d=g,g=d.parentNode}d=m}n=s===-1||l===-1?null:{start:s,end:l}}else n=null}n=n||{start:0,end:0}}else n=null;for(Xx={focusedElem:e,selectionRange:n},og=!1,Se=t;Se!==null;)if(t=Se,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,Se=e;else for(;Se!==null;){t=Se;try{var b=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(b!==null){var y=b.memoizedProps,w=b.memoizedState,v=t.stateNode,h=v.getSnapshotBeforeUpdate(t.elementType===t.type?y:ia(t.type,y),w);v.__reactInternalSnapshotBeforeUpdate=h}break;case 3:var S=t.stateNode.containerInfo;S.nodeType===1?S.textContent="":S.nodeType===9&&S.documentElement&&S.removeChild(S.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(ie(163))}}catch(E){Gt(t,t.return,E)}if(e=t.sibling,e!==null){e.return=t.return,Se=e;break}Se=t.return}return b=rR,rR=!1,b}function $u(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var a=r=r.next;do{if((a.tag&e)===e){var o=a.destroy;a.destroy=void 0,o!==void 0&&p1(t,n,o)}a=a.next}while(a!==r)}}function Em(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function g1(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function m4(e){var t=e.alternate;t!==null&&(e.alternate=null,m4(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Na],delete t[sd],delete t[e1],delete t[qH],delete t[GH])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function h4(e){return e.tag===5||e.tag===3||e.tag===4}function aR(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||h4(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function m1(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=lg));else if(r!==4&&(e=e.child,e!==null))for(m1(e,t,n),e=e.sibling;e!==null;)m1(e,t,n),e=e.sibling}function h1(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(h1(e,t,n),e=e.sibling;e!==null;)h1(e,t,n),e=e.sibling}var xn=null,la=!1;function Oo(e,t,n){for(n=n.child;n!==null;)b4(e,t,n),n=n.sibling}function b4(e,t,n){if(Da&&typeof Da.onCommitFiberUnmount=="function")try{Da.onCommitFiberUnmount(gm,n)}catch{}switch(n.tag){case 5:Mn||Al(n,t);case 6:var r=xn,a=la;xn=null,Oo(e,t,n),xn=r,la=a,xn!==null&&(la?(e=xn,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):xn.removeChild(n.stateNode));break;case 18:xn!==null&&(la?(e=xn,n=n.stateNode,e.nodeType===8?lb(e.parentNode,n):e.nodeType===1&&lb(e,n),nd(e)):lb(xn,n.stateNode));break;case 4:r=xn,a=la,xn=n.stateNode.containerInfo,la=!0,Oo(e,t,n),xn=r,la=a;break;case 0:case 11:case 14:case 15:if(!Mn&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){a=r=r.next;do{var o=a,i=o.destroy;o=o.tag,i!==void 0&&(o&2||o&4)&&p1(n,t,i),a=a.next}while(a!==r)}Oo(e,t,n);break;case 1:if(!Mn&&(Al(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(s){Gt(n,t,s)}Oo(e,t,n);break;case 21:Oo(e,t,n);break;case 22:n.mode&1?(Mn=(r=Mn)||n.memoizedState!==null,Oo(e,t,n),Mn=r):Oo(e,t,n);break;default:Oo(e,t,n)}}function oR(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new lV),t.forEach(function(r){var a=yV.bind(null,e,r);n.has(r)||(n.add(r),r.then(a,a))})}}function aa(e,t){var n=t.deletions;if(n!==null)for(var r=0;ra&&(a=i),r&=~o}if(r=a,r=Xt()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*dV(r/1960))-r,10e?16:e,oi===null)var r=!1;else{if(e=oi,oi=null,wg=0,dt&6)throw Error(ie(331));var a=dt;for(dt|=4,Se=e.current;Se!==null;){var o=Se,i=o.child;if(Se.flags&16){var s=o.deletions;if(s!==null){for(var l=0;lXt()-$C?hs(e,0):PC|=n),cr(e,t)}function C4(e,t){t===0&&(e.mode&1?(t=Lf,Lf<<=1,!(Lf&130023424)&&(Lf=4194304)):t=1);var n=Xn();e=mo(e,t),e!==null&&(Yd(e,t,n),cr(e,n))}function bV(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),C4(e,n)}function yV(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(ie(314))}r!==null&&r.delete(t),C4(e,n)}var _4;_4=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||sr.current)ir=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return ir=!1,oV(e,t,n);ir=!!(e.flags&131072)}else ir=!1,Lt&&t.flags&1048576&&R$(t,fg,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Lp(e,t),e=t.pendingProps;var a=lc(t,jn.current);Fl(t,n),a=NC(null,t,r,e,a,n);var o=IC();return t.flags|=1,typeof a=="object"&&a!==null&&typeof a.render=="function"&&a.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,lr(r)?(o=!0,ug(t)):o=!1,t.memoizedState=a.state!==null&&a.state!==void 0?a.state:null,CC(t),a.updater=Sm,t.stateNode=a,a._reactInternals=t,i1(t,r,e,n),t=c1(null,t,r,!0,o,n)):(t.tag=0,Lt&&o&&yC(t),Kn(null,t,a,n),t=t.child),t;case 16:r=t.elementType;e:{switch(Lp(e,t),e=t.pendingProps,a=r._init,r=a(r._payload),t.type=r,a=t.tag=SV(r),e=ia(r,e),a){case 0:t=l1(null,t,r,e,n);break e;case 1:t=eR(null,t,r,e,n);break e;case 11:t=QT(null,t,r,e,n);break e;case 14:t=JT(null,t,r,ia(r.type,e),n);break e}throw Error(ie(306,r,""))}return t;case 0:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:ia(r,a),l1(e,t,r,a,n);case 1:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:ia(r,a),eR(e,t,r,a,n);case 3:e:{if(c4(t),e===null)throw Error(ie(387));r=t.pendingProps,o=t.memoizedState,a=o.element,D$(e,t),mg(t,r,null,n);var i=t.memoizedState;if(r=i.element,o.isDehydrated)if(o={element:r,isDehydrated:!1,cache:i.cache,pendingSuspenseBoundaries:i.pendingSuspenseBoundaries,transitions:i.transitions},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){a=fc(Error(ie(423)),t),t=tR(e,t,r,n,a);break e}else if(r!==a){a=fc(Error(ie(424)),t),t=tR(e,t,r,n,a);break e}else for(xr=fi(t.stateNode.containerInfo.firstChild),Cr=t,Lt=!0,ua=null,n=$$(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(cc(),r===a){t=ho(e,t,n);break e}Kn(e,t,r,n)}t=t.child}return t;case 5:return F$(t),e===null&&r1(t),r=t.type,a=t.pendingProps,o=e!==null?e.memoizedProps:null,i=a.children,Qx(r,a)?i=null:o!==null&&Qx(r,o)&&(t.flags|=32),l4(e,t),Kn(e,t,i,n),t.child;case 6:return e===null&&r1(t),null;case 13:return u4(e,t,n);case 4:return _C(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=uc(t,null,r,n):Kn(e,t,r,n),t.child;case 11:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:ia(r,a),QT(e,t,r,a,n);case 7:return Kn(e,t,t.pendingProps,n),t.child;case 8:return Kn(e,t,t.pendingProps.children,n),t.child;case 12:return Kn(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,a=t.pendingProps,o=t.memoizedProps,i=a.value,At(pg,r._currentValue),r._currentValue=i,o!==null)if(ha(o.value,i)){if(o.children===a.children&&!sr.current){t=ho(e,t,n);break e}}else for(o=t.child,o!==null&&(o.return=t);o!==null;){var s=o.dependencies;if(s!==null){i=o.child;for(var l=s.firstContext;l!==null;){if(l.context===r){if(o.tag===1){l=co(-1,n&-n),l.tag=2;var c=o.updateQueue;if(c!==null){c=c.shared;var u=c.pending;u===null?l.next=l:(l.next=u.next,u.next=l),c.pending=l}}o.lanes|=n,l=o.alternate,l!==null&&(l.lanes|=n),a1(o.return,n,t),s.lanes|=n;break}l=l.next}}else if(o.tag===10)i=o.type===t.type?null:o.child;else if(o.tag===18){if(i=o.return,i===null)throw Error(ie(341));i.lanes|=n,s=i.alternate,s!==null&&(s.lanes|=n),a1(i,n,t),i=o.sibling}else i=o.child;if(i!==null)i.return=o;else for(i=o;i!==null;){if(i===t){i=null;break}if(o=i.sibling,o!==null){o.return=i.return,i=o;break}i=i.return}o=i}Kn(e,t,a.children,n),t=t.child}return t;case 9:return a=t.type,r=t.pendingProps.children,Fl(t,n),a=Kr(a),r=r(a),t.flags|=1,Kn(e,t,r,n),t.child;case 14:return r=t.type,a=ia(r,t.pendingProps),a=ia(r.type,a),JT(e,t,r,a,n);case 15:return i4(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:ia(r,a),Lp(e,t),t.tag=1,lr(r)?(e=!0,ug(t)):e=!1,Fl(t,n),M$(t,r,a),i1(t,r,a,n),c1(null,t,r,!0,e,n);case 19:return d4(e,t,n);case 22:return s4(e,t,n)}throw Error(ie(156,t.tag))};function A4(e,t){return JP(e,t)}function vV(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Vr(e,t,n,r){return new vV(e,t,n,r)}function UC(e){return e=e.prototype,!(!e||!e.isReactComponent)}function SV(e){if(typeof e=="function")return UC(e)?1:0;if(e!=null){if(e=e.$$typeof,e===iC)return 11;if(e===sC)return 14}return 2}function hi(e,t){var n=e.alternate;return n===null?(n=Vr(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function $p(e,t,n,r,a,o){var i=2;if(r=e,typeof e=="function")UC(e)&&(i=1);else if(typeof e=="string")i=5;else e:switch(e){case yl:return bs(n.children,a,o,t);case oC:i=8,a|=8;break;case Nx:return e=Vr(12,n,t,a|2),e.elementType=Nx,e.lanes=o,e;case Ix:return e=Vr(13,n,t,a),e.elementType=Ix,e.lanes=o,e;case Ox:return e=Vr(19,n,t,a),e.elementType=Ox,e.lanes=o,e;case PP:return km(n,a,o,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case LP:i=10;break e;case MP:i=9;break e;case iC:i=11;break e;case sC:i=14;break e;case qo:i=16,r=null;break e}throw Error(ie(130,e==null?e:typeof e,""))}return t=Vr(i,n,t,a),t.elementType=e,t.type=r,t.lanes=o,t}function bs(e,t,n,r){return e=Vr(7,e,r,t),e.lanes=n,e}function km(e,t,n,r){return e=Vr(22,e,r,t),e.elementType=PP,e.lanes=n,e.stateNode={isHidden:!1},e}function hb(e,t,n){return e=Vr(6,e,null,t),e.lanes=n,e}function bb(e,t,n){return t=Vr(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function wV(e,t,n,r,a){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Xh(0),this.expirationTimes=Xh(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Xh(0),this.identifierPrefix=r,this.onRecoverableError=a,this.mutableSourceEagerHydrationData=null}function BC(e,t,n,r,a,o,i,s,l){return e=new wV(e,t,n,s,l),t===1?(t=1,o===!0&&(t|=8)):t=0,o=Vr(3,null,null,t),e.current=o,o.stateNode=e,o.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},CC(o),e}function EV(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(I4)}catch(e){console.error(e)}}I4(),RP.exports=Rr;var ba=RP.exports;const GC=Tc(ba),AV=yP({__proto__:null,default:GC},[ba]);var O4,pR=ba;O4=pR.createRoot,pR.hydrateRoot;function W(){return W=Object.assign?Object.assign.bind():function(e){for(var t=1;te.forEach(n=>TV(n,t))}function nt(...e){return p.useCallback(WC(...e),e)}function RV(e,t){const n=p.createContext(t);function r(o){const{children:i,...s}=o,l=p.useMemo(()=>s,Object.values(s));return p.createElement(n.Provider,{value:l},i)}function a(o){const i=p.useContext(n);if(i)return i;if(t!==void 0)return t;throw new Error(`\`${o}\` must be used within \`${e}\``)}return r.displayName=e+"Provider",[r,a]}function zn(e,t=[]){let n=[];function r(o,i){const s=p.createContext(i),l=n.length;n=[...n,i];function c(d){const{scope:g,children:m,...b}=d,y=(g==null?void 0:g[e][l])||s,w=p.useMemo(()=>b,Object.values(b));return p.createElement(y.Provider,{value:w},m)}function u(d,g){const m=(g==null?void 0:g[e][l])||s,b=p.useContext(m);if(b)return b;if(i!==void 0)return i;throw new Error(`\`${d}\` must be used within \`${o}\``)}return c.displayName=o+"Provider",[c,u]}const a=()=>{const o=n.map(i=>p.createContext(i));return function(s){const l=(s==null?void 0:s[e])||o;return p.useMemo(()=>({[`__scope${e}`]:{...s,[e]:l}}),[s,l])}};return a.scopeName=e,[r,NV(a,...t)]}function NV(...e){const t=e[0];if(e.length===1)return t;const n=()=>{const r=e.map(a=>({useScope:a(),scopeName:a.scopeName}));return function(o){const i=r.reduce((s,{useScope:l,scopeName:c})=>{const d=l(o)[`__scope${c}`];return{...s,...d}},{});return p.useMemo(()=>({[`__scope${t.scopeName}`]:i}),[i])}};return n.scopeName=t.scopeName,n}const $a=p.forwardRef((e,t)=>{const{children:n,...r}=e,a=p.Children.toArray(n),o=a.find(IV);if(o){const i=o.props.children,s=a.map(l=>l===o?p.Children.count(i)>1?p.Children.only(null):p.isValidElement(i)?i.props.children:null:l);return p.createElement(w1,W({},r,{ref:t}),p.isValidElement(i)?p.cloneElement(i,void 0,s):null)}return p.createElement(w1,W({},r,{ref:t}),n)});$a.displayName="Slot";const w1=p.forwardRef((e,t)=>{const{children:n,...r}=e;return p.isValidElement(n)?p.cloneElement(n,{...OV(r,n.props),ref:t?WC(t,n.ref):n.ref}):p.Children.count(n)>1?p.Children.only(null):null});w1.displayName="SlotClone";const Rm=({children:e})=>p.createElement(p.Fragment,null,e);function IV(e){return p.isValidElement(e)&&e.type===Rm}function OV(e,t){const n={...t};for(const r in t){const a=e[r],o=t[r];/^on[A-Z]/.test(r)?a&&o?n[r]=(...s)=>{o(...s),a(...s)}:a&&(n[r]=a):r==="style"?n[r]={...a,...o}:r==="className"&&(n[r]=[a,o].filter(Boolean).join(" "))}return{...e,...n}}function Nm(e){const t=e+"CollectionProvider",[n,r]=zn(t),[a,o]=n(t,{collectionRef:{current:null},itemMap:new Map}),i=m=>{const{scope:b,children:y}=m,w=Ae.useRef(null),v=Ae.useRef(new Map).current;return Ae.createElement(a,{scope:b,itemMap:v,collectionRef:w},y)},s=e+"CollectionSlot",l=Ae.forwardRef((m,b)=>{const{scope:y,children:w}=m,v=o(s,y),h=nt(b,v.collectionRef);return Ae.createElement($a,{ref:h},w)}),c=e+"CollectionItemSlot",u="data-radix-collection-item",d=Ae.forwardRef((m,b)=>{const{scope:y,children:w,...v}=m,h=Ae.useRef(null),S=nt(b,h),E=o(c,y);return Ae.useEffect(()=>(E.itemMap.set(h,{ref:h,...v}),()=>void E.itemMap.delete(h))),Ae.createElement($a,{[u]:"",ref:S},w)});function g(m){const b=o(e+"CollectionConsumer",m);return Ae.useCallback(()=>{const w=b.collectionRef.current;if(!w)return[];const v=Array.from(w.querySelectorAll(`[${u}]`));return Array.from(b.itemMap.values()).sort((E,k)=>v.indexOf(E.ref.current)-v.indexOf(k.ref.current))},[b.collectionRef,b.itemMap])}return[{Provider:i,Slot:l,ItemSlot:d},g,r]}const DV=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","span","svg","ul"],ze=DV.reduce((e,t)=>{const n=p.forwardRef((r,a)=>{const{asChild:o,...i}=r,s=o?$a:t;return p.useEffect(()=>{window[Symbol.for("radix-ui")]=!0},[]),p.createElement(s,W({},i,{ref:a}))});return n.displayName=`Primitive.${t}`,{...e,[t]:n}},{});function KC(e,t){e&&ba.flushSync(()=>e.dispatchEvent(t))}function ur(e){const t=p.useRef(e);return p.useEffect(()=>{t.current=e}),p.useMemo(()=>(...n)=>{var r;return(r=t.current)===null||r===void 0?void 0:r.call(t,...n)},[])}function LV(e,t=globalThis==null?void 0:globalThis.document){const n=ur(e);p.useEffect(()=>{const r=a=>{a.key==="Escape"&&n(a)};return t.addEventListener("keydown",r),()=>t.removeEventListener("keydown",r)},[n,t])}const E1="dismissableLayer.update",MV="dismissableLayer.pointerDownOutside",PV="dismissableLayer.focusOutside";let gR;const D4=p.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),Ls=p.forwardRef((e,t)=>{var n;const{disableOutsidePointerEvents:r=!1,onEscapeKeyDown:a,onPointerDownOutside:o,onFocusOutside:i,onInteractOutside:s,onDismiss:l,...c}=e,u=p.useContext(D4),[d,g]=p.useState(null),m=(n=d==null?void 0:d.ownerDocument)!==null&&n!==void 0?n:globalThis==null?void 0:globalThis.document,[,b]=p.useState({}),y=nt(t,_=>g(_)),w=Array.from(u.layers),[v]=[...u.layersWithOutsidePointerEventsDisabled].slice(-1),h=w.indexOf(v),S=d?w.indexOf(d):-1,E=u.layersWithOutsidePointerEventsDisabled.size>0,k=S>=h,x=FV(_=>{const R=_.target,T=[...u.branches].some(L=>L.contains(R));!k||T||(o==null||o(_),s==null||s(_),_.defaultPrevented||l==null||l())},m),C=jV(_=>{const R=_.target;[...u.branches].some(L=>L.contains(R))||(i==null||i(_),s==null||s(_),_.defaultPrevented||l==null||l())},m);return LV(_=>{S===u.layers.size-1&&(a==null||a(_),!_.defaultPrevented&&l&&(_.preventDefault(),l()))},m),p.useEffect(()=>{if(d)return r&&(u.layersWithOutsidePointerEventsDisabled.size===0&&(gR=m.body.style.pointerEvents,m.body.style.pointerEvents="none"),u.layersWithOutsidePointerEventsDisabled.add(d)),u.layers.add(d),mR(),()=>{r&&u.layersWithOutsidePointerEventsDisabled.size===1&&(m.body.style.pointerEvents=gR)}},[d,m,r,u]),p.useEffect(()=>()=>{d&&(u.layers.delete(d),u.layersWithOutsidePointerEventsDisabled.delete(d),mR())},[d,u]),p.useEffect(()=>{const _=()=>b({});return document.addEventListener(E1,_),()=>document.removeEventListener(E1,_)},[]),p.createElement(ze.div,W({},c,{ref:y,style:{pointerEvents:E?k?"auto":"none":void 0,...e.style},onFocusCapture:fe(e.onFocusCapture,C.onFocusCapture),onBlurCapture:fe(e.onBlurCapture,C.onBlurCapture),onPointerDownCapture:fe(e.onPointerDownCapture,x.onPointerDownCapture)}))}),$V=p.forwardRef((e,t)=>{const n=p.useContext(D4),r=p.useRef(null),a=nt(t,r);return p.useEffect(()=>{const o=r.current;if(o)return n.branches.add(o),()=>{n.branches.delete(o)}},[n.branches]),p.createElement(ze.div,W({},e,{ref:a}))});function FV(e,t=globalThis==null?void 0:globalThis.document){const n=ur(e),r=p.useRef(!1),a=p.useRef(()=>{});return p.useEffect(()=>{const o=s=>{if(s.target&&!r.current){let u=function(){L4(MV,n,c,{discrete:!0})};var l=u;const c={originalEvent:s};s.pointerType==="touch"?(t.removeEventListener("click",a.current),a.current=u,t.addEventListener("click",a.current,{once:!0})):u()}else t.removeEventListener("click",a.current);r.current=!1},i=window.setTimeout(()=>{t.addEventListener("pointerdown",o)},0);return()=>{window.clearTimeout(i),t.removeEventListener("pointerdown",o),t.removeEventListener("click",a.current)}},[t,n]),{onPointerDownCapture:()=>r.current=!0}}function jV(e,t=globalThis==null?void 0:globalThis.document){const n=ur(e),r=p.useRef(!1);return p.useEffect(()=>{const a=o=>{o.target&&!r.current&&L4(PV,n,{originalEvent:o},{discrete:!1})};return t.addEventListener("focusin",a),()=>t.removeEventListener("focusin",a)},[t,n]),{onFocusCapture:()=>r.current=!0,onBlurCapture:()=>r.current=!1}}function mR(){const e=new CustomEvent(E1);document.dispatchEvent(e)}function L4(e,t,n,{discrete:r}){const a=n.originalEvent.target,o=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&a.addEventListener(e,t,{once:!0}),r?KC(a,o):a.dispatchEvent(o)}const zV=Ls,UV=$V,Jd=p.forwardRef((e,t)=>{var n;const{container:r=globalThis==null||(n=globalThis.document)===null||n===void 0?void 0:n.body,...a}=e;return r?GC.createPortal(p.createElement(ze.div,W({},a,{ref:t})),r):null}),Zr=globalThis!=null&&globalThis.document?p.useLayoutEffect:()=>{};function BV(e,t){return p.useReducer((n,r)=>{const a=t[n][r];return a??n},e)}const pr=e=>{const{present:t,children:n}=e,r=HV(t),a=typeof n=="function"?n({present:r.isPresent}):p.Children.only(n),o=nt(r.ref,a.ref);return typeof n=="function"||r.isPresent?p.cloneElement(a,{ref:o}):null};pr.displayName="Presence";function HV(e){const[t,n]=p.useState(),r=p.useRef({}),a=p.useRef(e),o=p.useRef("none"),i=e?"mounted":"unmounted",[s,l]=BV(i,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return p.useEffect(()=>{const c=Gf(r.current);o.current=s==="mounted"?c:"none"},[s]),Zr(()=>{const c=r.current,u=a.current;if(u!==e){const g=o.current,m=Gf(c);e?l("MOUNT"):m==="none"||(c==null?void 0:c.display)==="none"?l("UNMOUNT"):l(u&&g!==m?"ANIMATION_OUT":"UNMOUNT"),a.current=e}},[e,l]),Zr(()=>{if(t){const c=d=>{const m=Gf(r.current).includes(d.animationName);d.target===t&&m&&ba.flushSync(()=>l("ANIMATION_END"))},u=d=>{d.target===t&&(o.current=Gf(r.current))};return t.addEventListener("animationstart",u),t.addEventListener("animationcancel",c),t.addEventListener("animationend",c),()=>{t.removeEventListener("animationstart",u),t.removeEventListener("animationcancel",c),t.removeEventListener("animationend",c)}}else l("ANIMATION_END")},[t,l]),{isPresent:["mounted","unmountSuspended"].includes(s),ref:p.useCallback(c=>{c&&(r.current=getComputedStyle(c)),n(c)},[])}}function Gf(e){return(e==null?void 0:e.animationName)||"none"}function Fa({prop:e,defaultProp:t,onChange:n=()=>{}}){const[r,a]=VV({defaultProp:t,onChange:n}),o=e!==void 0,i=o?e:r,s=ur(n),l=p.useCallback(c=>{if(o){const d=typeof c=="function"?c(e):c;d!==e&&s(d)}else a(c)},[o,e,a,s]);return[i,l]}function VV({defaultProp:e,onChange:t}){const n=p.useState(e),[r]=n,a=p.useRef(r),o=ur(t);return p.useEffect(()=>{a.current!==r&&(o(r),a.current=r)},[r,a,o]),n}const Im=p.forwardRef((e,t)=>p.createElement(ze.span,W({},e,{ref:t,style:{position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal",...e.style}}))),qV=Im,M4="ToastProvider",[YC,GV,WV]=Nm("Toast"),[P4,JAe]=zn("Toast",[WV]),[KV,Om]=P4(M4),$4=e=>{const{__scopeToast:t,label:n="Notification",duration:r=5e3,swipeDirection:a="right",swipeThreshold:o=50,children:i}=e,[s,l]=p.useState(null),[c,u]=p.useState(0),d=p.useRef(!1),g=p.useRef(!1);return p.createElement(YC.Provider,{scope:t},p.createElement(KV,{scope:t,label:n,duration:r,swipeDirection:a,swipeThreshold:o,toastCount:c,viewport:s,onViewportChange:l,onToastAdd:p.useCallback(()=>u(m=>m+1),[]),onToastRemove:p.useCallback(()=>u(m=>m-1),[]),isFocusedToastEscapeKeyDownRef:d,isClosePausedRef:g},i))};$4.propTypes={label(e){if(e.label&&typeof e.label=="string"&&!e.label.trim()){const t=`Invalid prop \`label\` supplied to \`${M4}\`. Expected non-empty \`string\`.`;return new Error(t)}return null}};const YV="ToastViewport",ZV=["F8"],x1="toast.viewportPause",k1="toast.viewportResume",XV=p.forwardRef((e,t)=>{const{__scopeToast:n,hotkey:r=ZV,label:a="Notifications ({hotkey})",...o}=e,i=Om(YV,n),s=GV(n),l=p.useRef(null),c=p.useRef(null),u=p.useRef(null),d=p.useRef(null),g=nt(t,d,i.onViewportChange),m=r.join("+").replace(/Key/g,"").replace(/Digit/g,""),b=i.toastCount>0;p.useEffect(()=>{const w=v=>{var h;r.every(E=>v[E]||v.code===E)&&((h=d.current)===null||h===void 0||h.focus())};return document.addEventListener("keydown",w),()=>document.removeEventListener("keydown",w)},[r]),p.useEffect(()=>{const w=l.current,v=d.current;if(b&&w&&v){const h=()=>{if(!i.isClosePausedRef.current){const x=new CustomEvent(x1);v.dispatchEvent(x),i.isClosePausedRef.current=!0}},S=()=>{if(i.isClosePausedRef.current){const x=new CustomEvent(k1);v.dispatchEvent(x),i.isClosePausedRef.current=!1}},E=x=>{!w.contains(x.relatedTarget)&&S()},k=()=>{w.contains(document.activeElement)||S()};return w.addEventListener("focusin",h),w.addEventListener("focusout",E),w.addEventListener("pointermove",h),w.addEventListener("pointerleave",k),window.addEventListener("blur",h),window.addEventListener("focus",S),()=>{w.removeEventListener("focusin",h),w.removeEventListener("focusout",E),w.removeEventListener("pointermove",h),w.removeEventListener("pointerleave",k),window.removeEventListener("blur",h),window.removeEventListener("focus",S)}}},[b,i.isClosePausedRef]);const y=p.useCallback(({tabbingDirection:w})=>{const h=s().map(S=>{const E=S.ref.current,k=[E,...pq(E)];return w==="forwards"?k:k.reverse()});return(w==="forwards"?h.reverse():h).flat()},[s]);return p.useEffect(()=>{const w=d.current;if(w){const v=h=>{const S=h.altKey||h.ctrlKey||h.metaKey;if(h.key==="Tab"&&!S){const _=document.activeElement,R=h.shiftKey;if(h.target===w&&R){var k;(k=c.current)===null||k===void 0||k.focus();return}const D=y({tabbingDirection:R?"backwards":"forwards"}),H=D.findIndex(z=>z===_);if(yb(D.slice(H+1)))h.preventDefault();else{var x,C;R?(x=c.current)===null||x===void 0||x.focus():(C=u.current)===null||C===void 0||C.focus()}}};return w.addEventListener("keydown",v),()=>w.removeEventListener("keydown",v)}},[s,y]),p.createElement(UV,{ref:l,role:"region","aria-label":a.replace("{hotkey}",m),tabIndex:-1,style:{pointerEvents:b?void 0:"none"}},b&&p.createElement(hR,{ref:c,onFocusFromOutsideViewport:()=>{const w=y({tabbingDirection:"forwards"});yb(w)}}),p.createElement(YC.Slot,{scope:n},p.createElement(ze.ol,W({tabIndex:-1},o,{ref:g}))),b&&p.createElement(hR,{ref:u,onFocusFromOutsideViewport:()=>{const w=y({tabbingDirection:"backwards"});yb(w)}}))}),QV="ToastFocusProxy",hR=p.forwardRef((e,t)=>{const{__scopeToast:n,onFocusFromOutsideViewport:r,...a}=e,o=Om(QV,n);return p.createElement(Im,W({"aria-hidden":!0,tabIndex:0},a,{ref:t,style:{position:"fixed"},onFocus:i=>{var s;const l=i.relatedTarget;!((s=o.viewport)!==null&&s!==void 0&&s.contains(l))&&r()}}))}),Dm="Toast",JV="toast.swipeStart",eq="toast.swipeMove",tq="toast.swipeCancel",nq="toast.swipeEnd",rq=p.forwardRef((e,t)=>{const{forceMount:n,open:r,defaultOpen:a,onOpenChange:o,...i}=e,[s=!0,l]=Fa({prop:r,defaultProp:a,onChange:o});return p.createElement(pr,{present:n||s},p.createElement(F4,W({open:s},i,{ref:t,onClose:()=>l(!1),onPause:ur(e.onPause),onResume:ur(e.onResume),onSwipeStart:fe(e.onSwipeStart,c=>{c.currentTarget.setAttribute("data-swipe","start")}),onSwipeMove:fe(e.onSwipeMove,c=>{const{x:u,y:d}=c.detail.delta;c.currentTarget.setAttribute("data-swipe","move"),c.currentTarget.style.setProperty("--radix-toast-swipe-move-x",`${u}px`),c.currentTarget.style.setProperty("--radix-toast-swipe-move-y",`${d}px`)}),onSwipeCancel:fe(e.onSwipeCancel,c=>{c.currentTarget.setAttribute("data-swipe","cancel"),c.currentTarget.style.removeProperty("--radix-toast-swipe-move-x"),c.currentTarget.style.removeProperty("--radix-toast-swipe-move-y"),c.currentTarget.style.removeProperty("--radix-toast-swipe-end-x"),c.currentTarget.style.removeProperty("--radix-toast-swipe-end-y")}),onSwipeEnd:fe(e.onSwipeEnd,c=>{const{x:u,y:d}=c.detail.delta;c.currentTarget.setAttribute("data-swipe","end"),c.currentTarget.style.removeProperty("--radix-toast-swipe-move-x"),c.currentTarget.style.removeProperty("--radix-toast-swipe-move-y"),c.currentTarget.style.setProperty("--radix-toast-swipe-end-x",`${u}px`),c.currentTarget.style.setProperty("--radix-toast-swipe-end-y",`${d}px`),l(!1)})})))}),[aq,oq]=P4(Dm,{onClose(){}}),F4=p.forwardRef((e,t)=>{const{__scopeToast:n,type:r="foreground",duration:a,open:o,onClose:i,onEscapeKeyDown:s,onPause:l,onResume:c,onSwipeStart:u,onSwipeMove:d,onSwipeCancel:g,onSwipeEnd:m,...b}=e,y=Om(Dm,n),[w,v]=p.useState(null),h=nt(t,z=>v(z)),S=p.useRef(null),E=p.useRef(null),k=a||y.duration,x=p.useRef(0),C=p.useRef(k),_=p.useRef(0),{onToastAdd:R,onToastRemove:T}=y,L=ur(()=>{var z;(w==null?void 0:w.contains(document.activeElement))&&((z=y.viewport)===null||z===void 0||z.focus()),i()}),D=p.useCallback(z=>{!z||z===1/0||(window.clearTimeout(_.current),x.current=new Date().getTime(),_.current=window.setTimeout(L,z))},[L]);p.useEffect(()=>{const z=y.viewport;if(z){const M=()=>{D(C.current),c==null||c()},U=()=>{const X=new Date().getTime()-x.current;C.current=C.current-X,window.clearTimeout(_.current),l==null||l()};return z.addEventListener(x1,U),z.addEventListener(k1,M),()=>{z.removeEventListener(x1,U),z.removeEventListener(k1,M)}}},[y.viewport,k,l,c,D]),p.useEffect(()=>{o&&!y.isClosePausedRef.current&&D(k)},[o,k,y.isClosePausedRef,D]),p.useEffect(()=>(R(),()=>T()),[R,T]);const H=p.useMemo(()=>w?B4(w):null,[w]);return y.viewport?p.createElement(p.Fragment,null,H&&p.createElement(iq,{__scopeToast:n,role:"status","aria-live":r==="foreground"?"assertive":"polite","aria-atomic":!0},H),p.createElement(aq,{scope:n,onClose:L},ba.createPortal(p.createElement(YC.ItemSlot,{scope:n},p.createElement(zV,{asChild:!0,onEscapeKeyDown:fe(s,()=>{y.isFocusedToastEscapeKeyDownRef.current||L(),y.isFocusedToastEscapeKeyDownRef.current=!1})},p.createElement(ze.li,W({role:"status","aria-live":"off","aria-atomic":!0,tabIndex:0,"data-state":o?"open":"closed","data-swipe-direction":y.swipeDirection},b,{ref:h,style:{userSelect:"none",touchAction:"none",...e.style},onKeyDown:fe(e.onKeyDown,z=>{z.key==="Escape"&&(s==null||s(z.nativeEvent),z.nativeEvent.defaultPrevented||(y.isFocusedToastEscapeKeyDownRef.current=!0,L()))}),onPointerDown:fe(e.onPointerDown,z=>{z.button===0&&(S.current={x:z.clientX,y:z.clientY})}),onPointerMove:fe(e.onPointerMove,z=>{if(!S.current)return;const M=z.clientX-S.current.x,U=z.clientY-S.current.y,X=!!E.current,j=["left","right"].includes(y.swipeDirection),O=["left","up"].includes(y.swipeDirection)?Math.min:Math.max,A=j?O(0,M):0,V=j?0:O(0,U),P=z.pointerType==="touch"?10:2,N={x:A,y:V},K={originalEvent:z,delta:N};X?(E.current=N,Wf(eq,d,K,{discrete:!1})):bR(N,y.swipeDirection,P)?(E.current=N,Wf(JV,u,K,{discrete:!1}),z.target.setPointerCapture(z.pointerId)):(Math.abs(M)>P||Math.abs(U)>P)&&(S.current=null)}),onPointerUp:fe(e.onPointerUp,z=>{const M=E.current,U=z.target;if(U.hasPointerCapture(z.pointerId)&&U.releasePointerCapture(z.pointerId),E.current=null,S.current=null,M){const X=z.currentTarget,j={originalEvent:z,delta:M};bR(M,y.swipeDirection,y.swipeThreshold)?Wf(nq,m,j,{discrete:!0}):Wf(tq,g,j,{discrete:!0}),X.addEventListener("click",O=>O.preventDefault(),{once:!0})}})})))),y.viewport))):null});F4.propTypes={type(e){if(e.type&&!["foreground","background"].includes(e.type)){const t=`Invalid prop \`type\` supplied to \`${Dm}\`. Expected \`foreground | background\`.`;return new Error(t)}return null}};const iq=e=>{const{__scopeToast:t,children:n,...r}=e,a=Om(Dm,t),[o,i]=p.useState(!1),[s,l]=p.useState(!1);return dq(()=>i(!0)),p.useEffect(()=>{const c=window.setTimeout(()=>l(!0),1e3);return()=>window.clearTimeout(c)},[]),s?null:p.createElement(Jd,{asChild:!0},p.createElement(Im,r,o&&p.createElement(p.Fragment,null,a.label," ",n)))},sq=p.forwardRef((e,t)=>{const{__scopeToast:n,...r}=e;return p.createElement(ze.div,W({},r,{ref:t}))}),lq=p.forwardRef((e,t)=>{const{__scopeToast:n,...r}=e;return p.createElement(ze.div,W({},r,{ref:t}))}),cq="ToastAction",j4=p.forwardRef((e,t)=>{const{altText:n,...r}=e;return n?p.createElement(U4,{altText:n,asChild:!0},p.createElement(z4,W({},r,{ref:t}))):null});j4.propTypes={altText(e){return e.altText?null:new Error(`Missing prop \`altText\` expected on \`${cq}\``)}};const uq="ToastClose",z4=p.forwardRef((e,t)=>{const{__scopeToast:n,...r}=e,a=oq(uq,n);return p.createElement(U4,{asChild:!0},p.createElement(ze.button,W({type:"button"},r,{ref:t,onClick:fe(e.onClick,a.onClose)})))}),U4=p.forwardRef((e,t)=>{const{__scopeToast:n,altText:r,...a}=e;return p.createElement(ze.div,W({"data-radix-toast-announce-exclude":"","data-radix-toast-announce-alt":r||void 0},a,{ref:t}))});function B4(e){const t=[];return Array.from(e.childNodes).forEach(r=>{if(r.nodeType===r.TEXT_NODE&&r.textContent&&t.push(r.textContent),fq(r)){const a=r.ariaHidden||r.hidden||r.style.display==="none",o=r.dataset.radixToastAnnounceExclude==="";if(!a)if(o){const i=r.dataset.radixToastAnnounceAlt;i&&t.push(i)}else t.push(...B4(r))}}),t}function Wf(e,t,n,{discrete:r}){const a=n.originalEvent.currentTarget,o=new CustomEvent(e,{bubbles:!0,cancelable:!0,detail:n});t&&a.addEventListener(e,t,{once:!0}),r?KC(a,o):a.dispatchEvent(o)}const bR=(e,t,n=0)=>{const r=Math.abs(e.x),a=Math.abs(e.y),o=r>a;return t==="left"||t==="right"?o&&r>n:!o&&a>n};function dq(e=()=>{}){const t=ur(e);Zr(()=>{let n=0,r=0;return n=window.requestAnimationFrame(()=>r=window.requestAnimationFrame(t)),()=>{window.cancelAnimationFrame(n),window.cancelAnimationFrame(r)}},[t])}function fq(e){return e.nodeType===e.ELEMENT_NODE}function pq(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>{const a=r.tagName==="INPUT"&&r.type==="hidden";return r.disabled||r.hidden||a?NodeFilter.FILTER_SKIP:r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function yb(e){const t=document.activeElement;return e.some(n=>n===t?!0:(n.focus(),document.activeElement!==t))}const gq=$4,H4=XV,V4=rq,q4=sq,G4=lq,W4=j4,K4=z4;function Y4(e){var t,n,r="";if(typeof e=="string"||typeof e=="number")r+=e;else if(typeof e=="object")if(Array.isArray(e))for(t=0;ttypeof e=="boolean"?"".concat(e):e===0?"0":e,vR=Z4,ef=(e,t)=>n=>{var r;if((t==null?void 0:t.variants)==null)return vR(e,n==null?void 0:n.class,n==null?void 0:n.className);const{variants:a,defaultVariants:o}=t,i=Object.keys(a).map(c=>{const u=n==null?void 0:n[c],d=o==null?void 0:o[c];if(u===null)return null;const g=yR(u)||yR(d);return a[c][g]}),s=n&&Object.entries(n).reduce((c,u)=>{let[d,g]=u;return g===void 0||(c[d]=g),c},{}),l=t==null||(r=t.compoundVariants)===null||r===void 0?void 0:r.reduce((c,u)=>{let{class:d,className:g,...m}=u;return Object.entries(m).every(b=>{let[y,w]=b;return Array.isArray(w)?w.includes({...o,...s}[y]):{...o,...s}[y]===w})?[...c,d,g]:c},[]);return vR(e,i,l,n==null?void 0:n.class,n==null?void 0:n.className)};var mq={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};const hq=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),Be=(e,t)=>{const n=p.forwardRef(({color:r="currentColor",size:a=24,strokeWidth:o=2,absoluteStrokeWidth:i,children:s,...l},c)=>p.createElement("svg",{ref:c,...mq,width:a,height:a,stroke:r,strokeWidth:i?Number(o)*24/Number(a):o,className:`lucide lucide-${hq(e)}`,...l},[...t.map(([u,d])=>p.createElement(u,d)),...(Array.isArray(s)?s:[s])||[]]));return n.displayName=`${e}`,n},X4=Be("AlertCircle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]]),bq=Be("Archive",[["rect",{width:"20",height:"5",x:"2",y:"3",rx:"1",key:"1wp1u1"}],["path",{d:"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8",key:"1s80jp"}],["path",{d:"M10 12h4",key:"a56b0p"}]]),yq=Be("ArrowDownWideNarrow",[["path",{d:"m3 16 4 4 4-4",key:"1co6wj"}],["path",{d:"M7 20V4",key:"1yoxec"}],["path",{d:"M11 4h10",key:"1w87gc"}],["path",{d:"M11 8h7",key:"djye34"}],["path",{d:"M11 12h4",key:"q8tih4"}]]),Lm=Be("Bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]]),vq=Be("CalendarSearch",[["path",{d:"M21 12V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14c0 1.1.9 2 2 2h7.5",key:"18ncp8"}],["path",{d:"M16 2v4",key:"4m81vk"}],["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M3 10h18",key:"8toen8"}],["path",{d:"M18 21a3 3 0 1 0 0-6 3 3 0 0 0 0 6v0Z",key:"mgbru4"}],["path",{d:"m22 22-1.5-1.5",key:"1x83k4"}]]),Mm=Be("CheckCheck",[["path",{d:"M18 6 7 17l-5-5",key:"116fxf"}],["path",{d:"m22 10-7.5 7.5L13 16",key:"ke71qq"}]]),Pm=Be("Check",[["polyline",{points:"20 6 9 17 4 12",key:"10jjfj"}]]),ZC=Be("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]),Sq=Be("ChevronLeft",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]),$m=Be("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]),wq=Be("ChevronUp",[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]),Q4=Be("Circle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]),Eq=Be("Cog",[["path",{d:"M12 20a8 8 0 1 0 0-16 8 8 0 0 0 0 16Z",key:"sobvz5"}],["path",{d:"M12 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z",key:"11i496"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 22v-2",key:"1osdcq"}],["path",{d:"m17 20.66-1-1.73",key:"eq3orb"}],["path",{d:"M11 10.27 7 3.34",key:"16pf9h"}],["path",{d:"m20.66 17-1.73-1",key:"sg0v6f"}],["path",{d:"m3.34 7 1.73 1",key:"1ulond"}],["path",{d:"M14 12h8",key:"4f43i9"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"m20.66 7-1.73 1",key:"1ow05n"}],["path",{d:"m3.34 17 1.73-1",key:"nuk764"}],["path",{d:"m17 3.34-1 1.73",key:"2wel8s"}],["path",{d:"m11 13.73-4 6.93",key:"794ttg"}]]),xq=Be("Copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]),kq=Be("Dna",[["path",{d:"M2 15c6.667-6 13.333 0 20-6",key:"1pyr53"}],["path",{d:"M9 22c1.798-1.998 2.518-3.995 2.807-5.993",key:"q3hbxp"}],["path",{d:"M15 2c-1.798 1.998-2.518 3.995-2.807 5.993",key:"80uv8i"}],["path",{d:"m17 6-2.5-2.5",key:"5cdfhj"}],["path",{d:"m14 8-1-1",key:"15nbz5"}],["path",{d:"m7 18 2.5 2.5",key:"16tu1a"}],["path",{d:"m3.5 14.5.5.5",key:"hapbhd"}],["path",{d:"m20 9 .5.5",key:"1n7z02"}],["path",{d:"m6.5 12.5 1 1",key:"cs35ky"}],["path",{d:"m16.5 10.5 1 1",key:"696xn5"}],["path",{d:"m10 16 1.5 1.5",key:"11lckj"}]]),Cq=Be("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]]),_q=Be("Folder",[["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}]]),Aq=Be("GripVertical",[["circle",{cx:"9",cy:"12",r:"1",key:"1vctgf"}],["circle",{cx:"9",cy:"5",r:"1",key:"hp0tcf"}],["circle",{cx:"9",cy:"19",r:"1",key:"fkjjf6"}],["circle",{cx:"15",cy:"12",r:"1",key:"1tmaij"}],["circle",{cx:"15",cy:"5",r:"1",key:"19l28e"}],["circle",{cx:"15",cy:"19",r:"1",key:"f4zoj3"}]]),Tq=Be("HeartOff",[["line",{x1:"2",y1:"2",x2:"22",y2:"22",key:"1w4vcy"}],["path",{d:"M16.5 16.5 12 21l-7-7c-1.5-1.45-3-3.2-3-5.5a5.5 5.5 0 0 1 2.14-4.35",key:"3mpagl"}],["path",{d:"M8.76 3.1c1.15.22 2.13.78 3.24 1.9 1.5-1.5 2.74-2 4.5-2A5.5 5.5 0 0 1 22 8.5c0 2.12-1.3 3.78-2.67 5.17",key:"1gh3v3"}]]),Rq=Be("IceCream",[["path",{d:"m7 11 4.08 10.35a1 1 0 0 0 1.84 0L17 11",key:"1v6356"}],["path",{d:"M17 7A5 5 0 0 0 7 7",key:"151p3v"}],["path",{d:"M17 7a2 2 0 0 1 0 4H7a2 2 0 0 1 0-4",key:"1sdaij"}]]),Nq=Be("Info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]]),un=Be("Loader2",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]),SR=Be("LogOut",[["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}],["polyline",{points:"16 17 21 12 16 7",key:"1gabdz"}],["line",{x1:"21",x2:"9",y1:"12",y2:"12",key:"1uyos4"}]]),Iq=Be("MinusCircle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M8 12h8",key:"1wcyev"}]]),wR=Be("MoonStar",[["path",{d:"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z",key:"a7tn18"}],["path",{d:"M19 3v4",key:"vgv24u"}],["path",{d:"M21 5h-4",key:"1wcg1f"}]]),Oq=Be("PackageSearch",[["path",{d:"M21 10V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l2-1.14",key:"e7tb2h"}],["path",{d:"m7.5 4.27 9 5.15",key:"1c824w"}],["polyline",{points:"3.29 7 12 12 20.71 7",key:"ousv84"}],["line",{x1:"12",x2:"12",y1:"22",y2:"12",key:"a4e8g8"}],["circle",{cx:"18.5",cy:"15.5",r:"2.5",key:"b5zd12"}],["path",{d:"M20.27 17.27 22 19",key:"1l4muz"}]]),Fm=Be("PenSquare",[["path",{d:"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7",key:"1qinfi"}],["path",{d:"M18.5 2.5a2.12 2.12 0 0 1 3 3L12 15l-4 1 1-4Z",key:"w2jsv5"}]]),J4=Be("Pen",[["path",{d:"M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z",key:"5qss01"}]]),XC=Be("Pencil",[["path",{d:"M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z",key:"5qss01"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]]),Dq=Be("PlusCircle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M8 12h8",key:"1wcyev"}],["path",{d:"M12 8v8",key:"napkw2"}]]),ya=Be("Plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]),Lq=Be("RefreshCcw",[["path",{d:"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"14sxne"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16",key:"1hlbsb"}],["path",{d:"M16 16h5v5",key:"ccwih5"}]]),Mq=Be("Repeat",[["path",{d:"m17 2 4 4-4 4",key:"nntrym"}],["path",{d:"M3 11v-1a4 4 0 0 1 4-4h14",key:"84bu3i"}],["path",{d:"m7 22-4-4 4-4",key:"1wqhfi"}],["path",{d:"M21 13v1a4 4 0 0 1-4 4H3",key:"1rx37r"}]]),Ms=Be("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]),Pq=Be("SendHorizontal",[["path",{d:"m3 3 3 9-3 9 19-9Z",key:"1aobqy"}],["path",{d:"M6 12h16",key:"s4cdu5"}]]),$q=Be("Send",[["path",{d:"m22 2-7 20-4-9-9-4Z",key:"1q3vgg"}],["path",{d:"M22 2 11 13",key:"nzbqef"}]]),Fq=Be("Settings",[["path",{d:"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z",key:"1qme2f"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]),jq=Be("Smile",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M8 14s1.5 2 4 2 4-2 4-2",key:"1y1vjs"}],["line",{x1:"9",x2:"9.01",y1:"9",y2:"9",key:"yxxnd0"}],["line",{x1:"15",x2:"15.01",y1:"9",y2:"9",key:"1p4y9e"}]]),ER=Be("Sun",[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]]),eF=Be("Upload",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"17 8 12 3 7 8",key:"t8dd8p"}],["line",{x1:"12",x2:"12",y1:"3",y2:"15",key:"widbto"}]]),QC=Be("User",[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]]),Di=Be("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),zq=Be("Zap",[["polygon",{points:"13 2 3 14 12 14 11 22 21 10 12 10 13 2",key:"45s27k"}]]),JC="-";function Uq(e){const t=Hq(e),{conflictingClassGroups:n,conflictingClassGroupModifiers:r}=e;function a(i){const s=i.split(JC);return s[0]===""&&s.length!==1&&s.shift(),tF(s,t)||Bq(i)}function o(i,s){const l=n[i]||[];return s&&r[i]?[...l,...r[i]]:l}return{getClassGroupId:a,getConflictingClassGroupIds:o}}function tF(e,t){var i;if(e.length===0)return t.classGroupId;const n=e[0],r=t.nextPart.get(n),a=r?tF(e.slice(1),r):void 0;if(a)return a;if(t.validators.length===0)return;const o=e.join(JC);return(i=t.validators.find(({validator:s})=>s(o)))==null?void 0:i.classGroupId}const xR=/^\[(.+)\]$/;function Bq(e){if(xR.test(e)){const t=xR.exec(e)[1],n=t==null?void 0:t.substring(0,t.indexOf(":"));if(n)return"arbitrary.."+n}}function Hq(e){const{theme:t,prefix:n}=e,r={nextPart:new Map,validators:[]};return qq(Object.entries(e.classGroups),n).forEach(([o,i])=>{C1(i,r,o,t)}),r}function C1(e,t,n,r){e.forEach(a=>{if(typeof a=="string"){const o=a===""?t:kR(t,a);o.classGroupId=n;return}if(typeof a=="function"){if(Vq(a)){C1(a(r),t,n,r);return}t.validators.push({validator:a,classGroupId:n});return}Object.entries(a).forEach(([o,i])=>{C1(i,kR(t,o),n,r)})})}function kR(e,t){let n=e;return t.split(JC).forEach(r=>{n.nextPart.has(r)||n.nextPart.set(r,{nextPart:new Map,validators:[]}),n=n.nextPart.get(r)}),n}function Vq(e){return e.isThemeGetter}function qq(e,t){return t?e.map(([n,r])=>{const a=r.map(o=>typeof o=="string"?t+o:typeof o=="object"?Object.fromEntries(Object.entries(o).map(([i,s])=>[t+i,s])):o);return[n,a]}):e}function Gq(e){if(e<1)return{get:()=>{},set:()=>{}};let t=0,n=new Map,r=new Map;function a(o,i){n.set(o,i),t++,t>e&&(t=0,r=n,n=new Map)}return{get(o){let i=n.get(o);if(i!==void 0)return i;if((i=r.get(o))!==void 0)return a(o,i),i},set(o,i){n.has(o)?n.set(o,i):a(o,i)}}}const nF="!";function Wq(e){const t=e.separator,n=t.length===1,r=t[0],a=t.length;return function(i){const s=[];let l=0,c=0,u;for(let y=0;yc?u-c:void 0;return{modifiers:s,hasImportantModifier:g,baseClassName:m,maybePostfixModifierPosition:b}}}function Kq(e){if(e.length<=1)return e;const t=[];let n=[];return e.forEach(r=>{r[0]==="["?(t.push(...n.sort(),r),n=[]):n.push(r)}),t.push(...n.sort()),t}function Yq(e){return{cache:Gq(e.cacheSize),splitModifiers:Wq(e),...Uq(e)}}const Zq=/\s+/;function Xq(e,t){const{splitModifiers:n,getClassGroupId:r,getConflictingClassGroupIds:a}=t,o=new Set;return e.trim().split(Zq).map(i=>{const{modifiers:s,hasImportantModifier:l,baseClassName:c,maybePostfixModifierPosition:u}=n(i);let d=r(u?c.substring(0,u):c),g=!!u;if(!d){if(!u)return{isTailwindClass:!1,originalClassName:i};if(d=r(c),!d)return{isTailwindClass:!1,originalClassName:i};g=!1}const m=Kq(s).join(":");return{isTailwindClass:!0,modifierId:l?m+nF:m,classGroupId:d,originalClassName:i,hasPostfixModifier:g}}).reverse().filter(i=>{if(!i.isTailwindClass)return!0;const{modifierId:s,classGroupId:l,hasPostfixModifier:c}=i,u=s+l;return o.has(u)?!1:(o.add(u),a(l,c).forEach(d=>o.add(s+d)),!0)}).reverse().map(i=>i.originalClassName).join(" ")}function Qq(){let e=0,t,n,r="";for(;ed(u),e());return n=Yq(c),r=n.cache.get,a=n.cache.set,o=s,s(l)}function s(l){const c=r(l);if(c)return c;const u=Xq(l,n);return a(l,u),u}return function(){return o(Qq.apply(null,arguments))}}function Rt(e){const t=n=>n[e]||[];return t.isThemeGetter=!0,t}const aF=/^\[(?:([a-z-]+):)?(.+)\]$/i,eG=/^\d+\/\d+$/,tG=new Set(["px","full","screen"]),nG=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,rG=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,aG=/^-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,oG=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/;function oa(e){return ns(e)||tG.has(e)||eG.test(e)}function Do(e){return Oc(e,"length",pG)}function ns(e){return!!e&&!Number.isNaN(Number(e))}function Kf(e){return Oc(e,"number",ns)}function tu(e){return!!e&&Number.isInteger(Number(e))}function iG(e){return e.endsWith("%")&&ns(e.slice(0,-1))}function Ke(e){return aF.test(e)}function Lo(e){return nG.test(e)}const sG=new Set(["length","size","percentage"]);function lG(e){return Oc(e,sG,oF)}function cG(e){return Oc(e,"position",oF)}const uG=new Set(["image","url"]);function dG(e){return Oc(e,uG,mG)}function fG(e){return Oc(e,"",gG)}function nu(){return!0}function Oc(e,t,n){const r=aF.exec(e);return r?r[1]?typeof t=="string"?r[1]===t:t.has(r[1]):n(r[2]):!1}function pG(e){return rG.test(e)}function oF(){return!1}function gG(e){return aG.test(e)}function mG(e){return oG.test(e)}function hG(){const e=Rt("colors"),t=Rt("spacing"),n=Rt("blur"),r=Rt("brightness"),a=Rt("borderColor"),o=Rt("borderRadius"),i=Rt("borderSpacing"),s=Rt("borderWidth"),l=Rt("contrast"),c=Rt("grayscale"),u=Rt("hueRotate"),d=Rt("invert"),g=Rt("gap"),m=Rt("gradientColorStops"),b=Rt("gradientColorStopPositions"),y=Rt("inset"),w=Rt("margin"),v=Rt("opacity"),h=Rt("padding"),S=Rt("saturate"),E=Rt("scale"),k=Rt("sepia"),x=Rt("skew"),C=Rt("space"),_=Rt("translate"),R=()=>["auto","contain","none"],T=()=>["auto","hidden","clip","visible","scroll"],L=()=>["auto",Ke,t],D=()=>[Ke,t],H=()=>["",oa,Do],z=()=>["auto",ns,Ke],M=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],U=()=>["solid","dashed","dotted","double","none"],X=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity","plus-lighter"],j=()=>["start","end","center","between","around","evenly","stretch"],O=()=>["","0",Ke],A=()=>["auto","avoid","all","avoid-page","page","left","right","column"],V=()=>[ns,Kf],P=()=>[ns,Ke];return{cacheSize:500,separator:":",theme:{colors:[nu],spacing:[oa,Do],blur:["none","",Lo,Ke],brightness:V(),borderColor:[e],borderRadius:["none","","full",Lo,Ke],borderSpacing:D(),borderWidth:H(),contrast:V(),grayscale:O(),hueRotate:P(),invert:O(),gap:D(),gradientColorStops:[e],gradientColorStopPositions:[iG,Do],inset:L(),margin:L(),opacity:V(),padding:D(),saturate:V(),scale:V(),sepia:O(),skew:P(),space:D(),translate:D()},classGroups:{aspect:[{aspect:["auto","square","video",Ke]}],container:["container"],columns:[{columns:[Lo]}],"break-after":[{"break-after":A()}],"break-before":[{"break-before":A()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none"]}],clear:[{clear:["left","right","both","none"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...M(),Ke]}],overflow:[{overflow:T()}],"overflow-x":[{"overflow-x":T()}],"overflow-y":[{"overflow-y":T()}],overscroll:[{overscroll:R()}],"overscroll-x":[{"overscroll-x":R()}],"overscroll-y":[{"overscroll-y":R()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[y]}],"inset-x":[{"inset-x":[y]}],"inset-y":[{"inset-y":[y]}],start:[{start:[y]}],end:[{end:[y]}],top:[{top:[y]}],right:[{right:[y]}],bottom:[{bottom:[y]}],left:[{left:[y]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",tu,Ke]}],basis:[{basis:L()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",Ke]}],grow:[{grow:O()}],shrink:[{shrink:O()}],order:[{order:["first","last","none",tu,Ke]}],"grid-cols":[{"grid-cols":[nu]}],"col-start-end":[{col:["auto",{span:["full",tu,Ke]},Ke]}],"col-start":[{"col-start":z()}],"col-end":[{"col-end":z()}],"grid-rows":[{"grid-rows":[nu]}],"row-start-end":[{row:["auto",{span:[tu,Ke]},Ke]}],"row-start":[{"row-start":z()}],"row-end":[{"row-end":z()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",Ke]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",Ke]}],gap:[{gap:[g]}],"gap-x":[{"gap-x":[g]}],"gap-y":[{"gap-y":[g]}],"justify-content":[{justify:["normal",...j()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...j(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...j(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[h]}],px:[{px:[h]}],py:[{py:[h]}],ps:[{ps:[h]}],pe:[{pe:[h]}],pt:[{pt:[h]}],pr:[{pr:[h]}],pb:[{pb:[h]}],pl:[{pl:[h]}],m:[{m:[w]}],mx:[{mx:[w]}],my:[{my:[w]}],ms:[{ms:[w]}],me:[{me:[w]}],mt:[{mt:[w]}],mr:[{mr:[w]}],mb:[{mb:[w]}],ml:[{ml:[w]}],"space-x":[{"space-x":[C]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[C]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit",Ke,t]}],"min-w":[{"min-w":["min","max","fit",Ke,oa]}],"max-w":[{"max-w":["0","none","full","min","max","fit","prose",{screen:[Lo]},Lo,Ke]}],h:[{h:[Ke,t,"auto","min","max","fit"]}],"min-h":[{"min-h":["min","max","fit",oa,Ke]}],"max-h":[{"max-h":[Ke,t,"min","max","fit"]}],"font-size":[{text:["base",Lo,Do]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",Kf]}],"font-family":[{font:[nu]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractons"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",Ke]}],"line-clamp":[{"line-clamp":["none",ns,Kf]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",oa,Ke]}],"list-image":[{"list-image":["none",Ke]}],"list-style-type":[{list:["none","disc","decimal",Ke]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[v]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[v]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...U(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",oa,Do]}],"underline-offset":[{"underline-offset":["auto",oa,Ke]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],indent:[{indent:D()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",Ke]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",Ke]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[v]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...M(),cG]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",lG]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},dG]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[b]}],"gradient-via-pos":[{via:[b]}],"gradient-to-pos":[{to:[b]}],"gradient-from":[{from:[m]}],"gradient-via":[{via:[m]}],"gradient-to":[{to:[m]}],rounded:[{rounded:[o]}],"rounded-s":[{"rounded-s":[o]}],"rounded-e":[{"rounded-e":[o]}],"rounded-t":[{"rounded-t":[o]}],"rounded-r":[{"rounded-r":[o]}],"rounded-b":[{"rounded-b":[o]}],"rounded-l":[{"rounded-l":[o]}],"rounded-ss":[{"rounded-ss":[o]}],"rounded-se":[{"rounded-se":[o]}],"rounded-ee":[{"rounded-ee":[o]}],"rounded-es":[{"rounded-es":[o]}],"rounded-tl":[{"rounded-tl":[o]}],"rounded-tr":[{"rounded-tr":[o]}],"rounded-br":[{"rounded-br":[o]}],"rounded-bl":[{"rounded-bl":[o]}],"border-w":[{border:[s]}],"border-w-x":[{"border-x":[s]}],"border-w-y":[{"border-y":[s]}],"border-w-s":[{"border-s":[s]}],"border-w-e":[{"border-e":[s]}],"border-w-t":[{"border-t":[s]}],"border-w-r":[{"border-r":[s]}],"border-w-b":[{"border-b":[s]}],"border-w-l":[{"border-l":[s]}],"border-opacity":[{"border-opacity":[v]}],"border-style":[{border:[...U(),"hidden"]}],"divide-x":[{"divide-x":[s]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[s]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[v]}],"divide-style":[{divide:U()}],"border-color":[{border:[a]}],"border-color-x":[{"border-x":[a]}],"border-color-y":[{"border-y":[a]}],"border-color-t":[{"border-t":[a]}],"border-color-r":[{"border-r":[a]}],"border-color-b":[{"border-b":[a]}],"border-color-l":[{"border-l":[a]}],"divide-color":[{divide:[a]}],"outline-style":[{outline:["",...U()]}],"outline-offset":[{"outline-offset":[oa,Ke]}],"outline-w":[{outline:[oa,Do]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:H()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[v]}],"ring-offset-w":[{"ring-offset":[oa,Do]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",Lo,fG]}],"shadow-color":[{shadow:[nu]}],opacity:[{opacity:[v]}],"mix-blend":[{"mix-blend":X()}],"bg-blend":[{"bg-blend":X()}],filter:[{filter:["","none"]}],blur:[{blur:[n]}],brightness:[{brightness:[r]}],contrast:[{contrast:[l]}],"drop-shadow":[{"drop-shadow":["","none",Lo,Ke]}],grayscale:[{grayscale:[c]}],"hue-rotate":[{"hue-rotate":[u]}],invert:[{invert:[d]}],saturate:[{saturate:[S]}],sepia:[{sepia:[k]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[n]}],"backdrop-brightness":[{"backdrop-brightness":[r]}],"backdrop-contrast":[{"backdrop-contrast":[l]}],"backdrop-grayscale":[{"backdrop-grayscale":[c]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[u]}],"backdrop-invert":[{"backdrop-invert":[d]}],"backdrop-opacity":[{"backdrop-opacity":[v]}],"backdrop-saturate":[{"backdrop-saturate":[S]}],"backdrop-sepia":[{"backdrop-sepia":[k]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[i]}],"border-spacing-x":[{"border-spacing-x":[i]}],"border-spacing-y":[{"border-spacing-y":[i]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",Ke]}],duration:[{duration:P()}],ease:[{ease:["linear","in","out","in-out",Ke]}],delay:[{delay:P()}],animate:[{animate:["none","spin","ping","pulse","bounce",Ke]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[E]}],"scale-x":[{"scale-x":[E]}],"scale-y":[{"scale-y":[E]}],rotate:[{rotate:[tu,Ke]}],"translate-x":[{"translate-x":[_]}],"translate-y":[{"translate-y":[_]}],"skew-x":[{"skew-x":[x]}],"skew-y":[{"skew-y":[x]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",Ke]}],accent:[{accent:["auto",e]}],appearance:["appearance-none"],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",Ke]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":D()}],"scroll-mx":[{"scroll-mx":D()}],"scroll-my":[{"scroll-my":D()}],"scroll-ms":[{"scroll-ms":D()}],"scroll-me":[{"scroll-me":D()}],"scroll-mt":[{"scroll-mt":D()}],"scroll-mr":[{"scroll-mr":D()}],"scroll-mb":[{"scroll-mb":D()}],"scroll-ml":[{"scroll-ml":D()}],"scroll-p":[{"scroll-p":D()}],"scroll-px":[{"scroll-px":D()}],"scroll-py":[{"scroll-py":D()}],"scroll-ps":[{"scroll-ps":D()}],"scroll-pe":[{"scroll-pe":D()}],"scroll-pt":[{"scroll-pt":D()}],"scroll-pr":[{"scroll-pr":D()}],"scroll-pb":[{"scroll-pb":D()}],"scroll-pl":[{"scroll-pl":D()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",Ke]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[oa,Do,Kf]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}}const bG=Jq(hG);function ee(...e){return bG(Z4(e))}const yG=gq,iF=p.forwardRef(({className:e,...t},n)=>f.jsx(H4,{ref:n,className:ee("fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]",e),...t}));iF.displayName=H4.displayName;const vG=ef("group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full",{variants:{variant:{default:"border bg-background text-foreground",destructive:"destructive group border-destructive bg-destructive text-destructive-foreground"}},defaultVariants:{variant:"default"}}),sF=p.forwardRef(({className:e,variant:t,...n},r)=>f.jsx(V4,{ref:r,className:ee(vG({variant:t}),e),...n}));sF.displayName=V4.displayName;const SG=p.forwardRef(({className:e,...t},n)=>f.jsx(W4,{ref:n,className:ee("inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive",e),...t}));SG.displayName=W4.displayName;const lF=p.forwardRef(({className:e,...t},n)=>f.jsx(K4,{ref:n,className:ee("absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600",e),"toast-close":"",...t,children:f.jsx(Di,{className:"h-4 w-4"})}));lF.displayName=K4.displayName;const cF=p.forwardRef(({className:e,...t},n)=>f.jsx(q4,{ref:n,className:ee("text-sm font-semibold",e),...t}));cF.displayName=q4.displayName;const uF=p.forwardRef(({className:e,...t},n)=>f.jsx(G4,{ref:n,className:ee("text-sm opacity-90",e),...t}));uF.displayName=G4.displayName;const wG=1,EG=1e6;let vb=0;function xG(){return vb=(vb+1)%Number.MAX_VALUE,vb.toString()}const Sb=new Map,CR=e=>{if(Sb.has(e))return;const t=setTimeout(()=>{Sb.delete(e),zu({type:"REMOVE_TOAST",toastId:e})},EG);Sb.set(e,t)},kG=(e,t)=>{switch(t.type){case"ADD_TOAST":return{...e,toasts:[t.toast,...e.toasts].slice(0,wG)};case"UPDATE_TOAST":return{...e,toasts:e.toasts.map(n=>n.id===t.toast.id?{...n,...t.toast}:n)};case"DISMISS_TOAST":{const{toastId:n}=t;return n?CR(n):e.toasts.forEach(r=>{CR(r.id)}),{...e,toasts:e.toasts.map(r=>r.id===n||n===void 0?{...r,open:!1}:r)}}case"REMOVE_TOAST":return t.toastId===void 0?{...e,toasts:[]}:{...e,toasts:e.toasts.filter(n=>n.id!==t.toastId)}}},Fp=[];let jp={toasts:[]};function zu(e){jp=kG(jp,e),Fp.forEach(t=>{t(jp)})}function e_({...e}){const t=xG(),n=a=>zu({type:"UPDATE_TOAST",toast:{...a,id:t}}),r=()=>zu({type:"DISMISS_TOAST",toastId:t});return zu({type:"ADD_TOAST",toast:{...e,id:t,open:!0,onOpenChange:a=>{a||r()}}}),{id:t,dismiss:r,update:n}}function An(){const[e,t]=p.useState(jp);return p.useEffect(()=>(Fp.push(t),()=>{const n=Fp.indexOf(t);n>-1&&Fp.splice(n,1)}),[e]),{...e,toast:e_,dismiss:n=>zu({type:"DISMISS_TOAST",toastId:n})}}function CG(){const{toasts:e}=An();return f.jsxs(yG,{children:[e.map(function({id:t,title:n,description:r,action:a,...o}){return f.jsxs(sF,{...o,children:[f.jsxs("div",{className:"grid gap-1",children:[n&&f.jsx(cF,{children:n}),r&&f.jsx(uF,{children:r})]}),a,f.jsx(lF,{})]},t)}),f.jsx(iF,{})]})}var Dc=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},gc=typeof window>"u"||"Deno"in window;function Fr(){}function _G(e,t){return typeof e=="function"?e(t):e}function _1(e){return typeof e=="number"&&e>=0&&e!==1/0}function dF(e,t){return Math.max(e+(t||0)-Date.now(),0)}function _R(e,t){const{type:n="all",exact:r,fetchStatus:a,predicate:o,queryKey:i,stale:s}=e;if(i){if(r){if(t.queryHash!==t_(i,t.options))return!1}else if(!md(t.queryKey,i))return!1}if(n!=="all"){const l=t.isActive();if(n==="active"&&!l||n==="inactive"&&l)return!1}return!(typeof s=="boolean"&&t.isStale()!==s||typeof a<"u"&&a!==t.state.fetchStatus||o&&!o(t))}function AR(e,t){const{exact:n,status:r,predicate:a,mutationKey:o}=e;if(o){if(!t.options.mutationKey)return!1;if(n){if(gd(t.options.mutationKey)!==gd(o))return!1}else if(!md(t.options.mutationKey,o))return!1}return!(r&&t.state.status!==r||a&&!a(t))}function t_(e,t){return((t==null?void 0:t.queryKeyHashFn)||gd)(e)}function gd(e){return JSON.stringify(e,(t,n)=>A1(n)?Object.keys(n).sort().reduce((r,a)=>(r[a]=n[a],r),{}):n)}function md(e,t){return e===t?!0:typeof e!=typeof t?!1:e&&t&&typeof e=="object"&&typeof t=="object"?!Object.keys(t).some(n=>!md(e[n],t[n])):!1}function fF(e,t){if(e===t)return e;const n=TR(e)&&TR(t);if(n||A1(e)&&A1(t)){const r=n?e.length:Object.keys(e).length,a=n?t:Object.keys(t),o=a.length,i=n?[]:{};let s=0;for(let l=0;l"u")return!0;const n=t.prototype;return!(!RR(n)||!n.hasOwnProperty("isPrototypeOf"))}function RR(e){return Object.prototype.toString.call(e)==="[object Object]"}function pF(e){return new Promise(t=>{setTimeout(t,e)})}function NR(e){pF(0).then(e)}function T1(e,t,n){return typeof n.structuralSharing=="function"?n.structuralSharing(e,t):n.structuralSharing!==!1?fF(e,t):t}function AG(e,t,n=0){const r=[...e,t];return n&&r.length>n?r.slice(1):r}function TG(e,t,n=0){const r=[t,...e];return n&&r.length>n?r.slice(0,-1):r}var ss,Zo,ql,lP,RG=(lP=class extends Dc{constructor(){super();xe(this,ss,void 0);xe(this,Zo,void 0);xe(this,ql,void 0);me(this,ql,t=>{if(!gc&&window.addEventListener){const n=()=>t();return window.addEventListener("visibilitychange",n,!1),()=>{window.removeEventListener("visibilitychange",n)}}})}onSubscribe(){$(this,Zo)||this.setEventListener($(this,ql))}onUnsubscribe(){var t;this.hasListeners()||((t=$(this,Zo))==null||t.call(this),me(this,Zo,void 0))}setEventListener(t){var n;me(this,ql,t),(n=$(this,Zo))==null||n.call(this),me(this,Zo,t(r=>{typeof r=="boolean"?this.setFocused(r):this.onFocus()}))}setFocused(t){$(this,ss)!==t&&(me(this,ss,t),this.onFocus())}onFocus(){this.listeners.forEach(t=>{t()})}isFocused(){var t;return typeof $(this,ss)=="boolean"?$(this,ss):((t=globalThis.document)==null?void 0:t.visibilityState)!=="hidden"}},ss=new WeakMap,Zo=new WeakMap,ql=new WeakMap,lP),Cg=new RG,Gl,Xo,Wl,cP,NG=(cP=class extends Dc{constructor(){super();xe(this,Gl,!0);xe(this,Xo,void 0);xe(this,Wl,void 0);me(this,Wl,t=>{if(!gc&&window.addEventListener){const n=()=>t(!0),r=()=>t(!1);return window.addEventListener("online",n,!1),window.addEventListener("offline",r,!1),()=>{window.removeEventListener("online",n),window.removeEventListener("offline",r)}}})}onSubscribe(){$(this,Xo)||this.setEventListener($(this,Wl))}onUnsubscribe(){var t;this.hasListeners()||((t=$(this,Xo))==null||t.call(this),me(this,Xo,void 0))}setEventListener(t){var n;me(this,Wl,t),(n=$(this,Xo))==null||n.call(this),me(this,Xo,t(this.setOnline.bind(this)))}setOnline(t){$(this,Gl)!==t&&(me(this,Gl,t),this.listeners.forEach(r=>{r(t)}))}isOnline(){return $(this,Gl)}},Gl=new WeakMap,Xo=new WeakMap,Wl=new WeakMap,cP),_g=new NG;function IG(e){return Math.min(1e3*2**e,3e4)}function jm(e){return(e??"online")==="online"?_g.isOnline():!0}var gF=class{constructor(e){this.revert=e==null?void 0:e.revert,this.silent=e==null?void 0:e.silent}};function wb(e){return e instanceof gF}function mF(e){let t=!1,n=0,r=!1,a,o,i;const s=new Promise((w,v)=>{o=w,i=v}),l=w=>{var v;r||(m(new gF(w)),(v=e.abort)==null||v.call(e))},c=()=>{t=!0},u=()=>{t=!1},d=()=>!Cg.isFocused()||e.networkMode!=="always"&&!_g.isOnline(),g=w=>{var v;r||(r=!0,(v=e.onSuccess)==null||v.call(e,w),a==null||a(),o(w))},m=w=>{var v;r||(r=!0,(v=e.onError)==null||v.call(e,w),a==null||a(),i(w))},b=()=>new Promise(w=>{var v;a=h=>{const S=r||!d();return S&&w(h),S},(v=e.onPause)==null||v.call(e)}).then(()=>{var w;a=void 0,r||(w=e.onContinue)==null||w.call(e)}),y=()=>{if(r)return;let w;try{w=e.fn()}catch(v){w=Promise.reject(v)}Promise.resolve(w).then(g).catch(v=>{var x;if(r)return;const h=e.retry??(gc?0:3),S=e.retryDelay??IG,E=typeof S=="function"?S(n,v):S,k=h===!0||typeof h=="number"&&n{if(d())return b()}).then(()=>{t?m(v):y()})})};return jm(e.networkMode)?y():b().then(y),{promise:s,cancel:l,continue:()=>(a==null?void 0:a())?s:Promise.resolve(),cancelRetry:c,continueRetry:u}}function OG(){let e=[],t=0,n=u=>{u()},r=u=>{u()};const a=u=>{let d;t++;try{d=u()}finally{t--,t||s()}return d},o=u=>{t?e.push(u):NR(()=>{n(u)})},i=u=>(...d)=>{o(()=>{u(...d)})},s=()=>{const u=e;e=[],u.length&&NR(()=>{r(()=>{u.forEach(d=>{n(d)})})})};return{batch:a,batchCalls:i,schedule:o,setNotifyFunction:u=>{n=u},setBatchNotifyFunction:u=>{r=u}}}var sn=OG(),ls,uP,hF=(uP=class{constructor(){xe(this,ls,void 0)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),_1(this.gcTime)&&me(this,ls,setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(gc?1/0:5*60*1e3))}clearGcTimeout(){$(this,ls)&&(clearTimeout($(this,ls)),me(this,ls,void 0))}},ls=new WeakMap,uP),Kl,Yl,Lr,Qo,Mr,gn,Md,cs,Zl,zp,sa,eo,dP,DG=(dP=class extends hF{constructor(t){super();xe(this,Zl);xe(this,sa);xe(this,Kl,void 0);xe(this,Yl,void 0);xe(this,Lr,void 0);xe(this,Qo,void 0);xe(this,Mr,void 0);xe(this,gn,void 0);xe(this,Md,void 0);xe(this,cs,void 0);me(this,cs,!1),me(this,Md,t.defaultOptions),Ue(this,Zl,zp).call(this,t.options),me(this,gn,[]),me(this,Lr,t.cache),this.queryKey=t.queryKey,this.queryHash=t.queryHash,me(this,Kl,t.state||LG(this.options)),this.state=$(this,Kl),this.scheduleGc()}get meta(){return this.options.meta}optionalRemove(){!$(this,gn).length&&this.state.fetchStatus==="idle"&&$(this,Lr).remove(this)}setData(t,n){const r=T1(this.state.data,t,this.options);return Ue(this,sa,eo).call(this,{data:r,type:"success",dataUpdatedAt:n==null?void 0:n.updatedAt,manual:n==null?void 0:n.manual}),r}setState(t,n){Ue(this,sa,eo).call(this,{type:"setState",state:t,setStateOptions:n})}cancel(t){var r;const n=$(this,Qo);return(r=$(this,Mr))==null||r.cancel(t),n?n.then(Fr).catch(Fr):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}reset(){this.destroy(),this.setState($(this,Kl))}isActive(){return $(this,gn).some(t=>t.options.enabled!==!1)}isDisabled(){return this.getObserversCount()>0&&!this.isActive()}isStale(){return this.state.isInvalidated||!this.state.dataUpdatedAt||$(this,gn).some(t=>t.getCurrentResult().isStale)}isStaleByTime(t=0){return this.state.isInvalidated||!this.state.dataUpdatedAt||!dF(this.state.dataUpdatedAt,t)}onFocus(){var n;const t=$(this,gn).find(r=>r.shouldFetchOnWindowFocus());t==null||t.refetch({cancelRefetch:!1}),(n=$(this,Mr))==null||n.continue()}onOnline(){var n;const t=$(this,gn).find(r=>r.shouldFetchOnReconnect());t==null||t.refetch({cancelRefetch:!1}),(n=$(this,Mr))==null||n.continue()}addObserver(t){$(this,gn).includes(t)||($(this,gn).push(t),this.clearGcTimeout(),$(this,Lr).notify({type:"observerAdded",query:this,observer:t}))}removeObserver(t){$(this,gn).includes(t)&&(me(this,gn,$(this,gn).filter(n=>n!==t)),$(this,gn).length||($(this,Mr)&&($(this,cs)?$(this,Mr).cancel({revert:!0}):$(this,Mr).cancelRetry()),this.scheduleGc()),$(this,Lr).notify({type:"observerRemoved",query:this,observer:t}))}getObserversCount(){return $(this,gn).length}invalidate(){this.state.isInvalidated||Ue(this,sa,eo).call(this,{type:"invalidate"})}fetch(t,n){var c,u,d,g;if(this.state.fetchStatus!=="idle"){if(this.state.dataUpdatedAt&&(n!=null&&n.cancelRefetch))this.cancel({silent:!0});else if($(this,Qo))return(c=$(this,Mr))==null||c.continueRetry(),$(this,Qo)}if(t&&Ue(this,Zl,zp).call(this,t),!this.options.queryFn){const m=$(this,gn).find(b=>b.options.queryFn);m&&Ue(this,Zl,zp).call(this,m.options)}const r=new AbortController,a={queryKey:this.queryKey,meta:this.meta},o=m=>{Object.defineProperty(m,"signal",{enumerable:!0,get:()=>(me(this,cs,!0),r.signal)})};o(a);const i=()=>this.options.queryFn?(me(this,cs,!1),this.options.persister?this.options.persister(this.options.queryFn,a,this):this.options.queryFn(a)):Promise.reject(new Error(`Missing queryFn: '${this.options.queryHash}'`)),s={fetchOptions:n,options:this.options,queryKey:this.queryKey,state:this.state,fetchFn:i};o(s),(u=this.options.behavior)==null||u.onFetch(s,this),me(this,Yl,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((d=s.fetchOptions)==null?void 0:d.meta))&&Ue(this,sa,eo).call(this,{type:"fetch",meta:(g=s.fetchOptions)==null?void 0:g.meta});const l=m=>{var b,y,w,v;wb(m)&&m.silent||Ue(this,sa,eo).call(this,{type:"error",error:m}),wb(m)||((y=(b=$(this,Lr).config).onError)==null||y.call(b,m,this),(v=(w=$(this,Lr).config).onSettled)==null||v.call(w,this.state.data,m,this)),this.isFetchingOptimistic||this.scheduleGc(),this.isFetchingOptimistic=!1};return me(this,Mr,mF({fn:s.fetchFn,abort:r.abort.bind(r),onSuccess:m=>{var b,y,w,v;if(typeof m>"u"){l(new Error(`${this.queryHash} data is undefined`));return}this.setData(m),(y=(b=$(this,Lr).config).onSuccess)==null||y.call(b,m,this),(v=(w=$(this,Lr).config).onSettled)==null||v.call(w,m,this.state.error,this),this.isFetchingOptimistic||this.scheduleGc(),this.isFetchingOptimistic=!1},onError:l,onFail:(m,b)=>{Ue(this,sa,eo).call(this,{type:"failed",failureCount:m,error:b})},onPause:()=>{Ue(this,sa,eo).call(this,{type:"pause"})},onContinue:()=>{Ue(this,sa,eo).call(this,{type:"continue"})},retry:s.options.retry,retryDelay:s.options.retryDelay,networkMode:s.options.networkMode})),me(this,Qo,$(this,Mr).promise),$(this,Qo)}},Kl=new WeakMap,Yl=new WeakMap,Lr=new WeakMap,Qo=new WeakMap,Mr=new WeakMap,gn=new WeakMap,Md=new WeakMap,cs=new WeakMap,Zl=new WeakSet,zp=function(t){this.options={...$(this,Md),...t},this.updateGcTime(this.options.gcTime)},sa=new WeakSet,eo=function(t){const n=r=>{switch(t.type){case"failed":return{...r,fetchFailureCount:t.failureCount,fetchFailureReason:t.error};case"pause":return{...r,fetchStatus:"paused"};case"continue":return{...r,fetchStatus:"fetching"};case"fetch":return{...r,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:t.meta??null,fetchStatus:jm(this.options.networkMode)?"fetching":"paused",...!r.dataUpdatedAt&&{error:null,status:"pending"}};case"success":return{...r,data:t.data,dataUpdateCount:r.dataUpdateCount+1,dataUpdatedAt:t.dataUpdatedAt??Date.now(),error:null,isInvalidated:!1,status:"success",...!t.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};case"error":const a=t.error;return wb(a)&&a.revert&&$(this,Yl)?{...$(this,Yl),fetchStatus:"idle"}:{...r,error:a,errorUpdateCount:r.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:r.fetchFailureCount+1,fetchFailureReason:a,fetchStatus:"idle",status:"error"};case"invalidate":return{...r,isInvalidated:!0};case"setState":return{...r,...t.state}}};this.state=n(this.state),sn.batch(()=>{$(this,gn).forEach(r=>{r.onQueryUpdate()}),$(this,Lr).notify({query:this,type:"updated",action:t})})},dP);function LG(e){const t=typeof e.initialData=="function"?e.initialData():e.initialData,n=typeof t<"u",r=n?typeof e.initialDataUpdatedAt=="function"?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:n?r??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:n?"success":"pending",fetchStatus:"idle"}}var Ca,fP,MG=(fP=class extends Dc{constructor(t={}){super();xe(this,Ca,void 0);this.config=t,me(this,Ca,new Map)}build(t,n,r){const a=n.queryKey,o=n.queryHash??t_(a,n);let i=this.get(o);return i||(i=new DG({cache:this,queryKey:a,queryHash:o,options:t.defaultQueryOptions(n),state:r,defaultOptions:t.getQueryDefaults(a)}),this.add(i)),i}add(t){$(this,Ca).has(t.queryHash)||($(this,Ca).set(t.queryHash,t),this.notify({type:"added",query:t}))}remove(t){const n=$(this,Ca).get(t.queryHash);n&&(t.destroy(),n===t&&$(this,Ca).delete(t.queryHash),this.notify({type:"removed",query:t}))}clear(){sn.batch(()=>{this.getAll().forEach(t=>{this.remove(t)})})}get(t){return $(this,Ca).get(t)}getAll(){return[...$(this,Ca).values()]}find(t){const n={exact:!0,...t};return this.getAll().find(r=>_R(n,r))}findAll(t={}){const n=this.getAll();return Object.keys(t).length>0?n.filter(r=>_R(t,r)):n}notify(t){sn.batch(()=>{this.listeners.forEach(n=>{n(t)})})}onFocus(){sn.batch(()=>{this.getAll().forEach(t=>{t.onFocus()})})}onOnline(){sn.batch(()=>{this.getAll().forEach(t=>{t.onOnline()})})}},Ca=new WeakMap,fP),_a,Pd,yr,Xl,Aa,Uo,pP,PG=(pP=class extends hF{constructor(t){super();xe(this,Aa);xe(this,_a,void 0);xe(this,Pd,void 0);xe(this,yr,void 0);xe(this,Xl,void 0);this.mutationId=t.mutationId,me(this,Pd,t.defaultOptions),me(this,yr,t.mutationCache),me(this,_a,[]),this.state=t.state||bF(),this.setOptions(t.options),this.scheduleGc()}setOptions(t){this.options={...$(this,Pd),...t},this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(t){$(this,_a).includes(t)||($(this,_a).push(t),this.clearGcTimeout(),$(this,yr).notify({type:"observerAdded",mutation:this,observer:t}))}removeObserver(t){me(this,_a,$(this,_a).filter(n=>n!==t)),this.scheduleGc(),$(this,yr).notify({type:"observerRemoved",mutation:this,observer:t})}optionalRemove(){$(this,_a).length||(this.state.status==="pending"?this.scheduleGc():$(this,yr).remove(this))}continue(){var t;return((t=$(this,Xl))==null?void 0:t.continue())??this.execute(this.state.variables)}async execute(t){var a,o,i,s,l,c,u,d,g,m,b,y,w,v,h,S,E,k,x,C;const n=()=>(me(this,Xl,mF({fn:()=>this.options.mutationFn?this.options.mutationFn(t):Promise.reject(new Error("No mutationFn found")),onFail:(_,R)=>{Ue(this,Aa,Uo).call(this,{type:"failed",failureCount:_,error:R})},onPause:()=>{Ue(this,Aa,Uo).call(this,{type:"pause"})},onContinue:()=>{Ue(this,Aa,Uo).call(this,{type:"continue"})},retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode})),$(this,Xl).promise),r=this.state.status==="pending";try{if(!r){Ue(this,Aa,Uo).call(this,{type:"pending",variables:t}),await((o=(a=$(this,yr).config).onMutate)==null?void 0:o.call(a,t,this));const R=await((s=(i=this.options).onMutate)==null?void 0:s.call(i,t));R!==this.state.context&&Ue(this,Aa,Uo).call(this,{type:"pending",context:R,variables:t})}const _=await n();return await((c=(l=$(this,yr).config).onSuccess)==null?void 0:c.call(l,_,t,this.state.context,this)),await((d=(u=this.options).onSuccess)==null?void 0:d.call(u,_,t,this.state.context)),await((m=(g=$(this,yr).config).onSettled)==null?void 0:m.call(g,_,null,this.state.variables,this.state.context,this)),await((y=(b=this.options).onSettled)==null?void 0:y.call(b,_,null,t,this.state.context)),Ue(this,Aa,Uo).call(this,{type:"success",data:_}),_}catch(_){try{throw await((v=(w=$(this,yr).config).onError)==null?void 0:v.call(w,_,t,this.state.context,this)),await((S=(h=this.options).onError)==null?void 0:S.call(h,_,t,this.state.context)),await((k=(E=$(this,yr).config).onSettled)==null?void 0:k.call(E,void 0,_,this.state.variables,this.state.context,this)),await((C=(x=this.options).onSettled)==null?void 0:C.call(x,void 0,_,t,this.state.context)),_}finally{Ue(this,Aa,Uo).call(this,{type:"error",error:_})}}}},_a=new WeakMap,Pd=new WeakMap,yr=new WeakMap,Xl=new WeakMap,Aa=new WeakSet,Uo=function(t){const n=r=>{switch(t.type){case"failed":return{...r,failureCount:t.failureCount,failureReason:t.error};case"pause":return{...r,isPaused:!0};case"continue":return{...r,isPaused:!1};case"pending":return{...r,context:t.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:!jm(this.options.networkMode),status:"pending",variables:t.variables,submittedAt:Date.now()};case"success":return{...r,data:t.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...r,data:void 0,error:t.error,failureCount:r.failureCount+1,failureReason:t.error,isPaused:!1,status:"error"}}};this.state=n(this.state),sn.batch(()=>{$(this,_a).forEach(r=>{r.onMutationUpdate(t)}),$(this,yr).notify({mutation:this,type:"updated",action:t})})},pP);function bF(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var Pr,$d,us,gP,$G=(gP=class extends Dc{constructor(t={}){super();xe(this,Pr,void 0);xe(this,$d,void 0);xe(this,us,void 0);this.config=t,me(this,Pr,[]),me(this,$d,0)}build(t,n,r){const a=new PG({mutationCache:this,mutationId:++Tf(this,$d)._,options:t.defaultMutationOptions(n),state:r});return this.add(a),a}add(t){$(this,Pr).push(t),this.notify({type:"added",mutation:t})}remove(t){me(this,Pr,$(this,Pr).filter(n=>n!==t)),this.notify({type:"removed",mutation:t})}clear(){sn.batch(()=>{$(this,Pr).forEach(t=>{this.remove(t)})})}getAll(){return $(this,Pr)}find(t){const n={exact:!0,...t};return $(this,Pr).find(r=>AR(n,r))}findAll(t={}){return $(this,Pr).filter(n=>AR(t,n))}notify(t){sn.batch(()=>{this.listeners.forEach(n=>{n(t)})})}resumePausedMutations(){return me(this,us,($(this,us)??Promise.resolve()).then(()=>{const t=$(this,Pr).filter(n=>n.state.isPaused);return sn.batch(()=>t.reduce((n,r)=>n.then(()=>r.continue().catch(Fr)),Promise.resolve()))}).then(()=>{me(this,us,void 0)})),$(this,us)}},Pr=new WeakMap,$d=new WeakMap,us=new WeakMap,gP);function FG(e){return{onFetch:(t,n)=>{const r=async()=>{var b,y,w,v,h;const a=t.options,o=(w=(y=(b=t.fetchOptions)==null?void 0:b.meta)==null?void 0:y.fetchMore)==null?void 0:w.direction,i=((v=t.state.data)==null?void 0:v.pages)||[],s=((h=t.state.data)==null?void 0:h.pageParams)||[],l={pages:[],pageParams:[]};let c=!1;const u=S=>{Object.defineProperty(S,"signal",{enumerable:!0,get:()=>(t.signal.aborted?c=!0:t.signal.addEventListener("abort",()=>{c=!0}),t.signal)})},d=t.options.queryFn||(()=>Promise.reject(new Error(`Missing queryFn: '${t.options.queryHash}'`))),g=async(S,E,k)=>{if(c)return Promise.reject();if(E==null&&S.pages.length)return Promise.resolve(S);const x={queryKey:t.queryKey,pageParam:E,direction:k?"backward":"forward",meta:t.options.meta};u(x);const C=await d(x),{maxPages:_}=t.options,R=k?TG:AG;return{pages:R(S.pages,C,_),pageParams:R(S.pageParams,E,_)}};let m;if(o&&i.length){const S=o==="backward",E=S?jG:IR,k={pages:i,pageParams:s},x=E(a,k);m=await g(k,x,S)}else{m=await g(l,s[0]??a.initialPageParam);const S=e??i.length;for(let E=1;E{var a,o;return(o=(a=t.options).persister)==null?void 0:o.call(a,r,{queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},n)}:t.fetchFn=r}}}function IR(e,{pages:t,pageParams:n}){const r=t.length-1;return e.getNextPageParam(t[r],t,n[r],n)}function jG(e,{pages:t,pageParams:n}){var r;return(r=e.getPreviousPageParam)==null?void 0:r.call(e,t[0],t,n[0],n)}var an,Jo,ei,Ql,Jl,ti,ec,tc,mP,zG=(mP=class{constructor(e={}){xe(this,an,void 0);xe(this,Jo,void 0);xe(this,ei,void 0);xe(this,Ql,void 0);xe(this,Jl,void 0);xe(this,ti,void 0);xe(this,ec,void 0);xe(this,tc,void 0);me(this,an,e.queryCache||new MG),me(this,Jo,e.mutationCache||new $G),me(this,ei,e.defaultOptions||{}),me(this,Ql,new Map),me(this,Jl,new Map),me(this,ti,0)}mount(){Tf(this,ti)._++,$(this,ti)===1&&(me(this,ec,Cg.subscribe(()=>{Cg.isFocused()&&(this.resumePausedMutations(),$(this,an).onFocus())})),me(this,tc,_g.subscribe(()=>{_g.isOnline()&&(this.resumePausedMutations(),$(this,an).onOnline())})))}unmount(){var e,t;Tf(this,ti)._--,$(this,ti)===0&&((e=$(this,ec))==null||e.call(this),me(this,ec,void 0),(t=$(this,tc))==null||t.call(this),me(this,tc,void 0))}isFetching(e){return $(this,an).findAll({...e,fetchStatus:"fetching"}).length}isMutating(e){return $(this,Jo).findAll({...e,status:"pending"}).length}getQueryData(e){var t;return(t=$(this,an).find({queryKey:e}))==null?void 0:t.state.data}ensureQueryData(e){const t=this.getQueryData(e.queryKey);return t!==void 0?Promise.resolve(t):this.fetchQuery(e)}getQueriesData(e){return this.getQueryCache().findAll(e).map(({queryKey:t,state:n})=>{const r=n.data;return[t,r]})}setQueryData(e,t,n){const r=$(this,an).find({queryKey:e}),a=r==null?void 0:r.state.data,o=_G(t,a);if(typeof o>"u")return;const i=this.defaultQueryOptions({queryKey:e});return $(this,an).build(this,i).setData(o,{...n,manual:!0})}setQueriesData(e,t,n){return sn.batch(()=>this.getQueryCache().findAll(e).map(({queryKey:r})=>[r,this.setQueryData(r,t,n)]))}getQueryState(e){var t;return(t=$(this,an).find({queryKey:e}))==null?void 0:t.state}removeQueries(e){const t=$(this,an);sn.batch(()=>{t.findAll(e).forEach(n=>{t.remove(n)})})}resetQueries(e,t){const n=$(this,an),r={type:"active",...e};return sn.batch(()=>(n.findAll(e).forEach(a=>{a.reset()}),this.refetchQueries(r,t)))}cancelQueries(e={},t={}){const n={revert:!0,...t},r=sn.batch(()=>$(this,an).findAll(e).map(a=>a.cancel(n)));return Promise.all(r).then(Fr).catch(Fr)}invalidateQueries(e={},t={}){return sn.batch(()=>{if($(this,an).findAll(e).forEach(r=>{r.invalidate()}),e.refetchType==="none")return Promise.resolve();const n={...e,type:e.refetchType??e.type??"active"};return this.refetchQueries(n,t)})}refetchQueries(e={},t){const n={...t,cancelRefetch:(t==null?void 0:t.cancelRefetch)??!0},r=sn.batch(()=>$(this,an).findAll(e).filter(a=>!a.isDisabled()).map(a=>{let o=a.fetch(void 0,n);return n.throwOnError||(o=o.catch(Fr)),a.state.fetchStatus==="paused"?Promise.resolve():o}));return Promise.all(r).then(Fr)}fetchQuery(e){const t=this.defaultQueryOptions(e);typeof t.retry>"u"&&(t.retry=!1);const n=$(this,an).build(this,t);return n.isStaleByTime(t.staleTime)?n.fetch(t):Promise.resolve(n.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(Fr).catch(Fr)}fetchInfiniteQuery(e){return e.behavior=FG(e.pages),this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(Fr).catch(Fr)}resumePausedMutations(){return $(this,Jo).resumePausedMutations()}getQueryCache(){return $(this,an)}getMutationCache(){return $(this,Jo)}getDefaultOptions(){return $(this,ei)}setDefaultOptions(e){me(this,ei,e)}setQueryDefaults(e,t){$(this,Ql).set(gd(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){const t=[...$(this,Ql).values()];let n={};return t.forEach(r=>{md(e,r.queryKey)&&(n={...n,...r.defaultOptions})}),n}setMutationDefaults(e,t){$(this,Jl).set(gd(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){const t=[...$(this,Jl).values()];let n={};return t.forEach(r=>{md(e,r.mutationKey)&&(n={...n,...r.defaultOptions})}),n}defaultQueryOptions(e){if(e!=null&&e._defaulted)return e;const t={...$(this,ei).queries,...(e==null?void 0:e.queryKey)&&this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||(t.queryHash=t_(t.queryKey,t)),typeof t.refetchOnReconnect>"u"&&(t.refetchOnReconnect=t.networkMode!=="always"),typeof t.throwOnError>"u"&&(t.throwOnError=!!t.suspense),typeof t.networkMode>"u"&&t.persister&&(t.networkMode="offlineFirst"),t}defaultMutationOptions(e){return e!=null&&e._defaulted?e:{...$(this,ei).mutations,...(e==null?void 0:e.mutationKey)&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){$(this,an).clear(),$(this,Jo).clear()}},an=new WeakMap,Jo=new WeakMap,ei=new WeakMap,Ql=new WeakMap,Jl=new WeakMap,ti=new WeakMap,ec=new WeakMap,tc=new WeakMap,mP),rr,Ct,nc,On,ds,rc,Ta,Fd,ac,oc,fs,ps,ni,gs,ms,Cu,jd,R1,zd,N1,Ud,I1,Bd,O1,Hd,D1,Vd,L1,qd,M1,fm,yF,hP,UG=(hP=class extends Dc{constructor(t,n){super();xe(this,ms);xe(this,jd);xe(this,zd);xe(this,Ud);xe(this,Bd);xe(this,Hd);xe(this,Vd);xe(this,qd);xe(this,fm);xe(this,rr,void 0);xe(this,Ct,void 0);xe(this,nc,void 0);xe(this,On,void 0);xe(this,ds,void 0);xe(this,rc,void 0);xe(this,Ta,void 0);xe(this,Fd,void 0);xe(this,ac,void 0);xe(this,oc,void 0);xe(this,fs,void 0);xe(this,ps,void 0);xe(this,ni,void 0);xe(this,gs,void 0);me(this,Ct,void 0),me(this,nc,void 0),me(this,On,void 0),me(this,gs,new Set),me(this,rr,t),this.options=n,me(this,Ta,null),this.bindMethods(),this.setOptions(n)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&($(this,Ct).addObserver(this),OR($(this,Ct),this.options)?Ue(this,ms,Cu).call(this):this.updateResult(),Ue(this,Bd,O1).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return P1($(this,Ct),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return P1($(this,Ct),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,Ue(this,Hd,D1).call(this),Ue(this,Vd,L1).call(this),$(this,Ct).removeObserver(this)}setOptions(t,n){const r=this.options,a=$(this,Ct);if(this.options=$(this,rr).defaultQueryOptions(t),kg(r,this.options)||$(this,rr).getQueryCache().notify({type:"observerOptionsUpdated",query:$(this,Ct),observer:this}),typeof this.options.enabled<"u"&&typeof this.options.enabled!="boolean")throw new Error("Expected enabled to be a boolean");this.options.queryKey||(this.options.queryKey=r.queryKey),Ue(this,qd,M1).call(this);const o=this.hasListeners();o&&DR($(this,Ct),a,this.options,r)&&Ue(this,ms,Cu).call(this),this.updateResult(n),o&&($(this,Ct)!==a||this.options.enabled!==r.enabled||this.options.staleTime!==r.staleTime)&&Ue(this,jd,R1).call(this);const i=Ue(this,zd,N1).call(this);o&&($(this,Ct)!==a||this.options.enabled!==r.enabled||i!==$(this,ni))&&Ue(this,Ud,I1).call(this,i)}getOptimisticResult(t){const n=$(this,rr).getQueryCache().build($(this,rr),t),r=this.createResult(n,t);return HG(this,r)&&(me(this,On,r),me(this,rc,this.options),me(this,ds,$(this,Ct).state)),r}getCurrentResult(){return $(this,On)}trackResult(t){const n={};return Object.keys(t).forEach(r=>{Object.defineProperty(n,r,{configurable:!1,enumerable:!0,get:()=>($(this,gs).add(r),t[r])})}),n}getCurrentQuery(){return $(this,Ct)}refetch({...t}={}){return this.fetch({...t})}fetchOptimistic(t){const n=$(this,rr).defaultQueryOptions(t),r=$(this,rr).getQueryCache().build($(this,rr),n);return r.isFetchingOptimistic=!0,r.fetch().then(()=>this.createResult(r,n))}fetch(t){return Ue(this,ms,Cu).call(this,{...t,cancelRefetch:t.cancelRefetch??!0}).then(()=>(this.updateResult(),$(this,On)))}createResult(t,n){var x;const r=$(this,Ct),a=this.options,o=$(this,On),i=$(this,ds),s=$(this,rc),c=t!==r?t.state:$(this,nc),{state:u}=t;let{error:d,errorUpdatedAt:g,fetchStatus:m,status:b}=u,y=!1,w;if(n._optimisticResults){const C=this.hasListeners(),_=!C&&OR(t,n),R=C&&DR(t,r,n,a);(_||R)&&(m=jm(t.options.networkMode)?"fetching":"paused",u.dataUpdatedAt||(b="pending")),n._optimisticResults==="isRestoring"&&(m="idle")}if(n.select&&typeof u.data<"u")if(o&&u.data===(i==null?void 0:i.data)&&n.select===$(this,Fd))w=$(this,ac);else try{me(this,Fd,n.select),w=n.select(u.data),w=T1(o==null?void 0:o.data,w,n),me(this,ac,w),me(this,Ta,null)}catch(C){me(this,Ta,C)}else w=u.data;if(typeof n.placeholderData<"u"&&typeof w>"u"&&b==="pending"){let C;if(o!=null&&o.isPlaceholderData&&n.placeholderData===(s==null?void 0:s.placeholderData))C=o.data;else if(C=typeof n.placeholderData=="function"?n.placeholderData((x=$(this,oc))==null?void 0:x.state.data,$(this,oc)):n.placeholderData,n.select&&typeof C<"u")try{C=n.select(C),me(this,Ta,null)}catch(_){me(this,Ta,_)}typeof C<"u"&&(b="success",w=T1(o==null?void 0:o.data,C,n),y=!0)}$(this,Ta)&&(d=$(this,Ta),w=$(this,ac),g=Date.now(),b="error");const v=m==="fetching",h=b==="pending",S=b==="error",E=h&&v;return{status:b,fetchStatus:m,isPending:h,isSuccess:b==="success",isError:S,isInitialLoading:E,isLoading:E,data:w,dataUpdatedAt:u.dataUpdatedAt,error:d,errorUpdatedAt:g,failureCount:u.fetchFailureCount,failureReason:u.fetchFailureReason,errorUpdateCount:u.errorUpdateCount,isFetched:u.dataUpdateCount>0||u.errorUpdateCount>0,isFetchedAfterMount:u.dataUpdateCount>c.dataUpdateCount||u.errorUpdateCount>c.errorUpdateCount,isFetching:v,isRefetching:v&&!h,isLoadingError:S&&u.dataUpdatedAt===0,isPaused:m==="paused",isPlaceholderData:y,isRefetchError:S&&u.dataUpdatedAt!==0,isStale:n_(t,n),refetch:this.refetch}}updateResult(t){const n=$(this,On),r=this.createResult($(this,Ct),this.options);if(me(this,ds,$(this,Ct).state),me(this,rc,this.options),kg(r,n))return;$(this,ds).data!==void 0&&me(this,oc,$(this,Ct)),me(this,On,r);const a={},o=()=>{if(!n)return!0;const{notifyOnChangeProps:i}=this.options,s=typeof i=="function"?i():i;if(s==="all"||!s&&!$(this,gs).size)return!0;const l=new Set(s??$(this,gs));return this.options.throwOnError&&l.add("error"),Object.keys($(this,On)).some(c=>{const u=c;return $(this,On)[u]!==n[u]&&l.has(u)})};(t==null?void 0:t.listeners)!==!1&&o()&&(a.listeners=!0),Ue(this,fm,yF).call(this,{...a,...t})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&Ue(this,Bd,O1).call(this)}},rr=new WeakMap,Ct=new WeakMap,nc=new WeakMap,On=new WeakMap,ds=new WeakMap,rc=new WeakMap,Ta=new WeakMap,Fd=new WeakMap,ac=new WeakMap,oc=new WeakMap,fs=new WeakMap,ps=new WeakMap,ni=new WeakMap,gs=new WeakMap,ms=new WeakSet,Cu=function(t){Ue(this,qd,M1).call(this);let n=$(this,Ct).fetch(this.options,t);return t!=null&&t.throwOnError||(n=n.catch(Fr)),n},jd=new WeakSet,R1=function(){if(Ue(this,Hd,D1).call(this),gc||$(this,On).isStale||!_1(this.options.staleTime))return;const n=dF($(this,On).dataUpdatedAt,this.options.staleTime)+1;me(this,fs,setTimeout(()=>{$(this,On).isStale||this.updateResult()},n))},zd=new WeakSet,N1=function(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval($(this,Ct)):this.options.refetchInterval)??!1},Ud=new WeakSet,I1=function(t){Ue(this,Vd,L1).call(this),me(this,ni,t),!(gc||this.options.enabled===!1||!_1($(this,ni))||$(this,ni)===0)&&me(this,ps,setInterval(()=>{(this.options.refetchIntervalInBackground||Cg.isFocused())&&Ue(this,ms,Cu).call(this)},$(this,ni)))},Bd=new WeakSet,O1=function(){Ue(this,jd,R1).call(this),Ue(this,Ud,I1).call(this,Ue(this,zd,N1).call(this))},Hd=new WeakSet,D1=function(){$(this,fs)&&(clearTimeout($(this,fs)),me(this,fs,void 0))},Vd=new WeakSet,L1=function(){$(this,ps)&&(clearInterval($(this,ps)),me(this,ps,void 0))},qd=new WeakSet,M1=function(){const t=$(this,rr).getQueryCache().build($(this,rr),this.options);if(t===$(this,Ct))return;const n=$(this,Ct);me(this,Ct,t),me(this,nc,t.state),this.hasListeners()&&(n==null||n.removeObserver(this),t.addObserver(this))},fm=new WeakSet,yF=function(t){sn.batch(()=>{t.listeners&&this.listeners.forEach(n=>{n($(this,On))}),$(this,rr).getQueryCache().notify({query:$(this,Ct),type:"observerResultsUpdated"})})},hP);function BG(e,t){return t.enabled!==!1&&!e.state.dataUpdatedAt&&!(e.state.status==="error"&&t.retryOnMount===!1)}function OR(e,t){return BG(e,t)||e.state.dataUpdatedAt>0&&P1(e,t,t.refetchOnMount)}function P1(e,t,n){if(t.enabled!==!1){const r=typeof n=="function"?n(e):n;return r==="always"||r!==!1&&n_(e,t)}return!1}function DR(e,t,n,r){return n.enabled!==!1&&(e!==t||r.enabled===!1)&&(!n.suspense||e.state.status!=="error")&&n_(e,n)}function n_(e,t){return e.isStaleByTime(t.staleTime)}function HG(e,t){return!kg(e.getCurrentResult(),t)}var ri,Wn,$r,oo,ic,Up,Gd,$1,bP,VG=(bP=class extends Dc{constructor(n,r){super();xe(this,ic);xe(this,Gd);xe(this,ri,void 0);xe(this,Wn,void 0);xe(this,$r,void 0);xe(this,oo,void 0);me(this,Wn,void 0),me(this,ri,n),this.setOptions(r),this.bindMethods(),Ue(this,ic,Up).call(this)}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(n){var a;const r=this.options;this.options=$(this,ri).defaultMutationOptions(n),kg(r,this.options)||$(this,ri).getMutationCache().notify({type:"observerOptionsUpdated",mutation:$(this,$r),observer:this}),(a=$(this,$r))==null||a.setOptions(this.options)}onUnsubscribe(){var n;this.hasListeners()||(n=$(this,$r))==null||n.removeObserver(this)}onMutationUpdate(n){Ue(this,ic,Up).call(this),Ue(this,Gd,$1).call(this,n)}getCurrentResult(){return $(this,Wn)}reset(){me(this,$r,void 0),Ue(this,ic,Up).call(this),Ue(this,Gd,$1).call(this)}mutate(n,r){var a;return me(this,oo,r),(a=$(this,$r))==null||a.removeObserver(this),me(this,$r,$(this,ri).getMutationCache().build($(this,ri),this.options)),$(this,$r).addObserver(this),$(this,$r).execute(n)}},ri=new WeakMap,Wn=new WeakMap,$r=new WeakMap,oo=new WeakMap,ic=new WeakSet,Up=function(){var r;const n=((r=$(this,$r))==null?void 0:r.state)??bF();me(this,Wn,{...n,isPending:n.status==="pending",isSuccess:n.status==="success",isError:n.status==="error",isIdle:n.status==="idle",mutate:this.mutate,reset:this.reset})},Gd=new WeakSet,$1=function(n){sn.batch(()=>{var r,a,o,i,s,l,c,u;$(this,oo)&&this.hasListeners()&&((n==null?void 0:n.type)==="success"?((a=(r=$(this,oo)).onSuccess)==null||a.call(r,n.data,$(this,Wn).variables,$(this,Wn).context),(i=(o=$(this,oo)).onSettled)==null||i.call(o,n.data,null,$(this,Wn).variables,$(this,Wn).context)):(n==null?void 0:n.type)==="error"&&((l=(s=$(this,oo)).onError)==null||l.call(s,n.error,$(this,Wn).variables,$(this,Wn).context),(u=(c=$(this,oo)).onSettled)==null||u.call(c,void 0,n.error,$(this,Wn).variables,$(this,Wn).context))),this.listeners.forEach(d=>{d($(this,Wn))})})},bP),vF=p.createContext(void 0),Bt=e=>{const t=p.useContext(vF);if(e)return e;if(!t)throw new Error("No QueryClient set, use QueryClientProvider to set one");return t},qG=({client:e,children:t})=>(p.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),p.createElement(vF.Provider,{value:e},t)),SF=p.createContext(!1),GG=()=>p.useContext(SF);SF.Provider;function WG(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var KG=p.createContext(WG()),YG=()=>p.useContext(KG);function wF(e,t){return typeof e=="function"?e(...t):!!e}var ZG=(e,t)=>{(e.suspense||e.throwOnError)&&(t.isReset()||(e.retryOnMount=!1))},XG=e=>{p.useEffect(()=>{e.clearReset()},[e])},QG=({result:e,errorResetBoundary:t,throwOnError:n,query:r})=>e.isError&&!t.isReset()&&!e.isFetching&&wF(n,[e.error,r]),JG=e=>{e.suspense&&typeof e.staleTime!="number"&&(e.staleTime=1e3)},eW=(e,t)=>e.isLoading&&e.isFetching&&!t,tW=(e,t,n)=>(e==null?void 0:e.suspense)&&eW(t,n),nW=(e,t,n)=>t.fetchOptimistic(e).catch(()=>{n.clearReset()});function rW(e,t,n){const r=Bt(n),a=GG(),o=YG(),i=r.defaultQueryOptions(e);i._optimisticResults=a?"isRestoring":"optimistic",JG(i),ZG(i,o),XG(o);const[s]=p.useState(()=>new t(r,i)),l=s.getOptimisticResult(i);if(p.useSyncExternalStore(p.useCallback(c=>{const u=a?()=>{}:s.subscribe(sn.batchCalls(c));return s.updateResult(),u},[s,a]),()=>s.getCurrentResult(),()=>s.getCurrentResult()),p.useEffect(()=>{s.setOptions(i,{listeners:!1})},[i,s]),tW(i,l,a))throw nW(i,s,o);if(QG({result:l,errorResetBoundary:o,throwOnError:i.throwOnError,query:s.getCurrentQuery()}))throw l.error;return i.notifyOnChangeProps?l:s.trackResult(l)}function Jr(e,t){return rW(e,UG,t)}function gr(e,t){const n=Bt(t),[r]=p.useState(()=>new VG(n,e));p.useEffect(()=>{r.setOptions(e)},[r,e]);const a=p.useSyncExternalStore(p.useCallback(i=>r.subscribe(sn.batchCalls(i)),[r]),()=>r.getCurrentResult(),()=>r.getCurrentResult()),o=p.useCallback((i,s)=>{r.mutate(i,s).catch(aW)},[r]);if(a.error&&wF(r.options.throwOnError,[a.error]))throw a.error;return{...a,mutate:o,mutateAsync:a.mutate}}function aW(){}var oW=function(){return null};/** - * @remix-run/router v1.12.0 - * - * Copyright (c) Remix Software Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */function Wt(){return Wt=Object.assign?Object.assign.bind():function(e){for(var t=1;t"u")throw new Error(t)}function Cs(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function sW(){return Math.random().toString(36).substr(2,8)}function MR(e,t){return{usr:e.state,key:e.key,idx:t}}function hd(e,t,n,r){return n===void 0&&(n=null),Wt({pathname:typeof e=="string"?e:e.pathname,search:"",hash:""},typeof t=="string"?Co(t):t,{state:n,key:t&&t.key||r||sW()})}function _s(e){let{pathname:t="/",search:n="",hash:r=""}=e;return n&&n!=="?"&&(t+=n.charAt(0)==="?"?n:"?"+n),r&&r!=="#"&&(t+=r.charAt(0)==="#"?r:"#"+r),t}function Co(e){let t={};if(e){let n=e.indexOf("#");n>=0&&(t.hash=e.substr(n),e=e.substr(0,n));let r=e.indexOf("?");r>=0&&(t.search=e.substr(r),e=e.substr(0,r)),e&&(t.pathname=e)}return t}function lW(e,t,n,r){r===void 0&&(r={});let{window:a=document.defaultView,v5Compat:o=!1}=r,i=a.history,s=Yt.Pop,l=null,c=u();c==null&&(c=0,i.replaceState(Wt({},i.state,{idx:c}),""));function u(){return(i.state||{idx:null}).idx}function d(){s=Yt.Pop;let w=u(),v=w==null?null:w-c;c=w,l&&l({action:s,location:y.location,delta:v})}function g(w,v){s=Yt.Push;let h=hd(y.location,w,v);n&&n(h,w),c=u()+1;let S=MR(h,c),E=y.createHref(h);try{i.pushState(S,"",E)}catch(k){if(k instanceof DOMException&&k.name==="DataCloneError")throw k;a.location.assign(E)}o&&l&&l({action:s,location:y.location,delta:1})}function m(w,v){s=Yt.Replace;let h=hd(y.location,w,v);n&&n(h,w),c=u();let S=MR(h,c),E=y.createHref(h);i.replaceState(S,"",E),o&&l&&l({action:s,location:y.location,delta:0})}function b(w){let v=a.location.origin!=="null"?a.location.origin:a.location.href,h=typeof w=="string"?w:_s(w);return Ze(v,"No window.location.(origin|href) available to create URL for href: "+h),new URL(h,v)}let y={get action(){return s},get location(){return e(a,i)},listen(w){if(l)throw new Error("A history only accepts one active listener");return a.addEventListener(LR,d),l=w,()=>{a.removeEventListener(LR,d),l=null}},createHref(w){return t(a,w)},createURL:b,encodeLocation(w){let v=b(w);return{pathname:v.pathname,search:v.search,hash:v.hash}},push:g,replace:m,go(w){return i.go(w)}};return y}var Zt;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(Zt||(Zt={}));const cW=new Set(["lazy","caseSensitive","path","id","index","children"]);function uW(e){return e.index===!0}function F1(e,t,n,r){return n===void 0&&(n=[]),r===void 0&&(r={}),e.map((a,o)=>{let i=[...n,o],s=typeof a.id=="string"?a.id:i.join("-");if(Ze(a.index!==!0||!a.children,"Cannot specify children on an index route"),Ze(!r[s],'Found a route id collision on id "'+s+`". Route id's must be globally unique within Data Router usages`),uW(a)){let l=Wt({},a,t(a),{id:s});return r[s]=l,l}else{let l=Wt({},a,t(a),{id:s,children:void 0});return r[s]=l,a.children&&(l.children=F1(a.children,t,i,r)),l}})}function Rl(e,t,n){n===void 0&&(n="/");let r=typeof t=="string"?Co(t):t,a=wi(r.pathname||"/",n);if(a==null)return null;let o=EF(e);fW(o);let i=null;for(let s=0;i==null&&s{let l={relativePath:s===void 0?o.path||"":s,caseSensitive:o.caseSensitive===!0,childrenIndex:i,route:o};l.relativePath.startsWith("/")&&(Ze(l.relativePath.startsWith(r),'Absolute route path "'+l.relativePath+'" nested under path '+('"'+r+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),l.relativePath=l.relativePath.slice(r.length));let c=uo([r,l.relativePath]),u=n.concat(l);o.children&&o.children.length>0&&(Ze(o.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+c+'".')),EF(o.children,t,u,c)),!(o.path==null&&!o.index)&&t.push({path:c,score:vW(c,o.index),routesMeta:u})};return e.forEach((o,i)=>{var s;if(o.path===""||!((s=o.path)!=null&&s.includes("?")))a(o,i);else for(let l of xF(o.path))a(o,i,l)}),t}function xF(e){let t=e.split("/");if(t.length===0)return[];let[n,...r]=t,a=n.endsWith("?"),o=n.replace(/\?$/,"");if(r.length===0)return a?[o,""]:[o];let i=xF(r.join("/")),s=[];return s.push(...i.map(l=>l===""?o:[o,l].join("/"))),a&&s.push(...i),s.map(l=>e.startsWith("/")&&l===""?"/":l)}function fW(e){e.sort((t,n)=>t.score!==n.score?n.score-t.score:SW(t.routesMeta.map(r=>r.childrenIndex),n.routesMeta.map(r=>r.childrenIndex)))}const pW=/^:\w+$/,gW=3,mW=2,hW=1,bW=10,yW=-2,PR=e=>e==="*";function vW(e,t){let n=e.split("/"),r=n.length;return n.some(PR)&&(r+=yW),t&&(r+=mW),n.filter(a=>!PR(a)).reduce((a,o)=>a+(pW.test(o)?gW:o===""?hW:bW),r)}function SW(e,t){return e.length===t.length&&e.slice(0,-1).every((r,a)=>r===t[a])?e[e.length-1]-t[t.length-1]:0}function wW(e,t){let{routesMeta:n}=e,r={},a="/",o=[];for(let i=0;i{let{paramName:g,isOptional:m}=u;if(g==="*"){let y=s[d]||"";i=o.slice(0,o.length-y.length).replace(/(.)\/+$/,"$1")}const b=s[d];return m&&!b?c[g]=void 0:c[g]=kW(b||"",g),c},{}),pathname:o,pathnameBase:i,pattern:e}}function EW(e,t,n){t===void 0&&(t=!1),n===void 0&&(n=!0),Cs(e==="*"||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were '+('"'+e.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+e.replace(/\*$/,"/*")+'".'));let r=[],a="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:(\w+)(\?)?/g,(i,s,l)=>(r.push({paramName:s,isOptional:l!=null}),l?"/?([^\\/]+)?":"/([^\\/]+)"));return e.endsWith("*")?(r.push({paramName:"*"}),a+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):n?a+="\\/*$":e!==""&&e!=="/"&&(a+="(?:(?=\\/|$))"),[new RegExp(a,t?void 0:"i"),r]}function xW(e){try{return decodeURI(e)}catch(t){return Cs(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+t+").")),e}}function kW(e,t){try{return decodeURIComponent(e)}catch(n){return Cs(!1,'The value for the URL param "'+t+'" will not be decoded because'+(' the string "'+e+'" is a malformed URL segment. This is probably')+(" due to a bad percent encoding ("+n+").")),e}}function wi(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith("/")?t.length-1:t.length,r=e.charAt(n);return r&&r!=="/"?null:e.slice(n)||"/"}function CW(e,t){t===void 0&&(t="/");let{pathname:n,search:r="",hash:a=""}=typeof e=="string"?Co(e):e;return{pathname:n?n.startsWith("/")?n:_W(n,t):t,search:TW(r),hash:RW(a)}}function _W(e,t){let n=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(a=>{a===".."?n.length>1&&n.pop():a!=="."&&n.push(a)}),n.length>1?n.join("/"):"/"}function Eb(e,t,n,r){return"Cannot include a '"+e+"' character in a manually specified "+("`to."+t+"` field ["+JSON.stringify(r)+"]. Please separate it out to the ")+("`to."+n+"` field. Alternatively you may provide the full path as ")+'a string in and the router will parse it for you.'}function tf(e){return e.filter((t,n)=>n===0||t.route.path&&t.route.path.length>0)}function zm(e,t,n,r){r===void 0&&(r=!1);let a;typeof e=="string"?a=Co(e):(a=Wt({},e),Ze(!a.pathname||!a.pathname.includes("?"),Eb("?","pathname","search",a)),Ze(!a.pathname||!a.pathname.includes("#"),Eb("#","pathname","hash",a)),Ze(!a.search||!a.search.includes("#"),Eb("#","search","hash",a)));let o=e===""||a.pathname==="",i=o?"/":a.pathname,s;if(i==null)s=n;else if(r){let d=t[t.length-1].replace(/^\//,"").split("/");if(i.startsWith("..")){let g=i.split("/");for(;g[0]==="..";)g.shift(),d.pop();a.pathname=g.join("/")}s="/"+d.join("/")}else{let d=t.length-1;if(i.startsWith("..")){let g=i.split("/");for(;g[0]==="..";)g.shift(),d-=1;a.pathname=g.join("/")}s=d>=0?t[d]:"/"}let l=CW(a,s),c=i&&i!=="/"&&i.endsWith("/"),u=(o||i===".")&&n.endsWith("/");return!l.pathname.endsWith("/")&&(c||u)&&(l.pathname+="/"),l}const uo=e=>e.join("/").replace(/\/\/+/g,"/"),AW=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),TW=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,RW=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;class r_{constructor(t,n,r,a){a===void 0&&(a=!1),this.status=t,this.statusText=n||"",this.internal=a,r instanceof Error?(this.data=r.toString(),this.error=r):this.data=r}}function kF(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const CF=["post","put","patch","delete"],NW=new Set(CF),IW=["get",...CF],OW=new Set(IW),DW=new Set([301,302,303,307,308]),LW=new Set([307,308]),xb={state:"idle",location:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},MW={state:"idle",data:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},ru={state:"unblocked",proceed:void 0,reset:void 0,location:void 0},_F=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,PW=e=>({hasErrorBoundary:!!e.hasErrorBoundary}),AF="remix-router-transitions";function $W(e){const t=e.window?e.window:typeof window<"u"?window:void 0,n=typeof t<"u"&&typeof t.document<"u"&&typeof t.document.createElement<"u",r=!n;Ze(e.routes.length>0,"You must provide a non-empty routes array to createRouter");let a;if(e.mapRouteProperties)a=e.mapRouteProperties;else if(e.detectErrorBoundary){let B=e.detectErrorBoundary;a=G=>({hasErrorBoundary:B(G)})}else a=PW;let o={},i=F1(e.routes,a,void 0,o),s,l=e.basename||"/",c=Wt({v7_fetcherPersist:!1,v7_normalizeFormMethod:!1,v7_prependBasename:!1},e.future),u=null,d=new Set,g=null,m=null,b=null,y=e.hydrationData!=null,w=Rl(i,e.history.location,l),v=null;if(w==null){let B=jr(404,{pathname:e.history.location.pathname}),{matches:G,route:te}=VR(i);w=G,v={[te.id]:B}}let h=!w.some(B=>B.route.lazy)&&(!w.some(B=>B.route.loader)||e.hydrationData!=null),S,E={historyAction:e.history.action,location:e.history.location,matches:w,initialized:h,navigation:xb,restoreScrollPosition:e.hydrationData!=null?!1:null,preventScrollReset:!1,revalidation:"idle",loaderData:e.hydrationData&&e.hydrationData.loaderData||{},actionData:e.hydrationData&&e.hydrationData.actionData||null,errors:e.hydrationData&&e.hydrationData.errors||v,fetchers:new Map,blockers:new Map},k=Yt.Pop,x=!1,C,_=!1,R=new Map,T=null,L=!1,D=!1,H=[],z=[],M=new Map,U=0,X=-1,j=new Map,O=new Set,A=new Map,V=new Map,P=new Set,N=new Map,K=new Map,ae=!1;function ne(){if(u=e.history.listen(B=>{let{action:G,location:te,delta:be}=B;if(ae){ae=!1;return}Cs(K.size===0||be!=null,"You are trying to use a blocker on a POP navigation to a location that was not created by @remix-run/router. This will fail silently in production. This can happen if you are navigating outside the router via `window.history.pushState`/`window.location.hash` instead of using router navigation APIs. This can also happen if you are using createHashRouter and the user manually changes the URL.");let Te=Io({currentLocation:E.location,nextLocation:te,historyAction:G});if(Te&&be!=null){ae=!0,e.history.go(be*-1),Sn(Te,{state:"blocked",location:te,proceed(){Sn(Te,{state:"proceeding",proceed:void 0,reset:void 0,location:te}),e.history.go(be)},reset(){let Qe=new Map(E.blockers);Qe.set(Te,ru),he({blockers:Qe})}});return}return We(G,te)}),n){KW(t,R);let B=()=>YW(t,R);t.addEventListener("pagehide",B),T=()=>t.removeEventListener("pagehide",B)}return E.initialized||We(Yt.Pop,E.location),S}function Q(){u&&u(),T&&T(),d.clear(),C&&C.abort(),E.fetchers.forEach((B,G)=>St(G)),E.blockers.forEach((B,G)=>Ir(G))}function pe(B){return d.add(B),()=>d.delete(B)}function he(B,G){G===void 0&&(G={}),E=Wt({},E,B);let te=[],be=[];c.v7_fetcherPersist&&E.fetchers.forEach((Te,Qe)=>{Te.state==="idle"&&(P.has(Qe)?be.push(Qe):te.push(Qe))}),[...d].forEach(Te=>Te(E,{deletedFetchers:be,unstable_viewTransitionOpts:G.viewTransitionOpts,unstable_flushSync:G.flushSync===!0})),c.v7_fetcherPersist&&(te.forEach(Te=>E.fetchers.delete(Te)),be.forEach(Te=>St(Te)))}function re(B,G,te){var be,Te;let{flushSync:Qe}=te===void 0?{}:te,je=E.actionData!=null&&E.navigation.formMethod!=null&&ca(E.navigation.formMethod)&&E.navigation.state==="loading"&&((be=B.state)==null?void 0:be._isRedirect)!==!0,Le;G.actionData?Object.keys(G.actionData).length>0?Le=G.actionData:Le=null:je?Le=E.actionData:Le=null;let Re=G.loaderData?HR(E.loaderData,G.loaderData,G.matches||[],G.errors):E.loaderData,it=E.blockers;it.size>0&&(it=new Map(it),it.forEach((xt,Ft)=>it.set(Ft,ru)));let wn=x===!0||E.navigation.formMethod!=null&&ca(E.navigation.formMethod)&&((Te=B.state)==null?void 0:Te._isRedirect)!==!0;s&&(i=s,s=void 0),L||k===Yt.Pop||(k===Yt.Push?e.history.push(B,B.state):k===Yt.Replace&&e.history.replace(B,B.state));let et;if(k===Yt.Pop){let xt=R.get(E.location.pathname);xt&&xt.has(B.pathname)?et={currentLocation:E.location,nextLocation:B}:R.has(B.pathname)&&(et={currentLocation:B,nextLocation:E.location})}else if(_){let xt=R.get(E.location.pathname);xt?xt.add(B.pathname):(xt=new Set([B.pathname]),R.set(E.location.pathname,xt)),et={currentLocation:E.location,nextLocation:B}}he(Wt({},G,{actionData:Le,loaderData:Re,historyAction:k,location:B,initialized:!0,navigation:xb,revalidation:"idle",restoreScrollPosition:rT(B,G.matches||E.matches),preventScrollReset:wn,blockers:it}),{viewTransitionOpts:et,flushSync:Qe===!0}),k=Yt.Pop,x=!1,_=!1,L=!1,D=!1,H=[],z=[]}async function Ee(B,G){if(typeof B=="number"){e.history.go(B);return}let te=z1(E.location,E.matches,l,c.v7_prependBasename,B,G==null?void 0:G.fromRouteId,G==null?void 0:G.relative),{path:be,submission:Te,error:Qe}=$R(c.v7_normalizeFormMethod,!1,te,G),je=E.location,Le=hd(E.location,be,G&&G.state);Le=Wt({},Le,e.history.encodeLocation(Le));let Re=G&&G.replace!=null?G.replace:void 0,it=Yt.Push;Re===!0?it=Yt.Replace:Re===!1||Te!=null&&ca(Te.formMethod)&&Te.formAction===E.location.pathname+E.location.search&&(it=Yt.Replace);let wn=G&&"preventScrollReset"in G?G.preventScrollReset===!0:void 0,et=(G&&G.unstable_flushSync)===!0,xt=Io({currentLocation:je,nextLocation:Le,historyAction:it});if(xt){Sn(xt,{state:"blocked",location:Le,proceed(){Sn(xt,{state:"proceeding",proceed:void 0,reset:void 0,location:Le}),Ee(B,G)},reset(){let Ft=new Map(E.blockers);Ft.set(xt,ru),he({blockers:Ft})}});return}return await We(it,Le,{submission:Te,pendingError:Qe,preventScrollReset:wn,replace:G&&G.replace,enableViewTransition:G&&G.unstable_viewTransition,flushSync:et})}function ke(){if(de(),he({revalidation:"loading"}),E.navigation.state!=="submitting"){if(E.navigation.state==="idle"){We(E.historyAction,E.location,{startUninterruptedRevalidation:!0});return}We(k||E.historyAction,E.navigation.location,{overrideNavigation:E.navigation})}}async function We(B,G,te){C&&C.abort(),C=null,k=B,L=(te&&te.startUninterruptedRevalidation)===!0,na(E.location,E.matches),x=(te&&te.preventScrollReset)===!0,_=(te&&te.enableViewTransition)===!0;let be=s||i,Te=te&&te.overrideNavigation,Qe=Rl(be,G,l),je=(te&&te.flushSync)===!0;if(!Qe){let Ft=jr(404,{pathname:G.pathname}),{matches:qn,route:Sa}=VR(be);Za(),re(G,{matches:qn,loaderData:{},errors:{[Sa.id]:Ft}},{flushSync:je});return}if(E.initialized&&!D&&BW(E.location,G)&&!(te&&te.submission&&ca(te.submission.formMethod))){re(G,{matches:Qe},{flushSync:je});return}C=new AbortController;let Le=ou(e.history,G,C.signal,te&&te.submission),Re,it;if(te&&te.pendingError)it={[Uu(Qe).route.id]:te.pendingError};else if(te&&te.submission&&ca(te.submission.formMethod)){let Ft=await Vt(Le,G,te.submission,Qe,{replace:te.replace,flushSync:je});if(Ft.shortCircuited)return;Re=Ft.pendingActionData,it=Ft.pendingActionError,Te=kb(G,te.submission),je=!1,Le=new Request(Le.url,{signal:Le.signal})}let{shortCircuited:wn,loaderData:et,errors:xt}=await mt(Le,G,Qe,Te,te&&te.submission,te&&te.fetcherSubmission,te&&te.replace,je,Re,it);wn||(C=null,re(G,Wt({matches:Qe},Re?{actionData:Re}:{},{loaderData:et,errors:xt})))}async function Vt(B,G,te,be,Te){Te===void 0&&(Te={}),de();let Qe=GW(G,te);he({navigation:Qe},{flushSync:Te.flushSync===!0});let je,Le=B1(be,G);if(!Le.route.action&&!Le.route.lazy)je={type:Zt.error,error:jr(405,{method:B.method,pathname:G.pathname,routeId:Le.route.id})};else if(je=await au("action",B,Le,be,o,a,l),B.signal.aborted)return{shortCircuited:!0};if(zl(je)){let Re;return Te&&Te.replace!=null?Re=Te.replace:Re=je.location===E.location.pathname+E.location.search,await Y(E,je,{submission:te,replace:Re}),{shortCircuited:!0}}if(Bu(je)){let Re=Uu(be,Le.route.id);return(Te&&Te.replace)!==!0&&(k=Yt.Push),{pendingActionData:{},pendingActionError:{[Re.route.id]:je.error}}}if(rs(je))throw jr(400,{type:"defer-action"});return{pendingActionData:{[Le.route.id]:je.data}}}async function mt(B,G,te,be,Te,Qe,je,Le,Re,it){let wn=be||kb(G,Te),et=Te||Qe||WR(wn),xt=s||i,[Ft,qn]=FR(e.history,E,te,et,G,D,H,z,A,O,xt,l,Re,it);if(Za(kt=>!(te&&te.some(Or=>Or.route.id===kt))||Ft&&Ft.some(Or=>Or.route.id===kt)),X=++U,Ft.length===0&&qn.length===0){let kt=He();return re(G,Wt({matches:te,loaderData:{},errors:it||null},Re?{actionData:Re}:{},kt?{fetchers:new Map(E.fetchers)}:{}),{flushSync:Le}),{shortCircuited:!0}}if(!L){qn.forEach(Or=>{let Qt=E.fetchers.get(Or.key),ji=iu(void 0,Qt?Qt.data:void 0);E.fetchers.set(Or.key,ji)});let kt=Re||E.actionData;he(Wt({navigation:wn},kt?Object.keys(kt).length===0?{actionData:null}:{actionData:kt}:{},qn.length>0?{fetchers:new Map(E.fetchers)}:{}),{flushSync:Le})}qn.forEach(kt=>{M.has(kt.key)&&le(kt.key),kt.controller&&M.set(kt.key,kt.controller)});let Sa=()=>qn.forEach(kt=>le(kt.key));C&&C.signal.addEventListener("abort",Sa);let{results:Gc,loaderResults:Uh,fetcherResults:Ys}=await ye(E.matches,te,Ft,qn,B);if(B.signal.aborted)return{shortCircuited:!0};C&&C.signal.removeEventListener("abort",Sa),qn.forEach(kt=>M.delete(kt.key));let ra=qR(Gc);if(ra){if(ra.idx>=Ft.length){let kt=qn[ra.idx-Ft.length].key;O.add(kt)}return await Y(E,ra.result,{replace:je}),{shortCircuited:!0}}let{loaderData:Af,errors:Bh}=BR(E,te,Ft,Uh,it,qn,Ys,N);N.forEach((kt,Or)=>{kt.subscribe(Qt=>{(Qt||kt.done)&&N.delete(Or)})});let Hh=He(),Vh=ft(X),Zs=Hh||Vh||qn.length>0;return Wt({loaderData:Af,errors:Bh},Zs?{fetchers:new Map(E.fetchers)}:{})}function Hn(B,G,te,be){if(r)throw new Error("router.fetch() was called during the server render, but it shouldn't be. You are likely calling a useFetcher() method in the body of your component. Try moving it to a useEffect or a callback.");M.has(B)&&le(B);let Te=(be&&be.unstable_flushSync)===!0,Qe=s||i,je=z1(E.location,E.matches,l,c.v7_prependBasename,te,G,be==null?void 0:be.relative),Le=Rl(Qe,je,l);if(!Le){_e(B,G,jr(404,{pathname:je}),{flushSync:Te});return}let{path:Re,submission:it,error:wn}=$R(c.v7_normalizeFormMethod,!0,je,be);if(wn){_e(B,G,wn,{flushSync:Te});return}let et=B1(Le,Re);if(x=(be&&be.preventScrollReset)===!0,it&&ca(it.formMethod)){F(B,G,Re,et,Le,Te,it);return}A.set(B,{routeId:G,path:Re}),q(B,G,Re,et,Le,Te,it)}async function F(B,G,te,be,Te,Qe,je){if(de(),A.delete(B),!be.route.action&&!be.route.lazy){let Qt=jr(405,{method:je.formMethod,pathname:te,routeId:G});_e(B,G,Qt,{flushSync:Qe});return}let Le=E.fetchers.get(B);oe(B,WW(je,Le),{flushSync:Qe});let Re=new AbortController,it=ou(e.history,te,Re.signal,je);M.set(B,Re);let wn=U,et=await au("action",it,be,Te,o,a,l);if(it.signal.aborted){M.get(B)===Re&&M.delete(B);return}if(P.has(B)){oe(B,Bo(void 0));return}if(zl(et))if(M.delete(B),X>wn){oe(B,Bo(void 0));return}else return O.add(B),oe(B,iu(je)),Y(E,et,{fetcherSubmission:je});if(Bu(et)){_e(B,G,et.error);return}if(rs(et))throw jr(400,{type:"defer-action"});let xt=E.navigation.location||E.location,Ft=ou(e.history,xt,Re.signal),qn=s||i,Sa=E.navigation.state!=="idle"?Rl(qn,E.navigation.location,l):E.matches;Ze(Sa,"Didn't find any matches after fetcher action");let Gc=++U;j.set(B,Gc);let Uh=iu(je,et.data);E.fetchers.set(B,Uh);let[Ys,ra]=FR(e.history,E,Sa,je,xt,D,H,z,A,O,qn,l,{[be.route.id]:et.data},void 0);ra.filter(Qt=>Qt.key!==B).forEach(Qt=>{let ji=Qt.key,aT=E.fetchers.get(ji),nB=iu(void 0,aT?aT.data:void 0);E.fetchers.set(ji,nB),M.has(ji)&&le(ji),Qt.controller&&M.set(ji,Qt.controller)}),he({fetchers:new Map(E.fetchers)});let Af=()=>ra.forEach(Qt=>le(Qt.key));Re.signal.addEventListener("abort",Af);let{results:Bh,loaderResults:Hh,fetcherResults:Vh}=await ye(E.matches,Sa,Ys,ra,Ft);if(Re.signal.aborted)return;Re.signal.removeEventListener("abort",Af),j.delete(B),M.delete(B),ra.forEach(Qt=>M.delete(Qt.key));let Zs=qR(Bh);if(Zs){if(Zs.idx>=Ys.length){let Qt=ra[Zs.idx-Ys.length].key;O.add(Qt)}return Y(E,Zs.result)}let{loaderData:kt,errors:Or}=BR(E,E.matches,Ys,Hh,void 0,ra,Vh,N);if(E.fetchers.has(B)){let Qt=Bo(et.data);E.fetchers.set(B,Qt)}ft(Gc),E.navigation.state==="loading"&&Gc>X?(Ze(k,"Expected pending action"),C&&C.abort(),re(E.navigation.location,{matches:Sa,loaderData:kt,errors:Or,fetchers:new Map(E.fetchers)})):(he({errors:Or,loaderData:HR(E.loaderData,kt,Sa,Or),fetchers:new Map(E.fetchers)}),D=!1)}async function q(B,G,te,be,Te,Qe,je){let Le=E.fetchers.get(B);oe(B,iu(je,Le?Le.data:void 0),{flushSync:Qe});let Re=new AbortController,it=ou(e.history,te,Re.signal);M.set(B,Re);let wn=U,et=await au("loader",it,be,Te,o,a,l);if(rs(et)&&(et=await NF(et,it.signal,!0)||et),M.get(B)===Re&&M.delete(B),!it.signal.aborted){if(P.has(B)){oe(B,Bo(void 0));return}if(zl(et))if(X>wn){oe(B,Bo(void 0));return}else{O.add(B),await Y(E,et);return}if(Bu(et)){_e(B,G,et.error);return}Ze(!rs(et),"Unhandled fetcher deferred data"),oe(B,Bo(et.data))}}async function Y(B,G,te){let{submission:be,fetcherSubmission:Te,replace:Qe}=te===void 0?{}:te;G.revalidate&&(D=!0);let je=hd(B.location,G.location,{_isRedirect:!0});if(Ze(je,"Expected a location on the redirect navigation"),n){let xt=!1;if(G.reloadDocument)xt=!0;else if(_F.test(G.location)){const Ft=e.history.createURL(G.location);xt=Ft.origin!==t.location.origin||wi(Ft.pathname,l)==null}if(xt){Qe?t.location.replace(G.location):t.location.assign(G.location);return}}C=null;let Le=Qe===!0?Yt.Replace:Yt.Push,{formMethod:Re,formAction:it,formEncType:wn}=B.navigation;!be&&!Te&&Re&&it&&wn&&(be=WR(B.navigation));let et=be||Te;if(LW.has(G.status)&&et&&ca(et.formMethod))await We(Le,je,{submission:Wt({},et,{formAction:G.location}),preventScrollReset:x});else{let xt=kb(je,be);await We(Le,je,{overrideNavigation:xt,fetcherSubmission:Te,preventScrollReset:x})}}async function ye(B,G,te,be,Te){let Qe=await Promise.all([...te.map(Re=>au("loader",Te,Re,G,o,a,l)),...be.map(Re=>Re.matches&&Re.match&&Re.controller?au("loader",ou(e.history,Re.path,Re.controller.signal),Re.match,Re.matches,o,a,l):{type:Zt.error,error:jr(404,{pathname:Re.path})})]),je=Qe.slice(0,te.length),Le=Qe.slice(te.length);return await Promise.all([GR(B,te,je,je.map(()=>Te.signal),!1,E.loaderData),GR(B,be.map(Re=>Re.match),Le,be.map(Re=>Re.controller?Re.controller.signal:null),!0)]),{results:Qe,loaderResults:je,fetcherResults:Le}}function de(){D=!0,H.push(...Za()),A.forEach((B,G)=>{M.has(G)&&(z.push(G),le(G))})}function oe(B,G,te){te===void 0&&(te={}),E.fetchers.set(B,G),he({fetchers:new Map(E.fetchers)},{flushSync:(te&&te.flushSync)===!0})}function _e(B,G,te,be){be===void 0&&(be={});let Te=Uu(E.matches,G);St(B),he({errors:{[Te.route.id]:te},fetchers:new Map(E.fetchers)},{flushSync:(be&&be.flushSync)===!0})}function wt(B){return c.v7_fetcherPersist&&(V.set(B,(V.get(B)||0)+1),P.has(B)&&P.delete(B)),E.fetchers.get(B)||MW}function St(B){let G=E.fetchers.get(B);M.has(B)&&!(G&&G.state==="loading"&&j.has(B))&&le(B),A.delete(B),j.delete(B),O.delete(B),P.delete(B),E.fetchers.delete(B)}function Z(B){if(c.v7_fetcherPersist){let G=(V.get(B)||0)-1;G<=0?(V.delete(B),P.add(B)):V.set(B,G)}else St(B);he({fetchers:new Map(E.fetchers)})}function le(B){let G=M.get(B);Ze(G,"Expected fetch controller: "+B),G.abort(),M.delete(B)}function De(B){for(let G of B){let te=wt(G),be=Bo(te.data);E.fetchers.set(G,be)}}function He(){let B=[],G=!1;for(let te of O){let be=E.fetchers.get(te);Ze(be,"Expected fetcher: "+te),be.state==="loading"&&(O.delete(te),B.push(te),G=!0)}return De(B),G}function ft(B){let G=[];for(let[te,be]of j)if(be0}function Tn(B,G){let te=E.blockers.get(B)||ru;return K.get(B)!==G&&K.set(B,G),te}function Ir(B){E.blockers.delete(B),K.delete(B)}function Sn(B,G){let te=E.blockers.get(B)||ru;Ze(te.state==="unblocked"&&G.state==="blocked"||te.state==="blocked"&&G.state==="blocked"||te.state==="blocked"&&G.state==="proceeding"||te.state==="blocked"&&G.state==="unblocked"||te.state==="proceeding"&&G.state==="unblocked","Invalid blocker state transition: "+te.state+" -> "+G.state);let be=new Map(E.blockers);be.set(B,G),he({blockers:be})}function Io(B){let{currentLocation:G,nextLocation:te,historyAction:be}=B;if(K.size===0)return;K.size>1&&Cs(!1,"A router only supports one blocker at a time");let Te=Array.from(K.entries()),[Qe,je]=Te[Te.length-1],Le=E.blockers.get(Qe);if(!(Le&&Le.state==="proceeding")&&je({currentLocation:G,nextLocation:te,historyAction:be}))return Qe}function Za(B){let G=[];return N.forEach((te,be)=>{(!B||B(be))&&(te.cancel(),G.push(be),N.delete(be))}),G}function Vn(B,G,te){if(g=B,b=G,m=te||null,!y&&E.navigation===xb){y=!0;let be=rT(E.location,E.matches);be!=null&&he({restoreScrollPosition:be})}return()=>{g=null,b=null,m=null}}function Xa(B,G){return m&&m(B,G.map(be=>dW(be,E.loaderData)))||B.key}function na(B,G){if(g&&b){let te=Xa(B,G);g[te]=b()}}function rT(B,G){if(g){let te=Xa(B,G),be=g[te];if(typeof be=="number")return be}return null}function tB(B){o={},s=F1(B,a,void 0,o)}return S={get basename(){return l},get state(){return E},get routes(){return i},get window(){return t},initialize:ne,subscribe:pe,enableScrollRestoration:Vn,navigate:Ee,fetch:Hn,revalidate:ke,createHref:B=>e.history.createHref(B),encodeLocation:B=>e.history.encodeLocation(B),getFetcher:wt,deleteFetcher:Z,dispose:Q,getBlocker:Tn,deleteBlocker:Ir,_internalFetchControllers:M,_internalActiveDeferreds:N,_internalSetRoutes:tB},S}function FW(e){return e!=null&&("formData"in e&&e.formData!=null||"body"in e&&e.body!==void 0)}function z1(e,t,n,r,a,o,i){let s,l;if(o){s=[];for(let u of t)if(s.push(u),u.route.id===o){l=u;break}}else s=t,l=t[t.length-1];let c=zm(a||".",tf(s).map(u=>u.pathnameBase),wi(e.pathname,n)||e.pathname,i==="path");return a==null&&(c.search=e.search,c.hash=e.hash),(a==null||a===""||a===".")&&l&&l.route.index&&!a_(c.search)&&(c.search=c.search?c.search.replace(/^\?/,"?index&"):"?index"),r&&n!=="/"&&(c.pathname=c.pathname==="/"?n:uo([n,c.pathname])),_s(c)}function $R(e,t,n,r){if(!r||!FW(r))return{path:n};if(r.formMethod&&!qW(r.formMethod))return{path:n,error:jr(405,{method:r.formMethod})};let a=()=>({path:n,error:jr(400,{type:"invalid-body"})}),o=r.formMethod||"get",i=e?o.toUpperCase():o.toLowerCase(),s=RF(n);if(r.body!==void 0){if(r.formEncType==="text/plain"){if(!ca(i))return a();let g=typeof r.body=="string"?r.body:r.body instanceof FormData||r.body instanceof URLSearchParams?Array.from(r.body.entries()).reduce((m,b)=>{let[y,w]=b;return""+m+y+"="+w+` -`},""):String(r.body);return{path:n,submission:{formMethod:i,formAction:s,formEncType:r.formEncType,formData:void 0,json:void 0,text:g}}}else if(r.formEncType==="application/json"){if(!ca(i))return a();try{let g=typeof r.body=="string"?JSON.parse(r.body):r.body;return{path:n,submission:{formMethod:i,formAction:s,formEncType:r.formEncType,formData:void 0,json:g,text:void 0}}}catch{return a()}}}Ze(typeof FormData=="function","FormData is not available in this environment");let l,c;if(r.formData)l=U1(r.formData),c=r.formData;else if(r.body instanceof FormData)l=U1(r.body),c=r.body;else if(r.body instanceof URLSearchParams)l=r.body,c=UR(l);else if(r.body==null)l=new URLSearchParams,c=new FormData;else try{l=new URLSearchParams(r.body),c=UR(l)}catch{return a()}let u={formMethod:i,formAction:s,formEncType:r&&r.formEncType||"application/x-www-form-urlencoded",formData:c,json:void 0,text:void 0};if(ca(u.formMethod))return{path:n,submission:u};let d=Co(n);return t&&d.search&&a_(d.search)&&l.append("index",""),d.search="?"+l,{path:_s(d),submission:u}}function jW(e,t){let n=e;if(t){let r=e.findIndex(a=>a.route.id===t);r>=0&&(n=e.slice(0,r))}return n}function FR(e,t,n,r,a,o,i,s,l,c,u,d,g,m){let b=m?Object.values(m)[0]:g?Object.values(g)[0]:void 0,y=e.createURL(t.location),w=e.createURL(a),v=m?Object.keys(m)[0]:void 0,S=jW(n,v).filter((k,x)=>{if(k.route.lazy)return!0;if(k.route.loader==null)return!1;if(zW(t.loaderData,t.matches[x],k)||i.some(R=>R===k.route.id))return!0;let C=t.matches[x],_=k;return jR(k,Wt({currentUrl:y,currentParams:C.params,nextUrl:w,nextParams:_.params},r,{actionResult:b,defaultShouldRevalidate:o||y.pathname+y.search===w.pathname+w.search||y.search!==w.search||TF(C,_)}))}),E=[];return l.forEach((k,x)=>{if(!n.some(L=>L.route.id===k.routeId))return;let C=Rl(u,k.path,d);if(!C){E.push({key:x,routeId:k.routeId,path:k.path,matches:null,match:null,controller:null});return}let _=t.fetchers.get(x),R=B1(C,k.path),T=!1;c.has(x)?T=!1:s.includes(x)?T=!0:_&&_.state!=="idle"&&_.data===void 0?T=o:T=jR(R,Wt({currentUrl:y,currentParams:t.matches[t.matches.length-1].params,nextUrl:w,nextParams:n[n.length-1].params},r,{actionResult:b,defaultShouldRevalidate:o})),T&&E.push({key:x,routeId:k.routeId,path:k.path,matches:C,match:R,controller:new AbortController})}),[S,E]}function zW(e,t,n){let r=!t||n.route.id!==t.route.id,a=e[n.route.id]===void 0;return r||a}function TF(e,t){let n=e.route.path;return e.pathname!==t.pathname||n!=null&&n.endsWith("*")&&e.params["*"]!==t.params["*"]}function jR(e,t){if(e.route.shouldRevalidate){let n=e.route.shouldRevalidate(t);if(typeof n=="boolean")return n}return t.defaultShouldRevalidate}async function zR(e,t,n){if(!e.lazy)return;let r=await e.lazy();if(!e.lazy)return;let a=n[e.id];Ze(a,"No route found in manifest");let o={};for(let i in r){let l=a[i]!==void 0&&i!=="hasErrorBoundary";Cs(!l,'Route "'+a.id+'" has a static property "'+i+'" defined but its lazy function is also returning a value for this property. '+('The lazy route property "'+i+'" will be ignored.')),!l&&!cW.has(i)&&(o[i]=r[i])}Object.assign(a,o),Object.assign(a,Wt({},t(a),{lazy:void 0}))}async function au(e,t,n,r,a,o,i,s){s===void 0&&(s={});let l,c,u,d=b=>{let y,w=new Promise((v,h)=>y=h);return u=()=>y(),t.signal.addEventListener("abort",u),Promise.race([b({request:t,params:n.params,context:s.requestContext}),w])};try{let b=n.route[e];if(n.route.lazy)if(b){let y,w=await Promise.all([d(b).catch(v=>{y=v}),zR(n.route,o,a)]);if(y)throw y;c=w[0]}else if(await zR(n.route,o,a),b=n.route[e],b)c=await d(b);else if(e==="action"){let y=new URL(t.url),w=y.pathname+y.search;throw jr(405,{method:t.method,pathname:w,routeId:n.route.id})}else return{type:Zt.data,data:void 0};else if(b)c=await d(b);else{let y=new URL(t.url),w=y.pathname+y.search;throw jr(404,{pathname:w})}Ze(c!==void 0,"You defined "+(e==="action"?"an action":"a loader")+" for route "+('"'+n.route.id+"\" but didn't return anything from your `"+e+"` ")+"function. Please return a value or `null`.")}catch(b){l=Zt.error,c=b}finally{u&&t.signal.removeEventListener("abort",u)}if(VW(c)){let b=c.status;if(DW.has(b)){let v=c.headers.get("Location");if(Ze(v,"Redirects returned/thrown from loaders/actions must have a Location header"),!_F.test(v))v=z1(new URL(t.url),r.slice(0,r.indexOf(n)+1),i,!0,v);else if(!s.isStaticRequest){let h=new URL(t.url),S=v.startsWith("//")?new URL(h.protocol+v):new URL(v),E=wi(S.pathname,i)!=null;S.origin===h.origin&&E&&(v=S.pathname+S.search+S.hash)}if(s.isStaticRequest)throw c.headers.set("Location",v),c;return{type:Zt.redirect,status:b,location:v,revalidate:c.headers.get("X-Remix-Revalidate")!==null,reloadDocument:c.headers.get("X-Remix-Reload-Document")!==null}}if(s.isRouteRequest)throw{type:l===Zt.error?Zt.error:Zt.data,response:c};let y,w=c.headers.get("Content-Type");return w&&/\bapplication\/json\b/.test(w)?y=await c.json():y=await c.text(),l===Zt.error?{type:l,error:new r_(b,c.statusText,y),headers:c.headers}:{type:Zt.data,data:y,statusCode:c.status,headers:c.headers}}if(l===Zt.error)return{type:l,error:c};if(HW(c)){var g,m;return{type:Zt.deferred,deferredData:c,statusCode:(g=c.init)==null?void 0:g.status,headers:((m=c.init)==null?void 0:m.headers)&&new Headers(c.init.headers)}}return{type:Zt.data,data:c}}function ou(e,t,n,r){let a=e.createURL(RF(t)).toString(),o={signal:n};if(r&&ca(r.formMethod)){let{formMethod:i,formEncType:s}=r;o.method=i.toUpperCase(),s==="application/json"?(o.headers=new Headers({"Content-Type":s}),o.body=JSON.stringify(r.json)):s==="text/plain"?o.body=r.text:s==="application/x-www-form-urlencoded"&&r.formData?o.body=U1(r.formData):o.body=r.formData}return new Request(a,o)}function U1(e){let t=new URLSearchParams;for(let[n,r]of e.entries())t.append(n,typeof r=="string"?r:r.name);return t}function UR(e){let t=new FormData;for(let[n,r]of e.entries())t.append(n,r);return t}function UW(e,t,n,r,a){let o={},i=null,s,l=!1,c={};return n.forEach((u,d)=>{let g=t[d].route.id;if(Ze(!zl(u),"Cannot handle redirect results in processLoaderData"),Bu(u)){let m=Uu(e,g),b=u.error;r&&(b=Object.values(r)[0],r=void 0),i=i||{},i[m.route.id]==null&&(i[m.route.id]=b),o[g]=void 0,l||(l=!0,s=kF(u.error)?u.error.status:500),u.headers&&(c[g]=u.headers)}else rs(u)?(a.set(g,u.deferredData),o[g]=u.deferredData.data):o[g]=u.data,u.statusCode!=null&&u.statusCode!==200&&!l&&(s=u.statusCode),u.headers&&(c[g]=u.headers)}),r&&(i=r,o[Object.keys(r)[0]]=void 0),{loaderData:o,errors:i,statusCode:s||200,loaderHeaders:c}}function BR(e,t,n,r,a,o,i,s){let{loaderData:l,errors:c}=UW(t,n,r,a,s);for(let u=0;ur.route.id===t)+1):[...e]).reverse().find(r=>r.route.hasErrorBoundary===!0)||e[0]}function VR(e){let t=e.length===1?e[0]:e.find(n=>n.index||!n.path||n.path==="/")||{id:"__shim-error-route__"};return{matches:[{params:{},pathname:"",pathnameBase:"",route:t}],route:t}}function jr(e,t){let{pathname:n,routeId:r,method:a,type:o}=t===void 0?{}:t,i="Unknown Server Error",s="Unknown @remix-run/router error";return e===400?(i="Bad Request",a&&n&&r?s="You made a "+a+' request to "'+n+'" but '+('did not provide a `loader` for route "'+r+'", ')+"so there is no way to handle the request.":o==="defer-action"?s="defer() is not supported in actions":o==="invalid-body"&&(s="Unable to encode submission body")):e===403?(i="Forbidden",s='Route "'+r+'" does not match URL "'+n+'"'):e===404?(i="Not Found",s='No route matches URL "'+n+'"'):e===405&&(i="Method Not Allowed",a&&n&&r?s="You made a "+a.toUpperCase()+' request to "'+n+'" but '+('did not provide an `action` for route "'+r+'", ')+"so there is no way to handle the request.":a&&(s='Invalid request method "'+a.toUpperCase()+'"')),new r_(e||500,i,new Error(s),!0)}function qR(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(zl(n))return{result:n,idx:t}}}function RF(e){let t=typeof e=="string"?Co(e):e;return _s(Wt({},t,{hash:""}))}function BW(e,t){return e.pathname!==t.pathname||e.search!==t.search?!1:e.hash===""?t.hash!=="":e.hash===t.hash?!0:t.hash!==""}function rs(e){return e.type===Zt.deferred}function Bu(e){return e.type===Zt.error}function zl(e){return(e&&e.type)===Zt.redirect}function HW(e){let t=e;return t&&typeof t=="object"&&typeof t.data=="object"&&typeof t.subscribe=="function"&&typeof t.cancel=="function"&&typeof t.resolveData=="function"}function VW(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.headers=="object"&&typeof e.body<"u"}function qW(e){return OW.has(e.toLowerCase())}function ca(e){return NW.has(e.toLowerCase())}async function GR(e,t,n,r,a,o){for(let i=0;id.route.id===l.route.id),u=c!=null&&!TF(c,l)&&(o&&o[l.route.id])!==void 0;if(rs(s)&&(a||u)){let d=r[i];Ze(d,"Expected an AbortSignal for revalidating fetcher deferred result"),await NF(s,d,a).then(g=>{g&&(n[i]=g||n[i])})}}}async function NF(e,t,n){if(n===void 0&&(n=!1),!await e.deferredData.resolveData(t)){if(n)try{return{type:Zt.data,data:e.deferredData.unwrappedData}}catch(a){return{type:Zt.error,error:a}}return{type:Zt.data,data:e.deferredData.data}}}function a_(e){return new URLSearchParams(e).getAll("index").some(t=>t==="")}function B1(e,t){let n=typeof t=="string"?Co(t).search:t.search;if(e[e.length-1].route.index&&a_(n||""))return e[e.length-1];let r=tf(e);return r[r.length-1]}function WR(e){let{formMethod:t,formAction:n,formEncType:r,text:a,formData:o,json:i}=e;if(!(!t||!n||!r)){if(a!=null)return{formMethod:t,formAction:n,formEncType:r,formData:void 0,json:void 0,text:a};if(o!=null)return{formMethod:t,formAction:n,formEncType:r,formData:o,json:void 0,text:void 0};if(i!==void 0)return{formMethod:t,formAction:n,formEncType:r,formData:void 0,json:i,text:void 0}}}function kb(e,t){return t?{state:"loading",location:e,formMethod:t.formMethod,formAction:t.formAction,formEncType:t.formEncType,formData:t.formData,json:t.json,text:t.text}:{state:"loading",location:e,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0}}function GW(e,t){return{state:"submitting",location:e,formMethod:t.formMethod,formAction:t.formAction,formEncType:t.formEncType,formData:t.formData,json:t.json,text:t.text}}function iu(e,t){return e?{state:"loading",formMethod:e.formMethod,formAction:e.formAction,formEncType:e.formEncType,formData:e.formData,json:e.json,text:e.text,data:t}:{state:"loading",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:t}}function WW(e,t){return{state:"submitting",formMethod:e.formMethod,formAction:e.formAction,formEncType:e.formEncType,formData:e.formData,json:e.json,text:e.text,data:t?t.data:void 0}}function Bo(e){return{state:"idle",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:e}}function KW(e,t){try{let n=e.sessionStorage.getItem(AF);if(n){let r=JSON.parse(n);for(let[a,o]of Object.entries(r||{}))o&&Array.isArray(o)&&t.set(a,new Set(o||[]))}}catch{}}function YW(e,t){if(t.size>0){let n={};for(let[r,a]of t)n[r]=[...a];try{e.sessionStorage.setItem(AF,JSON.stringify(n))}catch(r){Cs(!1,"Failed to save applied view transitions in sessionStorage ("+r+").")}}}/** - * React Router v6.19.0 - * - * Copyright (c) Remix Software Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */function Ag(){return Ag=Object.assign?Object.assign.bind():function(e){for(var t=1;tl.pathnameBase)),i=p.useRef(!1);return OF(()=>{i.current=!0}),p.useCallback(function(l,c){if(c===void 0&&(c={}),!i.current)return;if(typeof l=="number"){n.go(l);return}let u=zm(l,JSON.parse(o),a,c.relative==="path");e==null&&t!=="/"&&(u.pathname=u.pathname==="/"?t:uo([t,u.pathname])),(c.replace?n.replace:n.push)(u,c.state,c)},[t,n,o,a,e])}const QW=p.createContext(null);function JW(e){let t=p.useContext(_o).outlet;return t&&p.createElement(QW.Provider,{value:e},t)}function Bm(e,t){let{relative:n}=t===void 0?{}:t,{matches:r}=p.useContext(_o),{pathname:a}=Li(),o=JSON.stringify(tf(r).map((i,s)=>s===r.length-1?i.pathname:i.pathnameBase));return p.useMemo(()=>zm(e,JSON.parse(o),a,n==="path"),[e,o,a,n])}function eK(e,t,n){Lc()||Ze(!1);let{navigator:r}=p.useContext(Ps),{matches:a}=p.useContext(_o),o=a[a.length-1],i=o?o.params:{};o&&o.pathname;let s=o?o.pathnameBase:"/";o&&o.route;let l=Li(),c;if(t){var u;let y=typeof t=="string"?Co(t):t;s==="/"||(u=y.pathname)!=null&&u.startsWith(s)||Ze(!1),c=y}else c=l;let d=c.pathname||"/",g=s==="/"?d:d.slice(s.length)||"/",m=Rl(e,{pathname:g}),b=oK(m&&m.map(y=>Object.assign({},y,{params:Object.assign({},i,y.params),pathname:uo([s,r.encodeLocation?r.encodeLocation(y.pathname).pathname:y.pathname]),pathnameBase:y.pathnameBase==="/"?s:uo([s,r.encodeLocation?r.encodeLocation(y.pathnameBase).pathname:y.pathnameBase])})),a,n);return t&&b?p.createElement(Um.Provider,{value:{location:Ag({pathname:"/",search:"",hash:"",state:null,key:"default"},c),navigationType:Yt.Pop}},b):b}function tK(){let e=cK(),t=kF(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,a={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"},o=null;return p.createElement(p.Fragment,null,p.createElement("h2",null,"Unexpected Application Error!"),p.createElement("h3",{style:{fontStyle:"italic"}},t),n?p.createElement("pre",{style:a},n):null,o)}const nK=p.createElement(tK,null);class rK extends p.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,n){return n.location!==t.location||n.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error||n.error,location:n.location,revalidation:t.revalidation||n.revalidation}}componentDidCatch(t,n){console.error("React Router caught the following error during render",t,n)}render(){return this.state.error?p.createElement(_o.Provider,{value:this.props.routeContext},p.createElement(IF.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function aK(e){let{routeContext:t,match:n,children:r}=e,a=p.useContext(nf);return a&&a.static&&a.staticContext&&(n.route.errorElement||n.route.ErrorBoundary)&&(a.staticContext._deepestRenderedBoundaryId=n.route.id),p.createElement(_o.Provider,{value:t},r)}function oK(e,t,n){var r;if(t===void 0&&(t=[]),n===void 0&&(n=null),e==null){var a;if((a=n)!=null&&a.errors)e=n.matches;else return null}let o=e,i=(r=n)==null?void 0:r.errors;if(i!=null){let s=o.findIndex(l=>l.route.id&&(i==null?void 0:i[l.route.id]));s>=0||Ze(!1),o=o.slice(0,Math.min(o.length,s+1))}return o.reduceRight((s,l,c)=>{let u=l.route.id?i==null?void 0:i[l.route.id]:null,d=null;n&&(d=l.route.errorElement||nK);let g=t.concat(o.slice(0,c+1)),m=()=>{let b;return u?b=d:l.route.Component?b=p.createElement(l.route.Component,null):l.route.element?b=l.route.element:b=s,p.createElement(aK,{match:l,routeContext:{outlet:s,matches:g,isDataRoute:n!=null},children:b})};return n&&(l.route.ErrorBoundary||l.route.errorElement||c===0)?p.createElement(rK,{location:n.location,revalidation:n.revalidation,component:d,error:u,children:m(),routeContext:{outlet:null,matches:g,isDataRoute:!0}}):m()},null)}var DF=function(e){return e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e}(DF||{}),Tg=function(e){return e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId",e}(Tg||{});function iK(e){let t=p.useContext(nf);return t||Ze(!1),t}function sK(e){let t=p.useContext(o_);return t||Ze(!1),t}function lK(e){let t=p.useContext(_o);return t||Ze(!1),t}function LF(e){let t=lK(),n=t.matches[t.matches.length-1];return n.route.id||Ze(!1),n.route.id}function cK(){var e;let t=p.useContext(IF),n=sK(Tg.UseRouteError),r=LF(Tg.UseRouteError);return t||((e=n.errors)==null?void 0:e[r])}function uK(){let{router:e}=iK(DF.UseNavigateStable),t=LF(Tg.UseNavigateStable),n=p.useRef(!1);return OF(()=>{n.current=!0}),p.useCallback(function(a,o){o===void 0&&(o={}),n.current&&(typeof a=="number"?e.navigate(a):e.navigate(a,Ag({fromRouteId:t},o)))},[e,t])}function MF(e){let{to:t,replace:n,state:r,relative:a}=e;Lc()||Ze(!1);let{matches:o}=p.useContext(_o),{pathname:i}=Li(),s=Mi(),l=zm(t,tf(o).map(u=>u.pathnameBase),i,a==="path"),c=JSON.stringify(l);return p.useEffect(()=>s(JSON.parse(c),{replace:n,state:r,relative:a}),[s,c,a,n,r]),null}function PF(e){return JW(e.context)}function dK(e){let{basename:t="/",children:n=null,location:r,navigationType:a=Yt.Pop,navigator:o,static:i=!1}=e;Lc()&&Ze(!1);let s=t.replace(/^\/*/,"/"),l=p.useMemo(()=>({basename:s,navigator:o,static:i}),[s,o,i]);typeof r=="string"&&(r=Co(r));let{pathname:c="/",search:u="",hash:d="",state:g=null,key:m="default"}=r,b=p.useMemo(()=>{let y=wi(c,s);return y==null?null:{location:{pathname:y,search:u,hash:d,state:g,key:m},navigationType:a}},[s,c,u,d,g,m,a]);return b==null?null:p.createElement(Ps.Provider,{value:l},p.createElement(Um.Provider,{children:n,value:b}))}new Promise(()=>{});function fK(e){let t={hasErrorBoundary:e.ErrorBoundary!=null||e.errorElement!=null};return e.Component&&Object.assign(t,{element:p.createElement(e.Component),Component:void 0}),e.ErrorBoundary&&Object.assign(t,{errorElement:p.createElement(e.ErrorBoundary),ErrorBoundary:void 0}),t}/** - * React Router DOM v6.19.0 - * - * Copyright (c) Remix Software Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */function mc(){return mc=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0)&&(n[a]=e[a]);return n}function pK(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function gK(e,t){return e.button===0&&(!t||t==="_self")&&!pK(e)}const mK=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","unstable_viewTransition"],hK=["aria-current","caseSensitive","className","end","style","to","unstable_viewTransition","children"];function bK(e,t){return $W({basename:t==null?void 0:t.basename,future:mc({},t==null?void 0:t.future,{v7_prependBasename:!0}),history:iW({window:t==null?void 0:t.window}),hydrationData:(t==null?void 0:t.hydrationData)||yK(),routes:e,mapRouteProperties:fK,window:t==null?void 0:t.window}).initialize()}function yK(){var e;let t=(e=window)==null?void 0:e.__staticRouterHydrationData;return t&&t.errors&&(t=mc({},t,{errors:vK(t.errors)})),t}function vK(e){if(!e)return null;let t=Object.entries(e),n={};for(let[r,a]of t)if(a&&a.__type==="RouteErrorResponse")n[r]=new r_(a.status,a.statusText,a.data,a.internal===!0);else if(a&&a.__type==="Error"){if(a.__subType){let o=window[a.__subType];if(typeof o=="function")try{let i=new o(a.message);i.stack="",n[r]=i}catch{}}if(n[r]==null){let o=new Error(a.message);o.stack="",n[r]=o}}else n[r]=a;return n}const FF=p.createContext({isTransitioning:!1}),SK=p.createContext(new Map),wK="startTransition",KR=Kd[wK],EK="flushSync",YR=AV[EK];function xK(e){KR?KR(e):e()}function su(e){YR?YR(e):e()}class kK{constructor(){this.status="pending",this.promise=new Promise((t,n)=>{this.resolve=r=>{this.status==="pending"&&(this.status="resolved",t(r))},this.reject=r=>{this.status==="pending"&&(this.status="rejected",n(r))}})}}function CK(e){let{fallbackElement:t,router:n,future:r}=e,[a,o]=p.useState(n.state),[i,s]=p.useState(),[l,c]=p.useState({isTransitioning:!1}),[u,d]=p.useState(),[g,m]=p.useState(),[b,y]=p.useState(),w=p.useRef(new Map),{v7_startTransition:v}=r||{},h=p.useCallback(C=>{v?xK(C):C()},[v]),S=p.useCallback((C,_)=>{let{deletedFetchers:R,unstable_flushSync:T,unstable_viewTransitionOpts:L}=_;R.forEach(H=>w.current.delete(H)),C.fetchers.forEach((H,z)=>{H.data!==void 0&&w.current.set(z,H.data)});let D=n.window==null||typeof n.window.document.startViewTransition!="function";if(!L||D){T?su(()=>o(C)):h(()=>o(C));return}if(T){su(()=>{g&&(u&&u.resolve(),g.skipTransition()),c({isTransitioning:!0,flushSync:!0,currentLocation:L.currentLocation,nextLocation:L.nextLocation})});let H=n.window.document.startViewTransition(()=>{su(()=>o(C))});H.finished.finally(()=>{su(()=>{d(void 0),m(void 0),s(void 0),c({isTransitioning:!1})})}),su(()=>m(H));return}g?(u&&u.resolve(),g.skipTransition(),y({state:C,currentLocation:L.currentLocation,nextLocation:L.nextLocation})):(s(C),c({isTransitioning:!0,flushSync:!1,currentLocation:L.currentLocation,nextLocation:L.nextLocation}))},[n.window,g,u,w,h]);p.useLayoutEffect(()=>n.subscribe(S),[n,S]),p.useEffect(()=>{l.isTransitioning&&!l.flushSync&&d(new kK)},[l]),p.useEffect(()=>{if(u&&i&&n.window){let C=i,_=u.promise,R=n.window.document.startViewTransition(async()=>{h(()=>o(C)),await _});R.finished.finally(()=>{d(void 0),m(void 0),s(void 0),c({isTransitioning:!1})}),m(R)}},[h,i,u,n.window]),p.useEffect(()=>{u&&i&&a.location.key===i.location.key&&u.resolve()},[u,g,a.location,i]),p.useEffect(()=>{!l.isTransitioning&&b&&(s(b.state),c({isTransitioning:!0,flushSync:!1,currentLocation:b.currentLocation,nextLocation:b.nextLocation}),y(void 0))},[l.isTransitioning,b]);let E=p.useMemo(()=>({createHref:n.createHref,encodeLocation:n.encodeLocation,go:C=>n.navigate(C),push:(C,_,R)=>n.navigate(C,{state:_,preventScrollReset:R==null?void 0:R.preventScrollReset}),replace:(C,_,R)=>n.navigate(C,{replace:!0,state:_,preventScrollReset:R==null?void 0:R.preventScrollReset})}),[n]),k=n.basename||"/",x=p.useMemo(()=>({router:n,navigator:E,static:!1,basename:k}),[n,E,k]);return p.createElement(p.Fragment,null,p.createElement(nf.Provider,{value:x},p.createElement(o_.Provider,{value:a},p.createElement(SK.Provider,{value:w.current},p.createElement(FF.Provider,{value:l},p.createElement(dK,{basename:k,location:a.location,navigationType:a.historyAction,navigator:E},a.initialized?p.createElement(_K,{routes:n.routes,state:a}):t))))),null)}function _K(e){let{routes:t,state:n}=e;return eK(t,void 0,n)}const AK=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",TK=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,bd=p.forwardRef(function(t,n){let{onClick:r,relative:a,reloadDocument:o,replace:i,state:s,target:l,to:c,preventScrollReset:u,unstable_viewTransition:d}=t,g=$F(t,mK),{basename:m}=p.useContext(Ps),b,y=!1;if(typeof c=="string"&&TK.test(c)&&(b=c,AK))try{let S=new URL(window.location.href),E=c.startsWith("//")?new URL(S.protocol+c):new URL(c),k=wi(E.pathname,m);E.origin===S.origin&&k!=null?c=k+E.search+E.hash:y=!0}catch{}let w=ZW(c,{relative:a}),v=NK(c,{replace:i,state:s,target:l,preventScrollReset:u,relative:a,unstable_viewTransition:d});function h(S){r&&r(S),S.defaultPrevented||v(S)}return p.createElement("a",mc({},g,{href:b||w,onClick:y||o?r:h,ref:n,target:l}))}),jF=p.forwardRef(function(t,n){let{"aria-current":r="page",caseSensitive:a=!1,className:o="",end:i=!1,style:s,to:l,unstable_viewTransition:c,children:u}=t,d=$F(t,hK),g=Bm(l,{relative:d.relative}),m=Li(),b=p.useContext(o_),{navigator:y}=p.useContext(Ps),w=b!=null&&IK(g)&&c===!0,v=y.encodeLocation?y.encodeLocation(g).pathname:g.pathname,h=m.pathname,S=b&&b.navigation&&b.navigation.location?b.navigation.location.pathname:null;a||(h=h.toLowerCase(),S=S?S.toLowerCase():null,v=v.toLowerCase());const E=v!=="/"&&v.endsWith("/")?v.length-1:v.length;let k=h===v||!i&&h.startsWith(v)&&h.charAt(E)==="/",x=S!=null&&(S===v||!i&&S.startsWith(v)&&S.charAt(v.length)==="/"),C={isActive:k,isPending:x,isTransitioning:w},_=k?r:void 0,R;typeof o=="function"?R=o(C):R=[o,k?"active":null,x?"pending":null,w?"transitioning":null].filter(Boolean).join(" ");let T=typeof s=="function"?s(C):s;return p.createElement(bd,mc({},d,{"aria-current":_,className:R,ref:n,style:T,to:l,unstable_viewTransition:c}),typeof u=="function"?u(C):u)});var H1;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(H1||(H1={}));var ZR;(function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(ZR||(ZR={}));function RK(e){let t=p.useContext(nf);return t||Ze(!1),t}function NK(e,t){let{target:n,replace:r,state:a,preventScrollReset:o,relative:i,unstable_viewTransition:s}=t===void 0?{}:t,l=Mi(),c=Li(),u=Bm(e,{relative:i});return p.useCallback(d=>{if(gK(d,n)){d.preventDefault();let g=r!==void 0?r:_s(c)===_s(u);l(e,{replace:g,state:a,preventScrollReset:o,relative:i,unstable_viewTransition:s})}},[c,l,u,r,a,n,e,o,i,s])}function IK(e,t){t===void 0&&(t={});let n=p.useContext(FF);n==null&&Ze(!1);let{basename:r}=RK(H1.useViewTransitionState),a=Bm(e,{relative:t.relative});if(!n.isTransitioning)return!1;let o=wi(n.currentLocation.pathname,r)||n.currentLocation.pathname,i=wi(n.nextLocation.pathname,r)||n.nextLocation.pathname;return j1(a.pathname,i)!=null||j1(a.pathname,o)!=null}const XR=e=>{let t;const n=new Set,r=(l,c)=>{const u=typeof l=="function"?l(t):l;if(!Object.is(u,t)){const d=t;t=c??typeof u!="object"?u:Object.assign({},t,u),n.forEach(g=>g(t,d))}},a=()=>t,s={setState:r,getState:a,subscribe:l=>(n.add(l),()=>n.delete(l)),destroy:()=>{n.clear()}};return t=e(r,a,s),s},OK=e=>e?XR(e):XR;var zF={exports:{}},UF={},BF={exports:{}},HF={};/** - * @license React - * use-sync-external-store-shim.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var hc=p;function DK(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var LK=typeof Object.is=="function"?Object.is:DK,MK=hc.useState,PK=hc.useEffect,$K=hc.useLayoutEffect,FK=hc.useDebugValue;function jK(e,t){var n=t(),r=MK({inst:{value:n,getSnapshot:t}}),a=r[0].inst,o=r[1];return $K(function(){a.value=n,a.getSnapshot=t,Cb(a)&&o({inst:a})},[e,n,t]),PK(function(){return Cb(a)&&o({inst:a}),e(function(){Cb(a)&&o({inst:a})})},[e]),FK(n),n}function Cb(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!LK(e,n)}catch{return!0}}function zK(e,t){return t()}var UK=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?zK:jK;HF.useSyncExternalStore=hc.useSyncExternalStore!==void 0?hc.useSyncExternalStore:UK;BF.exports=HF;var BK=BF.exports;/** - * @license React - * use-sync-external-store-shim/with-selector.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Hm=p,HK=BK;function VK(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var qK=typeof Object.is=="function"?Object.is:VK,GK=HK.useSyncExternalStore,WK=Hm.useRef,KK=Hm.useEffect,YK=Hm.useMemo,ZK=Hm.useDebugValue;UF.useSyncExternalStoreWithSelector=function(e,t,n,r,a){var o=WK(null);if(o.current===null){var i={hasValue:!1,value:null};o.current=i}else i=o.current;o=YK(function(){function l(m){if(!c){if(c=!0,u=m,m=r(m),a!==void 0&&i.hasValue){var b=i.value;if(a(b,m))return d=b}return d=m}if(b=d,qK(u,m))return b;var y=r(m);return a!==void 0&&a(b,y)?b:(u=m,d=y)}var c=!1,u,d,g=n===void 0?null:n;return[function(){return l(t())},g===null?void 0:function(){return l(g())}]},[t,n,r,a]);var s=GK(e,o[0],o[1]);return KK(function(){i.hasValue=!0,i.value=s},[s]),ZK(s),s};zF.exports=UF;var XK=zF.exports;const QK=Tc(XK),{useDebugValue:JK}=Ae,{useSyncExternalStoreWithSelector:eY}=QK;function tY(e,t=e.getState,n){const r=eY(e.subscribe,e.getState,e.getServerState||e.getState,t,n);return JK(r),r}const QR=e=>{const t=typeof e=="function"?OK(e):e,n=(r,a)=>tY(t,r,a);return Object.assign(n,t),n},rf=e=>e?QR(e):QR,nY=(e,t)=>(...n)=>Object.assign({},e,t(...n));function i_(e,t){let n;try{n=e()}catch{return}return{getItem:a=>{var o;const i=l=>l===null?null:JSON.parse(l,t==null?void 0:t.reviver),s=(o=n.getItem(a))!=null?o:null;return s instanceof Promise?s.then(i):i(s)},setItem:(a,o)=>n.setItem(a,JSON.stringify(o,t==null?void 0:t.replacer)),removeItem:a=>n.removeItem(a)}}const yd=e=>t=>{try{const n=e(t);return n instanceof Promise?n:{then(r){return yd(r)(n)},catch(r){return this}}}catch(n){return{then(r){return this},catch(r){return yd(r)(n)}}}},rY=(e,t)=>(n,r,a)=>{let o={getStorage:()=>localStorage,serialize:JSON.stringify,deserialize:JSON.parse,partialize:w=>w,version:0,merge:(w,v)=>({...v,...w}),...t},i=!1;const s=new Set,l=new Set;let c;try{c=o.getStorage()}catch{}if(!c)return e((...w)=>{console.warn(`[zustand persist middleware] Unable to update item '${o.name}', the given storage is currently unavailable.`),n(...w)},r,a);const u=yd(o.serialize),d=()=>{const w=o.partialize({...r()});let v;const h=u({state:w,version:o.version}).then(S=>c.setItem(o.name,S)).catch(S=>{v=S});if(v)throw v;return h},g=a.setState;a.setState=(w,v)=>{g(w,v),d()};const m=e((...w)=>{n(...w),d()},r,a);let b;const y=()=>{var w;if(!c)return;i=!1,s.forEach(h=>h(r()));const v=((w=o.onRehydrateStorage)==null?void 0:w.call(o,r()))||void 0;return yd(c.getItem.bind(c))(o.name).then(h=>{if(h)return o.deserialize(h)}).then(h=>{if(h)if(typeof h.version=="number"&&h.version!==o.version){if(o.migrate)return o.migrate(h.state,h.version);console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return h.state}).then(h=>{var S;return b=o.merge(h,(S=r())!=null?S:m),n(b,!0),d()}).then(()=>{v==null||v(b,void 0),i=!0,l.forEach(h=>h(b))}).catch(h=>{v==null||v(void 0,h)})};return a.persist={setOptions:w=>{o={...o,...w},w.getStorage&&(c=w.getStorage())},clearStorage:()=>{c==null||c.removeItem(o.name)},getOptions:()=>o,rehydrate:()=>y(),hasHydrated:()=>i,onHydrate:w=>(s.add(w),()=>{s.delete(w)}),onFinishHydration:w=>(l.add(w),()=>{l.delete(w)})},y(),b||m},aY=(e,t)=>(n,r,a)=>{let o={storage:i_(()=>localStorage),partialize:y=>y,version:0,merge:(y,w)=>({...w,...y}),...t},i=!1;const s=new Set,l=new Set;let c=o.storage;if(!c)return e((...y)=>{console.warn(`[zustand persist middleware] Unable to update item '${o.name}', the given storage is currently unavailable.`),n(...y)},r,a);const u=()=>{const y=o.partialize({...r()});return c.setItem(o.name,{state:y,version:o.version})},d=a.setState;a.setState=(y,w)=>{d(y,w),u()};const g=e((...y)=>{n(...y),u()},r,a);let m;const b=()=>{var y,w;if(!c)return;i=!1,s.forEach(h=>{var S;return h((S=r())!=null?S:g)});const v=((w=o.onRehydrateStorage)==null?void 0:w.call(o,(y=r())!=null?y:g))||void 0;return yd(c.getItem.bind(c))(o.name).then(h=>{if(h)if(typeof h.version=="number"&&h.version!==o.version){if(o.migrate)return o.migrate(h.state,h.version);console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return h.state}).then(h=>{var S;return m=o.merge(h,(S=r())!=null?S:g),n(m,!0),u()}).then(()=>{v==null||v(m,void 0),m=r(),i=!0,l.forEach(h=>h(m))}).catch(h=>{v==null||v(void 0,h)})};return a.persist={setOptions:y=>{o={...o,...y},y.storage&&(c=y.storage)},clearStorage:()=>{c==null||c.removeItem(o.name)},getOptions:()=>o,rehydrate:()=>b(),hasHydrated:()=>i,onHydrate:y=>(s.add(y),()=>{s.delete(y)}),onFinishHydration:y=>(l.add(y),()=>{l.delete(y)})},o.skipHydration||b(),m||g},oY=(e,t)=>"getStorage"in t||"serialize"in t||"deserialize"in t?rY(e,t):aY(e,t),Vm=oY,s_=rf(Vm((e,t)=>({auth:{uuid:null,token:null,loggedIn:!1,isAdmin:!1},actions:{setToken:n=>e(r=>({...r,auth:{...r.auth,token:n}})),setAsAuthenticated:(n,r,a)=>e(o=>({...o,auth:{token:r??o.auth.token,uuid:n,loggedIn:!0,isAdmin:a??!1}})),logout:()=>e(n=>({...n,auth:{token:null,uuid:null,loggedIn:!1,isAdmin:!1}}))}}),{name:"auth-storage",storage:i_(()=>localStorage),partialize:({actions:e,...t})=>t})),VF=()=>{var e;return(e=s_().auth)==null?void 0:e.uuid},iY=()=>s_().actions,qF=()=>{const{auth:e}=s_();return e.token?`Bearer ${e.token}`:""},sY={BASE_URL:"/",MODE:"production",DEV:!1,PROD:!0,SSR:!1}.VITE_BASE_URL||"/api";function GF(e,t){return function(){return e.apply(t,arguments)}}const{toString:lY}=Object.prototype,{getPrototypeOf:l_}=Object,qm=(e=>t=>{const n=lY.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),Ha=e=>(e=e.toLowerCase(),t=>qm(t)===e),Gm=e=>t=>typeof t===e,{isArray:Mc}=Array,vd=Gm("undefined");function cY(e){return e!==null&&!vd(e)&&e.constructor!==null&&!vd(e.constructor)&&Gr(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const WF=Ha("ArrayBuffer");function uY(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&WF(e.buffer),t}const dY=Gm("string"),Gr=Gm("function"),KF=Gm("number"),Wm=e=>e!==null&&typeof e=="object",fY=e=>e===!0||e===!1,Bp=e=>{if(qm(e)!=="object")return!1;const t=l_(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)},pY=Ha("Date"),gY=Ha("File"),mY=Ha("Blob"),hY=Ha("FileList"),bY=e=>Wm(e)&&Gr(e.pipe),yY=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||Gr(e.append)&&((t=qm(e))==="formdata"||t==="object"&&Gr(e.toString)&&e.toString()==="[object FormData]"))},vY=Ha("URLSearchParams"),SY=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function af(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let r,a;if(typeof e!="object"&&(e=[e]),Mc(e))for(r=0,a=e.length;r0;)if(a=n[r],t===a.toLowerCase())return a;return null}const ZF=(()=>typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global)(),XF=e=>!vd(e)&&e!==ZF;function V1(){const{caseless:e}=XF(this)&&this||{},t={},n=(r,a)=>{const o=e&&YF(t,a)||a;Bp(t[o])&&Bp(r)?t[o]=V1(t[o],r):Bp(r)?t[o]=V1({},r):Mc(r)?t[o]=r.slice():t[o]=r};for(let r=0,a=arguments.length;r(af(t,(a,o)=>{n&&Gr(a)?e[o]=GF(a,n):e[o]=a},{allOwnKeys:r}),e),EY=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),xY=(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},kY=(e,t,n,r)=>{let a,o,i;const s={};if(t=t||{},e==null)return t;do{for(a=Object.getOwnPropertyNames(e),o=a.length;o-- >0;)i=a[o],(!r||r(i,e,t))&&!s[i]&&(t[i]=e[i],s[i]=!0);e=n!==!1&&l_(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},CY=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return r!==-1&&r===n},_Y=e=>{if(!e)return null;if(Mc(e))return e;let t=e.length;if(!KF(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},AY=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&l_(Uint8Array)),TY=(e,t)=>{const r=(e&&e[Symbol.iterator]).call(e);let a;for(;(a=r.next())&&!a.done;){const o=a.value;t.call(e,o[0],o[1])}},RY=(e,t)=>{let n;const r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},NY=Ha("HTMLFormElement"),IY=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,r,a){return r.toUpperCase()+a}),JR=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),OY=Ha("RegExp"),QF=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};af(n,(a,o)=>{let i;(i=t(a,o,e))!==!1&&(r[o]=i||a)}),Object.defineProperties(e,r)},DY=e=>{QF(e,(t,n)=>{if(Gr(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const r=e[n];if(Gr(r)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},LY=(e,t)=>{const n={},r=a=>{a.forEach(o=>{n[o]=!0})};return Mc(e)?r(e):r(String(e).split(t)),n},MY=()=>{},PY=(e,t)=>(e=+e,Number.isFinite(e)?e:t),_b="abcdefghijklmnopqrstuvwxyz",e2="0123456789",JF={DIGIT:e2,ALPHA:_b,ALPHA_DIGIT:_b+_b.toUpperCase()+e2},$Y=(e=16,t=JF.ALPHA_DIGIT)=>{let n="";const{length:r}=t;for(;e--;)n+=t[Math.random()*r|0];return n};function FY(e){return!!(e&&Gr(e.append)&&e[Symbol.toStringTag]==="FormData"&&e[Symbol.iterator])}const jY=e=>{const t=new Array(10),n=(r,a)=>{if(Wm(r)){if(t.indexOf(r)>=0)return;if(!("toJSON"in r)){t[a]=r;const o=Mc(r)?[]:{};return af(r,(i,s)=>{const l=n(i,a+1);!vd(l)&&(o[s]=l)}),t[a]=void 0,o}}return r};return n(e,0)},zY=Ha("AsyncFunction"),UY=e=>e&&(Wm(e)||Gr(e))&&Gr(e.then)&&Gr(e.catch),J={isArray:Mc,isArrayBuffer:WF,isBuffer:cY,isFormData:yY,isArrayBufferView:uY,isString:dY,isNumber:KF,isBoolean:fY,isObject:Wm,isPlainObject:Bp,isUndefined:vd,isDate:pY,isFile:gY,isBlob:mY,isRegExp:OY,isFunction:Gr,isStream:bY,isURLSearchParams:vY,isTypedArray:AY,isFileList:hY,forEach:af,merge:V1,extend:wY,trim:SY,stripBOM:EY,inherits:xY,toFlatObject:kY,kindOf:qm,kindOfTest:Ha,endsWith:CY,toArray:_Y,forEachEntry:TY,matchAll:RY,isHTMLForm:NY,hasOwnProperty:JR,hasOwnProp:JR,reduceDescriptors:QF,freezeMethods:DY,toObjectSet:LY,toCamelCase:IY,noop:MY,toFiniteNumber:PY,findKey:YF,global:ZF,isContextDefined:XF,ALPHABET:JF,generateString:$Y,isSpecCompliantForm:FY,toJSONObject:jY,isAsyncFn:zY,isThenable:UY};function st(e,t,n,r,a){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),a&&(this.response=a)}J.inherits(st,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:J.toJSONObject(this.config),code:this.code,status:this.response&&this.response.status?this.response.status:null}}});const e6=st.prototype,t6={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(e=>{t6[e]={value:e}});Object.defineProperties(st,t6);Object.defineProperty(e6,"isAxiosError",{value:!0});st.from=(e,t,n,r,a,o)=>{const i=Object.create(e6);return J.toFlatObject(e,i,function(l){return l!==Error.prototype},s=>s!=="isAxiosError"),st.call(i,e.message,t,n,r,a),i.cause=e,i.name=e.name,o&&Object.assign(i,o),i};const BY=null;function q1(e){return J.isPlainObject(e)||J.isArray(e)}function n6(e){return J.endsWith(e,"[]")?e.slice(0,-2):e}function t2(e,t,n){return e?e.concat(t).map(function(a,o){return a=n6(a),!n&&o?"["+a+"]":a}).join(n?".":""):t}function HY(e){return J.isArray(e)&&!e.some(q1)}const VY=J.toFlatObject(J,{},null,function(t){return/^is[A-Z]/.test(t)});function Km(e,t,n){if(!J.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=J.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(y,w){return!J.isUndefined(w[y])});const r=n.metaTokens,a=n.visitor||u,o=n.dots,i=n.indexes,l=(n.Blob||typeof Blob<"u"&&Blob)&&J.isSpecCompliantForm(t);if(!J.isFunction(a))throw new TypeError("visitor must be a function");function c(b){if(b===null)return"";if(J.isDate(b))return b.toISOString();if(!l&&J.isBlob(b))throw new st("Blob is not supported. Use a Buffer instead.");return J.isArrayBuffer(b)||J.isTypedArray(b)?l&&typeof Blob=="function"?new Blob([b]):Buffer.from(b):b}function u(b,y,w){let v=b;if(b&&!w&&typeof b=="object"){if(J.endsWith(y,"{}"))y=r?y:y.slice(0,-2),b=JSON.stringify(b);else if(J.isArray(b)&&HY(b)||(J.isFileList(b)||J.endsWith(y,"[]"))&&(v=J.toArray(b)))return y=n6(y),v.forEach(function(S,E){!(J.isUndefined(S)||S===null)&&t.append(i===!0?t2([y],E,o):i===null?y:y+"[]",c(S))}),!1}return q1(b)?!0:(t.append(t2(w,y,o),c(b)),!1)}const d=[],g=Object.assign(VY,{defaultVisitor:u,convertValue:c,isVisitable:q1});function m(b,y){if(!J.isUndefined(b)){if(d.indexOf(b)!==-1)throw Error("Circular reference detected in "+y.join("."));d.push(b),J.forEach(b,function(v,h){(!(J.isUndefined(v)||v===null)&&a.call(t,v,J.isString(h)?h.trim():h,y,g))===!0&&m(v,y?y.concat(h):[h])}),d.pop()}}if(!J.isObject(e))throw new TypeError("data must be an object");return m(e),t}function n2(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(r){return t[r]})}function c_(e,t){this._pairs=[],e&&Km(e,this,t)}const r6=c_.prototype;r6.append=function(t,n){this._pairs.push([t,n])};r6.toString=function(t){const n=t?function(r){return t.call(this,r,n2)}:n2;return this._pairs.map(function(a){return n(a[0])+"="+n(a[1])},"").join("&")};function qY(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function a6(e,t,n){if(!t)return e;const r=n&&n.encode||qY,a=n&&n.serialize;let o;if(a?o=a(t,n):o=J.isURLSearchParams(t)?t.toString():new c_(t,n).toString(r),o){const i=e.indexOf("#");i!==-1&&(e=e.slice(0,i)),e+=(e.indexOf("?")===-1?"?":"&")+o}return e}class GY{constructor(){this.handlers=[]}use(t,n,r){return this.handlers.push({fulfilled:t,rejected:n,synchronous:r?r.synchronous:!1,runWhen:r?r.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){J.forEach(this.handlers,function(r){r!==null&&t(r)})}}const r2=GY,o6={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},WY=typeof URLSearchParams<"u"?URLSearchParams:c_,KY=typeof FormData<"u"?FormData:null,YY=typeof Blob<"u"?Blob:null,ZY={isBrowser:!0,classes:{URLSearchParams:WY,FormData:KY,Blob:YY},protocols:["http","https","file","blob","url","data"]},i6=typeof window<"u"&&typeof document<"u",XY=(e=>i6&&["ReactNative","NativeScript","NS"].indexOf(e)<0)(typeof navigator<"u"&&navigator.product),QY=(()=>typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function")(),JY=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:i6,hasStandardBrowserEnv:XY,hasStandardBrowserWebWorkerEnv:QY},Symbol.toStringTag,{value:"Module"})),Ia={...JY,...ZY};function eZ(e,t){return Km(e,new Ia.classes.URLSearchParams,Object.assign({visitor:function(n,r,a,o){return Ia.isNode&&J.isBuffer(n)?(this.append(r,n.toString("base64")),!1):o.defaultVisitor.apply(this,arguments)}},t))}function tZ(e){return J.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function nZ(e){const t={},n=Object.keys(e);let r;const a=n.length;let o;for(r=0;r=n.length;return i=!i&&J.isArray(a)?a.length:i,l?(J.hasOwnProp(a,i)?a[i]=[a[i],r]:a[i]=r,!s):((!a[i]||!J.isObject(a[i]))&&(a[i]=[]),t(n,r,a[i],o)&&J.isArray(a[i])&&(a[i]=nZ(a[i])),!s)}if(J.isFormData(e)&&J.isFunction(e.entries)){const n={};return J.forEachEntry(e,(r,a)=>{t(tZ(r),a,n,0)}),n}return null}function rZ(e,t,n){if(J.isString(e))try{return(t||JSON.parse)(e),J.trim(e)}catch(r){if(r.name!=="SyntaxError")throw r}return(n||JSON.stringify)(e)}const u_={transitional:o6,adapter:["xhr","http"],transformRequest:[function(t,n){const r=n.getContentType()||"",a=r.indexOf("application/json")>-1,o=J.isObject(t);if(o&&J.isHTMLForm(t)&&(t=new FormData(t)),J.isFormData(t))return a?JSON.stringify(s6(t)):t;if(J.isArrayBuffer(t)||J.isBuffer(t)||J.isStream(t)||J.isFile(t)||J.isBlob(t))return t;if(J.isArrayBufferView(t))return t.buffer;if(J.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let s;if(o){if(r.indexOf("application/x-www-form-urlencoded")>-1)return eZ(t,this.formSerializer).toString();if((s=J.isFileList(t))||r.indexOf("multipart/form-data")>-1){const l=this.env&&this.env.FormData;return Km(s?{"files[]":t}:t,l&&new l,this.formSerializer)}}return o||a?(n.setContentType("application/json",!1),rZ(t)):t}],transformResponse:[function(t){const n=this.transitional||u_.transitional,r=n&&n.forcedJSONParsing,a=this.responseType==="json";if(t&&J.isString(t)&&(r&&!this.responseType||a)){const i=!(n&&n.silentJSONParsing)&&a;try{return JSON.parse(t)}catch(s){if(i)throw s.name==="SyntaxError"?st.from(s,st.ERR_BAD_RESPONSE,this,null,this.response):s}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Ia.classes.FormData,Blob:Ia.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};J.forEach(["delete","get","head","post","put","patch"],e=>{u_.headers[e]={}});const d_=u_,aZ=J.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),oZ=e=>{const t={};let n,r,a;return e&&e.split(` -`).forEach(function(i){a=i.indexOf(":"),n=i.substring(0,a).trim().toLowerCase(),r=i.substring(a+1).trim(),!(!n||t[n]&&aZ[n])&&(n==="set-cookie"?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)}),t},a2=Symbol("internals");function lu(e){return e&&String(e).trim().toLowerCase()}function Hp(e){return e===!1||e==null?e:J.isArray(e)?e.map(Hp):String(e)}function iZ(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}const sZ=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function Ab(e,t,n,r,a){if(J.isFunction(r))return r.call(this,t,n);if(a&&(t=n),!!J.isString(t)){if(J.isString(r))return t.indexOf(r)!==-1;if(J.isRegExp(r))return r.test(t)}}function lZ(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,r)=>n.toUpperCase()+r)}function cZ(e,t){const n=J.toCamelCase(" "+t);["get","set","has"].forEach(r=>{Object.defineProperty(e,r+n,{value:function(a,o,i){return this[r].call(this,t,a,o,i)},configurable:!0})})}class Ym{constructor(t){t&&this.set(t)}set(t,n,r){const a=this;function o(s,l,c){const u=lu(l);if(!u)throw new Error("header name must be a non-empty string");const d=J.findKey(a,u);(!d||a[d]===void 0||c===!0||c===void 0&&a[d]!==!1)&&(a[d||l]=Hp(s))}const i=(s,l)=>J.forEach(s,(c,u)=>o(c,u,l));return J.isPlainObject(t)||t instanceof this.constructor?i(t,n):J.isString(t)&&(t=t.trim())&&!sZ(t)?i(oZ(t),n):t!=null&&o(n,t,r),this}get(t,n){if(t=lu(t),t){const r=J.findKey(this,t);if(r){const a=this[r];if(!n)return a;if(n===!0)return iZ(a);if(J.isFunction(n))return n.call(this,a,r);if(J.isRegExp(n))return n.exec(a);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=lu(t),t){const r=J.findKey(this,t);return!!(r&&this[r]!==void 0&&(!n||Ab(this,this[r],r,n)))}return!1}delete(t,n){const r=this;let a=!1;function o(i){if(i=lu(i),i){const s=J.findKey(r,i);s&&(!n||Ab(r,r[s],s,n))&&(delete r[s],a=!0)}}return J.isArray(t)?t.forEach(o):o(t),a}clear(t){const n=Object.keys(this);let r=n.length,a=!1;for(;r--;){const o=n[r];(!t||Ab(this,this[o],o,t,!0))&&(delete this[o],a=!0)}return a}normalize(t){const n=this,r={};return J.forEach(this,(a,o)=>{const i=J.findKey(r,o);if(i){n[i]=Hp(a),delete n[o];return}const s=t?lZ(o):String(o).trim();s!==o&&delete n[o],n[s]=Hp(a),r[s]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return J.forEach(this,(r,a)=>{r!=null&&r!==!1&&(n[a]=t&&J.isArray(r)?r.join(", "):r)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+": "+n).join(` -`)}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const r=new this(t);return n.forEach(a=>r.set(a)),r}static accessor(t){const r=(this[a2]=this[a2]={accessors:{}}).accessors,a=this.prototype;function o(i){const s=lu(i);r[s]||(cZ(a,i),r[s]=!0)}return J.isArray(t)?t.forEach(o):o(t),this}}Ym.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);J.reduceDescriptors(Ym.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(r){this[n]=r}}});J.freezeMethods(Ym);const fo=Ym;function Tb(e,t){const n=this||d_,r=t||n,a=fo.from(r.headers);let o=r.data;return J.forEach(e,function(s){o=s.call(n,o,a.normalize(),t?t.status:void 0)}),a.normalize(),o}function l6(e){return!!(e&&e.__CANCEL__)}function of(e,t,n){st.call(this,e??"canceled",st.ERR_CANCELED,t,n),this.name="CanceledError"}J.inherits(of,st,{__CANCEL__:!0});function uZ(e,t,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new st("Request failed with status code "+n.status,[st.ERR_BAD_REQUEST,st.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}const dZ=Ia.hasStandardBrowserEnv?{write(e,t,n,r,a,o){const i=[e+"="+encodeURIComponent(t)];J.isNumber(n)&&i.push("expires="+new Date(n).toGMTString()),J.isString(r)&&i.push("path="+r),J.isString(a)&&i.push("domain="+a),o===!0&&i.push("secure"),document.cookie=i.join("; ")},read(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,"",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function fZ(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function pZ(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function c6(e,t){return e&&!fZ(t)?pZ(e,t):t}const gZ=Ia.hasStandardBrowserEnv?function(){const t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");let r;function a(o){let i=o;return t&&(n.setAttribute("href",i),i=n.href),n.setAttribute("href",i),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:n.pathname.charAt(0)==="/"?n.pathname:"/"+n.pathname}}return r=a(window.location.href),function(i){const s=J.isString(i)?a(i):i;return s.protocol===r.protocol&&s.host===r.host}}():function(){return function(){return!0}}();function mZ(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function hZ(e,t){e=e||10;const n=new Array(e),r=new Array(e);let a=0,o=0,i;return t=t!==void 0?t:1e3,function(l){const c=Date.now(),u=r[o];i||(i=c),n[a]=l,r[a]=c;let d=o,g=0;for(;d!==a;)g+=n[d++],d=d%e;if(a=(a+1)%e,a===o&&(o=(o+1)%e),c-i{const o=a.loaded,i=a.lengthComputable?a.total:void 0,s=o-n,l=r(s),c=o<=i;n=o;const u={loaded:o,total:i,progress:i?o/i:void 0,bytes:s,rate:l||void 0,estimated:l&&i&&c?(i-o)/l:void 0,event:a};u[t?"download":"upload"]=!0,e(u)}}const bZ=typeof XMLHttpRequest<"u",yZ=bZ&&function(e){return new Promise(function(n,r){let a=e.data;const o=fo.from(e.headers).normalize();let{responseType:i,withXSRFToken:s}=e,l;function c(){e.cancelToken&&e.cancelToken.unsubscribe(l),e.signal&&e.signal.removeEventListener("abort",l)}let u;if(J.isFormData(a)){if(Ia.hasStandardBrowserEnv||Ia.hasStandardBrowserWebWorkerEnv)o.setContentType(!1);else if((u=o.getContentType())!==!1){const[y,...w]=u?u.split(";").map(v=>v.trim()).filter(Boolean):[];o.setContentType([y||"multipart/form-data",...w].join("; "))}}let d=new XMLHttpRequest;if(e.auth){const y=e.auth.username||"",w=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";o.set("Authorization","Basic "+btoa(y+":"+w))}const g=c6(e.baseURL,e.url);d.open(e.method.toUpperCase(),a6(g,e.params,e.paramsSerializer),!0),d.timeout=e.timeout;function m(){if(!d)return;const y=fo.from("getAllResponseHeaders"in d&&d.getAllResponseHeaders()),v={data:!i||i==="text"||i==="json"?d.responseText:d.response,status:d.status,statusText:d.statusText,headers:y,config:e,request:d};uZ(function(S){n(S),c()},function(S){r(S),c()},v),d=null}if("onloadend"in d?d.onloadend=m:d.onreadystatechange=function(){!d||d.readyState!==4||d.status===0&&!(d.responseURL&&d.responseURL.indexOf("file:")===0)||setTimeout(m)},d.onabort=function(){d&&(r(new st("Request aborted",st.ECONNABORTED,e,d)),d=null)},d.onerror=function(){r(new st("Network Error",st.ERR_NETWORK,e,d)),d=null},d.ontimeout=function(){let w=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded";const v=e.transitional||o6;e.timeoutErrorMessage&&(w=e.timeoutErrorMessage),r(new st(w,v.clarifyTimeoutError?st.ETIMEDOUT:st.ECONNABORTED,e,d)),d=null},Ia.hasStandardBrowserEnv&&(s&&J.isFunction(s)&&(s=s(e)),s||s!==!1&&gZ(g))){const y=e.xsrfHeaderName&&e.xsrfCookieName&&dZ.read(e.xsrfCookieName);y&&o.set(e.xsrfHeaderName,y)}a===void 0&&o.setContentType(null),"setRequestHeader"in d&&J.forEach(o.toJSON(),function(w,v){d.setRequestHeader(v,w)}),J.isUndefined(e.withCredentials)||(d.withCredentials=!!e.withCredentials),i&&i!=="json"&&(d.responseType=e.responseType),typeof e.onDownloadProgress=="function"&&d.addEventListener("progress",o2(e.onDownloadProgress,!0)),typeof e.onUploadProgress=="function"&&d.upload&&d.upload.addEventListener("progress",o2(e.onUploadProgress)),(e.cancelToken||e.signal)&&(l=y=>{d&&(r(!y||y.type?new of(null,e,d):y),d.abort(),d=null)},e.cancelToken&&e.cancelToken.subscribe(l),e.signal&&(e.signal.aborted?l():e.signal.addEventListener("abort",l)));const b=mZ(g);if(b&&Ia.protocols.indexOf(b)===-1){r(new st("Unsupported protocol "+b+":",st.ERR_BAD_REQUEST,e));return}d.send(a||null)})},G1={http:BY,xhr:yZ};J.forEach(G1,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const i2=e=>`- ${e}`,vZ=e=>J.isFunction(e)||e===null||e===!1,u6={getAdapter:e=>{e=J.isArray(e)?e:[e];const{length:t}=e;let n,r;const a={};for(let o=0;o`adapter ${s} `+(l===!1?"is not supported by the environment":"is not available in the build"));let i=t?o.length>1?`since : -`+o.map(i2).join(` -`):" "+i2(o[0]):"as no adapter specified";throw new st("There is no suitable adapter to dispatch the request "+i,"ERR_NOT_SUPPORT")}return r},adapters:G1};function Rb(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new of(null,e)}function s2(e){return Rb(e),e.headers=fo.from(e.headers),e.data=Tb.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),u6.getAdapter(e.adapter||d_.adapter)(e).then(function(r){return Rb(e),r.data=Tb.call(e,e.transformResponse,r),r.headers=fo.from(r.headers),r},function(r){return l6(r)||(Rb(e),r&&r.response&&(r.response.data=Tb.call(e,e.transformResponse,r.response),r.response.headers=fo.from(r.response.headers))),Promise.reject(r)})}const l2=e=>e instanceof fo?{...e}:e;function bc(e,t){t=t||{};const n={};function r(c,u,d){return J.isPlainObject(c)&&J.isPlainObject(u)?J.merge.call({caseless:d},c,u):J.isPlainObject(u)?J.merge({},u):J.isArray(u)?u.slice():u}function a(c,u,d){if(J.isUndefined(u)){if(!J.isUndefined(c))return r(void 0,c,d)}else return r(c,u,d)}function o(c,u){if(!J.isUndefined(u))return r(void 0,u)}function i(c,u){if(J.isUndefined(u)){if(!J.isUndefined(c))return r(void 0,c)}else return r(void 0,u)}function s(c,u,d){if(d in t)return r(c,u);if(d in e)return r(void 0,c)}const l={url:o,method:o,data:o,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutMessage:i,withCredentials:i,withXSRFToken:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,responseEncoding:i,validateStatus:s,headers:(c,u)=>a(l2(c),l2(u),!0)};return J.forEach(Object.keys(Object.assign({},e,t)),function(u){const d=l[u]||a,g=d(e[u],t[u],u);J.isUndefined(g)&&d!==s||(n[u]=g)}),n}const d6="1.6.8",f_={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{f_[e]=function(r){return typeof r===e||"a"+(t<1?"n ":" ")+e}});const c2={};f_.transitional=function(t,n,r){function a(o,i){return"[Axios v"+d6+"] Transitional option '"+o+"'"+i+(r?". "+r:"")}return(o,i,s)=>{if(t===!1)throw new st(a(i," has been removed"+(n?" in "+n:"")),st.ERR_DEPRECATED);return n&&!c2[i]&&(c2[i]=!0,console.warn(a(i," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(o,i,s):!0}};function SZ(e,t,n){if(typeof e!="object")throw new st("options must be an object",st.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let a=r.length;for(;a-- >0;){const o=r[a],i=t[o];if(i){const s=e[o],l=s===void 0||i(s,o,e);if(l!==!0)throw new st("option "+o+" must be "+l,st.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new st("Unknown option "+o,st.ERR_BAD_OPTION)}}const W1={assertOptions:SZ,validators:f_},Mo=W1.validators;class Rg{constructor(t){this.defaults=t,this.interceptors={request:new r2,response:new r2}}async request(t,n){try{return await this._request(t,n)}catch(r){if(r instanceof Error){let a;Error.captureStackTrace?Error.captureStackTrace(a={}):a=new Error;const o=a.stack?a.stack.replace(/^.+\n/,""):"";r.stack?o&&!String(r.stack).endsWith(o.replace(/^.+\n.+\n/,""))&&(r.stack+=` -`+o):r.stack=o}throw r}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=bc(this.defaults,n);const{transitional:r,paramsSerializer:a,headers:o}=n;r!==void 0&&W1.assertOptions(r,{silentJSONParsing:Mo.transitional(Mo.boolean),forcedJSONParsing:Mo.transitional(Mo.boolean),clarifyTimeoutError:Mo.transitional(Mo.boolean)},!1),a!=null&&(J.isFunction(a)?n.paramsSerializer={serialize:a}:W1.assertOptions(a,{encode:Mo.function,serialize:Mo.function},!0)),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i=o&&J.merge(o.common,o[n.method]);o&&J.forEach(["delete","get","head","post","put","patch","common"],b=>{delete o[b]}),n.headers=fo.concat(i,o);const s=[];let l=!0;this.interceptors.request.forEach(function(y){typeof y.runWhen=="function"&&y.runWhen(n)===!1||(l=l&&y.synchronous,s.unshift(y.fulfilled,y.rejected))});const c=[];this.interceptors.response.forEach(function(y){c.push(y.fulfilled,y.rejected)});let u,d=0,g;if(!l){const b=[s2.bind(this),void 0];for(b.unshift.apply(b,s),b.push.apply(b,c),g=b.length,u=Promise.resolve(n);d{if(!r._listeners)return;let o=r._listeners.length;for(;o-- >0;)r._listeners[o](a);r._listeners=null}),this.promise.then=a=>{let o;const i=new Promise(s=>{r.subscribe(s),o=s}).then(a);return i.cancel=function(){r.unsubscribe(o)},i},t(function(o,i,s){r.reason||(r.reason=new of(o,i,s),n(r.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}static source(){let t;return{token:new p_(function(a){t=a}),cancel:t}}}const wZ=p_;function EZ(e){return function(n){return e.apply(null,n)}}function xZ(e){return J.isObject(e)&&e.isAxiosError===!0}const K1={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(K1).forEach(([e,t])=>{K1[t]=e});const kZ=K1;function f6(e){const t=new Vp(e),n=GF(Vp.prototype.request,t);return J.extend(n,Vp.prototype,t,{allOwnKeys:!0}),J.extend(n,t,null,{allOwnKeys:!0}),n.create=function(a){return f6(bc(e,a))},n}const rn=f6(d_);rn.Axios=Vp;rn.CanceledError=of;rn.CancelToken=wZ;rn.isCancel=l6;rn.VERSION=d6;rn.toFormData=Km;rn.AxiosError=st;rn.Cancel=rn.CanceledError;rn.all=function(t){return Promise.all(t)};rn.spread=EZ;rn.isAxiosError=xZ;rn.mergeConfig=bc;rn.AxiosHeaders=fo;rn.formToJSON=e=>s6(J.isHTMLForm(e)?new FormData(e):e);rn.getAdapter=u6.getAdapter;rn.HttpStatusCode=kZ;rn.default=rn;const p6=rn,CZ={baseURL:sY,headers:{"Content-Type":"application/json","Cache-Control":"no-cache"}},cl=p6.create(CZ),_Z=()=>cl,AZ=({children:e})=>{const[t,n]=p.useState(!1),r=Mi(),a=qF();return p.useEffect(()=>{const o=s=>s,i=s=>Promise.reject(s);cl.interceptors.response.use(o,i)},[r,cl]),p.useEffect(()=>{const o=s=>(s.headers.Authorization=a||"",s),i=cl.interceptors.request.use(o);return()=>{cl.interceptors.request.eject(i)}},[a,cl]),p.useEffect(()=>{t||setTimeout(()=>n(!0),10)},[t]),t?e:f.jsx("div",{className:"sr-only",children:"Re-authenticating..."})},TZ="ToolsServiceListTools",g_=({userId:e}={},t)=>[TZ,...t??[{userId:e}]],RZ="SourcesServiceListSources",sf=({userId:e}={},t)=>[RZ,...t??[{userId:e}]],NZ="AgentsServiceListAgents",g6=({userId:e}={},t)=>[NZ,...t??[{userId:e}]],IZ="AgentsServiceGetAgent",$s=({agentId:e,userId:t},n)=>[IZ,...n??[{agentId:e,userId:t}]],OZ="AgentsServiceGetAgentSources",m6=({agentId:e},t)=>[OZ,...t??[{agentId:e}]],DZ="AgentsServiceListAgentArchivalMemory",h6=({after:e,agentId:t,before:n,limit:r,userId:a},o)=>[DZ,...o??[{after:e,agentId:t,before:n,limit:r,userId:a}]],LZ="AgentsServiceListAgentMessages",MZ=({agentId:e,assistantMessageFunctionKwarg:t,assistantMessageFunctionName:n,before:r,limit:a,msgObject:o,useAssistantMessage:i,userId:s},l)=>[LZ,...l??[{agentId:e,assistantMessageFunctionKwarg:t,assistantMessageFunctionName:n,before:r,limit:a,msgObject:o,useAssistantMessage:i,userId:s}]],PZ="ModelsServiceListModels",$Z=e=>[PZ,...e??[]],FZ="LlmsServiceListEmbeddingModels",jZ=e=>[FZ,...e??[]],zZ="BlocksServiceListMemoryBlocks",lf=({label:e,name:t,templatesOnly:n,userId:r}={},a)=>[zZ,...a??[{label:e,name:t,templatesOnly:n,userId:r}]],UZ="JobsServiceListJobs",BZ=({sourceId:e,userId:t}={},n)=>[UZ,...n??[{sourceId:e,userId:t}]],HZ="JobsServiceListActiveJobs",b6=({userId:e}={},t)=>[HZ,...t??[{userId:e}]];class u2{constructor(){this._fns=[]}eject(t){const n=this._fns.indexOf(t);n!==-1&&(this._fns=[...this._fns.slice(0,n),...this._fns.slice(n+1)])}use(t){this._fns=[...this._fns,t]}}const Ie={CREDENTIALS:"include",ENCODE_PATH:void 0,HEADERS:void 0,PASSWORD:void 0,TOKEN:void 0,USERNAME:void 0,VERSION:"1.0.0",WITH_CREDENTIALS:!1,interceptors:{request:new u2,response:new u2},BASE:""};class d2 extends Error{constructor(t,n,r){super(r),this.name="ApiError",this.url=n.url,this.status=n.status,this.statusText=n.statusText,this.body=n.body,this.request=t}}class VZ extends Error{constructor(t){super(t),this.name="CancelError"}get isCancelled(){return!0}}class qZ{constructor(t){this._isResolved=!1,this._isRejected=!1,this._isCancelled=!1,this.cancelHandlers=[],this.promise=new Promise((n,r)=>{this._resolve=n,this._reject=r;const a=s=>{this._isResolved||this._isRejected||this._isCancelled||(this._isResolved=!0,this._resolve&&this._resolve(s))},o=s=>{this._isResolved||this._isRejected||this._isCancelled||(this._isRejected=!0,this._reject&&this._reject(s))},i=s=>{this._isResolved||this._isRejected||this._isCancelled||this.cancelHandlers.push(s)};return Object.defineProperty(i,"isResolved",{get:()=>this._isResolved}),Object.defineProperty(i,"isRejected",{get:()=>this._isRejected}),Object.defineProperty(i,"isCancelled",{get:()=>this._isCancelled}),t(a,o,i)})}get[Symbol.toStringTag](){return"Cancellable Promise"}then(t,n){return this.promise.then(t,n)}catch(t){return this.promise.catch(t)}finally(t){return this.promise.finally(t)}cancel(){if(!(this._isResolved||this._isRejected||this._isCancelled)){if(this._isCancelled=!0,this.cancelHandlers.length)try{for(const t of this.cancelHandlers)t()}catch(t){console.warn("Cancellation threw an error",t);return}this.cancelHandlers.length=0,this._reject&&this._reject(new VZ("Request aborted"))}}get isCancelled(){return this._isCancelled}}const Zm=e=>typeof e=="string",Nb=e=>Zm(e)&&e!=="",y6=e=>e instanceof Blob,GZ=e=>e instanceof FormData,f2=e=>e>=200&&e<300,WZ=e=>{try{return btoa(e)}catch{return Buffer.from(e).toString("base64")}},KZ=e=>{const t=[],n=(a,o)=>{t.push(`${encodeURIComponent(a)}=${encodeURIComponent(String(o))}`)},r=(a,o)=>{o!=null&&(o instanceof Date?n(a,o.toISOString()):Array.isArray(o)?o.forEach(i=>r(a,i)):typeof o=="object"?Object.entries(o).forEach(([i,s])=>r(`${a}[${i}]`,s)):n(a,o))};return Object.entries(e).forEach(([a,o])=>r(a,o)),t.length?`?${t.join("&")}`:""},YZ=(e,t)=>{const n=e.ENCODE_PATH||encodeURI,r=t.url.replace("{api-version}",e.VERSION).replace(/{(.*?)}/g,(o,i)=>{var s;return(s=t.path)!=null&&s.hasOwnProperty(i)?n(String(t.path[i])):o}),a=e.BASE+r;return t.query?a+KZ(t.query):a},ZZ=e=>{if(e.formData){const t=new FormData,n=(r,a)=>{Zm(a)||y6(a)?t.append(r,a):t.append(r,JSON.stringify(a))};return Object.entries(e.formData).filter(([,r])=>r!=null).forEach(([r,a])=>{Array.isArray(a)?a.forEach(o=>n(r,o)):n(r,a)}),t}},Yf=async(e,t)=>typeof t=="function"?t(e):t,XZ=async(e,t)=>{const[n,r,a,o]=await Promise.all([Yf(t,e.TOKEN),Yf(t,e.USERNAME),Yf(t,e.PASSWORD),Yf(t,e.HEADERS)]),i=Object.entries({Accept:"application/json",...o,...t.headers}).filter(([,s])=>s!=null).reduce((s,[l,c])=>({...s,[l]:String(c)}),{});if(Nb(n)&&(i.Authorization=`Bearer ${n}`),Nb(r)&&Nb(a)){const s=WZ(`${r}:${a}`);i.Authorization=`Basic ${s}`}return t.body!==void 0?t.mediaType?i["Content-Type"]=t.mediaType:y6(t.body)?i["Content-Type"]=t.body.type||"application/octet-stream":Zm(t.body)?i["Content-Type"]="text/plain":GZ(t.body)||(i["Content-Type"]="application/json"):t.formData!==void 0&&t.mediaType&&(i["Content-Type"]=t.mediaType),i},QZ=e=>{if(e.body)return e.body},JZ=async(e,t,n,r,a,o,i,s)=>{const l=new AbortController;let c={data:r??a,headers:o,method:t.method,signal:l.signal,url:n,withCredentials:e.WITH_CREDENTIALS};i(()=>l.abort());for(const u of e.interceptors.request._fns)c=await u(c);try{return await s.request(c)}catch(u){const d=u;if(d.response)return d.response;throw u}},eX=(e,t)=>{if(t){const n=e.headers[t];if(Zm(n))return n}},tX=e=>{if(e.status!==204)return e.data},nX=(e,t)=>{const r={400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",406:"Not Acceptable",407:"Proxy Authentication Required",408:"Request Timeout",409:"Conflict",410:"Gone",411:"Length Required",412:"Precondition Failed",413:"Payload Too Large",414:"URI Too Long",415:"Unsupported Media Type",416:"Range Not Satisfiable",417:"Expectation Failed",418:"Im a teapot",421:"Misdirected Request",422:"Unprocessable Content",423:"Locked",424:"Failed Dependency",425:"Too Early",426:"Upgrade Required",428:"Precondition Required",429:"Too Many Requests",431:"Request Header Fields Too Large",451:"Unavailable For Legal Reasons",500:"Internal Server Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout",505:"HTTP Version Not Supported",506:"Variant Also Negotiates",507:"Insufficient Storage",508:"Loop Detected",510:"Not Extended",511:"Network Authentication Required",...e.errors}[t.status];if(r)throw new d2(e,t,r);if(!t.ok){const a=t.status??"unknown",o=t.statusText??"unknown",i=(()=>{try{return JSON.stringify(t.body,null,2)}catch{return}})();throw new d2(e,t,`Generic Error: status: ${a}; status text: ${o}; body: ${i}`)}},Pe=(e,t,n=p6)=>new qZ(async(r,a,o)=>{try{const i=YZ(e,t),s=ZZ(t),l=QZ(t),c=await XZ(e,t);if(!o.isCancelled){let u=await JZ(e,t,i,l,s,c,o,n);for(const y of e.interceptors.response._fns)u=await y(u);const d=tX(u),g=eX(u,t.responseHeader);let m=d;t.responseTransformer&&f2(u.status)&&(m=await t.responseTransformer(d));const b={url:i,ok:f2(u.status),status:u.status,statusText:u.statusText,body:g??m};nX(t,b),r(b.body)}}catch(i){a(i)}});class m_{static deleteTool(t,n){return Pe(Ie,{method:"DELETE",url:"/v1/tools/{tool_id}",path:{tool_id:t.toolId},errors:{422:"Validation Error"},headers:n})}static getTool(t,n){return Pe(Ie,{method:"GET",url:"/v1/tools/{tool_id}",path:{tool_id:t.toolId},errors:{422:"Validation Error"},headers:n})}static updateTool(t,n){return Pe(Ie,{method:"PATCH",url:"/v1/tools/{tool_id}",path:{tool_id:t.toolId},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static getToolIdByName(t,n){return Pe(Ie,{method:"GET",url:"/v1/tools/name/{tool_name}",path:{tool_name:t.toolName},errors:{422:"Validation Error"},headers:n})}static listTools(t={},n){return Pe(Ie,{method:"GET",url:"/v1/tools/",errors:{422:"Validation Error"},headers:n})}static createTool(t,n){return Pe(Ie,{method:"POST",url:"/v1/tools/",query:{update:t.update},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}}class Pc{static getSource(t,n){return Pe(Ie,{method:"GET",url:"/v1/sources/{source_id}",path:{source_id:t.sourceId},errors:{422:"Validation Error"},headers:n})}static updateSource(t,n){return Pe(Ie,{method:"PATCH",url:"/v1/sources/{source_id}",path:{source_id:t.sourceId},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static deleteSource(t,n){return Pe(Ie,{method:"DELETE",url:"/v1/sources/{source_id}",path:{source_id:t.sourceId},errors:{422:"Validation Error"},headers:n})}static getSourceIdByName(t,n){return Pe(Ie,{method:"GET",url:"/v1/sources/name/{source_name}",path:{source_name:t.sourceName},errors:{422:"Validation Error"},headers:n})}static listSources(t={},n){return Pe(Ie,{method:"GET",url:"/v1/sources/",errors:{422:"Validation Error"},headers:n})}static createSource(t,n){return Pe(Ie,{method:"POST",url:"/v1/sources/",body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static attachAgentToSource(t,n){return Pe(Ie,{method:"POST",url:"/v1/sources/{source_id}/attach",path:{source_id:t.sourceId},query:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static detachAgentFromSource(t,n){return Pe(Ie,{method:"POST",url:"/v1/sources/{source_id}/detach",path:{source_id:t.sourceId},query:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static uploadFileToSource(t,n){return Pe(Ie,{method:"POST",url:"/v1/sources/{source_id}/upload",path:{source_id:t.sourceId},formData:t.formData,mediaType:"multipart/form-data",errors:{422:"Validation Error"},headers:n})}static listSourcePassages(t,n){return Pe(Ie,{method:"GET",url:"/v1/sources/{source_id}/passages",path:{source_id:t.sourceId},errors:{422:"Validation Error"},headers:n})}static listFilesFromSource(t,n){return Pe(Ie,{method:"GET",url:"/v1/sources/{source_id}/files",path:{source_id:t.sourceId},query:{limit:t.limit,cursor:t.cursor},errors:{422:"Validation Error"},headers:n})}}class Va{static listAgents(t={},n){return Pe(Ie,{method:"GET",url:"/v1/agents/",errors:{422:"Validation Error"},headers:n})}static createAgent(t,n){return Pe(Ie,{method:"POST",url:"/v1/agents/",body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static updateAgent(t,n){return Pe(Ie,{method:"PATCH",url:"/v1/agents/{agent_id}",path:{agent_id:t.agentId},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static getAgent(t,n){return Pe(Ie,{method:"GET",url:"/v1/agents/{agent_id}",path:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static deleteAgent(t,n){return Pe(Ie,{method:"DELETE",url:"/v1/agents/{agent_id}",path:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static getAgentSources(t,n){return Pe(Ie,{method:"GET",url:"/v1/agents/{agent_id}/sources",path:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static listAgentInContextMessages(t,n){return Pe(Ie,{method:"GET",url:"/v1/agents/{agent_id}/memory/messages",path:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static getAgentMemory(t,n){return Pe(Ie,{method:"GET",url:"/v1/agents/{agent_id}/memory",path:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static updateAgentMemory(t,n){return Pe(Ie,{method:"PATCH",url:"/v1/agents/{agent_id}/memory",path:{agent_id:t.agentId},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static getAgentRecallMemorySummary(t,n){return Pe(Ie,{method:"GET",url:"/v1/agents/{agent_id}/memory/recall",path:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static getAgentArchivalMemorySummary(t,n){return Pe(Ie,{method:"GET",url:"/v1/agents/{agent_id}/memory/archival",path:{agent_id:t.agentId},errors:{422:"Validation Error"},headers:n})}static listAgentArchivalMemory(t,n){return Pe(Ie,{method:"GET",url:"/v1/agents/{agent_id}/archival",path:{agent_id:t.agentId},query:{after:t.after,before:t.before,limit:t.limit},errors:{422:"Validation Error"},headers:n})}static createAgentArchivalMemory(t,n){return Pe(Ie,{method:"POST",url:"/v1/agents/{agent_id}/archival",path:{agent_id:t.agentId},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static deleteAgentArchivalMemory(t,n){return Pe(Ie,{method:"DELETE",url:"/v1/agents/{agent_id}/archival/{memory_id}",path:{agent_id:t.agentId,memory_id:t.memoryId},errors:{422:"Validation Error"},headers:n})}static listAgentMessages(t,n){return Pe(Ie,{method:"GET",url:"/v1/agents/{agent_id}/messages",path:{agent_id:t.agentId},query:{before:t.before,limit:t.limit,msg_object:t.msgObject,use_assistant_message:t.useAssistantMessage,assistant_message_function_name:t.assistantMessageFunctionName,assistant_message_function_kwarg:t.assistantMessageFunctionKwarg},errors:{422:"Validation Error"},headers:n})}static createAgentMessage(t,n){return Pe(Ie,{method:"POST",url:"/v1/agents/{agent_id}/messages",path:{agent_id:t.agentId},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static updateAgentMessage(t,n){return Pe(Ie,{method:"PATCH",url:"/v1/agents/{agent_id}/messages/{message_id}",path:{agent_id:t.agentId,message_id:t.messageId},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}}class rX{static listModels(t){return Pe(Ie,{method:"GET",url:"/v1/models/",headers:t})}static listEmbeddingModels(t){return Pe(Ie,{method:"GET",url:"/v1/models/embedding",headers:t})}}class aX{static listModels(t){return Pe(Ie,{method:"GET",url:"/v1/models/",headers:t})}static listEmbeddingModels(t){return Pe(Ie,{method:"GET",url:"/v1/models/embedding",headers:t})}}class h_{static listMemoryBlocks(t={},n){return Pe(Ie,{method:"GET",url:"/v1/blocks/",query:{label:t.label,templates_only:t.templatesOnly,name:t.name},errors:{422:"Validation Error"},headers:n})}static createMemoryBlock(t,n){return Pe(Ie,{method:"POST",url:"/v1/blocks/",body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static updateMemoryBlock(t,n){return Pe(Ie,{method:"PATCH",url:"/v1/blocks/{block_id}",path:{block_id:t.blockId},body:t.requestBody,mediaType:"application/json",errors:{422:"Validation Error"},headers:n})}static deleteMemoryBlock(t,n){return Pe(Ie,{method:"DELETE",url:"/v1/blocks/{block_id}",path:{block_id:t.blockId},errors:{422:"Validation Error"},headers:n})}static getMemoryBlock(t,n){return Pe(Ie,{method:"GET",url:"/v1/blocks/{block_id}",path:{block_id:t.blockId},errors:{422:"Validation Error"},headers:n})}}class oX{static listJobs(t={},n){return Pe(Ie,{method:"GET",url:"/v1/jobs/",query:{source_id:t.sourceId},errors:{422:"Validation Error"},headers:n})}static listActiveJobs(t={},n){return Pe(Ie,{method:"GET",url:"/v1/jobs/active",errors:{422:"Validation Error"},headers:n})}static getJob(t,n){return Pe(Ie,{method:"GET",url:"/v1/jobs/{job_id}",path:{job_id:t.jobId},errors:{422:"Validation Error"},headers:n})}static deleteJob(t,n){return Pe(Ie,{method:"DELETE",url:"/v1/jobs/{job_id}",path:{job_id:t.jobId},errors:{422:"Validation Error"},headers:n})}}const Xm=({userId:e}={},t,n)=>Jr({queryKey:g_({userId:e},t),queryFn:()=>m_.listTools({userId:e}),...n}),b_=({userId:e}={},t,n)=>Jr({queryKey:sf({userId:e},t),queryFn:()=>Pc.listSources({userId:e}),...n}),Qm=({userId:e}={},t,n)=>Jr({queryKey:g6({userId:e},t),queryFn:()=>Va.listAgents({userId:e}),...n}),y_=({agentId:e,userId:t},n,r)=>Jr({queryKey:$s({agentId:e,userId:t},n),queryFn:()=>Va.getAgent({agentId:e,userId:t}),...r}),v6=({agentId:e},t,n)=>Jr({queryKey:m6({agentId:e},t),queryFn:()=>Va.getAgentSources({agentId:e}),...n}),S6=({after:e,agentId:t,before:n,limit:r,userId:a},o,i)=>Jr({queryKey:h6({after:e,agentId:t,before:n,limit:r,userId:a},o),queryFn:()=>Va.listAgentArchivalMemory({after:e,agentId:t,before:n,limit:r,userId:a}),...i}),iX=({agentId:e,assistantMessageFunctionKwarg:t,assistantMessageFunctionName:n,before:r,limit:a,msgObject:o,useAssistantMessage:i,userId:s},l,c)=>Jr({queryKey:MZ({agentId:e,assistantMessageFunctionKwarg:t,assistantMessageFunctionName:n,before:r,limit:a,msgObject:o,useAssistantMessage:i,userId:s},l),queryFn:()=>Va.listAgentMessages({agentId:e,assistantMessageFunctionKwarg:t,assistantMessageFunctionName:n,before:r,limit:a,msgObject:o,useAssistantMessage:i,userId:s}),...c}),w6=(e,t)=>Jr({queryKey:$Z(e),queryFn:()=>rX.listModels(),...t}),E6=(e,t)=>Jr({queryKey:jZ(e),queryFn:()=>aX.listEmbeddingModels(),...t}),Ng=({label:e,name:t,templatesOnly:n,userId:r}={},a,o)=>Jr({queryKey:lf({label:e,name:t,templatesOnly:n,userId:r},a),queryFn:()=>h_.listMemoryBlocks({label:e,name:t,templatesOnly:n,userId:r}),...o}),sX=({userId:e}={},t,n)=>Jr({queryKey:b6({userId:e},t),queryFn:()=>oX.listActiveJobs({userId:e}),...n}),lX=e=>gr({mutationFn:({requestBody:t,update:n,userId:r})=>m_.createTool({requestBody:t,update:n,userId:r}),...e}),cX=e=>gr({mutationFn:({requestBody:t,userId:n})=>Pc.createSource({requestBody:t,userId:n}),...e}),x6=e=>gr({mutationFn:({agentId:t,sourceId:n,userId:r})=>Pc.attachAgentToSource({agentId:t,sourceId:n,userId:r}),...e}),k6=e=>gr({mutationFn:({agentId:t,sourceId:n,userId:r})=>Pc.detachAgentFromSource({agentId:t,sourceId:n,userId:r}),...e}),C6=e=>gr({mutationFn:({formData:t,sourceId:n,userId:r})=>Pc.uploadFileToSource({formData:t,sourceId:n,userId:r}),...e}),uX=e=>gr({mutationFn:({requestBody:t,userId:n})=>Va.createAgent({requestBody:t,userId:n}),...e}),dX=e=>gr({mutationFn:({agentId:t,requestBody:n,userId:r})=>Va.createAgentArchivalMemory({agentId:t,requestBody:n,userId:r}),...e}),_6=e=>gr({mutationFn:({requestBody:t,userId:n})=>h_.createMemoryBlock({requestBody:t,userId:n}),...e}),fX=e=>gr({mutationFn:({requestBody:t,toolId:n,userId:r})=>m_.updateTool({requestBody:t,toolId:n,userId:r}),...e}),pX=e=>gr({mutationFn:({requestBody:t,sourceId:n,userId:r})=>Pc.updateSource({requestBody:t,sourceId:n,userId:r}),...e}),cf=e=>gr({mutationFn:({agentId:t,requestBody:n,userId:r})=>Va.updateAgent({agentId:t,requestBody:n,userId:r}),...e}),v_=e=>gr({mutationFn:({blockId:t,requestBody:n})=>h_.updateMemoryBlock({blockId:t,requestBody:n}),...e}),gX=e=>gr({mutationFn:({agentId:t,userId:n})=>Va.deleteAgent({agentId:t,userId:n}),...e}),mX=e=>gr({mutationFn:({agentId:t,memoryId:n,userId:r})=>Va.deleteAgentArchivalMemory({agentId:t,memoryId:n,userId:r}),...e});Ie.BASE="";Ie.HEADERS={"Content-Type":"application/json","Cache-Control":"no-cache"};const hX=({children:e})=>{const[t,n]=p.useState(!1),r=qF(),a=Mi();return p.useEffect(()=>{const o=i=>i;return Ie.interceptors.response.use(o),()=>{Ie.interceptors.response.eject(o)}},[a]),p.useEffect(()=>{const o=i=>(i.headers={...i.headers,Authorization:"Bearer password"},i);return Ie.interceptors.request.use(o),()=>{Ie.interceptors.request.eject(o)}},[r]),p.useEffect(()=>{t||setTimeout(()=>n(!0),10)},[t]),t?e:f.jsx("div",{className:"sr-only",children:"Re-authenticating..."})},yc=ef("inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground hover:bg-destructive/90",outline:"border border-input bg-background hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3",xs:"text-xs h-7 rounded-md px-3",lg:"h-11 rounded-md px-8",icon:"h-10 w-10",iconSm:"h-9 w-9",iconXs:"h-7 w-7"}},defaultVariants:{variant:"default",size:"default"}});function p2({isBusy:e,icon:t}){return e?f.jsx(un,{className:"h-4 w-4 animate-spin"}):t||null}const ue=p.forwardRef(({className:e,children:t,label:n,isBusy:r,icon:a,iconPosition:o="left",disabled:i,variant:s,size:l,asChild:c=!1,...u},d)=>{const g=c?$a:"button",m=p.useMemo(()=>i||r,[i,r]),b=p.useMemo(()=>a||o?"flex items-center gap-1":"",[a,o]);return f.jsxs(g,{className:ee(b,yc({variant:s,size:l,className:e})),disabled:m,ref:d,...u,children:[o==="left"&&f.jsx(p2,{isBusy:r??!1,icon:a??null}),f.jsx(Rm,{children:t}),o==="right"&&f.jsx(p2,{isBusy:r??!1,icon:a??null})]})});ue.displayName="Button";const Fs=({children:e,className:t})=>f.jsx("div",{className:ee("h-full w-full overflow-auto",t),children:e});function Zf({children:e,className:t}){return f.jsx("div",{className:ee("flex justify-center text-muted-foreground",t),children:e})}function bX(e){return f.jsxs("svg",{viewBox:"0 0 20 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e,children:[f.jsx("path",{d:"M5.21875 8.90625H3.84375C3.46875 8.90625 3.125 9.21875 3.125 9.625C3.125 10.0313 3.4375 10.3437 3.84375 10.3437H5.21875C5.59375 10.3437 5.9375 10.0313 5.9375 9.625C5.9375 9.21875 5.59375 8.90625 5.21875 8.90625Z",fill:"currentColor"}),f.jsx("path",{d:"M12.875 8.90625H11.5C11.125 8.90625 10.7812 9.21875 10.7812 9.625C10.7812 10.0313 11.0937 10.3437 11.5 10.3437H12.875C13.25 10.3437 13.5938 10.0313 13.5938 9.625C13.5938 9.21875 13.25 8.90625 12.875 8.90625Z",fill:"currentColor"}),f.jsx("path",{d:"M17.7187 8.09375V3.9375C18.5 3.65625 19.0312 2.90625 19.0312 2.0625C19.0312 0.9375 18.125 0.03125 17 0.03125C15.875 0.03125 14.9687 0.9375 14.9687 2.0625C14.9687 2.9375 15.5312 3.65625 16.2812 3.9375V8.0625H15.9375V7.84375C15.9375 6.59375 14.9062 5.5625 13.6562 5.5625H11.875V4.875C11.875 3.84375 11.0312 3.03125 10.0312 3.03125H9.0625V0.96875C9.0625 0.59375 8.75 0.25 8.34375 0.25C7.9375 0.25 7.625 0.5625 7.625 0.96875V3.03125H6.625C5.59375 3.03125 4.78125 3.875 4.78125 4.875V5.5625H2.8125C1.5625 5.5625 0.53125 6.59375 0.53125 7.84375V13.6875C0.53125 14.9375 1.5625 15.9688 2.8125 15.9688H13.6875C14.9375 15.9688 15.9687 14.9375 15.9687 13.6875V13.4688H17.625C18.6562 13.4688 19.4687 12.625 19.4687 11.625V9.96875C19.4687 8.9375 18.6875 8.15625 17.7187 8.09375ZM17 1.4375C17.3437 1.4375 17.625 1.71875 17.625 2.0625C17.625 2.40625 17.3437 2.6875 17 2.6875C16.6562 2.6875 16.375 2.40625 16.375 2.0625C16.375 1.71875 16.6562 1.4375 17 1.4375ZM6.21875 4.875C6.21875 4.625 6.40625 4.4375 6.65625 4.4375H10.0312C10.2812 4.4375 10.4687 4.625 10.4687 4.875V5.5625H6.21875V4.875ZM14.5312 13.6875C14.5312 14.1562 14.1562 14.5625 13.6562 14.5625H2.8125C2.34375 14.5625 1.9375 14.1875 1.9375 13.6875V7.84375C1.9375 7.375 2.3125 6.96875 2.8125 6.96875H13.6875C14.1562 6.96875 14.5625 7.34375 14.5625 7.84375V13.6875H14.5312ZM18.0625 11.5938C18.0625 11.8438 17.875 12.0312 17.625 12.0312H15.9375V9.46875H17.5937C17.8437 9.46875 18.0312 9.65625 18.0312 9.90625V11.5938H18.0625Z",fill:"currentColor"}),f.jsx("path",{d:"M9.5 11.125C9.125 11.125 8.78125 11.4375 8.78125 11.8437C8.78125 12.0937 8.59375 12.2813 8.34375 12.2813C8.09375 12.2813 7.90625 12.0937 7.90625 11.8437C7.90625 11.4687 7.59375 11.125 7.1875 11.125C6.78125 11.125 6.46875 11.4375 6.46875 11.8437C6.46875 12.875 7.3125 13.6875 8.3125 13.6875C9.3125 13.6875 10.1562 12.8437 10.1562 11.8437C10.1875 11.4375 9.875 11.125 9.5 11.125Z",fill:"currentColor"})]})}function yX(e){return f.jsx("svg",{viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e,children:f.jsx("path",{d:"M8.00039 11.3998C7.85039 11.3998 7.72539 11.3498 7.60039 11.2498L1.85039 5.5998C1.62539 5.3748 1.62539 5.0248 1.85039 4.7998C2.07539 4.5748 2.42539 4.5748 2.65039 4.7998L8.00039 10.0248L13.3504 4.7498C13.5754 4.5248 13.9254 4.5248 14.1504 4.7498C14.3754 4.9748 14.3754 5.3248 14.1504 5.5498L8.40039 11.1998C8.27539 11.3248 8.15039 11.3998 8.00039 11.3998Z",fill:"currentColor"})})}function vX(e){return f.jsx("svg",{viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e,children:f.jsx("path",{d:"M13.7504 11.4002C13.6004 11.4002 13.4754 11.3502 13.3504 11.2502L8.00039 5.9752L2.65039 11.2252C2.42539 11.4502 2.07539 11.4502 1.85039 11.2252C1.62539 11.0002 1.62539 10.6502 1.85039 10.4252L7.60039 4.7752C7.82539 4.5502 8.17539 4.5502 8.40039 4.7752L14.1504 10.4252C14.3754 10.6502 14.3754 11.0002 14.1504 11.2252C14.0504 11.3252 13.9004 11.4002 13.7504 11.4002Z",fill:"currentColor"})})}function SX(e){return f.jsxs("svg",{viewBox:"0 0 20 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e,children:[f.jsx("path",{d:"M10 9.5C12.5938 9.5 14.6875 7.40625 14.6875 4.8125C14.6875 2.21875 12.5938 0.125 10 0.125C7.40625 0.125 5.3125 2.21875 5.3125 4.8125C5.3125 7.40625 7.40625 9.5 10 9.5ZM10 1.53125C11.8125 1.53125 13.2812 3 13.2812 4.8125C13.2812 6.625 11.8125 8.09375 10 8.09375C8.1875 8.09375 6.71875 6.625 6.71875 4.8125C6.71875 3 8.1875 1.53125 10 1.53125Z",fill:"currentColor"}),f.jsx("path",{d:"M19.2191 14.625C16.6566 12.4688 13.4066 11.2812 10.0004 11.2812C6.59412 11.2812 3.34412 12.4688 0.781616 14.625C0.500366 14.875 0.437866 15.3125 0.687866 15.625C0.937866 15.9063 1.37537 15.9688 1.68787 15.7188C4.00037 13.75 6.93787 12.6875 10.0004 12.6875C13.0629 12.6875 16.0004 13.75 18.2816 15.6875C18.4066 15.8125 18.5629 15.8438 18.7504 15.8438C18.9379 15.8438 19.1566 15.75 19.2816 15.5938C19.5316 15.3125 19.5004 14.875 19.2191 14.625Z",fill:"currentColor"})]})}function wX(e){return f.jsxs("svg",{viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e,children:[f.jsx("path",{d:"M17.875 2.9375H11C10.625 2.9375 10.2812 3.0625 10 3.25C9.71875 3.0625 9.375 2.9375 9 2.9375H2.125C1.25 2.9375 0.5625 3.65625 0.5625 4.5V14.6875C0.5625 15.5625 1.28125 16.25 2.125 16.25H9.3125V16.3437C9.3125 16.7187 9.625 17.0625 10.0312 17.0625C10.4062 17.0625 10.75 16.75 10.75 16.3437V16.25H17.9375C18.8125 16.25 19.5 15.5312 19.5 14.6875V4.5C19.4688 3.625 18.75 2.9375 17.875 2.9375ZM2.125 14.875C2.03125 14.875 1.96875 14.8125 1.96875 14.7187V4.5C1.96875 4.40625 2.03125 4.34375 2.125 4.34375H9.03125C9.1875 4.34375 9.3125 4.46875 9.3125 4.625V14.875H2.125ZM18.0625 14.6875C18.0625 14.7812 18 14.8437 17.9062 14.8437H10.7188V4.625C10.7188 4.46875 10.8438 4.34375 11 4.34375H17.9062C18 4.34375 18.0625 4.40625 18.0625 4.5V14.6875Z",fill:"currentColor"}),f.jsx("path",{d:"M4.46875 7.40625H6.78125C7.15625 7.40625 7.5 7.09375 7.5 6.6875C7.5 6.28125 7.1875 5.96875 6.78125 5.96875H4.46875C4.09375 5.96875 3.75 6.28125 3.75 6.6875C3.75 7.09375 4.0625 7.40625 4.46875 7.40625Z",fill:"currentColor"}),f.jsx("path",{d:"M13.125 7.40625H15.4375C15.8125 7.40625 16.1562 7.09375 16.1562 6.6875C16.1562 6.28125 15.8438 5.96875 15.4375 5.96875H13.125C12.75 5.96875 12.4062 6.28125 12.4062 6.6875C12.4062 7.09375 12.75 7.40625 13.125 7.40625Z",fill:"currentColor"}),f.jsx("path",{d:"M15.5 8.5625H13.1875C12.8125 8.5625 12.4688 8.875 12.4688 9.28125C12.4688 9.6875 12.7812 10 13.1875 10H15.5C15.875 10 16.2188 9.6875 16.2188 9.28125C16.2188 8.875 15.875 8.5625 15.5 8.5625Z",fill:"currentColor"}),f.jsx("path",{d:"M6.8125 8.5625H4.5C4.125 8.5625 3.78125 8.875 3.78125 9.28125C3.78125 9.6875 4.09375 10 4.5 10H6.8125C7.1875 10 7.53125 9.6875 7.53125 9.28125C7.53125 8.875 7.21875 8.5625 6.8125 8.5625Z",fill:"currentColor"}),f.jsx("path",{d:"M6.8125 11.3125H4.5C4.125 11.3125 3.78125 11.625 3.78125 12.0312C3.78125 12.4375 4.09375 12.75 4.5 12.75H6.8125C7.1875 12.75 7.53125 12.4375 7.53125 12.0312C7.53125 11.625 7.21875 11.3125 6.8125 11.3125Z",fill:"currentColor"}),f.jsx("path",{d:"M15.5 11.3125H13.1875C12.8125 11.3125 12.4688 11.625 12.4688 12.0312C12.4688 12.4375 12.7812 12.75 13.1875 12.75H15.5C15.875 12.75 16.2188 12.4375 16.2188 12.0312C16.2188 11.625 15.875 11.3125 15.5 11.3125Z",fill:"currentColor"})]})}function EX(e){return f.jsxs("svg",{viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e,children:[f.jsx("path",{d:"M17.5625 2.28125H2.4375C1.40625 2.28125 0.5625 3.125 0.5625 4.15625V12.875C0.5625 13.9063 1.40625 14.75 2.4375 14.75H6.9375L9.4375 17.5C9.5625 17.6563 9.75 17.7188 9.96875 17.7188C10.1562 17.7188 10.3438 17.625 10.5 17.5L13.0625 14.7188H17.5938C18.625 14.7188 19.4688 13.875 19.4688 12.8438V4.15625C19.4688 3.125 18.5938 2.28125 17.5625 2.28125ZM18.0625 12.8438C18.0625 13.0938 17.8438 13.3125 17.5938 13.3125H12.7188C12.5312 13.3125 12.3438 13.4063 12.1875 13.5313L9.9375 15.9688L7.75 13.5625C7.625 13.4063 7.4375 13.3438 7.21875 13.3438H2.4375C2.1875 13.3438 1.96875 13.125 1.96875 12.875V4.15625C1.96875 3.90625 2.1875 3.6875 2.4375 3.6875H17.5625C17.8125 3.6875 18.0312 3.90625 18.0312 4.15625V12.8438H18.0625Z",fill:"currentColor"}),f.jsx("path",{d:"M5.5625 7.59375C5.15625 7.59375 4.8125 7.9375 4.8125 8.34375C4.8125 8.75 5.15625 9.09375 5.5625 9.09375C5.96875 9.09375 6.3125 8.75 6.3125 8.34375C6.3125 7.9375 6 7.59375 5.5625 7.59375Z",fill:"currentColor"}),f.jsx("path",{d:"M10 7.59375C9.59375 7.59375 9.25 7.9375 9.25 8.34375C9.25 8.75 9.59375 9.09375 10 9.09375C10.4062 9.09375 10.75 8.75 10.75 8.34375C10.75 7.9375 10.4062 7.59375 10 7.59375Z",fill:"currentColor"}),f.jsx("path",{d:"M14.4375 7.59375C14.0313 7.59375 13.6875 7.9375 13.6875 8.34375C13.6875 8.75 14.0313 9.09375 14.4375 9.09375C14.8438 9.09375 15.1875 8.75 15.1875 8.34375C15.1875 7.9375 14.8438 7.59375 14.4375 7.59375Z",fill:"currentColor"})]})}function xX(e){return f.jsx("svg",{viewBox:"0 0 14 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e,children:f.jsx("path",{d:"M7 0.5625C3.34375 0.5625 0.46875 2.28125 0.46875 4.4375V15.5625C0.46875 17.7188 3.40625 19.4375 6.96875 19.4375C10.5625 19.4375 13.5 17.6875 13.5 15.5625V4.4375C13.5312 2.25 10.6562 0.5625 7 0.5625ZM7 1.96875C10 1.96875 12.125 3.28125 12.125 4.4375C12.125 5.625 10.0312 6.90625 7 6.90625C3.96875 6.90625 1.875 5.59375 1.875 4.4375C1.875 3.25 4 1.96875 7 1.96875ZM7 18.0625C4.0625 18.0625 1.90625 16.75 1.90625 15.5938V14.375C3.09375 15.25 4.90625 15.7813 7 15.7813C9.09375 15.7813 10.9375 15.2188 12.125 14.375V15.5938C12.125 16.75 9.9375 18.0625 7 18.0625ZM7 14.375C4 14.375 1.90625 13.125 1.90625 12V10.5625C3.125 11.4375 5.03125 11.9688 7 11.9688C9.0625 11.9688 10.9063 11.4375 12.125 10.5625V12C12.125 13.125 10 14.375 7 14.375ZM11.3125 9.40625C10.3437 10.125 8.75 10.5625 7 10.5625C5.28125 10.5625 3.65625 10.125 2.6875 9.40625C2.3125 9.15625 1.90625 8.71875 1.90625 8.1875V6.875C3.09375 7.75 4.9375 8.3125 7.03125 8.3125C9.125 8.3125 10.9688 7.75 12.1562 6.875V8.1875C12.125 8.6875 11.6875 9.125 11.3125 9.40625Z",fill:"currentColor"})})}function kX(e){return f.jsxs("svg",{viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e,children:[f.jsx("g",{clipPath:"url(#clip0_6318_531)",children:f.jsx("path",{d:"M18.7505 13.7189L16.813 11.7814C16.0317 11.0002 14.7505 11.0002 13.9692 11.7814L13.438 12.3127L11.7192 10.5939L13.3442 8.96891L16.5317 8.12515C17.2192 7.93765 17.7817 7.37515 17.9692 6.68765L18.8755 3.3439C18.9692 2.9689 18.7505 2.5939 18.3755 2.4689C18.0005 2.37515 17.6255 2.5939 17.5005 2.9689L16.5942 6.31265C16.5317 6.5314 16.3755 6.68765 16.1567 6.75015L12.813 7.6564C12.688 7.68765 12.5942 7.75015 12.5005 7.8439L10.7505 9.59391L9.68799 8.5314L11.438 6.7814C11.5317 6.68765 11.5942 6.5939 11.6255 6.4689L12.5005 3.12515C12.563 2.9064 12.7192 2.75015 12.938 2.68765L16.2817 1.7814C16.6567 1.68765 16.8755 1.2814 16.7817 0.906405C16.688 0.531405 16.313 0.312655 15.938 0.437655L12.5942 1.31265C11.9067 1.50015 11.3442 2.06265 11.1567 2.75015L10.313 5.9064L8.68799 7.5314L7.063 5.9064C7.688 5.18765 7.7505 4.12515 7.188 3.3439L5.84425 1.56265C5.5005 1.0939 4.96925 0.812655 4.3755 0.781405C3.78175 0.750155 3.21925 0.937655 2.813 1.37515L1.53175 2.6564C1.1255 3.06265 0.906746 3.62515 0.937996 4.2189C0.969246 4.81265 1.2505 5.3439 1.71925 5.68765L3.5005 7.0314C3.84425 7.31265 4.28175 7.43765 4.71925 7.43765C5.21925 7.43765 5.688 7.25015 6.063 6.9064L7.688 8.5314L5.59425 10.6252L2.438 11.4689C1.7505 11.6564 1.188 12.2189 1.0005 12.9064L0.312996 15.5002C0.125496 16.1877 0.312996 16.9377 0.844246 17.4689L1.813 18.4377C2.188 18.8127 2.71925 19.0314 3.2505 19.0314C3.438 19.0314 3.59425 19.0002 3.78175 18.9689L6.3755 18.2814C7.063 18.0939 7.6255 17.5314 7.813 16.8439L8.65675 13.6877L10.7505 11.5939L12.4692 13.3127L11.938 13.8439C11.1567 14.6252 11.1567 15.9064 11.938 16.6877L13.8755 18.6252C14.5317 19.2814 15.3755 19.6252 16.313 19.6252C17.2505 19.6252 18.0942 19.2814 18.7505 18.6252C19.4067 17.9689 19.7505 17.1252 19.7505 16.1877C19.7505 15.2502 19.4067 14.3752 18.7505 13.7189ZM4.34425 5.87515L2.563 4.5314C2.3755 4.37515 2.34425 4.18765 2.313 4.0939C2.313 4.00015 2.313 3.7814 2.5005 3.62515L3.78175 2.3439C3.938 2.18765 4.09425 2.1564 4.21925 2.1564H4.2505C4.34425 2.1564 4.53175 2.2189 4.688 2.4064L6.03175 4.18765C6.21925 4.43765 6.188 4.75015 5.96925 4.9689L5.1255 5.81265C4.938 6.0314 4.59425 6.06265 4.34425 5.87515ZM7.53175 12.8127C7.438 12.9064 7.3755 13.0002 7.34425 13.1252L6.438 16.4689C6.3755 16.6877 6.21925 16.8439 6.0005 16.9064L3.40675 17.5939C3.188 17.6564 2.96925 17.5939 2.813 17.4377L1.84425 16.4689C1.688 16.3127 1.6255 16.0939 1.688 15.8752L2.3755 13.2814C2.438 13.0627 2.59425 12.9064 2.813 12.8439L6.15675 11.9377C6.28175 11.9064 6.3755 11.8439 6.46925 11.7502L8.71924 9.50015L9.78174 10.5627L7.53175 12.8127ZM17.7505 17.5939C17.3755 17.9689 16.8442 18.1877 16.313 18.1877C15.7817 18.1877 15.2505 17.9689 14.8755 17.5939L12.938 15.6564C12.7192 15.4377 12.7192 15.0314 12.938 14.8127L13.4692 14.2814L13.9067 14.7189C14.0317 14.8439 14.2192 14.9377 14.4067 14.9377C14.5942 14.9377 14.7817 14.8752 14.9067 14.7189C15.188 14.4377 15.188 14.0002 14.9067 13.7189L14.4692 13.2814L15.0005 12.7502C15.1255 12.6252 15.2505 12.5627 15.438 12.5627C15.5942 12.5627 15.7505 12.6252 15.8755 12.7502L17.813 14.6877C18.188 15.0627 18.4067 15.5939 18.4067 16.1252C18.4067 16.6564 18.1567 17.2189 17.7505 17.5939Z",fill:"currentColor"})}),f.jsx("defs",{children:f.jsx("clipPath",{id:"clip0_6318_531",children:f.jsx("rect",{width:"20",height:"20",fill:"white"})})})]})}/** - * table-core - * - * Copyright (c) TanStack - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */function ii(e,t){return typeof e=="function"?e(t):e}function Tr(e,t){return n=>{t.setState(r=>({...r,[e]:ii(n,r[e])}))}}function Ig(e){return e instanceof Function}function CX(e){return Array.isArray(e)&&e.every(t=>typeof t=="number")}function _X(e,t){const n=[],r=a=>{a.forEach(o=>{n.push(o);const i=t(o);i!=null&&i.length&&r(i)})};return r(e),n}function $e(e,t,n){let r=[],a;return o=>{let i;n.key&&n.debug&&(i=Date.now());const s=e(o);if(!(s.length!==r.length||s.some((u,d)=>r[d]!==u)))return a;r=s;let c;if(n.key&&n.debug&&(c=Date.now()),a=t(...s),n==null||n.onChange==null||n.onChange(a),n.key&&n.debug&&n!=null&&n.debug()){const u=Math.round((Date.now()-i)*100)/100,d=Math.round((Date.now()-c)*100)/100,g=d/16,m=(b,y)=>{for(b=String(b);b.length{var a;return(a=e==null?void 0:e.debugAll)!=null?a:e[t]},key:!1,onChange:r}}function AX(e,t,n,r){var a,o;const s={...e._getDefaultColumnDef(),...t},l=s.accessorKey;let c=(a=(o=s.id)!=null?o:l?l.replace(".","_"):void 0)!=null?a:typeof s.header=="string"?s.header:void 0,u;if(s.accessorFn?u=s.accessorFn:l&&(l.includes(".")?u=g=>{let m=g;for(const y of l.split(".")){var b;m=(b=m)==null?void 0:b[y]}return m}:u=g=>g[s.accessorKey]),!c)throw new Error;let d={id:`${String(c)}`,accessorFn:u,parent:r,depth:n,columnDef:s,columns:[],getFlatColumns:$e(()=>[!0],()=>{var g;return[d,...(g=d.columns)==null?void 0:g.flatMap(m=>m.getFlatColumns())]},Fe(e.options,"debugColumns")),getLeafColumns:$e(()=>[e._getOrderColumnsFn()],g=>{var m;if((m=d.columns)!=null&&m.length){let b=d.columns.flatMap(y=>y.getLeafColumns());return g(b)}return[d]},Fe(e.options,"debugColumns"))};for(const g of e._features)g.createColumn==null||g.createColumn(d,e);return d}const In="debugHeaders";function g2(e,t,n){var r;let o={id:(r=n.id)!=null?r:t.id,column:t,index:n.index,isPlaceholder:!!n.isPlaceholder,placeholderId:n.placeholderId,depth:n.depth,subHeaders:[],colSpan:0,rowSpan:0,headerGroup:null,getLeafHeaders:()=>{const i=[],s=l=>{l.subHeaders&&l.subHeaders.length&&l.subHeaders.map(s),i.push(l)};return s(o),i},getContext:()=>({table:e,header:o,column:t})};return e._features.forEach(i=>{i.createHeader==null||i.createHeader(o,e)}),o}const TX={createTable:e=>{e.getHeaderGroups=$e(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.left,e.getState().columnPinning.right],(t,n,r,a)=>{var o,i;const s=(o=r==null?void 0:r.map(d=>n.find(g=>g.id===d)).filter(Boolean))!=null?o:[],l=(i=a==null?void 0:a.map(d=>n.find(g=>g.id===d)).filter(Boolean))!=null?i:[],c=n.filter(d=>!(r!=null&&r.includes(d.id))&&!(a!=null&&a.includes(d.id)));return Xf(t,[...s,...c,...l],e)},Fe(e.options,In)),e.getCenterHeaderGroups=$e(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.left,e.getState().columnPinning.right],(t,n,r,a)=>(n=n.filter(o=>!(r!=null&&r.includes(o.id))&&!(a!=null&&a.includes(o.id))),Xf(t,n,e,"center")),Fe(e.options,In)),e.getLeftHeaderGroups=$e(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.left],(t,n,r)=>{var a;const o=(a=r==null?void 0:r.map(i=>n.find(s=>s.id===i)).filter(Boolean))!=null?a:[];return Xf(t,o,e,"left")},Fe(e.options,In)),e.getRightHeaderGroups=$e(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.right],(t,n,r)=>{var a;const o=(a=r==null?void 0:r.map(i=>n.find(s=>s.id===i)).filter(Boolean))!=null?a:[];return Xf(t,o,e,"right")},Fe(e.options,In)),e.getFooterGroups=$e(()=>[e.getHeaderGroups()],t=>[...t].reverse(),Fe(e.options,In)),e.getLeftFooterGroups=$e(()=>[e.getLeftHeaderGroups()],t=>[...t].reverse(),Fe(e.options,In)),e.getCenterFooterGroups=$e(()=>[e.getCenterHeaderGroups()],t=>[...t].reverse(),Fe(e.options,In)),e.getRightFooterGroups=$e(()=>[e.getRightHeaderGroups()],t=>[...t].reverse(),Fe(e.options,In)),e.getFlatHeaders=$e(()=>[e.getHeaderGroups()],t=>t.map(n=>n.headers).flat(),Fe(e.options,In)),e.getLeftFlatHeaders=$e(()=>[e.getLeftHeaderGroups()],t=>t.map(n=>n.headers).flat(),Fe(e.options,In)),e.getCenterFlatHeaders=$e(()=>[e.getCenterHeaderGroups()],t=>t.map(n=>n.headers).flat(),Fe(e.options,In)),e.getRightFlatHeaders=$e(()=>[e.getRightHeaderGroups()],t=>t.map(n=>n.headers).flat(),Fe(e.options,In)),e.getCenterLeafHeaders=$e(()=>[e.getCenterFlatHeaders()],t=>t.filter(n=>{var r;return!((r=n.subHeaders)!=null&&r.length)}),Fe(e.options,In)),e.getLeftLeafHeaders=$e(()=>[e.getLeftFlatHeaders()],t=>t.filter(n=>{var r;return!((r=n.subHeaders)!=null&&r.length)}),Fe(e.options,In)),e.getRightLeafHeaders=$e(()=>[e.getRightFlatHeaders()],t=>t.filter(n=>{var r;return!((r=n.subHeaders)!=null&&r.length)}),Fe(e.options,In)),e.getLeafHeaders=$e(()=>[e.getLeftHeaderGroups(),e.getCenterHeaderGroups(),e.getRightHeaderGroups()],(t,n,r)=>{var a,o,i,s,l,c;return[...(a=(o=t[0])==null?void 0:o.headers)!=null?a:[],...(i=(s=n[0])==null?void 0:s.headers)!=null?i:[],...(l=(c=r[0])==null?void 0:c.headers)!=null?l:[]].map(u=>u.getLeafHeaders()).flat()},Fe(e.options,In))}};function Xf(e,t,n,r){var a,o;let i=0;const s=function(g,m){m===void 0&&(m=1),i=Math.max(i,m),g.filter(b=>b.getIsVisible()).forEach(b=>{var y;(y=b.columns)!=null&&y.length&&s(b.columns,m+1)},0)};s(e);let l=[];const c=(g,m)=>{const b={depth:m,id:[r,`${m}`].filter(Boolean).join("_"),headers:[]},y=[];g.forEach(w=>{const v=[...y].reverse()[0],h=w.column.depth===b.depth;let S,E=!1;if(h&&w.column.parent?S=w.column.parent:(S=w.column,E=!0),v&&(v==null?void 0:v.column)===S)v.subHeaders.push(w);else{const k=g2(n,S,{id:[r,m,S.id,w==null?void 0:w.id].filter(Boolean).join("_"),isPlaceholder:E,placeholderId:E?`${y.filter(x=>x.column===S).length}`:void 0,depth:m,index:y.length});k.subHeaders.push(w),y.push(k)}b.headers.push(w),w.headerGroup=b}),l.push(b),m>0&&c(y,m-1)},u=t.map((g,m)=>g2(n,g,{depth:i,index:m}));c(u,i-1),l.reverse();const d=g=>g.filter(b=>b.column.getIsVisible()).map(b=>{let y=0,w=0,v=[0];b.subHeaders&&b.subHeaders.length?(v=[],d(b.subHeaders).forEach(S=>{let{colSpan:E,rowSpan:k}=S;y+=E,v.push(k)})):y=1;const h=Math.min(...v);return w=w+h,b.colSpan=y,b.rowSpan=w,{colSpan:y,rowSpan:w}});return d((a=(o=l[0])==null?void 0:o.headers)!=null?a:[]),l}const Qf={size:150,minSize:20,maxSize:Number.MAX_SAFE_INTEGER},Ib=()=>({startOffset:null,startSize:null,deltaOffset:null,deltaPercentage:null,isResizingColumn:!1,columnSizingStart:[]}),RX={getDefaultColumnDef:()=>Qf,getInitialState:e=>({columnSizing:{},columnSizingInfo:Ib(),...e}),getDefaultOptions:e=>({columnResizeMode:"onEnd",columnResizeDirection:"ltr",onColumnSizingChange:Tr("columnSizing",e),onColumnSizingInfoChange:Tr("columnSizingInfo",e)}),createColumn:(e,t)=>{e.getSize=()=>{var n,r,a;const o=t.getState().columnSizing[e.id];return Math.min(Math.max((n=e.columnDef.minSize)!=null?n:Qf.minSize,(r=o??e.columnDef.size)!=null?r:Qf.size),(a=e.columnDef.maxSize)!=null?a:Qf.maxSize)},e.getStart=$e(n=>[n,Hu(t,n),t.getState().columnSizing],(n,r)=>r.slice(0,e.getIndex(n)).reduce((a,o)=>a+o.getSize(),0),Fe(t.options,"debugColumns")),e.getAfter=$e(n=>[n,Hu(t,n),t.getState().columnSizing],(n,r)=>r.slice(e.getIndex(n)+1).reduce((a,o)=>a+o.getSize(),0),Fe(t.options,"debugColumns")),e.resetSize=()=>{t.setColumnSizing(n=>{let{[e.id]:r,...a}=n;return a})},e.getCanResize=()=>{var n,r;return((n=e.columnDef.enableResizing)!=null?n:!0)&&((r=t.options.enableColumnResizing)!=null?r:!0)},e.getIsResizing=()=>t.getState().columnSizingInfo.isResizingColumn===e.id},createHeader:(e,t)=>{e.getSize=()=>{let n=0;const r=a=>{if(a.subHeaders.length)a.subHeaders.forEach(r);else{var o;n+=(o=a.column.getSize())!=null?o:0}};return r(e),n},e.getStart=()=>{if(e.index>0){const n=e.headerGroup.headers[e.index-1];return n.getStart()+n.getSize()}return 0},e.getResizeHandler=n=>{const r=t.getColumn(e.column.id),a=r==null?void 0:r.getCanResize();return o=>{if(!r||!a||(o.persist==null||o.persist(),Ob(o)&&o.touches&&o.touches.length>1))return;const i=e.getSize(),s=e?e.getLeafHeaders().map(v=>[v.column.id,v.column.getSize()]):[[r.id,r.getSize()]],l=Ob(o)?Math.round(o.touches[0].clientX):o.clientX,c={},u=(v,h)=>{typeof h=="number"&&(t.setColumnSizingInfo(S=>{var E,k;const x=t.options.columnResizeDirection==="rtl"?-1:1,C=(h-((E=S==null?void 0:S.startOffset)!=null?E:0))*x,_=Math.max(C/((k=S==null?void 0:S.startSize)!=null?k:0),-.999999);return S.columnSizingStart.forEach(R=>{let[T,L]=R;c[T]=Math.round(Math.max(L+L*_,0)*100)/100}),{...S,deltaOffset:C,deltaPercentage:_}}),(t.options.columnResizeMode==="onChange"||v==="end")&&t.setColumnSizing(S=>({...S,...c})))},d=v=>u("move",v),g=v=>{u("end",v),t.setColumnSizingInfo(h=>({...h,isResizingColumn:!1,startOffset:null,startSize:null,deltaOffset:null,deltaPercentage:null,columnSizingStart:[]}))},m=n||typeof document<"u"?document:null,b={moveHandler:v=>d(v.clientX),upHandler:v=>{m==null||m.removeEventListener("mousemove",b.moveHandler),m==null||m.removeEventListener("mouseup",b.upHandler),g(v.clientX)}},y={moveHandler:v=>(v.cancelable&&(v.preventDefault(),v.stopPropagation()),d(v.touches[0].clientX),!1),upHandler:v=>{var h;m==null||m.removeEventListener("touchmove",y.moveHandler),m==null||m.removeEventListener("touchend",y.upHandler),v.cancelable&&(v.preventDefault(),v.stopPropagation()),g((h=v.touches[0])==null?void 0:h.clientX)}},w=NX()?{passive:!1}:!1;Ob(o)?(m==null||m.addEventListener("touchmove",y.moveHandler,w),m==null||m.addEventListener("touchend",y.upHandler,w)):(m==null||m.addEventListener("mousemove",b.moveHandler,w),m==null||m.addEventListener("mouseup",b.upHandler,w)),t.setColumnSizingInfo(v=>({...v,startOffset:l,startSize:i,deltaOffset:0,deltaPercentage:0,columnSizingStart:s,isResizingColumn:r.id}))}}},createTable:e=>{e.setColumnSizing=t=>e.options.onColumnSizingChange==null?void 0:e.options.onColumnSizingChange(t),e.setColumnSizingInfo=t=>e.options.onColumnSizingInfoChange==null?void 0:e.options.onColumnSizingInfoChange(t),e.resetColumnSizing=t=>{var n;e.setColumnSizing(t?{}:(n=e.initialState.columnSizing)!=null?n:{})},e.resetHeaderSizeInfo=t=>{var n;e.setColumnSizingInfo(t?Ib():(n=e.initialState.columnSizingInfo)!=null?n:Ib())},e.getTotalSize=()=>{var t,n;return(t=(n=e.getHeaderGroups()[0])==null?void 0:n.headers.reduce((r,a)=>r+a.getSize(),0))!=null?t:0},e.getLeftTotalSize=()=>{var t,n;return(t=(n=e.getLeftHeaderGroups()[0])==null?void 0:n.headers.reduce((r,a)=>r+a.getSize(),0))!=null?t:0},e.getCenterTotalSize=()=>{var t,n;return(t=(n=e.getCenterHeaderGroups()[0])==null?void 0:n.headers.reduce((r,a)=>r+a.getSize(),0))!=null?t:0},e.getRightTotalSize=()=>{var t,n;return(t=(n=e.getRightHeaderGroups()[0])==null?void 0:n.headers.reduce((r,a)=>r+a.getSize(),0))!=null?t:0}}};let Jf=null;function NX(){if(typeof Jf=="boolean")return Jf;let e=!1;try{const t={get passive(){return e=!0,!1}},n=()=>{};window.addEventListener("test",n,t),window.removeEventListener("test",n)}catch{e=!1}return Jf=e,Jf}function Ob(e){return e.type==="touchstart"}const IX={getInitialState:e=>({expanded:{},...e}),getDefaultOptions:e=>({onExpandedChange:Tr("expanded",e),paginateExpandedRows:!0}),createTable:e=>{let t=!1,n=!1;e._autoResetExpanded=()=>{var r,a;if(!t){e._queue(()=>{t=!0});return}if((r=(a=e.options.autoResetAll)!=null?a:e.options.autoResetExpanded)!=null?r:!e.options.manualExpanding){if(n)return;n=!0,e._queue(()=>{e.resetExpanded(),n=!1})}},e.setExpanded=r=>e.options.onExpandedChange==null?void 0:e.options.onExpandedChange(r),e.toggleAllRowsExpanded=r=>{r??!e.getIsAllRowsExpanded()?e.setExpanded(!0):e.setExpanded({})},e.resetExpanded=r=>{var a,o;e.setExpanded(r?{}:(a=(o=e.initialState)==null?void 0:o.expanded)!=null?a:{})},e.getCanSomeRowsExpand=()=>e.getPrePaginationRowModel().flatRows.some(r=>r.getCanExpand()),e.getToggleAllRowsExpandedHandler=()=>r=>{r.persist==null||r.persist(),e.toggleAllRowsExpanded()},e.getIsSomeRowsExpanded=()=>{const r=e.getState().expanded;return r===!0||Object.values(r).some(Boolean)},e.getIsAllRowsExpanded=()=>{const r=e.getState().expanded;return typeof r=="boolean"?r===!0:!(!Object.keys(r).length||e.getRowModel().flatRows.some(a=>!a.getIsExpanded()))},e.getExpandedDepth=()=>{let r=0;return(e.getState().expanded===!0?Object.keys(e.getRowModel().rowsById):Object.keys(e.getState().expanded)).forEach(o=>{const i=o.split(".");r=Math.max(r,i.length)}),r},e.getPreExpandedRowModel=()=>e.getSortedRowModel(),e.getExpandedRowModel=()=>(!e._getExpandedRowModel&&e.options.getExpandedRowModel&&(e._getExpandedRowModel=e.options.getExpandedRowModel(e)),e.options.manualExpanding||!e._getExpandedRowModel?e.getPreExpandedRowModel():e._getExpandedRowModel())},createRow:(e,t)=>{e.toggleExpanded=n=>{t.setExpanded(r=>{var a;const o=r===!0?!0:!!(r!=null&&r[e.id]);let i={};if(r===!0?Object.keys(t.getRowModel().rowsById).forEach(s=>{i[s]=!0}):i=r,n=(a=n)!=null?a:!o,!o&&n)return{...i,[e.id]:!0};if(o&&!n){const{[e.id]:s,...l}=i;return l}return r})},e.getIsExpanded=()=>{var n;const r=t.getState().expanded;return!!((n=t.options.getIsRowExpanded==null?void 0:t.options.getIsRowExpanded(e))!=null?n:r===!0||r!=null&&r[e.id])},e.getCanExpand=()=>{var n,r,a;return(n=t.options.getRowCanExpand==null?void 0:t.options.getRowCanExpand(e))!=null?n:((r=t.options.enableExpanding)!=null?r:!0)&&!!((a=e.subRows)!=null&&a.length)},e.getIsAllParentsExpanded=()=>{let n=!0,r=e;for(;n&&r.parentId;)r=t.getRow(r.parentId,!0),n=r.getIsExpanded();return n},e.getToggleExpandedHandler=()=>{const n=e.getCanExpand();return()=>{n&&e.toggleExpanded()}}}},A6=(e,t,n)=>{var r;const a=n.toLowerCase();return!!(!((r=e.getValue(t))==null||(r=r.toString())==null||(r=r.toLowerCase())==null)&&r.includes(a))};A6.autoRemove=e=>pa(e);const T6=(e,t,n)=>{var r;return!!(!((r=e.getValue(t))==null||(r=r.toString())==null)&&r.includes(n))};T6.autoRemove=e=>pa(e);const R6=(e,t,n)=>{var r;return((r=e.getValue(t))==null||(r=r.toString())==null?void 0:r.toLowerCase())===(n==null?void 0:n.toLowerCase())};R6.autoRemove=e=>pa(e);const N6=(e,t,n)=>{var r;return(r=e.getValue(t))==null?void 0:r.includes(n)};N6.autoRemove=e=>pa(e)||!(e!=null&&e.length);const I6=(e,t,n)=>!n.some(r=>{var a;return!((a=e.getValue(t))!=null&&a.includes(r))});I6.autoRemove=e=>pa(e)||!(e!=null&&e.length);const O6=(e,t,n)=>n.some(r=>{var a;return(a=e.getValue(t))==null?void 0:a.includes(r)});O6.autoRemove=e=>pa(e)||!(e!=null&&e.length);const D6=(e,t,n)=>e.getValue(t)===n;D6.autoRemove=e=>pa(e);const L6=(e,t,n)=>e.getValue(t)==n;L6.autoRemove=e=>pa(e);const S_=(e,t,n)=>{let[r,a]=n;const o=e.getValue(t);return o>=r&&o<=a};S_.resolveFilterValue=e=>{let[t,n]=e,r=typeof t!="number"?parseFloat(t):t,a=typeof n!="number"?parseFloat(n):n,o=t===null||Number.isNaN(r)?-1/0:r,i=n===null||Number.isNaN(a)?1/0:a;if(o>i){const s=o;o=i,i=s}return[o,i]};S_.autoRemove=e=>pa(e)||pa(e[0])&&pa(e[1]);const Qa={includesString:A6,includesStringSensitive:T6,equalsString:R6,arrIncludes:N6,arrIncludesAll:I6,arrIncludesSome:O6,equals:D6,weakEquals:L6,inNumberRange:S_};function pa(e){return e==null||e===""}const OX={getDefaultColumnDef:()=>({filterFn:"auto"}),getInitialState:e=>({columnFilters:[],globalFilter:void 0,...e}),getDefaultOptions:e=>({onColumnFiltersChange:Tr("columnFilters",e),onGlobalFilterChange:Tr("globalFilter",e),filterFromLeafRows:!1,maxLeafRowFilterDepth:100,globalFilterFn:"auto",getColumnCanGlobalFilter:t=>{var n;const r=(n=e.getCoreRowModel().flatRows[0])==null||(n=n._getAllCellsByColumnId()[t.id])==null?void 0:n.getValue();return typeof r=="string"||typeof r=="number"}}),createColumn:(e,t)=>{e.getAutoFilterFn=()=>{const n=t.getCoreRowModel().flatRows[0],r=n==null?void 0:n.getValue(e.id);return typeof r=="string"?Qa.includesString:typeof r=="number"?Qa.inNumberRange:typeof r=="boolean"||r!==null&&typeof r=="object"?Qa.equals:Array.isArray(r)?Qa.arrIncludes:Qa.weakEquals},e.getFilterFn=()=>{var n,r;return Ig(e.columnDef.filterFn)?e.columnDef.filterFn:e.columnDef.filterFn==="auto"?e.getAutoFilterFn():(n=(r=t.options.filterFns)==null?void 0:r[e.columnDef.filterFn])!=null?n:Qa[e.columnDef.filterFn]},e.getCanFilter=()=>{var n,r,a;return((n=e.columnDef.enableColumnFilter)!=null?n:!0)&&((r=t.options.enableColumnFilters)!=null?r:!0)&&((a=t.options.enableFilters)!=null?a:!0)&&!!e.accessorFn},e.getCanGlobalFilter=()=>{var n,r,a,o;return((n=e.columnDef.enableGlobalFilter)!=null?n:!0)&&((r=t.options.enableGlobalFilter)!=null?r:!0)&&((a=t.options.enableFilters)!=null?a:!0)&&((o=t.options.getColumnCanGlobalFilter==null?void 0:t.options.getColumnCanGlobalFilter(e))!=null?o:!0)&&!!e.accessorFn},e.getIsFiltered=()=>e.getFilterIndex()>-1,e.getFilterValue=()=>{var n;return(n=t.getState().columnFilters)==null||(n=n.find(r=>r.id===e.id))==null?void 0:n.value},e.getFilterIndex=()=>{var n,r;return(n=(r=t.getState().columnFilters)==null?void 0:r.findIndex(a=>a.id===e.id))!=null?n:-1},e.setFilterValue=n=>{t.setColumnFilters(r=>{const a=e.getFilterFn(),o=r==null?void 0:r.find(u=>u.id===e.id),i=ii(n,o?o.value:void 0);if(m2(a,i,e)){var s;return(s=r==null?void 0:r.filter(u=>u.id!==e.id))!=null?s:[]}const l={id:e.id,value:i};if(o){var c;return(c=r==null?void 0:r.map(u=>u.id===e.id?l:u))!=null?c:[]}return r!=null&&r.length?[...r,l]:[l]})},e._getFacetedRowModel=t.options.getFacetedRowModel&&t.options.getFacetedRowModel(t,e.id),e.getFacetedRowModel=()=>e._getFacetedRowModel?e._getFacetedRowModel():t.getPreFilteredRowModel(),e._getFacetedUniqueValues=t.options.getFacetedUniqueValues&&t.options.getFacetedUniqueValues(t,e.id),e.getFacetedUniqueValues=()=>e._getFacetedUniqueValues?e._getFacetedUniqueValues():new Map,e._getFacetedMinMaxValues=t.options.getFacetedMinMaxValues&&t.options.getFacetedMinMaxValues(t,e.id),e.getFacetedMinMaxValues=()=>{if(e._getFacetedMinMaxValues)return e._getFacetedMinMaxValues()}},createRow:(e,t)=>{e.columnFilters={},e.columnFiltersMeta={}},createTable:e=>{e.getGlobalAutoFilterFn=()=>Qa.includesString,e.getGlobalFilterFn=()=>{var t,n;const{globalFilterFn:r}=e.options;return Ig(r)?r:r==="auto"?e.getGlobalAutoFilterFn():(t=(n=e.options.filterFns)==null?void 0:n[r])!=null?t:Qa[r]},e.setColumnFilters=t=>{const n=e.getAllLeafColumns(),r=a=>{var o;return(o=ii(t,a))==null?void 0:o.filter(i=>{const s=n.find(l=>l.id===i.id);if(s){const l=s.getFilterFn();if(m2(l,i.value,s))return!1}return!0})};e.options.onColumnFiltersChange==null||e.options.onColumnFiltersChange(r)},e.setGlobalFilter=t=>{e.options.onGlobalFilterChange==null||e.options.onGlobalFilterChange(t)},e.resetGlobalFilter=t=>{e.setGlobalFilter(t?void 0:e.initialState.globalFilter)},e.resetColumnFilters=t=>{var n,r;e.setColumnFilters(t?[]:(n=(r=e.initialState)==null?void 0:r.columnFilters)!=null?n:[])},e.getPreFilteredRowModel=()=>e.getCoreRowModel(),e.getFilteredRowModel=()=>(!e._getFilteredRowModel&&e.options.getFilteredRowModel&&(e._getFilteredRowModel=e.options.getFilteredRowModel(e)),e.options.manualFiltering||!e._getFilteredRowModel?e.getPreFilteredRowModel():e._getFilteredRowModel()),e._getGlobalFacetedRowModel=e.options.getFacetedRowModel&&e.options.getFacetedRowModel(e,"__global__"),e.getGlobalFacetedRowModel=()=>e.options.manualFiltering||!e._getGlobalFacetedRowModel?e.getPreFilteredRowModel():e._getGlobalFacetedRowModel(),e._getGlobalFacetedUniqueValues=e.options.getFacetedUniqueValues&&e.options.getFacetedUniqueValues(e,"__global__"),e.getGlobalFacetedUniqueValues=()=>e._getGlobalFacetedUniqueValues?e._getGlobalFacetedUniqueValues():new Map,e._getGlobalFacetedMinMaxValues=e.options.getFacetedMinMaxValues&&e.options.getFacetedMinMaxValues(e,"__global__"),e.getGlobalFacetedMinMaxValues=()=>{if(e._getGlobalFacetedMinMaxValues)return e._getGlobalFacetedMinMaxValues()}}};function m2(e,t,n){return(e&&e.autoRemove?e.autoRemove(t,n):!1)||typeof t>"u"||typeof t=="string"&&!t}const DX=(e,t,n)=>n.reduce((r,a)=>{const o=a.getValue(e);return r+(typeof o=="number"?o:0)},0),LX=(e,t,n)=>{let r;return n.forEach(a=>{const o=a.getValue(e);o!=null&&(r>o||r===void 0&&o>=o)&&(r=o)}),r},MX=(e,t,n)=>{let r;return n.forEach(a=>{const o=a.getValue(e);o!=null&&(r=o)&&(r=o)}),r},PX=(e,t,n)=>{let r,a;return n.forEach(o=>{const i=o.getValue(e);i!=null&&(r===void 0?i>=i&&(r=a=i):(r>i&&(r=i),a{let n=0,r=0;if(t.forEach(a=>{let o=a.getValue(e);o!=null&&(o=+o)>=o&&(++n,r+=o)}),n)return r/n},FX=(e,t)=>{if(!t.length)return;const n=t.map(o=>o.getValue(e));if(!CX(n))return;if(n.length===1)return n[0];const r=Math.floor(n.length/2),a=n.sort((o,i)=>o-i);return n.length%2!==0?a[r]:(a[r-1]+a[r])/2},jX=(e,t)=>Array.from(new Set(t.map(n=>n.getValue(e))).values()),zX=(e,t)=>new Set(t.map(n=>n.getValue(e))).size,UX=(e,t)=>t.length,Db={sum:DX,min:LX,max:MX,extent:PX,mean:$X,median:FX,unique:jX,uniqueCount:zX,count:UX},BX={getDefaultColumnDef:()=>({aggregatedCell:e=>{var t,n;return(t=(n=e.getValue())==null||n.toString==null?void 0:n.toString())!=null?t:null},aggregationFn:"auto"}),getInitialState:e=>({grouping:[],...e}),getDefaultOptions:e=>({onGroupingChange:Tr("grouping",e),groupedColumnMode:"reorder"}),createColumn:(e,t)=>{e.toggleGrouping=()=>{t.setGrouping(n=>n!=null&&n.includes(e.id)?n.filter(r=>r!==e.id):[...n??[],e.id])},e.getCanGroup=()=>{var n,r,a,o;return(n=(r=(a=(o=e.columnDef.enableGrouping)!=null?o:!0)!=null?a:t.options.enableGrouping)!=null?r:!0)!=null?n:!!e.accessorFn},e.getIsGrouped=()=>{var n;return(n=t.getState().grouping)==null?void 0:n.includes(e.id)},e.getGroupedIndex=()=>{var n;return(n=t.getState().grouping)==null?void 0:n.indexOf(e.id)},e.getToggleGroupingHandler=()=>{const n=e.getCanGroup();return()=>{n&&e.toggleGrouping()}},e.getAutoAggregationFn=()=>{const n=t.getCoreRowModel().flatRows[0],r=n==null?void 0:n.getValue(e.id);if(typeof r=="number")return Db.sum;if(Object.prototype.toString.call(r)==="[object Date]")return Db.extent},e.getAggregationFn=()=>{var n,r;if(!e)throw new Error;return Ig(e.columnDef.aggregationFn)?e.columnDef.aggregationFn:e.columnDef.aggregationFn==="auto"?e.getAutoAggregationFn():(n=(r=t.options.aggregationFns)==null?void 0:r[e.columnDef.aggregationFn])!=null?n:Db[e.columnDef.aggregationFn]}},createTable:e=>{e.setGrouping=t=>e.options.onGroupingChange==null?void 0:e.options.onGroupingChange(t),e.resetGrouping=t=>{var n,r;e.setGrouping(t?[]:(n=(r=e.initialState)==null?void 0:r.grouping)!=null?n:[])},e.getPreGroupedRowModel=()=>e.getFilteredRowModel(),e.getGroupedRowModel=()=>(!e._getGroupedRowModel&&e.options.getGroupedRowModel&&(e._getGroupedRowModel=e.options.getGroupedRowModel(e)),e.options.manualGrouping||!e._getGroupedRowModel?e.getPreGroupedRowModel():e._getGroupedRowModel())},createRow:(e,t)=>{e.getIsGrouped=()=>!!e.groupingColumnId,e.getGroupingValue=n=>{if(e._groupingValuesCache.hasOwnProperty(n))return e._groupingValuesCache[n];const r=t.getColumn(n);return r!=null&&r.columnDef.getGroupingValue?(e._groupingValuesCache[n]=r.columnDef.getGroupingValue(e.original),e._groupingValuesCache[n]):e.getValue(n)},e._groupingValuesCache={}},createCell:(e,t,n,r)=>{e.getIsGrouped=()=>t.getIsGrouped()&&t.id===n.groupingColumnId,e.getIsPlaceholder=()=>!e.getIsGrouped()&&t.getIsGrouped(),e.getIsAggregated=()=>{var a;return!e.getIsGrouped()&&!e.getIsPlaceholder()&&!!((a=n.subRows)!=null&&a.length)}}};function HX(e,t,n){if(!(t!=null&&t.length)||!n)return e;const r=e.filter(o=>!t.includes(o.id));return n==="remove"?r:[...t.map(o=>e.find(i=>i.id===o)).filter(Boolean),...r]}const VX={getInitialState:e=>({columnOrder:[],...e}),getDefaultOptions:e=>({onColumnOrderChange:Tr("columnOrder",e)}),createColumn:(e,t)=>{e.getIndex=$e(n=>[Hu(t,n)],n=>n.findIndex(r=>r.id===e.id),Fe(t.options,"debugColumns")),e.getIsFirstColumn=n=>{var r;return((r=Hu(t,n)[0])==null?void 0:r.id)===e.id},e.getIsLastColumn=n=>{var r;const a=Hu(t,n);return((r=a[a.length-1])==null?void 0:r.id)===e.id}},createTable:e=>{e.setColumnOrder=t=>e.options.onColumnOrderChange==null?void 0:e.options.onColumnOrderChange(t),e.resetColumnOrder=t=>{var n;e.setColumnOrder(t?[]:(n=e.initialState.columnOrder)!=null?n:[])},e._getOrderColumnsFn=$e(()=>[e.getState().columnOrder,e.getState().grouping,e.options.groupedColumnMode],(t,n,r)=>a=>{let o=[];if(!(t!=null&&t.length))o=a;else{const i=[...t],s=[...a];for(;s.length&&i.length;){const l=i.shift(),c=s.findIndex(u=>u.id===l);c>-1&&o.push(s.splice(c,1)[0])}o=[...o,...s]}return HX(o,n,r)},Fe(e.options,"debugTable"))}},Y1=0,Z1=10,Lb=()=>({pageIndex:Y1,pageSize:Z1}),qX={getInitialState:e=>({...e,pagination:{...Lb(),...e==null?void 0:e.pagination}}),getDefaultOptions:e=>({onPaginationChange:Tr("pagination",e)}),createTable:e=>{let t=!1,n=!1;e._autoResetPageIndex=()=>{var r,a;if(!t){e._queue(()=>{t=!0});return}if((r=(a=e.options.autoResetAll)!=null?a:e.options.autoResetPageIndex)!=null?r:!e.options.manualPagination){if(n)return;n=!0,e._queue(()=>{e.resetPageIndex(),n=!1})}},e.setPagination=r=>{const a=o=>ii(r,o);return e.options.onPaginationChange==null?void 0:e.options.onPaginationChange(a)},e.resetPagination=r=>{var a;e.setPagination(r?Lb():(a=e.initialState.pagination)!=null?a:Lb())},e.setPageIndex=r=>{e.setPagination(a=>{let o=ii(r,a.pageIndex);const i=typeof e.options.pageCount>"u"||e.options.pageCount===-1?Number.MAX_SAFE_INTEGER:e.options.pageCount-1;return o=Math.max(0,Math.min(o,i)),{...a,pageIndex:o}})},e.resetPageIndex=r=>{var a,o;e.setPageIndex(r?Y1:(a=(o=e.initialState)==null||(o=o.pagination)==null?void 0:o.pageIndex)!=null?a:Y1)},e.resetPageSize=r=>{var a,o;e.setPageSize(r?Z1:(a=(o=e.initialState)==null||(o=o.pagination)==null?void 0:o.pageSize)!=null?a:Z1)},e.setPageSize=r=>{e.setPagination(a=>{const o=Math.max(1,ii(r,a.pageSize)),i=a.pageSize*a.pageIndex,s=Math.floor(i/o);return{...a,pageIndex:s,pageSize:o}})},e.setPageCount=r=>e.setPagination(a=>{var o;let i=ii(r,(o=e.options.pageCount)!=null?o:-1);return typeof i=="number"&&(i=Math.max(-1,i)),{...a,pageCount:i}}),e.getPageOptions=$e(()=>[e.getPageCount()],r=>{let a=[];return r&&r>0&&(a=[...new Array(r)].fill(null).map((o,i)=>i)),a},Fe(e.options,"debugTable")),e.getCanPreviousPage=()=>e.getState().pagination.pageIndex>0,e.getCanNextPage=()=>{const{pageIndex:r}=e.getState().pagination,a=e.getPageCount();return a===-1?!0:a===0?!1:re.setPageIndex(r=>r-1),e.nextPage=()=>e.setPageIndex(r=>r+1),e.getPrePaginationRowModel=()=>e.getExpandedRowModel(),e.getPaginationRowModel=()=>(!e._getPaginationRowModel&&e.options.getPaginationRowModel&&(e._getPaginationRowModel=e.options.getPaginationRowModel(e)),e.options.manualPagination||!e._getPaginationRowModel?e.getPrePaginationRowModel():e._getPaginationRowModel()),e.getPageCount=()=>{var r;return(r=e.options.pageCount)!=null?r:Math.ceil(e.getPrePaginationRowModel().rows.length/e.getState().pagination.pageSize)}}},Mb=()=>({left:[],right:[]}),Pb=()=>({top:[],bottom:[]}),GX={getInitialState:e=>({columnPinning:Mb(),rowPinning:Pb(),...e}),getDefaultOptions:e=>({onColumnPinningChange:Tr("columnPinning",e),onRowPinningChange:Tr("rowPinning",e)}),createColumn:(e,t)=>{e.pin=n=>{const r=e.getLeafColumns().map(a=>a.id).filter(Boolean);t.setColumnPinning(a=>{var o,i;if(n==="right"){var s,l;return{left:((s=a==null?void 0:a.left)!=null?s:[]).filter(d=>!(r!=null&&r.includes(d))),right:[...((l=a==null?void 0:a.right)!=null?l:[]).filter(d=>!(r!=null&&r.includes(d))),...r]}}if(n==="left"){var c,u;return{left:[...((c=a==null?void 0:a.left)!=null?c:[]).filter(d=>!(r!=null&&r.includes(d))),...r],right:((u=a==null?void 0:a.right)!=null?u:[]).filter(d=>!(r!=null&&r.includes(d)))}}return{left:((o=a==null?void 0:a.left)!=null?o:[]).filter(d=>!(r!=null&&r.includes(d))),right:((i=a==null?void 0:a.right)!=null?i:[]).filter(d=>!(r!=null&&r.includes(d)))}})},e.getCanPin=()=>e.getLeafColumns().some(r=>{var a,o,i;return((a=r.columnDef.enablePinning)!=null?a:!0)&&((o=(i=t.options.enableColumnPinning)!=null?i:t.options.enablePinning)!=null?o:!0)}),e.getIsPinned=()=>{const n=e.getLeafColumns().map(s=>s.id),{left:r,right:a}=t.getState().columnPinning,o=n.some(s=>r==null?void 0:r.includes(s)),i=n.some(s=>a==null?void 0:a.includes(s));return o?"left":i?"right":!1},e.getPinnedIndex=()=>{var n,r;const a=e.getIsPinned();return a?(n=(r=t.getState().columnPinning)==null||(r=r[a])==null?void 0:r.indexOf(e.id))!=null?n:-1:0}},createRow:(e,t)=>{e.pin=(n,r,a)=>{const o=r?e.getLeafRows().map(l=>{let{id:c}=l;return c}):[],i=a?e.getParentRows().map(l=>{let{id:c}=l;return c}):[],s=new Set([...i,e.id,...o]);t.setRowPinning(l=>{var c,u;if(n==="bottom"){var d,g;return{top:((d=l==null?void 0:l.top)!=null?d:[]).filter(y=>!(s!=null&&s.has(y))),bottom:[...((g=l==null?void 0:l.bottom)!=null?g:[]).filter(y=>!(s!=null&&s.has(y))),...Array.from(s)]}}if(n==="top"){var m,b;return{top:[...((m=l==null?void 0:l.top)!=null?m:[]).filter(y=>!(s!=null&&s.has(y))),...Array.from(s)],bottom:((b=l==null?void 0:l.bottom)!=null?b:[]).filter(y=>!(s!=null&&s.has(y)))}}return{top:((c=l==null?void 0:l.top)!=null?c:[]).filter(y=>!(s!=null&&s.has(y))),bottom:((u=l==null?void 0:l.bottom)!=null?u:[]).filter(y=>!(s!=null&&s.has(y)))}})},e.getCanPin=()=>{var n;const{enableRowPinning:r,enablePinning:a}=t.options;return typeof r=="function"?r(e):(n=r??a)!=null?n:!0},e.getIsPinned=()=>{const n=[e.id],{top:r,bottom:a}=t.getState().rowPinning,o=n.some(s=>r==null?void 0:r.includes(s)),i=n.some(s=>a==null?void 0:a.includes(s));return o?"top":i?"bottom":!1},e.getPinnedIndex=()=>{var n,r;const a=e.getIsPinned();if(!a)return-1;const o=(n=t._getPinnedRows(a))==null?void 0:n.map(i=>{let{id:s}=i;return s});return(r=o==null?void 0:o.indexOf(e.id))!=null?r:-1},e.getCenterVisibleCells=$e(()=>[e._getAllVisibleCells(),t.getState().columnPinning.left,t.getState().columnPinning.right],(n,r,a)=>{const o=[...r??[],...a??[]];return n.filter(i=>!o.includes(i.column.id))},Fe(t.options,"debugRows")),e.getLeftVisibleCells=$e(()=>[e._getAllVisibleCells(),t.getState().columnPinning.left,,],(n,r)=>(r??[]).map(o=>n.find(i=>i.column.id===o)).filter(Boolean).map(o=>({...o,position:"left"})),Fe(t.options,"debugRows")),e.getRightVisibleCells=$e(()=>[e._getAllVisibleCells(),t.getState().columnPinning.right],(n,r)=>(r??[]).map(o=>n.find(i=>i.column.id===o)).filter(Boolean).map(o=>({...o,position:"right"})),Fe(t.options,"debugRows"))},createTable:e=>{e.setColumnPinning=t=>e.options.onColumnPinningChange==null?void 0:e.options.onColumnPinningChange(t),e.resetColumnPinning=t=>{var n,r;return e.setColumnPinning(t?Mb():(n=(r=e.initialState)==null?void 0:r.columnPinning)!=null?n:Mb())},e.getIsSomeColumnsPinned=t=>{var n;const r=e.getState().columnPinning;if(!t){var a,o;return!!((a=r.left)!=null&&a.length||(o=r.right)!=null&&o.length)}return!!((n=r[t])!=null&&n.length)},e.getLeftLeafColumns=$e(()=>[e.getAllLeafColumns(),e.getState().columnPinning.left],(t,n)=>(n??[]).map(r=>t.find(a=>a.id===r)).filter(Boolean),Fe(e.options,"debugColumns")),e.getRightLeafColumns=$e(()=>[e.getAllLeafColumns(),e.getState().columnPinning.right],(t,n)=>(n??[]).map(r=>t.find(a=>a.id===r)).filter(Boolean),Fe(e.options,"debugColumns")),e.getCenterLeafColumns=$e(()=>[e.getAllLeafColumns(),e.getState().columnPinning.left,e.getState().columnPinning.right],(t,n,r)=>{const a=[...n??[],...r??[]];return t.filter(o=>!a.includes(o.id))},Fe(e.options,"debugColumns")),e.setRowPinning=t=>e.options.onRowPinningChange==null?void 0:e.options.onRowPinningChange(t),e.resetRowPinning=t=>{var n,r;return e.setRowPinning(t?Pb():(n=(r=e.initialState)==null?void 0:r.rowPinning)!=null?n:Pb())},e.getIsSomeRowsPinned=t=>{var n;const r=e.getState().rowPinning;if(!t){var a,o;return!!((a=r.top)!=null&&a.length||(o=r.bottom)!=null&&o.length)}return!!((n=r[t])!=null&&n.length)},e._getPinnedRows=$e(t=>[e.getRowModel().rows,e.getState().rowPinning[t],t],(t,n,r)=>{var a;return((a=e.options.keepPinnedRows)==null||a?(n??[]).map(i=>{const s=e.getRow(i,!0);return s.getIsAllParentsExpanded()?s:null}):(n??[]).map(i=>t.find(s=>s.id===i))).filter(Boolean).map(i=>({...i,position:r}))},Fe(e.options,"debugRows")),e.getTopRows=()=>e._getPinnedRows("top"),e.getBottomRows=()=>e._getPinnedRows("bottom"),e.getCenterRows=$e(()=>[e.getRowModel().rows,e.getState().rowPinning.top,e.getState().rowPinning.bottom],(t,n,r)=>{const a=new Set([...n??[],...r??[]]);return t.filter(o=>!a.has(o.id))},Fe(e.options,"debugRows"))}},WX={getInitialState:e=>({rowSelection:{},...e}),getDefaultOptions:e=>({onRowSelectionChange:Tr("rowSelection",e),enableRowSelection:!0,enableMultiRowSelection:!0,enableSubRowSelection:!0}),createTable:e=>{e.setRowSelection=t=>e.options.onRowSelectionChange==null?void 0:e.options.onRowSelectionChange(t),e.resetRowSelection=t=>{var n;return e.setRowSelection(t?{}:(n=e.initialState.rowSelection)!=null?n:{})},e.toggleAllRowsSelected=t=>{e.setRowSelection(n=>{t=typeof t<"u"?t:!e.getIsAllRowsSelected();const r={...n},a=e.getPreGroupedRowModel().flatRows;return t?a.forEach(o=>{o.getCanSelect()&&(r[o.id]=!0)}):a.forEach(o=>{delete r[o.id]}),r})},e.toggleAllPageRowsSelected=t=>e.setRowSelection(n=>{const r=typeof t<"u"?t:!e.getIsAllPageRowsSelected(),a={...n};return e.getRowModel().rows.forEach(o=>{X1(a,o.id,r,!0,e)}),a}),e.getPreSelectedRowModel=()=>e.getCoreRowModel(),e.getSelectedRowModel=$e(()=>[e.getState().rowSelection,e.getCoreRowModel()],(t,n)=>Object.keys(t).length?$b(e,n):{rows:[],flatRows:[],rowsById:{}},Fe(e.options,"debugTable")),e.getFilteredSelectedRowModel=$e(()=>[e.getState().rowSelection,e.getFilteredRowModel()],(t,n)=>Object.keys(t).length?$b(e,n):{rows:[],flatRows:[],rowsById:{}},Fe(e.options,"debugTable")),e.getGroupedSelectedRowModel=$e(()=>[e.getState().rowSelection,e.getSortedRowModel()],(t,n)=>Object.keys(t).length?$b(e,n):{rows:[],flatRows:[],rowsById:{}},Fe(e.options,"debugTable")),e.getIsAllRowsSelected=()=>{const t=e.getFilteredRowModel().flatRows,{rowSelection:n}=e.getState();let r=!!(t.length&&Object.keys(n).length);return r&&t.some(a=>a.getCanSelect()&&!n[a.id])&&(r=!1),r},e.getIsAllPageRowsSelected=()=>{const t=e.getPaginationRowModel().flatRows.filter(a=>a.getCanSelect()),{rowSelection:n}=e.getState();let r=!!t.length;return r&&t.some(a=>!n[a.id])&&(r=!1),r},e.getIsSomeRowsSelected=()=>{var t;const n=Object.keys((t=e.getState().rowSelection)!=null?t:{}).length;return n>0&&n{const t=e.getPaginationRowModel().flatRows;return e.getIsAllPageRowsSelected()?!1:t.filter(n=>n.getCanSelect()).some(n=>n.getIsSelected()||n.getIsSomeSelected())},e.getToggleAllRowsSelectedHandler=()=>t=>{e.toggleAllRowsSelected(t.target.checked)},e.getToggleAllPageRowsSelectedHandler=()=>t=>{e.toggleAllPageRowsSelected(t.target.checked)}},createRow:(e,t)=>{e.toggleSelected=(n,r)=>{const a=e.getIsSelected();t.setRowSelection(o=>{var i;if(n=typeof n<"u"?n:!a,e.getCanSelect()&&a===n)return o;const s={...o};return X1(s,e.id,n,(i=r==null?void 0:r.selectChildren)!=null?i:!0,t),s})},e.getIsSelected=()=>{const{rowSelection:n}=t.getState();return w_(e,n)},e.getIsSomeSelected=()=>{const{rowSelection:n}=t.getState();return Q1(e,n)==="some"},e.getIsAllSubRowsSelected=()=>{const{rowSelection:n}=t.getState();return Q1(e,n)==="all"},e.getCanSelect=()=>{var n;return typeof t.options.enableRowSelection=="function"?t.options.enableRowSelection(e):(n=t.options.enableRowSelection)!=null?n:!0},e.getCanSelectSubRows=()=>{var n;return typeof t.options.enableSubRowSelection=="function"?t.options.enableSubRowSelection(e):(n=t.options.enableSubRowSelection)!=null?n:!0},e.getCanMultiSelect=()=>{var n;return typeof t.options.enableMultiRowSelection=="function"?t.options.enableMultiRowSelection(e):(n=t.options.enableMultiRowSelection)!=null?n:!0},e.getToggleSelectedHandler=()=>{const n=e.getCanSelect();return r=>{var a;n&&e.toggleSelected((a=r.target)==null?void 0:a.checked)}}}},X1=(e,t,n,r,a)=>{var o;const i=a.getRow(t,!0);n?(i.getCanMultiSelect()||Object.keys(e).forEach(s=>delete e[s]),i.getCanSelect()&&(e[t]=!0)):delete e[t],r&&(o=i.subRows)!=null&&o.length&&i.getCanSelectSubRows()&&i.subRows.forEach(s=>X1(e,s.id,n,r,a))};function $b(e,t){const n=e.getState().rowSelection,r=[],a={},o=function(i,s){return i.map(l=>{var c;const u=w_(l,n);if(u&&(r.push(l),a[l.id]=l),(c=l.subRows)!=null&&c.length&&(l={...l,subRows:o(l.subRows)}),u)return l}).filter(Boolean)};return{rows:o(t.rows),flatRows:r,rowsById:a}}function w_(e,t){var n;return(n=t[e.id])!=null?n:!1}function Q1(e,t,n){var r;if(!((r=e.subRows)!=null&&r.length))return!1;let a=!0,o=!1;return e.subRows.forEach(i=>{if(!(o&&!a)&&(i.getCanSelect()&&(w_(i,t)?o=!0:a=!1),i.subRows&&i.subRows.length)){const s=Q1(i,t);s==="all"?o=!0:(s==="some"&&(o=!0),a=!1)}}),a?"all":o?"some":!1}const J1=/([0-9]+)/gm,KX=(e,t,n)=>M6(Ei(e.getValue(n)).toLowerCase(),Ei(t.getValue(n)).toLowerCase()),YX=(e,t,n)=>M6(Ei(e.getValue(n)),Ei(t.getValue(n))),ZX=(e,t,n)=>E_(Ei(e.getValue(n)).toLowerCase(),Ei(t.getValue(n)).toLowerCase()),XX=(e,t,n)=>E_(Ei(e.getValue(n)),Ei(t.getValue(n))),QX=(e,t,n)=>{const r=e.getValue(n),a=t.getValue(n);return r>a?1:rE_(e.getValue(n),t.getValue(n));function E_(e,t){return e===t?0:e>t?1:-1}function Ei(e){return typeof e=="number"?isNaN(e)||e===1/0||e===-1/0?"":String(e):typeof e=="string"?e:""}function M6(e,t){const n=e.split(J1).filter(Boolean),r=t.split(J1).filter(Boolean);for(;n.length&&r.length;){const a=n.shift(),o=r.shift(),i=parseInt(a,10),s=parseInt(o,10),l=[i,s].sort();if(isNaN(l[0])){if(a>o)return 1;if(o>a)return-1;continue}if(isNaN(l[1]))return isNaN(i)?-1:1;if(i>s)return 1;if(s>i)return-1}return n.length-r.length}const cu={alphanumeric:KX,alphanumericCaseSensitive:YX,text:ZX,textCaseSensitive:XX,datetime:QX,basic:JX},eQ={getInitialState:e=>({sorting:[],...e}),getDefaultColumnDef:()=>({sortingFn:"auto",sortUndefined:1}),getDefaultOptions:e=>({onSortingChange:Tr("sorting",e),isMultiSortEvent:t=>t.shiftKey}),createColumn:(e,t)=>{e.getAutoSortingFn=()=>{const n=t.getFilteredRowModel().flatRows.slice(10);let r=!1;for(const a of n){const o=a==null?void 0:a.getValue(e.id);if(Object.prototype.toString.call(o)==="[object Date]")return cu.datetime;if(typeof o=="string"&&(r=!0,o.split(J1).length>1))return cu.alphanumeric}return r?cu.text:cu.basic},e.getAutoSortDir=()=>{const n=t.getFilteredRowModel().flatRows[0];return typeof(n==null?void 0:n.getValue(e.id))=="string"?"asc":"desc"},e.getSortingFn=()=>{var n,r;if(!e)throw new Error;return Ig(e.columnDef.sortingFn)?e.columnDef.sortingFn:e.columnDef.sortingFn==="auto"?e.getAutoSortingFn():(n=(r=t.options.sortingFns)==null?void 0:r[e.columnDef.sortingFn])!=null?n:cu[e.columnDef.sortingFn]},e.toggleSorting=(n,r)=>{const a=e.getNextSortingOrder(),o=typeof n<"u"&&n!==null;t.setSorting(i=>{const s=i==null?void 0:i.find(m=>m.id===e.id),l=i==null?void 0:i.findIndex(m=>m.id===e.id);let c=[],u,d=o?n:a==="desc";if(i!=null&&i.length&&e.getCanMultiSort()&&r?s?u="toggle":u="add":i!=null&&i.length&&l!==i.length-1?u="replace":s?u="toggle":u="replace",u==="toggle"&&(o||a||(u="remove")),u==="add"){var g;c=[...i,{id:e.id,desc:d}],c.splice(0,c.length-((g=t.options.maxMultiSortColCount)!=null?g:Number.MAX_SAFE_INTEGER))}else u==="toggle"?c=i.map(m=>m.id===e.id?{...m,desc:d}:m):u==="remove"?c=i.filter(m=>m.id!==e.id):c=[{id:e.id,desc:d}];return c})},e.getFirstSortDir=()=>{var n,r;return((n=(r=e.columnDef.sortDescFirst)!=null?r:t.options.sortDescFirst)!=null?n:e.getAutoSortDir()==="desc")?"desc":"asc"},e.getNextSortingOrder=n=>{var r,a;const o=e.getFirstSortDir(),i=e.getIsSorted();return i?i!==o&&((r=t.options.enableSortingRemoval)==null||r)&&(!(n&&(a=t.options.enableMultiRemove)!=null)||a)?!1:i==="desc"?"asc":"desc":o},e.getCanSort=()=>{var n,r;return((n=e.columnDef.enableSorting)!=null?n:!0)&&((r=t.options.enableSorting)!=null?r:!0)&&!!e.accessorFn},e.getCanMultiSort=()=>{var n,r;return(n=(r=e.columnDef.enableMultiSort)!=null?r:t.options.enableMultiSort)!=null?n:!!e.accessorFn},e.getIsSorted=()=>{var n;const r=(n=t.getState().sorting)==null?void 0:n.find(a=>a.id===e.id);return r?r.desc?"desc":"asc":!1},e.getSortIndex=()=>{var n,r;return(n=(r=t.getState().sorting)==null?void 0:r.findIndex(a=>a.id===e.id))!=null?n:-1},e.clearSorting=()=>{t.setSorting(n=>n!=null&&n.length?n.filter(r=>r.id!==e.id):[])},e.getToggleSortingHandler=()=>{const n=e.getCanSort();return r=>{n&&(r.persist==null||r.persist(),e.toggleSorting==null||e.toggleSorting(void 0,e.getCanMultiSort()?t.options.isMultiSortEvent==null?void 0:t.options.isMultiSortEvent(r):!1))}}},createTable:e=>{e.setSorting=t=>e.options.onSortingChange==null?void 0:e.options.onSortingChange(t),e.resetSorting=t=>{var n,r;e.setSorting(t?[]:(n=(r=e.initialState)==null?void 0:r.sorting)!=null?n:[])},e.getPreSortedRowModel=()=>e.getGroupedRowModel(),e.getSortedRowModel=()=>(!e._getSortedRowModel&&e.options.getSortedRowModel&&(e._getSortedRowModel=e.options.getSortedRowModel(e)),e.options.manualSorting||!e._getSortedRowModel?e.getPreSortedRowModel():e._getSortedRowModel())}},tQ={getInitialState:e=>({columnVisibility:{},...e}),getDefaultOptions:e=>({onColumnVisibilityChange:Tr("columnVisibility",e)}),createColumn:(e,t)=>{e.toggleVisibility=n=>{e.getCanHide()&&t.setColumnVisibility(r=>({...r,[e.id]:n??!e.getIsVisible()}))},e.getIsVisible=()=>{var n,r;return(n=(r=t.getState().columnVisibility)==null?void 0:r[e.id])!=null?n:!0},e.getCanHide=()=>{var n,r;return((n=e.columnDef.enableHiding)!=null?n:!0)&&((r=t.options.enableHiding)!=null?r:!0)},e.getToggleVisibilityHandler=()=>n=>{e.toggleVisibility==null||e.toggleVisibility(n.target.checked)}},createRow:(e,t)=>{e._getAllVisibleCells=$e(()=>[e.getAllCells(),t.getState().columnVisibility],n=>n.filter(r=>r.column.getIsVisible()),Fe(t.options,"debugRows")),e.getVisibleCells=$e(()=>[e.getLeftVisibleCells(),e.getCenterVisibleCells(),e.getRightVisibleCells()],(n,r,a)=>[...n,...r,...a],Fe(t.options,"debugRows"))},createTable:e=>{const t=(n,r)=>$e(()=>[r(),r().filter(a=>a.getIsVisible()).map(a=>a.id).join("_")],a=>a.filter(o=>o.getIsVisible==null?void 0:o.getIsVisible()),Fe(e.options,"debugColumns"));e.getVisibleFlatColumns=t("getVisibleFlatColumns",()=>e.getAllFlatColumns()),e.getVisibleLeafColumns=t("getVisibleLeafColumns",()=>e.getAllLeafColumns()),e.getLeftVisibleLeafColumns=t("getLeftVisibleLeafColumns",()=>e.getLeftLeafColumns()),e.getRightVisibleLeafColumns=t("getRightVisibleLeafColumns",()=>e.getRightLeafColumns()),e.getCenterVisibleLeafColumns=t("getCenterVisibleLeafColumns",()=>e.getCenterLeafColumns()),e.setColumnVisibility=n=>e.options.onColumnVisibilityChange==null?void 0:e.options.onColumnVisibilityChange(n),e.resetColumnVisibility=n=>{var r;e.setColumnVisibility(n?{}:(r=e.initialState.columnVisibility)!=null?r:{})},e.toggleAllColumnsVisible=n=>{var r;n=(r=n)!=null?r:!e.getIsAllColumnsVisible(),e.setColumnVisibility(e.getAllLeafColumns().reduce((a,o)=>({...a,[o.id]:n||!(o.getCanHide!=null&&o.getCanHide())}),{}))},e.getIsAllColumnsVisible=()=>!e.getAllLeafColumns().some(n=>!(n.getIsVisible!=null&&n.getIsVisible())),e.getIsSomeColumnsVisible=()=>e.getAllLeafColumns().some(n=>n.getIsVisible==null?void 0:n.getIsVisible()),e.getToggleAllColumnsVisibilityHandler=()=>n=>{var r;e.toggleAllColumnsVisible((r=n.target)==null?void 0:r.checked)}}};function Hu(e,t){return t?t==="center"?e.getCenterVisibleLeafColumns():t==="left"?e.getLeftVisibleLeafColumns():e.getRightVisibleLeafColumns():e.getVisibleLeafColumns()}const h2=[TX,tQ,VX,GX,OX,eQ,BX,IX,qX,WX,RX];function nQ(e){var t;(e.debugAll||e.debugTable)&&console.info("Creating Table Instance...");let n={_features:h2};const r=n._features.reduce((u,d)=>Object.assign(u,d.getDefaultOptions==null?void 0:d.getDefaultOptions(n)),{}),a=u=>n.options.mergeOptions?n.options.mergeOptions(r,u):{...r,...u};let i={...{},...(t=e.initialState)!=null?t:{}};n._features.forEach(u=>{var d;i=(d=u.getInitialState==null?void 0:u.getInitialState(i))!=null?d:i});const s=[];let l=!1;const c={_features:h2,options:{...r,...e},initialState:i,_queue:u=>{s.push(u),l||(l=!0,Promise.resolve().then(()=>{for(;s.length;)s.shift()();l=!1}).catch(d=>setTimeout(()=>{throw d})))},reset:()=>{n.setState(n.initialState)},setOptions:u=>{const d=ii(u,n.options);n.options=a(d)},getState:()=>n.options.state,setState:u=>{n.options.onStateChange==null||n.options.onStateChange(u)},_getRowId:(u,d,g)=>{var m;return(m=n.options.getRowId==null?void 0:n.options.getRowId(u,d,g))!=null?m:`${g?[g.id,d].join("."):d}`},getCoreRowModel:()=>(n._getCoreRowModel||(n._getCoreRowModel=n.options.getCoreRowModel(n)),n._getCoreRowModel()),getRowModel:()=>n.getPaginationRowModel(),getRow:(u,d)=>{let g=(d?n.getPrePaginationRowModel():n.getRowModel()).rowsById[u];if(!g&&(g=n.getCoreRowModel().rowsById[u],!g))throw new Error;return g},_getDefaultColumnDef:$e(()=>[n.options.defaultColumn],u=>{var d;return u=(d=u)!=null?d:{},{header:g=>{const m=g.header.column.columnDef;return m.accessorKey?m.accessorKey:m.accessorFn?m.id:null},cell:g=>{var m,b;return(m=(b=g.renderValue())==null||b.toString==null?void 0:b.toString())!=null?m:null},...n._features.reduce((g,m)=>Object.assign(g,m.getDefaultColumnDef==null?void 0:m.getDefaultColumnDef()),{}),...u}},Fe(e,"debugColumns")),_getColumnDefs:()=>n.options.columns,getAllColumns:$e(()=>[n._getColumnDefs()],u=>{const d=function(g,m,b){return b===void 0&&(b=0),g.map(y=>{const w=AX(n,y,b,m),v=y;return w.columns=v.columns?d(v.columns,w,b+1):[],w})};return d(u)},Fe(e,"debugColumns")),getAllFlatColumns:$e(()=>[n.getAllColumns()],u=>u.flatMap(d=>d.getFlatColumns()),Fe(e,"debugColumns")),_getAllFlatColumnsById:$e(()=>[n.getAllFlatColumns()],u=>u.reduce((d,g)=>(d[g.id]=g,d),{}),Fe(e,"debugColumns")),getAllLeafColumns:$e(()=>[n.getAllColumns(),n._getOrderColumnsFn()],(u,d)=>{let g=u.flatMap(m=>m.getLeafColumns());return d(g)},Fe(e,"debugColumns")),getColumn:u=>n._getAllFlatColumnsById()[u]};Object.assign(n,c);for(let u=0;u{var i;return(i=o.getValue())!=null?i:e.options.renderFallbackValue},o={id:`${t.id}_${n.id}`,row:t,column:n,getValue:()=>t.getValue(r),renderValue:a,getContext:$e(()=>[e,n,t,o],(i,s,l,c)=>({table:i,column:s,row:l,cell:c,getValue:c.getValue,renderValue:c.renderValue}),Fe(e.options,"debugCells"))};return e._features.forEach(i=>{i.createCell==null||i.createCell(o,n,t,e)},{}),o}const aQ=(e,t,n,r,a,o,i)=>{let s={id:t,index:r,original:n,depth:a,parentId:i,_valuesCache:{},_uniqueValuesCache:{},getValue:l=>{if(s._valuesCache.hasOwnProperty(l))return s._valuesCache[l];const c=e.getColumn(l);if(c!=null&&c.accessorFn)return s._valuesCache[l]=c.accessorFn(s.original,r),s._valuesCache[l]},getUniqueValues:l=>{if(s._uniqueValuesCache.hasOwnProperty(l))return s._uniqueValuesCache[l];const c=e.getColumn(l);if(c!=null&&c.accessorFn)return c.columnDef.getUniqueValues?(s._uniqueValuesCache[l]=c.columnDef.getUniqueValues(s.original,r),s._uniqueValuesCache[l]):(s._uniqueValuesCache[l]=[s.getValue(l)],s._uniqueValuesCache[l])},renderValue:l=>{var c;return(c=s.getValue(l))!=null?c:e.options.renderFallbackValue},subRows:o??[],getLeafRows:()=>_X(s.subRows,l=>l.subRows),getParentRow:()=>s.parentId?e.getRow(s.parentId,!0):void 0,getParentRows:()=>{let l=[],c=s;for(;;){const u=c.getParentRow();if(!u)break;l.push(u),c=u}return l.reverse()},getAllCells:$e(()=>[e.getAllLeafColumns()],l=>l.map(c=>rQ(e,s,c,c.id)),Fe(e.options,"debugRows")),_getAllCellsByColumnId:$e(()=>[s.getAllCells()],l=>l.reduce((c,u)=>(c[u.column.id]=u,c),{}),Fe(e.options,"debugRows"))};for(let l=0;l$e(()=>[e.options.data],t=>{const n={rows:[],flatRows:[],rowsById:{}},r=function(a,o,i){o===void 0&&(o=0);const s=[];for(let c=0;ce._autoResetPageIndex()))}function iQ(e){const t=[],n=r=>{var a;t.push(r),(a=r.subRows)!=null&&a.length&&r.getIsExpanded()&&r.subRows.forEach(n)};return e.rows.forEach(n),{rows:t,flatRows:e.flatRows,rowsById:e.rowsById}}function sQ(e){return t=>$e(()=>[t.getState().pagination,t.getPrePaginationRowModel(),t.options.paginateExpandedRows?void 0:t.getState().expanded],(n,r)=>{if(!r.rows.length)return r;const{pageSize:a,pageIndex:o}=n;let{rows:i,flatRows:s,rowsById:l}=r;const c=a*o,u=c+a;i=i.slice(c,u);let d;t.options.paginateExpandedRows?d={rows:i,flatRows:s,rowsById:l}:d=iQ({rows:i,flatRows:s,rowsById:l}),d.flatRows=[];const g=m=>{d.flatRows.push(m),m.subRows.length&&m.subRows.forEach(g)};return d.rows.forEach(g),d},Fe(t.options,"debugTable"))}/** - * react-table - * - * Copyright (c) TanStack - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */function P6(e,t){return e?lQ(e)?p.createElement(e,t):e:null}function lQ(e){return cQ(e)||typeof e=="function"||uQ(e)}function cQ(e){return typeof e=="function"&&(()=>{const t=Object.getPrototypeOf(e);return t.prototype&&t.prototype.isReactComponent})()}function uQ(e){return typeof e=="object"&&typeof e.$$typeof=="symbol"&&["react.memo","react.forward_ref"].includes(e.$$typeof.description)}function dQ(e){const t={state:{},onStateChange:()=>{},renderFallbackValue:null,...e},[n]=p.useState(()=>({current:nQ(t)})),[r,a]=p.useState(()=>n.current.initialState);return n.current.setOptions(o=>({...o,...e,state:{...r,...e.state},onStateChange:i=>{a(i),e.onStateChange==null||e.onStateChange(i)}})),n.current}const $6=p.forwardRef(({className:e,...t},n)=>f.jsx("div",{className:"relative w-full overflow-auto",children:f.jsx("table",{ref:n,className:ee("caption-bottom w-full text-sm",e),...t})}));$6.displayName="Table";const F6=p.forwardRef(({className:e,...t},n)=>f.jsx("thead",{ref:n,className:ee("[&_tr]:border-b",e),...t}));F6.displayName="TableHeader";const _u=p.forwardRef(({className:e,...t},n)=>f.jsx("tbody",{ref:n,className:ee("[&_tr:last-child]:border-0",e),...t}));_u.displayName="TableBody";const fQ=p.forwardRef(({className:e,...t},n)=>f.jsx("tfoot",{ref:n,className:ee("bg-primary font-medium text-primary-foreground",e),...t}));fQ.displayName="TableFooter";const Zi=p.forwardRef(({className:e,...t},n)=>f.jsx("tr",{ref:n,className:ee("border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted",e),...t}));Zi.displayName="TableRow";const j6=p.forwardRef(({className:e,...t},n)=>f.jsx("th",{ref:n,className:ee("h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0",e),...t}));j6.displayName="TableHead";const ul=p.forwardRef(({className:e,...t},n)=>f.jsx("td",{ref:n,className:ee("p-4 align-middle [&:has([role=checkbox])]:pr-0",e),...t}));ul.displayName="TableCell";const pQ=p.forwardRef(({className:e,...t},n)=>f.jsx("caption",{ref:n,className:ee("mt-4 text-sm text-muted-foreground",e),...t}));pQ.displayName="TableCaption";function Pi({className:e,...t}){return f.jsx("div",{className:ee("animate-pulse rounded-md bg-muted",e),...t})}const gQ=ef("relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground",{variants:{variant:{default:"bg-background text-foreground",destructive:"border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive"}},defaultVariants:{variant:"default"}}),Jm=p.forwardRef(({className:e,variant:t,...n},r)=>f.jsx("div",{ref:r,role:"alert",className:ee(gQ({variant:t}),e),...n}));Jm.displayName="Alert";const z6=p.forwardRef(({className:e,...t},n)=>f.jsx("h5",{ref:n,className:ee("mb-1 font-medium leading-none tracking-tight",e),...t}));z6.displayName="AlertTitle";const U6=p.forwardRef(({className:e,...t},n)=>f.jsx("div",{ref:n,className:ee("text-sm [&_p]:leading-relaxed",e),...t}));U6.displayName="AlertDescription";function mQ(e){var i;const{table:t,isLoading:n,expandedRowsContent:r,error:a}=e,o=p.useMemo(()=>t.getAllColumns().length,[t]);return n?f.jsx(_u,{children:Array.from({length:15}).map((s,l)=>f.jsx(Zi,{children:t.getVisibleFlatColumns().map(c=>f.jsx(ul,{width:c.getSize(),className:"text-center",children:f.jsx(Pi,{className:"w-[95%] h-2"})},c.id))},l))}):a?f.jsx(_u,{children:f.jsx(Zi,{children:f.jsx(ul,{colSpan:o,className:"text-center",children:f.jsx(Jm,{variant:"destructive",children:a})})})}):((i=t.getRowModel().rows)==null?void 0:i.length)===0?f.jsx(_u,{children:f.jsx(Zi,{children:f.jsx(ul,{colSpan:o,className:"h-24 text-center",children:"No results."})})}):f.jsx(_u,{children:t.getRowModel().rows.map((s,l)=>f.jsxs(f.Fragment,{children:[f.jsx(Zi,{"data-state":s.getIsSelected()&&"selected",className:ee(s.getIsExpanded()&&"border-b-0"),children:s.getVisibleCells().map(c=>f.jsx(ul,{style:{width:`${c.column.getSize()}px`},children:P6(c.column.columnDef.cell,c.getContext())},c.id))},s.id),s.getIsExpanded()?f.jsx(Zi,{children:f.jsx(ul,{colSpan:o,className:"text-center pt-0",children:r?r(l):null})},s.id):null]}))})}function uf({columns:e,data:t,renderPagination:n,className:r,isLoading:a,error:o,expandedRowsContent:i}){const s=dQ({data:t,columns:e,getCoreRowModel:oQ(),getPaginationRowModel:sQ()});return f.jsxs(f.Fragment,{children:[f.jsx("div",{className:ee("rounded-md border",r),children:f.jsxs($6,{children:[f.jsx(F6,{children:s.getHeaderGroups().map(l=>f.jsx(Zi,{children:l.headers.map(c=>f.jsx(j6,{children:c.isPlaceholder?null:P6(c.column.columnDef.header,c.getContext())},c.id))},l.id))}),f.jsx(mQ,{table:s,isLoading:!!a,error:o,expandedRowsContent:i})]})}),n&&n(s)]})}function df({table:e,className:t,renderAdditionalInfo:n}){return f.jsxs("div",{className:ee("flex items-center justify-end space-x-2",t),children:[n&&n(e),f.jsxs("div",{className:"space-x-2",children:[f.jsx(ue,{variant:"outline",size:"sm",onClick:()=>e.previousPage(),disabled:!e.getCanPreviousPage(),children:"Previous"}),f.jsx(ue,{variant:"outline",size:"sm",onClick:()=>e.nextPage(),disabled:!e.getCanNextPage(),children:"Next"})]})]})}const hQ=p.createContext(void 0);function x_(e){const t=p.useContext(hQ);return e||t||"ltr"}let Fb=0;function eh(){p.useEffect(()=>{var e,t;const n=document.querySelectorAll("[data-radix-focus-guard]");return document.body.insertAdjacentElement("afterbegin",(e=n[0])!==null&&e!==void 0?e:b2()),document.body.insertAdjacentElement("beforeend",(t=n[1])!==null&&t!==void 0?t:b2()),Fb++,()=>{Fb===1&&document.querySelectorAll("[data-radix-focus-guard]").forEach(r=>r.remove()),Fb--}},[])}function b2(){const e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.cssText="outline: none; opacity: 0; position: fixed; pointer-events: none",e}const jb="focusScope.autoFocusOnMount",zb="focusScope.autoFocusOnUnmount",y2={bubbles:!1,cancelable:!0},th=p.forwardRef((e,t)=>{const{loop:n=!1,trapped:r=!1,onMountAutoFocus:a,onUnmountAutoFocus:o,...i}=e,[s,l]=p.useState(null),c=ur(a),u=ur(o),d=p.useRef(null),g=nt(t,y=>l(y)),m=p.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;p.useEffect(()=>{if(r){let h=function(x){if(m.paused||!s)return;const C=x.target;s.contains(C)?d.current=C:Ho(d.current,{select:!0})},S=function(x){if(m.paused||!s)return;const C=x.relatedTarget;C!==null&&(s.contains(C)||Ho(d.current,{select:!0}))},E=function(x){if(document.activeElement===document.body)for(const _ of x)_.removedNodes.length>0&&Ho(s)};var y=h,w=S,v=E;document.addEventListener("focusin",h),document.addEventListener("focusout",S);const k=new MutationObserver(E);return s&&k.observe(s,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",h),document.removeEventListener("focusout",S),k.disconnect()}}},[r,s,m.paused]),p.useEffect(()=>{if(s){S2.add(m);const y=document.activeElement;if(!s.contains(y)){const v=new CustomEvent(jb,y2);s.addEventListener(jb,c),s.dispatchEvent(v),v.defaultPrevented||(bQ(EQ(B6(s)),{select:!0}),document.activeElement===y&&Ho(s))}return()=>{s.removeEventListener(jb,c),setTimeout(()=>{const v=new CustomEvent(zb,y2);s.addEventListener(zb,u),s.dispatchEvent(v),v.defaultPrevented||Ho(y??document.body,{select:!0}),s.removeEventListener(zb,u),S2.remove(m)},0)}}},[s,c,u,m]);const b=p.useCallback(y=>{if(!n&&!r||m.paused)return;const w=y.key==="Tab"&&!y.altKey&&!y.ctrlKey&&!y.metaKey,v=document.activeElement;if(w&&v){const h=y.currentTarget,[S,E]=yQ(h);S&&E?!y.shiftKey&&v===E?(y.preventDefault(),n&&Ho(S,{select:!0})):y.shiftKey&&v===S&&(y.preventDefault(),n&&Ho(E,{select:!0})):v===h&&y.preventDefault()}},[n,r,m.paused]);return p.createElement(ze.div,W({tabIndex:-1},i,{ref:g,onKeyDown:b}))});function bQ(e,{select:t=!1}={}){const n=document.activeElement;for(const r of e)if(Ho(r,{select:t}),document.activeElement!==n)return}function yQ(e){const t=B6(e),n=v2(t,e),r=v2(t.reverse(),e);return[n,r]}function B6(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>{const a=r.tagName==="INPUT"&&r.type==="hidden";return r.disabled||r.hidden||a?NodeFilter.FILTER_SKIP:r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function v2(e,t){for(const n of e)if(!vQ(n,{upTo:t}))return n}function vQ(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function SQ(e){return e instanceof HTMLInputElement&&"select"in e}function Ho(e,{select:t=!1}={}){if(e&&e.focus){const n=document.activeElement;e.focus({preventScroll:!0}),e!==n&&SQ(e)&&t&&e.select()}}const S2=wQ();function wQ(){let e=[];return{add(t){const n=e[0];t!==n&&(n==null||n.pause()),e=w2(e,t),e.unshift(t)},remove(t){var n;e=w2(e,t),(n=e[0])===null||n===void 0||n.resume()}}}function w2(e,t){const n=[...e],r=n.indexOf(t);return r!==-1&&n.splice(r,1),n}function EQ(e){return e.filter(t=>t.tagName!=="A")}const xQ=Kd["useId".toString()]||(()=>{});let kQ=0;function bi(e){const[t,n]=p.useState(xQ());return Zr(()=>{e||n(r=>r??String(kQ++))},[e]),e||(t?`radix-${t}`:"")}const CQ=["top","right","bottom","left"],xi=Math.min,Er=Math.max,Og=Math.round,ep=Math.floor,ki=e=>({x:e,y:e}),_Q={left:"right",right:"left",bottom:"top",top:"bottom"},AQ={start:"end",end:"start"};function ek(e,t,n){return Er(e,xi(t,n))}function bo(e,t){return typeof e=="function"?e(t):e}function yo(e){return e.split("-")[0]}function $c(e){return e.split("-")[1]}function k_(e){return e==="x"?"y":"x"}function C_(e){return e==="y"?"height":"width"}function Fc(e){return["top","bottom"].includes(yo(e))?"y":"x"}function __(e){return k_(Fc(e))}function TQ(e,t,n){n===void 0&&(n=!1);const r=$c(e),a=__(e),o=C_(a);let i=a==="x"?r===(n?"end":"start")?"right":"left":r==="start"?"bottom":"top";return t.reference[o]>t.floating[o]&&(i=Dg(i)),[i,Dg(i)]}function RQ(e){const t=Dg(e);return[tk(e),t,tk(t)]}function tk(e){return e.replace(/start|end/g,t=>AQ[t])}function NQ(e,t,n){const r=["left","right"],a=["right","left"],o=["top","bottom"],i=["bottom","top"];switch(e){case"top":case"bottom":return n?t?a:r:t?r:a;case"left":case"right":return t?o:i;default:return[]}}function IQ(e,t,n,r){const a=$c(e);let o=NQ(yo(e),n==="start",r);return a&&(o=o.map(i=>i+"-"+a),t&&(o=o.concat(o.map(tk)))),o}function Dg(e){return e.replace(/left|right|bottom|top/g,t=>_Q[t])}function OQ(e){return{top:0,right:0,bottom:0,left:0,...e}}function H6(e){return typeof e!="number"?OQ(e):{top:e,right:e,bottom:e,left:e}}function Lg(e){return{...e,top:e.y,left:e.x,right:e.x+e.width,bottom:e.y+e.height}}function E2(e,t,n){let{reference:r,floating:a}=e;const o=Fc(t),i=__(t),s=C_(i),l=yo(t),c=o==="y",u=r.x+r.width/2-a.width/2,d=r.y+r.height/2-a.height/2,g=r[s]/2-a[s]/2;let m;switch(l){case"top":m={x:u,y:r.y-a.height};break;case"bottom":m={x:u,y:r.y+r.height};break;case"right":m={x:r.x+r.width,y:d};break;case"left":m={x:r.x-a.width,y:d};break;default:m={x:r.x,y:r.y}}switch($c(t)){case"start":m[i]-=g*(n&&c?-1:1);break;case"end":m[i]+=g*(n&&c?-1:1);break}return m}const DQ=async(e,t,n)=>{const{placement:r="bottom",strategy:a="absolute",middleware:o=[],platform:i}=n,s=o.filter(Boolean),l=await(i.isRTL==null?void 0:i.isRTL(t));let c=await i.getElementRects({reference:e,floating:t,strategy:a}),{x:u,y:d}=E2(c,r,l),g=r,m={},b=0;for(let y=0;y({name:"arrow",options:e,async fn(t){const{x:n,y:r,placement:a,rects:o,platform:i,elements:s,middlewareData:l}=t,{element:c,padding:u=0}=bo(e,t)||{};if(c==null)return{};const d=H6(u),g={x:n,y:r},m=__(a),b=C_(m),y=await i.getDimensions(c),w=m==="y",v=w?"top":"left",h=w?"bottom":"right",S=w?"clientHeight":"clientWidth",E=o.reference[b]+o.reference[m]-g[m]-o.floating[b],k=g[m]-o.reference[m],x=await(i.getOffsetParent==null?void 0:i.getOffsetParent(c));let C=x?x[S]:0;(!C||!await(i.isElement==null?void 0:i.isElement(x)))&&(C=s.floating[S]||o.floating[b]);const _=E/2-k/2,R=C/2-y[b]/2-1,T=xi(d[v],R),L=xi(d[h],R),D=T,H=C-y[b]-L,z=C/2-y[b]/2+_,M=ek(D,z,H),U=!l.arrow&&$c(a)!=null&&z!=M&&o.reference[b]/2-(zD<=0)){var R,T;const D=(((R=o.flip)==null?void 0:R.index)||0)+1,H=k[D];if(H)return{data:{index:D,overflows:_},reset:{placement:H}};let z=(T=_.filter(M=>M.overflows[0]<=0).sort((M,U)=>M.overflows[1]-U.overflows[1])[0])==null?void 0:T.placement;if(!z)switch(m){case"bestFit":{var L;const M=(L=_.map(U=>[U.placement,U.overflows.filter(X=>X>0).reduce((X,j)=>X+j,0)]).sort((U,X)=>U[1]-X[1])[0])==null?void 0:L[0];M&&(z=M);break}case"initialPlacement":z=s;break}if(a!==z)return{reset:{placement:z}}}return{}}}};function k2(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function C2(e){return CQ.some(t=>e[t]>=0)}const MQ=function(e){return e===void 0&&(e={}),{name:"hide",options:e,async fn(t){const{rects:n}=t,{strategy:r="referenceHidden",...a}=bo(e,t);switch(r){case"referenceHidden":{const o=await Sd(t,{...a,elementContext:"reference"}),i=k2(o,n.reference);return{data:{referenceHiddenOffsets:i,referenceHidden:C2(i)}}}case"escaped":{const o=await Sd(t,{...a,altBoundary:!0}),i=k2(o,n.floating);return{data:{escapedOffsets:i,escaped:C2(i)}}}default:return{}}}}};async function PQ(e,t){const{placement:n,platform:r,elements:a}=e,o=await(r.isRTL==null?void 0:r.isRTL(a.floating)),i=yo(n),s=$c(n),l=Fc(n)==="y",c=["left","top"].includes(i)?-1:1,u=o&&l?-1:1,d=bo(t,e);let{mainAxis:g,crossAxis:m,alignmentAxis:b}=typeof d=="number"?{mainAxis:d,crossAxis:0,alignmentAxis:null}:{mainAxis:0,crossAxis:0,alignmentAxis:null,...d};return s&&typeof b=="number"&&(m=s==="end"?b*-1:b),l?{x:m*u,y:g*c}:{x:g*c,y:m*u}}const $Q=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(t){const{x:n,y:r}=t,a=await PQ(t,e);return{x:n+a.x,y:r+a.y,data:a}}}},FQ=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(t){const{x:n,y:r,placement:a}=t,{mainAxis:o=!0,crossAxis:i=!1,limiter:s={fn:w=>{let{x:v,y:h}=w;return{x:v,y:h}}},...l}=bo(e,t),c={x:n,y:r},u=await Sd(t,l),d=Fc(yo(a)),g=k_(d);let m=c[g],b=c[d];if(o){const w=g==="y"?"top":"left",v=g==="y"?"bottom":"right",h=m+u[w],S=m-u[v];m=ek(h,m,S)}if(i){const w=d==="y"?"top":"left",v=d==="y"?"bottom":"right",h=b+u[w],S=b-u[v];b=ek(h,b,S)}const y=s.fn({...t,[g]:m,[d]:b});return{...y,data:{x:y.x-n,y:y.y-r}}}}},jQ=function(e){return e===void 0&&(e={}),{options:e,fn(t){const{x:n,y:r,placement:a,rects:o,middlewareData:i}=t,{offset:s=0,mainAxis:l=!0,crossAxis:c=!0}=bo(e,t),u={x:n,y:r},d=Fc(a),g=k_(d);let m=u[g],b=u[d];const y=bo(s,t),w=typeof y=="number"?{mainAxis:y,crossAxis:0}:{mainAxis:0,crossAxis:0,...y};if(l){const S=g==="y"?"height":"width",E=o.reference[g]-o.floating[S]+w.mainAxis,k=o.reference[g]+o.reference[S]-w.mainAxis;mk&&(m=k)}if(c){var v,h;const S=g==="y"?"width":"height",E=["top","left"].includes(yo(a)),k=o.reference[d]-o.floating[S]+(E&&((v=i.offset)==null?void 0:v[d])||0)+(E?0:w.crossAxis),x=o.reference[d]+o.reference[S]+(E?0:((h=i.offset)==null?void 0:h[d])||0)-(E?w.crossAxis:0);bx&&(b=x)}return{[g]:m,[d]:b}}}},zQ=function(e){return e===void 0&&(e={}),{name:"size",options:e,async fn(t){const{placement:n,rects:r,platform:a,elements:o}=t,{apply:i=()=>{},...s}=bo(e,t),l=await Sd(t,s),c=yo(n),u=$c(n),d=Fc(n)==="y",{width:g,height:m}=r.floating;let b,y;c==="top"||c==="bottom"?(b=c,y=u===(await(a.isRTL==null?void 0:a.isRTL(o.floating))?"start":"end")?"left":"right"):(y=c,b=u==="end"?"top":"bottom");const w=m-l[b],v=g-l[y],h=!t.middlewareData.shift;let S=w,E=v;if(d){const x=g-l.left-l.right;E=u||h?xi(v,x):x}else{const x=m-l.top-l.bottom;S=u||h?xi(w,x):x}if(h&&!u){const x=Er(l.left,0),C=Er(l.right,0),_=Er(l.top,0),R=Er(l.bottom,0);d?E=g-2*(x!==0||C!==0?x+C:Er(l.left,l.right)):S=m-2*(_!==0||R!==0?_+R:Er(l.top,l.bottom))}await i({...t,availableWidth:E,availableHeight:S});const k=await a.getDimensions(o.floating);return g!==k.width||m!==k.height?{reset:{rects:!0}}:{}}}};function Ci(e){return V6(e)?(e.nodeName||"").toLowerCase():"#document"}function _r(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function Ao(e){var t;return(t=(V6(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function V6(e){return e instanceof Node||e instanceof _r(e).Node}function vo(e){return e instanceof Element||e instanceof _r(e).Element}function ja(e){return e instanceof HTMLElement||e instanceof _r(e).HTMLElement}function _2(e){return typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof _r(e).ShadowRoot}function ff(e){const{overflow:t,overflowX:n,overflowY:r,display:a}=Xr(e);return/auto|scroll|overlay|hidden|clip/.test(t+r+n)&&!["inline","contents"].includes(a)}function UQ(e){return["table","td","th"].includes(Ci(e))}function A_(e){const t=T_(),n=Xr(e);return n.transform!=="none"||n.perspective!=="none"||(n.containerType?n.containerType!=="normal":!1)||!t&&(n.backdropFilter?n.backdropFilter!=="none":!1)||!t&&(n.filter?n.filter!=="none":!1)||["transform","perspective","filter"].some(r=>(n.willChange||"").includes(r))||["paint","layout","strict","content"].some(r=>(n.contain||"").includes(r))}function BQ(e){let t=vc(e);for(;ja(t)&&!nh(t);){if(A_(t))return t;t=vc(t)}return null}function T_(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}function nh(e){return["html","body","#document"].includes(Ci(e))}function Xr(e){return _r(e).getComputedStyle(e)}function rh(e){return vo(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function vc(e){if(Ci(e)==="html")return e;const t=e.assignedSlot||e.parentNode||_2(e)&&e.host||Ao(e);return _2(t)?t.host:t}function q6(e){const t=vc(e);return nh(t)?e.ownerDocument?e.ownerDocument.body:e.body:ja(t)&&ff(t)?t:q6(t)}function wd(e,t,n){var r;t===void 0&&(t=[]),n===void 0&&(n=!0);const a=q6(e),o=a===((r=e.ownerDocument)==null?void 0:r.body),i=_r(a);return o?t.concat(i,i.visualViewport||[],ff(a)?a:[],i.frameElement&&n?wd(i.frameElement):[]):t.concat(a,wd(a,[],n))}function G6(e){const t=Xr(e);let n=parseFloat(t.width)||0,r=parseFloat(t.height)||0;const a=ja(e),o=a?e.offsetWidth:n,i=a?e.offsetHeight:r,s=Og(n)!==o||Og(r)!==i;return s&&(n=o,r=i),{width:n,height:r,$:s}}function R_(e){return vo(e)?e:e.contextElement}function Ul(e){const t=R_(e);if(!ja(t))return ki(1);const n=t.getBoundingClientRect(),{width:r,height:a,$:o}=G6(t);let i=(o?Og(n.width):n.width)/r,s=(o?Og(n.height):n.height)/a;return(!i||!Number.isFinite(i))&&(i=1),(!s||!Number.isFinite(s))&&(s=1),{x:i,y:s}}const HQ=ki(0);function W6(e){const t=_r(e);return!T_()||!t.visualViewport?HQ:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function VQ(e,t,n){return t===void 0&&(t=!1),!n||t&&n!==_r(e)?!1:t}function As(e,t,n,r){t===void 0&&(t=!1),n===void 0&&(n=!1);const a=e.getBoundingClientRect(),o=R_(e);let i=ki(1);t&&(r?vo(r)&&(i=Ul(r)):i=Ul(e));const s=VQ(o,n,r)?W6(o):ki(0);let l=(a.left+s.x)/i.x,c=(a.top+s.y)/i.y,u=a.width/i.x,d=a.height/i.y;if(o){const g=_r(o),m=r&&vo(r)?_r(r):r;let b=g.frameElement;for(;b&&r&&m!==g;){const y=Ul(b),w=b.getBoundingClientRect(),v=Xr(b),h=w.left+(b.clientLeft+parseFloat(v.paddingLeft))*y.x,S=w.top+(b.clientTop+parseFloat(v.paddingTop))*y.y;l*=y.x,c*=y.y,u*=y.x,d*=y.y,l+=h,c+=S,b=_r(b).frameElement}}return Lg({width:u,height:d,x:l,y:c})}function qQ(e){let{rect:t,offsetParent:n,strategy:r}=e;const a=ja(n),o=Ao(n);if(n===o)return t;let i={scrollLeft:0,scrollTop:0},s=ki(1);const l=ki(0);if((a||!a&&r!=="fixed")&&((Ci(n)!=="body"||ff(o))&&(i=rh(n)),ja(n))){const c=As(n);s=Ul(n),l.x=c.x+n.clientLeft,l.y=c.y+n.clientTop}return{width:t.width*s.x,height:t.height*s.y,x:t.x*s.x-i.scrollLeft*s.x+l.x,y:t.y*s.y-i.scrollTop*s.y+l.y}}function GQ(e){return Array.from(e.getClientRects())}function K6(e){return As(Ao(e)).left+rh(e).scrollLeft}function WQ(e){const t=Ao(e),n=rh(e),r=e.ownerDocument.body,a=Er(t.scrollWidth,t.clientWidth,r.scrollWidth,r.clientWidth),o=Er(t.scrollHeight,t.clientHeight,r.scrollHeight,r.clientHeight);let i=-n.scrollLeft+K6(e);const s=-n.scrollTop;return Xr(r).direction==="rtl"&&(i+=Er(t.clientWidth,r.clientWidth)-a),{width:a,height:o,x:i,y:s}}function KQ(e,t){const n=_r(e),r=Ao(e),a=n.visualViewport;let o=r.clientWidth,i=r.clientHeight,s=0,l=0;if(a){o=a.width,i=a.height;const c=T_();(!c||c&&t==="fixed")&&(s=a.offsetLeft,l=a.offsetTop)}return{width:o,height:i,x:s,y:l}}function YQ(e,t){const n=As(e,!0,t==="fixed"),r=n.top+e.clientTop,a=n.left+e.clientLeft,o=ja(e)?Ul(e):ki(1),i=e.clientWidth*o.x,s=e.clientHeight*o.y,l=a*o.x,c=r*o.y;return{width:i,height:s,x:l,y:c}}function A2(e,t,n){let r;if(t==="viewport")r=KQ(e,n);else if(t==="document")r=WQ(Ao(e));else if(vo(t))r=YQ(t,n);else{const a=W6(e);r={...t,x:t.x-a.x,y:t.y-a.y}}return Lg(r)}function Y6(e,t){const n=vc(e);return n===t||!vo(n)||nh(n)?!1:Xr(n).position==="fixed"||Y6(n,t)}function ZQ(e,t){const n=t.get(e);if(n)return n;let r=wd(e,[],!1).filter(s=>vo(s)&&Ci(s)!=="body"),a=null;const o=Xr(e).position==="fixed";let i=o?vc(e):e;for(;vo(i)&&!nh(i);){const s=Xr(i),l=A_(i);!l&&s.position==="fixed"&&(a=null),(o?!l&&!a:!l&&s.position==="static"&&!!a&&["absolute","fixed"].includes(a.position)||ff(i)&&!l&&Y6(e,i))?r=r.filter(u=>u!==i):a=s,i=vc(i)}return t.set(e,r),r}function XQ(e){let{element:t,boundary:n,rootBoundary:r,strategy:a}=e;const i=[...n==="clippingAncestors"?ZQ(t,this._c):[].concat(n),r],s=i[0],l=i.reduce((c,u)=>{const d=A2(t,u,a);return c.top=Er(d.top,c.top),c.right=xi(d.right,c.right),c.bottom=xi(d.bottom,c.bottom),c.left=Er(d.left,c.left),c},A2(t,s,a));return{width:l.right-l.left,height:l.bottom-l.top,x:l.left,y:l.top}}function QQ(e){return G6(e)}function JQ(e,t,n){const r=ja(t),a=Ao(t),o=n==="fixed",i=As(e,!0,o,t);let s={scrollLeft:0,scrollTop:0};const l=ki(0);if(r||!r&&!o)if((Ci(t)!=="body"||ff(a))&&(s=rh(t)),r){const c=As(t,!0,o,t);l.x=c.x+t.clientLeft,l.y=c.y+t.clientTop}else a&&(l.x=K6(a));return{x:i.left+s.scrollLeft-l.x,y:i.top+s.scrollTop-l.y,width:i.width,height:i.height}}function T2(e,t){return!ja(e)||Xr(e).position==="fixed"?null:t?t(e):e.offsetParent}function Z6(e,t){const n=_r(e);if(!ja(e))return n;let r=T2(e,t);for(;r&&UQ(r)&&Xr(r).position==="static";)r=T2(r,t);return r&&(Ci(r)==="html"||Ci(r)==="body"&&Xr(r).position==="static"&&!A_(r))?n:r||BQ(e)||n}const eJ=async function(e){let{reference:t,floating:n,strategy:r}=e;const a=this.getOffsetParent||Z6,o=this.getDimensions;return{reference:JQ(t,await a(n),r),floating:{x:0,y:0,...await o(n)}}};function tJ(e){return Xr(e).direction==="rtl"}const nJ={convertOffsetParentRelativeRectToViewportRelativeRect:qQ,getDocumentElement:Ao,getClippingRect:XQ,getOffsetParent:Z6,getElementRects:eJ,getClientRects:GQ,getDimensions:QQ,getScale:Ul,isElement:vo,isRTL:tJ};function rJ(e,t){let n=null,r;const a=Ao(e);function o(){clearTimeout(r),n&&n.disconnect(),n=null}function i(s,l){s===void 0&&(s=!1),l===void 0&&(l=1),o();const{left:c,top:u,width:d,height:g}=e.getBoundingClientRect();if(s||t(),!d||!g)return;const m=ep(u),b=ep(a.clientWidth-(c+d)),y=ep(a.clientHeight-(u+g)),w=ep(c),h={rootMargin:-m+"px "+-b+"px "+-y+"px "+-w+"px",threshold:Er(0,xi(1,l))||1};let S=!0;function E(k){const x=k[0].intersectionRatio;if(x!==l){if(!S)return i();x?i(!1,x):r=setTimeout(()=>{i(!1,1e-7)},100)}S=!1}try{n=new IntersectionObserver(E,{...h,root:a.ownerDocument})}catch{n=new IntersectionObserver(E,h)}n.observe(e)}return i(!0),o}function aJ(e,t,n,r){r===void 0&&(r={});const{ancestorScroll:a=!0,ancestorResize:o=!0,elementResize:i=typeof ResizeObserver=="function",layoutShift:s=typeof IntersectionObserver=="function",animationFrame:l=!1}=r,c=R_(e),u=a||o?[...c?wd(c):[],...wd(t)]:[];u.forEach(v=>{a&&v.addEventListener("scroll",n,{passive:!0}),o&&v.addEventListener("resize",n)});const d=c&&s?rJ(c,n):null;let g=-1,m=null;i&&(m=new ResizeObserver(v=>{let[h]=v;h&&h.target===c&&m&&(m.unobserve(t),cancelAnimationFrame(g),g=requestAnimationFrame(()=>{m&&m.observe(t)})),n()}),c&&!l&&m.observe(c),m.observe(t));let b,y=l?As(e):null;l&&w();function w(){const v=As(e);y&&(v.x!==y.x||v.y!==y.y||v.width!==y.width||v.height!==y.height)&&n(),y=v,b=requestAnimationFrame(w)}return n(),()=>{u.forEach(v=>{a&&v.removeEventListener("scroll",n),o&&v.removeEventListener("resize",n)}),d&&d(),m&&m.disconnect(),m=null,l&&cancelAnimationFrame(b)}}const oJ=(e,t,n)=>{const r=new Map,a={platform:nJ,...n},o={...a.platform,_c:r};return DQ(e,t,{...a,platform:o})},iJ=e=>{function t(n){return{}.hasOwnProperty.call(n,"current")}return{name:"arrow",options:e,fn(n){const{element:r,padding:a}=typeof e=="function"?e(n):e;return r&&t(r)?r.current!=null?x2({element:r.current,padding:a}).fn(n):{}:r?x2({element:r,padding:a}).fn(n):{}}}};var qp=typeof document<"u"?p.useLayoutEffect:p.useEffect;function Mg(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(typeof e=="function"&&e.toString()===t.toString())return!0;let n,r,a;if(e&&t&&typeof e=="object"){if(Array.isArray(e)){if(n=e.length,n!=t.length)return!1;for(r=n;r--!==0;)if(!Mg(e[r],t[r]))return!1;return!0}if(a=Object.keys(e),n=a.length,n!==Object.keys(t).length)return!1;for(r=n;r--!==0;)if(!{}.hasOwnProperty.call(t,a[r]))return!1;for(r=n;r--!==0;){const o=a[r];if(!(o==="_owner"&&e.$$typeof)&&!Mg(e[o],t[o]))return!1}return!0}return e!==e&&t!==t}function X6(e){return typeof window>"u"?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function R2(e,t){const n=X6(e);return Math.round(t*n)/n}function N2(e){const t=p.useRef(e);return qp(()=>{t.current=e}),t}function sJ(e){e===void 0&&(e={});const{placement:t="bottom",strategy:n="absolute",middleware:r=[],platform:a,elements:{reference:o,floating:i}={},transform:s=!0,whileElementsMounted:l,open:c}=e,[u,d]=p.useState({x:0,y:0,strategy:n,placement:t,middlewareData:{},isPositioned:!1}),[g,m]=p.useState(r);Mg(g,r)||m(r);const[b,y]=p.useState(null),[w,v]=p.useState(null),h=p.useCallback(U=>{U!=x.current&&(x.current=U,y(U))},[y]),S=p.useCallback(U=>{U!==C.current&&(C.current=U,v(U))},[v]),E=o||b,k=i||w,x=p.useRef(null),C=p.useRef(null),_=p.useRef(u),R=N2(l),T=N2(a),L=p.useCallback(()=>{if(!x.current||!C.current)return;const U={placement:t,strategy:n,middleware:g};T.current&&(U.platform=T.current),oJ(x.current,C.current,U).then(X=>{const j={...X,isPositioned:!0};D.current&&!Mg(_.current,j)&&(_.current=j,ba.flushSync(()=>{d(j)}))})},[g,t,n,T]);qp(()=>{c===!1&&_.current.isPositioned&&(_.current.isPositioned=!1,d(U=>({...U,isPositioned:!1})))},[c]);const D=p.useRef(!1);qp(()=>(D.current=!0,()=>{D.current=!1}),[]),qp(()=>{if(E&&(x.current=E),k&&(C.current=k),E&&k){if(R.current)return R.current(E,k,L);L()}},[E,k,L,R]);const H=p.useMemo(()=>({reference:x,floating:C,setReference:h,setFloating:S}),[h,S]),z=p.useMemo(()=>({reference:E,floating:k}),[E,k]),M=p.useMemo(()=>{const U={position:n,left:0,top:0};if(!z.floating)return U;const X=R2(z.floating,u.x),j=R2(z.floating,u.y);return s?{...U,transform:"translate("+X+"px, "+j+"px)",...X6(z.floating)>=1.5&&{willChange:"transform"}}:{position:n,left:X,top:j}},[n,s,z.floating,u.x,u.y]);return p.useMemo(()=>({...u,update:L,refs:H,elements:z,floatingStyles:M}),[u,L,H,z,M])}function N_(e){const[t,n]=p.useState(void 0);return Zr(()=>{if(e){n({width:e.offsetWidth,height:e.offsetHeight});const r=new ResizeObserver(a=>{if(!Array.isArray(a)||!a.length)return;const o=a[0];let i,s;if("borderBoxSize"in o){const l=o.borderBoxSize,c=Array.isArray(l)?l[0]:l;i=c.inlineSize,s=c.blockSize}else i=e.offsetWidth,s=e.offsetHeight;n({width:i,height:s})});return r.observe(e,{box:"border-box"}),()=>r.unobserve(e)}else n(void 0)},[e]),t}const Q6="Popper",[J6,qa]=zn(Q6),[lJ,e7]=J6(Q6),cJ=e=>{const{__scopePopper:t,children:n}=e,[r,a]=p.useState(null);return p.createElement(lJ,{scope:t,anchor:r,onAnchorChange:a},n)},uJ="PopperAnchor",dJ=p.forwardRef((e,t)=>{const{__scopePopper:n,virtualRef:r,...a}=e,o=e7(uJ,n),i=p.useRef(null),s=nt(t,i);return p.useEffect(()=>{o.onAnchorChange((r==null?void 0:r.current)||i.current)}),r?null:p.createElement(ze.div,W({},a,{ref:s}))}),t7="PopperContent",[fJ,tTe]=J6(t7),pJ=p.forwardRef((e,t)=>{var n,r,a,o,i,s,l,c;const{__scopePopper:u,side:d="bottom",sideOffset:g=0,align:m="center",alignOffset:b=0,arrowPadding:y=0,avoidCollisions:w=!0,collisionBoundary:v=[],collisionPadding:h=0,sticky:S="partial",hideWhenDetached:E=!1,updatePositionStrategy:k="optimized",onPlaced:x,...C}=e,_=e7(t7,u),[R,T]=p.useState(null),L=nt(t,mt=>T(mt)),[D,H]=p.useState(null),z=N_(D),M=(n=z==null?void 0:z.width)!==null&&n!==void 0?n:0,U=(r=z==null?void 0:z.height)!==null&&r!==void 0?r:0,X=d+(m!=="center"?"-"+m:""),j=typeof h=="number"?h:{top:0,right:0,bottom:0,left:0,...h},O=Array.isArray(v)?v:[v],A=O.length>0,V={padding:j,boundary:O.filter(gJ),altBoundary:A},{refs:P,floatingStyles:N,placement:K,isPositioned:ae,middlewareData:ne}=sJ({strategy:"fixed",placement:X,whileElementsMounted:(...mt)=>aJ(...mt,{animationFrame:k==="always"}),elements:{reference:_.anchor},middleware:[$Q({mainAxis:g+U,alignmentAxis:b}),w&&FQ({mainAxis:!0,crossAxis:!1,limiter:S==="partial"?jQ():void 0,...V}),w&&LQ({...V}),zQ({...V,apply:({elements:mt,rects:Hn,availableWidth:F,availableHeight:q})=>{const{width:Y,height:ye}=Hn.reference,de=mt.floating.style;de.setProperty("--radix-popper-available-width",`${F}px`),de.setProperty("--radix-popper-available-height",`${q}px`),de.setProperty("--radix-popper-anchor-width",`${Y}px`),de.setProperty("--radix-popper-anchor-height",`${ye}px`)}}),D&&iJ({element:D,padding:y}),mJ({arrowWidth:M,arrowHeight:U}),E&&MQ({strategy:"referenceHidden",...V})]}),[Q,pe]=n7(K),he=ur(x);Zr(()=>{ae&&(he==null||he())},[ae,he]);const re=(a=ne.arrow)===null||a===void 0?void 0:a.x,Ee=(o=ne.arrow)===null||o===void 0?void 0:o.y,ke=((i=ne.arrow)===null||i===void 0?void 0:i.centerOffset)!==0,[We,Vt]=p.useState();return Zr(()=>{R&&Vt(window.getComputedStyle(R).zIndex)},[R]),p.createElement("div",{ref:P.setFloating,"data-radix-popper-content-wrapper":"",style:{...N,transform:ae?N.transform:"translate(0, -200%)",minWidth:"max-content",zIndex:We,["--radix-popper-transform-origin"]:[(s=ne.transformOrigin)===null||s===void 0?void 0:s.x,(l=ne.transformOrigin)===null||l===void 0?void 0:l.y].join(" ")},dir:e.dir},p.createElement(fJ,{scope:u,placedSide:Q,onArrowChange:H,arrowX:re,arrowY:Ee,shouldHideArrow:ke},p.createElement(ze.div,W({"data-side":Q,"data-align":pe},C,{ref:L,style:{...C.style,animation:ae?void 0:"none",opacity:(c=ne.hide)!==null&&c!==void 0&&c.referenceHidden?0:void 0}}))))});function gJ(e){return e!==null}const mJ=e=>({name:"transformOrigin",options:e,fn(t){var n,r,a,o,i;const{placement:s,rects:l,middlewareData:c}=t,d=((n=c.arrow)===null||n===void 0?void 0:n.centerOffset)!==0,g=d?0:e.arrowWidth,m=d?0:e.arrowHeight,[b,y]=n7(s),w={start:"0%",center:"50%",end:"100%"}[y],v=((r=(a=c.arrow)===null||a===void 0?void 0:a.x)!==null&&r!==void 0?r:0)+g/2,h=((o=(i=c.arrow)===null||i===void 0?void 0:i.y)!==null&&o!==void 0?o:0)+m/2;let S="",E="";return b==="bottom"?(S=d?w:`${v}px`,E=`${-m}px`):b==="top"?(S=d?w:`${v}px`,E=`${l.floating.height+m}px`):b==="right"?(S=`${-m}px`,E=d?w:`${h}px`):b==="left"&&(S=`${l.floating.width+m}px`,E=d?w:`${h}px`),{data:{x:S,y:E}}}});function n7(e){const[t,n="center"]=e.split("-");return[t,n]}const ah=cJ,pf=dJ,gf=pJ,Ub="rovingFocusGroup.onEntryFocus",hJ={bubbles:!1,cancelable:!0},I_="RovingFocusGroup",[nk,r7,bJ]=Nm(I_),[yJ,oh]=zn(I_,[bJ]),[vJ,SJ]=yJ(I_),wJ=p.forwardRef((e,t)=>p.createElement(nk.Provider,{scope:e.__scopeRovingFocusGroup},p.createElement(nk.Slot,{scope:e.__scopeRovingFocusGroup},p.createElement(EJ,W({},e,{ref:t}))))),EJ=p.forwardRef((e,t)=>{const{__scopeRovingFocusGroup:n,orientation:r,loop:a=!1,dir:o,currentTabStopId:i,defaultCurrentTabStopId:s,onCurrentTabStopIdChange:l,onEntryFocus:c,...u}=e,d=p.useRef(null),g=nt(t,d),m=x_(o),[b=null,y]=Fa({prop:i,defaultProp:s,onChange:l}),[w,v]=p.useState(!1),h=ur(c),S=r7(n),E=p.useRef(!1),[k,x]=p.useState(0);return p.useEffect(()=>{const C=d.current;if(C)return C.addEventListener(Ub,h),()=>C.removeEventListener(Ub,h)},[h]),p.createElement(vJ,{scope:n,orientation:r,dir:m,loop:a,currentTabStopId:b,onItemFocus:p.useCallback(C=>y(C),[y]),onItemShiftTab:p.useCallback(()=>v(!0),[]),onFocusableItemAdd:p.useCallback(()=>x(C=>C+1),[]),onFocusableItemRemove:p.useCallback(()=>x(C=>C-1),[])},p.createElement(ze.div,W({tabIndex:w||k===0?-1:0,"data-orientation":r},u,{ref:g,style:{outline:"none",...e.style},onMouseDown:fe(e.onMouseDown,()=>{E.current=!0}),onFocus:fe(e.onFocus,C=>{const _=!E.current;if(C.target===C.currentTarget&&_&&!w){const R=new CustomEvent(Ub,hJ);if(C.currentTarget.dispatchEvent(R),!R.defaultPrevented){const T=S().filter(M=>M.focusable),L=T.find(M=>M.active),D=T.find(M=>M.id===b),z=[L,D,...T].filter(Boolean).map(M=>M.ref.current);a7(z)}}E.current=!1}),onBlur:fe(e.onBlur,()=>v(!1))})))}),xJ="RovingFocusGroupItem",kJ=p.forwardRef((e,t)=>{const{__scopeRovingFocusGroup:n,focusable:r=!0,active:a=!1,tabStopId:o,...i}=e,s=bi(),l=o||s,c=SJ(xJ,n),u=c.currentTabStopId===l,d=r7(n),{onFocusableItemAdd:g,onFocusableItemRemove:m}=c;return p.useEffect(()=>{if(r)return g(),()=>m()},[r,g,m]),p.createElement(nk.ItemSlot,{scope:n,id:l,focusable:r,active:a},p.createElement(ze.span,W({tabIndex:u?0:-1,"data-orientation":c.orientation},i,{ref:t,onMouseDown:fe(e.onMouseDown,b=>{r?c.onItemFocus(l):b.preventDefault()}),onFocus:fe(e.onFocus,()=>c.onItemFocus(l)),onKeyDown:fe(e.onKeyDown,b=>{if(b.key==="Tab"&&b.shiftKey){c.onItemShiftTab();return}if(b.target!==b.currentTarget)return;const y=AJ(b,c.orientation,c.dir);if(y!==void 0){b.preventDefault();let v=d().filter(h=>h.focusable).map(h=>h.ref.current);if(y==="last")v.reverse();else if(y==="prev"||y==="next"){y==="prev"&&v.reverse();const h=v.indexOf(b.currentTarget);v=c.loop?TJ(v,h+1):v.slice(h+1)}setTimeout(()=>a7(v))}})})))}),CJ={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function _J(e,t){return t!=="rtl"?e:e==="ArrowLeft"?"ArrowRight":e==="ArrowRight"?"ArrowLeft":e}function AJ(e,t,n){const r=_J(e.key,n);if(!(t==="vertical"&&["ArrowLeft","ArrowRight"].includes(r))&&!(t==="horizontal"&&["ArrowUp","ArrowDown"].includes(r)))return CJ[r]}function a7(e){const t=document.activeElement;for(const n of e)if(n===t||(n.focus(),document.activeElement!==t))return}function TJ(e,t){return e.map((n,r)=>e[(t+r)%e.length])}const o7=wJ,i7=kJ;var RJ=function(e){if(typeof document>"u")return null;var t=Array.isArray(e)?e[0]:e;return t.ownerDocument.body},Qs=new WeakMap,tp=new WeakMap,np={},Bb=0,s7=function(e){return e&&(e.host||s7(e.parentNode))},NJ=function(e,t){return t.map(function(n){if(e.contains(n))return n;var r=s7(n);return r&&e.contains(r)?r:(console.error("aria-hidden",n,"in not contained inside",e,". Doing nothing"),null)}).filter(function(n){return!!n})},IJ=function(e,t,n,r){var a=NJ(t,Array.isArray(e)?e:[e]);np[n]||(np[n]=new WeakMap);var o=np[n],i=[],s=new Set,l=new Set(a),c=function(d){!d||s.has(d)||(s.add(d),c(d.parentNode))};a.forEach(c);var u=function(d){!d||l.has(d)||Array.prototype.forEach.call(d.children,function(g){if(s.has(g))u(g);else{var m=g.getAttribute(r),b=m!==null&&m!=="false",y=(Qs.get(g)||0)+1,w=(o.get(g)||0)+1;Qs.set(g,y),o.set(g,w),i.push(g),y===1&&b&&tp.set(g,!0),w===1&&g.setAttribute(n,"true"),b||g.setAttribute(r,"true")}})};return u(t),s.clear(),Bb++,function(){i.forEach(function(d){var g=Qs.get(d)-1,m=o.get(d)-1;Qs.set(d,g),o.set(d,m),g||(tp.has(d)||d.removeAttribute(r),tp.delete(d)),m||d.removeAttribute(n)}),Bb--,Bb||(Qs=new WeakMap,Qs=new WeakMap,tp=new WeakMap,np={})}},mf=function(e,t,n){n===void 0&&(n="data-aria-hidden");var r=Array.from(Array.isArray(e)?e:[e]),a=t||RJ(e);return a?(r.push.apply(r,Array.from(a.querySelectorAll("[aria-live]"))),IJ(r,a,n,"aria-hidden")):function(){return null}},Pn=function(){return Pn=Object.assign||function(t){for(var n,r=1,a=arguments.length;r"u")return VJ;var t=qJ(e),n=document.documentElement.clientWidth,r=window.innerWidth;return{left:t[0],top:t[1],right:t[2],gap:Math.max(0,r-n+t[2]-t[0])}},WJ=D_(),KJ=function(e,t,n,r){var a=e.left,o=e.top,i=e.right,s=e.gap;return n===void 0&&(n="margin"),` - .`.concat(OJ,` { - overflow: hidden `).concat(r,`; - padding-right: `).concat(s,"px ").concat(r,`; - } - body { - overflow: hidden `).concat(r,`; - overscroll-behavior: contain; - `).concat([t&&"position: relative ".concat(r,";"),n==="margin"&&` - padding-left: `.concat(a,`px; - padding-top: `).concat(o,`px; - padding-right: `).concat(i,`px; - margin-left:0; - margin-top:0; - margin-right: `).concat(s,"px ").concat(r,`; - `),n==="padding"&&"padding-right: ".concat(s,"px ").concat(r,";")].filter(Boolean).join(""),` - } - - .`).concat(Vu,` { - right: `).concat(s,"px ").concat(r,`; - } - - .`).concat(qu,` { - margin-right: `).concat(s,"px ").concat(r,`; - } - - .`).concat(Vu," .").concat(Vu,` { - right: 0 `).concat(r,`; - } - - .`).concat(qu," .").concat(qu,` { - margin-right: 0 `).concat(r,`; - } - - body { - `).concat(DJ,": ").concat(s,`px; - } -`)},g7=function(e){var t=e.noRelative,n=e.noImportant,r=e.gapMode,a=r===void 0?"margin":r,o=p.useMemo(function(){return GJ(a)},[a]);return p.createElement(WJ,{styles:KJ(o,!t,a,n?"":"!important")})},rk=!1;if(typeof window<"u")try{var rp=Object.defineProperty({},"passive",{get:function(){return rk=!0,!0}});window.addEventListener("test",rp,rp),window.removeEventListener("test",rp,rp)}catch{rk=!1}var Js=rk?{passive:!1}:!1,YJ=function(e){return e.tagName==="TEXTAREA"},m7=function(e,t){var n=window.getComputedStyle(e);return n[t]!=="hidden"&&!(n.overflowY===n.overflowX&&!YJ(e)&&n[t]==="visible")},ZJ=function(e){return m7(e,"overflowY")},XJ=function(e){return m7(e,"overflowX")},O2=function(e,t){var n=t;do{typeof ShadowRoot<"u"&&n instanceof ShadowRoot&&(n=n.host);var r=h7(e,n);if(r){var a=b7(e,n),o=a[1],i=a[2];if(o>i)return!0}n=n.parentNode}while(n&&n!==document.body);return!1},QJ=function(e){var t=e.scrollTop,n=e.scrollHeight,r=e.clientHeight;return[t,n,r]},JJ=function(e){var t=e.scrollLeft,n=e.scrollWidth,r=e.clientWidth;return[t,n,r]},h7=function(e,t){return e==="v"?ZJ(t):XJ(t)},b7=function(e,t){return e==="v"?QJ(t):JJ(t)},eee=function(e,t){return e==="h"&&t==="rtl"?-1:1},tee=function(e,t,n,r,a){var o=eee(e,window.getComputedStyle(t).direction),i=o*r,s=n.target,l=t.contains(s),c=!1,u=i>0,d=0,g=0;do{var m=b7(e,s),b=m[0],y=m[1],w=m[2],v=y-w-o*b;(b||v)&&h7(e,s)&&(d+=v,g+=b),s=s.parentNode}while(!l&&s!==document.body||l&&(t.contains(s)||t===s));return(u&&(a&&d===0||!a&&i>d)||!u&&(a&&g===0||!a&&-i>g))&&(c=!0),c},ap=function(e){return"changedTouches"in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},D2=function(e){return[e.deltaX,e.deltaY]},L2=function(e){return e&&"current"in e?e.current:e},nee=function(e,t){return e[0]===t[0]&&e[1]===t[1]},ree=function(e){return` - .block-interactivity-`.concat(e,` {pointer-events: none;} - .allow-interactivity-`).concat(e,` {pointer-events: all;} -`)},aee=0,el=[];function oee(e){var t=p.useRef([]),n=p.useRef([0,0]),r=p.useRef(),a=p.useState(aee++)[0],o=p.useState(function(){return D_()})[0],i=p.useRef(e);p.useEffect(function(){i.current=e},[e]),p.useEffect(function(){if(e.inert){document.body.classList.add("block-interactivity-".concat(a));var y=l7([e.lockRef.current],(e.shards||[]).map(L2),!0).filter(Boolean);return y.forEach(function(w){return w.classList.add("allow-interactivity-".concat(a))}),function(){document.body.classList.remove("block-interactivity-".concat(a)),y.forEach(function(w){return w.classList.remove("allow-interactivity-".concat(a))})}}},[e.inert,e.lockRef.current,e.shards]);var s=p.useCallback(function(y,w){if("touches"in y&&y.touches.length===2)return!i.current.allowPinchZoom;var v=ap(y),h=n.current,S="deltaX"in y?y.deltaX:h[0]-v[0],E="deltaY"in y?y.deltaY:h[1]-v[1],k,x=y.target,C=Math.abs(S)>Math.abs(E)?"h":"v";if("touches"in y&&C==="h"&&x.type==="range")return!1;var _=O2(C,x);if(!_)return!0;if(_?k=C:(k=C==="v"?"h":"v",_=O2(C,x)),!_)return!1;if(!r.current&&"changedTouches"in y&&(S||E)&&(r.current=k),!k)return!0;var R=r.current||k;return tee(R,w,y,R==="h"?S:E,!0)},[]),l=p.useCallback(function(y){var w=y;if(!(!el.length||el[el.length-1]!==o)){var v="deltaY"in w?D2(w):ap(w),h=t.current.filter(function(k){return k.name===w.type&&k.target===w.target&&nee(k.delta,v)})[0];if(h&&h.should){w.cancelable&&w.preventDefault();return}if(!h){var S=(i.current.shards||[]).map(L2).filter(Boolean).filter(function(k){return k.contains(w.target)}),E=S.length>0?s(w,S[0]):!i.current.noIsolation;E&&w.cancelable&&w.preventDefault()}}},[]),c=p.useCallback(function(y,w,v,h){var S={name:y,delta:w,target:v,should:h};t.current.push(S),setTimeout(function(){t.current=t.current.filter(function(E){return E!==S})},1)},[]),u=p.useCallback(function(y){n.current=ap(y),r.current=void 0},[]),d=p.useCallback(function(y){c(y.type,D2(y),y.target,s(y,e.lockRef.current))},[]),g=p.useCallback(function(y){c(y.type,ap(y),y.target,s(y,e.lockRef.current))},[]);p.useEffect(function(){return el.push(o),e.setCallbacks({onScrollCapture:d,onWheelCapture:d,onTouchMoveCapture:g}),document.addEventListener("wheel",l,Js),document.addEventListener("touchmove",l,Js),document.addEventListener("touchstart",u,Js),function(){el=el.filter(function(y){return y!==o}),document.removeEventListener("wheel",l,Js),document.removeEventListener("touchmove",l,Js),document.removeEventListener("touchstart",u,Js)}},[]);var m=e.removeScrollBar,b=e.inert;return p.createElement(p.Fragment,null,b?p.createElement(o,{styles:ree(a)}):null,m?p.createElement(g7,{gapMode:"margin"}):null)}const iee=f7(p7,oee);var y7=p.forwardRef(function(e,t){return p.createElement(ih,Pn({},e,{ref:t,sideCar:iee}))});y7.classNames=ih.classNames;const sh=y7,ak=["Enter"," "],see=["ArrowDown","PageUp","Home"],v7=["ArrowUp","PageDown","End"],lee=[...see,...v7],cee={ltr:[...ak,"ArrowRight"],rtl:[...ak,"ArrowLeft"]},uee={ltr:["ArrowLeft"],rtl:["ArrowRight"]},lh="Menu",[Ed,dee,fee]=Nm(lh),[js,S7]=zn(lh,[fee,qa,oh]),w7=qa(),E7=oh(),[nTe,zs]=js(lh),[rTe,hf]=js(lh),pee=p.forwardRef((e,t)=>{const{__scopeMenu:n,...r}=e,a=w7(n);return p.createElement(pf,W({},a,r,{ref:t}))}),x7="MenuPortal",[gee,k7]=js(x7,{forceMount:void 0}),mee=e=>{const{__scopeMenu:t,forceMount:n,children:r,container:a}=e,o=zs(x7,t);return p.createElement(gee,{scope:t,forceMount:n},p.createElement(pr,{present:n||o.open},p.createElement(Jd,{asChild:!0,container:a},r)))},ga="MenuContent",[hee,L_]=js(ga),bee=p.forwardRef((e,t)=>{const n=k7(ga,e.__scopeMenu),{forceMount:r=n.forceMount,...a}=e,o=zs(ga,e.__scopeMenu),i=hf(ga,e.__scopeMenu);return p.createElement(Ed.Provider,{scope:e.__scopeMenu},p.createElement(pr,{present:r||o.open},p.createElement(Ed.Slot,{scope:e.__scopeMenu},i.modal?p.createElement(yee,W({},a,{ref:t})):p.createElement(vee,W({},a,{ref:t})))))}),yee=p.forwardRef((e,t)=>{const n=zs(ga,e.__scopeMenu),r=p.useRef(null),a=nt(t,r);return p.useEffect(()=>{const o=r.current;if(o)return mf(o)},[]),p.createElement(M_,W({},e,{ref:a,trapFocus:n.open,disableOutsidePointerEvents:n.open,disableOutsideScroll:!0,onFocusOutside:fe(e.onFocusOutside,o=>o.preventDefault(),{checkForDefaultPrevented:!1}),onDismiss:()=>n.onOpenChange(!1)}))}),vee=p.forwardRef((e,t)=>{const n=zs(ga,e.__scopeMenu);return p.createElement(M_,W({},e,{ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,disableOutsideScroll:!1,onDismiss:()=>n.onOpenChange(!1)}))}),M_=p.forwardRef((e,t)=>{const{__scopeMenu:n,loop:r=!1,trapFocus:a,onOpenAutoFocus:o,onCloseAutoFocus:i,disableOutsidePointerEvents:s,onEntryFocus:l,onEscapeKeyDown:c,onPointerDownOutside:u,onFocusOutside:d,onInteractOutside:g,onDismiss:m,disableOutsideScroll:b,...y}=e,w=zs(ga,n),v=hf(ga,n),h=w7(n),S=E7(n),E=dee(n),[k,x]=p.useState(null),C=p.useRef(null),_=nt(t,C,w.onContentChange),R=p.useRef(0),T=p.useRef(""),L=p.useRef(0),D=p.useRef(null),H=p.useRef("right"),z=p.useRef(0),M=b?sh:p.Fragment,U=b?{as:$a,allowPinchZoom:!0}:void 0,X=O=>{var A,V;const P=T.current+O,N=E().filter(he=>!he.disabled),K=document.activeElement,ae=(A=N.find(he=>he.ref.current===K))===null||A===void 0?void 0:A.textValue,ne=N.map(he=>he.textValue),Q=Mee(ne,P,ae),pe=(V=N.find(he=>he.textValue===Q))===null||V===void 0?void 0:V.ref.current;(function he(re){T.current=re,window.clearTimeout(R.current),re!==""&&(R.current=window.setTimeout(()=>he(""),1e3))})(P),pe&&setTimeout(()=>pe.focus())};p.useEffect(()=>()=>window.clearTimeout(R.current),[]),eh();const j=p.useCallback(O=>{var A,V;return H.current===((A=D.current)===null||A===void 0?void 0:A.side)&&$ee(O,(V=D.current)===null||V===void 0?void 0:V.area)},[]);return p.createElement(hee,{scope:n,searchRef:T,onItemEnter:p.useCallback(O=>{j(O)&&O.preventDefault()},[j]),onItemLeave:p.useCallback(O=>{var A;j(O)||((A=C.current)===null||A===void 0||A.focus(),x(null))},[j]),onTriggerLeave:p.useCallback(O=>{j(O)&&O.preventDefault()},[j]),pointerGraceTimerRef:L,onPointerGraceIntentChange:p.useCallback(O=>{D.current=O},[])},p.createElement(M,U,p.createElement(th,{asChild:!0,trapped:a,onMountAutoFocus:fe(o,O=>{var A;O.preventDefault(),(A=C.current)===null||A===void 0||A.focus()}),onUnmountAutoFocus:i},p.createElement(Ls,{asChild:!0,disableOutsidePointerEvents:s,onEscapeKeyDown:c,onPointerDownOutside:u,onFocusOutside:d,onInteractOutside:g,onDismiss:m},p.createElement(o7,W({asChild:!0},S,{dir:v.dir,orientation:"vertical",loop:r,currentTabStopId:k,onCurrentTabStopIdChange:x,onEntryFocus:fe(l,O=>{v.isUsingKeyboardRef.current||O.preventDefault()})}),p.createElement(gf,W({role:"menu","aria-orientation":"vertical","data-state":R7(w.open),"data-radix-menu-content":"",dir:v.dir},h,y,{ref:_,style:{outline:"none",...y.style},onKeyDown:fe(y.onKeyDown,O=>{const V=O.target.closest("[data-radix-menu-content]")===O.currentTarget,P=O.ctrlKey||O.altKey||O.metaKey,N=O.key.length===1;V&&(O.key==="Tab"&&O.preventDefault(),!P&&N&&X(O.key));const K=C.current;if(O.target!==K||!lee.includes(O.key))return;O.preventDefault();const ne=E().filter(Q=>!Q.disabled).map(Q=>Q.ref.current);v7.includes(O.key)&&ne.reverse(),Dee(ne)}),onBlur:fe(e.onBlur,O=>{O.currentTarget.contains(O.target)||(window.clearTimeout(R.current),T.current="")}),onPointerMove:fe(e.onPointerMove,xd(O=>{const A=O.target,V=z.current!==O.clientX;if(O.currentTarget.contains(A)&&V){const P=O.clientX>z.current?"right":"left";H.current=P,z.current=O.clientX}}))})))))))}),See=p.forwardRef((e,t)=>{const{__scopeMenu:n,...r}=e;return p.createElement(ze.div,W({},r,{ref:t}))}),ok="MenuItem",M2="menu.itemSelect",P_=p.forwardRef((e,t)=>{const{disabled:n=!1,onSelect:r,...a}=e,o=p.useRef(null),i=hf(ok,e.__scopeMenu),s=L_(ok,e.__scopeMenu),l=nt(t,o),c=p.useRef(!1),u=()=>{const d=o.current;if(!n&&d){const g=new CustomEvent(M2,{bubbles:!0,cancelable:!0});d.addEventListener(M2,m=>r==null?void 0:r(m),{once:!0}),KC(d,g),g.defaultPrevented?c.current=!1:i.onClose()}};return p.createElement(C7,W({},a,{ref:l,disabled:n,onClick:fe(e.onClick,u),onPointerDown:d=>{var g;(g=e.onPointerDown)===null||g===void 0||g.call(e,d),c.current=!0},onPointerUp:fe(e.onPointerUp,d=>{var g;c.current||(g=d.currentTarget)===null||g===void 0||g.click()}),onKeyDown:fe(e.onKeyDown,d=>{const g=s.searchRef.current!=="";n||g&&d.key===" "||ak.includes(d.key)&&(d.currentTarget.click(),d.preventDefault())})}))}),C7=p.forwardRef((e,t)=>{const{__scopeMenu:n,disabled:r=!1,textValue:a,...o}=e,i=L_(ok,n),s=E7(n),l=p.useRef(null),c=nt(t,l),[u,d]=p.useState(!1),[g,m]=p.useState("");return p.useEffect(()=>{const b=l.current;if(b){var y;m(((y=b.textContent)!==null&&y!==void 0?y:"").trim())}},[o.children]),p.createElement(Ed.ItemSlot,{scope:n,disabled:r,textValue:a??g},p.createElement(i7,W({asChild:!0},s,{focusable:!r}),p.createElement(ze.div,W({role:"menuitem","data-highlighted":u?"":void 0,"aria-disabled":r||void 0,"data-disabled":r?"":void 0},o,{ref:c,onPointerMove:fe(e.onPointerMove,xd(b=>{r?i.onItemLeave(b):(i.onItemEnter(b),b.defaultPrevented||b.currentTarget.focus())})),onPointerLeave:fe(e.onPointerLeave,xd(b=>i.onItemLeave(b))),onFocus:fe(e.onFocus,()=>d(!0)),onBlur:fe(e.onBlur,()=>d(!1))}))))}),wee=p.forwardRef((e,t)=>{const{checked:n=!1,onCheckedChange:r,...a}=e;return p.createElement(A7,{scope:e.__scopeMenu,checked:n},p.createElement(P_,W({role:"menuitemcheckbox","aria-checked":Pg(n)?"mixed":n},a,{ref:t,"data-state":$_(n),onSelect:fe(a.onSelect,()=>r==null?void 0:r(Pg(n)?!0:!n),{checkForDefaultPrevented:!1})})))}),Eee="MenuRadioGroup",[aTe,xee]=js(Eee,{value:void 0,onValueChange:()=>{}}),kee="MenuRadioItem",Cee=p.forwardRef((e,t)=>{const{value:n,...r}=e,a=xee(kee,e.__scopeMenu),o=n===a.value;return p.createElement(A7,{scope:e.__scopeMenu,checked:o},p.createElement(P_,W({role:"menuitemradio","aria-checked":o},r,{ref:t,"data-state":$_(o),onSelect:fe(r.onSelect,()=>{var i;return(i=a.onValueChange)===null||i===void 0?void 0:i.call(a,n)},{checkForDefaultPrevented:!1})})))}),_7="MenuItemIndicator",[A7,_ee]=js(_7,{checked:!1}),Aee=p.forwardRef((e,t)=>{const{__scopeMenu:n,forceMount:r,...a}=e,o=_ee(_7,n);return p.createElement(pr,{present:r||Pg(o.checked)||o.checked===!0},p.createElement(ze.span,W({},a,{ref:t,"data-state":$_(o.checked)})))}),Tee=p.forwardRef((e,t)=>{const{__scopeMenu:n,...r}=e;return p.createElement(ze.div,W({role:"separator","aria-orientation":"horizontal"},r,{ref:t}))}),Ree="MenuSub",[oTe,T7]=js(Ree),op="MenuSubTrigger",Nee=p.forwardRef((e,t)=>{const n=zs(op,e.__scopeMenu),r=hf(op,e.__scopeMenu),a=T7(op,e.__scopeMenu),o=L_(op,e.__scopeMenu),i=p.useRef(null),{pointerGraceTimerRef:s,onPointerGraceIntentChange:l}=o,c={__scopeMenu:e.__scopeMenu},u=p.useCallback(()=>{i.current&&window.clearTimeout(i.current),i.current=null},[]);return p.useEffect(()=>u,[u]),p.useEffect(()=>{const d=s.current;return()=>{window.clearTimeout(d),l(null)}},[s,l]),p.createElement(pee,W({asChild:!0},c),p.createElement(C7,W({id:a.triggerId,"aria-haspopup":"menu","aria-expanded":n.open,"aria-controls":a.contentId,"data-state":R7(n.open)},e,{ref:WC(t,a.onTriggerChange),onClick:d=>{var g;(g=e.onClick)===null||g===void 0||g.call(e,d),!(e.disabled||d.defaultPrevented)&&(d.currentTarget.focus(),n.open||n.onOpenChange(!0))},onPointerMove:fe(e.onPointerMove,xd(d=>{o.onItemEnter(d),!d.defaultPrevented&&!e.disabled&&!n.open&&!i.current&&(o.onPointerGraceIntentChange(null),i.current=window.setTimeout(()=>{n.onOpenChange(!0),u()},100))})),onPointerLeave:fe(e.onPointerLeave,xd(d=>{var g;u();const m=(g=n.content)===null||g===void 0?void 0:g.getBoundingClientRect();if(m){var b;const y=(b=n.content)===null||b===void 0?void 0:b.dataset.side,w=y==="right",v=w?-5:5,h=m[w?"left":"right"],S=m[w?"right":"left"];o.onPointerGraceIntentChange({area:[{x:d.clientX+v,y:d.clientY},{x:h,y:m.top},{x:S,y:m.top},{x:S,y:m.bottom},{x:h,y:m.bottom}],side:y}),window.clearTimeout(s.current),s.current=window.setTimeout(()=>o.onPointerGraceIntentChange(null),300)}else{if(o.onTriggerLeave(d),d.defaultPrevented)return;o.onPointerGraceIntentChange(null)}})),onKeyDown:fe(e.onKeyDown,d=>{const g=o.searchRef.current!=="";if(!(e.disabled||g&&d.key===" ")&&cee[r.dir].includes(d.key)){var m;n.onOpenChange(!0),(m=n.content)===null||m===void 0||m.focus(),d.preventDefault()}})})))}),Iee="MenuSubContent",Oee=p.forwardRef((e,t)=>{const n=k7(ga,e.__scopeMenu),{forceMount:r=n.forceMount,...a}=e,o=zs(ga,e.__scopeMenu),i=hf(ga,e.__scopeMenu),s=T7(Iee,e.__scopeMenu),l=p.useRef(null),c=nt(t,l);return p.createElement(Ed.Provider,{scope:e.__scopeMenu},p.createElement(pr,{present:r||o.open},p.createElement(Ed.Slot,{scope:e.__scopeMenu},p.createElement(M_,W({id:s.contentId,"aria-labelledby":s.triggerId},a,{ref:c,align:"start",side:i.dir==="rtl"?"left":"right",disableOutsidePointerEvents:!1,disableOutsideScroll:!1,trapFocus:!1,onOpenAutoFocus:u=>{var d;i.isUsingKeyboardRef.current&&((d=l.current)===null||d===void 0||d.focus()),u.preventDefault()},onCloseAutoFocus:u=>u.preventDefault(),onFocusOutside:fe(e.onFocusOutside,u=>{u.target!==s.trigger&&o.onOpenChange(!1)}),onEscapeKeyDown:fe(e.onEscapeKeyDown,u=>{i.onClose(),u.preventDefault()}),onKeyDown:fe(e.onKeyDown,u=>{const d=u.currentTarget.contains(u.target),g=uee[i.dir].includes(u.key);if(d&&g){var m;o.onOpenChange(!1),(m=s.trigger)===null||m===void 0||m.focus(),u.preventDefault()}})})))))});function R7(e){return e?"open":"closed"}function Pg(e){return e==="indeterminate"}function $_(e){return Pg(e)?"indeterminate":e?"checked":"unchecked"}function Dee(e){const t=document.activeElement;for(const n of e)if(n===t||(n.focus(),document.activeElement!==t))return}function Lee(e,t){return e.map((n,r)=>e[(t+r)%e.length])}function Mee(e,t,n){const a=t.length>1&&Array.from(t).every(c=>c===t[0])?t[0]:t,o=n?e.indexOf(n):-1;let i=Lee(e,Math.max(o,0));a.length===1&&(i=i.filter(c=>c!==n));const l=i.find(c=>c.toLowerCase().startsWith(a.toLowerCase()));return l!==n?l:void 0}function Pee(e,t){const{x:n,y:r}=e;let a=!1;for(let o=0,i=t.length-1;or!=u>r&&n<(c-s)*(r-l)/(u-l)+s&&(a=!a)}return a}function $ee(e,t){if(!t)return!1;const n={x:e.clientX,y:e.clientY};return Pee(n,t)}function xd(e){return t=>t.pointerType==="mouse"?e(t):void 0}const Fee=mee,jee=bee,zee=See,Uee=P_,Bee=wee,Hee=Cee,Vee=Aee,qee=Tee,Gee=Nee,Wee=Oee,N7="DropdownMenu",[Kee,iTe]=zn(N7,[S7]),Ga=S7(),[sTe,Yee]=Kee(N7),Zee=e=>{const{__scopeDropdownMenu:t,...n}=e,r=Ga(t);return p.createElement(Fee,W({},r,n))},Xee="DropdownMenuContent",Qee=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Yee(Xee,n),o=Ga(n),i=p.useRef(!1);return p.createElement(jee,W({id:a.contentId,"aria-labelledby":a.triggerId},o,r,{ref:t,onCloseAutoFocus:fe(e.onCloseAutoFocus,s=>{var l;i.current||(l=a.triggerRef.current)===null||l===void 0||l.focus(),i.current=!1,s.preventDefault()}),onInteractOutside:fe(e.onInteractOutside,s=>{const l=s.detail.originalEvent,c=l.button===0&&l.ctrlKey===!0,u=l.button===2||c;(!a.modal||u)&&(i.current=!0)}),style:{...e.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}}))}),Jee=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Ga(n);return p.createElement(zee,W({},a,r,{ref:t}))}),ete=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Ga(n);return p.createElement(Uee,W({},a,r,{ref:t}))}),tte=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Ga(n);return p.createElement(Bee,W({},a,r,{ref:t}))}),nte=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Ga(n);return p.createElement(Hee,W({},a,r,{ref:t}))}),rte=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Ga(n);return p.createElement(Vee,W({},a,r,{ref:t}))}),ate=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Ga(n);return p.createElement(qee,W({},a,r,{ref:t}))}),ote=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Ga(n);return p.createElement(Gee,W({},a,r,{ref:t}))}),ite=p.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=Ga(n);return p.createElement(Wee,W({},a,r,{ref:t,style:{...e.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}}))}),ste=Zee,I7=Qee,O7=Jee,D7=ete,L7=tte,M7=nte,P7=rte,$7=ate,F7=ote,j7=ite,lte=p.forwardRef(({className:e,inset:t,children:n,...r},a)=>f.jsxs(F7,{ref:a,className:ee("flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent",t&&"pl-8",e),...r,children:[n,f.jsx($m,{className:"ml-auto h-4 w-4"})]}));lte.displayName=F7.displayName;const cte=p.forwardRef(({className:e,...t},n)=>f.jsx(j7,{ref:n,className:ee("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...t}));cte.displayName=j7.displayName;const ute=p.forwardRef(({className:e,sideOffset:t=4,...n},r)=>f.jsx(ste,{children:f.jsx(I7,{ref:r,sideOffset:t,className:ee("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...n})}));ute.displayName=I7.displayName;const dte=p.forwardRef(({className:e,inset:t,...n},r)=>f.jsx(D7,{ref:r,className:ee("relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",t&&"pl-8",e),...n}));dte.displayName=D7.displayName;const fte=p.forwardRef(({className:e,children:t,checked:n,...r},a)=>f.jsxs(L7,{ref:a,className:ee("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),checked:n,...r,children:[f.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:f.jsx(P7,{children:f.jsx(Pm,{className:"h-4 w-4"})})}),t]}));fte.displayName=L7.displayName;const pte=p.forwardRef(({className:e,children:t,...n},r)=>f.jsxs(M7,{ref:r,className:ee("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),...n,children:[f.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:f.jsx(P7,{children:f.jsx(Q4,{className:"h-2 w-2 fill-current"})})}),t]}));pte.displayName=M7.displayName;const gte=p.forwardRef(({className:e,inset:t,...n},r)=>f.jsx(O7,{ref:r,className:ee("px-2 py-1.5 text-sm font-semibold",t&&"pl-8",e),...n}));gte.displayName=O7.displayName;const mte=p.forwardRef(({className:e,...t},n)=>f.jsx($7,{ref:n,className:ee("-mx-1 my-1 h-px bg-muted",e),...t}));mte.displayName=$7.displayName;function P2(e,[t,n]){return Math.min(n,Math.max(t,e))}function F_(e){const t=p.useRef({value:e,previous:e});return p.useMemo(()=>(t.current.value!==e&&(t.current.previous=t.current.value,t.current.value=e),t.current.previous),[e])}const hte=[" ","Enter","ArrowUp","ArrowDown"],bte=[" ","Enter"],ch="Select",[uh,j_,yte]=Nm(ch),[jc,lTe]=zn(ch,[yte,qa]),z_=qa(),[vte,Us]=jc(ch),[Ste,wte]=jc(ch),Ete=e=>{const{__scopeSelect:t,children:n,open:r,defaultOpen:a,onOpenChange:o,value:i,defaultValue:s,onValueChange:l,dir:c,name:u,autoComplete:d,disabled:g,required:m}=e,b=z_(t),[y,w]=p.useState(null),[v,h]=p.useState(null),[S,E]=p.useState(!1),k=x_(c),[x=!1,C]=Fa({prop:r,defaultProp:a,onChange:o}),[_,R]=Fa({prop:i,defaultProp:s,onChange:l}),T=p.useRef(null),L=y?!!y.closest("form"):!0,[D,H]=p.useState(new Set),z=Array.from(D).map(M=>M.props.value).join(";");return p.createElement(ah,b,p.createElement(vte,{required:m,scope:t,trigger:y,onTriggerChange:w,valueNode:v,onValueNodeChange:h,valueNodeHasChildren:S,onValueNodeHasChildrenChange:E,contentId:bi(),value:_,onValueChange:R,open:x,onOpenChange:C,dir:k,triggerPointerDownPosRef:T,disabled:g},p.createElement(uh.Provider,{scope:t},p.createElement(Ste,{scope:e.__scopeSelect,onNativeOptionAdd:p.useCallback(M=>{H(U=>new Set(U).add(M))},[]),onNativeOptionRemove:p.useCallback(M=>{H(U=>{const X=new Set(U);return X.delete(M),X})},[])},n)),L?p.createElement(H7,{key:z,"aria-hidden":!0,required:m,tabIndex:-1,name:u,autoComplete:d,value:_,onChange:M=>R(M.target.value),disabled:g},_===void 0?p.createElement("option",{value:""}):null,Array.from(D)):null))},xte="SelectTrigger",kte=p.forwardRef((e,t)=>{const{__scopeSelect:n,disabled:r=!1,...a}=e,o=z_(n),i=Us(xte,n),s=i.disabled||r,l=nt(t,i.onTriggerChange),c=j_(n),[u,d,g]=V7(b=>{const y=c().filter(h=>!h.disabled),w=y.find(h=>h.value===i.value),v=q7(y,b,w);v!==void 0&&i.onValueChange(v.value)}),m=()=>{s||(i.onOpenChange(!0),g())};return p.createElement(pf,W({asChild:!0},o),p.createElement(ze.button,W({type:"button",role:"combobox","aria-controls":i.contentId,"aria-expanded":i.open,"aria-required":i.required,"aria-autocomplete":"none",dir:i.dir,"data-state":i.open?"open":"closed",disabled:s,"data-disabled":s?"":void 0,"data-placeholder":B7(i.value)?"":void 0},a,{ref:l,onClick:fe(a.onClick,b=>{b.currentTarget.focus()}),onPointerDown:fe(a.onPointerDown,b=>{const y=b.target;y.hasPointerCapture(b.pointerId)&&y.releasePointerCapture(b.pointerId),b.button===0&&b.ctrlKey===!1&&(m(),i.triggerPointerDownPosRef.current={x:Math.round(b.pageX),y:Math.round(b.pageY)},b.preventDefault())}),onKeyDown:fe(a.onKeyDown,b=>{const y=u.current!=="";!(b.ctrlKey||b.altKey||b.metaKey)&&b.key.length===1&&d(b.key),!(y&&b.key===" ")&&hte.includes(b.key)&&(m(),b.preventDefault())})})))}),Cte="SelectValue",_te=p.forwardRef((e,t)=>{const{__scopeSelect:n,className:r,style:a,children:o,placeholder:i="",...s}=e,l=Us(Cte,n),{onValueNodeHasChildrenChange:c}=l,u=o!==void 0,d=nt(t,l.onValueNodeChange);return Zr(()=>{c(u)},[c,u]),p.createElement(ze.span,W({},s,{ref:d,style:{pointerEvents:"none"}}),B7(l.value)?p.createElement(p.Fragment,null,i):o)}),Ate=p.forwardRef((e,t)=>{const{__scopeSelect:n,children:r,...a}=e;return p.createElement(ze.span,W({"aria-hidden":!0},a,{ref:t}),r||"▼")}),Tte=e=>p.createElement(Jd,W({asChild:!0},e)),Sc="SelectContent",Rte=p.forwardRef((e,t)=>{const n=Us(Sc,e.__scopeSelect),[r,a]=p.useState();if(Zr(()=>{a(new DocumentFragment)},[]),!n.open){const o=r;return o?ba.createPortal(p.createElement(z7,{scope:e.__scopeSelect},p.createElement(uh.Slot,{scope:e.__scopeSelect},p.createElement("div",null,e.children))),o):null}return p.createElement(Nte,W({},e,{ref:t}))}),ro=10,[z7,dh]=jc(Sc),Nte=p.forwardRef((e,t)=>{const{__scopeSelect:n,position:r="item-aligned",onCloseAutoFocus:a,onEscapeKeyDown:o,onPointerDownOutside:i,side:s,sideOffset:l,align:c,alignOffset:u,arrowPadding:d,collisionBoundary:g,collisionPadding:m,sticky:b,hideWhenDetached:y,avoidCollisions:w,...v}=e,h=Us(Sc,n),[S,E]=p.useState(null),[k,x]=p.useState(null),C=nt(t,Q=>E(Q)),[_,R]=p.useState(null),[T,L]=p.useState(null),D=j_(n),[H,z]=p.useState(!1),M=p.useRef(!1);p.useEffect(()=>{if(S)return mf(S)},[S]),eh();const U=p.useCallback(Q=>{const[pe,...he]=D().map(ke=>ke.ref.current),[re]=he.slice(-1),Ee=document.activeElement;for(const ke of Q)if(ke===Ee||(ke==null||ke.scrollIntoView({block:"nearest"}),ke===pe&&k&&(k.scrollTop=0),ke===re&&k&&(k.scrollTop=k.scrollHeight),ke==null||ke.focus(),document.activeElement!==Ee))return},[D,k]),X=p.useCallback(()=>U([_,S]),[U,_,S]);p.useEffect(()=>{H&&X()},[H,X]);const{onOpenChange:j,triggerPointerDownPosRef:O}=h;p.useEffect(()=>{if(S){let Q={x:0,y:0};const pe=re=>{var Ee,ke,We,Vt;Q={x:Math.abs(Math.round(re.pageX)-((Ee=(ke=O.current)===null||ke===void 0?void 0:ke.x)!==null&&Ee!==void 0?Ee:0)),y:Math.abs(Math.round(re.pageY)-((We=(Vt=O.current)===null||Vt===void 0?void 0:Vt.y)!==null&&We!==void 0?We:0))}},he=re=>{Q.x<=10&&Q.y<=10?re.preventDefault():S.contains(re.target)||j(!1),document.removeEventListener("pointermove",pe),O.current=null};return O.current!==null&&(document.addEventListener("pointermove",pe),document.addEventListener("pointerup",he,{capture:!0,once:!0})),()=>{document.removeEventListener("pointermove",pe),document.removeEventListener("pointerup",he,{capture:!0})}}},[S,j,O]),p.useEffect(()=>{const Q=()=>j(!1);return window.addEventListener("blur",Q),window.addEventListener("resize",Q),()=>{window.removeEventListener("blur",Q),window.removeEventListener("resize",Q)}},[j]);const[A,V]=V7(Q=>{const pe=D().filter(Ee=>!Ee.disabled),he=pe.find(Ee=>Ee.ref.current===document.activeElement),re=q7(pe,Q,he);re&&setTimeout(()=>re.ref.current.focus())}),P=p.useCallback((Q,pe,he)=>{const re=!M.current&&!he;(h.value!==void 0&&h.value===pe||re)&&(R(Q),re&&(M.current=!0))},[h.value]),N=p.useCallback(()=>S==null?void 0:S.focus(),[S]),K=p.useCallback((Q,pe,he)=>{const re=!M.current&&!he;(h.value!==void 0&&h.value===pe||re)&&L(Q)},[h.value]),ae=r==="popper"?$2:Ite,ne=ae===$2?{side:s,sideOffset:l,align:c,alignOffset:u,arrowPadding:d,collisionBoundary:g,collisionPadding:m,sticky:b,hideWhenDetached:y,avoidCollisions:w}:{};return p.createElement(z7,{scope:n,content:S,viewport:k,onViewportChange:x,itemRefCallback:P,selectedItem:_,onItemLeave:N,itemTextRefCallback:K,focusSelectedItem:X,selectedItemText:T,position:r,isPositioned:H,searchRef:A},p.createElement(sh,{as:$a,allowPinchZoom:!0},p.createElement(th,{asChild:!0,trapped:h.open,onMountAutoFocus:Q=>{Q.preventDefault()},onUnmountAutoFocus:fe(a,Q=>{var pe;(pe=h.trigger)===null||pe===void 0||pe.focus({preventScroll:!0}),Q.preventDefault()})},p.createElement(Ls,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:o,onPointerDownOutside:i,onFocusOutside:Q=>Q.preventDefault(),onDismiss:()=>h.onOpenChange(!1)},p.createElement(ae,W({role:"listbox",id:h.contentId,"data-state":h.open?"open":"closed",dir:h.dir,onContextMenu:Q=>Q.preventDefault()},v,ne,{onPlaced:()=>z(!0),ref:C,style:{display:"flex",flexDirection:"column",outline:"none",...v.style},onKeyDown:fe(v.onKeyDown,Q=>{const pe=Q.ctrlKey||Q.altKey||Q.metaKey;if(Q.key==="Tab"&&Q.preventDefault(),!pe&&Q.key.length===1&&V(Q.key),["ArrowUp","ArrowDown","Home","End"].includes(Q.key)){let re=D().filter(Ee=>!Ee.disabled).map(Ee=>Ee.ref.current);if(["ArrowUp","End"].includes(Q.key)&&(re=re.slice().reverse()),["ArrowUp","ArrowDown"].includes(Q.key)){const Ee=Q.target,ke=re.indexOf(Ee);re=re.slice(ke+1)}setTimeout(()=>U(re)),Q.preventDefault()}})}))))))}),Ite=p.forwardRef((e,t)=>{const{__scopeSelect:n,onPlaced:r,...a}=e,o=Us(Sc,n),i=dh(Sc,n),[s,l]=p.useState(null),[c,u]=p.useState(null),d=nt(t,C=>u(C)),g=j_(n),m=p.useRef(!1),b=p.useRef(!0),{viewport:y,selectedItem:w,selectedItemText:v,focusSelectedItem:h}=i,S=p.useCallback(()=>{if(o.trigger&&o.valueNode&&s&&c&&y&&w&&v){const C=o.trigger.getBoundingClientRect(),_=c.getBoundingClientRect(),R=o.valueNode.getBoundingClientRect(),T=v.getBoundingClientRect();if(o.dir!=="rtl"){const Ee=T.left-_.left,ke=R.left-Ee,We=C.left-ke,Vt=C.width+We,mt=Math.max(Vt,_.width),Hn=window.innerWidth-ro,F=P2(ke,[ro,Hn-mt]);s.style.minWidth=Vt+"px",s.style.left=F+"px"}else{const Ee=_.right-T.right,ke=window.innerWidth-R.right-Ee,We=window.innerWidth-C.right-ke,Vt=C.width+We,mt=Math.max(Vt,_.width),Hn=window.innerWidth-ro,F=P2(ke,[ro,Hn-mt]);s.style.minWidth=Vt+"px",s.style.right=F+"px"}const L=g(),D=window.innerHeight-ro*2,H=y.scrollHeight,z=window.getComputedStyle(c),M=parseInt(z.borderTopWidth,10),U=parseInt(z.paddingTop,10),X=parseInt(z.borderBottomWidth,10),j=parseInt(z.paddingBottom,10),O=M+U+H+j+X,A=Math.min(w.offsetHeight*5,O),V=window.getComputedStyle(y),P=parseInt(V.paddingTop,10),N=parseInt(V.paddingBottom,10),K=C.top+C.height/2-ro,ae=D-K,ne=w.offsetHeight/2,Q=w.offsetTop+ne,pe=M+U+Q,he=O-pe;if(pe<=K){const Ee=w===L[L.length-1].ref.current;s.style.bottom="0px";const ke=c.clientHeight-y.offsetTop-y.offsetHeight,We=Math.max(ae,ne+(Ee?N:0)+ke+X),Vt=pe+We;s.style.height=Vt+"px"}else{const Ee=w===L[0].ref.current;s.style.top="0px";const We=Math.max(K,M+y.offsetTop+(Ee?P:0)+ne)+he;s.style.height=We+"px",y.scrollTop=pe-K+y.offsetTop}s.style.margin=`${ro}px 0`,s.style.minHeight=A+"px",s.style.maxHeight=D+"px",r==null||r(),requestAnimationFrame(()=>m.current=!0)}},[g,o.trigger,o.valueNode,s,c,y,w,v,o.dir,r]);Zr(()=>S(),[S]);const[E,k]=p.useState();Zr(()=>{c&&k(window.getComputedStyle(c).zIndex)},[c]);const x=p.useCallback(C=>{C&&b.current===!0&&(S(),h==null||h(),b.current=!1)},[S,h]);return p.createElement(Ote,{scope:n,contentWrapper:s,shouldExpandOnScrollRef:m,onScrollButtonChange:x},p.createElement("div",{ref:l,style:{display:"flex",flexDirection:"column",position:"fixed",zIndex:E}},p.createElement(ze.div,W({},a,{ref:d,style:{boxSizing:"border-box",maxHeight:"100%",...a.style}}))))}),$2=p.forwardRef((e,t)=>{const{__scopeSelect:n,align:r="start",collisionPadding:a=ro,...o}=e,i=z_(n);return p.createElement(gf,W({},i,o,{ref:t,align:r,collisionPadding:a,style:{boxSizing:"border-box",...o.style,"--radix-select-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-select-content-available-width":"var(--radix-popper-available-width)","--radix-select-content-available-height":"var(--radix-popper-available-height)","--radix-select-trigger-width":"var(--radix-popper-anchor-width)","--radix-select-trigger-height":"var(--radix-popper-anchor-height)"}}))}),[Ote,Dte]=jc(Sc,{}),F2="SelectViewport",Lte=p.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e,a=dh(F2,n),o=Dte(F2,n),i=nt(t,a.onViewportChange),s=p.useRef(0);return p.createElement(p.Fragment,null,p.createElement("style",{dangerouslySetInnerHTML:{__html:"[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}"}}),p.createElement(uh.Slot,{scope:n},p.createElement(ze.div,W({"data-radix-select-viewport":"",role:"presentation"},r,{ref:i,style:{position:"relative",flex:1,overflow:"auto",...r.style},onScroll:fe(r.onScroll,l=>{const c=l.currentTarget,{contentWrapper:u,shouldExpandOnScrollRef:d}=o;if(d!=null&&d.current&&u){const g=Math.abs(s.current-c.scrollTop);if(g>0){const m=window.innerHeight-ro*2,b=parseFloat(u.style.minHeight),y=parseFloat(u.style.height),w=Math.max(b,y);if(w0?S:0,u.style.justifyContent="flex-end")}}}s.current=c.scrollTop})}))))}),Mte="SelectGroup",[cTe,Pte]=jc(Mte),$te="SelectLabel",Fte=p.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e,a=Pte($te,n);return p.createElement(ze.div,W({id:a.id},r,{ref:t}))}),ik="SelectItem",[jte,U7]=jc(ik),zte=p.forwardRef((e,t)=>{const{__scopeSelect:n,value:r,disabled:a=!1,textValue:o,...i}=e,s=Us(ik,n),l=dh(ik,n),c=s.value===r,[u,d]=p.useState(o??""),[g,m]=p.useState(!1),b=nt(t,v=>{var h;return(h=l.itemRefCallback)===null||h===void 0?void 0:h.call(l,v,r,a)}),y=bi(),w=()=>{a||(s.onValueChange(r),s.onOpenChange(!1))};if(r==="")throw new Error("A must have a value prop that is not an empty string. This is because the Select value can be set to an empty string to clear the selection and show the placeholder.");return p.createElement(jte,{scope:n,value:r,disabled:a,textId:y,isSelected:c,onItemTextChange:p.useCallback(v=>{d(h=>{var S;return h||((S=v==null?void 0:v.textContent)!==null&&S!==void 0?S:"").trim()})},[])},p.createElement(uh.ItemSlot,{scope:n,value:r,disabled:a,textValue:u},p.createElement(ze.div,W({role:"option","aria-labelledby":y,"data-highlighted":g?"":void 0,"aria-selected":c&&g,"data-state":c?"checked":"unchecked","aria-disabled":a||void 0,"data-disabled":a?"":void 0,tabIndex:a?void 0:-1},i,{ref:b,onFocus:fe(i.onFocus,()=>m(!0)),onBlur:fe(i.onBlur,()=>m(!1)),onPointerUp:fe(i.onPointerUp,w),onPointerMove:fe(i.onPointerMove,v=>{if(a){var h;(h=l.onItemLeave)===null||h===void 0||h.call(l)}else v.currentTarget.focus({preventScroll:!0})}),onPointerLeave:fe(i.onPointerLeave,v=>{if(v.currentTarget===document.activeElement){var h;(h=l.onItemLeave)===null||h===void 0||h.call(l)}}),onKeyDown:fe(i.onKeyDown,v=>{var h;((h=l.searchRef)===null||h===void 0?void 0:h.current)!==""&&v.key===" "||(bte.includes(v.key)&&w(),v.key===" "&&v.preventDefault())})}))))}),ip="SelectItemText",Ute=p.forwardRef((e,t)=>{const{__scopeSelect:n,className:r,style:a,...o}=e,i=Us(ip,n),s=dh(ip,n),l=U7(ip,n),c=wte(ip,n),[u,d]=p.useState(null),g=nt(t,v=>d(v),l.onItemTextChange,v=>{var h;return(h=s.itemTextRefCallback)===null||h===void 0?void 0:h.call(s,v,l.value,l.disabled)}),m=u==null?void 0:u.textContent,b=p.useMemo(()=>p.createElement("option",{key:l.value,value:l.value,disabled:l.disabled},m),[l.disabled,l.value,m]),{onNativeOptionAdd:y,onNativeOptionRemove:w}=c;return Zr(()=>(y(b),()=>w(b)),[y,w,b]),p.createElement(p.Fragment,null,p.createElement(ze.span,W({id:l.textId},o,{ref:g})),l.isSelected&&i.valueNode&&!i.valueNodeHasChildren?ba.createPortal(o.children,i.valueNode):null)}),Bte="SelectItemIndicator",Hte=p.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e;return U7(Bte,n).isSelected?p.createElement(ze.span,W({"aria-hidden":!0},r,{ref:t})):null}),Vte=p.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e;return p.createElement(ze.div,W({"aria-hidden":!0},r,{ref:t}))});function B7(e){return e===""||e===void 0}const H7=p.forwardRef((e,t)=>{const{value:n,...r}=e,a=p.useRef(null),o=nt(t,a),i=F_(n);return p.useEffect(()=>{const s=a.current,l=window.HTMLSelectElement.prototype,u=Object.getOwnPropertyDescriptor(l,"value").set;if(i!==n&&u){const d=new Event("change",{bubbles:!0});u.call(s,n),s.dispatchEvent(d)}},[i,n]),p.createElement(Im,{asChild:!0},p.createElement("select",W({},r,{ref:o,defaultValue:n})))});H7.displayName="BubbleSelect";function V7(e){const t=ur(e),n=p.useRef(""),r=p.useRef(0),a=p.useCallback(i=>{const s=n.current+i;t(s),function l(c){n.current=c,window.clearTimeout(r.current),c!==""&&(r.current=window.setTimeout(()=>l(""),1e3))}(s)},[t]),o=p.useCallback(()=>{n.current="",window.clearTimeout(r.current)},[]);return p.useEffect(()=>()=>window.clearTimeout(r.current),[]),[n,a,o]}function q7(e,t,n){const a=t.length>1&&Array.from(t).every(c=>c===t[0])?t[0]:t,o=n?e.indexOf(n):-1;let i=qte(e,Math.max(o,0));a.length===1&&(i=i.filter(c=>c!==n));const l=i.find(c=>c.textValue.toLowerCase().startsWith(a.toLowerCase()));return l!==n?l:void 0}function qte(e,t){return e.map((n,r)=>e[(t+r)%e.length])}const Gte=Ete,G7=kte,Wte=_te,Kte=Ate,Yte=Tte,W7=Rte,Zte=Lte,K7=Fte,Y7=zte,Xte=Ute,Qte=Hte,Z7=Vte,So=Gte,wo=Wte,za=p.forwardRef(({className:e,children:t,...n},r)=>f.jsxs(G7,{ref:r,className:ee("flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),...n,children:[t,f.jsx(Kte,{asChild:!0,children:f.jsx(ZC,{className:"h-4 w-4 opacity-50"})})]}));za.displayName=G7.displayName;const Ua=p.forwardRef(({className:e,children:t,position:n="popper",...r},a)=>f.jsx(Yte,{children:f.jsx(W7,{ref:a,className:ee("relative z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",n==="popper"&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",e),position:n,...r,children:f.jsx(Zte,{className:ee("p-1",n==="popper"&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"),children:t})})}));Ua.displayName=W7.displayName;const Jte=p.forwardRef(({className:e,...t},n)=>f.jsx(K7,{ref:n,className:ee("py-1.5 pl-8 pr-2 text-sm font-semibold",e),...t}));Jte.displayName=K7.displayName;const Fn=p.forwardRef(({className:e,children:t,...n},r)=>f.jsxs(Y7,{ref:r,className:ee("relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),...n,children:[f.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:f.jsx(Qte,{children:f.jsx(Pm,{className:"h-4 w-4"})})}),f.jsx(Xte,{children:t})]}));Fn.displayName=Y7.displayName;const ene=p.forwardRef(({className:e,...t},n)=>f.jsx(Z7,{ref:n,className:ee("-mx-1 my-1 h-px bg-muted",e),...t}));ene.displayName=Z7.displayName;function Ts(e){"@babel/helpers - typeof";return Ts=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ts(e)}function _i(e){if(e===null||e===!0||e===!1)return NaN;var t=Number(e);return isNaN(t)?t:t<0?Math.ceil(t):Math.floor(t)}function Un(e,t){if(t.length1?"s":"")+" required, but only "+t.length+" present")}function Wa(e){Un(1,arguments);var t=Object.prototype.toString.call(e);return e instanceof Date||Ts(e)==="object"&&t==="[object Date]"?new Date(e.getTime()):typeof e=="number"||t==="[object Number]"?new Date(e):((typeof e=="string"||t==="[object String]")&&typeof console<"u"&&(console.warn("Starting with v2.0.0-beta.1 date-fns doesn't accept strings as date arguments. Please use `parseISO` to parse strings. See: https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#string-arguments"),console.warn(new Error().stack)),new Date(NaN))}function tne(e,t){Un(2,arguments);var n=Wa(e).getTime(),r=_i(t);return new Date(n+r)}var nne={};function fh(){return nne}function rne(e){var t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()));return t.setUTCFullYear(e.getFullYear()),e.getTime()-t.getTime()}var X7=6e4,Q7=36e5;function ane(e){return Un(1,arguments),e instanceof Date||Ts(e)==="object"&&Object.prototype.toString.call(e)==="[object Date]"}function one(e){if(Un(1,arguments),!ane(e)&&typeof e!="number")return!1;var t=Wa(e);return!isNaN(Number(t))}function ine(e,t){Un(2,arguments);var n=_i(t);return tne(e,-n)}var sne=864e5;function lne(e){Un(1,arguments);var t=Wa(e),n=t.getTime();t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0);var r=t.getTime(),a=n-r;return Math.floor(a/sne)+1}function $g(e){Un(1,arguments);var t=1,n=Wa(e),r=n.getUTCDay(),a=(r=a.getTime()?n+1:t.getTime()>=i.getTime()?n:n-1}function cne(e){Un(1,arguments);var t=J7(e),n=new Date(0);n.setUTCFullYear(t,0,4),n.setUTCHours(0,0,0,0);var r=$g(n);return r}var une=6048e5;function dne(e){Un(1,arguments);var t=Wa(e),n=$g(t).getTime()-cne(t).getTime();return Math.round(n/une)+1}function Fg(e,t){var n,r,a,o,i,s,l,c;Un(1,arguments);var u=fh(),d=_i((n=(r=(a=(o=t==null?void 0:t.weekStartsOn)!==null&&o!==void 0?o:t==null||(i=t.locale)===null||i===void 0||(s=i.options)===null||s===void 0?void 0:s.weekStartsOn)!==null&&a!==void 0?a:u.weekStartsOn)!==null&&r!==void 0?r:(l=u.locale)===null||l===void 0||(c=l.options)===null||c===void 0?void 0:c.weekStartsOn)!==null&&n!==void 0?n:0);if(!(d>=0&&d<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");var g=Wa(e),m=g.getUTCDay(),b=(m=1&&m<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var b=new Date(0);b.setUTCFullYear(d+1,0,m),b.setUTCHours(0,0,0,0);var y=Fg(b,t),w=new Date(0);w.setUTCFullYear(d,0,m),w.setUTCHours(0,0,0,0);var v=Fg(w,t);return u.getTime()>=y.getTime()?d+1:u.getTime()>=v.getTime()?d:d-1}function fne(e,t){var n,r,a,o,i,s,l,c;Un(1,arguments);var u=fh(),d=_i((n=(r=(a=(o=t==null?void 0:t.firstWeekContainsDate)!==null&&o!==void 0?o:t==null||(i=t.locale)===null||i===void 0||(s=i.options)===null||s===void 0?void 0:s.firstWeekContainsDate)!==null&&a!==void 0?a:u.firstWeekContainsDate)!==null&&r!==void 0?r:(l=u.locale)===null||l===void 0||(c=l.options)===null||c===void 0?void 0:c.firstWeekContainsDate)!==null&&n!==void 0?n:1),g=e8(e,t),m=new Date(0);m.setUTCFullYear(g,0,d),m.setUTCHours(0,0,0,0);var b=Fg(m,t);return b}var pne=6048e5;function gne(e,t){Un(1,arguments);var n=Wa(e),r=Fg(n,t).getTime()-fne(n,t).getTime();return Math.round(r/pne)+1}function bt(e,t){for(var n=e<0?"-":"",r=Math.abs(e).toString();r.length0?r:1-r;return bt(n==="yy"?a%100:a,n.length)},M:function(t,n){var r=t.getUTCMonth();return n==="M"?String(r+1):bt(r+1,2)},d:function(t,n){return bt(t.getUTCDate(),n.length)},a:function(t,n){var r=t.getUTCHours()/12>=1?"pm":"am";switch(n){case"a":case"aa":return r.toUpperCase();case"aaa":return r;case"aaaaa":return r[0];case"aaaa":default:return r==="am"?"a.m.":"p.m."}},h:function(t,n){return bt(t.getUTCHours()%12||12,n.length)},H:function(t,n){return bt(t.getUTCHours(),n.length)},m:function(t,n){return bt(t.getUTCMinutes(),n.length)},s:function(t,n){return bt(t.getUTCSeconds(),n.length)},S:function(t,n){var r=n.length,a=t.getUTCMilliseconds(),o=Math.floor(a*Math.pow(10,r-3));return bt(o,n.length)}};const Po=mne;var tl={am:"am",pm:"pm",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},hne={G:function(t,n,r){var a=t.getUTCFullYear()>0?1:0;switch(n){case"G":case"GG":case"GGG":return r.era(a,{width:"abbreviated"});case"GGGGG":return r.era(a,{width:"narrow"});case"GGGG":default:return r.era(a,{width:"wide"})}},y:function(t,n,r){if(n==="yo"){var a=t.getUTCFullYear(),o=a>0?a:1-a;return r.ordinalNumber(o,{unit:"year"})}return Po.y(t,n)},Y:function(t,n,r,a){var o=e8(t,a),i=o>0?o:1-o;if(n==="YY"){var s=i%100;return bt(s,2)}return n==="Yo"?r.ordinalNumber(i,{unit:"year"}):bt(i,n.length)},R:function(t,n){var r=J7(t);return bt(r,n.length)},u:function(t,n){var r=t.getUTCFullYear();return bt(r,n.length)},Q:function(t,n,r){var a=Math.ceil((t.getUTCMonth()+1)/3);switch(n){case"Q":return String(a);case"QQ":return bt(a,2);case"Qo":return r.ordinalNumber(a,{unit:"quarter"});case"QQQ":return r.quarter(a,{width:"abbreviated",context:"formatting"});case"QQQQQ":return r.quarter(a,{width:"narrow",context:"formatting"});case"QQQQ":default:return r.quarter(a,{width:"wide",context:"formatting"})}},q:function(t,n,r){var a=Math.ceil((t.getUTCMonth()+1)/3);switch(n){case"q":return String(a);case"qq":return bt(a,2);case"qo":return r.ordinalNumber(a,{unit:"quarter"});case"qqq":return r.quarter(a,{width:"abbreviated",context:"standalone"});case"qqqqq":return r.quarter(a,{width:"narrow",context:"standalone"});case"qqqq":default:return r.quarter(a,{width:"wide",context:"standalone"})}},M:function(t,n,r){var a=t.getUTCMonth();switch(n){case"M":case"MM":return Po.M(t,n);case"Mo":return r.ordinalNumber(a+1,{unit:"month"});case"MMM":return r.month(a,{width:"abbreviated",context:"formatting"});case"MMMMM":return r.month(a,{width:"narrow",context:"formatting"});case"MMMM":default:return r.month(a,{width:"wide",context:"formatting"})}},L:function(t,n,r){var a=t.getUTCMonth();switch(n){case"L":return String(a+1);case"LL":return bt(a+1,2);case"Lo":return r.ordinalNumber(a+1,{unit:"month"});case"LLL":return r.month(a,{width:"abbreviated",context:"standalone"});case"LLLLL":return r.month(a,{width:"narrow",context:"standalone"});case"LLLL":default:return r.month(a,{width:"wide",context:"standalone"})}},w:function(t,n,r,a){var o=gne(t,a);return n==="wo"?r.ordinalNumber(o,{unit:"week"}):bt(o,n.length)},I:function(t,n,r){var a=dne(t);return n==="Io"?r.ordinalNumber(a,{unit:"week"}):bt(a,n.length)},d:function(t,n,r){return n==="do"?r.ordinalNumber(t.getUTCDate(),{unit:"date"}):Po.d(t,n)},D:function(t,n,r){var a=lne(t);return n==="Do"?r.ordinalNumber(a,{unit:"dayOfYear"}):bt(a,n.length)},E:function(t,n,r){var a=t.getUTCDay();switch(n){case"E":case"EE":case"EEE":return r.day(a,{width:"abbreviated",context:"formatting"});case"EEEEE":return r.day(a,{width:"narrow",context:"formatting"});case"EEEEEE":return r.day(a,{width:"short",context:"formatting"});case"EEEE":default:return r.day(a,{width:"wide",context:"formatting"})}},e:function(t,n,r,a){var o=t.getUTCDay(),i=(o-a.weekStartsOn+8)%7||7;switch(n){case"e":return String(i);case"ee":return bt(i,2);case"eo":return r.ordinalNumber(i,{unit:"day"});case"eee":return r.day(o,{width:"abbreviated",context:"formatting"});case"eeeee":return r.day(o,{width:"narrow",context:"formatting"});case"eeeeee":return r.day(o,{width:"short",context:"formatting"});case"eeee":default:return r.day(o,{width:"wide",context:"formatting"})}},c:function(t,n,r,a){var o=t.getUTCDay(),i=(o-a.weekStartsOn+8)%7||7;switch(n){case"c":return String(i);case"cc":return bt(i,n.length);case"co":return r.ordinalNumber(i,{unit:"day"});case"ccc":return r.day(o,{width:"abbreviated",context:"standalone"});case"ccccc":return r.day(o,{width:"narrow",context:"standalone"});case"cccccc":return r.day(o,{width:"short",context:"standalone"});case"cccc":default:return r.day(o,{width:"wide",context:"standalone"})}},i:function(t,n,r){var a=t.getUTCDay(),o=a===0?7:a;switch(n){case"i":return String(o);case"ii":return bt(o,n.length);case"io":return r.ordinalNumber(o,{unit:"day"});case"iii":return r.day(a,{width:"abbreviated",context:"formatting"});case"iiiii":return r.day(a,{width:"narrow",context:"formatting"});case"iiiiii":return r.day(a,{width:"short",context:"formatting"});case"iiii":default:return r.day(a,{width:"wide",context:"formatting"})}},a:function(t,n,r){var a=t.getUTCHours(),o=a/12>=1?"pm":"am";switch(n){case"a":case"aa":return r.dayPeriod(o,{width:"abbreviated",context:"formatting"});case"aaa":return r.dayPeriod(o,{width:"abbreviated",context:"formatting"}).toLowerCase();case"aaaaa":return r.dayPeriod(o,{width:"narrow",context:"formatting"});case"aaaa":default:return r.dayPeriod(o,{width:"wide",context:"formatting"})}},b:function(t,n,r){var a=t.getUTCHours(),o;switch(a===12?o=tl.noon:a===0?o=tl.midnight:o=a/12>=1?"pm":"am",n){case"b":case"bb":return r.dayPeriod(o,{width:"abbreviated",context:"formatting"});case"bbb":return r.dayPeriod(o,{width:"abbreviated",context:"formatting"}).toLowerCase();case"bbbbb":return r.dayPeriod(o,{width:"narrow",context:"formatting"});case"bbbb":default:return r.dayPeriod(o,{width:"wide",context:"formatting"})}},B:function(t,n,r){var a=t.getUTCHours(),o;switch(a>=17?o=tl.evening:a>=12?o=tl.afternoon:a>=4?o=tl.morning:o=tl.night,n){case"B":case"BB":case"BBB":return r.dayPeriod(o,{width:"abbreviated",context:"formatting"});case"BBBBB":return r.dayPeriod(o,{width:"narrow",context:"formatting"});case"BBBB":default:return r.dayPeriod(o,{width:"wide",context:"formatting"})}},h:function(t,n,r){if(n==="ho"){var a=t.getUTCHours()%12;return a===0&&(a=12),r.ordinalNumber(a,{unit:"hour"})}return Po.h(t,n)},H:function(t,n,r){return n==="Ho"?r.ordinalNumber(t.getUTCHours(),{unit:"hour"}):Po.H(t,n)},K:function(t,n,r){var a=t.getUTCHours()%12;return n==="Ko"?r.ordinalNumber(a,{unit:"hour"}):bt(a,n.length)},k:function(t,n,r){var a=t.getUTCHours();return a===0&&(a=24),n==="ko"?r.ordinalNumber(a,{unit:"hour"}):bt(a,n.length)},m:function(t,n,r){return n==="mo"?r.ordinalNumber(t.getUTCMinutes(),{unit:"minute"}):Po.m(t,n)},s:function(t,n,r){return n==="so"?r.ordinalNumber(t.getUTCSeconds(),{unit:"second"}):Po.s(t,n)},S:function(t,n){return Po.S(t,n)},X:function(t,n,r,a){var o=a._originalDate||t,i=o.getTimezoneOffset();if(i===0)return"Z";switch(n){case"X":return z2(i);case"XXXX":case"XX":return Ki(i);case"XXXXX":case"XXX":default:return Ki(i,":")}},x:function(t,n,r,a){var o=a._originalDate||t,i=o.getTimezoneOffset();switch(n){case"x":return z2(i);case"xxxx":case"xx":return Ki(i);case"xxxxx":case"xxx":default:return Ki(i,":")}},O:function(t,n,r,a){var o=a._originalDate||t,i=o.getTimezoneOffset();switch(n){case"O":case"OO":case"OOO":return"GMT"+j2(i,":");case"OOOO":default:return"GMT"+Ki(i,":")}},z:function(t,n,r,a){var o=a._originalDate||t,i=o.getTimezoneOffset();switch(n){case"z":case"zz":case"zzz":return"GMT"+j2(i,":");case"zzzz":default:return"GMT"+Ki(i,":")}},t:function(t,n,r,a){var o=a._originalDate||t,i=Math.floor(o.getTime()/1e3);return bt(i,n.length)},T:function(t,n,r,a){var o=a._originalDate||t,i=o.getTime();return bt(i,n.length)}};function j2(e,t){var n=e>0?"-":"+",r=Math.abs(e),a=Math.floor(r/60),o=r%60;if(o===0)return n+String(a);var i=t||"";return n+String(a)+i+bt(o,2)}function z2(e,t){if(e%60===0){var n=e>0?"-":"+";return n+bt(Math.abs(e)/60,2)}return Ki(e,t)}function Ki(e,t){var n=t||"",r=e>0?"-":"+",a=Math.abs(e),o=bt(Math.floor(a/60),2),i=bt(a%60,2);return r+o+n+i}const bne=hne;var U2=function(t,n){switch(t){case"P":return n.date({width:"short"});case"PP":return n.date({width:"medium"});case"PPP":return n.date({width:"long"});case"PPPP":default:return n.date({width:"full"})}},t8=function(t,n){switch(t){case"p":return n.time({width:"short"});case"pp":return n.time({width:"medium"});case"ppp":return n.time({width:"long"});case"pppp":default:return n.time({width:"full"})}},yne=function(t,n){var r=t.match(/(P+)(p+)?/)||[],a=r[1],o=r[2];if(!o)return U2(t,n);var i;switch(a){case"P":i=n.dateTime({width:"short"});break;case"PP":i=n.dateTime({width:"medium"});break;case"PPP":i=n.dateTime({width:"long"});break;case"PPPP":default:i=n.dateTime({width:"full"});break}return i.replace("{{date}}",U2(a,n)).replace("{{time}}",t8(o,n))},vne={p:t8,P:yne};const Sne=vne;var wne=["D","DD"],Ene=["YY","YYYY"];function xne(e){return wne.indexOf(e)!==-1}function kne(e){return Ene.indexOf(e)!==-1}function B2(e,t,n){if(e==="YYYY")throw new RangeError("Use `yyyy` instead of `YYYY` (in `".concat(t,"`) for formatting years to the input `").concat(n,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));if(e==="YY")throw new RangeError("Use `yy` instead of `YY` (in `".concat(t,"`) for formatting years to the input `").concat(n,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));if(e==="D")throw new RangeError("Use `d` instead of `D` (in `".concat(t,"`) for formatting days of the month to the input `").concat(n,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));if(e==="DD")throw new RangeError("Use `dd` instead of `DD` (in `".concat(t,"`) for formatting days of the month to the input `").concat(n,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"))}var Cne={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}},_ne=function(t,n,r){var a,o=Cne[t];return typeof o=="string"?a=o:n===1?a=o.one:a=o.other.replace("{{count}}",n.toString()),r!=null&&r.addSuffix?r.comparison&&r.comparison>0?"in "+a:a+" ago":a};const Ane=_ne;function qb(e){return function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},n=t.width?String(t.width):e.defaultWidth,r=e.formats[n]||e.formats[e.defaultWidth];return r}}var Tne={full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},Rne={full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},Nne={full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},Ine={date:qb({formats:Tne,defaultWidth:"full"}),time:qb({formats:Rne,defaultWidth:"full"}),dateTime:qb({formats:Nne,defaultWidth:"full"})};const One=Ine;var Dne={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"},Lne=function(t,n,r,a){return Dne[t]};const Mne=Lne;function uu(e){return function(t,n){var r=n!=null&&n.context?String(n.context):"standalone",a;if(r==="formatting"&&e.formattingValues){var o=e.defaultFormattingWidth||e.defaultWidth,i=n!=null&&n.width?String(n.width):o;a=e.formattingValues[i]||e.formattingValues[o]}else{var s=e.defaultWidth,l=n!=null&&n.width?String(n.width):e.defaultWidth;a=e.values[l]||e.values[s]}var c=e.argumentCallback?e.argumentCallback(t):t;return a[c]}}var Pne={narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},$ne={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},Fne={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},jne={narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},zne={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},Une={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},Bne=function(t,n){var r=Number(t),a=r%100;if(a>20||a<10)switch(a%10){case 1:return r+"st";case 2:return r+"nd";case 3:return r+"rd"}return r+"th"},Hne={ordinalNumber:Bne,era:uu({values:Pne,defaultWidth:"wide"}),quarter:uu({values:$ne,defaultWidth:"wide",argumentCallback:function(t){return t-1}}),month:uu({values:Fne,defaultWidth:"wide"}),day:uu({values:jne,defaultWidth:"wide"}),dayPeriod:uu({values:zne,defaultWidth:"wide",formattingValues:Une,defaultFormattingWidth:"wide"})};const Vne=Hne;function du(e){return function(t){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},r=n.width,a=r&&e.matchPatterns[r]||e.matchPatterns[e.defaultMatchWidth],o=t.match(a);if(!o)return null;var i=o[0],s=r&&e.parsePatterns[r]||e.parsePatterns[e.defaultParseWidth],l=Array.isArray(s)?Gne(s,function(d){return d.test(i)}):qne(s,function(d){return d.test(i)}),c;c=e.valueCallback?e.valueCallback(l):l,c=n.valueCallback?n.valueCallback(c):c;var u=t.slice(i.length);return{value:c,rest:u}}}function qne(e,t){for(var n in e)if(e.hasOwnProperty(n)&&t(e[n]))return n}function Gne(e,t){for(var n=0;n1&&arguments[1]!==void 0?arguments[1]:{},r=t.match(e.matchPattern);if(!r)return null;var a=r[0],o=t.match(e.parsePattern);if(!o)return null;var i=e.valueCallback?e.valueCallback(o[0]):o[0];i=n.valueCallback?n.valueCallback(i):i;var s=t.slice(a.length);return{value:i,rest:s}}}var Kne=/^(\d+)(th|st|nd|rd)?/i,Yne=/\d+/i,Zne={narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},Xne={any:[/^b/i,/^(a|c)/i]},Qne={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},Jne={any:[/1/i,/2/i,/3/i,/4/i]},ere={narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},tre={narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},nre={narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},rre={narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},are={narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},ore={any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},ire={ordinalNumber:Wne({matchPattern:Kne,parsePattern:Yne,valueCallback:function(t){return parseInt(t,10)}}),era:du({matchPatterns:Zne,defaultMatchWidth:"wide",parsePatterns:Xne,defaultParseWidth:"any"}),quarter:du({matchPatterns:Qne,defaultMatchWidth:"wide",parsePatterns:Jne,defaultParseWidth:"any",valueCallback:function(t){return t+1}}),month:du({matchPatterns:ere,defaultMatchWidth:"wide",parsePatterns:tre,defaultParseWidth:"any"}),day:du({matchPatterns:nre,defaultMatchWidth:"wide",parsePatterns:rre,defaultParseWidth:"any"}),dayPeriod:du({matchPatterns:are,defaultMatchWidth:"any",parsePatterns:ore,defaultParseWidth:"any"})};const sre=ire;var lre={code:"en-US",formatDistance:Ane,formatLong:One,formatRelative:Mne,localize:Vne,match:sre,options:{weekStartsOn:0,firstWeekContainsDate:1}};const cre=lre;var ure=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,dre=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,fre=/^'([^]*?)'?$/,pre=/''/g,gre=/[a-zA-Z]/;function Bs(e,t,n){var r,a,o,i,s,l,c,u,d,g,m,b,y,w,v,h,S,E;Un(2,arguments);var k=String(t),x=fh(),C=(r=(a=n==null?void 0:n.locale)!==null&&a!==void 0?a:x.locale)!==null&&r!==void 0?r:cre,_=_i((o=(i=(s=(l=n==null?void 0:n.firstWeekContainsDate)!==null&&l!==void 0?l:n==null||(c=n.locale)===null||c===void 0||(u=c.options)===null||u===void 0?void 0:u.firstWeekContainsDate)!==null&&s!==void 0?s:x.firstWeekContainsDate)!==null&&i!==void 0?i:(d=x.locale)===null||d===void 0||(g=d.options)===null||g===void 0?void 0:g.firstWeekContainsDate)!==null&&o!==void 0?o:1);if(!(_>=1&&_<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var R=_i((m=(b=(y=(w=n==null?void 0:n.weekStartsOn)!==null&&w!==void 0?w:n==null||(v=n.locale)===null||v===void 0||(h=v.options)===null||h===void 0?void 0:h.weekStartsOn)!==null&&y!==void 0?y:x.weekStartsOn)!==null&&b!==void 0?b:(S=x.locale)===null||S===void 0||(E=S.options)===null||E===void 0?void 0:E.weekStartsOn)!==null&&m!==void 0?m:0);if(!(R>=0&&R<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");if(!C.localize)throw new RangeError("locale must contain localize property");if(!C.formatLong)throw new RangeError("locale must contain formatLong property");var T=Wa(e);if(!one(T))throw new RangeError("Invalid time value");var L=rne(T),D=ine(T,L),H={firstWeekContainsDate:_,weekStartsOn:R,locale:C,_originalDate:T},z=k.match(dre).map(function(M){var U=M[0];if(U==="p"||U==="P"){var X=Sne[U];return X(M,C.formatLong)}return M}).join("").match(ure).map(function(M){if(M==="''")return"'";var U=M[0];if(U==="'")return mre(M);var X=bne[U];if(X)return!(n!=null&&n.useAdditionalWeekYearTokens)&&kne(M)&&B2(M,t,String(e)),!(n!=null&&n.useAdditionalDayOfYearTokens)&&xne(M)&&B2(M,t,String(e)),X(D,M,C.localize,H);if(U.match(gre))throw new RangeError("Format string contains an unescaped latin alphabet character `"+U+"`");return M}).join("");return z}function mre(e){var t=e.match(fre);return t?t[1].replace(pre,"'"):e}function sk(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n2)return t;if(/:/.test(n[0])?r=n[0]:(t.date=n[0],r=n[1],sp.timeZoneDelimiter.test(t.date)&&(t.date=e.split(sp.timeZoneDelimiter)[0],r=e.substr(t.date.length,e.length))),r){var a=sp.timezone.exec(r);a?(t.time=r.replace(a[1],""),t.timezone=a[1]):t.time=r}return t}function kre(e,t){var n=new RegExp("^(?:(\\d{4}|[+-]\\d{"+(4+t)+"})|(\\d{2}|[+-]\\d{"+(2+t)+"})$)"),r=e.match(n);if(!r)return{year:NaN,restDateString:""};var a=r[1]?parseInt(r[1]):null,o=r[2]?parseInt(r[2]):null;return{year:o===null?a:o*100,restDateString:e.slice((r[1]||r[2]).length)}}function Cre(e,t){if(t===null)return new Date(NaN);var n=e.match(Sre);if(!n)return new Date(NaN);var r=!!n[4],a=fu(n[1]),o=fu(n[2])-1,i=fu(n[3]),s=fu(n[4]),l=fu(n[5])-1;if(r)return Ore(t,s,l)?Tre(t,s,l):new Date(NaN);var c=new Date(0);return!Nre(t,o,i)||!Ire(t,a)?new Date(NaN):(c.setUTCFullYear(t,o,Math.max(a,i)),c)}function fu(e){return e?parseInt(e):1}function _re(e){var t=e.match(wre);if(!t)return NaN;var n=Gb(t[1]),r=Gb(t[2]),a=Gb(t[3]);return Dre(n,r,a)?n*Q7+r*X7+a*1e3:NaN}function Gb(e){return e&&parseFloat(e.replace(",","."))||0}function Are(e){if(e==="Z")return 0;var t=e.match(Ere);if(!t)return 0;var n=t[1]==="+"?-1:1,r=parseInt(t[2]),a=t[3]&&parseInt(t[3])||0;return Lre(r,a)?n*(r*Q7+a*X7):NaN}function Tre(e,t,n){var r=new Date(0);r.setUTCFullYear(e,0,4);var a=r.getUTCDay()||7,o=(t-1)*7+n+1-a;return r.setUTCDate(r.getUTCDate()+o),r}var Rre=[31,null,31,30,31,30,31,31,30,31,30,31];function r8(e){return e%400===0||e%4===0&&e%100!==0}function Nre(e,t,n){return t>=0&&t<=11&&n>=1&&n<=(Rre[t]||(r8(e)?29:28))}function Ire(e,t){return t>=1&&t<=(r8(e)?366:365)}function Ore(e,t,n){return t>=1&&t<=53&&n>=0&&n<=6}function Dre(e,t,n){return e===24?t===0&&n===0:n>=0&&n<60&&t>=0&&t<60&&e>=0&&e<25}function Lre(e,t){return t>=0&&t<=59}const Mre=(e,t,n="Never")=>{const r=e.getValue(t);return r?Bs(new Date(r),"MMM dd, yyyy"):n},Dn=({isLoading:e,children:t})=>e?f.jsx(Pi,{className:"h-6 w-full"}):t,_n=p.forwardRef(({className:e,type:t,...n},r)=>f.jsx("input",{type:t,className:ee("flex h-10 w-full rounded-md border border-input bg-background-lighter px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),ref:r,...n}));_n.displayName="Input";const Pre=({value:e,onValueChange:t})=>f.jsx("form",{children:f.jsxs("div",{className:"relative",children:[f.jsx(Ms,{className:"pointer-events-none absolute left-[12px] top-3 h-4 w-4 text-muted-foreground"}),f.jsx(_n,{placeholder:"Search",value:e,onChange:n=>t(n.target.value),className:"w-52 pl-8 lg:w-80"})]})}),zi=({isLoading:e,children:t})=>e?f.jsx(Pi,{className:"h-6 w-full"}):t,H2=(e,t)=>{const n=e.getValue(t);return n?Bs(new Date(n),"MMM dd, yyyy"):"Never"},$re=(e,t)=>[{accessorKey:"name",header:"Agent Name",cell:({row:n})=>f.jsx(zi,{isLoading:t,children:n.getValue("name")})},{accessorFn:n=>{var r,a;return((a=(r=n.memory)==null?void 0:r.memory)==null?void 0:a.recall_memory)??0},accessorKey:"messages",header:()=>f.jsx(Zf,{children:f.jsx(EX,{className:"h-5 w-5"})}),cell:({row:n})=>f.jsx(zi,{isLoading:t,children:f.jsx("div",{className:" text-center tabular-nums",children:n.getValue("messages")??0})})},{accessorFn:n=>{var r,a;return((a=(r=n.memory)==null?void 0:r.memory)==null?void 0:a.archival_memory)??0},accessorKey:"memories",header:()=>f.jsx(Zf,{children:f.jsx(wX,{className:"h-5 w-5"})}),cell:({row:n})=>f.jsx(zi,{isLoading:t,children:f.jsx("div",{className:"text-center tabular-nums",children:n.getValue("memories")??0})})},{accessorFn:n=>0,accessorKey:"sources",header:()=>f.jsx(Zf,{children:f.jsx(xX,{className:"h-5 w-4"})}),cell:({row:n})=>f.jsx(zi,{isLoading:t,children:f.jsx("div",{className:"text-center tabular-nums",children:n.getValue("sources")??0})})},{accessorFn:n=>n.tools.length,accessorKey:"tools",header:()=>f.jsx(Zf,{className:"justify-center",children:f.jsx(kX,{className:"h-5 w-5"})}),cell:({row:n})=>f.jsx(zi,{isLoading:t,children:f.jsx("div",{className:"text-center tabular-nums",children:n.getValue("tools")??0})})},{accessorKey:"last_run",header:"Last Run",cell:({row:n})=>f.jsx(zi,{isLoading:t,children:H2(n,"last_run")})},{accessorKey:"created_at",header:"Lifespan",cell:({row:n})=>f.jsx(zi,{isLoading:t,children:H2(n,"created_at")})},{accessorKey:"chat",header:"",cell:({row:n})=>t?f.jsx(Pi,{className:"h-6 w-6"}):f.jsxs("div",{className:"flex",children:[f.jsx(ue,{onClick:()=>e(n.original),className:"rounded-lg px-3 py-1",variant:"outline",children:"Chat"}),f.jsx(ue,{variant:"ghost",onClick:()=>n.toggleExpanded(),children:n.getIsExpanded()?f.jsx(vX,{className:"h-4 w-4 text-muted-foreground"}):f.jsx(yX,{className:"h-4 w-4 text-muted-foreground"})})]})}],U_=rf(Vm((e,t)=>({currentAgent:null,lastAgentInitMessage:null,actions:{setAgent:n=>e({currentAgent:n}),setLastAgentInitMessage:n=>e(r=>({...r,lastAgentInitMessage:n})),removeAgent:()=>e(n=>({...n,currentAgent:null}))}}),{name:"agent-storage",partialize:({actions:e,...t})=>t})),To=()=>U_(e=>e.currentAgent),Fre=()=>U_(e=>e.lastAgentInitMessage),ph=()=>U_(e=>e.actions);function jre({setShowingAgentCreation:e}){return f.jsxs("div",{className:"flex h-full flex-col items-center justify-center gap-3",children:[f.jsx("h2",{className:"font-semibold",children:"Create your first agent"}),f.jsxs(ue,{size:"sm",onClick:()=>e(!0),children:[f.jsx(ya,{className:"mr-2 h-4 w-4"}),"Create Agent"]})]})}const zre=e=>{const{agent:t}=e,n=p.useMemo(()=>{var o;return Object.values(((o=t.memory)==null?void 0:o.memory)||{})},[t]),r=p.useMemo(()=>{var o;return((o=n.find(i=>i.label==="persona"))==null?void 0:o.name)??"Not set"},[t]),a=p.useMemo(()=>{var o;return((o=n.find(i=>i.label==="human"))==null?void 0:o.name)??"Not set"},[t]);return f.jsxs("div",{className:"flex flex-col",children:[f.jsxs("div",{className:"flex gap-4 border-b-[1px] py-3",children:[f.jsxs("div",{className:"flex gap-3 text-muted-foreground",children:[f.jsx(bX,{className:"h-4 w-5"}),f.jsx("h6",{children:"Agent Persona"})]}),f.jsx("p",{children:r})]}),f.jsxs("div",{className:"flex gap-4 py-3",children:[f.jsxs("div",{className:"flex gap-3 text-muted-foreground",children:[f.jsx(SX,{className:"h-4 w-5"}),f.jsx("h6",{children:"Human Persona"})]}),f.jsx("p",{children:a})]})]})},Ure=({className:e,setShowingAgentCreation:t})=>{const[n,r]=p.useState(""),{setAgent:a}=ph(),{data:o,isSuccess:i,isError:s,isLoading:l}=Qm({userId:void 0},void 0,{retry:!1}),c=p.useMemo(()=>i?o==null?void 0:o.filter(g=>g.name.toLowerCase().includes(n.toLowerCase())):[],[o,i,n]),u=Mi(),d=g=>{a(g),u(`${g.name}/chat`,{relative:"path"})};return f.jsxs(f.Fragment,{children:[f.jsx("div",{className:"flex items-center justify-between bg-background/95 px-4 pb-3 pt-2.5 backdrop-blur supports-[backdrop-filter]:bg-background/60",children:f.jsx(Pre,{value:n,onValueChange:r})}),f.jsx("div",{className:e,children:!l&&c.length===0?f.jsx(jre,{setShowingAgentCreation:t}):f.jsx(uf,{columns:$re(d,!1),isLoading:l,data:c,error:s?"There was an error loading the agents. Please try again later":void 0,renderPagination:g=>f.jsx(df,{className:"mt-4",table:g}),expandedRowsContent:g=>f.jsx(zre,{agent:c[g]})})})]})},a8="Dialog",[o8,i8]=zn(a8),[Bre,va]=o8(a8),Hre=e=>{const{__scopeDialog:t,children:n,open:r,defaultOpen:a,onOpenChange:o,modal:i=!0}=e,s=p.useRef(null),l=p.useRef(null),[c=!1,u]=Fa({prop:r,defaultProp:a,onChange:o});return p.createElement(Bre,{scope:t,triggerRef:s,contentRef:l,contentId:bi(),titleId:bi(),descriptionId:bi(),open:c,onOpenChange:u,onOpenToggle:p.useCallback(()=>u(d=>!d),[u]),modal:i},n)},Vre="DialogTrigger",qre=p.forwardRef((e,t)=>{const{__scopeDialog:n,...r}=e,a=va(Vre,n),o=nt(t,a.triggerRef);return p.createElement(ze.button,W({type:"button","aria-haspopup":"dialog","aria-expanded":a.open,"aria-controls":a.contentId,"data-state":B_(a.open)},r,{ref:o,onClick:fe(e.onClick,a.onOpenToggle)}))}),s8="DialogPortal",[Gre,l8]=o8(s8,{forceMount:void 0}),Wre=e=>{const{__scopeDialog:t,forceMount:n,children:r,container:a}=e,o=va(s8,t);return p.createElement(Gre,{scope:t,forceMount:n},p.Children.map(r,i=>p.createElement(pr,{present:n||o.open},p.createElement(Jd,{asChild:!0,container:a},i))))},lk="DialogOverlay",Kre=p.forwardRef((e,t)=>{const n=l8(lk,e.__scopeDialog),{forceMount:r=n.forceMount,...a}=e,o=va(lk,e.__scopeDialog);return o.modal?p.createElement(pr,{present:r||o.open},p.createElement(Yre,W({},a,{ref:t}))):null}),Yre=p.forwardRef((e,t)=>{const{__scopeDialog:n,...r}=e,a=va(lk,n);return p.createElement(sh,{as:$a,allowPinchZoom:!0,shards:[a.contentRef]},p.createElement(ze.div,W({"data-state":B_(a.open)},r,{ref:t,style:{pointerEvents:"auto",...r.style}})))}),wc="DialogContent",Zre=p.forwardRef((e,t)=>{const n=l8(wc,e.__scopeDialog),{forceMount:r=n.forceMount,...a}=e,o=va(wc,e.__scopeDialog);return p.createElement(pr,{present:r||o.open},o.modal?p.createElement(Xre,W({},a,{ref:t})):p.createElement(Qre,W({},a,{ref:t})))}),Xre=p.forwardRef((e,t)=>{const n=va(wc,e.__scopeDialog),r=p.useRef(null),a=nt(t,n.contentRef,r);return p.useEffect(()=>{const o=r.current;if(o)return mf(o)},[]),p.createElement(c8,W({},e,{ref:a,trapFocus:n.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:fe(e.onCloseAutoFocus,o=>{var i;o.preventDefault(),(i=n.triggerRef.current)===null||i===void 0||i.focus()}),onPointerDownOutside:fe(e.onPointerDownOutside,o=>{const i=o.detail.originalEvent,s=i.button===0&&i.ctrlKey===!0;(i.button===2||s)&&o.preventDefault()}),onFocusOutside:fe(e.onFocusOutside,o=>o.preventDefault())}))}),Qre=p.forwardRef((e,t)=>{const n=va(wc,e.__scopeDialog),r=p.useRef(!1),a=p.useRef(!1);return p.createElement(c8,W({},e,{ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:o=>{var i;if((i=e.onCloseAutoFocus)===null||i===void 0||i.call(e,o),!o.defaultPrevented){var s;r.current||(s=n.triggerRef.current)===null||s===void 0||s.focus(),o.preventDefault()}r.current=!1,a.current=!1},onInteractOutside:o=>{var i,s;(i=e.onInteractOutside)===null||i===void 0||i.call(e,o),o.defaultPrevented||(r.current=!0,o.detail.originalEvent.type==="pointerdown"&&(a.current=!0));const l=o.target;((s=n.triggerRef.current)===null||s===void 0?void 0:s.contains(l))&&o.preventDefault(),o.detail.originalEvent.type==="focusin"&&a.current&&o.preventDefault()}}))}),c8=p.forwardRef((e,t)=>{const{__scopeDialog:n,trapFocus:r,onOpenAutoFocus:a,onCloseAutoFocus:o,...i}=e,s=va(wc,n),l=p.useRef(null),c=nt(t,l);return eh(),p.createElement(p.Fragment,null,p.createElement(th,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:a,onUnmountAutoFocus:o},p.createElement(Ls,W({role:"dialog",id:s.contentId,"aria-describedby":s.descriptionId,"aria-labelledby":s.titleId,"data-state":B_(s.open)},i,{ref:c,onDismiss:()=>s.onOpenChange(!1)}))),!1)}),u8="DialogTitle",Jre=p.forwardRef((e,t)=>{const{__scopeDialog:n,...r}=e,a=va(u8,n);return p.createElement(ze.h2,W({id:a.titleId},r,{ref:t}))}),eae="DialogDescription",tae=p.forwardRef((e,t)=>{const{__scopeDialog:n,...r}=e,a=va(eae,n);return p.createElement(ze.p,W({id:a.descriptionId},r,{ref:t}))}),nae="DialogClose",rae=p.forwardRef((e,t)=>{const{__scopeDialog:n,...r}=e,a=va(nae,n);return p.createElement(ze.button,W({type:"button"},r,{ref:t,onClick:fe(e.onClick,()=>a.onOpenChange(!1))}))});function B_(e){return e?"open":"closed"}const aae="DialogTitleWarning",[oae,uTe]=RV(aae,{contentName:wc,titleName:u8,docsSlug:"dialog"}),d8=Hre,iae=qre,f8=Wre,H_=Kre,V_=Zre,q_=Jre,G_=tae,W_=rae,Kt=d8,sae=f8,p8=p.forwardRef(({className:e,...t},n)=>f.jsx(H_,{ref:n,className:ee("fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",e),...t}));p8.displayName=H_.displayName;const Ht=p.forwardRef(({className:e,children:t,hasCloseButton:n=!0,...r},a)=>f.jsxs(sae,{children:[f.jsx(p8,{}),f.jsxs(V_,{ref:a,className:ee("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg md:w-full",e),...r,children:[t,n?f.jsxs(W_,{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",children:[f.jsx(Di,{className:"h-4 w-4"}),f.jsx("span",{className:"sr-only",children:"Close"})]}):null]})]}));Ht.displayName=V_.displayName;const Pt=({className:e,...t})=>f.jsx("div",{className:ee("flex flex-col space-y-1.5 text-center sm:text-left",e),...t});Pt.displayName="DialogHeader";const g8=({className:e,...t})=>f.jsx("div",{className:ee("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",e),...t});g8.displayName="DialogFooter";const $t=p.forwardRef(({className:e,...t},n)=>f.jsx(q_,{ref:n,className:ee("text-lg font-semibold leading-none tracking-tight",e),...t}));$t.displayName=q_.displayName;const dn=p.forwardRef(({className:e,...t},n)=>f.jsx(G_,{ref:n,className:ee("text-sm text-muted-foreground",e),...t}));dn.displayName=G_.displayName;const lae=({open:e,onOpenChange:t,closeDialog:n})=>{const r=()=>{t(!1),n()};return f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Cancel Creating Agent"}),f.jsx(dn,{children:"Are you sure you want to cancel creating an Agent? All the information you worked on will be lost."})]}),f.jsxs("div",{className:"flex justify-end gap-4",children:[f.jsx(ue,{variant:"ghost",onClick:()=>t(!1),children:"No"}),f.jsx(ue,{onClick:r,children:"Yes"})]})]})})};var bf=e=>e.type==="checkbox",Nl=e=>e instanceof Date,Yn=e=>e==null;const m8=e=>typeof e=="object";var cn=e=>!Yn(e)&&!Array.isArray(e)&&m8(e)&&!Nl(e),h8=e=>cn(e)&&e.target?bf(e.target)?e.target.checked:e.target.value:e,cae=e=>e.substring(0,e.search(/\.\d+(\.|$)/))||e,b8=(e,t)=>e.has(cae(t)),uae=e=>{const t=e.constructor&&e.constructor.prototype;return cn(t)&&t.hasOwnProperty("isPrototypeOf")},K_=typeof window<"u"&&typeof window.HTMLElement<"u"&&typeof document<"u";function Ln(e){let t;const n=Array.isArray(e);if(e instanceof Date)t=new Date(e);else if(e instanceof Set)t=new Set(e);else if(!(K_&&(e instanceof Blob||e instanceof FileList))&&(n||cn(e)))if(t=n?[]:{},!n&&!uae(e))t=e;else for(const r in e)e.hasOwnProperty(r)&&(t[r]=Ln(e[r]));else return e;return t}var zc=e=>Array.isArray(e)?e.filter(Boolean):[],Ot=e=>e===void 0,ge=(e,t,n)=>{if(!t||!cn(e))return n;const r=zc(t.split(/[,[\].]+?/)).reduce((a,o)=>Yn(a)?a:a[o],e);return Ot(r)||r===e?Ot(e[t])?n:e[t]:r},si=e=>typeof e=="boolean";const jg={BLUR:"blur",FOCUS_OUT:"focusout",CHANGE:"change"},Hr={onBlur:"onBlur",onChange:"onChange",onSubmit:"onSubmit",onTouched:"onTouched",all:"all"},Ja={max:"max",min:"min",maxLength:"maxLength",minLength:"minLength",pattern:"pattern",required:"required",validate:"validate"},y8=Ae.createContext(null),Hs=()=>Ae.useContext(y8),dae=e=>{const{children:t,...n}=e;return Ae.createElement(y8.Provider,{value:n},t)};var v8=(e,t,n,r=!0)=>{const a={defaultValues:t._defaultValues};for(const o in e)Object.defineProperty(a,o,{get:()=>{const i=o;return t._proxyFormState[i]!==Hr.all&&(t._proxyFormState[i]=!r||Hr.all),n&&(n[i]=!0),e[i]}});return a},wr=e=>cn(e)&&!Object.keys(e).length,S8=(e,t,n,r)=>{n(e);const{name:a,...o}=e;return wr(o)||Object.keys(o).length>=Object.keys(t).length||Object.keys(o).find(i=>t[i]===(!r||Hr.all))},kr=e=>Array.isArray(e)?e:[e],w8=(e,t,n)=>!e||!t||e===t||kr(e).some(r=>r&&(n?r===t:r.startsWith(t)||t.startsWith(r)));function gh(e){const t=Ae.useRef(e);t.current=e,Ae.useEffect(()=>{const n=!e.disabled&&t.current.subject&&t.current.subject.subscribe({next:t.current.next});return()=>{n&&n.unsubscribe()}},[e.disabled])}function fae(e){const t=Hs(),{control:n=t.control,disabled:r,name:a,exact:o}=e||{},[i,s]=Ae.useState(n._formState),l=Ae.useRef(!0),c=Ae.useRef({isDirty:!1,isLoading:!1,dirtyFields:!1,touchedFields:!1,isValidating:!1,isValid:!1,errors:!1}),u=Ae.useRef(a);return u.current=a,gh({disabled:r,next:d=>l.current&&w8(u.current,d.name,o)&&S8(d,c.current,n._updateFormState)&&s({...n._formState,...d}),subject:n._subjects.state}),Ae.useEffect(()=>(l.current=!0,c.current.isValid&&n._updateValid(!0),()=>{l.current=!1}),[n]),v8(i,n,c.current,!1)}var Oa=e=>typeof e=="string",E8=(e,t,n,r,a)=>Oa(e)?(r&&t.watch.add(e),ge(n,e,a)):Array.isArray(e)?e.map(o=>(r&&t.watch.add(o),ge(n,o))):(r&&(t.watchAll=!0),n);function pae(e){const t=Hs(),{control:n=t.control,name:r,defaultValue:a,disabled:o,exact:i}=e||{},s=Ae.useRef(r);s.current=r,gh({disabled:o,subject:n._subjects.values,next:u=>{w8(s.current,u.name,i)&&c(Ln(E8(s.current,n._names,u.values||n._formValues,!1,a)))}});const[l,c]=Ae.useState(n._getWatch(r,a));return Ae.useEffect(()=>n._removeUnmounted()),l}var Y_=e=>/^\w*$/.test(e),x8=e=>zc(e.replace(/["|']|\]/g,"").split(/\.|\[/));function ht(e,t,n){let r=-1;const a=Y_(t)?[t]:x8(t),o=a.length,i=o-1;for(;++r{const u=a._options.shouldUnregister||o,d=(g,m)=>{const b=ge(a._fields,g);b&&(b._f.mount=m)};if(d(n,!0),u){const g=Ln(ge(a._options.defaultValues,n));ht(a._defaultValues,n,g),Ot(ge(a._formValues,n))&&ht(a._formValues,n,g)}return()=>{(i?u&&!a._state.action:u)?a.unregister(n):d(n,!1)}},[n,a,i,o]),Ae.useEffect(()=>{ge(a._fields,n)&&a._updateDisabledField({disabled:r,fields:a._fields,name:n})},[r,n,a]),{field:{name:n,value:s,...si(r)?{disabled:r}:{},onChange:Ae.useCallback(u=>c.current.onChange({target:{value:h8(u),name:n},type:jg.CHANGE}),[n]),onBlur:Ae.useCallback(()=>c.current.onBlur({target:{value:ge(a._formValues,n),name:n},type:jg.BLUR}),[n,a]),ref:u=>{const d=ge(a._fields,n);d&&u&&(d._f.ref={focus:()=>u.focus(),select:()=>u.select(),setCustomValidity:g=>u.setCustomValidity(g),reportValidity:()=>u.reportValidity()})}},formState:l,fieldState:Object.defineProperties({},{invalid:{enumerable:!0,get:()=>!!ge(l.errors,n)},isDirty:{enumerable:!0,get:()=>!!ge(l.dirtyFields,n)},isTouched:{enumerable:!0,get:()=>!!ge(l.touchedFields,n)},error:{enumerable:!0,get:()=>ge(l.errors,n)}})}}const mae=e=>e.render(gae(e));var k8=(e,t,n,r,a)=>t?{...n[e],types:{...n[e]&&n[e].types?n[e].types:{},[r]:a||!0}}:{};const zg=(e,t,n)=>{for(const r of n||Object.keys(e)){const a=ge(e,r);if(a){const{_f:o,...i}=a;if(o&&t(o.name)){if(o.ref.focus){o.ref.focus();break}else if(o.refs&&o.refs[0].focus){o.refs[0].focus();break}}else cn(i)&&zg(i,t)}}};var $o=()=>{const e=typeof performance>"u"?Date.now():performance.now()*1e3;return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{const n=(Math.random()*16+e)%16|0;return(t=="x"?n:n&3|8).toString(16)})},Wb=(e,t,n={})=>n.shouldFocus||Ot(n.shouldFocus)?n.focusName||`${e}.${Ot(n.focusIndex)?t:n.focusIndex}.`:"",ck=e=>({isOnSubmit:!e||e===Hr.onSubmit,isOnBlur:e===Hr.onBlur,isOnChange:e===Hr.onChange,isOnAll:e===Hr.all,isOnTouch:e===Hr.onTouched}),uk=(e,t,n)=>!n&&(t.watchAll||t.watch.has(e)||[...t.watch].some(r=>e.startsWith(r)&&/^\.\w+/.test(e.slice(r.length)))),C8=(e,t,n)=>{const r=zc(ge(e,n));return ht(r,"root",t[n]),ht(e,n,r),e},Z_=e=>e.type==="file",li=e=>typeof e=="function",Ug=e=>{if(!K_)return!1;const t=e?e.ownerDocument:0;return e instanceof(t&&t.defaultView?t.defaultView.HTMLElement:HTMLElement)},Gp=e=>Oa(e),X_=e=>e.type==="radio",Bg=e=>e instanceof RegExp;const V2={value:!1,isValid:!1},q2={value:!0,isValid:!0};var _8=e=>{if(Array.isArray(e)){if(e.length>1){const t=e.filter(n=>n&&n.checked&&!n.disabled).map(n=>n.value);return{value:t,isValid:!!t.length}}return e[0].checked&&!e[0].disabled?e[0].attributes&&!Ot(e[0].attributes.value)?Ot(e[0].value)||e[0].value===""?q2:{value:e[0].value,isValid:!0}:q2:V2}return V2};const G2={isValid:!1,value:null};var A8=e=>Array.isArray(e)?e.reduce((t,n)=>n&&n.checked&&!n.disabled?{isValid:!0,value:n.value}:t,G2):G2;function W2(e,t,n="validate"){if(Gp(e)||Array.isArray(e)&&e.every(Gp)||si(e)&&!e)return{type:n,message:Gp(e)?e:"",ref:t}}var nl=e=>cn(e)&&!Bg(e)?e:{value:e,message:""},dk=async(e,t,n,r,a)=>{const{ref:o,refs:i,required:s,maxLength:l,minLength:c,min:u,max:d,pattern:g,validate:m,name:b,valueAsNumber:y,mount:w,disabled:v}=e._f,h=ge(t,b);if(!w||v)return{};const S=i?i[0]:o,E=D=>{r&&S.reportValidity&&(S.setCustomValidity(si(D)?"":D||""),S.reportValidity())},k={},x=X_(o),C=bf(o),_=x||C,R=(y||Z_(o))&&Ot(o.value)&&Ot(h)||Ug(o)&&o.value===""||h===""||Array.isArray(h)&&!h.length,T=k8.bind(null,b,n,k),L=(D,H,z,M=Ja.maxLength,U=Ja.minLength)=>{const X=D?H:z;k[b]={type:D?M:U,message:X,ref:o,...T(D?M:U,X)}};if(a?!Array.isArray(h)||!h.length:s&&(!_&&(R||Yn(h))||si(h)&&!h||C&&!_8(i).isValid||x&&!A8(i).isValid)){const{value:D,message:H}=Gp(s)?{value:!!s,message:s}:nl(s);if(D&&(k[b]={type:Ja.required,message:H,ref:S,...T(Ja.required,H)},!n))return E(H),k}if(!R&&(!Yn(u)||!Yn(d))){let D,H;const z=nl(d),M=nl(u);if(!Yn(h)&&!isNaN(h)){const U=o.valueAsNumber||h&&+h;Yn(z.value)||(D=U>z.value),Yn(M.value)||(H=Unew Date(new Date().toDateString()+" "+A),j=o.type=="time",O=o.type=="week";Oa(z.value)&&h&&(D=j?X(h)>X(z.value):O?h>z.value:U>new Date(z.value)),Oa(M.value)&&h&&(H=j?X(h)+D.value,M=!Yn(H.value)&&h.length<+H.value;if((z||M)&&(L(z,D.message,H.message),!n))return E(k[b].message),k}if(g&&!R&&Oa(h)){const{value:D,message:H}=nl(g);if(Bg(D)&&!h.match(D)&&(k[b]={type:Ja.pattern,message:H,ref:o,...T(Ja.pattern,H)},!n))return E(H),k}if(m){if(li(m)){const D=await m(h,t),H=W2(D,S);if(H&&(k[b]={...H,...T(Ja.validate,H.message)},!n))return E(H.message),k}else if(cn(m)){let D={};for(const H in m){if(!wr(D)&&!n)break;const z=W2(await m[H](h,t),S,H);z&&(D={...z,...T(H,z.message)},E(z.message),n&&(k[b]=D))}if(!wr(D)&&(k[b]={ref:S,...D},!n))return k}}return E(!0),k};function Kb(e,t){return[...e,...kr(t)]}var Yb=e=>Array.isArray(e)?e.map(()=>{}):void 0;function Zb(e,t,n){return[...e.slice(0,t),...kr(n),...e.slice(t)]}var Xb=(e,t,n)=>Array.isArray(e)?(Ot(e[n])&&(e[n]=void 0),e.splice(n,0,e.splice(t,1)[0]),e):[];function Qb(e,t){return[...kr(t),...kr(e)]}function hae(e,t){let n=0;const r=[...e];for(const a of t)r.splice(a-n,1),n++;return zc(r).length?r:[]}var Jb=(e,t)=>Ot(t)?[]:hae(e,kr(t).sort((n,r)=>n-r)),ey=(e,t,n)=>{e[t]=[e[n],e[n]=e[t]][0]};function bae(e,t){const n=t.slice(0,-1).length;let r=0;for(;r(e[t]=n,e);function vae(e){const t=Hs(),{control:n=t.control,name:r,keyName:a="id",shouldUnregister:o}=e,[i,s]=Ae.useState(n._getFieldArray(r)),l=Ae.useRef(n._getFieldArray(r).map($o)),c=Ae.useRef(i),u=Ae.useRef(r),d=Ae.useRef(!1);u.current=r,c.current=i,n._names.array.add(r),e.rules&&n.register(r,e.rules),gh({next:({values:k,name:x})=>{if(x===u.current||!x){const C=ge(k,u.current);Array.isArray(C)&&(s(C),l.current=C.map($o))}},subject:n._subjects.array});const g=Ae.useCallback(k=>{d.current=!0,n._updateFieldArray(r,k)},[n,r]),m=(k,x)=>{const C=kr(Ln(k)),_=Kb(n._getFieldArray(r),C);n._names.focus=Wb(r,_.length-1,x),l.current=Kb(l.current,C.map($o)),g(_),s(_),n._updateFieldArray(r,_,Kb,{argA:Yb(k)})},b=(k,x)=>{const C=kr(Ln(k)),_=Qb(n._getFieldArray(r),C);n._names.focus=Wb(r,0,x),l.current=Qb(l.current,C.map($o)),g(_),s(_),n._updateFieldArray(r,_,Qb,{argA:Yb(k)})},y=k=>{const x=Jb(n._getFieldArray(r),k);l.current=Jb(l.current,k),g(x),s(x),n._updateFieldArray(r,x,Jb,{argA:k})},w=(k,x,C)=>{const _=kr(Ln(x)),R=Zb(n._getFieldArray(r),k,_);n._names.focus=Wb(r,k,C),l.current=Zb(l.current,k,_.map($o)),g(R),s(R),n._updateFieldArray(r,R,Zb,{argA:k,argB:Yb(x)})},v=(k,x)=>{const C=n._getFieldArray(r);ey(C,k,x),ey(l.current,k,x),g(C),s(C),n._updateFieldArray(r,C,ey,{argA:k,argB:x},!1)},h=(k,x)=>{const C=n._getFieldArray(r);Xb(C,k,x),Xb(l.current,k,x),g(C),s(C),n._updateFieldArray(r,C,Xb,{argA:k,argB:x},!1)},S=(k,x)=>{const C=Ln(x),_=K2(n._getFieldArray(r),k,C);l.current=[..._].map((R,T)=>!R||T===k?$o():l.current[T]),g(_),s([..._]),n._updateFieldArray(r,_,K2,{argA:k,argB:C},!0,!1)},E=k=>{const x=kr(Ln(k));l.current=x.map($o),g([...x]),s([...x]),n._updateFieldArray(r,[...x],C=>C,{},!0,!1)};return Ae.useEffect(()=>{if(n._state.action=!1,uk(r,n._names)&&n._subjects.state.next({...n._formState}),d.current&&(!ck(n._options.mode).isOnSubmit||n._formState.isSubmitted))if(n._options.resolver)n._executeSchema([r]).then(k=>{const x=ge(k.errors,r),C=ge(n._formState.errors,r);(C?!x&&C.type||x&&(C.type!==x.type||C.message!==x.message):x&&x.type)&&(x?ht(n._formState.errors,r,x):pn(n._formState.errors,r),n._subjects.state.next({errors:n._formState.errors}))});else{const k=ge(n._fields,r);k&&k._f&&dk(k,n._formValues,n._options.criteriaMode===Hr.all,n._options.shouldUseNativeValidation,!0).then(x=>!wr(x)&&n._subjects.state.next({errors:C8(n._formState.errors,x,r)}))}n._subjects.values.next({name:r,values:{...n._formValues}}),n._names.focus&&zg(n._fields,k=>!!k&&k.startsWith(n._names.focus||"")),n._names.focus="",n._updateValid(),d.current=!1},[i,r,n]),Ae.useEffect(()=>(!ge(n._formValues,r)&&n._updateFieldArray(r),()=>{(n._options.shouldUnregister||o)&&n.unregister(r)}),[r,n,a,o]),{swap:Ae.useCallback(v,[g,r,n]),move:Ae.useCallback(h,[g,r,n]),prepend:Ae.useCallback(b,[g,r,n]),append:Ae.useCallback(m,[g,r,n]),remove:Ae.useCallback(y,[g,r,n]),insert:Ae.useCallback(w,[g,r,n]),update:Ae.useCallback(S,[g,r,n]),replace:Ae.useCallback(E,[g,r,n]),fields:Ae.useMemo(()=>i.map((k,x)=>({...k,[a]:l.current[x]||$o()})),[i,a])}}function ty(){let e=[];return{get observers(){return e},next:a=>{for(const o of e)o.next&&o.next(a)},subscribe:a=>(e.push(a),{unsubscribe:()=>{e=e.filter(o=>o!==a)}}),unsubscribe:()=>{e=[]}}}var Hg=e=>Yn(e)||!m8(e);function as(e,t){if(Hg(e)||Hg(t))return e===t;if(Nl(e)&&Nl(t))return e.getTime()===t.getTime();const n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(const a of n){const o=e[a];if(!r.includes(a))return!1;if(a!=="ref"){const i=t[a];if(Nl(o)&&Nl(i)||cn(o)&&cn(i)||Array.isArray(o)&&Array.isArray(i)?!as(o,i):o!==i)return!1}}return!0}var T8=e=>e.type==="select-multiple",Sae=e=>X_(e)||bf(e),ny=e=>Ug(e)&&e.isConnected,R8=e=>{for(const t in e)if(li(e[t]))return!0;return!1};function Vg(e,t={}){const n=Array.isArray(e);if(cn(e)||n)for(const r in e)Array.isArray(e[r])||cn(e[r])&&!R8(e[r])?(t[r]=Array.isArray(e[r])?[]:{},Vg(e[r],t[r])):Yn(e[r])||(t[r]=!0);return t}function N8(e,t,n){const r=Array.isArray(e);if(cn(e)||r)for(const a in e)Array.isArray(e[a])||cn(e[a])&&!R8(e[a])?Ot(t)||Hg(n[a])?n[a]=Array.isArray(e[a])?Vg(e[a],[]):{...Vg(e[a])}:N8(e[a],Yn(t)?{}:t[a],n[a]):n[a]=!as(e[a],t[a]);return n}var ry=(e,t)=>N8(e,t,Vg(t)),I8=(e,{valueAsNumber:t,valueAsDate:n,setValueAs:r})=>Ot(e)?e:t?e===""?NaN:e&&+e:n&&Oa(e)?new Date(e):r?r(e):e;function ay(e){const t=e.ref;if(!(e.refs?e.refs.every(n=>n.disabled):t.disabled))return Z_(t)?t.files:X_(t)?A8(e.refs).value:T8(t)?[...t.selectedOptions].map(({value:n})=>n):bf(t)?_8(e.refs).value:I8(Ot(t.value)?e.ref.value:t.value,e)}var wae=(e,t,n,r)=>{const a={};for(const o of e){const i=ge(t,o);i&&ht(a,o,i._f)}return{criteriaMode:n,names:[...e],fields:a,shouldUseNativeValidation:r}},pu=e=>Ot(e)?e:Bg(e)?e.source:cn(e)?Bg(e.value)?e.value.source:e.value:e,Eae=e=>e.mount&&(e.required||e.min||e.max||e.maxLength||e.minLength||e.pattern||e.validate);function Y2(e,t,n){const r=ge(e,n);if(r||Y_(n))return{error:r,name:n};const a=n.split(".");for(;a.length;){const o=a.join("."),i=ge(t,o),s=ge(e,o);if(i&&!Array.isArray(i)&&n!==o)return{name:n};if(s&&s.type)return{name:o,error:s};a.pop()}return{name:n}}var xae=(e,t,n,r,a)=>a.isOnAll?!1:!n&&a.isOnTouch?!(t||e):(n?r.isOnBlur:a.isOnBlur)?!e:(n?r.isOnChange:a.isOnChange)?e:!0,kae=(e,t)=>!zc(ge(e,t)).length&&pn(e,t);const Cae={mode:Hr.onSubmit,reValidateMode:Hr.onChange,shouldFocusError:!0};function _ae(e={},t){let n={...Cae,...e},r={submitCount:0,isDirty:!1,isLoading:li(n.defaultValues),isValidating:!1,isSubmitted:!1,isSubmitting:!1,isSubmitSuccessful:!1,isValid:!1,touchedFields:{},dirtyFields:{},errors:{}},a={},o=cn(n.defaultValues)||cn(n.values)?Ln(n.defaultValues||n.values)||{}:{},i=n.shouldUnregister?{}:Ln(o),s={action:!1,mount:!1,watch:!1},l={mount:new Set,unMount:new Set,array:new Set,watch:new Set},c,u=0;const d={isDirty:!1,dirtyFields:!1,touchedFields:!1,isValidating:!1,isValid:!1,errors:!1},g={values:ty(),array:ty(),state:ty()},m=e.resetOptions&&e.resetOptions.keepDirtyValues,b=ck(n.mode),y=ck(n.reValidateMode),w=n.criteriaMode===Hr.all,v=F=>q=>{clearTimeout(u),u=setTimeout(F,q)},h=async F=>{if(d.isValid||F){const q=n.resolver?wr((await R()).errors):await L(a,!0);q!==r.isValid&&g.state.next({isValid:q})}},S=F=>d.isValidating&&g.state.next({isValidating:F}),E=(F,q=[],Y,ye,de=!0,oe=!0)=>{if(ye&&Y){if(s.action=!0,oe&&Array.isArray(ge(a,F))){const _e=Y(ge(a,F),ye.argA,ye.argB);de&&ht(a,F,_e)}if(oe&&Array.isArray(ge(r.errors,F))){const _e=Y(ge(r.errors,F),ye.argA,ye.argB);de&&ht(r.errors,F,_e),kae(r.errors,F)}if(d.touchedFields&&oe&&Array.isArray(ge(r.touchedFields,F))){const _e=Y(ge(r.touchedFields,F),ye.argA,ye.argB);de&&ht(r.touchedFields,F,_e)}d.dirtyFields&&(r.dirtyFields=ry(o,i)),g.state.next({name:F,isDirty:H(F,q),dirtyFields:r.dirtyFields,errors:r.errors,isValid:r.isValid})}else ht(i,F,q)},k=(F,q)=>{ht(r.errors,F,q),g.state.next({errors:r.errors})},x=(F,q,Y,ye)=>{const de=ge(a,F);if(de){const oe=ge(i,F,Ot(Y)?ge(o,F):Y);Ot(oe)||ye&&ye.defaultChecked||q?ht(i,F,q?oe:ay(de._f)):U(F,oe),s.mount&&h()}},C=(F,q,Y,ye,de)=>{let oe=!1,_e=!1;const wt={name:F};if(!Y||ye){d.isDirty&&(_e=r.isDirty,r.isDirty=wt.isDirty=H(),oe=_e!==wt.isDirty);const St=as(ge(o,F),q);_e=ge(r.dirtyFields,F),St?pn(r.dirtyFields,F):ht(r.dirtyFields,F,!0),wt.dirtyFields=r.dirtyFields,oe=oe||d.dirtyFields&&_e!==!St}if(Y){const St=ge(r.touchedFields,F);St||(ht(r.touchedFields,F,Y),wt.touchedFields=r.touchedFields,oe=oe||d.touchedFields&&St!==Y)}return oe&&de&&g.state.next(wt),oe?wt:{}},_=(F,q,Y,ye)=>{const de=ge(r.errors,F),oe=d.isValid&&si(q)&&r.isValid!==q;if(e.delayError&&Y?(c=v(()=>k(F,Y)),c(e.delayError)):(clearTimeout(u),c=null,Y?ht(r.errors,F,Y):pn(r.errors,F)),(Y?!as(de,Y):de)||!wr(ye)||oe){const _e={...ye,...oe&&si(q)?{isValid:q}:{},errors:r.errors,name:F};r={...r,..._e},g.state.next(_e)}S(!1)},R=async F=>n.resolver(i,n.context,wae(F||l.mount,a,n.criteriaMode,n.shouldUseNativeValidation)),T=async F=>{const{errors:q}=await R(F);if(F)for(const Y of F){const ye=ge(q,Y);ye?ht(r.errors,Y,ye):pn(r.errors,Y)}else r.errors=q;return q},L=async(F,q,Y={valid:!0})=>{for(const ye in F){const de=F[ye];if(de){const{_f:oe,..._e}=de;if(oe){const wt=l.array.has(oe.name),St=await dk(de,i,w,n.shouldUseNativeValidation&&!q,wt);if(St[oe.name]&&(Y.valid=!1,q))break;!q&&(ge(St,oe.name)?wt?C8(r.errors,St,oe.name):ht(r.errors,oe.name,St[oe.name]):pn(r.errors,oe.name))}_e&&await L(_e,q,Y)}}return Y.valid},D=()=>{for(const F of l.unMount){const q=ge(a,F);q&&(q._f.refs?q._f.refs.every(Y=>!ny(Y)):!ny(q._f.ref))&&ne(F)}l.unMount=new Set},H=(F,q)=>(F&&q&&ht(i,F,q),!as(V(),o)),z=(F,q,Y)=>E8(F,l,{...s.mount?i:Ot(q)?o:Oa(F)?{[F]:q}:q},Y,q),M=F=>zc(ge(s.mount?i:o,F,e.shouldUnregister?ge(o,F,[]):[])),U=(F,q,Y={})=>{const ye=ge(a,F);let de=q;if(ye){const oe=ye._f;oe&&(!oe.disabled&&ht(i,F,I8(q,oe)),de=Ug(oe.ref)&&Yn(q)?"":q,T8(oe.ref)?[...oe.ref.options].forEach(_e=>_e.selected=de.includes(_e.value)):oe.refs?bf(oe.ref)?oe.refs.length>1?oe.refs.forEach(_e=>(!_e.defaultChecked||!_e.disabled)&&(_e.checked=Array.isArray(de)?!!de.find(wt=>wt===_e.value):de===_e.value)):oe.refs[0]&&(oe.refs[0].checked=!!de):oe.refs.forEach(_e=>_e.checked=_e.value===de):Z_(oe.ref)?oe.ref.value="":(oe.ref.value=de,oe.ref.type||g.values.next({name:F,values:{...i}})))}(Y.shouldDirty||Y.shouldTouch)&&C(F,de,Y.shouldTouch,Y.shouldDirty,!0),Y.shouldValidate&&A(F)},X=(F,q,Y)=>{for(const ye in q){const de=q[ye],oe=`${F}.${ye}`,_e=ge(a,oe);(l.array.has(F)||!Hg(de)||_e&&!_e._f)&&!Nl(de)?X(oe,de,Y):U(oe,de,Y)}},j=(F,q,Y={})=>{const ye=ge(a,F),de=l.array.has(F),oe=Ln(q);ht(i,F,oe),de?(g.array.next({name:F,values:{...i}}),(d.isDirty||d.dirtyFields)&&Y.shouldDirty&&g.state.next({name:F,dirtyFields:ry(o,i),isDirty:H(F,oe)})):ye&&!ye._f&&!Yn(oe)?X(F,oe,Y):U(F,oe,Y),uk(F,l)&&g.state.next({...r}),g.values.next({name:F,values:{...i}}),!s.mount&&t()},O=async F=>{const q=F.target;let Y=q.name,ye=!0;const de=ge(a,Y),oe=()=>q.type?ay(de._f):h8(F);if(de){let _e,wt;const St=oe(),Z=F.type===jg.BLUR||F.type===jg.FOCUS_OUT,le=!Eae(de._f)&&!n.resolver&&!ge(r.errors,Y)&&!de._f.deps||xae(Z,ge(r.touchedFields,Y),r.isSubmitted,y,b),De=uk(Y,l,Z);ht(i,Y,St),Z?(de._f.onBlur&&de._f.onBlur(F),c&&c(0)):de._f.onChange&&de._f.onChange(F);const He=C(Y,St,Z,!1),ft=!wr(He)||De;if(!Z&&g.values.next({name:Y,type:F.type,values:{...i}}),le)return d.isValid&&h(),ft&&g.state.next({name:Y,...De?{}:He});if(!Z&&De&&g.state.next({...r}),S(!0),n.resolver){const{errors:Tn}=await R([Y]),Ir=Y2(r.errors,a,Y),Sn=Y2(Tn,a,Ir.name||Y);_e=Sn.error,Y=Sn.name,wt=wr(Tn)}else _e=(await dk(de,i,w,n.shouldUseNativeValidation))[Y],ye=Number.isNaN(St)||St===ge(i,Y,St),ye&&(_e?wt=!1:d.isValid&&(wt=await L(a,!0)));ye&&(de._f.deps&&A(de._f.deps),_(Y,wt,_e,He))}},A=async(F,q={})=>{let Y,ye;const de=kr(F);if(S(!0),n.resolver){const oe=await T(Ot(F)?F:de);Y=wr(oe),ye=F?!de.some(_e=>ge(oe,_e)):Y}else F?(ye=(await Promise.all(de.map(async oe=>{const _e=ge(a,oe);return await L(_e&&_e._f?{[oe]:_e}:_e)}))).every(Boolean),!(!ye&&!r.isValid)&&h()):ye=Y=await L(a);return g.state.next({...!Oa(F)||d.isValid&&Y!==r.isValid?{}:{name:F},...n.resolver||!F?{isValid:Y}:{},errors:r.errors,isValidating:!1}),q.shouldFocus&&!ye&&zg(a,oe=>oe&&ge(r.errors,oe),F?de:l.mount),ye},V=F=>{const q={...o,...s.mount?i:{}};return Ot(F)?q:Oa(F)?ge(q,F):F.map(Y=>ge(q,Y))},P=(F,q)=>({invalid:!!ge((q||r).errors,F),isDirty:!!ge((q||r).dirtyFields,F),isTouched:!!ge((q||r).touchedFields,F),error:ge((q||r).errors,F)}),N=F=>{F&&kr(F).forEach(q=>pn(r.errors,q)),g.state.next({errors:F?r.errors:{}})},K=(F,q,Y)=>{const ye=(ge(a,F,{_f:{}})._f||{}).ref;ht(r.errors,F,{...q,ref:ye}),g.state.next({name:F,errors:r.errors,isValid:!1}),Y&&Y.shouldFocus&&ye&&ye.focus&&ye.focus()},ae=(F,q)=>li(F)?g.values.subscribe({next:Y=>F(z(void 0,q),Y)}):z(F,q,!0),ne=(F,q={})=>{for(const Y of F?kr(F):l.mount)l.mount.delete(Y),l.array.delete(Y),q.keepValue||(pn(a,Y),pn(i,Y)),!q.keepError&&pn(r.errors,Y),!q.keepDirty&&pn(r.dirtyFields,Y),!q.keepTouched&&pn(r.touchedFields,Y),!n.shouldUnregister&&!q.keepDefaultValue&&pn(o,Y);g.values.next({values:{...i}}),g.state.next({...r,...q.keepDirty?{isDirty:H()}:{}}),!q.keepIsValid&&h()},Q=({disabled:F,name:q,field:Y,fields:ye})=>{if(si(F)){const de=F?void 0:ge(i,q,ay(Y?Y._f:ge(ye,q)._f));ht(i,q,de),C(q,de,!1,!1,!0)}},pe=(F,q={})=>{let Y=ge(a,F);const ye=si(q.disabled);return ht(a,F,{...Y||{},_f:{...Y&&Y._f?Y._f:{ref:{name:F}},name:F,mount:!0,...q}}),l.mount.add(F),Y?Q({field:Y,disabled:q.disabled,name:F}):x(F,!0,q.value),{...ye?{disabled:q.disabled}:{},...n.progressive?{required:!!q.required,min:pu(q.min),max:pu(q.max),minLength:pu(q.minLength),maxLength:pu(q.maxLength),pattern:pu(q.pattern)}:{},name:F,onChange:O,onBlur:O,ref:de=>{if(de){pe(F,q),Y=ge(a,F);const oe=Ot(de.value)&&de.querySelectorAll&&de.querySelectorAll("input,select,textarea")[0]||de,_e=Sae(oe),wt=Y._f.refs||[];if(_e?wt.find(St=>St===oe):oe===Y._f.ref)return;ht(a,F,{_f:{...Y._f,..._e?{refs:[...wt.filter(ny),oe,...Array.isArray(ge(o,F))?[{}]:[]],ref:{type:oe.type,name:F}}:{ref:oe}}}),x(F,!1,void 0,oe)}else Y=ge(a,F,{}),Y._f&&(Y._f.mount=!1),(n.shouldUnregister||q.shouldUnregister)&&!(b8(l.array,F)&&s.action)&&l.unMount.add(F)}}},he=()=>n.shouldFocusError&&zg(a,F=>F&&ge(r.errors,F),l.mount),re=(F,q)=>async Y=>{Y&&(Y.preventDefault&&Y.preventDefault(),Y.persist&&Y.persist());let ye=Ln(i);if(g.state.next({isSubmitting:!0}),n.resolver){const{errors:de,values:oe}=await R();r.errors=de,ye=oe}else await L(a);pn(r.errors,"root"),wr(r.errors)?(g.state.next({errors:{}}),await F(ye,Y)):(q&&await q({...r.errors},Y),he(),setTimeout(he)),g.state.next({isSubmitted:!0,isSubmitting:!1,isSubmitSuccessful:wr(r.errors),submitCount:r.submitCount+1,errors:r.errors})},Ee=(F,q={})=>{ge(a,F)&&(Ot(q.defaultValue)?j(F,ge(o,F)):(j(F,q.defaultValue),ht(o,F,q.defaultValue)),q.keepTouched||pn(r.touchedFields,F),q.keepDirty||(pn(r.dirtyFields,F),r.isDirty=q.defaultValue?H(F,ge(o,F)):H()),q.keepError||(pn(r.errors,F),d.isValid&&h()),g.state.next({...r}))},ke=(F,q={})=>{const Y=F?Ln(F):o,ye=Ln(Y),de=F&&!wr(F)?ye:o;if(q.keepDefaultValues||(o=Y),!q.keepValues){if(q.keepDirtyValues||m)for(const oe of l.mount)ge(r.dirtyFields,oe)?ht(de,oe,ge(i,oe)):j(oe,ge(de,oe));else{if(K_&&Ot(F))for(const oe of l.mount){const _e=ge(a,oe);if(_e&&_e._f){const wt=Array.isArray(_e._f.refs)?_e._f.refs[0]:_e._f.ref;if(Ug(wt)){const St=wt.closest("form");if(St){St.reset();break}}}}a={}}i=e.shouldUnregister?q.keepDefaultValues?Ln(o):{}:Ln(de),g.array.next({values:{...de}}),g.values.next({values:{...de}})}l={mount:new Set,unMount:new Set,array:new Set,watch:new Set,watchAll:!1,focus:""},!s.mount&&t(),s.mount=!d.isValid||!!q.keepIsValid,s.watch=!!e.shouldUnregister,g.state.next({submitCount:q.keepSubmitCount?r.submitCount:0,isDirty:q.keepDirty?r.isDirty:!!(q.keepDefaultValues&&!as(F,o)),isSubmitted:q.keepIsSubmitted?r.isSubmitted:!1,dirtyFields:q.keepDirtyValues?r.dirtyFields:q.keepDefaultValues&&F?ry(o,F):{},touchedFields:q.keepTouched?r.touchedFields:{},errors:q.keepErrors?r.errors:{},isSubmitSuccessful:q.keepIsSubmitSuccessful?r.isSubmitSuccessful:!1,isSubmitting:!1})},We=(F,q)=>ke(li(F)?F(i):F,q);return{control:{register:pe,unregister:ne,getFieldState:P,handleSubmit:re,setError:K,_executeSchema:R,_getWatch:z,_getDirty:H,_updateValid:h,_removeUnmounted:D,_updateFieldArray:E,_updateDisabledField:Q,_getFieldArray:M,_reset:ke,_resetDefaultValues:()=>li(n.defaultValues)&&n.defaultValues().then(F=>{We(F,n.resetOptions),g.state.next({isLoading:!1})}),_updateFormState:F=>{r={...r,...F}},_subjects:g,_proxyFormState:d,get _fields(){return a},get _formValues(){return i},get _state(){return s},set _state(F){s=F},get _defaultValues(){return o},get _names(){return l},set _names(F){l=F},get _formState(){return r},set _formState(F){r=F},get _options(){return n},set _options(F){n={...n,...F}}},trigger:A,register:pe,handleSubmit:re,watch:ae,setValue:j,getValues:V,reset:We,resetField:Ee,clearErrors:N,unregister:ne,setError:K,setFocus:(F,q={})=>{const Y=ge(a,F),ye=Y&&Y._f;if(ye){const de=ye.refs?ye.refs[0]:ye.ref;de.focus&&(de.focus(),q.shouldSelect&&de.select())}},getFieldState:P}}function bn(e={}){const t=Ae.useRef(),n=Ae.useRef(),[r,a]=Ae.useState({isDirty:!1,isValidating:!1,isLoading:li(e.defaultValues),isSubmitted:!1,isSubmitting:!1,isSubmitSuccessful:!1,isValid:!1,submitCount:0,dirtyFields:{},touchedFields:{},errors:{},defaultValues:li(e.defaultValues)?void 0:e.defaultValues});t.current||(t.current={..._ae(e,()=>a(i=>({...i}))),formState:r});const o=t.current.control;return o._options=e,gh({subject:o._subjects.state,next:i=>{S8(i,o._proxyFormState,o._updateFormState,!0)&&a({...o._formState})}}),Ae.useEffect(()=>{e.values&&!as(e.values,n.current)?(o._reset(e.values,o._options.resetOptions),n.current=e.values):o._resetDefaultValues()},[e.values,o]),Ae.useEffect(()=>{o._state.mount||(o._updateValid(),o._state.mount=!0),o._state.watch&&(o._state.watch=!1,o._subjects.state.next({...o._formState})),o._removeUnmounted()}),t.current.formState=v8(r,o),t.current}var Z2=function(e,t,n){if(e&&"reportValidity"in e){var r=ge(n,t);e.setCustomValidity(r&&r.message||""),e.reportValidity()}},O8=function(e,t){var n=function(a){var o=t.fields[a];o&&o.ref&&"reportValidity"in o.ref?Z2(o.ref,a,e):o.refs&&o.refs.forEach(function(i){return Z2(i,a,e)})};for(var r in t.fields)n(r)},Aae=function(e,t){t.shouldUseNativeValidation&&O8(e,t);var n={};for(var r in e){var a=ge(t.fields,r),o=Object.assign(e[r]||{},{ref:a&&a.ref});if(Rae(t.names||Object.keys(e),r)){var i=Object.assign({},Tae(ge(n,r)));ht(i,"root",o),ht(n,r,i)}else ht(n,r,o)}return n},Tae=function(e){return Array.isArray(e)?e.filter(Boolean):[]},Rae=function(e,t){return e.some(function(n){return n.startsWith(t+".")})},Nae=function(e,t){for(var n={};e.length;){var r=e[0],a=r.code,o=r.message,i=r.path.join(".");if(!n[i])if("unionErrors"in r){var s=r.unionErrors[0].errors[0];n[i]={message:s.message,type:s.code}}else n[i]={message:o,type:a};if("unionErrors"in r&&r.unionErrors.forEach(function(u){return u.errors.forEach(function(d){return e.push(d)})}),t){var l=n[i].types,c=l&&l[r.code];n[i]=k8(i,t,n,a,c?[].concat(c,r.message):r.message)}e.shift()}return n},yn=function(e,t,n){return n===void 0&&(n={}),function(r,a,o){try{return Promise.resolve(function(i,s){try{var l=Promise.resolve(e[n.mode==="sync"?"parse":"parseAsync"](r,t)).then(function(c){return o.shouldUseNativeValidation&&O8({},o),{errors:{},values:n.raw?r:c}})}catch(c){return s(c)}return l&&l.then?l.then(void 0,s):l}(0,function(i){if(function(s){return s.errors!=null}(i))return{values:{},errors:Aae(Nae(i.errors,!o.shouldUseNativeValidation&&o.criteriaMode==="all"),o)};throw i}))}catch(i){return Promise.reject(i)}}};function Bl(e,t,{checkForDefaultPrevented:n=!0}={}){return function(a){if(e==null||e(a),n===!1||!a.defaultPrevented)return t==null?void 0:t(a)}}function Iae(e,t){typeof e=="function"?e(t):e!=null&&(e.current=t)}function D8(...e){return t=>e.forEach(n=>Iae(n,t))}function yf(...e){return p.useCallback(D8(...e),e)}function Oae(e,t=[]){let n=[];function r(o,i){const s=p.createContext(i),l=n.length;n=[...n,i];function c(d){const{scope:g,children:m,...b}=d,y=(g==null?void 0:g[e][l])||s,w=p.useMemo(()=>b,Object.values(b));return p.createElement(y.Provider,{value:w},m)}function u(d,g){const m=(g==null?void 0:g[e][l])||s,b=p.useContext(m);if(b)return b;if(i!==void 0)return i;throw new Error(`\`${d}\` must be used within \`${o}\``)}return c.displayName=o+"Provider",[c,u]}const a=()=>{const o=n.map(i=>p.createContext(i));return function(s){const l=(s==null?void 0:s[e])||o;return p.useMemo(()=>({[`__scope${e}`]:{...s,[e]:l}}),[s,l])}};return a.scopeName=e,[r,Dae(a,...t)]}function Dae(...e){const t=e[0];if(e.length===1)return t;const n=()=>{const r=e.map(a=>({useScope:a(),scopeName:a.scopeName}));return function(o){const i=r.reduce((s,{useScope:l,scopeName:c})=>{const d=l(o)[`__scope${c}`];return{...s,...d}},{});return p.useMemo(()=>({[`__scope${t.scopeName}`]:i}),[i])}};return n.scopeName=t.scopeName,n}const fk=globalThis!=null&&globalThis.document?p.useLayoutEffect:()=>{},Lae=Kd["useId".toString()]||(()=>{});let Mae=0;function oy(e){const[t,n]=p.useState(Lae());return fk(()=>{e||n(r=>r??String(Mae++))},[e]),e||(t?`radix-${t}`:"")}function Rs(e){const t=p.useRef(e);return p.useEffect(()=>{t.current=e}),p.useMemo(()=>(...n)=>{var r;return(r=t.current)===null||r===void 0?void 0:r.call(t,...n)},[])}function Pae({prop:e,defaultProp:t,onChange:n=()=>{}}){const[r,a]=$ae({defaultProp:t,onChange:n}),o=e!==void 0,i=o?e:r,s=Rs(n),l=p.useCallback(c=>{if(o){const d=typeof c=="function"?c(e):c;d!==e&&s(d)}else a(c)},[o,e,a,s]);return[i,l]}function $ae({defaultProp:e,onChange:t}){const n=p.useState(e),[r]=n,a=p.useRef(r),o=Rs(t);return p.useEffect(()=>{a.current!==r&&(o(r),a.current=r)},[r,a,o]),n}const Q_=p.forwardRef((e,t)=>{const{children:n,...r}=e,a=p.Children.toArray(n),o=a.find(jae);if(o){const i=o.props.children,s=a.map(l=>l===o?p.Children.count(i)>1?p.Children.only(null):p.isValidElement(i)?i.props.children:null:l);return p.createElement(pk,W({},r,{ref:t}),p.isValidElement(i)?p.cloneElement(i,void 0,s):null)}return p.createElement(pk,W({},r,{ref:t}),n)});Q_.displayName="Slot";const pk=p.forwardRef((e,t)=>{const{children:n,...r}=e;return p.isValidElement(n)?p.cloneElement(n,{...zae(r,n.props),ref:D8(t,n.ref)}):p.Children.count(n)>1?p.Children.only(null):null});pk.displayName="SlotClone";const Fae=({children:e})=>p.createElement(p.Fragment,null,e);function jae(e){return p.isValidElement(e)&&e.type===Fae}function zae(e,t){const n={...t};for(const r in t){const a=e[r],o=t[r];/^on[A-Z]/.test(r)?n[r]=(...s)=>{o==null||o(...s),a==null||a(...s)}:r==="style"?n[r]={...a,...o}:r==="className"&&(n[r]=[a,o].filter(Boolean).join(" "))}return{...e,...n}}const Uae=["a","button","div","h2","h3","img","li","nav","ol","p","span","svg","ul"],mh=Uae.reduce((e,t)=>{const n=p.forwardRef((r,a)=>{const{asChild:o,...i}=r,s=o?Q_:t;return p.useEffect(()=>{window[Symbol.for("radix-ui")]=!0},[]),p.createElement(s,W({},i,{ref:a}))});return n.displayName=`Primitive.${t}`,{...e,[t]:n}},{});function Bae(e,t){e&&ba.flushSync(()=>e.dispatchEvent(t))}function Hae(e){const t=Rs(e);p.useEffect(()=>{const n=r=>{r.key==="Escape"&&t(r)};return document.addEventListener("keydown",n),()=>document.removeEventListener("keydown",n)},[t])}const gk="dismissableLayer.update",Vae="dismissableLayer.pointerDownOutside",qae="dismissableLayer.focusOutside";let X2;const Gae=p.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),Wae=p.forwardRef((e,t)=>{const{disableOutsidePointerEvents:n=!1,onEscapeKeyDown:r,onPointerDownOutside:a,onFocusOutside:o,onInteractOutside:i,onDismiss:s,...l}=e,c=p.useContext(Gae),[u,d]=p.useState(null),[,g]=p.useState({}),m=yf(t,x=>d(x)),b=Array.from(c.layers),[y]=[...c.layersWithOutsidePointerEventsDisabled].slice(-1),w=b.indexOf(y),v=u?b.indexOf(u):-1,h=c.layersWithOutsidePointerEventsDisabled.size>0,S=v>=w,E=Kae(x=>{const C=x.target,_=[...c.branches].some(R=>R.contains(C));!S||_||(a==null||a(x),i==null||i(x),x.defaultPrevented||s==null||s())}),k=Yae(x=>{const C=x.target;[...c.branches].some(R=>R.contains(C))||(o==null||o(x),i==null||i(x),x.defaultPrevented||s==null||s())});return Hae(x=>{v===c.layers.size-1&&(r==null||r(x),!x.defaultPrevented&&s&&(x.preventDefault(),s()))}),p.useEffect(()=>{if(u)return n&&(c.layersWithOutsidePointerEventsDisabled.size===0&&(X2=document.body.style.pointerEvents,document.body.style.pointerEvents="none"),c.layersWithOutsidePointerEventsDisabled.add(u)),c.layers.add(u),Q2(),()=>{n&&c.layersWithOutsidePointerEventsDisabled.size===1&&(document.body.style.pointerEvents=X2)}},[u,n,c]),p.useEffect(()=>()=>{u&&(c.layers.delete(u),c.layersWithOutsidePointerEventsDisabled.delete(u),Q2())},[u,c]),p.useEffect(()=>{const x=()=>g({});return document.addEventListener(gk,x),()=>document.removeEventListener(gk,x)},[]),p.createElement(mh.div,W({},l,{ref:m,style:{pointerEvents:h?S?"auto":"none":void 0,...e.style},onFocusCapture:Bl(e.onFocusCapture,k.onFocusCapture),onBlurCapture:Bl(e.onBlurCapture,k.onBlurCapture),onPointerDownCapture:Bl(e.onPointerDownCapture,E.onPointerDownCapture)}))});function Kae(e){const t=Rs(e),n=p.useRef(!1),r=p.useRef(()=>{});return p.useEffect(()=>{const a=i=>{if(i.target&&!n.current){let c=function(){L8(Vae,t,l,{discrete:!0})};var s=c;const l={originalEvent:i};i.pointerType==="touch"?(document.removeEventListener("click",r.current),r.current=c,document.addEventListener("click",r.current,{once:!0})):c()}n.current=!1},o=window.setTimeout(()=>{document.addEventListener("pointerdown",a)},0);return()=>{window.clearTimeout(o),document.removeEventListener("pointerdown",a),document.removeEventListener("click",r.current)}},[t]),{onPointerDownCapture:()=>n.current=!0}}function Yae(e){const t=Rs(e),n=p.useRef(!1);return p.useEffect(()=>{const r=a=>{a.target&&!n.current&&L8(qae,t,{originalEvent:a},{discrete:!1})};return document.addEventListener("focusin",r),()=>document.removeEventListener("focusin",r)},[t]),{onFocusCapture:()=>n.current=!0,onBlurCapture:()=>n.current=!1}}function Q2(){const e=new CustomEvent(gk);document.dispatchEvent(e)}function L8(e,t,n,{discrete:r}){const a=n.originalEvent.target,o=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&a.addEventListener(e,t,{once:!0}),r?Bae(a,o):a.dispatchEvent(o)}const iy="focusScope.autoFocusOnMount",sy="focusScope.autoFocusOnUnmount",J2={bubbles:!1,cancelable:!0},Zae=p.forwardRef((e,t)=>{const{loop:n=!1,trapped:r=!1,onMountAutoFocus:a,onUnmountAutoFocus:o,...i}=e,[s,l]=p.useState(null),c=Rs(a),u=Rs(o),d=p.useRef(null),g=yf(t,y=>l(y)),m=p.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;p.useEffect(()=>{if(r){let v=function(S){if(m.paused||!s)return;const E=S.target;s.contains(E)?d.current=E:Yi(d.current,{select:!0})},h=function(S){m.paused||!s||s.contains(S.relatedTarget)||Yi(d.current,{select:!0})};var y=v,w=h;return document.addEventListener("focusin",v),document.addEventListener("focusout",h),()=>{document.removeEventListener("focusin",v),document.removeEventListener("focusout",h)}}},[r,s,m.paused]),p.useEffect(()=>{if(s){tN.add(m);const y=document.activeElement;if(!s.contains(y)){const v=new CustomEvent(iy,J2);s.addEventListener(iy,c),s.dispatchEvent(v),v.defaultPrevented||(Xae(noe(M8(s)),{select:!0}),document.activeElement===y&&Yi(s))}return()=>{s.removeEventListener(iy,c),setTimeout(()=>{const v=new CustomEvent(sy,J2);s.addEventListener(sy,u),s.dispatchEvent(v),v.defaultPrevented||Yi(y??document.body,{select:!0}),s.removeEventListener(sy,u),tN.remove(m)},0)}}},[s,c,u,m]);const b=p.useCallback(y=>{if(!n&&!r||m.paused)return;const w=y.key==="Tab"&&!y.altKey&&!y.ctrlKey&&!y.metaKey,v=document.activeElement;if(w&&v){const h=y.currentTarget,[S,E]=Qae(h);S&&E?!y.shiftKey&&v===E?(y.preventDefault(),n&&Yi(S,{select:!0})):y.shiftKey&&v===S&&(y.preventDefault(),n&&Yi(E,{select:!0})):v===h&&y.preventDefault()}},[n,r,m.paused]);return p.createElement(mh.div,W({tabIndex:-1},i,{ref:g,onKeyDown:b}))});function Xae(e,{select:t=!1}={}){const n=document.activeElement;for(const r of e)if(Yi(r,{select:t}),document.activeElement!==n)return}function Qae(e){const t=M8(e),n=eN(t,e),r=eN(t.reverse(),e);return[n,r]}function M8(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>{const a=r.tagName==="INPUT"&&r.type==="hidden";return r.disabled||r.hidden||a?NodeFilter.FILTER_SKIP:r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function eN(e,t){for(const n of e)if(!Jae(n,{upTo:t}))return n}function Jae(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function eoe(e){return e instanceof HTMLInputElement&&"select"in e}function Yi(e,{select:t=!1}={}){if(e&&e.focus){const n=document.activeElement;e.focus({preventScroll:!0}),e!==n&&eoe(e)&&t&&e.select()}}const tN=toe();function toe(){let e=[];return{add(t){const n=e[0];t!==n&&(n==null||n.pause()),e=nN(e,t),e.unshift(t)},remove(t){var n;e=nN(e,t),(n=e[0])===null||n===void 0||n.resume()}}}function nN(e,t){const n=[...e],r=n.indexOf(t);return r!==-1&&n.splice(r,1),n}function noe(e){return e.filter(t=>t.tagName!=="A")}const roe=p.forwardRef((e,t)=>{var n;const{container:r=globalThis==null||(n=globalThis.document)===null||n===void 0?void 0:n.body,...a}=e;return r?GC.createPortal(p.createElement(mh.div,W({},a,{ref:t})),r):null});function aoe(e,t){return p.useReducer((n,r)=>{const a=t[n][r];return a??n},e)}const hh=e=>{const{present:t,children:n}=e,r=ooe(t),a=typeof n=="function"?n({present:r.isPresent}):p.Children.only(n),o=yf(r.ref,a.ref);return typeof n=="function"||r.isPresent?p.cloneElement(a,{ref:o}):null};hh.displayName="Presence";function ooe(e){const[t,n]=p.useState(),r=p.useRef({}),a=p.useRef(e),o=p.useRef("none"),i=e?"mounted":"unmounted",[s,l]=aoe(i,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return p.useEffect(()=>{const c=lp(r.current);o.current=s==="mounted"?c:"none"},[s]),fk(()=>{const c=r.current,u=a.current;if(u!==e){const g=o.current,m=lp(c);e?l("MOUNT"):m==="none"||(c==null?void 0:c.display)==="none"?l("UNMOUNT"):l(u&&g!==m?"ANIMATION_OUT":"UNMOUNT"),a.current=e}},[e,l]),fk(()=>{if(t){const c=d=>{const m=lp(r.current).includes(d.animationName);d.target===t&&m&&ba.flushSync(()=>l("ANIMATION_END"))},u=d=>{d.target===t&&(o.current=lp(r.current))};return t.addEventListener("animationstart",u),t.addEventListener("animationcancel",c),t.addEventListener("animationend",c),()=>{t.removeEventListener("animationstart",u),t.removeEventListener("animationcancel",c),t.removeEventListener("animationend",c)}}else l("ANIMATION_END")},[t,l]),{isPresent:["mounted","unmountSuspended"].includes(s),ref:p.useCallback(c=>{c&&(r.current=getComputedStyle(c)),n(c)},[])}}function lp(e){return(e==null?void 0:e.animationName)||"none"}let ly=0;function ioe(){p.useEffect(()=>{var e,t;const n=document.querySelectorAll("[data-radix-focus-guard]");return document.body.insertAdjacentElement("afterbegin",(e=n[0])!==null&&e!==void 0?e:rN()),document.body.insertAdjacentElement("beforeend",(t=n[1])!==null&&t!==void 0?t:rN()),ly++,()=>{ly===1&&document.querySelectorAll("[data-radix-focus-guard]").forEach(r=>r.remove()),ly--}},[])}function rN(){const e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.cssText="outline: none; opacity: 0; position: fixed; pointer-events: none",e}var P8=u7(),cy=function(){},bh=p.forwardRef(function(e,t){var n=p.useRef(null),r=p.useState({onScrollCapture:cy,onWheelCapture:cy,onTouchMoveCapture:cy}),a=r[0],o=r[1],i=e.forwardProps,s=e.children,l=e.className,c=e.removeScrollBar,u=e.enabled,d=e.shards,g=e.sideCar,m=e.noIsolation,b=e.inert,y=e.allowPinchZoom,w=e.as,v=w===void 0?"div":w,h=O_(e,["forwardProps","children","className","removeScrollBar","enabled","shards","sideCar","noIsolation","inert","allowPinchZoom","as"]),S=g,E=c7([n,t]),k=Pn(Pn({},h),a);return p.createElement(p.Fragment,null,u&&p.createElement(S,{sideCar:P8,removeScrollBar:c,shards:d,noIsolation:m,inert:b,setCallbacks:o,allowPinchZoom:!!y,lockRef:n}),i?p.cloneElement(p.Children.only(s),Pn(Pn({},k),{ref:E})):p.createElement(v,Pn({},k,{className:l,ref:E}),s))});bh.defaultProps={enabled:!0,removeScrollBar:!0,inert:!1};bh.classNames={fullWidth:qu,zeroRight:Vu};var mk=!1;if(typeof window<"u")try{var cp=Object.defineProperty({},"passive",{get:function(){return mk=!0,!0}});window.addEventListener("test",cp,cp),window.removeEventListener("test",cp,cp)}catch{mk=!1}var rl=mk?{passive:!1}:!1,soe=function(e){var t=window.getComputedStyle(e);return t.overflowY!=="hidden"&&!(t.overflowY===t.overflowX&&t.overflowY==="visible")},loe=function(e){var t=window.getComputedStyle(e);return t.overflowX!=="hidden"&&!(t.overflowY===t.overflowX&&t.overflowX==="visible")},aN=function(e,t){var n=t;do{typeof ShadowRoot<"u"&&n instanceof ShadowRoot&&(n=n.host);var r=$8(e,n);if(r){var a=F8(e,n),o=a[1],i=a[2];if(o>i)return!0}n=n.parentNode}while(n&&n!==document.body);return!1},coe=function(e){var t=e.scrollTop,n=e.scrollHeight,r=e.clientHeight;return[t,n,r]},uoe=function(e){var t=e.scrollLeft,n=e.scrollWidth,r=e.clientWidth;return[t,n,r]},$8=function(e,t){return e==="v"?soe(t):loe(t)},F8=function(e,t){return e==="v"?coe(t):uoe(t)},doe=function(e,t){return e==="h"&&t==="rtl"?-1:1},foe=function(e,t,n,r,a){var o=doe(e,window.getComputedStyle(t).direction),i=o*r,s=n.target,l=t.contains(s),c=!1,u=i>0,d=0,g=0;do{var m=F8(e,s),b=m[0],y=m[1],w=m[2],v=y-w-o*b;(b||v)&&$8(e,s)&&(d+=v,g+=b),s=s.parentNode}while(!l&&s!==document.body||l&&(t.contains(s)||t===s));return(u&&(a&&d===0||!a&&i>d)||!u&&(a&&g===0||!a&&-i>g))&&(c=!0),c},up=function(e){return"changedTouches"in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},oN=function(e){return[e.deltaX,e.deltaY]},iN=function(e){return e&&"current"in e?e.current:e},poe=function(e,t){return e[0]===t[0]&&e[1]===t[1]},goe=function(e){return` - .block-interactivity-`.concat(e,` {pointer-events: none;} - .allow-interactivity-`).concat(e,` {pointer-events: all;} -`)},moe=0,al=[];function hoe(e){var t=p.useRef([]),n=p.useRef([0,0]),r=p.useRef(),a=p.useState(moe++)[0],o=p.useState(function(){return D_()})[0],i=p.useRef(e);p.useEffect(function(){i.current=e},[e]),p.useEffect(function(){if(e.inert){document.body.classList.add("block-interactivity-".concat(a));var y=l7([e.lockRef.current],(e.shards||[]).map(iN),!0).filter(Boolean);return y.forEach(function(w){return w.classList.add("allow-interactivity-".concat(a))}),function(){document.body.classList.remove("block-interactivity-".concat(a)),y.forEach(function(w){return w.classList.remove("allow-interactivity-".concat(a))})}}},[e.inert,e.lockRef.current,e.shards]);var s=p.useCallback(function(y,w){if("touches"in y&&y.touches.length===2)return!i.current.allowPinchZoom;var v=up(y),h=n.current,S="deltaX"in y?y.deltaX:h[0]-v[0],E="deltaY"in y?y.deltaY:h[1]-v[1],k,x=y.target,C=Math.abs(S)>Math.abs(E)?"h":"v";if("touches"in y&&C==="h"&&x.type==="range")return!1;var _=aN(C,x);if(!_)return!0;if(_?k=C:(k=C==="v"?"h":"v",_=aN(C,x)),!_)return!1;if(!r.current&&"changedTouches"in y&&(S||E)&&(r.current=k),!k)return!0;var R=r.current||k;return foe(R,w,y,R==="h"?S:E,!0)},[]),l=p.useCallback(function(y){var w=y;if(!(!al.length||al[al.length-1]!==o)){var v="deltaY"in w?oN(w):up(w),h=t.current.filter(function(k){return k.name===w.type&&k.target===w.target&&poe(k.delta,v)})[0];if(h&&h.should){w.preventDefault();return}if(!h){var S=(i.current.shards||[]).map(iN).filter(Boolean).filter(function(k){return k.contains(w.target)}),E=S.length>0?s(w,S[0]):!i.current.noIsolation;E&&w.preventDefault()}}},[]),c=p.useCallback(function(y,w,v,h){var S={name:y,delta:w,target:v,should:h};t.current.push(S),setTimeout(function(){t.current=t.current.filter(function(E){return E!==S})},1)},[]),u=p.useCallback(function(y){n.current=up(y),r.current=void 0},[]),d=p.useCallback(function(y){c(y.type,oN(y),y.target,s(y,e.lockRef.current))},[]),g=p.useCallback(function(y){c(y.type,up(y),y.target,s(y,e.lockRef.current))},[]);p.useEffect(function(){return al.push(o),e.setCallbacks({onScrollCapture:d,onWheelCapture:d,onTouchMoveCapture:g}),document.addEventListener("wheel",l,rl),document.addEventListener("touchmove",l,rl),document.addEventListener("touchstart",u,rl),function(){al=al.filter(function(y){return y!==o}),document.removeEventListener("wheel",l,rl),document.removeEventListener("touchmove",l,rl),document.removeEventListener("touchstart",u,rl)}},[]);var m=e.removeScrollBar,b=e.inert;return p.createElement(p.Fragment,null,b?p.createElement(o,{styles:goe(a)}):null,m?p.createElement(g7,{gapMode:"margin"}):null)}const boe=f7(P8,hoe);var j8=p.forwardRef(function(e,t){return p.createElement(bh,Pn({},e,{ref:t,sideCar:boe}))});j8.classNames=bh.classNames;const yoe=j8,z8="Dialog",[U8,dTe]=Oae(z8),[voe,Vs]=U8(z8),Soe=e=>{const{__scopeDialog:t,children:n,open:r,defaultOpen:a,onOpenChange:o,modal:i=!0}=e,s=p.useRef(null),l=p.useRef(null),[c=!1,u]=Pae({prop:r,defaultProp:a,onChange:o});return p.createElement(voe,{scope:t,triggerRef:s,contentRef:l,contentId:oy(),titleId:oy(),descriptionId:oy(),open:c,onOpenChange:u,onOpenToggle:p.useCallback(()=>u(d=>!d),[u]),modal:i},n)},B8="DialogPortal",[woe,H8]=U8(B8,{forceMount:void 0}),Eoe=e=>{const{__scopeDialog:t,forceMount:n,children:r,container:a}=e,o=Vs(B8,t);return p.createElement(woe,{scope:t,forceMount:n},p.Children.map(r,i=>p.createElement(hh,{present:n||o.open},p.createElement(roe,{asChild:!0,container:a},i))))},hk="DialogOverlay",xoe=p.forwardRef((e,t)=>{const n=H8(hk,e.__scopeDialog),{forceMount:r=n.forceMount,...a}=e,o=Vs(hk,e.__scopeDialog);return o.modal?p.createElement(hh,{present:r||o.open},p.createElement(koe,W({},a,{ref:t}))):null}),koe=p.forwardRef((e,t)=>{const{__scopeDialog:n,...r}=e,a=Vs(hk,n);return p.createElement(yoe,{as:Q_,allowPinchZoom:!0,shards:[a.contentRef]},p.createElement(mh.div,W({"data-state":q8(a.open)},r,{ref:t,style:{pointerEvents:"auto",...r.style}})))}),kd="DialogContent",Coe=p.forwardRef((e,t)=>{const n=H8(kd,e.__scopeDialog),{forceMount:r=n.forceMount,...a}=e,o=Vs(kd,e.__scopeDialog);return p.createElement(hh,{present:r||o.open},o.modal?p.createElement(_oe,W({},a,{ref:t})):p.createElement(Aoe,W({},a,{ref:t})))}),_oe=p.forwardRef((e,t)=>{const n=Vs(kd,e.__scopeDialog),r=p.useRef(null),a=yf(t,n.contentRef,r);return p.useEffect(()=>{const o=r.current;if(o)return mf(o)},[]),p.createElement(V8,W({},e,{ref:a,trapFocus:n.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:Bl(e.onCloseAutoFocus,o=>{var i;o.preventDefault(),(i=n.triggerRef.current)===null||i===void 0||i.focus()}),onPointerDownOutside:Bl(e.onPointerDownOutside,o=>{const i=o.detail.originalEvent,s=i.button===0&&i.ctrlKey===!0;(i.button===2||s)&&o.preventDefault()}),onFocusOutside:Bl(e.onFocusOutside,o=>o.preventDefault())}))}),Aoe=p.forwardRef((e,t)=>{const n=Vs(kd,e.__scopeDialog),r=p.useRef(!1);return p.createElement(V8,W({},e,{ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:a=>{var o;if((o=e.onCloseAutoFocus)===null||o===void 0||o.call(e,a),!a.defaultPrevented){var i;r.current||(i=n.triggerRef.current)===null||i===void 0||i.focus(),a.preventDefault()}r.current=!1},onInteractOutside:a=>{var o,i;(o=e.onInteractOutside)===null||o===void 0||o.call(e,a),a.defaultPrevented||(r.current=!0);const s=a.target;((i=n.triggerRef.current)===null||i===void 0?void 0:i.contains(s))&&a.preventDefault()}}))}),V8=p.forwardRef((e,t)=>{const{__scopeDialog:n,trapFocus:r,onOpenAutoFocus:a,onCloseAutoFocus:o,...i}=e,s=Vs(kd,n),l=p.useRef(null),c=yf(t,l);return ioe(),p.createElement(p.Fragment,null,p.createElement(Zae,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:a,onUnmountAutoFocus:o},p.createElement(Wae,W({role:"dialog",id:s.contentId,"aria-describedby":s.descriptionId,"aria-labelledby":s.titleId,"data-state":q8(s.open)},i,{ref:c,onDismiss:()=>s.onOpenChange(!1)}))),!1)});function q8(e){return e?"open":"closed"}const Toe=Soe,Roe=Eoe,Noe=xoe,Ioe=Coe;var sN=1,Ooe=.9,Doe=.3,uy=.1,Loe=0,dy=.999,Moe=.9999,Poe=.99,lN=/[\\\/\-_+.# \t"@\[\(\{&]/,$oe=/[\\\/\-_+.# \t"@\[\(\{&]/g;function bk(e,t,n,r,a,o){if(o===t.length)return a===e.length?sN:Poe;for(var i=r.charAt(o),s=n.indexOf(i,a),l=0,c,u,d;s>=0;)c=bk(e,t,n,r,s+1,o+1),c>l&&(s===a?c*=sN:lN.test(e.charAt(s-1))?(c*=Ooe,d=e.slice(a,s-1).match($oe),d&&a>0&&(c*=Math.pow(dy,d.length))):lN.test(e.slice(a,s-1))?(c*=Loe,a>0&&(c*=Math.pow(dy,s-a))):(c*=Doe,a>0&&(c*=Math.pow(dy,s-a))),e.charAt(s)!==t.charAt(o)&&(c*=Moe)),cc&&(c=u*uy)),c>l&&(l=c),s=n.indexOf(i,s+1);return l}function Foe(e,t){return bk(e,t,e.toLowerCase(),t.toLowerCase(),0,0)}var joe=Foe;const zoe=Tc(joe);var Uoe='[cmdk-list-sizer=""]',gu='[cmdk-group=""]',fy='[cmdk-group-items=""]',Boe='[cmdk-group-heading=""]',G8='[cmdk-item=""]',cN=`${G8}:not([aria-disabled="true"])`,yk="cmdk-item-select",Vo="data-value",Hoe=(e,t)=>zoe(e,t),W8=p.createContext(void 0),vf=()=>p.useContext(W8),K8=p.createContext(void 0),J_=()=>p.useContext(K8),Y8=p.createContext(void 0),Z8=p.forwardRef((e,t)=>{let n=p.useRef(null),r=dl(()=>({search:"",value:"",filtered:{count:0,items:new Map,groups:new Set}})),a=dl(()=>new Set),o=dl(()=>new Map),i=dl(()=>new Map),s=dl(()=>new Set),l=t9(e),{label:c,children:u,value:d,onValueChange:g,filter:m,shouldFilter:b,...y}=e,w=p.useId(),v=p.useId(),h=p.useId(),S=Xoe();Uc(()=>{if(d!==void 0){let O=d.trim().toLowerCase();r.current.value=O,S(6,T),E.emit()}},[d]);let E=p.useMemo(()=>({subscribe:O=>(s.current.add(O),()=>s.current.delete(O)),snapshot:()=>r.current,setState:(O,A,V)=>{var P,N,K;if(!Object.is(r.current[O],A)){if(r.current[O]=A,O==="search")R(),C(),S(1,_);else if(O==="value")if(((P=l.current)==null?void 0:P.value)!==void 0){(K=(N=l.current).onValueChange)==null||K.call(N,A);return}else V||S(5,T);E.emit()}},emit:()=>{s.current.forEach(O=>O())}}),[]),k=p.useMemo(()=>({value:(O,A)=>{A!==i.current.get(O)&&(i.current.set(O,A),r.current.filtered.items.set(O,x(A)),S(2,()=>{C(),E.emit()}))},item:(O,A)=>(a.current.add(O),A&&(o.current.has(A)?o.current.get(A).add(O):o.current.set(A,new Set([O]))),S(3,()=>{R(),C(),r.current.value||_(),E.emit()}),()=>{i.current.delete(O),a.current.delete(O),r.current.filtered.items.delete(O),S(4,()=>{R(),_(),E.emit()})}),group:O=>(o.current.has(O)||o.current.set(O,new Set),()=>{i.current.delete(O),o.current.delete(O)}),filter:()=>l.current.shouldFilter,label:c||e["aria-label"],listId:w,inputId:h,labelId:v}),[]);function x(O){var A;let V=((A=l.current)==null?void 0:A.filter)??Hoe;return O?V(O,r.current.search):0}function C(){if(!n.current||!r.current.search||l.current.shouldFilter===!1)return;let O=r.current.filtered.items,A=[];r.current.filtered.groups.forEach(P=>{let N=o.current.get(P),K=0;N.forEach(ae=>{let ne=O.get(ae);K=Math.max(ne,K)}),A.push([P,K])});let V=n.current.querySelector(Uoe);D().sort((P,N)=>{let K=P.getAttribute(Vo),ae=N.getAttribute(Vo);return(O.get(ae)??0)-(O.get(K)??0)}).forEach(P=>{let N=P.closest(fy);N?N.appendChild(P.parentElement===N?P:P.closest(`${fy} > *`)):V.appendChild(P.parentElement===V?P:P.closest(`${fy} > *`))}),A.sort((P,N)=>N[1]-P[1]).forEach(P=>{let N=n.current.querySelector(`${gu}[${Vo}="${P[0]}"]`);N==null||N.parentElement.appendChild(N)})}function _(){let O=D().find(V=>!V.ariaDisabled),A=O==null?void 0:O.getAttribute(Vo);E.setState("value",A||void 0)}function R(){if(!r.current.search||l.current.shouldFilter===!1){r.current.filtered.count=a.current.size;return}r.current.filtered.groups=new Set;let O=0;for(let A of a.current){let V=i.current.get(A),P=x(V);r.current.filtered.items.set(A,P),P>0&&O++}for(let[A,V]of o.current)for(let P of V)if(r.current.filtered.items.get(P)>0){r.current.filtered.groups.add(A);break}r.current.filtered.count=O}function T(){var O,A,V;let P=L();P&&(((O=P.parentElement)==null?void 0:O.firstChild)===P&&((V=(A=P.closest(gu))==null?void 0:A.querySelector(Boe))==null||V.scrollIntoView({block:"nearest"})),P.scrollIntoView({block:"nearest"}))}function L(){return n.current.querySelector(`${G8}[aria-selected="true"]`)}function D(){return Array.from(n.current.querySelectorAll(cN))}function H(O){let A=D()[O];A&&E.setState("value",A.getAttribute(Vo))}function z(O){var A;let V=L(),P=D(),N=P.findIndex(ae=>ae===V),K=P[N+O];(A=l.current)!=null&&A.loop&&(K=N+O<0?P[P.length-1]:N+O===P.length?P[0]:P[N+O]),K&&E.setState("value",K.getAttribute(Vo))}function M(O){let A=L(),V=A==null?void 0:A.closest(gu),P;for(;V&&!P;)V=O>0?Yoe(V,gu):Zoe(V,gu),P=V==null?void 0:V.querySelector(cN);P?E.setState("value",P.getAttribute(Vo)):z(O)}let U=()=>H(D().length-1),X=O=>{O.preventDefault(),O.metaKey?U():O.altKey?M(1):z(1)},j=O=>{O.preventDefault(),O.metaKey?H(0):O.altKey?M(-1):z(-1)};return p.createElement("div",{ref:Sf([n,t]),...y,"cmdk-root":"",onKeyDown:O=>{var A;if((A=y.onKeyDown)==null||A.call(y,O),!O.defaultPrevented)switch(O.key){case"n":case"j":{O.ctrlKey&&X(O);break}case"ArrowDown":{X(O);break}case"p":case"k":{O.ctrlKey&&j(O);break}case"ArrowUp":{j(O);break}case"Home":{O.preventDefault(),H(0);break}case"End":{O.preventDefault(),U();break}case"Enter":{O.preventDefault();let V=L();if(V){let P=new Event(yk);V.dispatchEvent(P)}}}}},p.createElement("label",{"cmdk-label":"",htmlFor:k.inputId,id:k.labelId,style:Qoe},c),p.createElement(K8.Provider,{value:E},p.createElement(W8.Provider,{value:k},u)))}),X8=p.forwardRef((e,t)=>{let n=p.useId(),r=p.useRef(null),a=p.useContext(Y8),o=vf(),i=t9(e);Uc(()=>o.item(n,a),[]);let s=n9(n,r,[e.value,e.children,r]),l=J_(),c=Ec(v=>v.value&&v.value===s.current),u=Ec(v=>o.filter()===!1?!0:v.search?v.filtered.items.get(n)>0:!0);p.useEffect(()=>{let v=r.current;if(!(!v||e.disabled))return v.addEventListener(yk,d),()=>v.removeEventListener(yk,d)},[u,e.onSelect,e.disabled]);function d(){var v,h;(h=(v=i.current).onSelect)==null||h.call(v,s.current)}function g(){l.setState("value",s.current,!0)}if(!u)return null;let{disabled:m,value:b,onSelect:y,...w}=e;return p.createElement("div",{ref:Sf([r,t]),...w,"cmdk-item":"",role:"option","aria-disabled":m||void 0,"aria-selected":c||void 0,"data-selected":c||void 0,onPointerMove:m?void 0:g,onClick:m?void 0:d},e.children)}),Q8=p.forwardRef((e,t)=>{let{heading:n,children:r,...a}=e,o=p.useId(),i=p.useRef(null),s=p.useRef(null),l=p.useId(),c=vf(),u=Ec(g=>c.filter()===!1?!0:g.search?g.filtered.groups.has(o):!0);Uc(()=>c.group(o),[]),n9(o,i,[e.value,e.heading,s]);let d=p.createElement(Y8.Provider,{value:o},r);return p.createElement("div",{ref:Sf([i,t]),...a,"cmdk-group":"",role:"presentation",hidden:u?void 0:!0},n&&p.createElement("div",{ref:s,"cmdk-group-heading":"","aria-hidden":!0,id:l},n),p.createElement("div",{"cmdk-group-items":"",role:"group","aria-labelledby":n?l:void 0},d))}),Voe=p.forwardRef((e,t)=>{let{alwaysRender:n,...r}=e,a=p.useRef(null),o=Ec(i=>!i.search);return!n&&!o?null:p.createElement("div",{ref:Sf([a,t]),...r,"cmdk-separator":"",role:"separator"})}),J8=p.forwardRef((e,t)=>{let{onValueChange:n,...r}=e,a=e.value!=null,o=J_(),i=Ec(l=>l.search),s=vf();return p.useEffect(()=>{e.value!=null&&o.setState("search",e.value)},[e.value]),p.createElement("input",{ref:t,...r,"cmdk-input":"",autoComplete:"off",autoCorrect:"off",spellCheck:!1,"aria-autocomplete":"list",role:"combobox","aria-expanded":!0,"aria-controls":s.listId,"aria-labelledby":s.labelId,id:s.inputId,type:"text",value:a?e.value:i,onChange:l=>{a||o.setState("search",l.target.value),n==null||n(l.target.value)}})}),qoe=p.forwardRef((e,t)=>{let{children:n,...r}=e,a=p.useRef(null),o=p.useRef(null),i=vf();return p.useEffect(()=>{if(o.current&&a.current){let s=o.current,l=a.current,c,u=new ResizeObserver(()=>{c=requestAnimationFrame(()=>{let d=s.getBoundingClientRect().height;l.style.setProperty("--cmdk-list-height",d.toFixed(1)+"px")})});return u.observe(s),()=>{cancelAnimationFrame(c),u.unobserve(s)}}},[]),p.createElement("div",{ref:Sf([a,t]),...r,"cmdk-list":"",role:"listbox","aria-label":"Suggestions",id:i.listId,"aria-labelledby":i.inputId},p.createElement("div",{ref:o,"cmdk-list-sizer":""},n))}),Goe=p.forwardRef((e,t)=>{let{open:n,onOpenChange:r,container:a,...o}=e;return p.createElement(Toe,{open:n,onOpenChange:r},p.createElement(Roe,{container:a},p.createElement(Noe,{"cmdk-overlay":""}),p.createElement(Ioe,{"aria-label":e.label,"cmdk-dialog":""},p.createElement(Z8,{ref:t,...o}))))}),e9=p.forwardRef((e,t)=>{let n=p.useRef(!0),r=Ec(a=>a.filtered.count===0);return p.useEffect(()=>{n.current=!1},[]),n.current||!r?null:p.createElement("div",{ref:t,...e,"cmdk-empty":"",role:"presentation"})}),Woe=p.forwardRef((e,t)=>{let{progress:n,children:r,...a}=e;return p.createElement("div",{ref:t,...a,"cmdk-loading":"",role:"progressbar","aria-valuenow":n,"aria-valuemin":0,"aria-valuemax":100,"aria-label":"Loading..."},p.createElement("div",{"aria-hidden":!0},r))}),Koe=Object.assign(Z8,{List:qoe,Item:X8,Input:J8,Group:Q8,Separator:Voe,Dialog:Goe,Empty:e9,Loading:Woe});function Yoe(e,t){let n=e.nextElementSibling;for(;n;){if(n.matches(t))return n;n=n.nextElementSibling}}function Zoe(e,t){let n=e.previousElementSibling;for(;n;){if(n.matches(t))return n;n=n.previousElementSibling}}function t9(e){let t=p.useRef(e);return Uc(()=>{t.current=e}),t}var Uc=typeof window>"u"?p.useEffect:p.useLayoutEffect;function dl(e){let t=p.useRef();return t.current===void 0&&(t.current=e()),t}function Sf(e){return t=>{e.forEach(n=>{typeof n=="function"?n(t):n!=null&&(n.current=t)})}}function Ec(e){let t=J_(),n=()=>e(t.snapshot());return p.useSyncExternalStore(t.subscribe,n,n)}function n9(e,t,n){let r=p.useRef(),a=vf();return Uc(()=>{var o;let i=(()=>{var s;for(let l of n){if(typeof l=="string")return l.trim().toLowerCase();if(typeof l=="object"&&"current"in l&&l.current)return(s=l.current.textContent)==null?void 0:s.trim().toLowerCase()}})();a.value(e,i),(o=t.current)==null||o.setAttribute(Vo,i),r.current=i}),r}var Xoe=()=>{let[e,t]=p.useState(),n=dl(()=>new Map);return Uc(()=>{n.current.forEach(r=>r()),n.current=new Map},[e]),(r,a)=>{n.current.set(r,a),t({})}},Qoe={position:"absolute",width:"1px",height:"1px",padding:"0",margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0"};const r9="Popover",[a9,fTe]=zn(r9,[qa]),eA=qa(),[Joe,Bc]=a9(r9),o9=e=>{const{__scopePopover:t,children:n,open:r,defaultOpen:a,onOpenChange:o,modal:i=!1}=e,s=eA(t),l=p.useRef(null),[c,u]=p.useState(!1),[d=!1,g]=Fa({prop:r,defaultProp:a,onChange:o});return p.createElement(ah,s,p.createElement(Joe,{scope:t,contentId:bi(),triggerRef:l,open:d,onOpenChange:g,onOpenToggle:p.useCallback(()=>g(m=>!m),[g]),hasCustomAnchor:c,onCustomAnchorAdd:p.useCallback(()=>u(!0),[]),onCustomAnchorRemove:p.useCallback(()=>u(!1),[]),modal:i},n))},eie="PopoverTrigger",i9=p.forwardRef((e,t)=>{const{__scopePopover:n,...r}=e,a=Bc(eie,n),o=eA(n),i=nt(t,a.triggerRef),s=p.createElement(ze.button,W({type:"button","aria-haspopup":"dialog","aria-expanded":a.open,"aria-controls":a.contentId,"data-state":u9(a.open)},r,{ref:i,onClick:fe(e.onClick,a.onOpenToggle)}));return a.hasCustomAnchor?s:p.createElement(pf,W({asChild:!0},o),s)}),s9="PopoverPortal",[tie,nie]=a9(s9,{forceMount:void 0}),rie=e=>{const{__scopePopover:t,forceMount:n,children:r,container:a}=e,o=Bc(s9,t);return p.createElement(tie,{scope:t,forceMount:n},p.createElement(pr,{present:n||o.open},p.createElement(Jd,{asChild:!0,container:a},r)))},Cd="PopoverContent",l9=p.forwardRef((e,t)=>{const n=nie(Cd,e.__scopePopover),{forceMount:r=n.forceMount,...a}=e,o=Bc(Cd,e.__scopePopover);return p.createElement(pr,{present:r||o.open},o.modal?p.createElement(aie,W({},a,{ref:t})):p.createElement(oie,W({},a,{ref:t})))}),aie=p.forwardRef((e,t)=>{const n=Bc(Cd,e.__scopePopover),r=p.useRef(null),a=nt(t,r),o=p.useRef(!1);return p.useEffect(()=>{const i=r.current;if(i)return mf(i)},[]),p.createElement(sh,{as:$a,allowPinchZoom:!0},p.createElement(c9,W({},e,{ref:a,trapFocus:n.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:fe(e.onCloseAutoFocus,i=>{var s;i.preventDefault(),o.current||(s=n.triggerRef.current)===null||s===void 0||s.focus()}),onPointerDownOutside:fe(e.onPointerDownOutside,i=>{const s=i.detail.originalEvent,l=s.button===0&&s.ctrlKey===!0,c=s.button===2||l;o.current=c},{checkForDefaultPrevented:!1}),onFocusOutside:fe(e.onFocusOutside,i=>i.preventDefault(),{checkForDefaultPrevented:!1})})))}),oie=p.forwardRef((e,t)=>{const n=Bc(Cd,e.__scopePopover),r=p.useRef(!1),a=p.useRef(!1);return p.createElement(c9,W({},e,{ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:o=>{var i;if((i=e.onCloseAutoFocus)===null||i===void 0||i.call(e,o),!o.defaultPrevented){var s;r.current||(s=n.triggerRef.current)===null||s===void 0||s.focus(),o.preventDefault()}r.current=!1,a.current=!1},onInteractOutside:o=>{var i,s;(i=e.onInteractOutside)===null||i===void 0||i.call(e,o),o.defaultPrevented||(r.current=!0,o.detail.originalEvent.type==="pointerdown"&&(a.current=!0));const l=o.target;((s=n.triggerRef.current)===null||s===void 0?void 0:s.contains(l))&&o.preventDefault(),o.detail.originalEvent.type==="focusin"&&a.current&&o.preventDefault()}}))}),c9=p.forwardRef((e,t)=>{const{__scopePopover:n,trapFocus:r,onOpenAutoFocus:a,onCloseAutoFocus:o,disableOutsidePointerEvents:i,onEscapeKeyDown:s,onPointerDownOutside:l,onFocusOutside:c,onInteractOutside:u,...d}=e,g=Bc(Cd,n),m=eA(n);return eh(),p.createElement(th,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:a,onUnmountAutoFocus:o},p.createElement(Ls,{asChild:!0,disableOutsidePointerEvents:i,onInteractOutside:u,onEscapeKeyDown:s,onPointerDownOutside:l,onFocusOutside:c,onDismiss:()=>g.onOpenChange(!1)},p.createElement(gf,W({"data-state":u9(g.open),role:"dialog",id:g.contentId},m,d,{ref:t,style:{...d.style,"--radix-popover-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-popover-content-available-width":"var(--radix-popper-available-width)","--radix-popover-content-available-height":"var(--radix-popper-available-height)","--radix-popover-trigger-width":"var(--radix-popper-anchor-width)","--radix-popover-trigger-height":"var(--radix-popper-anchor-height)"}}))))});function u9(e){return e?"open":"closed"}const iie=o9,sie=i9,lie=rie,d9=l9,uN=o9,dN=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(i9,{asChild:!0,...n,children:f.jsxs(ue,{variant:"outline",role:"combobox",className:ee("w-full justify-between font-normal py-2 px-3 hover:bg-transparent",e),children:[t,f.jsx(ZC,{className:"h-4 w-4 opacity-50"})]})})),fN=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(l9,{className:ee("PopoverContent z-50 bg-background rounded-md border"),...n,children:t})),pN=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(Koe,{className:ee("w-full",e),...n,children:t})),gN=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(J8,{className:ee("w-full pt-2 px-3 bg-background text-foreground border-b py-3 focus-visible:outline-none",e),...n,children:t})),mN=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(e9,{className:ee("w-full px-3 text-destructive text-sm",e),...n,children:t})),hN=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(Q8,{className:ee("w-full",e),...n,children:t})),bN=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(X8,{className:ee("w-full py-2 px-3 hover:bg-muted",e),...n,children:t})),cie=p.forwardRef((e,t)=>p.createElement(ze.label,W({},e,{ref:t,onMouseDown:n=>{var r;(r=e.onMouseDown)===null||r===void 0||r.call(e,n),!n.defaultPrevented&&n.detail>1&&n.preventDefault()}}))),f9=cie,uie=ef("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"),os=p.forwardRef(({className:e,...t},n)=>f.jsx(f9,{ref:n,className:ee(uie(),e),...t}));os.displayName=f9.displayName;const vn=dae,p9=p.createContext({}),ut=({...e})=>f.jsx(p9.Provider,{value:{name:e.name},children:f.jsx(mae,{...e})}),yh=()=>{const e=p.useContext(p9),t=p.useContext(g9),{getFieldState:n,formState:r}=Hs(),a=n(e.name,r);if(!e)throw new Error("useFormField should be used within ");const{id:o}=t;return{id:o,name:e.name,formItemId:`${o}-form-item`,formDescriptionId:`${o}-form-item-description`,formMessageId:`${o}-form-item-message`,...a}},g9=p.createContext({}),ot=p.forwardRef(({className:e,...t},n)=>{const r=p.useId();return f.jsx(g9.Provider,{value:{id:r},children:f.jsx("div",{ref:n,className:ee("space-y-2",e),...t})})});ot.displayName="FormItem";const yt=p.forwardRef(({className:e,...t},n)=>{const{error:r,formItemId:a}=yh();return f.jsx(os,{ref:n,className:ee(r&&"text-destructive",e),htmlFor:a,...t})});yt.displayName="FormLabel";const pt=p.forwardRef(({...e},t)=>{const{error:n,formItemId:r,formDescriptionId:a,formMessageId:o}=yh();return f.jsx($a,{ref:t,id:r,"aria-describedby":n?`${a} ${o}`:`${a}`,"aria-invalid":!!n,...e})});pt.displayName="FormControl";const Mt=p.forwardRef(({className:e,...t},n)=>{const{formDescriptionId:r}=yh();return f.jsx("p",{ref:n,id:r,className:ee("text-sm text-muted-foreground",e),...t})});Mt.displayName="FormDescription";const lt=p.forwardRef(({className:e,children:t,...n},r)=>{const{error:a,formMessageId:o}=yh(),i=a?String(a==null?void 0:a.message):t;return i?f.jsx("p",{ref:r,id:o,className:ee("text-sm font-medium text-destructive",e),...n,children:i}):null});lt.displayName="FormMessage";function die(){const e=p.useRef(null);return{formRef:e,onKeyDown:n=>{var r;n.key==="Enter"&&!n.shiftKey&&!n.nativeEvent.isComposing&&((r=e.current)==null||r.requestSubmit(),n.preventDefault())}}}const qs=p.forwardRef(({className:e,...t},n)=>f.jsx("textarea",{className:ee("flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),ref:n,...t}));qs.displayName="Textarea";const Ai=({limit:e,charCount:t,...n})=>f.jsxs("div",{className:"relative",children:[f.jsx(qs,{className:ee("min-h-80",n.className),...n}),f.jsxs("div",{className:"absolute bottom-2 right-2.5 text-xs text-muted-foreground",children:[t??0," / ",e]})]}),fie=(...e)=>ee("scroll-m-20 text-2xl font-semibold tracking-tight",e),pie=(...e)=>ee("rounded bg-muted px-[0.3rem] py-[0.2rem] font-mono text-sm font-semibold",e),Tt=(...e)=>ee("text-sm text-muted-foreground",e);var gt;(function(e){e.assertEqual=a=>a;function t(a){}e.assertIs=t;function n(a){throw new Error}e.assertNever=n,e.arrayToEnum=a=>{const o={};for(const i of a)o[i]=i;return o},e.getValidEnumValues=a=>{const o=e.objectKeys(a).filter(s=>typeof a[a[s]]!="number"),i={};for(const s of o)i[s]=a[s];return e.objectValues(i)},e.objectValues=a=>e.objectKeys(a).map(function(o){return a[o]}),e.objectKeys=typeof Object.keys=="function"?a=>Object.keys(a):a=>{const o=[];for(const i in a)Object.prototype.hasOwnProperty.call(a,i)&&o.push(i);return o},e.find=(a,o)=>{for(const i of a)if(o(i))return i},e.isInteger=typeof Number.isInteger=="function"?a=>Number.isInteger(a):a=>typeof a=="number"&&isFinite(a)&&Math.floor(a)===a;function r(a,o=" | "){return a.map(i=>typeof i=="string"?`'${i}'`:i).join(o)}e.joinValues=r,e.jsonStringifyReplacer=(a,o)=>typeof o=="bigint"?o.toString():o})(gt||(gt={}));var yN;(function(e){e.mergeShapes=(t,n)=>({...t,...n})})(yN||(yN={}));const ve=gt.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),Xi=e=>{switch(typeof e){case"undefined":return ve.undefined;case"string":return ve.string;case"number":return isNaN(e)?ve.nan:ve.number;case"boolean":return ve.boolean;case"function":return ve.function;case"bigint":return ve.bigint;case"symbol":return ve.symbol;case"object":return Array.isArray(e)?ve.array:e===null?ve.null:e.then&&typeof e.then=="function"&&e.catch&&typeof e.catch=="function"?ve.promise:typeof Map<"u"&&e instanceof Map?ve.map:typeof Set<"u"&&e instanceof Set?ve.set:typeof Date<"u"&&e instanceof Date?ve.date:ve.object;default:return ve.unknown}},ce=gt.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]);class Ma extends Error{constructor(t){super(),this.issues=[],this.addIssue=r=>{this.issues=[...this.issues,r]},this.addIssues=(r=[])=>{this.issues=[...this.issues,...r]};const n=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,n):this.__proto__=n,this.name="ZodError",this.issues=t}get errors(){return this.issues}format(t){const n=t||function(o){return o.message},r={_errors:[]},a=o=>{for(const i of o.issues)if(i.code==="invalid_union")i.unionErrors.map(a);else if(i.code==="invalid_return_type")a(i.returnTypeError);else if(i.code==="invalid_arguments")a(i.argumentsError);else if(i.path.length===0)r._errors.push(n(i));else{let s=r,l=0;for(;ln.message){const n={},r=[];for(const a of this.issues)a.path.length>0?(n[a.path[0]]=n[a.path[0]]||[],n[a.path[0]].push(t(a))):r.push(t(a));return{formErrors:r,fieldErrors:n}}get formErrors(){return this.flatten()}}Ma.create=e=>new Ma(e);const qg=(e,t)=>{let n;switch(e.code){case ce.invalid_type:e.received===ve.undefined?n="Required":n=`Expected ${e.expected}, received ${e.received}`;break;case ce.invalid_literal:n=`Invalid literal value, expected ${JSON.stringify(e.expected,gt.jsonStringifyReplacer)}`;break;case ce.unrecognized_keys:n=`Unrecognized key(s) in object: ${gt.joinValues(e.keys,", ")}`;break;case ce.invalid_union:n="Invalid input";break;case ce.invalid_union_discriminator:n=`Invalid discriminator value. Expected ${gt.joinValues(e.options)}`;break;case ce.invalid_enum_value:n=`Invalid enum value. Expected ${gt.joinValues(e.options)}, received '${e.received}'`;break;case ce.invalid_arguments:n="Invalid function arguments";break;case ce.invalid_return_type:n="Invalid function return type";break;case ce.invalid_date:n="Invalid date";break;case ce.invalid_string:typeof e.validation=="object"?"includes"in e.validation?(n=`Invalid input: must include "${e.validation.includes}"`,typeof e.validation.position=="number"&&(n=`${n} at one or more positions greater than or equal to ${e.validation.position}`)):"startsWith"in e.validation?n=`Invalid input: must start with "${e.validation.startsWith}"`:"endsWith"in e.validation?n=`Invalid input: must end with "${e.validation.endsWith}"`:gt.assertNever(e.validation):e.validation!=="regex"?n=`Invalid ${e.validation}`:n="Invalid";break;case ce.too_small:e.type==="array"?n=`Array must contain ${e.exact?"exactly":e.inclusive?"at least":"more than"} ${e.minimum} element(s)`:e.type==="string"?n=`String must contain ${e.exact?"exactly":e.inclusive?"at least":"over"} ${e.minimum} character(s)`:e.type==="number"?n=`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:e.type==="date"?n=`Date must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(e.minimum))}`:n="Invalid input";break;case ce.too_big:e.type==="array"?n=`Array must contain ${e.exact?"exactly":e.inclusive?"at most":"less than"} ${e.maximum} element(s)`:e.type==="string"?n=`String must contain ${e.exact?"exactly":e.inclusive?"at most":"under"} ${e.maximum} character(s)`:e.type==="number"?n=`Number must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="bigint"?n=`BigInt must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="date"?n=`Date must be ${e.exact?"exactly":e.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(e.maximum))}`:n="Invalid input";break;case ce.custom:n="Invalid input";break;case ce.invalid_intersection_types:n="Intersection results could not be merged";break;case ce.not_multiple_of:n=`Number must be a multiple of ${e.multipleOf}`;break;case ce.not_finite:n="Number must be finite";break;default:n=t.defaultError,gt.assertNever(e)}return{message:n}};let gie=qg;function vk(){return gie}const Sk=e=>{const{data:t,path:n,errorMaps:r,issueData:a}=e,o=[...n,...a.path||[]],i={...a,path:o};let s="";const l=r.filter(c=>!!c).slice().reverse();for(const c of l)s=c(i,{data:t,defaultError:s}).message;return{...a,path:o,message:a.message||s}};function we(e,t){const n=Sk({issueData:t,data:e.data,path:e.path,errorMaps:[e.common.contextualErrorMap,e.schemaErrorMap,vk(),qg].filter(r=>!!r)});e.common.issues.push(n)}class Qn{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(t,n){const r=[];for(const a of n){if(a.status==="aborted")return Ge;a.status==="dirty"&&t.dirty(),r.push(a.value)}return{status:t.value,value:r}}static async mergeObjectAsync(t,n){const r=[];for(const a of n)r.push({key:await a.key,value:await a.value});return Qn.mergeObjectSync(t,r)}static mergeObjectSync(t,n){const r={};for(const a of n){const{key:o,value:i}=a;if(o.status==="aborted"||i.status==="aborted")return Ge;o.status==="dirty"&&t.dirty(),i.status==="dirty"&&t.dirty(),o.value!=="__proto__"&&(typeof i.value<"u"||a.alwaysSet)&&(r[o.value]=i.value)}return{status:t.value,value:r}}}const Ge=Object.freeze({status:"aborted"}),mie=e=>({status:"dirty",value:e}),dr=e=>({status:"valid",value:e}),vN=e=>e.status==="aborted",SN=e=>e.status==="dirty",Gg=e=>e.status==="valid",wk=e=>typeof Promise<"u"&&e instanceof Promise;var Ne;(function(e){e.errToObj=t=>typeof t=="string"?{message:t}:t||{},e.toString=t=>typeof t=="string"?t:t==null?void 0:t.message})(Ne||(Ne={}));class Ba{constructor(t,n,r,a){this._cachedPath=[],this.parent=t,this.data=n,this._path=r,this._key=a}get path(){return this._cachedPath.length||(this._key instanceof Array?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}}const wN=(e,t)=>{if(Gg(t))return{success:!0,data:t.value};if(!e.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;const n=new Ma(e.common.issues);return this._error=n,this._error}}};function qe(e){if(!e)return{};const{errorMap:t,invalid_type_error:n,required_error:r,description:a}=e;if(t&&(n||r))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return t?{errorMap:t,description:a}:{errorMap:(i,s)=>i.code!=="invalid_type"?{message:s.defaultError}:typeof s.data>"u"?{message:r??s.defaultError}:{message:n??s.defaultError},description:a}}class rt{constructor(t){this.spa=this.safeParseAsync,this._def=t,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this)}get description(){return this._def.description}_getType(t){return Xi(t.data)}_getOrReturnCtx(t,n){return n||{common:t.parent.common,data:t.data,parsedType:Xi(t.data),schemaErrorMap:this._def.errorMap,path:t.path,parent:t.parent}}_processInputParams(t){return{status:new Qn,ctx:{common:t.parent.common,data:t.data,parsedType:Xi(t.data),schemaErrorMap:this._def.errorMap,path:t.path,parent:t.parent}}}_parseSync(t){const n=this._parse(t);if(wk(n))throw new Error("Synchronous parse encountered promise.");return n}_parseAsync(t){const n=this._parse(t);return Promise.resolve(n)}parse(t,n){const r=this.safeParse(t,n);if(r.success)return r.data;throw r.error}safeParse(t,n){var r;const a={common:{issues:[],async:(r=n==null?void 0:n.async)!==null&&r!==void 0?r:!1,contextualErrorMap:n==null?void 0:n.errorMap},path:(n==null?void 0:n.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:Xi(t)},o=this._parseSync({data:t,path:a.path,parent:a});return wN(a,o)}async parseAsync(t,n){const r=await this.safeParseAsync(t,n);if(r.success)return r.data;throw r.error}async safeParseAsync(t,n){const r={common:{issues:[],contextualErrorMap:n==null?void 0:n.errorMap,async:!0},path:(n==null?void 0:n.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:Xi(t)},a=this._parse({data:t,path:r.path,parent:r}),o=await(wk(a)?a:Promise.resolve(a));return wN(r,o)}refine(t,n){const r=a=>typeof n=="string"||typeof n>"u"?{message:n}:typeof n=="function"?n(a):n;return this._refinement((a,o)=>{const i=t(a),s=()=>o.addIssue({code:ce.custom,...r(a)});return typeof Promise<"u"&&i instanceof Promise?i.then(l=>l?!0:(s(),!1)):i?!0:(s(),!1)})}refinement(t,n){return this._refinement((r,a)=>t(r)?!0:(a.addIssue(typeof n=="function"?n(r,a):n),!1))}_refinement(t){return new xo({schema:this,typeName:Me.ZodEffects,effect:{type:"refinement",refinement:t}})}superRefine(t){return this._refinement(t)}optional(){return yi.create(this,this._def)}nullable(){return _c.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return Pa.create(this,this._def)}promise(){return Td.create(this,this._def)}or(t){return Yg.create([this,t],this._def)}and(t){return Zg.create(this,t,this._def)}transform(t){return new xo({...qe(this._def),schema:this,typeName:Me.ZodEffects,effect:{type:"transform",transform:t}})}default(t){const n=typeof t=="function"?t:()=>t;return new tm({...qe(this._def),innerType:this,defaultValue:n,typeName:Me.ZodDefault})}brand(){return new Aie({typeName:Me.ZodBranded,type:this,...qe(this._def)})}catch(t){const n=typeof t=="function"?t:()=>t;return new Ak({...qe(this._def),innerType:this,catchValue:n,typeName:Me.ZodCatch})}describe(t){const n=this.constructor;return new n({...this._def,description:t})}pipe(t){return vh.create(this,t)}readonly(){return Rk.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}const hie=/^c[^\s-]{8,}$/i,bie=/^[a-z][a-z0-9]*$/,yie=/^[0-9A-HJKMNP-TV-Z]{26}$/,vie=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,Sie=/^(?!\.)(?!.*\.\.)([A-Z0-9_+-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,wie="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$";let py;const Eie=/^(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))$/,xie=/^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,kie=e=>e.precision?e.offset?new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${e.precision}}(([+-]\\d{2}(:?\\d{2})?)|Z)$`):new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${e.precision}}Z$`):e.precision===0?e.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(([+-]\\d{2}(:?\\d{2})?)|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$"):e.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}(:?\\d{2})?)|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$");function Cie(e,t){return!!((t==="v4"||!t)&&Eie.test(e)||(t==="v6"||!t)&&xie.test(e))}class lo extends rt{_parse(t){if(this._def.coerce&&(t.data=String(t.data)),this._getType(t)!==ve.string){const o=this._getOrReturnCtx(t);return we(o,{code:ce.invalid_type,expected:ve.string,received:o.parsedType}),Ge}const r=new Qn;let a;for(const o of this._def.checks)if(o.kind==="min")t.data.lengtho.value&&(a=this._getOrReturnCtx(t,a),we(a,{code:ce.too_big,maximum:o.value,type:"string",inclusive:!0,exact:!1,message:o.message}),r.dirty());else if(o.kind==="length"){const i=t.data.length>o.value,s=t.data.lengtht.test(a),{validation:n,code:ce.invalid_string,...Ne.errToObj(r)})}_addCheck(t){return new lo({...this._def,checks:[...this._def.checks,t]})}email(t){return this._addCheck({kind:"email",...Ne.errToObj(t)})}url(t){return this._addCheck({kind:"url",...Ne.errToObj(t)})}emoji(t){return this._addCheck({kind:"emoji",...Ne.errToObj(t)})}uuid(t){return this._addCheck({kind:"uuid",...Ne.errToObj(t)})}cuid(t){return this._addCheck({kind:"cuid",...Ne.errToObj(t)})}cuid2(t){return this._addCheck({kind:"cuid2",...Ne.errToObj(t)})}ulid(t){return this._addCheck({kind:"ulid",...Ne.errToObj(t)})}ip(t){return this._addCheck({kind:"ip",...Ne.errToObj(t)})}datetime(t){var n;return typeof t=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,message:t}):this._addCheck({kind:"datetime",precision:typeof(t==null?void 0:t.precision)>"u"?null:t==null?void 0:t.precision,offset:(n=t==null?void 0:t.offset)!==null&&n!==void 0?n:!1,...Ne.errToObj(t==null?void 0:t.message)})}regex(t,n){return this._addCheck({kind:"regex",regex:t,...Ne.errToObj(n)})}includes(t,n){return this._addCheck({kind:"includes",value:t,position:n==null?void 0:n.position,...Ne.errToObj(n==null?void 0:n.message)})}startsWith(t,n){return this._addCheck({kind:"startsWith",value:t,...Ne.errToObj(n)})}endsWith(t,n){return this._addCheck({kind:"endsWith",value:t,...Ne.errToObj(n)})}min(t,n){return this._addCheck({kind:"min",value:t,...Ne.errToObj(n)})}max(t,n){return this._addCheck({kind:"max",value:t,...Ne.errToObj(n)})}length(t,n){return this._addCheck({kind:"length",value:t,...Ne.errToObj(n)})}nonempty(t){return this.min(1,Ne.errToObj(t))}trim(){return new lo({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new lo({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new lo({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(t=>t.kind==="datetime")}get isEmail(){return!!this._def.checks.find(t=>t.kind==="email")}get isURL(){return!!this._def.checks.find(t=>t.kind==="url")}get isEmoji(){return!!this._def.checks.find(t=>t.kind==="emoji")}get isUUID(){return!!this._def.checks.find(t=>t.kind==="uuid")}get isCUID(){return!!this._def.checks.find(t=>t.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(t=>t.kind==="cuid2")}get isULID(){return!!this._def.checks.find(t=>t.kind==="ulid")}get isIP(){return!!this._def.checks.find(t=>t.kind==="ip")}get minLength(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxLength(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.value{var t;return new lo({checks:[],typeName:Me.ZodString,coerce:(t=e==null?void 0:e.coerce)!==null&&t!==void 0?t:!1,...qe(e)})};function _ie(e,t){const n=(e.toString().split(".")[1]||"").length,r=(t.toString().split(".")[1]||"").length,a=n>r?n:r,o=parseInt(e.toFixed(a).replace(".","")),i=parseInt(t.toFixed(a).replace(".",""));return o%i/Math.pow(10,a)}class xc extends rt{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(t){if(this._def.coerce&&(t.data=Number(t.data)),this._getType(t)!==ve.number){const o=this._getOrReturnCtx(t);return we(o,{code:ce.invalid_type,expected:ve.number,received:o.parsedType}),Ge}let r;const a=new Qn;for(const o of this._def.checks)o.kind==="int"?gt.isInteger(t.data)||(r=this._getOrReturnCtx(t,r),we(r,{code:ce.invalid_type,expected:"integer",received:"float",message:o.message}),a.dirty()):o.kind==="min"?(o.inclusive?t.datao.value:t.data>=o.value)&&(r=this._getOrReturnCtx(t,r),we(r,{code:ce.too_big,maximum:o.value,type:"number",inclusive:o.inclusive,exact:!1,message:o.message}),a.dirty()):o.kind==="multipleOf"?_ie(t.data,o.value)!==0&&(r=this._getOrReturnCtx(t,r),we(r,{code:ce.not_multiple_of,multipleOf:o.value,message:o.message}),a.dirty()):o.kind==="finite"?Number.isFinite(t.data)||(r=this._getOrReturnCtx(t,r),we(r,{code:ce.not_finite,message:o.message}),a.dirty()):gt.assertNever(o);return{status:a.value,value:t.data}}gte(t,n){return this.setLimit("min",t,!0,Ne.toString(n))}gt(t,n){return this.setLimit("min",t,!1,Ne.toString(n))}lte(t,n){return this.setLimit("max",t,!0,Ne.toString(n))}lt(t,n){return this.setLimit("max",t,!1,Ne.toString(n))}setLimit(t,n,r,a){return new xc({...this._def,checks:[...this._def.checks,{kind:t,value:n,inclusive:r,message:Ne.toString(a)}]})}_addCheck(t){return new xc({...this._def,checks:[...this._def.checks,t]})}int(t){return this._addCheck({kind:"int",message:Ne.toString(t)})}positive(t){return this._addCheck({kind:"min",value:0,inclusive:!1,message:Ne.toString(t)})}negative(t){return this._addCheck({kind:"max",value:0,inclusive:!1,message:Ne.toString(t)})}nonpositive(t){return this._addCheck({kind:"max",value:0,inclusive:!0,message:Ne.toString(t)})}nonnegative(t){return this._addCheck({kind:"min",value:0,inclusive:!0,message:Ne.toString(t)})}multipleOf(t,n){return this._addCheck({kind:"multipleOf",value:t,message:Ne.toString(n)})}finite(t){return this._addCheck({kind:"finite",message:Ne.toString(t)})}safe(t){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:Ne.toString(t)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:Ne.toString(t)})}get minValue(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxValue(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.valuet.kind==="int"||t.kind==="multipleOf"&>.isInteger(t.value))}get isFinite(){let t=null,n=null;for(const r of this._def.checks){if(r.kind==="finite"||r.kind==="int"||r.kind==="multipleOf")return!0;r.kind==="min"?(n===null||r.value>n)&&(n=r.value):r.kind==="max"&&(t===null||r.valuenew xc({checks:[],typeName:Me.ZodNumber,coerce:(e==null?void 0:e.coerce)||!1,...qe(e)});class kc extends rt{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(t){if(this._def.coerce&&(t.data=BigInt(t.data)),this._getType(t)!==ve.bigint){const o=this._getOrReturnCtx(t);return we(o,{code:ce.invalid_type,expected:ve.bigint,received:o.parsedType}),Ge}let r;const a=new Qn;for(const o of this._def.checks)o.kind==="min"?(o.inclusive?t.datao.value:t.data>=o.value)&&(r=this._getOrReturnCtx(t,r),we(r,{code:ce.too_big,type:"bigint",maximum:o.value,inclusive:o.inclusive,message:o.message}),a.dirty()):o.kind==="multipleOf"?t.data%o.value!==BigInt(0)&&(r=this._getOrReturnCtx(t,r),we(r,{code:ce.not_multiple_of,multipleOf:o.value,message:o.message}),a.dirty()):gt.assertNever(o);return{status:a.value,value:t.data}}gte(t,n){return this.setLimit("min",t,!0,Ne.toString(n))}gt(t,n){return this.setLimit("min",t,!1,Ne.toString(n))}lte(t,n){return this.setLimit("max",t,!0,Ne.toString(n))}lt(t,n){return this.setLimit("max",t,!1,Ne.toString(n))}setLimit(t,n,r,a){return new kc({...this._def,checks:[...this._def.checks,{kind:t,value:n,inclusive:r,message:Ne.toString(a)}]})}_addCheck(t){return new kc({...this._def,checks:[...this._def.checks,t]})}positive(t){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:Ne.toString(t)})}negative(t){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:Ne.toString(t)})}nonpositive(t){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:Ne.toString(t)})}nonnegative(t){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:Ne.toString(t)})}multipleOf(t,n){return this._addCheck({kind:"multipleOf",value:t,message:Ne.toString(n)})}get minValue(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxValue(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.value{var t;return new kc({checks:[],typeName:Me.ZodBigInt,coerce:(t=e==null?void 0:e.coerce)!==null&&t!==void 0?t:!1,...qe(e)})};class Ek extends rt{_parse(t){if(this._def.coerce&&(t.data=!!t.data),this._getType(t)!==ve.boolean){const r=this._getOrReturnCtx(t);return we(r,{code:ce.invalid_type,expected:ve.boolean,received:r.parsedType}),Ge}return dr(t.data)}}Ek.create=e=>new Ek({typeName:Me.ZodBoolean,coerce:(e==null?void 0:e.coerce)||!1,...qe(e)});class _d extends rt{_parse(t){if(this._def.coerce&&(t.data=new Date(t.data)),this._getType(t)!==ve.date){const o=this._getOrReturnCtx(t);return we(o,{code:ce.invalid_type,expected:ve.date,received:o.parsedType}),Ge}if(isNaN(t.data.getTime())){const o=this._getOrReturnCtx(t);return we(o,{code:ce.invalid_date}),Ge}const r=new Qn;let a;for(const o of this._def.checks)o.kind==="min"?t.data.getTime()o.value&&(a=this._getOrReturnCtx(t,a),we(a,{code:ce.too_big,message:o.message,inclusive:!0,exact:!1,maximum:o.value,type:"date"}),r.dirty()):gt.assertNever(o);return{status:r.value,value:new Date(t.data.getTime())}}_addCheck(t){return new _d({...this._def,checks:[...this._def.checks,t]})}min(t,n){return this._addCheck({kind:"min",value:t.getTime(),message:Ne.toString(n)})}max(t,n){return this._addCheck({kind:"max",value:t.getTime(),message:Ne.toString(n)})}get minDate(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t!=null?new Date(t):null}get maxDate(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.valuenew _d({checks:[],coerce:(e==null?void 0:e.coerce)||!1,typeName:Me.ZodDate,...qe(e)});class xk extends rt{_parse(t){if(this._getType(t)!==ve.symbol){const r=this._getOrReturnCtx(t);return we(r,{code:ce.invalid_type,expected:ve.symbol,received:r.parsedType}),Ge}return dr(t.data)}}xk.create=e=>new xk({typeName:Me.ZodSymbol,...qe(e)});class Wg extends rt{_parse(t){if(this._getType(t)!==ve.undefined){const r=this._getOrReturnCtx(t);return we(r,{code:ce.invalid_type,expected:ve.undefined,received:r.parsedType}),Ge}return dr(t.data)}}Wg.create=e=>new Wg({typeName:Me.ZodUndefined,...qe(e)});class Kg extends rt{_parse(t){if(this._getType(t)!==ve.null){const r=this._getOrReturnCtx(t);return we(r,{code:ce.invalid_type,expected:ve.null,received:r.parsedType}),Ge}return dr(t.data)}}Kg.create=e=>new Kg({typeName:Me.ZodNull,...qe(e)});class Ad extends rt{constructor(){super(...arguments),this._any=!0}_parse(t){return dr(t.data)}}Ad.create=e=>new Ad({typeName:Me.ZodAny,...qe(e)});class Hl extends rt{constructor(){super(...arguments),this._unknown=!0}_parse(t){return dr(t.data)}}Hl.create=e=>new Hl({typeName:Me.ZodUnknown,...qe(e)});class Ti extends rt{_parse(t){const n=this._getOrReturnCtx(t);return we(n,{code:ce.invalid_type,expected:ve.never,received:n.parsedType}),Ge}}Ti.create=e=>new Ti({typeName:Me.ZodNever,...qe(e)});class kk extends rt{_parse(t){if(this._getType(t)!==ve.undefined){const r=this._getOrReturnCtx(t);return we(r,{code:ce.invalid_type,expected:ve.void,received:r.parsedType}),Ge}return dr(t.data)}}kk.create=e=>new kk({typeName:Me.ZodVoid,...qe(e)});class Pa extends rt{_parse(t){const{ctx:n,status:r}=this._processInputParams(t),a=this._def;if(n.parsedType!==ve.array)return we(n,{code:ce.invalid_type,expected:ve.array,received:n.parsedType}),Ge;if(a.exactLength!==null){const i=n.data.length>a.exactLength.value,s=n.data.lengtha.maxLength.value&&(we(n,{code:ce.too_big,maximum:a.maxLength.value,type:"array",inclusive:!0,exact:!1,message:a.maxLength.message}),r.dirty()),n.common.async)return Promise.all([...n.data].map((i,s)=>a.type._parseAsync(new Ba(n,i,n.path,s)))).then(i=>Qn.mergeArray(r,i));const o=[...n.data].map((i,s)=>a.type._parseSync(new Ba(n,i,n.path,s)));return Qn.mergeArray(r,o)}get element(){return this._def.type}min(t,n){return new Pa({...this._def,minLength:{value:t,message:Ne.toString(n)}})}max(t,n){return new Pa({...this._def,maxLength:{value:t,message:Ne.toString(n)}})}length(t,n){return new Pa({...this._def,exactLength:{value:t,message:Ne.toString(n)}})}nonempty(t){return this.min(1,t)}}Pa.create=(e,t)=>new Pa({type:e,minLength:null,maxLength:null,exactLength:null,typeName:Me.ZodArray,...qe(t)});function fl(e){if(e instanceof qt){const t={};for(const n in e.shape){const r=e.shape[n];t[n]=yi.create(fl(r))}return new qt({...e._def,shape:()=>t})}else return e instanceof Pa?new Pa({...e._def,type:fl(e.element)}):e instanceof yi?yi.create(fl(e.unwrap())):e instanceof _c?_c.create(fl(e.unwrap())):e instanceof Eo?Eo.create(e.items.map(t=>fl(t))):e}class qt extends rt{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;const t=this._def.shape(),n=gt.objectKeys(t);return this._cached={shape:t,keys:n}}_parse(t){if(this._getType(t)!==ve.object){const c=this._getOrReturnCtx(t);return we(c,{code:ce.invalid_type,expected:ve.object,received:c.parsedType}),Ge}const{status:r,ctx:a}=this._processInputParams(t),{shape:o,keys:i}=this._getCached(),s=[];if(!(this._def.catchall instanceof Ti&&this._def.unknownKeys==="strip"))for(const c in a.data)i.includes(c)||s.push(c);const l=[];for(const c of i){const u=o[c],d=a.data[c];l.push({key:{status:"valid",value:c},value:u._parse(new Ba(a,d,a.path,c)),alwaysSet:c in a.data})}if(this._def.catchall instanceof Ti){const c=this._def.unknownKeys;if(c==="passthrough")for(const u of s)l.push({key:{status:"valid",value:u},value:{status:"valid",value:a.data[u]}});else if(c==="strict")s.length>0&&(we(a,{code:ce.unrecognized_keys,keys:s}),r.dirty());else if(c!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{const c=this._def.catchall;for(const u of s){const d=a.data[u];l.push({key:{status:"valid",value:u},value:c._parse(new Ba(a,d,a.path,u)),alwaysSet:u in a.data})}}return a.common.async?Promise.resolve().then(async()=>{const c=[];for(const u of l){const d=await u.key;c.push({key:d,value:await u.value,alwaysSet:u.alwaysSet})}return c}).then(c=>Qn.mergeObjectSync(r,c)):Qn.mergeObjectSync(r,l)}get shape(){return this._def.shape()}strict(t){return Ne.errToObj,new qt({...this._def,unknownKeys:"strict",...t!==void 0?{errorMap:(n,r)=>{var a,o,i,s;const l=(i=(o=(a=this._def).errorMap)===null||o===void 0?void 0:o.call(a,n,r).message)!==null&&i!==void 0?i:r.defaultError;return n.code==="unrecognized_keys"?{message:(s=Ne.errToObj(t).message)!==null&&s!==void 0?s:l}:{message:l}}}:{}})}strip(){return new qt({...this._def,unknownKeys:"strip"})}passthrough(){return new qt({...this._def,unknownKeys:"passthrough"})}extend(t){return new qt({...this._def,shape:()=>({...this._def.shape(),...t})})}merge(t){return new qt({unknownKeys:t._def.unknownKeys,catchall:t._def.catchall,shape:()=>({...this._def.shape(),...t._def.shape()}),typeName:Me.ZodObject})}setKey(t,n){return this.augment({[t]:n})}catchall(t){return new qt({...this._def,catchall:t})}pick(t){const n={};return gt.objectKeys(t).forEach(r=>{t[r]&&this.shape[r]&&(n[r]=this.shape[r])}),new qt({...this._def,shape:()=>n})}omit(t){const n={};return gt.objectKeys(this.shape).forEach(r=>{t[r]||(n[r]=this.shape[r])}),new qt({...this._def,shape:()=>n})}deepPartial(){return fl(this)}partial(t){const n={};return gt.objectKeys(this.shape).forEach(r=>{const a=this.shape[r];t&&!t[r]?n[r]=a:n[r]=a.optional()}),new qt({...this._def,shape:()=>n})}required(t){const n={};return gt.objectKeys(this.shape).forEach(r=>{if(t&&!t[r])n[r]=this.shape[r];else{let o=this.shape[r];for(;o instanceof yi;)o=o._def.innerType;n[r]=o}}),new qt({...this._def,shape:()=>n})}keyof(){return m9(gt.objectKeys(this.shape))}}qt.create=(e,t)=>new qt({shape:()=>e,unknownKeys:"strip",catchall:Ti.create(),typeName:Me.ZodObject,...qe(t)});qt.strictCreate=(e,t)=>new qt({shape:()=>e,unknownKeys:"strict",catchall:Ti.create(),typeName:Me.ZodObject,...qe(t)});qt.lazycreate=(e,t)=>new qt({shape:e,unknownKeys:"strip",catchall:Ti.create(),typeName:Me.ZodObject,...qe(t)});class Yg extends rt{_parse(t){const{ctx:n}=this._processInputParams(t),r=this._def.options;function a(o){for(const s of o)if(s.result.status==="valid")return s.result;for(const s of o)if(s.result.status==="dirty")return n.common.issues.push(...s.ctx.common.issues),s.result;const i=o.map(s=>new Ma(s.ctx.common.issues));return we(n,{code:ce.invalid_union,unionErrors:i}),Ge}if(n.common.async)return Promise.all(r.map(async o=>{const i={...n,common:{...n.common,issues:[]},parent:null};return{result:await o._parseAsync({data:n.data,path:n.path,parent:i}),ctx:i}})).then(a);{let o;const i=[];for(const l of r){const c={...n,common:{...n.common,issues:[]},parent:null},u=l._parseSync({data:n.data,path:n.path,parent:c});if(u.status==="valid")return u;u.status==="dirty"&&!o&&(o={result:u,ctx:c}),c.common.issues.length&&i.push(c.common.issues)}if(o)return n.common.issues.push(...o.ctx.common.issues),o.result;const s=i.map(l=>new Ma(l));return we(n,{code:ce.invalid_union,unionErrors:s}),Ge}}get options(){return this._def.options}}Yg.create=(e,t)=>new Yg({options:e,typeName:Me.ZodUnion,...qe(t)});const Wp=e=>e instanceof Qg?Wp(e.schema):e instanceof xo?Wp(e.innerType()):e instanceof Jg?[e.value]:e instanceof Ns?e.options:e instanceof em?Object.keys(e.enum):e instanceof tm?Wp(e._def.innerType):e instanceof Wg?[void 0]:e instanceof Kg?[null]:null;class tA extends rt{_parse(t){const{ctx:n}=this._processInputParams(t);if(n.parsedType!==ve.object)return we(n,{code:ce.invalid_type,expected:ve.object,received:n.parsedType}),Ge;const r=this.discriminator,a=n.data[r],o=this.optionsMap.get(a);return o?n.common.async?o._parseAsync({data:n.data,path:n.path,parent:n}):o._parseSync({data:n.data,path:n.path,parent:n}):(we(n,{code:ce.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[r]}),Ge)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(t,n,r){const a=new Map;for(const o of n){const i=Wp(o.shape[t]);if(!i)throw new Error(`A discriminator value for key \`${t}\` could not be extracted from all schema options`);for(const s of i){if(a.has(s))throw new Error(`Discriminator property ${String(t)} has duplicate value ${String(s)}`);a.set(s,o)}}return new tA({typeName:Me.ZodDiscriminatedUnion,discriminator:t,options:n,optionsMap:a,...qe(r)})}}function Ck(e,t){const n=Xi(e),r=Xi(t);if(e===t)return{valid:!0,data:e};if(n===ve.object&&r===ve.object){const a=gt.objectKeys(t),o=gt.objectKeys(e).filter(s=>a.indexOf(s)!==-1),i={...e,...t};for(const s of o){const l=Ck(e[s],t[s]);if(!l.valid)return{valid:!1};i[s]=l.data}return{valid:!0,data:i}}else if(n===ve.array&&r===ve.array){if(e.length!==t.length)return{valid:!1};const a=[];for(let o=0;o{if(vN(o)||vN(i))return Ge;const s=Ck(o.value,i.value);return s.valid?((SN(o)||SN(i))&&n.dirty(),{status:n.value,value:s.data}):(we(r,{code:ce.invalid_intersection_types}),Ge)};return r.common.async?Promise.all([this._def.left._parseAsync({data:r.data,path:r.path,parent:r}),this._def.right._parseAsync({data:r.data,path:r.path,parent:r})]).then(([o,i])=>a(o,i)):a(this._def.left._parseSync({data:r.data,path:r.path,parent:r}),this._def.right._parseSync({data:r.data,path:r.path,parent:r}))}}Zg.create=(e,t,n)=>new Zg({left:e,right:t,typeName:Me.ZodIntersection,...qe(n)});class Eo extends rt{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==ve.array)return we(r,{code:ce.invalid_type,expected:ve.array,received:r.parsedType}),Ge;if(r.data.lengththis._def.items.length&&(we(r,{code:ce.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),n.dirty());const o=[...r.data].map((i,s)=>{const l=this._def.items[s]||this._def.rest;return l?l._parse(new Ba(r,i,r.path,s)):null}).filter(i=>!!i);return r.common.async?Promise.all(o).then(i=>Qn.mergeArray(n,i)):Qn.mergeArray(n,o)}get items(){return this._def.items}rest(t){return new Eo({...this._def,rest:t})}}Eo.create=(e,t)=>{if(!Array.isArray(e))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new Eo({items:e,typeName:Me.ZodTuple,rest:null,...qe(t)})};class Xg extends rt{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==ve.object)return we(r,{code:ce.invalid_type,expected:ve.object,received:r.parsedType}),Ge;const a=[],o=this._def.keyType,i=this._def.valueType;for(const s in r.data)a.push({key:o._parse(new Ba(r,s,r.path,s)),value:i._parse(new Ba(r,r.data[s],r.path,s))});return r.common.async?Qn.mergeObjectAsync(n,a):Qn.mergeObjectSync(n,a)}get element(){return this._def.valueType}static create(t,n,r){return n instanceof rt?new Xg({keyType:t,valueType:n,typeName:Me.ZodRecord,...qe(r)}):new Xg({keyType:lo.create(),valueType:t,typeName:Me.ZodRecord,...qe(n)})}}class _k extends rt{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==ve.map)return we(r,{code:ce.invalid_type,expected:ve.map,received:r.parsedType}),Ge;const a=this._def.keyType,o=this._def.valueType,i=[...r.data.entries()].map(([s,l],c)=>({key:a._parse(new Ba(r,s,r.path,[c,"key"])),value:o._parse(new Ba(r,l,r.path,[c,"value"]))}));if(r.common.async){const s=new Map;return Promise.resolve().then(async()=>{for(const l of i){const c=await l.key,u=await l.value;if(c.status==="aborted"||u.status==="aborted")return Ge;(c.status==="dirty"||u.status==="dirty")&&n.dirty(),s.set(c.value,u.value)}return{status:n.value,value:s}})}else{const s=new Map;for(const l of i){const c=l.key,u=l.value;if(c.status==="aborted"||u.status==="aborted")return Ge;(c.status==="dirty"||u.status==="dirty")&&n.dirty(),s.set(c.value,u.value)}return{status:n.value,value:s}}}}_k.create=(e,t,n)=>new _k({valueType:t,keyType:e,typeName:Me.ZodMap,...qe(n)});class Cc extends rt{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==ve.set)return we(r,{code:ce.invalid_type,expected:ve.set,received:r.parsedType}),Ge;const a=this._def;a.minSize!==null&&r.data.sizea.maxSize.value&&(we(r,{code:ce.too_big,maximum:a.maxSize.value,type:"set",inclusive:!0,exact:!1,message:a.maxSize.message}),n.dirty());const o=this._def.valueType;function i(l){const c=new Set;for(const u of l){if(u.status==="aborted")return Ge;u.status==="dirty"&&n.dirty(),c.add(u.value)}return{status:n.value,value:c}}const s=[...r.data.values()].map((l,c)=>o._parse(new Ba(r,l,r.path,c)));return r.common.async?Promise.all(s).then(l=>i(l)):i(s)}min(t,n){return new Cc({...this._def,minSize:{value:t,message:Ne.toString(n)}})}max(t,n){return new Cc({...this._def,maxSize:{value:t,message:Ne.toString(n)}})}size(t,n){return this.min(t,n).max(t,n)}nonempty(t){return this.min(1,t)}}Cc.create=(e,t)=>new Cc({valueType:e,minSize:null,maxSize:null,typeName:Me.ZodSet,...qe(t)});class Gu extends rt{constructor(){super(...arguments),this.validate=this.implement}_parse(t){const{ctx:n}=this._processInputParams(t);if(n.parsedType!==ve.function)return we(n,{code:ce.invalid_type,expected:ve.function,received:n.parsedType}),Ge;function r(s,l){return Sk({data:s,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,vk(),qg].filter(c=>!!c),issueData:{code:ce.invalid_arguments,argumentsError:l}})}function a(s,l){return Sk({data:s,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,vk(),qg].filter(c=>!!c),issueData:{code:ce.invalid_return_type,returnTypeError:l}})}const o={errorMap:n.common.contextualErrorMap},i=n.data;if(this._def.returns instanceof Td){const s=this;return dr(async function(...l){const c=new Ma([]),u=await s._def.args.parseAsync(l,o).catch(m=>{throw c.addIssue(r(l,m)),c}),d=await Reflect.apply(i,this,u);return await s._def.returns._def.type.parseAsync(d,o).catch(m=>{throw c.addIssue(a(d,m)),c})})}else{const s=this;return dr(function(...l){const c=s._def.args.safeParse(l,o);if(!c.success)throw new Ma([r(l,c.error)]);const u=Reflect.apply(i,this,c.data),d=s._def.returns.safeParse(u,o);if(!d.success)throw new Ma([a(u,d.error)]);return d.data})}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...t){return new Gu({...this._def,args:Eo.create(t).rest(Hl.create())})}returns(t){return new Gu({...this._def,returns:t})}implement(t){return this.parse(t)}strictImplement(t){return this.parse(t)}static create(t,n,r){return new Gu({args:t||Eo.create([]).rest(Hl.create()),returns:n||Hl.create(),typeName:Me.ZodFunction,...qe(r)})}}class Qg extends rt{get schema(){return this._def.getter()}_parse(t){const{ctx:n}=this._processInputParams(t);return this._def.getter()._parse({data:n.data,path:n.path,parent:n})}}Qg.create=(e,t)=>new Qg({getter:e,typeName:Me.ZodLazy,...qe(t)});class Jg extends rt{_parse(t){if(t.data!==this._def.value){const n=this._getOrReturnCtx(t);return we(n,{received:n.data,code:ce.invalid_literal,expected:this._def.value}),Ge}return{status:"valid",value:t.data}}get value(){return this._def.value}}Jg.create=(e,t)=>new Jg({value:e,typeName:Me.ZodLiteral,...qe(t)});function m9(e,t){return new Ns({values:e,typeName:Me.ZodEnum,...qe(t)})}class Ns extends rt{_parse(t){if(typeof t.data!="string"){const n=this._getOrReturnCtx(t),r=this._def.values;return we(n,{expected:gt.joinValues(r),received:n.parsedType,code:ce.invalid_type}),Ge}if(this._def.values.indexOf(t.data)===-1){const n=this._getOrReturnCtx(t),r=this._def.values;return we(n,{received:n.data,code:ce.invalid_enum_value,options:r}),Ge}return dr(t.data)}get options(){return this._def.values}get enum(){const t={};for(const n of this._def.values)t[n]=n;return t}get Values(){const t={};for(const n of this._def.values)t[n]=n;return t}get Enum(){const t={};for(const n of this._def.values)t[n]=n;return t}extract(t){return Ns.create(t)}exclude(t){return Ns.create(this.options.filter(n=>!t.includes(n)))}}Ns.create=m9;class em extends rt{_parse(t){const n=gt.getValidEnumValues(this._def.values),r=this._getOrReturnCtx(t);if(r.parsedType!==ve.string&&r.parsedType!==ve.number){const a=gt.objectValues(n);return we(r,{expected:gt.joinValues(a),received:r.parsedType,code:ce.invalid_type}),Ge}if(n.indexOf(t.data)===-1){const a=gt.objectValues(n);return we(r,{received:r.data,code:ce.invalid_enum_value,options:a}),Ge}return dr(t.data)}get enum(){return this._def.values}}em.create=(e,t)=>new em({values:e,typeName:Me.ZodNativeEnum,...qe(t)});class Td extends rt{unwrap(){return this._def.type}_parse(t){const{ctx:n}=this._processInputParams(t);if(n.parsedType!==ve.promise&&n.common.async===!1)return we(n,{code:ce.invalid_type,expected:ve.promise,received:n.parsedType}),Ge;const r=n.parsedType===ve.promise?n.data:Promise.resolve(n.data);return dr(r.then(a=>this._def.type.parseAsync(a,{path:n.path,errorMap:n.common.contextualErrorMap})))}}Td.create=(e,t)=>new Td({type:e,typeName:Me.ZodPromise,...qe(t)});class xo extends rt{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===Me.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(t){const{status:n,ctx:r}=this._processInputParams(t),a=this._def.effect||null,o={addIssue:i=>{we(r,i),i.fatal?n.abort():n.dirty()},get path(){return r.path}};if(o.addIssue=o.addIssue.bind(o),a.type==="preprocess"){const i=a.transform(r.data,o);return r.common.issues.length?{status:"dirty",value:r.data}:r.common.async?Promise.resolve(i).then(s=>this._def.schema._parseAsync({data:s,path:r.path,parent:r})):this._def.schema._parseSync({data:i,path:r.path,parent:r})}if(a.type==="refinement"){const i=s=>{const l=a.refinement(s,o);if(r.common.async)return Promise.resolve(l);if(l instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return s};if(r.common.async===!1){const s=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});return s.status==="aborted"?Ge:(s.status==="dirty"&&n.dirty(),i(s.value),{status:n.value,value:s.value})}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(s=>s.status==="aborted"?Ge:(s.status==="dirty"&&n.dirty(),i(s.value).then(()=>({status:n.value,value:s.value}))))}if(a.type==="transform")if(r.common.async===!1){const i=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});if(!Gg(i))return i;const s=a.transform(i.value,o);if(s instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:n.value,value:s}}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(i=>Gg(i)?Promise.resolve(a.transform(i.value,o)).then(s=>({status:n.value,value:s})):i);gt.assertNever(a)}}xo.create=(e,t,n)=>new xo({schema:e,typeName:Me.ZodEffects,effect:t,...qe(n)});xo.createWithPreprocess=(e,t,n)=>new xo({schema:t,effect:{type:"preprocess",transform:e},typeName:Me.ZodEffects,...qe(n)});class yi extends rt{_parse(t){return this._getType(t)===ve.undefined?dr(void 0):this._def.innerType._parse(t)}unwrap(){return this._def.innerType}}yi.create=(e,t)=>new yi({innerType:e,typeName:Me.ZodOptional,...qe(t)});class _c extends rt{_parse(t){return this._getType(t)===ve.null?dr(null):this._def.innerType._parse(t)}unwrap(){return this._def.innerType}}_c.create=(e,t)=>new _c({innerType:e,typeName:Me.ZodNullable,...qe(t)});class tm extends rt{_parse(t){const{ctx:n}=this._processInputParams(t);let r=n.data;return n.parsedType===ve.undefined&&(r=this._def.defaultValue()),this._def.innerType._parse({data:r,path:n.path,parent:n})}removeDefault(){return this._def.innerType}}tm.create=(e,t)=>new tm({innerType:e,typeName:Me.ZodDefault,defaultValue:typeof t.default=="function"?t.default:()=>t.default,...qe(t)});class Ak extends rt{_parse(t){const{ctx:n}=this._processInputParams(t),r={...n,common:{...n.common,issues:[]}},a=this._def.innerType._parse({data:r.data,path:r.path,parent:{...r}});return wk(a)?a.then(o=>({status:"valid",value:o.status==="valid"?o.value:this._def.catchValue({get error(){return new Ma(r.common.issues)},input:r.data})})):{status:"valid",value:a.status==="valid"?a.value:this._def.catchValue({get error(){return new Ma(r.common.issues)},input:r.data})}}removeCatch(){return this._def.innerType}}Ak.create=(e,t)=>new Ak({innerType:e,typeName:Me.ZodCatch,catchValue:typeof t.catch=="function"?t.catch:()=>t.catch,...qe(t)});class Tk extends rt{_parse(t){if(this._getType(t)!==ve.nan){const r=this._getOrReturnCtx(t);return we(r,{code:ce.invalid_type,expected:ve.nan,received:r.parsedType}),Ge}return{status:"valid",value:t.data}}}Tk.create=e=>new Tk({typeName:Me.ZodNaN,...qe(e)});class Aie extends rt{_parse(t){const{ctx:n}=this._processInputParams(t),r=n.data;return this._def.type._parse({data:r,path:n.path,parent:n})}unwrap(){return this._def.type}}class vh extends rt{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.common.async)return(async()=>{const o=await this._def.in._parseAsync({data:r.data,path:r.path,parent:r});return o.status==="aborted"?Ge:o.status==="dirty"?(n.dirty(),mie(o.value)):this._def.out._parseAsync({data:o.value,path:r.path,parent:r})})();{const a=this._def.in._parseSync({data:r.data,path:r.path,parent:r});return a.status==="aborted"?Ge:a.status==="dirty"?(n.dirty(),{status:"dirty",value:a.value}):this._def.out._parseSync({data:a.value,path:r.path,parent:r})}}static create(t,n){return new vh({in:t,out:n,typeName:Me.ZodPipeline})}}class Rk extends rt{_parse(t){const n=this._def.innerType._parse(t);return Gg(n)&&(n.value=Object.freeze(n.value)),n}}Rk.create=(e,t)=>new Rk({innerType:e,typeName:Me.ZodReadonly,...qe(t)});const Tie=(e,t={},n)=>e?Ad.create().superRefine((r,a)=>{var o,i;if(!e(r)){const s=typeof t=="function"?t(r):typeof t=="string"?{message:t}:t,l=(i=(o=s.fatal)!==null&&o!==void 0?o:n)!==null&&i!==void 0?i:!0,c=typeof s=="string"?{message:s}:s;a.addIssue({code:"custom",...c,fatal:l})}}):Ad.create();qt.lazycreate;var Me;(function(e){e.ZodString="ZodString",e.ZodNumber="ZodNumber",e.ZodNaN="ZodNaN",e.ZodBigInt="ZodBigInt",e.ZodBoolean="ZodBoolean",e.ZodDate="ZodDate",e.ZodSymbol="ZodSymbol",e.ZodUndefined="ZodUndefined",e.ZodNull="ZodNull",e.ZodAny="ZodAny",e.ZodUnknown="ZodUnknown",e.ZodNever="ZodNever",e.ZodVoid="ZodVoid",e.ZodArray="ZodArray",e.ZodObject="ZodObject",e.ZodUnion="ZodUnion",e.ZodDiscriminatedUnion="ZodDiscriminatedUnion",e.ZodIntersection="ZodIntersection",e.ZodTuple="ZodTuple",e.ZodRecord="ZodRecord",e.ZodMap="ZodMap",e.ZodSet="ZodSet",e.ZodFunction="ZodFunction",e.ZodLazy="ZodLazy",e.ZodLiteral="ZodLiteral",e.ZodEnum="ZodEnum",e.ZodEffects="ZodEffects",e.ZodNativeEnum="ZodNativeEnum",e.ZodOptional="ZodOptional",e.ZodNullable="ZodNullable",e.ZodDefault="ZodDefault",e.ZodCatch="ZodCatch",e.ZodPromise="ZodPromise",e.ZodBranded="ZodBranded",e.ZodPipeline="ZodPipeline",e.ZodReadonly="ZodReadonly"})(Me||(Me={}));const Ce=lo.create;xc.create;Tk.create;kc.create;Ek.create;_d.create;xk.create;Wg.create;Kg.create;const Rie=Ad.create;Hl.create;Ti.create;kk.create;const nA=Pa.create,Xe=qt.create;qt.strictCreate;Yg.create;tA.create;Zg.create;Eo.create;Xg.create;_k.create;Cc.create;Gu.create;Qg.create;Jg.create;Ns.create;em.create;Td.create;xo.create;yi.create;_c.create;xo.createWithPreprocess;vh.create;function EN({setEditPersona:e,personas:t,descriptionName:n,fieldName:r}){const a=Hs(),o=()=>{e(void 0);const i=t.find(s=>s.name===a.watch(n));i&&a.setValue(r,i.value||"")};return f.jsxs("div",{className:"flex justify-end gap-3",children:[f.jsx(ue,{variant:"ghost",type:"button",onClick:o,children:f.jsx("span",{children:"Cancel"})}),f.jsx(ue,{variant:"outline",onClick:()=>e(void 0),children:f.jsx("span",{children:"Save changes"})})]})}function xN({setEditPersona:e,editPersona:t,personaValue:n}){const r=Hs(),a=Mi();return f.jsxs("div",{className:"mt-2 flex gap-4",children:[r.getValues(n)?f.jsxs(ue,{variant:"ghost",className:"px-0",onClick:()=>e(t),children:[f.jsx(XC,{className:"mr-1 h-4 w-4"}),f.jsx("span",{children:"Edit Persona"})]}):null,f.jsxs(ue,{variant:"ghost",className:"px-0",onClick:()=>a(t==="human"?"/human-templates?openCreatePersona":"/agent-templates?openCreatePersona"),children:[f.jsx(ya,{className:"h-4 w-4"}),f.jsx("span",{children:"New Template"})]})]})}const Nie=Xe({name:Ce().min(2,{message:"Name must be at least 2 characters."}).max(30,{message:"Name must not be longer than 30 characters."}),model:Ce(),humanName:Ce().max(2e3),agentName:Ce().max(2e3)});function Iie(e,t){let n="Error creating agent";const r=`${n}: Unspecified error.`;try{const a=JSON.parse(e.message);a.detail&&(a.detail=="None"?n=r:n=`${n}: ${a.detail}`)}catch{n=r}t({title:n,duration:5e3})}const Qr="persona",fr="human";function Oie({personas:e,humans:t,models:n,tools:r,closeDialog:a,openCancelCreateAgent:o}){const i=Bt(),s=uX(),{toast:l}=An(),c=2e3,u=2e3,d=Nie.extend({humanValue:Ce().max(u).min(2,{message:"Human name must be at least 2 characters."}),agentValue:Ce().max(c).min(2,{message:"Agent name must be at least 2 characters."}),embedding_model:Ce()}),{data:g}=E6(),m=bn({resolver:yn(d),defaultValues:{name:"",model:"",embedding_model:"",humanName:"",agentName:"",humanValue:"",agentValue:""},mode:"onChange"}),b=C=>{const _=n.find(R=>R.model===C.model);_&&g&&s.mutate({requestBody:{name:C.name,embedding_config:g.find(R=>R.embedding_model===C.embedding_model)||void 0,llm_config:_,tools:r.filter(R=>R.tags.includes("base")).map(R=>R.name).filter(R=>!!R),memory:{memory:{[fr]:{name:C.humanName,label:fr,value:C.humanValue},[Qr]:{name:C.agentName,label:Qr,value:C.agentValue}}}}},{onSuccess:()=>{i.invalidateQueries({queryKey:g6()}),a(),l({title:"Agent created successfully!",duration:5e3})},onError:R=>Iie(R,l)})},[y,w]=p.useState(),v=m.getFieldState("humanValue").isDirty,h=m.getFieldState("agentValue").isDirty,[S,E]=p.useState(!1),[k,x]=p.useState(!1);return f.jsx(vn,{...m,children:f.jsxs("form",{onSubmit:m.handleSubmit(b),className:"space-y-8",children:[f.jsxs("div",{className:"space-y-4",children:[f.jsx(ut,{control:m.control,name:"name",render:({field:C})=>f.jsxs(ot,{className:"space-y-1",children:[f.jsx(yt,{children:"Agent Name"}),f.jsx(pt,{children:f.jsx(_n,{...C})}),f.jsx(Mt,{className:"text-xs",children:"This is your agents display name. It can be a real name or a pseudonym."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:m.control,name:"model",render:({field:C})=>f.jsxs(ot,{className:"space-y-1",children:[f.jsx(yt,{children:"Model"}),f.jsxs(So,{onValueChange:C.onChange,value:C.value,children:[f.jsx(pt,{children:f.jsx(za,{children:f.jsx(wo,{placeholder:"Select a model"})})}),f.jsx(Ua,{children:n.map(_=>f.jsx(Fn,{value:_.model,children:_.model},_.model))})]}),f.jsx(Mt,{className:"text-xs ",children:"Select the model to be used with this agent."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:m.control,name:"embedding_model",render:({field:C})=>f.jsxs(ot,{className:"space-y-1",children:[f.jsx(yt,{children:"Embedding Config"}),f.jsxs(So,{onValueChange:C.onChange,value:C.value,children:[f.jsx(pt,{children:f.jsx(za,{children:f.jsx(wo,{placeholder:"Select a model"})})}),f.jsx(Ua,{children:g?g.map(_=>f.jsx(Fn,{value:_.embedding_model,children:_.embedding_model},_.embedding_model)):f.jsx(Fn,{value:"loading",disabled:!0,children:"Loading..."})})]}),f.jsx(lt,{})]})})]}),f.jsxs("div",{className:"space-y-6",children:[f.jsxs("div",{children:[f.jsx("p",{className:"font-semibold ",children:"Core memory"}),f.jsx("p",{className:"text-sm text-muted-foreground",children:"Agent’s core memory about itself (agent persona) and the user (human persona)."})]}),f.jsxs("div",{children:[f.jsx(ut,{control:m.control,name:"agentName",render:({field:C})=>f.jsxs(ot,{className:"space-y-1",children:[f.jsx(yt,{children:"Agent Persona"}),f.jsxs(uN,{open:S,onOpenChange:E,children:[f.jsx(dN,{children:f.jsxs("div",{className:"flex gap-2",children:[f.jsx("span",{children:C.value??"Search or select"}),h?f.jsx("div",{className:"text-muted-foreground",children:"(Edited)"}):null]})}),f.jsx(fN,{children:f.jsxs(pN,{children:[f.jsx(gN,{placeholder:"Search persona"}),f.jsx(mN,{children:"No Agent Persona was found."}),f.jsx(hN,{children:e.map(_=>f.jsx(bN,{value:_.name||"",onSelect:R=>{const T=e.find(L=>L.name===R);C.onChange(R),m.setValue("agentValue",(T==null?void 0:T.value)||""),E(!1)},children:_.name},_.name))})]})})]}),f.jsx(lt,{})]})}),y==="agent"?null:f.jsx(xN,{editPersona:"agent",setEditPersona:w,personaValue:"agentName"})]}),y==="agent"?f.jsx(ut,{control:m.control,name:"agentValue",render:({field:C})=>{var _;return f.jsxs(f.Fragment,{children:[f.jsxs(ot,{className:"space-y-1",children:[f.jsx(yt,{children:"Persona Description"}),f.jsx(pt,{children:f.jsx(Ai,{placeholder:"Describe your persona here",charCount:(_=C.value)==null?void 0:_.length,limit:c,...C})}),f.jsx(Mt,{children:"You can use no more than 2000 characters."}),f.jsx(lt,{})]}),f.jsx(EN,{fieldName:"agentValue",descriptionName:"agentName",personas:e,setEditPersona:w})]})}}):null,f.jsxs("div",{children:[f.jsx(ut,{control:m.control,name:"humanName",render:({field:C})=>f.jsxs(ot,{className:"space-y-1",children:[f.jsx(yt,{children:"Human Persona"}),f.jsxs(uN,{open:k,onOpenChange:x,children:[f.jsx(dN,{children:f.jsxs("div",{className:"flex gap-2",children:[f.jsx("span",{children:C.value??"Search or select"}),v?f.jsx("span",{className:"text-muted-foreground",children:"(Edited)"}):null]})}),f.jsx(fN,{children:f.jsxs(pN,{children:[f.jsx(gN,{placeholder:"Search human"}),f.jsx(mN,{children:"No Human Persona was found."}),f.jsx(hN,{children:t.map(_=>f.jsx(bN,{value:_.name||"",onSelect:R=>{const T=t.find(L=>L.name===R);C.onChange(R),m.setValue("humanValue",(T==null?void 0:T.value)||""),x(!1)},children:_.name},_.name))})]})})]}),f.jsx(lt,{})]})}),y==="human"?null:f.jsx(xN,{editPersona:"human",setEditPersona:w,personaValue:"humanName"})]}),y==="human"?f.jsxs(f.Fragment,{children:[f.jsx(ut,{control:m.control,name:"humanValue",render:({field:C})=>{var _;return f.jsxs(ot,{className:"space-y-1",children:[f.jsx(yt,{children:"Persona Description"}),f.jsx(pt,{children:f.jsx(Ai,{placeholder:"Describe your human here",charCount:(_=C.value)==null?void 0:_.length,limit:c,...C})}),f.jsx(Mt,{children:"You can use no more than 2000 characters."}),f.jsx(lt,{})]})}}),f.jsx(EN,{fieldName:"humanValue",descriptionName:"humanName",personas:t,setEditPersona:w})]}):null]}),f.jsxs("div",{className:"flex justify-between",children:[f.jsx(ue,{type:"button",variant:"ghost",onClick:()=>o(),children:"Cancel"}),f.jsxs("div",{className:"flex items-center",children:[s.isPending?f.jsxs("div",{className:Tt("mr-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Creating Agent..."})]}):null,f.jsx(ue,{type:"submit",children:"Create Agent"})]})]})]})})}const Die=({open:e,onOpenChange:t})=>{const{data:n}=w6(),{data:r}=Ng({label:Qr}),{data:a}=Ng({label:fr}),{data:o}=Xm(),[i,s]=p.useState(!1);return f.jsxs(Kt,{open:e,onOpenChange:t,children:[f.jsxs(Ht,{className:"h-full max-h-[95svh] w-full gap-8 sm:max-w-[800px]",hasCloseButton:!1,children:[f.jsxs("button",{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",onClick:()=>s(!0),children:[f.jsx(Di,{className:"h-4 w-4"}),f.jsx("span",{className:"sr-only",children:"Close"})]}),f.jsx(Pt,{children:f.jsx($t,{children:"Create Agent"})}),f.jsx("div",{className:"-mt-8 h-full overflow-y-auto p-1",children:f.jsx(Oie,{models:n||[],humans:a??[],personas:r??[],tools:o??[],closeDialog:()=>t(!1),openCancelCreateAgent:()=>s(!0)})})]}),f.jsx(lae,{open:i,onOpenChange:l=>s(l),closeDialog:()=>t(!1)})]})},Lie=()=>{const[e,t]=p.useState(!1);return f.jsxs(Fs,{className:"flex flex-col",children:[f.jsxs("div",{className:"flex items-center justify-between px-4",children:[f.jsx("h1",{className:"mb-4 flex pt-2 text-2xl font-bold",children:"Agents"}),f.jsx(ue,{icon:f.jsx(ya,{className:"h-4 w-4"}),onClick:()=>t(!0),size:"sm",children:"Create Agent"})]}),f.jsx(Ure,{className:"mx-4 h-full",setShowingAgentCreation:t}),f.jsx(Die,{open:e,onOpenChange:n=>t(n)})]})},Mie={path:"agents",element:f.jsx(Lie,{})},h9=ef("inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground hover:bg-primary/80",secondary:"border-transparent bg-background-darker hover:bg-secondary/80",destructive:"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",outline:"text-foreground"}},defaultVariants:{variant:"default"}});function b9({className:e,variant:t,...n}){return f.jsx("div",{className:ee(h9({variant:t}),e),...n})}const Pie=(e,t)=>e==="date"?vre(t):t,y9=rf(Vm(e=>({history:{},actions:{addMessage:(t,n)=>e(r=>({...r,history:{...r.history,[t]:[...r.history[t]??[],n]}})),replaceLastMessage:(t,n)=>e(r=>{const a=[...r.history[t]];return a.length>0&&(a[a.length-1]=n),{...r,history:{...r.history,[t]:a}}}),replaceMessageIds:(t,n,r)=>e(a=>{const o=a.history[t],i=[];for(const s of o)s.id===n&&(console.log("replacing old id",n,r),s.id=r),i.push(s);return{...a,history:{...a.history,[t]:i}}})}}),{name:"message-history-storage",storage:i_(()=>localStorage,{reviver:Pie}),partialize:({actions:e,...t})=>t})),$ie=e=>y9(t=>t.history[e]??[]),Fie=()=>y9(e=>e.actions);async function jie(e,t){const n=e.getReader();let r;for(;!(r=await n.read()).done;)t(r.value)}function zie(e){let t,n,r,a=!1;return function(i){t===void 0?(t=i,n=0,r=-1):t=Bie(t,i);const s=t.length;let l=0;for(;n0){const l=a.decode(i.subarray(0,s)),c=s+(i[s+1]===32?2:1),u=a.decode(i.subarray(c));switch(l){case"data":r.data=r.data?r.data+` -`+u:u;break;case"event":r.event=u;break;case"id":e(r.id=u);break;case"retry":const d=parseInt(u,10);isNaN(d)||t(r.retry=d);break}}}}function Bie(e,t){const n=new Uint8Array(e.length+t.length);return n.set(e),n.set(t,e.length),n}function kN(){return{data:"",event:"",id:"",retry:void 0}}var Hie=globalThis&&globalThis.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var a=0,r=Object.getOwnPropertySymbols(e);a{const m=Object.assign({},r);m.accept||(m.accept=Nk);let b;function y(){b.abort(),document.hidden||k()}l||document.addEventListener("visibilitychange",y);let w=Vie,v=0;function h(){document.removeEventListener("visibilitychange",y),window.clearTimeout(v),b.abort()}n==null||n.addEventListener("abort",()=>{h(),d()});const S=c??window.fetch,E=a??qie;async function k(){var x;b=new AbortController;try{const C=await S(e,Object.assign(Object.assign({},u),{headers:m,signal:b.signal}));await E(C),await jie(C.body,zie(Uie(_=>{_?m[CN]=_:delete m[CN]},_=>{w=_},o))),i==null||i(),h(),d()}catch(C){if(!b.signal.aborted)try{const _=(x=s==null?void 0:s(C))!==null&&x!==void 0?x:w;window.clearTimeout(v),v=window.setTimeout(k,_)}catch(_){h(),g(_)}}}k()})}function qie(e){const t=e.headers.get("content-type");if(!(t!=null&&t.startsWith(Nk)))throw new Error(`Expected content-type to be ${Nk}, Actual: ${t}`)}const S9="/v1";var En=[];for(var gy=0;gy<256;++gy)En.push((gy+256).toString(16).slice(1));function Gie(e,t=0){return(En[e[t+0]]+En[e[t+1]]+En[e[t+2]]+En[e[t+3]]+"-"+En[e[t+4]]+En[e[t+5]]+"-"+En[e[t+6]]+En[e[t+7]]+"-"+En[e[t+8]]+En[e[t+9]]+"-"+En[e[t+10]]+En[e[t+11]]+En[e[t+12]]+En[e[t+13]]+En[e[t+14]]+En[e[t+15]]).toLowerCase()}var dp,Wie=new Uint8Array(16);function Kie(){if(!dp&&(dp=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!dp))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return dp(Wie)}var Yie=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto);const _N={randomUUID:Yie};function Wu(e,t,n){if(_N.randomUUID&&!t&&!e)return _N.randomUUID();e=e||{};var r=e.random||(e.rng||Kie)();if(r[6]=r[6]&15|64,r[8]=r[8]&63|128,t){n=n||0;for(var a=0;a<16;++a)t[n+a]=r[a];return t}return Gie(r)}const Zie=rf(nY({socket:null,socketURL:null,readyState:0,abortController:null,onReplaceTemporaryIdsWithReturnedIdsCallback:(e,t)=>console.warn("no replace id callback set up."),onMessageCallback:e=>console.warn("No message callback set up. Simply logging message",e),onLastMessageReplaceCallback:e=>console.warn("No replace last message callback set up. Simply logging message",e)},(e,t)=>({actions:{sendMessage:({agentId:n,memoryName:r,message:a,role:o})=>{const i=new AbortController;e(E=>({...E,abortController:i,readyState:2}));const{onMessageCallback:s,onLastMessageReplaceCallback:l,onReplaceTemporaryIdsWithReturnedIdsCallback:c}=t(),u=()=>e(E=>({...E,readyState:0})),d=()=>e(E=>({...E,readyState:0})),g=()=>e(E=>({...E,readyState:1})),m=()=>e(E=>(i.abort(),{...E,abortController:null,readyState:3})),b={messages:[{role:o??"user",text:a,name:r}],stream_steps:!0,stream_tokens:!0};let y="",w="",v=Wu(),h=!1;const S=()=>{y="",w="",v=Wu()};return v9(`${S9}/agents/${n}/messages`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"text/event-stream",Authorization:"Bearer password"},body:JSON.stringify(b),signal:i.signal,onopen:async E=>{E.ok&&E.status===200?(console.log("Connection made ",E),g()):E.status>=400&&E.status<500&&E.status!==429&&(console.log("Client-side error ",E),m())},onmessage:async E=>{if(E.data==="[DONE]"||E.data==="[DONE_GEN]"||E.data==="[DONE_STEP]")return;const k=Xe({internal_monologue:Ce()}).or(Xe({function_call:Xe({name:Ce(),arguments:Ce()})})).or(Xe({function_call:Xe({name:Ce()})})).or(Xe({function_call:Xe({arguments:Ce()})})).or(Xe({function_return:Ce(),status:Ce(),id:Ce()})).or(Xe({function_return:Ce(),date:Ce(),status:Ce(),id:Ce()})).and(Xe({date:Ce().optional().transform(C=>C?new Date(C):new Date)})).safeParse(JSON.parse(E.data));if(!k.success){console.log("error",k.error.message,E.data),m();return}const x=k.data;if("internal_monologue"in x)y+=x.internal_monologue??"",y.length===0?s({type:"agent_response",message_type:"internal_monologue",message:"",date:x.date,id:v}):l({type:"agent_response",message_type:"internal_monologue",message:y,date:x.date,id:v});else if("function_call"in x){const C=x.function_call;"name"in C&&(C.name==="send_message"?(h=!0,s({type:"agent_response",message_type:"assistant_message",message:"",date:x.date,id:v})):(w+=C.name+"(",s({type:"agent_response",message_type:"function_call",message:"",date:x.date,id:v}))),"arguments"in C&&(w+=C.arguments.replace(/\\n/g,` -`),l(h?{type:"agent_response",message_type:"assistant_message",message:w.startsWith(`{ - "message": "`)?w.replace(`{ - "message": "`,"").replace('"}',"").replace('",}',"").replace(`" -}`,""):"",date:x.date,id:v}:{type:"agent_response",message_type:"function_call",message:w.replace("}","})"),date:x.date,id:v}))}else"function_return"in x?(h=!1,console.error("replacing ids",v,x.id),c(v,x.id),console.log("a",x),s({type:"agent_response",message_type:"function_return",message:"None",date:x.date,id:x.id}),d(),S()):"internal_error"in x?(console.log("error",x),m()):console.log("not matched",x)},onclose(){console.log("Connection closed by the server"),S(),u()},onerror(E){console.log("There was an error from server",E),S(),m()}}),v},registerOnMessageCallback:n=>e(r=>({...r,onMessageCallback:n})),registerOnLastMessageReplaceCallback:n=>e(r=>({...r,onLastMessageReplaceCallback:n})),registerOnReplaceTemporaryIdsWithReturnedIdsCallback:n=>e(r=>({...r,onReplaceTemporaryIdsWithReturnedIdsCallback:n})),abortStream:()=>{var n;(n=t().abortController)==null||n.abort(),e({...e,abortController:null,readyState:0})}}}))),AN=()=>Zie(e=>e.actions),Xie="The user is back! Let's pick up the conversation! Reflect on the previous conversation and use your function calling to send them a friendly message.",wf=rf(Vm((e,t)=>({showingMessageReceipts:!1,showingInternalMonologue:!0,shouldSendAutoMessage:!1,autoMessage:Xie,showingFunctions:!0,actions:{setShouldSendAutoMessage:n=>e({...t(),shouldSendAutoMessage:n}),setAutoMessage:n=>e({...t(),autoMessage:n}),setShowingInternalMonologue:n=>e({...t(),showingInternalMonologue:n}),setShowingFunctions:n=>e({...t(),showingFunctions:n}),setShowingMessageReceipts:n=>e({...t(),showingMessageReceipts:n})}}),{name:"chat-storage",partialize:({actions:e,...t})=>t})),Qie=()=>wf(e=>e.showingMessageReceipts),w9=()=>wf(e=>e.showingInternalMonologue),E9=()=>wf(e=>e.showingFunctions),x9=()=>wf(e=>({shouldSendAutoMessage:e.shouldSendAutoMessage,autoMessage:e.autoMessage})),Jie=()=>wf(e=>e.actions),ese=iie,tse=sie,k9=p.forwardRef(({className:e,align:t="center",sideOffset:n=4,...r},a)=>f.jsx(lie,{children:f.jsx(d9,{ref:a,align:t,sideOffset:n,className:ee("z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...r})}));k9.displayName=d9.displayName;const C9="Switch",[nse,pTe]=zn(C9),[rse,ase]=nse(C9),ose=p.forwardRef((e,t)=>{const{__scopeSwitch:n,name:r,checked:a,defaultChecked:o,required:i,disabled:s,value:l="on",onCheckedChange:c,...u}=e,[d,g]=p.useState(null),m=nt(t,h=>g(h)),b=p.useRef(!1),y=d?!!d.closest("form"):!0,[w=!1,v]=Fa({prop:a,defaultProp:o,onChange:c});return p.createElement(rse,{scope:n,checked:w,disabled:s},p.createElement(ze.button,W({type:"button",role:"switch","aria-checked":w,"aria-required":i,"data-state":_9(w),"data-disabled":s?"":void 0,disabled:s,value:l},u,{ref:m,onClick:fe(e.onClick,h=>{v(S=>!S),y&&(b.current=h.isPropagationStopped(),b.current||h.stopPropagation())})})),y&&p.createElement(lse,{control:d,bubbles:!b.current,name:r,value:l,checked:w,required:i,disabled:s,style:{transform:"translateX(-100%)"}}))}),ise="SwitchThumb",sse=p.forwardRef((e,t)=>{const{__scopeSwitch:n,...r}=e,a=ase(ise,n);return p.createElement(ze.span,W({"data-state":_9(a.checked),"data-disabled":a.disabled?"":void 0},r,{ref:t}))}),lse=e=>{const{control:t,checked:n,bubbles:r=!0,...a}=e,o=p.useRef(null),i=F_(n),s=N_(t);return p.useEffect(()=>{const l=o.current,c=window.HTMLInputElement.prototype,d=Object.getOwnPropertyDescriptor(c,"checked").set;if(i!==n&&d){const g=new Event("click",{bubbles:r});d.call(l,n),l.dispatchEvent(g)}},[i,n,r]),p.createElement("input",W({type:"checkbox","aria-hidden":!0,defaultChecked:n},a,{tabIndex:-1,ref:o,style:{...e.style,...s,position:"absolute",pointerEvents:"none",opacity:0,margin:0}}))};function _9(e){return e?"checked":"unchecked"}const A9=ose,cse=sse,Kp=p.forwardRef(({className:e,...t},n)=>f.jsx(A9,{className:ee("peer inline-flex h-[24px] w-[44px] shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input",e),...t,ref:n,children:f.jsx(cse,{className:ee("pointer-events-none block h-5 w-5 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0")})}));Kp.displayName=A9.displayName;const use=()=>{const{autoMessage:e,shouldSendAutoMessage:t}=x9(),[n,r]=p.useState(e),[a,o]=p.useState("idle"),i=w9(),s=E9(),{setShowingInternalMonologue:l,setShowingFunctions:c,setAutoMessage:u,setShouldSendAutoMessage:d}=Jie(),g=()=>{o("updating"),setTimeout(()=>{u(n),o("success"),setTimeout(()=>o("idle"),600)},600)};return f.jsxs(ese,{children:[f.jsx(tse,{asChild:!0,children:f.jsx(ue,{size:"iconXs",className:"absolute right-3 top-2 z-10",variant:"outline",children:f.jsx(Fq,{className:"size-4"})})}),f.jsxs(k9,{align:"end",className:"w-80 space-y-4 rounded-md border bg-background p-4",children:[f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsx(os,{htmlFor:"internal-monologue",children:"Show Internal Monologue"}),f.jsx(Kp,{checked:i,onCheckedChange:m=>l(m),id:"internal-monologue"})]}),f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsx(os,{htmlFor:"showing-functions",children:"Show Functions"}),f.jsx(Kp,{checked:s,onCheckedChange:m=>c(m),id:"showing-functions"})]}),f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsx(os,{htmlFor:"should-send-auto-message",children:"Send Auto Message"}),f.jsx(Kp,{checked:t,onCheckedChange:m=>d(m),id:"should-send-auto-message"})]}),f.jsxs("div",{className:"flex flex-col space-y-2",children:[f.jsx(os,{htmlFor:"auto-message",children:"Auto Message"}),f.jsx(qs,{id:"auto-message",className:"min-h-[10rem] resize-none",value:n,onChange:m=>r(m.target.value)}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{disabled:a==="updating",onClick:g,className:"w-fit",variant:"outline",size:"xs",children:"Update Message"}),a!=="updating"?null:f.jsx("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "})}),a!=="success"?null:f.jsx("div",{className:Tt("ml-4 flex items-center text-emerald-600 animate-in slide-in-from-bottom-2"),children:f.jsx(Mm,{className:"mr-2 h-4 w-4 "})})]})]})]})]})},Sh=({children:e,className:t})=>f.jsx("h4",{className:ee("text-sm font-medium uppercase text-foreground",t),children:e}),wh=({children:e,className:t,button:n,onClickInfo:r})=>f.jsxs(Sh,{className:ee("flex h-8 items-center justify-between",t),children:[f.jsxs("span",{className:"inline-flex items-center tabular-nums",children:[f.jsx("span",{children:e}),f.jsx(Nq,{className:"ml-1.5 size-3.5 text-muted-foreground",onClick:r})]}),n]}),rA=({onClick:e})=>f.jsx(ue,{onClick:e,size:"iconXs",variant:"outline",children:f.jsx(ya,{className:"size-4 text-foreground"})}),T9=({className:e,children:t,onClick:n})=>f.jsxs("div",{className:ee("flex items-center justify-between rounded-md border border-dashed p-2 text-sm font-normal text-muted-foreground",e),children:[f.jsx("span",{children:t}),f.jsx(ue,{onClick:n,size:"iconXs",variant:"outline",children:f.jsx(ya,{className:"size-4 text-foreground"})})]}),dse=Xe({message:Ce().min(1,"Message cannot be empty...")}),fse=e=>{const n=bn({resolver:yn(dse),defaultValues:{message:""}});function r(a){e.onCreateArchivalMemory(a.message)}return f.jsx(vn,{...n,children:f.jsxs("form",{onSubmit:n.handleSubmit(r),className:"mt-4",children:[f.jsx(ut,{control:n.control,name:"message",render:({field:a})=>{var o;return f.jsxs(ot,{className:"-mt-2 w-full",children:[f.jsx(yt,{className:"sr-only",children:"Memory to store"}),f.jsx(pt,{className:"w-full",children:f.jsx(Ai,{className:"min-h-40",placeholder:"What you want the agent to know about you",charCount:(o=a.value)==null?void 0:o.length,limit:2e3,...a})}),f.jsx(lt,{})]})}}),f.jsxs("div",{className:"flex items-center justify-between pt-8",children:[f.jsx(ue,{type:"button",onClick:e.onCancel,variant:"ghost",children:"Cancel"}),f.jsxs("div",{className:"flex gap-3",children:[e.isPending&&f.jsxs("div",{className:Tt("mr-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Saving memory..."})]}),f.jsx(ue,{disabled:e.isPending,type:"submit",children:"Save Memory"})]})]})]})})},pse=({agentId:e,open:t,onOpenChange:n})=>{const r=Bt(),a=dX(),o=i=>{a.mutate({agentId:e||"",requestBody:{text:i}},{onSuccess:()=>{n(!1),r.invalidateQueries({queryKey:h6({agentId:e||""})})}})};return f.jsx(Kt,{open:t,onOpenChange:n,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Add Memory"}),f.jsx(dn,{children:"Add a memory. Archival memory serves as an infinite, structured storage space for reflections, insights, and other data not fitting into core memory."})]}),f.jsx(fse,{isPending:a.isPending,onCreateArchivalMemory:o,onCancel:()=>n(!1)})]})})},gse=({memoryId:e,agentId:t,open:n,onOpenChange:r})=>{const a=Bt(),o=mX(),i=()=>o.mutate({agentId:t||"",memoryId:e},{onSuccess:()=>{a.invalidateQueries({queryKey:$s({agentId:t||""})}),r(!1)}});return f.jsx(Kt,{open:n,onOpenChange:r,children:f.jsxs(Ht,{className:"w-full sm:max-w-[350px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Delete Memory"}),f.jsx(dn,{className:"!my-4",children:"Are you sure you want to delete this memory?"})]}),f.jsxs(g8,{children:[f.jsx(ue,{size:"sm",type:"button",onClick:()=>r(!1),variant:"ghost",children:"Cancel"}),f.jsx(ue,{size:"sm",disabled:o.isPending,onClick:i,children:"Delete"})]})]})})},R9=({className:e,archivalMemory:t,agentId:n,isViewMemoryDialog:r})=>{const[a,o]=p.useState(!1),[i,s]=p.useState(!0),[l,c]=p.useState(!1),u=p.useRef(null),d=p.useRef(null);return p.useLayoutEffect(()=>{(()=>{if(u.current&&d.current){const m=u.current.scrollWidth>d.current.clientWidth;c(m)}})()},[t.text]),f.jsxs(f.Fragment,{children:[f.jsxs("div",{className:ee("relative w-full rounded-md border p-4 pr-10",e),children:[f.jsxs("div",{className:"flex-1",children:[f.jsx("div",{className:"mb-1 text-xs text-muted-foreground",children:"Jun 18 2024"}),f.jsx("div",{className:ee("break-words text-sm",i&&"truncate"),ref:d,children:f.jsx("p",{ref:u,className:ee(i?"w-min":"w-full",!r&&"inline"),children:t.text})})]}),f.jsx(ue,{className:"absolute right-2 top-2.5 text-muted-foreground",onClick:()=>o(!0),variant:"ghost",size:"iconXs",children:f.jsx(Di,{className:"size-4"})}),r&&l?f.jsx(ue,{className:"mt-2 h-7 w-fit p-0 font-semibold",variant:"link",onClick:()=>s(!i),children:i?f.jsxs(f.Fragment,{children:["more",f.jsx(ZC,{className:"ml-2 h-4 w-4"})]}):f.jsxs(f.Fragment,{children:["less",f.jsx(wq,{className:"ml-2 h-4 w-4"})]})}):null]}),f.jsx(gse,{memoryId:t.id||"",agentId:n,open:a,onOpenChange:o})]})},mse=({setCurrentPage:e,className:t,currentPage:n,totalPages:r})=>f.jsx("div",{className:ee("flex items-center justify-end space-x-2",t),children:f.jsxs("div",{className:"space-x-2",children:[f.jsx(ue,{variant:"outline",size:"sm",onClick:()=>e(a=>Math.max(a-1,1)),disabled:n===1,children:"Previous"}),f.jsx(ue,{variant:"outline",size:"sm",onClick:()=>e(a=>Math.min(a+1,r)),disabled:n===r,children:"Next"})]})}),aA=({items:e,searchTerm:t,setSearchTerm:n,setShowSearchInput:r,showSearchInput:a,onOpenAddDialog:o,buttonText:i,isViewArchivalMemoryDialog:s,setShowFilterButton:l,showFilterButton:c})=>{const u=()=>{r(!a),l&&l(!1)},d=()=>{l&&l(!c),r(!1)};return f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsxs("div",{className:"flex h-8 w-full items-center justify-between",children:[f.jsxs("p",{className:"text-xs",children:[e?e==null?void 0:e.length:null," items"]}),f.jsxs("div",{className:"flex h-full gap-2",children:[f.jsxs("div",{className:"relative flex h-full items-center justify-end border-r-2",children:[a?f.jsx(_n,{placeholder:"Search",value:t,onChange:g=>n(g.target.value),className:"mr-2 h-8 w-32 pl-9 md:w-52"}):null,f.jsx("button",{className:ee("mr-2",a&&"absolute left-3 top-2"),onClick:()=>u(),children:f.jsx(Ms,{className:ee("h-4 w-4")})})]}),s?f.jsxs("div",{className:"flex h-full items-center justify-end gap-2 border-r-2",children:[c?f.jsx(ue,{className:"px-2 py-0",size:"sm",children:f.jsx("span",{className:"p-0 text-xs",children:"Oldest to newest"})}):null,f.jsx("button",{className:ee("mr-2 h-full p-0.5",c&&"bg-muted"),onClick:()=>d(),children:f.jsx(yq,{className:"h-4 w-4"})})]}):null]})]}),f.jsxs(ue,{variant:"ghost",onClick:()=>o(!0),children:[i,f.jsx(ya,{className:"ml-1 h-4 w-4"})]})]})},hse=({agentId:e,open:t,onOpenChange:n,onOpenAddMemory:r})=>{VF();const o=S6({agentId:e||""}).data??[],[i,s]=p.useState(!1),[l,c]=p.useState(!1),[u,d]=p.useState(""),g=(o??[]).filter(S=>S.text.toLowerCase().includes(u.toLowerCase())),[m,b]=p.useState(1),y=10,w=m*y,v=w-y,h=g.slice(v,w);return f.jsx(Kt,{open:t,onOpenChange:n,children:f.jsxs(Ht,{className:"flex max-h-[95svh] flex-col overflow-auto sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Archival Memory"}),f.jsx(dn,{children:"Archival memory serves as an infinite, structured storage space for reflections, insights, and other data not fitting into core memory."}),f.jsx(aA,{items:o,searchTerm:u,setSearchTerm:d,setShowSearchInput:s,showSearchInput:i,onOpenAddDialog:r,buttonText:"Add Memory",isViewArchivalMemoryDialog:!0,setShowFilterButton:c,showFilterButton:l})]}),f.jsx("div",{className:"flex w-full flex-col",children:h.map(S=>f.jsx(R9,{agentId:e,archivalMemory:S,className:"mb-2",isViewMemoryDialog:!0},S.id))}),f.jsx(mse,{currentPage:m,setCurrentPage:b,totalPages:Math.ceil(g.length/y)})]})})},bse=({agentId:e})=>{const t=S6({agentId:e??""},void 0,{enabled:!!e}),n=t.data??[],[r,a]=p.useState(!1),[o,i]=p.useState(!1),s=()=>a(!0);return f.jsxs(f.Fragment,{children:[f.jsxs("div",{className:"py-4",children:[f.jsxs(wh,{button:n.length===0?null:f.jsx(rA,{onClick:()=>i(!0)}),children:["Archival Memory (",n.length,")"]}),t.isFetching?f.jsx(Pi,{className:"h-[70px]"}):null,t.isError?f.jsx("div",{className:"h-[70px] border border-destructive",children:"Something went wrong..."}):null,t.isSuccess?f.jsxs(f.Fragment,{children:[f.jsx("div",{className:"mt-2",children:[...n].slice(0,3).map(l=>f.jsx(R9,{className:"mb-2",archivalMemory:l,agentId:e},l.id))}),n.length<1?null:f.jsxs(ue,{onClick:s,className:"mt-2 h-7 w-fit p-2 font-semibold",variant:"link",children:["See all ",f.jsx($m,{className:"ml-2 h-4 w-4"})]}),n.length>0?null:f.jsx(T9,{onClick:()=>i(!0),children:"Nothing here yet. Add memory"})]}):null]}),f.jsx(hse,{agentId:e,open:r,onOpenChange:a,onOpenAddMemory:l=>i(l)}),f.jsx(pse,{agentId:e,open:o,onOpenChange:i})]})},yse=(e,t)=>e.length>t?e.substring(0,t)+"...":e;function vse(e,t){let n="Error adding data source...";const r=`${n}: Unspecified error.`;try{const a=JSON.parse(e.message);a.detail&&(a.detail=="None"?n=r:n=`${n}: ${a.detail}`)}catch{n=r}t({title:n,duration:5e3})}const N9=({source:e,handleRemoveDataSource:t})=>f.jsxs("div",{className:"relative rounded-md border p-4",children:[f.jsxs("p",{className:"flex items-center gap-1",children:[f.jsx("span",{className:"font-medium",children:e.name}),f.jsx("span",{className:"mt-0.5 text-xs text-muted-foreground",children:Bs(new Date(e.created_at||""),"MMM dd yyyy")})]}),f.jsx("p",{className:Tt(),children:(e==null?void 0:e.description)??"None"}),f.jsxs("button",{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",onClick:()=>t(e.id||""),children:[f.jsx(Di,{className:"h-4 w-4"}),f.jsx("span",{className:"sr-only",children:"Close"})]})]},e.id),Sse=Xe({sourceIds:nA(Ce())}),wse=({closeDialog:e})=>{const t=To(),n=Bt(),{data:r,isLoading:a}=b_(),{data:o}=v6({agentId:(t==null?void 0:t.id)||""}),i=x6(),[s,l]=p.useState(!1),{toast:c}=An(),u=r??[],d=bn({resolver:yn(Sse),mode:"onSubmit",defaultValues:{sourceIds:[]}}),g=async v=>{if(!(t!=null&&t.id))return;l(!0);const h=[];for(const S of v.sourceIds)try{const E=await i.mutateAsync({agentId:t.id,sourceId:S},{onSuccess:()=>{n.invalidateQueries({queryKey:m6({agentId:t.id||""})}),c({title:"Data source added successfully!",duration:5e3})}});h.push(E)}catch(E){vse(E,c)}h.length>0&&c({title:"Data source added successfully!",duration:5e3}),l(!1),e()},m=d.watch("sourceIds"),b=p.useMemo(()=>{if(!u)return[];const v=new Set(m),h=new Set((o||[]).map(S=>S.id));return u.filter(S=>!v.has(S.id||"")&&!h.has(S.id))},[r,u,m]),y=v=>{m.some(h=>h===v)||d.setValue("sourceIds",[...m,v])},w=v=>{d.setValue("sourceIds",m.filter(h=>h!==v))};return f.jsx(vn,{...d,children:f.jsxs("form",{onSubmit:d.handleSubmit(g,v=>console.log(v)),className:"space-y-8",children:[f.jsx(ut,{control:d.control,name:"sourceIds",render:()=>f.jsxs(ot,{children:[f.jsxs(So,{disabled:a,value:"",onValueChange:v=>y(v),children:[f.jsx(pt,{children:f.jsx(za,{children:f.jsx(wo,{placeholder:a?"Loading data sources...":"Search or select data source"})})}),f.jsx(Ua,{className:"max-h-[200px] overflow-y-auto",children:(b==null?void 0:b.length)===0?f.jsx(Fn,{value:"no-sources",disabled:!0,children:"No additional data sources available"}):b.map(v=>f.jsx(Fn,{value:v.id||"",children:v.name},v.id))})]}),f.jsx(lt,{})]})}),f.jsx("div",{className:"space-y-2",children:d.watch("sourceIds")?u.filter(v=>d.getValues("sourceIds").some(h=>h===v.id)).map(v=>f.jsx(N9,{handleRemoveDataSource:w,source:v},v.id)):null}),f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsx(ue,{variant:"ghost",type:"button",onClick:()=>e(),children:"Cancel"}),f.jsxs("div",{className:"flex gap-3",children:[s&&f.jsxs("div",{className:Tt("mr-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Attaching to agent..."})]}),f.jsx(ue,{type:"submit",children:"Add Source"})]})]})]})})},Ese=({open:e,onOpenChange:t})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Add Data Source"}),f.jsx(dn,{children:"By adding a data source, you will make it available to the Agent to use for information."})]}),f.jsx(wse,{closeDialog:()=>t(!1)})]})}),xse=({onDetach:e,onOpenAddSourceChange:t})=>{const n=[],[r,a]=p.useState(!1),[o,i]=p.useState(""),s=(n??[]).filter(l=>l.name.toLowerCase().includes(o.toLowerCase()));return f.jsxs(f.Fragment,{children:[f.jsx(aA,{items:n,searchTerm:o,setSearchTerm:i,setShowSearchInput:a,showSearchInput:r,onOpenAddDialog:t,buttonText:"Add Source"}),f.jsx("div",{className:"space-y-2",children:n?s.map(l=>f.jsx(N9,{handleRemoveDataSource:e,source:l},l.id)):null})]})},kse=({open:e,onOpenChange:t,onDetach:n,onOpenAddSourceChange:r})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Data Sources"}),f.jsx(dn,{children:"Data sources make it available to the Agent to use for information outside of the immediate context window."})]}),f.jsx(xse,{onDetach:n,onOpenAddSourceChange:r})]})}),Cse=()=>{const[e,t]=p.useState(!1),[n,r]=p.useState(!1),a=To(),{data:o}=v6({agentId:(a==null?void 0:a.id)||""}),i=p.useMemo(()=>o??[],[o]),s=k6(),{toast:l}=An(),c=u=>{!u||!a||s.mutate({agentId:a.id||"",sourceId:u},{onSuccess:()=>{l({title:"Agent detached successfully!",duration:3e3})},onError:d=>l({title:"Failed to detach agent!",duration:3e3})})};return f.jsxs("div",{className:"py-4",children:[f.jsxs(wh,{button:i.length===0?null:f.jsx(rA,{onClick:()=>t(!0)}),onClickInfo:()=>r(!0),children:["Data Sources (",i.length,")"]}),f.jsx("ul",{className:"mt-2 space-y-2",children:i.map(u=>f.jsxs("li",{className:"rounded-md border p-4",children:[f.jsx("div",{className:"relative flex justify-between",children:f.jsxs("p",{className:"flex items-center gap-2",children:[f.jsx("span",{className:"font-medium",children:u.name}),f.jsx("span",{className:"text-xs",children:Bs(new Date(u.created_at||""),"MMM dd yyyy")})]})}),f.jsx("p",{className:Tt(),children:yse((u==null?void 0:u.description)??"None",42)})]},u.id))}),i.length>0?null:f.jsx(T9,{onClick:()=>t(!0),children:"Nothing here yet. Add source"}),f.jsx(Ese,{open:e,onOpenChange:u=>t(u)}),f.jsx(kse,{open:n,onOpenChange:u=>r(u),onDetach:c,onOpenAddSourceChange:u=>t(u)})]})},_se="AlertDialog",[Ase,gTe]=zn(_se,[i8]),Ro=i8(),Tse=e=>{const{__scopeAlertDialog:t,...n}=e,r=Ro(t);return p.createElement(d8,W({},r,n,{modal:!0}))},Rse=p.forwardRef((e,t)=>{const{__scopeAlertDialog:n,...r}=e,a=Ro(n);return p.createElement(iae,W({},a,r,{ref:t}))}),Nse=e=>{const{__scopeAlertDialog:t,...n}=e,r=Ro(t);return p.createElement(f8,W({},r,n))},Ise=p.forwardRef((e,t)=>{const{__scopeAlertDialog:n,...r}=e,a=Ro(n);return p.createElement(H_,W({},a,r,{ref:t}))}),I9="AlertDialogContent",[Ose,Dse]=Ase(I9),Lse=p.forwardRef((e,t)=>{const{__scopeAlertDialog:n,children:r,...a}=e,o=Ro(n),i=p.useRef(null),s=nt(t,i),l=p.useRef(null);return p.createElement(oae,{contentName:I9,titleName:Mse,docsSlug:"alert-dialog"},p.createElement(Ose,{scope:n,cancelRef:l},p.createElement(V_,W({role:"alertdialog"},o,a,{ref:s,onOpenAutoFocus:fe(a.onOpenAutoFocus,c=>{var u;c.preventDefault(),(u=l.current)===null||u===void 0||u.focus({preventScroll:!0})}),onPointerDownOutside:c=>c.preventDefault(),onInteractOutside:c=>c.preventDefault()}),p.createElement(Rm,null,r),!1)))}),Mse="AlertDialogTitle",Pse=p.forwardRef((e,t)=>{const{__scopeAlertDialog:n,...r}=e,a=Ro(n);return p.createElement(q_,W({},a,r,{ref:t}))}),$se=p.forwardRef((e,t)=>{const{__scopeAlertDialog:n,...r}=e,a=Ro(n);return p.createElement(G_,W({},a,r,{ref:t}))}),Fse=p.forwardRef((e,t)=>{const{__scopeAlertDialog:n,...r}=e,a=Ro(n);return p.createElement(W_,W({},a,r,{ref:t}))}),jse="AlertDialogCancel",zse=p.forwardRef((e,t)=>{const{__scopeAlertDialog:n,...r}=e,{cancelRef:a}=Dse(jse,n),o=Ro(n),i=nt(t,a);return p.createElement(W_,W({},o,r,{ref:i}))}),Use=Tse,Bse=Rse,Hse=Nse,O9=Ise,D9=Lse,L9=Fse,M9=zse,P9=Pse,$9=$se,Vse=Use,qse=Bse,Gse=Hse,F9=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(O9,{className:ee("fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",e),...n,ref:r}));F9.displayName=O9.displayName;const j9=p.forwardRef(({className:e,...t},n)=>f.jsxs(Gse,{children:[f.jsx(F9,{}),f.jsx(D9,{ref:n,className:ee("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg md:w-full",e),...t})]}));j9.displayName=D9.displayName;const z9=({className:e,...t})=>f.jsx("div",{className:ee("flex flex-col space-y-2 text-center sm:text-left",e),...t});z9.displayName="AlertDialogHeader";const U9=({className:e,...t})=>f.jsx("div",{className:ee("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",e),...t});U9.displayName="AlertDialogFooter";const B9=p.forwardRef(({className:e,...t},n)=>f.jsx(P9,{ref:n,className:ee("text-lg font-semibold",e),...t}));B9.displayName=P9.displayName;const H9=p.forwardRef(({className:e,...t},n)=>f.jsx($9,{ref:n,className:ee("text-sm text-muted-foreground",e),...t}));H9.displayName=$9.displayName;const V9=p.forwardRef(({className:e,variant:t,...n},r)=>f.jsx(L9,{ref:r,className:ee(yc({variant:t}),e),...n}));V9.displayName=L9.displayName;const q9=p.forwardRef(({className:e,...t},n)=>f.jsx(M9,{ref:n,className:ee(yc({variant:"outline"}),"mt-2 sm:mt-0",e),...t}));q9.displayName=M9.displayName;const Wse=()=>{const e=To(),{mutate:t,isPending:n}=gX(),{toast:r}=An(),a=Mi(),o=p.useCallback(()=>{e&&t({agentId:e.id||""},{onSuccess:()=>{r({title:"Agent deleted successfully",duration:500}),a("/agents")},onError:()=>{r({title:"There was an error deleting the agent, please try again",duration:5e3})}})},[e==null?void 0:e.id,a,t]);return f.jsxs(Vse,{children:[f.jsx(qse,{asChild:!0,children:f.jsx(ue,{variant:"destructive",children:"Delete Agent"})}),f.jsxs(j9,{children:[f.jsxs(z9,{children:[f.jsx(B9,{children:"Delete Agent"}),f.jsx(H9,{children:"When you delete an agent, all the information and interaction will be lost. Are you sure you want to delete the agent"})]}),f.jsxs(U9,{children:[f.jsx(q9,{children:"Cancel"}),f.jsx(V9,{onClick:o,variant:"destructive",children:f.jsxs(f.Fragment,{children:[n&&f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),"Delete Agent"]})})]})]})]})},Kse=()=>f.jsxs("div",{className:"flex flex-col gap-2 pb-10 pt-4",children:[f.jsx(Sh,{children:"Delete Agent"}),f.jsx("p",{className:" text-sm text-muted-foreground",children:"When you delete an agent, all the information and interaction will be lost."}),f.jsx(Wse,{})]}),Yse={configItem:e=>["config",e]},Zse=e=>{const t=_Z();return Jr({queryKey:Yse.configItem(e),enabled:!!e,queryFn:async()=>t.get("/config").then(n=>n.data)})},G9=({icon:e,name:t,isEditing:n,onEditPersonaClicked:r})=>f.jsxs("div",{className:"flex items-center justify-between py-4",children:[f.jsxs("div",{className:"flex items-center font-medium",children:[e,f.jsx("span",{children:t})]}),n?null:f.jsxs(ue,{onClick:r,variant:"ghost",size:"xs",children:["Edit Persona ",f.jsx(XC,{className:"ml-2 size-4"})]})]}),W9=({renderContent:e,state:t,onClose:n})=>{const r=p.useRef("closed"),a=t==="edit"||t==="closed"&&r.current==="edit";return p.useEffect(()=>{r.current=t},[t]),f.jsx(Kt,{open:t==="view"||t==="edit",onOpenChange:o=>{o||n()},children:f.jsx(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:e(a)})})},K9=({status:e,limit:t,defaultContent:n,onCancelClicked:r,onSaveClicked:a})=>{const[o,i]=p.useState(n);return f.jsxs(f.Fragment,{children:[f.jsxs(os,{children:["Persona Description",f.jsx(Ai,{charCount:(o==null?void 0:o.length)??0,limit:t,onChange:s=>i(s.target.value),className:"min-h-[60vh] whitespace-pre-line font-normal",defaultValue:o})]}),f.jsxs("div",{className:"flex items-center justify-between pt-8",children:[f.jsx(ue,{onClick:()=>r(),variant:"ghost",children:"Cancel"}),f.jsxs("div",{className:"flex items-center",children:[e!=="pending"?null:f.jsxs("div",{className:Tt("mr-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Updating persona..."})]}),e!=="success"?null:f.jsxs("div",{className:Tt("mr-4 flex items-center text-emerald-600 animate-in slide-in-from-bottom-2"),children:[f.jsx(Mm,{className:"mr-2 h-4 w-4 "}),f.jsx("span",{children:"Persona updated!"})]}),f.jsx(ue,{onClick:()=>a(o),children:"Save"})]})]})]})},Xse=({name:e,state:t,onClose:n,onSaveEditPersonaClicked:r,onEditPersonaClicked:a,onCancelEditPersonaClicked:o,status:i,content:s})=>{Zse(VF());const l=2e3;return f.jsx(W9,{name:e,state:t,onClose:n,renderContent:c=>f.jsxs(f.Fragment,{children:[f.jsxs(Pt,{children:[f.jsx($t,{children:c?"Edit Agent Persona":"Agent Persona"}),f.jsx(dn,{children:c?"You can edit your personas memory. This won’t affect the persona original template. Any changes will be saved as new core memories.":"This information stores details about the agent's persona, guiding its behaviour and responses to maintain consistency and personality in interactions."})]}),f.jsxs("div",{className:c?"":"mb-8",children:[f.jsx(G9,{name:e,icon:f.jsx(Lm,{className:"mr-2 size-6"}),isEditing:c,onEditPersonaClicked:a}),c?null:f.jsx("p",{className:"whitespace-pre-line",children:s}),c?f.jsx(K9,{status:i,defaultContent:s,limit:l,onCancelClicked:o,onSaveClicked:r}):null]})]})})},Qse=({name:e,state:t,onClose:n,content:r,onCancelEditPersonaClicked:a,onEditPersonaClicked:o,onSaveEditPersonaClicked:i,status:s})=>f.jsx(W9,{name:e,state:t,onClose:n,renderContent:l=>f.jsxs(f.Fragment,{children:[f.jsxs(Pt,{children:[f.jsx($t,{children:l?"Edit Human Persona":"Human Persona"}),f.jsx(dn,{children:l?"You can edit your personas memory. This won’t affect the persona original template. Any changes will be saved as new core memories":"Stores key details about the person the agent is conversing with, enabling personalised and friend-like conversations"})]}),f.jsxs("div",{className:l?"":"mb-8",children:[f.jsx(G9,{name:e,icon:f.jsx(QC,{className:"mr-2 size-6"}),isEditing:l,onEditPersonaClicked:o}),l?null:f.jsx("p",{className:"whitespace-pre-line",children:r}),l?f.jsx(K9,{status:s,defaultContent:r,limit:2e3,onCancelClicked:a,onSaveClicked:i}):null]})]})}),TN=({className:e,title:t,name:n,content:r,onEditClick:a,onMoreClick:o,icon:i})=>f.jsxs("div",{className:ee("rounded-md border p-3",e),children:[f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsxs("div",{className:"flex items-center font-semibold",children:[i,f.jsx("span",{children:t})]}),f.jsx(ue,{onClick:a,size:"iconXs",variant:"ghost",children:f.jsx(XC,{className:"h-4 w-4 text-muted-foreground"})})]}),f.jsxs("div",{className:"flex flex-col gap-2 pl-7",children:[f.jsx("p",{className:"mt-2 text-xs text-muted-foreground/60",children:n}),f.jsxs("p",{className:"relative h-[78px] overflow-hidden text-ellipsis text-sm text-muted-foreground",children:[r,f.jsx("span",{className:"absolute bottom-0 right-0 h-5 w-10 bg-gradient-to-r from-transparent to-background to-55%"})]}),f.jsxs(ue,{onClick:o,className:"-ml-2 h-7 w-fit p-2 font-semibold",variant:"link",children:["more ",f.jsx($m,{className:"ml-2 h-4 w-4"})]})]})]}),Jse=({agentId:e})=>{const t=v_(),{data:n,refetch:r,isRefetching:a}=y_({agentId:e||""}),{mutate:o}=cf(),i=Bt(),s=p.useMemo(()=>{var b,y;return(y=(b=n==null?void 0:n.memory)==null?void 0:b.memory)==null?void 0:y[fr]},[n]),l=p.useMemo(()=>{var b,y;return(y=(b=n==null?void 0:n.memory)==null?void 0:b.memory)==null?void 0:y[Qr]},[n]),[c,u]=p.useState("closed"),[d,g]=p.useState("closed"),m=b=>y=>{var w,v,h;!l||!e||o({agentId:e,requestBody:{id:e,memory:{...n==null?void 0:n.memory,memory:{...(w=n==null?void 0:n.memory)==null?void 0:w.memory,[b]:{...(h=(v=n==null?void 0:n.memory)==null?void 0:v.memory)==null?void 0:h[b],value:y}}}}},{onSuccess:()=>{i.invalidateQueries({queryKey:$s({agentId:e})})}})};return f.jsxs("div",{className:"pb-6 pt-4",children:[f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsx(wh,{children:"Core Memory"}),f.jsx(ue,{onClick:b=>{b.stopPropagation(),r()},disabled:a,variant:"outline",className:"z-10 h-7 w-7 p-0",children:f.jsx(Lq,{className:"size-5 "+(a?"animate-spin":"")})})]}),!l||!s?f.jsx("p",{className:"flex items-center justify-center p-20",children:"Loading memory..."}):f.jsxs(f.Fragment,{children:[f.jsx(TN,{className:"mt-2",title:"Agent Persona",name:l.name||"",content:l.value,onMoreClick:()=>u("view"),onEditClick:()=>u("edit"),icon:f.jsx(Lm,{className:"mr-2 h-5 w-5"})}),f.jsx(TN,{className:"my-4",title:"Human Persona",name:s.name||"",content:s.value,onMoreClick:()=>g("view"),onEditClick:()=>g("edit"),icon:f.jsx(QC,{className:"mr-2 h-5 w-5"})}),f.jsx(Xse,{status:t.status,content:l.value||"",name:l.name||"",onClose:()=>u("closed"),state:c,onEditPersonaClicked:()=>u("edit"),onCancelEditPersonaClicked:()=>u("closed"),onSaveEditPersonaClicked:m(Qr)}),f.jsx(Qse,{status:t.status,content:s.value||"",name:s.name||"",onClose:()=>g("closed"),state:d,onEditPersonaClicked:()=>g("edit"),onCancelEditPersonaClicked:()=>g("closed"),onSaveEditPersonaClicked:m(fr)})]})]})},ele=(e,t)=>{var a,o;const n=(a=e.tags)==null?void 0:a.includes("memgpt-base"),r=(o=t.tags)==null?void 0:o.includes("memgpt-base");return n&&r?e.name.localeCompare(t.name):n?-1:1},to="-ml-1 mr-2 size-5",tle={archival_memory_insert:f.jsx(bq,{className:to}),archival_memory_search:f.jsx(Oq,{className:to}),conversation_search:f.jsx(Ms,{className:to}),conversation_search_date:f.jsx(vq,{className:to}),core_memory_append:f.jsx(ya,{className:to}),core_memory_replace:f.jsx(Mq,{className:to}),pause_heartbeats:f.jsx(Tq,{className:to}),send_message:f.jsx($q,{className:to})},oA=({tool:e,showDescription:t,isAddModal:n,onClick:r})=>{var o,i;const a=n??!e.tags.some(s=>s==="memgpt-base");return f.jsxs("div",{className:"rounded-md border px-4 py-2",children:[f.jsxs("div",{className:"flex items-end justify-between",children:[f.jsxs("span",{className:"inline-flex items-center text-sm font-semibold",children:[tle[e.name]??f.jsx(Rq,{className:to})," ",e.name.replace(/_/g," ").replace(/\w\S*/g,s=>s.charAt(0).toUpperCase()+s.substring(1).toLowerCase())]}),a?f.jsx(ue,{variant:"ghost",size:"iconXs",type:"button",onClick:r,children:f.jsx(Di,{className:"size-4"})}):f.jsx("div",{className:"h-7"})]}),f.jsxs("div",{className:"mt-1 flex items-center justify-between",children:[f.jsx("span",{className:"ml-6 text-xs text-muted-foreground",children:e.name}),f.jsx(b9,{variant:"secondary",className:"text-muted-foreground",children:(o=e.tags[0])==null?void 0:o.replace("memgpt-","")})]}),t?f.jsx("div",{className:"mt-2",children:f.jsx("p",{className:"text-sm text-muted-foreground",children:JSON.stringify((i=e==null?void 0:e.json_schema)==null?void 0:i.description)||""})}):null]})},Y9=()=>{const e=To();return y_({agentId:(e==null?void 0:e.id)||""},void 0,{initialData:e,enabled:!!e})},nle=Xe({toolIds:nA(Ce())}),rle=({closeDialog:e})=>{const{data:t}=Y9(),{data:n,isLoading:r}=Xm(),{mutate:a,isPending:o}=cf(),i=Bt(),s=p.useMemo(()=>new Set(t==null?void 0:t.tools),[t]),l=p.useMemo(()=>(n||[]).filter(v=>!s.has(v.name)),[n]),c=To(),u=(c==null?void 0:c.tools)??[],d=bn({resolver:yn(nle),mode:"onSubmit",defaultValues:{toolIds:[]}}),g=async v=>{v.toolIds.length&&c!=null&&c.id&&a({agentId:c.id,requestBody:{id:c.id,tools:Array.from(new Set([...Array.from(s),...v.toolIds]))}},{onSuccess:()=>{i.invalidateQueries({queryKey:$s({agentId:c.id||""})}),e()}})},m=l.filter(v=>!u.some(h=>h===v.id)),b=d.watch("toolIds"),y=v=>{b.some(h=>h===v)||d.setValue("toolIds",[...b,v])},w=v=>{d.setValue("toolIds",b.filter(h=>h!==v))};return f.jsx(vn,{...d,children:f.jsxs("form",{onSubmit:d.handleSubmit(g,v=>console.log(v)),className:"space-y-8",children:[f.jsx(ut,{control:d.control,name:"toolIds",render:({field:v})=>f.jsxs(ot,{children:[f.jsxs(So,{disabled:r,onValueChange:h=>y(h),children:[f.jsx(pt,{children:f.jsx(za,{children:f.jsx(wo,{placeholder:r?"Loading tools...":"Search or select tools"})})}),f.jsx(Ua,{className:"max-h-[200px] overflow-y-auto",children:(m??[]).map(h=>f.jsx(Fn,{value:h.name,children:h.name},h.id))})]}),f.jsx(lt,{})]})}),f.jsx("div",{className:"space-y-2",children:d.watch("toolIds")?l.filter(v=>d.getValues("toolIds").some(h=>h===v.id)).map(v=>f.jsx(oA,{tool:v,showDescription:!0,isAddModal:!0,onClick:()=>w(v.id||"")},v.id)):null}),f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsx(ue,{variant:"ghost",type:"button",onClick:()=>e(),children:"Cancel"}),f.jsxs("div",{className:"flex gap-3",children:[o&&f.jsxs("div",{className:Tt("mr-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Adding tool to agent..."})]}),f.jsx(ue,{type:"submit",children:"Add Tool"})]})]})]})})},ale=({open:e,onOpenChange:t})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsx(Pt,{children:f.jsx($t,{children:"Add Tool"})}),f.jsx(rle,{closeDialog:()=>t(!1)})]})}),ole=({toolId:e,onClose:t})=>{const{mutate:n,isPending:r}=cf(),{data:a}=Y9(),o=Bt(),i=p.useMemo(()=>new Set(a==null?void 0:a.tools),[a]),s=()=>{!e||!(a!=null&&a.id)||n({agentId:a.id,requestBody:{id:a.id,tools:Array.from(i).filter(l=>l!==e)}},{onSuccess:()=>{o.invalidateQueries({queryKey:$s({agentId:a.id||""})}),t()}})};return f.jsx(Kt,{open:!0,onOpenChange:()=>{t()},children:f.jsxs(Ht,{className:"max-h-[95svh] w-full max-w-80 overflow-auto",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Remove Tool"}),f.jsx(dn,{children:"Are you sure you want to remove this Tool? This is a base Agent tool, removing it might result in problems in hove the Agent functions."})]}),f.jsxs("div",{className:"flex justify-end gap-4",children:[f.jsx(ue,{type:"button",variant:"ghost",onClick:()=>t(),children:"Cancel"}),f.jsx(ue,{isBusy:r,onClick:s,children:"Remove"})]})]})})},ile=({open:e,onOpenChange:t,onOpenAddToolsChange:n,tools:r,onRemoveTool:a})=>{const[o,i]=p.useState(!1),[s,l]=p.useState(""),c=(r??[]).filter(u=>{var d;return(d=u.name)==null?void 0:d.toLowerCase().includes(s.toLowerCase())});return f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full overflow-auto sm:max-w-[800px]",children:[f.jsx(Pt,{children:f.jsx($t,{children:"Tools"})}),f.jsx(aA,{items:r,searchTerm:s,setSearchTerm:l,setShowSearchInput:i,showSearchInput:o,onOpenAddDialog:n,buttonText:"Add Tool"}),c==null?void 0:c.map(u=>f.jsx(oA,{tool:u,showDescription:!0,onClick:()=>a(u.name||"")},u.id))]})})},sle=({tools:e})=>{const[t,n]=p.useState(!1),[r,a]=p.useState(!1),[o,i]=p.useState(null),{data:s}=Xm(),l=p.useMemo(()=>(s==null?void 0:s.filter(u=>e.find(d=>d===u.name)))||[],[s,e]),c=(s||[]).length>l.length;return f.jsxs(f.Fragment,{children:[f.jsxs("div",{className:"py-4",children:[f.jsxs(wh,{button:c?f.jsx(rA,{onClick:()=>n(!0)}):null,children:["Tools (",e.length,")"]}),f.jsx("div",{className:"mt-2 space-y-2",children:l.sort(ele).slice(0,3).map(u=>f.jsx(oA,{tool:u,onClick:()=>i(u.name||"")},u.id))}),e.length<3?null:f.jsxs(ue,{onClick:()=>a(!0),className:"mt-2 h-7 w-fit p-2 font-semibold",variant:"link",children:["See all ",f.jsx($m,{className:"ml-2 h-4 w-4"})]})]}),f.jsx(ile,{onOpenChange:u=>a(u),open:r,onOpenAddToolsChange:u=>n(u),tools:l,onRemoveTool:u=>i(u)}),f.jsx(ale,{onOpenChange:n,open:t}),o&&f.jsx(ole,{onClose:()=>i(null),toolId:o})]})};function lle(e){const{agent:t}=e,[n,r]=p.useState(!1),{data:a}=w6(),{mutate:o}=cf(),i=Bt(),s=p.useCallback(l=>{if(!t.id)return;const c=a==null?void 0:a.find(u=>u.model===l);c&&o({agentId:t.id,requestBody:{llm_config:c,id:t.id}},{onSuccess:()=>{i.setQueriesData({queryKey:$s({agentId:t.id||""})},u=>{if(u)return{...u,llm_config:c}})}})},[t.id,o,i]);return f.jsx("div",{className:"pb-6 pt-4",children:f.jsxs("div",{className:"h-[35px] flex flex-col justify-between",children:[f.jsx(Sh,{children:"Model"}),n?f.jsxs("div",{className:"flex items-center gap-2",children:[f.jsxs(So,{value:t.llm_config.model,onValueChange:s,children:[f.jsx(za,{children:f.jsx(wo,{placeholder:"Select a model"})}),f.jsx(Ua,{children:a?a.map(l=>f.jsx(Fn,{value:l.model,children:l.model},l.model)):f.jsx(Fn,{value:"loading",disabled:!0,children:"Loading..."})})]}),f.jsxs("button",{onClick:()=>r(!1),className:"h-7 w-7 p-0",children:[f.jsx(Di,{})," ",f.jsx("div",{className:"sr-only",children:"Close"})," "]})]}):f.jsxs("div",{onClick:()=>r(!0),className:"flex cursor-pointer items-center gap-2 text-sm",children:[t.llm_config.model," ",f.jsx(J4,{className:"w-4"}),f.jsx("div",{className:"sr-only",children:"Edit"})]})]})})}function cle(e){const{agent:t}=e,{data:n}=E6(),[r,a]=p.useState(!1),{mutate:o}=cf(),i=Bt(),s=p.useCallback(l=>{if(!n||!t.id)return;const c=n.find(u=>u.embedding_model===l);c&&o({agentId:t.id,requestBody:{embedding_config:c,id:t.id}},{onSuccess:()=>{i.setQueriesData({queryKey:$s({agentId:t.id||""})},u=>{if(u)return{...u,embedding_config:c}})}})},[t.id,n,o,i]);return f.jsx("div",{className:"pb-6 pt-4",children:f.jsxs("div",{className:"h-[35px] flex w-full flex-col items-start justify-start",children:[f.jsx(Sh,{children:"Embedding Model"}),r?f.jsxs("div",{className:"flex w-full items-center gap-2",children:[f.jsxs(So,{value:t.embedding_config.embedding_model,onValueChange:s,children:[f.jsx(za,{className:"w-full",children:f.jsx(wo,{placeholder:"Select an embedding model"})}),f.jsx(Ua,{children:n?n.map(l=>f.jsx(Fn,{value:l.embedding_model,children:l.embedding_model},l.embedding_model)):f.jsx(Fn,{value:"loading",disabled:!0,children:"Loading..."})})]}),f.jsxs("button",{onClick:()=>a(!1),className:"h-7 w-7 p-0",children:[f.jsx(Di,{})," ",f.jsx("div",{className:"sr-only",children:"Close"})," "]})]}):f.jsxs("div",{onClick:()=>a(!0),className:"flex cursor-pointer items-center gap-2 text-sm",children:[t.embedding_config.embedding_model," ",f.jsx(J4,{className:"w-4"}),f.jsx("div",{className:"sr-only",children:"Edit"})]})]})})}const ule=({currentAgentId:e})=>{const t=To(),{data:n}=y_({agentId:(t==null?void 0:t.id)||""},void 0,{initialData:t,enabled:!!t});return f.jsxs("div",{className:"w-96 flex-none overflow-auto px-4",children:[n&&f.jsx(lle,{agent:n}),n&&f.jsx(cle,{agent:n}),f.jsx(Jse,{agentId:e}),f.jsx(bse,{agentId:e}),f.jsx(Cse,{}),f.jsx(sle,{tools:(n==null?void 0:n.tools)??[]}),f.jsx(Kse,{})]})},RN={user:6,"internal-monologue":5,assistant:4,"function-call":3,"message-receipt":2,error:1,login:0},dle=(e,t)=>e.sort((n,r)=>{const a=n.date.toISOString().localeCompare(r.date.toISOString());return a!==0?a:RN[r.type]-RN[n.type]}).filter(n=>!!n.message),fle=()=>{const e=p.useRef(null),t=p.useRef(null),n=p.useRef(null),[r,a]=p.useState(!0),[o,i]=p.useState(!1),s=p.useCallback(()=>{e.current&&e.current.scrollIntoView({block:"end",behavior:"smooth"})},[]);return p.useEffect(()=>{e.current&&r&&!o&&e.current.scrollIntoView({block:"end"})},[r,o]),p.useEffect(()=>{const{current:l}=t;if(l){const c=u=>{const d=u.target,g=25,m=d.scrollTop+d.clientHeight>=d.scrollHeight-g;a(m)};return l.addEventListener("scroll",c,{passive:!0}),()=>{l.removeEventListener("scroll",c)}}},[]),p.useEffect(()=>{if(n.current){const l=new IntersectionObserver(c=>{c.forEach(u=>{u.isIntersecting?i(!0):i(!1)})},{rootMargin:"0px 0px 100px 0px"});return l.observe(n.current),()=>{l.disconnect()}}}),{messagesRef:e,scrollRef:t,visibilityRef:n,scrollToBottom:s,isAtBottom:r,isVisible:o}},ple=({children:e})=>f.jsx("div",{className:"relative flex-1 overflow-y-auto",children:e}),gle=({name:e,date:t})=>e?f.jsxs("p",{className:"flex items-center",children:[f.jsx("span",{className:"mr-2 flex h-6 w-6 items-center justify-center rounded-full bg-primary text-primary-foreground",children:f.jsx(Lm,{className:"h-4 w-4"})}),f.jsx("span",{className:"text-sm font-semibold text-foreground",children:e}),f.jsx("span",{className:"ml-2 text-xs font-normal text-muted-foreground",children:t?Bs(t,"MMM d yy, h:mm a"):""})]}):null;function mle(e){if(typeof e!="string")throw new TypeError("Expected a string");return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}const Eh=function(e){if(e==null)return vle;if(typeof e=="function")return xh(e);if(typeof e=="object")return Array.isArray(e)?hle(e):ble(e);if(typeof e=="string")return yle(e);throw new Error("Expected function, string, or object as test")};function hle(e){const t=[];let n=-1;for(;++n":""))+")"})}return g;function g(){let m=Z9,b,y,w;if((!t||o(l,c,u[u.length-1]||void 0))&&(m=xle(n(l,u)),m[0]===Ik))return m;if("children"in l&&l.children){const v=l;if(v.children&&m[0]!==Ele)for(y=(r?v.children.length:-1)+i,w=u.concat(v);y>-1&&y0?{type:"text",value:x}:void 0),x===!1?g.lastIndex=E+1:(b!==E&&h.push({type:"text",value:c.value.slice(b,E)}),Array.isArray(x)?h.push(...x):x&&h.push(x),b=E+S[0].length,v=!0),!g.global)break;S=g.exec(c.value)}return v?(b-1&&e.test(String.fromCharCode(n))}}const my="phrasing",hy=["autolink","link","image","label"];function Dle(){return{transforms:[zle],enter:{literalAutolink:Mle,literalAutolinkEmail:by,literalAutolinkHttp:by,literalAutolinkWww:by},exit:{literalAutolink:jle,literalAutolinkEmail:Fle,literalAutolinkHttp:Ple,literalAutolinkWww:$le}}}function Lle(){return{unsafe:[{character:"@",before:"[+\\-.\\w]",after:"[\\-.\\w]",inConstruct:my,notInConstruct:hy},{character:".",before:"[Ww]",after:"[\\-.\\w]",inConstruct:my,notInConstruct:hy},{character:":",before:"[ps]",after:"\\/",inConstruct:my,notInConstruct:hy}]}}function Mle(e){this.enter({type:"link",title:null,url:"",children:[]},e)}function by(e){this.config.enter.autolinkProtocol.call(this,e)}function Ple(e){this.config.exit.autolinkProtocol.call(this,e)}function $le(e){this.config.exit.data.call(this,e);const t=this.stack[this.stack.length-1];t.type,t.url="http://"+this.sliceSerialize(e)}function Fle(e){this.config.exit.autolinkEmail.call(this,e)}function jle(e){this.exit(e)}function zle(e){Q9(e,[[/(https?:\/\/|www(?=\.))([-.\w]+)([^ \t\r\n]*)/gi,Ule],[/([-.\w+]+)@([-\w]+(?:\.[-\w]+)+)/g,Ble]],{ignore:["link","linkReference"]})}function Ule(e,t,n,r,a){let o="";if(!J9(a)||(/^w/i.test(t)&&(n=t+n,t="",o="http://"),!Hle(n)))return!1;const i=Vle(n+r);if(!i[0])return!1;const s={type:"link",title:null,url:o+t+i[0],children:[{type:"text",value:t+i[0]}]};return i[1]?[s,{type:"text",value:i[1]}]:s}function Ble(e,t,n,r){return!J9(r,!0)||/[-\d_]$/.test(n)?!1:{type:"link",title:null,url:"mailto:"+t+"@"+n,children:[{type:"text",value:t+"@"+n}]}}function Hle(e){const t=e.split(".");return!(t.length<2||t[t.length-1]&&(/_/.test(t[t.length-1])||!/[a-zA-Z\d]/.test(t[t.length-1]))||t[t.length-2]&&(/_/.test(t[t.length-2])||!/[a-zA-Z\d]/.test(t[t.length-2])))}function Vle(e){const t=/[!"&'),.:;<>?\]}]+$/.exec(e);if(!t)return[e,void 0];e=e.slice(0,t.index);let n=t[0],r=n.indexOf(")");const a=NN(e,"(");let o=NN(e,")");for(;r!==-1&&a>o;)e+=n.slice(0,r+1),n=n.slice(r+1),r=n.indexOf(")"),o++;return[e,n]}function J9(e,t){const n=e.input.charCodeAt(e.index-1);return(e.index===0||Is(n)||kh(n))&&(!t||n!==47)}function ma(e){return e.replace(/[\t\n\r ]+/g," ").replace(/^ | $/g,"").toLowerCase().toUpperCase()}ej.peek=tce;function qle(){return{enter:{gfmFootnoteDefinition:Wle,gfmFootnoteDefinitionLabelString:Kle,gfmFootnoteCall:Xle,gfmFootnoteCallString:Qle},exit:{gfmFootnoteDefinition:Zle,gfmFootnoteDefinitionLabelString:Yle,gfmFootnoteCall:ece,gfmFootnoteCallString:Jle}}}function Gle(){return{unsafe:[{character:"[",inConstruct:["phrasing","label","reference"]}],handlers:{footnoteDefinition:nce,footnoteReference:ej}}}function Wle(e){this.enter({type:"footnoteDefinition",identifier:"",label:"",children:[]},e)}function Kle(){this.buffer()}function Yle(e){const t=this.resume(),n=this.stack[this.stack.length-1];n.type,n.label=t,n.identifier=ma(this.sliceSerialize(e)).toLowerCase()}function Zle(e){this.exit(e)}function Xle(e){this.enter({type:"footnoteReference",identifier:"",label:""},e)}function Qle(){this.buffer()}function Jle(e){const t=this.resume(),n=this.stack[this.stack.length-1];n.type,n.label=t,n.identifier=ma(this.sliceSerialize(e)).toLowerCase()}function ece(e){this.exit(e)}function ej(e,t,n,r){const a=n.createTracker(r);let o=a.move("[^");const i=n.enter("footnoteReference"),s=n.enter("reference");return o+=a.move(n.safe(n.associationId(e),{...a.current(),before:o,after:"]"})),s(),i(),o+=a.move("]"),o}function tce(){return"["}function nce(e,t,n,r){const a=n.createTracker(r);let o=a.move("[^");const i=n.enter("footnoteDefinition"),s=n.enter("label");return o+=a.move(n.safe(n.associationId(e),{...a.current(),before:o,after:"]"})),s(),o+=a.move("]:"+(e.children&&e.children.length>0?" ":"")),a.shift(4),o+=a.move(n.indentLines(n.containerFlow(e,a.current()),rce)),i(),o}function rce(e,t,n){return t===0?e:(n?"":" ")+e}const ace=["autolink","destinationLiteral","destinationRaw","reference","titleQuote","titleApostrophe"];tj.peek=cce;function oce(){return{canContainEols:["delete"],enter:{strikethrough:sce},exit:{strikethrough:lce}}}function ice(){return{unsafe:[{character:"~",inConstruct:"phrasing",notInConstruct:ace}],handlers:{delete:tj}}}function sce(e){this.enter({type:"delete",children:[]},e)}function lce(e){this.exit(e)}function tj(e,t,n,r){const a=n.createTracker(r),o=n.enter("strikethrough");let i=a.move("~~");return i+=n.containerPhrasing(e,{...a.current(),before:i,after:"~"}),i+=a.move("~~"),o(),i}function cce(){return"~"}function uce(e,t={}){const n=(t.align||[]).concat(),r=t.stringLength||fce,a=[],o=[],i=[],s=[];let l=0,c=-1;for(;++cl&&(l=e[c].length);++ws[w])&&(s[w]=h)}b.push(v)}o[c]=b,i[c]=y}let u=-1;if(typeof n=="object"&&"length"in n)for(;++us[u]&&(s[u]=v),g[u]=v),d[u]=h}o.splice(1,0,d),i.splice(1,0,g),c=-1;const m=[];for(;++c "),o.shift(2);const i=n.indentLines(n.containerFlow(e,o.current()),gce);return a(),i}function gce(e,t,n){return">"+(n?"":" ")+e}function mce(e,t){return ON(e,t.inConstruct,!0)&&!ON(e,t.notInConstruct,!1)}function ON(e,t,n){if(typeof t=="string"&&(t=[t]),!t||t.length===0)return n;let r=-1;for(;++ri&&(i=o):o=1,a=r+t.length,r=n.indexOf(t,a);return i}function bce(e,t){return!!(t.options.fences===!1&&e.value&&!e.lang&&/[^ \r\n]/.test(e.value)&&!/^[\t ]*(?:[\r\n]|$)|(?:^|[\r\n])[\t ]*$/.test(e.value))}function yce(e){const t=e.options.fence||"`";if(t!=="`"&&t!=="~")throw new Error("Cannot serialize code with `"+t+"` for `options.fence`, expected `` ` `` or `~`");return t}function vce(e,t,n,r){const a=yce(n),o=e.value||"",i=a==="`"?"GraveAccent":"Tilde";if(bce(e,n)){const d=n.enter("codeIndented"),g=n.indentLines(o,Sce);return d(),g}const s=n.createTracker(r),l=a.repeat(Math.max(hce(o,a)+1,3)),c=n.enter("codeFenced");let u=s.move(l);if(e.lang){const d=n.enter(`codeFencedLang${i}`);u+=s.move(n.safe(e.lang,{before:u,after:" ",encode:["`"],...s.current()})),d()}if(e.lang&&e.meta){const d=n.enter(`codeFencedMeta${i}`);u+=s.move(" "),u+=s.move(n.safe(e.meta,{before:u,after:` -`,encode:["`"],...s.current()})),d()}return u+=s.move(` -`),o&&(u+=s.move(o+` -`)),u+=s.move(l),c(),u}function Sce(e,t,n){return(n?"":" ")+e}function iA(e){const t=e.options.quote||'"';if(t!=='"'&&t!=="'")throw new Error("Cannot serialize title with `"+t+"` for `options.quote`, expected `\"`, or `'`");return t}function wce(e,t,n,r){const a=iA(n),o=a==='"'?"Quote":"Apostrophe",i=n.enter("definition");let s=n.enter("label");const l=n.createTracker(r);let c=l.move("[");return c+=l.move(n.safe(n.associationId(e),{before:c,after:"]",...l.current()})),c+=l.move("]: "),s(),!e.url||/[\0- \u007F]/.test(e.url)?(s=n.enter("destinationLiteral"),c+=l.move("<"),c+=l.move(n.safe(e.url,{before:c,after:">",...l.current()})),c+=l.move(">")):(s=n.enter("destinationRaw"),c+=l.move(n.safe(e.url,{before:c,after:e.title?" ":` -`,...l.current()}))),s(),e.title&&(s=n.enter(`title${o}`),c+=l.move(" "+a),c+=l.move(n.safe(e.title,{before:c,after:a,...l.current()})),c+=l.move(a),s()),i(),c}function Ece(e){const t=e.options.emphasis||"*";if(t!=="*"&&t!=="_")throw new Error("Cannot serialize emphasis with `"+t+"` for `options.emphasis`, expected `*`, or `_`");return t}nj.peek=xce;function nj(e,t,n,r){const a=Ece(n),o=n.enter("emphasis"),i=n.createTracker(r);let s=i.move(a);return s+=i.move(n.containerPhrasing(e,{before:s,after:a,...i.current()})),s+=i.move(a),o(),s}function xce(e,t,n){return n.options.emphasis||"*"}function sA(e,t,n,r){let a,o,i;typeof t=="function"&&typeof n!="function"?(o=void 0,i=t,a=n):(o=t,i=n,a=r),X9(e,o,s,a);function s(l,c){const u=c[c.length-1],d=u?u.children.indexOf(l):void 0;return i(l,d,u)}}const kce={};function lA(e,t){const n=t||kce,r=typeof n.includeImageAlt=="boolean"?n.includeImageAlt:!0,a=typeof n.includeHtml=="boolean"?n.includeHtml:!0;return rj(e,r,a)}function rj(e,t,n){if(Cce(e)){if("value"in e)return e.type==="html"&&!n?"":e.value;if(t&&"alt"in e&&e.alt)return e.alt;if("children"in e)return LN(e.children,t,n)}return Array.isArray(e)?LN(e,t,n):""}function LN(e,t,n){const r=[];let a=-1;for(;++a",...l.current()})),c+=l.move(">")):(s=n.enter("destinationRaw"),c+=l.move(n.safe(e.url,{before:c,after:e.title?" ":")",...l.current()}))),s(),e.title&&(s=n.enter(`title${o}`),c+=l.move(" "+a),c+=l.move(n.safe(e.title,{before:c,after:a,...l.current()})),c+=l.move(a),s()),c+=l.move(")"),i(),c}function Rce(){return"!"}ij.peek=Nce;function ij(e,t,n,r){const a=e.referenceType,o=n.enter("imageReference");let i=n.enter("label");const s=n.createTracker(r);let l=s.move("![");const c=n.safe(e.alt,{before:l,after:"]",...s.current()});l+=s.move(c+"]["),i();const u=n.stack;n.stack=[],i=n.enter("reference");const d=n.safe(n.associationId(e),{before:l,after:"]",...s.current()});return i(),n.stack=u,o(),a==="full"||!c||c!==d?l+=s.move(d+"]"):a==="shortcut"?l=l.slice(0,-1):l+=s.move("]"),l}function Nce(){return"!"}sj.peek=Ice;function sj(e,t,n){let r=e.value||"",a="`",o=-1;for(;new RegExp("(^|[^`])"+a+"([^`]|$)").test(r);)a+="`";for(/[^ \r\n]/.test(r)&&(/^[ \r\n]/.test(r)&&/[ \r\n]$/.test(r)||/^`|`$/.test(r))&&(r=" "+r+" ");++o\u007F]/.test(e.url))}cj.peek=Oce;function cj(e,t,n,r){const a=iA(n),o=a==='"'?"Quote":"Apostrophe",i=n.createTracker(r);let s,l;if(lj(e,n)){const u=n.stack;n.stack=[],s=n.enter("autolink");let d=i.move("<");return d+=i.move(n.containerPhrasing(e,{before:d,after:">",...i.current()})),d+=i.move(">"),s(),n.stack=u,d}s=n.enter("link"),l=n.enter("label");let c=i.move("[");return c+=i.move(n.containerPhrasing(e,{before:c,after:"](",...i.current()})),c+=i.move("]("),l(),!e.url&&e.title||/[\0- \u007F]/.test(e.url)?(l=n.enter("destinationLiteral"),c+=i.move("<"),c+=i.move(n.safe(e.url,{before:c,after:">",...i.current()})),c+=i.move(">")):(l=n.enter("destinationRaw"),c+=i.move(n.safe(e.url,{before:c,after:e.title?" ":")",...i.current()}))),l(),e.title&&(l=n.enter(`title${o}`),c+=i.move(" "+a),c+=i.move(n.safe(e.title,{before:c,after:a,...i.current()})),c+=i.move(a),l()),c+=i.move(")"),s(),c}function Oce(e,t,n){return lj(e,n)?"<":"["}uj.peek=Dce;function uj(e,t,n,r){const a=e.referenceType,o=n.enter("linkReference");let i=n.enter("label");const s=n.createTracker(r);let l=s.move("[");const c=n.containerPhrasing(e,{before:l,after:"]",...s.current()});l+=s.move(c+"]["),i();const u=n.stack;n.stack=[],i=n.enter("reference");const d=n.safe(n.associationId(e),{before:l,after:"]",...s.current()});return i(),n.stack=u,o(),a==="full"||!c||c!==d?l+=s.move(d+"]"):a==="shortcut"?l=l.slice(0,-1):l+=s.move("]"),l}function Dce(){return"["}function cA(e){const t=e.options.bullet||"*";if(t!=="*"&&t!=="+"&&t!=="-")throw new Error("Cannot serialize items with `"+t+"` for `options.bullet`, expected `*`, `+`, or `-`");return t}function Lce(e){const t=cA(e),n=e.options.bulletOther;if(!n)return t==="*"?"-":"*";if(n!=="*"&&n!=="+"&&n!=="-")throw new Error("Cannot serialize items with `"+n+"` for `options.bulletOther`, expected `*`, `+`, or `-`");if(n===t)throw new Error("Expected `bullet` (`"+t+"`) and `bulletOther` (`"+n+"`) to be different");return n}function Mce(e){const t=e.options.bulletOrdered||".";if(t!=="."&&t!==")")throw new Error("Cannot serialize items with `"+t+"` for `options.bulletOrdered`, expected `.` or `)`");return t}function dj(e){const t=e.options.rule||"*";if(t!=="*"&&t!=="-"&&t!=="_")throw new Error("Cannot serialize rules with `"+t+"` for `options.rule`, expected `*`, `-`, or `_`");return t}function Pce(e,t,n,r){const a=n.enter("list"),o=n.bulletCurrent;let i=e.ordered?Mce(n):cA(n);const s=e.ordered?i==="."?")":".":Lce(n);let l=t&&n.bulletLastUsed?i===n.bulletLastUsed:!1;if(!e.ordered){const u=e.children?e.children[0]:void 0;if((i==="*"||i==="-")&&u&&(!u.children||!u.children[0])&&n.stack[n.stack.length-1]==="list"&&n.stack[n.stack.length-2]==="listItem"&&n.stack[n.stack.length-3]==="list"&&n.stack[n.stack.length-4]==="listItem"&&n.indexStack[n.indexStack.length-1]===0&&n.indexStack[n.indexStack.length-2]===0&&n.indexStack[n.indexStack.length-3]===0&&(l=!0),dj(n)===i&&u){let d=-1;for(;++d-1?t.start:1)+(n.options.incrementListMarker===!1?0:t.children.indexOf(e))+o);let i=o.length+1;(a==="tab"||a==="mixed"&&(t&&t.type==="list"&&t.spread||e.spread))&&(i=Math.ceil(i/4)*4);const s=n.createTracker(r);s.move(o+" ".repeat(i-o.length)),s.shift(i);const l=n.enter("listItem"),c=n.indentLines(n.containerFlow(e,s.current()),u);return l(),c;function u(d,g,m){return g?(m?"":" ".repeat(i))+d:(m?o:o+" ".repeat(i-o.length))+d}}function jce(e,t,n,r){const a=n.enter("paragraph"),o=n.enter("phrasing"),i=n.containerPhrasing(e,r);return o(),a(),i}const zce=Eh(["break","delete","emphasis","footnote","footnoteReference","image","imageReference","inlineCode","inlineMath","link","linkReference","mdxJsxTextElement","mdxTextExpression","strong","text","textDirective"]);function Uce(e,t,n,r){return(e.children.some(function(i){return zce(i)})?n.containerPhrasing:n.containerFlow).call(n,e,r)}function Bce(e){const t=e.options.strong||"*";if(t!=="*"&&t!=="_")throw new Error("Cannot serialize strong with `"+t+"` for `options.strong`, expected `*`, or `_`");return t}fj.peek=Hce;function fj(e,t,n,r){const a=Bce(n),o=n.enter("strong"),i=n.createTracker(r);let s=i.move(a+a);return s+=i.move(n.containerPhrasing(e,{before:s,after:a,...i.current()})),s+=i.move(a+a),o(),s}function Hce(e,t,n){return n.options.strong||"*"}function Vce(e,t,n,r){return n.safe(e.value,r)}function qce(e){const t=e.options.ruleRepetition||3;if(t<3)throw new Error("Cannot serialize rules with repetition `"+t+"` for `options.ruleRepetition`, expected `3` or more");return t}function Gce(e,t,n){const r=(dj(n)+(n.options.ruleSpaces?" ":"")).repeat(qce(n));return n.options.ruleSpaces?r.slice(0,-1):r}const pj={blockquote:pce,break:DN,code:vce,definition:wce,emphasis:nj,hardBreak:DN,heading:Ace,html:aj,image:oj,imageReference:ij,inlineCode:sj,link:cj,linkReference:uj,list:Pce,listItem:Fce,paragraph:jce,root:Uce,strong:fj,text:Vce,thematicBreak:Gce},MN=document.createElement("i");function uA(e){const t="&"+e+";";MN.innerHTML=t;const n=MN.textContent;return n.charCodeAt(n.length-1)===59&&e!=="semi"||n===t?!1:n}function gj(e,t){const n=Number.parseInt(e,t);return n<9||n===11||n>13&&n<32||n>126&&n<160||n>55295&&n<57344||n>64975&&n<65008||(n&65535)===65535||(n&65535)===65534||n>1114111?"�":String.fromCodePoint(n)}const Wce=/\\([!-/:-@[-`{-~])|&(#(?:\d{1,7}|x[\da-f]{1,6})|[\da-z]{1,31});/gi;function Kce(e){return e.replace(Wce,Yce)}function Yce(e,t,n){if(t)return t;if(n.charCodeAt(0)===35){const a=n.charCodeAt(1),o=a===120||a===88;return gj(n.slice(o?2:1),o?16:10)}return uA(n)||e}function Zce(){return{enter:{table:Xce,tableData:PN,tableHeader:PN,tableRow:Jce},exit:{codeText:eue,table:Qce,tableData:yy,tableHeader:yy,tableRow:yy}}}function Xce(e){const t=e._align;this.enter({type:"table",align:t.map(function(n){return n==="none"?null:n}),children:[]},e),this.data.inTable=!0}function Qce(e){this.exit(e),this.data.inTable=void 0}function Jce(e){this.enter({type:"tableRow",children:[]},e)}function yy(e){this.exit(e)}function PN(e){this.enter({type:"tableCell",children:[]},e)}function eue(e){let t=this.resume();this.data.inTable&&(t=t.replace(/\\([\\|])/g,tue));const n=this.stack[this.stack.length-1];n.type,n.value=t,this.exit(e)}function tue(e,t){return t==="|"?t:e}function nue(e){const t=e||{},n=t.tableCellPadding,r=t.tablePipeAlign,a=t.stringLength,o=n?" ":"|";return{unsafe:[{character:"\r",inConstruct:"tableCell"},{character:` -`,inConstruct:"tableCell"},{atBreak:!0,character:"|",after:"[ :-]"},{character:"|",inConstruct:"tableCell"},{atBreak:!0,character:":",after:"-"},{atBreak:!0,character:"-",after:"[:|-]"}],handlers:{inlineCode:g,table:i,tableCell:l,tableRow:s}};function i(m,b,y,w){return c(u(m,y,w),m.align)}function s(m,b,y,w){const v=d(m,y,w),h=c([v]);return h.slice(0,h.indexOf(` -`))}function l(m,b,y,w){const v=y.enter("tableCell"),h=y.enter("phrasing"),S=y.containerPhrasing(m,{...w,before:o,after:o});return h(),v(),S}function c(m,b){return uce(m,{align:b,alignDelimiters:r,padding:n,stringLength:a})}function u(m,b,y){const w=m.children;let v=-1;const h=[],S=b.enter("table");for(;++va?0:a+t:t=t>a?a:t,n=n>0?n:0,r.length<1e4)i=Array.from(r),i.unshift(t,n),e.splice(...i);else for(n&&e.splice(t,n);o0?(Wr(e,e.length,0,t),e):t}const FN={}.hasOwnProperty;function mj(e){const t={};let n=-1;for(;++n0&&!n&&(e[e.length-1][1]._gfmAutolinkLiteralWalkedInto=!0),n}function Hc(e){const t=[];let n=-1,r=0,a=0;for(;++n55295&&o<57344){const s=e.charCodeAt(n+1);o<56320&&s>56319&&s<57344?(i=String.fromCharCode(o,s),a=1):i="�"}else i=String.fromCharCode(o);i&&(t.push(e.slice(r,n),encodeURIComponent(i)),r=n+a+1,i=""),a&&(n+=a,a=0)}return t.join("")+e.slice(r)}function rm(e){if(e===null||Et(e)||Is(e))return 1;if(kh(e))return 2}function Ch(e,t,n){const r=[];let a=-1;for(;++a1&&e[n][1].end.offset-e[n][1].start.offset>1?2:1;const d=Object.assign({},e[r][1].end),g=Object.assign({},e[n][1].start);jN(d,-l),jN(g,l),i={type:l>1?"strongSequence":"emphasisSequence",start:d,end:Object.assign({},e[r][1].end)},s={type:l>1?"strongSequence":"emphasisSequence",start:Object.assign({},e[n][1].start),end:g},o={type:l>1?"strongText":"emphasisText",start:Object.assign({},e[r][1].end),end:Object.assign({},e[n][1].start)},a={type:l>1?"strong":"emphasis",start:Object.assign({},i.start),end:Object.assign({},s.end)},e[r][1].end=Object.assign({},i.start),e[n][1].start=Object.assign({},s.end),c=[],e[r][1].end.offset-e[r][1].start.offset&&(c=Br(c,[["enter",e[r][1],t],["exit",e[r][1],t]])),c=Br(c,[["enter",a,t],["enter",i,t],["exit",i,t],["enter",o,t]]),c=Br(c,Ch(t.parser.constructs.insideSpan.null,e.slice(r+1,n),t)),c=Br(c,[["exit",o,t],["enter",s,t],["exit",s,t],["exit",a,t]]),e[n][1].end.offset-e[n][1].start.offset?(u=2,c=Br(c,[["enter",e[n][1],t],["exit",e[n][1],t]])):u=0,Wr(e,r-1,n-r+3,c),n=r+c.length-u-2;break}}for(n=-1;++n0&&tt(x)?ct(e,h,"linePrefix",o+1)(x):h(x)}function h(x){return x===null||Oe(x)?e.check(zN,y,E)(x):(e.enter("codeFlowValue"),S(x))}function S(x){return x===null||Oe(x)?(e.exit("codeFlowValue"),h(x)):(e.consume(x),S)}function E(x){return e.exit("codeFenced"),t(x)}function k(x,C,_){let R=0;return T;function T(M){return x.enter("lineEnding"),x.consume(M),x.exit("lineEnding"),L}function L(M){return x.enter("codeFencedFence"),tt(M)?ct(x,D,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(M):D(M)}function D(M){return M===s?(x.enter("codeFencedFenceSequence"),H(M)):_(M)}function H(M){return M===s?(R++,x.consume(M),H):R>=i?(x.exit("codeFencedFenceSequence"),tt(M)?ct(x,z,"whitespace")(M):z(M)):_(M)}function z(M){return M===null||Oe(M)?(x.exit("codeFencedFence"),C(M)):_(M)}}}function Due(e,t,n){const r=this;return a;function a(i){return i===null?n(i):(e.enter("lineEnding"),e.consume(i),e.exit("lineEnding"),o)}function o(i){return r.parser.lazy[r.now().line]?n(i):t(i)}}const vy={name:"codeIndented",tokenize:Mue},Lue={tokenize:Pue,partial:!0};function Mue(e,t,n){const r=this;return a;function a(c){return e.enter("codeIndented"),ct(e,o,"linePrefix",4+1)(c)}function o(c){const u=r.events[r.events.length-1];return u&&u[1].type==="linePrefix"&&u[2].sliceSerialize(u[1],!0).length>=4?i(c):n(c)}function i(c){return c===null?l(c):Oe(c)?e.attempt(Lue,i,l)(c):(e.enter("codeFlowValue"),s(c))}function s(c){return c===null||Oe(c)?(e.exit("codeFlowValue"),i(c)):(e.consume(c),s)}function l(c){return e.exit("codeIndented"),t(c)}}function Pue(e,t,n){const r=this;return a;function a(i){return r.parser.lazy[r.now().line]?n(i):Oe(i)?(e.enter("lineEnding"),e.consume(i),e.exit("lineEnding"),a):ct(e,o,"linePrefix",4+1)(i)}function o(i){const s=r.events[r.events.length-1];return s&&s[1].type==="linePrefix"&&s[2].sliceSerialize(s[1],!0).length>=4?t(i):Oe(i)?a(i):n(i)}}const $ue={name:"codeText",tokenize:zue,resolve:Fue,previous:jue};function Fue(e){let t=e.length-4,n=3,r,a;if((e[n][1].type==="lineEnding"||e[n][1].type==="space")&&(e[t][1].type==="lineEnding"||e[t][1].type==="space")){for(r=n;++r=this.left.length+this.right.length)throw new RangeError("Cannot access index `"+t+"` in a splice buffer of size `"+(this.left.length+this.right.length)+"`");return tthis.left.length?this.right.slice(this.right.length-r+this.left.length,this.right.length-t+this.left.length).reverse():this.left.slice(t).concat(this.right.slice(this.right.length-r+this.left.length).reverse())}splice(t,n,r){const a=n||0;this.setCursor(Math.trunc(t));const o=this.right.splice(this.right.length-a,Number.POSITIVE_INFINITY);return r&&mu(this.left,r),o.reverse()}pop(){return this.setCursor(Number.POSITIVE_INFINITY),this.left.pop()}push(t){this.setCursor(Number.POSITIVE_INFINITY),this.left.push(t)}pushMany(t){this.setCursor(Number.POSITIVE_INFINITY),mu(this.left,t)}unshift(t){this.setCursor(0),this.right.push(t)}unshiftMany(t){this.setCursor(0),mu(this.right,t.reverse())}setCursor(t){if(!(t===this.left.length||t>this.left.length&&this.right.length===0||t<0&&this.left.length===0))if(t=4?t(i):e.interrupt(r.parser.constructs.flow,n,t)(i)}}function Tj(e,t,n,r,a,o,i,s,l){const c=l||Number.POSITIVE_INFINITY;let u=0;return d;function d(v){return v===60?(e.enter(r),e.enter(a),e.enter(o),e.consume(v),e.exit(o),g):v===null||v===32||v===41||nm(v)?n(v):(e.enter(r),e.enter(i),e.enter(s),e.enter("chunkString",{contentType:"string"}),y(v))}function g(v){return v===62?(e.enter(o),e.consume(v),e.exit(o),e.exit(a),e.exit(r),t):(e.enter(s),e.enter("chunkString",{contentType:"string"}),m(v))}function m(v){return v===62?(e.exit("chunkString"),e.exit(s),g(v)):v===null||v===60||Oe(v)?n(v):(e.consume(v),v===92?b:m)}function b(v){return v===60||v===62||v===92?(e.consume(v),m):m(v)}function y(v){return!u&&(v===null||v===41||Et(v))?(e.exit("chunkString"),e.exit(s),e.exit(i),e.exit(r),t(v)):u999||m===null||m===91||m===93&&!l||m===94&&!s&&"_hiddenFootnoteSupport"in i.parser.constructs?n(m):m===93?(e.exit(o),e.enter(a),e.consume(m),e.exit(a),e.exit(r),t):Oe(m)?(e.enter("lineEnding"),e.consume(m),e.exit("lineEnding"),u):(e.enter("chunkString",{contentType:"string"}),d(m))}function d(m){return m===null||m===91||m===93||Oe(m)||s++>999?(e.exit("chunkString"),u(m)):(e.consume(m),l||(l=!tt(m)),m===92?g:d)}function g(m){return m===91||m===92||m===93?(e.consume(m),s++,d):d(m)}}function Nj(e,t,n,r,a,o){let i;return s;function s(g){return g===34||g===39||g===40?(e.enter(r),e.enter(a),e.consume(g),e.exit(a),i=g===40?41:g,l):n(g)}function l(g){return g===i?(e.enter(a),e.consume(g),e.exit(a),e.exit(r),t):(e.enter(o),c(g))}function c(g){return g===i?(e.exit(o),l(i)):g===null?n(g):Oe(g)?(e.enter("lineEnding"),e.consume(g),e.exit("lineEnding"),ct(e,c,"linePrefix")):(e.enter("chunkString",{contentType:"string"}),u(g))}function u(g){return g===i||g===null||Oe(g)?(e.exit("chunkString"),c(g)):(e.consume(g),g===92?d:u)}function d(g){return g===i||g===92?(e.consume(g),u):u(g)}}function Ku(e,t){let n;return r;function r(a){return Oe(a)?(e.enter("lineEnding"),e.consume(a),e.exit("lineEnding"),n=!0,r):tt(a)?ct(e,r,n?"linePrefix":"lineSuffix")(a):t(a)}}const Kue={name:"definition",tokenize:Zue},Yue={tokenize:Xue,partial:!0};function Zue(e,t,n){const r=this;let a;return o;function o(m){return e.enter("definition"),i(m)}function i(m){return Rj.call(r,e,s,n,"definitionLabel","definitionLabelMarker","definitionLabelString")(m)}function s(m){return a=ma(r.sliceSerialize(r.events[r.events.length-1][1]).slice(1,-1)),m===58?(e.enter("definitionMarker"),e.consume(m),e.exit("definitionMarker"),l):n(m)}function l(m){return Et(m)?Ku(e,c)(m):c(m)}function c(m){return Tj(e,u,n,"definitionDestination","definitionDestinationLiteral","definitionDestinationLiteralMarker","definitionDestinationRaw","definitionDestinationString")(m)}function u(m){return e.attempt(Yue,d,d)(m)}function d(m){return tt(m)?ct(e,g,"whitespace")(m):g(m)}function g(m){return m===null||Oe(m)?(e.exit("definition"),r.parser.defined.push(a),t(m)):n(m)}}function Xue(e,t,n){return r;function r(s){return Et(s)?Ku(e,a)(s):n(s)}function a(s){return Nj(e,o,n,"definitionTitle","definitionTitleMarker","definitionTitleString")(s)}function o(s){return tt(s)?ct(e,i,"whitespace")(s):i(s)}function i(s){return s===null||Oe(s)?t(s):n(s)}}const Que={name:"hardBreakEscape",tokenize:Jue};function Jue(e,t,n){return r;function r(o){return e.enter("hardBreakEscape"),e.consume(o),a}function a(o){return Oe(o)?(e.exit("hardBreakEscape"),t(o)):n(o)}}const ede={name:"headingAtx",tokenize:nde,resolve:tde};function tde(e,t){let n=e.length-2,r=3,a,o;return e[r][1].type==="whitespace"&&(r+=2),n-2>r&&e[n][1].type==="whitespace"&&(n-=2),e[n][1].type==="atxHeadingSequence"&&(r===n-1||n-4>r&&e[n-2][1].type==="whitespace")&&(n-=r+1===n?2:4),n>r&&(a={type:"atxHeadingText",start:e[r][1].start,end:e[n][1].end},o={type:"chunkText",start:e[r][1].start,end:e[n][1].end,contentType:"text"},Wr(e,r,n-r+1,[["enter",a,t],["enter",o,t],["exit",o,t],["exit",a,t]])),e}function nde(e,t,n){let r=0;return a;function a(u){return e.enter("atxHeading"),o(u)}function o(u){return e.enter("atxHeadingSequence"),i(u)}function i(u){return u===35&&r++<6?(e.consume(u),i):u===null||Et(u)?(e.exit("atxHeadingSequence"),s(u)):n(u)}function s(u){return u===35?(e.enter("atxHeadingSequence"),l(u)):u===null||Oe(u)?(e.exit("atxHeading"),t(u)):tt(u)?ct(e,s,"whitespace")(u):(e.enter("atxHeadingText"),c(u))}function l(u){return u===35?(e.consume(u),l):(e.exit("atxHeadingSequence"),s(u))}function c(u){return u===null||u===35||Et(u)?(e.exit("atxHeadingText"),s(u)):(e.consume(u),c)}}const rde=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","search","section","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"],BN=["pre","script","style","textarea"],ade={name:"htmlFlow",tokenize:lde,resolveTo:sde,concrete:!0},ode={tokenize:ude,partial:!0},ide={tokenize:cde,partial:!0};function sde(e){let t=e.length;for(;t--&&!(e[t][0]==="enter"&&e[t][1].type==="htmlFlow"););return t>1&&e[t-2][1].type==="linePrefix"&&(e[t][1].start=e[t-2][1].start,e[t+1][1].start=e[t-2][1].start,e.splice(t-2,2)),e}function lde(e,t,n){const r=this;let a,o,i,s,l;return c;function c(N){return u(N)}function u(N){return e.enter("htmlFlow"),e.enter("htmlFlowData"),e.consume(N),d}function d(N){return N===33?(e.consume(N),g):N===47?(e.consume(N),o=!0,y):N===63?(e.consume(N),a=3,r.interrupt?t:A):Zn(N)?(e.consume(N),i=String.fromCharCode(N),w):n(N)}function g(N){return N===45?(e.consume(N),a=2,m):N===91?(e.consume(N),a=5,s=0,b):Zn(N)?(e.consume(N),a=4,r.interrupt?t:A):n(N)}function m(N){return N===45?(e.consume(N),r.interrupt?t:A):n(N)}function b(N){const K="CDATA[";return N===K.charCodeAt(s++)?(e.consume(N),s===K.length?r.interrupt?t:D:b):n(N)}function y(N){return Zn(N)?(e.consume(N),i=String.fromCharCode(N),w):n(N)}function w(N){if(N===null||N===47||N===62||Et(N)){const K=N===47,ae=i.toLowerCase();return!K&&!o&&BN.includes(ae)?(a=1,r.interrupt?t(N):D(N)):rde.includes(i.toLowerCase())?(a=6,K?(e.consume(N),v):r.interrupt?t(N):D(N)):(a=7,r.interrupt&&!r.parser.lazy[r.now().line]?n(N):o?h(N):S(N))}return N===45||$n(N)?(e.consume(N),i+=String.fromCharCode(N),w):n(N)}function v(N){return N===62?(e.consume(N),r.interrupt?t:D):n(N)}function h(N){return tt(N)?(e.consume(N),h):T(N)}function S(N){return N===47?(e.consume(N),T):N===58||N===95||Zn(N)?(e.consume(N),E):tt(N)?(e.consume(N),S):T(N)}function E(N){return N===45||N===46||N===58||N===95||$n(N)?(e.consume(N),E):k(N)}function k(N){return N===61?(e.consume(N),x):tt(N)?(e.consume(N),k):S(N)}function x(N){return N===null||N===60||N===61||N===62||N===96?n(N):N===34||N===39?(e.consume(N),l=N,C):tt(N)?(e.consume(N),x):_(N)}function C(N){return N===l?(e.consume(N),l=null,R):N===null||Oe(N)?n(N):(e.consume(N),C)}function _(N){return N===null||N===34||N===39||N===47||N===60||N===61||N===62||N===96||Et(N)?k(N):(e.consume(N),_)}function R(N){return N===47||N===62||tt(N)?S(N):n(N)}function T(N){return N===62?(e.consume(N),L):n(N)}function L(N){return N===null||Oe(N)?D(N):tt(N)?(e.consume(N),L):n(N)}function D(N){return N===45&&a===2?(e.consume(N),U):N===60&&a===1?(e.consume(N),X):N===62&&a===4?(e.consume(N),V):N===63&&a===3?(e.consume(N),A):N===93&&a===5?(e.consume(N),O):Oe(N)&&(a===6||a===7)?(e.exit("htmlFlowData"),e.check(ode,P,H)(N)):N===null||Oe(N)?(e.exit("htmlFlowData"),H(N)):(e.consume(N),D)}function H(N){return e.check(ide,z,P)(N)}function z(N){return e.enter("lineEnding"),e.consume(N),e.exit("lineEnding"),M}function M(N){return N===null||Oe(N)?H(N):(e.enter("htmlFlowData"),D(N))}function U(N){return N===45?(e.consume(N),A):D(N)}function X(N){return N===47?(e.consume(N),i="",j):D(N)}function j(N){if(N===62){const K=i.toLowerCase();return BN.includes(K)?(e.consume(N),V):D(N)}return Zn(N)&&i.length<8?(e.consume(N),i+=String.fromCharCode(N),j):D(N)}function O(N){return N===93?(e.consume(N),A):D(N)}function A(N){return N===62?(e.consume(N),V):N===45&&a===2?(e.consume(N),A):D(N)}function V(N){return N===null||Oe(N)?(e.exit("htmlFlowData"),P(N)):(e.consume(N),V)}function P(N){return e.exit("htmlFlow"),t(N)}}function cde(e,t,n){const r=this;return a;function a(i){return Oe(i)?(e.enter("lineEnding"),e.consume(i),e.exit("lineEnding"),o):n(i)}function o(i){return r.parser.lazy[r.now().line]?n(i):t(i)}}function ude(e,t,n){return r;function r(a){return e.enter("lineEnding"),e.consume(a),e.exit("lineEnding"),e.attempt(Ef,t,n)}}const dde={name:"htmlText",tokenize:fde};function fde(e,t,n){const r=this;let a,o,i;return s;function s(A){return e.enter("htmlText"),e.enter("htmlTextData"),e.consume(A),l}function l(A){return A===33?(e.consume(A),c):A===47?(e.consume(A),k):A===63?(e.consume(A),S):Zn(A)?(e.consume(A),_):n(A)}function c(A){return A===45?(e.consume(A),u):A===91?(e.consume(A),o=0,b):Zn(A)?(e.consume(A),h):n(A)}function u(A){return A===45?(e.consume(A),m):n(A)}function d(A){return A===null?n(A):A===45?(e.consume(A),g):Oe(A)?(i=d,X(A)):(e.consume(A),d)}function g(A){return A===45?(e.consume(A),m):d(A)}function m(A){return A===62?U(A):A===45?g(A):d(A)}function b(A){const V="CDATA[";return A===V.charCodeAt(o++)?(e.consume(A),o===V.length?y:b):n(A)}function y(A){return A===null?n(A):A===93?(e.consume(A),w):Oe(A)?(i=y,X(A)):(e.consume(A),y)}function w(A){return A===93?(e.consume(A),v):y(A)}function v(A){return A===62?U(A):A===93?(e.consume(A),v):y(A)}function h(A){return A===null||A===62?U(A):Oe(A)?(i=h,X(A)):(e.consume(A),h)}function S(A){return A===null?n(A):A===63?(e.consume(A),E):Oe(A)?(i=S,X(A)):(e.consume(A),S)}function E(A){return A===62?U(A):S(A)}function k(A){return Zn(A)?(e.consume(A),x):n(A)}function x(A){return A===45||$n(A)?(e.consume(A),x):C(A)}function C(A){return Oe(A)?(i=C,X(A)):tt(A)?(e.consume(A),C):U(A)}function _(A){return A===45||$n(A)?(e.consume(A),_):A===47||A===62||Et(A)?R(A):n(A)}function R(A){return A===47?(e.consume(A),U):A===58||A===95||Zn(A)?(e.consume(A),T):Oe(A)?(i=R,X(A)):tt(A)?(e.consume(A),R):U(A)}function T(A){return A===45||A===46||A===58||A===95||$n(A)?(e.consume(A),T):L(A)}function L(A){return A===61?(e.consume(A),D):Oe(A)?(i=L,X(A)):tt(A)?(e.consume(A),L):R(A)}function D(A){return A===null||A===60||A===61||A===62||A===96?n(A):A===34||A===39?(e.consume(A),a=A,H):Oe(A)?(i=D,X(A)):tt(A)?(e.consume(A),D):(e.consume(A),z)}function H(A){return A===a?(e.consume(A),a=void 0,M):A===null?n(A):Oe(A)?(i=H,X(A)):(e.consume(A),H)}function z(A){return A===null||A===34||A===39||A===60||A===61||A===96?n(A):A===47||A===62||Et(A)?R(A):(e.consume(A),z)}function M(A){return A===47||A===62||Et(A)?R(A):n(A)}function U(A){return A===62?(e.consume(A),e.exit("htmlTextData"),e.exit("htmlText"),t):n(A)}function X(A){return e.exit("htmlTextData"),e.enter("lineEnding"),e.consume(A),e.exit("lineEnding"),j}function j(A){return tt(A)?ct(e,O,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(A):O(A)}function O(A){return e.enter("htmlTextData"),i(A)}}const fA={name:"labelEnd",tokenize:yde,resolveTo:bde,resolveAll:hde},pde={tokenize:vde},gde={tokenize:Sde},mde={tokenize:wde};function hde(e){let t=-1;for(;++t=3&&(c===null||Oe(c))?(e.exit("thematicBreak"),t(c)):n(c)}function l(c){return c===a?(e.consume(c),r++,l):(e.exit("thematicBreakSequence"),tt(c)?ct(e,s,"whitespace")(c):s(c))}}const nr={name:"list",tokenize:Nde,continuation:{tokenize:Ide},exit:Dde},Tde={tokenize:Lde,partial:!0},Rde={tokenize:Ode,partial:!0};function Nde(e,t,n){const r=this,a=r.events[r.events.length-1];let o=a&&a[1].type==="linePrefix"?a[2].sliceSerialize(a[1],!0).length:0,i=0;return s;function s(m){const b=r.containerState.type||(m===42||m===43||m===45?"listUnordered":"listOrdered");if(b==="listUnordered"?!r.containerState.marker||m===r.containerState.marker:Ok(m)){if(r.containerState.type||(r.containerState.type=b,e.enter(b,{_container:!0})),b==="listUnordered")return e.enter("listItemPrefix"),m===42||m===45?e.check(Yp,n,c)(m):c(m);if(!r.interrupt||m===49)return e.enter("listItemPrefix"),e.enter("listItemValue"),l(m)}return n(m)}function l(m){return Ok(m)&&++i<10?(e.consume(m),l):(!r.interrupt||i<2)&&(r.containerState.marker?m===r.containerState.marker:m===41||m===46)?(e.exit("listItemValue"),c(m)):n(m)}function c(m){return e.enter("listItemMarker"),e.consume(m),e.exit("listItemMarker"),r.containerState.marker=r.containerState.marker||m,e.check(Ef,r.interrupt?n:u,e.attempt(Tde,g,d))}function u(m){return r.containerState.initialBlankLine=!0,o++,g(m)}function d(m){return tt(m)?(e.enter("listItemPrefixWhitespace"),e.consume(m),e.exit("listItemPrefixWhitespace"),g):n(m)}function g(m){return r.containerState.size=o+r.sliceSerialize(e.exit("listItemPrefix"),!0).length,t(m)}}function Ide(e,t,n){const r=this;return r.containerState._closeFlow=void 0,e.check(Ef,a,o);function a(s){return r.containerState.furtherBlankLines=r.containerState.furtherBlankLines||r.containerState.initialBlankLine,ct(e,t,"listItemIndent",r.containerState.size+1)(s)}function o(s){return r.containerState.furtherBlankLines||!tt(s)?(r.containerState.furtherBlankLines=void 0,r.containerState.initialBlankLine=void 0,i(s)):(r.containerState.furtherBlankLines=void 0,r.containerState.initialBlankLine=void 0,e.attempt(Rde,t,i)(s))}function i(s){return r.containerState._closeFlow=!0,r.interrupt=void 0,ct(e,e.attempt(nr,t,n),"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(s)}}function Ode(e,t,n){const r=this;return ct(e,a,"listItemIndent",r.containerState.size+1);function a(o){const i=r.events[r.events.length-1];return i&&i[1].type==="listItemIndent"&&i[2].sliceSerialize(i[1],!0).length===r.containerState.size?t(o):n(o)}}function Dde(e){e.exit(this.containerState.type)}function Lde(e,t,n){const r=this;return ct(e,a,"listItemPrefixWhitespace",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4+1);function a(o){const i=r.events[r.events.length-1];return!tt(o)&&i&&i[1].type==="listItemPrefixWhitespace"?t(o):n(o)}}const HN={name:"setextUnderline",tokenize:Pde,resolveTo:Mde};function Mde(e,t){let n=e.length,r,a,o;for(;n--;)if(e[n][0]==="enter"){if(e[n][1].type==="content"){r=n;break}e[n][1].type==="paragraph"&&(a=n)}else e[n][1].type==="content"&&e.splice(n,1),!o&&e[n][1].type==="definition"&&(o=n);const i={type:"setextHeading",start:Object.assign({},e[a][1].start),end:Object.assign({},e[e.length-1][1].end)};return e[a][1].type="setextHeadingText",o?(e.splice(a,0,["enter",i,t]),e.splice(o+1,0,["exit",e[r][1],t]),e[r][1].end=Object.assign({},e[o][1].end)):e[r][1]=i,e.push(["exit",i,t]),e}function Pde(e,t,n){const r=this;let a;return o;function o(c){let u=r.events.length,d;for(;u--;)if(r.events[u][1].type!=="lineEnding"&&r.events[u][1].type!=="linePrefix"&&r.events[u][1].type!=="content"){d=r.events[u][1].type==="paragraph";break}return!r.parser.lazy[r.now().line]&&(r.interrupt||d)?(e.enter("setextHeadingLine"),a=c,i(c)):n(c)}function i(c){return e.enter("setextHeadingLineSequence"),s(c)}function s(c){return c===a?(e.consume(c),s):(e.exit("setextHeadingLineSequence"),tt(c)?ct(e,l,"lineSuffix")(c):l(c))}function l(c){return c===null||Oe(c)?(e.exit("setextHeadingLine"),t(c)):n(c)}}const $de={tokenize:qde,partial:!0};function Fde(){return{document:{[91]:{name:"gfmFootnoteDefinition",tokenize:Bde,continuation:{tokenize:Hde},exit:Vde}},text:{[91]:{name:"gfmFootnoteCall",tokenize:Ude},[93]:{name:"gfmPotentialFootnoteCall",add:"after",tokenize:jde,resolveTo:zde}}}}function jde(e,t,n){const r=this;let a=r.events.length;const o=r.parser.gfmFootnotes||(r.parser.gfmFootnotes=[]);let i;for(;a--;){const l=r.events[a][1];if(l.type==="labelImage"){i=l;break}if(l.type==="gfmFootnoteCall"||l.type==="labelLink"||l.type==="label"||l.type==="image"||l.type==="link")break}return s;function s(l){if(!i||!i._balanced)return n(l);const c=ma(r.sliceSerialize({start:i.end,end:r.now()}));return c.codePointAt(0)!==94||!o.includes(c.slice(1))?n(l):(e.enter("gfmFootnoteCallLabelMarker"),e.consume(l),e.exit("gfmFootnoteCallLabelMarker"),t(l))}}function zde(e,t){let n=e.length;for(;n--;)if(e[n][1].type==="labelImage"&&e[n][0]==="enter"){e[n][1];break}e[n+1][1].type="data",e[n+3][1].type="gfmFootnoteCallLabelMarker";const r={type:"gfmFootnoteCall",start:Object.assign({},e[n+3][1].start),end:Object.assign({},e[e.length-1][1].end)},a={type:"gfmFootnoteCallMarker",start:Object.assign({},e[n+3][1].end),end:Object.assign({},e[n+3][1].end)};a.end.column++,a.end.offset++,a.end._bufferIndex++;const o={type:"gfmFootnoteCallString",start:Object.assign({},a.end),end:Object.assign({},e[e.length-1][1].start)},i={type:"chunkString",contentType:"string",start:Object.assign({},o.start),end:Object.assign({},o.end)},s=[e[n+1],e[n+2],["enter",r,t],e[n+3],e[n+4],["enter",a,t],["exit",a,t],["enter",o,t],["enter",i,t],["exit",i,t],["exit",o,t],e[e.length-2],e[e.length-1],["exit",r,t]];return e.splice(n,e.length-n+1,...s),e}function Ude(e,t,n){const r=this,a=r.parser.gfmFootnotes||(r.parser.gfmFootnotes=[]);let o=0,i;return s;function s(d){return e.enter("gfmFootnoteCall"),e.enter("gfmFootnoteCallLabelMarker"),e.consume(d),e.exit("gfmFootnoteCallLabelMarker"),l}function l(d){return d!==94?n(d):(e.enter("gfmFootnoteCallMarker"),e.consume(d),e.exit("gfmFootnoteCallMarker"),e.enter("gfmFootnoteCallString"),e.enter("chunkString").contentType="string",c)}function c(d){if(o>999||d===93&&!i||d===null||d===91||Et(d))return n(d);if(d===93){e.exit("chunkString");const g=e.exit("gfmFootnoteCallString");return a.includes(ma(r.sliceSerialize(g)))?(e.enter("gfmFootnoteCallLabelMarker"),e.consume(d),e.exit("gfmFootnoteCallLabelMarker"),e.exit("gfmFootnoteCall"),t):n(d)}return Et(d)||(i=!0),o++,e.consume(d),d===92?u:c}function u(d){return d===91||d===92||d===93?(e.consume(d),o++,c):c(d)}}function Bde(e,t,n){const r=this,a=r.parser.gfmFootnotes||(r.parser.gfmFootnotes=[]);let o,i=0,s;return l;function l(b){return e.enter("gfmFootnoteDefinition")._container=!0,e.enter("gfmFootnoteDefinitionLabel"),e.enter("gfmFootnoteDefinitionLabelMarker"),e.consume(b),e.exit("gfmFootnoteDefinitionLabelMarker"),c}function c(b){return b===94?(e.enter("gfmFootnoteDefinitionMarker"),e.consume(b),e.exit("gfmFootnoteDefinitionMarker"),e.enter("gfmFootnoteDefinitionLabelString"),e.enter("chunkString").contentType="string",u):n(b)}function u(b){if(i>999||b===93&&!s||b===null||b===91||Et(b))return n(b);if(b===93){e.exit("chunkString");const y=e.exit("gfmFootnoteDefinitionLabelString");return o=ma(r.sliceSerialize(y)),e.enter("gfmFootnoteDefinitionLabelMarker"),e.consume(b),e.exit("gfmFootnoteDefinitionLabelMarker"),e.exit("gfmFootnoteDefinitionLabel"),g}return Et(b)||(s=!0),i++,e.consume(b),b===92?d:u}function d(b){return b===91||b===92||b===93?(e.consume(b),i++,u):u(b)}function g(b){return b===58?(e.enter("definitionMarker"),e.consume(b),e.exit("definitionMarker"),a.includes(o)||a.push(o),ct(e,m,"gfmFootnoteDefinitionWhitespace")):n(b)}function m(b){return t(b)}}function Hde(e,t,n){return e.check(Ef,t,e.attempt($de,t,n))}function Vde(e){e.exit("gfmFootnoteDefinition")}function qde(e,t,n){const r=this;return ct(e,a,"gfmFootnoteDefinitionIndent",4+1);function a(o){const i=r.events[r.events.length-1];return i&&i[1].type==="gfmFootnoteDefinitionIndent"&&i[2].sliceSerialize(i[1],!0).length===4?t(o):n(o)}}function Gde(e){let n=(e||{}).singleTilde;const r={name:"strikethrough",tokenize:o,resolveAll:a};return n==null&&(n=!0),{text:{[126]:r},insideSpan:{null:[r]},attentionMarkers:{null:[126]}};function a(i,s){let l=-1;for(;++l1?l(b):(i.consume(b),d++,m);if(d<2&&!n)return l(b);const w=i.exit("strikethroughSequenceTemporary"),v=rm(b);return w._open=!v||v===2&&!!y,w._close=!y||y===2&&!!v,s(b)}}}class Wde{constructor(){this.map=[]}add(t,n,r){Kde(this,t,n,r)}consume(t){if(this.map.sort(function(o,i){return o[0]-i[0]}),this.map.length===0)return;let n=this.map.length;const r=[];for(;n>0;)n-=1,r.push(t.slice(this.map[n][0]+this.map[n][1]),this.map[n][2]),t.length=this.map[n][0];r.push([...t]),t.length=0;let a=r.pop();for(;a;)t.push(...a),a=r.pop();this.map.length=0}}function Kde(e,t,n,r){let a=0;if(!(n===0&&r.length===0)){for(;a-1;){const z=r.events[L][1].type;if(z==="lineEnding"||z==="linePrefix")L--;else break}const D=L>-1?r.events[L][1].type:null,H=D==="tableHead"||D==="tableRow"?x:l;return H===x&&r.parser.lazy[r.now().line]?n(T):H(T)}function l(T){return e.enter("tableHead"),e.enter("tableRow"),c(T)}function c(T){return T===124||(i=!0,o+=1),u(T)}function u(T){return T===null?n(T):Oe(T)?o>1?(o=0,r.interrupt=!0,e.exit("tableRow"),e.enter("lineEnding"),e.consume(T),e.exit("lineEnding"),m):n(T):tt(T)?ct(e,u,"whitespace")(T):(o+=1,i&&(i=!1,a+=1),T===124?(e.enter("tableCellDivider"),e.consume(T),e.exit("tableCellDivider"),i=!0,u):(e.enter("data"),d(T)))}function d(T){return T===null||T===124||Et(T)?(e.exit("data"),u(T)):(e.consume(T),T===92?g:d)}function g(T){return T===92||T===124?(e.consume(T),d):d(T)}function m(T){return r.interrupt=!1,r.parser.lazy[r.now().line]?n(T):(e.enter("tableDelimiterRow"),i=!1,tt(T)?ct(e,b,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(T):b(T))}function b(T){return T===45||T===58?w(T):T===124?(i=!0,e.enter("tableCellDivider"),e.consume(T),e.exit("tableCellDivider"),y):k(T)}function y(T){return tt(T)?ct(e,w,"whitespace")(T):w(T)}function w(T){return T===58?(o+=1,i=!0,e.enter("tableDelimiterMarker"),e.consume(T),e.exit("tableDelimiterMarker"),v):T===45?(o+=1,v(T)):T===null||Oe(T)?E(T):k(T)}function v(T){return T===45?(e.enter("tableDelimiterFiller"),h(T)):k(T)}function h(T){return T===45?(e.consume(T),h):T===58?(i=!0,e.exit("tableDelimiterFiller"),e.enter("tableDelimiterMarker"),e.consume(T),e.exit("tableDelimiterMarker"),S):(e.exit("tableDelimiterFiller"),S(T))}function S(T){return tt(T)?ct(e,E,"whitespace")(T):E(T)}function E(T){return T===124?b(T):T===null||Oe(T)?!i||a!==o?k(T):(e.exit("tableDelimiterRow"),e.exit("tableHead"),t(T)):k(T)}function k(T){return n(T)}function x(T){return e.enter("tableRow"),C(T)}function C(T){return T===124?(e.enter("tableCellDivider"),e.consume(T),e.exit("tableCellDivider"),C):T===null||Oe(T)?(e.exit("tableRow"),t(T)):tt(T)?ct(e,C,"whitespace")(T):(e.enter("data"),_(T))}function _(T){return T===null||T===124||Et(T)?(e.exit("data"),C(T)):(e.consume(T),T===92?R:_)}function R(T){return T===92||T===124?(e.consume(T),_):_(T)}}function Qde(e,t){let n=-1,r=!0,a=0,o=[0,0,0,0],i=[0,0,0,0],s=!1,l=0,c,u,d;const g=new Wde;for(;++nn[2]+1){const b=n[2]+1,y=n[3]-n[2]-1;e.add(b,y,[])}}e.add(n[3]+1,0,[["exit",d,t]])}return a!==void 0&&(o.end=Object.assign({},pl(t.events,a)),e.add(a,0,[["exit",o,t]]),o=void 0),o}function VN(e,t,n,r,a){const o=[],i=pl(t.events,n);a&&(a.end=Object.assign({},i),o.push(["exit",a,t])),r.end=Object.assign({},i),o.push(["exit",r,t]),e.add(n+1,0,o)}function pl(e,t){const n=e[t],r=n[0]==="enter"?"start":"end";return n[1][r]}const Jde={name:"tasklistCheck",tokenize:tfe};function efe(){return{text:{[91]:Jde}}}function tfe(e,t,n){const r=this;return a;function a(l){return r.previous!==null||!r._gfmTasklistFirstContentOfListItem?n(l):(e.enter("taskListCheck"),e.enter("taskListCheckMarker"),e.consume(l),e.exit("taskListCheckMarker"),o)}function o(l){return Et(l)?(e.enter("taskListCheckValueUnchecked"),e.consume(l),e.exit("taskListCheckValueUnchecked"),i):l===88||l===120?(e.enter("taskListCheckValueChecked"),e.consume(l),e.exit("taskListCheckValueChecked"),i):n(l)}function i(l){return l===93?(e.enter("taskListCheckMarker"),e.consume(l),e.exit("taskListCheckMarker"),e.exit("taskListCheck"),s):n(l)}function s(l){return Oe(l)?t(l):tt(l)?e.check({tokenize:nfe},t,n)(l):n(l)}}function nfe(e,t,n){return ct(e,r,"whitespace");function r(a){return a===null?n(a):t(a)}}function rfe(e){return mj([pue(),Fde(),Gde(e),Zde(),efe()])}const afe={};function ofe(e){const t=this,n=e||afe,r=t.data(),a=r.micromarkExtensions||(r.micromarkExtensions=[]),o=r.fromMarkdownExtensions||(r.fromMarkdownExtensions=[]),i=r.toMarkdownExtensions||(r.toMarkdownExtensions=[]);a.push(rfe(n)),o.push(sue()),i.push(lue(n))}function ife(e,t){if(e==null)return{};var n={},r=Object.keys(e),a,o;for(o=0;o=0)&&(n[a]=e[a]);return n}function sfe(e,t){if(e==null)return{};var n=ife(e,t),r,a;if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}function lfe(e){if(Array.isArray(e))return sk(e)}function cfe(e){if(typeof Symbol<"u"&&e[Symbol.iterator]!=null||e["@@iterator"]!=null)return Array.from(e)}function ufe(){throw new TypeError(`Invalid attempt to spread non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function dfe(e){return lfe(e)||cfe(e)||hre(e)||ufe()}function qN(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),n.push.apply(n,r)}return n}function Il(e){for(var t=1;t=4)return[e[0],e[1],e[2],e[3],"".concat(e[0],".").concat(e[1]),"".concat(e[0],".").concat(e[2]),"".concat(e[0],".").concat(e[3]),"".concat(e[1],".").concat(e[0]),"".concat(e[1],".").concat(e[2]),"".concat(e[1],".").concat(e[3]),"".concat(e[2],".").concat(e[0]),"".concat(e[2],".").concat(e[1]),"".concat(e[2],".").concat(e[3]),"".concat(e[3],".").concat(e[0]),"".concat(e[3],".").concat(e[1]),"".concat(e[3],".").concat(e[2]),"".concat(e[0],".").concat(e[1],".").concat(e[2]),"".concat(e[0],".").concat(e[1],".").concat(e[3]),"".concat(e[0],".").concat(e[2],".").concat(e[1]),"".concat(e[0],".").concat(e[2],".").concat(e[3]),"".concat(e[0],".").concat(e[3],".").concat(e[1]),"".concat(e[0],".").concat(e[3],".").concat(e[2]),"".concat(e[1],".").concat(e[0],".").concat(e[2]),"".concat(e[1],".").concat(e[0],".").concat(e[3]),"".concat(e[1],".").concat(e[2],".").concat(e[0]),"".concat(e[1],".").concat(e[2],".").concat(e[3]),"".concat(e[1],".").concat(e[3],".").concat(e[0]),"".concat(e[1],".").concat(e[3],".").concat(e[2]),"".concat(e[2],".").concat(e[0],".").concat(e[1]),"".concat(e[2],".").concat(e[0],".").concat(e[3]),"".concat(e[2],".").concat(e[1],".").concat(e[0]),"".concat(e[2],".").concat(e[1],".").concat(e[3]),"".concat(e[2],".").concat(e[3],".").concat(e[0]),"".concat(e[2],".").concat(e[3],".").concat(e[1]),"".concat(e[3],".").concat(e[0],".").concat(e[1]),"".concat(e[3],".").concat(e[0],".").concat(e[2]),"".concat(e[3],".").concat(e[1],".").concat(e[0]),"".concat(e[3],".").concat(e[1],".").concat(e[2]),"".concat(e[3],".").concat(e[2],".").concat(e[0]),"".concat(e[3],".").concat(e[2],".").concat(e[1]),"".concat(e[0],".").concat(e[1],".").concat(e[2],".").concat(e[3]),"".concat(e[0],".").concat(e[1],".").concat(e[3],".").concat(e[2]),"".concat(e[0],".").concat(e[2],".").concat(e[1],".").concat(e[3]),"".concat(e[0],".").concat(e[2],".").concat(e[3],".").concat(e[1]),"".concat(e[0],".").concat(e[3],".").concat(e[1],".").concat(e[2]),"".concat(e[0],".").concat(e[3],".").concat(e[2],".").concat(e[1]),"".concat(e[1],".").concat(e[0],".").concat(e[2],".").concat(e[3]),"".concat(e[1],".").concat(e[0],".").concat(e[3],".").concat(e[2]),"".concat(e[1],".").concat(e[2],".").concat(e[0],".").concat(e[3]),"".concat(e[1],".").concat(e[2],".").concat(e[3],".").concat(e[0]),"".concat(e[1],".").concat(e[3],".").concat(e[0],".").concat(e[2]),"".concat(e[1],".").concat(e[3],".").concat(e[2],".").concat(e[0]),"".concat(e[2],".").concat(e[0],".").concat(e[1],".").concat(e[3]),"".concat(e[2],".").concat(e[0],".").concat(e[3],".").concat(e[1]),"".concat(e[2],".").concat(e[1],".").concat(e[0],".").concat(e[3]),"".concat(e[2],".").concat(e[1],".").concat(e[3],".").concat(e[0]),"".concat(e[2],".").concat(e[3],".").concat(e[0],".").concat(e[1]),"".concat(e[2],".").concat(e[3],".").concat(e[1],".").concat(e[0]),"".concat(e[3],".").concat(e[0],".").concat(e[1],".").concat(e[2]),"".concat(e[3],".").concat(e[0],".").concat(e[2],".").concat(e[1]),"".concat(e[3],".").concat(e[1],".").concat(e[0],".").concat(e[2]),"".concat(e[3],".").concat(e[1],".").concat(e[2],".").concat(e[0]),"".concat(e[3],".").concat(e[2],".").concat(e[0],".").concat(e[1]),"".concat(e[3],".").concat(e[2],".").concat(e[1],".").concat(e[0])]}var wy={};function pfe(e){if(e.length===0||e.length===1)return e;var t=e.join(".");return wy[t]||(wy[t]=ffe(e)),wy[t]}function gfe(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0,r=e.filter(function(o){return o!=="token"}),a=pfe(r);return a.reduce(function(o,i){return Il(Il({},o),n[i])},t)}function GN(e){return e.join(" ")}function mfe(e,t){var n=0;return function(r){return n+=1,r.map(function(a,o){return Ij({node:a,stylesheet:e,useInlineStyles:t,key:"code-segment-".concat(n,"-").concat(o)})})}}function Ij(e){var t=e.node,n=e.stylesheet,r=e.style,a=r===void 0?{}:r,o=e.useInlineStyles,i=e.key,s=t.properties,l=t.type,c=t.tagName,u=t.value;if(l==="text")return u;if(c){var d=mfe(n,o),g;if(!o)g=Il(Il({},s),{},{className:GN(s.className)});else{var m=Object.keys(n).reduce(function(v,h){return h.split(".").forEach(function(S){v.includes(S)||v.push(S)}),v},[]),b=s.className&&s.className.includes("token")?["token"]:[],y=s.className&&b.concat(s.className.filter(function(v){return!m.includes(v)}));g=Il(Il({},s),{},{className:GN(y)||void 0,style:gfe(s.className,Object.assign({},s.style,a),n)})}var w=d(t.children);return Ae.createElement(c,W({key:i},g),w)}}const hfe=function(e,t){var n=e.listLanguages();return n.indexOf(t)!==-1};var bfe=["language","children","style","customStyle","codeTagProps","useInlineStyles","showLineNumbers","showInlineLineNumbers","startingLineNumber","lineNumberContainerStyle","lineNumberStyle","wrapLines","wrapLongLines","lineProps","renderer","PreTag","CodeTag","code","astGenerator"];function WN(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),n.push.apply(n,r)}return n}function Ra(e){for(var t=1;t1&&arguments[1]!==void 0?arguments[1]:[],n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],r=0;r2&&arguments[2]!==void 0?arguments[2]:[];return Zp({children:k,lineNumber:x,lineNumberStyle:s,largestLineNumber:i,showInlineLineNumbers:a,lineProps:n,className:C,showLineNumbers:r,wrapLongLines:l})}function y(k,x){if(r&&x&&a){var C=Dj(s,x,i);k.unshift(Oj(x,C))}return k}function w(k,x){var C=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[];return t||C.length>0?b(k,x,C):y(k,x)}for(var v=function(){var x=u[m],C=x.children[0].value,_=vfe(C);if(_){var R=C.split(` -`);R.forEach(function(T,L){var D=r&&d.length+o,H={type:"text",value:"".concat(T,` -`)};if(L===0){var z=u.slice(g+1,m).concat(Zp({children:[H],className:x.properties.className})),M=w(z,D);d.push(M)}else if(L===R.length-1){var U=u[m+1]&&u[m+1].children&&u[m+1].children[0],X={type:"text",value:"".concat(T)};if(U){var j=Zp({children:[X],className:x.properties.className});u.splice(m+1,0,j)}else{var O=[X],A=w(O,D,x.properties.className);d.push(A)}}else{var V=[H],P=w(V,D,x.properties.className);d.push(P)}}),g=m}m++};m4&&n.slice(0,4)===bA&&bpe.test(t)&&(t.charAt(4)==="-"?r=Spe(t):t=wpe(t),a=gpe),new a(r,t))}function Spe(e){var t=e.slice(5).replace(Vj,xpe);return bA+t.charAt(0).toUpperCase()+t.slice(1)}function wpe(e){var t=e.slice(4);return Vj.test(t)?e:(t=t.replace(ype,Epe),t.charAt(0)!=="-"&&(t="-"+t),bA+t)}function Epe(e){return"-"+e.toLowerCase()}function xpe(e){return e.charAt(1).toUpperCase()}var kpe=Cpe,QN=/[#.]/g;function Cpe(e,t){for(var n=e||"",r=t||"div",a={},o=0,i,s,l;o=48&&t<=57}var Wme=Kme;function Kme(e){var t=typeof e=="string"?e.charCodeAt(0):e;return t>=97&&t<=102||t>=65&&t<=70||t>=48&&t<=57}var Yme=Zme;function Zme(e){var t=typeof e=="string"?e.charCodeAt(0):e;return t>=97&&t<=122||t>=65&&t<=90}var Xme=Yme,Qme=Wj,Jme=ehe;function ehe(e){return Xme(e)||Qme(e)}var gp,the=59,nhe=rhe;function rhe(e){var t="&"+e+";",n;return gp=gp||document.createElement("i"),gp.innerHTML=t,n=gp.textContent,n.charCodeAt(n.length-1)===the&&e!=="semi"||n===t?!1:n}var oI=Vme,iI=qme,ahe=Wj,ohe=Wme,Kj=Jme,ihe=nhe,she=She,lhe={}.hasOwnProperty,ol=String.fromCharCode,che=Function.prototype,sI={warning:null,reference:null,text:null,warningContext:null,referenceContext:null,textContext:null,position:{},additional:null,attribute:!1,nonTerminated:!0},uhe=9,lI=10,dhe=12,fhe=32,cI=38,phe=59,ghe=60,mhe=61,hhe=35,bhe=88,yhe=120,vhe=65533,gl="named",SA="hexadecimal",wA="decimal",EA={};EA[SA]=16;EA[wA]=10;var _h={};_h[gl]=Kj;_h[wA]=ahe;_h[SA]=ohe;var Yj=1,Zj=2,Xj=3,Qj=4,Jj=5,Pk=6,ez=7,Fi={};Fi[Yj]="Named character references must be terminated by a semicolon";Fi[Zj]="Numeric character references must be terminated by a semicolon";Fi[Xj]="Named character references cannot be empty";Fi[Qj]="Numeric character references cannot be empty";Fi[Jj]="Named character references must be known";Fi[Pk]="Numeric character references cannot be disallowed";Fi[ez]="Numeric character references cannot be outside the permissible Unicode range";function She(e,t){var n={},r,a;t||(t={});for(a in sI)r=t[a],n[a]=r??sI[a];return(n.position.indent||n.position.start)&&(n.indent=n.position.indent||[],n.position=n.position.start),whe(e,n)}function whe(e,t){var n=t.additional,r=t.nonTerminated,a=t.text,o=t.reference,i=t.warning,s=t.textContext,l=t.referenceContext,c=t.warningContext,u=t.position,d=t.indent||[],g=e.length,m=0,b=-1,y=u.column||1,w=u.line||1,v="",h=[],S,E,k,x,C,_,R,T,L,D,H,z,M,U,X,j,O,A,V;for(typeof n=="string"&&(n=n.charCodeAt(0)),j=P(),T=i?N:che,m--,g++;++m65535&&(_-=65536,D+=ol(_>>>10|55296),_=56320|_&1023),_=D+ol(_))):U!==gl&&T(Qj,A)),_?(K(),j=P(),m=V-1,y+=V-M+1,h.push(_),O=P(),O.offset++,o&&o.call(l,_,{start:j,end:O},e.slice(M-1,V)),j=O):(x=e.slice(M-1,V),v+=x,y+=x.length,m=V-1)}else C===10&&(w++,b++,y=0),C===C?(v+=ol(C),y++):K();return h.join("");function P(){return{line:w,column:y,offset:m+(u.offset||0)}}function N(ae,ne){var Q=P();Q.column+=ne,Q.offset+=ne,i.call(c,Fi[ae],Q,ae)}function K(){v&&(h.push(v),a&&a.call(s,v,{start:j,end:P()}),v="")}}function Ehe(e){return e>=55296&&e<=57343||e>1114111}function xhe(e){return e>=1&&e<=8||e===11||e>=13&&e<=31||e>=127&&e<=159||e>=64976&&e<=65007||(e&65535)===65535||(e&65535)===65534}var tz={exports:{}};(function(e){var t=typeof window<"u"?window:typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope?self:{};/** - * Prism: Lightweight, robust, elegant syntax highlighting - * - * @license MIT - * @author Lea Verou - * @namespace - * @public - */var n=function(r){var a=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,o=0,i={},s={manual:r.Prism&&r.Prism.manual,disableWorkerMessageHandler:r.Prism&&r.Prism.disableWorkerMessageHandler,util:{encode:function h(S){return S instanceof l?new l(S.type,h(S.content),S.alias):Array.isArray(S)?S.map(h):S.replace(/&/g,"&").replace(/"u")return null;if("currentScript"in document&&1<2)return document.currentScript;try{throw new Error}catch(k){var h=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(k.stack)||[])[1];if(h){var S=document.getElementsByTagName("script");for(var E in S)if(S[E].src==h)return S[E]}return null}},isActive:function(h,S,E){for(var k="no-"+S;h;){var x=h.classList;if(x.contains(S))return!0;if(x.contains(k))return!1;h=h.parentElement}return!!E}},languages:{plain:i,plaintext:i,text:i,txt:i,extend:function(h,S){var E=s.util.clone(s.languages[h]);for(var k in S)E[k]=S[k];return E},insertBefore:function(h,S,E,k){k=k||s.languages;var x=k[h],C={};for(var _ in x)if(x.hasOwnProperty(_)){if(_==S)for(var R in E)E.hasOwnProperty(R)&&(C[R]=E[R]);E.hasOwnProperty(_)||(C[_]=x[_])}var T=k[h];return k[h]=C,s.languages.DFS(s.languages,function(L,D){D===T&&L!=h&&(this[L]=C)}),C},DFS:function h(S,E,k,x){x=x||{};var C=s.util.objId;for(var _ in S)if(S.hasOwnProperty(_)){E.call(S,_,S[_],k||_);var R=S[_],T=s.util.type(R);T==="Object"&&!x[C(R)]?(x[C(R)]=!0,h(R,E,null,x)):T==="Array"&&!x[C(R)]&&(x[C(R)]=!0,h(R,E,_,x))}}},plugins:{},highlightAll:function(h,S){s.highlightAllUnder(document,h,S)},highlightAllUnder:function(h,S,E){var k={callback:E,container:h,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};s.hooks.run("before-highlightall",k),k.elements=Array.prototype.slice.apply(k.container.querySelectorAll(k.selector)),s.hooks.run("before-all-elements-highlight",k);for(var x=0,C;C=k.elements[x++];)s.highlightElement(C,S===!0,k.callback)},highlightElement:function(h,S,E){var k=s.util.getLanguage(h),x=s.languages[k];s.util.setLanguage(h,k);var C=h.parentElement;C&&C.nodeName.toLowerCase()==="pre"&&s.util.setLanguage(C,k);var _=h.textContent,R={element:h,language:k,grammar:x,code:_};function T(D){R.highlightedCode=D,s.hooks.run("before-insert",R),R.element.innerHTML=R.highlightedCode,s.hooks.run("after-highlight",R),s.hooks.run("complete",R),E&&E.call(R.element)}if(s.hooks.run("before-sanity-check",R),C=R.element.parentElement,C&&C.nodeName.toLowerCase()==="pre"&&!C.hasAttribute("tabindex")&&C.setAttribute("tabindex","0"),!R.code){s.hooks.run("complete",R),E&&E.call(R.element);return}if(s.hooks.run("before-highlight",R),!R.grammar){T(s.util.encode(R.code));return}if(S&&r.Worker){var L=new Worker(s.filename);L.onmessage=function(D){T(D.data)},L.postMessage(JSON.stringify({language:R.language,code:R.code,immediateClose:!0}))}else T(s.highlight(R.code,R.grammar,R.language))},highlight:function(h,S,E){var k={code:h,grammar:S,language:E};if(s.hooks.run("before-tokenize",k),!k.grammar)throw new Error('The language "'+k.language+'" has no grammar.');return k.tokens=s.tokenize(k.code,k.grammar),s.hooks.run("after-tokenize",k),l.stringify(s.util.encode(k.tokens),k.language)},tokenize:function(h,S){var E=S.rest;if(E){for(var k in E)S[k]=E[k];delete S.rest}var x=new d;return g(x,x.head,h),u(h,x,S,x.head,0),b(x)},hooks:{all:{},add:function(h,S){var E=s.hooks.all;E[h]=E[h]||[],E[h].push(S)},run:function(h,S){var E=s.hooks.all[h];if(!(!E||!E.length))for(var k=0,x;x=E[k++];)x(S)}},Token:l};r.Prism=s;function l(h,S,E,k){this.type=h,this.content=S,this.alias=E,this.length=(k||"").length|0}l.stringify=function h(S,E){if(typeof S=="string")return S;if(Array.isArray(S)){var k="";return S.forEach(function(T){k+=h(T,E)}),k}var x={type:S.type,content:h(S.content,E),tag:"span",classes:["token",S.type],attributes:{},language:E},C=S.alias;C&&(Array.isArray(C)?Array.prototype.push.apply(x.classes,C):x.classes.push(C)),s.hooks.run("wrap",x);var _="";for(var R in x.attributes)_+=" "+R+'="'+(x.attributes[R]||"").replace(/"/g,""")+'"';return"<"+x.tag+' class="'+x.classes.join(" ")+'"'+_+">"+x.content+""};function c(h,S,E,k){h.lastIndex=S;var x=h.exec(E);if(x&&k&&x[1]){var C=x[1].length;x.index+=C,x[0]=x[0].slice(C)}return x}function u(h,S,E,k,x,C){for(var _ in E)if(!(!E.hasOwnProperty(_)||!E[_])){var R=E[_];R=Array.isArray(R)?R:[R];for(var T=0;T=C.reach);O+=j.value.length,j=j.next){var A=j.value;if(S.length>h.length)return;if(!(A instanceof l)){var V=1,P;if(z){if(P=c(X,O,h,H),!P||P.index>=h.length)break;var ne=P.index,N=P.index+P[0].length,K=O;for(K+=j.value.length;ne>=K;)j=j.next,K+=j.value.length;if(K-=j.value.length,O=K,j.value instanceof l)continue;for(var ae=j;ae!==S.tail&&(KC.reach&&(C.reach=re);var Ee=j.prev;pe&&(Ee=g(S,Ee,pe),O+=pe.length),m(S,Ee,V);var ke=new l(_,D?s.tokenize(Q,D):Q,M,Q);if(j=g(S,Ee,ke),he&&g(S,j,he),V>1){var We={cause:_+","+T,reach:re};u(h,S,E,j.prev,O,We),C&&We.reach>C.reach&&(C.reach=We.reach)}}}}}}function d(){var h={value:null,prev:null,next:null},S={value:null,prev:h,next:null};h.next=S,this.head=h,this.tail=S,this.length=0}function g(h,S,E){var k=S.next,x={value:E,prev:S,next:k};return S.next=x,k.prev=x,h.length++,x}function m(h,S,E){for(var k=S.next,x=0;x/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},e.languages.markup.tag.inside["attr-value"].inside.entity=e.languages.markup.entity,e.languages.markup.doctype.inside["internal-subset"].inside=e.languages.markup,e.hooks.add("wrap",function(t){t.type==="entity"&&(t.attributes.title=t.content.value.replace(/&/,"&"))}),Object.defineProperty(e.languages.markup.tag,"addInlined",{value:function(n,r){var a={};a["language-"+r]={pattern:/(^$)/i,lookbehind:!0,inside:e.languages[r]},a.cdata=/^$/i;var o={"included-cdata":{pattern://i,inside:a}};o["language-"+r]={pattern:/[\s\S]+/,inside:e.languages[r]};var i={};i[n]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return n}),"i"),lookbehind:!0,greedy:!0,inside:o},e.languages.insertBefore("markup","cdata",i)}}),Object.defineProperty(e.languages.markup.tag,"addAttribute",{value:function(t,n){e.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+t+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[n,"language-"+n],inside:e.languages[n]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),e.languages.html=e.languages.markup,e.languages.mathml=e.languages.markup,e.languages.svg=e.languages.markup,e.languages.xml=e.languages.extend("markup",{}),e.languages.ssml=e.languages.xml,e.languages.atom=e.languages.xml,e.languages.rss=e.languages.xml}var _he=kA;kA.displayName="css";kA.aliases=[];function kA(e){(function(t){var n=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;t.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+n.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+n.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+n.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:n,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},t.languages.css.atrule.inside.rest=t.languages.css;var r=t.languages.markup;r&&(r.tag.addInlined("style","css"),r.tag.addAttribute("style","css"))})(e)}var Ahe=CA;CA.displayName="clike";CA.aliases=[];function CA(e){e.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}}var The=_A;_A.displayName="javascript";_A.aliases=["js"];function _A(e){e.languages.javascript=e.languages.extend("clike",{"class-name":[e.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+(/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source)+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),e.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,e.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:e.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:e.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:e.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:e.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:e.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),e.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:e.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),e.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),e.languages.markup&&(e.languages.markup.tag.addInlined("script","javascript"),e.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),e.languages.js=e.languages.javascript}var Tu=typeof globalThis=="object"?globalThis:typeof self=="object"?self:typeof window=="object"?window:typeof nn=="object"?nn:{},Rhe=qhe();Tu.Prism={manual:!0,disableWorkerMessageHandler:!0};var Nhe=qpe,Ihe=she,nz=khe,Ohe=Che,Dhe=_he,Lhe=Ahe,Mhe=The;Rhe();var AA={}.hasOwnProperty;function rz(){}rz.prototype=nz;var tn=new rz,Phe=tn;tn.highlight=Fhe;tn.register=kf;tn.alias=$he;tn.registered=jhe;tn.listLanguages=zhe;kf(Ohe);kf(Dhe);kf(Lhe);kf(Mhe);tn.util.encode=Hhe;tn.Token.stringify=Uhe;function kf(e){if(typeof e!="function"||!e.displayName)throw new Error("Expected `function` for `grammar`, got `"+e+"`");tn.languages[e.displayName]===void 0&&e(tn)}function $he(e,t){var n=tn.languages,r=e,a,o,i,s;t&&(r={},r[e]=t);for(a in r)for(o=r[a],o=typeof o=="string"?[o]:o,i=o.length,s=-1;++s code[class*="language-"]':{background:"#f5f2f0",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"slategray"},prolog:{color:"slategray"},doctype:{color:"slategray"},cdata:{color:"slategray"},punctuation:{color:"#999"},namespace:{Opacity:".7"},property:{color:"#905"},tag:{color:"#905"},boolean:{color:"#905"},number:{color:"#905"},constant:{color:"#905"},symbol:{color:"#905"},deleted:{color:"#905"},selector:{color:"#690"},"attr-name":{color:"#690"},string:{color:"#690"},char:{color:"#690"},builtin:{color:"#690"},inserted:{color:"#690"},operator:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},entity:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)",cursor:"help"},url:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},".language-css .token.string":{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},".style .token.string":{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},atrule:{color:"#07a"},"attr-value":{color:"#07a"},keyword:{color:"#07a"},function:{color:"#DD4A68"},"class-name":{color:"#DD4A68"},regex:{color:"#e90"},important:{color:"#e90",fontWeight:"bold"},variable:{color:"#e90"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};var Ey,uI;function Whe(){if(uI)return Ey;uI=1,Ey=e,e.displayName="abap",e.aliases=[];function e(t){t.languages.abap={comment:/^\*.*/m,string:/(`|')(?:\\.|(?!\1)[^\\\r\n])*\1/,"string-template":{pattern:/([|}])(?:\\.|[^\\|{\r\n])*(?=[|{])/,lookbehind:!0,alias:"string"},"eol-comment":{pattern:/(^|\s)".*/m,lookbehind:!0,alias:"comment"},keyword:{pattern:/(\s|\.|^)(?:SCIENTIFIC_WITH_LEADING_ZERO|SCALE_PRESERVING_SCIENTIFIC|RMC_COMMUNICATION_FAILURE|END-ENHANCEMENT-SECTION|MULTIPLY-CORRESPONDING|SUBTRACT-CORRESPONDING|VERIFICATION-MESSAGE|DIVIDE-CORRESPONDING|ENHANCEMENT-SECTION|CURRENCY_CONVERSION|RMC_SYSTEM_FAILURE|START-OF-SELECTION|MOVE-CORRESPONDING|RMC_INVALID_STATUS|CUSTOMER-FUNCTION|END-OF-DEFINITION|ENHANCEMENT-POINT|SYSTEM-EXCEPTIONS|ADD-CORRESPONDING|SCALE_PRESERVING|SELECTION-SCREEN|CURSOR-SELECTION|END-OF-SELECTION|LOAD-OF-PROGRAM|SCROLL-BOUNDARY|SELECTION-TABLE|EXCEPTION-TABLE|IMPLEMENTATIONS|PARAMETER-TABLE|RIGHT-JUSTIFIED|UNIT_CONVERSION|AUTHORITY-CHECK|LIST-PROCESSING|SIGN_AS_POSTFIX|COL_BACKGROUND|IMPLEMENTATION|INTERFACE-POOL|TRANSFORMATION|IDENTIFICATION|ENDENHANCEMENT|LINE-SELECTION|INITIALIZATION|LEFT-JUSTIFIED|SELECT-OPTIONS|SELECTION-SETS|COMMUNICATION|CORRESPONDING|DECIMAL_SHIFT|PRINT-CONTROL|VALUE-REQUEST|CHAIN-REQUEST|FUNCTION-POOL|FIELD-SYMBOLS|FUNCTIONALITY|INVERTED-DATE|SELECTION-SET|CLASS-METHODS|OUTPUT-LENGTH|CLASS-CODING|COL_NEGATIVE|ERRORMESSAGE|FIELD-GROUPS|HELP-REQUEST|NO-EXTENSION|NO-TOPOFPAGE|REDEFINITION|DISPLAY-MODE|ENDINTERFACE|EXIT-COMMAND|FIELD-SYMBOL|NO-SCROLLING|SHORTDUMP-ID|ACCESSPOLICY|CLASS-EVENTS|COL_POSITIVE|DECLARATIONS|ENHANCEMENTS|FILTER-TABLE|SWITCHSTATES|SYNTAX-CHECK|TRANSPORTING|ASYNCHRONOUS|SYNTAX-TRACE|TOKENIZATION|USER-COMMAND|WITH-HEADING|ABAP-SOURCE|BREAK-POINT|CHAIN-INPUT|COMPRESSION|FIXED-POINT|NEW-SECTION|NON-UNICODE|OCCURRENCES|RESPONSIBLE|SYSTEM-CALL|TRACE-TABLE|ABBREVIATED|CHAR-TO-HEX|END-OF-FILE|ENDFUNCTION|ENVIRONMENT|ASSOCIATION|COL_HEADING|EDITOR-CALL|END-OF-PAGE|ENGINEERING|IMPLEMENTED|INTENSIFIED|RADIOBUTTON|SYSTEM-EXIT|TOP-OF-PAGE|TRANSACTION|APPLICATION|CONCATENATE|DESTINATION|ENHANCEMENT|IMMEDIATELY|NO-GROUPING|PRECOMPILED|REPLACEMENT|TITLE-LINES|ACTIVATION|BYTE-ORDER|CLASS-POOL|CONNECTION|CONVERSION|DEFINITION|DEPARTMENT|EXPIRATION|INHERITING|MESSAGE-ID|NO-HEADING|PERFORMING|QUEUE-ONLY|RIGHTSPACE|SCIENTIFIC|STATUSINFO|STRUCTURES|SYNCPOINTS|WITH-TITLE|ATTRIBUTES|BOUNDARIES|CLASS-DATA|COL_NORMAL|DD\/MM\/YYYY|DESCENDING|INTERFACES|LINE-COUNT|MM\/DD\/YYYY|NON-UNIQUE|PRESERVING|SELECTIONS|STATEMENTS|SUBROUTINE|TRUNCATION|TYPE-POOLS|ARITHMETIC|BACKGROUND|ENDPROVIDE|EXCEPTIONS|IDENTIFIER|INDEX-LINE|OBLIGATORY|PARAMETERS|PERCENTAGE|PUSHBUTTON|RESOLUTION|COMPONENTS|DEALLOCATE|DISCONNECT|DUPLICATES|FIRST-LINE|HEAD-LINES|NO-DISPLAY|OCCURRENCE|RESPECTING|RETURNCODE|SUBMATCHES|TRACE-FILE|ASCENDING|BYPASSING|ENDMODULE|EXCEPTION|EXCLUDING|EXPORTING|INCREMENT|MATCHCODE|PARAMETER|PARTIALLY|PREFERRED|REFERENCE|REPLACING|RETURNING|SELECTION|SEPARATED|SPECIFIED|STATEMENT|TIMESTAMP|TYPE-POOL|ACCEPTING|APPENDAGE|ASSIGNING|COL_GROUP|COMPARING|CONSTANTS|DANGEROUS|IMPORTING|INSTANCES|LEFTSPACE|LOG-POINT|QUICKINFO|READ-ONLY|SCROLLING|SQLSCRIPT|STEP-LOOP|TOP-LINES|TRANSLATE|APPENDING|AUTHORITY|CHARACTER|COMPONENT|CONDITION|DIRECTORY|DUPLICATE|MESSAGING|RECEIVING|SUBSCREEN|ACCORDING|COL_TOTAL|END-LINES|ENDMETHOD|ENDSELECT|EXPANDING|EXTENSION|INCLUDING|INFOTYPES|INTERFACE|INTERVALS|LINE-SIZE|PF-STATUS|PROCEDURE|PROTECTED|REQUESTED|RESUMABLE|RIGHTPLUS|SAP-SPOOL|SECONDARY|STRUCTURE|SUBSTRING|TABLEVIEW|NUMOFCHAR|ADJACENT|ANALYSIS|ASSIGNED|BACKWARD|CHANNELS|CHECKBOX|CONTINUE|CRITICAL|DATAINFO|DD\/MM\/YY|DURATION|ENCODING|ENDCLASS|FUNCTION|LEFTPLUS|LINEFEED|MM\/DD\/YY|OVERFLOW|RECEIVED|SKIPPING|SORTABLE|STANDARD|SUBTRACT|SUPPRESS|TABSTRIP|TITLEBAR|TRUNCATE|UNASSIGN|WHENEVER|ANALYZER|COALESCE|COMMENTS|CONDENSE|DECIMALS|DEFERRED|ENDWHILE|EXPLICIT|KEYWORDS|MESSAGES|POSITION|PRIORITY|RECEIVER|RENAMING|TIMEZONE|TRAILING|ALLOCATE|CENTERED|CIRCULAR|CONTROLS|CURRENCY|DELETING|DESCRIBE|DISTANCE|ENDCATCH|EXPONENT|EXTENDED|GENERATE|IGNORING|INCLUDES|INTERNAL|MAJOR-ID|MODIFIER|NEW-LINE|OPTIONAL|PROPERTY|ROLLBACK|STARTING|SUPPLIED|ABSTRACT|CHANGING|CONTEXTS|CREATING|CUSTOMER|DATABASE|DAYLIGHT|DEFINING|DISTINCT|DIVISION|ENABLING|ENDCHAIN|ESCAPING|HARMLESS|IMPLICIT|INACTIVE|LANGUAGE|MINOR-ID|MULTIPLY|NEW-PAGE|NO-TITLE|POS_HIGH|SEPARATE|TEXTPOOL|TRANSFER|SELECTOR|DBMAXLEN|ITERATOR|ARCHIVE|BIT-XOR|BYTE-CO|COLLECT|COMMENT|CURRENT|DEFAULT|DISPLAY|ENDFORM|EXTRACT|LEADING|LISTBOX|LOCATOR|MEMBERS|METHODS|NESTING|POS_LOW|PROCESS|PROVIDE|RAISING|RESERVE|SECONDS|SUMMARY|VISIBLE|BETWEEN|BIT-AND|BYTE-CS|CLEANUP|COMPUTE|CONTROL|CONVERT|DATASET|ENDCASE|FORWARD|HEADERS|HOTSPOT|INCLUDE|INVERSE|KEEPING|NO-ZERO|OBJECTS|OVERLAY|PADDING|PATTERN|PROGRAM|REFRESH|SECTION|SUMMING|TESTING|VERSION|WINDOWS|WITHOUT|BIT-NOT|BYTE-CA|BYTE-NA|CASTING|CONTEXT|COUNTRY|DYNAMIC|ENABLED|ENDLOOP|EXECUTE|FRIENDS|HANDLER|HEADING|INITIAL|\*-INPUT|LOGFILE|MAXIMUM|MINIMUM|NO-GAPS|NO-SIGN|PRAGMAS|PRIMARY|PRIVATE|REDUCED|REPLACE|REQUEST|RESULTS|UNICODE|WARNING|ALIASES|BYTE-CN|BYTE-NS|CALLING|COL_KEY|COLUMNS|CONNECT|ENDEXEC|ENTRIES|EXCLUDE|FILTERS|FURTHER|HELP-ID|LOGICAL|MAPPING|MESSAGE|NAMETAB|OPTIONS|PACKAGE|PERFORM|RECEIVE|STATICS|VARYING|BINDING|CHARLEN|GREATER|XSTRLEN|ACCEPT|APPEND|DETAIL|ELSEIF|ENDING|ENDTRY|FORMAT|FRAMES|GIVING|HASHED|HEADER|IMPORT|INSERT|MARGIN|MODULE|NATIVE|OBJECT|OFFSET|REMOTE|RESUME|SAVING|SIMPLE|SUBMIT|TABBED|TOKENS|UNIQUE|UNPACK|UPDATE|WINDOW|YELLOW|ACTUAL|ASPECT|CENTER|CURSOR|DELETE|DIALOG|DIVIDE|DURING|ERRORS|EVENTS|EXTEND|FILTER|HANDLE|HAVING|IGNORE|LITTLE|MEMORY|NO-GAP|OCCURS|OPTION|PERSON|PLACES|PUBLIC|REDUCE|REPORT|RESULT|SINGLE|SORTED|SWITCH|SYNTAX|TARGET|VALUES|WRITER|ASSERT|BLOCKS|BOUNDS|BUFFER|CHANGE|COLUMN|COMMIT|CONCAT|COPIES|CREATE|DDMMYY|DEFINE|ENDIAN|ESCAPE|EXPAND|KERNEL|LAYOUT|LEGACY|LEVELS|MMDDYY|NUMBER|OUTPUT|RANGES|READER|RETURN|SCREEN|SEARCH|SELECT|SHARED|SOURCE|STABLE|STATIC|SUBKEY|SUFFIX|TABLES|UNWIND|YYMMDD|ASSIGN|BACKUP|BEFORE|BINARY|BIT-OR|BLANKS|CLIENT|CODING|COMMON|DEMAND|DYNPRO|EXCEPT|EXISTS|EXPORT|FIELDS|GLOBAL|GROUPS|LENGTH|LOCALE|MEDIUM|METHOD|MODIFY|NESTED|OTHERS|REJECT|SCROLL|SUPPLY|SYMBOL|ENDFOR|STRLEN|ALIGN|BEGIN|BOUND|ENDAT|ENTRY|EVENT|FINAL|FLUSH|GRANT|INNER|SHORT|USING|WRITE|AFTER|BLACK|BLOCK|CLOCK|COLOR|COUNT|DUMMY|EMPTY|ENDDO|ENDON|GREEN|INDEX|INOUT|LEAVE|LEVEL|LINES|MODIF|ORDER|OUTER|RANGE|RESET|RETRY|RIGHT|SMART|SPLIT|STYLE|TABLE|THROW|UNDER|UNTIL|UPPER|UTF-8|WHERE|ALIAS|BLANK|CLEAR|CLOSE|EXACT|FETCH|FIRST|FOUND|GROUP|LLANG|LOCAL|OTHER|REGEX|SPOOL|TITLE|TYPES|VALID|WHILE|ALPHA|BOXED|CATCH|CHAIN|CHECK|CLASS|COVER|ENDIF|EQUIV|FIELD|FLOOR|FRAME|INPUT|LOWER|MATCH|NODES|PAGES|PRINT|RAISE|ROUND|SHIFT|SPACE|SPOTS|STAMP|STATE|TASKS|TIMES|TRMAC|ULINE|UNION|VALUE|WIDTH|EQUAL|LOG10|TRUNC|BLOB|CASE|CEIL|CLOB|COND|EXIT|FILE|GAPS|HOLD|INCL|INTO|KEEP|KEYS|LAST|LINE|LONG|LPAD|MAIL|MODE|OPEN|PINK|READ|ROWS|TEST|THEN|ZERO|AREA|BACK|BADI|BYTE|CAST|EDIT|EXEC|FAIL|FIND|FKEQ|FONT|FREE|GKEQ|HIDE|INIT|ITNO|LATE|LOOP|MAIN|MARK|MOVE|NEXT|NULL|RISK|ROLE|UNIT|WAIT|ZONE|BASE|CALL|CODE|DATA|DATE|FKGE|GKGE|HIGH|KIND|LEFT|LIST|MASK|MESH|NAME|NODE|PACK|PAGE|POOL|SEND|SIGN|SIZE|SOME|STOP|TASK|TEXT|TIME|USER|VARY|WITH|WORD|BLUE|CONV|COPY|DEEP|ELSE|FORM|FROM|HINT|ICON|JOIN|LIKE|LOAD|ONLY|PART|SCAN|SKIP|SORT|TYPE|UNIX|VIEW|WHEN|WORK|ACOS|ASIN|ATAN|COSH|EACH|FRAC|LESS|RTTI|SINH|SQRT|TANH|AVG|BIT|DIV|ISO|LET|OUT|PAD|SQL|ALL|CI_|CPI|END|LOB|LPI|MAX|MIN|NEW|OLE|RUN|SET|\?TO|YES|ABS|ADD|AND|BIG|FOR|HDB|JOB|LOW|NOT|SAP|TRY|VIA|XML|ANY|GET|IDS|KEY|MOD|OFF|PUT|RAW|RED|REF|SUM|TAB|XSD|CNT|COS|EXP|LOG|SIN|TAN|XOR|AT|CO|CP|DO|GT|ID|IF|NS|OR|BT|CA|CS|GE|NA|NB|EQ|IN|LT|NE|NO|OF|ON|PF|TO|AS|BY|CN|IS|LE|NP|UP|E|I|M|O|Z|C|X)\b/i,lookbehind:!0},number:/\b\d+\b/,operator:{pattern:/(\s)(?:\*\*?|<[=>]?|>=?|\?=|[-+\/=])(?=\s)/,lookbehind:!0},"string-operator":{pattern:/(\s)&&?(?=\s)/,lookbehind:!0,alias:"keyword"},"token-operator":[{pattern:/(\w)(?:->?|=>|[~|{}])(?=\w)/,lookbehind:!0,alias:"punctuation"},{pattern:/[|{}]/,alias:"punctuation"}],punctuation:/[,.:()]/}}return Ey}var xy,dI;function Khe(){if(dI)return xy;dI=1,xy=e,e.displayName="abnf",e.aliases=[];function e(t){(function(n){var r="(?:ALPHA|BIT|CHAR|CR|CRLF|CTL|DIGIT|DQUOTE|HEXDIG|HTAB|LF|LWSP|OCTET|SP|VCHAR|WSP)";n.languages.abnf={comment:/;.*/,string:{pattern:/(?:%[is])?"[^"\n\r]*"/,greedy:!0,inside:{punctuation:/^%[is]/}},range:{pattern:/%(?:b[01]+-[01]+|d\d+-\d+|x[A-F\d]+-[A-F\d]+)/i,alias:"number"},terminal:{pattern:/%(?:b[01]+(?:\.[01]+)*|d\d+(?:\.\d+)*|x[A-F\d]+(?:\.[A-F\d]+)*)/i,alias:"number"},repetition:{pattern:/(^|[^\w-])(?:\d*\*\d*|\d+)/,lookbehind:!0,alias:"operator"},definition:{pattern:/(^[ \t]*)(?:[a-z][\w-]*|<[^<>\r\n]*>)(?=\s*=)/m,lookbehind:!0,alias:"keyword",inside:{punctuation:/<|>/}},"core-rule":{pattern:RegExp("(?:(^|[^<\\w-])"+r+"|<"+r+">)(?![\\w-])","i"),lookbehind:!0,alias:["rule","constant"],inside:{punctuation:/<|>/}},rule:{pattern:/(^|[^<\w-])[a-z][\w-]*|<[^<>\r\n]*>/i,lookbehind:!0,inside:{punctuation:/<|>/}},operator:/=\/?|\//,punctuation:/[()\[\]]/}})(t)}return xy}var ky,fI;function Yhe(){if(fI)return ky;fI=1,ky=e,e.displayName="actionscript",e.aliases=[];function e(t){t.languages.actionscript=t.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<>?>?|[!=]=?)=?|[~?@]/}),t.languages.actionscript["class-name"].alias="function",delete t.languages.actionscript.parameter,delete t.languages.actionscript["literal-property"],t.languages.markup&&t.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:t.languages.markup}})}return ky}var Cy,pI;function Zhe(){if(pI)return Cy;pI=1,Cy=e,e.displayName="ada",e.aliases=[];function e(t){t.languages.ada={comment:/--.*/,string:/"(?:""|[^"\r\f\n])*"/,number:[{pattern:/\b\d(?:_?\d)*#[\dA-F](?:_?[\dA-F])*(?:\.[\dA-F](?:_?[\dA-F])*)?#(?:E[+-]?\d(?:_?\d)*)?/i},{pattern:/\b\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:E[+-]?\d(?:_?\d)*)?\b/i}],"attr-name":/\b'\w+/,keyword:/\b(?:abort|abs|abstract|accept|access|aliased|all|and|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|elsif|end|entry|exception|exit|for|function|generic|goto|if|in|interface|is|limited|loop|mod|new|not|null|of|others|out|overriding|package|pragma|private|procedure|protected|raise|range|record|rem|renames|requeue|return|reverse|select|separate|some|subtype|synchronized|tagged|task|terminate|then|type|until|use|when|while|with|xor)\b/i,boolean:/\b(?:false|true)\b/i,operator:/<[=>]?|>=?|=>?|:=|\/=?|\*\*?|[&+-]/,punctuation:/\.\.?|[,;():]/,char:/'.'/,variable:/\b[a-z](?:\w)*\b/i}}return Cy}var _y,gI;function Xhe(){if(gI)return _y;gI=1,_y=e,e.displayName="agda",e.aliases=[];function e(t){(function(n){n.languages.agda={comment:/\{-[\s\S]*?(?:-\}|$)|--.*/,string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},punctuation:/[(){}⦃⦄.;@]/,"class-name":{pattern:/((?:data|record) +)\S+/,lookbehind:!0},function:{pattern:/(^[ \t]*)(?!\s)[^:\r\n]+(?=:)/m,lookbehind:!0},operator:{pattern:/(^\s*|\s)(?:[=|:∀→λ\\?_]|->)(?=\s)/,lookbehind:!0},keyword:/\b(?:Set|abstract|constructor|data|eta-equality|field|forall|hiding|import|in|inductive|infix|infixl|infixr|instance|let|macro|module|mutual|no-eta-equality|open|overlap|pattern|postulate|primitive|private|public|quote|quoteContext|quoteGoal|quoteTerm|record|renaming|rewrite|syntax|tactic|unquote|unquoteDecl|unquoteDef|using|variable|where|with)\b/}})(t)}return _y}var Ay,mI;function Qhe(){if(mI)return Ay;mI=1,Ay=e,e.displayName="al",e.aliases=[];function e(t){t.languages.al={comment:/\/\/.*|\/\*[\s\S]*?\*\//,string:{pattern:/'(?:''|[^'\r\n])*'(?!')|"(?:""|[^"\r\n])*"(?!")/,greedy:!0},function:{pattern:/(\b(?:event|procedure|trigger)\s+|(?:^|[^.])\.\s*)[a-z_]\w*(?=\s*\()/i,lookbehind:!0},keyword:[/\b(?:array|asserterror|begin|break|case|do|downto|else|end|event|exit|for|foreach|function|if|implements|in|indataset|interface|internal|local|of|procedure|program|protected|repeat|runonclient|securityfiltering|suppressdispose|temporary|then|to|trigger|until|var|while|with|withevents)\b/i,/\b(?:action|actions|addafter|addbefore|addfirst|addlast|area|assembly|chartpart|codeunit|column|controladdin|cuegroup|customizes|dataitem|dataset|dotnet|elements|enum|enumextension|extends|field|fieldattribute|fieldelement|fieldgroup|fieldgroups|fields|filter|fixed|grid|group|key|keys|label|labels|layout|modify|moveafter|movebefore|movefirst|movelast|page|pagecustomization|pageextension|part|profile|query|repeater|report|requestpage|schema|separator|systempart|table|tableelement|tableextension|textattribute|textelement|type|usercontrol|value|xmlport)\b/i],number:/\b(?:0x[\da-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)(?:F|LL?|U(?:LL?)?)?\b/i,boolean:/\b(?:false|true)\b/i,variable:/\b(?:Curr(?:FieldNo|Page|Report)|x?Rec|RequestOptionsPage)\b/,"class-name":/\b(?:automation|biginteger|bigtext|blob|boolean|byte|char|clienttype|code|completiontriggererrorlevel|connectiontype|database|dataclassification|datascope|date|dateformula|datetime|decimal|defaultlayout|dialog|dictionary|dotnetassembly|dotnettypedeclaration|duration|errorinfo|errortype|executioncontext|executionmode|fieldclass|fieldref|fieldtype|file|filterpagebuilder|guid|httpclient|httpcontent|httpheaders|httprequestmessage|httpresponsemessage|instream|integer|joker|jsonarray|jsonobject|jsontoken|jsonvalue|keyref|list|moduledependencyinfo|moduleinfo|none|notification|notificationscope|objecttype|option|outstream|pageresult|record|recordid|recordref|reportformat|securityfilter|sessionsettings|tableconnectiontype|tablefilter|testaction|testfield|testfilterfield|testpage|testpermissions|testrequestpage|text|textbuilder|textconst|textencoding|time|transactionmodel|transactiontype|variant|verbosity|version|view|views|webserviceactioncontext|webserviceactionresultcode|xmlattribute|xmlattributecollection|xmlcdata|xmlcomment|xmldeclaration|xmldocument|xmldocumenttype|xmlelement|xmlnamespacemanager|xmlnametable|xmlnode|xmlnodelist|xmlprocessinginstruction|xmlreadoptions|xmltext|xmlwriteoptions)\b/i,operator:/\.\.|:[=:]|[-+*/]=?|<>|[<>]=?|=|\b(?:and|div|mod|not|or|xor)\b/i,punctuation:/[()\[\]{}:.;,]/}}return Ay}var Ty,hI;function Jhe(){if(hI)return Ty;hI=1,Ty=e,e.displayName="antlr4",e.aliases=["g4"];function e(t){t.languages.antlr4={comment:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,string:{pattern:/'(?:\\.|[^\\'\r\n])*'/,greedy:!0},"character-class":{pattern:/\[(?:\\.|[^\\\]\r\n])*\]/,greedy:!0,alias:"regex",inside:{range:{pattern:/([^[]|(?:^|[^\\])(?:\\\\)*\\\[)-(?!\])/,lookbehind:!0,alias:"punctuation"},escape:/\\(?:u(?:[a-fA-F\d]{4}|\{[a-fA-F\d]+\})|[pP]\{[=\w-]+\}|[^\r\nupP])/,punctuation:/[\[\]]/}},action:{pattern:/\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\}/,greedy:!0,inside:{content:{pattern:/(\{)[\s\S]+(?=\})/,lookbehind:!0},punctuation:/[{}]/}},command:{pattern:/(->\s*(?!\s))(?:\s*(?:,\s*)?\b[a-z]\w*(?:\s*\([^()\r\n]*\))?)+(?=\s*;)/i,lookbehind:!0,inside:{function:/\b\w+(?=\s*(?:[,(]|$))/,punctuation:/[,()]/}},annotation:{pattern:/@\w+(?:::\w+)*/,alias:"keyword"},label:{pattern:/#[ \t]*\w+/,alias:"punctuation"},keyword:/\b(?:catch|channels|finally|fragment|grammar|import|lexer|locals|mode|options|parser|returns|throws|tokens)\b/,definition:[{pattern:/\b[a-z]\w*(?=\s*:)/,alias:["rule","class-name"]},{pattern:/\b[A-Z]\w*(?=\s*:)/,alias:["token","constant"]}],constant:/\b[A-Z][A-Z_]*\b/,operator:/\.\.|->|[|~]|[*+?]\??/,punctuation:/[;:()=]/},t.languages.g4=t.languages.antlr4}return Ty}var Ry,bI;function ebe(){if(bI)return Ry;bI=1,Ry=e,e.displayName="apacheconf",e.aliases=[];function e(t){t.languages.apacheconf={comment:/#.*/,"directive-inline":{pattern:/(^[\t ]*)\b(?:AcceptFilter|AcceptPathInfo|AccessFileName|Action|Add(?:Alt|AltByEncoding|AltByType|Charset|DefaultCharset|Description|Encoding|Handler|Icon|IconByEncoding|IconByType|InputFilter|Language|ModuleInfo|OutputFilter|OutputFilterByType|Type)|Alias|AliasMatch|Allow(?:CONNECT|EncodedSlashes|Methods|Override|OverrideList)?|Anonymous(?:_LogEmail|_MustGiveEmail|_NoUserID|_VerifyEmail)?|AsyncRequestWorkerFactor|Auth(?:BasicAuthoritative|BasicFake|BasicProvider|BasicUseDigestAlgorithm|DBDUserPWQuery|DBDUserRealmQuery|DBMGroupFile|DBMType|DBMUserFile|Digest(?:Algorithm|Domain|NonceLifetime|Provider|Qop|ShmemSize)|Form(?:Authoritative|Body|DisableNoStore|FakeBasicAuth|Location|LoginRequiredLocation|LoginSuccessLocation|LogoutLocation|Method|Mimetype|Password|Provider|SitePassphrase|Size|Username)|GroupFile|LDAP(?:AuthorizePrefix|BindAuthoritative|BindDN|BindPassword|CharsetConfig|CompareAsUser|CompareDNOnServer|DereferenceAliases|GroupAttribute|GroupAttributeIsDN|InitialBindAsUser|InitialBindPattern|MaxSubGroupDepth|RemoteUserAttribute|RemoteUserIsDN|SearchAsUser|SubGroupAttribute|SubGroupClass|Url)|Merging|Name|nCache(?:Context|Enable|ProvideFor|SOCache|Timeout)|nzFcgiCheckAuthnProvider|nzFcgiDefineProvider|Type|UserFile|zDBDLoginToReferer|zDBDQuery|zDBDRedirectQuery|zDBMType|zSendForbiddenOnFailure)|BalancerGrowth|BalancerInherit|BalancerMember|BalancerPersist|BrowserMatch|BrowserMatchNoCase|BufferedLogs|BufferSize|Cache(?:DefaultExpire|DetailHeader|DirLength|DirLevels|Disable|Enable|File|Header|IgnoreCacheControl|IgnoreHeaders|IgnoreNoLastMod|IgnoreQueryString|IgnoreURLSessionIdentifiers|KeyBaseURL|LastModifiedFactor|Lock|LockMaxAge|LockPath|MaxExpire|MaxFileSize|MinExpire|MinFileSize|NegotiatedDocs|QuickHandler|ReadSize|ReadTime|Root|Socache(?:MaxSize|MaxTime|MinTime|ReadSize|ReadTime)?|StaleOnError|StoreExpired|StoreNoStore|StorePrivate)|CGIDScriptTimeout|CGIMapExtension|CharsetDefault|CharsetOptions|CharsetSourceEnc|CheckCaseOnly|CheckSpelling|ChrootDir|ContentDigest|CookieDomain|CookieExpires|CookieName|CookieStyle|CookieTracking|CoreDumpDirectory|CustomLog|Dav|DavDepthInfinity|DavGenericLockDB|DavLockDB|DavMinTimeout|DBDExptime|DBDInitSQL|DBDKeep|DBDMax|DBDMin|DBDParams|DBDPersist|DBDPrepareSQL|DBDriver|DefaultIcon|DefaultLanguage|DefaultRuntimeDir|DefaultType|Define|Deflate(?:BufferSize|CompressionLevel|FilterNote|InflateLimitRequestBody|InflateRatio(?:Burst|Limit)|MemLevel|WindowSize)|Deny|DirectoryCheckHandler|DirectoryIndex|DirectoryIndexRedirect|DirectorySlash|DocumentRoot|DTracePrivileges|DumpIOInput|DumpIOOutput|EnableExceptionHook|EnableMMAP|EnableSendfile|Error|ErrorDocument|ErrorLog|ErrorLogFormat|Example|ExpiresActive|ExpiresByType|ExpiresDefault|ExtendedStatus|ExtFilterDefine|ExtFilterOptions|FallbackResource|FileETag|FilterChain|FilterDeclare|FilterProtocol|FilterProvider|FilterTrace|ForceLanguagePriority|ForceType|ForensicLog|GprofDir|GracefulShutdownTimeout|Group|Header|HeaderName|Heartbeat(?:Address|Listen|MaxServers|Storage)|HostnameLookups|IdentityCheck|IdentityCheckTimeout|ImapBase|ImapDefault|ImapMenu|Include|IncludeOptional|Index(?:HeadInsert|Ignore|IgnoreReset|Options|OrderDefault|StyleSheet)|InputSed|ISAPI(?:AppendLogToErrors|AppendLogToQuery|CacheFile|FakeAsync|LogNotSupported|ReadAheadBuffer)|KeepAlive|KeepAliveTimeout|KeptBodySize|LanguagePriority|LDAP(?:CacheEntries|CacheTTL|ConnectionPoolTTL|ConnectionTimeout|LibraryDebug|OpCacheEntries|OpCacheTTL|ReferralHopLimit|Referrals|Retries|RetryDelay|SharedCacheFile|SharedCacheSize|Timeout|TrustedClientCert|TrustedGlobalCert|TrustedMode|VerifyServerCert)|Limit(?:InternalRecursion|Request(?:Body|Fields|FieldSize|Line)|XMLRequestBody)|Listen|ListenBackLog|LoadFile|LoadModule|LogFormat|LogLevel|LogMessage|LuaAuthzProvider|LuaCodeCache|Lua(?:Hook(?:AccessChecker|AuthChecker|CheckUserID|Fixups|InsertFilter|Log|MapToStorage|TranslateName|TypeChecker)|Inherit|InputFilter|MapHandler|OutputFilter|PackageCPath|PackagePath|QuickHandler|Root|Scope)|Max(?:ConnectionsPerChild|KeepAliveRequests|MemFree|RangeOverlaps|RangeReversals|Ranges|RequestWorkers|SpareServers|SpareThreads|Threads)|MergeTrailers|MetaDir|MetaFiles|MetaSuffix|MimeMagicFile|MinSpareServers|MinSpareThreads|MMapFile|ModemStandard|ModMimeUsePathInfo|MultiviewsMatch|Mutex|NameVirtualHost|NoProxy|NWSSLTrustedCerts|NWSSLUpgradeable|Options|Order|OutputSed|PassEnv|PidFile|PrivilegesMode|Protocol|ProtocolEcho|Proxy(?:AddHeaders|BadHeader|Block|Domain|ErrorOverride|ExpressDBMFile|ExpressDBMType|ExpressEnable|FtpDirCharset|FtpEscapeWildcards|FtpListOnWildcard|HTML(?:BufSize|CharsetOut|DocType|Enable|Events|Extended|Fixups|Interp|Links|Meta|StripComments|URLMap)|IOBufferSize|MaxForwards|Pass(?:Inherit|InterpolateEnv|Match|Reverse|ReverseCookieDomain|ReverseCookiePath)?|PreserveHost|ReceiveBufferSize|Remote|RemoteMatch|Requests|SCGIInternalRedirect|SCGISendfile|Set|SourceAddress|Status|Timeout|Via)|ReadmeName|ReceiveBufferSize|Redirect|RedirectMatch|RedirectPermanent|RedirectTemp|ReflectorHeader|RemoteIP(?:Header|InternalProxy|InternalProxyList|ProxiesHeader|TrustedProxy|TrustedProxyList)|RemoveCharset|RemoveEncoding|RemoveHandler|RemoveInputFilter|RemoveLanguage|RemoveOutputFilter|RemoveType|RequestHeader|RequestReadTimeout|Require|Rewrite(?:Base|Cond|Engine|Map|Options|Rule)|RLimitCPU|RLimitMEM|RLimitNPROC|Satisfy|ScoreBoardFile|Script(?:Alias|AliasMatch|InterpreterSource|Log|LogBuffer|LogLength|Sock)?|SecureListen|SeeRequestTail|SendBufferSize|Server(?:Admin|Alias|Limit|Name|Path|Root|Signature|Tokens)|Session(?:Cookie(?:Name|Name2|Remove)|Crypto(?:Cipher|Driver|Passphrase|PassphraseFile)|DBD(?:CookieName|CookieName2|CookieRemove|DeleteLabel|InsertLabel|PerUser|SelectLabel|UpdateLabel)|Env|Exclude|Header|Include|MaxAge)?|SetEnv|SetEnvIf|SetEnvIfExpr|SetEnvIfNoCase|SetHandler|SetInputFilter|SetOutputFilter|SSIEndTag|SSIErrorMsg|SSIETag|SSILastModified|SSILegacyExprParser|SSIStartTag|SSITimeFormat|SSIUndefinedEcho|SSL(?:CACertificateFile|CACertificatePath|CADNRequestFile|CADNRequestPath|CARevocationCheck|CARevocationFile|CARevocationPath|CertificateChainFile|CertificateFile|CertificateKeyFile|CipherSuite|Compression|CryptoDevice|Engine|FIPS|HonorCipherOrder|InsecureRenegotiation|OCSP(?:DefaultResponder|Enable|OverrideResponder|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|UseRequestNonce)|OpenSSLConfCmd|Options|PassPhraseDialog|Protocol|Proxy(?:CACertificateFile|CACertificatePath|CARevocation(?:Check|File|Path)|CheckPeer(?:CN|Expire|Name)|CipherSuite|Engine|MachineCertificate(?:ChainFile|File|Path)|Protocol|Verify|VerifyDepth)|RandomSeed|RenegBufferSize|Require|RequireSSL|Session(?:Cache|CacheTimeout|TicketKeyFile|Tickets)|SRPUnknownUserSeed|SRPVerifierFile|Stapling(?:Cache|ErrorCacheTimeout|FakeTryLater|ForceURL|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|ReturnResponderErrors|StandardCacheTimeout)|StrictSNIVHostCheck|UserName|UseStapling|VerifyClient|VerifyDepth)|StartServers|StartThreads|Substitute|Suexec|SuexecUserGroup|ThreadLimit|ThreadsPerChild|ThreadStackSize|TimeOut|TraceEnable|TransferLog|TypesConfig|UnDefine|UndefMacro|UnsetEnv|Use|UseCanonicalName|UseCanonicalPhysicalPort|User|UserDir|VHostCGIMode|VHostCGIPrivs|VHostGroup|VHostPrivs|VHostSecure|VHostUser|Virtual(?:DocumentRoot|ScriptAlias)(?:IP)?|WatchdogInterval|XBitHack|xml2EncAlias|xml2EncDefault|xml2StartParse)\b/im,lookbehind:!0,alias:"property"},"directive-block":{pattern:/<\/?\b(?:Auth[nz]ProviderAlias|Directory|DirectoryMatch|Else|ElseIf|Files|FilesMatch|If|IfDefine|IfModule|IfVersion|Limit|LimitExcept|Location|LocationMatch|Macro|Proxy|Require(?:All|Any|None)|VirtualHost)\b.*>/i,inside:{"directive-block":{pattern:/^<\/?\w+/,inside:{punctuation:/^<\/?/},alias:"tag"},"directive-block-parameter":{pattern:/.*[^>]/,inside:{punctuation:/:/,string:{pattern:/("|').*\1/,inside:{variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/}}},alias:"attr-value"},punctuation:/>/},alias:"tag"},"directive-flags":{pattern:/\[(?:[\w=],?)+\]/,alias:"keyword"},string:{pattern:/("|').*\1/,inside:{variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/}},variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/,regex:/\^?.*\$|\^.*\$?/}}return Ry}var Ny,yI;function TA(){if(yI)return Ny;yI=1,Ny=e,e.displayName="sql",e.aliases=[];function e(t){t.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/}}return Ny}var Iy,vI;function tbe(){if(vI)return Iy;vI=1;var e=TA();Iy=t,t.displayName="apex",t.aliases=[];function t(n){n.register(e),function(r){var a=/\b(?:(?:after|before)(?=\s+[a-z])|abstract|activate|and|any|array|as|asc|autonomous|begin|bigdecimal|blob|boolean|break|bulk|by|byte|case|cast|catch|char|class|collect|commit|const|continue|currency|date|datetime|decimal|default|delete|desc|do|double|else|end|enum|exception|exit|export|extends|final|finally|float|for|from|get(?=\s*[{};])|global|goto|group|having|hint|if|implements|import|in|inner|insert|instanceof|int|integer|interface|into|join|like|limit|list|long|loop|map|merge|new|not|null|nulls|number|object|of|on|or|outer|override|package|parallel|pragma|private|protected|public|retrieve|return|rollback|select|set|short|sObject|sort|static|string|super|switch|synchronized|system|testmethod|then|this|throw|time|transaction|transient|trigger|try|undelete|update|upsert|using|virtual|void|webservice|when|where|while|(?:inherited|with|without)\s+sharing)\b/i,o=/\b(?:(?=[a-z_]\w*\s*[<\[])|(?!))[A-Z_]\w*(?:\s*\.\s*[A-Z_]\w*)*\b(?:\s*(?:\[\s*\]|<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>))*/.source.replace(//g,function(){return a.source});function i(l){return RegExp(l.replace(//g,function(){return o}),"i")}var s={keyword:a,punctuation:/[()\[\]{};,:.<>]/};r.languages.apex={comment:r.languages.clike.comment,string:r.languages.clike.string,sql:{pattern:/((?:[=,({:]|\breturn)\s*)\[[^\[\]]*\]/i,lookbehind:!0,greedy:!0,alias:"language-sql",inside:r.languages.sql},annotation:{pattern:/@\w+\b/,alias:"punctuation"},"class-name":[{pattern:i(/(\b(?:class|enum|extends|implements|instanceof|interface|new|trigger\s+\w+\s+on)\s+)/.source),lookbehind:!0,inside:s},{pattern:i(/(\(\s*)(?=\s*\)\s*[\w(])/.source),lookbehind:!0,inside:s},{pattern:i(/(?=\s*\w+\s*[;=,(){:])/.source),inside:s}],trigger:{pattern:/(\btrigger\s+)\w+\b/i,lookbehind:!0,alias:"class-name"},keyword:a,function:/\b[a-z_]\w*(?=\s*\()/i,boolean:/\b(?:false|true)\b/i,number:/(?:\B\.\d+|\b\d+(?:\.\d+|L)?)\b/i,operator:/[!=](?:==?)?|\?\.?|&&|\|\||--|\+\+|[-+*/^&|]=?|:|<{1,3}=?/,punctuation:/[()\[\]{};,.]/}}(n)}return Iy}var Oy,SI;function nbe(){if(SI)return Oy;SI=1,Oy=e,e.displayName="apl",e.aliases=[];function e(t){t.languages.apl={comment:/(?:⍝|#[! ]).*$/m,string:{pattern:/'(?:[^'\r\n]|'')*'/,greedy:!0},number:/¯?(?:\d*\.?\b\d+(?:e[+¯]?\d+)?|¯|∞)(?:j¯?(?:(?:\d+(?:\.\d+)?|\.\d+)(?:e[+¯]?\d+)?|¯|∞))?/i,statement:/:[A-Z][a-z][A-Za-z]*\b/,"system-function":{pattern:/⎕[A-Z]+/i,alias:"function"},constant:/[⍬⌾#⎕⍞]/,function:/[-+×÷⌈⌊∣|⍳⍸?*⍟○!⌹<≤=>≥≠≡≢∊⍷∪∩~∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⊆⊇⌷⍋⍒⊤⊥⍕⍎⊣⊢⍁⍂≈⍯↗¤→]/,"monadic-operator":{pattern:/[\\\/⌿⍀¨⍨⌶&∥]/,alias:"operator"},"dyadic-operator":{pattern:/[.⍣⍠⍤∘⌸@⌺⍥]/,alias:"operator"},assignment:{pattern:/←/,alias:"keyword"},punctuation:/[\[;\]()◇⋄]/,dfn:{pattern:/[{}⍺⍵⍶⍹∇⍫:]/,alias:"builtin"}}}return Oy}var Dy,wI;function rbe(){if(wI)return Dy;wI=1,Dy=e,e.displayName="applescript",e.aliases=[];function e(t){t.languages.applescript={comment:[/\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,/--.+/,/#.+/],string:/"(?:\\.|[^"\\\r\n])*"/,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e-?\d+)?\b/i,operator:[/[&=≠≤≥*+\-\/÷^]|[<>]=?/,/\b(?:(?:begin|end|start)s? with|(?:contains?|(?:does not|doesn't) contain)|(?:is|isn't|is not) (?:contained by|in)|(?:(?:is|isn't|is not) )?(?:greater|less) than(?: or equal)?(?: to)?|(?:comes|(?:does not|doesn't) come) (?:after|before)|(?:is|isn't|is not) equal(?: to)?|(?:(?:does not|doesn't) equal|equal to|equals|is not|isn't)|(?:a )?(?:ref(?: to)?|reference to)|(?:and|as|div|mod|not|or))\b/],keyword:/\b(?:about|above|after|against|apart from|around|aside from|at|back|before|beginning|behind|below|beneath|beside|between|but|by|considering|continue|copy|does|eighth|else|end|equal|error|every|exit|false|fifth|first|for|fourth|from|front|get|given|global|if|ignoring|in|instead of|into|is|it|its|last|local|me|middle|my|ninth|of|on|onto|out of|over|prop|property|put|repeat|return|returning|second|set|seventh|since|sixth|some|tell|tenth|that|the|then|third|through|thru|timeout|times|to|transaction|true|try|until|where|while|whose|with|without)\b/,"class-name":/\b(?:POSIX file|RGB color|alias|application|boolean|centimeters|centimetres|class|constant|cubic centimeters|cubic centimetres|cubic feet|cubic inches|cubic meters|cubic metres|cubic yards|date|degrees Celsius|degrees Fahrenheit|degrees Kelvin|feet|file|gallons|grams|inches|integer|kilograms|kilometers|kilometres|list|liters|litres|meters|metres|miles|number|ounces|pounds|quarts|real|record|reference|script|square feet|square kilometers|square kilometres|square meters|square metres|square miles|square yards|text|yards)\b/,punctuation:/[{}():,¬«»《》]/}}return Dy}var Ly,EI;function abe(){if(EI)return Ly;EI=1,Ly=e,e.displayName="aql",e.aliases=[];function e(t){t.languages.aql={comment:/\/\/.*|\/\*[\s\S]*?\*\//,property:{pattern:/([{,]\s*)(?:(?!\d)\w+|(["'´`])(?:(?!\2)[^\\\r\n]|\\.)*\2)(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\.)*\1/,greedy:!0},identifier:{pattern:/([´`])(?:(?!\1)[^\\\r\n]|\\.)*\1/,greedy:!0},variable:/@@?\w+/,keyword:[{pattern:/(\bWITH\s+)COUNT(?=\s+INTO\b)/i,lookbehind:!0},/\b(?:AGGREGATE|ALL|AND|ANY|ASC|COLLECT|DESC|DISTINCT|FILTER|FOR|GRAPH|IN|INBOUND|INSERT|INTO|K_PATHS|K_SHORTEST_PATHS|LET|LIKE|LIMIT|NONE|NOT|NULL|OR|OUTBOUND|REMOVE|REPLACE|RETURN|SHORTEST_PATH|SORT|UPDATE|UPSERT|WINDOW|WITH)\b/i,{pattern:/(^|[^\w.[])(?:KEEP|PRUNE|SEARCH|TO)\b/i,lookbehind:!0},{pattern:/(^|[^\w.[])(?:CURRENT|NEW|OLD)\b/,lookbehind:!0},{pattern:/\bOPTIONS(?=\s*\{)/i}],function:/\b(?!\d)\w+(?=\s*\()/,boolean:/\b(?:false|true)\b/i,range:{pattern:/\.\./,alias:"operator"},number:[/\b0b[01]+/i,/\b0x[0-9a-f]+/i,/(?:\B\.\d+|\b(?:0|[1-9]\d*)(?:\.\d+)?)(?:e[+-]?\d+)?/i],operator:/\*{2,}|[=!]~|[!=<>]=?|&&|\|\||[-+*/%]/,punctuation:/::|[?.:,;()[\]{}]/}}return Ly}var My,xI;function Ws(){if(xI)return My;xI=1,My=e,e.displayName="c",e.aliases=[];function e(t){t.languages.c=t.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),t.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),t.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},t.languages.c.string],char:t.languages.c.char,comment:t.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:t.languages.c}}}}),t.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete t.languages.c.boolean}return My}var Py,kI;function RA(){if(kI)return Py;kI=1;var e=Ws();Py=t,t.displayName="cpp",t.aliases=[];function t(n){n.register(e),function(r){var a=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,o=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,function(){return a.source});r.languages.cpp=r.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,function(){return a.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:a,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),r.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,function(){return o})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),r.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:r.languages.cpp}}}}),r.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),r.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:r.languages.extend("cpp",{})}}),r.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},r.languages.cpp["base-clause"])}(n)}return Py}var $y,CI;function obe(){if(CI)return $y;CI=1;var e=RA();$y=t,t.displayName="arduino",t.aliases=["ino"];function t(n){n.register(e),n.languages.arduino=n.languages.extend("cpp",{keyword:/\b(?:String|array|bool|boolean|break|byte|case|catch|continue|default|do|double|else|finally|for|function|goto|if|in|instanceof|int|integer|long|loop|new|null|return|setup|string|switch|throw|try|void|while|word)\b/,constant:/\b(?:ANALOG_MESSAGE|DEFAULT|DIGITAL_MESSAGE|EXTERNAL|FIRMATA_STRING|HIGH|INPUT|INPUT_PULLUP|INTERNAL|INTERNAL1V1|INTERNAL2V56|LED_BUILTIN|LOW|OUTPUT|REPORT_ANALOG|REPORT_DIGITAL|SET_PIN_MODE|SYSEX_START|SYSTEM_RESET)\b/,builtin:/\b(?:Audio|BSSID|Bridge|Client|Console|EEPROM|Esplora|EsploraTFT|Ethernet|EthernetClient|EthernetServer|EthernetUDP|File|FileIO|FileSystem|Firmata|GPRS|GSM|GSMBand|GSMClient|GSMModem|GSMPIN|GSMScanner|GSMServer|GSMVoiceCall|GSM_SMS|HttpClient|IPAddress|IRread|Keyboard|KeyboardController|LiquidCrystal|LiquidCrystal_I2C|Mailbox|Mouse|MouseController|PImage|Process|RSSI|RobotControl|RobotMotor|SD|SPI|SSID|Scheduler|Serial|Server|Servo|SoftwareSerial|Stepper|Stream|TFT|Task|USBHost|WiFi|WiFiClient|WiFiServer|WiFiUDP|Wire|YunClient|YunServer|abs|addParameter|analogRead|analogReadResolution|analogReference|analogWrite|analogWriteResolution|answerCall|attach|attachGPRS|attachInterrupt|attached|autoscroll|available|background|beep|begin|beginPacket|beginSD|beginSMS|beginSpeaker|beginTFT|beginTransmission|beginWrite|bit|bitClear|bitRead|bitSet|bitWrite|blink|blinkVersion|buffer|changePIN|checkPIN|checkPUK|checkReg|circle|cityNameRead|cityNameWrite|clear|clearScreen|click|close|compassRead|config|connect|connected|constrain|cos|countryNameRead|countryNameWrite|createChar|cursor|debugPrint|delay|delayMicroseconds|detach|detachInterrupt|digitalRead|digitalWrite|disconnect|display|displayLogos|drawBMP|drawCompass|encryptionType|end|endPacket|endSMS|endTransmission|endWrite|exists|exitValue|fill|find|findUntil|flush|gatewayIP|get|getAsynchronously|getBand|getButton|getCurrentCarrier|getIMEI|getKey|getModifiers|getOemKey|getPINUsed|getResult|getSignalStrength|getSocket|getVoiceCallStatus|getXChange|getYChange|hangCall|height|highByte|home|image|interrupts|isActionDone|isDirectory|isListening|isPIN|isPressed|isValid|keyPressed|keyReleased|keyboardRead|knobRead|leftToRight|line|lineFollowConfig|listen|listenOnLocalhost|loadImage|localIP|lowByte|macAddress|maintain|map|max|messageAvailable|micros|millis|min|mkdir|motorsStop|motorsWrite|mouseDragged|mouseMoved|mousePressed|mouseReleased|move|noAutoscroll|noBlink|noBuffer|noCursor|noDisplay|noFill|noInterrupts|noListenOnLocalhost|noStroke|noTone|onReceive|onRequest|open|openNextFile|overflow|parseCommand|parseFloat|parseInt|parsePacket|pauseMode|peek|pinMode|playFile|playMelody|point|pointTo|position|pow|prepare|press|print|printFirmwareVersion|printVersion|println|process|processInput|pulseIn|put|random|randomSeed|read|readAccelerometer|readBlue|readButton|readBytes|readBytesUntil|readGreen|readJoystickButton|readJoystickSwitch|readJoystickX|readJoystickY|readLightSensor|readMessage|readMicrophone|readNetworks|readRed|readSlider|readString|readStringUntil|readTemperature|ready|rect|release|releaseAll|remoteIP|remoteNumber|remotePort|remove|requestFrom|retrieveCallingNumber|rewindDirectory|rightToLeft|rmdir|robotNameRead|robotNameWrite|run|runAsynchronously|runShellCommand|runShellCommandAsynchronously|running|scanNetworks|scrollDisplayLeft|scrollDisplayRight|seek|sendAnalog|sendDigitalPortPair|sendDigitalPorts|sendString|sendSysex|serialEvent|setBand|setBitOrder|setClockDivider|setCursor|setDNS|setDataMode|setFirmwareVersion|setMode|setPINUsed|setSpeed|setTextSize|setTimeout|shiftIn|shiftOut|shutdown|sin|size|sqrt|startLoop|step|stop|stroke|subnetMask|switchPIN|tan|tempoWrite|text|tone|transfer|tuneWrite|turn|updateIR|userNameRead|userNameWrite|voiceCall|waitContinue|width|write|writeBlue|writeGreen|writeJSON|writeMessage|writeMicroseconds|writeRGB|writeRed|yield)\b/}),n.languages.ino=n.languages.arduino}return $y}var Fy,_I;function ibe(){if(_I)return Fy;_I=1,Fy=e,e.displayName="arff",e.aliases=[];function e(t){t.languages.arff={comment:/%.*/,string:{pattern:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:/@(?:attribute|data|end|relation)\b/i,number:/\b\d+(?:\.\d+)?\b/,punctuation:/[{},]/}}return Fy}var jy,AI;function sbe(){if(AI)return jy;AI=1,jy=e,e.displayName="asciidoc",e.aliases=["adoc"];function e(t){(function(n){var r={pattern:/(^[ \t]*)\[(?!\[)(?:(["'$`])(?:(?!\2)[^\\]|\\.)*\2|\[(?:[^\[\]\\]|\\.)*\]|[^\[\]\\"'$`]|\\.)*\]/m,lookbehind:!0,inside:{quoted:{pattern:/([$`])(?:(?!\1)[^\\]|\\.)*\1/,inside:{punctuation:/^[$`]|[$`]$/}},interpreted:{pattern:/'(?:[^'\\]|\\.)*'/,inside:{punctuation:/^'|'$/}},string:/"(?:[^"\\]|\\.)*"/,variable:/\w+(?==)/,punctuation:/^\[|\]$|,/,operator:/=/,"attr-value":/(?!^\s+$).+/}},a=n.languages.asciidoc={"comment-block":{pattern:/^(\/{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1/m,alias:"comment"},table:{pattern:/^\|={3,}(?:(?:\r?\n|\r(?!\n)).*)*?(?:\r?\n|\r)\|={3,}$/m,inside:{specifiers:{pattern:/(?:(?:(?:\d+(?:\.\d+)?|\.\d+)[+*](?:[<^>](?:\.[<^>])?|\.[<^>])?|[<^>](?:\.[<^>])?|\.[<^>])[a-z]*|[a-z]+)(?=\|)/,alias:"attr-value"},punctuation:{pattern:/(^|[^\\])[|!]=*/,lookbehind:!0}}},"passthrough-block":{pattern:/^(\+{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,inside:{punctuation:/^\++|\++$/}},"literal-block":{pattern:/^(-{4,}|\.{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,inside:{punctuation:/^(?:-+|\.+)|(?:-+|\.+)$/}},"other-block":{pattern:/^(--|\*{4,}|_{4,}|={4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,inside:{punctuation:/^(?:-+|\*+|_+|=+)|(?:-+|\*+|_+|=+)$/}},"list-punctuation":{pattern:/(^[ \t]*)(?:-|\*{1,5}|\.{1,5}|(?:[a-z]|\d+)\.|[xvi]+\))(?= )/im,lookbehind:!0,alias:"punctuation"},"list-label":{pattern:/(^[ \t]*)[a-z\d].+(?::{2,4}|;;)(?=\s)/im,lookbehind:!0,alias:"symbol"},"indented-block":{pattern:/((\r?\n|\r)\2)([ \t]+)\S.*(?:(?:\r?\n|\r)\3.+)*(?=\2{2}|$)/,lookbehind:!0},comment:/^\/\/.*/m,title:{pattern:/^.+(?:\r?\n|\r)(?:={3,}|-{3,}|~{3,}|\^{3,}|\+{3,})$|^={1,5} .+|^\.(?![\s.]).*/m,alias:"important",inside:{punctuation:/^(?:\.|=+)|(?:=+|-+|~+|\^+|\++)$/}},"attribute-entry":{pattern:/^:[^:\r\n]+:(?: .*?(?: \+(?:\r?\n|\r).*?)*)?$/m,alias:"tag"},attributes:r,hr:{pattern:/^'{3,}$/m,alias:"punctuation"},"page-break":{pattern:/^<{3,}$/m,alias:"punctuation"},admonition:{pattern:/^(?:CAUTION|IMPORTANT|NOTE|TIP|WARNING):/m,alias:"keyword"},callout:[{pattern:/(^[ \t]*)/m,lookbehind:!0,alias:"symbol"},{pattern:/<\d+>/,alias:"symbol"}],macro:{pattern:/\b[a-z\d][a-z\d-]*::?(?:[^\s\[\]]*\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,inside:{function:/^[a-z\d-]+(?=:)/,punctuation:/^::?/,attributes:{pattern:/(?:\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,inside:r.inside}}},inline:{pattern:/(^|[^\\])(?:(?:\B\[(?:[^\]\\"']|(["'])(?:(?!\2)[^\\]|\\.)*\2|\\.)*\])?(?:\b_(?!\s)(?: _|[^_\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: _|[^_\\\r\n]|\\.)+)*_\b|\B``(?!\s).+?(?:(?:\r?\n|\r).+?)*''\B|\B`(?!\s)(?:[^`'\s]|\s+\S)+['`]\B|\B(['*+#])(?!\s)(?: \3|(?!\3)[^\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: \3|(?!\3)[^\\\r\n]|\\.)+)*\3\B)|(?:\[(?:[^\]\\"']|(["'])(?:(?!\4)[^\\]|\\.)*\4|\\.)*\])?(?:(__|\*\*|\+\+\+?|##|\$\$|[~^]).+?(?:(?:\r?\n|\r).+?)*\5|\{[^}\r\n]+\}|\[\[\[?.+?(?:(?:\r?\n|\r).+?)*\]?\]\]|<<.+?(?:(?:\r?\n|\r).+?)*>>|\(\(\(?.+?(?:(?:\r?\n|\r).+?)*\)?\)\)))/m,lookbehind:!0,inside:{attributes:r,url:{pattern:/^(?:\[\[\[?.+?\]?\]\]|<<.+?>>)$/,inside:{punctuation:/^(?:\[\[\[?|<<)|(?:\]\]\]?|>>)$/}},"attribute-ref":{pattern:/^\{.+\}$/,inside:{variable:{pattern:/(^\{)[a-z\d,+_-]+/,lookbehind:!0},operator:/^[=?!#%@$]|!(?=[:}])/,punctuation:/^\{|\}$|::?/}},italic:{pattern:/^(['_])[\s\S]+\1$/,inside:{punctuation:/^(?:''?|__?)|(?:''?|__?)$/}},bold:{pattern:/^\*[\s\S]+\*$/,inside:{punctuation:/^\*\*?|\*\*?$/}},punctuation:/^(?:``?|\+{1,3}|##?|\$\$|[~^]|\(\(\(?)|(?:''?|\+{1,3}|##?|\$\$|[~^`]|\)?\)\))$/}},replacement:{pattern:/\((?:C|R|TM)\)/,alias:"builtin"},entity:/&#?[\da-z]{1,8};/i,"line-continuation":{pattern:/(^| )\+$/m,lookbehind:!0,alias:"punctuation"}};function o(i){i=i.split(" ");for(var s={},l=0,c=i.length;l>=?|<<=?|&&?|\|\|?|[-+*/%&|^!=<>?]=?/,punctuation:/[(),:]/}}return Uy}var By,NI;function Ah(){if(NI)return By;NI=1,By=e,e.displayName="csharp",e.aliases=["dotnet","cs"];function e(t){(function(n){function r(V,P){return V.replace(/<<(\d+)>>/g,function(N,K){return"(?:"+P[+K]+")"})}function a(V,P,N){return RegExp(r(V,P),N||"")}function o(V,P){for(var N=0;N>/g,function(){return"(?:"+V+")"});return V.replace(/<>/g,"[^\\s\\S]")}var i={type:"bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",typeDeclaration:"class enum interface record struct",contextual:"add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",other:"abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield"};function s(V){return"\\b(?:"+V.trim().replace(/ /g,"|")+")\\b"}var l=s(i.typeDeclaration),c=RegExp(s(i.type+" "+i.typeDeclaration+" "+i.contextual+" "+i.other)),u=s(i.typeDeclaration+" "+i.contextual+" "+i.other),d=s(i.type+" "+i.typeDeclaration+" "+i.other),g=o(/<(?:[^<>;=+\-*/%&|^]|<>)*>/.source,2),m=o(/\((?:[^()]|<>)*\)/.source,2),b=/@?\b[A-Za-z_]\w*\b/.source,y=r(/<<0>>(?:\s*<<1>>)?/.source,[b,g]),w=r(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source,[u,y]),v=/\[\s*(?:,\s*)*\]/.source,h=r(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source,[w,v]),S=r(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[g,m,v]),E=r(/\(<<0>>+(?:,<<0>>+)+\)/.source,[S]),k=r(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source,[E,w,v]),x={keyword:c,punctuation:/[<>()?,.:[\]]/},C=/'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source,_=/"(?:\\.|[^\\"\r\n])*"/.source,R=/@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source;n.languages.csharp=n.languages.extend("clike",{string:[{pattern:a(/(^|[^$\\])<<0>>/.source,[R]),lookbehind:!0,greedy:!0},{pattern:a(/(^|[^@$\\])<<0>>/.source,[_]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:a(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source,[w]),lookbehind:!0,inside:x},{pattern:a(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source,[b,k]),lookbehind:!0,inside:x},{pattern:a(/(\busing\s+)<<0>>(?=\s*=)/.source,[b]),lookbehind:!0},{pattern:a(/(\b<<0>>\s+)<<1>>/.source,[l,y]),lookbehind:!0,inside:x},{pattern:a(/(\bcatch\s*\(\s*)<<0>>/.source,[w]),lookbehind:!0,inside:x},{pattern:a(/(\bwhere\s+)<<0>>/.source,[b]),lookbehind:!0},{pattern:a(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source,[h]),lookbehind:!0,inside:x},{pattern:a(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source,[k,d,b]),inside:x}],keyword:c,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),n.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),n.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:a(/([(,]\s*)<<0>>(?=\s*:)/.source,[b]),lookbehind:!0,alias:"punctuation"}}),n.languages.insertBefore("csharp","class-name",{namespace:{pattern:a(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source,[b]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:a(/(\b(?:default|sizeof|typeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source,[m]),lookbehind:!0,alias:"class-name",inside:x},"return-type":{pattern:a(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source,[k,w]),inside:x,alias:"class-name"},"constructor-invocation":{pattern:a(/(\bnew\s+)<<0>>(?=\s*[[({])/.source,[k]),lookbehind:!0,inside:x,alias:"class-name"},"generic-method":{pattern:a(/<<0>>\s*<<1>>(?=\s*\()/.source,[b,g]),inside:{function:a(/^<<0>>/.source,[b]),generic:{pattern:RegExp(g),alias:"class-name",inside:x}}},"type-list":{pattern:a(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source,[l,y,b,k,c.source,m,/\bnew\s*\(\s*\)/.source]),lookbehind:!0,inside:{"record-arguments":{pattern:a(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source,[y,m]),lookbehind:!0,greedy:!0,inside:n.languages.csharp},keyword:c,"class-name":{pattern:RegExp(k),greedy:!0,inside:x},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var T=_+"|"+C,L=r(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source,[T]),D=o(r(/[^"'/()]|<<0>>|\(<>*\)/.source,[L]),2),H=/\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source,z=r(/<<0>>(?:\s*\(<<1>>*\))?/.source,[w,D]);n.languages.insertBefore("csharp","class-name",{attribute:{pattern:a(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source,[H,z]),lookbehind:!0,greedy:!0,inside:{target:{pattern:a(/^<<0>>(?=\s*:)/.source,[H]),alias:"keyword"},"attribute-arguments":{pattern:a(/\(<<0>>*\)/.source,[D]),inside:n.languages.csharp},"class-name":{pattern:RegExp(w),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var M=/:[^}\r\n]+/.source,U=o(r(/[^"'/()]|<<0>>|\(<>*\)/.source,[L]),2),X=r(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[U,M]),j=o(r(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<>*\)/.source,[T]),2),O=r(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[j,M]);function A(V,P){return{interpolation:{pattern:a(/((?:^|[^{])(?:\{\{)*)<<0>>/.source,[V]),lookbehind:!0,inside:{"format-string":{pattern:a(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source,[P,M]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:n.languages.csharp}}},string:/[\s\S]+/}}n.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:a(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source,[X]),lookbehind:!0,greedy:!0,inside:A(X,U)},{pattern:a(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source,[O]),lookbehind:!0,greedy:!0,inside:A(O,j)}],char:{pattern:RegExp(C),greedy:!0}}),n.languages.dotnet=n.languages.cs=n.languages.csharp})(t)}return By}var Hy,II;function ube(){if(II)return Hy;II=1;var e=Ah();Hy=t,t.displayName="aspnet",t.aliases=[];function t(n){n.register(e),n.languages.aspnet=n.languages.extend("markup",{"page-directive":{pattern:/<%\s*@.*%>/,alias:"tag",inside:{"page-directive":{pattern:/<%\s*@\s*(?:Assembly|Control|Implements|Import|Master(?:Type)?|OutputCache|Page|PreviousPageType|Reference|Register)?|%>/i,alias:"tag"},rest:n.languages.markup.tag.inside}},directive:{pattern:/<%.*%>/,alias:"tag",inside:{directive:{pattern:/<%\s*?[$=%#:]{0,2}|%>/,alias:"tag"},rest:n.languages.csharp}}}),n.languages.aspnet.tag.pattern=/<(?!%)\/?[^\s>\/]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/,n.languages.insertBefore("inside","punctuation",{directive:n.languages.aspnet.directive},n.languages.aspnet.tag.inside["attr-value"]),n.languages.insertBefore("aspnet","comment",{"asp-comment":{pattern:/<%--[\s\S]*?--%>/,alias:["asp","comment"]}}),n.languages.insertBefore("aspnet",n.languages.javascript?"script":"tag",{"asp-script":{pattern:/(]*>)[\s\S]*?(?=<\/script>)/i,lookbehind:!0,alias:["asp","script"],inside:n.languages.csharp||{}}})}return Hy}var Vy,OI;function dbe(){if(OI)return Vy;OI=1,Vy=e,e.displayName="autohotkey",e.aliases=[];function e(t){t.languages.autohotkey={comment:[{pattern:/(^|\s);.*/,lookbehind:!0},{pattern:/(^[\t ]*)\/\*(?:[\r\n](?![ \t]*\*\/)|[^\r\n])*(?:[\r\n][ \t]*\*\/)?/m,lookbehind:!0,greedy:!0}],tag:{pattern:/^([ \t]*)[^\s,`":]+(?=:[ \t]*$)/m,lookbehind:!0},string:/"(?:[^"\n\r]|"")*"/,variable:/%\w+%/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/\?|\/\/?=?|:=|\|[=|]?|&[=&]?|\+[=+]?|-[=-]?|\*[=*]?|<(?:<=?|>|=)?|>>?=?|[.^!=~]=?|\b(?:AND|NOT|OR)\b/,boolean:/\b(?:false|true)\b/,selector:/\b(?:AutoTrim|BlockInput|Break|Click|ClipWait|Continue|Control|ControlClick|ControlFocus|ControlGet|ControlGetFocus|ControlGetPos|ControlGetText|ControlMove|ControlSend|ControlSendRaw|ControlSetText|CoordMode|Critical|DetectHiddenText|DetectHiddenWindows|Drive|DriveGet|DriveSpaceFree|EnvAdd|EnvDiv|EnvGet|EnvMult|EnvSet|EnvSub|EnvUpdate|Exit|ExitApp|FileAppend|FileCopy|FileCopyDir|FileCreateDir|FileCreateShortcut|FileDelete|FileEncoding|FileGetAttrib|FileGetShortcut|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileMoveDir|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileRemoveDir|FileSelectFile|FileSelectFolder|FileSetAttrib|FileSetTime|FormatTime|GetKeyState|Gosub|Goto|GroupActivate|GroupAdd|GroupClose|GroupDeactivate|Gui|GuiControl|GuiControlGet|Hotkey|ImageSearch|IniDelete|IniRead|IniWrite|Input|InputBox|KeyWait|ListHotkeys|ListLines|ListVars|Loop|Menu|MouseClick|MouseClickDrag|MouseGetPos|MouseMove|MsgBox|OnExit|OutputDebug|Pause|PixelGetColor|PixelSearch|PostMessage|Process|Progress|Random|RegDelete|RegRead|RegWrite|Reload|Repeat|Return|Run|RunAs|RunWait|Send|SendEvent|SendInput|SendMessage|SendMode|SendPlay|SendRaw|SetBatchLines|SetCapslockState|SetControlDelay|SetDefaultMouseSpeed|SetEnv|SetFormat|SetKeyDelay|SetMouseDelay|SetNumlockState|SetRegView|SetScrollLockState|SetStoreCapslockMode|SetTimer|SetTitleMatchMode|SetWinDelay|SetWorkingDir|Shutdown|Sleep|Sort|SoundBeep|SoundGet|SoundGetWaveVolume|SoundPlay|SoundSet|SoundSetWaveVolume|SplashImage|SplashTextOff|SplashTextOn|SplitPath|StatusBarGetText|StatusBarWait|StringCaseSense|StringGetPos|StringLeft|StringLen|StringLower|StringMid|StringReplace|StringRight|StringSplit|StringTrimLeft|StringTrimRight|StringUpper|Suspend|SysGet|Thread|ToolTip|Transform|TrayTip|URLDownloadToFile|WinActivate|WinActivateBottom|WinClose|WinGet|WinGetActiveStats|WinGetActiveTitle|WinGetClass|WinGetPos|WinGetText|WinGetTitle|WinHide|WinKill|WinMaximize|WinMenuSelectItem|WinMinimize|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinRestore|WinSet|WinSetTitle|WinShow|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive)\b/i,constant:/\b(?:a_ahkpath|a_ahkversion|a_appdata|a_appdatacommon|a_autotrim|a_batchlines|a_caretx|a_carety|a_computername|a_controldelay|a_cursor|a_dd|a_ddd|a_dddd|a_defaultmousespeed|a_desktop|a_desktopcommon|a_detecthiddentext|a_detecthiddenwindows|a_endchar|a_eventinfo|a_exitreason|a_fileencoding|a_formatfloat|a_formatinteger|a_gui|a_guicontrol|a_guicontrolevent|a_guievent|a_guiheight|a_guiwidth|a_guix|a_guiy|a_hour|a_iconfile|a_iconhidden|a_iconnumber|a_icontip|a_index|a_ipaddress1|a_ipaddress2|a_ipaddress3|a_ipaddress4|a_is64bitos|a_isadmin|a_iscompiled|a_iscritical|a_ispaused|a_issuspended|a_isunicode|a_keydelay|a_language|a_lasterror|a_linefile|a_linenumber|a_loopfield|a_loopfileattrib|a_loopfiledir|a_loopfileext|a_loopfilefullpath|a_loopfilelongpath|a_loopfilename|a_loopfileshortname|a_loopfileshortpath|a_loopfilesize|a_loopfilesizekb|a_loopfilesizemb|a_loopfiletimeaccessed|a_loopfiletimecreated|a_loopfiletimemodified|a_loopreadline|a_loopregkey|a_loopregname|a_loopregsubkey|a_loopregtimemodified|a_loopregtype|a_mday|a_min|a_mm|a_mmm|a_mmmm|a_mon|a_mousedelay|a_msec|a_mydocuments|a_now|a_nowutc|a_numbatchlines|a_ostype|a_osversion|a_priorhotkey|a_priorkey|a_programfiles|a_programs|a_programscommon|a_ptrsize|a_regview|a_screendpi|a_screenheight|a_screenwidth|a_scriptdir|a_scriptfullpath|a_scripthwnd|a_scriptname|a_sec|a_space|a_startmenu|a_startmenucommon|a_startup|a_startupcommon|a_stringcasesense|a_tab|a_temp|a_thisfunc|a_thishotkey|a_thislabel|a_thismenu|a_thismenuitem|a_thismenuitempos|a_tickcount|a_timeidle|a_timeidlephysical|a_timesincepriorhotkey|a_timesincethishotkey|a_titlematchmode|a_titlematchmodespeed|a_username|a_wday|a_windelay|a_windir|a_workingdir|a_yday|a_year|a_yweek|a_yyyy|clipboard|clipboardall|comspec|errorlevel|programfiles)\b/i,builtin:/\b(?:abs|acos|asc|asin|atan|ceil|chr|class|comobjactive|comobjarray|comobjconnect|comobjcreate|comobjerror|comobjflags|comobjget|comobjquery|comobjtype|comobjvalue|cos|dllcall|exp|fileexist|Fileopen|floor|format|il_add|il_create|il_destroy|instr|isfunc|islabel|IsObject|ln|log|ltrim|lv_add|lv_delete|lv_deletecol|lv_getcount|lv_getnext|lv_gettext|lv_insert|lv_insertcol|lv_modify|lv_modifycol|lv_setimagelist|mod|numget|numput|onmessage|regexmatch|regexreplace|registercallback|round|rtrim|sb_seticon|sb_setparts|sb_settext|sin|sqrt|strlen|strreplace|strsplit|substr|tan|tv_add|tv_delete|tv_get|tv_getchild|tv_getcount|tv_getnext|tv_getparent|tv_getprev|tv_getselection|tv_gettext|tv_modify|varsetcapacity|winactive|winexist|__Call|__Get|__New|__Set)\b/i,symbol:/\b(?:alt|altdown|altup|appskey|backspace|browser_back|browser_favorites|browser_forward|browser_home|browser_refresh|browser_search|browser_stop|bs|capslock|ctrl|ctrlbreak|ctrldown|ctrlup|del|delete|down|end|enter|esc|escape|f1|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f2|f20|f21|f22|f23|f24|f3|f4|f5|f6|f7|f8|f9|home|ins|insert|joy1|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy2|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy3|joy30|joy31|joy32|joy4|joy5|joy6|joy7|joy8|joy9|joyaxes|joybuttons|joyinfo|joyname|joypov|joyr|joyu|joyv|joyx|joyy|joyz|lalt|launch_app1|launch_app2|launch_mail|launch_media|lbutton|lcontrol|lctrl|left|lshift|lwin|lwindown|lwinup|mbutton|media_next|media_play_pause|media_prev|media_stop|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadadd|numpadclear|numpaddel|numpaddiv|numpaddot|numpaddown|numpadend|numpadenter|numpadhome|numpadins|numpadleft|numpadmult|numpadpgdn|numpadpgup|numpadright|numpadsub|numpadup|pgdn|pgup|printscreen|ralt|rbutton|rcontrol|rctrl|right|rshift|rwin|rwindown|rwinup|scrolllock|shift|shiftdown|shiftup|space|tab|up|volume_down|volume_mute|volume_up|wheeldown|wheelleft|wheelright|wheelup|xbutton1|xbutton2)\b/i,important:/#\b(?:AllowSameLineComments|ClipboardTimeout|CommentFlag|DerefChar|ErrorStdOut|EscapeChar|HotkeyInterval|HotkeyModifierTimeout|Hotstring|If|IfTimeout|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Include|IncludeAgain|InputLevel|InstallKeybdHook|InstallMouseHook|KeyHistory|MaxHotkeysPerInterval|MaxMem|MaxThreads|MaxThreadsBuffer|MaxThreadsPerHotkey|MenuMaskKey|NoEnv|NoTrayIcon|Persistent|SingleInstance|UseHook|Warn|WinActivateForce)\b/i,keyword:/\b(?:Abort|AboveNormal|Add|ahk_class|ahk_exe|ahk_group|ahk_id|ahk_pid|All|Alnum|Alpha|AltSubmit|AltTab|AltTabAndMenu|AltTabMenu|AltTabMenuDismiss|AlwaysOnTop|AutoSize|Background|BackgroundTrans|BelowNormal|between|BitAnd|BitNot|BitOr|BitShiftLeft|BitShiftRight|BitXOr|Bold|Border|Button|ByRef|Catch|Checkbox|Checked|CheckedGray|Choose|ChooseString|Close|Color|ComboBox|Contains|ControlList|Count|Date|DateTime|Days|DDL|Default|DeleteAll|Delimiter|Deref|Destroy|Digit|Disable|Disabled|DropDownList|Edit|Eject|Else|Enable|Enabled|Error|Exist|Expand|ExStyle|FileSystem|Finally|First|Flash|Float|FloatFast|Focus|Font|for|global|Grid|Group|GroupBox|GuiClose|GuiContextMenu|GuiDropFiles|GuiEscape|GuiSize|Hdr|Hidden|Hide|High|HKCC|HKCR|HKCU|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_LOCAL_MACHINE|HKEY_USERS|HKLM|HKU|Hours|HScroll|Icon|IconSmall|ID|IDLast|If|IfEqual|IfExist|IfGreater|IfGreaterOrEqual|IfInString|IfLess|IfLessOrEqual|IfMsgBox|IfNotEqual|IfNotExist|IfNotInString|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Ignore|ImageList|in|Integer|IntegerFast|Interrupt|is|italic|Join|Label|LastFound|LastFoundExist|Limit|Lines|List|ListBox|ListView|local|Lock|Logoff|Low|Lower|Lowercase|MainWindow|Margin|Maximize|MaximizeBox|MaxSize|Minimize|MinimizeBox|MinMax|MinSize|Minutes|MonthCal|Mouse|Move|Multi|NA|No|NoActivate|NoDefault|NoHide|NoIcon|NoMainWindow|norm|Normal|NoSort|NoSortHdr|NoStandard|Not|NoTab|NoTimers|Number|Off|Ok|On|OwnDialogs|Owner|Parse|Password|Picture|Pixel|Pos|Pow|Priority|ProcessName|Radio|Range|Read|ReadOnly|Realtime|Redraw|Region|REG_BINARY|REG_DWORD|REG_EXPAND_SZ|REG_MULTI_SZ|REG_SZ|Relative|Rename|Report|Resize|Restore|Retry|RGB|Screen|Seconds|Section|Serial|SetLabel|ShiftAltTab|Show|Single|Slider|SortDesc|Standard|static|Status|StatusBar|StatusCD|strike|Style|Submit|SysMenu|Tab2|TabStop|Text|Theme|Throw|Tile|ToggleCheck|ToggleEnable|ToolWindow|Top|Topmost|TransColor|Transparent|Tray|TreeView|Try|TryAgain|Type|UnCheck|underline|Unicode|Unlock|Until|UpDown|Upper|Uppercase|UseErrorLevel|Vis|VisFirst|Visible|VScroll|Wait|WaitClose|WantCtrlA|WantF2|WantReturn|While|Wrap|Xdigit|xm|xp|xs|Yes|ym|yp|ys)\b/i,function:/[^(); \t,\n+*\-=?>:\\\/<&%\[\]]+(?=\()/,punctuation:/[{}[\]():,]/}}return Vy}var qy,DI;function fbe(){if(DI)return qy;DI=1,qy=e,e.displayName="autoit",e.aliases=[];function e(t){t.languages.autoit={comment:[/;.*/,{pattern:/(^[\t ]*)#(?:comments-start|cs)[\s\S]*?^[ \t]*#(?:ce|comments-end)/m,lookbehind:!0}],url:{pattern:/(^[\t ]*#include\s+)(?:<[^\r\n>]+>|"[^\r\n"]+")/m,lookbehind:!0},string:{pattern:/(["'])(?:\1\1|(?!\1)[^\r\n])*\1/,greedy:!0,inside:{variable:/([%$@])\w+\1/}},directive:{pattern:/(^[\t ]*)#[\w-]+/m,lookbehind:!0,alias:"keyword"},function:/\b\w+(?=\()/,variable:/[$@]\w+/,keyword:/\b(?:Case|Const|Continue(?:Case|Loop)|Default|Dim|Do|Else(?:If)?|End(?:Func|If|Select|Switch|With)|Enum|Exit(?:Loop)?|For|Func|Global|If|In|Local|Next|Null|ReDim|Select|Static|Step|Switch|Then|To|Until|Volatile|WEnd|While|With)\b/i,number:/\b(?:0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,boolean:/\b(?:False|True)\b/i,operator:/<[=>]?|[-+*\/=&>]=?|[?^]|\b(?:And|Not|Or)\b/i,punctuation:/[\[\]().,:]/}}return qy}var Gy,LI;function pbe(){if(LI)return Gy;LI=1,Gy=e,e.displayName="avisynth",e.aliases=["avs"];function e(t){(function(n){function r(u,d){return u.replace(/<<(\d+)>>/g,function(g,m){return d[+m]})}function a(u,d,g){return RegExp(r(u,d),g||"")}var o=/bool|clip|float|int|string|val/.source,i=[/is(?:bool|clip|float|int|string)|defined|(?:(?:internal)?function|var)?exists?/.source,/apply|assert|default|eval|import|nop|select|undefined/.source,/opt_(?:allowfloataudio|avipadscanlines|dwchannelmask|enable_(?:b64a|planartopackedrgb|v210|y3_10_10|y3_10_16)|usewaveextensible|vdubplanarhack)|set(?:cachemode|maxcpu|memorymax|planarlegacyalignment|workingdir)/.source,/hex(?:value)?|value/.source,/abs|ceil|continued(?:denominator|numerator)?|exp|floor|fmod|frac|log(?:10)?|max|min|muldiv|pi|pow|rand|round|sign|spline|sqrt/.source,/a?sinh?|a?cosh?|a?tan[2h]?/.source,/(?:bit(?:and|not|x?or|[lr]?shift[aslu]?|sh[lr]|sa[lr]|[lr]rotatel?|ro[rl]|te?st|set(?:count)?|cl(?:ea)?r|ch(?:an)?ge?))/.source,/average(?:[bgr]|chroma[uv]|luma)|(?:[rgb]|chroma[uv]|luma|rgb|[yuv](?=difference(?:fromprevious|tonext)))difference(?:fromprevious|tonext)?|[yuvrgb]plane(?:median|min|max|minmaxdifference)/.source,/getprocessinfo|logmsg|script(?:dir(?:utf8)?|file(?:utf8)?|name(?:utf8)?)|setlogparams/.source,/chr|(?:fill|find|left|mid|replace|rev|right)str|format|[lu]case|ord|str(?:cmpi?|fromutf8|len|toutf8)|time|trim(?:all|left|right)/.source,/isversionorgreater|version(?:number|string)/.source,/buildpixeltype|colorspacenametopixeltype/.source,/addautoloaddir|on(?:cpu|cuda)|prefetch|setfiltermtmode/.source].join("|"),s=[/has(?:audio|video)/.source,/height|width/.source,/frame(?:count|rate)|framerate(?:denominator|numerator)/.source,/getparity|is(?:field|frame)based/.source,/bitspercomponent|componentsize|hasalpha|is(?:planar(?:rgba?)?|interleaved|rgb(?:24|32|48|64)?|y(?:8|u(?:va?|y2))?|yv(?:12|16|24|411)|420|422|444|packedrgb)|numcomponents|pixeltype/.source,/audio(?:bits|channels|duration|length(?:[fs]|hi|lo)?|rate)|isaudio(?:float|int)/.source].join("|"),l=[/avi(?:file)?source|directshowsource|image(?:reader|source|sourceanim)|opendmlsource|segmented(?:avisource|directshowsource)|wavsource/.source,/coloryuv|convertbacktoyuy2|convertto(?:RGB(?:24|32|48|64)|(?:planar)?RGBA?|Y8?|YV(?:12|16|24|411)|YUVA?(?:411|420|422|444)|YUY2)|fixluminance|gr[ae]yscale|invert|levels|limiter|mergea?rgb|merge(?:chroma|luma)|rgbadjust|show(?:alpha|blue|green|red)|swapuv|tweak|[uv]toy8?|ytouv/.source,/(?:colorkey|reset)mask|layer|mask(?:hs)?|merge|overlay|subtract/.source,/addborders|(?:bicubic|bilinear|blackman|gauss|lanczos4|lanczos|point|sinc|spline(?:16|36|64))resize|crop(?:bottom)?|flip(?:horizontal|vertical)|(?:horizontal|vertical)?reduceby2|letterbox|skewrows|turn(?:180|left|right)/.source,/blur|fixbrokenchromaupsampling|generalconvolution|(?:spatial|temporal)soften|sharpen/.source,/trim|(?:un)?alignedsplice|(?:assume|assumescaled|change|convert)FPS|(?:delete|duplicate)frame|dissolve|fade(?:in|io|out)[02]?|freezeframe|interleave|loop|reverse|select(?:even|odd|(?:range)?every)/.source,/assume[bt]ff|assume(?:field|frame)based|bob|complementparity|doubleweave|peculiarblend|pulldown|separate(?:columns|fields|rows)|swapfields|weave(?:columns|rows)?/.source,/amplify(?:db)?|assumesamplerate|audiodub(?:ex)?|audiotrim|convertaudioto(?:(?:8|16|24|32)bit|float)|converttomono|delayaudio|ensurevbrmp3sync|get(?:left|right)?channel|kill(?:audio|video)|mergechannels|mixaudio|monotostereo|normalize|resampleaudio|ssrc|supereq|timestretch/.source,/animate|applyrange|conditional(?:filter|reader|select)|frameevaluate|scriptclip|tcp(?:server|source)|writefile(?:end|if|start)?/.source,/imagewriter/.source,/blackness|blankclip|colorbars(?:hd)?|compare|dumpfiltergraph|echo|histogram|info|messageclip|preroll|setgraphanalysis|show(?:framenumber|smpte|time)|showfiveversions|stack(?:horizontal|vertical)|subtitle|tone|version/.source].join("|"),c=[i,s,l].join("|");n.languages.avisynth={comment:[{pattern:/(^|[^\\])\[\*(?:[^\[*]|\[(?!\*)|\*(?!\])|\[\*(?:[^\[*]|\[(?!\*)|\*(?!\]))*\*\])*\*\]/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0,greedy:!0}],argument:{pattern:a(/\b(?:<<0>>)\s+("?)\w+\1/.source,[o],"i"),inside:{keyword:/^\w+/}},"argument-label":{pattern:/([,(][\s\\]*)\w+\s*=(?!=)/,lookbehind:!0,inside:{"argument-name":{pattern:/^\w+/,alias:"punctuation"},punctuation:/=$/}},string:[{pattern:/"""[\s\S]*?"""/,greedy:!0},{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0,inside:{constant:{pattern:/\b(?:DEFAULT_MT_MODE|(?:MAINSCRIPT|PROGRAM|SCRIPT)DIR|(?:MACHINE|USER)_(?:CLASSIC|PLUS)_PLUGINS)\b/}}}],variable:/\b(?:last)\b/i,boolean:/\b(?:false|no|true|yes)\b/i,keyword:/\b(?:catch|else|for|function|global|if|return|try|while|__END__)\b/i,constant:/\bMT_(?:MULTI_INSTANCE|NICE_FILTER|SERIALIZED|SPECIAL_MT)\b/,"builtin-function":{pattern:a(/\b(?:<<0>>)\b/.source,[c],"i"),alias:"function"},"type-cast":{pattern:a(/\b(?:<<0>>)(?=\s*\()/.source,[o],"i"),alias:"keyword"},function:{pattern:/\b[a-z_]\w*(?=\s*\()|(\.)[a-z_]\w*\b/i,lookbehind:!0},"line-continuation":{pattern:/(^[ \t]*)\\|\\(?=[ \t]*$)/m,lookbehind:!0,alias:"punctuation"},number:/\B\$(?:[\da-f]{6}|[\da-f]{8})\b|(?:(?:\b|\B-)\d+(?:\.\d*)?\b|\B\.\d+\b)/i,operator:/\+\+?|[!=<>]=?|&&|\|\||[?:*/%-]/,punctuation:/[{}\[\]();,.]/},n.languages.avs=n.languages.avisynth})(t)}return Gy}var Wy,MI;function gbe(){if(MI)return Wy;MI=1,Wy=e,e.displayName="avroIdl",e.aliases=[];function e(t){t.languages["avro-idl"]={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},string:{pattern:/(^|[^\\])"(?:[^\r\n"\\]|\\.)*"/,lookbehind:!0,greedy:!0},annotation:{pattern:/@(?:[$\w.-]|`[^\r\n`]+`)+/,greedy:!0,alias:"function"},"function-identifier":{pattern:/`[^\r\n`]+`(?=\s*\()/,greedy:!0,alias:"function"},identifier:{pattern:/`[^\r\n`]+`/,greedy:!0},"class-name":{pattern:/(\b(?:enum|error|protocol|record|throws)\b\s+)[$\w]+/,lookbehind:!0,greedy:!0},keyword:/\b(?:array|boolean|bytes|date|decimal|double|enum|error|false|fixed|float|idl|import|int|local_timestamp_ms|long|map|null|oneway|protocol|record|schema|string|throws|time_ms|timestamp_ms|true|union|uuid|void)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:[{pattern:/(^|[^\w.])-?(?:(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|0x(?:[a-f0-9]+(?:\.[a-f0-9]*)?|\.[a-f0-9]+)(?:p[+-]?\d+)?)[dfl]?(?![\w.])/i,lookbehind:!0},/-?\b(?:Infinity|NaN)\b/],operator:/=/,punctuation:/[()\[\]{}<>.:,;-]/},t.languages.avdl=t.languages["avro-idl"]}return Wy}var Ky,PI;function az(){if(PI)return Ky;PI=1,Ky=e,e.displayName="bash",e.aliases=["shell"];function e(t){(function(n){var r="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",a={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},o={bash:a,environment:{pattern:RegExp("\\$"+r),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+r),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};n.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+r),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:o},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:a}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:o},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:o.entity}}],environment:{pattern:RegExp("\\$?"+r),alias:"constant"},variable:o.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},a.inside=n.languages.bash;for(var i=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],s=o.variable[1].inside,l=0;l?^\w +\-.])*"/,greedy:!0},number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,keyword:/\b(?:AS|BEEP|BLOAD|BSAVE|CALL(?: ABSOLUTE)?|CASE|CHAIN|CHDIR|CLEAR|CLOSE|CLS|COM|COMMON|CONST|DATA|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DIM|DO|DOUBLE|ELSE|ELSEIF|END|ENVIRON|ERASE|ERROR|EXIT|FIELD|FILES|FOR|FUNCTION|GET|GOSUB|GOTO|IF|INPUT|INTEGER|IOCTL|KEY|KILL|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|MKDIR|NAME|NEXT|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPTION BASE|OUT|POKE|PUT|READ|REDIM|REM|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SELECT CASE|SHARED|SHELL|SINGLE|SLEEP|STATIC|STEP|STOP|STRING|SUB|SWAP|SYSTEM|THEN|TIMER|TO|TROFF|TRON|TYPE|UNLOCK|UNTIL|USING|VIEW PRINT|WAIT|WEND|WHILE|WRITE)(?:\$|\b)/i,function:/\b(?:ABS|ACCESS|ACOS|ANGLE|AREA|ARITHMETIC|ARRAY|ASIN|ASK|AT|ATN|BASE|BEGIN|BREAK|CAUSE|CEIL|CHR|CLIP|COLLATE|COLOR|CON|COS|COSH|COT|CSC|DATE|DATUM|DEBUG|DECIMAL|DEF|DEG|DEGREES|DELETE|DET|DEVICE|DISPLAY|DOT|ELAPSED|EPS|ERASABLE|EXLINE|EXP|EXTERNAL|EXTYPE|FILETYPE|FIXED|FP|GO|GRAPH|HANDLER|IDN|IMAGE|IN|INT|INTERNAL|IP|IS|KEYED|LBOUND|LCASE|LEFT|LEN|LENGTH|LET|LINE|LINES|LOG|LOG10|LOG2|LTRIM|MARGIN|MAT|MAX|MAXNUM|MID|MIN|MISSING|MOD|NATIVE|NUL|NUMERIC|OF|OPTION|ORD|ORGANIZATION|OUTIN|OUTPUT|PI|POINT|POINTER|POINTS|POS|PRINT|PROGRAM|PROMPT|RAD|RADIANS|RANDOMIZE|RECORD|RECSIZE|RECTYPE|RELATIVE|REMAINDER|REPEAT|REST|RETRY|REWRITE|RIGHT|RND|ROUND|RTRIM|SAME|SEC|SELECT|SEQUENTIAL|SET|SETTER|SGN|SIN|SINH|SIZE|SKIP|SQR|STANDARD|STATUS|STR|STREAM|STYLE|TAB|TAN|TANH|TEMPLATE|TEXT|THERE|TIME|TIMEOUT|TRACE|TRANSFORM|TRUNCATE|UBOUND|UCASE|USE|VAL|VARIABLE|VIEWPORT|WHEN|WINDOW|WITH|ZER|ZONEWIDTH)(?:\$|\b)/i,operator:/<[=>]?|>=?|[+\-*\/^=&]|\b(?:AND|EQV|IMP|NOT|OR|XOR)\b/i,punctuation:/[,;:()]/}}return Yy}var Zy,FI;function mbe(){if(FI)return Zy;FI=1,Zy=e,e.displayName="batch",e.aliases=[];function e(t){(function(n){var r=/%%?[~:\w]+%?|!\S+!/,a={pattern:/\/[a-z?]+(?=[ :]|$):?|-[a-z]\b|--[a-z-]+\b/im,alias:"attr-name",inside:{punctuation:/:/}},o=/"(?:[\\"]"|[^"])*"(?!")/,i=/(?:\b|-)\d+\b/;n.languages.batch={comment:[/^::.*/m,{pattern:/((?:^|[&(])[ \t]*)rem\b(?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0}],label:{pattern:/^:.*/m,alias:"property"},command:[{pattern:/((?:^|[&(])[ \t]*)for(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* \S+ in \([^)]+\) do/im,lookbehind:!0,inside:{keyword:/\b(?:do|in)\b|^for\b/i,string:o,parameter:a,variable:r,number:i,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*)if(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:not )?(?:cmdextversion \d+|defined \w+|errorlevel \d+|exist \S+|(?:"[^"]*"|(?!")(?:(?!==)\S)+)?(?:==| (?:equ|geq|gtr|leq|lss|neq) )(?:"[^"]*"|[^\s"]\S*))/im,lookbehind:!0,inside:{keyword:/\b(?:cmdextversion|defined|errorlevel|exist|not)\b|^if\b/i,string:o,parameter:a,variable:r,number:i,operator:/\^|==|\b(?:equ|geq|gtr|leq|lss|neq)\b/i}},{pattern:/((?:^|[&()])[ \t]*)else\b/im,lookbehind:!0,inside:{keyword:/^else\b/i}},{pattern:/((?:^|[&(])[ \t]*)set(?: \/[a-z](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0,inside:{keyword:/^set\b/i,string:o,parameter:a,variable:[r,/\w+(?=(?:[*\/%+\-&^|]|<<|>>)?=)/],number:i,operator:/[*\/%+\-&^|]=?|<<=?|>>=?|[!~_=]/,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*@?)\w+\b(?:"(?:[\\"]"|[^"])*"(?!")|[^"^&)\r\n]|\^(?:\r\n|[\s\S]))*/m,lookbehind:!0,inside:{keyword:/^\w+\b/,string:o,parameter:a,label:{pattern:/(^\s*):\S+/m,lookbehind:!0,alias:"property"},variable:r,number:i,operator:/\^/}}],operator:/[&@]/,punctuation:/[()']/}})(t)}return Zy}var Xy,jI;function hbe(){if(jI)return Xy;jI=1,Xy=e,e.displayName="bbcode",e.aliases=["shortcode"];function e(t){t.languages.bbcode={tag:{pattern:/\[\/?[^\s=\]]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+))?(?:\s+[^\s=\]]+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+))*\s*\]/,inside:{tag:{pattern:/^\[\/?[^\s=\]]+/,inside:{punctuation:/^\[\/?/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+)/,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\]/,"attr-name":/[^\s=\]]+/}}},t.languages.shortcode=t.languages.bbcode}return Xy}var Qy,zI;function bbe(){if(zI)return Qy;zI=1,Qy=e,e.displayName="bicep",e.aliases=[];function e(t){t.languages.bicep={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],property:[{pattern:/([\r\n][ \t]*)[a-z_]\w*(?=[ \t]*:)/i,lookbehind:!0},{pattern:/([\r\n][ \t]*)'(?:\\.|\$(?!\{)|[^'\\\r\n$])*'(?=[ \t]*:)/,lookbehind:!0,greedy:!0}],string:[{pattern:/'''[^'][\s\S]*?'''/,greedy:!0},{pattern:/(^|[^\\'])'(?:\\.|\$(?!\{)|[^'\\\r\n$])*'/,lookbehind:!0,greedy:!0}],"interpolated-string":{pattern:/(^|[^\\'])'(?:\\.|\$(?:(?!\{)|\{[^{}\r\n]*\})|[^'\\\r\n$])*'/,lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/\$\{[^{}\r\n]*\}/,inside:{expression:{pattern:/(^\$\{)[\s\S]+(?=\}$)/,lookbehind:!0},punctuation:/^\$\{|\}$/}},string:/[\s\S]+/}},datatype:{pattern:/(\b(?:output|param)\b[ \t]+\w+[ \t]+)\w+\b/,lookbehind:!0,alias:"class-name"},boolean:/\b(?:false|true)\b/,keyword:/\b(?:existing|for|if|in|module|null|output|param|resource|targetScope|var)\b/,decorator:/@\w+\b/,function:/\b[a-z_]\w*(?=[ \t]*\()/i,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/,punctuation:/[{}[\];(),.:]/},t.languages.bicep["interpolated-string"].inside.interpolation.inside.expression.inside=t.languages.bicep}return Qy}var Jy,UI;function ybe(){if(UI)return Jy;UI=1,Jy=e,e.displayName="birb",e.aliases=[];function e(t){t.languages.birb=t.languages.extend("clike",{string:{pattern:/r?("|')(?:\\.|(?!\1)[^\\])*\1/,greedy:!0},"class-name":[/\b[A-Z](?:[\d_]*[a-zA-Z]\w*)?\b/,/\b(?:[A-Z]\w*|(?!(?:var|void)\b)[a-z]\w*)(?=\s+\w+\s*[;,=()])/],keyword:/\b(?:assert|break|case|class|const|default|else|enum|final|follows|for|grab|if|nest|new|next|noSeeb|return|static|switch|throw|var|void|while)\b/,operator:/\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?|:/,variable:/\b[a-z_]\w*\b/}),t.languages.insertBefore("birb","function",{metadata:{pattern:/<\w+>/,greedy:!0,alias:"symbol"}})}return Jy}var ev,BI;function vbe(){if(BI)return ev;BI=1;var e=Ws();ev=t,t.displayName="bison",t.aliases=[];function t(n){n.register(e),n.languages.bison=n.languages.extend("c",{}),n.languages.insertBefore("bison","comment",{bison:{pattern:/^(?:[^%]|%(?!%))*%%[\s\S]*?%%/,inside:{c:{pattern:/%\{[\s\S]*?%\}|\{(?:\{[^}]*\}|[^{}])*\}/,inside:{delimiter:{pattern:/^%?\{|%?\}$/,alias:"punctuation"},"bison-variable":{pattern:/[$@](?:<[^\s>]+>)?[\w$]+/,alias:"variable",inside:{punctuation:/<|>/}},rest:n.languages.c}},comment:n.languages.c.comment,string:n.languages.c.string,property:/\S+(?=:)/,keyword:/%\w+/,number:{pattern:/(^|[^@])\b(?:0x[\da-f]+|\d+)/i,lookbehind:!0},punctuation:/%[%?]|[|:;\[\]<>]/}}})}return ev}var tv,HI;function Sbe(){if(HI)return tv;HI=1,tv=e,e.displayName="bnf",e.aliases=["rbnf"];function e(t){t.languages.bnf={string:{pattern:/"[^\r\n"]*"|'[^\r\n']*'/},definition:{pattern:/<[^<>\r\n\t]+>(?=\s*::=)/,alias:["rule","keyword"],inside:{punctuation:/^<|>$/}},rule:{pattern:/<[^<>\r\n\t]+>/,inside:{punctuation:/^<|>$/}},operator:/::=|[|()[\]{}*+?]|\.{3}/},t.languages.rbnf=t.languages.bnf}return tv}var nv,VI;function wbe(){if(VI)return nv;VI=1,nv=e,e.displayName="brainfuck",e.aliases=[];function e(t){t.languages.brainfuck={pointer:{pattern:/<|>/,alias:"keyword"},increment:{pattern:/\+/,alias:"inserted"},decrement:{pattern:/-/,alias:"deleted"},branching:{pattern:/\[|\]/,alias:"important"},operator:/[.,]/,comment:/\S+/}}return nv}var rv,qI;function Ebe(){if(qI)return rv;qI=1,rv=e,e.displayName="brightscript",e.aliases=[];function e(t){t.languages.brightscript={comment:/(?:\brem|').*/i,"directive-statement":{pattern:/(^[\t ]*)#(?:const|else(?:[\t ]+if)?|end[\t ]+if|error|if).*/im,lookbehind:!0,alias:"property",inside:{"error-message":{pattern:/(^#error).+/,lookbehind:!0},directive:{pattern:/^#(?:const|else(?:[\t ]+if)?|end[\t ]+if|error|if)/,alias:"keyword"},expression:{pattern:/[\s\S]+/,inside:null}}},property:{pattern:/([\r\n{,][\t ]*)(?:(?!\d)\w+|"(?:[^"\r\n]|"")*"(?!"))(?=[ \t]*:)/,lookbehind:!0,greedy:!0},string:{pattern:/"(?:[^"\r\n]|"")*"(?!")/,greedy:!0},"class-name":{pattern:/(\bAs[\t ]+)\w+/i,lookbehind:!0},keyword:/\b(?:As|Dim|Each|Else|Elseif|End|Exit|For|Function|Goto|If|In|Print|Return|Step|Stop|Sub|Then|To|While)\b/i,boolean:/\b(?:false|true)\b/i,function:/\b(?!\d)\w+(?=[\t ]*\()/,number:/(?:\b\d+(?:\.\d+)?(?:[ed][+-]\d+)?|&h[a-f\d]+)\b[%&!#]?/i,operator:/--|\+\+|>>=?|<<=?|<>|[-+*/\\<>]=?|[:^=?]|\b(?:and|mod|not|or)\b/i,punctuation:/[.,;()[\]{}]/,constant:/\b(?:LINE_NUM)\b/i},t.languages.brightscript["directive-statement"].inside.expression.inside=t.languages.brightscript}return rv}var av,GI;function xbe(){if(GI)return av;GI=1,av=e,e.displayName="bro",e.aliases=[];function e(t){t.languages.bro={comment:{pattern:/(^|[^\\$])#.*/,lookbehind:!0,inside:{italic:/\b(?:FIXME|TODO|XXX)\b/}},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},boolean:/\b[TF]\b/,function:{pattern:/(\b(?:event|function|hook)[ \t]+)\w+(?:::\w+)?/,lookbehind:!0},builtin:/(?:@(?:load(?:-(?:plugin|sigs))?|unload|prefixes|ifn?def|else|(?:end)?if|DIR|FILENAME))|(?:&?(?:add_func|create_expire|default|delete_func|encrypt|error_handler|expire_func|group|log|mergeable|optional|persistent|priority|raw_output|read_expire|redef|rotate_interval|rotate_size|synchronized|type_column|write_expire))/,constant:{pattern:/(\bconst[ \t]+)\w+/i,lookbehind:!0},keyword:/\b(?:add|addr|alarm|any|bool|break|const|continue|count|delete|double|else|enum|event|export|file|for|function|global|hook|if|in|int|interval|local|module|next|of|opaque|pattern|port|print|record|return|schedule|set|string|subnet|table|time|timeout|using|vector|when)\b/,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&|\|\|?|\?|\*|\/|~|\^|%/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,punctuation:/[{}[\];(),.:]/}}return av}var ov,WI;function kbe(){if(WI)return ov;WI=1,ov=e,e.displayName="bsl",e.aliases=[];function e(t){t.languages.bsl={comment:/\/\/.*/,string:[{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},{pattern:/'(?:[^'\r\n\\]|\\.)*'/}],keyword:[{pattern:/(^|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:пока|для|новый|прервать|попытка|исключение|вызватьисключение|иначе|конецпопытки|неопределено|функция|перем|возврат|конецфункции|если|иначеесли|процедура|конецпроцедуры|тогда|знач|экспорт|конецесли|из|каждого|истина|ложь|по|цикл|конеццикла|выполнить)(?![\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])/i,lookbehind:!0},{pattern:/\b(?:break|do|each|else|elseif|enddo|endfunction|endif|endprocedure|endtry|except|execute|export|false|for|function|if|in|new|null|procedure|raise|return|then|to|true|try|undefined|val|var|while)\b/i}],number:{pattern:/(^(?=\d)|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?/i,lookbehind:!0},operator:[/[<>+\-*/]=?|[%=]/,{pattern:/(^|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:и|или|не)(?![\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])/i,lookbehind:!0},{pattern:/\b(?:and|not|or)\b/i}],punctuation:/\(\.|\.\)|[()\[\]:;,.]/,directive:[{pattern:/^([ \t]*)&.*/m,lookbehind:!0,greedy:!0,alias:"important"},{pattern:/^([ \t]*)#.*/gm,lookbehind:!0,greedy:!0,alias:"important"}]},t.languages.oscript=t.languages.bsl}return ov}var iv,KI;function Cbe(){if(KI)return iv;KI=1,iv=e,e.displayName="cfscript",e.aliases=[];function e(t){t.languages.cfscript=t.languages.extend("clike",{comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,inside:{annotation:{pattern:/(?:^|[^.])@[\w\.]+/,alias:"punctuation"}}},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],keyword:/\b(?:abstract|break|catch|component|continue|default|do|else|extends|final|finally|for|function|if|in|include|package|private|property|public|remote|required|rethrow|return|static|switch|throw|try|var|while|xml)\b(?!\s*=)/,operator:[/\+\+|--|&&|\|\||::|=>|[!=]==|<=?|>=?|[-+*/%&|^!=<>]=?|\?(?:\.|:)?|[?:]/,/\b(?:and|contains|eq|equal|eqv|gt|gte|imp|is|lt|lte|mod|not|or|xor)\b/],scope:{pattern:/\b(?:application|arguments|cgi|client|cookie|local|session|super|this|variables)\b/,alias:"global"},type:{pattern:/\b(?:any|array|binary|boolean|date|guid|numeric|query|string|struct|uuid|void|xml)\b/,alias:"builtin"}}),t.languages.insertBefore("cfscript","keyword",{"function-variable":{pattern:/[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"}}),delete t.languages.cfscript["class-name"],t.languages.cfc=t.languages.cfscript}return iv}var sv,YI;function _be(){if(YI)return sv;YI=1;var e=RA();sv=t,t.displayName="chaiscript",t.aliases=[];function t(n){n.register(e),n.languages.chaiscript=n.languages.extend("clike",{string:{pattern:/(^|[^\\])'(?:[^'\\]|\\[\s\S])*'/,lookbehind:!0,greedy:!0},"class-name":[{pattern:/(\bclass\s+)\w+/,lookbehind:!0},{pattern:/(\b(?:attr|def)\s+)\w+(?=\s*::)/,lookbehind:!0}],keyword:/\b(?:attr|auto|break|case|catch|class|continue|def|default|else|finally|for|fun|global|if|return|switch|this|try|var|while)\b/,number:[n.languages.cpp.number,/\b(?:Infinity|NaN)\b/],operator:/>>=?|<<=?|\|\||&&|:[:=]?|--|\+\+|[=!<>+\-*/%|&^]=?|[?~]|`[^`\r\n]{1,4}`/}),n.languages.insertBefore("chaiscript","operator",{"parameter-type":{pattern:/([,(]\s*)\w+(?=\s+\w)/,lookbehind:!0,alias:"class-name"}}),n.languages.insertBefore("chaiscript","string",{"string-interpolation":{pattern:/(^|[^\\])"(?:[^"$\\]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*"/,lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\}/,lookbehind:!0,inside:{"interpolation-expression":{pattern:/(^\$\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:n.languages.chaiscript},"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"}}},string:/[\s\S]+/}}})}return sv}var lv,ZI;function Abe(){if(ZI)return lv;ZI=1,lv=e,e.displayName="cil",e.aliases=[];function e(t){t.languages.cil={comment:/\/\/.*/,string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},directive:{pattern:/(^|\W)\.[a-z]+(?=\s)/,lookbehind:!0,alias:"class-name"},variable:/\[[\w\.]+\]/,keyword:/\b(?:abstract|ansi|assembly|auto|autochar|beforefieldinit|bool|bstr|byvalstr|catch|char|cil|class|currency|date|decimal|default|enum|error|explicit|extends|extern|famandassem|family|famorassem|final(?:ly)?|float32|float64|hidebysig|u?int(?:8|16|32|64)?|iant|idispatch|implements|import|initonly|instance|interface|iunknown|literal|lpstr|lpstruct|lptstr|lpwstr|managed|method|native(?:Type)?|nested|newslot|object(?:ref)?|pinvokeimpl|private|privatescope|public|reqsecobj|rtspecialname|runtime|sealed|sequential|serializable|specialname|static|string|struct|syschar|tbstr|unicode|unmanagedexp|unsigned|value(?:type)?|variant|virtual|void)\b/,function:/\b(?:(?:constrained|no|readonly|tail|unaligned|volatile)\.)?(?:conv\.(?:[iu][1248]?|ovf\.[iu][1248]?(?:\.un)?|r\.un|r4|r8)|ldc\.(?:i4(?:\.\d+|\.[mM]1|\.s)?|i8|r4|r8)|ldelem(?:\.[iu][1248]?|\.r[48]|\.ref|a)?|ldind\.(?:[iu][1248]?|r[48]|ref)|stelem\.?(?:i[1248]?|r[48]|ref)?|stind\.(?:i[1248]?|r[48]|ref)?|end(?:fault|filter|finally)|ldarg(?:\.[0-3s]|a(?:\.s)?)?|ldloc(?:\.\d+|\.s)?|sub(?:\.ovf(?:\.un)?)?|mul(?:\.ovf(?:\.un)?)?|add(?:\.ovf(?:\.un)?)?|stloc(?:\.[0-3s])?|refany(?:type|val)|blt(?:\.un)?(?:\.s)?|ble(?:\.un)?(?:\.s)?|bgt(?:\.un)?(?:\.s)?|bge(?:\.un)?(?:\.s)?|unbox(?:\.any)?|init(?:blk|obj)|call(?:i|virt)?|brfalse(?:\.s)?|bne\.un(?:\.s)?|ldloca(?:\.s)?|brzero(?:\.s)?|brtrue(?:\.s)?|brnull(?:\.s)?|brinst(?:\.s)?|starg(?:\.s)?|leave(?:\.s)?|shr(?:\.un)?|rem(?:\.un)?|div(?:\.un)?|clt(?:\.un)?|alignment|castclass|ldvirtftn|beq(?:\.s)?|ckfinite|ldsflda|ldtoken|localloc|mkrefany|rethrow|cgt\.un|arglist|switch|stsfld|sizeof|newobj|newarr|ldsfld|ldnull|ldflda|isinst|throw|stobj|stfld|ldstr|ldobj|ldlen|ldftn|ldfld|cpobj|cpblk|break|br\.s|xor|shl|ret|pop|not|nop|neg|jmp|dup|cgt|ceq|box|and|or|br)\b/,boolean:/\b(?:false|true)\b/,number:/\b-?(?:0x[0-9a-f]+|\d+)(?:\.[0-9a-f]+)?\b/i,punctuation:/[{}[\];(),:=]|IL_[0-9A-Za-z]+/}}return lv}var cv,XI;function Tbe(){if(XI)return cv;XI=1,cv=e,e.displayName="clojure",e.aliases=[];function e(t){t.languages.clojure={comment:{pattern:/;.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},char:/\\\w+/,symbol:{pattern:/(^|[\s()\[\]{},])::?[\w*+!?'<>=/.-]+/,lookbehind:!0},keyword:{pattern:/(\()(?:-|->|->>|\.|\.\.|\*|\/|\+|<|<=|=|==|>|>=|accessor|agent|agent-errors|aget|alength|all-ns|alter|and|append-child|apply|array-map|aset|aset-boolean|aset-byte|aset-char|aset-double|aset-float|aset-int|aset-long|aset-short|assert|assoc|await|await-for|bean|binding|bit-and|bit-not|bit-or|bit-shift-left|bit-shift-right|bit-xor|boolean|branch\?|butlast|byte|cast|char|children|class|clear-agent-errors|comment|commute|comp|comparator|complement|concat|cond|conj|cons|constantly|construct-proxy|contains\?|count|create-ns|create-struct|cycle|dec|declare|def|def-|definline|definterface|defmacro|defmethod|defmulti|defn|defn-|defonce|defproject|defprotocol|defrecord|defstruct|deftype|deref|difference|disj|dissoc|distinct|do|doall|doc|dorun|doseq|dosync|dotimes|doto|double|down|drop|drop-while|edit|end\?|ensure|eval|every\?|false\?|ffirst|file-seq|filter|find|find-doc|find-ns|find-var|first|float|flush|fn|fnseq|for|frest|gensym|get|get-proxy-class|hash-map|hash-set|identical\?|identity|if|if-let|if-not|import|in-ns|inc|index|insert-child|insert-left|insert-right|inspect-table|inspect-tree|instance\?|int|interleave|intersection|into|into-array|iterate|join|key|keys|keyword|keyword\?|last|lazy-cat|lazy-cons|left|lefts|let|line-seq|list|list\*|load|load-file|locking|long|loop|macroexpand|macroexpand-1|make-array|make-node|map|map-invert|map\?|mapcat|max|max-key|memfn|merge|merge-with|meta|min|min-key|monitor-enter|name|namespace|neg\?|new|newline|next|nil\?|node|not|not-any\?|not-every\?|not=|ns|ns-imports|ns-interns|ns-map|ns-name|ns-publics|ns-refers|ns-resolve|ns-unmap|nth|nthrest|or|parse|partial|path|peek|pop|pos\?|pr|pr-str|print|print-str|println|println-str|prn|prn-str|project|proxy|proxy-mappings|quot|quote|rand|rand-int|range|re-find|re-groups|re-matcher|re-matches|re-pattern|re-seq|read|read-line|recur|reduce|ref|ref-set|refer|rem|remove|remove-method|remove-ns|rename|rename-keys|repeat|replace|replicate|resolve|rest|resultset-seq|reverse|rfirst|right|rights|root|rrest|rseq|second|select|select-keys|send|send-off|seq|seq-zip|seq\?|set|set!|short|slurp|some|sort|sort-by|sorted-map|sorted-map-by|sorted-set|special-symbol\?|split-at|split-with|str|string\?|struct|struct-map|subs|subvec|symbol|symbol\?|sync|take|take-nth|take-while|test|throw|time|to-array|to-array-2d|tree-seq|true\?|try|union|up|update-proxy|val|vals|var|var-get|var-set|var\?|vector|vector-zip|vector\?|when|when-first|when-let|when-not|with-local-vars|with-meta|with-open|with-out-str|xml-seq|xml-zip|zero\?|zipmap|zipper)(?=[\s)]|$)/,lookbehind:!0},boolean:/\b(?:false|nil|true)\b/,number:{pattern:/(^|[^\w$@])(?:\d+(?:[/.]\d+)?(?:e[+-]?\d+)?|0x[a-f0-9]+|[1-9]\d?r[a-z0-9]+)[lmn]?(?![\w$@])/i,lookbehind:!0},function:{pattern:/((?:^|[^'])\()[\w*+!?'<>=/.-]+(?=[\s)]|$)/,lookbehind:!0},operator:/[#@^`~]/,punctuation:/[{}\[\](),]/}}return cv}var uv,QI;function Rbe(){if(QI)return uv;QI=1,uv=e,e.displayName="cmake",e.aliases=[];function e(t){t.languages.cmake={comment:/#.*/,string:{pattern:/"(?:[^\\"]|\\.)*"/,greedy:!0,inside:{interpolation:{pattern:/\$\{(?:[^{}$]|\$\{[^{}$]*\})*\}/,inside:{punctuation:/\$\{|\}/,variable:/\w+/}}}},variable:/\b(?:CMAKE_\w+|\w+_(?:(?:BINARY|SOURCE)_DIR|DESCRIPTION|HOMEPAGE_URL|ROOT|VERSION(?:_MAJOR|_MINOR|_PATCH|_TWEAK)?)|(?:ANDROID|APPLE|BORLAND|BUILD_SHARED_LIBS|CACHE|CPACK_(?:ABSOLUTE_DESTINATION_FILES|COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY|ERROR_ON_ABSOLUTE_INSTALL_DESTINATION|INCLUDE_TOPLEVEL_DIRECTORY|INSTALL_DEFAULT_DIRECTORY_PERMISSIONS|INSTALL_SCRIPT|PACKAGING_INSTALL_PREFIX|SET_DESTDIR|WARN_ON_ABSOLUTE_INSTALL_DESTINATION)|CTEST_(?:BINARY_DIRECTORY|BUILD_COMMAND|BUILD_NAME|BZR_COMMAND|BZR_UPDATE_OPTIONS|CHANGE_ID|CHECKOUT_COMMAND|CONFIGURATION_TYPE|CONFIGURE_COMMAND|COVERAGE_COMMAND|COVERAGE_EXTRA_FLAGS|CURL_OPTIONS|CUSTOM_(?:COVERAGE_EXCLUDE|ERROR_EXCEPTION|ERROR_MATCH|ERROR_POST_CONTEXT|ERROR_PRE_CONTEXT|MAXIMUM_FAILED_TEST_OUTPUT_SIZE|MAXIMUM_NUMBER_OF_(?:ERRORS|WARNINGS)|MAXIMUM_PASSED_TEST_OUTPUT_SIZE|MEMCHECK_IGNORE|POST_MEMCHECK|POST_TEST|PRE_MEMCHECK|PRE_TEST|TESTS_IGNORE|WARNING_EXCEPTION|WARNING_MATCH)|CVS_CHECKOUT|CVS_COMMAND|CVS_UPDATE_OPTIONS|DROP_LOCATION|DROP_METHOD|DROP_SITE|DROP_SITE_CDASH|DROP_SITE_PASSWORD|DROP_SITE_USER|EXTRA_COVERAGE_GLOB|GIT_COMMAND|GIT_INIT_SUBMODULES|GIT_UPDATE_CUSTOM|GIT_UPDATE_OPTIONS|HG_COMMAND|HG_UPDATE_OPTIONS|LABELS_FOR_SUBPROJECTS|MEMORYCHECK_(?:COMMAND|COMMAND_OPTIONS|SANITIZER_OPTIONS|SUPPRESSIONS_FILE|TYPE)|NIGHTLY_START_TIME|P4_CLIENT|P4_COMMAND|P4_OPTIONS|P4_UPDATE_OPTIONS|RUN_CURRENT_SCRIPT|SCP_COMMAND|SITE|SOURCE_DIRECTORY|SUBMIT_URL|SVN_COMMAND|SVN_OPTIONS|SVN_UPDATE_OPTIONS|TEST_LOAD|TEST_TIMEOUT|TRIGGER_SITE|UPDATE_COMMAND|UPDATE_OPTIONS|UPDATE_VERSION_ONLY|USE_LAUNCHERS)|CYGWIN|ENV|EXECUTABLE_OUTPUT_PATH|GHS-MULTI|IOS|LIBRARY_OUTPUT_PATH|MINGW|MSVC(?:10|11|12|14|60|70|71|80|90|_IDE|_TOOLSET_VERSION|_VERSION)?|MSYS|PROJECT_(?:BINARY_DIR|DESCRIPTION|HOMEPAGE_URL|NAME|SOURCE_DIR|VERSION|VERSION_(?:MAJOR|MINOR|PATCH|TWEAK))|UNIX|WIN32|WINCE|WINDOWS_PHONE|WINDOWS_STORE|XCODE|XCODE_VERSION))\b/,property:/\b(?:cxx_\w+|(?:ARCHIVE_OUTPUT_(?:DIRECTORY|NAME)|COMPILE_DEFINITIONS|COMPILE_PDB_NAME|COMPILE_PDB_OUTPUT_DIRECTORY|EXCLUDE_FROM_DEFAULT_BUILD|IMPORTED_(?:IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_LANGUAGES|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|NO_SONAME|OBJECTS|SONAME)|INTERPROCEDURAL_OPTIMIZATION|LIBRARY_OUTPUT_DIRECTORY|LIBRARY_OUTPUT_NAME|LINK_FLAGS|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|MAP_IMPORTED_CONFIG|OSX_ARCHITECTURES|OUTPUT_NAME|PDB_NAME|PDB_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_NAME|STATIC_LIBRARY_FLAGS|VS_CSHARP|VS_DOTNET_REFERENCEPROP|VS_DOTNET_REFERENCE|VS_GLOBAL_SECTION_POST|VS_GLOBAL_SECTION_PRE|VS_GLOBAL|XCODE_ATTRIBUTE)_\w+|\w+_(?:CLANG_TIDY|COMPILER_LAUNCHER|CPPCHECK|CPPLINT|INCLUDE_WHAT_YOU_USE|OUTPUT_NAME|POSTFIX|VISIBILITY_PRESET)|ABSTRACT|ADDITIONAL_MAKE_CLEAN_FILES|ADVANCED|ALIASED_TARGET|ALLOW_DUPLICATE_CUSTOM_TARGETS|ANDROID_(?:ANT_ADDITIONAL_OPTIONS|API|API_MIN|ARCH|ASSETS_DIRECTORIES|GUI|JAR_DEPENDENCIES|NATIVE_LIB_DEPENDENCIES|NATIVE_LIB_DIRECTORIES|PROCESS_MAX|PROGUARD|PROGUARD_CONFIG_PATH|SECURE_PROPS_PATH|SKIP_ANT_STEP|STL_TYPE)|ARCHIVE_OUTPUT_DIRECTORY|ATTACHED_FILES|ATTACHED_FILES_ON_FAIL|AUTOGEN_(?:BUILD_DIR|ORIGIN_DEPENDS|PARALLEL|SOURCE_GROUP|TARGETS_FOLDER|TARGET_DEPENDS)|AUTOMOC|AUTOMOC_(?:COMPILER_PREDEFINES|DEPEND_FILTERS|EXECUTABLE|MACRO_NAMES|MOC_OPTIONS|SOURCE_GROUP|TARGETS_FOLDER)|AUTORCC|AUTORCC_EXECUTABLE|AUTORCC_OPTIONS|AUTORCC_SOURCE_GROUP|AUTOUIC|AUTOUIC_EXECUTABLE|AUTOUIC_OPTIONS|AUTOUIC_SEARCH_PATHS|BINARY_DIR|BUILDSYSTEM_TARGETS|BUILD_RPATH|BUILD_RPATH_USE_ORIGIN|BUILD_WITH_INSTALL_NAME_DIR|BUILD_WITH_INSTALL_RPATH|BUNDLE|BUNDLE_EXTENSION|CACHE_VARIABLES|CLEAN_NO_CUSTOM|COMMON_LANGUAGE_RUNTIME|COMPATIBLE_INTERFACE_(?:BOOL|NUMBER_MAX|NUMBER_MIN|STRING)|COMPILE_(?:DEFINITIONS|FEATURES|FLAGS|OPTIONS|PDB_NAME|PDB_OUTPUT_DIRECTORY)|COST|CPACK_DESKTOP_SHORTCUTS|CPACK_NEVER_OVERWRITE|CPACK_PERMANENT|CPACK_STARTUP_SHORTCUTS|CPACK_START_MENU_SHORTCUTS|CPACK_WIX_ACL|CROSSCOMPILING_EMULATOR|CUDA_EXTENSIONS|CUDA_PTX_COMPILATION|CUDA_RESOLVE_DEVICE_SYMBOLS|CUDA_SEPARABLE_COMPILATION|CUDA_STANDARD|CUDA_STANDARD_REQUIRED|CXX_EXTENSIONS|CXX_STANDARD|CXX_STANDARD_REQUIRED|C_EXTENSIONS|C_STANDARD|C_STANDARD_REQUIRED|DEBUG_CONFIGURATIONS|DEFINE_SYMBOL|DEFINITIONS|DEPENDS|DEPLOYMENT_ADDITIONAL_FILES|DEPLOYMENT_REMOTE_DIRECTORY|DISABLED|DISABLED_FEATURES|ECLIPSE_EXTRA_CPROJECT_CONTENTS|ECLIPSE_EXTRA_NATURES|ENABLED_FEATURES|ENABLED_LANGUAGES|ENABLE_EXPORTS|ENVIRONMENT|EXCLUDE_FROM_ALL|EXCLUDE_FROM_DEFAULT_BUILD|EXPORT_NAME|EXPORT_PROPERTIES|EXTERNAL_OBJECT|EchoString|FAIL_REGULAR_EXPRESSION|FIND_LIBRARY_USE_LIB32_PATHS|FIND_LIBRARY_USE_LIB64_PATHS|FIND_LIBRARY_USE_LIBX32_PATHS|FIND_LIBRARY_USE_OPENBSD_VERSIONING|FIXTURES_CLEANUP|FIXTURES_REQUIRED|FIXTURES_SETUP|FOLDER|FRAMEWORK|Fortran_FORMAT|Fortran_MODULE_DIRECTORY|GENERATED|GENERATOR_FILE_NAME|GENERATOR_IS_MULTI_CONFIG|GHS_INTEGRITY_APP|GHS_NO_SOURCE_GROUP_FILE|GLOBAL_DEPENDS_DEBUG_MODE|GLOBAL_DEPENDS_NO_CYCLES|GNUtoMS|HAS_CXX|HEADER_FILE_ONLY|HELPSTRING|IMPLICIT_DEPENDS_INCLUDE_TRANSFORM|IMPORTED|IMPORTED_(?:COMMON_LANGUAGE_RUNTIME|CONFIGURATIONS|GLOBAL|IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_(?:LANGUAGES|LIBRARIES|MULTIPLICITY)|LOCATION|NO_SONAME|OBJECTS|SONAME)|IMPORT_PREFIX|IMPORT_SUFFIX|INCLUDE_DIRECTORIES|INCLUDE_REGULAR_EXPRESSION|INSTALL_NAME_DIR|INSTALL_RPATH|INSTALL_RPATH_USE_LINK_PATH|INTERFACE_(?:AUTOUIC_OPTIONS|COMPILE_DEFINITIONS|COMPILE_FEATURES|COMPILE_OPTIONS|INCLUDE_DIRECTORIES|LINK_DEPENDS|LINK_DIRECTORIES|LINK_LIBRARIES|LINK_OPTIONS|POSITION_INDEPENDENT_CODE|SOURCES|SYSTEM_INCLUDE_DIRECTORIES)|INTERPROCEDURAL_OPTIMIZATION|IN_TRY_COMPILE|IOS_INSTALL_COMBINED|JOB_POOLS|JOB_POOL_COMPILE|JOB_POOL_LINK|KEEP_EXTENSION|LABELS|LANGUAGE|LIBRARY_OUTPUT_DIRECTORY|LINKER_LANGUAGE|LINK_(?:DEPENDS|DEPENDS_NO_SHARED|DIRECTORIES|FLAGS|INTERFACE_LIBRARIES|INTERFACE_MULTIPLICITY|LIBRARIES|OPTIONS|SEARCH_END_STATIC|SEARCH_START_STATIC|WHAT_YOU_USE)|LISTFILE_STACK|LOCATION|MACOSX_BUNDLE|MACOSX_BUNDLE_INFO_PLIST|MACOSX_FRAMEWORK_INFO_PLIST|MACOSX_PACKAGE_LOCATION|MACOSX_RPATH|MACROS|MANUALLY_ADDED_DEPENDENCIES|MEASUREMENT|MODIFIED|NAME|NO_SONAME|NO_SYSTEM_FROM_IMPORTED|OBJECT_DEPENDS|OBJECT_OUTPUTS|OSX_ARCHITECTURES|OUTPUT_NAME|PACKAGES_FOUND|PACKAGES_NOT_FOUND|PARENT_DIRECTORY|PASS_REGULAR_EXPRESSION|PDB_NAME|PDB_OUTPUT_DIRECTORY|POSITION_INDEPENDENT_CODE|POST_INSTALL_SCRIPT|PREDEFINED_TARGETS_FOLDER|PREFIX|PRE_INSTALL_SCRIPT|PRIVATE_HEADER|PROCESSORS|PROCESSOR_AFFINITY|PROJECT_LABEL|PUBLIC_HEADER|REPORT_UNDEFINED_PROPERTIES|REQUIRED_FILES|RESOURCE|RESOURCE_LOCK|RULE_LAUNCH_COMPILE|RULE_LAUNCH_CUSTOM|RULE_LAUNCH_LINK|RULE_MESSAGES|RUNTIME_OUTPUT_DIRECTORY|RUN_SERIAL|SKIP_AUTOGEN|SKIP_AUTOMOC|SKIP_AUTORCC|SKIP_AUTOUIC|SKIP_BUILD_RPATH|SKIP_RETURN_CODE|SOURCES|SOURCE_DIR|SOVERSION|STATIC_LIBRARY_FLAGS|STATIC_LIBRARY_OPTIONS|STRINGS|SUBDIRECTORIES|SUFFIX|SYMBOLIC|TARGET_ARCHIVES_MAY_BE_SHARED_LIBS|TARGET_MESSAGES|TARGET_SUPPORTS_SHARED_LIBS|TESTS|TEST_INCLUDE_FILE|TEST_INCLUDE_FILES|TIMEOUT|TIMEOUT_AFTER_MATCH|TYPE|USE_FOLDERS|VALUE|VARIABLES|VERSION|VISIBILITY_INLINES_HIDDEN|VS_(?:CONFIGURATION_TYPE|COPY_TO_OUT_DIR|DEBUGGER_(?:COMMAND|COMMAND_ARGUMENTS|ENVIRONMENT|WORKING_DIRECTORY)|DEPLOYMENT_CONTENT|DEPLOYMENT_LOCATION|DOTNET_REFERENCES|DOTNET_REFERENCES_COPY_LOCAL|GLOBAL_KEYWORD|GLOBAL_PROJECT_TYPES|GLOBAL_ROOTNAMESPACE|INCLUDE_IN_VSIX|IOT_STARTUP_TASK|KEYWORD|RESOURCE_GENERATOR|SCC_AUXPATH|SCC_LOCALPATH|SCC_PROJECTNAME|SCC_PROVIDER|SDK_REFERENCES|SHADER_(?:DISABLE_OPTIMIZATIONS|ENABLE_DEBUG|ENTRYPOINT|FLAGS|MODEL|OBJECT_FILE_NAME|OUTPUT_HEADER_FILE|TYPE|VARIABLE_NAME)|STARTUP_PROJECT|TOOL_OVERRIDE|USER_PROPS|WINRT_COMPONENT|WINRT_EXTENSIONS|WINRT_REFERENCES|XAML_TYPE)|WILL_FAIL|WIN32_EXECUTABLE|WINDOWS_EXPORT_ALL_SYMBOLS|WORKING_DIRECTORY|WRAP_EXCLUDE|XCODE_(?:EMIT_EFFECTIVE_PLATFORM_NAME|EXPLICIT_FILE_TYPE|FILE_ATTRIBUTES|LAST_KNOWN_FILE_TYPE|PRODUCT_TYPE|SCHEME_(?:ADDRESS_SANITIZER|ADDRESS_SANITIZER_USE_AFTER_RETURN|ARGUMENTS|DISABLE_MAIN_THREAD_CHECKER|DYNAMIC_LIBRARY_LOADS|DYNAMIC_LINKER_API_USAGE|ENVIRONMENT|EXECUTABLE|GUARD_MALLOC|MAIN_THREAD_CHECKER_STOP|MALLOC_GUARD_EDGES|MALLOC_SCRIBBLE|MALLOC_STACK|THREAD_SANITIZER(?:_STOP)?|UNDEFINED_BEHAVIOUR_SANITIZER(?:_STOP)?|ZOMBIE_OBJECTS))|XCTEST)\b/,keyword:/\b(?:add_compile_definitions|add_compile_options|add_custom_command|add_custom_target|add_definitions|add_dependencies|add_executable|add_library|add_link_options|add_subdirectory|add_test|aux_source_directory|break|build_command|build_name|cmake_host_system_information|cmake_minimum_required|cmake_parse_arguments|cmake_policy|configure_file|continue|create_test_sourcelist|ctest_build|ctest_configure|ctest_coverage|ctest_empty_binary_directory|ctest_memcheck|ctest_read_custom_files|ctest_run_script|ctest_sleep|ctest_start|ctest_submit|ctest_test|ctest_update|ctest_upload|define_property|else|elseif|enable_language|enable_testing|endforeach|endfunction|endif|endmacro|endwhile|exec_program|execute_process|export|export_library_dependencies|file|find_file|find_library|find_package|find_path|find_program|fltk_wrap_ui|foreach|function|get_cmake_property|get_directory_property|get_filename_component|get_property|get_source_file_property|get_target_property|get_test_property|if|include|include_directories|include_external_msproject|include_guard|include_regular_expression|install|install_files|install_programs|install_targets|link_directories|link_libraries|list|load_cache|load_command|macro|make_directory|mark_as_advanced|math|message|option|output_required_files|project|qt_wrap_cpp|qt_wrap_ui|remove|remove_definitions|return|separate_arguments|set|set_directory_properties|set_property|set_source_files_properties|set_target_properties|set_tests_properties|site_name|source_group|string|subdir_depends|subdirs|target_compile_definitions|target_compile_features|target_compile_options|target_include_directories|target_link_directories|target_link_libraries|target_link_options|target_sources|try_compile|try_run|unset|use_mangled_mesa|utility_source|variable_requires|variable_watch|while|write_file)(?=\s*\()\b/,boolean:/\b(?:FALSE|OFF|ON|TRUE)\b/,namespace:/\b(?:INTERFACE|PRIVATE|PROPERTIES|PUBLIC|SHARED|STATIC|TARGET_OBJECTS)\b/,operator:/\b(?:AND|DEFINED|EQUAL|GREATER|LESS|MATCHES|NOT|OR|STREQUAL|STRGREATER|STRLESS|VERSION_EQUAL|VERSION_GREATER|VERSION_LESS)\b/,inserted:{pattern:/\b\w+::\w+\b/,alias:"class-name"},number:/\b\d+(?:\.\d+)*\b/,function:/\b[a-z_]\w*(?=\s*\()\b/i,punctuation:/[()>}]|\$[<{]/}}return uv}var dv,JI;function Nbe(){if(JI)return dv;JI=1,dv=e,e.displayName="cobol",e.aliases=[];function e(t){t.languages.cobol={comment:{pattern:/\*>.*|(^[ \t]*)\*.*/m,lookbehind:!0,greedy:!0},string:{pattern:/[xzgn]?(?:"(?:[^\r\n"]|"")*"(?!")|'(?:[^\r\n']|'')*'(?!'))/i,greedy:!0},level:{pattern:/(^[ \t]*)\d+\b/m,lookbehind:!0,greedy:!0,alias:"number"},"class-name":{pattern:/(\bpic(?:ture)?\s+)(?:(?:[-\w$/,:*+<>]|\.(?!\s|$))(?:\(\d+\))?)+/i,lookbehind:!0,inside:{number:{pattern:/(\()\d+/,lookbehind:!0},punctuation:/[()]/}},keyword:{pattern:/(^|[^\w-])(?:ABORT|ACCEPT|ACCESS|ADD|ADDRESS|ADVANCING|AFTER|ALIGNED|ALL|ALPHABET|ALPHABETIC|ALPHABETIC-LOWER|ALPHABETIC-UPPER|ALPHANUMERIC|ALPHANUMERIC-EDITED|ALSO|ALTER|ALTERNATE|ANY|ARE|AREA|AREAS|AS|ASCENDING|ASCII|ASSIGN|ASSOCIATED-DATA|ASSOCIATED-DATA-LENGTH|AT|ATTRIBUTE|AUTHOR|AUTO|AUTO-SKIP|BACKGROUND-COLOR|BACKGROUND-COLOUR|BASIS|BEEP|BEFORE|BEGINNING|BELL|BINARY|BIT|BLANK|BLINK|BLOCK|BOTTOM|BOUNDS|BY|BYFUNCTION|BYTITLE|CALL|CANCEL|CAPABLE|CCSVERSION|CD|CF|CH|CHAINING|CHANGED|CHANNEL|CHARACTER|CHARACTERS|CLASS|CLASS-ID|CLOCK-UNITS|CLOSE|CLOSE-DISPOSITION|COBOL|CODE|CODE-SET|COL|COLLATING|COLUMN|COM-REG|COMMA|COMMITMENT|COMMON|COMMUNICATION|COMP|COMP-1|COMP-2|COMP-3|COMP-4|COMP-5|COMPUTATIONAL|COMPUTATIONAL-1|COMPUTATIONAL-2|COMPUTATIONAL-3|COMPUTATIONAL-4|COMPUTATIONAL-5|COMPUTE|CONFIGURATION|CONTAINS|CONTENT|CONTINUE|CONTROL|CONTROL-POINT|CONTROLS|CONVENTION|CONVERTING|COPY|CORR|CORRESPONDING|COUNT|CRUNCH|CURRENCY|CURSOR|DATA|DATA-BASE|DATE|DATE-COMPILED|DATE-WRITTEN|DAY|DAY-OF-WEEK|DBCS|DE|DEBUG-CONTENTS|DEBUG-ITEM|DEBUG-LINE|DEBUG-NAME|DEBUG-SUB-1|DEBUG-SUB-2|DEBUG-SUB-3|DEBUGGING|DECIMAL-POINT|DECLARATIVES|DEFAULT|DEFAULT-DISPLAY|DEFINITION|DELETE|DELIMITED|DELIMITER|DEPENDING|DESCENDING|DESTINATION|DETAIL|DFHRESP|DFHVALUE|DISABLE|DISK|DISPLAY|DISPLAY-1|DIVIDE|DIVISION|DONTCARE|DOUBLE|DOWN|DUPLICATES|DYNAMIC|EBCDIC|EGCS|EGI|ELSE|EMI|EMPTY-CHECK|ENABLE|END|END-ACCEPT|END-ADD|END-CALL|END-COMPUTE|END-DELETE|END-DIVIDE|END-EVALUATE|END-IF|END-MULTIPLY|END-OF-PAGE|END-PERFORM|END-READ|END-RECEIVE|END-RETURN|END-REWRITE|END-SEARCH|END-START|END-STRING|END-SUBTRACT|END-UNSTRING|END-WRITE|ENDING|ENTER|ENTRY|ENTRY-PROCEDURE|ENVIRONMENT|EOL|EOP|EOS|ERASE|ERROR|ESCAPE|ESI|EVALUATE|EVENT|EVERY|EXCEPTION|EXCLUSIVE|EXHIBIT|EXIT|EXPORT|EXTEND|EXTENDED|EXTERNAL|FD|FILE|FILE-CONTROL|FILLER|FINAL|FIRST|FOOTING|FOR|FOREGROUND-COLOR|FOREGROUND-COLOUR|FROM|FULL|FUNCTION|FUNCTION-POINTER|FUNCTIONNAME|GENERATE|GIVING|GLOBAL|GO|GOBACK|GRID|GROUP|HEADING|HIGH-VALUE|HIGH-VALUES|HIGHLIGHT|I-O|I-O-CONTROL|ID|IDENTIFICATION|IF|IMPLICIT|IMPORT|IN|INDEX|INDEXED|INDICATE|INITIAL|INITIALIZE|INITIATE|INPUT|INPUT-OUTPUT|INSPECT|INSTALLATION|INTEGER|INTO|INVALID|INVOKE|IS|JUST|JUSTIFIED|KANJI|KEPT|KEY|KEYBOARD|LABEL|LANGUAGE|LAST|LB|LD|LEADING|LEFT|LEFTLINE|LENGTH|LENGTH-CHECK|LIBACCESS|LIBPARAMETER|LIBRARY|LIMIT|LIMITS|LINAGE|LINAGE-COUNTER|LINE|LINE-COUNTER|LINES|LINKAGE|LIST|LOCAL|LOCAL-STORAGE|LOCK|LONG-DATE|LONG-TIME|LOW-VALUE|LOW-VALUES|LOWER|LOWLIGHT|MEMORY|MERGE|MESSAGE|MMDDYYYY|MODE|MODULES|MORE-LABELS|MOVE|MULTIPLE|MULTIPLY|NAMED|NATIONAL|NATIONAL-EDITED|NATIVE|NEGATIVE|NETWORK|NEXT|NO|NO-ECHO|NULL|NULLS|NUMBER|NUMERIC|NUMERIC-DATE|NUMERIC-EDITED|NUMERIC-TIME|OBJECT-COMPUTER|OCCURS|ODT|OF|OFF|OMITTED|ON|OPEN|OPTIONAL|ORDER|ORDERLY|ORGANIZATION|OTHER|OUTPUT|OVERFLOW|OVERLINE|OWN|PACKED-DECIMAL|PADDING|PAGE|PAGE-COUNTER|PASSWORD|PERFORM|PF|PH|PIC|PICTURE|PLUS|POINTER|PORT|POSITION|POSITIVE|PRINTER|PRINTING|PRIVATE|PROCEDURE|PROCEDURE-POINTER|PROCEDURES|PROCEED|PROCESS|PROGRAM|PROGRAM-ID|PROGRAM-LIBRARY|PROMPT|PURGE|QUEUE|QUOTE|QUOTES|RANDOM|RD|READ|READER|REAL|RECEIVE|RECEIVED|RECORD|RECORDING|RECORDS|RECURSIVE|REDEFINES|REEL|REF|REFERENCE|REFERENCES|RELATIVE|RELEASE|REMAINDER|REMARKS|REMOTE|REMOVAL|REMOVE|RENAMES|REPLACE|REPLACING|REPORT|REPORTING|REPORTS|REQUIRED|RERUN|RESERVE|RESET|RETURN|RETURN-CODE|RETURNING|REVERSE-VIDEO|REVERSED|REWIND|REWRITE|RF|RH|RIGHT|ROUNDED|RUN|SAME|SAVE|SCREEN|SD|SEARCH|SECTION|SECURE|SECURITY|SEGMENT|SEGMENT-LIMIT|SELECT|SEND|SENTENCE|SEPARATE|SEQUENCE|SEQUENTIAL|SET|SHARED|SHAREDBYALL|SHAREDBYRUNUNIT|SHARING|SHIFT-IN|SHIFT-OUT|SHORT-DATE|SIGN|SIZE|SORT|SORT-CONTROL|SORT-CORE-SIZE|SORT-FILE-SIZE|SORT-MERGE|SORT-MESSAGE|SORT-MODE-SIZE|SORT-RETURN|SOURCE|SOURCE-COMPUTER|SPACE|SPACES|SPECIAL-NAMES|STANDARD|STANDARD-1|STANDARD-2|START|STATUS|STOP|STRING|SUB-QUEUE-1|SUB-QUEUE-2|SUB-QUEUE-3|SUBTRACT|SUM|SUPPRESS|SYMBOL|SYMBOLIC|SYNC|SYNCHRONIZED|TABLE|TALLY|TALLYING|TAPE|TASK|TERMINAL|TERMINATE|TEST|TEXT|THEN|THREAD|THREAD-LOCAL|THROUGH|THRU|TIME|TIMER|TIMES|TITLE|TO|TODAYS-DATE|TODAYS-NAME|TOP|TRAILING|TRUNCATED|TYPE|TYPEDEF|UNDERLINE|UNIT|UNSTRING|UNTIL|UP|UPON|USAGE|USE|USING|VALUE|VALUES|VARYING|VIRTUAL|WAIT|WHEN|WHEN-COMPILED|WITH|WORDS|WORKING-STORAGE|WRITE|YEAR|YYYYDDD|YYYYMMDD|ZERO-FILL|ZEROES|ZEROS)(?![\w-])/i,lookbehind:!0},boolean:{pattern:/(^|[^\w-])(?:false|true)(?![\w-])/i,lookbehind:!0},number:{pattern:/(^|[^\w-])(?:[+-]?(?:(?:\d+(?:[.,]\d+)?|[.,]\d+)(?:e[+-]?\d+)?|zero))(?![\w-])/i,lookbehind:!0},operator:[/<>|[<>]=?|[=+*/&]/,{pattern:/(^|[^\w-])(?:-|and|equal|greater|less|not|or|than)(?![\w-])/i,lookbehind:!0}],punctuation:/[.:,()]/}}return dv}var fv,eO;function Ibe(){if(eO)return fv;eO=1,fv=e,e.displayName="coffeescript",e.aliases=["coffee"];function e(t){(function(n){var r=/#(?!\{).+/,a={pattern:/#\{[^}]+\}/,alias:"variable"};n.languages.coffeescript=n.languages.extend("javascript",{comment:r,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:a}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),n.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:r,interpolation:a}}}),n.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:n.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:a}}]}),n.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete n.languages.coffeescript["template-string"],n.languages.coffee=n.languages.coffeescript})(t)}return fv}var pv,tO;function Obe(){if(tO)return pv;tO=1,pv=e,e.displayName="concurnas",e.aliases=["conc"];function e(t){t.languages.concurnas={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\/\/.*)/,lookbehind:!0,greedy:!0},langext:{pattern:/\b\w+\s*\|\|[\s\S]+?\|\|/,greedy:!0,inside:{"class-name":/^\w+/,string:{pattern:/(^\s*\|\|)[\s\S]+(?=\|\|$)/,lookbehind:!0},punctuation:/\|\|/}},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/,lookbehind:!0},keyword:/\b(?:abstract|actor|also|annotation|assert|async|await|bool|boolean|break|byte|case|catch|changed|char|class|closed|constant|continue|def|default|del|double|elif|else|enum|every|extends|false|finally|float|for|from|global|gpudef|gpukernel|if|import|in|init|inject|int|lambda|local|long|loop|match|new|nodefault|null|of|onchange|open|out|override|package|parfor|parforsync|post|pre|private|protected|provide|provider|public|return|shared|short|single|size_t|sizeof|super|sync|this|throw|trait|trans|transient|true|try|typedef|unchecked|using|val|var|void|while|with)\b/,boolean:/\b(?:false|true)\b/,number:/\b0b[01][01_]*L?\b|\b0x(?:[\da-f_]*\.)?[\da-f_p+-]+\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfls]?/i,punctuation:/[{}[\];(),.:]/,operator:/<==|>==|=>|->|<-|<>|&==|&<>|\?:?|\.\?|\+\+|--|[-+*/=<>]=?|[!^~]|\b(?:and|as|band|bor|bxor|comp|is|isnot|mod|or)\b=?/,annotation:{pattern:/@(?:\w+:)?(?:\w+|\[[^\]]+\])?/,alias:"builtin"}},t.languages.insertBefore("concurnas","langext",{"regex-literal":{pattern:/\br("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:t.languages.concurnas},regex:/[\s\S]+/}},"string-literal":{pattern:/(?:\B|\bs)("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:t.languages.concurnas},string:/[\s\S]+/}}}),t.languages.conc=t.languages.concurnas}return pv}var gv,nO;function Dbe(){if(nO)return gv;nO=1,gv=e,e.displayName="coq",e.aliases=[];function e(t){(function(n){for(var r=/\(\*(?:[^(*]|\((?!\*)|\*(?!\))|)*\*\)/.source,a=0;a<2;a++)r=r.replace(//g,function(){return r});r=r.replace(//g,"[]"),n.languages.coq={comment:RegExp(r),string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},attribute:[{pattern:RegExp(/#\[(?:[^\[\]("]|"(?:[^"]|"")*"(?!")|\((?!\*)|)*\]/.source.replace(//g,function(){return r})),greedy:!0,alias:"attr-name",inside:{comment:RegExp(r),string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},operator:/=/,punctuation:/^#\[|\]$|[,()]/}},{pattern:/\b(?:Cumulative|Global|Local|Monomorphic|NonCumulative|Polymorphic|Private|Program)\b/,alias:"attr-name"}],keyword:/\b(?:Abort|About|Add|Admit|Admitted|All|Arguments|As|Assumptions|Axiom|Axioms|Back|BackTo|Backtrace|BinOp|BinOpSpec|BinRel|Bind|Blacklist|Canonical|Case|Cd|Check|Class|Classes|Close|CoFixpoint|CoInductive|Coercion|Coercions|Collection|Combined|Compute|Conjecture|Conjectures|Constant|Constants|Constraint|Constructors|Context|Corollary|Create|CstOp|Custom|Cut|Debug|Declare|Defined|Definition|Delimit|Dependencies|Dependent|Derive|Diffs|Drop|Elimination|End|Entry|Equality|Eval|Example|Existential|Existentials|Existing|Export|Extern|Extraction|Fact|Fail|Field|File|Firstorder|Fixpoint|Flags|Focus|From|Funclass|Function|Functional|GC|Generalizable|Goal|Grab|Grammar|Graph|Guarded|Haskell|Heap|Hide|Hint|HintDb|Hints|Hypotheses|Hypothesis|IF|Identity|Immediate|Implicit|Implicits|Import|Include|Induction|Inductive|Infix|Info|Initial|InjTyp|Inline|Inspect|Instance|Instances|Intro|Intros|Inversion|Inversion_clear|JSON|Language|Left|Lemma|Let|Lia|Libraries|Library|Load|LoadPath|Locate|Ltac|Ltac2|ML|Match|Method|Minimality|Module|Modules|Morphism|Next|NoInline|Notation|Number|OCaml|Obligation|Obligations|Opaque|Open|Optimize|Parameter|Parameters|Parametric|Path|Paths|Prenex|Preterm|Primitive|Print|Profile|Projections|Proof|Prop|PropBinOp|PropOp|PropUOp|Property|Proposition|Pwd|Qed|Quit|Rec|Record|Recursive|Redirect|Reduction|Register|Relation|Remark|Remove|Require|Reserved|Reset|Resolve|Restart|Rewrite|Right|Ring|Rings|SProp|Saturate|Save|Scheme|Scope|Scopes|Search|SearchHead|SearchPattern|SearchRewrite|Section|Separate|Set|Setoid|Show|Signatures|Solve|Solver|Sort|Sortclass|Sorted|Spec|Step|Strategies|Strategy|String|Structure|SubClass|Subgraph|SuchThat|Tactic|Term|TestCompile|Theorem|Time|Timeout|To|Transparent|Type|Typeclasses|Types|Typing|UnOp|UnOpSpec|Undelimit|Undo|Unfocus|Unfocused|Unfold|Universe|Universes|Unshelve|Variable|Variables|Variant|Verbose|View|Visibility|Zify|_|apply|as|at|by|cofix|else|end|exists|exists2|fix|for|forall|fun|if|in|let|match|measure|move|removed|return|struct|then|using|wf|where|with)\b/,number:/\b(?:0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]+)?(?:p[+-]?\d[\d_]*)?|\d[\d_]*(?:\.[\d_]+)?(?:e[+-]?\d[\d_]*)?)\b/i,punct:{pattern:/@\{|\{\||\[=|:>/,alias:"punctuation"},operator:/\/\\|\\\/|\.{2,3}|:{1,2}=|\*\*|[-=]>|<(?:->?|[+:=>]|<:)|>(?:=|->)|\|[-|]?|[-!%&*+/<=>?@^~']/,punctuation:/\.\(|`\(|@\{|`\{|\{\||\[=|:>|[:.,;(){}\[\]]/}})(t)}return gv}var mv,rO;function Th(){if(rO)return mv;rO=1,mv=e,e.displayName="ruby",e.aliases=["rb"];function e(t){(function(n){n.languages.ruby=n.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===||[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),n.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var r={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:n.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete n.languages.ruby.function;var a="(?:"+[/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source].join("|")+")",o=/(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;n.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp(/%r/.source+a+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:r,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:r,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp(/(^|[^:]):/.source+o),lookbehind:!0,greedy:!0},{pattern:RegExp(/([\r\n{(,][ \t]*)/.source+o+/(?=:(?!:))/.source),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),n.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp(/%[qQiIwWs]?/.source+a),greedy:!0,inside:{interpolation:r,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:r,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:r,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp(/%x/.source+a),greedy:!0,inside:{interpolation:r,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:r,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete n.languages.ruby.string,n.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),n.languages.rb=n.languages.ruby})(t)}return mv}var hv,aO;function Lbe(){if(aO)return hv;aO=1;var e=Th();hv=t,t.displayName="crystal",t.aliases=[];function t(n){n.register(e),function(r){r.languages.crystal=r.languages.extend("ruby",{keyword:[/\b(?:__DIR__|__END_LINE__|__FILE__|__LINE__|abstract|alias|annotation|as|asm|begin|break|case|class|def|do|else|elsif|end|ensure|enum|extend|for|fun|if|ifdef|include|instance_sizeof|lib|macro|module|next|of|out|pointerof|private|protected|ptr|require|rescue|return|select|self|sizeof|struct|super|then|type|typeof|undef|uninitialized|union|unless|until|when|while|with|yield)\b/,{pattern:/(\.\s*)(?:is_a|responds_to)\?/,lookbehind:!0}],number:/\b(?:0b[01_]*[01]|0o[0-7_]*[0-7]|0x[\da-fA-F_]*[\da-fA-F]|(?:\d(?:[\d_]*\d)?)(?:\.[\d_]*\d)?(?:[eE][+-]?[\d_]*\d)?)(?:_(?:[uif](?:8|16|32|64))?)?\b/,operator:[/->/,r.languages.ruby.operator],punctuation:/[(){}[\].,;\\]/}),r.languages.insertBefore("crystal","string-literal",{attribute:{pattern:/@\[.*?\]/,inside:{delimiter:{pattern:/^@\[|\]$/,alias:"punctuation"},attribute:{pattern:/^(\s*)\w+/,lookbehind:!0,alias:"class-name"},args:{pattern:/\S(?:[\s\S]*\S)?/,inside:r.languages.crystal}}},expansion:{pattern:/\{(?:\{.*?\}|%.*?%)\}/,inside:{content:{pattern:/^(\{.)[\s\S]+(?=.\}$)/,lookbehind:!0,inside:r.languages.crystal},delimiter:{pattern:/^\{[\{%]|[\}%]\}$/,alias:"operator"}}},char:{pattern:/'(?:[^\\\r\n]{1,2}|\\(?:.|u(?:[A-Fa-f0-9]{1,4}|\{[A-Fa-f0-9]{1,6}\})))'/,greedy:!0}})}(n)}return hv}var bv,oO;function Mbe(){if(oO)return bv;oO=1;var e=Ah();bv=t,t.displayName="cshtml",t.aliases=["razor"];function t(n){n.register(e),function(r){var a=/\/(?![/*])|\/\/.*[\r\n]|\/\*[^*]*(?:\*(?!\/)[^*]*)*\*\//.source,o=/@(?!")|"(?:[^\r\n\\"]|\\.)*"|@"(?:[^\\"]|""|\\[\s\S])*"(?!")/.source+"|"+/'(?:(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'|(?=[^\\](?!')))/.source;function i(w,v){for(var h=0;h/g,function(){return"(?:"+w+")"});return w.replace(//g,"[^\\s\\S]").replace(//g,"(?:"+o+")").replace(//g,"(?:"+a+")")}var s=i(/\((?:[^()'"@/]|||)*\)/.source,2),l=i(/\[(?:[^\[\]'"@/]|||)*\]/.source,2),c=i(/\{(?:[^{}'"@/]|||)*\}/.source,2),u=i(/<(?:[^<>'"@/]|||)*>/.source,2),d=/(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?/.source,g=/(?!\d)[^\s>\/=$<%]+/.source+d+/\s*\/?>/.source,m=/\B@?/.source+"(?:"+/<([a-zA-Z][\w:]*)/.source+d+/\s*>/.source+"(?:"+(/[^<]/.source+"|"+/<\/?(?!\1\b)/.source+g+"|"+i(/<\1/.source+d+/\s*>/.source+"(?:"+(/[^<]/.source+"|"+/<\/?(?!\1\b)/.source+g+"|")+")*"+/<\/\1\s*>/.source,2))+")*"+/<\/\1\s*>/.source+"|"+/|\+|~|\|\|/,punctuation:/[(),]/}},n.languages.css.atrule.inside["selector-function-argument"].inside=a,n.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var o={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},i={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};n.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:o,number:i,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:o,number:i})})(t)}return vv}var Sv,lO;function Fbe(){if(lO)return Sv;lO=1,Sv=e,e.displayName="csv",e.aliases=[];function e(t){t.languages.csv={value:/[^\r\n,"]+|"(?:[^"]|"")*"(?!")/,punctuation:/,/}}return Sv}var wv,cO;function jbe(){if(cO)return wv;cO=1,wv=e,e.displayName="cypher",e.aliases=[];function e(t){t.languages.cypher={comment:/\/\/.*/,string:{pattern:/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/,greedy:!0},"class-name":{pattern:/(:\s*)(?:\w+|`(?:[^`\\\r\n])*`)(?=\s*[{):])/,lookbehind:!0,greedy:!0},relationship:{pattern:/(-\[\s*(?:\w+\s*|`(?:[^`\\\r\n])*`\s*)?:\s*|\|\s*:\s*)(?:\w+|`(?:[^`\\\r\n])*`)/,lookbehind:!0,greedy:!0,alias:"property"},identifier:{pattern:/`(?:[^`\\\r\n])*`/,greedy:!0},variable:/\$\w+/,keyword:/\b(?:ADD|ALL|AND|AS|ASC|ASCENDING|ASSERT|BY|CALL|CASE|COMMIT|CONSTRAINT|CONTAINS|CREATE|CSV|DELETE|DESC|DESCENDING|DETACH|DISTINCT|DO|DROP|ELSE|END|ENDS|EXISTS|FOR|FOREACH|IN|INDEX|IS|JOIN|KEY|LIMIT|LOAD|MANDATORY|MATCH|MERGE|NODE|NOT|OF|ON|OPTIONAL|OR|ORDER(?=\s+BY)|PERIODIC|REMOVE|REQUIRE|RETURN|SCALAR|SCAN|SET|SKIP|START|STARTS|THEN|UNION|UNIQUE|UNWIND|USING|WHEN|WHERE|WITH|XOR|YIELD)\b/i,function:/\b\w+\b(?=\s*\()/,boolean:/\b(?:false|null|true)\b/i,number:/\b(?:0x[\da-fA-F]+|\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)\b/,operator:/:|<--?|--?>?|<>|=~?|[<>]=?|[+*/%^|]|\.\.\.?/,punctuation:/[()[\]{},;.]/}}return wv}var Ev,uO;function zbe(){if(uO)return Ev;uO=1,Ev=e,e.displayName="d",e.aliases=[];function e(t){t.languages.d=t.languages.extend("clike",{comment:[{pattern:/^\s*#!.+/,greedy:!0},{pattern:RegExp(/(^|[^\\])/.source+"(?:"+[/\/\+(?:\/\+(?:[^+]|\+(?!\/))*\+\/|(?!\/\+)[\s\S])*?\+\//.source,/\/\/.*/.source,/\/\*[\s\S]*?\*\//.source].join("|")+")"),lookbehind:!0,greedy:!0}],string:[{pattern:RegExp([/\b[rx]"(?:\\[\s\S]|[^\\"])*"[cwd]?/.source,/\bq"(?:\[[\s\S]*?\]|\([\s\S]*?\)|<[\s\S]*?>|\{[\s\S]*?\})"/.source,/\bq"((?!\d)\w+)$[\s\S]*?^\1"/.source,/\bq"(.)[\s\S]*?\2"/.source,/(["`])(?:\\[\s\S]|(?!\3)[^\\])*\3[cwd]?/.source].join("|"),"m"),greedy:!0},{pattern:/\bq\{(?:\{[^{}]*\}|[^{}])*\}/,greedy:!0,alias:"token-string"}],keyword:/\$|\b(?:__(?:(?:DATE|EOF|FILE|FUNCTION|LINE|MODULE|PRETTY_FUNCTION|TIMESTAMP|TIME|VENDOR|VERSION)__|gshared|parameters|traits|vector)|abstract|alias|align|asm|assert|auto|body|bool|break|byte|case|cast|catch|cdouble|cent|cfloat|char|class|const|continue|creal|dchar|debug|default|delegate|delete|deprecated|do|double|dstring|else|enum|export|extern|false|final|finally|float|for|foreach|foreach_reverse|function|goto|idouble|if|ifloat|immutable|import|inout|int|interface|invariant|ireal|lazy|long|macro|mixin|module|new|nothrow|null|out|override|package|pragma|private|protected|ptrdiff_t|public|pure|real|ref|return|scope|shared|short|size_t|static|string|struct|super|switch|synchronized|template|this|throw|true|try|typedef|typeid|typeof|ubyte|ucent|uint|ulong|union|unittest|ushort|version|void|volatile|wchar|while|with|wstring)\b/,number:[/\b0x\.?[a-f\d_]+(?:(?!\.\.)\.[a-f\d_]*)?(?:p[+-]?[a-f\d_]+)?[ulfi]{0,4}/i,{pattern:/((?:\.\.)?)(?:\b0b\.?|\b|\.)\d[\d_]*(?:(?!\.\.)\.[\d_]*)?(?:e[+-]?\d[\d_]*)?[ulfi]{0,4}/i,lookbehind:!0}],operator:/\|[|=]?|&[&=]?|\+[+=]?|-[-=]?|\.?\.\.|=[>=]?|!(?:i[ns]\b|<>?=?|>=?|=)?|\bi[ns]\b|(?:<[<>]?|>>?>?|\^\^|[*\/%^~])=?/}),t.languages.insertBefore("d","string",{char:/'(?:\\(?:\W|\w+)|[^\\])'/}),t.languages.insertBefore("d","keyword",{property:/\B@\w*/}),t.languages.insertBefore("d","function",{register:{pattern:/\b(?:[ABCD][LHX]|E?(?:BP|DI|SI|SP)|[BS]PL|[ECSDGF]S|CR[0234]|[DS]IL|DR[012367]|E[ABCD]X|X?MM[0-7]|R(?:1[0-5]|[89])[BWD]?|R[ABCD]X|R[BS]P|R[DS]I|TR[3-7]|XMM(?:1[0-5]|[89])|YMM(?:1[0-5]|\d))\b|\bST(?:\([0-7]\)|\b)/,alias:"variable"}})}return Ev}var xv,dO;function Ube(){if(dO)return xv;dO=1,xv=e,e.displayName="dart",e.aliases=[];function e(t){(function(n){var r=[/\b(?:async|sync|yield)\*/,/\b(?:abstract|assert|async|await|break|case|catch|class|const|continue|covariant|default|deferred|do|dynamic|else|enum|export|extends|extension|external|factory|final|finally|for|get|hide|if|implements|import|in|interface|library|mixin|new|null|on|operator|part|rethrow|return|set|show|static|super|switch|sync|this|throw|try|typedef|var|void|while|with|yield)\b/],a=/(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,o={pattern:RegExp(a+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}}}};n.languages.dart=n.languages.extend("clike",{"class-name":[o,{pattern:RegExp(a+/[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source),lookbehind:!0,inside:o.inside}],keyword:r,operator:/\bis!|\b(?:as|is)\b|\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?/}),n.languages.insertBefore("dart","string",{"string-literal":{pattern:/r?(?:("""|''')[\s\S]*?\1|(["'])(?:\\.|(?!\2)[^\\\r\n])*\2(?!\2))/,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,lookbehind:!0,inside:{punctuation:/^\$\{?|\}$/,expression:{pattern:/[\s\S]+/,inside:n.languages.dart}}},string:/[\s\S]+/}},string:void 0}),n.languages.insertBefore("dart","class-name",{metadata:{pattern:/@\w+/,alias:"function"}}),n.languages.insertBefore("dart","class-name",{generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":o,keyword:r,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})})(t)}return xv}var kv,fO;function Bbe(){if(fO)return kv;fO=1,kv=e,e.displayName="dataweave",e.aliases=[];function e(t){(function(n){n.languages.dataweave={url:/\b[A-Za-z]+:\/\/[\w/:.?=&-]+|\burn:[\w:.?=&-]+/,property:{pattern:/(?:\b\w+#)?(?:"(?:\\.|[^\\"\r\n])*"|\b\w+)(?=\s*[:@])/,greedy:!0},string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},"mime-type":/\b(?:application|audio|image|multipart|text|video)\/[\w+-]+/,date:{pattern:/\|[\w:+-]+\|/,greedy:!0},comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],regex:{pattern:/\/(?:[^\\\/\r\n]|\\[^\r\n])+\//,greedy:!0},keyword:/\b(?:and|as|at|case|do|else|fun|if|input|is|match|not|ns|null|or|output|type|unless|update|using|var)\b/,function:/\b[A-Z_]\w*(?=\s*\()/i,number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\];(),.:@]/,operator:/<<|>>|->|[<>~=]=?|!=|--?-?|\+\+?|!|\?/,boolean:/\b(?:false|true)\b/}})(t)}return kv}var Cv,pO;function Hbe(){if(pO)return Cv;pO=1,Cv=e,e.displayName="dax",e.aliases=[];function e(t){t.languages.dax={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/).*)/,lookbehind:!0},"data-field":{pattern:/'(?:[^']|'')*'(?!')(?:\[[ \w\xA0-\uFFFF]+\])?|\w+\[[ \w\xA0-\uFFFF]+\]/,alias:"symbol"},measure:{pattern:/\[[ \w\xA0-\uFFFF]+\]/,alias:"constant"},string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},function:/\b(?:ABS|ACOS|ACOSH|ACOT|ACOTH|ADDCOLUMNS|ADDMISSINGITEMS|ALL|ALLCROSSFILTERED|ALLEXCEPT|ALLNOBLANKROW|ALLSELECTED|AND|APPROXIMATEDISTINCTCOUNT|ASIN|ASINH|ATAN|ATANH|AVERAGE|AVERAGEA|AVERAGEX|BETA\.DIST|BETA\.INV|BLANK|CALCULATE|CALCULATETABLE|CALENDAR|CALENDARAUTO|CEILING|CHISQ\.DIST|CHISQ\.DIST\.RT|CHISQ\.INV|CHISQ\.INV\.RT|CLOSINGBALANCEMONTH|CLOSINGBALANCEQUARTER|CLOSINGBALANCEYEAR|COALESCE|COMBIN|COMBINA|COMBINEVALUES|CONCATENATE|CONCATENATEX|CONFIDENCE\.NORM|CONFIDENCE\.T|CONTAINS|CONTAINSROW|CONTAINSSTRING|CONTAINSSTRINGEXACT|CONVERT|COS|COSH|COT|COTH|COUNT|COUNTA|COUNTAX|COUNTBLANK|COUNTROWS|COUNTX|CROSSFILTER|CROSSJOIN|CURRENCY|CURRENTGROUP|CUSTOMDATA|DATATABLE|DATE|DATEADD|DATEDIFF|DATESBETWEEN|DATESINPERIOD|DATESMTD|DATESQTD|DATESYTD|DATEVALUE|DAY|DEGREES|DETAILROWS|DISTINCT|DISTINCTCOUNT|DISTINCTCOUNTNOBLANK|DIVIDE|EARLIER|EARLIEST|EDATE|ENDOFMONTH|ENDOFQUARTER|ENDOFYEAR|EOMONTH|ERROR|EVEN|EXACT|EXCEPT|EXP|EXPON\.DIST|FACT|FALSE|FILTER|FILTERS|FIND|FIRSTDATE|FIRSTNONBLANK|FIRSTNONBLANKVALUE|FIXED|FLOOR|FORMAT|GCD|GENERATE|GENERATEALL|GENERATESERIES|GEOMEAN|GEOMEANX|GROUPBY|HASONEFILTER|HASONEVALUE|HOUR|IF|IF\.EAGER|IFERROR|IGNORE|INT|INTERSECT|ISBLANK|ISCROSSFILTERED|ISEMPTY|ISERROR|ISEVEN|ISFILTERED|ISINSCOPE|ISLOGICAL|ISNONTEXT|ISNUMBER|ISO\.CEILING|ISODD|ISONORAFTER|ISSELECTEDMEASURE|ISSUBTOTAL|ISTEXT|KEEPFILTERS|KEYWORDMATCH|LASTDATE|LASTNONBLANK|LASTNONBLANKVALUE|LCM|LEFT|LEN|LN|LOG|LOG10|LOOKUPVALUE|LOWER|MAX|MAXA|MAXX|MEDIAN|MEDIANX|MID|MIN|MINA|MINUTE|MINX|MOD|MONTH|MROUND|NATURALINNERJOIN|NATURALLEFTOUTERJOIN|NEXTDAY|NEXTMONTH|NEXTQUARTER|NEXTYEAR|NONVISUAL|NORM\.DIST|NORM\.INV|NORM\.S\.DIST|NORM\.S\.INV|NOT|NOW|ODD|OPENINGBALANCEMONTH|OPENINGBALANCEQUARTER|OPENINGBALANCEYEAR|OR|PARALLELPERIOD|PATH|PATHCONTAINS|PATHITEM|PATHITEMREVERSE|PATHLENGTH|PERCENTILE\.EXC|PERCENTILE\.INC|PERCENTILEX\.EXC|PERCENTILEX\.INC|PERMUT|PI|POISSON\.DIST|POWER|PREVIOUSDAY|PREVIOUSMONTH|PREVIOUSQUARTER|PREVIOUSYEAR|PRODUCT|PRODUCTX|QUARTER|QUOTIENT|RADIANS|RAND|RANDBETWEEN|RANK\.EQ|RANKX|RELATED|RELATEDTABLE|REMOVEFILTERS|REPLACE|REPT|RIGHT|ROLLUP|ROLLUPADDISSUBTOTAL|ROLLUPGROUP|ROLLUPISSUBTOTAL|ROUND|ROUNDDOWN|ROUNDUP|ROW|SAMEPERIODLASTYEAR|SAMPLE|SEARCH|SECOND|SELECTCOLUMNS|SELECTEDMEASURE|SELECTEDMEASUREFORMATSTRING|SELECTEDMEASURENAME|SELECTEDVALUE|SIGN|SIN|SINH|SQRT|SQRTPI|STARTOFMONTH|STARTOFQUARTER|STARTOFYEAR|STDEV\.P|STDEV\.S|STDEVX\.P|STDEVX\.S|SUBSTITUTE|SUBSTITUTEWITHINDEX|SUM|SUMMARIZE|SUMMARIZECOLUMNS|SUMX|SWITCH|T\.DIST|T\.DIST\.2T|T\.DIST\.RT|T\.INV|T\.INV\.2T|TAN|TANH|TIME|TIMEVALUE|TODAY|TOPN|TOPNPERLEVEL|TOPNSKIP|TOTALMTD|TOTALQTD|TOTALYTD|TREATAS|TRIM|TRUE|TRUNC|UNICHAR|UNICODE|UNION|UPPER|USERELATIONSHIP|USERNAME|USEROBJECTID|USERPRINCIPALNAME|UTCNOW|UTCTODAY|VALUE|VALUES|VAR\.P|VAR\.S|VARX\.P|VARX\.S|WEEKDAY|WEEKNUM|XIRR|XNPV|YEAR|YEARFRAC)(?=\s*\()/i,keyword:/\b(?:DEFINE|EVALUATE|MEASURE|ORDER\s+BY|RETURN|VAR|START\s+AT|ASC|DESC)\b/i,boolean:{pattern:/\b(?:FALSE|NULL|TRUE)\b/i,alias:"constant"},number:/\b\d+(?:\.\d*)?|\B\.\d+\b/,operator:/:=|[-+*\/=^]|&&?|\|\||<(?:=>?|<|>)?|>[>=]?|\b(?:IN|NOT)\b/i,punctuation:/[;\[\](){}`,.]/}}return Cv}var _v,gO;function Vbe(){if(gO)return _v;gO=1,_v=e,e.displayName="dhall",e.aliases=[];function e(t){t.languages.dhall={comment:/--.*|\{-(?:[^-{]|-(?!\})|\{(?!-)|\{-(?:[^-{]|-(?!\})|\{(?!-))*-\})*-\}/,string:{pattern:/"(?:[^"\\]|\\.)*"|''(?:[^']|'(?!')|'''|''\$\{)*''(?!'|\$)/,greedy:!0,inside:{interpolation:{pattern:/\$\{[^{}]*\}/,inside:{expression:{pattern:/(^\$\{)[\s\S]+(?=\}$)/,lookbehind:!0,alias:"language-dhall",inside:null},punctuation:/\$\{|\}/}}}},label:{pattern:/`[^`]*`/,greedy:!0},url:{pattern:/\bhttps?:\/\/[\w.:%!$&'*+;=@~-]+(?:\/[\w.:%!$&'*+;=@~-]*)*(?:\?[/?\w.:%!$&'*+;=@~-]*)?/,greedy:!0},env:{pattern:/\benv:(?:(?!\d)\w+|"(?:[^"\\=]|\\.)*")/,greedy:!0,inside:{function:/^env/,operator:/^:/,variable:/[\s\S]+/}},hash:{pattern:/\bsha256:[\da-fA-F]{64}\b/,inside:{function:/sha256/,operator:/:/,number:/[\da-fA-F]{64}/}},keyword:/\b(?:as|assert|else|forall|if|in|let|merge|missing|then|toMap|using|with)\b|\u2200/,builtin:/\b(?:None|Some)\b/,boolean:/\b(?:False|True)\b/,number:/\bNaN\b|-?\bInfinity\b|[+-]?\b(?:0x[\da-fA-F]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/,operator:/\/\\|\/\/\\\\|&&|\|\||===|[!=]=|\/\/|->|\+\+|::|[+*#@=:?<>|\\\u2227\u2a53\u2261\u2afd\u03bb\u2192]/,punctuation:/\.\.|[{}\[\](),./]/,"class-name":/\b[A-Z]\w*\b/},t.languages.dhall.string.inside.interpolation.inside.expression.inside=t.languages.dhall}return _v}var Av,mO;function qbe(){if(mO)return Av;mO=1,Av=e,e.displayName="diff",e.aliases=[];function e(t){(function(n){n.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var r={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(r).forEach(function(a){var o=r[a],i=[];/^\w+$/.test(a)||i.push(/\w+/.exec(a)[0]),a==="diff"&&i.push("bold"),n.languages.diff[a]={pattern:RegExp("^(?:["+o+`].*(?:\r -?| -|(?![\\s\\S])))+`,"m"),alias:i,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(a)[0]}}}}),Object.defineProperty(n.languages.diff,"PREFIXES",{value:r})})(t)}return Av}var Tv,hO;function mr(){if(hO)return Tv;hO=1,Tv=e,e.displayName="markupTemplating",e.aliases=[];function e(t){(function(n){function r(a,o){return"___"+a.toUpperCase()+o+"___"}Object.defineProperties(n.languages["markup-templating"]={},{buildPlaceholders:{value:function(a,o,i,s){if(a.language===o){var l=a.tokenStack=[];a.code=a.code.replace(i,function(c){if(typeof s=="function"&&!s(c))return c;for(var u=l.length,d;a.code.indexOf(d=r(o,u))!==-1;)++u;return l[u]=c,d}),a.grammar=n.languages.markup}}},tokenizePlaceholders:{value:function(a,o){if(a.language!==o||!a.tokenStack)return;a.grammar=n.languages[o];var i=0,s=Object.keys(a.tokenStack);function l(c){for(var u=0;u=s.length);u++){var d=c[u];if(typeof d=="string"||d.content&&typeof d.content=="string"){var g=s[i],m=a.tokenStack[g],b=typeof d=="string"?d:d.content,y=r(o,g),w=b.indexOf(y);if(w>-1){++i;var v=b.substring(0,w),h=new n.Token(o,n.tokenize(m,a.grammar),"language-"+o,m),S=b.substring(w+y.length),E=[];v&&E.push.apply(E,l([v])),E.push(h),S&&E.push.apply(E,l([S])),typeof d=="string"?c.splice.apply(c,[u,1].concat(E)):d.content=E}}else d.content&&l(d.content)}return c}l(a.tokens)}}})})(t)}return Tv}var Rv,bO;function Gbe(){if(bO)return Rv;bO=1;var e=mr();Rv=t,t.displayName="django",t.aliases=["jinja2"];function t(n){n.register(e),function(r){r.languages.django={comment:/^\{#[\s\S]*?#\}$/,tag:{pattern:/(^\{%[+-]?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%][+-]?|[+-]?[}%]\}$/,alias:"punctuation"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},filter:{pattern:/(\|)\w+/,lookbehind:!0,alias:"function"},test:{pattern:/(\bis\s+(?:not\s+)?)(?!not\b)\w+/,lookbehind:!0,alias:"function"},function:/\b[a-z_]\w+(?=\s*\()/i,keyword:/\b(?:and|as|by|else|for|if|import|in|is|loop|not|or|recursive|with|without)\b/,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,number:/\b\d+(?:\.\d+)?\b/,boolean:/[Ff]alse|[Nn]one|[Tt]rue/,variable:/\b\w+\b/,punctuation:/[{}[\](),.:;]/};var a=/\{\{[\s\S]*?\}\}|\{%[\s\S]*?%\}|\{#[\s\S]*?#\}/g,o=r.languages["markup-templating"];r.hooks.add("before-tokenize",function(i){o.buildPlaceholders(i,"django",a)}),r.hooks.add("after-tokenize",function(i){o.tokenizePlaceholders(i,"django")}),r.languages.jinja2=r.languages.django,r.hooks.add("before-tokenize",function(i){o.buildPlaceholders(i,"jinja2",a)}),r.hooks.add("after-tokenize",function(i){o.tokenizePlaceholders(i,"jinja2")})}(n)}return Rv}var Nv,yO;function Wbe(){if(yO)return Nv;yO=1,Nv=e,e.displayName="dnsZoneFile",e.aliases=[];function e(t){t.languages["dns-zone-file"]={comment:/;.*/,string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},variable:[{pattern:/(^\$ORIGIN[ \t]+)\S+/m,lookbehind:!0},{pattern:/(^|\s)@(?=\s|$)/,lookbehind:!0}],keyword:/^\$(?:INCLUDE|ORIGIN|TTL)(?=\s|$)/m,class:{pattern:/(^|\s)(?:CH|CS|HS|IN)(?=\s|$)/,lookbehind:!0,alias:"keyword"},type:{pattern:/(^|\s)(?:A|A6|AAAA|AFSDB|APL|ATMA|CAA|CDNSKEY|CDS|CERT|CNAME|DHCID|DLV|DNAME|DNSKEY|DS|EID|GID|GPOS|HINFO|HIP|IPSECKEY|ISDN|KEY|KX|LOC|MAILA|MAILB|MB|MD|MF|MG|MINFO|MR|MX|NAPTR|NB|NBSTAT|NIMLOC|NINFO|NS|NSAP|NSAP-PTR|NSEC|NSEC3|NSEC3PARAM|NULL|NXT|OPENPGPKEY|PTR|PX|RKEY|RP|RRSIG|RT|SIG|SINK|SMIMEA|SOA|SPF|SRV|SSHFP|TA|TKEY|TLSA|TSIG|TXT|UID|UINFO|UNSPEC|URI|WKS|X25)(?=\s|$)/,lookbehind:!0,alias:"keyword"},punctuation:/[()]/},t.languages["dns-zone"]=t.languages["dns-zone-file"]}return Nv}var Iv,vO;function Kbe(){if(vO)return Iv;vO=1,Iv=e,e.displayName="docker",e.aliases=["dockerfile"];function e(t){(function(n){var r=/\\[\r\n](?:\s|\\[\r\n]|#.*(?!.))*(?![\s#]|\\[\r\n])/.source,a=/(?:[ \t]+(?![ \t])(?:)?|)/.source.replace(//g,function(){return r}),o=/"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*"|'(?:[^'\\\r\n]|\\(?:\r\n|[\s\S]))*'/.source,i=/--[\w-]+=(?:|(?!["'])(?:[^\s\\]|\\.)+)/.source.replace(//g,function(){return o}),s={pattern:RegExp(o),greedy:!0},l={pattern:/(^[ \t]*)#.*/m,lookbehind:!0,greedy:!0};function c(u,d){return u=u.replace(//g,function(){return i}).replace(//g,function(){return a}),RegExp(u,d)}n.languages.docker={instruction:{pattern:/(^[ \t]*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)(?:\\.|[^\r\n\\])*(?:\\$(?:\s|#.*$)*(?![\s#])(?:\\.|[^\r\n\\])*)*/im,lookbehind:!0,greedy:!0,inside:{options:{pattern:c(/(^(?:ONBUILD)?\w+)(?:)*/.source,"i"),lookbehind:!0,greedy:!0,inside:{property:{pattern:/(^|\s)--[\w-]+/,lookbehind:!0},string:[s,{pattern:/(=)(?!["'])(?:[^\s\\]|\\.)+/,lookbehind:!0}],operator:/\\$/m,punctuation:/=/}},keyword:[{pattern:c(/(^(?:ONBUILD)?HEALTHCHECK(?:)*)(?:CMD|NONE)\b/.source,"i"),lookbehind:!0,greedy:!0},{pattern:c(/(^(?:ONBUILD)?FROM(?:)*(?!--)[^ \t\\]+)AS/.source,"i"),lookbehind:!0,greedy:!0},{pattern:c(/(^ONBUILD)\w+/.source,"i"),lookbehind:!0,greedy:!0},{pattern:/^\w+/,greedy:!0}],comment:l,string:s,variable:/\$(?:\w+|\{[^{}"'\\]*\})/,operator:/\\$/m}},comment:l},n.languages.dockerfile=n.languages.docker})(t)}return Iv}var Ov,SO;function Ybe(){if(SO)return Ov;SO=1,Ov=e,e.displayName="dot",e.aliases=["gv"];function e(t){(function(n){var r="(?:"+[/[a-zA-Z_\x80-\uFFFF][\w\x80-\uFFFF]*/.source,/-?(?:\.\d+|\d+(?:\.\d*)?)/.source,/"[^"\\]*(?:\\[\s\S][^"\\]*)*"/.source,/<(?:[^<>]|(?!)*>/.source].join("|")+")",a={markup:{pattern:/(^<)[\s\S]+(?=>$)/,lookbehind:!0,alias:["language-markup","language-html","language-xml"],inside:n.languages.markup}};function o(i,s){return RegExp(i.replace(//g,function(){return r}),s)}n.languages.dot={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\/|^#.*/m,greedy:!0},"graph-name":{pattern:o(/(\b(?:digraph|graph|subgraph)[ \t\r\n]+)/.source,"i"),lookbehind:!0,greedy:!0,alias:"class-name",inside:a},"attr-value":{pattern:o(/(=[ \t\r\n]*)/.source),lookbehind:!0,greedy:!0,inside:a},"attr-name":{pattern:o(/([\[;, \t\r\n])(?=[ \t\r\n]*=)/.source),lookbehind:!0,greedy:!0,inside:a},keyword:/\b(?:digraph|edge|graph|node|strict|subgraph)\b/i,"compass-point":{pattern:/(:[ \t\r\n]*)(?:[ewc_]|[ns][ew]?)(?![\w\x80-\uFFFF])/,lookbehind:!0,alias:"builtin"},node:{pattern:o(/(^|[^-.\w\x80-\uFFFF\\])/.source),lookbehind:!0,greedy:!0,inside:a},operator:/[=:]|-[->]/,punctuation:/[\[\]{};,]/},n.languages.gv=n.languages.dot})(t)}return Ov}var Dv,wO;function Zbe(){if(wO)return Dv;wO=1,Dv=e,e.displayName="ebnf",e.aliases=[];function e(t){t.languages.ebnf={comment:/\(\*[\s\S]*?\*\)/,string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,greedy:!0},special:{pattern:/\?[^?\r\n]*\?/,greedy:!0,alias:"class-name"},definition:{pattern:/^([\t ]*)[a-z]\w*(?:[ \t]+[a-z]\w*)*(?=\s*=)/im,lookbehind:!0,alias:["rule","keyword"]},rule:/\b[a-z]\w*(?:[ \t]+[a-z]\w*)*\b/i,punctuation:/\([:/]|[:/]\)|[.,;()[\]{}]/,operator:/[-=|*/!]/}}return Dv}var Lv,EO;function Xbe(){if(EO)return Lv;EO=1,Lv=e,e.displayName="editorconfig",e.aliases=[];function e(t){t.languages.editorconfig={comment:/[;#].*/,section:{pattern:/(^[ \t]*)\[.+\]/m,lookbehind:!0,alias:"selector",inside:{regex:/\\\\[\[\]{},!?.*]/,operator:/[!?]|\.\.|\*{1,2}/,punctuation:/[\[\]{},]/}},key:{pattern:/(^[ \t]*)[^\s=]+(?=[ \t]*=)/m,lookbehind:!0,alias:"attr-name"},value:{pattern:/=.*/,alias:"attr-value",inside:{punctuation:/^=/}}}}return Lv}var Mv,xO;function Qbe(){if(xO)return Mv;xO=1,Mv=e,e.displayName="eiffel",e.aliases=[];function e(t){t.languages.eiffel={comment:/--.*/,string:[{pattern:/"([^[]*)\[[\s\S]*?\]\1"/,greedy:!0},{pattern:/"([^{]*)\{[\s\S]*?\}\1"/,greedy:!0},{pattern:/"(?:%(?:(?!\n)\s)*\n\s*%|%\S|[^%"\r\n])*"/,greedy:!0}],char:/'(?:%.|[^%'\r\n])+'/,keyword:/\b(?:across|agent|alias|all|and|as|assign|attached|attribute|check|class|convert|create|Current|debug|deferred|detachable|do|else|elseif|end|ensure|expanded|export|external|feature|from|frozen|if|implies|inherit|inspect|invariant|like|local|loop|not|note|obsolete|old|once|or|Precursor|redefine|rename|require|rescue|Result|retry|select|separate|some|then|undefine|until|variant|Void|when|xor)\b/i,boolean:/\b(?:False|True)\b/i,"class-name":/\b[A-Z][\dA-Z_]*\b/,number:[/\b0[xcb][\da-f](?:_*[\da-f])*\b/i,/(?:\b\d(?:_*\d)*)?\.(?:(?:\d(?:_*\d)*)?e[+-]?)?\d(?:_*\d)*\b|\b\d(?:_*\d)*\b\.?/i],punctuation:/:=|<<|>>|\(\||\|\)|->|\.(?=\w)|[{}[\];(),:?]/,operator:/\\\\|\|\.\.\||\.\.|\/[~\/=]?|[><]=?|[-+*^=~]/}}return Mv}var Pv,kO;function Jbe(){if(kO)return Pv;kO=1;var e=mr();Pv=t,t.displayName="ejs",t.aliases=["eta"];function t(n){n.register(e),function(r){r.languages.ejs={delimiter:{pattern:/^<%[-_=]?|[-_]?%>$/,alias:"punctuation"},comment:/^#[\s\S]*/,"language-javascript":{pattern:/[\s\S]+/,inside:r.languages.javascript}},r.hooks.add("before-tokenize",function(a){var o=/<%(?!%)[\s\S]+?%>/g;r.languages["markup-templating"].buildPlaceholders(a,"ejs",o)}),r.hooks.add("after-tokenize",function(a){r.languages["markup-templating"].tokenizePlaceholders(a,"ejs")}),r.languages.eta=r.languages.ejs}(n)}return Pv}var $v,CO;function eye(){if(CO)return $v;CO=1,$v=e,e.displayName="elixir",e.aliases=[];function e(t){t.languages.elixir={doc:{pattern:/@(?:doc|moduledoc)\s+(?:("""|''')[\s\S]*?\1|("|')(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2)/,inside:{attribute:/^@\w+/,string:/['"][\s\S]+/}},comment:{pattern:/#.*/,greedy:!0},regex:{pattern:/~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,greedy:!0},string:[{pattern:/~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,greedy:!0,inside:{}},{pattern:/("""|''')[\s\S]*?\1/,greedy:!0,inside:{}},{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{}}],atom:{pattern:/(^|[^:]):\w+/,lookbehind:!0,alias:"symbol"},module:{pattern:/\b[A-Z]\w*\b/,alias:"class-name"},"attr-name":/\b\w+\??:(?!:)/,argument:{pattern:/(^|[^&])&\d+/,lookbehind:!0,alias:"variable"},attribute:{pattern:/@\w+/,alias:"variable"},function:/\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|(?=\/\d))/,number:/\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,keyword:/\b(?:after|alias|and|case|catch|cond|def(?:callback|delegate|exception|impl|macro|module|n|np|p|protocol|struct)?|do|else|end|fn|for|if|import|not|or|quote|raise|require|rescue|try|unless|unquote|use|when)\b/,boolean:/\b(?:false|nil|true)\b/,operator:[/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\[\]{}()]/},t.languages.elixir.string.forEach(function(n){n.inside={interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:t.languages.elixir}}}})}return $v}var Fv,_O;function tye(){if(_O)return Fv;_O=1,Fv=e,e.displayName="elm",e.aliases=[];function e(t){t.languages.elm={comment:/--.*|\{-[\s\S]*?-\}/,char:{pattern:/'(?:[^\\'\r\n]|\\(?:[abfnrtv\\']|\d+|x[0-9a-fA-F]+|u\{[0-9a-fA-F]+\}))'/,greedy:!0},string:[{pattern:/"""[\s\S]*?"""/,greedy:!0},{pattern:/"(?:[^\\"\r\n]|\\.)*"/,greedy:!0}],"import-statement":{pattern:/(^[\t ]*)import\s+[A-Z]\w*(?:\.[A-Z]\w*)*(?:\s+as\s+(?:[A-Z]\w*)(?:\.[A-Z]\w*)*)?(?:\s+exposing\s+)?/m,lookbehind:!0,inside:{keyword:/\b(?:as|exposing|import)\b/}},keyword:/\b(?:alias|as|case|else|exposing|if|in|infixl|infixr|let|module|of|then|type)\b/,builtin:/\b(?:abs|acos|always|asin|atan|atan2|ceiling|clamp|compare|cos|curry|degrees|e|flip|floor|fromPolar|identity|isInfinite|isNaN|logBase|max|min|negate|never|not|pi|radians|rem|round|sin|sqrt|tan|toFloat|toPolar|toString|truncate|turns|uncurry|xor)\b/,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0x[0-9a-f]+)\b/i,operator:/\s\.\s|[+\-/*=.$<>:&|^?%#@~!]{2,}|[+\-/*=$<>:&|^?%#@~!]/,hvariable:/\b(?:[A-Z]\w*\.)*[a-z]\w*\b/,constant:/\b(?:[A-Z]\w*\.)*[A-Z]\w*\b/,punctuation:/[{}[\]|(),.:]/}}return Fv}var jv,AO;function nye(){if(AO)return jv;AO=1;var e=Th(),t=mr();jv=n,n.displayName="erb",n.aliases=[];function n(r){r.register(e),r.register(t),function(a){a.languages.erb={delimiter:{pattern:/^(\s*)<%=?|%>(?=\s*$)/,lookbehind:!0,alias:"punctuation"},ruby:{pattern:/\s*\S[\s\S]*/,alias:"language-ruby",inside:a.languages.ruby}},a.hooks.add("before-tokenize",function(o){var i=/<%=?(?:[^\r\n]|[\r\n](?!=begin)|[\r\n]=begin\s(?:[^\r\n]|[\r\n](?!=end))*[\r\n]=end)+?%>/g;a.languages["markup-templating"].buildPlaceholders(o,"erb",i)}),a.hooks.add("after-tokenize",function(o){a.languages["markup-templating"].tokenizePlaceholders(o,"erb")})}(r)}return jv}var zv,TO;function rye(){if(TO)return zv;TO=1,zv=e,e.displayName="erlang",e.aliases=[];function e(t){t.languages.erlang={comment:/%.+/,string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},"quoted-function":{pattern:/'(?:\\.|[^\\'\r\n])+'(?=\()/,alias:"function"},"quoted-atom":{pattern:/'(?:\\.|[^\\'\r\n])+'/,alias:"atom"},boolean:/\b(?:false|true)\b/,keyword:/\b(?:after|case|catch|end|fun|if|of|receive|try|when)\b/,number:[/\$\\?./,/\b\d+#[a-z0-9]+/i,/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i],function:/\b[a-z][\w@]*(?=\()/,variable:{pattern:/(^|[^@])(?:\b|\?)[A-Z_][\w@]*/,lookbehind:!0},operator:[/[=\/<>:]=|=[:\/]=|\+\+?|--?|[=*\/!]|\b(?:and|andalso|band|bnot|bor|bsl|bsr|bxor|div|not|or|orelse|rem|xor)\b/,{pattern:/(^|[^<])<(?!<)/,lookbehind:!0},{pattern:/(^|[^>])>(?!>)/,lookbehind:!0}],atom:/\b[a-z][\w@]*/,punctuation:/[()[\]{}:;,.#|]|<<|>>/}}return zv}var Uv,RO;function iz(){if(RO)return Uv;RO=1,Uv=e,e.displayName="lua",e.aliases=[];function e(t){t.languages.lua={comment:/^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,greedy:!0},number:/\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,keyword:/\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,function:/(?!\d)\w+(?=\s*(?:[({]))/,operator:[/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\.\.(?!\.)/,lookbehind:!0}],punctuation:/[\[\](){},;]|\.+|:+/}}return Uv}var Bv,NO;function aye(){if(NO)return Bv;NO=1;var e=iz(),t=mr();Bv=n,n.displayName="etlua",n.aliases=[];function n(r){r.register(e),r.register(t),function(a){a.languages.etlua={delimiter:{pattern:/^<%[-=]?|-?%>$/,alias:"punctuation"},"language-lua":{pattern:/[\s\S]+/,inside:a.languages.lua}},a.hooks.add("before-tokenize",function(o){var i=/<%[\s\S]+?%>/g;a.languages["markup-templating"].buildPlaceholders(o,"etlua",i)}),a.hooks.add("after-tokenize",function(o){a.languages["markup-templating"].tokenizePlaceholders(o,"etlua")})}(r)}return Bv}var Hv,IO;function oye(){if(IO)return Hv;IO=1,Hv=e,e.displayName="excelFormula",e.aliases=[];function e(t){t.languages["excel-formula"]={comment:{pattern:/(\bN\(\s*)"(?:[^"]|"")*"(?=\s*\))/i,lookbehind:!0,greedy:!0},string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},reference:{pattern:/(?:'[^']*'|(?:[^\s()[\]{}<>*?"';,$&]*\[[^^\s()[\]{}<>*?"']+\])?\w+)!/,greedy:!0,alias:"string",inside:{operator:/!$/,punctuation:/'/,sheet:{pattern:/[^[\]]+$/,alias:"function"},file:{pattern:/\[[^[\]]+\]$/,inside:{punctuation:/[[\]]/}},path:/[\s\S]+/}},"function-name":{pattern:/\b[A-Z]\w*(?=\()/i,alias:"keyword"},range:{pattern:/\$?\b(?:[A-Z]+\$?\d+:\$?[A-Z]+\$?\d+|[A-Z]+:\$?[A-Z]+|\d+:\$?\d+)\b/i,alias:"property",inside:{operator:/:/,cell:/\$?[A-Z]+\$?\d+/i,column:/\$?[A-Z]+/i,row:/\$?\d+/}},cell:{pattern:/\b[A-Z]+\d+\b|\$[A-Za-z]+\$?\d+\b|\b[A-Za-z]+\$\d+\b/,alias:"property"},number:/(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?\b/i,boolean:/\b(?:FALSE|TRUE)\b/i,operator:/[-+*/^%=&,]|<[=>]?|>=?/,punctuation:/[[\]();{}|]/},t.languages.xlsx=t.languages.xls=t.languages["excel-formula"]}return Hv}var Vv,OO;function iye(){if(OO)return Vv;OO=1,Vv=e,e.displayName="factor",e.aliases=[];function e(t){(function(n){var r={function:/\b(?:BUGS?|FIX(?:MES?)?|NOTES?|TODOS?|XX+|HACKS?|WARN(?:ING)?|\?{2,}|!{2,})\b/},a={number:/\\[^\s']|%\w/},o={comment:[{pattern:/(^|\s)(?:! .*|!$)/,lookbehind:!0,inside:r},{pattern:/(^|\s)\/\*\s[\s\S]*?\*\/(?=\s|$)/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|\s)!\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,lookbehind:!0,greedy:!0,inside:r}],number:[{pattern:/(^|\s)[+-]?\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?0(?:b[01]+|o[0-7]+|d\d+|x[\dA-F]+)(?=\s|$)/i,lookbehind:!0},{pattern:/(^|\s)[+-]?\d+\/\d+\.?(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)\+?\d+\+\d+\/\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)-\d+-\d+\/\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?(?:\d*\.\d+|\d+\.\d*|\d+)(?:e[+-]?\d+)?(?=\s|$)/i,lookbehind:!0},{pattern:/(^|\s)NAN:\s+[\da-fA-F]+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?0(?:b1\.[01]*|o1\.[0-7]*|d1\.\d*|x1\.[\dA-F]*)p\d+(?=\s|$)/i,lookbehind:!0}],regexp:{pattern:/(^|\s)R\/\s(?:\\\S|[^\\/])*\/(?:[idmsr]*|[idmsr]+-[idmsr]+)(?=\s|$)/,lookbehind:!0,alias:"number",inside:{variable:/\\\S/,keyword:/[+?*\[\]^$(){}.|]/,operator:{pattern:/(\/)[idmsr]+(?:-[idmsr]+)?/,lookbehind:!0}}},boolean:{pattern:/(^|\s)[tf](?=\s|$)/,lookbehind:!0},"custom-string":{pattern:/(^|\s)[A-Z0-9\-]+"\s(?:\\\S|[^"\\])*"/,lookbehind:!0,greedy:!0,alias:"string",inside:{number:/\\\S|%\w|\//}},"multiline-string":[{pattern:/(^|\s)STRING:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*;(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:{number:a.number,"semicolon-or-setlocal":{pattern:/([\r\n][ \t]*);(?=\s|$)/,lookbehind:!0,alias:"function"}}},{pattern:/(^|\s)HEREDOC:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*\S+(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:a},{pattern:/(^|\s)\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:a}],"special-using":{pattern:/(^|\s)USING:(?:\s\S+)*(?=\s+;(?:\s|$))/,lookbehind:!0,alias:"function",inside:{string:{pattern:/(\s)[^:\s]+/,lookbehind:!0}}},"stack-effect-delimiter":[{pattern:/(^|\s)(?:call|eval|execute)?\((?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)--(?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)\)(?=\s|$)/,lookbehind:!0,alias:"operator"}],combinators:{pattern:null,lookbehind:!0,alias:"keyword"},"kernel-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"sequences-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"math-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"constructor-word":{pattern:/(^|\s)<(?!=+>|-+>)\S+>(?=\s|$)/,lookbehind:!0,alias:"keyword"},"other-builtin-syntax":{pattern:null,lookbehind:!0,alias:"operator"},"conventionally-named-word":{pattern:/(^|\s)(?!")(?:(?:change|new|set|with)-\S+|\$\S+|>[^>\s]+|[^:>\s]+>|[^>\s]+>[^>\s]+|\+[^+\s]+\+|[^?\s]+\?|\?[^?\s]+|[^>\s]+>>|>>[^>\s]+|[^<\s]+<<|\([^()\s]+\)|[^!\s]+!|[^*\s]\S*\*|[^.\s]\S*\.)(?=\s|$)/,lookbehind:!0,alias:"keyword"},"colon-syntax":{pattern:/(^|\s)(?:[A-Z0-9\-]+#?)?:{1,2}\s+(?:;\S+|(?!;)\S+)(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"function"},"semicolon-or-setlocal":{pattern:/(\s)(?:;|:>)(?=\s|$)/,lookbehind:!0,alias:"function"},"curly-brace-literal-delimiter":[{pattern:/(^|\s)[a-z]*\{(?=\s)/i,lookbehind:!0,alias:"operator"},{pattern:/(\s)\}(?=\s|$)/,lookbehind:!0,alias:"operator"}],"quotation-delimiter":[{pattern:/(^|\s)\[(?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)\](?=\s|$)/,lookbehind:!0,alias:"operator"}],"normal-word":{pattern:/(^|\s)[^"\s]\S*(?=\s|$)/,lookbehind:!0},string:{pattern:/"(?:\\\S|[^"\\])*"/,greedy:!0,inside:a}},i=function(u){return(u+"").replace(/([.?*+\^$\[\]\\(){}|\-])/g,"\\$1")},s=function(u){return new RegExp("(^|\\s)(?:"+u.map(i).join("|")+")(?=\\s|$)")},l={"kernel-builtin":["or","2nipd","4drop","tuck","wrapper","nip","wrapper?","callstack>array","die","dupd","callstack","callstack?","3dup","hashcode","pick","4nip","build",">boolean","nipd","clone","5nip","eq?","?","=","swapd","2over","clear","2dup","get-retainstack","not","tuple?","dup","3nipd","call","-rotd","object","drop","assert=","assert?","-rot","execute","boa","get-callstack","curried?","3drop","pickd","overd","over","roll","3nip","swap","and","2nip","rotd","throw","(clone)","hashcode*","spin","reach","4dup","equal?","get-datastack","assert","2drop","","boolean?","identity-hashcode","identity-tuple?","null","composed?","new","5drop","rot","-roll","xor","identity-tuple","boolean"],"other-builtin-syntax":["=======","recursive","flushable",">>","<<<<<<","M\\","B","PRIVATE>","\\","======","final","inline","delimiter","deprecated",">>>>>","<<<<<<<","parse-complex","malformed-complex","read-only",">>>>>>>","call-next-method","<<","foldable","$","$[","${"],"sequences-builtin":["member-eq?","mismatch","append","assert-sequence=","longer","repetition","clone-like","3sequence","assert-sequence?","last-index-from","reversed","index-from","cut*","pad-tail","join-as","remove-eq!","concat-as","but-last","snip","nths","nth","sequence","longest","slice?","","remove-nth","tail-slice","empty?","tail*","member?","virtual-sequence?","set-length","drop-prefix","iota","unclip","bounds-error?","unclip-last-slice","non-negative-integer-expected","non-negative-integer-expected?","midpoint@","longer?","?set-nth","?first","rest-slice","prepend-as","prepend","fourth","sift","subseq-start","new-sequence","?last","like","first4","1sequence","reverse","slice","virtual@","repetition?","set-last","index","4sequence","max-length","set-second","immutable-sequence","first2","first3","supremum","unclip-slice","suffix!","insert-nth","tail","3append","short","suffix","concat","flip","immutable?","reverse!","2sequence","sum","delete-all","indices","snip-slice","","check-slice","sequence?","head","append-as","halves","sequence=","collapse-slice","?second","slice-error?","product","bounds-check?","bounds-check","immutable","virtual-exemplar","harvest","remove","pad-head","last","set-fourth","cartesian-product","remove-eq","shorten","shorter","reversed?","shorter?","shortest","head-slice","pop*","tail-slice*","but-last-slice","iota?","append!","cut-slice","new-resizable","head-slice*","sequence-hashcode","pop","set-nth","?nth","second","join","immutable-sequence?","","3append-as","virtual-sequence","subseq?","remove-nth!","length","last-index","lengthen","assert-sequence","copy","move","third","first","tail?","set-first","prefix","bounds-error","","exchange","surround","cut","min-length","set-third","push-all","head?","subseq-start-from","delete-slice","rest","sum-lengths","head*","infimum","remove!","glue","slice-error","subseq","push","replace-slice","subseq-as","unclip-last"],"math-builtin":["number=","next-power-of-2","?1+","fp-special?","imaginary-part","float>bits","number?","fp-infinity?","bignum?","fp-snan?","denominator","gcd","*","+","fp-bitwise=","-","u>=","/",">=","bitand","power-of-2?","log2-expects-positive","neg?","<","log2",">","integer?","number","bits>double","2/","zero?","bits>float","float?","shift","ratio?","rect>","even?","ratio","fp-sign","bitnot",">fixnum","complex?","/i","integer>fixnum","/f","sgn",">bignum","next-float","u<","u>","mod","recip","rational",">float","2^","integer","fixnum?","neg","fixnum","sq","bignum",">rect","bit?","fp-qnan?","simple-gcd","complex","","real",">fraction","double>bits","bitor","rem","fp-nan-payload","real-part","log2-expects-positive?","prev-float","align","unordered?","float","fp-nan?","abs","bitxor","integer>fixnum-strict","u<=","odd?","<=","/mod",">integer","real?","rational?","numerator"]};Object.keys(l).forEach(function(u){o[u].pattern=s(l[u])});var c=["2bi","while","2tri","bi*","4dip","both?","same?","tri@","curry","prepose","3bi","?if","tri*","2keep","3keep","curried","2keepd","when","2bi*","2tri*","4keep","bi@","keepdd","do","unless*","tri-curry","if*","loop","bi-curry*","when*","2bi@","2tri@","with","2with","either?","bi","until","3dip","3curry","tri-curry*","tri-curry@","bi-curry","keepd","compose","2dip","if","3tri","unless","tuple","keep","2curry","tri","most","while*","dip","composed","bi-curry@","find-last-from","trim-head-slice","map-as","each-from","none?","trim-tail","partition","if-empty","accumulate*","reject!","find-from","accumulate-as","collector-for-as","reject","map","map-sum","accumulate!","2each-from","follow","supremum-by","map!","unless-empty","collector","padding","reduce-index","replicate-as","infimum-by","trim-tail-slice","count","find-index","filter","accumulate*!","reject-as","map-integers","map-find","reduce","selector","interleave","2map","filter-as","binary-reduce","map-index-as","find","produce","filter!","replicate","cartesian-map","cartesian-each","find-index-from","map-find-last","3map-as","3map","find-last","selector-as","2map-as","2map-reduce","accumulate","each","each-index","accumulate*-as","when-empty","all?","collector-as","push-either","new-like","collector-for","2selector","push-if","2all?","map-reduce","3each","any?","trim-slice","2reduce","change-nth","produce-as","2each","trim","trim-head","cartesian-find","map-index","if-zero","each-integer","unless-zero","(find-integer)","when-zero","find-last-integer","(all-integers?)","times","(each-integer)","find-integer","all-integers?","unless-negative","if-positive","when-positive","when-negative","unless-positive","if-negative","case","2cleave","cond>quot","case>quot","3cleave","wrong-values","to-fixed-point","alist>quot","cond","cleave","call-effect","recursive-hashcode","spread","deep-spread>quot","2||","0||","n||","0&&","2&&","3||","1||","1&&","n&&","3&&","smart-unless*","keep-inputs","reduce-outputs","smart-when*","cleave>array","smart-with","smart-apply","smart-if","inputs/outputs","output>sequence-n","map-outputs","map-reduce-outputs","dropping","output>array","smart-map-reduce","smart-2map-reduce","output>array-n","nullary","inputsequence"];o.combinators.pattern=s(c),n.languages.factor=o})(t)}return Vv}var qv,DO;function sye(){if(DO)return qv;DO=1,qv=e,e.displayName="$false",e.aliases=[];function e(t){(function(n){n.languages.false={comment:{pattern:/\{[^}]*\}/},string:{pattern:/"[^"]*"/,greedy:!0},"character-code":{pattern:/'(?:[^\r]|\r\n?)/,alias:"number"},"assembler-code":{pattern:/\d+`/,alias:"important"},number:/\d+/,operator:/[-!#$%&'*+,./:;=>?@\\^_`|~ßø]/,punctuation:/\[|\]/,variable:/[a-z]/,"non-standard":{pattern:/[()!=]=?|[-+*/%]|\b(?:in|is)\b/}),delete t.languages["firestore-security-rules"]["class-name"],t.languages.insertBefore("firestore-security-rules","keyword",{path:{pattern:/(^|[\s(),])(?:\/(?:[\w\xA0-\uFFFF]+|\{[\w\xA0-\uFFFF]+(?:=\*\*)?\}|\$\([\w\xA0-\uFFFF.]+\)))+/,lookbehind:!0,greedy:!0,inside:{variable:{pattern:/\{[\w\xA0-\uFFFF]+(?:=\*\*)?\}|\$\([\w\xA0-\uFFFF.]+\)/,inside:{operator:/=/,keyword:/\*\*/,punctuation:/[.$(){}]/}},punctuation:/\//}},method:{pattern:/(\ballow\s+)[a-z]+(?:\s*,\s*[a-z]+)*(?=\s*[:;])/,lookbehind:!0,alias:"builtin",inside:{punctuation:/,/}}})}return Gv}var Wv,MO;function cye(){if(MO)return Wv;MO=1,Wv=e,e.displayName="flow",e.aliases=[];function e(t){(function(n){n.languages.flow=n.languages.extend("javascript",{}),n.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|any|mixed|null|void)\b/,alias:"tag"}]}),n.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete n.languages.flow.parameter,n.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(n.languages.flow.keyword)||(n.languages.flow.keyword=[n.languages.flow.keyword]),n.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0})})(t)}return Wv}var Kv,PO;function uye(){if(PO)return Kv;PO=1,Kv=e,e.displayName="fortran",e.aliases=[];function e(t){t.languages.fortran={"quoted-number":{pattern:/[BOZ](['"])[A-F0-9]+\1/i,alias:"number"},string:{pattern:/(?:\b\w+_)?(['"])(?:\1\1|&(?:\r\n?|\n)(?:[ \t]*!.*(?:\r\n?|\n)|(?![ \t]*!))|(?!\1).)*(?:\1|&)/,inside:{comment:{pattern:/(&(?:\r\n?|\n)\s*)!.*/,lookbehind:!0}}},comment:{pattern:/!.*/,greedy:!0},boolean:/\.(?:FALSE|TRUE)\.(?:_\w+)?/i,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[ED][+-]?\d+)?(?:_\w+)?/i,keyword:[/\b(?:CHARACTER|COMPLEX|DOUBLE ?PRECISION|INTEGER|LOGICAL|REAL)\b/i,/\b(?:END ?)?(?:BLOCK ?DATA|DO|FILE|FORALL|FUNCTION|IF|INTERFACE|MODULE(?! PROCEDURE)|PROGRAM|SELECT|SUBROUTINE|TYPE|WHERE)\b/i,/\b(?:ALLOCATABLE|ALLOCATE|BACKSPACE|CALL|CASE|CLOSE|COMMON|CONTAINS|CONTINUE|CYCLE|DATA|DEALLOCATE|DIMENSION|DO|END|EQUIVALENCE|EXIT|EXTERNAL|FORMAT|GO ?TO|IMPLICIT(?: NONE)?|INQUIRE|INTENT|INTRINSIC|MODULE PROCEDURE|NAMELIST|NULLIFY|OPEN|OPTIONAL|PARAMETER|POINTER|PRINT|PRIVATE|PUBLIC|READ|RETURN|REWIND|SAVE|SELECT|STOP|TARGET|WHILE|WRITE)\b/i,/\b(?:ASSIGNMENT|DEFAULT|ELEMENTAL|ELSE|ELSEIF|ELSEWHERE|ENTRY|IN|INCLUDE|INOUT|KIND|NULL|ONLY|OPERATOR|OUT|PURE|RECURSIVE|RESULT|SEQUENCE|STAT|THEN|USE)\b/i],operator:[/\*\*|\/\/|=>|[=\/]=|[<>]=?|::|[+\-*=%]|\.[A-Z]+\./i,{pattern:/(^|(?!\().)\/(?!\))/,lookbehind:!0}],punctuation:/\(\/|\/\)|[(),;:&]/}}return Kv}var Yv,$O;function dye(){if($O)return Yv;$O=1,Yv=e,e.displayName="fsharp",e.aliases=[];function e(t){t.languages.fsharp=t.languages.extend("clike",{comment:[{pattern:/(^|[^\\])\(\*(?!\))[\s\S]*?\*\)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(?:"""[\s\S]*?"""|@"(?:""|[^"])*"|"(?:\\[\s\S]|[^\\"])*")B?/,greedy:!0},"class-name":{pattern:/(\b(?:exception|inherit|interface|new|of|type)\s+|\w\s*:\s*|\s:\??>\s*)[.\w]+\b(?:\s*(?:->|\*)\s*[.\w]+\b)*(?!\s*[:.])/,lookbehind:!0,inside:{operator:/->|\*/,punctuation:/\./}},keyword:/\b(?:let|return|use|yield)(?:!\B|\b)|\b(?:abstract|and|as|asr|assert|atomic|base|begin|break|checked|class|component|const|constraint|constructor|continue|default|delegate|do|done|downcast|downto|eager|elif|else|end|event|exception|extern|external|false|finally|fixed|for|fun|function|functor|global|if|in|include|inherit|inline|interface|internal|land|lazy|lor|lsl|lsr|lxor|match|member|method|mixin|mod|module|mutable|namespace|new|not|null|object|of|open|or|override|parallel|private|process|protected|public|pure|rec|sealed|select|sig|static|struct|tailcall|then|to|trait|true|try|type|upcast|val|virtual|void|volatile|when|while|with)\b/,number:[/\b0x[\da-fA-F]+(?:LF|lf|un)?\b/,/\b0b[01]+(?:uy|y)?\b/,/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[fm]|e[+-]?\d+)?\b/i,/\b\d+(?:[IlLsy]|UL|u[lsy]?)?\b/],operator:/([<>~&^])\1\1|([*.:<>&])\2|<-|->|[!=:]=|?|\??(?:<=|>=|<>|[-+*/%=<>])\??|[!?^&]|~[+~-]|:>|:\?>?/}),t.languages.insertBefore("fsharp","keyword",{preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(^#)\b(?:else|endif|if|light|line|nowarn)\b/,lookbehind:!0,alias:"keyword"}}}}),t.languages.insertBefore("fsharp","punctuation",{"computation-expression":{pattern:/\b[_a-z]\w*(?=\s*\{)/i,alias:"keyword"}}),t.languages.insertBefore("fsharp","string",{annotation:{pattern:/\[<.+?>\]/,greedy:!0,inside:{punctuation:/^\[<|>\]$/,"class-name":{pattern:/^\w+$|(^|;\s*)[A-Z]\w*(?=\()/,lookbehind:!0},"annotation-content":{pattern:/[\s\S]+/,inside:t.languages.fsharp}}},char:{pattern:/'(?:[^\\']|\\(?:.|\d{3}|x[a-fA-F\d]{2}|u[a-fA-F\d]{4}|U[a-fA-F\d]{8}))'B?/,greedy:!0}})}return Yv}var Zv,FO;function fye(){if(FO)return Zv;FO=1;var e=mr();Zv=t,t.displayName="ftl",t.aliases=[];function t(n){n.register(e),function(r){for(var a=/[^<()"']|\((?:)*\)|<(?!#--)|<#--(?:[^-]|-(?!->))*-->|"(?:[^\\"]|\\.)*"|'(?:[^\\']|\\.)*'/.source,o=0;o<2;o++)a=a.replace(//g,function(){return a});a=a.replace(//g,/[^\s\S]/.source);var i={comment:/<#--[\s\S]*?-->/,string:[{pattern:/\br("|')(?:(?!\1)[^\\]|\\.)*\1/,greedy:!0},{pattern:RegExp(/("|')(?:(?!\1|\$\{)[^\\]|\\.|\$\{(?:(?!\})(?:))*\})*\1/.source.replace(//g,function(){return a})),greedy:!0,inside:{interpolation:{pattern:RegExp(/((?:^|[^\\])(?:\\\\)*)\$\{(?:(?!\})(?:))*\}/.source.replace(//g,function(){return a})),lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:null}}}}],keyword:/\b(?:as)\b/,boolean:/\b(?:false|true)\b/,"builtin-function":{pattern:/((?:^|[^?])\?\s*)\w+/,lookbehind:!0,alias:"function"},function:/\b\w+(?=\s*\()/,number:/\b\d+(?:\.\d+)?\b/,operator:/\.\.[<*!]?|->|--|\+\+|&&|\|\||\?{1,2}|[-+*/%!=<>]=?|\b(?:gt|gte|lt|lte)\b/,punctuation:/[,;.:()[\]{}]/};i.string[1].inside.interpolation.inside.rest=i,r.languages.ftl={"ftl-comment":{pattern:/^<#--[\s\S]*/,alias:"comment"},"ftl-directive":{pattern:/^<[\s\S]+>$/,inside:{directive:{pattern:/(^<\/?)[#@][a-z]\w*/i,lookbehind:!0,alias:"keyword"},punctuation:/^<\/?|\/?>$/,content:{pattern:/\s*\S[\s\S]*/,alias:"ftl",inside:i}}},"ftl-interpolation":{pattern:/^\$\{[\s\S]*\}$/,inside:{punctuation:/^\$\{|\}$/,content:{pattern:/\s*\S[\s\S]*/,alias:"ftl",inside:i}}}},r.hooks.add("before-tokenize",function(s){var l=RegExp(/<#--[\s\S]*?-->|<\/?[#@][a-zA-Z](?:)*?>|\$\{(?:)*?\}/.source.replace(//g,function(){return a}),"gi");r.languages["markup-templating"].buildPlaceholders(s,"ftl",l)}),r.hooks.add("after-tokenize",function(s){r.languages["markup-templating"].tokenizePlaceholders(s,"ftl")})}(n)}return Zv}var Xv,jO;function pye(){if(jO)return Xv;jO=1,Xv=e,e.displayName="gap",e.aliases=[];function e(t){t.languages.gap={shell:{pattern:/^gap>[\s\S]*?(?=^gap>|$(?![\s\S]))/m,greedy:!0,inside:{gap:{pattern:/^(gap>).+(?:(?:\r(?:\n|(?!\n))|\n)>.*)*/,lookbehind:!0,inside:null},punctuation:/^gap>/}},comment:{pattern:/#.*/,greedy:!0},string:{pattern:/(^|[^\\'"])(?:'(?:[^\r\n\\']|\\.){1,10}'|"(?:[^\r\n\\"]|\\.)*"(?!")|"""[\s\S]*?""")/,lookbehind:!0,greedy:!0,inside:{continuation:{pattern:/([\r\n])>/,lookbehind:!0,alias:"punctuation"}}},keyword:/\b(?:Assert|Info|IsBound|QUIT|TryNextMethod|Unbind|and|atomic|break|continue|do|elif|else|end|fi|for|function|if|in|local|mod|not|od|or|quit|readonly|readwrite|rec|repeat|return|then|until|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:{pattern:/(^|[^\w.]|\.\.)(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?(?:_[a-z]?)?(?=$|[^\w.]|\.\.)/,lookbehind:!0},continuation:{pattern:/([\r\n])>/,lookbehind:!0,alias:"punctuation"},operator:/->|[-+*/^~=!]|<>|[<>]=?|:=|\.\./,punctuation:/[()[\]{},;.:]/},t.languages.gap.shell.inside.gap.inside=t.languages.gap}return Xv}var Qv,zO;function gye(){if(zO)return Qv;zO=1,Qv=e,e.displayName="gcode",e.aliases=[];function e(t){t.languages.gcode={comment:/;.*|\B\(.*?\)\B/,string:{pattern:/"(?:""|[^"])*"/,greedy:!0},keyword:/\b[GM]\d+(?:\.\d+)?\b/,property:/\b[A-Z]/,checksum:{pattern:/(\*)\d+/,lookbehind:!0,alias:"number"},punctuation:/[:*]/}}return Qv}var Jv,UO;function mye(){if(UO)return Jv;UO=1,Jv=e,e.displayName="gdscript",e.aliases=[];function e(t){t.languages.gdscript={comment:/#.*/,string:{pattern:/@?(?:("|')(?:(?!\1)[^\n\\]|\\[\s\S])*\1(?!"|')|"""(?:[^\\]|\\[\s\S])*?""")/,greedy:!0},"class-name":{pattern:/(^(?:class|class_name|extends)[ \t]+|^export\([ \t]*|\bas[ \t]+|(?:\b(?:const|var)[ \t]|[,(])[ \t]*\w+[ \t]*:[ \t]*|->[ \t]*)[a-zA-Z_]\w*/m,lookbehind:!0},keyword:/\b(?:and|as|assert|break|breakpoint|class|class_name|const|continue|elif|else|enum|export|extends|for|func|if|in|is|master|mastersync|match|not|null|onready|or|pass|preload|puppet|puppetsync|remote|remotesync|return|self|setget|signal|static|tool|var|while|yield)\b/,function:/\b[a-z_]\w*(?=[ \t]*\()/i,variable:/\$\w+/,number:[/\b0b[01_]+\b|\b0x[\da-fA-F_]+\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.[\d_]+)(?:e[+-]?[\d_]+)?\b/,/\b(?:INF|NAN|PI|TAU)\b/],constant:/\b[A-Z][A-Z_\d]*\b/,boolean:/\b(?:false|true)\b/,operator:/->|:=|&&|\|\||<<|>>|[-+*/%&|!<>=]=?|[~^]/,punctuation:/[.:,;()[\]{}]/}}return Jv}var eS,BO;function hye(){if(BO)return eS;BO=1,eS=e,e.displayName="gedcom",e.aliases=[];function e(t){t.languages.gedcom={"line-value":{pattern:/(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?\w+ ).+/m,lookbehind:!0,inside:{pointer:{pattern:/^@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@$/,alias:"variable"}}},tag:{pattern:/(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?)\w+/m,lookbehind:!0,alias:"string"},level:{pattern:/(^[\t ]*)\d+/m,lookbehind:!0,alias:"number"},pointer:{pattern:/@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@/,alias:"variable"}}}return eS}var tS,HO;function bye(){if(HO)return tS;HO=1,tS=e,e.displayName="gherkin",e.aliases=[];function e(t){(function(n){var r=/(?:\r?\n|\r)[ \t]*\|.+\|(?:(?!\|).)*/.source;n.languages.gherkin={pystring:{pattern:/("""|''')[\s\S]+?\1/,alias:"string"},comment:{pattern:/(^[ \t]*)#.*/m,lookbehind:!0},tag:{pattern:/(^[ \t]*)@\S*/m,lookbehind:!0},feature:{pattern:/((?:^|\r?\n|\r)[ \t]*)(?:Ability|Ahoy matey!|Arwedd|Aspekt|Besigheid Behoefte|Business Need|Caracteristica|Característica|Egenskab|Egenskap|Eiginleiki|Feature|Fīča|Fitur|Fonctionnalité|Fonksyonalite|Funcionalidade|Funcionalitat|Functionalitate|Funcţionalitate|Funcționalitate|Functionaliteit|Fungsi|Funkcia|Funkcija|Funkcionalitāte|Funkcionalnost|Funkcja|Funksie|Funktionalität|Funktionalitéit|Funzionalità|Hwaet|Hwæt|Jellemző|Karakteristik|Lastnost|Mak|Mogucnost|laH|Mogućnost|Moznosti|Možnosti|OH HAI|Omadus|Ominaisuus|Osobina|Özellik|Potrzeba biznesowa|perbogh|poQbogh malja'|Požadavek|Požiadavka|Pretty much|Qap|Qu'meH 'ut|Savybė|Tính năng|Trajto|Vermoë|Vlastnosť|Właściwość|Značilnost|Δυνατότητα|Λειτουργία|Могућност|Мөмкинлек|Особина|Свойство|Үзенчәлеклелек|Функционал|Функционалност|Функция|Функціонал|תכונה|خاصية|خصوصیت|صلاحیت|کاروبار کی ضرورت|وِیژگی|रूप लेख|ਖਾਸੀਅਤ|ਨਕਸ਼ ਨੁਹਾਰ|ਮੁਹਾਂਦਰਾ|గుణము|ಹೆಚ್ಚಳ|ความต้องการทางธุรกิจ|ความสามารถ|โครงหลัก|기능|フィーチャ|功能|機能):(?:[^:\r\n]+(?:\r?\n|\r|$))*/,lookbehind:!0,inside:{important:{pattern:/(:)[^\r\n]+/,lookbehind:!0},keyword:/[^:\r\n]+:/}},scenario:{pattern:/(^[ \t]*)(?:Abstract Scenario|Abstrakt Scenario|Achtergrond|Aer|Ær|Agtergrond|All y'all|Antecedentes|Antecedents|Atburðarás|Atburðarásir|Awww, look mate|B4|Background|Baggrund|Bakgrund|Bakgrunn|Bakgrunnur|Beispiele|Beispiller|Bối cảnh|Cefndir|Cenario|Cenário|Cenario de Fundo|Cenário de Fundo|Cenarios|Cenários|Contesto|Context|Contexte|Contexto|Conto|Contoh|Contone|Dæmi|Dasar|Dead men tell no tales|Delineacao do Cenario|Delineação do Cenário|Dis is what went down|Dữ liệu|Dyagram Senaryo|Dyagram senaryo|Egzanp|Ejemplos|Eksempler|Ekzemploj|Enghreifftiau|Esbozo do escenario|Escenari|Escenario|Esempi|Esquema de l'escenari|Esquema del escenario|Esquema do Cenario|Esquema do Cenário|EXAMPLZ|Examples|Exempel|Exemple|Exemples|Exemplos|First off|Fono|Forgatókönyv|Forgatókönyv vázlat|Fundo|Geçmiş|Grundlage|Hannergrond|ghantoH|Háttér|Heave to|Istorik|Juhtumid|Keadaan|Khung kịch bản|Khung tình huống|Kịch bản|Koncept|Konsep skenario|Kontèks|Kontekst|Kontekstas|Konteksts|Kontext|Konturo de la scenaro|Latar Belakang|lut chovnatlh|lut|lutmey|Lýsing Atburðarásar|Lýsing Dæma|MISHUN SRSLY|MISHUN|Menggariskan Senario|mo'|Náčrt Scenára|Náčrt Scénáře|Náčrt Scenáru|Oris scenarija|Örnekler|Osnova|Osnova Scenára|Osnova scénáře|Osnutek|Ozadje|Paraugs|Pavyzdžiai|Példák|Piemēri|Plan du scénario|Plan du Scénario|Plan Senaryo|Plan senaryo|Plang vum Szenario|Pozadí|Pozadie|Pozadina|Príklady|Příklady|Primer|Primeri|Primjeri|Przykłady|Raamstsenaarium|Reckon it's like|Rerefons|Scenár|Scénář|Scenarie|Scenarij|Scenarijai|Scenarijaus šablonas|Scenariji|Scenārijs|Scenārijs pēc parauga|Scenarijus|Scenario|Scénario|Scenario Amlinellol|Scenario Outline|Scenario Template|Scenariomal|Scenariomall|Scenarios|Scenariu|Scenariusz|Scenaro|Schema dello scenario|Se ðe|Se the|Se þe|Senario|Senaryo Deskripsyon|Senaryo deskripsyon|Senaryo|Senaryo taslağı|Shiver me timbers|Situācija|Situai|Situasie Uiteensetting|Situasie|Skenario konsep|Skenario|Skica|Structura scenariu|Structură scenariu|Struktura scenarija|Stsenaarium|Swa hwaer swa|Swa|Swa hwær swa|Szablon scenariusza|Szenario|Szenariogrundriss|Tapaukset|Tapaus|Tapausaihio|Taust|Tausta|Template Keadaan|Template Senario|Template Situai|The thing of it is|Tình huống|Variantai|Voorbeelde|Voorbeelden|Wharrimean is|Yo-ho-ho|You'll wanna|Założenia|Παραδείγματα|Περιγραφή Σεναρίου|Σενάρια|Σενάριο|Υπόβαθρο|Кереш|Контекст|Концепт|Мисаллар|Мисоллар|Основа|Передумова|Позадина|Предистория|Предыстория|Приклади|Пример|Примери|Примеры|Рамка на сценарий|Скица|Структура сценарија|Структура сценария|Структура сценарію|Сценарий|Сценарий структураси|Сценарийның төзелеше|Сценарији|Сценарио|Сценарій|Тарих|Үрнәкләр|דוגמאות|רקע|תבנית תרחיש|תרחיש|الخلفية|الگوی سناریو|امثلة|پس منظر|زمینه|سناریو|سيناريو|سيناريو مخطط|مثالیں|منظر نامے کا خاکہ|منظرنامہ|نمونه ها|उदाहरण|परिदृश्य|परिदृश्य रूपरेखा|पृष्ठभूमि|ਉਦਾਹਰਨਾਂ|ਪਟਕਥਾ|ਪਟਕਥਾ ਢਾਂਚਾ|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਿਛੋਕੜ|ఉదాహరణలు|కథనం|నేపథ్యం|సన్నివేశం|ಉದಾಹರಣೆಗಳು|ಕಥಾಸಾರಾಂಶ|ವಿವರಣೆ|ಹಿನ್ನೆಲೆ|โครงสร้างของเหตุการณ์|ชุดของตัวอย่าง|ชุดของเหตุการณ์|แนวคิด|สรุปเหตุการณ์|เหตุการณ์|배경|시나리오|시나리오 개요|예|サンプル|シナリオ|シナリオアウトライン|シナリオテンプレ|シナリオテンプレート|テンプレ|例|例子|剧本|剧本大纲|劇本|劇本大綱|场景|场景大纲|場景|場景大綱|背景):[^:\r\n]*/m,lookbehind:!0,inside:{important:{pattern:/(:)[^\r\n]*/,lookbehind:!0},keyword:/[^:\r\n]+:/}},"table-body":{pattern:RegExp("("+r+")(?:"+r+")+"),lookbehind:!0,inside:{outline:{pattern:/<[^>]+>/,alias:"variable"},td:{pattern:/\s*[^\s|][^|]*/,alias:"string"},punctuation:/\|/}},"table-head":{pattern:RegExp(r),inside:{th:{pattern:/\s*[^\s|][^|]*/,alias:"variable"},punctuation:/\|/}},atrule:{pattern:/(^[ \t]+)(?:'a|'ach|'ej|7|a|A také|A taktiež|A tiež|A zároveň|Aber|Ac|Adott|Akkor|Ak|Aleshores|Ale|Ali|Allora|Alors|Als|Ama|Amennyiben|Amikor|Ampak|an|AN|Ananging|And y'all|And|Angenommen|Anrhegedig a|An|Apabila|Atès|Atesa|Atunci|Avast!|Aye|A|awer|Bagi|Banjur|Bet|Biết|Blimey!|Buh|But at the end of the day I reckon|But y'all|But|BUT|Cal|Când|Cand|Cando|Ce|Cuando|Če|Ða ðe|Ða|Dadas|Dada|Dados|Dado|DaH ghu' bejlu'|dann|Dann|Dano|Dan|Dar|Dat fiind|Data|Date fiind|Date|Dati fiind|Dati|Daţi fiind|Dați fiind|DEN|Dato|De|Den youse gotta|Dengan|Diberi|Diyelim ki|Donada|Donat|Donitaĵo|Do|Dun|Duota|Ðurh|Eeldades|Ef|Eğer ki|Entao|Então|Entón|E|En|Entonces|Epi|És|Etant donnée|Etant donné|Et|Étant données|Étant donnée|Étant donné|Etant données|Etant donnés|Étant donnés|Fakat|Gangway!|Gdy|Gegeben seien|Gegeben sei|Gegeven|Gegewe|ghu' noblu'|Gitt|Given y'all|Given|Givet|Givun|Ha|Cho|I CAN HAZ|In|Ir|It's just unbelievable|I|Ja|Jeśli|Jeżeli|Kad|Kada|Kadar|Kai|Kaj|Když|Keď|Kemudian|Ketika|Khi|Kiedy|Ko|Kuid|Kui|Kun|Lan|latlh|Le sa a|Let go and haul|Le|Lè sa a|Lè|Logo|Lorsqu'<|Lorsque|mä|Maar|Mais|Mając|Ma|Majd|Maka|Manawa|Mas|Men|Menawa|Mutta|Nalika|Nalikaning|Nanging|Når|När|Nato|Nhưng|Niin|Njuk|O zaman|Och|Og|Oletetaan|Ond|Onda|Oraz|Pak|Pero|Però|Podano|Pokiaľ|Pokud|Potem|Potom|Privzeto|Pryd|Quan|Quand|Quando|qaSDI'|Så|Sed|Se|Siis|Sipoze ke|Sipoze Ke|Sipoze|Si|Şi|Și|Soit|Stel|Tada|Tad|Takrat|Tak|Tapi|Ter|Tetapi|Tha the|Tha|Then y'all|Then|Thì|Thurh|Toda|Too right|Un|Und|ugeholl|Và|vaj|Vendar|Ve|wann|Wanneer|WEN|Wenn|When y'all|When|Wtedy|Wun|Y'know|Yeah nah|Yna|Youse know like when|Youse know when youse got|Y|Za predpokladu|Za předpokladu|Zadan|Zadani|Zadano|Zadate|Zadato|Zakładając|Zaradi|Zatati|Þa þe|Þa|Þá|Þegar|Þurh|Αλλά|Δεδομένου|Και|Όταν|Τότε|А також|Агар|Але|Али|Аммо|А|Әгәр|Әйтик|Әмма|Бирок|Ва|Вә|Дадено|Дано|Допустим|Если|Задате|Задати|Задато|И|І|К тому же|Када|Кад|Когато|Когда|Коли|Ләкин|Лекин|Нәтиҗәдә|Нехай|Но|Онда|Припустимо, що|Припустимо|Пусть|Также|Та|Тогда|Тоді|То|Унда|Һәм|Якщо|אבל|אזי|אז|בהינתן|וגם|כאשר|آنگاه|اذاً|اگر|اما|اور|با فرض|بالفرض|بفرض|پھر|تب|ثم|جب|عندما|فرض کیا|لكن|لیکن|متى|هنگامی|و|अगर|और|कदा|किन्तु|चूंकि|जब|तथा|तदा|तब|परन्तु|पर|यदि|ਅਤੇ|ਜਦੋਂ|ਜਿਵੇਂ ਕਿ|ਜੇਕਰ|ਤਦ|ਪਰ|అప్పుడు|ఈ పరిస్థితిలో|కాని|చెప్పబడినది|మరియు|ಆದರೆ|ನಂತರ|ನೀಡಿದ|ಮತ್ತು|ಸ್ಥಿತಿಯನ್ನು|กำหนดให้|ดังนั้น|แต่|เมื่อ|และ|그러면<|그리고<|단<|만약<|만일<|먼저<|조건<|하지만<|かつ<|しかし<|ただし<|ならば<|もし<|並且<|但し<|但是<|假如<|假定<|假設<|假设<|前提<|同时<|同時<|并且<|当<|當<|而且<|那么<|那麼<)(?=[ \t])/m,lookbehind:!0},string:{pattern:/"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,inside:{outline:{pattern:/<[^>]+>/,alias:"variable"}}},outline:{pattern:/<[^>]+>/,alias:"variable"}}})(t)}return tS}var nS,VO;function yye(){if(VO)return nS;VO=1,nS=e,e.displayName="git",e.aliases=[];function e(t){t.languages.git={comment:/^#.*/m,deleted:/^[-–].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m}}return nS}var rS,qO;function vye(){if(qO)return rS;qO=1;var e=Ws();rS=t,t.displayName="glsl",t.aliases=[];function t(n){n.register(e),n.languages.glsl=n.languages.extend("c",{keyword:/\b(?:active|asm|atomic_uint|attribute|[ibdu]?vec[234]|bool|break|buffer|case|cast|centroid|class|coherent|common|const|continue|d?mat[234](?:x[234])?|default|discard|do|double|else|enum|extern|external|false|filter|fixed|flat|float|for|fvec[234]|goto|half|highp|hvec[234]|[iu]?sampler2DMS(?:Array)?|[iu]?sampler2DRect|[iu]?samplerBuffer|[iu]?samplerCube|[iu]?samplerCubeArray|[iu]?sampler[123]D|[iu]?sampler[12]DArray|[iu]?image2DMS(?:Array)?|[iu]?image2DRect|[iu]?imageBuffer|[iu]?imageCube|[iu]?imageCubeArray|[iu]?image[123]D|[iu]?image[12]DArray|if|in|inline|inout|input|int|interface|invariant|layout|long|lowp|mediump|namespace|noinline|noperspective|out|output|partition|patch|precise|precision|public|readonly|resource|restrict|return|sample|sampler[12]DArrayShadow|sampler[12]DShadow|sampler2DRectShadow|sampler3DRect|samplerCubeArrayShadow|samplerCubeShadow|shared|short|sizeof|smooth|static|struct|subroutine|superp|switch|template|this|true|typedef|uint|uniform|union|unsigned|using|varying|void|volatile|while|writeonly)\b/})}return rS}var aS,GO;function Sye(){if(GO)return aS;GO=1,aS=e,e.displayName="gml",e.aliases=[];function e(t){t.languages.gamemakerlanguage=t.languages.gml=t.languages.extend("clike",{keyword:/\b(?:break|case|continue|default|do|else|enum|exit|for|globalvar|if|repeat|return|switch|until|var|while)\b/,number:/(?:\b0x[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ulf]{0,4}/i,operator:/--|\+\+|[-+%/=]=?|!=|\*\*?=?|<[<=>]?|>[=>]?|&&?|\^\^?|\|\|?|~|\b(?:and|at|not|or|with|xor)\b/,constant:/\b(?:GM_build_date|GM_version|action_(?:continue|restart|reverse|stop)|all|gamespeed_(?:fps|microseconds)|global|local|noone|other|pi|pointer_(?:invalid|null)|self|timezone_(?:local|utc)|undefined|ev_(?:create|destroy|step|alarm|keyboard|mouse|collision|other|draw|draw_(?:begin|end|post|pre)|keypress|keyrelease|trigger|(?:left|middle|no|right)_button|(?:left|middle|right)_press|(?:left|middle|right)_release|mouse_(?:enter|leave|wheel_down|wheel_up)|global_(?:left|middle|right)_button|global_(?:left|middle|right)_press|global_(?:left|middle|right)_release|joystick(?:1|2)_(?:button1|button2|button3|button4|button5|button6|button7|button8|down|left|right|up)|outside|boundary|game_start|game_end|room_start|room_end|no_more_lives|animation_end|end_of_path|no_more_health|user\d|gui|gui_begin|gui_end|step_(?:begin|end|normal))|vk_(?:alt|anykey|backspace|control|delete|down|end|enter|escape|home|insert|left|nokey|pagedown|pageup|pause|printscreen|return|right|shift|space|tab|up|f\d|numpad\d|add|decimal|divide|lalt|lcontrol|lshift|multiply|ralt|rcontrol|rshift|subtract)|achievement_(?:filter_(?:all_players|favorites_only|friends_only)|friends_info|info|leaderboard_info|our_info|pic_loaded|show_(?:achievement|bank|friend_picker|leaderboard|profile|purchase_prompt|ui)|type_challenge|type_score_challenge)|asset_(?:font|object|path|room|script|shader|sound|sprite|tiles|timeline|unknown)|audio_(?:3d|falloff_(?:exponent_distance|exponent_distance_clamped|inverse_distance|inverse_distance_clamped|linear_distance|linear_distance_clamped|none)|mono|new_system|old_system|stereo)|bm_(?:add|complex|dest_alpha|dest_color|dest_colour|inv_dest_alpha|inv_dest_color|inv_dest_colour|inv_src_alpha|inv_src_color|inv_src_colour|max|normal|one|src_alpha|src_alpha_sat|src_color|src_colour|subtract|zero)|browser_(?:chrome|firefox|ie|ie_mobile|not_a_browser|opera|safari|safari_mobile|tizen|unknown|windows_store)|buffer_(?:bool|f16|f32|f64|fast|fixed|generalerror|grow|invalidtype|network|outofbounds|outofspace|s16|s32|s8|seek_end|seek_relative|seek_start|string|text|u16|u32|u64|u8|vbuffer|wrap)|c_(?:aqua|black|blue|dkgray|fuchsia|gray|green|lime|ltgray|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow)|cmpfunc_(?:always|equal|greater|greaterequal|less|lessequal|never|notequal)|cr_(?:appstart|arrow|beam|cross|default|drag|handpoint|hourglass|none|size_all|size_nesw|size_ns|size_nwse|size_we|uparrow)|cull_(?:clockwise|counterclockwise|noculling)|device_(?:emulator|tablet)|device_ios_(?:ipad|ipad_retina|iphone|iphone5|iphone6|iphone6plus|iphone_retina|unknown)|display_(?:landscape|landscape_flipped|portrait|portrait_flipped)|dll_(?:cdecl|cdel|stdcall)|ds_type_(?:grid|list|map|priority|queue|stack)|ef_(?:cloud|ellipse|explosion|firework|flare|rain|ring|smoke|smokeup|snow|spark|star)|fa_(?:archive|bottom|center|directory|hidden|left|middle|readonly|right|sysfile|top|volumeid)|fb_login_(?:default|fallback_to_webview|forcing_safari|forcing_webview|no_fallback_to_webview|use_system_account)|iap_(?:available|canceled|ev_consume|ev_product|ev_purchase|ev_restore|ev_storeload|failed|purchased|refunded|status_available|status_loading|status_processing|status_restoring|status_unavailable|status_uninitialised|storeload_failed|storeload_ok|unavailable)|leaderboard_type_(?:number|time_mins_secs)|lighttype_(?:dir|point)|matrix_(?:projection|view|world)|mb_(?:any|left|middle|none|right)|network_(?:config_(?:connect_timeout|disable_reliable_udp|enable_reliable_udp|use_non_blocking_socket)|socket_(?:bluetooth|tcp|udp)|type_(?:connect|data|disconnect|non_blocking_connect))|of_challenge_(?:lose|tie|win)|os_(?:android|ios|linux|macosx|ps3|ps4|psvita|unknown|uwp|win32|win8native|windows|winphone|xboxone)|phy_debug_render_(?:aabb|collision_pairs|coms|core_shapes|joints|obb|shapes)|phy_joint_(?:anchor_1_x|anchor_1_y|anchor_2_x|anchor_2_y|angle|angle_limits|damping_ratio|frequency|length_1|length_2|lower_angle_limit|max_force|max_length|max_motor_force|max_motor_torque|max_torque|motor_force|motor_speed|motor_torque|reaction_force_x|reaction_force_y|reaction_torque|speed|translation|upper_angle_limit)|phy_particle_data_flag_(?:category|color|colour|position|typeflags|velocity)|phy_particle_flag_(?:colormixing|colourmixing|elastic|powder|spring|tensile|viscous|wall|water|zombie)|phy_particle_group_flag_(?:rigid|solid)|pr_(?:linelist|linestrip|pointlist|trianglefan|trianglelist|trianglestrip)|ps_(?:distr|shape)_(?:diamond|ellipse|gaussian|invgaussian|line|linear|rectangle)|pt_shape_(?:circle|cloud|disk|explosion|flare|line|pixel|ring|smoke|snow|spark|sphere|square|star)|ty_(?:real|string)|gp_(?:face\d|axislh|axislv|axisrh|axisrv|padd|padl|padr|padu|select|shoulderl|shoulderlb|shoulderr|shoulderrb|start|stickl|stickr)|lb_disp_(?:none|numeric|time_ms|time_sec)|lb_sort_(?:ascending|descending|none)|ov_(?:achievements|community|friends|gamegroup|players|settings)|ugc_(?:filetype_(?:community|microtrans)|list_(?:Favorited|Followed|Published|Subscribed|UsedOrPlayed|VotedDown|VotedOn|VotedUp|WillVoteLater)|match_(?:AllGuides|Artwork|Collections|ControllerBindings|IntegratedGuides|Items|Items_Mtx|Items_ReadyToUse|Screenshots|UsableInGame|Videos|WebGuides)|query_(?:AcceptedForGameRankedByAcceptanceDate|CreatedByFriendsRankedByPublicationDate|FavoritedByFriendsRankedByPublicationDate|NotYetRated)|query_RankedBy(?:NumTimesReported|PublicationDate|TextSearch|TotalVotesAsc|Trend|Vote|VotesUp)|result_success|sortorder_CreationOrder(?:Asc|Desc)|sortorder_(?:ForModeration|LastUpdatedDesc|SubscriptionDateDesc|TitleAsc|VoteScoreDesc)|visibility_(?:friends_only|private|public))|vertex_usage_(?:binormal|blendindices|blendweight|color|colour|depth|fog|normal|position|psize|sample|tangent|texcoord|textcoord)|vertex_type_(?:float\d|color|colour|ubyte4)|input_type|layerelementtype_(?:background|instance|oldtilemap|particlesystem|sprite|tile|tilemap|undefined)|se_(?:chorus|compressor|echo|equalizer|flanger|gargle|none|reverb)|text_type|tile_(?:flip|index_mask|mirror|rotate)|(?:obj|rm|scr|spr)\w+)\b/,variable:/\b(?:alarm|application_surface|async_load|background_(?:alpha|blend|color|colour|foreground|height|hspeed|htiled|index|showcolor|showcolour|visible|vspeed|vtiled|width|x|xscale|y|yscale)|bbox_(?:bottom|left|right|top)|browser_(?:height|width)|caption_(?:health|lives|score)|current_(?:day|hour|minute|month|second|time|weekday|year)|cursor_sprite|debug_mode|delta_time|direction|display_aa|error_(?:last|occurred)|event_(?:action|number|object|type)|fps|fps_real|friction|game_(?:display|project|save)_(?:id|name)|gamemaker_(?:pro|registered|version)|gravity|gravity_direction|(?:h|v)speed|health|iap_data|id|image_(?:alpha|angle|blend|depth|index|number|speed|xscale|yscale)|instance_(?:count|id)|keyboard_(?:key|lastchar|lastkey|string)|layer|lives|mask_index|mouse_(?:button|lastbutton|x|y)|object_index|os_(?:browser|device|type|version)|path_(?:endaction|index|orientation|position|positionprevious|scale|speed)|persistent|phy_(?:rotation|(?:col_normal|collision|com|linear_velocity|position|speed)_(?:x|y)|angular_(?:damping|velocity)|position_(?:x|y)previous|speed|linear_damping|bullet|fixed_rotation|active|mass|inertia|dynamic|kinematic|sleeping|collision_points)|pointer_(?:invalid|null)|room|room_(?:caption|first|height|last|persistent|speed|width)|score|secure_mode|show_(?:health|lives|score)|solid|speed|sprite_(?:height|index|width|xoffset|yoffset)|temp_directory|timeline_(?:index|loop|position|running|speed)|transition_(?:color|kind|steps)|undefined|view_(?:angle|current|enabled|(?:h|v)(?:border|speed)|(?:h|w|x|y)port|(?:h|w|x|y)view|object|surface_id|visible)|visible|webgl_enabled|working_directory|(?:x|y)(?:previous|start)|x|y|argument(?:_relitive|_count|\d)|argument|global|local|other|self)\b/})}return aS}var oS,WO;function wye(){if(WO)return oS;WO=1,oS=e,e.displayName="gn",e.aliases=["gni"];function e(t){t.languages.gn={comment:{pattern:/#.*/,greedy:!0},"string-literal":{pattern:/(^|[^\\"])"(?:[^\r\n"\\]|\\.)*"/,lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:\{[\s\S]*?\}|[a-zA-Z_]\w*|0x[a-fA-F0-9]{2})/,lookbehind:!0,inside:{number:/^\$0x[\s\S]{2}$/,variable:/^\$\w+$/,"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}},string:/[\s\S]+/}},keyword:/\b(?:else|if)\b/,boolean:/\b(?:false|true)\b/,"builtin-function":{pattern:/\b(?:assert|defined|foreach|import|pool|print|template|tool|toolchain)(?=\s*\()/i,alias:"keyword"},function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:current_cpu|current_os|current_toolchain|default_toolchain|host_cpu|host_os|root_build_dir|root_gen_dir|root_out_dir|target_cpu|target_gen_dir|target_os|target_out_dir)\b/,number:/-?\b\d+\b/,operator:/[-+!=<>]=?|&&|\|\|/,punctuation:/[(){}[\],.]/},t.languages.gn["string-literal"].inside.interpolation.inside.expression.inside=t.languages.gn,t.languages.gni=t.languages.gn}return oS}var iS,KO;function Eye(){if(KO)return iS;KO=1,iS=e,e.displayName="goModule",e.aliases=[];function e(t){t.languages["go-mod"]=t.languages["go-module"]={comment:{pattern:/\/\/.*/,greedy:!0},version:{pattern:/(^|[\s()[\],])v\d+\.\d+\.\d+(?:[+-][-+.\w]*)?(?![^\s()[\],])/,lookbehind:!0,alias:"number"},"go-version":{pattern:/((?:^|\s)go\s+)\d+(?:\.\d+){1,2}/,lookbehind:!0,alias:"number"},keyword:{pattern:/^([ \t]*)(?:exclude|go|module|replace|require|retract)\b/m,lookbehind:!0},operator:/=>/,punctuation:/[()[\],]/}}return iS}var sS,YO;function xye(){if(YO)return sS;YO=1,sS=e,e.displayName="go",e.aliases=[];function e(t){t.languages.go=t.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),t.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete t.languages.go["class-name"]}return sS}var lS,ZO;function kye(){if(ZO)return lS;ZO=1,lS=e,e.displayName="graphql",e.aliases=[];function e(t){t.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:t.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},t.hooks.add("after-tokenize",function(r){if(r.language!=="graphql")return;var a=r.tokens.filter(function(v){return typeof v!="string"&&v.type!=="comment"&&v.type!=="scalar"}),o=0;function i(v){return a[o+v]}function s(v,h){h=h||0;for(var S=0;S0)){var b=l(/^\{$/,/^\}$/);if(b===-1)continue;for(var y=o;y=0&&c(w,"variable-input")}}}}})}return lS}var cS,XO;function Cye(){if(XO)return cS;XO=1,cS=e,e.displayName="groovy",e.aliases=[];function e(t){t.languages.groovy=t.languages.extend("clike",{string:[{pattern:/("""|''')(?:[^\\]|\\[\s\S])*?\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0},{pattern:/(["'/])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0}],keyword:/\b(?:abstract|as|assert|boolean|break|byte|case|catch|char|class|const|continue|def|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|in|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),t.languages.insertBefore("groovy","string",{shebang:{pattern:/#!.+/,alias:"comment"}}),t.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),t.languages.insertBefore("groovy","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),t.hooks.add("wrap",function(n){if(n.language==="groovy"&&n.type==="string"){var r=n.content.value[0];if(r!="'"){var a=/([^\\])(?:\$(?:\{.*?\}|[\w.]+))/;r==="$"&&(a=/([^\$])(?:\$(?:\{.*?\}|[\w.]+))/),n.content.value=n.content.value.replace(/</g,"<").replace(/&/g,"&"),n.content=t.highlight(n.content.value,{expression:{pattern:a,lookbehind:!0,inside:t.languages.groovy}}),n.classes.push(r==="/"?"regex":"gstring")}}})}return cS}var uS,QO;function _ye(){if(QO)return uS;QO=1;var e=Th();uS=t,t.displayName="haml",t.aliases=[];function t(n){n.register(e),function(r){r.languages.haml={"multiline-comment":{pattern:/((?:^|\r?\n|\r)([\t ]*))(?:\/|-#).*(?:(?:\r?\n|\r)\2[\t ].+)*/,lookbehind:!0,alias:"comment"},"multiline-code":[{pattern:/((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*,[\t ]*(?:(?:\r?\n|\r)\2[\t ].*,[\t ]*)*(?:(?:\r?\n|\r)\2[\t ].+)/,lookbehind:!0,inside:r.languages.ruby},{pattern:/((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*\|[\t ]*(?:(?:\r?\n|\r)\2[\t ].*\|[\t ]*)*/,lookbehind:!0,inside:r.languages.ruby}],filter:{pattern:/((?:^|\r?\n|\r)([\t ]*)):[\w-]+(?:(?:\r?\n|\r)(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/,lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"symbol"}}},markup:{pattern:/((?:^|\r?\n|\r)[\t ]*)<.+/,lookbehind:!0,inside:r.languages.markup},doctype:{pattern:/((?:^|\r?\n|\r)[\t ]*)!!!(?: .+)?/,lookbehind:!0},tag:{pattern:/((?:^|\r?\n|\r)[\t ]*)[%.#][\w\-#.]*[\w\-](?:\([^)]+\)|\{(?:\{[^}]+\}|[^{}])+\}|\[[^\]]+\])*[\/<>]*/,lookbehind:!0,inside:{attributes:[{pattern:/(^|[^#])\{(?:\{[^}]+\}|[^{}])+\}/,lookbehind:!0,inside:r.languages.ruby},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*)(?:"(?:\\.|[^\\"\r\n])*"|[^)\s]+)/,lookbehind:!0},"attr-name":/[\w:-]+(?=\s*!?=|\s*[,)])/,punctuation:/[=(),]/}},{pattern:/\[[^\]]+\]/,inside:r.languages.ruby}],punctuation:/[<>]/}},code:{pattern:/((?:^|\r?\n|\r)[\t ]*(?:[~-]|[&!]?=)).+/,lookbehind:!0,inside:r.languages.ruby},interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},ruby:{pattern:/[\s\S]+/,inside:r.languages.ruby}}},punctuation:{pattern:/((?:^|\r?\n|\r)[\t ]*)[~=\-&!]+/,lookbehind:!0}};for(var a="((?:^|\\r?\\n|\\r)([\\t ]*)):{{filter_name}}(?:(?:\\r?\\n|\\r)(?:\\2[\\t ].+|\\s*?(?=\\r?\\n|\\r)))+",o=["css",{filter:"coffee",language:"coffeescript"},"erb","javascript","less","markdown","ruby","scss","textile"],i={},s=0,l=o.length;s@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},r.hooks.add("before-tokenize",function(a){var o=/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g;r.languages["markup-templating"].buildPlaceholders(a,"handlebars",o)}),r.hooks.add("after-tokenize",function(a){r.languages["markup-templating"].tokenizePlaceholders(a,"handlebars")}),r.languages.hbs=r.languages.handlebars}(n)}return dS}var fS,eD;function NA(){if(eD)return fS;eD=1,fS=e,e.displayName="haskell",e.aliases=["hs"];function e(t){t.languages.haskell={comment:{pattern:/(^|[^-!#$%*+=?&@|~.:<>^\\\/])(?:--(?:(?=.)[^-!#$%*+=?&@|~.:<>^\\\/].*|$)|\{-[\s\S]*?-\})/m,lookbehind:!0},char:{pattern:/'(?:[^\\']|\\(?:[abfnrtv\\"'&]|\^[A-Z@[\]^_]|ACK|BEL|BS|CAN|CR|DC1|DC2|DC3|DC4|DEL|DLE|EM|ENQ|EOT|ESC|ETB|ETX|FF|FS|GS|HT|LF|NAK|NUL|RS|SI|SO|SOH|SP|STX|SUB|SYN|US|VT|\d+|o[0-7]+|x[0-9a-fA-F]+))'/,alias:"string"},string:{pattern:/"(?:[^\\"]|\\(?:\S|\s+\\))*"/,greedy:!0},keyword:/\b(?:case|class|data|deriving|do|else|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b/,"import-statement":{pattern:/(^[\t ]*)import\s+(?:qualified\s+)?(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*(?:\s+as\s+(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,lookbehind:!0,inside:{keyword:/\b(?:as|hiding|import|qualified)\b/,punctuation:/\./}},builtin:/\b(?:abs|acos|acosh|all|and|any|appendFile|approxRational|asTypeOf|asin|asinh|atan|atan2|atanh|basicIORun|break|catch|ceiling|chr|compare|concat|concatMap|const|cos|cosh|curry|cycle|decodeFloat|denominator|digitToInt|div|divMod|drop|dropWhile|either|elem|encodeFloat|enumFrom|enumFromThen|enumFromThenTo|enumFromTo|error|even|exp|exponent|fail|filter|flip|floatDigits|floatRadix|floatRange|floor|fmap|foldl|foldl1|foldr|foldr1|fromDouble|fromEnum|fromInt|fromInteger|fromIntegral|fromRational|fst|gcd|getChar|getContents|getLine|group|head|id|inRange|index|init|intToDigit|interact|ioError|isAlpha|isAlphaNum|isAscii|isControl|isDenormalized|isDigit|isHexDigit|isIEEE|isInfinite|isLower|isNaN|isNegativeZero|isOctDigit|isPrint|isSpace|isUpper|iterate|last|lcm|length|lex|lexDigits|lexLitChar|lines|log|logBase|lookup|map|mapM|mapM_|max|maxBound|maximum|maybe|min|minBound|minimum|mod|negate|not|notElem|null|numerator|odd|or|ord|otherwise|pack|pi|pred|primExitWith|print|product|properFraction|putChar|putStr|putStrLn|quot|quotRem|range|rangeSize|read|readDec|readFile|readFloat|readHex|readIO|readInt|readList|readLitChar|readLn|readOct|readParen|readSigned|reads|readsPrec|realToFrac|recip|rem|repeat|replicate|return|reverse|round|scaleFloat|scanl|scanl1|scanr|scanr1|seq|sequence|sequence_|show|showChar|showInt|showList|showLitChar|showParen|showSigned|showString|shows|showsPrec|significand|signum|sin|sinh|snd|sort|span|splitAt|sqrt|subtract|succ|sum|tail|take|takeWhile|tan|tanh|threadToIOResult|toEnum|toInt|toInteger|toLower|toRational|toUpper|truncate|uncurry|undefined|unlines|until|unwords|unzip|unzip3|userError|words|writeFile|zip|zip3|zipWith|zipWith3)\b/,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0o[0-7]+|0x[0-9a-f]+)\b/i,operator:[{pattern:/`(?:[A-Z][\w']*\.)*[_a-z][\w']*`/,greedy:!0},{pattern:/(\s)\.(?=\s)/,lookbehind:!0},/[-!#$%*+=?&@|~:<>^\\\/][-!#$%*+=?&@|~.:<>^\\\/]*|\.[-!#$%*+=?&@|~.:<>^\\\/]+/],hvariable:{pattern:/\b(?:[A-Z][\w']*\.)*[_a-z][\w']*/,inside:{punctuation:/\./}},constant:{pattern:/\b(?:[A-Z][\w']*\.)*[A-Z][\w']*/,inside:{punctuation:/\./}},punctuation:/[{}[\];(),.:]/},t.languages.hs=t.languages.haskell}return fS}var pS,tD;function Tye(){if(tD)return pS;tD=1,pS=e,e.displayName="haxe",e.aliases=[];function e(t){t.languages.haxe=t.languages.extend("clike",{string:{pattern:/"(?:[^"\\]|\\[\s\S])*"/,greedy:!0},"class-name":[{pattern:/(\b(?:abstract|class|enum|extends|implements|interface|new|typedef)\s+)[A-Z_]\w*/,lookbehind:!0},/\b[A-Z]\w*/],keyword:/\bthis\b|\b(?:abstract|as|break|case|cast|catch|class|continue|default|do|dynamic|else|enum|extends|extern|final|for|from|function|if|implements|import|in|inline|interface|macro|new|null|operator|overload|override|package|private|public|return|static|super|switch|throw|to|try|typedef|untyped|using|var|while)(?!\.)\b/,function:{pattern:/\b[a-z_]\w*(?=\s*(?:<[^<>]*>\s*)?\()/i,greedy:!0},operator:/\.{3}|\+\+|--|&&|\|\||->|=>|(?:<{1,3}|[-+*/%!=&|^])=?|[?:~]/}),t.languages.insertBefore("haxe","string",{"string-interpolation":{pattern:/'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{interpolation:{pattern:/(^|[^\\])\$(?:\w+|\{[^{}]+\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:t.languages.haxe}}},string:/[\s\S]+/}}}),t.languages.insertBefore("haxe","class-name",{regex:{pattern:/~\/(?:[^\/\\\r\n]|\\.)+\/[a-z]*/,greedy:!0,inside:{"regex-flags":/\b[a-z]+$/,"regex-source":{pattern:/^(~\/)[\s\S]+(?=\/$)/,lookbehind:!0,alias:"language-regex",inside:t.languages.regex},"regex-delimiter":/^~\/|\/$/}}}),t.languages.insertBefore("haxe","keyword",{preprocessor:{pattern:/#(?:else|elseif|end|if)\b.*/,alias:"property"},metadata:{pattern:/@:?[\w.]+/,alias:"symbol"},reification:{pattern:/\$(?:\w+|(?=\{))/,alias:"important"}})}return pS}var gS,nD;function Rye(){if(nD)return gS;nD=1,gS=e,e.displayName="hcl",e.aliases=[];function e(t){t.languages.hcl={comment:/(?:\/\/|#).*|\/\*[\s\S]*?(?:\*\/|$)/,heredoc:{pattern:/<<-?(\w+\b)[\s\S]*?^[ \t]*\1/m,greedy:!0,alias:"string"},keyword:[{pattern:/(?:data|resource)\s+(?:"(?:\\[\s\S]|[^\\"])*")(?=\s+"[\w-]+"\s+\{)/i,inside:{type:{pattern:/(resource|data|\s+)(?:"(?:\\[\s\S]|[^\\"])*")/i,lookbehind:!0,alias:"variable"}}},{pattern:/(?:backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+(?=\{)/i,inside:{type:{pattern:/(backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+/i,lookbehind:!0,alias:"variable"}}},/[\w-]+(?=\s+\{)/],property:[/[-\w\.]+(?=\s*=(?!=))/,/"(?:\\[\s\S]|[^\\"])+"(?=\s*[:=])/],string:{pattern:/"(?:[^\\$"]|\\[\s\S]|\$(?:(?=")|\$+(?!\$)|[^"${])|\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\})*"/,greedy:!0,inside:{interpolation:{pattern:/(^|[^$])\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\}/,lookbehind:!0,inside:{type:{pattern:/(\b(?:count|data|local|module|path|self|terraform|var)\b\.)[\w\*]+/i,lookbehind:!0,alias:"variable"},keyword:/\b(?:count|data|local|module|path|self|terraform|var)\b/i,function:/\w+(?=\()/,string:{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,punctuation:/[!\$#%&'()*+,.\/;<=>@\[\\\]^`{|}~?:]/}}}},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,boolean:/\b(?:false|true)\b/i,punctuation:/[=\[\]{}]/}}return gS}var mS,rD;function Nye(){if(rD)return mS;rD=1;var e=Ws();mS=t,t.displayName="hlsl",t.aliases=[];function t(n){n.register(e),n.languages.hlsl=n.languages.extend("c",{"class-name":[n.languages.c["class-name"],/\b(?:AppendStructuredBuffer|BlendState|Buffer|ByteAddressBuffer|CompileShader|ComputeShader|ConsumeStructuredBuffer|DepthStencilState|DepthStencilView|DomainShader|GeometryShader|Hullshader|InputPatch|LineStream|OutputPatch|PixelShader|PointStream|RWBuffer|RWByteAddressBuffer|RWStructuredBuffer|RWTexture(?:1D|1DArray|2D|2DArray|3D)|RasterizerState|RenderTargetView|SamplerComparisonState|SamplerState|StructuredBuffer|Texture(?:1D|1DArray|2D|2DArray|2DMS|2DMSArray|3D|Cube|CubeArray)|TriangleStream|VertexShader)\b/],keyword:[/\b(?:asm|asm_fragment|auto|break|case|catch|cbuffer|centroid|char|class|column_major|compile|compile_fragment|const|const_cast|continue|default|delete|discard|do|dynamic_cast|else|enum|explicit|export|extern|for|friend|fxgroup|goto|groupshared|if|in|inline|inout|interface|line|lineadj|linear|long|matrix|mutable|namespace|new|nointerpolation|noperspective|operator|out|packoffset|pass|pixelfragment|point|precise|private|protected|public|register|reinterpret_cast|return|row_major|sample|sampler|shared|short|signed|sizeof|snorm|stateblock|stateblock_state|static|static_cast|string|struct|switch|tbuffer|technique|technique10|technique11|template|texture|this|throw|triangle|triangleadj|try|typedef|typename|uniform|union|unorm|unsigned|using|vector|vertexfragment|virtual|void|volatile|while)\b/,/\b(?:bool|double|dword|float|half|int|min(?:10float|12int|16(?:float|int|uint))|uint)(?:[1-4](?:x[1-4])?)?\b/],number:/(?:(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+)?|\b0x[\da-fA-F]+)[fFhHlLuU]?\b/,boolean:/\b(?:false|true)\b/})}return mS}var hS,aD;function Iye(){if(aD)return hS;aD=1,hS=e,e.displayName="hoon",e.aliases=[];function e(t){t.languages.hoon={comment:{pattern:/::.*/,greedy:!0},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},constant:/%(?:\.[ny]|[\w-]+)/,"class-name":/@(?:[a-z0-9-]*[a-z0-9])?|\*/i,function:/(?:\+[-+] {2})?(?:[a-z](?:[a-z0-9-]*[a-z0-9])?)/,keyword:/\.[\^\+\*=\?]|![><:\.=\?!]|=[>|:,\.\-\^<+;/~\*\?]|\?[>|:\.\-\^<\+&~=@!]|\|[\$_%:\.\-\^~\*=@\?]|\+[|\$\+\*]|:[_\-\^\+~\*]|%[_:\.\-\^\+~\*=]|\^[|:\.\-\+&~\*=\?]|\$[|_%:<>\-\^&~@=\?]|;[:<\+;\/~\*=]|~[>|\$_%<\+\/&=\?!]|--|==/}}return hS}var bS,oD;function Oye(){if(oD)return bS;oD=1,bS=e,e.displayName="hpkp",e.aliases=[];function e(t){t.languages.hpkp={directive:{pattern:/\b(?:includeSubDomains|max-age|pin-sha256|preload|report-to|report-uri|strict)(?=[\s;=]|$)/i,alias:"property"},operator:/=/,punctuation:/;/}}return bS}var yS,iD;function Dye(){if(iD)return yS;iD=1,yS=e,e.displayName="hsts",e.aliases=[];function e(t){t.languages.hsts={directive:{pattern:/\b(?:includeSubDomains|max-age|preload)(?=[\s;=]|$)/i,alias:"property"},operator:/=/,punctuation:/;/}}return yS}var vS,sD;function Lye(){if(sD)return vS;sD=1,vS=e,e.displayName="http",e.aliases=[];function e(t){(function(n){function r(d){return RegExp("(^(?:"+d+"):[ ]*(?![ ]))[^]+","i")}n.languages.http={"request-line":{pattern:/^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:n.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[\d.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[\d.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[\d.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},header:{pattern:/^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,inside:{"header-value":[{pattern:r(/Content-Security-Policy/.source),lookbehind:!0,alias:["csp","languages-csp"],inside:n.languages.csp},{pattern:r(/Public-Key-Pins(?:-Report-Only)?/.source),lookbehind:!0,alias:["hpkp","languages-hpkp"],inside:n.languages.hpkp},{pattern:r(/Strict-Transport-Security/.source),lookbehind:!0,alias:["hsts","languages-hsts"],inside:n.languages.hsts},{pattern:r(/[^:]+/.source),lookbehind:!0}],"header-name":{pattern:/^[^:]+/,alias:"keyword"},punctuation:/^:/}}};var a=n.languages,o={"application/javascript":a.javascript,"application/json":a.json||a.javascript,"application/xml":a.xml,"text/xml":a.xml,"text/html":a.html,"text/css":a.css,"text/plain":a.plain},i={"application/json":!0,"application/xml":!0};function s(d){var g=d.replace(/^[a-z]+\//,""),m="\\w+/(?:[\\w.-]+\\+)+"+g+"(?![+\\w.-])";return"(?:"+d+"|"+m+")"}var l;for(var c in o)if(o[c]){l=l||{};var u=i[c]?s(c):c;l[c.replace(/\//g,"-")]={pattern:RegExp("("+/content-type:\s*/.source+u+/(?:(?:\r\n?|\n)[\w-].*)*(?:\r(?:\n|(?!\n))|\n)/.source+")"+/[^ \t\w-][\s\S]*/.source,"i"),lookbehind:!0,inside:o[c]}}l&&n.languages.insertBefore("http","header",l)})(t)}return vS}var SS,lD;function Mye(){if(lD)return SS;lD=1,SS=e,e.displayName="ichigojam",e.aliases=[];function e(t){t.languages.ichigojam={comment:/(?:\B'|REM)(?:[^\n\r]*)/i,string:{pattern:/"(?:""|[!#$%&'()*,\/:;<=>?^\w +\-.])*"/,greedy:!0},number:/\B#[0-9A-F]+|\B`[01]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,keyword:/\b(?:BEEP|BPS|CASE|CLEAR|CLK|CLO|CLP|CLS|CLT|CLV|CONT|COPY|ELSE|END|FILE|FILES|FOR|GOSUB|GOTO|GSB|IF|INPUT|KBD|LED|LET|LIST|LOAD|LOCATE|LRUN|NEW|NEXT|OUT|PLAY|POKE|PRINT|PWM|REM|RENUM|RESET|RETURN|RIGHT|RTN|RUN|SAVE|SCROLL|SLEEP|SRND|STEP|STOP|SUB|TEMPO|THEN|TO|UART|VIDEO|WAIT)(?:\$|\b)/i,function:/\b(?:ABS|ANA|ASC|BIN|BTN|DEC|END|FREE|HELP|HEX|I2CR|I2CW|IN|INKEY|LEN|LINE|PEEK|RND|SCR|SOUND|STR|TICK|USR|VER|VPEEK|ZER)(?:\$|\b)/i,label:/(?:\B@\S+)/,operator:/<[=>]?|>=?|\|\||&&|[+\-*\/=|&^~!]|\b(?:AND|NOT|OR)\b/i,punctuation:/[\[,;:()\]]/}}return SS}var wS,cD;function Pye(){if(cD)return wS;cD=1,wS=e,e.displayName="icon",e.aliases=[];function e(t){t.languages.icon={comment:/#.*/,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n_]|\\.|_(?!\1)(?:\r\n|[\s\S]))*\1/,greedy:!0},number:/\b(?:\d+r[a-z\d]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b|\.\d+\b/i,"builtin-keyword":{pattern:/&(?:allocated|ascii|clock|collections|cset|current|date|dateline|digits|dump|e|error(?:number|text|value)?|errout|fail|features|file|host|input|lcase|letters|level|line|main|null|output|phi|pi|pos|progname|random|regions|source|storage|subject|time|trace|ucase|version)\b/,alias:"variable"},directive:{pattern:/\$\w+/,alias:"builtin"},keyword:/\b(?:break|by|case|create|default|do|else|end|every|fail|global|if|initial|invocable|link|local|next|not|of|procedure|record|repeat|return|static|suspend|then|to|until|while)\b/,function:/\b(?!\d)\w+(?=\s*[({]|\s*!\s*\[)/,operator:/[+-]:(?!=)|(?:[\/?@^%&]|\+\+?|--?|==?=?|~==?=?|\*\*?|\|\|\|?|<(?:->?|>?=?)(?::=)?|:(?:=:?)?|[!.\\|~]/,punctuation:/[\[\](){},;]/}}return wS}var ES,uD;function $ye(){if(uD)return ES;uD=1,ES=e,e.displayName="icuMessageFormat",e.aliases=[];function e(t){(function(n){function r(c,u){return u<=0?/[]/.source:c.replace(//g,function(){return r(c,u-1)})}var a=/'[{}:=,](?:[^']|'')*'(?!')/,o={pattern:/''/,greedy:!0,alias:"operator"},i={pattern:a,greedy:!0,inside:{escape:o}},s=r(/\{(?:[^{}']|'(?![{},'])|''||)*\}/.source.replace(//g,function(){return a.source}),8),l={pattern:RegExp(s),inside:{message:{pattern:/^(\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:null},"message-delimiter":{pattern:/./,alias:"punctuation"}}};n.languages["icu-message-format"]={argument:{pattern:RegExp(s),greedy:!0,inside:{content:{pattern:/^(\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:{"argument-name":{pattern:/^(\s*)[^{}:=,\s]+/,lookbehind:!0},"choice-style":{pattern:/^(\s*,\s*choice\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{punctuation:/\|/,range:{pattern:/^(\s*)[+-]?(?:\d+(?:\.\d*)?|\u221e)\s*[<#\u2264]/,lookbehind:!0,inside:{operator:/[<#\u2264]/,number:/\S+/}},rest:null}},"plural-style":{pattern:/^(\s*,\s*(?:plural|selectordinal)\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{offset:/^offset:\s*\d+/,"nested-message":l,selector:{pattern:/=\d+|[^{}:=,\s]+/,inside:{keyword:/^(?:few|many|one|other|two|zero)$/}}}},"select-style":{pattern:/^(\s*,\s*select\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{"nested-message":l,selector:{pattern:/[^{}:=,\s]+/,inside:{keyword:/^other$/}}}},keyword:/\b(?:choice|plural|select|selectordinal)\b/,"arg-type":{pattern:/\b(?:date|duration|number|ordinal|spellout|time)\b/,alias:"keyword"},"arg-skeleton":{pattern:/(,\s*)::[^{}:=,\s]+/,lookbehind:!0},"arg-style":{pattern:/(,\s*)(?:currency|full|integer|long|medium|percent|short)(?=\s*$)/,lookbehind:!0},"arg-style-text":{pattern:RegExp(/(^\s*,\s*(?=\S))/.source+r(/(?:[^{}']|'[^']*'|\{(?:)?\})+/.source,8)+"$"),lookbehind:!0,alias:"string"},punctuation:/,/}},"argument-delimiter":{pattern:/./,alias:"operator"}}},escape:o,string:i},l.inside.message.inside=n.languages["icu-message-format"],n.languages["icu-message-format"].argument.inside.content.inside["choice-style"].inside.rest=n.languages["icu-message-format"]})(t)}return ES}var xS,dD;function Fye(){if(dD)return xS;dD=1;var e=NA();xS=t,t.displayName="idris",t.aliases=["idr"];function t(n){n.register(e),n.languages.idris=n.languages.extend("haskell",{comment:{pattern:/(?:(?:--|\|\|\|).*$|\{-[\s\S]*?-\})/m},keyword:/\b(?:Type|case|class|codata|constructor|corecord|data|do|dsl|else|export|if|implementation|implicit|import|impossible|in|infix|infixl|infixr|instance|interface|let|module|mutual|namespace|of|parameters|partial|postulate|private|proof|public|quoteGoal|record|rewrite|syntax|then|total|using|where|with)\b/,builtin:void 0}),n.languages.insertBefore("idris","keyword",{"import-statement":{pattern:/(^\s*import\s+)(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*/m,lookbehind:!0,inside:{punctuation:/\./}}}),n.languages.idr=n.languages.idris}return xS}var kS,fD;function jye(){if(fD)return kS;fD=1,kS=e,e.displayName="iecst",e.aliases=[];function e(t){t.languages.iecst={comment:[{pattern:/(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\(\*[\s\S]*?(?:\*\)|$)|\{[\s\S]*?(?:\}|$))/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:[/\b(?:END_)?(?:PROGRAM|CONFIGURATION|INTERFACE|FUNCTION_BLOCK|FUNCTION|ACTION|TRANSITION|TYPE|STRUCT|(?:INITIAL_)?STEP|NAMESPACE|LIBRARY|CHANNEL|FOLDER|RESOURCE|VAR_(?:ACCESS|CONFIG|EXTERNAL|GLOBAL|INPUT|IN_OUT|OUTPUT|TEMP)|VAR|METHOD|PROPERTY)\b/i,/\b(?:AT|BY|(?:END_)?(?:CASE|FOR|IF|REPEAT|WHILE)|CONSTANT|CONTINUE|DO|ELSE|ELSIF|EXIT|EXTENDS|FROM|GET|GOTO|IMPLEMENTS|JMP|NON_RETAIN|OF|PRIVATE|PROTECTED|PUBLIC|RETAIN|RETURN|SET|TASK|THEN|TO|UNTIL|USING|WITH|__CATCH|__ENDTRY|__FINALLY|__TRY)\b/],"class-name":/\b(?:ANY|ARRAY|BOOL|BYTE|U?(?:D|L|S)?INT|(?:D|L)?WORD|DATE(?:_AND_TIME)?|DT|L?REAL|POINTER|STRING|TIME(?:_OF_DAY)?|TOD)\b/,address:{pattern:/%[IQM][XBWDL][\d.]*|%[IQ][\d.]*/,alias:"symbol"},number:/\b(?:16#[\da-f]+|2#[01_]+|0x[\da-f]+)\b|\b(?:D|DT|T|TOD)#[\d_shmd:]*|\b[A-Z]*#[\d.,_]*|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/,operator:/S?R?:?=>?|&&?|\*\*?|<[=>]?|>=?|[-:^/+#]|\b(?:AND|EQ|EXPT|GE|GT|LE|LT|MOD|NE|NOT|OR|XOR)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,punctuation:/[()[\].,;]/}}return kS}var CS,pD;function zye(){if(pD)return CS;pD=1,CS=e,e.displayName="ignore",e.aliases=["gitignore","hgignore","npmignore"];function e(t){(function(n){n.languages.ignore={comment:/^#.*/m,entry:{pattern:/\S(?:.*(?:(?:\\ )|\S))?/,alias:"string",inside:{operator:/^!|\*\*?|\?/,regex:{pattern:/(^|[^\\])\[[^\[\]]*\]/,lookbehind:!0},punctuation:/\//}}},n.languages.gitignore=n.languages.ignore,n.languages.hgignore=n.languages.ignore,n.languages.npmignore=n.languages.ignore})(t)}return CS}var _S,gD;function Uye(){if(gD)return _S;gD=1,_S=e,e.displayName="inform7",e.aliases=[];function e(t){t.languages.inform7={string:{pattern:/"[^"]*"/,inside:{substitution:{pattern:/\[[^\[\]]+\]/,inside:{delimiter:{pattern:/\[|\]/,alias:"punctuation"}}}}},comment:{pattern:/\[[^\[\]]+\]/,greedy:!0},title:{pattern:/^[ \t]*(?:book|chapter|part(?! of)|section|table|volume)\b.+/im,alias:"important"},number:{pattern:/(^|[^-])(?:\b\d+(?:\.\d+)?(?:\^\d+)?(?:(?!\d)\w+)?|\b(?:eight|eleven|five|four|nine|one|seven|six|ten|three|twelve|two))\b(?!-)/i,lookbehind:!0},verb:{pattern:/(^|[^-])\b(?:answering|applying to|are|asking|attacking|be(?:ing)?|burning|buying|called|carries|carry(?! out)|carrying|climbing|closing|conceal(?:ing|s)?|consulting|contain(?:ing|s)?|cutting|drinking|dropping|eating|enclos(?:es?|ing)|entering|examining|exiting|getting|giving|going|ha(?:s|ve|ving)|hold(?:ing|s)?|impl(?:ies|y)|incorporat(?:es?|ing)|inserting|is|jumping|kissing|listening|locking|looking|mean(?:ing|s)?|opening|provid(?:es?|ing)|pulling|pushing|putting|relat(?:es?|ing)|removing|searching|see(?:ing|s)?|setting|showing|singing|sleeping|smelling|squeezing|support(?:ing|s)?|swearing|switching|taking|tasting|telling|thinking|throwing|touching|turning|tying|unlock(?:ing|s)?|var(?:ies|y|ying)|waiting|waking|waving|wear(?:ing|s)?)\b(?!-)/i,lookbehind:!0,alias:"operator"},keyword:{pattern:/(^|[^-])\b(?:after|before|carry out|check|continue the action|definition(?= *:)|do nothing|else|end (?:if|the story|unless)|every turn|if|include|instead(?: of)?|let|move|no|now|otherwise|repeat|report|resume the story|rule for|running through|say(?:ing)?|stop the action|test|try(?:ing)?|understand|unless|use|when|while|yes)\b(?!-)/i,lookbehind:!0},property:{pattern:/(^|[^-])\b(?:adjacent(?! to)|carried|closed|concealed|contained|dark|described|edible|empty|enclosed|enterable|even|female|fixed in place|full|handled|held|improper-named|incorporated|inedible|invisible|lighted|lit|lock(?:able|ed)|male|marked for listing|mentioned|negative|neuter|non-(?:empty|full|recurring)|odd|opaque|open(?:able)?|plural-named|portable|positive|privately-named|proper-named|provided|publically-named|pushable between rooms|recurring|related|rubbing|scenery|seen|singular-named|supported|swinging|switch(?:able|ed(?: off| on)?)|touch(?:able|ed)|transparent|unconcealed|undescribed|unlit|unlocked|unmarked for listing|unmentioned|unopenable|untouchable|unvisited|variable|visible|visited|wearable|worn)\b(?!-)/i,lookbehind:!0,alias:"symbol"},position:{pattern:/(^|[^-])\b(?:above|adjacent to|back side of|below|between|down|east|everywhere|front side|here|in|inside(?: from)?|north(?:east|west)?|nowhere|on(?: top of)?|other side|outside(?: from)?|parts? of|regionally in|south(?:east|west)?|through|up|west|within)\b(?!-)/i,lookbehind:!0,alias:"keyword"},type:{pattern:/(^|[^-])\b(?:actions?|activit(?:ies|y)|actors?|animals?|backdrops?|containers?|devices?|directions?|doors?|holders?|kinds?|lists?|m[ae]n|nobody|nothing|nouns?|numbers?|objects?|people|persons?|player(?:'s holdall)?|regions?|relations?|rooms?|rule(?:book)?s?|scenes?|someone|something|supporters?|tables?|texts?|things?|time|vehicles?|wom[ae]n)\b(?!-)/i,lookbehind:!0,alias:"variable"},punctuation:/[.,:;(){}]/},t.languages.inform7.string.inside.substitution.inside.rest=t.languages.inform7,t.languages.inform7.string.inside.substitution.inside.rest.text={pattern:/\S(?:\s*\S)*/,alias:"comment"}}return _S}var AS,mD;function Bye(){if(mD)return AS;mD=1,AS=e,e.displayName="ini",e.aliases=[];function e(t){t.languages.ini={comment:{pattern:/(^[ \f\t\v]*)[#;][^\n\r]*/m,lookbehind:!0},section:{pattern:/(^[ \f\t\v]*)\[[^\n\r\]]*\]?/m,lookbehind:!0,inside:{"section-name":{pattern:/(^\[[ \f\t\v]*)[^ \f\t\v\]]+(?:[ \f\t\v]+[^ \f\t\v\]]+)*/,lookbehind:!0,alias:"selector"},punctuation:/\[|\]/}},key:{pattern:/(^[ \f\t\v]*)[^ \f\n\r\t\v=]+(?:[ \f\t\v]+[^ \f\n\r\t\v=]+)*(?=[ \f\t\v]*=)/m,lookbehind:!0,alias:"attr-name"},value:{pattern:/(=[ \f\t\v]*)[^ \f\n\r\t\v]+(?:[ \f\t\v]+[^ \f\n\r\t\v]+)*/,lookbehind:!0,alias:"attr-value",inside:{"inner-value":{pattern:/^("|').+(?=\1$)/,lookbehind:!0}}},punctuation:/=/}}return AS}var TS,hD;function Hye(){if(hD)return TS;hD=1,TS=e,e.displayName="io",e.aliases=[];function e(t){t.languages.io={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\/\/.*|#.*)/,lookbehind:!0,greedy:!0},"triple-quoted-string":{pattern:/"""(?:\\[\s\S]|(?!""")[^\\])*"""/,greedy:!0,alias:"string"},string:{pattern:/"(?:\\.|[^\\\r\n"])*"/,greedy:!0},keyword:/\b(?:activate|activeCoroCount|asString|block|break|call|catch|clone|collectGarbage|compileString|continue|do|doFile|doMessage|doString|else|elseif|exit|for|foreach|forward|getEnvironmentVariable|getSlot|hasSlot|if|ifFalse|ifNil|ifNilEval|ifTrue|isActive|isNil|isResumable|list|message|method|parent|pass|pause|perform|performWithArgList|print|println|proto|raise|raiseResumable|removeSlot|resend|resume|schedulerSleepSeconds|self|sender|setSchedulerSleepSeconds|setSlot|shallowCopy|slotNames|super|system|then|thisBlock|thisContext|try|type|uniqueId|updateSlot|wait|while|write|yield)\b/,builtin:/\b(?:Array|AudioDevice|AudioMixer|BigNum|Block|Box|Buffer|CFunction|CGI|Color|Curses|DBM|DNSResolver|DOConnection|DOProxy|DOServer|Date|Directory|Duration|DynLib|Error|Exception|FFT|File|Fnmatch|Font|Future|GL|GLE|GLScissor|GLU|GLUCylinder|GLUQuadric|GLUSphere|GLUT|Host|Image|Importer|LinkList|List|Lobby|Locals|MD5|MP3Decoder|MP3Encoder|Map|Message|Movie|Notification|Number|Object|OpenGL|Point|Protos|Random|Regex|SGML|SGMLElement|SGMLParser|SQLite|Sequence|Server|ShowMessage|SleepyCat|SleepyCatCursor|Socket|SocketManager|Sound|Soup|Store|String|Tree|UDPSender|UPDReceiver|URL|User|Warning|WeakLink)\b/,boolean:/\b(?:false|nil|true)\b/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e-?\d+)?/i,operator:/[=!*/%+\-^&|]=|>>?=?|<+*\-%$|,#][.:]?|[?^]\.?|[;\[]:?|[~}"i][.:]|[ACeEIjLor]\.|(?:[_\/\\qsux]|_?\d):)/,alias:"keyword"},number:/\b_?(?:(?!\d:)\d+(?:\.\d+)?(?:(?:ad|ar|[ejpx])_?\d+(?:\.\d+)?)*(?:b_?[\da-z]+(?:\.[\da-z]+)?)?|_\b(?!\.))/,adverb:{pattern:/[~}]|[\/\\]\.?|[bfM]\.|t[.:]/,alias:"builtin"},operator:/[=a][.:]|_\./,conjunction:{pattern:/&(?:\.:?|:)?|[.:@][.:]?|[!D][.:]|[;dHT]\.|`:?|[\^LS]:|"/,alias:"variable"},punctuation:/[()]/}}return RS}var NS,yD;function IA(){if(yD)return NS;yD=1,NS=e,e.displayName="java",e.aliases=[];function e(t){(function(n){var r=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,a=/(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,o={pattern:RegExp(a+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};n.languages.java=n.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[o,{pattern:RegExp(a+/[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source),lookbehind:!0,inside:o.inside}],keyword:r,function:[n.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),n.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),n.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":o,keyword:r,punctuation:/[<>(),.:]/,operator:/[?&|]/}},namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,function(){return r.source})),lookbehind:!0,inside:{punctuation:/\./}}})})(t)}return NS}var IS,vD;function Rh(){if(vD)return IS;vD=1,IS=e,e.displayName="javadoclike",e.aliases=[];function e(t){(function(n){var r=n.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};function a(i,s){var l="doc-comment",c=n.languages[i];if(c){var u=c[l];if(!u){var d={};d[l]={pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"},c=n.languages.insertBefore(i,"comment",d),u=c[l]}if(u instanceof RegExp&&(u=c[l]={pattern:u}),Array.isArray(u))for(var g=0,m=u.length;g)?|/.source.replace(//g,function(){return i});a.languages.javadoc=a.languages.extend("javadoclike",{}),a.languages.insertBefore("javadoc","keyword",{reference:{pattern:RegExp(/(@(?:exception|link|linkplain|see|throws|value)\s+(?:\*\s*)?)/.source+"(?:"+s+")"),lookbehind:!0,inside:{function:{pattern:/(#\s*)\w+(?=\s*\()/,lookbehind:!0},field:{pattern:/(#\s*)\w+/,lookbehind:!0},namespace:{pattern:/\b(?:[a-z]\w*\s*\.\s*)+/,inside:{punctuation:/\./}},"class-name":/\b[A-Z]\w*/,keyword:a.languages.java.keyword,punctuation:/[#()[\],.]/}},"class-name":{pattern:/(@param\s+)<[A-Z]\w*>/,lookbehind:!0,inside:{punctuation:/[.<>]/}},"code-section":[{pattern:/(\{@code\s+(?!\s))(?:[^\s{}]|\s+(?![\s}])|\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\})+(?=\s*\})/,lookbehind:!0,inside:{code:{pattern:o,lookbehind:!0,inside:a.languages.java,alias:"language-java"}}},{pattern:/(<(code|pre|tt)>(?!)\s*)\S(?:\S|\s+\S)*?(?=\s*<\/\2>)/,lookbehind:!0,inside:{line:{pattern:o,lookbehind:!0,inside:{tag:a.languages.markup.tag,entity:a.languages.markup.entity,code:{pattern:/.+/,inside:a.languages.java,alias:"language-java"}}}}}],tag:a.languages.markup.tag,entity:a.languages.markup.entity}),a.languages.javadoclike.addSupport("java",a.languages.javadoc)}(r)}return OS}var DS,wD;function Gye(){if(wD)return DS;wD=1,DS=e,e.displayName="javastacktrace",e.aliases=[];function e(t){t.languages.javastacktrace={summary:{pattern:/^([\t ]*)(?:(?:Caused by:|Suppressed:|Exception in thread "[^"]*")[\t ]+)?[\w$.]+(?::.*)?$/m,lookbehind:!0,inside:{keyword:{pattern:/^([\t ]*)(?:(?:Caused by|Suppressed)(?=:)|Exception in thread)/m,lookbehind:!0},string:{pattern:/^(\s*)"[^"]*"/,lookbehind:!0},exceptions:{pattern:/^(:?\s*)[\w$.]+(?=:|$)/,lookbehind:!0,inside:{"class-name":/[\w$]+$/,namespace:/\b[a-z]\w*\b/,punctuation:/\./}},message:{pattern:/(:\s*)\S.*/,lookbehind:!0,alias:"string"},punctuation:/:/}},"stack-frame":{pattern:/^([\t ]*)at (?:[\w$./]|@[\w$.+-]*\/)+(?:)?\([^()]*\)/m,lookbehind:!0,inside:{keyword:{pattern:/^(\s*)at(?= )/,lookbehind:!0},source:[{pattern:/(\()\w+\.\w+:\d+(?=\))/,lookbehind:!0,inside:{file:/^\w+\.\w+/,punctuation:/:/,"line-number":{pattern:/\b\d+\b/,alias:"number"}}},{pattern:/(\()[^()]*(?=\))/,lookbehind:!0,inside:{keyword:/^(?:Native Method|Unknown Source)$/}}],"class-name":/[\w$]+(?=\.(?:|[\w$]+)\()/,function:/(?:|[\w$]+)(?=\()/,"class-loader":{pattern:/(\s)[a-z]\w*(?:\.[a-z]\w*)*(?=\/[\w@$.]*\/)/,lookbehind:!0,alias:"namespace",inside:{punctuation:/\./}},module:{pattern:/([\s/])[a-z]\w*(?:\.[a-z]\w*)*(?:@[\w$.+-]*)?(?=\/)/,lookbehind:!0,inside:{version:{pattern:/(@)[\s\S]+/,lookbehind:!0,alias:"number"},punctuation:/[@.]/}},namespace:{pattern:/(?:\b[a-z]\w*\.)+/,inside:{punctuation:/\./}},punctuation:/[()/.]/}},more:{pattern:/^([\t ]*)\.{3} \d+ [a-z]+(?: [a-z]+)*/m,lookbehind:!0,inside:{punctuation:/\.{3}/,number:/\d+/,keyword:/\b[a-z]+(?: [a-z]+)*\b/}}}}return DS}var LS,ED;function Wye(){if(ED)return LS;ED=1,LS=e,e.displayName="jexl",e.aliases=[];function e(t){t.languages.jexl={string:/(["'])(?:\\[\s\S]|(?!\1)[^\\])*\1/,transform:{pattern:/(\|\s*)[a-zA-Zа-яА-Я_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$][\wа-яА-Я\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$]*/,alias:"function",lookbehind:!0},function:/[a-zA-Zа-яА-Я_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$][\wа-яА-Я\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$]*\s*(?=\()/,number:/\b\d+(?:\.\d+)?\b|\B\.\d+\b/,operator:/[<>!]=?|-|\+|&&|==|\|\|?|\/\/?|[?:*^%]/,boolean:/\b(?:false|true)\b/,keyword:/\bin\b/,punctuation:/[{}[\](),.]/}}return LS}var MS,xD;function Kye(){if(xD)return MS;xD=1,MS=e,e.displayName="jolie",e.aliases=[];function e(t){t.languages.jolie=t.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\[\s\S]|[^"\\])*"/,lookbehind:!0,greedy:!0},"class-name":{pattern:/((?:\b(?:as|courier|embed|in|inputPort|outputPort|service)\b|@)[ \t]*)\w+/,lookbehind:!0},keyword:/\b(?:as|cH|comp|concurrent|constants|courier|cset|csets|default|define|else|embed|embedded|execution|exit|extender|for|foreach|forward|from|global|if|import|in|include|init|inputPort|install|instanceof|interface|is_defined|linkIn|linkOut|main|new|nullProcess|outputPort|over|private|provide|public|scope|sequential|service|single|spawn|synchronized|this|throw|throws|type|undef|until|while|with)\b/,function:/\b[a-z_]\w*(?=[ \t]*[@(])/i,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?l?/i,operator:/-[-=>]?|\+[+=]?|<[<=]?|[>=*!]=?|&&|\|\||[?\/%^@|]/,punctuation:/[()[\]{},;.:]/,builtin:/\b(?:Byte|any|bool|char|double|enum|float|int|length|long|ranges|regex|string|undefined|void)\b/}),t.languages.insertBefore("jolie","keyword",{aggregates:{pattern:/(\bAggregates\s*:\s*)(?:\w+(?:\s+with\s+\w+)?\s*,\s*)*\w+(?:\s+with\s+\w+)?/,lookbehind:!0,inside:{keyword:/\bwith\b/,"class-name":/\w+/,punctuation:/,/}},redirects:{pattern:/(\bRedirects\s*:\s*)(?:\w+\s*=>\s*\w+\s*,\s*)*(?:\w+\s*=>\s*\w+)/,lookbehind:!0,inside:{punctuation:/,/,"class-name":/\w+/,operator:/=>/}},property:{pattern:/\b(?:Aggregates|[Ii]nterfaces|Java|Javascript|Jolie|[Ll]ocation|OneWay|[Pp]rotocol|Redirects|RequestResponse)\b(?=[ \t]*:)/}})}return MS}var PS,kD;function Yye(){if(kD)return PS;kD=1,PS=e,e.displayName="jq",e.aliases=[];function e(t){(function(n){var r=/\\\((?:[^()]|\([^()]*\))*\)/.source,a=RegExp(/(^|[^\\])"(?:[^"\r\n\\]|\\[^\r\n(]|__)*"/.source.replace(/__/g,function(){return r})),o={interpolation:{pattern:RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+r),lookbehind:!0,inside:{content:{pattern:/^(\\\()[\s\S]+(?=\)$)/,lookbehind:!0,inside:null},punctuation:/^\\\(|\)$/}}},i=n.languages.jq={comment:/#.*/,property:{pattern:RegExp(a.source+/(?=\s*:(?!:))/.source),lookbehind:!0,greedy:!0,inside:o},string:{pattern:a,lookbehind:!0,greedy:!0,inside:o},function:{pattern:/(\bdef\s+)[a-z_]\w+/i,lookbehind:!0},variable:/\B\$\w+/,"property-literal":{pattern:/\b[a-z_]\w*(?=\s*:(?!:))/i,alias:"property"},keyword:/\b(?:as|break|catch|def|elif|else|end|foreach|if|import|include|label|module|modulemeta|null|reduce|then|try|while)\b/,boolean:/\b(?:false|true)\b/,number:/(?:\b\d+\.|\B\.)?\b\d+(?:[eE][+-]?\d+)?\b/,operator:[{pattern:/\|=?/,alias:"pipe"},/\.\.|[!=<>]?=|\?\/\/|\/\/=?|[-+*/%]=?|[<>?]|\b(?:and|not|or)\b/],"c-style-function":{pattern:/\b[a-z_]\w*(?=\s*\()/i,alias:"function"},punctuation:/::|[()\[\]{},:;]|\.(?=\s*[\[\w$])/,dot:{pattern:/\./,alias:"important"}};o.interpolation.inside.content.inside=i})(t)}return PS}var $S,CD;function Zye(){if(CD)return $S;CD=1,$S=e,e.displayName="jsExtras",e.aliases=[];function e(t){(function(n){n.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+n.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),n.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+n.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),n.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]});function r(c,u){return RegExp(c.replace(//g,function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source}),u)}n.languages.insertBefore("javascript","keyword",{imports:{pattern:r(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:n.languages.javascript},exports:{pattern:r(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:n.languages.javascript}}),n.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),n.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),n.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:r(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var a=["function","function-variable","method","method-variable","property-access"],o=0;o=C.length)return;var L=R[T];if(typeof L=="string"||typeof L.content=="string"){var D=C[S],H=typeof L=="string"?L:L.content,z=H.indexOf(D);if(z!==-1){++S;var M=H.substring(0,z),U=d(E[D]),X=H.substring(z+D.length),j=[];if(M&&j.push(M),j.push(U),X){var O=[X];_(O),j.push.apply(j,O)}typeof L=="string"?(R.splice.apply(R,[T,1].concat(j)),T+=j.length-1):L.content=j}}else{var A=L.content;Array.isArray(A)?_(A):_([A])}}}return _(x),new n.Token(v,x,"language-"+v,y)}var m={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};n.hooks.add("after-tokenize",function(y){if(!(y.language in m))return;function w(v){for(var h=0,S=v.length;h]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),n.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete n.languages.typescript.parameter,delete n.languages.typescript["literal-property"];var r=n.languages.extend("typescript",{});delete r["class-name"],n.languages.typescript["class-name"].inside=r,n.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:r}}}}),n.languages.ts=n.languages.typescript})(t)}return jS}var zS,TD;function Qye(){if(TD)return zS;TD=1;var e=Rh(),t=OA();zS=n,n.displayName="jsdoc",n.aliases=[];function n(r){r.register(e),r.register(t),function(a){var o=a.languages.javascript,i=/\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})+\}/.source,s="(@(?:arg|argument|param|property)\\s+(?:"+i+"\\s+)?)";a.languages.jsdoc=a.languages.extend("javadoclike",{parameter:{pattern:RegExp(s+/(?:(?!\s)[$\w\xA0-\uFFFF.])+(?=\s|$)/.source),lookbehind:!0,inside:{punctuation:/\./}}}),a.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(s+/\[(?:(?!\s)[$\w\xA0-\uFFFF.])+(?:=[^[\]]+)?\](?=\s|$)/.source),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:o,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp(/(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\s+(?:\s+)?)[A-Z]\w*(?:\.[A-Z]\w*)*/.source.replace(//g,function(){return i})),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+i),lookbehind:!0,inside:{string:o.string,number:o.number,boolean:o.boolean,keyword:a.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:o,alias:"language-javascript"}}}}),a.languages.javadoclike.addSupport("javascript",a.languages.jsdoc)}(r)}return zS}var US,RD;function DA(){if(RD)return US;RD=1,US=e,e.displayName="json",e.aliases=["webmanifest"];function e(t){t.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},t.languages.webmanifest=t.languages.json}return US}var BS,ND;function Jye(){if(ND)return BS;ND=1;var e=DA();BS=t,t.displayName="json5",t.aliases=[];function t(n){n.register(e),function(r){var a=/("|')(?:\\(?:\r\n?|\n|.)|(?!\1)[^\\\r\n])*\1/;r.languages.json5=r.languages.extend("json",{property:[{pattern:RegExp(a.source+"(?=\\s*:)"),greedy:!0},{pattern:/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/,alias:"unquoted"}],string:{pattern:a,greedy:!0},number:/[+-]?\b(?:NaN|Infinity|0x[a-fA-F\d]+)\b|[+-]?(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+\b)?/})}(n)}return BS}var HS,ID;function eve(){if(ID)return HS;ID=1;var e=DA();HS=t,t.displayName="jsonp",t.aliases=[];function t(n){n.register(e),n.languages.jsonp=n.languages.extend("json",{punctuation:/[{}[\]();,.]/}),n.languages.insertBefore("jsonp","punctuation",{function:/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*\()/})}return HS}var VS,OD;function tve(){if(OD)return VS;OD=1,VS=e,e.displayName="jsstacktrace",e.aliases=[];function e(t){t.languages.jsstacktrace={"error-message":{pattern:/^\S.*/m,alias:"string"},"stack-frame":{pattern:/(^[ \t]+)at[ \t].*/m,lookbehind:!0,inside:{"not-my-code":{pattern:/^at[ \t]+(?!\s)(?:node\.js||.*(?:node_modules|\(\)|\(|$|\(internal\/|\(node\.js)).*/m,alias:"comment"},filename:{pattern:/(\bat\s+(?!\s)|\()(?:[a-zA-Z]:)?[^():]+(?=:)/,lookbehind:!0,alias:"url"},function:{pattern:/(\bat\s+(?:new\s+)?)(?!\s)[_$a-zA-Z\xA0-\uFFFF<][.$\w\xA0-\uFFFF<>]*/,lookbehind:!0,inside:{punctuation:/\./}},punctuation:/[()]/,keyword:/\b(?:at|new)\b/,alias:{pattern:/\[(?:as\s+)?(?!\s)[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\]/,alias:"variable"},"line-number":{pattern:/:\d+(?::\d+)?\b/,alias:"number",inside:{punctuation:/:/}}}}}}return VS}var qS,DD;function sz(){if(DD)return qS;DD=1,qS=e,e.displayName="jsx",e.aliases=[];function e(t){(function(n){var r=n.util.clone(n.languages.javascript),a=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,o=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,i=/(?:\{*\.{3}(?:[^{}]|)*\})/.source;function s(u,d){return u=u.replace(//g,function(){return a}).replace(//g,function(){return o}).replace(//g,function(){return i}),RegExp(u,d)}i=s(i).source,n.languages.jsx=n.languages.extend("markup",r),n.languages.jsx.tag.pattern=s(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),n.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,n.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,n.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,n.languages.jsx.tag.inside.comment=r.comment,n.languages.insertBefore("inside","attr-name",{spread:{pattern:s(//.source),inside:n.languages.jsx}},n.languages.jsx.tag),n.languages.insertBefore("inside","special-attr",{script:{pattern:s(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:n.languages.jsx}}},n.languages.jsx.tag);var l=function(u){return u?typeof u=="string"?u:typeof u.content=="string"?u.content:u.content.map(l).join(""):""},c=function(u){for(var d=[],g=0;g0&&d[d.length-1].tagName===l(m.content[0].content[1])&&d.pop():m.content[m.content.length-1].content==="/>"||d.push({tagName:l(m.content[0].content[1]),openedBraces:0}):d.length>0&&m.type==="punctuation"&&m.content==="{"?d[d.length-1].openedBraces++:d.length>0&&d[d.length-1].openedBraces>0&&m.type==="punctuation"&&m.content==="}"?d[d.length-1].openedBraces--:b=!0),(b||typeof m=="string")&&d.length>0&&d[d.length-1].openedBraces===0){var y=l(m);g0&&(typeof u[g-1]=="string"||u[g-1].type==="plain-text")&&(y=l(u[g-1])+y,u.splice(g-1,1),g--),u[g]=new n.Token("plain-text",y,null,y)}m.content&&typeof m.content!="string"&&c(m.content)}};n.hooks.add("after-tokenize",function(u){u.language!=="jsx"&&u.language!=="tsx"||c(u.tokens)})})(t)}return qS}var GS,LD;function nve(){if(LD)return GS;LD=1,GS=e,e.displayName="julia",e.aliases=[];function e(t){t.languages.julia={comment:{pattern:/(^|[^\\])(?:#=(?:[^#=]|=(?!#)|#(?!=)|#=(?:[^#=]|=(?!#)|#(?!=))*=#)*=#|#.*)/,lookbehind:!0},regex:{pattern:/r"(?:\\.|[^"\\\r\n])*"[imsx]{0,4}/,greedy:!0},string:{pattern:/"""[\s\S]+?"""|(?:\b\w+)?"(?:\\.|[^"\\\r\n])*"|`(?:[^\\`\r\n]|\\.)*`/,greedy:!0},char:{pattern:/(^|[^\w'])'(?:\\[^\r\n][^'\r\n]*|[^\\\r\n])'/,lookbehind:!0,greedy:!0},keyword:/\b(?:abstract|baremodule|begin|bitstype|break|catch|ccall|const|continue|do|else|elseif|end|export|finally|for|function|global|if|immutable|import|importall|in|let|local|macro|module|print|println|quote|return|struct|try|type|typealias|using|while)\b/,boolean:/\b(?:false|true)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[box])?(?:[\da-f]+(?:_[\da-f]+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[efp][+-]?\d+(?:_\d+)*)?j?/i,operator:/&&|\|\||[-+*^%÷⊻&$\\]=?|\/[\/=]?|!=?=?|\|[=>]?|<(?:<=?|[=:|])?|>(?:=|>>?=?)?|==?=?|[~≠≤≥'√∛]/,punctuation:/::?|[{}[\]();,.?]/,constant:/\b(?:(?:Inf|NaN)(?:16|32|64)?|im|pi)\b|[πℯ]/}}return GS}var WS,MD;function rve(){if(MD)return WS;MD=1,WS=e,e.displayName="keepalived",e.aliases=[];function e(t){t.languages.keepalived={comment:{pattern:/[#!].*/,greedy:!0},string:{pattern:/(^|[^\\])(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/,lookbehind:!0,greedy:!0},ip:{pattern:RegExp(/\b(?:(?:(?:[\da-f]{1,4}:){7}[\da-f]{1,4}|(?:[\da-f]{1,4}:){6}:[\da-f]{1,4}|(?:[\da-f]{1,4}:){5}:(?:[\da-f]{1,4}:)?[\da-f]{1,4}|(?:[\da-f]{1,4}:){4}:(?:[\da-f]{1,4}:){0,2}[\da-f]{1,4}|(?:[\da-f]{1,4}:){3}:(?:[\da-f]{1,4}:){0,3}[\da-f]{1,4}|(?:[\da-f]{1,4}:){2}:(?:[\da-f]{1,4}:){0,4}[\da-f]{1,4}|(?:[\da-f]{1,4}:){6}|(?:[\da-f]{1,4}:){0,5}:|::(?:[\da-f]{1,4}:){0,5}|[\da-f]{1,4}::(?:[\da-f]{1,4}:){0,5}[\da-f]{1,4}|::(?:[\da-f]{1,4}:){0,6}[\da-f]{1,4}|(?:[\da-f]{1,4}:){1,7}:)(?:\/\d{1,3})?|(?:\/\d{1,2})?)\b/.source.replace(//g,function(){return/(?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d))/.source}),"i"),alias:"number"},path:{pattern:/(\s)\/(?:[^\/\s]+\/)*[^\/\s]*|\b[a-zA-Z]:\\(?:[^\\\s]+\\)*[^\\\s]*/,lookbehind:!0,alias:"string"},variable:/\$\{?\w+\}?/,email:{pattern:/[\w-]+@[\w-]+(?:\.[\w-]{2,3}){1,2}/,alias:"string"},"conditional-configuration":{pattern:/@\^?[\w-]+/,alias:"variable"},operator:/=/,property:/\b(?:BFD_CHECK|DNS_CHECK|FILE_CHECK|HTTP_GET|MISC_CHECK|NAME|PING_CHECK|SCRIPTS|SMTP_CHECK|SSL|SSL_GET|TCP_CHECK|UDP_CHECK|accept|advert_int|alpha|auth_pass|auth_type|authentication|bfd_cpu_affinity|bfd_instance|bfd_no_swap|bfd_priority|bfd_process_name|bfd_rlimit_rttime|bfd_rt_priority|bind_if|bind_port|bindto|ca|certificate|check_unicast_src|checker|checker_cpu_affinity|checker_log_all_failures|checker_no_swap|checker_priority|checker_rlimit_rttime|checker_rt_priority|child_wait_time|connect_ip|connect_port|connect_timeout|dbus_service_name|debug|default_interface|delay|delay_before_retry|delay_loop|digest|dont_track_primary|dynamic|dynamic_interfaces|enable_(?:dbus|script_security|sni|snmp_checker|snmp_rfc|snmp_rfcv2|snmp_rfcv3|snmp_vrrp|traps)|end|fall|fast_recovery|file|flag-[123]|fork_delay|full_command|fwmark|garp_group|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|global_defs|global_tracking|gna_interval|group|ha_suspend|hashed|helo_name|higher_prio_send_advert|hoplimit|http_protocol|hysteresis|idle_tx|include|inhibit_on_failure|init_fail|init_file|instance|interface|interfaces|interval|ip_family|ipvs_process_name|keepalived.conf|kernel_rx_buf_size|key|linkbeat_interfaces|linkbeat_use_polling|log_all_failures|log_unknown_vrids|lower_prio_no_advert|lthreshold|lvs_flush|lvs_flush_onstop|lvs_method|lvs_netlink_cmd_rcv_bufs|lvs_netlink_cmd_rcv_bufs_force|lvs_netlink_monitor_rcv_bufs|lvs_netlink_monitor_rcv_bufs_force|lvs_notify_fifo|lvs_notify_fifo_script|lvs_sched|lvs_sync_daemon|max_auto_priority|max_hops|mcast_src_ip|mh-fallback|mh-port|min_auto_priority_delay|min_rx|min_tx|misc_dynamic|misc_path|misc_timeout|multiplier|name|namespace_with_ipsets|native_ipv6|neighbor_ip|net_namespace|net_namespace_ipvs|nftables|nftables_counters|nftables_ifindex|nftables_priority|no_accept|no_checker_emails|no_email_faults|nopreempt|notification_email|notification_email_from|notify|notify_backup|notify_deleted|notify_down|notify_fault|notify_fifo|notify_fifo_script|notify_master|notify_master_rx_lower_pri|notify_priority_changes|notify_stop|notify_up|old_unicast_checksum|omega|ops|param_match|passive|password|path|persistence_engine|persistence_granularity|persistence_timeout|preempt|preempt_delay|priority|process|process_monitor_rcv_bufs|process_monitor_rcv_bufs_force|process_name|process_names|promote_secondaries|protocol|proxy_arp|proxy_arp_pvlan|quorum|quorum_down|quorum_max|quorum_up|random_seed|real_server|regex|regex_max_offset|regex_min_offset|regex_no_match|regex_options|regex_stack|reload_repeat|reload_time_file|require_reply|retry|rise|router_id|rs_init_notifies|script|script_user|sh-fallback|sh-port|shutdown_script|shutdown_script_timeout|skip_check_adv_addr|smtp_alert|smtp_alert_checker|smtp_alert_vrrp|smtp_connect_timeout|smtp_helo_name|smtp_server|snmp_socket|sorry_server|sorry_server_inhibit|sorry_server_lvs_method|source_ip|start|startup_script|startup_script_timeout|state|static_ipaddress|static_routes|static_rules|status_code|step|strict_mode|sync_group_tracking_weight|terminate_delay|timeout|track_bfd|track_file|track_group|track_interface|track_process|track_script|track_src_ip|ttl|type|umask|unicast_peer|unicast_src_ip|unicast_ttl|url|use_ipvlan|use_pid_dir|use_vmac|user|uthreshold|val[123]|version|virtual_ipaddress|virtual_ipaddress_excluded|virtual_router_id|virtual_routes|virtual_rules|virtual_server|virtual_server_group|virtualhost|vmac_xmit_base|vrrp|vrrp_(?:check_unicast_src|cpu_affinity|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|gna_interval|higher_prio_send_advert|instance|ipsets|iptables|lower_prio_no_advert|mcast_group4|mcast_group6|min_garp|netlink_cmd_rcv_bufs|netlink_cmd_rcv_bufs_force|netlink_monitor_rcv_bufs|netlink_monitor_rcv_bufs_force|no_swap|notify_fifo|notify_fifo_script|notify_priority_changes|priority|process_name|rlimit_rttime|rt_priority|rx_bufs_multiplier|rx_bufs_policy|script|skip_check_adv_addr|startup_delay|strict|sync_group|track_process|version)|warmup|weight)\b/,constant:/\b(?:A|AAAA|AH|BACKUP|CNAME|DR|MASTER|MX|NAT|NS|PASS|SCTP|SOA|TCP|TUN|TXT|UDP|dh|fo|lblc|lblcr|lc|mh|nq|ovf|rr|sed|sh|wlc|wrr)\b/,number:{pattern:/(^|[^\w.-])-?\d+(?:\.\d+)?/,lookbehind:!0},boolean:/\b(?:false|no|off|on|true|yes)\b/,punctuation:/[\{\}]/}}return WS}var KS,PD;function ave(){if(PD)return KS;PD=1,KS=e,e.displayName="keyman",e.aliases=[];function e(t){t.languages.keyman={comment:{pattern:/\bc .*/i,greedy:!0},string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,greedy:!0},"virtual-key":{pattern:/\[\s*(?:(?:ALT|CAPS|CTRL|LALT|LCTRL|NCAPS|RALT|RCTRL|SHIFT)\s+)*(?:[TKU]_[\w?]+|[A-E]\d\d?|"[^"\r\n]*"|'[^'\r\n]*')\s*\]/i,greedy:!0,alias:"function"},"header-keyword":{pattern:/&\w+/,alias:"bold"},"header-statement":{pattern:/\b(?:bitmap|bitmaps|caps always off|caps on only|copyright|hotkey|language|layout|message|name|shift frees caps|version)\b/i,alias:"bold"},"rule-keyword":{pattern:/\b(?:any|baselayout|beep|call|context|deadkey|dk|if|index|layer|notany|nul|outs|platform|reset|return|save|set|store|use)\b/i,alias:"keyword"},"structural-keyword":{pattern:/\b(?:ansi|begin|group|match|nomatch|unicode|using keys)\b/i,alias:"keyword"},"compile-target":{pattern:/\$(?:keyman|keymanonly|keymanweb|kmfl|weaver):/i,alias:"property"},number:/\b(?:U\+[\dA-F]+|d\d+|x[\da-f]+|\d+)\b/i,operator:/[+>\\$]|\.\./,punctuation:/[()=,]/}}return KS}var YS,$D;function ove(){if($D)return YS;$D=1,YS=e,e.displayName="kotlin",e.aliases=["kt","kts"];function e(t){(function(n){n.languages.kotlin=n.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete n.languages.kotlin["class-name"];var r={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:n.languages.kotlin}};n.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:r},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:r},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete n.languages.kotlin.string,n.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),n.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),n.languages.kt=n.languages.kotlin,n.languages.kts=n.languages.kotlin})(t)}return YS}var ZS,FD;function ive(){if(FD)return ZS;FD=1,ZS=e,e.displayName="kumir",e.aliases=["kum"];function e(t){(function(n){var r=/\s\x00-\x1f\x22-\x2f\x3a-\x3f\x5b-\x5e\x60\x7b-\x7e/.source;function a(o,i){return RegExp(o.replace(//g,r),i)}n.languages.kumir={comment:{pattern:/\|.*/},prolog:{pattern:/#.*/,greedy:!0},string:{pattern:/"[^\n\r"]*"|'[^\n\r']*'/,greedy:!0},boolean:{pattern:a(/(^|[])(?:да|нет)(?=[]|$)/.source),lookbehind:!0},"operator-word":{pattern:a(/(^|[])(?:и|или|не)(?=[]|$)/.source),lookbehind:!0,alias:"keyword"},"system-variable":{pattern:a(/(^|[])знач(?=[]|$)/.source),lookbehind:!0,alias:"keyword"},type:[{pattern:a(/(^|[])(?:вещ|лит|лог|сим|цел)(?:\x20*таб)?(?=[]|$)/.source),lookbehind:!0,alias:"builtin"},{pattern:a(/(^|[])(?:компл|сканкод|файл|цвет)(?=[]|$)/.source),lookbehind:!0,alias:"important"}],keyword:{pattern:a(/(^|[])(?:алг|арг(?:\x20*рез)?|ввод|ВКЛЮЧИТЬ|вс[её]|выбор|вывод|выход|дано|для|до|дс|если|иначе|исп|использовать|кон(?:(?:\x20+|_)исп)?|кц(?:(?:\x20+|_)при)?|надо|нач|нс|нц|от|пауза|пока|при|раза?|рез|стоп|таб|то|утв|шаг)(?=[]|$)/.source),lookbehind:!0},name:{pattern:a(/(^|[])[^\d][^]*(?:\x20+[^]+)*(?=[]|$)/.source),lookbehind:!0},number:{pattern:a(/(^|[])(?:\B\$[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)(?=[]|$)/.source,"i"),lookbehind:!0},punctuation:/:=|[(),:;\[\]]/,"operator-char":{pattern:/\*\*?|<[=>]?|>=?|[-+/=]/,alias:"operator"}},n.languages.kum=n.languages.kumir})(t)}return ZS}var XS,jD;function sve(){if(jD)return XS;jD=1,XS=e,e.displayName="kusto",e.aliases=[];function e(t){t.languages.kusto={comment:{pattern:/\/\/.*/,greedy:!0},string:{pattern:/```[\s\S]*?```|[hH]?(?:"(?:[^\r\n\\"]|\\.)*"|'(?:[^\r\n\\']|\\.)*'|@(?:"[^\r\n"]*"|'[^\r\n']*'))/,greedy:!0},verb:{pattern:/(\|\s*)[a-z][\w-]*/i,lookbehind:!0,alias:"keyword"},command:{pattern:/\.[a-z][a-z\d-]*\b/,alias:"keyword"},"class-name":/\b(?:bool|datetime|decimal|dynamic|guid|int|long|real|string|timespan)\b/,keyword:/\b(?:access|alias|and|anti|as|asc|auto|between|by|(?:contains|(?:ends|starts)with|has(?:perfix|suffix)?)(?:_cs)?|database|declare|desc|external|from|fullouter|has_all|in|ingestion|inline|inner|innerunique|into|(?:left|right)(?:anti(?:semi)?|inner|outer|semi)?|let|like|local|not|of|on|or|pattern|print|query_parameters|range|restrict|schema|set|step|table|tables|to|view|where|with|matches\s+regex|nulls\s+(?:first|last))(?![\w-])/,boolean:/\b(?:false|null|true)\b/,function:/\b[a-z_]\w*(?=\s*\()/,datetime:[{pattern:/\b(?:(?:Fri|Friday|Mon|Monday|Sat|Saturday|Sun|Sunday|Thu|Thursday|Tue|Tuesday|Wed|Wednesday)\s*,\s*)?\d{1,2}(?:\s+|-)(?:Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)(?:\s+|-)\d{2}\s+\d{2}:\d{2}(?::\d{2})?(?:\s*(?:\b(?:[A-Z]|(?:[ECMT][DS]|GM|U)T)|[+-]\d{4}))?\b/,alias:"number"},{pattern:/[+-]?\b(?:\d{4}-\d{2}-\d{2}(?:[ T]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?)?|\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?)Z?/,alias:"number"}],number:/\b(?:0x[0-9A-Fa-f]+|\d+(?:\.\d+)?(?:[Ee][+-]?\d+)?)(?:(?:min|sec|[mnµ]s|[dhms]|microsecond|tick)\b)?|[+-]?\binf\b/,operator:/=>|[!=]~|[!=<>]=?|[-+*/%|]|\.\./,punctuation:/[()\[\]{},;.:]/}}return XS}var QS,zD;function lve(){if(zD)return QS;zD=1,QS=e,e.displayName="latex",e.aliases=["tex","context"];function e(t){(function(n){var r=/\\(?:[^a-z()[\]]|[a-z*]+)/i,a={"equation-command":{pattern:r,alias:"regex"}};n.languages.latex={comment:/%.*/,cdata:{pattern:/(\\begin\{((?:lstlisting|verbatim)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0},equation:[{pattern:/\$\$(?:\\[\s\S]|[^\\$])+\$\$|\$(?:\\[\s\S]|[^\\$])+\$|\\\([\s\S]*?\\\)|\\\[[\s\S]*?\\\]/,inside:a,alias:"string"},{pattern:/(\\begin\{((?:align|eqnarray|equation|gather|math|multline)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0,inside:a,alias:"string"}],keyword:{pattern:/(\\(?:begin|cite|documentclass|end|label|ref|usepackage)(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0},url:{pattern:/(\\url\{)[^}]+(?=\})/,lookbehind:!0},headline:{pattern:/(\\(?:chapter|frametitle|paragraph|part|section|subparagraph|subsection|subsubparagraph|subsubsection|subsubsubparagraph)\*?(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0,alias:"class-name"},function:{pattern:r,alias:"selector"},punctuation:/[[\]{}&]/},n.languages.tex=n.languages.latex,n.languages.context=n.languages.latex})(t)}return QS}var JS,UD;function Nh(){if(UD)return JS;UD=1;var e=mr();JS=t,t.displayName="php",t.aliases=[];function t(n){n.register(e),function(r){var a=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,o=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],i=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,s=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,l=/[{}\[\](),:;]/;r.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:a,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:o,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:i,operator:s,punctuation:l};var c={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:r.languages.php},u=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:c}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:c}}];r.languages.insertBefore("php","variable",{string:u,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:a,string:u,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:o,number:i,operator:s,punctuation:l}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),r.hooks.add("before-tokenize",function(d){if(/<\?/.test(d.code)){var g=/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g;r.languages["markup-templating"].buildPlaceholders(d,"php",g)}}),r.hooks.add("after-tokenize",function(d){r.languages["markup-templating"].tokenizePlaceholders(d,"php")})}(n)}return JS}var ew,BD;function cve(){if(BD)return ew;BD=1;var e=mr(),t=Nh();ew=n,n.displayName="latte",n.aliases=[];function n(r){r.register(e),r.register(t),function(a){a.languages.latte={comment:/^\{\*[\s\S]*/,"latte-tag":{pattern:/(^\{(?:\/(?=[a-z]))?)(?:[=_]|[a-z]\w*\b(?!\())/i,lookbehind:!0,alias:"important"},delimiter:{pattern:/^\{\/?|\}$/,alias:"punctuation"},php:{pattern:/\S(?:[\s\S]*\S)?/,alias:"language-php",inside:a.languages.php}};var o=a.languages.extend("markup",{});a.languages.insertBefore("inside","attr-value",{"n-attr":{pattern:/n:[\w-]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+))?/,inside:{"attr-name":{pattern:/^[^\s=]+/,alias:"important"},"attr-value":{pattern:/=[\s\S]+/,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}],php:{pattern:/\S(?:[\s\S]*\S)?/,inside:a.languages.php}}}}}},o.tag),a.hooks.add("before-tokenize",function(i){if(i.language==="latte"){var s=/\{\*[\s\S]*?\*\}|\{[^'"\s{}*](?:[^"'/{}]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|\/\*(?:[^*]|\*(?!\/))*\*\/)*\}/g;a.languages["markup-templating"].buildPlaceholders(i,"latte",s),i.grammar=o}}),a.hooks.add("after-tokenize",function(i){a.languages["markup-templating"].tokenizePlaceholders(i,"latte")})}(r)}return ew}var tw,HD;function uve(){if(HD)return tw;HD=1,tw=e,e.displayName="less",e.aliases=[];function e(t){t.languages.less=t.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),t.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}})}return tw}var nw,VD;function LA(){if(VD)return nw;VD=1,nw=e,e.displayName="scheme",e.aliases=[];function e(t){(function(n){n.languages.scheme={comment:/;.*|#;\s*(?:\((?:[^()]|\([^()]*\))*\)|\[(?:[^\[\]]|\[[^\[\]]*\])*\])|#\|(?:[^#|]|#(?!\|)|\|(?!#)|#\|(?:[^#|]|#(?!\|)|\|(?!#))*\|#)*\|#/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},symbol:{pattern:/'[^()\[\]#'\s]+/,greedy:!0},char:{pattern:/#\\(?:[ux][a-fA-F\d]+\b|[-a-zA-Z]+\b|[\uD800-\uDBFF][\uDC00-\uDFFF]|\S)/,greedy:!0},"lambda-parameter":[{pattern:/((?:^|[^'`#])[(\[]lambda\s+)(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)/,lookbehind:!0},{pattern:/((?:^|[^'`#])[(\[]lambda\s+[(\[])[^()\[\]']+/,lookbehind:!0}],keyword:{pattern:/((?:^|[^'`#])[(\[])(?:begin|case(?:-lambda)?|cond(?:-expand)?|define(?:-library|-macro|-record-type|-syntax|-values)?|defmacro|delay(?:-force)?|do|else|except|export|guard|if|import|include(?:-ci|-library-declarations)?|lambda|let(?:rec)?(?:-syntax|-values|\*)?|let\*-values|only|parameterize|prefix|(?:quasi-?)?quote|rename|set!|syntax-(?:case|rules)|unless|unquote(?:-splicing)?|when)(?=[()\[\]\s]|$)/,lookbehind:!0},builtin:{pattern:/((?:^|[^'`#])[(\[])(?:abs|and|append|apply|assoc|ass[qv]|binary-port\?|boolean=?\?|bytevector(?:-append|-copy|-copy!|-length|-u8-ref|-u8-set!|\?)?|caar|cadr|call-with-(?:current-continuation|port|values)|call\/cc|car|cdar|cddr|cdr|ceiling|char(?:->integer|-ready\?|\?|<\?|<=\?|=\?|>\?|>=\?)|close-(?:input-port|output-port|port)|complex\?|cons|current-(?:error|input|output)-port|denominator|dynamic-wind|eof-object\??|eq\?|equal\?|eqv\?|error|error-object(?:-irritants|-message|\?)|eval|even\?|exact(?:-integer-sqrt|-integer\?|\?)?|expt|features|file-error\?|floor(?:-quotient|-remainder|\/)?|flush-output-port|for-each|gcd|get-output-(?:bytevector|string)|inexact\??|input-port(?:-open\?|\?)|integer(?:->char|\?)|lcm|length|list(?:->string|->vector|-copy|-ref|-set!|-tail|\?)?|make-(?:bytevector|list|parameter|string|vector)|map|max|member|memq|memv|min|modulo|negative\?|newline|not|null\?|number(?:->string|\?)|numerator|odd\?|open-(?:input|output)-(?:bytevector|string)|or|output-port(?:-open\?|\?)|pair\?|peek-char|peek-u8|port\?|positive\?|procedure\?|quotient|raise|raise-continuable|rational\?|rationalize|read-(?:bytevector|bytevector!|char|error\?|line|string|u8)|real\?|remainder|reverse|round|set-c[ad]r!|square|string(?:->list|->number|->symbol|->utf8|->vector|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?|<\?|<=\?|=\?|>\?|>=\?)?|substring|symbol(?:->string|\?|=\?)|syntax-error|textual-port\?|truncate(?:-quotient|-remainder|\/)?|u8-ready\?|utf8->string|values|vector(?:->list|->string|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?)?|with-exception-handler|write-(?:bytevector|char|string|u8)|zero\?)(?=[()\[\]\s]|$)/,lookbehind:!0},operator:{pattern:/((?:^|[^'`#])[(\[])(?:[-+*%/]|[<>]=?|=>?)(?=[()\[\]\s]|$)/,lookbehind:!0},number:{pattern:RegExp(r({"":/\d+(?:\/\d+)|(?:\d+(?:\.\d*)?|\.\d+)(?:[esfdl][+-]?\d+)?/.source,"":/[+-]?|[+-](?:inf|nan)\.0/.source,"":/[+-](?:|(?:inf|nan)\.0)?i/.source,"":/(?:@|)?|/.source,"":/(?:#d(?:#[ei])?|#[ei](?:#d)?)?/.source,"":/[0-9a-f]+(?:\/[0-9a-f]+)?/.source,"":/[+-]?|[+-](?:inf|nan)\.0/.source,"":/[+-](?:|(?:inf|nan)\.0)?i/.source,"":/(?:@|)?|/.source,"":/#[box](?:#[ei])?|(?:#[ei])?#[box]/.source,"":/(^|[()\[\]\s])(?:|)(?=[()\[\]\s]|$)/.source}),"i"),lookbehind:!0},boolean:{pattern:/(^|[()\[\]\s])#(?:[ft]|false|true)(?=[()\[\]\s]|$)/,lookbehind:!0},function:{pattern:/((?:^|[^'`#])[(\[])(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)(?=[()\[\]\s]|$)/,lookbehind:!0},identifier:{pattern:/(^|[()\[\]\s])\|(?:[^\\|]|\\.)*\|(?=[()\[\]\s]|$)/,lookbehind:!0,greedy:!0},punctuation:/[()\[\]']/};function r(a){for(var o in a)a[o]=a[o].replace(/<[\w\s]+>/g,function(i){return"(?:"+a[i].trim()+")"});return a[o]}})(t)}return nw}var rw,qD;function dve(){if(qD)return rw;qD=1;var e=LA();rw=t,t.displayName="lilypond",t.aliases=[];function t(n){n.register(e),function(r){for(var a=/\((?:[^();"#\\]|\\[\s\S]|;.*(?!.)|"(?:[^"\\]|\\.)*"|#(?:\{(?:(?!#\})[\s\S])*#\}|[^{])|)*\)/.source,o=5,i=0;i/g,function(){return a});a=a.replace(//g,/[^\s\S]/.source);var s=r.languages.lilypond={comment:/%(?:(?!\{).*|\{[\s\S]*?%\})/,"embedded-scheme":{pattern:RegExp(/(^|[=\s])#(?:"(?:[^"\\]|\\.)*"|[^\s()"]*(?:[^\s()]|))/.source.replace(//g,function(){return a}),"m"),lookbehind:!0,greedy:!0,inside:{scheme:{pattern:/^(#)[\s\S]+$/,lookbehind:!0,alias:"language-scheme",inside:{"embedded-lilypond":{pattern:/#\{[\s\S]*?#\}/,greedy:!0,inside:{punctuation:/^#\{|#\}$/,lilypond:{pattern:/[\s\S]+/,alias:"language-lilypond",inside:null}}},rest:r.languages.scheme}},punctuation:/#/}},string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},"class-name":{pattern:/(\\new\s+)[\w-]+/,lookbehind:!0},keyword:{pattern:/\\[a-z][-\w]*/i,inside:{punctuation:/^\\/}},operator:/[=|]|<<|>>/,punctuation:{pattern:/(^|[a-z\d])(?:'+|,+|[_^]?-[_^]?(?:[-+^!>._]|(?=\d))|[_^]\.?|[.!])|[{}()[\]<>^~]|\\[()[\]<>\\!]|--|__/,lookbehind:!0},number:/\b\d+(?:\/\d+)?\b/};s["embedded-scheme"].inside.scheme.inside["embedded-lilypond"].inside.lilypond.inside=s,r.languages.ly=s}(n)}return rw}var aw,GD;function fve(){if(GD)return aw;GD=1;var e=mr();aw=t,t.displayName="liquid",t.aliases=[];function t(n){n.register(e),n.languages.liquid={comment:{pattern:/(^\{%\s*comment\s*%\})[\s\S]+(?=\{%\s*endcomment\s*%\}$)/,lookbehind:!0},delimiter:{pattern:/^\{(?:\{\{|[%\{])-?|-?(?:\}\}|[%\}])\}$/,alias:"punctuation"},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},keyword:/\b(?:as|assign|break|(?:end)?(?:capture|case|comment|for|form|if|paginate|raw|style|tablerow|unless)|continue|cycle|decrement|echo|else|elsif|in|include|increment|limit|liquid|offset|range|render|reversed|section|when|with)\b/,object:/\b(?:address|all_country_option_tags|article|block|blog|cart|checkout|collection|color|country|country_option_tags|currency|current_page|current_tags|customer|customer_address|date|discount_allocation|discount_application|external_video|filter|filter_value|font|forloop|fulfillment|generic_file|gift_card|group|handle|image|line_item|link|linklist|localization|location|measurement|media|metafield|model|model_source|order|page|page_description|page_image|page_title|part|policy|product|product_option|recommendations|request|robots|routes|rule|script|search|selling_plan|selling_plan_allocation|selling_plan_group|shipping_method|shop|shop_locale|sitemap|store_availability|tax_line|template|theme|transaction|unit_price_measurement|user_agent|variant|video|video_source)\b/,function:[{pattern:/(\|\s*)\w+/,lookbehind:!0,alias:"filter"},{pattern:/(\.\s*)(?:first|last|size)/,lookbehind:!0}],boolean:/\b(?:false|nil|true)\b/,range:{pattern:/\.\./,alias:"operator"},number:/\b\d+(?:\.\d+)?\b/,operator:/[!=]=|<>|[<>]=?|[|?:=-]|\b(?:and|contains(?=\s)|or)\b/,punctuation:/[.,\[\]()]/,empty:{pattern:/\bempty\b/,alias:"keyword"}},n.hooks.add("before-tokenize",function(r){var a=/\{%\s*comment\s*%\}[\s\S]*?\{%\s*endcomment\s*%\}|\{(?:%[\s\S]*?%|\{\{[\s\S]*?\}\}|\{[\s\S]*?\})\}/g,o=!1;n.languages["markup-templating"].buildPlaceholders(r,"liquid",a,function(i){var s=/^\{%-?\s*(\w+)/.exec(i);if(s){var l=s[1];if(l==="raw"&&!o)return o=!0,!0;if(l==="endraw")return o=!1,!0}return!o})}),n.hooks.add("after-tokenize",function(r){n.languages["markup-templating"].tokenizePlaceholders(r,"liquid")})}return aw}var ow,WD;function pve(){if(WD)return ow;WD=1,ow=e,e.displayName="lisp",e.aliases=[];function e(t){(function(n){function r(y){return RegExp(/(\()/.source+"(?:"+y+")"+/(?=[\s\)])/.source)}function a(y){return RegExp(/([\s([])/.source+"(?:"+y+")"+/(?=[\s)])/.source)}var o=/(?!\d)[-+*/~!@$%^=<>{}\w]+/.source,i="&"+o,s="(\\()",l="(?=\\))",c="(?=\\s)",u=/(?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\([^()]*\))*\))*\))*\))*\))*/.source,d={heading:{pattern:/;;;.*/,alias:["comment","title"]},comment:/;.*/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0,inside:{argument:/[-A-Z]+(?=[.,\s])/,symbol:RegExp("`"+o+"'")}},"quoted-symbol":{pattern:RegExp("#?'"+o),alias:["variable","symbol"]},"lisp-property":{pattern:RegExp(":"+o),alias:"property"},splice:{pattern:RegExp(",@?"+o),alias:["symbol","variable"]},keyword:[{pattern:RegExp(s+"(?:and|(?:cl-)?letf|cl-loop|cond|cons|error|if|(?:lexical-)?let\\*?|message|not|null|or|provide|require|setq|unless|use-package|when|while)"+c),lookbehind:!0},{pattern:RegExp(s+"(?:append|by|collect|concat|do|finally|for|in|return)"+c),lookbehind:!0}],declare:{pattern:r(/declare/.source),lookbehind:!0,alias:"keyword"},interactive:{pattern:r(/interactive/.source),lookbehind:!0,alias:"keyword"},boolean:{pattern:a(/nil|t/.source),lookbehind:!0},number:{pattern:a(/[-+]?\d+(?:\.\d*)?/.source),lookbehind:!0},defvar:{pattern:RegExp(s+"def(?:const|custom|group|var)\\s+"+o),lookbehind:!0,inside:{keyword:/^def[a-z]+/,variable:RegExp(o)}},defun:{pattern:RegExp(s+/(?:cl-)?(?:defmacro|defun\*?)\s+/.source+o+/\s+\(/.source+u+/\)/.source),lookbehind:!0,greedy:!0,inside:{keyword:/^(?:cl-)?def\S+/,arguments:null,function:{pattern:RegExp("(^\\s)"+o),lookbehind:!0},punctuation:/[()]/}},lambda:{pattern:RegExp(s+"lambda\\s+\\(\\s*(?:&?"+o+"(?:\\s+&?"+o+")*\\s*)?\\)"),lookbehind:!0,greedy:!0,inside:{keyword:/^lambda/,arguments:null,punctuation:/[()]/}},car:{pattern:RegExp(s+o),lookbehind:!0},punctuation:[/(?:['`,]?\(|[)\[\]])/,{pattern:/(\s)\.(?=\s)/,lookbehind:!0}]},g={"lisp-marker":RegExp(i),varform:{pattern:RegExp(/\(/.source+o+/\s+(?=\S)/.source+u+/\)/.source),inside:d},argument:{pattern:RegExp(/(^|[\s(])/.source+o),lookbehind:!0,alias:"variable"},rest:d},m="\\S+(?:\\s+\\S+)*",b={pattern:RegExp(s+u+l),lookbehind:!0,inside:{"rest-vars":{pattern:RegExp("&(?:body|rest)\\s+"+m),inside:g},"other-marker-vars":{pattern:RegExp("&(?:aux|optional)\\s+"+m),inside:g},keys:{pattern:RegExp("&key\\s+"+m+"(?:\\s+&allow-other-keys)?"),inside:g},argument:{pattern:RegExp(o),alias:"variable"},punctuation:/[()]/}};d.lambda.inside.arguments=b,d.defun.inside.arguments=n.util.clone(b),d.defun.inside.arguments.inside.sublist=b,n.languages.lisp=d,n.languages.elisp=d,n.languages.emacs=d,n.languages["emacs-lisp"]=d})(t)}return ow}var iw,KD;function gve(){if(KD)return iw;KD=1,iw=e,e.displayName="livescript",e.aliases=[];function e(t){t.languages.livescript={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\])#.*/,lookbehind:!0}],"interpolated-string":{pattern:/(^|[^"])("""|")(?:\\[\s\S]|(?!\2)[^\\])*\2(?!")/,lookbehind:!0,greedy:!0,inside:{variable:{pattern:/(^|[^\\])#[a-z_](?:-?[a-z]|[\d_])*/m,lookbehind:!0},interpolation:{pattern:/(^|[^\\])#\{[^}]+\}/m,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^#\{|\}$/,alias:"variable"}}},string:/[\s\S]+/}},string:[{pattern:/('''|')(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},{pattern:/<\[[\s\S]*?\]>/,greedy:!0},/\\[^\s,;\])}]+/],regex:[{pattern:/\/\/(?:\[[^\r\n\]]*\]|\\.|(?!\/\/)[^\\\[])+\/\/[gimyu]{0,5}/,greedy:!0,inside:{comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0}}},{pattern:/\/(?:\[[^\r\n\]]*\]|\\.|[^/\\\r\n\[])+\/[gimyu]{0,5}/,greedy:!0}],keyword:{pattern:/(^|(?!-).)\b(?:break|case|catch|class|const|continue|default|do|else|extends|fallthrough|finally|for(?: ever)?|function|if|implements|it|let|loop|new|null|otherwise|own|return|super|switch|that|then|this|throw|try|unless|until|var|void|when|while|yield)(?!-)\b/m,lookbehind:!0},"keyword-operator":{pattern:/(^|[^-])\b(?:(?:delete|require|typeof)!|(?:and|by|delete|export|from|import(?: all)?|in|instanceof|is(?: not|nt)?|not|of|or|til|to|typeof|with|xor)(?!-)\b)/m,lookbehind:!0,alias:"operator"},boolean:{pattern:/(^|[^-])\b(?:false|no|off|on|true|yes)(?!-)\b/m,lookbehind:!0},argument:{pattern:/(^|(?!\.&\.)[^&])&(?!&)\d*/m,lookbehind:!0,alias:"variable"},number:/\b(?:\d+~[\da-z]+|\d[\d_]*(?:\.\d[\d_]*)?(?:[a-z]\w*)?)/i,identifier:/[a-z_](?:-?[a-z]|[\d_])*/i,operator:[{pattern:/( )\.(?= )/,lookbehind:!0},/\.(?:[=~]|\.\.?)|\.(?:[&|^]|<<|>>>?)\.|:(?:=|:=?)|&&|\|[|>]|<(?:<[>=?]?|-(?:->?|>)?|\+\+?|@@?|%%?|\*\*?|!(?:~?=|--?>|~?~>)?|~(?:~?>|=)?|==?|\^\^?|[\/?]/],punctuation:/[(){}\[\]|.,:;`]/},t.languages.livescript["interpolated-string"].inside.interpolation.inside.rest=t.languages.livescript}return iw}var sw,YD;function mve(){if(YD)return sw;YD=1,sw=e,e.displayName="llvm",e.aliases=[];function e(t){(function(n){n.languages.llvm={comment:/;.*/,string:{pattern:/"[^"]*"/,greedy:!0},boolean:/\b(?:false|true)\b/,variable:/[%@!#](?:(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+|\d+)/i,label:/(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+:/i,type:{pattern:/\b(?:double|float|fp128|half|i[1-9]\d*|label|metadata|ppc_fp128|token|void|x86_fp80|x86_mmx)\b/,alias:"class-name"},keyword:/\b[a-z_][a-z_0-9]*\b/,number:/[+-]?\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-Fa-f]+\b|\b0xK[\dA-Fa-f]{20}\b|\b0x[ML][\dA-Fa-f]{32}\b|\b0xH[\dA-Fa-f]{4}\b/,punctuation:/[{}[\];(),.!*=<>]/}})(t)}return sw}var lw,ZD;function hve(){if(ZD)return lw;ZD=1,lw=e,e.displayName="log",e.aliases=[];function e(t){t.languages.log={string:{pattern:/"(?:[^"\\\r\n]|\\.)*"|'(?![st] | \w)(?:[^'\\\r\n]|\\.)*'/,greedy:!0},exception:{pattern:/(^|[^\w.])[a-z][\w.]*(?:Error|Exception):.*(?:(?:\r\n?|\n)[ \t]*(?:at[ \t].+|\.{3}.*|Caused by:.*))+(?:(?:\r\n?|\n)[ \t]*\.\.\. .*)?/,lookbehind:!0,greedy:!0,alias:["javastacktrace","language-javastacktrace"],inside:t.languages.javastacktrace||{keyword:/\bat\b/,function:/[a-z_][\w$]*(?=\()/,punctuation:/[.:()]/}},level:[{pattern:/\b(?:ALERT|CRIT|CRITICAL|EMERG|EMERGENCY|ERR|ERROR|FAILURE|FATAL|SEVERE)\b/,alias:["error","important"]},{pattern:/\b(?:WARN|WARNING|WRN)\b/,alias:["warning","important"]},{pattern:/\b(?:DISPLAY|INF|INFO|NOTICE|STATUS)\b/,alias:["info","keyword"]},{pattern:/\b(?:DBG|DEBUG|FINE)\b/,alias:["debug","keyword"]},{pattern:/\b(?:FINER|FINEST|TRACE|TRC|VERBOSE|VRB)\b/,alias:["trace","comment"]}],property:{pattern:/((?:^|[\]|])[ \t]*)[a-z_](?:[\w-]|\b\/\b)*(?:[. ]\(?\w(?:[\w-]|\b\/\b)*\)?)*:(?=\s)/im,lookbehind:!0},separator:{pattern:/(^|[^-+])-{3,}|={3,}|\*{3,}|- - /m,lookbehind:!0,alias:"comment"},url:/\b(?:file|ftp|https?):\/\/[^\s|,;'"]*[^\s|,;'">.]/,email:{pattern:/(^|\s)[-\w+.]+@[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+(?=\s)/,lookbehind:!0,alias:"url"},"ip-address":{pattern:/\b(?:\d{1,3}(?:\.\d{1,3}){3})\b/,alias:"constant"},"mac-address":{pattern:/\b[a-f0-9]{2}(?::[a-f0-9]{2}){5}\b/i,alias:"constant"},domain:{pattern:/(^|\s)[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)*\.[a-z][a-z0-9-]+(?=\s)/,lookbehind:!0,alias:"constant"},uuid:{pattern:/\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/i,alias:"constant"},hash:{pattern:/\b(?:[a-f0-9]{32}){1,2}\b/i,alias:"constant"},"file-path":{pattern:/\b[a-z]:[\\/][^\s|,;:(){}\[\]"']+|(^|[\s:\[\](>|])\.{0,2}\/\w[^\s|,;:(){}\[\]"']*/i,lookbehind:!0,greedy:!0,alias:"string"},date:{pattern:RegExp(/\b\d{4}[-/]\d{2}[-/]\d{2}(?:T(?=\d{1,2}:)|(?=\s\d{1,2}:))/.source+"|"+/\b\d{1,4}[-/ ](?:\d{1,2}|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)[-/ ]\d{2,4}T?\b/.source+"|"+/\b(?:(?:Fri|Mon|Sat|Sun|Thu|Tue|Wed)(?:\s{1,2}(?:Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep))?|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)\s{1,2}\d{1,2}\b/.source,"i"),alias:"number"},time:{pattern:/\b\d{1,2}:\d{1,2}:\d{1,2}(?:[.,:]\d+)?(?:\s?[+-]\d{2}:?\d{2}|Z)?\b/,alias:"number"},boolean:/\b(?:false|null|true)\b/i,number:{pattern:/(^|[^.\w])(?:0x[a-f0-9]+|0o[0-7]+|0b[01]+|v?\d[\da-f]*(?:\.\d+)*(?:e[+-]?\d+)?[a-z]{0,3}\b)\b(?!\.\w)/i,lookbehind:!0},operator:/[;:?<=>~/@!$%&+\-|^(){}*#]/,punctuation:/[\[\].,]/}}return lw}var cw,XD;function bve(){if(XD)return cw;XD=1,cw=e,e.displayName="lolcode",e.aliases=[];function e(t){t.languages.lolcode={comment:[/\bOBTW\s[\s\S]*?\sTLDR\b/,/\bBTW.+/],string:{pattern:/"(?::.|[^":])*"/,inside:{variable:/:\{[^}]+\}/,symbol:[/:\([a-f\d]+\)/i,/:\[[^\]]+\]/,/:[)>o":]/]},greedy:!0},number:/(?:\B-)?(?:\b\d+(?:\.\d*)?|\B\.\d+)/,symbol:{pattern:/(^|\s)(?:A )?(?:BUKKIT|NOOB|NUMBAR|NUMBR|TROOF|YARN)(?=\s|,|$)/,lookbehind:!0,inside:{keyword:/A(?=\s)/}},label:{pattern:/((?:^|\s)(?:IM IN YR|IM OUTTA YR) )[a-zA-Z]\w*/,lookbehind:!0,alias:"string"},function:{pattern:/((?:^|\s)(?:HOW IZ I|I IZ|IZ) )[a-zA-Z]\w*/,lookbehind:!0},keyword:[{pattern:/(^|\s)(?:AN|FOUND YR|GIMMEH|GTFO|HAI|HAS A|HOW IZ I|I HAS A|I IZ|IF U SAY SO|IM IN YR|IM OUTTA YR|IS NOW(?: A)?|ITZ(?: A)?|IZ|KTHX|KTHXBYE|LIEK(?: A)?|MAEK|MEBBE|MKAY|NERFIN|NO WAI|O HAI IM|O RLY\?|OIC|OMG|OMGWTF|R|SMOOSH|SRS|TIL|UPPIN|VISIBLE|WILE|WTF\?|YA RLY|YR)(?=\s|,|$)/,lookbehind:!0},/'Z(?=\s|,|$)/],boolean:{pattern:/(^|\s)(?:FAIL|WIN)(?=\s|,|$)/,lookbehind:!0},variable:{pattern:/(^|\s)IT(?=\s|,|$)/,lookbehind:!0},operator:{pattern:/(^|\s)(?:NOT|BOTH SAEM|DIFFRINT|(?:ALL|ANY|BIGGR|BOTH|DIFF|EITHER|MOD|PRODUKT|QUOSHUNT|SMALLR|SUM|WON) OF)(?=\s|,|$)/,lookbehind:!0},punctuation:/\.{3}|…|,|!/}}return cw}var uw,QD;function yve(){if(QD)return uw;QD=1,uw=e,e.displayName="magma",e.aliases=[];function e(t){t.languages.magma={output:{pattern:/^(>.*(?:\r(?:\n|(?!\n))|\n))(?!>)(?:.+|(?:\r(?:\n|(?!\n))|\n)(?!>).*)(?:(?:\r(?:\n|(?!\n))|\n)(?!>).*)*/m,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},string:{pattern:/(^|[^\\"])"(?:[^\r\n\\"]|\\.)*"/,lookbehind:!0,greedy:!0},keyword:/\b(?:_|adj|and|assert|assert2|assert3|assigned|break|by|case|cat|catch|clear|cmpeq|cmpne|continue|declare|default|delete|diff|div|do|elif|else|end|eq|error|eval|exists|exit|for|forall|forward|fprintf|freeze|function|ge|gt|if|iload|import|in|intrinsic|is|join|le|load|local|lt|meet|mod|ne|not|notadj|notin|notsubset|or|print|printf|procedure|quit|random|read|readi|repeat|require|requirege|requirerange|restore|return|save|sdiff|select|subset|then|time|to|try|until|vprint|vprintf|vtime|when|where|while|xor)\b/,boolean:/\b(?:false|true)\b/,generator:{pattern:/\b[a-z_]\w*(?=\s*<)/i,alias:"class-name"},function:/\b[a-z_]\w*(?=\s*\()/i,number:{pattern:/(^|[^\w.]|\.\.)(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?(?:_[a-z]?)?(?=$|[^\w.]|\.\.)/,lookbehind:!0},operator:/->|[-+*/^~!|#=]|:=|\.\./,punctuation:/[()[\]{}<>,;.:]/}}return uw}var dw,JD;function vve(){if(JD)return dw;JD=1,dw=e,e.displayName="makefile",e.aliases=[];function e(t){t.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/}}return dw}var fw,eL;function Sve(){if(eL)return fw;eL=1,fw=e,e.displayName="markdown",e.aliases=["md"];function e(t){(function(n){var r=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function a(g){return g=g.replace(//g,function(){return r}),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+g+")")}var o=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,i=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,function(){return o}),s=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;n.languages.markdown=n.languages.extend("markup",{}),n.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:n.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+i+s+"(?:"+i+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+i+s+")(?:"+i+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(o),inside:n.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+i+")"+s+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+i+"$"),inside:{"table-header":{pattern:RegExp(o),alias:"important",inside:n.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:a(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:a(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:a(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:a(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach(function(g){["url","bold","italic","strike","code-snippet"].forEach(function(m){g!==m&&(n.languages.markdown[g].inside.content.inside[m]=n.languages.markdown[m])})}),n.hooks.add("after-tokenize",function(g){if(g.language!=="markdown"&&g.language!=="md")return;function m(b){if(!(!b||typeof b=="string"))for(var y=0,w=b.length;y",quot:'"'},u=String.fromCodePoint||String.fromCharCode;function d(g){var m=g.replace(l,"");return m=m.replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,function(b,y){if(y=y.toLowerCase(),y[0]==="#"){var w;return y[1]==="x"?w=parseInt(y.slice(2),16):w=Number(y.slice(1)),u(w)}else{var v=c[y];return v||b}}),m}n.languages.md=n.languages.markdown})(t)}return fw}var pw,tL;function wve(){if(tL)return pw;tL=1,pw=e,e.displayName="matlab",e.aliases=[];function e(t){t.languages.matlab={comment:[/%\{[\s\S]*?\}%/,/%.+/],string:{pattern:/\B'(?:''|[^'\r\n])*'/,greedy:!0},number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+)?(?:[ij])?|\b[ij]\b/,keyword:/\b(?:NaN|break|case|catch|continue|else|elseif|end|for|function|if|inf|otherwise|parfor|pause|pi|return|switch|try|while)\b/,function:/\b(?!\d)\w+(?=\s*\()/,operator:/\.?[*^\/\\']|[+\-:@]|[<>=~]=?|&&?|\|\|?/,punctuation:/\.{3}|[.,;\[\](){}!]/}}return pw}var gw,nL;function Eve(){if(nL)return gw;nL=1,gw=e,e.displayName="maxscript",e.aliases=[];function e(t){(function(n){var r=/\b(?:about|and|animate|as|at|attributes|by|case|catch|collect|continue|coordsys|do|else|exit|fn|for|from|function|global|if|in|local|macroscript|mapped|max|not|of|off|on|or|parameters|persistent|plugin|rcmenu|return|rollout|set|struct|then|throw|to|tool|try|undo|utility|when|where|while|with)\b/i;n.languages.maxscript={comment:{pattern:/\/\*[\s\S]*?(?:\*\/|$)|--.*/,greedy:!0},string:{pattern:/(^|[^"\\@])(?:"(?:[^"\\]|\\[\s\S])*"|@"[^"]*")/,lookbehind:!0,greedy:!0},path:{pattern:/\$(?:[\w/\\.*?]|'[^']*')*/,greedy:!0,alias:"string"},"function-call":{pattern:RegExp("((?:"+(/^/.source+"|"+/[;=<>+\-*/^({\[]/.source+"|"+/\b(?:and|by|case|catch|collect|do|else|if|in|not|or|return|then|to|try|where|while|with)\b/.source)+")[ ]*)(?!"+r.source+")"+/[a-z_]\w*\b/.source+"(?=[ ]*(?:"+("(?!"+r.source+")"+/[a-z_]/.source+"|"+/\d|-\.?\d/.source+"|"+/[({'"$@#?]/.source)+"))","im"),lookbehind:!0,greedy:!0,alias:"function"},"function-definition":{pattern:/(\b(?:fn|function)\s+)\w+\b/i,lookbehind:!0,alias:"function"},argument:{pattern:/\b[a-z_]\w*(?=:)/i,alias:"attr-name"},keyword:r,boolean:/\b(?:false|true)\b/,time:{pattern:/(^|[^\w.])(?:(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?[msft])+|\d+:\d+(?:\.\d*)?)(?![\w.:])/,lookbehind:!0,alias:"number"},number:[{pattern:/(^|[^\w.])(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?|0x[a-fA-F0-9]+)(?![\w.:])/,lookbehind:!0},/\b(?:e|pi)\b/],constant:/\b(?:dontcollect|ok|silentValue|undefined|unsupplied)\b/,color:{pattern:/\b(?:black|blue|brown|gray|green|orange|red|white|yellow)\b/i,alias:"constant"},operator:/[-+*/<>=!]=?|[&^?]|#(?!\()/,punctuation:/[()\[\]{}.:,;]|#(?=\()|\\$/m}})(t)}return gw}var mw,rL;function xve(){if(rL)return mw;rL=1,mw=e,e.displayName="mel",e.aliases=[];function e(t){t.languages.mel={comment:/\/\/.*/,code:{pattern:/`(?:\\.|[^\\`\r\n])*`/,greedy:!0,alias:"italic",inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"}}},string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},variable:/\$\w+/,number:/\b0x[\da-fA-F]+\b|\b\d+(?:\.\d*)?|\B\.\d+/,flag:{pattern:/-[^\d\W]\w*/,alias:"operator"},keyword:/\b(?:break|case|continue|default|do|else|float|for|global|if|in|int|matrix|proc|return|string|switch|vector|while)\b/,function:/\b\w+(?=\()|\b(?:CBG|HfAddAttractorToAS|HfAssignAS|HfBuildEqualMap|HfBuildFurFiles|HfBuildFurImages|HfCancelAFR|HfConnectASToHF|HfCreateAttractor|HfDeleteAS|HfEditAS|HfPerformCreateAS|HfRemoveAttractorFromAS|HfSelectAttached|HfSelectAttractors|HfUnAssignAS|Mayatomr|about|abs|addAttr|addAttributeEditorNodeHelp|addDynamic|addNewShelfTab|addPP|addPanelCategory|addPrefixToName|advanceToNextDrivenKey|affectedNet|affects|aimConstraint|air|alias|aliasAttr|align|alignCtx|alignCurve|alignSurface|allViewFit|ambientLight|angle|angleBetween|animCone|animCurveEditor|animDisplay|animView|annotate|appendStringArray|applicationName|applyAttrPreset|applyTake|arcLenDimContext|arcLengthDimension|arclen|arrayMapper|art3dPaintCtx|artAttrCtx|artAttrPaintVertexCtx|artAttrSkinPaintCtx|artAttrTool|artBuildPaintMenu|artFluidAttrCtx|artPuttyCtx|artSelectCtx|artSetPaintCtx|artUserPaintCtx|assignCommand|assignInputDevice|assignViewportFactories|attachCurve|attachDeviceAttr|attachSurface|attrColorSliderGrp|attrCompatibility|attrControlGrp|attrEnumOptionMenu|attrEnumOptionMenuGrp|attrFieldGrp|attrFieldSliderGrp|attrNavigationControlGrp|attrPresetEditWin|attributeExists|attributeInfo|attributeMenu|attributeQuery|autoKeyframe|autoPlace|bakeClip|bakeFluidShading|bakePartialHistory|bakeResults|bakeSimulation|basename|basenameEx|batchRender|bessel|bevel|bevelPlus|binMembership|bindSkin|blend2|blendShape|blendShapeEditor|blendShapePanel|blendTwoAttr|blindDataType|boneLattice|boundary|boxDollyCtx|boxZoomCtx|bufferCurve|buildBookmarkMenu|buildKeyframeMenu|button|buttonManip|cacheFile|cacheFileCombine|cacheFileMerge|cacheFileTrack|camera|cameraView|canCreateManip|canvas|capitalizeString|catch|catchQuiet|ceil|changeSubdivComponentDisplayLevel|changeSubdivRegion|channelBox|character|characterMap|characterOutlineEditor|characterize|chdir|checkBox|checkBoxGrp|checkDefaultRenderGlobals|choice|circle|circularFillet|clamp|clear|clearCache|clip|clipEditor|clipEditorCurrentTimeCtx|clipSchedule|clipSchedulerOutliner|clipTrimBefore|closeCurve|closeSurface|cluster|cmdFileOutput|cmdScrollFieldExecuter|cmdScrollFieldReporter|cmdShell|coarsenSubdivSelectionList|collision|color|colorAtPoint|colorEditor|colorIndex|colorIndexSliderGrp|colorSliderButtonGrp|colorSliderGrp|columnLayout|commandEcho|commandLine|commandPort|compactHairSystem|componentEditor|compositingInterop|computePolysetVolume|condition|cone|confirmDialog|connectAttr|connectControl|connectDynamic|connectJoint|connectionInfo|constrain|constrainValue|constructionHistory|container|containsMultibyte|contextInfo|control|convertFromOldLayers|convertIffToPsd|convertLightmap|convertSolidTx|convertTessellation|convertUnit|copyArray|copyFlexor|copyKey|copySkinWeights|cos|cpButton|cpCache|cpClothSet|cpCollision|cpConstraint|cpConvClothToMesh|cpForces|cpGetSolverAttr|cpPanel|cpProperty|cpRigidCollisionFilter|cpSeam|cpSetEdit|cpSetSolverAttr|cpSolver|cpSolverTypes|cpTool|cpUpdateClothUVs|createDisplayLayer|createDrawCtx|createEditor|createLayeredPsdFile|createMotionField|createNewShelf|createNode|createRenderLayer|createSubdivRegion|cross|crossProduct|ctxAbort|ctxCompletion|ctxEditMode|ctxTraverse|currentCtx|currentTime|currentTimeCtx|currentUnit|curve|curveAddPtCtx|curveCVCtx|curveEPCtx|curveEditorCtx|curveIntersect|curveMoveEPCtx|curveOnSurface|curveSketchCtx|cutKey|cycleCheck|cylinder|dagPose|date|defaultLightListCheckBox|defaultNavigation|defineDataServer|defineVirtualDevice|deformer|deg_to_rad|delete|deleteAttr|deleteShadingGroupsAndMaterials|deleteShelfTab|deleteUI|deleteUnusedBrushes|delrandstr|detachCurve|detachDeviceAttr|detachSurface|deviceEditor|devicePanel|dgInfo|dgdirty|dgeval|dgtimer|dimWhen|directKeyCtx|directionalLight|dirmap|dirname|disable|disconnectAttr|disconnectJoint|diskCache|displacementToPoly|displayAffected|displayColor|displayCull|displayLevelOfDetail|displayPref|displayRGBColor|displaySmoothness|displayStats|displayString|displaySurface|distanceDimContext|distanceDimension|doBlur|dolly|dollyCtx|dopeSheetEditor|dot|dotProduct|doubleProfileBirailSurface|drag|dragAttrContext|draggerContext|dropoffLocator|duplicate|duplicateCurve|duplicateSurface|dynCache|dynControl|dynExport|dynExpression|dynGlobals|dynPaintEditor|dynParticleCtx|dynPref|dynRelEdPanel|dynRelEditor|dynamicLoad|editAttrLimits|editDisplayLayerGlobals|editDisplayLayerMembers|editRenderLayerAdjustment|editRenderLayerGlobals|editRenderLayerMembers|editor|editorTemplate|effector|emit|emitter|enableDevice|encodeString|endString|endsWith|env|equivalent|equivalentTol|erf|error|eval|evalDeferred|evalEcho|event|exactWorldBoundingBox|exclusiveLightCheckBox|exec|executeForEachObject|exists|exp|expression|expressionEditorListen|extendCurve|extendSurface|extrude|fcheck|fclose|feof|fflush|fgetline|fgetword|file|fileBrowserDialog|fileDialog|fileExtension|fileInfo|filetest|filletCurve|filter|filterCurve|filterExpand|filterStudioImport|findAllIntersections|findAnimCurves|findKeyframe|findMenuItem|findRelatedSkinCluster|finder|firstParentOf|fitBspline|flexor|floatEq|floatField|floatFieldGrp|floatScrollBar|floatSlider|floatSlider2|floatSliderButtonGrp|floatSliderGrp|floor|flow|fluidCacheInfo|fluidEmitter|fluidVoxelInfo|flushUndo|fmod|fontDialog|fopen|formLayout|format|fprint|frameLayout|fread|freeFormFillet|frewind|fromNativePath|fwrite|gamma|gauss|geometryConstraint|getApplicationVersionAsFloat|getAttr|getClassification|getDefaultBrush|getFileList|getFluidAttr|getInputDeviceRange|getMayaPanelTypes|getModifiers|getPanel|getParticleAttr|getPluginResource|getenv|getpid|glRender|glRenderEditor|globalStitch|gmatch|goal|gotoBindPose|grabColor|gradientControl|gradientControlNoAttr|graphDollyCtx|graphSelectContext|graphTrackCtx|gravity|grid|gridLayout|group|groupObjectsByName|hardenPointCurve|hardware|hardwareRenderPanel|headsUpDisplay|headsUpMessage|help|helpLine|hermite|hide|hilite|hitTest|hotBox|hotkey|hotkeyCheck|hsv_to_rgb|hudButton|hudSlider|hudSliderButton|hwReflectionMap|hwRender|hwRenderLoad|hyperGraph|hyperPanel|hyperShade|hypot|iconTextButton|iconTextCheckBox|iconTextRadioButton|iconTextRadioCollection|iconTextScrollList|iconTextStaticLabel|ikHandle|ikHandleCtx|ikHandleDisplayScale|ikSolver|ikSplineHandleCtx|ikSystem|ikSystemInfo|ikfkDisplayMethod|illustratorCurves|image|imfPlugins|inheritTransform|insertJoint|insertJointCtx|insertKeyCtx|insertKnotCurve|insertKnotSurface|instance|instanceable|instancer|intField|intFieldGrp|intScrollBar|intSlider|intSliderGrp|interToUI|internalVar|intersect|iprEngine|isAnimCurve|isConnected|isDirty|isParentOf|isSameObject|isTrue|isValidObjectName|isValidString|isValidUiName|isolateSelect|itemFilter|itemFilterAttr|itemFilterRender|itemFilterType|joint|jointCluster|jointCtx|jointDisplayScale|jointLattice|keyTangent|keyframe|keyframeOutliner|keyframeRegionCurrentTimeCtx|keyframeRegionDirectKeyCtx|keyframeRegionDollyCtx|keyframeRegionInsertKeyCtx|keyframeRegionMoveKeyCtx|keyframeRegionScaleKeyCtx|keyframeRegionSelectKeyCtx|keyframeRegionSetKeyCtx|keyframeRegionTrackCtx|keyframeStats|lassoContext|lattice|latticeDeformKeyCtx|launch|launchImageEditor|layerButton|layeredShaderPort|layeredTexturePort|layout|layoutDialog|lightList|lightListEditor|lightListPanel|lightlink|lineIntersection|linearPrecision|linstep|listAnimatable|listAttr|listCameras|listConnections|listDeviceAttachments|listHistory|listInputDeviceAxes|listInputDeviceButtons|listInputDevices|listMenuAnnotation|listNodeTypes|listPanelCategories|listRelatives|listSets|listTransforms|listUnselected|listerEditor|loadFluid|loadNewShelf|loadPlugin|loadPluginLanguageResources|loadPrefObjects|localizedPanelLabel|lockNode|loft|log|longNameOf|lookThru|ls|lsThroughFilter|lsType|lsUI|mag|makeIdentity|makeLive|makePaintable|makeRoll|makeSingleSurface|makeTubeOn|makebot|manipMoveContext|manipMoveLimitsCtx|manipOptions|manipRotateContext|manipRotateLimitsCtx|manipScaleContext|manipScaleLimitsCtx|marker|match|max|memory|menu|menuBarLayout|menuEditor|menuItem|menuItemToShelf|menuSet|menuSetPref|messageLine|min|minimizeApp|mirrorJoint|modelCurrentTimeCtx|modelEditor|modelPanel|mouse|movIn|movOut|move|moveIKtoFK|moveKeyCtx|moveVertexAlongDirection|multiProfileBirailSurface|mute|nParticle|nameCommand|nameField|namespace|namespaceInfo|newPanelItems|newton|nodeCast|nodeIconButton|nodeOutliner|nodePreset|nodeType|noise|nonLinear|normalConstraint|normalize|nurbsBoolean|nurbsCopyUVSet|nurbsCube|nurbsEditUV|nurbsPlane|nurbsSelect|nurbsSquare|nurbsToPoly|nurbsToPolygonsPref|nurbsToSubdiv|nurbsToSubdivPref|nurbsUVSet|nurbsViewDirectionVector|objExists|objectCenter|objectLayer|objectType|objectTypeUI|obsoleteProc|oceanNurbsPreviewPlane|offsetCurve|offsetCurveOnSurface|offsetSurface|openGLExtension|openMayaPref|optionMenu|optionMenuGrp|optionVar|orbit|orbitCtx|orientConstraint|outlinerEditor|outlinerPanel|overrideModifier|paintEffectsDisplay|pairBlend|palettePort|paneLayout|panel|panelConfiguration|panelHistory|paramDimContext|paramDimension|paramLocator|parent|parentConstraint|particle|particleExists|particleInstancer|particleRenderInfo|partition|pasteKey|pathAnimation|pause|pclose|percent|performanceOptions|pfxstrokes|pickWalk|picture|pixelMove|planarSrf|plane|play|playbackOptions|playblast|plugAttr|plugNode|pluginInfo|pluginResourceUtil|pointConstraint|pointCurveConstraint|pointLight|pointMatrixMult|pointOnCurve|pointOnSurface|pointPosition|poleVectorConstraint|polyAppend|polyAppendFacetCtx|polyAppendVertex|polyAutoProjection|polyAverageNormal|polyAverageVertex|polyBevel|polyBlendColor|polyBlindData|polyBoolOp|polyBridgeEdge|polyCacheMonitor|polyCheck|polyChipOff|polyClipboard|polyCloseBorder|polyCollapseEdge|polyCollapseFacet|polyColorBlindData|polyColorDel|polyColorPerVertex|polyColorSet|polyCompare|polyCone|polyCopyUV|polyCrease|polyCreaseCtx|polyCreateFacet|polyCreateFacetCtx|polyCube|polyCut|polyCutCtx|polyCylinder|polyCylindricalProjection|polyDelEdge|polyDelFacet|polyDelVertex|polyDuplicateAndConnect|polyDuplicateEdge|polyEditUV|polyEditUVShell|polyEvaluate|polyExtrudeEdge|polyExtrudeFacet|polyExtrudeVertex|polyFlipEdge|polyFlipUV|polyForceUV|polyGeoSampler|polyHelix|polyInfo|polyInstallAction|polyLayoutUV|polyListComponentConversion|polyMapCut|polyMapDel|polyMapSew|polyMapSewMove|polyMergeEdge|polyMergeEdgeCtx|polyMergeFacet|polyMergeFacetCtx|polyMergeUV|polyMergeVertex|polyMirrorFace|polyMoveEdge|polyMoveFacet|polyMoveFacetUV|polyMoveUV|polyMoveVertex|polyNormal|polyNormalPerVertex|polyNormalizeUV|polyOptUvs|polyOptions|polyOutput|polyPipe|polyPlanarProjection|polyPlane|polyPlatonicSolid|polyPoke|polyPrimitive|polyPrism|polyProjection|polyPyramid|polyQuad|polyQueryBlindData|polyReduce|polySelect|polySelectConstraint|polySelectConstraintMonitor|polySelectCtx|polySelectEditCtx|polySeparate|polySetToFaceNormal|polySewEdge|polyShortestPathCtx|polySmooth|polySoftEdge|polySphere|polySphericalProjection|polySplit|polySplitCtx|polySplitEdge|polySplitRing|polySplitVertex|polyStraightenUVBorder|polySubdivideEdge|polySubdivideFacet|polyToSubdiv|polyTorus|polyTransfer|polyTriangulate|polyUVSet|polyUnite|polyWedgeFace|popen|popupMenu|pose|pow|preloadRefEd|print|progressBar|progressWindow|projFileViewer|projectCurve|projectTangent|projectionContext|projectionManip|promptDialog|propModCtx|propMove|psdChannelOutliner|psdEditTextureFile|psdExport|psdTextureFile|putenv|pwd|python|querySubdiv|quit|rad_to_deg|radial|radioButton|radioButtonGrp|radioCollection|radioMenuItemCollection|rampColorPort|rand|randomizeFollicles|randstate|rangeControl|readTake|rebuildCurve|rebuildSurface|recordAttr|recordDevice|redo|reference|referenceEdit|referenceQuery|refineSubdivSelectionList|refresh|refreshAE|registerPluginResource|rehash|reloadImage|removeJoint|removeMultiInstance|removePanelCategory|rename|renameAttr|renameSelectionList|renameUI|render|renderGlobalsNode|renderInfo|renderLayerButton|renderLayerParent|renderLayerPostProcess|renderLayerUnparent|renderManip|renderPartition|renderQualityNode|renderSettings|renderThumbnailUpdate|renderWindowEditor|renderWindowSelectContext|renderer|reorder|reorderDeformers|requires|reroot|resampleFluid|resetAE|resetPfxToPolyCamera|resetTool|resolutionNode|retarget|reverseCurve|reverseSurface|revolve|rgb_to_hsv|rigidBody|rigidSolver|roll|rollCtx|rootOf|rot|rotate|rotationInterpolation|roundConstantRadius|rowColumnLayout|rowLayout|runTimeCommand|runup|sampleImage|saveAllShelves|saveAttrPreset|saveFluid|saveImage|saveInitialState|saveMenu|savePrefObjects|savePrefs|saveShelf|saveToolSettings|scale|scaleBrushBrightness|scaleComponents|scaleConstraint|scaleKey|scaleKeyCtx|sceneEditor|sceneUIReplacement|scmh|scriptCtx|scriptEditorInfo|scriptJob|scriptNode|scriptTable|scriptToShelf|scriptedPanel|scriptedPanelType|scrollField|scrollLayout|sculpt|searchPathArray|seed|selLoadSettings|select|selectContext|selectCurveCV|selectKey|selectKeyCtx|selectKeyframeRegionCtx|selectMode|selectPref|selectPriority|selectType|selectedNodes|selectionConnection|separator|setAttr|setAttrEnumResource|setAttrMapping|setAttrNiceNameResource|setConstraintRestPosition|setDefaultShadingGroup|setDrivenKeyframe|setDynamic|setEditCtx|setEditor|setFluidAttr|setFocus|setInfinity|setInputDeviceMapping|setKeyCtx|setKeyPath|setKeyframe|setKeyframeBlendshapeTargetWts|setMenuMode|setNodeNiceNameResource|setNodeTypeFlag|setParent|setParticleAttr|setPfxToPolyCamera|setPluginResource|setProject|setStampDensity|setStartupMessage|setState|setToolTo|setUITemplate|setXformManip|sets|shadingConnection|shadingGeometryRelCtx|shadingLightRelCtx|shadingNetworkCompare|shadingNode|shapeCompare|shelfButton|shelfLayout|shelfTabLayout|shellField|shortNameOf|showHelp|showHidden|showManipCtx|showSelectionInTitle|showShadingGroupAttrEditor|showWindow|sign|simplify|sin|singleProfileBirailSurface|size|sizeBytes|skinCluster|skinPercent|smoothCurve|smoothTangentSurface|smoothstep|snap2to2|snapKey|snapMode|snapTogetherCtx|snapshot|soft|softMod|softModCtx|sort|sound|soundControl|source|spaceLocator|sphere|sphrand|spotLight|spotLightPreviewPort|spreadSheetEditor|spring|sqrt|squareSurface|srtContext|stackTrace|startString|startsWith|stitchAndExplodeShell|stitchSurface|stitchSurfacePoints|strcmp|stringArrayCatenate|stringArrayContains|stringArrayCount|stringArrayInsertAtIndex|stringArrayIntersector|stringArrayRemove|stringArrayRemoveAtIndex|stringArrayRemoveDuplicates|stringArrayRemoveExact|stringArrayToString|stringToStringArray|strip|stripPrefixFromName|stroke|subdAutoProjection|subdCleanTopology|subdCollapse|subdDuplicateAndConnect|subdEditUV|subdListComponentConversion|subdMapCut|subdMapSewMove|subdMatchTopology|subdMirror|subdToBlind|subdToPoly|subdTransferUVsToCache|subdiv|subdivCrease|subdivDisplaySmoothness|substitute|substituteAllString|substituteGeometry|substring|surface|surfaceSampler|surfaceShaderList|swatchDisplayPort|switchTable|symbolButton|symbolCheckBox|sysFile|system|tabLayout|tan|tangentConstraint|texLatticeDeformContext|texManipContext|texMoveContext|texMoveUVShellContext|texRotateContext|texScaleContext|texSelectContext|texSelectShortestPathCtx|texSmudgeUVContext|texWinToolCtx|text|textCurves|textField|textFieldButtonGrp|textFieldGrp|textManip|textScrollList|textToShelf|textureDisplacePlane|textureHairColor|texturePlacementContext|textureWindow|threadCount|threePointArcCtx|timeControl|timePort|timerX|toNativePath|toggle|toggleAxis|toggleWindowVisibility|tokenize|tokenizeList|tolerance|tolower|toolButton|toolCollection|toolDropped|toolHasOptions|toolPropertyWindow|torus|toupper|trace|track|trackCtx|transferAttributes|transformCompare|transformLimits|translator|trim|trunc|truncateFluidCache|truncateHairCache|tumble|tumbleCtx|turbulence|twoPointArcCtx|uiRes|uiTemplate|unassignInputDevice|undo|undoInfo|ungroup|uniform|unit|unloadPlugin|untangleUV|untitledFileName|untrim|upAxis|updateAE|userCtx|uvLink|uvSnapshot|validateShelfName|vectorize|view2dToolCtx|viewCamera|viewClipPlane|viewFit|viewHeadOn|viewLookAt|viewManip|viewPlace|viewSet|visor|volumeAxis|vortex|waitCursor|warning|webBrowser|webBrowserPrefs|whatIs|window|windowPref|wire|wireContext|workspace|wrinkle|wrinkleContext|writeTake|xbmLangPathList|xform)\b/,operator:[/\+[+=]?|-[-=]?|&&|\|\||[<>]=|[*\/!=]=?|[%^]/,{pattern:/(^|[^<])<(?!<)/,lookbehind:!0},{pattern:/(^|[^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,:;?\[\](){}]/},t.languages.mel.code.inside.rest=t.languages.mel}return mw}var hw,aL;function kve(){if(aL)return hw;aL=1,hw=e,e.displayName="mermaid",e.aliases=[];function e(t){t.languages.mermaid={comment:{pattern:/%%.*/,greedy:!0},style:{pattern:/^([ \t]*(?:classDef|linkStyle|style)[ \t]+[\w$-]+[ \t]+)\w.*[^\s;]/m,lookbehind:!0,inside:{property:/\b\w[\w-]*(?=[ \t]*:)/,operator:/:/,punctuation:/,/}},"inter-arrow-label":{pattern:/([^<>ox.=-])(?:-[-.]|==)(?![<>ox.=-])[ \t]*(?:"[^"\r\n]*"|[^\s".=-](?:[^\r\n.=-]*[^\s.=-])?)[ \t]*(?:\.+->?|--+[->]|==+[=>])(?![<>ox.=-])/,lookbehind:!0,greedy:!0,inside:{arrow:{pattern:/(?:\.+->?|--+[->]|==+[=>])$/,alias:"operator"},label:{pattern:/^([\s\S]{2}[ \t]*)\S(?:[\s\S]*\S)?/,lookbehind:!0,alias:"property"},"arrow-head":{pattern:/^\S+/,alias:["arrow","operator"]}}},arrow:[{pattern:/(^|[^{}|o.-])[|}][|o](?:--|\.\.)[|o][|{](?![{}|o.-])/,lookbehind:!0,alias:"operator"},{pattern:/(^|[^<>ox.=-])(?:[ox]?|(?:==+|--+|-\.*-)[>ox]|===+|---+|-\.+-)(?![<>ox.=-])/,lookbehind:!0,alias:"operator"},{pattern:/(^|[^<>()x-])(?:--?(?:>>|[x>)])(?![<>()x])|(?:<<|[x<(])--?(?!-))/,lookbehind:!0,alias:"operator"},{pattern:/(^|[^<>|*o.-])(?:[*o]--|--[*o]|<\|?(?:--|\.\.)|(?:--|\.\.)\|?>|--|\.\.)(?![<>|*o.-])/,lookbehind:!0,alias:"operator"}],label:{pattern:/(^|[^|<])\|(?:[^\r\n"|]|"[^"\r\n]*")+\|/,lookbehind:!0,greedy:!0,alias:"property"},text:{pattern:/(?:[(\[{]+|\b>)(?:[^\r\n"()\[\]{}]|"[^"\r\n]*")+(?:[)\]}]+|>)/,alias:"string"},string:{pattern:/"[^"\r\n]*"/,greedy:!0},annotation:{pattern:/<<(?:abstract|choice|enumeration|fork|interface|join|service)>>|\[\[(?:choice|fork|join)\]\]/i,alias:"important"},keyword:[{pattern:/(^[ \t]*)(?:action|callback|class|classDef|classDiagram|click|direction|erDiagram|flowchart|gantt|gitGraph|graph|journey|link|linkStyle|pie|requirementDiagram|sequenceDiagram|stateDiagram|stateDiagram-v2|style|subgraph)(?![\w$-])/m,lookbehind:!0,greedy:!0},{pattern:/(^[ \t]*)(?:activate|alt|and|as|autonumber|deactivate|else|end(?:[ \t]+note)?|loop|opt|par|participant|rect|state|note[ \t]+(?:over|(?:left|right)[ \t]+of))(?![\w$-])/im,lookbehind:!0,greedy:!0}],entity:/#[a-z0-9]+;/,operator:{pattern:/(\w[ \t]*)&(?=[ \t]*\w)|:::|:/,lookbehind:!0},punctuation:/[(){};]/}}return hw}var bw,oL;function Cve(){if(oL)return bw;oL=1,bw=e,e.displayName="mizar",e.aliases=[];function e(t){t.languages.mizar={comment:/::.+/,keyword:/@proof\b|\b(?:according|aggregate|all|and|antonym|are|as|associativity|assume|asymmetry|attr|be|begin|being|by|canceled|case|cases|clusters?|coherence|commutativity|compatibility|connectedness|consider|consistency|constructors|contradiction|correctness|def|deffunc|define|definitions?|defpred|do|does|end|environ|equals|ex|exactly|existence|for|from|func|given|hence|hereby|holds|idempotence|identity|iff?|implies|involutiveness|irreflexivity|is|it|let|means|mode|non|not|notations?|now|of|or|otherwise|over|per|pred|prefix|projectivity|proof|provided|qua|reconsider|redefine|reduce|reducibility|reflexivity|registrations?|requirements|reserve|sch|schemes?|section|selector|set|sethood|st|struct|such|suppose|symmetry|synonym|take|that|the|then|theorems?|thesis|thus|to|transitivity|uniqueness|vocabular(?:ies|y)|when|where|with|wrt)\b/,parameter:{pattern:/\$(?:10|\d)/,alias:"variable"},variable:/\b\w+(?=:)/,number:/(?:\b|-)\d+\b/,operator:/\.\.\.|->|&|\.?=/,punctuation:/\(#|#\)|[,:;\[\](){}]/}}return bw}var yw,iL;function _ve(){if(iL)return yw;iL=1,yw=e,e.displayName="mongodb",e.aliases=[];function e(t){(function(n){var r=["$eq","$gt","$gte","$in","$lt","$lte","$ne","$nin","$and","$not","$nor","$or","$exists","$type","$expr","$jsonSchema","$mod","$regex","$text","$where","$geoIntersects","$geoWithin","$near","$nearSphere","$all","$elemMatch","$size","$bitsAllClear","$bitsAllSet","$bitsAnyClear","$bitsAnySet","$comment","$elemMatch","$meta","$slice","$currentDate","$inc","$min","$max","$mul","$rename","$set","$setOnInsert","$unset","$addToSet","$pop","$pull","$push","$pullAll","$each","$position","$slice","$sort","$bit","$addFields","$bucket","$bucketAuto","$collStats","$count","$currentOp","$facet","$geoNear","$graphLookup","$group","$indexStats","$limit","$listLocalSessions","$listSessions","$lookup","$match","$merge","$out","$planCacheStats","$project","$redact","$replaceRoot","$replaceWith","$sample","$set","$skip","$sort","$sortByCount","$unionWith","$unset","$unwind","$setWindowFields","$abs","$accumulator","$acos","$acosh","$add","$addToSet","$allElementsTrue","$and","$anyElementTrue","$arrayElemAt","$arrayToObject","$asin","$asinh","$atan","$atan2","$atanh","$avg","$binarySize","$bsonSize","$ceil","$cmp","$concat","$concatArrays","$cond","$convert","$cos","$dateFromParts","$dateToParts","$dateFromString","$dateToString","$dayOfMonth","$dayOfWeek","$dayOfYear","$degreesToRadians","$divide","$eq","$exp","$filter","$first","$floor","$function","$gt","$gte","$hour","$ifNull","$in","$indexOfArray","$indexOfBytes","$indexOfCP","$isArray","$isNumber","$isoDayOfWeek","$isoWeek","$isoWeekYear","$last","$last","$let","$literal","$ln","$log","$log10","$lt","$lte","$ltrim","$map","$max","$mergeObjects","$meta","$min","$millisecond","$minute","$mod","$month","$multiply","$ne","$not","$objectToArray","$or","$pow","$push","$radiansToDegrees","$range","$reduce","$regexFind","$regexFindAll","$regexMatch","$replaceOne","$replaceAll","$reverseArray","$round","$rtrim","$second","$setDifference","$setEquals","$setIntersection","$setIsSubset","$setUnion","$size","$sin","$slice","$split","$sqrt","$stdDevPop","$stdDevSamp","$strcasecmp","$strLenBytes","$strLenCP","$substr","$substrBytes","$substrCP","$subtract","$sum","$switch","$tan","$toBool","$toDate","$toDecimal","$toDouble","$toInt","$toLong","$toObjectId","$toString","$toLower","$toUpper","$trim","$trunc","$type","$week","$year","$zip","$count","$dateAdd","$dateDiff","$dateSubtract","$dateTrunc","$getField","$rand","$sampleRate","$setField","$unsetField","$comment","$explain","$hint","$max","$maxTimeMS","$min","$orderby","$query","$returnKey","$showDiskLoc","$natural"],a=["ObjectId","Code","BinData","DBRef","Timestamp","NumberLong","NumberDecimal","MaxKey","MinKey","RegExp","ISODate","UUID"];r=r.map(function(i){return i.replace("$","\\$")});var o="(?:"+r.join("|")+")\\b";n.languages.mongodb=n.languages.extend("javascript",{}),n.languages.insertBefore("mongodb","string",{property:{pattern:/(?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)(?=\s*:)/,greedy:!0,inside:{keyword:RegExp(`^(['"])?`+o+"(?:\\1)?$")}}}),n.languages.mongodb.string.inside={url:{pattern:/https?:\/\/[-\w@:%.+~#=]{1,256}\.[a-z0-9()]{1,6}\b[-\w()@:%+.~#?&/=]*/i,greedy:!0},entity:{pattern:/\b(?:(?:[01]?\d\d?|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d\d?|2[0-4]\d|25[0-5])\b/,greedy:!0}},n.languages.insertBefore("mongodb","constant",{builtin:{pattern:RegExp("\\b(?:"+a.join("|")+")\\b"),alias:"keyword"}})})(t)}return yw}var vw,sL;function Ave(){if(sL)return vw;sL=1,vw=e,e.displayName="monkey",e.aliases=[];function e(t){t.languages.monkey={comment:{pattern:/^#Rem\s[\s\S]*?^#End|'.+/im,greedy:!0},string:{pattern:/"[^"\r\n]*"/,greedy:!0},preprocessor:{pattern:/(^[ \t]*)#.+/m,lookbehind:!0,greedy:!0,alias:"property"},function:/\b\w+(?=\()/,"type-char":{pattern:/\b[?%#$]/,alias:"class-name"},number:{pattern:/((?:\.\.)?)(?:(?:\b|\B-\.?|\B\.)\d+(?:(?!\.\.)\.\d*)?|\$[\da-f]+)/i,lookbehind:!0},keyword:/\b(?:Abstract|Array|Bool|Case|Catch|Class|Const|Continue|Default|Eachin|Else|ElseIf|End|EndIf|Exit|Extends|Extern|False|Field|Final|Float|For|Forever|Function|Global|If|Implements|Import|Inline|Int|Interface|Local|Method|Module|New|Next|Null|Object|Private|Property|Public|Repeat|Return|Select|Self|Step|Strict|String|Super|Then|Throw|To|True|Try|Until|Void|Wend|While)\b/i,operator:/\.\.|<[=>]?|>=?|:?=|(?:[+\-*\/&~|]|\b(?:Mod|Shl|Shr)\b)=?|\b(?:And|Not|Or)\b/i,punctuation:/[.,:;()\[\]]/}}return vw}var Sw,lL;function Tve(){if(lL)return Sw;lL=1,Sw=e,e.displayName="moonscript",e.aliases=["moon"];function e(t){t.languages.moonscript={comment:/--.*/,string:[{pattern:/'[^']*'|\[(=*)\[[\s\S]*?\]\1\]/,greedy:!0},{pattern:/"[^"]*"/,greedy:!0,inside:{interpolation:{pattern:/#\{[^{}]*\}/,inside:{moonscript:{pattern:/(^#\{)[\s\S]+(?=\})/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/#\{|\}/,alias:"punctuation"}}}}}],"class-name":[{pattern:/(\b(?:class|extends)[ \t]+)\w+/,lookbehind:!0},/\b[A-Z]\w*/],keyword:/\b(?:class|continue|do|else|elseif|export|extends|for|from|if|import|in|local|nil|return|self|super|switch|then|unless|using|when|while|with)\b/,variable:/@@?\w*/,property:{pattern:/\b(?!\d)\w+(?=:)|(:)(?!\d)\w+/,lookbehind:!0},function:{pattern:/\b(?:_G|_VERSION|assert|collectgarbage|coroutine\.(?:create|resume|running|status|wrap|yield)|debug\.(?:debug|getfenv|gethook|getinfo|getlocal|getmetatable|getregistry|getupvalue|setfenv|sethook|setlocal|setmetatable|setupvalue|traceback)|dofile|error|getfenv|getmetatable|io\.(?:close|flush|input|lines|open|output|popen|read|stderr|stdin|stdout|tmpfile|type|write)|ipairs|load|loadfile|loadstring|math\.(?:abs|acos|asin|atan|atan2|ceil|cos|cosh|deg|exp|floor|fmod|frexp|ldexp|log|log10|max|min|modf|pi|pow|rad|random|randomseed|sin|sinh|sqrt|tan|tanh)|module|next|os\.(?:clock|date|difftime|execute|exit|getenv|remove|rename|setlocale|time|tmpname)|package\.(?:cpath|loaded|loadlib|path|preload|seeall)|pairs|pcall|print|rawequal|rawget|rawset|require|select|setfenv|setmetatable|string\.(?:byte|char|dump|find|format|gmatch|gsub|len|lower|match|rep|reverse|sub|upper)|table\.(?:concat|insert|maxn|remove|sort)|tonumber|tostring|type|unpack|xpcall)\b/,inside:{punctuation:/\./}},boolean:/\b(?:false|true)\b/,number:/(?:\B\.\d+|\b\d+\.\d+|\b\d+(?=[eE]))(?:[eE][-+]?\d+)?\b|\b(?:0x[a-fA-F\d]+|\d+)(?:U?LL)?\b/,operator:/\.{3}|[-=]>|~=|(?:[-+*/%<>!=]|\.\.)=?|[:#^]|\b(?:and|or)\b=?|\b(?:not)\b/,punctuation:/[.,()[\]{}\\]/},t.languages.moonscript.string[1].inside.interpolation.inside.moonscript.inside=t.languages.moonscript,t.languages.moon=t.languages.moonscript}return Sw}var ww,cL;function Rve(){if(cL)return ww;cL=1,ww=e,e.displayName="n1ql",e.aliases=[];function e(t){t.languages.n1ql={comment:{pattern:/\/\*[\s\S]*?(?:$|\*\/)|--.*/,greedy:!0},string:{pattern:/(["'])(?:\\[\s\S]|(?!\1)[^\\]|\1\1)*\1/,greedy:!0},identifier:{pattern:/`(?:\\[\s\S]|[^\\`]|``)*`/,greedy:!0},parameter:/\$[\w.]+/,keyword:/\b(?:ADVISE|ALL|ALTER|ANALYZE|AS|ASC|AT|BEGIN|BINARY|BOOLEAN|BREAK|BUCKET|BUILD|BY|CALL|CAST|CLUSTER|COLLATE|COLLECTION|COMMIT|COMMITTED|CONNECT|CONTINUE|CORRELATE|CORRELATED|COVER|CREATE|CURRENT|DATABASE|DATASET|DATASTORE|DECLARE|DECREMENT|DELETE|DERIVED|DESC|DESCRIBE|DISTINCT|DO|DROP|EACH|ELEMENT|EXCEPT|EXCLUDE|EXECUTE|EXPLAIN|FETCH|FILTER|FLATTEN|FLUSH|FOLLOWING|FOR|FORCE|FROM|FTS|FUNCTION|GOLANG|GRANT|GROUP|GROUPS|GSI|HASH|HAVING|IF|IGNORE|ILIKE|INCLUDE|INCREMENT|INDEX|INFER|INLINE|INNER|INSERT|INTERSECT|INTO|IS|ISOLATION|JAVASCRIPT|JOIN|KEY|KEYS|KEYSPACE|KNOWN|LANGUAGE|LAST|LEFT|LET|LETTING|LEVEL|LIMIT|LSM|MAP|MAPPING|MATCHED|MATERIALIZED|MERGE|MINUS|MISSING|NAMESPACE|NEST|NL|NO|NTH_VALUE|NULL|NULLS|NUMBER|OBJECT|OFFSET|ON|OPTION|OPTIONS|ORDER|OTHERS|OUTER|OVER|PARSE|PARTITION|PASSWORD|PATH|POOL|PRECEDING|PREPARE|PRIMARY|PRIVATE|PRIVILEGE|PROBE|PROCEDURE|PUBLIC|RANGE|RAW|REALM|REDUCE|RENAME|RESPECT|RETURN|RETURNING|REVOKE|RIGHT|ROLE|ROLLBACK|ROW|ROWS|SATISFIES|SAVEPOINT|SCHEMA|SCOPE|SELECT|SELF|SEMI|SET|SHOW|SOME|START|STATISTICS|STRING|SYSTEM|TIES|TO|TRAN|TRANSACTION|TRIGGER|TRUNCATE|UNBOUNDED|UNDER|UNION|UNIQUE|UNKNOWN|UNNEST|UNSET|UPDATE|UPSERT|USE|USER|USING|VALIDATE|VALUE|VALUES|VIA|VIEW|WHERE|WHILE|WINDOW|WITH|WORK|XOR)\b/i,function:/\b[a-z_]\w*(?=\s*\()/i,boolean:/\b(?:FALSE|TRUE)\b/i,number:/(?:\b\d+\.|\B\.)\d+e[+\-]?\d+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/%]|!=|==?|\|\||<[>=]?|>=?|\b(?:AND|ANY|ARRAY|BETWEEN|CASE|ELSE|END|EVERY|EXISTS|FIRST|IN|LIKE|NOT|OR|THEN|VALUED|WHEN|WITHIN)\b/i,punctuation:/[;[\](),.{}:]/}}return ww}var Ew,uL;function Nve(){if(uL)return Ew;uL=1,Ew=e,e.displayName="n4js",e.aliases=["n4jsd"];function e(t){t.languages.n4js=t.languages.extend("javascript",{keyword:/\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),t.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),t.languages.n4jsd=t.languages.n4js}return Ew}var xw,dL;function Ive(){if(dL)return xw;dL=1,xw=e,e.displayName="nand2tetrisHdl",e.aliases=[];function e(t){t.languages["nand2tetris-hdl"]={comment:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,keyword:/\b(?:BUILTIN|CHIP|CLOCKED|IN|OUT|PARTS)\b/,boolean:/\b(?:false|true)\b/,function:/\b[A-Za-z][A-Za-z0-9]*(?=\()/,number:/\b\d+\b/,operator:/=|\.\./,punctuation:/[{}[\];(),:]/}}return xw}var kw,fL;function Ove(){if(fL)return kw;fL=1,kw=e,e.displayName="naniscript",e.aliases=[];function e(t){(function(n){var r=/\{[^\r\n\[\]{}]*\}/,a={"quoted-string":{pattern:/"(?:[^"\\]|\\.)*"/,alias:"operator"},"command-param-id":{pattern:/(\s)\w+:/,lookbehind:!0,alias:"property"},"command-param-value":[{pattern:r,alias:"selector"},{pattern:/([\t ])\S+/,lookbehind:!0,greedy:!0,alias:"operator"},{pattern:/\S(?:.*\S)?/,alias:"operator"}]};n.languages.naniscript={comment:{pattern:/^([\t ]*);.*/m,lookbehind:!0},define:{pattern:/^>.+/m,alias:"tag",inside:{value:{pattern:/(^>\w+[\t ]+)(?!\s)[^{}\r\n]+/,lookbehind:!0,alias:"operator"},key:{pattern:/(^>)\w+/,lookbehind:!0}}},label:{pattern:/^([\t ]*)#[\t ]*\w+[\t ]*$/m,lookbehind:!0,alias:"regex"},command:{pattern:/^([\t ]*)@\w+(?=[\t ]|$).*/m,lookbehind:!0,alias:"function",inside:{"command-name":/^@\w+/,expression:{pattern:r,greedy:!0,alias:"selector"},"command-params":{pattern:/\s*\S[\s\S]*/,inside:a}}},"generic-text":{pattern:/(^[ \t]*)[^#@>;\s].*/m,lookbehind:!0,alias:"punctuation",inside:{"escaped-char":/\\[{}\[\]"]/,expression:{pattern:r,greedy:!0,alias:"selector"},"inline-command":{pattern:/\[[\t ]*\w[^\r\n\[\]]*\]/,greedy:!0,alias:"function",inside:{"command-params":{pattern:/(^\[[\t ]*\w+\b)[\s\S]+(?=\]$)/,lookbehind:!0,inside:a},"command-param-name":{pattern:/^(\[[\t ]*)\w+/,lookbehind:!0,alias:"name"},"start-stop-char":/[\[\]]/}}}}},n.languages.nani=n.languages.naniscript,n.hooks.add("after-tokenize",function(s){var l=s.tokens;l.forEach(function(c){if(typeof c!="string"&&c.type==="generic-text"){var u=i(c);o(u)||(c.type="bad-line",c.content=u)}})});function o(s){for(var l="[]{}",c=[],u=0;u=&|$!]/}}return Cw}var _w,gL;function Lve(){if(gL)return _w;gL=1,_w=e,e.displayName="neon",e.aliases=[];function e(t){t.languages.neon={comment:{pattern:/#.*/,greedy:!0},datetime:{pattern:/(^|[[{(=:,\s])\d\d\d\d-\d\d?-\d\d?(?:(?:[Tt]| +)\d\d?:\d\d:\d\d(?:\.\d*)? *(?:Z|[-+]\d\d?(?::?\d\d)?)?)?(?=$|[\]}),\s])/,lookbehind:!0,alias:"number"},key:{pattern:/(^|[[{(,\s])[^,:=[\]{}()'"\s]+(?=\s*:(?:$|[\]}),\s])|\s*=)/,lookbehind:!0,alias:"atrule"},number:{pattern:/(^|[[{(=:,\s])[+-]?(?:0x[\da-fA-F]+|0o[0-7]+|0b[01]+|(?:\d+(?:\.\d*)?|\.?\d+)(?:[eE][+-]?\d+)?)(?=$|[\]}),:=\s])/,lookbehind:!0},boolean:{pattern:/(^|[[{(=:,\s])(?:false|no|true|yes)(?=$|[\]}),:=\s])/i,lookbehind:!0},null:{pattern:/(^|[[{(=:,\s])(?:null)(?=$|[\]}),:=\s])/i,lookbehind:!0,alias:"keyword"},string:{pattern:/(^|[[{(=:,\s])(?:('''|""")\r?\n(?:(?:[^\r\n]|\r?\n(?![\t ]*\2))*\r?\n)?[\t ]*\2|'[^'\r\n]*'|"(?:\\.|[^\\"\r\n])*")/,lookbehind:!0,greedy:!0},literal:{pattern:/(^|[[{(=:,\s])(?:[^#"',:=[\]{}()\s`-]|[:-][^"',=[\]{}()\s])(?:[^,:=\]})(\s]|:(?![\s,\]})]|$)|[ \t]+[^#,:=\]})(\s])*/,lookbehind:!0,alias:"string"},punctuation:/[,:=[\]{}()-]/}}return _w}var Aw,mL;function Mve(){if(mL)return Aw;mL=1,Aw=e,e.displayName="nevod",e.aliases=[];function e(t){t.languages.nevod={comment:/\/\/.*|(?:\/\*[\s\S]*?(?:\*\/|$))/,string:{pattern:/(?:"(?:""|[^"])*"(?!")|'(?:''|[^'])*'(?!'))!?\*?/,greedy:!0,inside:{"string-attrs":/!$|!\*$|\*$/}},namespace:{pattern:/(@namespace\s+)[a-zA-Z0-9\-.]+(?=\s*\{)/,lookbehind:!0},pattern:{pattern:/(@pattern\s+)?#?[a-zA-Z0-9\-.]+(?:\s*\(\s*(?:~\s*)?[a-zA-Z0-9\-.]+\s*(?:,\s*(?:~\s*)?[a-zA-Z0-9\-.]*)*\))?(?=\s*=)/,lookbehind:!0,inside:{"pattern-name":{pattern:/^#?[a-zA-Z0-9\-.]+/,alias:"class-name"},fields:{pattern:/\(.*\)/,inside:{"field-name":{pattern:/[a-zA-Z0-9\-.]+/,alias:"variable"},punctuation:/[,()]/,operator:{pattern:/~/,alias:"field-hidden-mark"}}}}},search:{pattern:/(@search\s+|#)[a-zA-Z0-9\-.]+(?:\.\*)?(?=\s*;)/,alias:"function",lookbehind:!0},keyword:/@(?:having|inside|namespace|outside|pattern|require|search|where)\b/,"standard-pattern":{pattern:/\b(?:Alpha|AlphaNum|Any|Blank|End|LineBreak|Num|NumAlpha|Punct|Space|Start|Symbol|Word|WordBreak)\b(?:\([a-zA-Z0-9\-.,\s+]*\))?/,inside:{"standard-pattern-name":{pattern:/^[a-zA-Z0-9\-.]+/,alias:"builtin"},quantifier:{pattern:/\b\d+(?:\s*\+|\s*-\s*\d+)?(?!\w)/,alias:"number"},"standard-pattern-attr":{pattern:/[a-zA-Z0-9\-.]+/,alias:"builtin"},punctuation:/[,()]/}},quantifier:{pattern:/\b\d+(?:\s*\+|\s*-\s*\d+)?(?!\w)/,alias:"number"},operator:[{pattern:/=/,alias:"pattern-def"},{pattern:/&/,alias:"conjunction"},{pattern:/~/,alias:"exception"},{pattern:/\?/,alias:"optionality"},{pattern:/[[\]]/,alias:"repetition"},{pattern:/[{}]/,alias:"variation"},{pattern:/[+_]/,alias:"sequence"},{pattern:/\.{2,3}/,alias:"span"}],"field-capture":[{pattern:/([a-zA-Z0-9\-.]+\s*\()\s*[a-zA-Z0-9\-.]+\s*:\s*[a-zA-Z0-9\-.]+(?:\s*,\s*[a-zA-Z0-9\-.]+\s*:\s*[a-zA-Z0-9\-.]+)*(?=\s*\))/,lookbehind:!0,inside:{"field-name":{pattern:/[a-zA-Z0-9\-.]+/,alias:"variable"},colon:/:/}},{pattern:/[a-zA-Z0-9\-.]+\s*:/,inside:{"field-name":{pattern:/[a-zA-Z0-9\-.]+/,alias:"variable"},colon:/:/}}],punctuation:/[:;,()]/,name:/[a-zA-Z0-9\-.]+/}}return Aw}var Tw,hL;function Pve(){if(hL)return Tw;hL=1,Tw=e,e.displayName="nginx",e.aliases=[];function e(t){(function(n){var r=/\$(?:\w[a-z\d]*(?:_[^\x00-\x1F\s"'\\()$]*)?|\{[^}\s"'\\]+\})/i;n.languages.nginx={comment:{pattern:/(^|[\s{};])#.*/,lookbehind:!0,greedy:!0},directive:{pattern:/(^|\s)\w(?:[^;{}"'\\\s]|\\.|"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|\s+(?:#.*(?!.)|(?![#\s])))*?(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:{string:{pattern:/((?:^|[^\\])(?:\\\\)*)(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,lookbehind:!0,greedy:!0,inside:{escape:{pattern:/\\["'\\nrt]/,alias:"entity"},variable:r}},comment:{pattern:/(\s)#.*/,lookbehind:!0,greedy:!0},keyword:{pattern:/^\S+/,greedy:!0},boolean:{pattern:/(\s)(?:off|on)(?!\S)/,lookbehind:!0},number:{pattern:/(\s)\d+[a-z]*(?!\S)/i,lookbehind:!0},variable:r}},punctuation:/[{};]/}})(t)}return Tw}var Rw,bL;function $ve(){if(bL)return Rw;bL=1,Rw=e,e.displayName="nim",e.aliases=[];function e(t){t.languages.nim={comment:{pattern:/#.*/,greedy:!0},string:{pattern:/(?:\b(?!\d)(?:\w|\\x[89a-fA-F][0-9a-fA-F])+)?(?:"""[\s\S]*?"""(?!")|"(?:\\[\s\S]|""|[^"\\])*")/,greedy:!0},char:{pattern:/'(?:\\(?:\d+|x[\da-fA-F]{0,2}|.)|[^'])'/,greedy:!0},function:{pattern:/(?:(?!\d)(?:\w|\\x[89a-fA-F][0-9a-fA-F])+|`[^`\r\n]+`)\*?(?:\[[^\]]+\])?(?=\s*\()/,greedy:!0,inside:{operator:/\*$/}},identifier:{pattern:/`[^`\r\n]+`/,greedy:!0,inside:{punctuation:/`/}},number:/\b(?:0[xXoObB][\da-fA-F_]+|\d[\d_]*(?:(?!\.\.)\.[\d_]*)?(?:[eE][+-]?\d[\d_]*)?)(?:'?[iuf]\d*)?/,keyword:/\b(?:addr|as|asm|atomic|bind|block|break|case|cast|concept|const|continue|converter|defer|discard|distinct|do|elif|else|end|enum|except|export|finally|for|from|func|generic|if|import|include|interface|iterator|let|macro|method|mixin|nil|object|out|proc|ptr|raise|ref|return|static|template|try|tuple|type|using|var|when|while|with|without|yield)\b/,operator:{pattern:/(^|[({\[](?=\.\.)|(?![({\[]\.).)(?:(?:[=+\-*\/<>@$~&%|!?^:\\]|\.\.|\.(?![)}\]]))+|\b(?:and|div|in|is|isnot|mod|not|notin|of|or|shl|shr|xor)\b)/m,lookbehind:!0},punctuation:/[({\[]\.|\.[)}\]]|[`(){}\[\],:]/}}return Rw}var Nw,yL;function Fve(){if(yL)return Nw;yL=1,Nw=e,e.displayName="nix",e.aliases=[];function e(t){t.languages.nix={comment:{pattern:/\/\*[\s\S]*?\*\/|#.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\[\s\S])*"|''(?:(?!'')[\s\S]|''(?:'|\\|\$\{))*''/,greedy:!0,inside:{interpolation:{pattern:/(^|(?:^|(?!'').)[^\\])\$\{(?:[^{}]|\{[^}]*\})*\}/,lookbehind:!0,inside:null}}},url:[/\b(?:[a-z]{3,7}:\/\/)[\w\-+%~\/.:#=?&]+/,{pattern:/([^\/])(?:[\w\-+%~.:#=?&]*(?!\/\/)[\w\-+%~\/.:#=?&])?(?!\/\/)\/[\w\-+%~\/.:#=?&]*/,lookbehind:!0}],antiquotation:{pattern:/\$(?=\{)/,alias:"important"},number:/\b\d+\b/,keyword:/\b(?:assert|builtins|else|if|in|inherit|let|null|or|then|with)\b/,function:/\b(?:abort|add|all|any|attrNames|attrValues|baseNameOf|compareVersions|concatLists|currentSystem|deepSeq|derivation|dirOf|div|elem(?:At)?|fetch(?:Tarball|url)|filter(?:Source)?|fromJSON|genList|getAttr|getEnv|hasAttr|hashString|head|import|intersectAttrs|is(?:Attrs|Bool|Function|Int|List|Null|String)|length|lessThan|listToAttrs|map|mul|parseDrvName|pathExists|read(?:Dir|File)|removeAttrs|replaceStrings|seq|sort|stringLength|sub(?:string)?|tail|throw|to(?:File|JSON|Path|String|XML)|trace|typeOf)\b|\bfoldl'\B/,boolean:/\b(?:false|true)\b/,operator:/[=!<>]=?|\+\+?|\|\||&&|\/\/|->?|[?@]/,punctuation:/[{}()[\].,:;]/},t.languages.nix.string.inside.interpolation.inside=t.languages.nix}return Nw}var Iw,vL;function jve(){if(vL)return Iw;vL=1,Iw=e,e.displayName="nsis",e.aliases=[];function e(t){t.languages.nsis={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|[#;].*)/,lookbehind:!0,greedy:!0},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:{pattern:/(^[\t ]*)(?:Abort|Add(?:BrandingImage|Size)|AdvSplash|Allow(?:RootDirInstall|SkipFiles)|AutoCloseWindow|BG(?:Font|Gradient|Image)|Banner|BrandingText|BringToFront|CRCCheck|Call(?:InstDLL)?|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|Create(?:Directory|Font|ShortCut)|Delete(?:INISec|INIStr|RegKey|RegValue)?|Detail(?:Print|sButtonText)|Dialer|Dir(?:Text|Var|Verify)|EnableWindow|Enum(?:RegKey|RegValue)|Exch|Exec(?:Shell(?:Wait)?|Wait)?|ExpandEnvStrings|File(?:BufSize|Close|ErrorText|Open|Read|ReadByte|ReadUTF16LE|ReadWord|Seek|Write|WriteByte|WriteUTF16LE|WriteWord)?|Find(?:Close|First|Next|Window)|FlushINI|Get(?:CurInstType|CurrentAddress|DLLVersion(?:Local)?|DlgItem|ErrorLevel|FileTime(?:Local)?|FullPathName|Function(?:Address|End)?|InstDirError|LabelAddress|TempFileName)|Goto|HideWindow|Icon|If(?:Abort|Errors|FileExists|RebootFlag|Silent)|InitPluginsDir|InstProgressFlags|Inst(?:Type(?:GetText|SetText)?)|Install(?:ButtonText|Colors|Dir(?:RegKey)?)|Int(?:64|Ptr)?CmpU?|Int(?:64)?Fmt|Int(?:Ptr)?Op|IsWindow|Lang(?:DLL|String)|License(?:BkColor|Data|ForceSelection|LangString|Text)|LoadLanguageFile|LockWindow|Log(?:Set|Text)|Manifest(?:DPIAware|SupportedOS)|Math|MessageBox|MiscButtonText|NSISdl|Name|Nop|OutFile|PE(?:DllCharacteristics|SubsysVer)|Page(?:Callbacks)?|Pop|Push|Quit|RMDir|Read(?:EnvStr|INIStr|RegDWORD|RegStr)|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|SearchPath|Section(?:End|GetFlags|GetInstTypes|GetSize|GetText|Group|In|SetFlags|SetInstTypes|SetSize|SetText)?|SendMessage|Set(?:AutoClose|BrandingImage|Compress|Compressor(?:DictSize)?|CtlColors|CurInstType|DatablockOptimize|DateSave|Details(?:Print|View)|ErrorLevel|Errors|FileAttributes|Font|OutPath|Overwrite|PluginUnload|RebootFlag|RegView|ShellVarContext|Silent)|Show(?:InstDetails|UninstDetails|Window)|Silent(?:Install|UnInstall)|Sleep|SpaceTexts|Splash|StartMenu|Str(?:CmpS?|Cpy|Len)|SubCaption|System|UnRegDLL|Unicode|UninstPage|Uninstall(?:ButtonText|Caption|Icon|SubCaption|Text)|UserInfo|VI(?:AddVersionKey|FileVersion|ProductVersion)|VPatch|Var|WindowIcon|Write(?:INIStr|Reg(?:Bin|DWORD|ExpandStr|MultiStr|None|Str)|Uninstaller)|XPStyle|ns(?:Dialogs|Exec))\b/m,lookbehind:!0},property:/\b(?:ARCHIVE|FILE_(?:ATTRIBUTE_ARCHIVE|ATTRIBUTE_NORMAL|ATTRIBUTE_OFFLINE|ATTRIBUTE_READONLY|ATTRIBUTE_SYSTEM|ATTRIBUTE_TEMPORARY)|HK(?:(?:CR|CU|LM)(?:32|64)?|DD|PD|U)|HKEY_(?:CLASSES_ROOT|CURRENT_CONFIG|CURRENT_USER|DYN_DATA|LOCAL_MACHINE|PERFORMANCE_DATA|USERS)|ID(?:ABORT|CANCEL|IGNORE|NO|OK|RETRY|YES)|MB_(?:ABORTRETRYIGNORE|DEFBUTTON1|DEFBUTTON2|DEFBUTTON3|DEFBUTTON4|ICONEXCLAMATION|ICONINFORMATION|ICONQUESTION|ICONSTOP|OK|OKCANCEL|RETRYCANCEL|RIGHT|RTLREADING|SETFOREGROUND|TOPMOST|USERICON|YESNO)|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SYSTEM|TEMPORARY|admin|all|auto|both|colored|false|force|hide|highest|lastused|leave|listonly|none|normal|notset|off|on|open|print|show|silent|silentlog|smooth|textonly|true|user)\b/,constant:/\$\{[!\w\.:\^-]+\}|\$\([!\w\.:\^-]+\)/,variable:/\$\w[\w\.]*/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--?|\+\+?|<=?|>=?|==?=?|&&?|\|\|?|[?*\/~^%]/,punctuation:/[{}[\];(),.:]/,important:{pattern:/(^[\t ]*)!(?:addincludedir|addplugindir|appendfile|cd|define|delfile|echo|else|endif|error|execute|finalize|getdllversion|gettlbversion|if|ifdef|ifmacrodef|ifmacrondef|ifndef|include|insertmacro|macro|macroend|makensis|packhdr|pragma|searchparse|searchreplace|system|tempfile|undef|verbose|warning)\b/im,lookbehind:!0}}}return Iw}var Ow,SL;function zve(){if(SL)return Ow;SL=1;var e=Ws();Ow=t,t.displayName="objectivec",t.aliases=["objc"];function t(n){n.register(e),n.languages.objectivec=n.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete n.languages.objectivec["class-name"],n.languages.objc=n.languages.objectivec}return Ow}var Dw,wL;function Uve(){if(wL)return Dw;wL=1,Dw=e,e.displayName="ocaml",e.aliases=[];function e(t){t.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/}}return Dw}var Lw,EL;function Bve(){if(EL)return Lw;EL=1;var e=Ws();Lw=t,t.displayName="opencl",t.aliases=[];function t(n){n.register(e),function(r){r.languages.opencl=r.languages.extend("c",{keyword:/\b(?:(?:__)?(?:constant|global|kernel|local|private|read_only|read_write|write_only)|__attribute__|auto|(?:bool|u?(?:char|int|long|short)|half|quad)(?:2|3|4|8|16)?|break|case|complex|const|continue|(?:double|float)(?:16(?:x(?:1|2|4|8|16))?|1x(?:1|2|4|8|16)|2(?:x(?:1|2|4|8|16))?|3|4(?:x(?:1|2|4|8|16))?|8(?:x(?:1|2|4|8|16))?)?|default|do|else|enum|extern|for|goto|if|imaginary|inline|packed|pipe|register|restrict|return|signed|sizeof|static|struct|switch|typedef|uniform|union|unsigned|void|volatile|while)\b/,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[fuhl]{0,4}/i,boolean:/\b(?:false|true)\b/,"constant-opencl-kernel":{pattern:/\b(?:CHAR_(?:BIT|MAX|MIN)|CLK_(?:ADDRESS_(?:CLAMP(?:_TO_EDGE)?|NONE|REPEAT)|FILTER_(?:LINEAR|NEAREST)|(?:GLOBAL|LOCAL)_MEM_FENCE|NORMALIZED_COORDS_(?:FALSE|TRUE))|CL_(?:BGRA|(?:HALF_)?FLOAT|INTENSITY|LUMINANCE|A?R?G?B?[Ax]?|(?:(?:UN)?SIGNED|[US]NORM)_(?:INT(?:8|16|32))|UNORM_(?:INT_101010|SHORT_(?:555|565)))|(?:DBL|FLT|HALF)_(?:DIG|EPSILON|(?:MAX|MIN)(?:(?:_10)?_EXP)?|MANT_DIG)|FLT_RADIX|HUGE_VALF?|(?:INT|LONG|SCHAR|SHRT)_(?:MAX|MIN)|INFINITY|MAXFLOAT|M_(?:[12]_PI|2_SQRTPI|E|LN(?:2|10)|LOG(?:2|10)E?|PI(?:_[24])?|SQRT(?:1_2|2))(?:_F|_H)?|NAN|(?:UCHAR|UINT|ULONG|USHRT)_MAX)\b/,alias:"constant"}}),r.languages.insertBefore("opencl","class-name",{"builtin-type":{pattern:/\b(?:_cl_(?:command_queue|context|device_id|event|kernel|mem|platform_id|program|sampler)|cl_(?:image_format|mem_fence_flags)|clk_event_t|event_t|image(?:1d_(?:array_|buffer_)?t|2d_(?:array_(?:depth_|msaa_depth_|msaa_)?|depth_|msaa_depth_|msaa_)?t|3d_t)|intptr_t|ndrange_t|ptrdiff_t|queue_t|reserve_id_t|sampler_t|size_t|uintptr_t)\b/,alias:"keyword"}});var a={"type-opencl-host":{pattern:/\b(?:cl_(?:GLenum|GLint|GLuin|addressing_mode|bitfield|bool|buffer_create_type|build_status|channel_(?:order|type)|(?:u?(?:char|int|long|short)|double|float)(?:2|3|4|8|16)?|command_(?:queue(?:_info|_properties)?|type)|context(?:_info|_properties)?|device_(?:exec_capabilities|fp_config|id|info|local_mem_type|mem_cache_type|type)|(?:event|sampler)(?:_info)?|filter_mode|half|image_info|kernel(?:_info|_work_group_info)?|map_flags|mem(?:_flags|_info|_object_type)?|platform_(?:id|info)|profiling_info|program(?:_build_info|_info)?))\b/,alias:"keyword"},"boolean-opencl-host":{pattern:/\bCL_(?:FALSE|TRUE)\b/,alias:"boolean"},"constant-opencl-host":{pattern:/\bCL_(?:A|ABGR|ADDRESS_(?:CLAMP(?:_TO_EDGE)?|MIRRORED_REPEAT|NONE|REPEAT)|ARGB|BGRA|BLOCKING|BUFFER_CREATE_TYPE_REGION|BUILD_(?:ERROR|IN_PROGRESS|NONE|PROGRAM_FAILURE|SUCCESS)|COMMAND_(?:ACQUIRE_GL_OBJECTS|BARRIER|COPY_(?:BUFFER(?:_RECT|_TO_IMAGE)?|IMAGE(?:_TO_BUFFER)?)|FILL_(?:BUFFER|IMAGE)|MAP(?:_BUFFER|_IMAGE)|MARKER|MIGRATE(?:_SVM)?_MEM_OBJECTS|NATIVE_KERNEL|NDRANGE_KERNEL|READ_(?:BUFFER(?:_RECT)?|IMAGE)|RELEASE_GL_OBJECTS|SVM_(?:FREE|MAP|MEMCPY|MEMFILL|UNMAP)|TASK|UNMAP_MEM_OBJECT|USER|WRITE_(?:BUFFER(?:_RECT)?|IMAGE))|COMPILER_NOT_AVAILABLE|COMPILE_PROGRAM_FAILURE|COMPLETE|CONTEXT_(?:DEVICES|INTEROP_USER_SYNC|NUM_DEVICES|PLATFORM|PROPERTIES|REFERENCE_COUNT)|DEPTH(?:_STENCIL)?|DEVICE_(?:ADDRESS_BITS|AFFINITY_DOMAIN_(?:L[1-4]_CACHE|NEXT_PARTITIONABLE|NUMA)|AVAILABLE|BUILT_IN_KERNELS|COMPILER_AVAILABLE|DOUBLE_FP_CONFIG|ENDIAN_LITTLE|ERROR_CORRECTION_SUPPORT|EXECUTION_CAPABILITIES|EXTENSIONS|GLOBAL_(?:MEM_(?:CACHELINE_SIZE|CACHE_SIZE|CACHE_TYPE|SIZE)|VARIABLE_PREFERRED_TOTAL_SIZE)|HOST_UNIFIED_MEMORY|IL_VERSION|IMAGE(?:2D_MAX_(?:HEIGHT|WIDTH)|3D_MAX_(?:DEPTH|HEIGHT|WIDTH)|_BASE_ADDRESS_ALIGNMENT|_MAX_ARRAY_SIZE|_MAX_BUFFER_SIZE|_PITCH_ALIGNMENT|_SUPPORT)|LINKER_AVAILABLE|LOCAL_MEM_SIZE|LOCAL_MEM_TYPE|MAX_(?:CLOCK_FREQUENCY|COMPUTE_UNITS|CONSTANT_ARGS|CONSTANT_BUFFER_SIZE|GLOBAL_VARIABLE_SIZE|MEM_ALLOC_SIZE|NUM_SUB_GROUPS|ON_DEVICE_(?:EVENTS|QUEUES)|PARAMETER_SIZE|PIPE_ARGS|READ_IMAGE_ARGS|READ_WRITE_IMAGE_ARGS|SAMPLERS|WORK_GROUP_SIZE|WORK_ITEM_DIMENSIONS|WORK_ITEM_SIZES|WRITE_IMAGE_ARGS)|MEM_BASE_ADDR_ALIGN|MIN_DATA_TYPE_ALIGN_SIZE|NAME|NATIVE_VECTOR_WIDTH_(?:CHAR|DOUBLE|FLOAT|HALF|INT|LONG|SHORT)|NOT_(?:AVAILABLE|FOUND)|OPENCL_C_VERSION|PARENT_DEVICE|PARTITION_(?:AFFINITY_DOMAIN|BY_AFFINITY_DOMAIN|BY_COUNTS|BY_COUNTS_LIST_END|EQUALLY|FAILED|MAX_SUB_DEVICES|PROPERTIES|TYPE)|PIPE_MAX_(?:ACTIVE_RESERVATIONS|PACKET_SIZE)|PLATFORM|PREFERRED_(?:GLOBAL_ATOMIC_ALIGNMENT|INTEROP_USER_SYNC|LOCAL_ATOMIC_ALIGNMENT|PLATFORM_ATOMIC_ALIGNMENT|VECTOR_WIDTH_(?:CHAR|DOUBLE|FLOAT|HALF|INT|LONG|SHORT))|PRINTF_BUFFER_SIZE|PROFILE|PROFILING_TIMER_RESOLUTION|QUEUE_(?:ON_(?:DEVICE_(?:MAX_SIZE|PREFERRED_SIZE|PROPERTIES)|HOST_PROPERTIES)|PROPERTIES)|REFERENCE_COUNT|SINGLE_FP_CONFIG|SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS|SVM_(?:ATOMICS|CAPABILITIES|COARSE_GRAIN_BUFFER|FINE_GRAIN_BUFFER|FINE_GRAIN_SYSTEM)|TYPE(?:_ACCELERATOR|_ALL|_CPU|_CUSTOM|_DEFAULT|_GPU)?|VENDOR(?:_ID)?|VERSION)|DRIVER_VERSION|EVENT_(?:COMMAND_(?:EXECUTION_STATUS|QUEUE|TYPE)|CONTEXT|REFERENCE_COUNT)|EXEC_(?:KERNEL|NATIVE_KERNEL|STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST)|FILTER_(?:LINEAR|NEAREST)|FLOAT|FP_(?:CORRECTLY_ROUNDED_DIVIDE_SQRT|DENORM|FMA|INF_NAN|ROUND_TO_INF|ROUND_TO_NEAREST|ROUND_TO_ZERO|SOFT_FLOAT)|GLOBAL|HALF_FLOAT|IMAGE_(?:ARRAY_SIZE|BUFFER|DEPTH|ELEMENT_SIZE|FORMAT|FORMAT_MISMATCH|FORMAT_NOT_SUPPORTED|HEIGHT|NUM_MIP_LEVELS|NUM_SAMPLES|ROW_PITCH|SLICE_PITCH|WIDTH)|INTENSITY|INVALID_(?:ARG_INDEX|ARG_SIZE|ARG_VALUE|BINARY|BUFFER_SIZE|BUILD_OPTIONS|COMMAND_QUEUE|COMPILER_OPTIONS|CONTEXT|DEVICE|DEVICE_PARTITION_COUNT|DEVICE_QUEUE|DEVICE_TYPE|EVENT|EVENT_WAIT_LIST|GLOBAL_OFFSET|GLOBAL_WORK_SIZE|GL_OBJECT|HOST_PTR|IMAGE_DESCRIPTOR|IMAGE_FORMAT_DESCRIPTOR|IMAGE_SIZE|KERNEL|KERNEL_ARGS|KERNEL_DEFINITION|KERNEL_NAME|LINKER_OPTIONS|MEM_OBJECT|MIP_LEVEL|OPERATION|PIPE_SIZE|PLATFORM|PROGRAM|PROGRAM_EXECUTABLE|PROPERTY|QUEUE_PROPERTIES|SAMPLER|VALUE|WORK_DIMENSION|WORK_GROUP_SIZE|WORK_ITEM_SIZE)|KERNEL_(?:ARG_(?:ACCESS_(?:NONE|QUALIFIER|READ_ONLY|READ_WRITE|WRITE_ONLY)|ADDRESS_(?:CONSTANT|GLOBAL|LOCAL|PRIVATE|QUALIFIER)|INFO_NOT_AVAILABLE|NAME|TYPE_(?:CONST|NAME|NONE|PIPE|QUALIFIER|RESTRICT|VOLATILE))|ATTRIBUTES|COMPILE_NUM_SUB_GROUPS|COMPILE_WORK_GROUP_SIZE|CONTEXT|EXEC_INFO_SVM_FINE_GRAIN_SYSTEM|EXEC_INFO_SVM_PTRS|FUNCTION_NAME|GLOBAL_WORK_SIZE|LOCAL_MEM_SIZE|LOCAL_SIZE_FOR_SUB_GROUP_COUNT|MAX_NUM_SUB_GROUPS|MAX_SUB_GROUP_SIZE_FOR_NDRANGE|NUM_ARGS|PREFERRED_WORK_GROUP_SIZE_MULTIPLE|PRIVATE_MEM_SIZE|PROGRAM|REFERENCE_COUNT|SUB_GROUP_COUNT_FOR_NDRANGE|WORK_GROUP_SIZE)|LINKER_NOT_AVAILABLE|LINK_PROGRAM_FAILURE|LOCAL|LUMINANCE|MAP_(?:FAILURE|READ|WRITE|WRITE_INVALIDATE_REGION)|MEM_(?:ALLOC_HOST_PTR|ASSOCIATED_MEMOBJECT|CONTEXT|COPY_HOST_PTR|COPY_OVERLAP|FLAGS|HOST_NO_ACCESS|HOST_PTR|HOST_READ_ONLY|HOST_WRITE_ONLY|KERNEL_READ_AND_WRITE|MAP_COUNT|OBJECT_(?:ALLOCATION_FAILURE|BUFFER|IMAGE1D|IMAGE1D_ARRAY|IMAGE1D_BUFFER|IMAGE2D|IMAGE2D_ARRAY|IMAGE3D|PIPE)|OFFSET|READ_ONLY|READ_WRITE|REFERENCE_COUNT|SIZE|SVM_ATOMICS|SVM_FINE_GRAIN_BUFFER|TYPE|USES_SVM_POINTER|USE_HOST_PTR|WRITE_ONLY)|MIGRATE_MEM_OBJECT_(?:CONTENT_UNDEFINED|HOST)|MISALIGNED_SUB_BUFFER_OFFSET|NONE|NON_BLOCKING|OUT_OF_(?:HOST_MEMORY|RESOURCES)|PIPE_(?:MAX_PACKETS|PACKET_SIZE)|PLATFORM_(?:EXTENSIONS|HOST_TIMER_RESOLUTION|NAME|PROFILE|VENDOR|VERSION)|PROFILING_(?:COMMAND_(?:COMPLETE|END|QUEUED|START|SUBMIT)|INFO_NOT_AVAILABLE)|PROGRAM_(?:BINARIES|BINARY_SIZES|BINARY_TYPE(?:_COMPILED_OBJECT|_EXECUTABLE|_LIBRARY|_NONE)?|BUILD_(?:GLOBAL_VARIABLE_TOTAL_SIZE|LOG|OPTIONS|STATUS)|CONTEXT|DEVICES|IL|KERNEL_NAMES|NUM_DEVICES|NUM_KERNELS|REFERENCE_COUNT|SOURCE)|QUEUED|QUEUE_(?:CONTEXT|DEVICE|DEVICE_DEFAULT|ON_DEVICE|ON_DEVICE_DEFAULT|OUT_OF_ORDER_EXEC_MODE_ENABLE|PROFILING_ENABLE|PROPERTIES|REFERENCE_COUNT|SIZE)|R|RA|READ_(?:ONLY|WRITE)_CACHE|RG|RGB|RGBA|RGBx|RGx|RUNNING|Rx|SAMPLER_(?:ADDRESSING_MODE|CONTEXT|FILTER_MODE|LOD_MAX|LOD_MIN|MIP_FILTER_MODE|NORMALIZED_COORDS|REFERENCE_COUNT)|(?:UN)?SIGNED_INT(?:8|16|32)|SNORM_INT(?:8|16)|SUBMITTED|SUCCESS|UNORM_INT(?:8|16|24|_101010|_101010_2)|UNORM_SHORT_(?:555|565)|VERSION_(?:1_0|1_1|1_2|2_0|2_1)|sBGRA|sRGB|sRGBA|sRGBx)\b/,alias:"constant"},"function-opencl-host":{pattern:/\bcl(?:BuildProgram|CloneKernel|CompileProgram|Create(?:Buffer|CommandQueue(?:WithProperties)?|Context|ContextFromType|Image|Image2D|Image3D|Kernel|KernelsInProgram|Pipe|ProgramWith(?:Binary|BuiltInKernels|IL|Source)|Sampler|SamplerWithProperties|SubBuffer|SubDevices|UserEvent)|Enqueue(?:(?:Barrier|Marker)(?:WithWaitList)?|Copy(?:Buffer(?:Rect|ToImage)?|Image(?:ToBuffer)?)|(?:Fill|Map)(?:Buffer|Image)|MigrateMemObjects|NDRangeKernel|NativeKernel|(?:Read|Write)(?:Buffer(?:Rect)?|Image)|SVM(?:Free|Map|MemFill|Memcpy|MigrateMem|Unmap)|Task|UnmapMemObject|WaitForEvents)|Finish|Flush|Get(?:CommandQueueInfo|ContextInfo|Device(?:AndHostTimer|IDs|Info)|Event(?:Profiling)?Info|ExtensionFunctionAddress(?:ForPlatform)?|HostTimer|ImageInfo|Kernel(?:ArgInfo|Info|SubGroupInfo|WorkGroupInfo)|MemObjectInfo|PipeInfo|Platform(?:IDs|Info)|Program(?:Build)?Info|SamplerInfo|SupportedImageFormats)|LinkProgram|(?:Release|Retain)(?:CommandQueue|Context|Device|Event|Kernel|MemObject|Program|Sampler)|SVM(?:Alloc|Free)|Set(?:CommandQueueProperty|DefaultDeviceCommandQueue|EventCallback|Kernel|Kernel(?:Arg(?:SVMPointer)?|ExecInfo)|MemObjectDestructorCallback|UserEventStatus)|Unload(?:Platform)?Compiler|WaitForEvents)\b/,alias:"function"}};r.languages.insertBefore("c","keyword",a),r.languages.cpp&&(a["type-opencl-host-cpp"]={pattern:/\b(?:Buffer|BufferGL|BufferRenderGL|CommandQueue|Context|Device|DeviceCommandQueue|EnqueueArgs|Event|Image|Image1D|Image1DArray|Image1DBuffer|Image2D|Image2DArray|Image2DGL|Image3D|Image3DGL|ImageFormat|ImageGL|Kernel|KernelFunctor|LocalSpaceArg|Memory|NDRange|Pipe|Platform|Program|SVMAllocator|SVMTraitAtomic|SVMTraitCoarse|SVMTraitFine|SVMTraitReadOnly|SVMTraitReadWrite|SVMTraitWriteOnly|Sampler|UserEvent)\b/,alias:"keyword"},r.languages.insertBefore("cpp","keyword",a))}(n)}return Lw}var Mw,xL;function Hve(){if(xL)return Mw;xL=1,Mw=e,e.displayName="openqasm",e.aliases=["qasm"];function e(t){t.languages.openqasm={comment:/\/\*[\s\S]*?\*\/|\/\/.*/,string:{pattern:/"[^"\r\n\t]*"|'[^'\r\n\t]*'/,greedy:!0},keyword:/\b(?:CX|OPENQASM|U|barrier|boxas|boxto|break|const|continue|ctrl|def|defcal|defcalgrammar|delay|else|end|for|gate|gphase|if|in|include|inv|kernel|lengthof|let|measure|pow|reset|return|rotary|stretchinf|while)\b|#pragma\b/,"class-name":/\b(?:angle|bit|bool|creg|fixed|float|int|length|qreg|qubit|stretch|uint)\b/,function:/\b(?:cos|exp|ln|popcount|rotl|rotr|sin|sqrt|tan)\b(?=\s*\()/,constant:/\b(?:euler|pi|tau)\b|π|𝜏|ℇ/,number:{pattern:/(^|[^.\w$])(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?(?:dt|ns|us|µs|ms|s)?/i,lookbehind:!0},operator:/->|>>=?|<<=?|&&|\|\||\+\+|--|[!=<>&|~^+\-*/%]=?|@/,punctuation:/[(){}\[\];,:.]/},t.languages.qasm=t.languages.openqasm}return Mw}var Pw,kL;function Vve(){if(kL)return Pw;kL=1,Pw=e,e.displayName="oz",e.aliases=[];function e(t){t.languages.oz={comment:{pattern:/\/\*[\s\S]*?\*\/|%.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\[\s\S])*"/,greedy:!0},atom:{pattern:/'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,alias:"builtin"},keyword:/\$|\[\]|\b(?:_|at|attr|case|catch|choice|class|cond|declare|define|dis|else(?:case|if)?|end|export|fail|false|feat|finally|from|fun|functor|if|import|in|local|lock|meth|nil|not|of|or|prepare|proc|prop|raise|require|self|skip|then|thread|true|try|unit)\b/,function:[/\b[a-z][A-Za-z\d]*(?=\()/,{pattern:/(\{)[A-Z][A-Za-z\d]*\b/,lookbehind:!0}],number:/\b(?:0[bx][\da-f]+|\d+(?:\.\d*)?(?:e~?\d+)?)\b|&(?:[^\\]|\\(?:\d{3}|.))/i,variable:/`(?:[^`\\]|\\.)+`/,"attr-name":/\b\w+(?=[ \t]*:(?![:=]))/,operator:/:(?:=|::?)|<[-:=]?|=(?:=|=?:?|\\=:?|!!?|[|#+\-*\/,~^@]|\b(?:andthen|div|mod|orelse)\b/,punctuation:/[\[\](){}.:;?]/}}return Pw}var $w,CL;function qve(){if(CL)return $w;CL=1,$w=e,e.displayName="parigp",e.aliases=[];function e(t){t.languages.parigp={comment:/\/\*[\s\S]*?\*\/|\\\\.*/,string:{pattern:/"(?:[^"\\\r\n]|\\.)*"/,greedy:!0},keyword:function(){var n=["breakpoint","break","dbg_down","dbg_err","dbg_up","dbg_x","forcomposite","fordiv","forell","forpart","forprime","forstep","forsubgroup","forvec","for","iferr","if","local","my","next","return","until","while"];return n=n.map(function(r){return r.split("").join(" *")}).join("|"),RegExp("\\b(?:"+n+")\\b")}(),function:/\b\w(?:[\w ]*\w)?(?= *\()/,number:{pattern:/((?:\. *\. *)?)(?:\b\d(?: *\d)*(?: *(?!\. *\.)\.(?: *\d)*)?|\. *\d(?: *\d)*)(?: *e *(?:[+-] *)?\d(?: *\d)*)?/i,lookbehind:!0},operator:/\. *\.|[*\/!](?: *=)?|%(?: *=|(?: *#)?(?: *')*)?|\+(?: *[+=])?|-(?: *[-=>])?|<(?: *>|(?: *<)?(?: *=)?)?|>(?: *>)?(?: *=)?|=(?: *=){0,2}|\\(?: *\/)?(?: *=)?|&(?: *&)?|\| *\||['#~^]/,punctuation:/[\[\]{}().,:;|]/}}return $w}var Fw,_L;function Gve(){if(_L)return Fw;_L=1,Fw=e,e.displayName="parser",e.aliases=[];function e(t){(function(n){var r=n.languages.parser=n.languages.extend("markup",{keyword:{pattern:/(^|[^^])(?:\^(?:case|eval|for|if|switch|throw)\b|@(?:BASE|CLASS|GET(?:_DEFAULT)?|OPTIONS|SET_DEFAULT|USE)\b)/,lookbehind:!0},variable:{pattern:/(^|[^^])\B\$(?:\w+|(?=[.{]))(?:(?:\.|::?)\w+)*(?:\.|::?)?/,lookbehind:!0,inside:{punctuation:/\.|:+/}},function:{pattern:/(^|[^^])\B[@^]\w+(?:(?:\.|::?)\w+)*(?:\.|::?)?/,lookbehind:!0,inside:{keyword:{pattern:/(^@)(?:GET_|SET_)/,lookbehind:!0},punctuation:/\.|:+/}},escape:{pattern:/\^(?:[$^;@()\[\]{}"':]|#[a-f\d]*)/i,alias:"builtin"},punctuation:/[\[\](){};]/});r=n.languages.insertBefore("parser","keyword",{"parser-comment":{pattern:/(\s)#.*/,lookbehind:!0,alias:"comment"},expression:{pattern:/(^|[^^])\((?:[^()]|\((?:[^()]|\((?:[^()])*\))*\))*\)/,greedy:!0,lookbehind:!0,inside:{string:{pattern:/(^|[^^])(["'])(?:(?!\2)[^^]|\^[\s\S])*\2/,lookbehind:!0},keyword:r.keyword,variable:r.variable,function:r.function,boolean:/\b(?:false|true)\b/,number:/\b(?:0x[a-f\d]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?)\b/i,escape:r.escape,operator:/[~+*\/\\%]|!(?:\|\|?|=)?|&&?|\|\|?|==|<[<=]?|>[>=]?|-[fd]?|\b(?:def|eq|ge|gt|in|is|le|lt|ne)\b/,punctuation:r.punctuation}}}),n.languages.insertBefore("inside","punctuation",{expression:r.expression,keyword:r.keyword,variable:r.variable,function:r.function,escape:r.escape,"parser-punctuation":{pattern:r.punctuation,alias:"punctuation"}},r.tag.inside["attr-value"])})(t)}return Fw}var jw,AL;function Wve(){if(AL)return jw;AL=1,jw=e,e.displayName="pascal",e.aliases=["objectpascal"];function e(t){t.languages.pascal={directive:{pattern:/\{\$[\s\S]*?\}/,greedy:!0,alias:["marco","property"]},comment:{pattern:/\(\*[\s\S]*?\*\)|\{[\s\S]*?\}|\/\/.*/,greedy:!0},string:{pattern:/(?:'(?:''|[^'\r\n])*'(?!')|#[&$%]?[a-f\d]+)+|\^[a-z]/i,greedy:!0},asm:{pattern:/(\basm\b)[\s\S]+?(?=\bend\s*[;[])/i,lookbehind:!0,greedy:!0,inside:null},keyword:[{pattern:/(^|[^&])\b(?:absolute|array|asm|begin|case|const|constructor|destructor|do|downto|else|end|file|for|function|goto|if|implementation|inherited|inline|interface|label|nil|object|of|operator|packed|procedure|program|record|reintroduce|repeat|self|set|string|then|to|type|unit|until|uses|var|while|with)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:dispose|exit|false|new|true)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:class|dispinterface|except|exports|finalization|finally|initialization|inline|library|on|out|packed|property|raise|resourcestring|threadvar|try)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:absolute|abstract|alias|assembler|bitpacked|break|cdecl|continue|cppdecl|cvar|default|deprecated|dynamic|enumerator|experimental|export|external|far|far16|forward|generic|helper|implements|index|interrupt|iochecks|local|message|name|near|nodefault|noreturn|nostackframe|oldfpccall|otherwise|overload|override|pascal|platform|private|protected|public|published|read|register|reintroduce|result|safecall|saveregisters|softfloat|specialize|static|stdcall|stored|strict|unaligned|unimplemented|varargs|virtual|write)\b/i,lookbehind:!0}],number:[/(?:[&%]\d+|\$[a-f\d]+)/i,/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?/i],operator:[/\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=]/,{pattern:/(^|[^&])\b(?:and|as|div|exclude|in|include|is|mod|not|or|shl|shr|xor)\b/,lookbehind:!0}],punctuation:/\(\.|\.\)|[()\[\]:;,.]/},t.languages.pascal.asm.inside=t.languages.extend("pascal",{asm:void 0,keyword:void 0,operator:void 0}),t.languages.objectpascal=t.languages.pascal}return jw}var zw,TL;function Kve(){if(TL)return zw;TL=1,zw=e,e.displayName="pascaligo",e.aliases=[];function e(t){(function(n){var r=/\((?:[^()]|\((?:[^()]|\([^()]*\))*\))*\)/.source,a=/(?:\b\w+(?:)?|)/.source.replace(//g,function(){return r}),o=n.languages.pascaligo={comment:/\(\*[\s\S]+?\*\)|\/\/.*/,string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1|\^[a-z]/i,greedy:!0},"class-name":[{pattern:RegExp(/(\btype\s+\w+\s+is\s+)/.source.replace(//g,function(){return a}),"i"),lookbehind:!0,inside:null},{pattern:RegExp(/(?=\s+is\b)/.source.replace(//g,function(){return a}),"i"),inside:null},{pattern:RegExp(/(:\s*)/.source.replace(//g,function(){return a})),lookbehind:!0,inside:null}],keyword:{pattern:/(^|[^&])\b(?:begin|block|case|const|else|end|fail|for|from|function|if|is|nil|of|remove|return|skip|then|type|var|while|with)\b/i,lookbehind:!0},boolean:{pattern:/(^|[^&])\b(?:False|True)\b/i,lookbehind:!0},builtin:{pattern:/(^|[^&])\b(?:bool|int|list|map|nat|record|string|unit)\b/i,lookbehind:!0},function:/\b\w+(?=\s*\()/,number:[/%[01]+|&[0-7]+|\$[a-f\d]+/i,/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?(?:mtz|n)?/i],operator:/->|=\/=|\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=|]|\b(?:and|mod|or)\b/,punctuation:/\(\.|\.\)|[()\[\]:;,.{}]/},i=["comment","keyword","builtin","operator","punctuation"].reduce(function(s,l){return s[l]=o[l],s},{});o["class-name"].forEach(function(s){s.inside=i})})(t)}return zw}var Uw,RL;function Yve(){if(RL)return Uw;RL=1,Uw=e,e.displayName="pcaxis",e.aliases=["px"];function e(t){t.languages.pcaxis={string:/"[^"]*"/,keyword:{pattern:/((?:^|;)\s*)[-A-Z\d]+(?:\s*\[[-\w]+\])?(?:\s*\("[^"]*"(?:,\s*"[^"]*")*\))?(?=\s*=)/,lookbehind:!0,greedy:!0,inside:{keyword:/^[-A-Z\d]+/,language:{pattern:/^(\s*)\[[-\w]+\]/,lookbehind:!0,inside:{punctuation:/^\[|\]$/,property:/[-\w]+/}},"sub-key":{pattern:/^(\s*)\S[\s\S]*/,lookbehind:!0,inside:{parameter:{pattern:/"[^"]*"/,alias:"property"},punctuation:/^\(|\)$|,/}}}},operator:/=/,tlist:{pattern:/TLIST\s*\(\s*\w+(?:(?:\s*,\s*"[^"]*")+|\s*,\s*"[^"]*"-"[^"]*")?\s*\)/,greedy:!0,inside:{function:/^TLIST/,property:{pattern:/^(\s*\(\s*)\w+/,lookbehind:!0},string:/"[^"]*"/,punctuation:/[(),]/,operator:/-/}},punctuation:/[;,]/,number:{pattern:/(^|\s)\d+(?:\.\d+)?(?!\S)/,lookbehind:!0},boolean:/NO|YES/},t.languages.px=t.languages.pcaxis}return Uw}var Bw,NL;function Zve(){if(NL)return Bw;NL=1,Bw=e,e.displayName="peoplecode",e.aliases=["pcode"];function e(t){t.languages.peoplecode={comment:RegExp([/\/\*[\s\S]*?\*\//.source,/\bREM[^;]*;/.source,/<\*(?:[^<*]|\*(?!>)|<(?!\*)|<\*(?:(?!\*>)[\s\S])*\*>)*\*>/.source,/\/\+[\s\S]*?\+\//.source].join("|")),string:{pattern:/'(?:''|[^'\r\n])*'(?!')|"(?:""|[^"\r\n])*"(?!")/,greedy:!0},variable:/%\w+/,"function-definition":{pattern:/((?:^|[^\w-])(?:function|method)\s+)\w+/i,lookbehind:!0,alias:"function"},"class-name":{pattern:/((?:^|[^-\w])(?:as|catch|class|component|create|extends|global|implements|instance|local|of|property|returns)\s+)\w+(?::\w+)*/i,lookbehind:!0,inside:{punctuation:/:/}},keyword:/\b(?:abstract|alias|as|catch|class|component|constant|create|declare|else|end-(?:class|evaluate|for|function|get|if|method|set|try|while)|evaluate|extends|for|function|get|global|if|implements|import|instance|library|local|method|null|of|out|peopleCode|private|program|property|protected|readonly|ref|repeat|returns?|set|step|then|throw|to|try|until|value|when(?:-other)?|while)\b/i,"operator-keyword":{pattern:/\b(?:and|not|or)\b/i,alias:"operator"},function:/[_a-z]\w*(?=\s*\()/i,boolean:/\b(?:false|true)\b/i,number:/\b\d+(?:\.\d+)?\b/,operator:/<>|[<>]=?|!=|\*\*|[-+*/|=@]/,punctuation:/[:.;,()[\]]/},t.languages.pcode=t.languages.peoplecode}return Bw}var Hw,IL;function Xve(){if(IL)return Hw;IL=1,Hw=e,e.displayName="perl",e.aliases=[];function e(t){(function(n){var r=/(?:\((?:[^()\\]|\\[\s\S])*\)|\{(?:[^{}\\]|\\[\s\S])*\}|\[(?:[^[\]\\]|\\[\s\S])*\]|<(?:[^<>\\]|\\[\s\S])*>)/.source;n.languages.perl={comment:[{pattern:/(^\s*)=\w[\s\S]*?=cut.*/m,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0,greedy:!0}],string:[{pattern:RegExp(/\b(?:q|qq|qw|qx)(?![a-zA-Z0-9])\s*/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/([a-zA-Z0-9])(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,r].join("|")+")"),greedy:!0},{pattern:/("|`)(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0},{pattern:/'(?:[^'\\\r\n]|\\.)*'/,greedy:!0}],regex:[{pattern:RegExp(/\b(?:m|qr)(?![a-zA-Z0-9])\s*/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/([a-zA-Z0-9])(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,r].join("|")+")"+/[msixpodualngc]*/.source),greedy:!0},{pattern:RegExp(/(^|[^-])\b(?:s|tr|y)(?![a-zA-Z0-9])\s*/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\2)[^\\]|\\[\s\S])*\2(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,/([a-zA-Z0-9])(?:(?!\3)[^\\]|\\[\s\S])*\3(?:(?!\3)[^\\]|\\[\s\S])*\3/.source,r+/\s*/.source+r].join("|")+")"+/[msixpodualngcer]*/.source),lookbehind:!0,greedy:!0},{pattern:/\/(?:[^\/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~<>!?^]|(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|x|xor)\b))/,greedy:!0}],variable:[/[&*$@%]\{\^[A-Z]+\}/,/[&*$@%]\^[A-Z_]/,/[&*$@%]#?(?=\{)/,/[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+(?![\w$]))+(?:::)*/,/[&*$@%]\d+/,/(?!%=)[$@%][!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/],filehandle:{pattern:/<(?![<=])\S*?>|\b_\b/,alias:"symbol"},"v-string":{pattern:/v\d+(?:\.\d+)*|\d+(?:\.\d+){2,}/,alias:"string"},function:{pattern:/(\bsub[ \t]+)\w+/,lookbehind:!0},keyword:/\b(?:any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|return|say|state|sub|switch|undef|unless|until|use|when|while)\b/,number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)\b/,operator:/-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|\+[+=]?|-[-=>]?|\*\*?=?|\/\/?=?|=[=~>]?|~[~=]?|\|\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\.(?:=|\.\.?)?|[\\?]|\bx(?:=|\b)|\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\b/,punctuation:/[{}[\];(),:]/}})(t)}return Hw}var Vw,OL;function Qve(){if(OL)return Vw;OL=1;var e=Nh();Vw=t,t.displayName="phpExtras",t.aliases=[];function t(n){n.register(e),n.languages.insertBefore("php","variable",{this:{pattern:/\$this\b/,alias:"keyword"},global:/\$(?:GLOBALS|HTTP_RAW_POST_DATA|_(?:COOKIE|ENV|FILES|GET|POST|REQUEST|SERVER|SESSION)|argc|argv|http_response_header|php_errormsg)\b/,scope:{pattern:/\b[\w\\]+::/,inside:{keyword:/\b(?:parent|self|static)\b/,punctuation:/::|\\/}}})}return Vw}var qw,DL;function Jve(){if(DL)return qw;DL=1;var e=Nh(),t=Rh();qw=n,n.displayName="phpdoc",n.aliases=[];function n(r){r.register(e),r.register(t),function(a){var o=/(?:\b[a-zA-Z]\w*|[|\\[\]])+/.source;a.languages.phpdoc=a.languages.extend("javadoclike",{parameter:{pattern:RegExp("(@(?:global|param|property(?:-read|-write)?|var)\\s+(?:"+o+"\\s+)?)\\$\\w+"),lookbehind:!0}}),a.languages.insertBefore("phpdoc","keyword",{"class-name":[{pattern:RegExp("(@(?:global|package|param|property(?:-read|-write)?|return|subpackage|throws|var)\\s+)"+o),lookbehind:!0,inside:{keyword:/\b(?:array|bool|boolean|callback|double|false|float|int|integer|mixed|null|object|resource|self|string|true|void)\b/,punctuation:/[|\\[\]()]/}}]}),a.languages.javadoclike.addSupport("php",a.languages.phpdoc)}(r)}return qw}var Gw,LL;function eSe(){if(LL)return Gw;LL=1;var e=TA();Gw=t,t.displayName="plsql",t.aliases=[];function t(n){n.register(e),n.languages.plsql=n.languages.extend("sql",{comment:{pattern:/\/\*[\s\S]*?\*\/|--.*/,greedy:!0},keyword:/\b(?:A|ACCESSIBLE|ADD|AGENT|AGGREGATE|ALL|ALTER|AND|ANY|ARRAY|AS|ASC|AT|ATTRIBUTE|AUTHID|AVG|BEGIN|BETWEEN|BFILE_BASE|BINARY|BLOB_BASE|BLOCK|BODY|BOTH|BOUND|BULK|BY|BYTE|C|CALL|CALLING|CASCADE|CASE|CHAR|CHARACTER|CHARSET|CHARSETFORM|CHARSETID|CHAR_BASE|CHECK|CLOB_BASE|CLONE|CLOSE|CLUSTER|CLUSTERS|COLAUTH|COLLECT|COLUMNS|COMMENT|COMMIT|COMMITTED|COMPILED|COMPRESS|CONNECT|CONSTANT|CONSTRUCTOR|CONTEXT|CONTINUE|CONVERT|COUNT|CRASH|CREATE|CREDENTIAL|CURRENT|CURSOR|CUSTOMDATUM|DANGLING|DATA|DATE|DATE_BASE|DAY|DECLARE|DEFAULT|DEFINE|DELETE|DESC|DETERMINISTIC|DIRECTORY|DISTINCT|DOUBLE|DROP|DURATION|ELEMENT|ELSE|ELSIF|EMPTY|END|ESCAPE|EXCEPT|EXCEPTION|EXCEPTIONS|EXCLUSIVE|EXECUTE|EXISTS|EXIT|EXTERNAL|FETCH|FINAL|FIRST|FIXED|FLOAT|FOR|FORALL|FORCE|FROM|FUNCTION|GENERAL|GOTO|GRANT|GROUP|HASH|HAVING|HEAP|HIDDEN|HOUR|IDENTIFIED|IF|IMMEDIATE|IMMUTABLE|IN|INCLUDING|INDEX|INDEXES|INDICATOR|INDICES|INFINITE|INSERT|INSTANTIABLE|INT|INTERFACE|INTERSECT|INTERVAL|INTO|INVALIDATE|IS|ISOLATION|JAVA|LANGUAGE|LARGE|LEADING|LENGTH|LEVEL|LIBRARY|LIKE|LIKE2|LIKE4|LIKEC|LIMIT|LIMITED|LOCAL|LOCK|LONG|LOOP|MAP|MAX|MAXLEN|MEMBER|MERGE|MIN|MINUS|MINUTE|MOD|MODE|MODIFY|MONTH|MULTISET|MUTABLE|NAME|NAN|NATIONAL|NATIVE|NCHAR|NEW|NOCOMPRESS|NOCOPY|NOT|NOWAIT|NULL|NUMBER_BASE|OBJECT|OCICOLL|OCIDATE|OCIDATETIME|OCIDURATION|OCIINTERVAL|OCILOBLOCATOR|OCINUMBER|OCIRAW|OCIREF|OCIREFCURSOR|OCIROWID|OCISTRING|OCITYPE|OF|OLD|ON|ONLY|OPAQUE|OPEN|OPERATOR|OPTION|OR|ORACLE|ORADATA|ORDER|ORGANIZATION|ORLANY|ORLVARY|OTHERS|OUT|OVERLAPS|OVERRIDING|PACKAGE|PARALLEL_ENABLE|PARAMETER|PARAMETERS|PARENT|PARTITION|PASCAL|PERSISTABLE|PIPE|PIPELINED|PLUGGABLE|POLYMORPHIC|PRAGMA|PRECISION|PRIOR|PRIVATE|PROCEDURE|PUBLIC|RAISE|RANGE|RAW|READ|RECORD|REF|REFERENCE|RELIES_ON|REM|REMAINDER|RENAME|RESOURCE|RESULT|RESULT_CACHE|RETURN|RETURNING|REVERSE|REVOKE|ROLLBACK|ROW|SAMPLE|SAVE|SAVEPOINT|SB1|SB2|SB4|SECOND|SEGMENT|SELECT|SELF|SEPARATE|SEQUENCE|SERIALIZABLE|SET|SHARE|SHORT|SIZE|SIZE_T|SOME|SPARSE|SQL|SQLCODE|SQLDATA|SQLNAME|SQLSTATE|STANDARD|START|STATIC|STDDEV|STORED|STRING|STRUCT|STYLE|SUBMULTISET|SUBPARTITION|SUBSTITUTABLE|SUBTYPE|SUM|SYNONYM|TABAUTH|TABLE|TDO|THE|THEN|TIME|TIMESTAMP|TIMEZONE_ABBR|TIMEZONE_HOUR|TIMEZONE_MINUTE|TIMEZONE_REGION|TO|TRAILING|TRANSACTION|TRANSACTIONAL|TRUSTED|TYPE|UB1|UB2|UB4|UNDER|UNION|UNIQUE|UNPLUG|UNSIGNED|UNTRUSTED|UPDATE|USE|USING|VALIST|VALUE|VALUES|VARIABLE|VARIANCE|VARRAY|VARYING|VIEW|VIEWS|VOID|WHEN|WHERE|WHILE|WITH|WORK|WRAPPED|WRITE|YEAR|ZONE)\b/i,operator:/:=?|=>|[<>^~!]=|\.\.|\|\||\*\*|[-+*/%<>=@]/}),n.languages.insertBefore("plsql","operator",{label:{pattern:/<<\s*\w+\s*>>/,alias:"symbol"}})}return Gw}var Ww,ML;function tSe(){if(ML)return Ww;ML=1,Ww=e,e.displayName="powerquery",e.aliases=[];function e(t){t.languages.powerquery={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},"quoted-identifier":{pattern:/#"(?:[^"\r\n]|"")*"(?!")/,greedy:!0},string:{pattern:/(?:#!)?"(?:[^"\r\n]|"")*"(?!")/,greedy:!0},constant:[/\bDay\.(?:Friday|Monday|Saturday|Sunday|Thursday|Tuesday|Wednesday)\b/,/\bTraceLevel\.(?:Critical|Error|Information|Verbose|Warning)\b/,/\bOccurrence\.(?:All|First|Last)\b/,/\bOrder\.(?:Ascending|Descending)\b/,/\bRoundingMode\.(?:AwayFromZero|Down|ToEven|TowardZero|Up)\b/,/\bMissingField\.(?:Error|Ignore|UseNull)\b/,/\bQuoteStyle\.(?:Csv|None)\b/,/\bJoinKind\.(?:FullOuter|Inner|LeftAnti|LeftOuter|RightAnti|RightOuter)\b/,/\bGroupKind\.(?:Global|Local)\b/,/\bExtraValues\.(?:Error|Ignore|List)\b/,/\bJoinAlgorithm\.(?:Dynamic|LeftHash|LeftIndex|PairwiseHash|RightHash|RightIndex|SortMerge)\b/,/\bJoinSide\.(?:Left|Right)\b/,/\bPrecision\.(?:Decimal|Double)\b/,/\bRelativePosition\.From(?:End|Start)\b/,/\bTextEncoding\.(?:Ascii|BigEndianUnicode|Unicode|Utf16|Utf8|Windows)\b/,/\b(?:Any|Binary|Date|DateTime|DateTimeZone|Duration|Function|Int16|Int32|Int64|Int8|List|Logical|None|Number|Record|Table|Text|Time)\.Type\b/,/\bnull\b/],boolean:/\b(?:false|true)\b/,keyword:/\b(?:and|as|each|else|error|if|in|is|let|meta|not|nullable|optional|or|otherwise|section|shared|then|try|type)\b|#(?:binary|date|datetime|datetimezone|duration|infinity|nan|sections|shared|table|time)\b/,function:{pattern:/(^|[^#\w.])[a-z_][\w.]*(?=\s*\()/i,lookbehind:!0},"data-type":{pattern:/\b(?:any|anynonnull|binary|date|datetime|datetimezone|duration|function|list|logical|none|number|record|table|text|time)\b/,alias:"class-name"},number:{pattern:/\b0x[\da-f]+\b|(?:[+-]?(?:\b\d+\.)?\b\d+|[+-]\.\d+|(^|[^.])\B\.\d+)(?:e[+-]?\d+)?\b/i,lookbehind:!0},operator:/[-+*\/&?@^]|<(?:=>?|>)?|>=?|=>?|\.\.\.?/,punctuation:/[,;\[\](){}]/},t.languages.pq=t.languages.powerquery,t.languages.mscript=t.languages.powerquery}return Ww}var Kw,PL;function nSe(){if(PL)return Kw;PL=1,Kw=e,e.displayName="powershell",e.aliases=[];function e(t){(function(n){var r=n.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};r.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:r},boolean:r.boolean,variable:r.variable}})(t)}return Kw}var Yw,$L;function rSe(){if($L)return Yw;$L=1,Yw=e,e.displayName="processing",e.aliases=[];function e(t){t.languages.processing=t.languages.extend("clike",{keyword:/\b(?:break|case|catch|class|continue|default|else|extends|final|for|if|implements|import|new|null|private|public|return|static|super|switch|this|try|void|while)\b/,function:/\b\w+(?=\s*\()/,operator:/<[<=]?|>[>=]?|&&?|\|\|?|[%?]|[!=+\-*\/]=?/}),t.languages.insertBefore("processing","number",{constant:/\b(?!XML\b)[A-Z][A-Z\d_]+\b/,type:{pattern:/\b(?:boolean|byte|char|color|double|float|int|[A-Z]\w*)\b/,alias:"class-name"}})}return Yw}var Zw,FL;function aSe(){if(FL)return Zw;FL=1,Zw=e,e.displayName="prolog",e.aliases=[];function e(t){t.languages.prolog={comment:{pattern:/\/\*[\s\S]*?\*\/|%.*/,greedy:!0},string:{pattern:/(["'])(?:\1\1|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1(?!\1)/,greedy:!0},builtin:/\b(?:fx|fy|xf[xy]?|yfx?)\b/,function:/\b[a-z]\w*(?:(?=\()|\/\d+)/,number:/\b\d+(?:\.\d*)?/,operator:/[:\\=><\-?*@\/;+^|!$.]+|\b(?:is|mod|not|xor)\b/,punctuation:/[(){}\[\],]/}}return Zw}var Xw,jL;function oSe(){if(jL)return Xw;jL=1,Xw=e,e.displayName="promql",e.aliases=[];function e(t){(function(n){var r=["sum","min","max","avg","group","stddev","stdvar","count","count_values","bottomk","topk","quantile"],a=["on","ignoring","group_right","group_left","by","without"],o=["offset"],i=r.concat(a,o);n.languages.promql={comment:{pattern:/(^[ \t]*)#.*/m,lookbehind:!0},"vector-match":{pattern:new RegExp("((?:"+a.join("|")+")\\s*)\\([^)]*\\)"),lookbehind:!0,inside:{"label-key":{pattern:/\b[^,]+\b/,alias:"attr-name"},punctuation:/[(),]/}},"context-labels":{pattern:/\{[^{}]*\}/,inside:{"label-key":{pattern:/\b[a-z_]\w*(?=\s*(?:=|![=~]))/,alias:"attr-name"},"label-value":{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0,alias:"attr-value"},punctuation:/\{|\}|=~?|![=~]|,/}},"context-range":[{pattern:/\[[\w\s:]+\]/,inside:{punctuation:/\[|\]|:/,"range-duration":{pattern:/\b(?:\d+(?:[smhdwy]|ms))+\b/i,alias:"number"}}},{pattern:/(\boffset\s+)\w+/,lookbehind:!0,inside:{"range-duration":{pattern:/\b(?:\d+(?:[smhdwy]|ms))+\b/i,alias:"number"}}}],keyword:new RegExp("\\b(?:"+i.join("|")+")\\b","i"),function:/\b[a-z_]\w*(?=\s*\()/i,number:/[-+]?(?:(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[-+]?\d+)?\b|\b(?:0x[0-9a-f]+|nan|inf)\b)/i,operator:/[\^*/%+-]|==|!=|<=|<|>=|>|\b(?:and|or|unless)\b/i,punctuation:/[{};()`,.[\]]/}})(t)}return Xw}var Qw,zL;function iSe(){if(zL)return Qw;zL=1,Qw=e,e.displayName="properties",e.aliases=[];function e(t){t.languages.properties={comment:/^[ \t]*[#!].*$/m,"attr-value":{pattern:/(^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?: *[=:] *(?! )| ))(?:\\(?:\r\n|[\s\S])|[^\\\r\n])+/m,lookbehind:!0},"attr-name":/^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?= *[=:]| )/m,punctuation:/[=:]/}}return Qw}var Jw,UL;function sSe(){if(UL)return Jw;UL=1,Jw=e,e.displayName="protobuf",e.aliases=[];function e(t){(function(n){var r=/\b(?:bool|bytes|double|s?fixed(?:32|64)|float|[su]?int(?:32|64)|string)\b/;n.languages.protobuf=n.languages.extend("clike",{"class-name":[{pattern:/(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,lookbehind:!0},{pattern:/(\b(?:rpc\s+\w+|returns)\s*\(\s*(?:stream\s+)?)\.?[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s*\))/,lookbehind:!0}],keyword:/\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|returns|rpc(?=\s+\w)|service|stream|syntax|to)\b(?!\s*=\s*\d)/,function:/\b[a-z_]\w*(?=\s*\()/i}),n.languages.insertBefore("protobuf","operator",{map:{pattern:/\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/[<>.,]/,builtin:r}},builtin:r,"positional-class-name":{pattern:/(?:\b|\B\.)[a-z_]\w*(?:\.[a-z_]\w*)*(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/\./}},annotation:{pattern:/(\[\s*)[a-z_]\w*(?=\s*=)/i,lookbehind:!0}})})(t)}return Jw}var e0,BL;function lSe(){if(BL)return e0;BL=1,e0=e,e.displayName="psl",e.aliases=[];function e(t){t.languages.psl={comment:{pattern:/#.*/,greedy:!0},string:{pattern:/"(?:\\.|[^\\"])*"/,greedy:!0,inside:{symbol:/\\[ntrbA-Z"\\]/}},"heredoc-string":{pattern:/<<<([a-zA-Z_]\w*)[\r\n](?:.*[\r\n])*?\1\b/,alias:"string",greedy:!0},keyword:/\b(?:__multi|__single|case|default|do|else|elsif|exit|export|for|foreach|function|if|last|line|local|next|requires|return|switch|until|while|word)\b/,constant:/\b(?:ALARM|CHART_ADD_GRAPH|CHART_DELETE_GRAPH|CHART_DESTROY|CHART_LOAD|CHART_PRINT|EOF|OFFLINE|OK|PSL_PROF_LOG|R_CHECK_HORIZ|R_CHECK_VERT|R_CLICKER|R_COLUMN|R_FRAME|R_ICON|R_LABEL|R_LABEL_CENTER|R_LIST_MULTIPLE|R_LIST_MULTIPLE_ND|R_LIST_SINGLE|R_LIST_SINGLE_ND|R_MENU|R_POPUP|R_POPUP_SCROLLED|R_RADIO_HORIZ|R_RADIO_VERT|R_ROW|R_SCALE_HORIZ|R_SCALE_VERT|R_SEP_HORIZ|R_SEP_VERT|R_SPINNER|R_TEXT_FIELD|R_TEXT_FIELD_LABEL|R_TOGGLE|TRIM_LEADING|TRIM_LEADING_AND_TRAILING|TRIM_REDUNDANT|TRIM_TRAILING|VOID|WARN)\b/,boolean:/\b(?:FALSE|False|NO|No|TRUE|True|YES|Yes|false|no|true|yes)\b/,variable:/\b(?:PslDebug|errno|exit_status)\b/,builtin:{pattern:/\b(?:PslExecute|PslFunctionCall|PslFunctionExists|PslSetOptions|_snmp_debug|acos|add_diary|annotate|annotate_get|ascii_to_ebcdic|asctime|asin|atan|atexit|batch_set|blackout|cat|ceil|chan_exists|change_state|close|code_cvt|cond_signal|cond_wait|console_type|convert_base|convert_date|convert_locale_date|cos|cosh|create|date|dcget_text|destroy|destroy_lock|dget_text|difference|dump_hist|ebcdic_to_ascii|encrypt|event_archive|event_catalog_get|event_check|event_query|event_range_manage|event_range_query|event_report|event_schedule|event_trigger|event_trigger2|execute|exists|exp|fabs|file|floor|fmod|fopen|fseek|ftell|full_discovery|get|get_chan_info|get_ranges|get_text|get_vars|getenv|gethostinfo|getpid|getpname|grep|history|history_get_retention|in_transition|index|int|internal|intersection|is_var|isnumber|join|kill|length|lines|lock|lock_info|log|log10|loge|matchline|msg_check|msg_get_format|msg_get_severity|msg_printf|msg_sprintf|ntharg|nthargf|nthline|nthlinef|num_bytes|num_consoles|pconfig|popen|poplines|pow|print|printf|proc_exists|process|random|read|readln|refresh_parameters|remote_check|remote_close|remote_event_query|remote_event_trigger|remote_file_send|remote_open|remove|replace|rindex|sec_check_priv|sec_store_get|sec_store_set|set|set_alarm_ranges|set_locale|share|sin|sinh|sleep|snmp_agent_config|snmp_agent_start|snmp_agent_stop|snmp_close|snmp_config|snmp_get|snmp_get_next|snmp_h_get|snmp_h_get_next|snmp_h_set|snmp_open|snmp_set|snmp_trap_ignore|snmp_trap_listen|snmp_trap_raise_std_trap|snmp_trap_receive|snmp_trap_register_im|snmp_trap_send|snmp_walk|sopen|sort|splitline|sprintf|sqrt|srandom|str_repeat|strcasecmp|subset|substr|system|tail|tan|tanh|text_domain|time|tmpnam|tolower|toupper|trace_psl_process|trim|union|unique|unlock|unset|va_arg|va_start|write)\b/,alias:"builtin-function"},"foreach-variable":{pattern:/(\bforeach\s+(?:(?:\w+\b|"(?:\\.|[^\\"])*")\s+){0,2})[_a-zA-Z]\w*(?=\s*\()/,lookbehind:!0,greedy:!0},function:/\b[_a-z]\w*\b(?=\s*\()/i,number:/\b(?:0x[0-9a-f]+|\d+(?:\.\d+)?)\b/i,operator:/--|\+\+|&&=?|\|\|=?|<<=?|>>=?|[=!]~|[-+*/%&|^!=<>]=?|\.|[:?]/,punctuation:/[(){}\[\];,]/}}return e0}var t0,HL;function cSe(){if(HL)return t0;HL=1,t0=e,e.displayName="pug",e.aliases=[];function e(t){(function(n){n.languages.pug={comment:{pattern:/(^([\t ]*))\/\/.*(?:(?:\r?\n|\r)\2[\t ].+)*/m,lookbehind:!0},"multiline-script":{pattern:/(^([\t ]*)script\b.*\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0,inside:n.languages.javascript},filter:{pattern:/(^([\t ]*)):.+(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"},text:/\S[\s\S]*/}},"multiline-plain-text":{pattern:/(^([\t ]*)[\w\-#.]+\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0},markup:{pattern:/(^[\t ]*)<.+/m,lookbehind:!0,inside:n.languages.markup},doctype:{pattern:/((?:^|\n)[\t ]*)doctype(?: .+)?/,lookbehind:!0},"flow-control":{pattern:/(^[\t ]*)(?:case|default|each|else|if|unless|when|while)\b(?: .+)?/m,lookbehind:!0,inside:{each:{pattern:/^each .+? in\b/,inside:{keyword:/\b(?:each|in)\b/,punctuation:/,/}},branch:{pattern:/^(?:case|default|else|if|unless|when|while)\b/,alias:"keyword"},rest:n.languages.javascript}},keyword:{pattern:/(^[\t ]*)(?:append|block|extends|include|prepend)\b.+/m,lookbehind:!0},mixin:[{pattern:/(^[\t ]*)mixin .+/m,lookbehind:!0,inside:{keyword:/^mixin/,function:/\w+(?=\s*\(|\s*$)/,punctuation:/[(),.]/}},{pattern:/(^[\t ]*)\+.+/m,lookbehind:!0,inside:{name:{pattern:/^\+\w+/,alias:"function"},rest:n.languages.javascript}}],script:{pattern:/(^[\t ]*script(?:(?:&[^(]+)?\([^)]+\))*[\t ]).+/m,lookbehind:!0,inside:n.languages.javascript},"plain-text":{pattern:/(^[\t ]*(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?[\t ]).+/m,lookbehind:!0},tag:{pattern:/(^[\t ]*)(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?:?/m,lookbehind:!0,inside:{attributes:[{pattern:/&[^(]+\([^)]+\)/,inside:n.languages.javascript},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*(?!\s))(?:\{[^}]*\}|[^,)\r\n]+)/,lookbehind:!0,inside:n.languages.javascript},"attr-name":/[\w-]+(?=\s*!?=|\s*[,)])/,punctuation:/[!=(),]+/}}],punctuation:/:/,"attr-id":/#[\w\-]+/,"attr-class":/\.[\w\-]+/}},code:[{pattern:/(^[\t ]*(?:-|!?=)).+/m,lookbehind:!0,inside:n.languages.javascript}],punctuation:/[.\-!=|]+/};for(var r=/(^([\t ]*)):(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/.source,a=[{filter:"atpl",language:"twig"},{filter:"coffee",language:"coffeescript"},"ejs","handlebars","less","livescript","markdown",{filter:"sass",language:"scss"},"stylus"],o={},i=0,s=a.length;i",function(){return l.filter}),"m"),lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"},text:{pattern:/\S[\s\S]*/,alias:[l.language,"language-"+l.language],inside:n.languages[l.language]}}})}n.languages.insertBefore("pug","filter",o)})(t)}return t0}var n0,VL;function uSe(){if(VL)return n0;VL=1,n0=e,e.displayName="puppet",e.aliases=[];function e(t){(function(n){n.languages.puppet={heredoc:[{pattern:/(@\("([^"\r\n\/):]+)"(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r(?!\n)))*?[ \t]*(?:\|[ \t]*)?(?:-[ \t]*)?\2/,lookbehind:!0,alias:"string",inside:{punctuation:/(?=\S).*\S(?= *$)/}},{pattern:/(@\(([^"\r\n\/):]+)(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r(?!\n)))*?[ \t]*(?:\|[ \t]*)?(?:-[ \t]*)?\2/,lookbehind:!0,greedy:!0,alias:"string",inside:{punctuation:/(?=\S).*\S(?= *$)/}},{pattern:/@\("?(?:[^"\r\n\/):]+)"?(?:\/[nrts$uL]*)?\)/,alias:"string",inside:{punctuation:{pattern:/(\().+?(?=\))/,lookbehind:!0}}}],"multiline-comment":{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0,greedy:!0,alias:"comment"},regex:{pattern:/((?:\bnode\s+|[~=\(\[\{,]\s*|[=+]>\s*|^\s*))\/(?:[^\/\\]|\\[\s\S])+\/(?:[imx]+\b|\B)/,lookbehind:!0,greedy:!0,inside:{"extended-regex":{pattern:/^\/(?:[^\/\\]|\\[\s\S])+\/[im]*x[im]*$/,inside:{comment:/#.*/}}}},comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},string:{pattern:/(["'])(?:\$\{(?:[^'"}]|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}|\$(?!\{)|(?!\1)[^\\$]|\\[\s\S])*\1/,greedy:!0,inside:{"double-quoted":{pattern:/^"[\s\S]*"$/,inside:{}}}},variable:{pattern:/\$(?:::)?\w+(?:::\w+)*/,inside:{punctuation:/::/}},"attr-name":/(?:\b\w+|\*)(?=\s*=>)/,function:[{pattern:/(\.)(?!\d)\w+/,lookbehind:!0},/\b(?:contain|debug|err|fail|include|info|notice|realize|require|tag|warning)\b|\b(?!\d)\w+(?=\()/],number:/\b(?:0x[a-f\d]+|\d+(?:\.\d+)?(?:e-?\d+)?)\b/i,boolean:/\b(?:false|true)\b/,keyword:/\b(?:application|attr|case|class|consumes|default|define|else|elsif|function|if|import|inherits|node|private|produces|type|undef|unless)\b/,datatype:{pattern:/\b(?:Any|Array|Boolean|Callable|Catalogentry|Class|Collection|Data|Default|Enum|Float|Hash|Integer|NotUndef|Numeric|Optional|Pattern|Regexp|Resource|Runtime|Scalar|String|Struct|Tuple|Type|Undef|Variant)\b/,alias:"symbol"},operator:/=[=~>]?|![=~]?|<(?:<\|?|[=~|-])?|>[>=]?|->?|~>|\|>?>?|[*\/%+?]|\b(?:and|in|or)\b/,punctuation:/[\[\]{}().,;]|:+/};var r=[{pattern:/(^|[^\\])\$\{(?:[^'"{}]|\{[^}]*\}|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}/,lookbehind:!0,inside:{"short-variable":{pattern:/(^\$\{)(?!\w+\()(?:::)?\w+(?:::\w+)*/,lookbehind:!0,alias:"variable",inside:{punctuation:/::/}},delimiter:{pattern:/^\$/,alias:"variable"},rest:n.languages.puppet}},{pattern:/(^|[^\\])\$(?:::)?\w+(?:::\w+)*/,lookbehind:!0,alias:"variable",inside:{punctuation:/::/}}];n.languages.puppet.heredoc[0].inside.interpolation=r,n.languages.puppet.string.inside["double-quoted"].inside.interpolation=r})(t)}return n0}var r0,qL;function dSe(){if(qL)return r0;qL=1,r0=e,e.displayName="pure",e.aliases=[];function e(t){(function(n){n.languages.pure={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0},/#!.+/],"inline-lang":{pattern:/%<[\s\S]+?%>/,greedy:!0,inside:{lang:{pattern:/(^%< *)-\*-.+?-\*-/,lookbehind:!0,alias:"comment"},delimiter:{pattern:/^%<.*|%>$/,alias:"punctuation"}}},string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},number:{pattern:/((?:\.\.)?)(?:\b(?:inf|nan)\b|\b0x[\da-f]+|(?:\b(?:0b)?\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?L?)/i,lookbehind:!0},keyword:/\b(?:NULL|ans|break|bt|case|catch|cd|clear|const|def|del|dump|else|end|exit|extern|false|force|help|if|infix[lr]?|interface|let|ls|mem|namespace|nonfix|of|otherwise|outfix|override|postfix|prefix|private|public|pwd|quit|run|save|show|stats|then|throw|trace|true|type|underride|using|when|with)\b/,function:/\b(?:abs|add_(?:addr|constdef|(?:fundef|interface|macdef|typedef)(?:_at)?|vardef)|all|any|applp?|arity|bigintp?|blob(?:_crc|_size|p)?|boolp?|byte_c?string(?:_pointer)?|byte_(?:matrix|pointer)|calloc|cat|catmap|ceil|char[ps]?|check_ptrtag|chr|clear_sentry|clearsym|closurep?|cmatrixp?|cols?|colcat(?:map)?|colmap|colrev|colvector(?:p|seq)?|complex(?:_float_(?:matrix|pointer)|_matrix(?:_view)?|_pointer|p)?|conj|cookedp?|cst|cstring(?:_(?:dup|list|vector))?|curry3?|cyclen?|del_(?:constdef|fundef|interface|macdef|typedef|vardef)|delete|diag(?:mat)?|dim|dmatrixp?|do|double(?:_matrix(?:_view)?|_pointer|p)?|dowith3?|drop|dropwhile|eval(?:cmd)?|exactp|filter|fix|fixity|flip|float(?:_matrix|_pointer)|floor|fold[lr]1?|frac|free|funp?|functionp?|gcd|get(?:_(?:byte|constdef|double|float|fundef|int(?:64)?|interface(?:_typedef)?|long|macdef|pointer|ptrtag|sentry|short|string|typedef|vardef))?|globsym|hash|head|id|im|imatrixp?|index|inexactp|infp|init|insert|int(?:_matrix(?:_view)?|_pointer|p)?|int64_(?:matrix|pointer)|integerp?|iteraten?|iterwhile|join|keys?|lambdap?|last(?:err(?:pos)?)?|lcd|list[2p]?|listmap|make_ptrtag|malloc|map|matcat|matrixp?|max|member|min|nanp|nargs|nmatrixp?|null|numberp?|ord|pack(?:ed)?|pointer(?:_cast|_tag|_type|p)?|pow|pred|ptrtag|put(?:_(?:byte|double|float|int(?:64)?|long|pointer|short|string))?|rationalp?|re|realp?|realloc|recordp?|redim|reduce(?:_with)?|refp?|repeatn?|reverse|rlistp?|round|rows?|rowcat(?:map)?|rowmap|rowrev|rowvector(?:p|seq)?|same|scan[lr]1?|sentry|sgn|short_(?:matrix|pointer)|slice|smatrixp?|sort|split|str|strcat|stream|stride|string(?:_(?:dup|list|vector)|p)?|subdiag(?:mat)?|submat|subseq2?|substr|succ|supdiag(?:mat)?|symbolp?|tail|take|takewhile|thunkp?|transpose|trunc|tuplep?|typep|ubyte|uint(?:64)?|ulong|uncurry3?|unref|unzip3?|update|ushort|vals?|varp?|vector(?:p|seq)?|void|zip3?|zipwith3?)\b/,special:{pattern:/\b__[a-z]+__\b/i,alias:"builtin"},operator:/(?:[!"#$%&'*+,\-.\/:<=>?@\\^`|~\u00a1-\u00bf\u00d7-\u00f7\u20d0-\u2bff]|\b_+\b)+|\b(?:and|div|mod|not|or)\b/,punctuation:/[(){}\[\];,|]/};var r=["c",{lang:"c++",alias:"cpp"},"fortran"],a=/%< *-\*- *\d* *-\*-[\s\S]+?%>/.source;r.forEach(function(o){var i=o;if(typeof o!="string"&&(i=o.alias,o=o.lang),n.languages[i]){var s={};s["inline-lang-"+i]={pattern:RegExp(a.replace("",o.replace(/([.+*?\/\\(){}\[\]])/g,"\\$1")),"i"),inside:n.util.clone(n.languages.pure["inline-lang"].inside)},s["inline-lang-"+i].inside.rest=n.util.clone(n.languages[i]),n.languages.insertBefore("pure","inline-lang",s)}}),n.languages.c&&(n.languages.pure["inline-lang"].inside.rest=n.util.clone(n.languages.c))})(t)}return r0}var a0,GL;function fSe(){if(GL)return a0;GL=1,a0=e,e.displayName="purebasic",e.aliases=[];function e(t){t.languages.purebasic=t.languages.extend("clike",{comment:/;.*/,keyword:/\b(?:align|and|as|break|calldebugger|case|compilercase|compilerdefault|compilerelse|compilerelseif|compilerendif|compilerendselect|compilererror|compilerif|compilerselect|continue|data|datasection|debug|debuglevel|declare|declarec|declarecdll|declaredll|declaremodule|default|define|dim|disableasm|disabledebugger|disableexplicit|else|elseif|enableasm|enabledebugger|enableexplicit|end|enddatasection|enddeclaremodule|endenumeration|endif|endimport|endinterface|endmacro|endmodule|endprocedure|endselect|endstructure|endstructureunion|endwith|enumeration|extends|fakereturn|for|foreach|forever|global|gosub|goto|if|import|importc|includebinary|includefile|includepath|interface|macro|module|newlist|newmap|next|not|or|procedure|procedurec|procedurecdll|proceduredll|procedurereturn|protected|prototype|prototypec|read|redim|repeat|restore|return|runtime|select|shared|static|step|structure|structureunion|swap|threaded|to|until|wend|while|with|xincludefile|xor)\b/i,function:/\b\w+(?:\.\w+)?\s*(?=\()/,number:/(?:\$[\da-f]+|\b-?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)\b/i,operator:/(?:@\*?|\?|\*)\w+|-[>-]?|\+\+?|!=?|<>?=?|==?|&&?|\|?\||[~^%?*/@]/}),t.languages.insertBefore("purebasic","keyword",{tag:/#\w+\$?/,asm:{pattern:/(^[\t ]*)!.*/m,lookbehind:!0,alias:"tag",inside:{comment:/;.*/,string:{pattern:/(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},"label-reference-anonymous":{pattern:/(!\s*j[a-z]+\s+)@[fb]/i,lookbehind:!0,alias:"fasm-label"},"label-reference-addressed":{pattern:/(!\s*j[a-z]+\s+)[A-Z._?$@][\w.?$@~#]*/i,lookbehind:!0,alias:"fasm-label"},keyword:[/\b(?:extern|global)\b[^;\r\n]*/i,/\b(?:CPU|DEFAULT|FLOAT)\b.*/],function:{pattern:/^([\t ]*!\s*)[\da-z]+(?=\s|$)/im,lookbehind:!0},"function-inline":{pattern:/(:\s*)[\da-z]+(?=\s)/i,lookbehind:!0,alias:"function"},label:{pattern:/^([\t ]*!\s*)[A-Za-z._?$@][\w.?$@~#]*(?=:)/m,lookbehind:!0,alias:"fasm-label"},register:/\b(?:st\d|[xyz]mm\d\d?|[cdt]r\d|r\d\d?[bwd]?|[er]?[abcd]x|[abcd][hl]|[er]?(?:bp|di|si|sp)|[cdefgs]s|mm\d+)\b/i,number:/(?:\b|-|(?=\$))(?:0[hx](?:[\da-f]*\.)?[\da-f]+(?:p[+-]?\d+)?|\d[\da-f]+[hx]|\$\d[\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\d+|(?:\d+(?:\.\d+)?|\.\d+)(?:\.?e[+-]?\d+)?[dt]?)\b/i,operator:/[\[\]*+\-/%<>=&|$!,.:]/}}}),delete t.languages.purebasic["class-name"],delete t.languages.purebasic.boolean,t.languages.pbfasm=t.languages.purebasic}return a0}var o0,WL;function pSe(){if(WL)return o0;WL=1;var e=NA();o0=t,t.displayName="purescript",t.aliases=["purs"];function t(n){n.register(e),n.languages.purescript=n.languages.extend("haskell",{keyword:/\b(?:ado|case|class|data|derive|do|else|forall|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b|∀/,"import-statement":{pattern:/(^[\t ]*)import\s+[A-Z][\w']*(?:\.[A-Z][\w']*)*(?:\s+as\s+[A-Z][\w']*(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,lookbehind:!0,inside:{keyword:/\b(?:as|hiding|import)\b/,punctuation:/\./}},builtin:/\b(?:absurd|add|ap|append|apply|between|bind|bottom|clamp|compare|comparing|compose|conj|const|degree|discard|disj|div|eq|flap|flip|gcd|identity|ifM|join|lcm|liftA1|liftM1|map|max|mempty|min|mod|mul|negate|not|notEq|one|otherwise|recip|show|sub|top|unit|unless|unlessM|void|when|whenM|zero)\b/,operator:[n.languages.haskell.operator[0],n.languages.haskell.operator[2],/[\xa2-\xa6\xa8\xa9\xac\xae-\xb1\xb4\xb8\xd7\xf7\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u03f6\u0482\u058d-\u058f\u0606-\u0608\u060b\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u07fe\u07ff\u09f2\u09f3\u09fa\u09fb\u0af1\u0b70\u0bf3-\u0bfa\u0c7f\u0d4f\u0d79\u0e3f\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u166d\u17db\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u2044\u2052\u207a-\u207c\u208a-\u208c\u20a0-\u20bf\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u2140-\u2144\u214a-\u214d\u214f\u218a\u218b\u2190-\u2307\u230c-\u2328\u232b-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b73\u2b76-\u2b95\u2b97-\u2bff\u2ce5-\u2cea\u2e50\u2e51\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u309b\u309c\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua700-\ua716\ua720\ua721\ua789\ua78a\ua828-\ua82b\ua836-\ua839\uaa77-\uaa79\uab5b\uab6a\uab6b\ufb29\ufbb2-\ufbc1\ufdfc\ufdfd\ufe62\ufe64-\ufe66\ufe69\uff04\uff0b\uff1c-\uff1e\uff3e\uff40\uff5c\uff5e\uffe0-\uffe6\uffe8-\uffee\ufffc\ufffd]/]}),n.languages.purs=n.languages.purescript}return o0}var i0,KL;function gSe(){if(KL)return i0;KL=1,i0=e,e.displayName="python",e.aliases=["py"];function e(t){t.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},t.languages.python["string-interpolation"].inside.interpolation.inside.rest=t.languages.python,t.languages.py=t.languages.python}return i0}var s0,YL;function mSe(){if(YL)return s0;YL=1,s0=e,e.displayName="q",e.aliases=[];function e(t){t.languages.q={string:/"(?:\\.|[^"\\\r\n])*"/,comment:[{pattern:/([\t )\]}])\/.*/,lookbehind:!0,greedy:!0},{pattern:/(^|\r?\n|\r)\/[\t ]*(?:(?:\r?\n|\r)(?:.*(?:\r?\n|\r(?!\n)))*?(?:\\(?=[\t ]*(?:\r?\n|\r))|$)|\S.*)/,lookbehind:!0,greedy:!0},{pattern:/^\\[\t ]*(?:\r?\n|\r)[\s\S]+/m,greedy:!0},{pattern:/^#!.+/m,greedy:!0}],symbol:/`(?::\S+|[\w.]*)/,datetime:{pattern:/0N[mdzuvt]|0W[dtz]|\d{4}\.\d\d(?:m|\.\d\d(?:T(?:\d\d(?::\d\d(?::\d\d(?:[.:]\d\d\d)?)?)?)?)?[dz]?)|\d\d:\d\d(?::\d\d(?:[.:]\d\d\d)?)?[uvt]?/,alias:"number"},number:/\b(?![01]:)(?:0N[hje]?|0W[hj]?|0[wn]|0x[\da-fA-F]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?[hjfeb]?)/,keyword:/\\\w+\b|\b(?:abs|acos|aj0?|all|and|any|asc|asin|asof|atan|attr|avgs?|binr?|by|ceiling|cols|cor|cos|count|cov|cross|csv|cut|delete|deltas|desc|dev|differ|distinct|div|do|dsave|ej|enlist|eval|except|exec|exit|exp|fby|fills|first|fkeys|flip|floor|from|get|getenv|group|gtime|hclose|hcount|hdel|hopen|hsym|iasc|identity|idesc|if|ij|in|insert|inter|inv|keys?|last|like|list|ljf?|load|log|lower|lsq|ltime|ltrim|mavg|maxs?|mcount|md5|mdev|med|meta|mins?|mmax|mmin|mmu|mod|msum|neg|next|not|null|or|over|parse|peach|pj|plist|prds?|prev|prior|rand|rank|ratios|raze|read0|read1|reciprocal|reval|reverse|rload|rotate|rsave|rtrim|save|scan|scov|sdev|select|set|setenv|show|signum|sin|sqrt|ssr?|string|sublist|sums?|sv|svar|system|tables|tan|til|trim|txf|type|uj|ungroup|union|update|upper|upsert|value|var|views?|vs|wavg|where|while|within|wj1?|wsum|ww|xasc|xbar|xcols?|xdesc|xexp|xgroup|xkey|xlog|xprev|xrank)\b/,adverb:{pattern:/['\/\\]:?|\beach\b/,alias:"function"},verb:{pattern:/(?:\B\.\B|\b[01]:|<[=>]?|>=?|[:+\-*%,!?~=|$&#@^]):?|\b_\b:?/,alias:"operator"},punctuation:/[(){}\[\];.]/}}return s0}var l0,ZL;function hSe(){if(ZL)return l0;ZL=1,l0=e,e.displayName="qml",e.aliases=[];function e(t){(function(n){for(var r=/"(?:\\.|[^\\"\r\n])*"|'(?:\\.|[^\\'\r\n])*'/.source,a=/\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))*\*\//.source,o=/(?:[^\\()[\]{}"'/]||\/(?![*/])||\(*\)|\[*\]|\{*\}|\\[\s\S])/.source.replace(//g,function(){return r}).replace(//g,function(){return a}),i=0;i<2;i++)o=o.replace(//g,function(){return o});o=o.replace(//g,"[^\\s\\S]"),n.languages.qml={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},"javascript-function":{pattern:RegExp(/((?:^|;)[ \t]*)function\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*\(*\)\s*\{*\}/.source.replace(//g,function(){return o}),"m"),lookbehind:!0,greedy:!0,alias:"language-javascript",inside:n.languages.javascript},"class-name":{pattern:/((?:^|[:;])[ \t]*)(?!\d)\w+(?=[ \t]*\{|[ \t]+on\b)/m,lookbehind:!0},property:[{pattern:/((?:^|[;{])[ \t]*)(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,lookbehind:!0},{pattern:/((?:^|[;{])[ \t]*)property[ \t]+(?!\d)\w+(?:\.\w+)*[ \t]+(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,lookbehind:!0,inside:{keyword:/^property/,property:/\w+(?:\.\w+)*/}}],"javascript-expression":{pattern:RegExp(/(:[ \t]*)(?![\s;}[])(?:(?!$|[;}]))+/.source.replace(//g,function(){return o}),"m"),lookbehind:!0,greedy:!0,alias:"language-javascript",inside:n.languages.javascript},string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},keyword:/\b(?:as|import|on)\b/,punctuation:/[{}[\]:;,]/}})(t)}return l0}var c0,XL;function bSe(){if(XL)return c0;XL=1,c0=e,e.displayName="qore",e.aliases=[];function e(t){t.languages.qore=t.languages.extend("clike",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:\/\/|#).*)/,lookbehind:!0},string:{pattern:/("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},keyword:/\b(?:abstract|any|assert|binary|bool|boolean|break|byte|case|catch|char|class|code|const|continue|data|default|do|double|else|enum|extends|final|finally|float|for|goto|hash|if|implements|import|inherits|instanceof|int|interface|long|my|native|new|nothing|null|object|our|own|private|reference|rethrow|return|short|soft(?:bool|date|float|int|list|number|string)|static|strictfp|string|sub|super|switch|synchronized|this|throw|throws|transient|try|void|volatile|while)\b/,boolean:/\b(?:false|true)\b/i,function:/\$?\b(?!\d)\w+(?=\()/,number:/\b(?:0b[01]+|0x(?:[\da-f]*\.)?[\da-fp\-]+|(?:\d+(?:\.\d+)?|\.\d+)(?:e\d+)?[df]|(?:\d+(?:\.\d+)?|\.\d+))\b/i,operator:{pattern:/(^|[^.])(?:\+[+=]?|-[-=]?|[!=](?:==?|~)?|>>?=?|<(?:=>?|<=?)?|&[&=]?|\|[|=]?|[*\/%^]=?|[~?])/,lookbehind:!0},variable:/\$(?!\d)\w+\b/})}return c0}var u0,QL;function ySe(){if(QL)return u0;QL=1,u0=e,e.displayName="qsharp",e.aliases=["qs"];function e(t){(function(n){function r(b,y){return b.replace(/<<(\d+)>>/g,function(w,v){return"(?:"+y[+v]+")"})}function a(b,y,w){return RegExp(r(b,y),w||"")}function o(b,y){for(var w=0;w>/g,function(){return"(?:"+b+")"});return b.replace(/<>/g,"[^\\s\\S]")}var i={type:"Adj BigInt Bool Ctl Double false Int One Pauli PauliI PauliX PauliY PauliZ Qubit Range Result String true Unit Zero",other:"Adjoint adjoint apply as auto body borrow borrowing Controlled controlled distribute elif else fail fixup for function if in internal intrinsic invert is let mutable namespace new newtype open operation repeat return self set until use using while within"};function s(b){return"\\b(?:"+b.trim().replace(/ /g,"|")+")\\b"}var l=RegExp(s(i.type+" "+i.other)),c=/\b[A-Za-z_]\w*\b/.source,u=r(/<<0>>(?:\s*\.\s*<<0>>)*/.source,[c]),d={keyword:l,punctuation:/[<>()?,.:[\]]/},g=/"(?:\\.|[^\\"])*"/.source;n.languages.qsharp=n.languages.extend("clike",{comment:/\/\/.*/,string:[{pattern:a(/(^|[^$\\])<<0>>/.source,[g]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:a(/(\b(?:as|open)\s+)<<0>>(?=\s*(?:;|as\b))/.source,[u]),lookbehind:!0,inside:d},{pattern:a(/(\bnamespace\s+)<<0>>(?=\s*\{)/.source,[u]),lookbehind:!0,inside:d}],keyword:l,number:/(?:\b0(?:x[\da-f]+|b[01]+|o[0-7]+)|(?:\B\.\d+|\b\d+(?:\.\d*)?)(?:e[-+]?\d+)?)l?\b/i,operator:/\band=|\bor=|\band\b|\bnot\b|\bor\b|<[-=]|[-=]>|>>>=?|<<<=?|\^\^\^=?|\|\|\|=?|&&&=?|w\/=?|~~~|[*\/+\-^=!%]=?/,punctuation:/::|[{}[\];(),.:]/}),n.languages.insertBefore("qsharp","number",{range:{pattern:/\.\./,alias:"operator"}});var m=o(r(/\{(?:[^"{}]|<<0>>|<>)*\}/.source,[g]),2);n.languages.insertBefore("qsharp","string",{"interpolation-string":{pattern:a(/\$"(?:\\.|<<0>>|[^\\"{])*"/.source,[m]),greedy:!0,inside:{interpolation:{pattern:a(/((?:^|[^\\])(?:\\\\)*)<<0>>/.source,[m]),lookbehind:!0,inside:{punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-qsharp",inside:n.languages.qsharp}}},string:/[\s\S]+/}}})})(t),t.languages.qs=t.languages.qsharp}return u0}var d0,JL;function vSe(){if(JL)return d0;JL=1,d0=e,e.displayName="r",e.aliases=[];function e(t){t.languages.r={comment:/#.*/,string:{pattern:/(['"])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},"percent-operator":{pattern:/%[^%\s]*%/,alias:"operator"},boolean:/\b(?:FALSE|TRUE)\b/,ellipsis:/\.\.(?:\.|\d+)/,number:[/\b(?:Inf|NaN)\b/,/(?:\b0x[\dA-Fa-f]+(?:\.\d*)?|\b\d+(?:\.\d*)?|\B\.\d+)(?:[EePp][+-]?\d+)?[iL]?/],keyword:/\b(?:NA|NA_character_|NA_complex_|NA_integer_|NA_real_|NULL|break|else|for|function|if|in|next|repeat|while)\b/,operator:/->?>?|<(?:=|=!]=?|::?|&&?|\|\|?|[+*\/^$@~]/,punctuation:/[(){}\[\],;]/}}return d0}var f0,eM;function SSe(){if(eM)return f0;eM=1;var e=LA();f0=t,t.displayName="racket",t.aliases=["rkt"];function t(n){n.register(e),n.languages.racket=n.languages.extend("scheme",{"lambda-parameter":{pattern:/([(\[]lambda\s+[(\[])[^()\[\]'\s]+/,lookbehind:!0}}),n.languages.insertBefore("racket","string",{lang:{pattern:/^#lang.+/m,greedy:!0,alias:"keyword"}}),n.languages.rkt=n.languages.racket}return f0}var p0,tM;function wSe(){if(tM)return p0;tM=1,p0=e,e.displayName="reason",e.aliases=[];function e(t){t.languages.reason=t.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),t.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete t.languages.reason.function}return p0}var g0,nM;function ESe(){if(nM)return g0;nM=1,g0=e,e.displayName="regex",e.aliases=[];function e(t){(function(n){var r={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},a=/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/,o={pattern:/\.|\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},i={pattern:/\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},s="(?:[^\\\\-]|"+a.source+")",l=RegExp(s+"-"+s),c={pattern:/(<|')[^<>']+(?=[>']$)/,lookbehind:!0,alias:"variable"};n.languages.regex={"char-class":{pattern:/((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,lookbehind:!0,inside:{"char-class-negation":{pattern:/(^\[)\^/,lookbehind:!0,alias:"operator"},"char-class-punctuation":{pattern:/^\[|\]$/,alias:"punctuation"},range:{pattern:l,inside:{escape:a,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":r,"char-set":i,escape:a}},"special-escape":r,"char-set":o,backreference:[{pattern:/\\(?![123][0-7]{2})[1-9]/,alias:"keyword"},{pattern:/\\k<[^<>']+>/,alias:"keyword",inside:{"group-name":c}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:a,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|:=]=?|!=|\b_\b/,punctuation:/[,;.\[\]{}()]/}}return m0}var h0,aM;function kSe(){if(aM)return h0;aM=1,h0=e,e.displayName="renpy",e.aliases=["rpy"];function e(t){t.languages.renpy={comment:{pattern:/(^|[^\\])#.+/,lookbehind:!0},string:{pattern:/("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\])*\2|(?:^#?(?:(?:[0-9a-fA-F]){3}|[0-9a-fA-F]{6})$)/m,greedy:!0},function:/\b[a-z_]\w*(?=\()/i,property:/\b(?:Update|UpdateVersion|action|activate_sound|adv_nvl_transition|after_load_transition|align|alpha|alt|anchor|antialias|area|auto|background|bar_invert|bar_resizing|bar_vertical|black_color|bold|bottom_bar|bottom_gutter|bottom_margin|bottom_padding|box_reverse|box_wrap|can_update|caret|child|color|crop|default_afm_enable|default_afm_time|default_fullscreen|default_text_cps|developer|directory_name|drag_handle|drag_joined|drag_name|drag_raise|draggable|dragged|drop_shadow|drop_shadow_color|droppable|dropped|easein|easeout|edgescroll|end_game_transition|end_splash_transition|enter_replay_transition|enter_sound|enter_transition|enter_yesno_transition|executable_name|exit_replay_transition|exit_sound|exit_transition|exit_yesno_transition|fadein|fadeout|first_indent|first_spacing|fit_first|focus|focus_mask|font|foreground|game_main_transition|get_installed_packages|google_play_key|google_play_salt|ground|has_music|has_sound|has_voice|height|help|hinting|hover|hover_background|hover_color|hover_sound|hovered|hyperlink_functions|idle|idle_color|image_style|include_update|insensitive|insensitive_background|insensitive_color|inside|intra_transition|italic|justify|kerning|keyboard_focus|language|layer_clipping|layers|layout|left_bar|left_gutter|left_margin|left_padding|length|line_leading|line_overlap_split|line_spacing|linear|main_game_transition|main_menu_music|maximum|min_width|minimum|minwidth|modal|mouse|mousewheel|name|narrator_menu|newline_indent|nvl_adv_transition|offset|order_reverse|outlines|overlay_functions|pos|position|prefix|radius|range|rest_indent|right_bar|right_gutter|right_margin|right_padding|rotate|rotate_pad|ruby_style|sample_sound|save_directory|say_attribute_transition|screen_height|screen_width|scrollbars|selected_hover|selected_hover_color|selected_idle|selected_idle_color|selected_insensitive|show_side_image|show_two_window|side_spacing|side_xpos|side_ypos|size|size_group|slow_cps|slow_cps_multiplier|spacing|strikethrough|subpixel|text_align|text_style|text_xpos|text_y_fudge|text_ypos|thumb|thumb_offset|thumb_shadow|thumbnail_height|thumbnail_width|time|top_bar|top_gutter|top_margin|top_padding|translations|underline|unscrollable|update|value|version|version_name|version_tuple|vertical|width|window_hide_transition|window_icon|window_left_padding|window_show_transition|window_title|windows_icon|xadjustment|xalign|xanchor|xanchoraround|xaround|xcenter|xfill|xinitial|xmargin|xmaximum|xminimum|xoffset|xofsset|xpadding|xpos|xsize|xzoom|yadjustment|yalign|yanchor|yanchoraround|yaround|ycenter|yfill|yinitial|ymargin|ymaximum|yminimum|yoffset|ypadding|ypos|ysize|ysizexysize|yzoom|zoom|zorder)\b/,tag:/\b(?:bar|block|button|buttoscreenn|drag|draggroup|fixed|frame|grid|[hv]box|hotbar|hotspot|image|imagebutton|imagemap|input|key|label|menu|mm_menu_frame|mousearea|nvl|parallel|screen|self|side|tag|text|textbutton|timer|vbar|viewport|window)\b|\$/,keyword:/\b(?:None|add|adjustment|alignaround|allow|angle|animation|around|as|assert|behind|box_layout|break|build|cache|call|center|changed|child_size|choice|circles|class|clear|clicked|clipping|clockwise|config|contains|continue|corner1|corner2|counterclockwise|def|default|define|del|delay|disabled|disabled_text|dissolve|elif|else|event|except|exclude|exec|expression|fade|finally|for|from|function|global|gm_root|has|hide|id|if|import|in|init|is|jump|knot|lambda|left|less_rounded|mm_root|movie|music|null|on|onlayer|pass|pause|persistent|play|print|python|queue|raise|random|renpy|repeat|return|right|rounded_window|scene|scope|set|show|slow|slow_abortable|slow_done|sound|stop|store|style|style_group|substitute|suffix|theme|transform|transform_anchor|transpose|try|ui|unhovered|updater|use|voice|while|widget|widget_hover|widget_selected|widget_text|yield)\b/,boolean:/\b(?:[Ff]alse|[Tt]rue)\b/,number:/(?:\b(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?)|\B\.\d+)(?:e[+-]?\d+)?j?/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:and|at|not|or|with)\b/,punctuation:/[{}[\];(),.:]/},t.languages.rpy=t.languages.renpy}return h0}var b0,oM;function CSe(){if(oM)return b0;oM=1,b0=e,e.displayName="rest",e.aliases=[];function e(t){t.languages.rest={table:[{pattern:/(^[\t ]*)(?:\+[=-]+)+\+(?:\r?\n|\r)(?:\1[+|].+[+|](?:\r?\n|\r))+\1(?:\+[=-]+)+\+/m,lookbehind:!0,inside:{punctuation:/\||(?:\+[=-]+)+\+/}},{pattern:/(^[\t ]*)=+ [ =]*=(?:(?:\r?\n|\r)\1.+)+(?:\r?\n|\r)\1=+ [ =]*=(?=(?:\r?\n|\r){2}|\s*$)/m,lookbehind:!0,inside:{punctuation:/[=-]+/}}],"substitution-def":{pattern:/(^[\t ]*\.\. )\|(?:[^|\s](?:[^|]*[^|\s])?)\| [^:]+::/m,lookbehind:!0,inside:{substitution:{pattern:/^\|(?:[^|\s]|[^|\s][^|]*[^|\s])\|/,alias:"attr-value",inside:{punctuation:/^\||\|$/}},directive:{pattern:/( )(?! )[^:]+::/,lookbehind:!0,alias:"function",inside:{punctuation:/::$/}}}},"link-target":[{pattern:/(^[\t ]*\.\. )\[[^\]]+\]/m,lookbehind:!0,alias:"string",inside:{punctuation:/^\[|\]$/}},{pattern:/(^[\t ]*\.\. )_(?:`[^`]+`|(?:[^:\\]|\\.)+):/m,lookbehind:!0,alias:"string",inside:{punctuation:/^_|:$/}}],directive:{pattern:/(^[\t ]*\.\. )[^:]+::/m,lookbehind:!0,alias:"function",inside:{punctuation:/::$/}},comment:{pattern:/(^[\t ]*\.\.)(?:(?: .+)?(?:(?:\r?\n|\r).+)+| .+)(?=(?:\r?\n|\r){2}|$)/m,lookbehind:!0},title:[{pattern:/^(([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2+)(?:\r?\n|\r).+(?:\r?\n|\r)\1$/m,inside:{punctuation:/^[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+|[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+$/,important:/.+/}},{pattern:/(^|(?:\r?\n|\r){2}).+(?:\r?\n|\r)([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2+(?=\r?\n|\r|$)/,lookbehind:!0,inside:{punctuation:/[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+$/,important:/.+/}}],hr:{pattern:/((?:\r?\n|\r){2})([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2{3,}(?=(?:\r?\n|\r){2})/,lookbehind:!0,alias:"punctuation"},field:{pattern:/(^[\t ]*):[^:\r\n]+:(?= )/m,lookbehind:!0,alias:"attr-name"},"command-line-option":{pattern:/(^[\t ]*)(?:[+-][a-z\d]|(?:--|\/)[a-z\d-]+)(?:[ =](?:[a-z][\w-]*|<[^<>]+>))?(?:, (?:[+-][a-z\d]|(?:--|\/)[a-z\d-]+)(?:[ =](?:[a-z][\w-]*|<[^<>]+>))?)*(?=(?:\r?\n|\r)? {2,}\S)/im,lookbehind:!0,alias:"symbol"},"literal-block":{pattern:/::(?:\r?\n|\r){2}([ \t]+)(?![ \t]).+(?:(?:\r?\n|\r)\1.+)*/,inside:{"literal-block-punctuation":{pattern:/^::/,alias:"punctuation"}}},"quoted-literal-block":{pattern:/::(?:\r?\n|\r){2}([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]).*(?:(?:\r?\n|\r)\1.*)*/,inside:{"literal-block-punctuation":{pattern:/^(?:::|([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\1*)/m,alias:"punctuation"}}},"list-bullet":{pattern:/(^[\t ]*)(?:[*+\-•‣⁃]|\(?(?:\d+|[a-z]|[ivxdclm]+)\)|(?:\d+|[a-z]|[ivxdclm]+)\.)(?= )/im,lookbehind:!0,alias:"punctuation"},"doctest-block":{pattern:/(^[\t ]*)>>> .+(?:(?:\r?\n|\r).+)*/m,lookbehind:!0,inside:{punctuation:/^>>>/}},inline:[{pattern:/(^|[\s\-:\/'"<(\[{])(?::[^:]+:`.*?`|`.*?`:[^:]+:|(\*\*?|``?|\|)(?!\s)(?:(?!\2).)*\S\2(?=[\s\-.,:;!?\\\/'")\]}]|$))/m,lookbehind:!0,inside:{bold:{pattern:/(^\*\*).+(?=\*\*$)/,lookbehind:!0},italic:{pattern:/(^\*).+(?=\*$)/,lookbehind:!0},"inline-literal":{pattern:/(^``).+(?=``$)/,lookbehind:!0,alias:"symbol"},role:{pattern:/^:[^:]+:|:[^:]+:$/,alias:"function",inside:{punctuation:/^:|:$/}},"interpreted-text":{pattern:/(^`).+(?=`$)/,lookbehind:!0,alias:"attr-value"},substitution:{pattern:/(^\|).+(?=\|$)/,lookbehind:!0,alias:"attr-value"},punctuation:/\*\*?|``?|\|/}}],link:[{pattern:/\[[^\[\]]+\]_(?=[\s\-.,:;!?\\\/'")\]}]|$)/,alias:"string",inside:{punctuation:/^\[|\]_$/}},{pattern:/(?:\b[a-z\d]+(?:[_.:+][a-z\d]+)*_?_|`[^`]+`_?_|_`[^`]+`)(?=[\s\-.,:;!?\\\/'")\]}]|$)/i,alias:"string",inside:{punctuation:/^_?`|`$|`?_?_$/}}],punctuation:{pattern:/(^[\t ]*)(?:\|(?= |$)|(?:---?|—|\.\.|__)(?= )|\.\.$)/m,lookbehind:!0}}}return b0}var y0,iM;function _Se(){if(iM)return y0;iM=1,y0=e,e.displayName="rip",e.aliases=[];function e(t){t.languages.rip={comment:{pattern:/#.*/,greedy:!0},char:{pattern:/\B`[^\s`'",.:;#\/\\()<>\[\]{}]\b/,greedy:!0},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},regex:{pattern:/(^|[^/])\/(?!\/)(?:\[[^\n\r\]]*\]|\\.|[^/\\\r\n\[])+\/(?=\s*(?:$|[\r\n,.;})]))/,lookbehind:!0,greedy:!0},keyword:/(?:=>|->)|\b(?:case|catch|class|else|exit|finally|if|raise|return|switch|try)\b/,builtin:/@|\bSystem\b/,boolean:/\b(?:false|true)\b/,date:/\b\d{4}-\d{2}-\d{2}\b/,time:/\b\d{2}:\d{2}:\d{2}\b/,datetime:/\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\b/,symbol:/:[^\d\s`'",.:;#\/\\()<>\[\]{}][^\s`'",.:;#\/\\()<>\[\]{}]*/,number:/[+-]?\b(?:\d+\.\d+|\d+)\b/,punctuation:/(?:\.{2,3})|[`,.:;=\/\\()<>\[\]{}]/,reference:/[^\d\s`'",.:;#\/\\()<>\[\]{}][^\s`'",.:;#\/\\()<>\[\]{}]*/}}return y0}var v0,sM;function ASe(){if(sM)return v0;sM=1,v0=e,e.displayName="roboconf",e.aliases=[];function e(t){t.languages.roboconf={comment:/#.*/,keyword:{pattern:/(^|\s)(?:(?:external|import)\b|(?:facet|instance of)(?=[ \t]+[\w-]+[ \t]*\{))/,lookbehind:!0},component:{pattern:/[\w-]+(?=[ \t]*\{)/,alias:"variable"},property:/[\w.-]+(?=[ \t]*:)/,value:{pattern:/(=[ \t]*(?![ \t]))[^,;]+/,lookbehind:!0,alias:"attr-value"},optional:{pattern:/\(optional\)/,alias:"builtin"},wildcard:{pattern:/(\.)\*/,lookbehind:!0,alias:"operator"},punctuation:/[{},.;:=]/}}return v0}var S0,lM;function TSe(){if(lM)return S0;lM=1,S0=e,e.displayName="robotframework",e.aliases=[];function e(t){(function(n){var r={pattern:/(^[ \t]*| {2}|\t)#.*/m,lookbehind:!0,greedy:!0},a={pattern:/((?:^|[^\\])(?:\\{2})*)[$@&%]\{(?:[^{}\r\n]|\{[^{}\r\n]*\})*\}/,lookbehind:!0,inside:{punctuation:/^[$@&%]\{|\}$/}};function o(c,u){var d={};d["section-header"]={pattern:/^ ?\*{3}.+?\*{3}/,alias:"keyword"};for(var g in u)d[g]=u[g];return d.tag={pattern:/([\r\n](?: {2}|\t)[ \t]*)\[[-\w]+\]/,lookbehind:!0,inside:{punctuation:/\[|\]/}},d.variable=a,d.comment=r,{pattern:RegExp(/^ ?\*{3}[ \t]*[ \t]*\*{3}(?:.|[\r\n](?!\*{3}))*/.source.replace(//g,function(){return c}),"im"),alias:"section",inside:d}}var i={pattern:/(\[Documentation\](?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,lookbehind:!0,alias:"string"},s={pattern:/([\r\n] ?)(?!#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0,alias:"function",inside:{variable:a}},l={pattern:/([\r\n](?: {2}|\t)[ \t]*)(?!\[|\.{3}|#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0,inside:{variable:a}};n.languages.robotframework={settings:o("Settings",{documentation:{pattern:/([\r\n] ?Documentation(?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,lookbehind:!0,alias:"string"},property:{pattern:/([\r\n] ?)(?!\.{3}|#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0}}),variables:o("Variables"),"test-cases":o("Test Cases",{"test-name":s,documentation:i,property:l}),keywords:o("Keywords",{"keyword-name":s,documentation:i,property:l}),tasks:o("Tasks",{"task-name":s,documentation:i,property:l}),comment:r},n.languages.robot=n.languages.robotframework})(t)}return S0}var w0,cM;function RSe(){if(cM)return w0;cM=1,w0=e,e.displayName="rust",e.aliases=[];function e(t){(function(n){for(var r=/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|)*\*\//.source,a=0;a<2;a++)r=r.replace(//g,function(){return r});r=r.replace(//g,function(){return/[^\s\S]/.source}),n.languages.rust={comment:[{pattern:RegExp(/(^|[^\\])/.source+r),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?=?|[@?]/},n.languages.rust["closure-params"].inside.rest=n.languages.rust,n.languages.rust.attribute.inside.string=n.languages.rust.string})(t)}return w0}var E0,uM;function NSe(){if(uM)return E0;uM=1,E0=e,e.displayName="sas",e.aliases=[];function e(t){(function(n){var r=/(?:"(?:""|[^"])*"(?!")|'(?:''|[^'])*'(?!'))/.source,a=/\b(?:\d[\da-f]*x|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,o={pattern:RegExp(r+"[bx]"),alias:"number"},i={pattern:/&[a-z_]\w*/i},s={pattern:/((?:^|\s|=|\())%(?:ABORT|BY|CMS|COPY|DISPLAY|DO|ELSE|END|EVAL|GLOBAL|GO|GOTO|IF|INC|INCLUDE|INDEX|INPUT|KTRIM|LENGTH|LET|LIST|LOCAL|PUT|QKTRIM|QSCAN|QSUBSTR|QSYSFUNC|QUPCASE|RETURN|RUN|SCAN|SUBSTR|SUPERQ|SYMDEL|SYMEXIST|SYMGLOBL|SYMLOCAL|SYSCALL|SYSEVALF|SYSEXEC|SYSFUNC|SYSGET|SYSRPUT|THEN|TO|TSO|UNQUOTE|UNTIL|UPCASE|WHILE|WINDOW)\b/i,lookbehind:!0,alias:"keyword"},l={pattern:/(^|\s)(?:proc\s+\w+|data(?!=)|quit|run)\b/i,alias:"keyword",lookbehind:!0},c=[/\/\*[\s\S]*?\*\//,{pattern:/(^[ \t]*|;\s*)\*[^;]*;/m,lookbehind:!0}],u={pattern:RegExp(r),greedy:!0},d=/[$%@.(){}\[\];,\\]/,g={pattern:/%?\b\w+(?=\()/,alias:"keyword"},m={function:g,"arg-value":{pattern:/(=\s*)[A-Z\.]+/i,lookbehind:!0},operator:/=/,"macro-variable":i,arg:{pattern:/[A-Z]+/i,alias:"keyword"},number:a,"numeric-constant":o,punctuation:d,string:u},b={pattern:/\b(?:format|put)\b=?[\w'$.]+/i,inside:{keyword:/^(?:format|put)(?==)/i,equals:/=/,format:{pattern:/(?:\w|\$\d)+\.\d?/,alias:"number"}}},y={pattern:/\b(?:format|put)\s+[\w']+(?:\s+[$.\w]+)+(?=;)/i,inside:{keyword:/^(?:format|put)/i,format:{pattern:/[\w$]+\.\d?/,alias:"number"}}},w={pattern:/((?:^|\s)=?)(?:catname|checkpoint execute_always|dm|endsas|filename|footnote|%include|libname|%list|lock|missing|options|page|resetline|%run|sasfile|skip|sysecho|title\d?)\b/i,lookbehind:!0,alias:"keyword"},v={pattern:/(^|\s)(?:submit(?:\s+(?:load|norun|parseonly))?|endsubmit)\b/i,lookbehind:!0,alias:"keyword"},h=/aStore|accessControl|aggregation|audio|autotune|bayesianNetClassifier|bioMedImage|boolRule|builtins|cardinality|cdm|clustering|conditionalRandomFields|configuration|copula|countreg|dataDiscovery|dataPreprocess|dataSciencePilot|dataStep|decisionTree|deduplication|deepLearn|deepNeural|deepRnn|ds2|ecm|entityRes|espCluster|explainModel|factmac|fastKnn|fcmpact|fedSql|freqTab|gVarCluster|gam|gleam|graphSemiSupLearn|hiddenMarkovModel|hyperGroup|ica|image|iml|kernalPca|langModel|ldaTopic|loadStreams|mbc|mixed|mlTools|modelPublishing|network|neuralNet|nmf|nonParametricBayes|nonlinear|optNetwork|optimization|panel|pca|percentile|phreg|pls|qkb|qlim|quantreg|recommend|regression|reinforcementLearn|robustPca|ruleMining|sampling|sandwich|sccasl|search(?:Analytics)?|sentimentAnalysis|sequence|session(?:Prop)?|severity|simSystem|simple|smartData|sparkEmbeddedProcess|sparseML|spatialreg|spc|stabilityMonitoring|svDataDescription|svm|table|text(?:Filters|Frequency|Mining|Parse|Rule(?:Develop|Score)|Topic|Util)|timeData|transpose|tsInfo|tsReconcile|uniTimeSeries|varReduce/.source,S={pattern:RegExp(/(^|\s)(?:action\s+)?(?:)\.[a-z]+\b[^;]+/.source.replace(//g,function(){return h}),"i"),lookbehind:!0,inside:{keyword:RegExp(/(?:)\.[a-z]+\b/.source.replace(//g,function(){return h}),"i"),action:{pattern:/(?:action)/i,alias:"keyword"},comment:c,function:g,"arg-value":m["arg-value"],operator:m.operator,argument:m.arg,number:a,"numeric-constant":o,punctuation:d,string:u}},E={pattern:/((?:^|\s)=?)(?:after|analysis|and|array|barchart|barwidth|begingraph|by|call|cas|cbarline|cfill|class(?:lev)?|close|column|computed?|contains|continue|data(?==)|define|delete|describe|document|do\s+over|do|dol|drop|dul|else|end(?:comp|source)?|entryTitle|eval(?:uate)?|exec(?:ute)?|exit|file(?:name)?|fill(?:attrs)?|flist|fnc|function(?:list)?|global|goto|group(?:by)?|headline|headskip|histogram|if|infile|keep|keylabel|keyword|label|layout|leave|legendlabel|length|libname|loadactionset|merge|midpoints|_?null_|name|noobs|nowd|ods|options|or|otherwise|out(?:put)?|over(?:lay)?|plot|print|put|raise|ranexp|rannor|rbreak|retain|return|select|session|sessref|set|source|statgraph|sum|summarize|table|temp|terminate|then\s+do|then|title\d?|to|var|when|where|xaxisopts|y2axisopts|yaxisopts)\b/i,lookbehind:!0};n.languages.sas={datalines:{pattern:/^([ \t]*)(?:cards|(?:data)?lines);[\s\S]+?^[ \t]*;/im,lookbehind:!0,alias:"string",inside:{keyword:{pattern:/^(?:cards|(?:data)?lines)/i},punctuation:/;/}},"proc-sql":{pattern:/(^proc\s+(?:fed)?sql(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{sql:{pattern:RegExp(/^[ \t]*(?:select|alter\s+table|(?:create|describe|drop)\s+(?:index|table(?:\s+constraints)?|view)|create\s+unique\s+index|insert\s+into|update)(?:|[^;"'])+;/.source.replace(//g,function(){return r}),"im"),alias:"language-sql",inside:n.languages.sql},"global-statements":w,"sql-statements":{pattern:/(^|\s)(?:disconnect\s+from|begin|commit|exec(?:ute)?|reset|rollback|validate)\b/i,lookbehind:!0,alias:"keyword"},number:a,"numeric-constant":o,punctuation:d,string:u}},"proc-groovy":{pattern:/(^proc\s+groovy(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:c,groovy:{pattern:RegExp(/(^[ \t]*submit(?:\s+(?:load|norun|parseonly))?)(?:|[^"'])+?(?=endsubmit;)/.source.replace(//g,function(){return r}),"im"),lookbehind:!0,alias:"language-groovy",inside:n.languages.groovy},keyword:E,"submit-statement":v,"global-statements":w,number:a,"numeric-constant":o,punctuation:d,string:u}},"proc-lua":{pattern:/(^proc\s+lua(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:c,lua:{pattern:RegExp(/(^[ \t]*submit(?:\s+(?:load|norun|parseonly))?)(?:|[^"'])+?(?=endsubmit;)/.source.replace(//g,function(){return r}),"im"),lookbehind:!0,alias:"language-lua",inside:n.languages.lua},keyword:E,"submit-statement":v,"global-statements":w,number:a,"numeric-constant":o,punctuation:d,string:u}},"proc-cas":{pattern:/(^proc\s+cas(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|quit|data);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:c,"statement-var":{pattern:/((?:^|\s)=?)saveresult\s[^;]+/im,lookbehind:!0,inside:{statement:{pattern:/^saveresult\s+\S+/i,inside:{keyword:/^(?:saveresult)/i}},rest:m}},"cas-actions":S,statement:{pattern:/((?:^|\s)=?)(?:default|(?:un)?set|on|output|upload)[^;]+/im,lookbehind:!0,inside:m},step:l,keyword:E,function:g,format:b,altformat:y,"global-statements":w,number:a,"numeric-constant":o,punctuation:d,string:u}},"proc-args":{pattern:RegExp(/(^proc\s+\w+\s+)(?!\s)(?:[^;"']|)+;/.source.replace(//g,function(){return r}),"im"),lookbehind:!0,inside:m},"macro-keyword":s,"macro-variable":i,"macro-string-functions":{pattern:/((?:^|\s|=))%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)\(.*?(?:[^%]\))/i,lookbehind:!0,inside:{function:{pattern:/%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)/i,alias:"keyword"},"macro-keyword":s,"macro-variable":i,"escaped-char":{pattern:/%['"()<>=¬^~;,#]/},punctuation:d}},"macro-declaration":{pattern:/^%macro[^;]+(?=;)/im,inside:{keyword:/%macro/i}},"macro-end":{pattern:/^%mend[^;]+(?=;)/im,inside:{keyword:/%mend/i}},macro:{pattern:/%_\w+(?=\()/,alias:"keyword"},input:{pattern:/\binput\s[-\w\s/*.$&]+;/i,inside:{input:{alias:"keyword",pattern:/^input/i},comment:c,number:a,"numeric-constant":o}},"options-args":{pattern:/(^options)[-'"|/\\<>*+=:()\w\s]*(?=;)/im,lookbehind:!0,inside:m},"cas-actions":S,comment:c,function:g,format:b,altformat:y,"numeric-constant":o,datetime:{pattern:RegExp(r+"(?:dt?|t)"),alias:"number"},string:u,step:l,keyword:E,"operator-keyword":{pattern:/\b(?:eq|ge|gt|in|le|lt|ne|not)\b/i,alias:"operator"},number:a,operator:/\*\*?|\|\|?|!!?|¦¦?|<[>=]?|>[<=]?|[-+\/=&]|[~¬^]=?/,punctuation:d}})(t)}return E0}var x0,dM;function ISe(){if(dM)return x0;dM=1,x0=e,e.displayName="sass",e.aliases=[];function e(t){(function(n){n.languages.sass=n.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),n.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete n.languages.sass.atrule;var r=/\$[-\w]+|#\{\$[-\w]+\}/,a=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];n.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:r,operator:a}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:r,operator:a,important:n.languages.sass.important}}}),delete n.languages.sass.property,delete n.languages.sass.important,n.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})})(t)}return x0}var k0,fM;function OSe(){if(fM)return k0;fM=1;var e=IA();k0=t,t.displayName="scala",t.aliases=[];function t(n){n.register(e),n.languages.scala=n.languages.extend("java",{"triple-quoted-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:/<-|=>|\b(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|null|object|override|package|private|protected|return|sealed|self|super|this|throw|trait|try|type|val|var|while|with|yield)\b/,number:/\b0x(?:[\da-f]*\.)?[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e\d+)?[dfl]?/i,builtin:/\b(?:Any|AnyRef|AnyVal|Boolean|Byte|Char|Double|Float|Int|Long|Nothing|Short|String|Unit)\b/,symbol:/'[^\d\s\\]\w*/}),n.languages.insertBefore("scala","triple-quoted-string",{"string-interpolation":{pattern:/\b[a-z]\w*(?:"""(?:[^$]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*?"""|"(?:[^$"\r\n]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*")/i,greedy:!0,inside:{id:{pattern:/^\w+/,greedy:!0,alias:"function"},escape:{pattern:/\\\$"|\$[$"]/,greedy:!0,alias:"symbol"},interpolation:{pattern:/\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,greedy:!0,inside:{punctuation:/^\$\{?|\}$/,expression:{pattern:/[\s\S]+/,inside:n.languages.scala}}},string:/[\s\S]+/}}}),delete n.languages.scala["class-name"],delete n.languages.scala.function}return k0}var C0,pM;function DSe(){if(pM)return C0;pM=1,C0=e,e.displayName="scss",e.aliases=[];function e(t){t.languages.scss=t.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),t.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),t.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),t.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),t.languages.scss.atrule.inside.rest=t.languages.scss}return C0}var _0,gM;function LSe(){if(gM)return _0;gM=1;var e=az();_0=t,t.displayName="shellSession",t.aliases=[];function t(n){n.register(e),function(r){var a=[/"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/.source,/'[^']*'/.source,/\$'(?:[^'\\]|\\[\s\S])*'/.source,/<<-?\s*(["']?)(\w+)\1\s[\s\S]*?[\r\n]\2/.source].join("|");r.languages["shell-session"]={command:{pattern:RegExp(/^/.source+"(?:"+(/[^\s@:$#%*!/\\]+@[^\r\n@:$#%*!/\\]+(?::[^\0-\x1F$#%*?"<>:;|]+)?/.source+"|"+/[/~.][^\0-\x1F$#%*?"<>@:;|]*/.source)+")?"+/[$#%](?=\s)/.source+/(?:[^\\\r\n \t'"<$]|[ \t](?:(?!#)|#.*$)|\\(?:[^\r]|\r\n?)|\$(?!')|<(?!<)|<>)+/.source.replace(/<>/g,function(){return a}),"m"),greedy:!0,inside:{info:{pattern:/^[^#$%]+/,alias:"punctuation",inside:{user:/^[^\s@:$#%*!/\\]+@[^\r\n@:$#%*!/\\]+/,punctuation:/:/,path:/[\s\S]+/}},bash:{pattern:/(^[$#%]\s*)\S[\s\S]*/,lookbehind:!0,alias:"language-bash",inside:r.languages.bash},"shell-symbol":{pattern:/^[$#%]/,alias:"important"}}},output:/.(?:.*(?:[\r\n]|.$))*/},r.languages["sh-session"]=r.languages.shellsession=r.languages["shell-session"]}(n)}return _0}var A0,mM;function MSe(){if(mM)return A0;mM=1,A0=e,e.displayName="smali",e.aliases=[];function e(t){t.languages.smali={comment:/#.*/,string:{pattern:/"(?:[^\r\n\\"]|\\.)*"|'(?:[^\r\n\\']|\\(?:.|u[\da-fA-F]{4}))'/,greedy:!0},"class-name":{pattern:/(^|[^L])L(?:(?:\w+|`[^`\r\n]*`)\/)*(?:[\w$]+|`[^`\r\n]*`)(?=\s*;)/,lookbehind:!0,inside:{"class-name":{pattern:/(^L|\/)(?:[\w$]+|`[^`\r\n]*`)$/,lookbehind:!0},namespace:{pattern:/^(L)(?:(?:\w+|`[^`\r\n]*`)\/)+/,lookbehind:!0,inside:{punctuation:/\//}},builtin:/^L/}},builtin:[{pattern:/([();\[])[BCDFIJSVZ]+/,lookbehind:!0},{pattern:/([\w$>]:)[BCDFIJSVZ]/,lookbehind:!0}],keyword:[{pattern:/(\.end\s+)[\w-]+/,lookbehind:!0},{pattern:/(^|[^\w.-])\.(?!\d)[\w-]+/,lookbehind:!0},{pattern:/(^|[^\w.-])(?:abstract|annotation|bridge|constructor|enum|final|interface|private|protected|public|runtime|static|synthetic|system|transient)(?![\w.-])/,lookbehind:!0}],function:{pattern:/(^|[^\w.-])(?:\w+|<[\w$-]+>)(?=\()/,lookbehind:!0},field:{pattern:/[\w$]+(?=:)/,alias:"variable"},register:{pattern:/(^|[^\w.-])[vp]\d(?![\w.-])/,lookbehind:!0,alias:"variable"},boolean:{pattern:/(^|[^\w.-])(?:false|true)(?![\w.-])/,lookbehind:!0},number:{pattern:/(^|[^/\w.-])-?(?:NAN|INFINITY|0x(?:[\dA-F]+(?:\.[\dA-F]*)?|\.[\dA-F]+)(?:p[+-]?[\dA-F]+)?|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)[dflst]?(?![\w.-])/i,lookbehind:!0},label:{pattern:/(:)\w+/,lookbehind:!0,alias:"property"},operator:/->|\.\.|[\[=]/,punctuation:/[{}(),;:]/}}return A0}var T0,hM;function PSe(){if(hM)return T0;hM=1,T0=e,e.displayName="smalltalk",e.aliases=[];function e(t){t.languages.smalltalk={comment:{pattern:/"(?:""|[^"])*"/,greedy:!0},char:{pattern:/\$./,greedy:!0},string:{pattern:/'(?:''|[^'])*'/,greedy:!0},symbol:/#[\da-z]+|#(?:-|([+\/\\*~<>=@%|&?!])\1?)|#(?=\()/i,"block-arguments":{pattern:/(\[\s*):[^\[|]*\|/,lookbehind:!0,inside:{variable:/:[\da-z]+/i,punctuation:/\|/}},"temporary-variables":{pattern:/\|[^|]+\|/,inside:{variable:/[\da-z]+/i,punctuation:/\|/}},keyword:/\b(?:new|nil|self|super)\b/,boolean:/\b(?:false|true)\b/,number:[/\d+r-?[\dA-Z]+(?:\.[\dA-Z]+)?(?:e-?\d+)?/,/\b\d+(?:\.\d+)?(?:e-?\d+)?/],operator:/[<=]=?|:=|~[~=]|\/\/?|\\\\|>[>=]?|[!^+\-*&|,@]/,punctuation:/[.;:?\[\](){}]/}}return T0}var R0,bM;function $Se(){if(bM)return R0;bM=1;var e=mr();R0=t,t.displayName="smarty",t.aliases=[];function t(n){n.register(e),function(r){r.languages.smarty={comment:{pattern:/^\{\*[\s\S]*?\*\}/,greedy:!0},"embedded-php":{pattern:/^\{php\}[\s\S]*?\{\/php\}/,greedy:!0,inside:{smarty:{pattern:/^\{php\}|\{\/php\}$/,inside:null},php:{pattern:/[\s\S]+/,alias:"language-php",inside:r.languages.php}}},string:[{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0,inside:{interpolation:{pattern:/\{[^{}]*\}|`[^`]*`/,inside:{"interpolation-punctuation":{pattern:/^[{`]|[`}]$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}},variable:/\$\w+/}},{pattern:/'(?:\\.|[^'\\\r\n])*'/,greedy:!0}],keyword:{pattern:/(^\{\/?)[a-z_]\w*\b(?!\()/i,lookbehind:!0,greedy:!0},delimiter:{pattern:/^\{\/?|\}$/,greedy:!0,alias:"punctuation"},number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,variable:[/\$(?!\d)\w+/,/#(?!\d)\w+#/,{pattern:/(\.|->|\w\s*=)(?!\d)\w+\b(?!\()/,lookbehind:!0},{pattern:/(\[)(?!\d)\w+(?=\])/,lookbehind:!0}],function:{pattern:/(\|\s*)@?[a-z_]\w*|\b[a-z_]\w*(?=\()/i,lookbehind:!0},"attr-name":/\b[a-z_]\w*(?=\s*=)/i,boolean:/\b(?:false|no|off|on|true|yes)\b/,punctuation:/[\[\](){}.,:`]|->/,operator:[/[+\-*\/%]|==?=?|[!<>]=?|&&|\|\|?/,/\bis\s+(?:not\s+)?(?:div|even|odd)(?:\s+by)?\b/,/\b(?:and|eq|gt?e|gt|lt?e|lt|mod|neq?|not|or)\b/]},r.languages.smarty["embedded-php"].inside.smarty.inside=r.languages.smarty,r.languages.smarty.string[0].inside.interpolation.inside.expression.inside=r.languages.smarty;var a=/"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,o=RegExp(/\{\*[\s\S]*?\*\}/.source+"|"+/\{php\}[\s\S]*?\{\/php\}/.source+"|"+/\{(?:[^{}"']||\{(?:[^{}"']||\{(?:[^{}"']|)*\})*\})*\}/.source.replace(//g,function(){return a.source}),"g");r.hooks.add("before-tokenize",function(i){var s="{literal}",l="{/literal}",c=!1;r.languages["markup-templating"].buildPlaceholders(i,"smarty",o,function(u){return u===l&&(c=!1),c?!1:(u===s&&(c=!0),!0)})}),r.hooks.add("after-tokenize",function(i){r.languages["markup-templating"].tokenizePlaceholders(i,"smarty")})}(n)}return R0}var N0,yM;function FSe(){if(yM)return N0;yM=1,N0=e,e.displayName="sml",e.aliases=["smlnj"];function e(t){(function(n){var r=/\b(?:abstype|and|andalso|as|case|datatype|do|else|end|eqtype|exception|fn|fun|functor|handle|if|in|include|infix|infixr|let|local|nonfix|of|op|open|orelse|raise|rec|sharing|sig|signature|struct|structure|then|type|val|where|while|with|withtype)\b/i;n.languages.sml={comment:/\(\*(?:[^*(]|\*(?!\))|\((?!\*)|\(\*(?:[^*(]|\*(?!\))|\((?!\*))*\*\))*\*\)/,string:{pattern:/#?"(?:[^"\\]|\\.)*"/,greedy:!0},"class-name":[{pattern:RegExp(/((?:^|[^:]):\s*)(?:\s*(?:(?:\*|->)\s*|,\s*(?:(?=)|(?!)\s+)))*/.source.replace(//g,function(){return/\s*(?:[*,]|->)/.source}).replace(//g,function(){return/(?:'[\w']*||\((?:[^()]|\([^()]*\))*\)|\{(?:[^{}]|\{[^{}]*\})*\})(?:\s+)*/.source}).replace(//g,function(){return/(?!)[a-z\d_][\w'.]*/.source}).replace(//g,function(){return r.source}),"i"),lookbehind:!0,greedy:!0,inside:null},{pattern:/((?:^|[^\w'])(?:datatype|exception|functor|signature|structure|type)\s+)[a-z_][\w'.]*/i,lookbehind:!0}],function:{pattern:/((?:^|[^\w'])fun\s+)[a-z_][\w'.]*/i,lookbehind:!0},keyword:r,variable:{pattern:/(^|[^\w'])'[\w']*/,lookbehind:!0},number:/~?\b(?:\d+(?:\.\d+)?(?:e~?\d+)?|0x[\da-f]+)\b/i,word:{pattern:/\b0w(?:\d+|x[\da-f]+)\b/i,alias:"constant"},boolean:/\b(?:false|true)\b/i,operator:/\.\.\.|:[>=:]|=>?|->|[<>]=?|[!+\-*/^#|@~]/,punctuation:/[(){}\[\].:,;]/},n.languages.sml["class-name"][0].inside=n.languages.sml,n.languages.smlnj=n.languages.sml})(t)}return N0}var I0,vM;function jSe(){if(vM)return I0;vM=1,I0=e,e.displayName="solidity",e.aliases=["sol"];function e(t){t.languages.solidity=t.languages.extend("clike",{"class-name":{pattern:/(\b(?:contract|enum|interface|library|new|struct|using)\s+)(?!\d)[\w$]+/,lookbehind:!0},keyword:/\b(?:_|anonymous|as|assembly|assert|break|calldata|case|constant|constructor|continue|contract|default|delete|do|else|emit|enum|event|external|for|from|function|if|import|indexed|inherited|interface|internal|is|let|library|mapping|memory|modifier|new|payable|pragma|private|public|pure|require|returns?|revert|selfdestruct|solidity|storage|struct|suicide|switch|this|throw|using|var|view|while)\b/,operator:/=>|->|:=|=:|\*\*|\+\+|--|\|\||&&|<<=?|>>=?|[-+*/%^&|<>!=]=?|[~?]/}),t.languages.insertBefore("solidity","keyword",{builtin:/\b(?:address|bool|byte|u?int(?:8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?|string|bytes(?:[1-9]|[12]\d|3[0-2])?)\b/}),t.languages.insertBefore("solidity","number",{version:{pattern:/([<>]=?|\^)\d+\.\d+\.\d+\b/,lookbehind:!0,alias:"number"}}),t.languages.sol=t.languages.solidity}return I0}var O0,SM;function zSe(){if(SM)return O0;SM=1,O0=e,e.displayName="solutionFile",e.aliases=[];function e(t){(function(n){var r={pattern:/\{[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}\}/i,alias:"constant",inside:{punctuation:/[{}]/}};n.languages["solution-file"]={comment:{pattern:/#.*/,greedy:!0},string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,greedy:!0,inside:{guid:r}},object:{pattern:/^([ \t]*)(?:([A-Z]\w*)\b(?=.*(?:\r\n?|\n)(?:\1[ \t].*(?:\r\n?|\n))*\1End\2(?=[ \t]*$))|End[A-Z]\w*(?=[ \t]*$))/m,lookbehind:!0,greedy:!0,alias:"keyword"},property:{pattern:/^([ \t]*)(?!\s)[^\r\n"#=()]*[^\s"#=()](?=\s*=)/m,lookbehind:!0,inside:{guid:r}},guid:r,number:/\b\d+(?:\.\d+)*\b/,boolean:/\b(?:FALSE|TRUE)\b/,operator:/=/,punctuation:/[(),]/},n.languages.sln=n.languages["solution-file"]})(t)}return O0}var D0,wM;function USe(){if(wM)return D0;wM=1;var e=mr();D0=t,t.displayName="soy",t.aliases=[];function t(n){n.register(e),function(r){var a=/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,o=/\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-F]+\b/;r.languages.soy={comment:[/\/\*[\s\S]*?\*\//,{pattern:/(\s)\/\/.*/,lookbehind:!0,greedy:!0}],"command-arg":{pattern:/(\{+\/?\s*(?:alias|call|delcall|delpackage|deltemplate|namespace|template)\s+)\.?[\w.]+/,lookbehind:!0,alias:"string",inside:{punctuation:/\./}},parameter:{pattern:/(\{+\/?\s*@?param\??\s+)\.?[\w.]+/,lookbehind:!0,alias:"variable"},keyword:[{pattern:/(\{+\/?[^\S\r\n]*)(?:\\[nrt]|alias|call|case|css|default|delcall|delpackage|deltemplate|else(?:if)?|fallbackmsg|for(?:each)?|if(?:empty)?|lb|let|literal|msg|namespace|nil|@?param\??|rb|sp|switch|template|xid)/,lookbehind:!0},/\b(?:any|as|attributes|bool|css|float|html|in|int|js|list|map|null|number|string|uri)\b/],delimiter:{pattern:/^\{+\/?|\/?\}+$/,alias:"punctuation"},property:/\w+(?==)/,variable:{pattern:/\$[^\W\d]\w*(?:\??(?:\.\w+|\[[^\]]+\]))*/,inside:{string:{pattern:a,greedy:!0},number:o,punctuation:/[\[\].?]/}},string:{pattern:a,greedy:!0},function:[/\w+(?=\()/,{pattern:/(\|[^\S\r\n]*)\w+/,lookbehind:!0}],boolean:/\b(?:false|true)\b/,number:o,operator:/\?:?|<=?|>=?|==?|!=|[+*/%-]|\b(?:and|not|or)\b/,punctuation:/[{}()\[\]|.,:]/},r.hooks.add("before-tokenize",function(i){var s=/\{\{.+?\}\}|\{.+?\}|\s\/\/.*|\/\*[\s\S]*?\*\//g,l="{literal}",c="{/literal}",u=!1;r.languages["markup-templating"].buildPlaceholders(i,"soy",s,function(d){return d===c&&(u=!1),u?!1:(d===l&&(u=!0),!0)})}),r.hooks.add("after-tokenize",function(i){r.languages["markup-templating"].tokenizePlaceholders(i,"soy")})}(n)}return D0}var L0,EM;function lz(){if(EM)return L0;EM=1,L0=e,e.displayName="turtle",e.aliases=[];function e(t){t.languages.turtle={comment:{pattern:/#.*/,greedy:!0},"multiline-string":{pattern:/"""(?:(?:""?)?(?:[^"\\]|\\.))*"""|'''(?:(?:''?)?(?:[^'\\]|\\.))*'''/,greedy:!0,alias:"string",inside:{comment:/#.*/}},string:{pattern:/"(?:[^\\"\r\n]|\\.)*"|'(?:[^\\'\r\n]|\\.)*'/,greedy:!0},url:{pattern:/<(?:[^\x00-\x20<>"{}|^`\\]|\\(?:u[\da-fA-F]{4}|U[\da-fA-F]{8}))*>/,greedy:!0,inside:{punctuation:/[<>]/}},function:{pattern:/(?:(?![-.\d\xB7])[-.\w\xB7\xC0-\uFFFD]+)?:(?:(?![-.])(?:[-.:\w\xC0-\uFFFD]|%[\da-f]{2}|\\.)+)?/i,inside:{"local-name":{pattern:/([^:]*:)[\s\S]+/,lookbehind:!0},prefix:{pattern:/[\s\S]+/,inside:{punctuation:/:/}}}},number:/[+-]?\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,punctuation:/[{}.,;()[\]]|\^\^/,boolean:/\b(?:false|true)\b/,keyword:[/(?:\ba|@prefix|@base)\b|=/,/\b(?:base|graph|prefix)\b/i],tag:{pattern:/@[a-z]+(?:-[a-z\d]+)*/i,inside:{punctuation:/@/}}},t.languages.trig=t.languages.turtle}return L0}var M0,xM;function BSe(){if(xM)return M0;xM=1;var e=lz();M0=t,t.displayName="sparql",t.aliases=["rq"];function t(n){n.register(e),n.languages.sparql=n.languages.extend("turtle",{boolean:/\b(?:false|true)\b/i,variable:{pattern:/[?$]\w+/,greedy:!0}}),n.languages.insertBefore("sparql","punctuation",{keyword:[/\b(?:A|ADD|ALL|AS|ASC|ASK|BNODE|BY|CLEAR|CONSTRUCT|COPY|CREATE|DATA|DEFAULT|DELETE|DESC|DESCRIBE|DISTINCT|DROP|EXISTS|FILTER|FROM|GROUP|HAVING|INSERT|INTO|LIMIT|LOAD|MINUS|MOVE|NAMED|NOT|NOW|OFFSET|OPTIONAL|ORDER|RAND|REDUCED|SELECT|SEPARATOR|SERVICE|SILENT|STRUUID|UNION|USING|UUID|VALUES|WHERE)\b/i,/\b(?:ABS|AVG|BIND|BOUND|CEIL|COALESCE|CONCAT|CONTAINS|COUNT|DATATYPE|DAY|ENCODE_FOR_URI|FLOOR|GROUP_CONCAT|HOURS|IF|IRI|isBLANK|isIRI|isLITERAL|isNUMERIC|isURI|LANG|LANGMATCHES|LCASE|MAX|MD5|MIN|MINUTES|MONTH|REGEX|REPLACE|ROUND|sameTerm|SAMPLE|SECONDS|SHA1|SHA256|SHA384|SHA512|STR|STRAFTER|STRBEFORE|STRDT|STRENDS|STRLANG|STRLEN|STRSTARTS|SUBSTR|SUM|TIMEZONE|TZ|UCASE|URI|YEAR)\b(?=\s*\()/i,/\b(?:BASE|GRAPH|PREFIX)\b/i]}),n.languages.rq=n.languages.sparql}return M0}var P0,kM;function HSe(){if(kM)return P0;kM=1,P0=e,e.displayName="splunkSpl",e.aliases=[];function e(t){t.languages["splunk-spl"]={comment:/`comment\("(?:\\.|[^\\"])*"\)`/,string:{pattern:/"(?:\\.|[^\\"])*"/,greedy:!0},keyword:/\b(?:abstract|accum|addcoltotals|addinfo|addtotals|analyzefields|anomalies|anomalousvalue|anomalydetection|append|appendcols|appendcsv|appendlookup|appendpipe|arules|associate|audit|autoregress|bin|bucket|bucketdir|chart|cluster|cofilter|collect|concurrency|contingency|convert|correlate|datamodel|dbinspect|dedup|delete|delta|diff|erex|eval|eventcount|eventstats|extract|fieldformat|fields|fieldsummary|filldown|fillnull|findtypes|folderize|foreach|format|from|gauge|gentimes|geom|geomfilter|geostats|head|highlight|history|iconify|input|inputcsv|inputlookup|iplocation|join|kmeans|kv|kvform|loadjob|localize|localop|lookup|makecontinuous|makemv|makeresults|map|mcollect|metadata|metasearch|meventcollect|mstats|multikv|multisearch|mvcombine|mvexpand|nomv|outlier|outputcsv|outputlookup|outputtext|overlap|pivot|predict|rangemap|rare|regex|relevancy|reltime|rename|replace|rest|return|reverse|rex|rtorder|run|savedsearch|script|scrub|search|searchtxn|selfjoin|sendemail|set|setfields|sichart|sirare|sistats|sitimechart|sitop|sort|spath|stats|strcat|streamstats|table|tags|tail|timechart|timewrap|top|transaction|transpose|trendline|tscollect|tstats|typeahead|typelearner|typer|union|uniq|untable|where|x11|xmlkv|xmlunescape|xpath|xyseries)\b/i,"operator-word":{pattern:/\b(?:and|as|by|not|or|xor)\b/i,alias:"operator"},function:/\b\w+(?=\s*\()/,property:/\b\w+(?=\s*=(?!=))/,date:{pattern:/\b\d{1,2}\/\d{1,2}\/\d{1,4}(?:(?::\d{1,2}){3})?\b/,alias:"number"},number:/\b\d+(?:\.\d+)?\b/,boolean:/\b(?:f|false|t|true)\b/i,operator:/[<>=]=?|[-+*/%|]/,punctuation:/[()[\],]/}}return P0}var $0,CM;function VSe(){if(CM)return $0;CM=1,$0=e,e.displayName="sqf",e.aliases=[];function e(t){t.languages.sqf=t.languages.extend("clike",{string:{pattern:/"(?:(?:"")?[^"])*"(?!")|'(?:[^'])*'/,greedy:!0},keyword:/\b(?:breakOut|breakTo|call|case|catch|default|do|echo|else|execFSM|execVM|exitWith|for|forEach|forEachMember|forEachMemberAgent|forEachMemberTeam|from|goto|if|nil|preprocessFile|preprocessFileLineNumbers|private|scopeName|spawn|step|switch|then|throw|to|try|while|with)\b/i,boolean:/\b(?:false|true)\b/i,function:/\b(?:abs|accTime|acos|action|actionIDs|actionKeys|actionKeysImages|actionKeysNames|actionKeysNamesArray|actionName|actionParams|activateAddons|activatedAddons|activateKey|add3DENConnection|add3DENEventHandler|add3DENLayer|addAction|addBackpack|addBackpackCargo|addBackpackCargoGlobal|addBackpackGlobal|addCamShake|addCuratorAddons|addCuratorCameraArea|addCuratorEditableObjects|addCuratorEditingArea|addCuratorPoints|addEditorObject|addEventHandler|addForce|addForceGeneratorRTD|addGoggles|addGroupIcon|addHandgunItem|addHeadgear|addItem|addItemCargo|addItemCargoGlobal|addItemPool|addItemToBackpack|addItemToUniform|addItemToVest|addLiveStats|addMagazine|addMagazineAmmoCargo|addMagazineCargo|addMagazineCargoGlobal|addMagazineGlobal|addMagazinePool|addMagazines|addMagazineTurret|addMenu|addMenuItem|addMissionEventHandler|addMPEventHandler|addMusicEventHandler|addOwnedMine|addPlayerScores|addPrimaryWeaponItem|addPublicVariableEventHandler|addRating|addResources|addScore|addScoreSide|addSecondaryWeaponItem|addSwitchableUnit|addTeamMember|addToRemainsCollector|addTorque|addUniform|addVehicle|addVest|addWaypoint|addWeapon|addWeaponCargo|addWeaponCargoGlobal|addWeaponGlobal|addWeaponItem|addWeaponPool|addWeaponTurret|admin|agent|agents|AGLToASL|aimedAtTarget|aimPos|airDensityCurveRTD|airDensityRTD|airplaneThrottle|airportSide|AISFinishHeal|alive|all3DENEntities|allAirports|allControls|allCurators|allCutLayers|allDead|allDeadMen|allDisplays|allGroups|allMapMarkers|allMines|allMissionObjects|allow3DMode|allowCrewInImmobile|allowCuratorLogicIgnoreAreas|allowDamage|allowDammage|allowFileOperations|allowFleeing|allowGetIn|allowSprint|allPlayers|allSimpleObjects|allSites|allTurrets|allUnits|allUnitsUAV|allVariables|ammo|ammoOnPylon|animate|animateBay|animateDoor|animatePylon|animateSource|animationNames|animationPhase|animationSourcePhase|animationState|append|apply|armoryPoints|arrayIntersect|asin|ASLToAGL|ASLToATL|assert|assignAsCargo|assignAsCargoIndex|assignAsCommander|assignAsDriver|assignAsGunner|assignAsTurret|assignCurator|assignedCargo|assignedCommander|assignedDriver|assignedGunner|assignedItems|assignedTarget|assignedTeam|assignedVehicle|assignedVehicleRole|assignItem|assignTeam|assignToAirport|atan|atan2|atg|ATLToASL|attachedObject|attachedObjects|attachedTo|attachObject|attachTo|attackEnabled|backpack|backpackCargo|backpackContainer|backpackItems|backpackMagazines|backpackSpaceFor|behaviour|benchmark|binocular|blufor|boundingBox|boundingBoxReal|boundingCenter|briefingName|buildingExit|buildingPos|buldozer_EnableRoadDiag|buldozer_IsEnabledRoadDiag|buldozer_LoadNewRoads|buldozer_reloadOperMap|buttonAction|buttonSetAction|cadetMode|callExtension|camCommand|camCommit|camCommitPrepared|camCommitted|camConstuctionSetParams|camCreate|camDestroy|cameraEffect|cameraEffectEnableHUD|cameraInterest|cameraOn|cameraView|campaignConfigFile|camPreload|camPreloaded|camPrepareBank|camPrepareDir|camPrepareDive|camPrepareFocus|camPrepareFov|camPrepareFovRange|camPreparePos|camPrepareRelPos|camPrepareTarget|camSetBank|camSetDir|camSetDive|camSetFocus|camSetFov|camSetFovRange|camSetPos|camSetRelPos|camSetTarget|camTarget|camUseNVG|canAdd|canAddItemToBackpack|canAddItemToUniform|canAddItemToVest|cancelSimpleTaskDestination|canFire|canMove|canSlingLoad|canStand|canSuspend|canTriggerDynamicSimulation|canUnloadInCombat|canVehicleCargo|captive|captiveNum|cbChecked|cbSetChecked|ceil|channelEnabled|cheatsEnabled|checkAIFeature|checkVisibility|civilian|className|clear3DENAttribute|clear3DENInventory|clearAllItemsFromBackpack|clearBackpackCargo|clearBackpackCargoGlobal|clearForcesRTD|clearGroupIcons|clearItemCargo|clearItemCargoGlobal|clearItemPool|clearMagazineCargo|clearMagazineCargoGlobal|clearMagazinePool|clearOverlay|clearRadio|clearVehicleInit|clearWeaponCargo|clearWeaponCargoGlobal|clearWeaponPool|clientOwner|closeDialog|closeDisplay|closeOverlay|collapseObjectTree|collect3DENHistory|collectiveRTD|combatMode|commandArtilleryFire|commandChat|commander|commandFire|commandFollow|commandFSM|commandGetOut|commandingMenu|commandMove|commandRadio|commandStop|commandSuppressiveFire|commandTarget|commandWatch|comment|commitOverlay|compile|compileFinal|completedFSM|composeText|configClasses|configFile|configHierarchy|configName|configNull|configProperties|configSourceAddonList|configSourceMod|configSourceModList|confirmSensorTarget|connectTerminalToUAV|controlNull|controlsGroupCtrl|copyFromClipboard|copyToClipboard|copyWaypoints|cos|count|countEnemy|countFriendly|countSide|countType|countUnknown|create3DENComposition|create3DENEntity|createAgent|createCenter|createDialog|createDiaryLink|createDiaryRecord|createDiarySubject|createDisplay|createGearDialog|createGroup|createGuardedPoint|createLocation|createMarker|createMarkerLocal|createMenu|createMine|createMissionDisplay|createMPCampaignDisplay|createSimpleObject|createSimpleTask|createSite|createSoundSource|createTask|createTeam|createTrigger|createUnit|createVehicle|createVehicleCrew|createVehicleLocal|crew|ctAddHeader|ctAddRow|ctClear|ctCurSel|ctData|ctFindHeaderRows|ctFindRowHeader|ctHeaderControls|ctHeaderCount|ctRemoveHeaders|ctRemoveRows|ctrlActivate|ctrlAddEventHandler|ctrlAngle|ctrlAutoScrollDelay|ctrlAutoScrollRewind|ctrlAutoScrollSpeed|ctrlChecked|ctrlClassName|ctrlCommit|ctrlCommitted|ctrlCreate|ctrlDelete|ctrlEnable|ctrlEnabled|ctrlFade|ctrlHTMLLoaded|ctrlIDC|ctrlIDD|ctrlMapAnimAdd|ctrlMapAnimClear|ctrlMapAnimCommit|ctrlMapAnimDone|ctrlMapCursor|ctrlMapMouseOver|ctrlMapScale|ctrlMapScreenToWorld|ctrlMapWorldToScreen|ctrlModel|ctrlModelDirAndUp|ctrlModelScale|ctrlParent|ctrlParentControlsGroup|ctrlPosition|ctrlRemoveAllEventHandlers|ctrlRemoveEventHandler|ctrlScale|ctrlSetActiveColor|ctrlSetAngle|ctrlSetAutoScrollDelay|ctrlSetAutoScrollRewind|ctrlSetAutoScrollSpeed|ctrlSetBackgroundColor|ctrlSetChecked|ctrlSetDisabledColor|ctrlSetEventHandler|ctrlSetFade|ctrlSetFocus|ctrlSetFont|ctrlSetFontH1|ctrlSetFontH1B|ctrlSetFontH2|ctrlSetFontH2B|ctrlSetFontH3|ctrlSetFontH3B|ctrlSetFontH4|ctrlSetFontH4B|ctrlSetFontH5|ctrlSetFontH5B|ctrlSetFontH6|ctrlSetFontH6B|ctrlSetFontHeight|ctrlSetFontHeightH1|ctrlSetFontHeightH2|ctrlSetFontHeightH3|ctrlSetFontHeightH4|ctrlSetFontHeightH5|ctrlSetFontHeightH6|ctrlSetFontHeightSecondary|ctrlSetFontP|ctrlSetFontPB|ctrlSetFontSecondary|ctrlSetForegroundColor|ctrlSetModel|ctrlSetModelDirAndUp|ctrlSetModelScale|ctrlSetPixelPrecision|ctrlSetPosition|ctrlSetScale|ctrlSetStructuredText|ctrlSetText|ctrlSetTextColor|ctrlSetTextColorSecondary|ctrlSetTextSecondary|ctrlSetTooltip|ctrlSetTooltipColorBox|ctrlSetTooltipColorShade|ctrlSetTooltipColorText|ctrlShow|ctrlShown|ctrlText|ctrlTextHeight|ctrlTextSecondary|ctrlTextWidth|ctrlType|ctrlVisible|ctRowControls|ctRowCount|ctSetCurSel|ctSetData|ctSetHeaderTemplate|ctSetRowTemplate|ctSetValue|ctValue|curatorAddons|curatorCamera|curatorCameraArea|curatorCameraAreaCeiling|curatorCoef|curatorEditableObjects|curatorEditingArea|curatorEditingAreaType|curatorMouseOver|curatorPoints|curatorRegisteredObjects|curatorSelected|curatorWaypointCost|current3DENOperation|currentChannel|currentCommand|currentMagazine|currentMagazineDetail|currentMagazineDetailTurret|currentMagazineTurret|currentMuzzle|currentNamespace|currentTask|currentTasks|currentThrowable|currentVisionMode|currentWaypoint|currentWeapon|currentWeaponMode|currentWeaponTurret|currentZeroing|cursorObject|cursorTarget|customChat|customRadio|cutFadeOut|cutObj|cutRsc|cutText|damage|date|dateToNumber|daytime|deActivateKey|debriefingText|debugFSM|debugLog|deg|delete3DENEntities|deleteAt|deleteCenter|deleteCollection|deleteEditorObject|deleteGroup|deleteGroupWhenEmpty|deleteIdentity|deleteLocation|deleteMarker|deleteMarkerLocal|deleteRange|deleteResources|deleteSite|deleteStatus|deleteTeam|deleteVehicle|deleteVehicleCrew|deleteWaypoint|detach|detectedMines|diag_activeMissionFSMs|diag_activeScripts|diag_activeSQFScripts|diag_activeSQSScripts|diag_captureFrame|diag_captureFrameToFile|diag_captureSlowFrame|diag_codePerformance|diag_drawMode|diag_dynamicSimulationEnd|diag_enable|diag_enabled|diag_fps|diag_fpsMin|diag_frameNo|diag_lightNewLoad|diag_list|diag_log|diag_logSlowFrame|diag_mergeConfigFile|diag_recordTurretLimits|diag_setLightNew|diag_tickTime|diag_toggle|dialog|diarySubjectExists|didJIP|didJIPOwner|difficulty|difficultyEnabled|difficultyEnabledRTD|difficultyOption|direction|directSay|disableAI|disableCollisionWith|disableConversation|disableDebriefingStats|disableMapIndicators|disableNVGEquipment|disableRemoteSensors|disableSerialization|disableTIEquipment|disableUAVConnectability|disableUserInput|displayAddEventHandler|displayCtrl|displayNull|displayParent|displayRemoveAllEventHandlers|displayRemoveEventHandler|displaySetEventHandler|dissolveTeam|distance|distance2D|distanceSqr|distributionRegion|do3DENAction|doArtilleryFire|doFire|doFollow|doFSM|doGetOut|doMove|doorPhase|doStop|doSuppressiveFire|doTarget|doWatch|drawArrow|drawEllipse|drawIcon|drawIcon3D|drawLine|drawLine3D|drawLink|drawLocation|drawPolygon|drawRectangle|drawTriangle|driver|drop|dynamicSimulationDistance|dynamicSimulationDistanceCoef|dynamicSimulationEnabled|dynamicSimulationSystemEnabled|east|edit3DENMissionAttributes|editObject|editorSetEventHandler|effectiveCommander|emptyPositions|enableAI|enableAIFeature|enableAimPrecision|enableAttack|enableAudioFeature|enableAutoStartUpRTD|enableAutoTrimRTD|enableCamShake|enableCaustics|enableChannel|enableCollisionWith|enableCopilot|enableDebriefingStats|enableDiagLegend|enableDynamicSimulation|enableDynamicSimulationSystem|enableEndDialog|enableEngineArtillery|enableEnvironment|enableFatigue|enableGunLights|enableInfoPanelComponent|enableIRLasers|enableMimics|enablePersonTurret|enableRadio|enableReload|enableRopeAttach|enableSatNormalOnDetail|enableSaving|enableSentences|enableSimulation|enableSimulationGlobal|enableStamina|enableStressDamage|enableTeamSwitch|enableTraffic|enableUAVConnectability|enableUAVWaypoints|enableVehicleCargo|enableVehicleSensor|enableWeaponDisassembly|endl|endLoadingScreen|endMission|engineOn|enginesIsOnRTD|enginesPowerRTD|enginesRpmRTD|enginesTorqueRTD|entities|environmentEnabled|estimatedEndServerTime|estimatedTimeLeft|evalObjectArgument|everyBackpack|everyContainer|exec|execEditorScript|exp|expectedDestination|exportJIPMessages|eyeDirection|eyePos|face|faction|fadeMusic|fadeRadio|fadeSound|fadeSpeech|failMission|fillWeaponsFromPool|find|findCover|findDisplay|findEditorObject|findEmptyPosition|findEmptyPositionReady|findIf|findNearestEnemy|finishMissionInit|finite|fire|fireAtTarget|firstBackpack|flag|flagAnimationPhase|flagOwner|flagSide|flagTexture|fleeing|floor|flyInHeight|flyInHeightASL|fog|fogForecast|fogParams|forceAddUniform|forceAtPositionRTD|forcedMap|forceEnd|forceFlagTexture|forceFollowRoad|forceGeneratorRTD|forceMap|forceRespawn|forceSpeed|forceWalk|forceWeaponFire|forceWeatherChange|forgetTarget|format|formation|formationDirection|formationLeader|formationMembers|formationPosition|formationTask|formatText|formLeader|freeLook|fromEditor|fuel|fullCrew|gearIDCAmmoCount|gearSlotAmmoCount|gearSlotData|get3DENActionState|get3DENAttribute|get3DENCamera|get3DENConnections|get3DENEntity|get3DENEntityID|get3DENGrid|get3DENIconsVisible|get3DENLayerEntities|get3DENLinesVisible|get3DENMissionAttribute|get3DENMouseOver|get3DENSelected|getAimingCoef|getAllEnvSoundControllers|getAllHitPointsDamage|getAllOwnedMines|getAllSoundControllers|getAmmoCargo|getAnimAimPrecision|getAnimSpeedCoef|getArray|getArtilleryAmmo|getArtilleryComputerSettings|getArtilleryETA|getAssignedCuratorLogic|getAssignedCuratorUnit|getBackpackCargo|getBleedingRemaining|getBurningValue|getCameraViewDirection|getCargoIndex|getCenterOfMass|getClientState|getClientStateNumber|getCompatiblePylonMagazines|getConnectedUAV|getContainerMaxLoad|getCursorObjectParams|getCustomAimCoef|getDammage|getDescription|getDir|getDirVisual|getDLCAssetsUsage|getDLCAssetsUsageByName|getDLCs|getDLCUsageTime|getEditorCamera|getEditorMode|getEditorObjectScope|getElevationOffset|getEngineTargetRpmRTD|getEnvSoundController|getFatigue|getFieldManualStartPage|getForcedFlagTexture|getFriend|getFSMVariable|getFuelCargo|getGroupIcon|getGroupIconParams|getGroupIcons|getHideFrom|getHit|getHitIndex|getHitPointDamage|getItemCargo|getMagazineCargo|getMarkerColor|getMarkerPos|getMarkerSize|getMarkerType|getMass|getMissionConfig|getMissionConfigValue|getMissionDLCs|getMissionLayerEntities|getMissionLayers|getModelInfo|getMousePosition|getMusicPlayedTime|getNumber|getObjectArgument|getObjectChildren|getObjectDLC|getObjectMaterials|getObjectProxy|getObjectTextures|getObjectType|getObjectViewDistance|getOxygenRemaining|getPersonUsedDLCs|getPilotCameraDirection|getPilotCameraPosition|getPilotCameraRotation|getPilotCameraTarget|getPlateNumber|getPlayerChannel|getPlayerScores|getPlayerUID|getPlayerUIDOld|getPos|getPosASL|getPosASLVisual|getPosASLW|getPosATL|getPosATLVisual|getPosVisual|getPosWorld|getPylonMagazines|getRelDir|getRelPos|getRemoteSensorsDisabled|getRepairCargo|getResolution|getRotorBrakeRTD|getShadowDistance|getShotParents|getSlingLoad|getSoundController|getSoundControllerResult|getSpeed|getStamina|getStatValue|getSuppression|getTerrainGrid|getTerrainHeightASL|getText|getTotalDLCUsageTime|getTrimOffsetRTD|getUnitLoadout|getUnitTrait|getUserMFDText|getUserMFDValue|getVariable|getVehicleCargo|getWeaponCargo|getWeaponSway|getWingsOrientationRTD|getWingsPositionRTD|getWPPos|glanceAt|globalChat|globalRadio|goggles|group|groupChat|groupFromNetId|groupIconSelectable|groupIconsVisible|groupId|groupOwner|groupRadio|groupSelectedUnits|groupSelectUnit|grpNull|gunner|gusts|halt|handgunItems|handgunMagazine|handgunWeapon|handsHit|hasInterface|hasPilotCamera|hasWeapon|hcAllGroups|hcGroupParams|hcLeader|hcRemoveAllGroups|hcRemoveGroup|hcSelected|hcSelectGroup|hcSetGroup|hcShowBar|hcShownBar|headgear|hideBody|hideObject|hideObjectGlobal|hideSelection|hint|hintC|hintCadet|hintSilent|hmd|hostMission|htmlLoad|HUDMovementLevels|humidity|image|importAllGroups|importance|in|inArea|inAreaArray|incapacitatedState|independent|inflame|inflamed|infoPanel|infoPanelComponentEnabled|infoPanelComponents|infoPanels|inGameUISetEventHandler|inheritsFrom|initAmbientLife|inPolygon|inputAction|inRangeOfArtillery|insertEditorObject|intersect|is3DEN|is3DENMultiplayer|isAbleToBreathe|isAgent|isAimPrecisionEnabled|isArray|isAutoHoverOn|isAutonomous|isAutoStartUpEnabledRTD|isAutotest|isAutoTrimOnRTD|isBleeding|isBurning|isClass|isCollisionLightOn|isCopilotEnabled|isDamageAllowed|isDedicated|isDLCAvailable|isEngineOn|isEqualTo|isEqualType|isEqualTypeAll|isEqualTypeAny|isEqualTypeArray|isEqualTypeParams|isFilePatchingEnabled|isFlashlightOn|isFlatEmpty|isForcedWalk|isFormationLeader|isGroupDeletedWhenEmpty|isHidden|isInRemainsCollector|isInstructorFigureEnabled|isIRLaserOn|isKeyActive|isKindOf|isLaserOn|isLightOn|isLocalized|isManualFire|isMarkedForCollection|isMultiplayer|isMultiplayerSolo|isNil|isNull|isNumber|isObjectHidden|isObjectRTD|isOnRoad|isPipEnabled|isPlayer|isRealTime|isRemoteExecuted|isRemoteExecutedJIP|isServer|isShowing3DIcons|isSimpleObject|isSprintAllowed|isStaminaEnabled|isSteamMission|isStreamFriendlyUIEnabled|isStressDamageEnabled|isText|isTouchingGround|isTurnedOut|isTutHintsEnabled|isUAVConnectable|isUAVConnected|isUIContext|isUniformAllowed|isVehicleCargo|isVehicleRadarOn|isVehicleSensorEnabled|isWalking|isWeaponDeployed|isWeaponRested|itemCargo|items|itemsWithMagazines|join|joinAs|joinAsSilent|joinSilent|joinString|kbAddDatabase|kbAddDatabaseTargets|kbAddTopic|kbHasTopic|kbReact|kbRemoveTopic|kbTell|kbWasSaid|keyImage|keyName|knowsAbout|land|landAt|landResult|language|laserTarget|lbAdd|lbClear|lbColor|lbColorRight|lbCurSel|lbData|lbDelete|lbIsSelected|lbPicture|lbPictureRight|lbSelection|lbSetColor|lbSetColorRight|lbSetCurSel|lbSetData|lbSetPicture|lbSetPictureColor|lbSetPictureColorDisabled|lbSetPictureColorSelected|lbSetPictureRight|lbSetPictureRightColor|lbSetPictureRightColorDisabled|lbSetPictureRightColorSelected|lbSetSelectColor|lbSetSelectColorRight|lbSetSelected|lbSetText|lbSetTextRight|lbSetTooltip|lbSetValue|lbSize|lbSort|lbSortByValue|lbText|lbTextRight|lbValue|leader|leaderboardDeInit|leaderboardGetRows|leaderboardInit|leaderboardRequestRowsFriends|leaderboardRequestRowsGlobal|leaderboardRequestRowsGlobalAroundUser|leaderboardsRequestUploadScore|leaderboardsRequestUploadScoreKeepBest|leaderboardState|leaveVehicle|libraryCredits|libraryDisclaimers|lifeState|lightAttachObject|lightDetachObject|lightIsOn|lightnings|limitSpeed|linearConversion|lineBreak|lineIntersects|lineIntersectsObjs|lineIntersectsSurfaces|lineIntersectsWith|linkItem|list|listObjects|listRemoteTargets|listVehicleSensors|ln|lnbAddArray|lnbAddColumn|lnbAddRow|lnbClear|lnbColor|lnbColorRight|lnbCurSelRow|lnbData|lnbDeleteColumn|lnbDeleteRow|lnbGetColumnsPosition|lnbPicture|lnbPictureRight|lnbSetColor|lnbSetColorRight|lnbSetColumnsPos|lnbSetCurSelRow|lnbSetData|lnbSetPicture|lnbSetPictureColor|lnbSetPictureColorRight|lnbSetPictureColorSelected|lnbSetPictureColorSelectedRight|lnbSetPictureRight|lnbSetText|lnbSetTextRight|lnbSetValue|lnbSize|lnbSort|lnbSortByValue|lnbText|lnbTextRight|lnbValue|load|loadAbs|loadBackpack|loadFile|loadGame|loadIdentity|loadMagazine|loadOverlay|loadStatus|loadUniform|loadVest|local|localize|locationNull|locationPosition|lock|lockCameraTo|lockCargo|lockDriver|locked|lockedCargo|lockedDriver|lockedTurret|lockIdentity|lockTurret|lockWP|log|logEntities|logNetwork|logNetworkTerminate|lookAt|lookAtPos|magazineCargo|magazines|magazinesAllTurrets|magazinesAmmo|magazinesAmmoCargo|magazinesAmmoFull|magazinesDetail|magazinesDetailBackpack|magazinesDetailUniform|magazinesDetailVest|magazinesTurret|magazineTurretAmmo|mapAnimAdd|mapAnimClear|mapAnimCommit|mapAnimDone|mapCenterOnCamera|mapGridPosition|markAsFinishedOnSteam|markerAlpha|markerBrush|markerColor|markerDir|markerPos|markerShape|markerSize|markerText|markerType|max|members|menuAction|menuAdd|menuChecked|menuClear|menuCollapse|menuData|menuDelete|menuEnable|menuEnabled|menuExpand|menuHover|menuPicture|menuSetAction|menuSetCheck|menuSetData|menuSetPicture|menuSetValue|menuShortcut|menuShortcutText|menuSize|menuSort|menuText|menuURL|menuValue|min|mineActive|mineDetectedBy|missionConfigFile|missionDifficulty|missionName|missionNamespace|missionStart|missionVersion|modelToWorld|modelToWorldVisual|modelToWorldVisualWorld|modelToWorldWorld|modParams|moonIntensity|moonPhase|morale|move|move3DENCamera|moveInAny|moveInCargo|moveInCommander|moveInDriver|moveInGunner|moveInTurret|moveObjectToEnd|moveOut|moveTime|moveTo|moveToCompleted|moveToFailed|musicVolume|name|nameSound|nearEntities|nearestBuilding|nearestLocation|nearestLocations|nearestLocationWithDubbing|nearestObject|nearestObjects|nearestTerrainObjects|nearObjects|nearObjectsReady|nearRoads|nearSupplies|nearTargets|needReload|netId|netObjNull|newOverlay|nextMenuItemIndex|nextWeatherChange|nMenuItems|numberOfEnginesRTD|numberToDate|objectCurators|objectFromNetId|objectParent|objNull|objStatus|onBriefingGear|onBriefingGroup|onBriefingNotes|onBriefingPlan|onBriefingTeamSwitch|onCommandModeChanged|onDoubleClick|onEachFrame|onGroupIconClick|onGroupIconOverEnter|onGroupIconOverLeave|onHCGroupSelectionChanged|onMapSingleClick|onPlayerConnected|onPlayerDisconnected|onPreloadFinished|onPreloadStarted|onShowNewObject|onTeamSwitch|openCuratorInterface|openDLCPage|openDSInterface|openMap|openSteamApp|openYoutubeVideo|opfor|orderGetIn|overcast|overcastForecast|owner|param|params|parseNumber|parseSimpleArray|parseText|parsingNamespace|particlesQuality|pi|pickWeaponPool|pitch|pixelGrid|pixelGridBase|pixelGridNoUIScale|pixelH|pixelW|playableSlotsNumber|playableUnits|playAction|playActionNow|player|playerRespawnTime|playerSide|playersNumber|playGesture|playMission|playMove|playMoveNow|playMusic|playScriptedMission|playSound|playSound3D|position|positionCameraToWorld|posScreenToWorld|posWorldToScreen|ppEffectAdjust|ppEffectCommit|ppEffectCommitted|ppEffectCreate|ppEffectDestroy|ppEffectEnable|ppEffectEnabled|ppEffectForceInNVG|precision|preloadCamera|preloadObject|preloadSound|preloadTitleObj|preloadTitleRsc|primaryWeapon|primaryWeaponItems|primaryWeaponMagazine|priority|processDiaryLink|processInitCommands|productVersion|profileName|profileNamespace|profileNameSteam|progressLoadingScreen|progressPosition|progressSetPosition|publicVariable|publicVariableClient|publicVariableServer|pushBack|pushBackUnique|putWeaponPool|queryItemsPool|queryMagazinePool|queryWeaponPool|rad|radioChannelAdd|radioChannelCreate|radioChannelRemove|radioChannelSetCallSign|radioChannelSetLabel|radioVolume|rain|rainbow|random|rank|rankId|rating|rectangular|registeredTasks|registerTask|reload|reloadEnabled|remoteControl|remoteExec|remoteExecCall|remoteExecutedOwner|remove3DENConnection|remove3DENEventHandler|remove3DENLayer|removeAction|removeAll3DENEventHandlers|removeAllActions|removeAllAssignedItems|removeAllContainers|removeAllCuratorAddons|removeAllCuratorCameraAreas|removeAllCuratorEditingAreas|removeAllEventHandlers|removeAllHandgunItems|removeAllItems|removeAllItemsWithMagazines|removeAllMissionEventHandlers|removeAllMPEventHandlers|removeAllMusicEventHandlers|removeAllOwnedMines|removeAllPrimaryWeaponItems|removeAllWeapons|removeBackpack|removeBackpackGlobal|removeCuratorAddons|removeCuratorCameraArea|removeCuratorEditableObjects|removeCuratorEditingArea|removeDrawIcon|removeDrawLinks|removeEventHandler|removeFromRemainsCollector|removeGoggles|removeGroupIcon|removeHandgunItem|removeHeadgear|removeItem|removeItemFromBackpack|removeItemFromUniform|removeItemFromVest|removeItems|removeMagazine|removeMagazineGlobal|removeMagazines|removeMagazinesTurret|removeMagazineTurret|removeMenuItem|removeMissionEventHandler|removeMPEventHandler|removeMusicEventHandler|removeOwnedMine|removePrimaryWeaponItem|removeSecondaryWeaponItem|removeSimpleTask|removeSwitchableUnit|removeTeamMember|removeUniform|removeVest|removeWeapon|removeWeaponAttachmentCargo|removeWeaponCargo|removeWeaponGlobal|removeWeaponTurret|reportRemoteTarget|requiredVersion|resetCamShake|resetSubgroupDirection|resistance|resize|resources|respawnVehicle|restartEditorCamera|reveal|revealMine|reverse|reversedMouseY|roadAt|roadsConnectedTo|roleDescription|ropeAttachedObjects|ropeAttachedTo|ropeAttachEnabled|ropeAttachTo|ropeCreate|ropeCut|ropeDestroy|ropeDetach|ropeEndPosition|ropeLength|ropes|ropeUnwind|ropeUnwound|rotorsForcesRTD|rotorsRpmRTD|round|runInitScript|safeZoneH|safeZoneW|safeZoneWAbs|safeZoneX|safeZoneXAbs|safeZoneY|save3DENInventory|saveGame|saveIdentity|saveJoysticks|saveOverlay|saveProfileNamespace|saveStatus|saveVar|savingEnabled|say|say2D|say3D|score|scoreSide|screenshot|screenToWorld|scriptDone|scriptName|scriptNull|scudState|secondaryWeapon|secondaryWeaponItems|secondaryWeaponMagazine|select|selectBestPlaces|selectDiarySubject|selectedEditorObjects|selectEditorObject|selectionNames|selectionPosition|selectLeader|selectMax|selectMin|selectNoPlayer|selectPlayer|selectRandom|selectRandomWeighted|selectWeapon|selectWeaponTurret|sendAUMessage|sendSimpleCommand|sendTask|sendTaskResult|sendUDPMessage|serverCommand|serverCommandAvailable|serverCommandExecutable|serverName|serverTime|set|set3DENAttribute|set3DENAttributes|set3DENGrid|set3DENIconsVisible|set3DENLayer|set3DENLinesVisible|set3DENLogicType|set3DENMissionAttribute|set3DENMissionAttributes|set3DENModelsVisible|set3DENObjectType|set3DENSelected|setAccTime|setActualCollectiveRTD|setAirplaneThrottle|setAirportSide|setAmmo|setAmmoCargo|setAmmoOnPylon|setAnimSpeedCoef|setAperture|setApertureNew|setArmoryPoints|setAttributes|setAutonomous|setBehaviour|setBleedingRemaining|setBrakesRTD|setCameraInterest|setCamShakeDefParams|setCamShakeParams|setCamUseTI|setCaptive|setCenterOfMass|setCollisionLight|setCombatMode|setCompassOscillation|setConvoySeparation|setCuratorCameraAreaCeiling|setCuratorCoef|setCuratorEditingAreaType|setCuratorWaypointCost|setCurrentChannel|setCurrentTask|setCurrentWaypoint|setCustomAimCoef|setCustomWeightRTD|setDamage|setDammage|setDate|setDebriefingText|setDefaultCamera|setDestination|setDetailMapBlendPars|setDir|setDirection|setDrawIcon|setDriveOnPath|setDropInterval|setDynamicSimulationDistance|setDynamicSimulationDistanceCoef|setEditorMode|setEditorObjectScope|setEffectCondition|setEngineRpmRTD|setFace|setFaceAnimation|setFatigue|setFeatureType|setFlagAnimationPhase|setFlagOwner|setFlagSide|setFlagTexture|setFog|setForceGeneratorRTD|setFormation|setFormationTask|setFormDir|setFriend|setFromEditor|setFSMVariable|setFuel|setFuelCargo|setGroupIcon|setGroupIconParams|setGroupIconsSelectable|setGroupIconsVisible|setGroupId|setGroupIdGlobal|setGroupOwner|setGusts|setHideBehind|setHit|setHitIndex|setHitPointDamage|setHorizonParallaxCoef|setHUDMovementLevels|setIdentity|setImportance|setInfoPanel|setLeader|setLightAmbient|setLightAttenuation|setLightBrightness|setLightColor|setLightDayLight|setLightFlareMaxDistance|setLightFlareSize|setLightIntensity|setLightnings|setLightUseFlare|setLocalWindParams|setMagazineTurretAmmo|setMarkerAlpha|setMarkerAlphaLocal|setMarkerBrush|setMarkerBrushLocal|setMarkerColor|setMarkerColorLocal|setMarkerDir|setMarkerDirLocal|setMarkerPos|setMarkerPosLocal|setMarkerShape|setMarkerShapeLocal|setMarkerSize|setMarkerSizeLocal|setMarkerText|setMarkerTextLocal|setMarkerType|setMarkerTypeLocal|setMass|setMimic|setMousePosition|setMusicEffect|setMusicEventHandler|setName|setNameSound|setObjectArguments|setObjectMaterial|setObjectMaterialGlobal|setObjectProxy|setObjectTexture|setObjectTextureGlobal|setObjectViewDistance|setOvercast|setOwner|setOxygenRemaining|setParticleCircle|setParticleClass|setParticleFire|setParticleParams|setParticleRandom|setPilotCameraDirection|setPilotCameraRotation|setPilotCameraTarget|setPilotLight|setPiPEffect|setPitch|setPlateNumber|setPlayable|setPlayerRespawnTime|setPos|setPosASL|setPosASL2|setPosASLW|setPosATL|setPosition|setPosWorld|setPylonLoadOut|setPylonsPriority|setRadioMsg|setRain|setRainbow|setRandomLip|setRank|setRectangular|setRepairCargo|setRotorBrakeRTD|setShadowDistance|setShotParents|setSide|setSimpleTaskAlwaysVisible|setSimpleTaskCustomData|setSimpleTaskDescription|setSimpleTaskDestination|setSimpleTaskTarget|setSimpleTaskType|setSimulWeatherLayers|setSize|setSkill|setSlingLoad|setSoundEffect|setSpeaker|setSpeech|setSpeedMode|setStamina|setStaminaScheme|setStatValue|setSuppression|setSystemOfUnits|setTargetAge|setTaskMarkerOffset|setTaskResult|setTaskState|setTerrainGrid|setText|setTimeMultiplier|setTitleEffect|setToneMapping|setToneMappingParams|setTrafficDensity|setTrafficDistance|setTrafficGap|setTrafficSpeed|setTriggerActivation|setTriggerArea|setTriggerStatements|setTriggerText|setTriggerTimeout|setTriggerType|setType|setUnconscious|setUnitAbility|setUnitLoadout|setUnitPos|setUnitPosWeak|setUnitRank|setUnitRecoilCoefficient|setUnitTrait|setUnloadInCombat|setUserActionText|setUserMFDText|setUserMFDValue|setVariable|setVectorDir|setVectorDirAndUp|setVectorUp|setVehicleAmmo|setVehicleAmmoDef|setVehicleArmor|setVehicleCargo|setVehicleId|setVehicleInit|setVehicleLock|setVehiclePosition|setVehicleRadar|setVehicleReceiveRemoteTargets|setVehicleReportOwnPosition|setVehicleReportRemoteTargets|setVehicleTIPars|setVehicleVarName|setVelocity|setVelocityModelSpace|setVelocityTransformation|setViewDistance|setVisibleIfTreeCollapsed|setWantedRpmRTD|setWaves|setWaypointBehaviour|setWaypointCombatMode|setWaypointCompletionRadius|setWaypointDescription|setWaypointForceBehaviour|setWaypointFormation|setWaypointHousePosition|setWaypointLoiterRadius|setWaypointLoiterType|setWaypointName|setWaypointPosition|setWaypointScript|setWaypointSpeed|setWaypointStatements|setWaypointTimeout|setWaypointType|setWaypointVisible|setWeaponReloadingTime|setWind|setWindDir|setWindForce|setWindStr|setWingForceScaleRTD|setWPPos|show3DIcons|showChat|showCinemaBorder|showCommandingMenu|showCompass|showCuratorCompass|showGPS|showHUD|showLegend|showMap|shownArtilleryComputer|shownChat|shownCompass|shownCuratorCompass|showNewEditorObject|shownGPS|shownHUD|shownMap|shownPad|shownRadio|shownScoretable|shownUAVFeed|shownWarrant|shownWatch|showPad|showRadio|showScoretable|showSubtitles|showUAVFeed|showWarrant|showWatch|showWaypoint|showWaypoints|side|sideAmbientLife|sideChat|sideEmpty|sideEnemy|sideFriendly|sideLogic|sideRadio|sideUnknown|simpleTasks|simulationEnabled|simulCloudDensity|simulCloudOcclusion|simulInClouds|simulWeatherSync|sin|size|sizeOf|skill|skillFinal|skipTime|sleep|sliderPosition|sliderRange|sliderSetPosition|sliderSetRange|sliderSetSpeed|sliderSpeed|slingLoadAssistantShown|soldierMagazines|someAmmo|sort|soundVolume|speaker|speed|speedMode|splitString|sqrt|squadParams|stance|startLoadingScreen|stop|stopEngineRTD|stopped|str|sunOrMoon|supportInfo|suppressFor|surfaceIsWater|surfaceNormal|surfaceType|swimInDepth|switchableUnits|switchAction|switchCamera|switchGesture|switchLight|switchMove|synchronizedObjects|synchronizedTriggers|synchronizedWaypoints|synchronizeObjectsAdd|synchronizeObjectsRemove|synchronizeTrigger|synchronizeWaypoint|systemChat|systemOfUnits|tan|targetKnowledge|targets|targetsAggregate|targetsQuery|taskAlwaysVisible|taskChildren|taskCompleted|taskCustomData|taskDescription|taskDestination|taskHint|taskMarkerOffset|taskNull|taskParent|taskResult|taskState|taskType|teamMember|teamMemberNull|teamName|teams|teamSwitch|teamSwitchEnabled|teamType|terminate|terrainIntersect|terrainIntersectASL|terrainIntersectAtASL|text|textLog|textLogFormat|tg|time|timeMultiplier|titleCut|titleFadeOut|titleObj|titleRsc|titleText|toArray|toFixed|toLower|toString|toUpper|triggerActivated|triggerActivation|triggerArea|triggerAttachedVehicle|triggerAttachObject|triggerAttachVehicle|triggerDynamicSimulation|triggerStatements|triggerText|triggerTimeout|triggerTimeoutCurrent|triggerType|turretLocal|turretOwner|turretUnit|tvAdd|tvClear|tvCollapse|tvCollapseAll|tvCount|tvCurSel|tvData|tvDelete|tvExpand|tvExpandAll|tvPicture|tvPictureRight|tvSetColor|tvSetCurSel|tvSetData|tvSetPicture|tvSetPictureColor|tvSetPictureColorDisabled|tvSetPictureColorSelected|tvSetPictureRight|tvSetPictureRightColor|tvSetPictureRightColorDisabled|tvSetPictureRightColorSelected|tvSetSelectColor|tvSetText|tvSetTooltip|tvSetValue|tvSort|tvSortByValue|tvText|tvTooltip|tvValue|type|typeName|typeOf|UAVControl|uiNamespace|uiSleep|unassignCurator|unassignItem|unassignTeam|unassignVehicle|underwater|uniform|uniformContainer|uniformItems|uniformMagazines|unitAddons|unitAimPosition|unitAimPositionVisual|unitBackpack|unitIsUAV|unitPos|unitReady|unitRecoilCoefficient|units|unitsBelowHeight|unlinkItem|unlockAchievement|unregisterTask|updateDrawIcon|updateMenuItem|updateObjectTree|useAIOperMapObstructionTest|useAISteeringComponent|useAudioTimeForMoves|userInputDisabled|vectorAdd|vectorCos|vectorCrossProduct|vectorDiff|vectorDir|vectorDirVisual|vectorDistance|vectorDistanceSqr|vectorDotProduct|vectorFromTo|vectorMagnitude|vectorMagnitudeSqr|vectorModelToWorld|vectorModelToWorldVisual|vectorMultiply|vectorNormalized|vectorUp|vectorUpVisual|vectorWorldToModel|vectorWorldToModelVisual|vehicle|vehicleCargoEnabled|vehicleChat|vehicleRadio|vehicleReceiveRemoteTargets|vehicleReportOwnPosition|vehicleReportRemoteTargets|vehicles|vehicleVarName|velocity|velocityModelSpace|verifySignature|vest|vestContainer|vestItems|vestMagazines|viewDistance|visibleCompass|visibleGPS|visibleMap|visiblePosition|visiblePositionASL|visibleScoretable|visibleWatch|waitUntil|waves|waypointAttachedObject|waypointAttachedVehicle|waypointAttachObject|waypointAttachVehicle|waypointBehaviour|waypointCombatMode|waypointCompletionRadius|waypointDescription|waypointForceBehaviour|waypointFormation|waypointHousePosition|waypointLoiterRadius|waypointLoiterType|waypointName|waypointPosition|waypoints|waypointScript|waypointsEnabledUAV|waypointShow|waypointSpeed|waypointStatements|waypointTimeout|waypointTimeoutCurrent|waypointType|waypointVisible|weaponAccessories|weaponAccessoriesCargo|weaponCargo|weaponDirection|weaponInertia|weaponLowered|weapons|weaponsItems|weaponsItemsCargo|weaponState|weaponsTurret|weightRTD|west|WFSideText|wind|windDir|windRTD|windStr|wingsForcesRTD|worldName|worldSize|worldToModel|worldToModelVisual|worldToScreen)\b/i,number:/(?:\$|\b0x)[\da-f]+\b|(?:\B\.\d+|\b\d+(?:\.\d+)?)(?:e[+-]?\d+)?\b/i,operator:/##|>>|&&|\|\||[!=<>]=?|[-+*/%#^]|\b(?:and|mod|not|or)\b/i,"magic-variable":{pattern:/\b(?:this|thisList|thisTrigger|_exception|_fnc_scriptName|_fnc_scriptNameParent|_forEachIndex|_this|_thisEventHandler|_thisFSM|_thisScript|_x)\b/i,alias:"keyword"},constant:/\bDIK(?:_[a-z\d]+)+\b/i}),t.languages.insertBefore("sqf","string",{macro:{pattern:/(^[ \t]*)#[a-z](?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{directive:{pattern:/#[a-z]+\b/i,alias:"keyword"},comment:t.languages.sqf.comment}}}),delete t.languages.sqf["class-name"]}return $0}var F0,_M;function qSe(){if(_M)return F0;_M=1,F0=e,e.displayName="squirrel",e.aliases=[];function e(t){t.languages.squirrel=t.languages.extend("clike",{comment:[t.languages.clike.comment[0],{pattern:/(^|[^\\:])(?:\/\/|#).*/,lookbehind:!0,greedy:!0}],string:{pattern:/(^|[^\\"'@])(?:@"(?:[^"]|"")*"(?!")|"(?:[^\\\r\n"]|\\.)*")/,lookbehind:!0,greedy:!0},"class-name":{pattern:/(\b(?:class|enum|extends|instanceof)\s+)\w+(?:\.\w+)*/,lookbehind:!0,inside:{punctuation:/\./}},keyword:/\b(?:__FILE__|__LINE__|base|break|case|catch|class|clone|const|constructor|continue|default|delete|else|enum|extends|for|foreach|function|if|in|instanceof|local|null|resume|return|static|switch|this|throw|try|typeof|while|yield)\b/,number:/\b(?:0x[0-9a-fA-F]+|\d+(?:\.(?:\d+|[eE][+-]?\d+))?)\b/,operator:/\+\+|--|<=>|<[-<]|>>>?|&&?|\|\|?|[-+*/%!=<>]=?|[~^]|::?/,punctuation:/[(){}\[\],;.]/}),t.languages.insertBefore("squirrel","string",{char:{pattern:/(^|[^\\"'])'(?:[^\\']|\\(?:[xuU][0-9a-fA-F]{0,8}|[\s\S]))'/,lookbehind:!0,greedy:!0}}),t.languages.insertBefore("squirrel","operator",{"attribute-punctuation":{pattern:/<\/|\/>/,alias:"important"},lambda:{pattern:/@(?=\()/,alias:"operator"}})}return F0}var j0,AM;function GSe(){if(AM)return j0;AM=1,j0=e,e.displayName="stan",e.aliases=[];function e(t){(function(n){var r=/\b(?:algebra_solver|algebra_solver_newton|integrate_1d|integrate_ode|integrate_ode_bdf|integrate_ode_rk45|map_rect|ode_(?:adams|bdf|ckrk|rk45)(?:_tol)?|ode_adjoint_tol_ctl|reduce_sum|reduce_sum_static)\b/;n.languages.stan={comment:/\/\/.*|\/\*[\s\S]*?\*\/|#(?!include).*/,string:{pattern:/"[\x20\x21\x23-\x5B\x5D-\x7E]*"/,greedy:!0},directive:{pattern:/^([ \t]*)#include\b.*/m,lookbehind:!0,alias:"property"},"function-arg":{pattern:RegExp("("+r.source+/\s*\(\s*/.source+")"+/[a-zA-Z]\w*/.source),lookbehind:!0,alias:"function"},constraint:{pattern:/(\b(?:int|matrix|real|row_vector|vector)\s*)<[^<>]*>/,lookbehind:!0,inside:{expression:{pattern:/(=\s*)\S(?:\S|\s+(?!\s))*?(?=\s*(?:>$|,\s*\w+\s*=))/,lookbehind:!0,inside:null},property:/\b[a-z]\w*(?=\s*=)/i,operator:/=/,punctuation:/^<|>$|,/}},keyword:[{pattern:/\bdata(?=\s*\{)|\b(?:functions|generated|model|parameters|quantities|transformed)\b/,alias:"program-block"},/\b(?:array|break|cholesky_factor_corr|cholesky_factor_cov|complex|continue|corr_matrix|cov_matrix|data|else|for|if|in|increment_log_prob|int|matrix|ordered|positive_ordered|print|real|reject|return|row_vector|simplex|target|unit_vector|vector|void|while)\b/,r],function:/\b[a-z]\w*(?=\s*\()/i,number:/(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:E[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,boolean:/\b(?:false|true)\b/,operator:/<-|\.[*/]=?|\|\|?|&&|[!=<>+\-*/]=?|['^%~?:]/,punctuation:/[()\[\]{},;]/},n.languages.stan.constraint.inside.expression.inside=n.languages.stan})(t)}return j0}var z0,TM;function WSe(){if(TM)return z0;TM=1,z0=e,e.displayName="stylus",e.aliases=[];function e(t){(function(n){var r={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},o={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:a,punctuation:/[{}()\[\];:,]/};o.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:o}},o.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:o}},n.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:o}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:o}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:o}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:o.interpolation}},rest:o}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:o.interpolation,comment:o.comment,punctuation:/[{},]/}},func:o.func,string:o.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:o.interpolation,punctuation:/[{}()\[\];:.]/}})(t)}return z0}var U0,RM;function KSe(){if(RM)return U0;RM=1,U0=e,e.displayName="swift",e.aliases=[];function e(t){t.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp(/(^|[^"#])/.source+"(?:"+/"(?:\\(?:\((?:[^()]|\([^()]*\))*\)|\r\n|[^(])|[^\\\r\n"])*"/.source+"|"+/"""(?:\\(?:\((?:[^()]|\([^()]*\))*\)|[^(])|[^\\"]|"(?!""))*"""/.source+")"+/(?!["#])/.source),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp(/(^|[^"#])(#+)/.source+"(?:"+/"(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|\r\n|[^#])|[^\\\r\n])*?"/.source+"|"+/"""(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|[^#])|[^\\])*?"""/.source+")\\2"),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp(/#/.source+"(?:"+(/(?:elseif|if)\b/.source+"(?:[ ]*"+/(?:![ \t]*)?(?:\b\w+\b(?:[ \t]*\((?:[^()]|\([^()]*\))*\))?|\((?:[^()]|\([^()]*\))*\))(?:[ \t]*(?:&&|\|\|))?/.source+")+")+"|"+/(?:else|endif)\b/.source+")"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},t.languages.swift["string-literal"].forEach(function(n){n.inside.interpolation.inside=t.languages.swift})}return U0}var B0,NM;function YSe(){if(NM)return B0;NM=1,B0=e,e.displayName="systemd",e.aliases=[];function e(t){(function(n){var r={pattern:/^[;#].*/m,greedy:!0},a=/"(?:[^\r\n"\\]|\\(?:[^\r]|\r\n?))*"(?!\S)/.source;n.languages.systemd={comment:r,section:{pattern:/^\[[^\n\r\[\]]*\](?=[ \t]*$)/m,greedy:!0,inside:{punctuation:/^\[|\]$/,"section-name":{pattern:/[\s\S]+/,alias:"selector"}}},key:{pattern:/^[^\s=]+(?=[ \t]*=)/m,greedy:!0,alias:"attr-name"},value:{pattern:RegExp(/(=[ \t]*(?!\s))/.source+"(?:"+a+`|(?=[^"\r -]))(?:`+(/[^\s\\]/.source+'|[ ]+(?:(?![ "])|'+a+")|"+/\\[\r\n]+(?:[#;].*[\r\n]+)*(?![#;])/.source)+")*"),lookbehind:!0,greedy:!0,alias:"attr-value",inside:{comment:r,quoted:{pattern:RegExp(/(^|\s)/.source+a),lookbehind:!0,greedy:!0},punctuation:/\\$/m,boolean:{pattern:/^(?:false|no|off|on|true|yes)$/,greedy:!0}}},punctuation:/=/}})(t)}return B0}var H0,IM;function MA(){if(IM)return H0;IM=1,H0=e,e.displayName="t4Templating",e.aliases=[];function e(t){(function(n){function r(o,i,s){return{pattern:RegExp("<#"+o+"[\\s\\S]*?#>"),alias:"block",inside:{delimiter:{pattern:RegExp("^<#"+o+"|#>$"),alias:"important"},content:{pattern:/[\s\S]+/,inside:i,alias:s}}}}function a(o){var i=n.languages[o],s="language-"+o;return{block:{pattern:/<#[\s\S]+?#>/,inside:{directive:r("@",{"attr-value":{pattern:/=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/,inside:{punctuation:/^=|^["']|["']$/}},keyword:/\b\w+(?=\s)/,"attr-name":/\b\w+/}),expression:r("=",i,s),"class-feature":r("\\+",i,s),standard:r("",i,s)}}}}n.languages["t4-templating"]=Object.defineProperty({},"createT4",{value:a})})(t)}return H0}var V0,OM;function ZSe(){if(OM)return V0;OM=1;var e=MA(),t=Ah();V0=n,n.displayName="t4Cs",n.aliases=[];function n(r){r.register(e),r.register(t),r.languages.t4=r.languages["t4-cs"]=r.languages["t4-templating"].createT4("csharp")}return V0}var q0,DM;function cz(){if(DM)return q0;DM=1;var e=oz();q0=t,t.displayName="vbnet",t.aliases=[];function t(n){n.register(e),n.languages.vbnet=n.languages.extend("basic",{comment:[{pattern:/(?:!|REM\b).+/i,inside:{keyword:/^REM/i}},{pattern:/(^|[^\\:])'.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(^|[^"])"(?:""|[^"])*"(?!")/,lookbehind:!0,greedy:!0},keyword:/(?:\b(?:ADDHANDLER|ADDRESSOF|ALIAS|AND|ANDALSO|AS|BEEP|BLOAD|BOOLEAN|BSAVE|BYREF|BYTE|BYVAL|CALL(?: ABSOLUTE)?|CASE|CATCH|CBOOL|CBYTE|CCHAR|CDATE|CDBL|CDEC|CHAIN|CHAR|CHDIR|CINT|CLASS|CLEAR|CLNG|CLOSE|CLS|COBJ|COM|COMMON|CONST|CONTINUE|CSBYTE|CSHORT|CSNG|CSTR|CTYPE|CUINT|CULNG|CUSHORT|DATA|DATE|DECIMAL|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DEFAULT|DELEGATE|DIM|DIRECTCAST|DO|DOUBLE|ELSE|ELSEIF|END|ENUM|ENVIRON|ERASE|ERROR|EVENT|EXIT|FALSE|FIELD|FILES|FINALLY|FOR(?: EACH)?|FRIEND|FUNCTION|GET|GETTYPE|GETXMLNAMESPACE|GLOBAL|GOSUB|GOTO|HANDLES|IF|IMPLEMENTS|IMPORTS|IN|INHERITS|INPUT|INTEGER|INTERFACE|IOCTL|IS|ISNOT|KEY|KILL|LET|LIB|LIKE|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|ME|MKDIR|MOD|MODULE|MUSTINHERIT|MUSTOVERRIDE|MYBASE|MYCLASS|NAME|NAMESPACE|NARROWING|NEW|NEXT|NOT|NOTHING|NOTINHERITABLE|NOTOVERRIDABLE|OBJECT|OF|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPERATOR|OPTION(?: BASE)?|OPTIONAL|OR|ORELSE|OUT|OVERLOADS|OVERRIDABLE|OVERRIDES|PARAMARRAY|PARTIAL|POKE|PRIVATE|PROPERTY|PROTECTED|PUBLIC|PUT|RAISEEVENT|READ|READONLY|REDIM|REM|REMOVEHANDLER|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SBYTE|SELECT(?: CASE)?|SET|SHADOWS|SHARED|SHELL|SHORT|SINGLE|SLEEP|STATIC|STEP|STOP|STRING|STRUCTURE|SUB|SWAP|SYNCLOCK|SYSTEM|THEN|THROW|TIMER|TO|TROFF|TRON|TRUE|TRY|TRYCAST|TYPE|TYPEOF|UINTEGER|ULONG|UNLOCK|UNTIL|USHORT|USING|VIEW PRINT|WAIT|WEND|WHEN|WHILE|WIDENING|WITH|WITHEVENTS|WRITE|WRITEONLY|XOR)|\B(?:#CONST|#ELSE|#ELSEIF|#END|#IF))(?:\$|\b)/i,punctuation:/[,;:(){}]/})}return q0}var G0,LM;function XSe(){if(LM)return G0;LM=1;var e=MA(),t=cz();G0=n,n.displayName="t4Vb",n.aliases=[];function n(r){r.register(e),r.register(t),r.languages["t4-vb"]=r.languages["t4-templating"].createT4("vbnet")}return G0}var W0,MM;function uz(){if(MM)return W0;MM=1,W0=e,e.displayName="yaml",e.aliases=["yml"];function e(t){(function(n){var r=/[*&][^\s[\]{},]+/,a=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,o="(?:"+a.source+"(?:[ ]+"+r.source+")?|"+r.source+"(?:[ ]+"+a.source+")?)",i=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source}),s=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function l(c,u){u=(u||"").replace(/m/g,"")+"m";var d=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,function(){return o}).replace(/<>/g,function(){return c});return RegExp(d,u)}n.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,function(){return o})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,function(){return o}).replace(/<>/g,function(){return"(?:"+i+"|"+s+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:l(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:l(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:l(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:l(s),lookbehind:!0,greedy:!0},number:{pattern:l(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:a,important:r,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},n.languages.yml=n.languages.yaml})(t)}return W0}var K0,PM;function QSe(){if(PM)return K0;PM=1;var e=uz();K0=t,t.displayName="tap",t.aliases=[];function t(n){n.register(e),n.languages.tap={fail:/not ok[^#{\n\r]*/,pass:/ok[^#{\n\r]*/,pragma:/pragma [+-][a-z]+/,bailout:/bail out!.*/i,version:/TAP version \d+/i,plan:/\b\d+\.\.\d+(?: +#.*)?/,subtest:{pattern:/# Subtest(?:: .*)?/,greedy:!0},punctuation:/[{}]/,directive:/#.*/,yamlish:{pattern:/(^[ \t]*)---[\s\S]*?[\r\n][ \t]*\.\.\.$/m,lookbehind:!0,inside:n.languages.yaml,alias:"language-yaml"}}}return K0}var Y0,$M;function JSe(){if($M)return Y0;$M=1,Y0=e,e.displayName="tcl",e.aliases=[];function e(t){t.languages.tcl={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},string:{pattern:/"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*"/,greedy:!0},variable:[{pattern:/(\$)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/,lookbehind:!0},{pattern:/(\$)\{[^}]+\}/,lookbehind:!0},{pattern:/(^[\t ]*set[ \t]+)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/m,lookbehind:!0}],function:{pattern:/(^[\t ]*proc[ \t]+)\S+/m,lookbehind:!0},builtin:[{pattern:/(^[\t ]*)(?:break|class|continue|error|eval|exit|for|foreach|if|proc|return|switch|while)\b/m,lookbehind:!0},/\b(?:else|elseif)\b/],scope:{pattern:/(^[\t ]*)(?:global|upvar|variable)\b/m,lookbehind:!0,alias:"constant"},keyword:{pattern:/(^[\t ]*|\[)(?:Safe_Base|Tcl|after|append|apply|array|auto_(?:execok|import|load|mkindex|qualify|reset)|automkindex_old|bgerror|binary|catch|cd|chan|clock|close|concat|dde|dict|encoding|eof|exec|expr|fblocked|fconfigure|fcopy|file(?:event|name)?|flush|gets|glob|history|http|incr|info|interp|join|lappend|lassign|lindex|linsert|list|llength|load|lrange|lrepeat|lreplace|lreverse|lsearch|lset|lsort|math(?:func|op)|memory|msgcat|namespace|open|package|parray|pid|pkg_mkIndex|platform|puts|pwd|re_syntax|read|refchan|regexp|registry|regsub|rename|scan|seek|set|socket|source|split|string|subst|tcl(?:_endOfWord|_findLibrary|startOf(?:Next|Previous)Word|test|vars|wordBreak(?:After|Before))|tell|time|tm|trace|unknown|unload|unset|update|uplevel|vwait)\b/m,lookbehind:!0},operator:/!=?|\*\*?|==|&&?|\|\|?|<[=<]?|>[=>]?|[-+~\/%?^]|\b(?:eq|in|ne|ni)\b/,punctuation:/[{}()\[\]]/}}return Y0}var Z0,FM;function ewe(){if(FM)return Z0;FM=1,Z0=e,e.displayName="textile",e.aliases=[];function e(t){(function(n){var r=/\([^|()\n]+\)|\[[^\]\n]+\]|\{[^}\n]+\}/.source,a=/\)|\((?![^|()\n]+\))/.source;function o(g,m){return RegExp(g.replace(//g,function(){return"(?:"+r+")"}).replace(//g,function(){return"(?:"+a+")"}),m||"")}var i={css:{pattern:/\{[^{}]+\}/,inside:{rest:n.languages.css}},"class-id":{pattern:/(\()[^()]+(?=\))/,lookbehind:!0,alias:"attr-value"},lang:{pattern:/(\[)[^\[\]]+(?=\])/,lookbehind:!0,alias:"attr-value"},punctuation:/[\\\/]\d+|\S/},s=n.languages.textile=n.languages.extend("markup",{phrase:{pattern:/(^|\r|\n)\S[\s\S]*?(?=$|\r?\n\r?\n|\r\r)/,lookbehind:!0,inside:{"block-tag":{pattern:o(/^[a-z]\w*(?:||[<>=])*\./.source),inside:{modifier:{pattern:o(/(^[a-z]\w*)(?:||[<>=])+(?=\.)/.source),lookbehind:!0,inside:i},tag:/^[a-z]\w*/,punctuation:/\.$/}},list:{pattern:o(/^[*#]+*\s+\S.*/.source,"m"),inside:{modifier:{pattern:o(/(^[*#]+)+/.source),lookbehind:!0,inside:i},punctuation:/^[*#]+/}},table:{pattern:o(/^(?:(?:||[<>=^~])+\.\s*)?(?:\|(?:(?:||[<>=^~_]|[\\/]\d+)+\.|(?!(?:||[<>=^~_]|[\\/]\d+)+\.))[^|]*)+\|/.source,"m"),inside:{modifier:{pattern:o(/(^|\|(?:\r?\n|\r)?)(?:||[<>=^~_]|[\\/]\d+)+(?=\.)/.source),lookbehind:!0,inside:i},punctuation:/\||^\./}},inline:{pattern:o(/(^|[^a-zA-Z\d])(\*\*|__|\?\?|[*_%@+\-^~])*.+?\2(?![a-zA-Z\d])/.source),lookbehind:!0,inside:{bold:{pattern:o(/(^(\*\*?)*).+?(?=\2)/.source),lookbehind:!0},italic:{pattern:o(/(^(__?)*).+?(?=\2)/.source),lookbehind:!0},cite:{pattern:o(/(^\?\?*).+?(?=\?\?)/.source),lookbehind:!0,alias:"string"},code:{pattern:o(/(^@*).+?(?=@)/.source),lookbehind:!0,alias:"keyword"},inserted:{pattern:o(/(^\+*).+?(?=\+)/.source),lookbehind:!0},deleted:{pattern:o(/(^-*).+?(?=-)/.source),lookbehind:!0},span:{pattern:o(/(^%*).+?(?=%)/.source),lookbehind:!0},modifier:{pattern:o(/(^\*\*|__|\?\?|[*_%@+\-^~])+/.source),lookbehind:!0,inside:i},punctuation:/[*_%?@+\-^~]+/}},"link-ref":{pattern:/^\[[^\]]+\]\S+$/m,inside:{string:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0},url:{pattern:/(^\])\S+$/,lookbehind:!0},punctuation:/[\[\]]/}},link:{pattern:o(/"*[^"]+":.+?(?=[^\w/]?(?:\s|$))/.source),inside:{text:{pattern:o(/(^"*)[^"]+(?=")/.source),lookbehind:!0},modifier:{pattern:o(/(^")+/.source),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[":]/}},image:{pattern:o(/!(?:||[<>=])*(?![<>=])[^!\s()]+(?:\([^)]+\))?!(?::.+?(?=[^\w/]?(?:\s|$)))?/.source),inside:{source:{pattern:o(/(^!(?:||[<>=])*)(?![<>=])[^!\s()]+(?:\([^)]+\))?(?=!)/.source),lookbehind:!0,alias:"url"},modifier:{pattern:o(/(^!)(?:||[<>=])+/.source),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[!:]/}},footnote:{pattern:/\b\[\d+\]/,alias:"comment",inside:{punctuation:/\[|\]/}},acronym:{pattern:/\b[A-Z\d]+\([^)]+\)/,inside:{comment:{pattern:/(\()[^()]+(?=\))/,lookbehind:!0},punctuation:/[()]/}},mark:{pattern:/\b\((?:C|R|TM)\)/,alias:"comment",inside:{punctuation:/[()]/}}}}}),l=s.phrase.inside,c={inline:l.inline,link:l.link,image:l.image,footnote:l.footnote,acronym:l.acronym,mark:l.mark};s.tag.pattern=/<\/?(?!\d)[a-z0-9]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i;var u=l.inline.inside;u.bold.inside=c,u.italic.inside=c,u.inserted.inside=c,u.deleted.inside=c,u.span.inside=c;var d=l.table.inside;d.inline=c.inline,d.link=c.link,d.image=c.image,d.footnote=c.footnote,d.acronym=c.acronym,d.mark=c.mark})(t)}return Z0}var X0,jM;function twe(){if(jM)return X0;jM=1,X0=e,e.displayName="toml",e.aliases=[];function e(t){(function(n){var r=/(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;function a(o){return o.replace(/__/g,function(){return r})}n.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(a(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(a(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}})(t)}return X0}var Q0,zM;function nwe(){if(zM)return Q0;zM=1,Q0=e,e.displayName="tremor",e.aliases=[];function e(t){(function(n){n.languages.tremor={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},"interpolated-string":null,extractor:{pattern:/\b[a-z_]\w*\|(?:[^\r\n\\|]|\\(?:\r\n|[\s\S]))*\|/i,greedy:!0,inside:{regex:{pattern:/(^re)\|[\s\S]+/,lookbehind:!0},function:/^\w+/,value:/\|[\s\S]+/}},identifier:{pattern:/`[^`]*`/,greedy:!0},function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())\b/,keyword:/\b(?:args|as|by|case|config|connect|connector|const|copy|create|default|define|deploy|drop|each|emit|end|erase|event|flow|fn|for|from|group|having|insert|into|intrinsic|let|links|match|merge|mod|move|of|operator|patch|pipeline|recur|script|select|set|sliding|state|stream|to|tumbling|update|use|when|where|window|with)\b/,boolean:/\b(?:false|null|true)\b/i,number:/\b(?:0b[01_]*|0x[0-9a-fA-F_]*|\d[\d_]*(?:\.\d[\d_]*)?(?:[Ee][+-]?[\d_]+)?)\b/,"pattern-punctuation":{pattern:/%(?=[({[])/,alias:"punctuation"},operator:/[-+*\/%~!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?>?=?|(?:absent|and|not|or|present|xor)\b/,punctuation:/::|[;\[\]()\{\},.:]/};var r=/#\{(?:[^"{}]|\{[^{}]*\}|"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*")*\}/.source;n.languages.tremor["interpolated-string"]={pattern:RegExp(/(^|[^\\])/.source+'(?:"""(?:'+/[^"\\#]|\\[\s\S]|"(?!"")|#(?!\{)/.source+"|"+r+')*"""|"(?:'+/[^"\\\r\n#]|\\(?:\r\n|[\s\S])|#(?!\{)/.source+"|"+r+')*")'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:RegExp(r),inside:{punctuation:/^#\{|\}$/,expression:{pattern:/[\s\S]+/,inside:n.languages.tremor}}},string:/[\s\S]+/}},n.languages.troy=n.languages.tremor,n.languages.trickle=n.languages.tremor})(t)}return Q0}var J0,UM;function rwe(){if(UM)return J0;UM=1;var e=sz(),t=OA();J0=n,n.displayName="tsx",n.aliases=[];function n(r){r.register(e),r.register(t),function(a){var o=a.util.clone(a.languages.typescript);a.languages.tsx=a.languages.extend("jsx",o),delete a.languages.tsx.parameter,delete a.languages.tsx["literal-property"];var i=a.languages.tsx.tag;i.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+i.pattern.source+")",i.pattern.flags),i.lookbehind=!0}(r)}return J0}var eE,BM;function awe(){if(BM)return eE;BM=1;var e=mr();eE=t,t.displayName="tt2",t.aliases=[];function t(n){n.register(e),function(r){r.languages.tt2=r.languages.extend("clike",{comment:/#.*|\[%#[\s\S]*?%\]/,keyword:/\b(?:BLOCK|CALL|CASE|CATCH|CLEAR|DEBUG|DEFAULT|ELSE|ELSIF|END|FILTER|FINAL|FOREACH|GET|IF|IN|INCLUDE|INSERT|LAST|MACRO|META|NEXT|PERL|PROCESS|RAWPERL|RETURN|SET|STOP|SWITCH|TAGS|THROW|TRY|UNLESS|USE|WHILE|WRAPPER)\b/,punctuation:/[[\]{},()]/}),r.languages.insertBefore("tt2","number",{operator:/=[>=]?|!=?|<=?|>=?|&&|\|\|?|\b(?:and|not|or)\b/,variable:{pattern:/\b[a-z]\w*(?:\s*\.\s*(?:\d+|\$?[a-z]\w*))*\b/i}}),r.languages.insertBefore("tt2","keyword",{delimiter:{pattern:/^(?:\[%|%%)-?|-?%\]$/,alias:"punctuation"}}),r.languages.insertBefore("tt2","string",{"single-quoted-string":{pattern:/'[^\\']*(?:\\[\s\S][^\\']*)*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"[^\\"]*(?:\\[\s\S][^\\"]*)*"/,greedy:!0,alias:"string",inside:{variable:{pattern:/\$(?:[a-z]\w*(?:\.(?:\d+|\$?[a-z]\w*))*)/i}}}}),delete r.languages.tt2.string,r.hooks.add("before-tokenize",function(a){var o=/\[%[\s\S]+?%\]/g;r.languages["markup-templating"].buildPlaceholders(a,"tt2",o)}),r.hooks.add("after-tokenize",function(a){r.languages["markup-templating"].tokenizePlaceholders(a,"tt2")})}(n)}return eE}var tE,HM;function owe(){if(HM)return tE;HM=1;var e=mr();tE=t,t.displayName="twig",t.aliases=[];function t(n){n.register(e),n.languages.twig={comment:/^\{#[\s\S]*?#\}$/,"tag-name":{pattern:/(^\{%-?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%]-?|-?[%}]\}$/,alias:"punctuation"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,inside:{punctuation:/^['"]|['"]$/}},keyword:/\b(?:even|if|odd)\b/,boolean:/\b(?:false|null|true)\b/,number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,operator:[{pattern:/(\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,lookbehind:!0},/[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/],punctuation:/[()\[\]{}:.,]/},n.hooks.add("before-tokenize",function(r){if(r.language==="twig"){var a=/\{(?:#[\s\S]*?#|%[\s\S]*?%|\{[\s\S]*?\})\}/g;n.languages["markup-templating"].buildPlaceholders(r,"twig",a)}}),n.hooks.add("after-tokenize",function(r){n.languages["markup-templating"].tokenizePlaceholders(r,"twig")})}return tE}var nE,VM;function iwe(){if(VM)return nE;VM=1,nE=e,e.displayName="typoscript",e.aliases=["tsconfig"];function e(t){(function(n){var r=/\b(?:ACT|ACTIFSUB|CARRAY|CASE|CLEARGIF|COA|COA_INT|CONSTANTS|CONTENT|CUR|EDITPANEL|EFFECT|EXT|FILE|FLUIDTEMPLATE|FORM|FRAME|FRAMESET|GIFBUILDER|GMENU|GMENU_FOLDOUT|GMENU_LAYERS|GP|HMENU|HRULER|HTML|IENV|IFSUB|IMAGE|IMGMENU|IMGMENUITEM|IMGTEXT|IMG_RESOURCE|INCLUDE_TYPOSCRIPT|JSMENU|JSMENUITEM|LLL|LOAD_REGISTER|NO|PAGE|RECORDS|RESTORE_REGISTER|TEMPLATE|TEXT|TMENU|TMENUITEM|TMENU_LAYERS|USER|USER_INT|_GIFBUILDER|global|globalString|globalVar)\b/;n.languages.typoscript={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:= \t]|(?:^|[^= \t])[ \t]+)\/\/.*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^"'])#.*/,lookbehind:!0,greedy:!0}],function:[{pattern://,inside:{string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,inside:{keyword:r}},keyword:{pattern:/INCLUDE_TYPOSCRIPT/}}},{pattern:/@import\s*(?:"[^"\r\n]*"|'[^'\r\n]*')/,inside:{string:/"[^"\r\n]*"|'[^'\r\n]*'/}}],string:{pattern:/^([^=]*=[< ]?)(?:(?!\]\n).)*/,lookbehind:!0,inside:{function:/\{\$.*\}/,keyword:r,number:/^\d+$/,punctuation:/[,|:]/}},keyword:r,number:{pattern:/\b\d+\s*[.{=]/,inside:{operator:/[.{=]/}},tag:{pattern:/\.?[-\w\\]+\.?/,inside:{punctuation:/\./}},punctuation:/[{}[\];(),.:|]/,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/},n.languages.tsconfig=n.languages.typoscript})(t)}return nE}var rE,qM;function swe(){if(qM)return rE;qM=1,rE=e,e.displayName="unrealscript",e.aliases=["uc","uscript"];function e(t){t.languages.unrealscript={comment:/\/\/.*|\/\*[\s\S]*?\*\//,string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},category:{pattern:/(\b(?:(?:autoexpand|hide|show)categories|var)\s*\()[^()]+(?=\))/,lookbehind:!0,greedy:!0,alias:"property"},metadata:{pattern:/(\w\s*)<\s*\w+\s*=[^<>|=\r\n]+(?:\|\s*\w+\s*=[^<>|=\r\n]+)*>/,lookbehind:!0,greedy:!0,inside:{property:/\b\w+(?=\s*=)/,operator:/=/,punctuation:/[<>|]/}},macro:{pattern:/`\w+/,alias:"property"},"class-name":{pattern:/(\b(?:class|enum|extends|interface|state(?:\(\))?|struct|within)\s+)\w+/,lookbehind:!0},keyword:/\b(?:abstract|actor|array|auto|autoexpandcategories|bool|break|byte|case|class|classgroup|client|coerce|collapsecategories|config|const|continue|default|defaultproperties|delegate|dependson|deprecated|do|dontcollapsecategories|editconst|editinlinenew|else|enum|event|exec|export|extends|final|float|for|forcescriptorder|foreach|function|goto|guid|hidecategories|hidedropdown|if|ignores|implements|inherits|input|int|interface|iterator|latent|local|material|name|native|nativereplication|noexport|nontransient|noteditinlinenew|notplaceable|operator|optional|out|pawn|perobjectconfig|perobjectlocalized|placeable|postoperator|preoperator|private|protected|reliable|replication|return|server|showcategories|simulated|singular|state|static|string|struct|structdefault|structdefaultproperties|switch|texture|transient|travel|unreliable|until|var|vector|while|within)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,boolean:/\b(?:false|true)\b/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/>>|<<|--|\+\+|\*\*|[-+*/~!=<>$@]=?|&&?|\|\|?|\^\^?|[?:%]|\b(?:ClockwiseFrom|Cross|Dot)\b/,punctuation:/[()[\]{};,.]/},t.languages.uc=t.languages.uscript=t.languages.unrealscript}return rE}var aE,GM;function lwe(){if(GM)return aE;GM=1,aE=e,e.displayName="uorazor",e.aliases=[];function e(t){t.languages.uorazor={"comment-hash":{pattern:/#.*/,alias:"comment",greedy:!0},"comment-slash":{pattern:/\/\/.*/,alias:"comment",greedy:!0},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,inside:{punctuation:/^['"]|['"]$/},greedy:!0},"source-layers":{pattern:/\b(?:arms|backpack|blue|bracelet|cancel|clear|cloak|criminal|earrings|enemy|facialhair|friend|friendly|gloves|gray|grey|ground|hair|head|innerlegs|innertorso|innocent|lefthand|middletorso|murderer|neck|nonfriendly|onehandedsecondary|outerlegs|outertorso|pants|red|righthand|ring|self|shirt|shoes|talisman|waist)\b/i,alias:"function"},"source-commands":{pattern:/\b(?:alliance|attack|cast|clearall|clearignore|clearjournal|clearlist|clearsysmsg|createlist|createtimer|dclick|dclicktype|dclickvar|dress|dressconfig|drop|droprelloc|emote|getlabel|guild|gumpclose|gumpresponse|hotkey|ignore|lasttarget|lift|lifttype|menu|menuresponse|msg|org|organize|organizer|overhead|pause|poplist|potion|promptresponse|pushlist|removelist|removetimer|rename|restock|say|scav|scavenger|script|setability|setlasttarget|setskill|settimer|setvar|sysmsg|target|targetloc|targetrelloc|targettype|undress|unignore|unsetvar|useobject|useonce|useskill|usetype|virtue|wait|waitforgump|waitformenu|waitforprompt|waitforstat|waitforsysmsg|waitfortarget|walk|wfsysmsg|wft|whisper|yell)\b/,alias:"function"},"tag-name":{pattern:/(^\{%-?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%]-?|-?[%}]\}$/,alias:"punctuation"},function:/\b(?:atlist|close|closest|count|counter|counttype|dead|dex|diffhits|diffmana|diffstam|diffweight|find|findbuff|finddebuff|findlayer|findtype|findtypelist|followers|gumpexists|hidden|hits|hp|hue|human|humanoid|ingump|inlist|insysmessage|insysmsg|int|invul|lhandempty|list|listexists|mana|maxhits|maxhp|maxmana|maxstam|maxweight|monster|mounted|name|next|noto|paralyzed|poisoned|position|prev|previous|queued|rand|random|rhandempty|skill|stam|str|targetexists|timer|timerexists|varexist|warmode|weight)\b/,keyword:/\b(?:and|as|break|continue|else|elseif|endfor|endif|endwhile|for|if|loop|not|or|replay|stop|while)\b/,boolean:/\b(?:false|null|true)\b/,number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,operator:[{pattern:/(\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,lookbehind:!0},/[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/],punctuation:/[()\[\]{}:.,]/}}return aE}var oE,WM;function cwe(){if(WM)return oE;WM=1,oE=e,e.displayName="uri",e.aliases=["url"];function e(t){t.languages.uri={scheme:{pattern:/^[a-z][a-z0-9+.-]*:/im,greedy:!0,inside:{"scheme-delimiter":/:$/}},fragment:{pattern:/#[\w\-.~!$&'()*+,;=%:@/?]*/,inside:{"fragment-delimiter":/^#/}},query:{pattern:/\?[\w\-.~!$&'()*+,;=%:@/?]*/,inside:{"query-delimiter":{pattern:/^\?/,greedy:!0},"pair-delimiter":/[&;]/,pair:{pattern:/^[^=][\s\S]*/,inside:{key:/^[^=]+/,value:{pattern:/(^=)[\s\S]+/,lookbehind:!0}}}}},authority:{pattern:RegExp(/^\/\//.source+/(?:[\w\-.~!$&'()*+,;=%:]*@)?/.source+("(?:"+/\[(?:[0-9a-fA-F:.]{2,48}|v[0-9a-fA-F]+\.[\w\-.~!$&'()*+,;=]+)\]/.source+"|"+/[\w\-.~!$&'()*+,;=%]*/.source+")")+/(?::\d*)?/.source,"m"),inside:{"authority-delimiter":/^\/\//,"user-info-segment":{pattern:/^[\w\-.~!$&'()*+,;=%:]*@/,inside:{"user-info-delimiter":/@$/,"user-info":/^[\w\-.~!$&'()*+,;=%:]+/}},"port-segment":{pattern:/:\d*$/,inside:{"port-delimiter":/^:/,port:/^\d+/}},host:{pattern:/[\s\S]+/,inside:{"ip-literal":{pattern:/^\[[\s\S]+\]$/,inside:{"ip-literal-delimiter":/^\[|\]$/,"ipv-future":/^v[\s\S]+/,"ipv6-address":/^[\s\S]+/}},"ipv4-address":/^(?:(?:[03-9]\d?|[12]\d{0,2})\.){3}(?:[03-9]\d?|[12]\d{0,2})$/}}}},path:{pattern:/^[\w\-.~!$&'()*+,;=%:@/]+/m,inside:{"path-separator":/\//}}},t.languages.url=t.languages.uri}return oE}var iE,KM;function uwe(){if(KM)return iE;KM=1,iE=e,e.displayName="v",e.aliases=[];function e(t){(function(n){var r={pattern:/[\s\S]+/,inside:null};n.languages.v=n.languages.extend("clike",{string:{pattern:/r?(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,alias:"quoted-string",greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:\{[^{}]*\}|\w+(?:\.\w+(?:\([^\(\)]*\))?|\[[^\[\]]+\])*)/,lookbehind:!0,inside:{"interpolation-variable":{pattern:/^\$\w[\s\S]*$/,alias:"variable"},"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},"interpolation-expression":r}}}},"class-name":{pattern:/(\b(?:enum|interface|struct|type)\s+)(?:C\.)?\w+/,lookbehind:!0},keyword:/(?:\b(?:__global|as|asm|assert|atomic|break|chan|const|continue|defer|else|embed|enum|fn|for|go(?:to)?|if|import|in|interface|is|lock|match|module|mut|none|or|pub|return|rlock|select|shared|sizeof|static|struct|type(?:of)?|union|unsafe)|\$(?:else|for|if)|#(?:flag|include))\b/,number:/\b(?:0x[a-f\d]+(?:_[a-f\d]+)*|0b[01]+(?:_[01]+)*|0o[0-7]+(?:_[0-7]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?)\b/i,operator:/~|\?|[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\.?/,builtin:/\b(?:any(?:_float|_int)?|bool|byte(?:ptr)?|charptr|f(?:32|64)|i(?:8|16|64|128|nt)|rune|size_t|string|u(?:16|32|64|128)|voidptr)\b/}),r.inside=n.languages.v,n.languages.insertBefore("v","string",{char:{pattern:/`(?:\\`|\\?[^`]{1,2})`/,alias:"rune"}}),n.languages.insertBefore("v","operator",{attribute:{pattern:/(^[\t ]*)\[(?:deprecated|direct_array_access|flag|inline|live|ref_only|typedef|unsafe_fn|windows_stdcall)\]/m,lookbehind:!0,alias:"annotation",inside:{punctuation:/[\[\]]/,keyword:/\w+/}},generic:{pattern:/<\w+>(?=\s*[\)\{])/,inside:{punctuation:/[<>]/,"class-name":/\w+/}}}),n.languages.insertBefore("v","function",{"generic-function":{pattern:/\b\w+\s*<\w+>(?=\()/,inside:{function:/^\w+/,generic:{pattern:/<\w+>/,inside:n.languages.v.generic.inside}}}})})(t)}return iE}var sE,YM;function dwe(){if(YM)return sE;YM=1,sE=e,e.displayName="vala",e.aliases=[];function e(t){t.languages.vala=t.languages.extend("clike",{"class-name":[{pattern:/\b[A-Z]\w*(?:\.\w+)*\b(?=(?:\?\s+|\*?\s+\*?)\w)/,inside:{punctuation:/\./}},{pattern:/(\[)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/(\b(?:class|interface)\s+[A-Z]\w*(?:\.\w+)*\s*:\s*)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/((?:\b(?:class|enum|interface|new|struct)\s+)|(?:catch\s+\())[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}}],keyword:/\b(?:abstract|as|assert|async|base|bool|break|case|catch|char|class|const|construct|continue|default|delegate|delete|do|double|dynamic|else|ensures|enum|errordomain|extern|finally|float|for|foreach|get|if|in|inline|int|int16|int32|int64|int8|interface|internal|is|lock|long|namespace|new|null|out|override|owned|params|private|protected|public|ref|requires|return|set|short|signal|sizeof|size_t|ssize_t|static|string|struct|switch|this|throw|throws|try|typeof|uchar|uint|uint16|uint32|uint64|uint8|ulong|unichar|unowned|ushort|using|value|var|virtual|void|volatile|weak|while|yield)\b/i,function:/\b\w+(?=\s*\()/,number:/(?:\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)(?:f|u?l?)?/i,operator:/\+\+|--|&&|\|\||<<=?|>>=?|=>|->|~|[+\-*\/%&^|=!<>]=?|\?\??|\.\.\./,punctuation:/[{}[\];(),.:]/,constant:/\b[A-Z0-9_]+\b/}),t.languages.insertBefore("vala","string",{"raw-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},"template-string":{pattern:/@"[\s\S]*?"/,greedy:!0,inside:{interpolation:{pattern:/\$(?:\([^)]*\)|[a-zA-Z]\w*)/,inside:{delimiter:{pattern:/^\$\(?|\)$/,alias:"punctuation"},rest:t.languages.vala}},string:/[\s\S]+/}}}),t.languages.insertBefore("vala","keyword",{regex:{pattern:/\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[imsx]{0,4}(?=\s*(?:$|[\r\n,.;})\]]))/,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:t.languages.regex},"regex-delimiter":/^\//,"regex-flags":/^[a-z]+$/}}})}return sE}var lE,ZM;function fwe(){if(ZM)return lE;ZM=1,lE=e,e.displayName="velocity",e.aliases=[];function e(t){(function(n){n.languages.velocity=n.languages.extend("markup",{});var r={variable:{pattern:/(^|[^\\](?:\\\\)*)\$!?(?:[a-z][\w-]*(?:\([^)]*\))?(?:\.[a-z][\w-]*(?:\([^)]*\))?|\[[^\]]+\])*|\{[^}]+\})/i,lookbehind:!0,inside:{}},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},number:/\b\d+\b/,boolean:/\b(?:false|true)\b/,operator:/[=!<>]=?|[+*/%-]|&&|\|\||\.\.|\b(?:eq|g[et]|l[et]|n(?:e|ot))\b/,punctuation:/[(){}[\]:,.]/};r.variable.inside={string:r.string,function:{pattern:/([^\w-])[a-z][\w-]*(?=\()/,lookbehind:!0},number:r.number,boolean:r.boolean,punctuation:r.punctuation},n.languages.insertBefore("velocity","comment",{unparsed:{pattern:/(^|[^\\])#\[\[[\s\S]*?\]\]#/,lookbehind:!0,greedy:!0,inside:{punctuation:/^#\[\[|\]\]#$/}},"velocity-comment":[{pattern:/(^|[^\\])#\*[\s\S]*?\*#/,lookbehind:!0,greedy:!0,alias:"comment"},{pattern:/(^|[^\\])##.*/,lookbehind:!0,greedy:!0,alias:"comment"}],directive:{pattern:/(^|[^\\](?:\\\\)*)#@?(?:[a-z][\w-]*|\{[a-z][\w-]*\})(?:\s*\((?:[^()]|\([^()]*\))*\))?/i,lookbehind:!0,inside:{keyword:{pattern:/^#@?(?:[a-z][\w-]*|\{[a-z][\w-]*\})|\bin\b/,inside:{punctuation:/[{}]/}},rest:r}},variable:r.variable}),n.languages.velocity.tag.inside["attr-value"].inside.rest=n.languages.velocity})(t)}return lE}var cE,XM;function pwe(){if(XM)return cE;XM=1,cE=e,e.displayName="verilog",e.aliases=[];function e(t){t.languages.verilog={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"kernel-function":{pattern:/\B\$\w+\b/,alias:"property"},constant:/\B`\w+\b/,function:/\b\w+(?=\()/,keyword:/\b(?:alias|and|assert|assign|assume|automatic|before|begin|bind|bins|binsof|bit|break|buf|bufif0|bufif1|byte|case|casex|casez|cell|chandle|class|clocking|cmos|config|const|constraint|context|continue|cover|covergroup|coverpoint|cross|deassign|default|defparam|design|disable|dist|do|edge|else|end|endcase|endclass|endclocking|endconfig|endfunction|endgenerate|endgroup|endinterface|endmodule|endpackage|endprimitive|endprogram|endproperty|endsequence|endspecify|endtable|endtask|enum|event|expect|export|extends|extern|final|first_match|for|force|foreach|forever|fork|forkjoin|function|generate|genvar|highz0|highz1|if|iff|ifnone|ignore_bins|illegal_bins|import|incdir|include|initial|inout|input|inside|instance|int|integer|interface|intersect|join|join_any|join_none|large|liblist|library|local|localparam|logic|longint|macromodule|matches|medium|modport|module|nand|negedge|new|nmos|nor|noshowcancelled|not|notif0|notif1|null|or|output|package|packed|parameter|pmos|posedge|primitive|priority|program|property|protected|pull0|pull1|pulldown|pullup|pulsestyle_ondetect|pulsestyle_onevent|pure|rand|randc|randcase|randsequence|rcmos|real|realtime|ref|reg|release|repeat|return|rnmos|rpmos|rtran|rtranif0|rtranif1|scalared|sequence|shortint|shortreal|showcancelled|signed|small|solve|specify|specparam|static|string|strong0|strong1|struct|super|supply0|supply1|table|tagged|task|this|throughout|time|timeprecision|timeunit|tran|tranif0|tranif1|tri|tri0|tri1|triand|trior|trireg|type|typedef|union|unique|unsigned|use|uwire|var|vectored|virtual|void|wait|wait_order|wand|weak0|weak1|while|wildcard|wire|with|within|wor|xnor|xor)\b/,important:/\b(?:always|always_comb|always_ff|always_latch)\b(?: *@)?/,number:/\B##?\d+|(?:\b\d+)?'[odbh] ?[\da-fzx_?]+|\b(?:\d*[._])?\d+(?:e[-+]?\d+)?/i,operator:/[-+{}^~%*\/?=!<>&|]+/,punctuation:/[[\];(),.:]/}}return cE}var uE,QM;function gwe(){if(QM)return uE;QM=1,uE=e,e.displayName="vhdl",e.aliases=[];function e(t){t.languages.vhdl={comment:/--.+/,"vhdl-vectors":{pattern:/\b[oxb]"[\da-f_]+"|"[01uxzwlh-]+"/i,alias:"number"},"quoted-function":{pattern:/"\S+?"(?=\()/,alias:"function"},string:/"(?:[^\\"\r\n]|\\(?:\r\n|[\s\S]))*"/,constant:/\b(?:library|use)\b/i,keyword:/\b(?:'active|'ascending|'base|'delayed|'driving|'driving_value|'event|'high|'image|'instance_name|'last_active|'last_event|'last_value|'left|'leftof|'length|'low|'path_name|'pos|'pred|'quiet|'range|'reverse_range|'right|'rightof|'simple_name|'stable|'succ|'transaction|'val|'value|access|after|alias|all|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|new|next|null|of|on|open|others|out|package|port|postponed|procedure|process|pure|range|record|register|reject|report|return|select|severity|shared|signal|subtype|then|to|transport|type|unaffected|units|until|use|variable|wait|when|while|with)\b/i,boolean:/\b(?:false|true)\b/i,function:/\w+(?=\()/,number:/'[01uxzwlh-]'|\b(?:\d+#[\da-f_.]+#|\d[\d_.]*)(?:e[-+]?\d+)?/i,operator:/[<>]=?|:=|[-+*/&=]|\b(?:abs|and|mod|nand|nor|not|or|rem|rol|ror|sla|sll|sra|srl|xnor|xor)\b/i,punctuation:/[{}[\];(),.:]/}}return uE}var dE,JM;function mwe(){if(JM)return dE;JM=1,dE=e,e.displayName="vim",e.aliases=[];function e(t){t.languages.vim={string:/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\r\n]|'')*'/,comment:/".*/,function:/\b\w+(?=\()/,keyword:/\b(?:N|Next|P|Print|X|XMLent|XMLns|ab|abbreviate|abc|abclear|abo|aboveleft|al|all|ar|arga|argadd|argd|argdelete|argdo|arge|argedit|argg|argglobal|argl|arglocal|args|argu|argument|as|ascii|b|bN|bNext|ba|bad|badd|ball|bd|bdelete|be|bel|belowright|bf|bfirst|bl|blast|bm|bmodified|bn|bnext|bo|botright|bp|bprevious|br|brea|break|breaka|breakadd|breakd|breakdel|breakl|breaklist|brewind|bro|browse|bufdo|buffer|buffers|bun|bunload|bw|bwipeout|c|cN|cNext|cNfcNfile|ca|cabbrev|cabc|cabclear|cad|caddb|caddbuffer|caddexpr|caddf|caddfile|cal|call|cat|catch|cb|cbuffer|cc|ccl|cclose|cd|ce|center|cex|cexpr|cf|cfile|cfir|cfirst|cg|cgetb|cgetbuffer|cgete|cgetexpr|cgetfile|change|changes|chd|chdir|che|checkpath|checkt|checktime|cl|cla|clast|clist|clo|close|cmapc|cmapclear|cn|cnew|cnewer|cnext|cnf|cnfile|cnorea|cnoreabbrev|co|col|colder|colo|colorscheme|comc|comclear|comp|compiler|con|conf|confirm|continue|cope|copen|copy|cp|cpf|cpfile|cprevious|cq|cquit|cr|crewind|cu|cuna|cunabbrev|cunmap|cw|cwindow|d|debugg|debuggreedy|delc|delcommand|delete|delf|delfunction|delm|delmarks|di|diffg|diffget|diffoff|diffpatch|diffpu|diffput|diffsplit|diffthis|diffu|diffupdate|dig|digraphs|display|dj|djump|dl|dlist|dr|drop|ds|dsearch|dsp|dsplit|e|earlier|echoe|echoerr|echom|echomsg|echon|edit|el|else|elsei|elseif|em|emenu|en|endf|endfo|endfor|endfun|endfunction|endif|endt|endtry|endw|endwhile|ene|enew|ex|exi|exit|exu|exusage|f|file|files|filetype|fin|fina|finally|find|fini|finish|fir|first|fix|fixdel|fo|fold|foldc|foldclose|foldd|folddoc|folddoclosed|folddoopen|foldo|foldopen|for|fu|fun|function|go|goto|gr|grep|grepa|grepadd|h|ha|hardcopy|help|helpf|helpfind|helpg|helpgrep|helpt|helptags|hid|hide|his|history|ia|iabbrev|iabc|iabclear|if|ij|ijump|il|ilist|imapc|imapclear|in|inorea|inoreabbrev|isearch|isp|isplit|iu|iuna|iunabbrev|iunmap|j|join|ju|jumps|k|kee|keepalt|keepj|keepjumps|keepmarks|l|lN|lNext|lNf|lNfile|la|lad|laddb|laddbuffer|laddexpr|laddf|laddfile|lan|language|last|later|lb|lbuffer|lc|lcd|lch|lchdir|lcl|lclose|left|lefta|leftabove|let|lex|lexpr|lf|lfile|lfir|lfirst|lg|lgetb|lgetbuffer|lgete|lgetexpr|lgetfile|lgr|lgrep|lgrepa|lgrepadd|lh|lhelpgrep|list|ll|lla|llast|lli|llist|lm|lmak|lmake|lmap|lmapc|lmapclear|ln|lne|lnew|lnewer|lnext|lnf|lnfile|lnoremap|lo|loadview|loc|lockmarks|lockv|lockvar|lol|lolder|lop|lopen|lp|lpf|lpfile|lprevious|lr|lrewind|ls|lt|ltag|lu|lunmap|lv|lvimgrep|lvimgrepa|lvimgrepadd|lw|lwindow|m|ma|mak|make|mark|marks|mat|match|menut|menutranslate|mk|mkexrc|mks|mksession|mksp|mkspell|mkv|mkvie|mkview|mkvimrc|mod|mode|move|mz|mzf|mzfile|mzscheme|n|nbkey|new|next|nmapc|nmapclear|noh|nohlsearch|norea|noreabbrev|nu|number|nun|nunmap|o|omapc|omapclear|on|only|open|opt|options|ou|ounmap|p|pc|pclose|pe|ped|pedit|perl|perld|perldo|po|pop|popu|popup|pp|ppop|pre|preserve|prev|previous|print|prof|profd|profdel|profile|promptf|promptfind|promptr|promptrepl|ps|psearch|ptN|ptNext|pta|ptag|ptf|ptfirst|ptj|ptjump|ptl|ptlast|ptn|ptnext|ptp|ptprevious|ptr|ptrewind|pts|ptselect|pu|put|pw|pwd|py|pyf|pyfile|python|q|qa|qall|quit|quita|quitall|r|read|rec|recover|red|redi|redir|redo|redr|redraw|redraws|redrawstatus|reg|registers|res|resize|ret|retab|retu|return|rew|rewind|ri|right|rightb|rightbelow|ru|rub|ruby|rubyd|rubydo|rubyf|rubyfile|runtime|rv|rviminfo|sN|sNext|sa|sal|sall|san|sandbox|sargument|sav|saveas|sb|sbN|sbNext|sba|sball|sbf|sbfirst|sbl|sblast|sbm|sbmodified|sbn|sbnext|sbp|sbprevious|sbr|sbrewind|sbuffer|scrip|scripte|scriptencoding|scriptnames|se|set|setf|setfiletype|setg|setglobal|setl|setlocal|sf|sfind|sfir|sfirst|sh|shell|sign|sil|silent|sim|simalt|sl|sla|slast|sleep|sm|smagic|smap|smapc|smapclear|sme|smenu|sn|snext|sni|sniff|sno|snomagic|snor|snoremap|snoreme|snoremenu|so|sor|sort|source|sp|spe|spelld|spelldump|spellgood|spelli|spellinfo|spellr|spellrepall|spellu|spellundo|spellw|spellwrong|split|spr|sprevious|sre|srewind|st|sta|stag|star|startg|startgreplace|startinsert|startr|startreplace|stj|stjump|stop|stopi|stopinsert|sts|stselect|sun|sunhide|sunm|sunmap|sus|suspend|sv|sview|syncbind|t|tN|tNext|ta|tab|tabN|tabNext|tabc|tabclose|tabd|tabdo|tabe|tabedit|tabf|tabfind|tabfir|tabfirst|tabl|tablast|tabm|tabmove|tabn|tabnew|tabnext|tabo|tabonly|tabp|tabprevious|tabr|tabrewind|tabs|tag|tags|tc|tcl|tcld|tcldo|tclf|tclfile|te|tearoff|tf|tfirst|th|throw|tj|tjump|tl|tlast|tm|tmenu|tn|tnext|to|topleft|tp|tprevious|tr|trewind|try|ts|tselect|tu|tunmenu|u|una|unabbreviate|undo|undoj|undojoin|undol|undolist|unh|unhide|unlet|unlo|unlockvar|unm|unmap|up|update|ve|verb|verbose|version|vert|vertical|vi|vie|view|vim|vimgrep|vimgrepa|vimgrepadd|visual|viu|viusage|vmapc|vmapclear|vne|vnew|vs|vsplit|vu|vunmap|w|wN|wNext|wa|wall|wh|while|win|winc|wincmd|windo|winp|winpos|winsize|wn|wnext|wp|wprevious|wq|wqa|wqall|write|ws|wsverb|wv|wviminfo|x|xa|xall|xit|xm|xmap|xmapc|xmapclear|xme|xmenu|xn|xnoremap|xnoreme|xnoremenu|xu|xunmap|y|yank)\b/,builtin:/\b(?:acd|ai|akm|aleph|allowrevins|altkeymap|ambiwidth|ambw|anti|antialias|arab|arabic|arabicshape|ari|arshape|autochdir|autocmd|autoindent|autoread|autowrite|autowriteall|aw|awa|background|backspace|backup|backupcopy|backupdir|backupext|backupskip|balloondelay|ballooneval|balloonexpr|bdir|bdlay|beval|bex|bexpr|bg|bh|bin|binary|biosk|bioskey|bk|bkc|bomb|breakat|brk|browsedir|bs|bsdir|bsk|bt|bufhidden|buflisted|buftype|casemap|ccv|cdpath|cedit|cfu|ch|charconvert|ci|cin|cindent|cink|cinkeys|cino|cinoptions|cinw|cinwords|clipboard|cmdheight|cmdwinheight|cmp|cms|columns|com|comments|commentstring|compatible|complete|completefunc|completeopt|consk|conskey|copyindent|cot|cpo|cpoptions|cpt|cscopepathcomp|cscopeprg|cscopequickfix|cscopetag|cscopetagorder|cscopeverbose|cspc|csprg|csqf|cst|csto|csverb|cuc|cul|cursorcolumn|cursorline|cwh|debug|deco|def|define|delcombine|dex|dg|dict|dictionary|diff|diffexpr|diffopt|digraph|dip|dir|directory|dy|ea|ead|eadirection|eb|ed|edcompatible|ef|efm|ei|ek|enc|encoding|endofline|eol|ep|equalalways|equalprg|errorbells|errorfile|errorformat|esckeys|et|eventignore|expandtab|exrc|fcl|fcs|fdc|fde|fdi|fdl|fdls|fdm|fdn|fdo|fdt|fen|fenc|fencs|fex|ff|ffs|fileencoding|fileencodings|fileformat|fileformats|fillchars|fk|fkmap|flp|fml|fmr|foldcolumn|foldenable|foldexpr|foldignore|foldlevel|foldlevelstart|foldmarker|foldmethod|foldminlines|foldnestmax|foldtext|formatexpr|formatlistpat|formatoptions|formatprg|fp|fs|fsync|ft|gcr|gd|gdefault|gfm|gfn|gfs|gfw|ghr|gp|grepformat|grepprg|gtl|gtt|guicursor|guifont|guifontset|guifontwide|guiheadroom|guioptions|guipty|guitablabel|guitabtooltip|helpfile|helpheight|helplang|hf|hh|hi|hidden|highlight|hk|hkmap|hkmapp|hkp|hl|hlg|hls|hlsearch|ic|icon|iconstring|ignorecase|im|imactivatekey|imak|imc|imcmdline|imd|imdisable|imi|iminsert|ims|imsearch|inc|include|includeexpr|incsearch|inde|indentexpr|indentkeys|indk|inex|inf|infercase|insertmode|invacd|invai|invakm|invallowrevins|invaltkeymap|invanti|invantialias|invar|invarab|invarabic|invarabicshape|invari|invarshape|invautochdir|invautoindent|invautoread|invautowrite|invautowriteall|invaw|invawa|invbackup|invballooneval|invbeval|invbin|invbinary|invbiosk|invbioskey|invbk|invbl|invbomb|invbuflisted|invcf|invci|invcin|invcindent|invcompatible|invconfirm|invconsk|invconskey|invcopyindent|invcp|invcscopetag|invcscopeverbose|invcst|invcsverb|invcuc|invcul|invcursorcolumn|invcursorline|invdeco|invdelcombine|invdg|invdiff|invdigraph|invdisable|invea|inveb|inved|invedcompatible|invek|invendofline|inveol|invequalalways|inverrorbells|invesckeys|invet|invex|invexpandtab|invexrc|invfen|invfk|invfkmap|invfoldenable|invgd|invgdefault|invguipty|invhid|invhidden|invhk|invhkmap|invhkmapp|invhkp|invhls|invhlsearch|invic|invicon|invignorecase|invim|invimc|invimcmdline|invimd|invincsearch|invinf|invinfercase|invinsertmode|invis|invjoinspaces|invjs|invlazyredraw|invlbr|invlinebreak|invlisp|invlist|invloadplugins|invlpl|invlz|invma|invmacatsui|invmagic|invmh|invml|invmod|invmodeline|invmodifiable|invmodified|invmore|invmousef|invmousefocus|invmousehide|invnu|invnumber|invodev|invopendevice|invpaste|invpi|invpreserveindent|invpreviewwindow|invprompt|invpvw|invreadonly|invremap|invrestorescreen|invrevins|invri|invrightleft|invrightleftcmd|invrl|invrlc|invro|invrs|invru|invruler|invsb|invsc|invscb|invscrollbind|invscs|invsecure|invsft|invshellslash|invshelltemp|invshiftround|invshortname|invshowcmd|invshowfulltag|invshowmatch|invshowmode|invsi|invsm|invsmartcase|invsmartindent|invsmarttab|invsmd|invsn|invsol|invspell|invsplitbelow|invsplitright|invspr|invsr|invssl|invsta|invstartofline|invstmp|invswapfile|invswf|invta|invtagbsearch|invtagrelative|invtagstack|invtbi|invtbidi|invtbs|invtermbidi|invterse|invtextauto|invtextmode|invtf|invtgst|invtildeop|invtimeout|invtitle|invto|invtop|invtr|invttimeout|invttybuiltin|invttyfast|invtx|invvb|invvisualbell|invwa|invwarn|invwb|invweirdinvert|invwfh|invwfw|invwildmenu|invwinfixheight|invwinfixwidth|invwiv|invwmnu|invwrap|invwrapscan|invwrite|invwriteany|invwritebackup|invws|isf|isfname|isi|isident|isk|iskeyword|isprint|joinspaces|js|key|keymap|keymodel|keywordprg|km|kmp|kp|langmap|langmenu|laststatus|lazyredraw|lbr|lcs|linebreak|lines|linespace|lisp|lispwords|listchars|loadplugins|lpl|lsp|lz|macatsui|magic|makeef|makeprg|matchpairs|matchtime|maxcombine|maxfuncdepth|maxmapdepth|maxmem|maxmempattern|maxmemtot|mco|mef|menuitems|mfd|mh|mis|mkspellmem|ml|mls|mm|mmd|mmp|mmt|modeline|modelines|modifiable|modified|more|mouse|mousef|mousefocus|mousehide|mousem|mousemodel|mouses|mouseshape|mouset|mousetime|mp|mps|msm|mzq|mzquantum|nf|noacd|noai|noakm|noallowrevins|noaltkeymap|noanti|noantialias|noar|noarab|noarabic|noarabicshape|noari|noarshape|noautochdir|noautoindent|noautoread|noautowrite|noautowriteall|noaw|noawa|nobackup|noballooneval|nobeval|nobin|nobinary|nobiosk|nobioskey|nobk|nobl|nobomb|nobuflisted|nocf|noci|nocin|nocindent|nocompatible|noconfirm|noconsk|noconskey|nocopyindent|nocp|nocscopetag|nocscopeverbose|nocst|nocsverb|nocuc|nocul|nocursorcolumn|nocursorline|nodeco|nodelcombine|nodg|nodiff|nodigraph|nodisable|noea|noeb|noed|noedcompatible|noek|noendofline|noeol|noequalalways|noerrorbells|noesckeys|noet|noex|noexpandtab|noexrc|nofen|nofk|nofkmap|nofoldenable|nogd|nogdefault|noguipty|nohid|nohidden|nohk|nohkmap|nohkmapp|nohkp|nohls|noic|noicon|noignorecase|noim|noimc|noimcmdline|noimd|noincsearch|noinf|noinfercase|noinsertmode|nois|nojoinspaces|nojs|nolazyredraw|nolbr|nolinebreak|nolisp|nolist|noloadplugins|nolpl|nolz|noma|nomacatsui|nomagic|nomh|noml|nomod|nomodeline|nomodifiable|nomodified|nomore|nomousef|nomousefocus|nomousehide|nonu|nonumber|noodev|noopendevice|nopaste|nopi|nopreserveindent|nopreviewwindow|noprompt|nopvw|noreadonly|noremap|norestorescreen|norevins|nori|norightleft|norightleftcmd|norl|norlc|noro|nors|noru|noruler|nosb|nosc|noscb|noscrollbind|noscs|nosecure|nosft|noshellslash|noshelltemp|noshiftround|noshortname|noshowcmd|noshowfulltag|noshowmatch|noshowmode|nosi|nosm|nosmartcase|nosmartindent|nosmarttab|nosmd|nosn|nosol|nospell|nosplitbelow|nosplitright|nospr|nosr|nossl|nosta|nostartofline|nostmp|noswapfile|noswf|nota|notagbsearch|notagrelative|notagstack|notbi|notbidi|notbs|notermbidi|noterse|notextauto|notextmode|notf|notgst|notildeop|notimeout|notitle|noto|notop|notr|nottimeout|nottybuiltin|nottyfast|notx|novb|novisualbell|nowa|nowarn|nowb|noweirdinvert|nowfh|nowfw|nowildmenu|nowinfixheight|nowinfixwidth|nowiv|nowmnu|nowrap|nowrapscan|nowrite|nowriteany|nowritebackup|nows|nrformats|numberwidth|nuw|odev|oft|ofu|omnifunc|opendevice|operatorfunc|opfunc|osfiletype|pa|para|paragraphs|paste|pastetoggle|patchexpr|patchmode|path|pdev|penc|pex|pexpr|pfn|ph|pheader|pi|pm|pmbcs|pmbfn|popt|preserveindent|previewheight|previewwindow|printdevice|printencoding|printexpr|printfont|printheader|printmbcharset|printmbfont|printoptions|prompt|pt|pumheight|pvh|pvw|qe|quoteescape|readonly|remap|report|restorescreen|revins|rightleft|rightleftcmd|rl|rlc|ro|rs|rtp|ruf|ruler|rulerformat|runtimepath|sbo|sc|scb|scr|scroll|scrollbind|scrolljump|scrolloff|scrollopt|scs|sect|sections|secure|sel|selection|selectmode|sessionoptions|sft|shcf|shellcmdflag|shellpipe|shellquote|shellredir|shellslash|shelltemp|shelltype|shellxquote|shiftround|shiftwidth|shm|shortmess|shortname|showbreak|showcmd|showfulltag|showmatch|showmode|showtabline|shq|si|sidescroll|sidescrolloff|siso|sj|slm|smartcase|smartindent|smarttab|smc|smd|softtabstop|sol|spc|spell|spellcapcheck|spellfile|spelllang|spellsuggest|spf|spl|splitbelow|splitright|sps|sr|srr|ss|ssl|ssop|stal|startofline|statusline|stl|stmp|su|sua|suffixes|suffixesadd|sw|swapfile|swapsync|swb|swf|switchbuf|sws|sxq|syn|synmaxcol|syntax|t_AB|t_AF|t_AL|t_CS|t_CV|t_Ce|t_Co|t_Cs|t_DL|t_EI|t_F1|t_F2|t_F3|t_F4|t_F5|t_F6|t_F7|t_F8|t_F9|t_IE|t_IS|t_K1|t_K3|t_K4|t_K5|t_K6|t_K7|t_K8|t_K9|t_KA|t_KB|t_KC|t_KD|t_KE|t_KF|t_KG|t_KH|t_KI|t_KJ|t_KK|t_KL|t_RI|t_RV|t_SI|t_Sb|t_Sf|t_WP|t_WS|t_ZH|t_ZR|t_al|t_bc|t_cd|t_ce|t_cl|t_cm|t_cs|t_da|t_db|t_dl|t_fs|t_k1|t_k2|t_k3|t_k4|t_k5|t_k6|t_k7|t_k8|t_k9|t_kB|t_kD|t_kI|t_kN|t_kP|t_kb|t_kd|t_ke|t_kh|t_kl|t_kr|t_ks|t_ku|t_le|t_mb|t_md|t_me|t_mr|t_ms|t_nd|t_op|t_se|t_so|t_sr|t_te|t_ti|t_ts|t_ue|t_us|t_ut|t_vb|t_ve|t_vi|t_vs|t_xs|tabline|tabpagemax|tabstop|tagbsearch|taglength|tagrelative|tagstack|tal|tb|tbi|tbidi|tbis|tbs|tenc|term|termbidi|termencoding|terse|textauto|textmode|textwidth|tgst|thesaurus|tildeop|timeout|timeoutlen|title|titlelen|titleold|titlestring|toolbar|toolbariconsize|top|tpm|tsl|tsr|ttimeout|ttimeoutlen|ttm|tty|ttybuiltin|ttyfast|ttym|ttymouse|ttyscroll|ttytype|tw|tx|uc|ul|undolevels|updatecount|updatetime|ut|vb|vbs|vdir|verbosefile|vfile|viewdir|viewoptions|viminfo|virtualedit|visualbell|vop|wak|warn|wb|wc|wcm|wd|weirdinvert|wfh|wfw|whichwrap|wi|wig|wildchar|wildcharm|wildignore|wildmenu|wildmode|wildoptions|wim|winaltkeys|window|winfixheight|winfixwidth|winheight|winminheight|winminwidth|winwidth|wiv|wiw|wm|wmh|wmnu|wmw|wop|wrap|wrapmargin|wrapscan|writeany|writebackup|writedelay|ww)\b/,number:/\b(?:0x[\da-f]+|\d+(?:\.\d+)?)\b/i,operator:/\|\||&&|[-+.]=?|[=!](?:[=~][#?]?)?|[<>]=?[#?]?|[*\/%?]|\b(?:is(?:not)?)\b/,punctuation:/[{}[\](),;:]/}}return dE}var fE,e5;function hwe(){if(e5)return fE;e5=1,fE=e,e.displayName="visualBasic",e.aliases=[];function e(t){t.languages["visual-basic"]={comment:{pattern:/(?:['‘’]|REM\b)(?:[^\r\n_]|_(?:\r\n?|\n)?)*/i,inside:{keyword:/^REM/i}},directive:{pattern:/#(?:Const|Else|ElseIf|End|ExternalChecksum|ExternalSource|If|Region)(?:\b_[ \t]*(?:\r\n?|\n)|.)+/i,alias:"property",greedy:!0},string:{pattern:/\$?["“”](?:["“”]{2}|[^"“”])*["“”]C?/i,greedy:!0},date:{pattern:/#[ \t]*(?:\d+([/-])\d+\1\d+(?:[ \t]+(?:\d+[ \t]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[ \t]*(?:AM|PM))?))?|\d+[ \t]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[ \t]*(?:AM|PM))?)[ \t]*#/i,alias:"number"},number:/(?:(?:\b\d+(?:\.\d+)?|\.\d+)(?:E[+-]?\d+)?|&[HO][\dA-F]+)(?:[FRD]|U?[ILS])?/i,boolean:/\b(?:False|Nothing|True)\b/i,keyword:/\b(?:AddHandler|AddressOf|Alias|And(?:Also)?|As|Boolean|ByRef|Byte|ByVal|Call|Case|Catch|C(?:Bool|Byte|Char|Date|Dbl|Dec|Int|Lng|Obj|SByte|Short|Sng|Str|Type|UInt|ULng|UShort)|Char|Class|Const|Continue|Currency|Date|Decimal|Declare|Default|Delegate|Dim|DirectCast|Do|Double|Each|Else(?:If)?|End(?:If)?|Enum|Erase|Error|Event|Exit|Finally|For|Friend|Function|Get(?:Type|XMLNamespace)?|Global|GoSub|GoTo|Handles|If|Implements|Imports|In|Inherits|Integer|Interface|Is|IsNot|Let|Lib|Like|Long|Loop|Me|Mod|Module|Must(?:Inherit|Override)|My(?:Base|Class)|Namespace|Narrowing|New|Next|Not(?:Inheritable|Overridable)?|Object|Of|On|Operator|Option(?:al)?|Or(?:Else)?|Out|Overloads|Overridable|Overrides|ParamArray|Partial|Private|Property|Protected|Public|RaiseEvent|ReadOnly|ReDim|RemoveHandler|Resume|Return|SByte|Select|Set|Shadows|Shared|short|Single|Static|Step|Stop|String|Structure|Sub|SyncLock|Then|Throw|To|Try|TryCast|Type|TypeOf|U(?:Integer|Long|Short)|Until|Using|Variant|Wend|When|While|Widening|With(?:Events)?|WriteOnly|Xor)\b/i,operator:/[+\-*/\\^<=>&#@$%!]|\b_(?=[ \t]*[\r\n])/,punctuation:/[{}().,:?]/},t.languages.vb=t.languages["visual-basic"],t.languages.vba=t.languages["visual-basic"]}return fE}var pE,t5;function bwe(){if(t5)return pE;t5=1,pE=e,e.displayName="warpscript",e.aliases=[];function e(t){t.languages.warpscript={comment:/#.*|\/\/.*|\/\*[\s\S]*?\*\//,string:{pattern:/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'|<'(?:[^\\']|'(?!>)|\\.)*'>/,greedy:!0},variable:/\$\S+/,macro:{pattern:/@\S+/,alias:"property"},keyword:/\b(?:BREAK|CHECKMACRO|CONTINUE|CUDF|DEFINED|DEFINEDMACRO|EVAL|FAIL|FOR|FOREACH|FORSTEP|IFT|IFTE|MSGFAIL|NRETURN|RETHROW|RETURN|SWITCH|TRY|UDF|UNTIL|WHILE)\b/,number:/[+-]?\b(?:NaN|Infinity|\d+(?:\.\d*)?(?:[Ee][+-]?\d+)?|0x[\da-fA-F]+|0b[01]+)\b/,boolean:/\b(?:F|T|false|true)\b/,punctuation:/<%|%>|[{}[\]()]/,operator:/==|&&?|\|\|?|\*\*?|>>>?|<<|[<>!~]=?|[-/%^]|\+!?|\b(?:AND|NOT|OR)\b/}}return pE}var gE,n5;function ywe(){if(n5)return gE;n5=1,gE=e,e.displayName="wasm",e.aliases=[];function e(t){t.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/}}return gE}var mE,r5;function vwe(){if(r5)return mE;r5=1,mE=e,e.displayName="webIdl",e.aliases=[];function e(t){(function(n){var r=/(?:\B-|\b_|\b)[A-Za-z][\w-]*(?![\w-])/.source,a="(?:"+/\b(?:unsigned\s+)?long\s+long(?![\w-])/.source+"|"+/\b(?:unrestricted|unsigned)\s+[a-z]+(?![\w-])/.source+"|"+/(?!(?:unrestricted|unsigned)\b)/.source+r+/(?:\s*<(?:[^<>]|<[^<>]*>)*>)?/.source+")"+/(?:\s*\?)?/.source,o={};n.languages["web-idl"]={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},string:{pattern:/"[^"]*"/,greedy:!0},namespace:{pattern:RegExp(/(\bnamespace\s+)/.source+r),lookbehind:!0},"class-name":[{pattern:/(^|[^\w-])(?:iterable|maplike|setlike)\s*<(?:[^<>]|<[^<>]*>)*>/,lookbehind:!0,inside:o},{pattern:RegExp(/(\b(?:attribute|const|deleter|getter|optional|setter)\s+)/.source+a),lookbehind:!0,inside:o},{pattern:RegExp("("+/\bcallback\s+/.source+r+/\s*=\s*/.source+")"+a),lookbehind:!0,inside:o},{pattern:RegExp(/(\btypedef\b\s*)/.source+a),lookbehind:!0,inside:o},{pattern:RegExp(/(\b(?:callback|dictionary|enum|interface(?:\s+mixin)?)\s+)(?!(?:interface|mixin)\b)/.source+r),lookbehind:!0},{pattern:RegExp(/(:\s*)/.source+r),lookbehind:!0},RegExp(r+/(?=\s+(?:implements|includes)\b)/.source),{pattern:RegExp(/(\b(?:implements|includes)\s+)/.source+r),lookbehind:!0},{pattern:RegExp(a+"(?="+/\s*(?:\.{3}\s*)?/.source+r+/\s*[(),;=]/.source+")"),inside:o}],builtin:/\b(?:ArrayBuffer|BigInt64Array|BigUint64Array|ByteString|DOMString|DataView|Float32Array|Float64Array|FrozenArray|Int16Array|Int32Array|Int8Array|ObservableArray|Promise|USVString|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray)\b/,keyword:[/\b(?:async|attribute|callback|const|constructor|deleter|dictionary|enum|getter|implements|includes|inherit|interface|mixin|namespace|null|optional|or|partial|readonly|required|setter|static|stringifier|typedef|unrestricted)\b/,/\b(?:any|bigint|boolean|byte|double|float|iterable|long|maplike|object|octet|record|sequence|setlike|short|symbol|undefined|unsigned|void)\b/],boolean:/\b(?:false|true)\b/,number:{pattern:/(^|[^\w-])-?(?:0x[0-9a-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|NaN|Infinity)(?![\w-])/i,lookbehind:!0},operator:/\.{3}|[=:?<>-]/,punctuation:/[(){}[\].,;]/};for(var i in n.languages["web-idl"])i!=="class-name"&&(o[i]=n.languages["web-idl"][i]);n.languages.webidl=n.languages["web-idl"]})(t)}return mE}var hE,a5;function Swe(){if(a5)return hE;a5=1,hE=e,e.displayName="wiki",e.aliases=[];function e(t){t.languages.wiki=t.languages.extend("markup",{"block-comment":{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0,alias:"comment"},heading:{pattern:/^(=+)[^=\r\n].*?\1/m,inside:{punctuation:/^=+|=+$/,important:/.+/}},emphasis:{pattern:/('{2,5}).+?\1/,inside:{"bold-italic":{pattern:/(''''').+?(?=\1)/,lookbehind:!0,alias:["bold","italic"]},bold:{pattern:/(''')[^'](?:.*?[^'])?(?=\1)/,lookbehind:!0},italic:{pattern:/('')[^'](?:.*?[^'])?(?=\1)/,lookbehind:!0},punctuation:/^''+|''+$/}},hr:{pattern:/^-{4,}/m,alias:"punctuation"},url:[/ISBN +(?:97[89][ -]?)?(?:\d[ -]?){9}[\dx]\b|(?:PMID|RFC) +\d+/i,/\[\[.+?\]\]|\[.+?\]/],variable:[/__[A-Z]+__/,/\{{3}.+?\}{3}/,/\{\{.+?\}\}/],symbol:[/^#redirect/im,/~{3,5}/],"table-tag":{pattern:/((?:^|[|!])[|!])[^|\r\n]+\|(?!\|)/m,lookbehind:!0,inside:{"table-bar":{pattern:/\|$/,alias:"punctuation"},rest:t.languages.markup.tag.inside}},punctuation:/^(?:\{\||\|\}|\|-|[*#:;!|])|\|\||!!/m}),t.languages.insertBefore("wiki","tag",{nowiki:{pattern:/<(nowiki|pre|source)\b[^>]*>[\s\S]*?<\/\1>/i,inside:{tag:{pattern:/<(?:nowiki|pre|source)\b[^>]*>|<\/(?:nowiki|pre|source)>/i,inside:t.languages.markup.tag.inside}}}})}return hE}var bE,o5;function wwe(){if(o5)return bE;o5=1,bE=e,e.displayName="wolfram",e.aliases=["mathematica","wl","nb"];function e(t){t.languages.wolfram={comment:/\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:Abs|AbsArg|Accuracy|Block|Do|For|Function|If|Manipulate|Module|Nest|NestList|None|Return|Switch|Table|Which|While)\b/,context:{pattern:/\b\w+`+\w*/,alias:"class-name"},blank:{pattern:/\b\w+_\b/,alias:"regex"},"global-variable":{pattern:/\$\w+/,alias:"variable"},boolean:/\b(?:False|True)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/\/\.|;|=\.|\^=|\^:=|:=|<<|>>|<\||\|>|:>|\|->|->|<-|@@@|@@|@|\/@|=!=|===|==|=|\+|-|\^|\[\/-+%=\]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},t.languages.mathematica=t.languages.wolfram,t.languages.wl=t.languages.wolfram,t.languages.nb=t.languages.wolfram}return bE}var yE,i5;function Ewe(){if(i5)return yE;i5=1,yE=e,e.displayName="wren",e.aliases=[];function e(t){t.languages.wren={comment:[{pattern:/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*))*\*\/)*\*\/)*\*\//,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],"triple-quoted-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},"string-literal":null,hashbang:{pattern:/^#!\/.+/,greedy:!0,alias:"comment"},attribute:{pattern:/#!?[ \t\u3000]*\w+/,alias:"keyword"},"class-name":[{pattern:/(\bclass\s+)\w+/,lookbehind:!0},/\b[A-Z][a-z\d_]*\b/],constant:/\b[A-Z][A-Z\d_]*\b/,null:{pattern:/\bnull\b/,alias:"keyword"},keyword:/\b(?:as|break|class|construct|continue|else|for|foreign|if|import|in|is|return|static|super|this|var|while)\b/,boolean:/\b(?:false|true)\b/,number:/\b(?:0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,function:/\b[a-z_]\w*(?=\s*[({])/i,operator:/<<|>>|[=!<>]=?|&&|\|\||[-+*/%~^&|?:]|\.{2,3}/,punctuation:/[\[\](){}.,;]/},t.languages.wren["string-literal"]={pattern:/(^|[^\\"])"(?:[^\\"%]|\\[\s\S]|%(?!\()|%\((?:[^()]|\((?:[^()]|\([^)]*\))*\))*\))*"/,lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)%\((?:[^()]|\((?:[^()]|\([^)]*\))*\))*\)/,lookbehind:!0,inside:{expression:{pattern:/^(%\()[\s\S]+(?=\)$)/,lookbehind:!0,inside:t.languages.wren},"interpolation-punctuation":{pattern:/^%\(|\)$/,alias:"punctuation"}}},string:/[\s\S]+/}}}return yE}var vE,s5;function xwe(){if(s5)return vE;s5=1,vE=e,e.displayName="xeora",e.aliases=["xeoracube"];function e(t){(function(n){n.languages.xeora=n.languages.extend("markup",{constant:{pattern:/\$(?:DomainContents|PageRenderDuration)\$/,inside:{punctuation:{pattern:/\$/}}},variable:{pattern:/\$@?(?:#+|[-+*~=^])?[\w.]+\$/,inside:{punctuation:{pattern:/[$.]/},operator:{pattern:/#+|[-+*~=^@]/}}},"function-inline":{pattern:/\$F:[-\w.]+\?[-\w.]+(?:,(?:(?:@[-#]*\w+\.[\w+.]\.*)*\|)*(?:(?:[\w+]|[-#*.~^]+[\w+]|=\S)(?:[^$=]|=+[^=])*=*|(?:@[-#]*\w+\.[\w+.]\.*)+(?:(?:[\w+]|[-#*~^][-#*.~^]*[\w+]|=\S)(?:[^$=]|=+[^=])*=*)?)?)?\$/,inside:{variable:{pattern:/(?:[,|])@?(?:#+|[-+*~=^])?[\w.]+/,inside:{punctuation:{pattern:/[,.|]/},operator:{pattern:/#+|[-+*~=^@]/}}},punctuation:{pattern:/\$\w:|[$:?.,|]/}},alias:"function"},"function-block":{pattern:/\$XF:\{[-\w.]+\?[-\w.]+(?:,(?:(?:@[-#]*\w+\.[\w+.]\.*)*\|)*(?:(?:[\w+]|[-#*.~^]+[\w+]|=\S)(?:[^$=]|=+[^=])*=*|(?:@[-#]*\w+\.[\w+.]\.*)+(?:(?:[\w+]|[-#*~^][-#*.~^]*[\w+]|=\S)(?:[^$=]|=+[^=])*=*)?)?)?\}:XF\$/,inside:{punctuation:{pattern:/[$:{}?.,|]/}},alias:"function"},"directive-inline":{pattern:/\$\w(?:#\d+\+?)?(?:\[[-\w.]+\])?:[-\/\w.]+\$/,inside:{punctuation:{pattern:/\$(?:\w:|C(?:\[|#\d))?|[:{[\]]/,inside:{tag:{pattern:/#\d/}}}},alias:"function"},"directive-block-open":{pattern:/\$\w+:\{|\$\w(?:#\d+\+?)?(?:\[[-\w.]+\])?:[-\w.]+:\{(?:![A-Z]+)?/,inside:{punctuation:{pattern:/\$(?:\w:|C(?:\[|#\d))?|[:{[\]]/,inside:{tag:{pattern:/#\d/}}},attribute:{pattern:/![A-Z]+$/,inside:{punctuation:{pattern:/!/}},alias:"keyword"}},alias:"function"},"directive-block-separator":{pattern:/\}:[-\w.]+:\{/,inside:{punctuation:{pattern:/[:{}]/}},alias:"function"},"directive-block-close":{pattern:/\}:[-\w.]+\$/,inside:{punctuation:{pattern:/[:{}$]/}},alias:"function"}}),n.languages.insertBefore("inside","punctuation",{variable:n.languages.xeora["function-inline"].inside.variable},n.languages.xeora["function-block"]),n.languages.xeoracube=n.languages.xeora})(t)}return vE}var SE,l5;function kwe(){if(l5)return SE;l5=1,SE=e,e.displayName="xmlDoc",e.aliases=[];function e(t){(function(n){function r(s,l){n.languages[s]&&n.languages.insertBefore(s,"comment",{"doc-comment":l})}var a=n.languages.markup.tag,o={pattern:/\/\/\/.*/,greedy:!0,alias:"comment",inside:{tag:a}},i={pattern:/'''.*/,greedy:!0,alias:"comment",inside:{tag:a}};r("csharp",o),r("fsharp",o),r("vbnet",i)})(t)}return SE}var wE,c5;function Cwe(){if(c5)return wE;c5=1,wE=e,e.displayName="xojo",e.aliases=[];function e(t){t.languages.xojo={comment:{pattern:/(?:'|\/\/|Rem\b).+/i,greedy:!0},string:{pattern:/"(?:""|[^"])*"/,greedy:!0},number:[/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,/&[bchou][a-z\d]+/i],directive:{pattern:/#(?:Else|ElseIf|Endif|If|Pragma)\b/i,alias:"property"},keyword:/\b(?:AddHandler|App|Array|As(?:signs)?|Auto|Boolean|Break|By(?:Ref|Val)|Byte|Call|Case|Catch|CFStringRef|CGFloat|Class|Color|Const|Continue|CString|Currency|CurrentMethodName|Declare|Delegate|Dim|Do(?:uble|wnTo)?|Each|Else(?:If)?|End|Enumeration|Event|Exception|Exit|Extends|False|Finally|For|Function|Get|GetTypeInfo|Global|GOTO|If|Implements|In|Inherits|Int(?:8|16|32|64|eger|erface)?|Lib|Loop|Me|Module|Next|Nil|Object|Optional|OSType|ParamArray|Private|Property|Protected|PString|Ptr|Raise(?:Event)?|ReDim|RemoveHandler|Return|Select(?:or)?|Self|Set|Shared|Short|Single|Soft|Static|Step|String|Sub|Super|Text|Then|To|True|Try|Ubound|UInt(?:8|16|32|64|eger)?|Until|Using|Var(?:iant)?|Wend|While|WindowPtr|WString)\b/i,operator:/<[=>]?|>=?|[+\-*\/\\^=]|\b(?:AddressOf|And|Ctype|IsA?|Mod|New|Not|Or|WeakAddressOf|Xor)\b/i,punctuation:/[.,;:()]/}}return wE}var EE,u5;function _we(){if(u5)return EE;u5=1,EE=e,e.displayName="xquery",e.aliases=[];function e(t){(function(n){n.languages.xquery=n.languages.extend("markup",{"xquery-comment":{pattern:/\(:[\s\S]*?:\)/,greedy:!0,alias:"comment"},string:{pattern:/(["'])(?:\1\1|(?!\1)[\s\S])*\1/,greedy:!0},extension:{pattern:/\(#.+?#\)/,alias:"symbol"},variable:/\$[-\w:]+/,axis:{pattern:/(^|[^-])(?:ancestor(?:-or-self)?|attribute|child|descendant(?:-or-self)?|following(?:-sibling)?|parent|preceding(?:-sibling)?|self)(?=::)/,lookbehind:!0,alias:"operator"},"keyword-operator":{pattern:/(^|[^:-])\b(?:and|castable as|div|eq|except|ge|gt|idiv|instance of|intersect|is|le|lt|mod|ne|or|union)\b(?=$|[^:-])/,lookbehind:!0,alias:"operator"},keyword:{pattern:/(^|[^:-])\b(?:as|ascending|at|base-uri|boundary-space|case|cast as|collation|construction|copy-namespaces|declare|default|descending|else|empty (?:greatest|least)|encoding|every|external|for|function|if|import|in|inherit|lax|let|map|module|namespace|no-inherit|no-preserve|option|order(?: by|ed|ing)?|preserve|return|satisfies|schema|some|stable|strict|strip|then|to|treat as|typeswitch|unordered|validate|variable|version|where|xquery)\b(?=$|[^:-])/,lookbehind:!0},function:/[\w-]+(?::[\w-]+)*(?=\s*\()/,"xquery-element":{pattern:/(element\s+)[\w-]+(?::[\w-]+)*/,lookbehind:!0,alias:"tag"},"xquery-attribute":{pattern:/(attribute\s+)[\w-]+(?::[\w-]+)*/,lookbehind:!0,alias:"attr-name"},builtin:{pattern:/(^|[^:-])\b(?:attribute|comment|document|element|processing-instruction|text|xs:(?:ENTITIES|ENTITY|ID|IDREFS?|NCName|NMTOKENS?|NOTATION|Name|QName|anyAtomicType|anyType|anyURI|base64Binary|boolean|byte|date|dateTime|dayTimeDuration|decimal|double|duration|float|gDay|gMonth|gMonthDay|gYear|gYearMonth|hexBinary|int|integer|language|long|negativeInteger|nonNegativeInteger|nonPositiveInteger|normalizedString|positiveInteger|short|string|time|token|unsigned(?:Byte|Int|Long|Short)|untyped(?:Atomic)?|yearMonthDuration))\b(?=$|[^:-])/,lookbehind:!0},number:/\b\d+(?:\.\d+)?(?:E[+-]?\d+)?/,operator:[/[+*=?|@]|\.\.?|:=|!=|<[=<]?|>[=>]?/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}],punctuation:/[[\](){},;:/]/}),n.languages.xquery.tag.pattern=/<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/,n.languages.xquery.tag.inside["attr-value"].pattern=/=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+)/,n.languages.xquery.tag.inside["attr-value"].inside.punctuation=/^="|"$/,n.languages.xquery.tag.inside["attr-value"].inside.expression={pattern:/\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}/,inside:n.languages.xquery,alias:"language-xquery"};var r=function(o){return typeof o=="string"?o:typeof o.content=="string"?o.content:o.content.map(r).join("")},a=function(o){for(var i=[],s=0;s0&&i[i.length-1].tagName===r(l.content[0].content[1])&&i.pop():l.content[l.content.length-1].content==="/>"||i.push({tagName:r(l.content[0].content[1]),openedBraces:0}):i.length>0&&l.type==="punctuation"&&l.content==="{"&&(!o[s+1]||o[s+1].type!=="punctuation"||o[s+1].content!=="{")&&(!o[s-1]||o[s-1].type!=="plain-text"||o[s-1].content!=="{")?i[i.length-1].openedBraces++:i.length>0&&i[i.length-1].openedBraces>0&&l.type==="punctuation"&&l.content==="}"?i[i.length-1].openedBraces--:l.type!=="comment"&&(c=!0)),(c||typeof l=="string")&&i.length>0&&i[i.length-1].openedBraces===0){var u=r(l);s0&&(typeof o[s-1]=="string"||o[s-1].type==="plain-text")&&(u=r(o[s-1])+u,o.splice(s-1,1),s--),/^\s+$/.test(u)?o[s]=u:o[s]=new n.Token("plain-text",u,null,u)}l.content&&typeof l.content!="string"&&a(l.content)}};n.hooks.add("after-tokenize",function(o){o.language==="xquery"&&a(o.tokens)})})(t)}return EE}var xE,d5;function Awe(){if(d5)return xE;d5=1,xE=e,e.displayName="yang",e.aliases=[];function e(t){t.languages.yang={comment:/\/\*[\s\S]*?\*\/|\/\/.*/,string:{pattern:/"(?:[^\\"]|\\.)*"|'[^']*'/,greedy:!0},keyword:{pattern:/(^|[{};\r\n][ \t]*)[a-z_][\w.-]*/i,lookbehind:!0},namespace:{pattern:/(\s)[a-z_][\w.-]*(?=:)/i,lookbehind:!0},boolean:/\b(?:false|true)\b/,operator:/\+/,punctuation:/[{};:]/}}return xE}var kE,f5;function Twe(){if(f5)return kE;f5=1,kE=e,e.displayName="zig",e.aliases=[];function e(t){(function(n){function r(u){return function(){return u}}var a=/\b(?:align|allowzero|and|anyframe|anytype|asm|async|await|break|cancel|catch|comptime|const|continue|defer|else|enum|errdefer|error|export|extern|fn|for|if|inline|linksection|nakedcc|noalias|nosuspend|null|or|orelse|packed|promise|pub|resume|return|stdcallcc|struct|suspend|switch|test|threadlocal|try|undefined|union|unreachable|usingnamespace|var|volatile|while)\b/,o="\\b(?!"+a.source+")(?!\\d)\\w+\\b",i=/align\s*\((?:[^()]|\([^()]*\))*\)/.source,s=/(?:\?|\bpromise->|(?:\[[^[\]]*\]|\*(?!\*)|\*\*)(?:\s*|\s*const\b|\s*volatile\b|\s*allowzero\b)*)/.source.replace(//g,r(i)),l=/(?:\bpromise\b|(?:\berror\.)?(?:\.)*(?!\s+))/.source.replace(//g,r(o)),c="(?!\\s)(?:!?\\s*(?:"+s+"\\s*)*"+l+")+";n.languages.zig={comment:[{pattern:/\/\/[/!].*/,alias:"doc-comment"},/\/{2}.*/],string:[{pattern:/(^|[^\\@])c?"(?:[^"\\\r\n]|\\.)*"/,lookbehind:!0,greedy:!0},{pattern:/([\r\n])([ \t]+c?\\{2}).*(?:(?:\r\n?|\n)\2.*)*/,lookbehind:!0,greedy:!0}],char:{pattern:/(^|[^\\])'(?:[^'\\\r\n]|[\uD800-\uDFFF]{2}|\\(?:.|x[a-fA-F\d]{2}|u\{[a-fA-F\d]{1,6}\}))'/,lookbehind:!0,greedy:!0},builtin:/\B@(?!\d)\w+(?=\s*\()/,label:{pattern:/(\b(?:break|continue)\s*:\s*)\w+\b|\b(?!\d)\w+\b(?=\s*:\s*(?:\{|while\b))/,lookbehind:!0},"class-name":[/\b(?!\d)\w+(?=\s*=\s*(?:(?:extern|packed)\s+)?(?:enum|struct|union)\s*[({])/,{pattern:RegExp(/(:\s*)(?=\s*(?:\s*)?[=;,)])|(?=\s*(?:\s*)?\{)/.source.replace(//g,r(c)).replace(//g,r(i))),lookbehind:!0,inside:null},{pattern:RegExp(/(\)\s*)(?=\s*(?:\s*)?;)/.source.replace(//g,r(c)).replace(//g,r(i))),lookbehind:!0,inside:null}],"builtin-type":{pattern:/\b(?:anyerror|bool|c_u?(?:int|long|longlong|short)|c_longdouble|c_void|comptime_(?:float|int)|f(?:16|32|64|128)|[iu](?:8|16|32|64|128|size)|noreturn|type|void)\b/,alias:"keyword"},keyword:a,function:/\b(?!\d)\w+(?=\s*\()/,number:/\b(?:0b[01]+|0o[0-7]+|0x[a-fA-F\d]+(?:\.[a-fA-F\d]*)?(?:[pP][+-]?[a-fA-F\d]+)?|\d+(?:\.\d*)?(?:[eE][+-]?\d+)?)\b/,boolean:/\b(?:false|true)\b/,operator:/\.[*?]|\.{2,3}|[-=]>|\*\*|\+\+|\|\||(?:<<|>>|[-+*]%|[-+*/%^&|<>!=])=?|[?~]/,punctuation:/[.:,;(){}[\]]/},n.languages.zig["class-name"].forEach(function(u){u.inside===null&&(u.inside=n.languages.zig)})})(t)}return kE}var I=Phe,Rwe=I;I.register(Whe());I.register(Khe());I.register(Yhe());I.register(Zhe());I.register(Xhe());I.register(Qhe());I.register(Jhe());I.register(ebe());I.register(tbe());I.register(nbe());I.register(rbe());I.register(abe());I.register(obe());I.register(ibe());I.register(sbe());I.register(lbe());I.register(cbe());I.register(ube());I.register(dbe());I.register(fbe());I.register(pbe());I.register(gbe());I.register(az());I.register(oz());I.register(mbe());I.register(hbe());I.register(bbe());I.register(ybe());I.register(vbe());I.register(Sbe());I.register(wbe());I.register(Ebe());I.register(xbe());I.register(kbe());I.register(Ws());I.register(Cbe());I.register(_be());I.register(Abe());I.register(Tbe());I.register(Rbe());I.register(Nbe());I.register(Ibe());I.register(Obe());I.register(Dbe());I.register(RA());I.register(Lbe());I.register(Ah());I.register(Mbe());I.register(Pbe());I.register($be());I.register(Fbe());I.register(jbe());I.register(zbe());I.register(Ube());I.register(Bbe());I.register(Hbe());I.register(Vbe());I.register(qbe());I.register(Gbe());I.register(Wbe());I.register(Kbe());I.register(Ybe());I.register(Zbe());I.register(Xbe());I.register(Qbe());I.register(Jbe());I.register(eye());I.register(tye());I.register(nye());I.register(rye());I.register(aye());I.register(oye());I.register(iye());I.register(sye());I.register(lye());I.register(cye());I.register(uye());I.register(dye());I.register(fye());I.register(pye());I.register(gye());I.register(mye());I.register(hye());I.register(bye());I.register(yye());I.register(vye());I.register(Sye());I.register(wye());I.register(Eye());I.register(xye());I.register(kye());I.register(Cye());I.register(_ye());I.register(Aye());I.register(NA());I.register(Tye());I.register(Rye());I.register(Nye());I.register(Iye());I.register(Oye());I.register(Dye());I.register(Lye());I.register(Mye());I.register(Pye());I.register($ye());I.register(Fye());I.register(jye());I.register(zye());I.register(Uye());I.register(Bye());I.register(Hye());I.register(Vye());I.register(IA());I.register(qye());I.register(Rh());I.register(Gye());I.register(Wye());I.register(Kye());I.register(Yye());I.register(Zye());I.register(Xye());I.register(Qye());I.register(DA());I.register(Jye());I.register(eve());I.register(tve());I.register(sz());I.register(nve());I.register(rve());I.register(ave());I.register(ove());I.register(ive());I.register(sve());I.register(lve());I.register(cve());I.register(uve());I.register(dve());I.register(fve());I.register(pve());I.register(gve());I.register(mve());I.register(hve());I.register(bve());I.register(iz());I.register(yve());I.register(vve());I.register(Sve());I.register(mr());I.register(wve());I.register(Eve());I.register(xve());I.register(kve());I.register(Cve());I.register(_ve());I.register(Ave());I.register(Tve());I.register(Rve());I.register(Nve());I.register(Ive());I.register(Ove());I.register(Dve());I.register(Lve());I.register(Mve());I.register(Pve());I.register($ve());I.register(Fve());I.register(jve());I.register(zve());I.register(Uve());I.register(Bve());I.register(Hve());I.register(Vve());I.register(qve());I.register(Gve());I.register(Wve());I.register(Kve());I.register(Yve());I.register(Zve());I.register(Xve());I.register(Qve());I.register(Nh());I.register(Jve());I.register(eSe());I.register(tSe());I.register(nSe());I.register(rSe());I.register(aSe());I.register(oSe());I.register(iSe());I.register(sSe());I.register(lSe());I.register(cSe());I.register(uSe());I.register(dSe());I.register(fSe());I.register(pSe());I.register(gSe());I.register(mSe());I.register(hSe());I.register(bSe());I.register(ySe());I.register(vSe());I.register(SSe());I.register(wSe());I.register(ESe());I.register(xSe());I.register(kSe());I.register(CSe());I.register(_Se());I.register(ASe());I.register(TSe());I.register(Th());I.register(RSe());I.register(NSe());I.register(ISe());I.register(OSe());I.register(LA());I.register(DSe());I.register(LSe());I.register(MSe());I.register(PSe());I.register($Se());I.register(FSe());I.register(jSe());I.register(zSe());I.register(USe());I.register(BSe());I.register(HSe());I.register(VSe());I.register(TA());I.register(qSe());I.register(GSe());I.register(WSe());I.register(KSe());I.register(YSe());I.register(ZSe());I.register(MA());I.register(XSe());I.register(QSe());I.register(JSe());I.register(ewe());I.register(twe());I.register(nwe());I.register(rwe());I.register(awe());I.register(lz());I.register(owe());I.register(OA());I.register(iwe());I.register(swe());I.register(lwe());I.register(cwe());I.register(uwe());I.register(dwe());I.register(cz());I.register(fwe());I.register(pwe());I.register(gwe());I.register(mwe());I.register(hwe());I.register(bwe());I.register(ywe());I.register(vwe());I.register(Swe());I.register(wwe());I.register(Ewe());I.register(xwe());I.register(kwe());I.register(Cwe());I.register(_we());I.register(uz());I.register(Awe());I.register(Twe());const Nwe=Tc(Rwe);var dz=_fe(Nwe,Ghe);dz.supportedLanguages=Afe;const Iwe=dz;var fz={},pz={exports:{}};(function(e){function t(n){return n&&n.__esModule?n:{default:n}}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports})(pz);var Owe=pz.exports,CE={},p5;function Dwe(){return p5||(p5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"black",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",maxHeight:"inherit",height:"inherit",padding:"0 1em",display:"block",overflow:"auto"},'pre[class*="language-"]':{color:"black",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",position:"relative",margin:".5em 0",overflow:"visible",padding:"1px",backgroundColor:"#fdfdfd",WebkitBoxSizing:"border-box",MozBoxSizing:"border-box",boxSizing:"border-box",marginBottom:"1em"},'pre[class*="language-"] > code':{position:"relative",zIndex:"1",borderLeft:"10px solid #358ccb",boxShadow:"-1px 0px 0px 0px #358ccb, 0px 0px 0px 1px #dfdfdf",backgroundColor:"#fdfdfd",backgroundImage:"linear-gradient(transparent 50%, rgba(69, 142, 209, 0.04) 50%)",backgroundSize:"3em 3em",backgroundOrigin:"content-box",backgroundAttachment:"local"},':not(pre) > code[class*="language-"]':{backgroundColor:"#fdfdfd",WebkitBoxSizing:"border-box",MozBoxSizing:"border-box",boxSizing:"border-box",marginBottom:"1em",position:"relative",padding:".2em",borderRadius:"0.3em",color:"#c92c2c",border:"1px solid rgba(0, 0, 0, 0.1)",display:"inline",whiteSpace:"normal"},'pre[class*="language-"]:before':{content:"''",display:"block",position:"absolute",bottom:"0.75em",left:"0.18em",width:"40%",height:"20%",maxHeight:"13em",boxShadow:"0px 13px 8px #979797",WebkitTransform:"rotate(-2deg)",MozTransform:"rotate(-2deg)",msTransform:"rotate(-2deg)",OTransform:"rotate(-2deg)",transform:"rotate(-2deg)"},'pre[class*="language-"]:after':{content:"''",display:"block",position:"absolute",bottom:"0.75em",left:"auto",width:"40%",height:"20%",maxHeight:"13em",boxShadow:"0px 13px 8px #979797",WebkitTransform:"rotate(2deg)",MozTransform:"rotate(2deg)",msTransform:"rotate(2deg)",OTransform:"rotate(2deg)",transform:"rotate(2deg)",right:"0.75em"},comment:{color:"#7D8B99"},"block-comment":{color:"#7D8B99"},prolog:{color:"#7D8B99"},doctype:{color:"#7D8B99"},cdata:{color:"#7D8B99"},punctuation:{color:"#5F6364"},property:{color:"#c92c2c"},tag:{color:"#c92c2c"},boolean:{color:"#c92c2c"},number:{color:"#c92c2c"},"function-name":{color:"#c92c2c"},constant:{color:"#c92c2c"},symbol:{color:"#c92c2c"},deleted:{color:"#c92c2c"},selector:{color:"#2f9c0a"},"attr-name":{color:"#2f9c0a"},string:{color:"#2f9c0a"},char:{color:"#2f9c0a"},function:{color:"#2f9c0a"},builtin:{color:"#2f9c0a"},inserted:{color:"#2f9c0a"},operator:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},entity:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)",cursor:"help"},url:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},variable:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},atrule:{color:"#1990b8"},"attr-value":{color:"#1990b8"},keyword:{color:"#1990b8"},"class-name":{color:"#1990b8"},regex:{color:"#e90"},important:{color:"#e90",fontWeight:"normal"},".language-css .token.string":{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},".style .token.string":{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},namespace:{Opacity:".7"},'pre[class*="language-"].line-numbers.line-numbers':{paddingLeft:"0"},'pre[class*="language-"].line-numbers.line-numbers code':{paddingLeft:"3.8em"},'pre[class*="language-"].line-numbers.line-numbers .line-numbers-rows':{left:"0"},'pre[class*="language-"][data-line]':{paddingTop:"0",paddingBottom:"0",paddingLeft:"0"},"pre[data-line] code":{position:"relative",paddingLeft:"4em"},"pre .line-highlight":{marginTop:"0"}};e.default=t}(CE)),CE}var _E={},g5;function Lwe(){return g5||(g5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"white",background:"none",textShadow:"0 -.1em .2em black",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"white",background:"hsl(30, 20%, 25%)",textShadow:"0 -.1em .2em black",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",border:".3em solid hsl(30, 20%, 40%)",borderRadius:".5em",boxShadow:"1px 1px .5em black inset"},':not(pre) > code[class*="language-"]':{background:"hsl(30, 20%, 25%)",padding:".15em .2em .05em",borderRadius:".3em",border:".13em solid hsl(30, 20%, 40%)",boxShadow:"1px 1px .3em -.1em black inset",whiteSpace:"normal"},comment:{color:"hsl(30, 20%, 50%)"},prolog:{color:"hsl(30, 20%, 50%)"},doctype:{color:"hsl(30, 20%, 50%)"},cdata:{color:"hsl(30, 20%, 50%)"},punctuation:{Opacity:".7"},namespace:{Opacity:".7"},property:{color:"hsl(350, 40%, 70%)"},tag:{color:"hsl(350, 40%, 70%)"},boolean:{color:"hsl(350, 40%, 70%)"},number:{color:"hsl(350, 40%, 70%)"},constant:{color:"hsl(350, 40%, 70%)"},symbol:{color:"hsl(350, 40%, 70%)"},selector:{color:"hsl(75, 70%, 60%)"},"attr-name":{color:"hsl(75, 70%, 60%)"},string:{color:"hsl(75, 70%, 60%)"},char:{color:"hsl(75, 70%, 60%)"},builtin:{color:"hsl(75, 70%, 60%)"},inserted:{color:"hsl(75, 70%, 60%)"},operator:{color:"hsl(40, 90%, 60%)"},entity:{color:"hsl(40, 90%, 60%)",cursor:"help"},url:{color:"hsl(40, 90%, 60%)"},".language-css .token.string":{color:"hsl(40, 90%, 60%)"},".style .token.string":{color:"hsl(40, 90%, 60%)"},variable:{color:"hsl(40, 90%, 60%)"},atrule:{color:"hsl(350, 40%, 70%)"},"attr-value":{color:"hsl(350, 40%, 70%)"},keyword:{color:"hsl(350, 40%, 70%)"},regex:{color:"#e90"},important:{color:"#e90",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},deleted:{color:"red"}};e.default=t}(_E)),_E}var AE={},m5;function Mwe(){return m5||(m5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"black",color:"white",boxShadow:"-.3em 0 0 .3em black, .3em 0 0 .3em black"},'pre[class*="language-"]':{fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:".4em .8em",margin:".5em 0",overflow:"auto",background:`url('data:image/svg+xml;charset=utf-8,%0D%0A%0D%0A%0D%0A<%2Fsvg>')`,backgroundSize:"1em 1em"},':not(pre) > code[class*="language-"]':{padding:".2em",borderRadius:".3em",boxShadow:"none",whiteSpace:"normal"},comment:{color:"#aaa"},prolog:{color:"#aaa"},doctype:{color:"#aaa"},cdata:{color:"#aaa"},punctuation:{color:"#999"},namespace:{Opacity:".7"},property:{color:"#0cf"},tag:{color:"#0cf"},boolean:{color:"#0cf"},number:{color:"#0cf"},constant:{color:"#0cf"},symbol:{color:"#0cf"},selector:{color:"yellow"},"attr-name":{color:"yellow"},string:{color:"yellow"},char:{color:"yellow"},builtin:{color:"yellow"},operator:{color:"yellowgreen"},entity:{color:"yellowgreen",cursor:"help"},url:{color:"yellowgreen"},".language-css .token.string":{color:"yellowgreen"},variable:{color:"yellowgreen"},inserted:{color:"yellowgreen"},atrule:{color:"deeppink"},"attr-value":{color:"deeppink"},keyword:{color:"deeppink"},regex:{color:"orange"},important:{color:"orange",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},deleted:{color:"red"},"pre.diff-highlight.diff-highlight > code .token.deleted:not(.prefix)":{backgroundColor:"rgba(255, 0, 0, .3)",display:"inline"},"pre > code.diff-highlight.diff-highlight .token.deleted:not(.prefix)":{backgroundColor:"rgba(255, 0, 0, .3)",display:"inline"},"pre.diff-highlight.diff-highlight > code .token.inserted:not(.prefix)":{backgroundColor:"rgba(0, 255, 128, .3)",display:"inline"},"pre > code.diff-highlight.diff-highlight .token.inserted:not(.prefix)":{backgroundColor:"rgba(0, 255, 128, .3)",display:"inline"}};e.default=t}(AE)),AE}var TE={},h5;function Pwe(){return h5||(h5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#f8f8f2",background:"none",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#f8f8f2",background:"#272822",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",borderRadius:"0.3em"},':not(pre) > code[class*="language-"]':{background:"#272822",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#8292a2"},prolog:{color:"#8292a2"},doctype:{color:"#8292a2"},cdata:{color:"#8292a2"},punctuation:{color:"#f8f8f2"},namespace:{Opacity:".7"},property:{color:"#f92672"},tag:{color:"#f92672"},constant:{color:"#f92672"},symbol:{color:"#f92672"},deleted:{color:"#f92672"},boolean:{color:"#ae81ff"},number:{color:"#ae81ff"},selector:{color:"#a6e22e"},"attr-name":{color:"#a6e22e"},string:{color:"#a6e22e"},char:{color:"#a6e22e"},builtin:{color:"#a6e22e"},inserted:{color:"#a6e22e"},operator:{color:"#f8f8f2"},entity:{color:"#f8f8f2",cursor:"help"},url:{color:"#f8f8f2"},".language-css .token.string":{color:"#f8f8f2"},".style .token.string":{color:"#f8f8f2"},variable:{color:"#f8f8f2"},atrule:{color:"#e6db74"},"attr-value":{color:"#e6db74"},function:{color:"#e6db74"},"class-name":{color:"#e6db74"},keyword:{color:"#66d9ef"},regex:{color:"#fd971f"},important:{color:"#fd971f",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(TE)),TE}var RE={},b5;function $we(){return b5||(b5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#657b83",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#657b83",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",borderRadius:"0.3em",backgroundColor:"#fdf6e3"},'pre[class*="language-"]::-moz-selection':{background:"#073642"},'pre[class*="language-"] ::-moz-selection':{background:"#073642"},'code[class*="language-"]::-moz-selection':{background:"#073642"},'code[class*="language-"] ::-moz-selection':{background:"#073642"},'pre[class*="language-"]::selection':{background:"#073642"},'pre[class*="language-"] ::selection':{background:"#073642"},'code[class*="language-"]::selection':{background:"#073642"},'code[class*="language-"] ::selection':{background:"#073642"},':not(pre) > code[class*="language-"]':{backgroundColor:"#fdf6e3",padding:".1em",borderRadius:".3em"},comment:{color:"#93a1a1"},prolog:{color:"#93a1a1"},doctype:{color:"#93a1a1"},cdata:{color:"#93a1a1"},punctuation:{color:"#586e75"},namespace:{Opacity:".7"},property:{color:"#268bd2"},tag:{color:"#268bd2"},boolean:{color:"#268bd2"},number:{color:"#268bd2"},constant:{color:"#268bd2"},symbol:{color:"#268bd2"},deleted:{color:"#268bd2"},selector:{color:"#2aa198"},"attr-name":{color:"#2aa198"},string:{color:"#2aa198"},char:{color:"#2aa198"},builtin:{color:"#2aa198"},url:{color:"#2aa198"},inserted:{color:"#2aa198"},entity:{color:"#657b83",background:"#eee8d5",cursor:"help"},atrule:{color:"#859900"},"attr-value":{color:"#859900"},keyword:{color:"#859900"},function:{color:"#b58900"},"class-name":{color:"#b58900"},regex:{color:"#cb4b16"},important:{color:"#cb4b16",fontWeight:"bold"},variable:{color:"#cb4b16"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(RE)),RE}var NE={},y5;function Fwe(){return y5||(y5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#ccc",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#ccc",background:"#2d2d2d",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto"},':not(pre) > code[class*="language-"]':{background:"#2d2d2d",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#999"},"block-comment":{color:"#999"},prolog:{color:"#999"},doctype:{color:"#999"},cdata:{color:"#999"},punctuation:{color:"#ccc"},tag:{color:"#e2777a"},"attr-name":{color:"#e2777a"},namespace:{color:"#e2777a"},deleted:{color:"#e2777a"},"function-name":{color:"#6196cc"},boolean:{color:"#f08d49"},number:{color:"#f08d49"},function:{color:"#f08d49"},property:{color:"#f8c555"},"class-name":{color:"#f8c555"},constant:{color:"#f8c555"},symbol:{color:"#f8c555"},selector:{color:"#cc99cd"},important:{color:"#cc99cd",fontWeight:"bold"},atrule:{color:"#cc99cd"},keyword:{color:"#cc99cd"},builtin:{color:"#cc99cd"},string:{color:"#7ec699"},char:{color:"#7ec699"},"attr-value":{color:"#7ec699"},regex:{color:"#7ec699"},variable:{color:"#7ec699"},operator:{color:"#67cdcc"},entity:{color:"#67cdcc",cursor:"help"},url:{color:"#67cdcc"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},inserted:{color:"green"}};e.default=t}(NE)),NE}var IE={},v5;function jwe(){return v5||(v5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"white",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",textShadow:"0 -.1em .2em black",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"white",background:"hsl(0, 0%, 8%)",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",textShadow:"0 -.1em .2em black",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",borderRadius:".5em",border:".3em solid hsl(0, 0%, 33%)",boxShadow:"1px 1px .5em black inset",margin:".5em 0",overflow:"auto",padding:"1em"},':not(pre) > code[class*="language-"]':{background:"hsl(0, 0%, 8%)",borderRadius:".3em",border:".13em solid hsl(0, 0%, 33%)",boxShadow:"1px 1px .3em -.1em black inset",padding:".15em .2em .05em",whiteSpace:"normal"},'pre[class*="language-"]::-moz-selection':{background:"hsla(0, 0%, 93%, 0.15)",textShadow:"none"},'pre[class*="language-"]::selection':{background:"hsla(0, 0%, 93%, 0.15)",textShadow:"none"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},'code[class*="language-"]::selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},'code[class*="language-"] ::selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},comment:{color:"hsl(0, 0%, 47%)"},prolog:{color:"hsl(0, 0%, 47%)"},doctype:{color:"hsl(0, 0%, 47%)"},cdata:{color:"hsl(0, 0%, 47%)"},punctuation:{Opacity:".7"},namespace:{Opacity:".7"},tag:{color:"hsl(14, 58%, 55%)"},boolean:{color:"hsl(14, 58%, 55%)"},number:{color:"hsl(14, 58%, 55%)"},deleted:{color:"hsl(14, 58%, 55%)"},keyword:{color:"hsl(53, 89%, 79%)"},property:{color:"hsl(53, 89%, 79%)"},selector:{color:"hsl(53, 89%, 79%)"},constant:{color:"hsl(53, 89%, 79%)"},symbol:{color:"hsl(53, 89%, 79%)"},builtin:{color:"hsl(53, 89%, 79%)"},"attr-name":{color:"hsl(76, 21%, 52%)"},"attr-value":{color:"hsl(76, 21%, 52%)"},string:{color:"hsl(76, 21%, 52%)"},char:{color:"hsl(76, 21%, 52%)"},operator:{color:"hsl(76, 21%, 52%)"},entity:{color:"hsl(76, 21%, 52%)",cursor:"help"},url:{color:"hsl(76, 21%, 52%)"},".language-css .token.string":{color:"hsl(76, 21%, 52%)"},".style .token.string":{color:"hsl(76, 21%, 52%)"},variable:{color:"hsl(76, 21%, 52%)"},inserted:{color:"hsl(76, 21%, 52%)"},atrule:{color:"hsl(218, 22%, 55%)"},regex:{color:"hsl(42, 75%, 65%)"},important:{color:"hsl(42, 75%, 65%)",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},".language-markup .token.tag":{color:"hsl(33, 33%, 52%)"},".language-markup .token.attr-name":{color:"hsl(33, 33%, 52%)"},".language-markup .token.punctuation":{color:"hsl(33, 33%, 52%)"},"":{position:"relative",zIndex:"1"},".line-highlight.line-highlight":{background:"linear-gradient(to right, hsla(0, 0%, 33%, .1) 70%, hsla(0, 0%, 33%, 0))",borderBottom:"1px dashed hsl(0, 0%, 33%)",borderTop:"1px dashed hsl(0, 0%, 33%)",marginTop:"0.75em",zIndex:"0"},".line-highlight.line-highlight:before":{backgroundColor:"hsl(215, 15%, 59%)",color:"hsl(24, 20%, 95%)"},".line-highlight.line-highlight[data-end]:after":{backgroundColor:"hsl(215, 15%, 59%)",color:"hsl(24, 20%, 95%)"}};e.default=t}(IE)),IE}var OE={},S5;function zwe(){return S5||(S5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"black",background:"none",textShadow:"0 1px white",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"black",background:"#f5f2f0",textShadow:"0 1px white",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#b3d4fc"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#b3d4fc"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#b3d4fc"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#b3d4fc"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#b3d4fc"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#b3d4fc"},'code[class*="language-"]::selection':{textShadow:"none",background:"#b3d4fc"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#b3d4fc"},':not(pre) > code[class*="language-"]':{background:"#f5f2f0",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"slategray"},prolog:{color:"slategray"},doctype:{color:"slategray"},cdata:{color:"slategray"},punctuation:{color:"#999"},namespace:{Opacity:".7"},property:{color:"#905"},tag:{color:"#905"},boolean:{color:"#905"},number:{color:"#905"},constant:{color:"#905"},symbol:{color:"#905"},deleted:{color:"#905"},selector:{color:"#690"},"attr-name":{color:"#690"},string:{color:"#690"},char:{color:"#690"},builtin:{color:"#690"},inserted:{color:"#690"},operator:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},entity:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)",cursor:"help"},url:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},".language-css .token.string":{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},".style .token.string":{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},atrule:{color:"#07a"},"attr-value":{color:"#07a"},keyword:{color:"#07a"},function:{color:"#DD4A68"},"class-name":{color:"#DD4A68"},regex:{color:"#e90"},important:{color:"#e90",fontWeight:"bold"},variable:{color:"#e90"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(OE)),OE}var DE={},w5;function Uwe(){return w5||(w5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#f8f8f2",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#f8f8f2",background:"#2b2b2b",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto",borderRadius:"0.3em"},':not(pre) > code[class*="language-"]':{background:"#2b2b2b",padding:"0.1em",borderRadius:"0.3em",whiteSpace:"normal"},comment:{color:"#d4d0ab"},prolog:{color:"#d4d0ab"},doctype:{color:"#d4d0ab"},cdata:{color:"#d4d0ab"},punctuation:{color:"#fefefe"},property:{color:"#ffa07a"},tag:{color:"#ffa07a"},constant:{color:"#ffa07a"},symbol:{color:"#ffa07a"},deleted:{color:"#ffa07a"},boolean:{color:"#00e0e0"},number:{color:"#00e0e0"},selector:{color:"#abe338"},"attr-name":{color:"#abe338"},string:{color:"#abe338"},char:{color:"#abe338"},builtin:{color:"#abe338"},inserted:{color:"#abe338"},operator:{color:"#00e0e0"},entity:{color:"#00e0e0",cursor:"help"},url:{color:"#00e0e0"},".language-css .token.string":{color:"#00e0e0"},".style .token.string":{color:"#00e0e0"},variable:{color:"#00e0e0"},atrule:{color:"#ffd700"},"attr-value":{color:"#ffd700"},function:{color:"#ffd700"},keyword:{color:"#00e0e0"},regex:{color:"#ffd700"},important:{color:"#ffd700",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(DE)),DE}var LE={},E5;function Bwe(){return E5||(E5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#c5c8c6",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Inconsolata, Monaco, Consolas, 'Courier New', Courier, monospace",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#c5c8c6",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Inconsolata, Monaco, Consolas, 'Courier New', Courier, monospace",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",borderRadius:"0.3em",background:"#1d1f21"},':not(pre) > code[class*="language-"]':{background:"#1d1f21",padding:".1em",borderRadius:".3em"},comment:{color:"#7C7C7C"},prolog:{color:"#7C7C7C"},doctype:{color:"#7C7C7C"},cdata:{color:"#7C7C7C"},punctuation:{color:"#c5c8c6"},".namespace":{Opacity:".7"},property:{color:"#96CBFE"},keyword:{color:"#96CBFE"},tag:{color:"#96CBFE"},"class-name":{color:"#FFFFB6",textDecoration:"underline"},boolean:{color:"#99CC99"},constant:{color:"#99CC99"},symbol:{color:"#f92672"},deleted:{color:"#f92672"},number:{color:"#FF73FD"},selector:{color:"#A8FF60"},"attr-name":{color:"#A8FF60"},string:{color:"#A8FF60"},char:{color:"#A8FF60"},builtin:{color:"#A8FF60"},inserted:{color:"#A8FF60"},variable:{color:"#C6C5FE"},operator:{color:"#EDEDED"},entity:{color:"#FFFFB6",cursor:"help"},url:{color:"#96CBFE"},".language-css .token.string":{color:"#87C38A"},".style .token.string":{color:"#87C38A"},atrule:{color:"#F9EE98"},"attr-value":{color:"#F9EE98"},function:{color:"#DAD085"},regex:{color:"#E9C062"},important:{color:"#fd971f",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(LE)),LE}var ME={},x5;function Hwe(){return x5||(x5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#f5f7ff",color:"#5e6687"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#f5f7ff",color:"#5e6687",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#dfe2f1"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#dfe2f1"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#dfe2f1"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#dfe2f1"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#dfe2f1"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#dfe2f1"},'code[class*="language-"]::selection':{textShadow:"none",background:"#dfe2f1"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#dfe2f1"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#898ea4"},prolog:{color:"#898ea4"},doctype:{color:"#898ea4"},cdata:{color:"#898ea4"},punctuation:{color:"#5e6687"},namespace:{Opacity:".7"},operator:{color:"#c76b29"},boolean:{color:"#c76b29"},number:{color:"#c76b29"},property:{color:"#c08b30"},tag:{color:"#3d8fd1"},string:{color:"#22a2c9"},selector:{color:"#6679cc"},"attr-name":{color:"#c76b29"},entity:{color:"#22a2c9",cursor:"help"},url:{color:"#22a2c9"},".language-css .token.string":{color:"#22a2c9"},".style .token.string":{color:"#22a2c9"},"attr-value":{color:"#ac9739"},keyword:{color:"#ac9739"},control:{color:"#ac9739"},directive:{color:"#ac9739"},unit:{color:"#ac9739"},statement:{color:"#22a2c9"},regex:{color:"#22a2c9"},atrule:{color:"#22a2c9"},placeholder:{color:"#3d8fd1"},variable:{color:"#3d8fd1"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #202746",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#c94922"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:"0.4em solid #c94922",OutlineOffset:".4em"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"#dfe2f1"},".line-numbers .line-numbers-rows > span:before":{color:"#979db4"},".line-highlight.line-highlight":{background:"linear-gradient(to right, rgba(107, 115, 148, 0.2) 70%, rgba(107, 115, 148, 0))"}};e.default=t}(ME)),ME}var PE={},k5;function Vwe(){return k5||(k5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#fff",textShadow:"0 1px 1px #000",fontFamily:'Menlo, Monaco, "Courier New", monospace',direction:"ltr",textAlign:"left",wordSpacing:"normal",whiteSpace:"pre",wordWrap:"normal",lineHeight:"1.4",background:"none",border:"0",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#fff",textShadow:"0 1px 1px #000",fontFamily:'Menlo, Monaco, "Courier New", monospace',direction:"ltr",textAlign:"left",wordSpacing:"normal",whiteSpace:"pre",wordWrap:"normal",lineHeight:"1.4",background:"#222",border:"0",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"15px",margin:"1em 0",overflow:"auto",MozBorderRadius:"8px",WebkitBorderRadius:"8px",borderRadius:"8px"},'pre[class*="language-"] code':{float:"left",padding:"0 15px 0 0"},':not(pre) > code[class*="language-"]':{background:"#222",padding:"5px 10px",lineHeight:"1",MozBorderRadius:"3px",WebkitBorderRadius:"3px",borderRadius:"3px"},comment:{color:"#797979"},prolog:{color:"#797979"},doctype:{color:"#797979"},cdata:{color:"#797979"},selector:{color:"#fff"},operator:{color:"#fff"},punctuation:{color:"#fff"},namespace:{Opacity:".7"},tag:{color:"#ffd893"},boolean:{color:"#ffd893"},atrule:{color:"#B0C975"},"attr-value":{color:"#B0C975"},hex:{color:"#B0C975"},string:{color:"#B0C975"},property:{color:"#c27628"},entity:{color:"#c27628",cursor:"help"},url:{color:"#c27628"},"attr-name":{color:"#c27628"},keyword:{color:"#c27628"},regex:{color:"#9B71C6"},function:{color:"#e5a638"},constant:{color:"#e5a638"},variable:{color:"#fdfba8"},number:{color:"#8799B0"},important:{color:"#E45734"},deliminator:{color:"#E45734"},".line-highlight.line-highlight":{background:"rgba(255, 255, 255, .2)"},".line-highlight.line-highlight:before":{top:".3em",backgroundColor:"rgba(255, 255, 255, .3)",color:"#fff",MozBorderRadius:"8px",WebkitBorderRadius:"8px",borderRadius:"8px"},".line-highlight.line-highlight[data-end]:after":{top:".3em",backgroundColor:"rgba(255, 255, 255, .3)",color:"#fff",MozBorderRadius:"8px",WebkitBorderRadius:"8px",borderRadius:"8px"},".line-numbers .line-numbers-rows > span":{borderRight:"3px #d9d336 solid"}};e.default=t}(PE)),PE}var $E={},C5;function qwe(){return C5||(C5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#111b27",background:"none",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#111b27",background:"#e3eaf2",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto"},'pre[class*="language-"]::-moz-selection':{background:"#8da1b9"},'pre[class*="language-"] ::-moz-selection':{background:"#8da1b9"},'code[class*="language-"]::-moz-selection':{background:"#8da1b9"},'code[class*="language-"] ::-moz-selection':{background:"#8da1b9"},'pre[class*="language-"]::selection':{background:"#8da1b9"},'pre[class*="language-"] ::selection':{background:"#8da1b9"},'code[class*="language-"]::selection':{background:"#8da1b9"},'code[class*="language-"] ::selection':{background:"#8da1b9"},':not(pre) > code[class*="language-"]':{background:"#e3eaf2",padding:"0.1em 0.3em",borderRadius:"0.3em",whiteSpace:"normal"},comment:{color:"#3c526d"},prolog:{color:"#3c526d"},doctype:{color:"#3c526d"},cdata:{color:"#3c526d"},punctuation:{color:"#111b27"},"delimiter.important":{color:"#006d6d",fontWeight:"inherit"},"selector.parent":{color:"#006d6d"},tag:{color:"#006d6d"},"tag.punctuation":{color:"#006d6d"},"attr-name":{color:"#755f00"},boolean:{color:"#755f00"},"boolean.important":{color:"#755f00"},number:{color:"#755f00"},constant:{color:"#755f00"},"selector.attribute":{color:"#755f00"},"class-name":{color:"#005a8e"},key:{color:"#005a8e"},parameter:{color:"#005a8e"},property:{color:"#005a8e"},"property-access":{color:"#005a8e"},variable:{color:"#005a8e"},"attr-value":{color:"#116b00"},inserted:{color:"#116b00"},color:{color:"#116b00"},"selector.value":{color:"#116b00"},string:{color:"#116b00"},"string.url-link":{color:"#116b00"},builtin:{color:"#af00af"},"keyword-array":{color:"#af00af"},package:{color:"#af00af"},regex:{color:"#af00af"},function:{color:"#7c00aa"},"selector.class":{color:"#7c00aa"},"selector.id":{color:"#7c00aa"},"atrule.rule":{color:"#a04900"},combinator:{color:"#a04900"},keyword:{color:"#a04900"},operator:{color:"#a04900"},"pseudo-class":{color:"#a04900"},"pseudo-element":{color:"#a04900"},selector:{color:"#a04900"},unit:{color:"#a04900"},deleted:{color:"#c22f2e"},important:{color:"#c22f2e",fontWeight:"bold"},"keyword-this":{color:"#005a8e",fontWeight:"bold"},this:{color:"#005a8e",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},entity:{cursor:"help"},".language-markdown .token.title":{color:"#005a8e",fontWeight:"bold"},".language-markdown .token.title .token.punctuation":{color:"#005a8e",fontWeight:"bold"},".language-markdown .token.blockquote.punctuation":{color:"#af00af"},".language-markdown .token.code":{color:"#006d6d"},".language-markdown .token.hr.punctuation":{color:"#005a8e"},".language-markdown .token.url > .token.content":{color:"#116b00"},".language-markdown .token.url-link":{color:"#755f00"},".language-markdown .token.list.punctuation":{color:"#af00af"},".language-markdown .token.table-header":{color:"#111b27"},".language-json .token.operator":{color:"#111b27"},".language-scss .token.variable":{color:"#006d6d"},"token.tab:not(:empty):before":{color:"#3c526d"},"token.cr:before":{color:"#3c526d"},"token.lf:before":{color:"#3c526d"},"token.space:before":{color:"#3c526d"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a":{color:"#e3eaf2",background:"#005a8e"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button":{color:"#e3eaf2",background:"#005a8e"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover":{color:"#e3eaf2",background:"#005a8eda",textDecoration:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus":{color:"#e3eaf2",background:"#005a8eda",textDecoration:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover":{color:"#e3eaf2",background:"#005a8eda",textDecoration:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus":{color:"#e3eaf2",background:"#005a8eda",textDecoration:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span":{color:"#e3eaf2",background:"#3c526d"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover":{color:"#e3eaf2",background:"#3c526d"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus":{color:"#e3eaf2",background:"#3c526d"},".line-highlight.line-highlight":{background:"linear-gradient(to right, #8da1b92f 70%, #8da1b925)"},".line-highlight.line-highlight:before":{backgroundColor:"#3c526d",color:"#e3eaf2",boxShadow:"0 1px #8da1b9"},".line-highlight.line-highlight[data-end]:after":{backgroundColor:"#3c526d",color:"#e3eaf2",boxShadow:"0 1px #8da1b9"},"pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before":{backgroundColor:"#3c526d1f"},".line-numbers.line-numbers .line-numbers-rows":{borderRight:"1px solid #8da1b97a",background:"#d0dae77a"},".line-numbers .line-numbers-rows > span:before":{color:"#3c526dda"},".rainbow-braces .token.token.punctuation.brace-level-1":{color:"#755f00"},".rainbow-braces .token.token.punctuation.brace-level-5":{color:"#755f00"},".rainbow-braces .token.token.punctuation.brace-level-9":{color:"#755f00"},".rainbow-braces .token.token.punctuation.brace-level-2":{color:"#af00af"},".rainbow-braces .token.token.punctuation.brace-level-6":{color:"#af00af"},".rainbow-braces .token.token.punctuation.brace-level-10":{color:"#af00af"},".rainbow-braces .token.token.punctuation.brace-level-3":{color:"#005a8e"},".rainbow-braces .token.token.punctuation.brace-level-7":{color:"#005a8e"},".rainbow-braces .token.token.punctuation.brace-level-11":{color:"#005a8e"},".rainbow-braces .token.token.punctuation.brace-level-4":{color:"#7c00aa"},".rainbow-braces .token.token.punctuation.brace-level-8":{color:"#7c00aa"},".rainbow-braces .token.token.punctuation.brace-level-12":{color:"#7c00aa"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)":{backgroundColor:"#c22f2e1f"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)":{backgroundColor:"#c22f2e1f"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)":{backgroundColor:"#116b001f"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)":{backgroundColor:"#116b001f"},".command-line .command-line-prompt":{borderRight:"1px solid #8da1b97a"},".command-line .command-line-prompt > span:before":{color:"#3c526dda"}};e.default=t}($E)),$E}var FE={},_5;function Gwe(){return _5||(_5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#e3eaf2",background:"none",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#e3eaf2",background:"#111b27",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto"},'pre[class*="language-"]::-moz-selection':{background:"#3c526d"},'pre[class*="language-"] ::-moz-selection':{background:"#3c526d"},'code[class*="language-"]::-moz-selection':{background:"#3c526d"},'code[class*="language-"] ::-moz-selection':{background:"#3c526d"},'pre[class*="language-"]::selection':{background:"#3c526d"},'pre[class*="language-"] ::selection':{background:"#3c526d"},'code[class*="language-"]::selection':{background:"#3c526d"},'code[class*="language-"] ::selection':{background:"#3c526d"},':not(pre) > code[class*="language-"]':{background:"#111b27",padding:"0.1em 0.3em",borderRadius:"0.3em",whiteSpace:"normal"},comment:{color:"#8da1b9"},prolog:{color:"#8da1b9"},doctype:{color:"#8da1b9"},cdata:{color:"#8da1b9"},punctuation:{color:"#e3eaf2"},"delimiter.important":{color:"#66cccc",fontWeight:"inherit"},"selector.parent":{color:"#66cccc"},tag:{color:"#66cccc"},"tag.punctuation":{color:"#66cccc"},"attr-name":{color:"#e6d37a"},boolean:{color:"#e6d37a"},"boolean.important":{color:"#e6d37a"},number:{color:"#e6d37a"},constant:{color:"#e6d37a"},"selector.attribute":{color:"#e6d37a"},"class-name":{color:"#6cb8e6"},key:{color:"#6cb8e6"},parameter:{color:"#6cb8e6"},property:{color:"#6cb8e6"},"property-access":{color:"#6cb8e6"},variable:{color:"#6cb8e6"},"attr-value":{color:"#91d076"},inserted:{color:"#91d076"},color:{color:"#91d076"},"selector.value":{color:"#91d076"},string:{color:"#91d076"},"string.url-link":{color:"#91d076"},builtin:{color:"#f4adf4"},"keyword-array":{color:"#f4adf4"},package:{color:"#f4adf4"},regex:{color:"#f4adf4"},function:{color:"#c699e3"},"selector.class":{color:"#c699e3"},"selector.id":{color:"#c699e3"},"atrule.rule":{color:"#e9ae7e"},combinator:{color:"#e9ae7e"},keyword:{color:"#e9ae7e"},operator:{color:"#e9ae7e"},"pseudo-class":{color:"#e9ae7e"},"pseudo-element":{color:"#e9ae7e"},selector:{color:"#e9ae7e"},unit:{color:"#e9ae7e"},deleted:{color:"#cd6660"},important:{color:"#cd6660",fontWeight:"bold"},"keyword-this":{color:"#6cb8e6",fontWeight:"bold"},this:{color:"#6cb8e6",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},entity:{cursor:"help"},".language-markdown .token.title":{color:"#6cb8e6",fontWeight:"bold"},".language-markdown .token.title .token.punctuation":{color:"#6cb8e6",fontWeight:"bold"},".language-markdown .token.blockquote.punctuation":{color:"#f4adf4"},".language-markdown .token.code":{color:"#66cccc"},".language-markdown .token.hr.punctuation":{color:"#6cb8e6"},".language-markdown .token.url .token.content":{color:"#91d076"},".language-markdown .token.url-link":{color:"#e6d37a"},".language-markdown .token.list.punctuation":{color:"#f4adf4"},".language-markdown .token.table-header":{color:"#e3eaf2"},".language-json .token.operator":{color:"#e3eaf2"},".language-scss .token.variable":{color:"#66cccc"},"token.tab:not(:empty):before":{color:"#8da1b9"},"token.cr:before":{color:"#8da1b9"},"token.lf:before":{color:"#8da1b9"},"token.space:before":{color:"#8da1b9"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a":{color:"#111b27",background:"#6cb8e6"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button":{color:"#111b27",background:"#6cb8e6"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover":{color:"#111b27",background:"#6cb8e6da",textDecoration:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus":{color:"#111b27",background:"#6cb8e6da",textDecoration:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover":{color:"#111b27",background:"#6cb8e6da",textDecoration:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus":{color:"#111b27",background:"#6cb8e6da",textDecoration:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span":{color:"#111b27",background:"#8da1b9"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover":{color:"#111b27",background:"#8da1b9"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus":{color:"#111b27",background:"#8da1b9"},".line-highlight.line-highlight":{background:"linear-gradient(to right, #3c526d5f 70%, #3c526d55)"},".line-highlight.line-highlight:before":{backgroundColor:"#8da1b9",color:"#111b27",boxShadow:"0 1px #3c526d"},".line-highlight.line-highlight[data-end]:after":{backgroundColor:"#8da1b9",color:"#111b27",boxShadow:"0 1px #3c526d"},"pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before":{backgroundColor:"#8da1b918"},".line-numbers.line-numbers .line-numbers-rows":{borderRight:"1px solid #0b121b",background:"#0b121b7a"},".line-numbers .line-numbers-rows > span:before":{color:"#8da1b9da"},".rainbow-braces .token.token.punctuation.brace-level-1":{color:"#e6d37a"},".rainbow-braces .token.token.punctuation.brace-level-5":{color:"#e6d37a"},".rainbow-braces .token.token.punctuation.brace-level-9":{color:"#e6d37a"},".rainbow-braces .token.token.punctuation.brace-level-2":{color:"#f4adf4"},".rainbow-braces .token.token.punctuation.brace-level-6":{color:"#f4adf4"},".rainbow-braces .token.token.punctuation.brace-level-10":{color:"#f4adf4"},".rainbow-braces .token.token.punctuation.brace-level-3":{color:"#6cb8e6"},".rainbow-braces .token.token.punctuation.brace-level-7":{color:"#6cb8e6"},".rainbow-braces .token.token.punctuation.brace-level-11":{color:"#6cb8e6"},".rainbow-braces .token.token.punctuation.brace-level-4":{color:"#c699e3"},".rainbow-braces .token.token.punctuation.brace-level-8":{color:"#c699e3"},".rainbow-braces .token.token.punctuation.brace-level-12":{color:"#c699e3"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)":{backgroundColor:"#cd66601f"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)":{backgroundColor:"#cd66601f"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)":{backgroundColor:"#91d0761f"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)":{backgroundColor:"#91d0761f"},".command-line .command-line-prompt":{borderRight:"1px solid #0b121b"},".command-line .command-line-prompt > span:before":{color:"#8da1b9da"}};e.default=t}(FE)),FE}var jE={},A5;function Wwe(){return A5||(A5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"black",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"black",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",position:"relative",borderLeft:"10px solid #358ccb",boxShadow:"-1px 0 0 0 #358ccb, 0 0 0 1px #dfdfdf",backgroundColor:"#fdfdfd",backgroundImage:"linear-gradient(transparent 50%, rgba(69, 142, 209, 0.04) 50%)",backgroundSize:"3em 3em",backgroundOrigin:"content-box",backgroundAttachment:"local",margin:".5em 0",padding:"0 1em"},'pre[class*="language-"] > code':{display:"block"},':not(pre) > code[class*="language-"]':{position:"relative",padding:".2em",borderRadius:"0.3em",color:"#c92c2c",border:"1px solid rgba(0, 0, 0, 0.1)",display:"inline",whiteSpace:"normal",backgroundColor:"#fdfdfd",WebkitBoxSizing:"border-box",MozBoxSizing:"border-box",boxSizing:"border-box"},comment:{color:"#7D8B99"},"block-comment":{color:"#7D8B99"},prolog:{color:"#7D8B99"},doctype:{color:"#7D8B99"},cdata:{color:"#7D8B99"},punctuation:{color:"#5F6364"},property:{color:"#c92c2c"},tag:{color:"#c92c2c"},boolean:{color:"#c92c2c"},number:{color:"#c92c2c"},"function-name":{color:"#c92c2c"},constant:{color:"#c92c2c"},symbol:{color:"#c92c2c"},deleted:{color:"#c92c2c"},selector:{color:"#2f9c0a"},"attr-name":{color:"#2f9c0a"},string:{color:"#2f9c0a"},char:{color:"#2f9c0a"},function:{color:"#2f9c0a"},builtin:{color:"#2f9c0a"},inserted:{color:"#2f9c0a"},operator:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},entity:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)",cursor:"help"},url:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},variable:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},atrule:{color:"#1990b8"},"attr-value":{color:"#1990b8"},keyword:{color:"#1990b8"},"class-name":{color:"#1990b8"},regex:{color:"#e90"},important:{color:"#e90",fontWeight:"normal"},".language-css .token.string":{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},".style .token.string":{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},namespace:{Opacity:".7"}};e.default=t}(jE)),jE}var zE={},T5;function Kwe(){return T5||(T5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#a9b7c6",fontFamily:"Consolas, Monaco, 'Andale Mono', monospace",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#a9b7c6",fontFamily:"Consolas, Monaco, 'Andale Mono', monospace",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",background:"#2b2b2b"},'pre[class*="language-"]::-moz-selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'pre[class*="language-"] ::-moz-selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'code[class*="language-"]::-moz-selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'code[class*="language-"] ::-moz-selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'pre[class*="language-"]::selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'pre[class*="language-"] ::selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'code[class*="language-"]::selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'code[class*="language-"] ::selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},':not(pre) > code[class*="language-"]':{background:"#2b2b2b",padding:".1em",borderRadius:".3em"},comment:{color:"#808080"},prolog:{color:"#808080"},cdata:{color:"#808080"},delimiter:{color:"#cc7832"},boolean:{color:"#cc7832"},keyword:{color:"#cc7832"},selector:{color:"#cc7832"},important:{color:"#cc7832"},atrule:{color:"#cc7832"},operator:{color:"#a9b7c6"},punctuation:{color:"#a9b7c6"},"attr-name":{color:"#a9b7c6"},tag:{color:"#e8bf6a"},"tag.punctuation":{color:"#e8bf6a"},doctype:{color:"#e8bf6a"},builtin:{color:"#e8bf6a"},entity:{color:"#6897bb"},number:{color:"#6897bb"},symbol:{color:"#6897bb"},property:{color:"#9876aa"},constant:{color:"#9876aa"},variable:{color:"#9876aa"},string:{color:"#6a8759"},char:{color:"#6a8759"},"attr-value":{color:"#a5c261"},"attr-value.punctuation":{color:"#a5c261"},"attr-value.punctuation:first-child":{color:"#a9b7c6"},url:{color:"#287bde",textDecoration:"underline"},function:{color:"#ffc66d"},regex:{background:"#364135"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},inserted:{background:"#294436"},deleted:{background:"#484a4a"},"code.language-css .token.property":{color:"#a9b7c6"},"code.language-css .token.property + .token.punctuation":{color:"#a9b7c6"},"code.language-css .token.id":{color:"#ffc66d"},"code.language-css .token.selector > .token.class":{color:"#ffc66d"},"code.language-css .token.selector > .token.attribute":{color:"#ffc66d"},"code.language-css .token.selector > .token.pseudo-class":{color:"#ffc66d"},"code.language-css .token.selector > .token.pseudo-element":{color:"#ffc66d"}};e.default=t}(zE)),zE}var UE={},R5;function Ywe(){return R5||(R5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#f8f8f2",background:"none",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#f8f8f2",background:"#282a36",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",borderRadius:"0.3em"},':not(pre) > code[class*="language-"]':{background:"#282a36",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#6272a4"},prolog:{color:"#6272a4"},doctype:{color:"#6272a4"},cdata:{color:"#6272a4"},punctuation:{color:"#f8f8f2"},".namespace":{Opacity:".7"},property:{color:"#ff79c6"},tag:{color:"#ff79c6"},constant:{color:"#ff79c6"},symbol:{color:"#ff79c6"},deleted:{color:"#ff79c6"},boolean:{color:"#bd93f9"},number:{color:"#bd93f9"},selector:{color:"#50fa7b"},"attr-name":{color:"#50fa7b"},string:{color:"#50fa7b"},char:{color:"#50fa7b"},builtin:{color:"#50fa7b"},inserted:{color:"#50fa7b"},operator:{color:"#f8f8f2"},entity:{color:"#f8f8f2",cursor:"help"},url:{color:"#f8f8f2"},".language-css .token.string":{color:"#f8f8f2"},".style .token.string":{color:"#f8f8f2"},variable:{color:"#f8f8f2"},atrule:{color:"#f1fa8c"},"attr-value":{color:"#f1fa8c"},function:{color:"#f1fa8c"},"class-name":{color:"#f1fa8c"},keyword:{color:"#8be9fd"},regex:{color:"#ffb86c"},important:{color:"#ffb86c",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(UE)),UE}var BE={},N5;function Zwe(){return N5||(N5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#2a2734",color:"#9a86fd"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#2a2734",color:"#9a86fd",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#6a51e6"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#6a51e6"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#6a51e6"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#6a51e6"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#6a51e6"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#6a51e6"},'code[class*="language-"]::selection':{textShadow:"none",background:"#6a51e6"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#6a51e6"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#6c6783"},prolog:{color:"#6c6783"},doctype:{color:"#6c6783"},cdata:{color:"#6c6783"},punctuation:{color:"#6c6783"},namespace:{Opacity:".7"},tag:{color:"#e09142"},operator:{color:"#e09142"},number:{color:"#e09142"},property:{color:"#9a86fd"},function:{color:"#9a86fd"},"tag-id":{color:"#eeebff"},selector:{color:"#eeebff"},"atrule-id":{color:"#eeebff"},"code.language-javascript":{color:"#c4b9fe"},"attr-name":{color:"#c4b9fe"},"code.language-css":{color:"#ffcc99"},"code.language-scss":{color:"#ffcc99"},boolean:{color:"#ffcc99"},string:{color:"#ffcc99"},entity:{color:"#ffcc99",cursor:"help"},url:{color:"#ffcc99"},".language-css .token.string":{color:"#ffcc99"},".language-scss .token.string":{color:"#ffcc99"},".style .token.string":{color:"#ffcc99"},"attr-value":{color:"#ffcc99"},keyword:{color:"#ffcc99"},control:{color:"#ffcc99"},directive:{color:"#ffcc99"},unit:{color:"#ffcc99"},statement:{color:"#ffcc99"},regex:{color:"#ffcc99"},atrule:{color:"#ffcc99"},placeholder:{color:"#ffcc99"},variable:{color:"#ffcc99"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #eeebff",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#c4b9fe"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #8a75f5",OutlineOffset:".4em"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"#2c2937"},".line-numbers .line-numbers-rows > span:before":{color:"#3c3949"},".line-highlight.line-highlight":{background:"linear-gradient(to right, rgba(224, 145, 66, 0.2) 70%, rgba(224, 145, 66, 0))"}};e.default=t}(BE)),BE}var HE={},I5;function Xwe(){return I5||(I5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#322d29",color:"#88786d"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#322d29",color:"#88786d",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#6f5849"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#6f5849"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#6f5849"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#6f5849"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#6f5849"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#6f5849"},'code[class*="language-"]::selection':{textShadow:"none",background:"#6f5849"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#6f5849"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#6a5f58"},prolog:{color:"#6a5f58"},doctype:{color:"#6a5f58"},cdata:{color:"#6a5f58"},punctuation:{color:"#6a5f58"},namespace:{Opacity:".7"},tag:{color:"#bfa05a"},operator:{color:"#bfa05a"},number:{color:"#bfa05a"},property:{color:"#88786d"},function:{color:"#88786d"},"tag-id":{color:"#fff3eb"},selector:{color:"#fff3eb"},"atrule-id":{color:"#fff3eb"},"code.language-javascript":{color:"#a48774"},"attr-name":{color:"#a48774"},"code.language-css":{color:"#fcc440"},"code.language-scss":{color:"#fcc440"},boolean:{color:"#fcc440"},string:{color:"#fcc440"},entity:{color:"#fcc440",cursor:"help"},url:{color:"#fcc440"},".language-css .token.string":{color:"#fcc440"},".language-scss .token.string":{color:"#fcc440"},".style .token.string":{color:"#fcc440"},"attr-value":{color:"#fcc440"},keyword:{color:"#fcc440"},control:{color:"#fcc440"},directive:{color:"#fcc440"},unit:{color:"#fcc440"},statement:{color:"#fcc440"},regex:{color:"#fcc440"},atrule:{color:"#fcc440"},placeholder:{color:"#fcc440"},variable:{color:"#fcc440"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #fff3eb",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#a48774"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #816d5f",OutlineOffset:".4em"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"#35302b"},".line-numbers .line-numbers-rows > span:before":{color:"#46403d"},".line-highlight.line-highlight":{background:"linear-gradient(to right, rgba(191, 160, 90, 0.2) 70%, rgba(191, 160, 90, 0))"}};e.default=t}(HE)),HE}var VE={},O5;function Qwe(){return O5||(O5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#2a2d2a",color:"#687d68"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#2a2d2a",color:"#687d68",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#435643"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#435643"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#435643"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#435643"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#435643"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#435643"},'code[class*="language-"]::selection':{textShadow:"none",background:"#435643"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#435643"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#535f53"},prolog:{color:"#535f53"},doctype:{color:"#535f53"},cdata:{color:"#535f53"},punctuation:{color:"#535f53"},namespace:{Opacity:".7"},tag:{color:"#a2b34d"},operator:{color:"#a2b34d"},number:{color:"#a2b34d"},property:{color:"#687d68"},function:{color:"#687d68"},"tag-id":{color:"#f0fff0"},selector:{color:"#f0fff0"},"atrule-id":{color:"#f0fff0"},"code.language-javascript":{color:"#b3d6b3"},"attr-name":{color:"#b3d6b3"},"code.language-css":{color:"#e5fb79"},"code.language-scss":{color:"#e5fb79"},boolean:{color:"#e5fb79"},string:{color:"#e5fb79"},entity:{color:"#e5fb79",cursor:"help"},url:{color:"#e5fb79"},".language-css .token.string":{color:"#e5fb79"},".language-scss .token.string":{color:"#e5fb79"},".style .token.string":{color:"#e5fb79"},"attr-value":{color:"#e5fb79"},keyword:{color:"#e5fb79"},control:{color:"#e5fb79"},directive:{color:"#e5fb79"},unit:{color:"#e5fb79"},statement:{color:"#e5fb79"},regex:{color:"#e5fb79"},atrule:{color:"#e5fb79"},placeholder:{color:"#e5fb79"},variable:{color:"#e5fb79"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #f0fff0",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#b3d6b3"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #5c705c",OutlineOffset:".4em"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"#2c302c"},".line-numbers .line-numbers-rows > span:before":{color:"#3b423b"},".line-highlight.line-highlight":{background:"linear-gradient(to right, rgba(162, 179, 77, 0.2) 70%, rgba(162, 179, 77, 0))"}};e.default=t}(VE)),VE}var qE={},D5;function Jwe(){return D5||(D5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#faf8f5",color:"#728fcb"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#faf8f5",color:"#728fcb",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#faf8f5"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#faf8f5"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#faf8f5"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#faf8f5"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#faf8f5"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#faf8f5"},'code[class*="language-"]::selection':{textShadow:"none",background:"#faf8f5"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#faf8f5"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#b6ad9a"},prolog:{color:"#b6ad9a"},doctype:{color:"#b6ad9a"},cdata:{color:"#b6ad9a"},punctuation:{color:"#b6ad9a"},namespace:{Opacity:".7"},tag:{color:"#063289"},operator:{color:"#063289"},number:{color:"#063289"},property:{color:"#b29762"},function:{color:"#b29762"},"tag-id":{color:"#2d2006"},selector:{color:"#2d2006"},"atrule-id":{color:"#2d2006"},"code.language-javascript":{color:"#896724"},"attr-name":{color:"#896724"},"code.language-css":{color:"#728fcb"},"code.language-scss":{color:"#728fcb"},boolean:{color:"#728fcb"},string:{color:"#728fcb"},entity:{color:"#728fcb",cursor:"help"},url:{color:"#728fcb"},".language-css .token.string":{color:"#728fcb"},".language-scss .token.string":{color:"#728fcb"},".style .token.string":{color:"#728fcb"},"attr-value":{color:"#728fcb"},keyword:{color:"#728fcb"},control:{color:"#728fcb"},directive:{color:"#728fcb"},unit:{color:"#728fcb"},statement:{color:"#728fcb"},regex:{color:"#728fcb"},atrule:{color:"#728fcb"},placeholder:{color:"#93abdc"},variable:{color:"#93abdc"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #2d2006",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#896724"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #896724",OutlineOffset:".4em"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"#ece8de"},".line-numbers .line-numbers-rows > span:before":{color:"#cdc4b1"},".line-highlight.line-highlight":{background:"linear-gradient(to right, rgba(45, 32, 6, 0.2) 70%, rgba(45, 32, 6, 0))"}};e.default=t}(qE)),qE}var GE={},L5;function e0e(){return L5||(L5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#1d262f",color:"#57718e"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#1d262f",color:"#57718e",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#004a9e"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#004a9e"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#004a9e"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#004a9e"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#004a9e"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#004a9e"},'code[class*="language-"]::selection':{textShadow:"none",background:"#004a9e"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#004a9e"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#4a5f78"},prolog:{color:"#4a5f78"},doctype:{color:"#4a5f78"},cdata:{color:"#4a5f78"},punctuation:{color:"#4a5f78"},namespace:{Opacity:".7"},tag:{color:"#0aa370"},operator:{color:"#0aa370"},number:{color:"#0aa370"},property:{color:"#57718e"},function:{color:"#57718e"},"tag-id":{color:"#ebf4ff"},selector:{color:"#ebf4ff"},"atrule-id":{color:"#ebf4ff"},"code.language-javascript":{color:"#7eb6f6"},"attr-name":{color:"#7eb6f6"},"code.language-css":{color:"#47ebb4"},"code.language-scss":{color:"#47ebb4"},boolean:{color:"#47ebb4"},string:{color:"#47ebb4"},entity:{color:"#47ebb4",cursor:"help"},url:{color:"#47ebb4"},".language-css .token.string":{color:"#47ebb4"},".language-scss .token.string":{color:"#47ebb4"},".style .token.string":{color:"#47ebb4"},"attr-value":{color:"#47ebb4"},keyword:{color:"#47ebb4"},control:{color:"#47ebb4"},directive:{color:"#47ebb4"},unit:{color:"#47ebb4"},statement:{color:"#47ebb4"},regex:{color:"#47ebb4"},atrule:{color:"#47ebb4"},placeholder:{color:"#47ebb4"},variable:{color:"#47ebb4"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #ebf4ff",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#7eb6f6"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #34659d",OutlineOffset:".4em"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"#1f2932"},".line-numbers .line-numbers-rows > span:before":{color:"#2c3847"},".line-highlight.line-highlight":{background:"linear-gradient(to right, rgba(10, 163, 112, 0.2) 70%, rgba(10, 163, 112, 0))"}};e.default=t}(GE)),GE}var WE={},M5;function t0e(){return M5||(M5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#24242e",color:"#767693"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#24242e",color:"#767693",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#5151e6"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#5151e6"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#5151e6"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#5151e6"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#5151e6"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#5151e6"},'code[class*="language-"]::selection':{textShadow:"none",background:"#5151e6"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#5151e6"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#5b5b76"},prolog:{color:"#5b5b76"},doctype:{color:"#5b5b76"},cdata:{color:"#5b5b76"},punctuation:{color:"#5b5b76"},namespace:{Opacity:".7"},tag:{color:"#dd672c"},operator:{color:"#dd672c"},number:{color:"#dd672c"},property:{color:"#767693"},function:{color:"#767693"},"tag-id":{color:"#ebebff"},selector:{color:"#ebebff"},"atrule-id":{color:"#ebebff"},"code.language-javascript":{color:"#aaaaca"},"attr-name":{color:"#aaaaca"},"code.language-css":{color:"#fe8c52"},"code.language-scss":{color:"#fe8c52"},boolean:{color:"#fe8c52"},string:{color:"#fe8c52"},entity:{color:"#fe8c52",cursor:"help"},url:{color:"#fe8c52"},".language-css .token.string":{color:"#fe8c52"},".language-scss .token.string":{color:"#fe8c52"},".style .token.string":{color:"#fe8c52"},"attr-value":{color:"#fe8c52"},keyword:{color:"#fe8c52"},control:{color:"#fe8c52"},directive:{color:"#fe8c52"},unit:{color:"#fe8c52"},statement:{color:"#fe8c52"},regex:{color:"#fe8c52"},atrule:{color:"#fe8c52"},placeholder:{color:"#fe8c52"},variable:{color:"#fe8c52"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #ebebff",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#aaaaca"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #7676f4",OutlineOffset:".4em"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"#262631"},".line-numbers .line-numbers-rows > span:before":{color:"#393949"},".line-highlight.line-highlight":{background:"linear-gradient(to right, rgba(221, 103, 44, 0.2) 70%, rgba(221, 103, 44, 0))"}};e.default=t}(WE)),WE}var KE={},P5;function n0e(){return P5||(P5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#393A34",fontFamily:'"Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",fontSize:".9em",lineHeight:"1.2em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#393A34",fontFamily:'"Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",fontSize:".9em",lineHeight:"1.2em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",border:"1px solid #dddddd",backgroundColor:"white"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{background:"#b3d4fc"},'pre[class*="language-"] ::-moz-selection':{background:"#b3d4fc"},'code[class*="language-"]::-moz-selection':{background:"#b3d4fc"},'code[class*="language-"] ::-moz-selection':{background:"#b3d4fc"},'pre[class*="language-"]::selection':{background:"#b3d4fc"},'pre[class*="language-"] ::selection':{background:"#b3d4fc"},'code[class*="language-"]::selection':{background:"#b3d4fc"},'code[class*="language-"] ::selection':{background:"#b3d4fc"},':not(pre) > code[class*="language-"]':{padding:".2em",paddingTop:"1px",paddingBottom:"1px",background:"#f8f8f8",border:"1px solid #dddddd"},comment:{color:"#999988",fontStyle:"italic"},prolog:{color:"#999988",fontStyle:"italic"},doctype:{color:"#999988",fontStyle:"italic"},cdata:{color:"#999988",fontStyle:"italic"},namespace:{Opacity:".7"},string:{color:"#e3116c"},"attr-value":{color:"#e3116c"},punctuation:{color:"#393A34"},operator:{color:"#393A34"},entity:{color:"#36acaa"},url:{color:"#36acaa"},symbol:{color:"#36acaa"},number:{color:"#36acaa"},boolean:{color:"#36acaa"},variable:{color:"#36acaa"},constant:{color:"#36acaa"},property:{color:"#36acaa"},regex:{color:"#36acaa"},inserted:{color:"#36acaa"},atrule:{color:"#00a4db"},keyword:{color:"#00a4db"},"attr-name":{color:"#00a4db"},".language-autohotkey .token.selector":{color:"#00a4db"},function:{color:"#9a050f",fontWeight:"bold"},deleted:{color:"#9a050f"},".language-autohotkey .token.tag":{color:"#9a050f"},tag:{color:"#00009f"},selector:{color:"#00009f"},".language-autohotkey .token.keyword":{color:"#00009f"},important:{fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(KE)),KE}var YE={},$5;function r0e(){return $5||($5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#ebdbb2",fontFamily:'Consolas, Monaco, "Andale Mono", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#ebdbb2",fontFamily:'Consolas, Monaco, "Andale Mono", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto",background:"#1d2021"},'pre[class*="language-"]::-moz-selection':{color:"#fbf1c7",background:"#7c6f64"},'pre[class*="language-"] ::-moz-selection':{color:"#fbf1c7",background:"#7c6f64"},'code[class*="language-"]::-moz-selection':{color:"#fbf1c7",background:"#7c6f64"},'code[class*="language-"] ::-moz-selection':{color:"#fbf1c7",background:"#7c6f64"},'pre[class*="language-"]::selection':{color:"#fbf1c7",background:"#7c6f64"},'pre[class*="language-"] ::selection':{color:"#fbf1c7",background:"#7c6f64"},'code[class*="language-"]::selection':{color:"#fbf1c7",background:"#7c6f64"},'code[class*="language-"] ::selection':{color:"#fbf1c7",background:"#7c6f64"},':not(pre) > code[class*="language-"]':{background:"#1d2021",padding:"0.1em",borderRadius:"0.3em"},comment:{color:"#a89984"},prolog:{color:"#a89984"},cdata:{color:"#a89984"},delimiter:{color:"#fb4934"},boolean:{color:"#fb4934"},keyword:{color:"#fb4934"},selector:{color:"#fb4934"},important:{color:"#fb4934"},atrule:{color:"#fb4934"},operator:{color:"#a89984"},punctuation:{color:"#a89984"},"attr-name":{color:"#a89984"},tag:{color:"#fabd2f"},"tag.punctuation":{color:"#fabd2f"},doctype:{color:"#fabd2f"},builtin:{color:"#fabd2f"},entity:{color:"#d3869b"},number:{color:"#d3869b"},symbol:{color:"#d3869b"},property:{color:"#fb4934"},constant:{color:"#fb4934"},variable:{color:"#fb4934"},string:{color:"#b8bb26"},char:{color:"#b8bb26"},"attr-value":{color:"#a89984"},"attr-value.punctuation":{color:"#a89984"},url:{color:"#b8bb26",textDecoration:"underline"},function:{color:"#fabd2f"},regex:{background:"#b8bb26"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},inserted:{background:"#a89984"},deleted:{background:"#fb4934"}};e.default=t}(YE)),YE}var ZE={},F5;function a0e(){return F5||(F5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#3c3836",fontFamily:'Consolas, Monaco, "Andale Mono", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#3c3836",fontFamily:'Consolas, Monaco, "Andale Mono", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto",background:"#f9f5d7"},'pre[class*="language-"]::-moz-selection':{color:"#282828",background:"#a89984"},'pre[class*="language-"] ::-moz-selection':{color:"#282828",background:"#a89984"},'code[class*="language-"]::-moz-selection':{color:"#282828",background:"#a89984"},'code[class*="language-"] ::-moz-selection':{color:"#282828",background:"#a89984"},'pre[class*="language-"]::selection':{color:"#282828",background:"#a89984"},'pre[class*="language-"] ::selection':{color:"#282828",background:"#a89984"},'code[class*="language-"]::selection':{color:"#282828",background:"#a89984"},'code[class*="language-"] ::selection':{color:"#282828",background:"#a89984"},':not(pre) > code[class*="language-"]':{background:"#f9f5d7",padding:"0.1em",borderRadius:"0.3em"},comment:{color:"#7c6f64"},prolog:{color:"#7c6f64"},cdata:{color:"#7c6f64"},delimiter:{color:"#9d0006"},boolean:{color:"#9d0006"},keyword:{color:"#9d0006"},selector:{color:"#9d0006"},important:{color:"#9d0006"},atrule:{color:"#9d0006"},operator:{color:"#7c6f64"},punctuation:{color:"#7c6f64"},"attr-name":{color:"#7c6f64"},tag:{color:"#b57614"},"tag.punctuation":{color:"#b57614"},doctype:{color:"#b57614"},builtin:{color:"#b57614"},entity:{color:"#8f3f71"},number:{color:"#8f3f71"},symbol:{color:"#8f3f71"},property:{color:"#9d0006"},constant:{color:"#9d0006"},variable:{color:"#9d0006"},string:{color:"#797403"},char:{color:"#797403"},"attr-value":{color:"#7c6f64"},"attr-value.punctuation":{color:"#7c6f64"},url:{color:"#797403",textDecoration:"underline"},function:{color:"#b57614"},regex:{background:"#797403"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},inserted:{background:"#7c6f64"},deleted:{background:"#9d0006"}};e.default=t}(ZE)),ZE}var XE={},j5;function o0e(){return j5||(j5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={"code[class*='language-']":{color:"#d6e7ff",background:"#030314",textShadow:"none",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',fontSize:"1em",lineHeight:"1.5",letterSpacing:".2px",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",textAlign:"left",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},"pre[class*='language-']":{color:"#d6e7ff",background:"#030314",textShadow:"none",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',fontSize:"1em",lineHeight:"1.5",letterSpacing:".2px",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",textAlign:"left",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",border:"1px solid #2a4555",borderRadius:"5px",padding:"1.5em 1em",margin:"1em 0",overflow:"auto"},"pre[class*='language-']::-moz-selection":{color:"inherit",background:"#1d3b54",textShadow:"none"},"pre[class*='language-'] ::-moz-selection":{color:"inherit",background:"#1d3b54",textShadow:"none"},"code[class*='language-']::-moz-selection":{color:"inherit",background:"#1d3b54",textShadow:"none"},"code[class*='language-'] ::-moz-selection":{color:"inherit",background:"#1d3b54",textShadow:"none"},"pre[class*='language-']::selection":{color:"inherit",background:"#1d3b54",textShadow:"none"},"pre[class*='language-'] ::selection":{color:"inherit",background:"#1d3b54",textShadow:"none"},"code[class*='language-']::selection":{color:"inherit",background:"#1d3b54",textShadow:"none"},"code[class*='language-'] ::selection":{color:"inherit",background:"#1d3b54",textShadow:"none"},":not(pre) > code[class*='language-']":{color:"#f0f6f6",background:"#2a4555",padding:"0.2em 0.3em",borderRadius:"0.2em",boxDecorationBreak:"clone"},comment:{color:"#446e69"},prolog:{color:"#446e69"},doctype:{color:"#446e69"},cdata:{color:"#446e69"},punctuation:{color:"#d6b007"},property:{color:"#d6e7ff"},tag:{color:"#d6e7ff"},boolean:{color:"#d6e7ff"},number:{color:"#d6e7ff"},constant:{color:"#d6e7ff"},symbol:{color:"#d6e7ff"},deleted:{color:"#d6e7ff"},selector:{color:"#e60067"},"attr-name":{color:"#e60067"},builtin:{color:"#e60067"},inserted:{color:"#e60067"},string:{color:"#49c6ec"},char:{color:"#49c6ec"},operator:{color:"#ec8e01",background:"transparent"},entity:{color:"#ec8e01",background:"transparent"},url:{color:"#ec8e01",background:"transparent"},".language-css .token.string":{color:"#ec8e01",background:"transparent"},".style .token.string":{color:"#ec8e01",background:"transparent"},atrule:{color:"#0fe468"},"attr-value":{color:"#0fe468"},keyword:{color:"#0fe468"},function:{color:"#78f3e9"},"class-name":{color:"#78f3e9"},regex:{color:"#d6e7ff"},important:{color:"#d6e7ff"},variable:{color:"#d6e7ff"}};e.default=t}(XE)),XE}var QE={},z5;function i0e(){return z5||(z5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{fontFamily:'"Fira Mono", Menlo, Monaco, "Lucida Console", "Courier New", Courier, monospace',fontSize:"16px",lineHeight:"1.375",direction:"ltr",textAlign:"left",wordSpacing:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordBreak:"break-all",wordWrap:"break-word",background:"#322931",color:"#b9b5b8"},'pre[class*="language-"]':{fontFamily:'"Fira Mono", Menlo, Monaco, "Lucida Console", "Courier New", Courier, monospace',fontSize:"16px",lineHeight:"1.375",direction:"ltr",textAlign:"left",wordSpacing:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordBreak:"break-all",wordWrap:"break-word",background:"#322931",color:"#b9b5b8",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#797379"},prolog:{color:"#797379"},doctype:{color:"#797379"},cdata:{color:"#797379"},punctuation:{color:"#b9b5b8"},".namespace":{Opacity:".7"},null:{color:"#fd8b19"},operator:{color:"#fd8b19"},boolean:{color:"#fd8b19"},number:{color:"#fd8b19"},property:{color:"#fdcc59"},tag:{color:"#1290bf"},string:{color:"#149b93"},selector:{color:"#c85e7c"},"attr-name":{color:"#fd8b19"},entity:{color:"#149b93",cursor:"help"},url:{color:"#149b93"},".language-css .token.string":{color:"#149b93"},".style .token.string":{color:"#149b93"},"attr-value":{color:"#8fc13e"},keyword:{color:"#8fc13e"},control:{color:"#8fc13e"},directive:{color:"#8fc13e"},unit:{color:"#8fc13e"},statement:{color:"#149b93"},regex:{color:"#149b93"},atrule:{color:"#149b93"},placeholder:{color:"#1290bf"},variable:{color:"#1290bf"},important:{color:"#dd464c",fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid red",OutlineOffset:".4em"}};e.default=t}(QE)),QE}var JE={},U5;function s0e(){return U5||(U5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#f8f8f2",background:"none",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Monaco, Consolas, 'Andale Mono', 'Ubuntu Mono', monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#f8f8f2",background:"#263E52",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Monaco, Consolas, 'Andale Mono', 'Ubuntu Mono', monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",borderRadius:"0.3em"},':not(pre) > code[class*="language-"]':{background:"#263E52",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#5c98cd"},prolog:{color:"#5c98cd"},doctype:{color:"#5c98cd"},cdata:{color:"#5c98cd"},punctuation:{color:"#f8f8f2"},".namespace":{Opacity:".7"},property:{color:"#F05E5D"},tag:{color:"#F05E5D"},constant:{color:"#F05E5D"},symbol:{color:"#F05E5D"},deleted:{color:"#F05E5D"},boolean:{color:"#BC94F9"},number:{color:"#BC94F9"},selector:{color:"#FCFCD6"},"attr-name":{color:"#FCFCD6"},string:{color:"#FCFCD6"},char:{color:"#FCFCD6"},builtin:{color:"#FCFCD6"},inserted:{color:"#FCFCD6"},operator:{color:"#f8f8f2"},entity:{color:"#f8f8f2",cursor:"help"},url:{color:"#f8f8f2"},".language-css .token.string":{color:"#f8f8f2"},".style .token.string":{color:"#f8f8f2"},variable:{color:"#f8f8f2"},atrule:{color:"#66D8EF"},"attr-value":{color:"#66D8EF"},function:{color:"#66D8EF"},"class-name":{color:"#66D8EF"},keyword:{color:"#6EB26E"},regex:{color:"#F05E5D"},important:{color:"#F05E5D",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(JE)),JE}var ex={},B5;function l0e(){return B5||(B5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",color:"#eee",background:"#2f2f2f",fontFamily:"Roboto Mono, monospace",fontSize:"1em",lineHeight:"1.5em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",color:"#eee",background:"#2f2f2f",fontFamily:"Roboto Mono, monospace",fontSize:"1em",lineHeight:"1.5em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",overflow:"auto",position:"relative",margin:"0.5em 0",padding:"1.25em 1em"},'code[class*="language-"]::-moz-selection':{background:"#363636"},'pre[class*="language-"]::-moz-selection':{background:"#363636"},'code[class*="language-"] ::-moz-selection':{background:"#363636"},'pre[class*="language-"] ::-moz-selection':{background:"#363636"},'code[class*="language-"]::selection':{background:"#363636"},'pre[class*="language-"]::selection':{background:"#363636"},'code[class*="language-"] ::selection':{background:"#363636"},'pre[class*="language-"] ::selection':{background:"#363636"},':not(pre) > code[class*="language-"]':{whiteSpace:"normal",borderRadius:"0.2em",padding:"0.1em"},".language-css > code":{color:"#fd9170"},".language-sass > code":{color:"#fd9170"},".language-scss > code":{color:"#fd9170"},'[class*="language-"] .namespace':{Opacity:"0.7"},atrule:{color:"#c792ea"},"attr-name":{color:"#ffcb6b"},"attr-value":{color:"#a5e844"},attribute:{color:"#a5e844"},boolean:{color:"#c792ea"},builtin:{color:"#ffcb6b"},cdata:{color:"#80cbc4"},char:{color:"#80cbc4"},class:{color:"#ffcb6b"},"class-name":{color:"#f2ff00"},comment:{color:"#616161"},constant:{color:"#c792ea"},deleted:{color:"#ff6666"},doctype:{color:"#616161"},entity:{color:"#ff6666"},function:{color:"#c792ea"},hexcode:{color:"#f2ff00"},id:{color:"#c792ea",fontWeight:"bold"},important:{color:"#c792ea",fontWeight:"bold"},inserted:{color:"#80cbc4"},keyword:{color:"#c792ea"},number:{color:"#fd9170"},operator:{color:"#89ddff"},prolog:{color:"#616161"},property:{color:"#80cbc4"},"pseudo-class":{color:"#a5e844"},"pseudo-element":{color:"#a5e844"},punctuation:{color:"#89ddff"},regex:{color:"#f2ff00"},selector:{color:"#ff6666"},string:{color:"#a5e844"},symbol:{color:"#c792ea"},tag:{color:"#ff6666"},unit:{color:"#fd9170"},url:{color:"#ff6666"},variable:{color:"#ff6666"}};e.default=t}(ex)),ex}var tx={},H5;function c0e(){return H5||(H5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",color:"#90a4ae",background:"#fafafa",fontFamily:"Roboto Mono, monospace",fontSize:"1em",lineHeight:"1.5em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",color:"#90a4ae",background:"#fafafa",fontFamily:"Roboto Mono, monospace",fontSize:"1em",lineHeight:"1.5em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",overflow:"auto",position:"relative",margin:"0.5em 0",padding:"1.25em 1em"},'code[class*="language-"]::-moz-selection':{background:"#cceae7",color:"#263238"},'pre[class*="language-"]::-moz-selection':{background:"#cceae7",color:"#263238"},'code[class*="language-"] ::-moz-selection':{background:"#cceae7",color:"#263238"},'pre[class*="language-"] ::-moz-selection':{background:"#cceae7",color:"#263238"},'code[class*="language-"]::selection':{background:"#cceae7",color:"#263238"},'pre[class*="language-"]::selection':{background:"#cceae7",color:"#263238"},'code[class*="language-"] ::selection':{background:"#cceae7",color:"#263238"},'pre[class*="language-"] ::selection':{background:"#cceae7",color:"#263238"},':not(pre) > code[class*="language-"]':{whiteSpace:"normal",borderRadius:"0.2em",padding:"0.1em"},".language-css > code":{color:"#f76d47"},".language-sass > code":{color:"#f76d47"},".language-scss > code":{color:"#f76d47"},'[class*="language-"] .namespace':{Opacity:"0.7"},atrule:{color:"#7c4dff"},"attr-name":{color:"#39adb5"},"attr-value":{color:"#f6a434"},attribute:{color:"#f6a434"},boolean:{color:"#7c4dff"},builtin:{color:"#39adb5"},cdata:{color:"#39adb5"},char:{color:"#39adb5"},class:{color:"#39adb5"},"class-name":{color:"#6182b8"},comment:{color:"#aabfc9"},constant:{color:"#7c4dff"},deleted:{color:"#e53935"},doctype:{color:"#aabfc9"},entity:{color:"#e53935"},function:{color:"#7c4dff"},hexcode:{color:"#f76d47"},id:{color:"#7c4dff",fontWeight:"bold"},important:{color:"#7c4dff",fontWeight:"bold"},inserted:{color:"#39adb5"},keyword:{color:"#7c4dff"},number:{color:"#f76d47"},operator:{color:"#39adb5"},prolog:{color:"#aabfc9"},property:{color:"#39adb5"},"pseudo-class":{color:"#f6a434"},"pseudo-element":{color:"#f6a434"},punctuation:{color:"#39adb5"},regex:{color:"#6182b8"},selector:{color:"#e53935"},string:{color:"#f6a434"},symbol:{color:"#7c4dff"},tag:{color:"#e53935"},unit:{color:"#f76d47"},url:{color:"#e53935"},variable:{color:"#e53935"}};e.default=t}(tx)),tx}var nx={},V5;function u0e(){return V5||(V5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",color:"#c3cee3",background:"#263238",fontFamily:"Roboto Mono, monospace",fontSize:"1em",lineHeight:"1.5em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",color:"#c3cee3",background:"#263238",fontFamily:"Roboto Mono, monospace",fontSize:"1em",lineHeight:"1.5em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",overflow:"auto",position:"relative",margin:"0.5em 0",padding:"1.25em 1em"},'code[class*="language-"]::-moz-selection':{background:"#363636"},'pre[class*="language-"]::-moz-selection':{background:"#363636"},'code[class*="language-"] ::-moz-selection':{background:"#363636"},'pre[class*="language-"] ::-moz-selection':{background:"#363636"},'code[class*="language-"]::selection':{background:"#363636"},'pre[class*="language-"]::selection':{background:"#363636"},'code[class*="language-"] ::selection':{background:"#363636"},'pre[class*="language-"] ::selection':{background:"#363636"},':not(pre) > code[class*="language-"]':{whiteSpace:"normal",borderRadius:"0.2em",padding:"0.1em"},".language-css > code":{color:"#fd9170"},".language-sass > code":{color:"#fd9170"},".language-scss > code":{color:"#fd9170"},'[class*="language-"] .namespace':{Opacity:"0.7"},atrule:{color:"#c792ea"},"attr-name":{color:"#ffcb6b"},"attr-value":{color:"#c3e88d"},attribute:{color:"#c3e88d"},boolean:{color:"#c792ea"},builtin:{color:"#ffcb6b"},cdata:{color:"#80cbc4"},char:{color:"#80cbc4"},class:{color:"#ffcb6b"},"class-name":{color:"#f2ff00"},color:{color:"#f2ff00"},comment:{color:"#546e7a"},constant:{color:"#c792ea"},deleted:{color:"#f07178"},doctype:{color:"#546e7a"},entity:{color:"#f07178"},function:{color:"#c792ea"},hexcode:{color:"#f2ff00"},id:{color:"#c792ea",fontWeight:"bold"},important:{color:"#c792ea",fontWeight:"bold"},inserted:{color:"#80cbc4"},keyword:{color:"#c792ea",fontStyle:"italic"},number:{color:"#fd9170"},operator:{color:"#89ddff"},prolog:{color:"#546e7a"},property:{color:"#80cbc4"},"pseudo-class":{color:"#c3e88d"},"pseudo-element":{color:"#c3e88d"},punctuation:{color:"#89ddff"},regex:{color:"#f2ff00"},selector:{color:"#f07178"},string:{color:"#c3e88d"},symbol:{color:"#c792ea"},tag:{color:"#f07178"},unit:{color:"#f07178"},url:{color:"#fd9170"},variable:{color:"#f07178"}};e.default=t}(nx)),nx}var rx={},q5;function d0e(){return q5||(q5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#d6deeb",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",fontSize:"1em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"white",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",fontSize:"1em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto",background:"#011627"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'pre[class*="language-"]::selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'code[class*="language-"]::selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'code[class*="language-"] ::selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},':not(pre) > code[class*="language-"]':{color:"white",background:"#011627",padding:"0.1em",borderRadius:"0.3em",whiteSpace:"normal"},comment:{color:"rgb(99, 119, 119)",fontStyle:"italic"},prolog:{color:"rgb(99, 119, 119)",fontStyle:"italic"},cdata:{color:"rgb(99, 119, 119)",fontStyle:"italic"},punctuation:{color:"rgb(199, 146, 234)"},".namespace":{color:"rgb(178, 204, 214)"},deleted:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"},symbol:{color:"rgb(128, 203, 196)"},property:{color:"rgb(128, 203, 196)"},tag:{color:"rgb(127, 219, 202)"},operator:{color:"rgb(127, 219, 202)"},keyword:{color:"rgb(127, 219, 202)"},boolean:{color:"rgb(255, 88, 116)"},number:{color:"rgb(247, 140, 108)"},constant:{color:"rgb(130, 170, 255)"},function:{color:"rgb(130, 170, 255)"},builtin:{color:"rgb(130, 170, 255)"},char:{color:"rgb(130, 170, 255)"},selector:{color:"rgb(199, 146, 234)",fontStyle:"italic"},doctype:{color:"rgb(199, 146, 234)",fontStyle:"italic"},"attr-name":{color:"rgb(173, 219, 103)",fontStyle:"italic"},inserted:{color:"rgb(173, 219, 103)",fontStyle:"italic"},string:{color:"rgb(173, 219, 103)"},url:{color:"rgb(173, 219, 103)"},entity:{color:"rgb(173, 219, 103)"},".language-css .token.string":{color:"rgb(173, 219, 103)"},".style .token.string":{color:"rgb(173, 219, 103)"},"class-name":{color:"rgb(255, 203, 139)"},atrule:{color:"rgb(255, 203, 139)"},"attr-value":{color:"rgb(255, 203, 139)"},regex:{color:"rgb(214, 222, 235)"},important:{color:"rgb(214, 222, 235)",fontWeight:"bold"},variable:{color:"rgb(214, 222, 235)"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(rx)),rx}var ax={},G5;function f0e(){return G5||(G5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#f8f8f2",background:"none",fontFamily:`"Fira Code", Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace`,textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#f8f8f2",background:"#2E3440",fontFamily:`"Fira Code", Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace`,textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",borderRadius:"0.3em"},':not(pre) > code[class*="language-"]':{background:"#2E3440",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#636f88"},prolog:{color:"#636f88"},doctype:{color:"#636f88"},cdata:{color:"#636f88"},punctuation:{color:"#81A1C1"},".namespace":{Opacity:".7"},property:{color:"#81A1C1"},tag:{color:"#81A1C1"},constant:{color:"#81A1C1"},symbol:{color:"#81A1C1"},deleted:{color:"#81A1C1"},number:{color:"#B48EAD"},boolean:{color:"#81A1C1"},selector:{color:"#A3BE8C"},"attr-name":{color:"#A3BE8C"},string:{color:"#A3BE8C"},char:{color:"#A3BE8C"},builtin:{color:"#A3BE8C"},inserted:{color:"#A3BE8C"},operator:{color:"#81A1C1"},entity:{color:"#81A1C1",cursor:"help"},url:{color:"#81A1C1"},".language-css .token.string":{color:"#81A1C1"},".style .token.string":{color:"#81A1C1"},variable:{color:"#81A1C1"},atrule:{color:"#88C0D0"},"attr-value":{color:"#88C0D0"},function:{color:"#88C0D0"},"class-name":{color:"#88C0D0"},keyword:{color:"#81A1C1"},regex:{color:"#EBCB8B"},important:{color:"#EBCB8B",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(ax)),ax}var ox={},W5;function p0e(){return W5||(W5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{background:"hsl(220, 13%, 18%)",color:"hsl(220, 14%, 71%)",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:'"Fira Code", "Fira Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"2",OTabSize:"2",tabSize:"2",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{background:"hsl(220, 13%, 18%)",color:"hsl(220, 14%, 71%)",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:'"Fira Code", "Fira Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"2",OTabSize:"2",tabSize:"2",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto",borderRadius:"0.3em"},'code[class*="language-"]::-moz-selection':{background:"hsl(220, 13%, 28%)",color:"inherit",textShadow:"none"},'code[class*="language-"] *::-moz-selection':{background:"hsl(220, 13%, 28%)",color:"inherit",textShadow:"none"},'pre[class*="language-"] *::-moz-selection':{background:"hsl(220, 13%, 28%)",color:"inherit",textShadow:"none"},'code[class*="language-"]::selection':{background:"hsl(220, 13%, 28%)",color:"inherit",textShadow:"none"},'code[class*="language-"] *::selection':{background:"hsl(220, 13%, 28%)",color:"inherit",textShadow:"none"},'pre[class*="language-"] *::selection':{background:"hsl(220, 13%, 28%)",color:"inherit",textShadow:"none"},':not(pre) > code[class*="language-"]':{padding:"0.2em 0.3em",borderRadius:"0.3em",whiteSpace:"normal"},comment:{color:"hsl(220, 10%, 40%)",fontStyle:"italic"},prolog:{color:"hsl(220, 10%, 40%)"},cdata:{color:"hsl(220, 10%, 40%)"},doctype:{color:"hsl(220, 14%, 71%)"},punctuation:{color:"hsl(220, 14%, 71%)"},entity:{color:"hsl(220, 14%, 71%)",cursor:"help"},"attr-name":{color:"hsl(29, 54%, 61%)"},"class-name":{color:"hsl(29, 54%, 61%)"},boolean:{color:"hsl(29, 54%, 61%)"},constant:{color:"hsl(29, 54%, 61%)"},number:{color:"hsl(29, 54%, 61%)"},atrule:{color:"hsl(29, 54%, 61%)"},keyword:{color:"hsl(286, 60%, 67%)"},property:{color:"hsl(355, 65%, 65%)"},tag:{color:"hsl(355, 65%, 65%)"},symbol:{color:"hsl(355, 65%, 65%)"},deleted:{color:"hsl(355, 65%, 65%)"},important:{color:"hsl(355, 65%, 65%)"},selector:{color:"hsl(95, 38%, 62%)"},string:{color:"hsl(95, 38%, 62%)"},char:{color:"hsl(95, 38%, 62%)"},builtin:{color:"hsl(95, 38%, 62%)"},inserted:{color:"hsl(95, 38%, 62%)"},regex:{color:"hsl(95, 38%, 62%)"},"attr-value":{color:"hsl(95, 38%, 62%)"},"attr-value > .token.punctuation":{color:"hsl(95, 38%, 62%)"},variable:{color:"hsl(207, 82%, 66%)"},operator:{color:"hsl(207, 82%, 66%)"},function:{color:"hsl(207, 82%, 66%)"},url:{color:"hsl(187, 47%, 55%)"},"attr-value > .token.punctuation.attr-equals":{color:"hsl(220, 14%, 71%)"},"special-attr > .token.attr-value > .token.value.css":{color:"hsl(220, 14%, 71%)"},".language-css .token.selector":{color:"hsl(355, 65%, 65%)"},".language-css .token.property":{color:"hsl(220, 14%, 71%)"},".language-css .token.function":{color:"hsl(187, 47%, 55%)"},".language-css .token.url > .token.function":{color:"hsl(187, 47%, 55%)"},".language-css .token.url > .token.string.url":{color:"hsl(95, 38%, 62%)"},".language-css .token.important":{color:"hsl(286, 60%, 67%)"},".language-css .token.atrule .token.rule":{color:"hsl(286, 60%, 67%)"},".language-javascript .token.operator":{color:"hsl(286, 60%, 67%)"},".language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation":{color:"hsl(5, 48%, 51%)"},".language-json .token.operator":{color:"hsl(220, 14%, 71%)"},".language-json .token.null.keyword":{color:"hsl(29, 54%, 61%)"},".language-markdown .token.url":{color:"hsl(220, 14%, 71%)"},".language-markdown .token.url > .token.operator":{color:"hsl(220, 14%, 71%)"},".language-markdown .token.url-reference.url > .token.string":{color:"hsl(220, 14%, 71%)"},".language-markdown .token.url > .token.content":{color:"hsl(207, 82%, 66%)"},".language-markdown .token.url > .token.url":{color:"hsl(187, 47%, 55%)"},".language-markdown .token.url-reference.url":{color:"hsl(187, 47%, 55%)"},".language-markdown .token.blockquote.punctuation":{color:"hsl(220, 10%, 40%)",fontStyle:"italic"},".language-markdown .token.hr.punctuation":{color:"hsl(220, 10%, 40%)",fontStyle:"italic"},".language-markdown .token.code-snippet":{color:"hsl(95, 38%, 62%)"},".language-markdown .token.bold .token.content":{color:"hsl(29, 54%, 61%)"},".language-markdown .token.italic .token.content":{color:"hsl(286, 60%, 67%)"},".language-markdown .token.strike .token.content":{color:"hsl(355, 65%, 65%)"},".language-markdown .token.strike .token.punctuation":{color:"hsl(355, 65%, 65%)"},".language-markdown .token.list.punctuation":{color:"hsl(355, 65%, 65%)"},".language-markdown .token.title.important > .token.punctuation":{color:"hsl(355, 65%, 65%)"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},namespace:{Opacity:"0.8"},"token.tab:not(:empty):before":{color:"hsla(220, 14%, 71%, 0.15)",textShadow:"none"},"token.cr:before":{color:"hsla(220, 14%, 71%, 0.15)",textShadow:"none"},"token.lf:before":{color:"hsla(220, 14%, 71%, 0.15)",textShadow:"none"},"token.space:before":{color:"hsla(220, 14%, 71%, 0.15)",textShadow:"none"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item":{marginRight:"0.4em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button":{background:"hsl(220, 13%, 26%)",color:"hsl(220, 9%, 55%)",padding:"0.1em 0.4em",borderRadius:"0.3em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a":{background:"hsl(220, 13%, 26%)",color:"hsl(220, 9%, 55%)",padding:"0.1em 0.4em",borderRadius:"0.3em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span":{background:"hsl(220, 13%, 26%)",color:"hsl(220, 9%, 55%)",padding:"0.1em 0.4em",borderRadius:"0.3em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover":{background:"hsl(220, 13%, 28%)",color:"hsl(220, 14%, 71%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus":{background:"hsl(220, 13%, 28%)",color:"hsl(220, 14%, 71%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover":{background:"hsl(220, 13%, 28%)",color:"hsl(220, 14%, 71%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus":{background:"hsl(220, 13%, 28%)",color:"hsl(220, 14%, 71%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover":{background:"hsl(220, 13%, 28%)",color:"hsl(220, 14%, 71%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus":{background:"hsl(220, 13%, 28%)",color:"hsl(220, 14%, 71%)"},".line-highlight.line-highlight":{background:"hsla(220, 100%, 80%, 0.04)"},".line-highlight.line-highlight:before":{background:"hsl(220, 13%, 26%)",color:"hsl(220, 14%, 71%)",padding:"0.1em 0.6em",borderRadius:"0.3em",boxShadow:"0 2px 0 0 rgba(0, 0, 0, 0.2)"},".line-highlight.line-highlight[data-end]:after":{background:"hsl(220, 13%, 26%)",color:"hsl(220, 14%, 71%)",padding:"0.1em 0.6em",borderRadius:"0.3em",boxShadow:"0 2px 0 0 rgba(0, 0, 0, 0.2)"},"pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before":{backgroundColor:"hsla(220, 100%, 80%, 0.04)"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"hsla(220, 14%, 71%, 0.15)"},".command-line .command-line-prompt":{borderRightColor:"hsla(220, 14%, 71%, 0.15)"},".line-numbers .line-numbers-rows > span:before":{color:"hsl(220, 14%, 45%)"},".command-line .command-line-prompt > span:before":{color:"hsl(220, 14%, 45%)"},".rainbow-braces .token.token.punctuation.brace-level-1":{color:"hsl(355, 65%, 65%)"},".rainbow-braces .token.token.punctuation.brace-level-5":{color:"hsl(355, 65%, 65%)"},".rainbow-braces .token.token.punctuation.brace-level-9":{color:"hsl(355, 65%, 65%)"},".rainbow-braces .token.token.punctuation.brace-level-2":{color:"hsl(95, 38%, 62%)"},".rainbow-braces .token.token.punctuation.brace-level-6":{color:"hsl(95, 38%, 62%)"},".rainbow-braces .token.token.punctuation.brace-level-10":{color:"hsl(95, 38%, 62%)"},".rainbow-braces .token.token.punctuation.brace-level-3":{color:"hsl(207, 82%, 66%)"},".rainbow-braces .token.token.punctuation.brace-level-7":{color:"hsl(207, 82%, 66%)"},".rainbow-braces .token.token.punctuation.brace-level-11":{color:"hsl(207, 82%, 66%)"},".rainbow-braces .token.token.punctuation.brace-level-4":{color:"hsl(286, 60%, 67%)"},".rainbow-braces .token.token.punctuation.brace-level-8":{color:"hsl(286, 60%, 67%)"},".rainbow-braces .token.token.punctuation.brace-level-12":{color:"hsl(286, 60%, 67%)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)":{backgroundColor:"hsla(353, 100%, 66%, 0.15)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)":{backgroundColor:"hsla(353, 100%, 66%, 0.15)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix) *::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix) *::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)":{backgroundColor:"hsla(137, 100%, 55%, 0.15)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)":{backgroundColor:"hsla(137, 100%, 55%, 0.15)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix) *::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix) *::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},".prism-previewer.prism-previewer:before":{borderColor:"hsl(224, 13%, 17%)"},".prism-previewer-gradient.prism-previewer-gradient div":{borderColor:"hsl(224, 13%, 17%)",borderRadius:"0.3em"},".prism-previewer-color.prism-previewer-color:before":{borderRadius:"0.3em"},".prism-previewer-easing.prism-previewer-easing:before":{borderRadius:"0.3em"},".prism-previewer.prism-previewer:after":{borderTopColor:"hsl(224, 13%, 17%)"},".prism-previewer-flipped.prism-previewer-flipped.after":{borderBottomColor:"hsl(224, 13%, 17%)"},".prism-previewer-angle.prism-previewer-angle:before":{background:"hsl(219, 13%, 22%)"},".prism-previewer-time.prism-previewer-time:before":{background:"hsl(219, 13%, 22%)"},".prism-previewer-easing.prism-previewer-easing":{background:"hsl(219, 13%, 22%)"},".prism-previewer-angle.prism-previewer-angle circle":{stroke:"hsl(220, 14%, 71%)",strokeOpacity:"1"},".prism-previewer-time.prism-previewer-time circle":{stroke:"hsl(220, 14%, 71%)",strokeOpacity:"1"},".prism-previewer-easing.prism-previewer-easing circle":{stroke:"hsl(220, 14%, 71%)",fill:"transparent"},".prism-previewer-easing.prism-previewer-easing path":{stroke:"hsl(220, 14%, 71%)"},".prism-previewer-easing.prism-previewer-easing line":{stroke:"hsl(220, 14%, 71%)"}};e.default=t}(ox)),ox}var ix={},K5;function g0e(){return K5||(K5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{background:"hsl(230, 1%, 98%)",color:"hsl(230, 8%, 24%)",fontFamily:'"Fira Code", "Fira Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"2",OTabSize:"2",tabSize:"2",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{background:"hsl(230, 1%, 98%)",color:"hsl(230, 8%, 24%)",fontFamily:'"Fira Code", "Fira Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"2",OTabSize:"2",tabSize:"2",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto",borderRadius:"0.3em"},'code[class*="language-"]::-moz-selection':{background:"hsl(230, 1%, 90%)",color:"inherit"},'code[class*="language-"] *::-moz-selection':{background:"hsl(230, 1%, 90%)",color:"inherit"},'pre[class*="language-"] *::-moz-selection':{background:"hsl(230, 1%, 90%)",color:"inherit"},'code[class*="language-"]::selection':{background:"hsl(230, 1%, 90%)",color:"inherit"},'code[class*="language-"] *::selection':{background:"hsl(230, 1%, 90%)",color:"inherit"},'pre[class*="language-"] *::selection':{background:"hsl(230, 1%, 90%)",color:"inherit"},':not(pre) > code[class*="language-"]':{padding:"0.2em 0.3em",borderRadius:"0.3em",whiteSpace:"normal"},comment:{color:"hsl(230, 4%, 64%)",fontStyle:"italic"},prolog:{color:"hsl(230, 4%, 64%)"},cdata:{color:"hsl(230, 4%, 64%)"},doctype:{color:"hsl(230, 8%, 24%)"},punctuation:{color:"hsl(230, 8%, 24%)"},entity:{color:"hsl(230, 8%, 24%)",cursor:"help"},"attr-name":{color:"hsl(35, 99%, 36%)"},"class-name":{color:"hsl(35, 99%, 36%)"},boolean:{color:"hsl(35, 99%, 36%)"},constant:{color:"hsl(35, 99%, 36%)"},number:{color:"hsl(35, 99%, 36%)"},atrule:{color:"hsl(35, 99%, 36%)"},keyword:{color:"hsl(301, 63%, 40%)"},property:{color:"hsl(5, 74%, 59%)"},tag:{color:"hsl(5, 74%, 59%)"},symbol:{color:"hsl(5, 74%, 59%)"},deleted:{color:"hsl(5, 74%, 59%)"},important:{color:"hsl(5, 74%, 59%)"},selector:{color:"hsl(119, 34%, 47%)"},string:{color:"hsl(119, 34%, 47%)"},char:{color:"hsl(119, 34%, 47%)"},builtin:{color:"hsl(119, 34%, 47%)"},inserted:{color:"hsl(119, 34%, 47%)"},regex:{color:"hsl(119, 34%, 47%)"},"attr-value":{color:"hsl(119, 34%, 47%)"},"attr-value > .token.punctuation":{color:"hsl(119, 34%, 47%)"},variable:{color:"hsl(221, 87%, 60%)"},operator:{color:"hsl(221, 87%, 60%)"},function:{color:"hsl(221, 87%, 60%)"},url:{color:"hsl(198, 99%, 37%)"},"attr-value > .token.punctuation.attr-equals":{color:"hsl(230, 8%, 24%)"},"special-attr > .token.attr-value > .token.value.css":{color:"hsl(230, 8%, 24%)"},".language-css .token.selector":{color:"hsl(5, 74%, 59%)"},".language-css .token.property":{color:"hsl(230, 8%, 24%)"},".language-css .token.function":{color:"hsl(198, 99%, 37%)"},".language-css .token.url > .token.function":{color:"hsl(198, 99%, 37%)"},".language-css .token.url > .token.string.url":{color:"hsl(119, 34%, 47%)"},".language-css .token.important":{color:"hsl(301, 63%, 40%)"},".language-css .token.atrule .token.rule":{color:"hsl(301, 63%, 40%)"},".language-javascript .token.operator":{color:"hsl(301, 63%, 40%)"},".language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation":{color:"hsl(344, 84%, 43%)"},".language-json .token.operator":{color:"hsl(230, 8%, 24%)"},".language-json .token.null.keyword":{color:"hsl(35, 99%, 36%)"},".language-markdown .token.url":{color:"hsl(230, 8%, 24%)"},".language-markdown .token.url > .token.operator":{color:"hsl(230, 8%, 24%)"},".language-markdown .token.url-reference.url > .token.string":{color:"hsl(230, 8%, 24%)"},".language-markdown .token.url > .token.content":{color:"hsl(221, 87%, 60%)"},".language-markdown .token.url > .token.url":{color:"hsl(198, 99%, 37%)"},".language-markdown .token.url-reference.url":{color:"hsl(198, 99%, 37%)"},".language-markdown .token.blockquote.punctuation":{color:"hsl(230, 4%, 64%)",fontStyle:"italic"},".language-markdown .token.hr.punctuation":{color:"hsl(230, 4%, 64%)",fontStyle:"italic"},".language-markdown .token.code-snippet":{color:"hsl(119, 34%, 47%)"},".language-markdown .token.bold .token.content":{color:"hsl(35, 99%, 36%)"},".language-markdown .token.italic .token.content":{color:"hsl(301, 63%, 40%)"},".language-markdown .token.strike .token.content":{color:"hsl(5, 74%, 59%)"},".language-markdown .token.strike .token.punctuation":{color:"hsl(5, 74%, 59%)"},".language-markdown .token.list.punctuation":{color:"hsl(5, 74%, 59%)"},".language-markdown .token.title.important > .token.punctuation":{color:"hsl(5, 74%, 59%)"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},namespace:{Opacity:"0.8"},"token.tab:not(:empty):before":{color:"hsla(230, 8%, 24%, 0.2)"},"token.cr:before":{color:"hsla(230, 8%, 24%, 0.2)"},"token.lf:before":{color:"hsla(230, 8%, 24%, 0.2)"},"token.space:before":{color:"hsla(230, 8%, 24%, 0.2)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item":{marginRight:"0.4em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button":{background:"hsl(230, 1%, 90%)",color:"hsl(230, 6%, 44%)",padding:"0.1em 0.4em",borderRadius:"0.3em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a":{background:"hsl(230, 1%, 90%)",color:"hsl(230, 6%, 44%)",padding:"0.1em 0.4em",borderRadius:"0.3em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span":{background:"hsl(230, 1%, 90%)",color:"hsl(230, 6%, 44%)",padding:"0.1em 0.4em",borderRadius:"0.3em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover":{background:"hsl(230, 1%, 78%)",color:"hsl(230, 8%, 24%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus":{background:"hsl(230, 1%, 78%)",color:"hsl(230, 8%, 24%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover":{background:"hsl(230, 1%, 78%)",color:"hsl(230, 8%, 24%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus":{background:"hsl(230, 1%, 78%)",color:"hsl(230, 8%, 24%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover":{background:"hsl(230, 1%, 78%)",color:"hsl(230, 8%, 24%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus":{background:"hsl(230, 1%, 78%)",color:"hsl(230, 8%, 24%)"},".line-highlight.line-highlight":{background:"hsla(230, 8%, 24%, 0.05)"},".line-highlight.line-highlight:before":{background:"hsl(230, 1%, 90%)",color:"hsl(230, 8%, 24%)",padding:"0.1em 0.6em",borderRadius:"0.3em",boxShadow:"0 2px 0 0 rgba(0, 0, 0, 0.2)"},".line-highlight.line-highlight[data-end]:after":{background:"hsl(230, 1%, 90%)",color:"hsl(230, 8%, 24%)",padding:"0.1em 0.6em",borderRadius:"0.3em",boxShadow:"0 2px 0 0 rgba(0, 0, 0, 0.2)"},"pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before":{backgroundColor:"hsla(230, 8%, 24%, 0.05)"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"hsla(230, 8%, 24%, 0.2)"},".command-line .command-line-prompt":{borderRightColor:"hsla(230, 8%, 24%, 0.2)"},".line-numbers .line-numbers-rows > span:before":{color:"hsl(230, 1%, 62%)"},".command-line .command-line-prompt > span:before":{color:"hsl(230, 1%, 62%)"},".rainbow-braces .token.token.punctuation.brace-level-1":{color:"hsl(5, 74%, 59%)"},".rainbow-braces .token.token.punctuation.brace-level-5":{color:"hsl(5, 74%, 59%)"},".rainbow-braces .token.token.punctuation.brace-level-9":{color:"hsl(5, 74%, 59%)"},".rainbow-braces .token.token.punctuation.brace-level-2":{color:"hsl(119, 34%, 47%)"},".rainbow-braces .token.token.punctuation.brace-level-6":{color:"hsl(119, 34%, 47%)"},".rainbow-braces .token.token.punctuation.brace-level-10":{color:"hsl(119, 34%, 47%)"},".rainbow-braces .token.token.punctuation.brace-level-3":{color:"hsl(221, 87%, 60%)"},".rainbow-braces .token.token.punctuation.brace-level-7":{color:"hsl(221, 87%, 60%)"},".rainbow-braces .token.token.punctuation.brace-level-11":{color:"hsl(221, 87%, 60%)"},".rainbow-braces .token.token.punctuation.brace-level-4":{color:"hsl(301, 63%, 40%)"},".rainbow-braces .token.token.punctuation.brace-level-8":{color:"hsl(301, 63%, 40%)"},".rainbow-braces .token.token.punctuation.brace-level-12":{color:"hsl(301, 63%, 40%)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)":{backgroundColor:"hsla(353, 100%, 66%, 0.15)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)":{backgroundColor:"hsla(353, 100%, 66%, 0.15)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix) *::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix) *::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)":{backgroundColor:"hsla(137, 100%, 55%, 0.15)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)":{backgroundColor:"hsla(137, 100%, 55%, 0.15)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix) *::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix) *::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},".prism-previewer.prism-previewer:before":{borderColor:"hsl(0, 0, 95%)"},".prism-previewer-gradient.prism-previewer-gradient div":{borderColor:"hsl(0, 0, 95%)",borderRadius:"0.3em"},".prism-previewer-color.prism-previewer-color:before":{borderRadius:"0.3em"},".prism-previewer-easing.prism-previewer-easing:before":{borderRadius:"0.3em"},".prism-previewer.prism-previewer:after":{borderTopColor:"hsl(0, 0, 95%)"},".prism-previewer-flipped.prism-previewer-flipped.after":{borderBottomColor:"hsl(0, 0, 95%)"},".prism-previewer-angle.prism-previewer-angle:before":{background:"hsl(0, 0%, 100%)"},".prism-previewer-time.prism-previewer-time:before":{background:"hsl(0, 0%, 100%)"},".prism-previewer-easing.prism-previewer-easing":{background:"hsl(0, 0%, 100%)"},".prism-previewer-angle.prism-previewer-angle circle":{stroke:"hsl(230, 8%, 24%)",strokeOpacity:"1"},".prism-previewer-time.prism-previewer-time circle":{stroke:"hsl(230, 8%, 24%)",strokeOpacity:"1"},".prism-previewer-easing.prism-previewer-easing circle":{stroke:"hsl(230, 8%, 24%)",fill:"transparent"},".prism-previewer-easing.prism-previewer-easing path":{stroke:"hsl(230, 8%, 24%)"},".prism-previewer-easing.prism-previewer-easing line":{stroke:"hsl(230, 8%, 24%)"}};e.default=t}(ix)),ix}var sx={},Y5;function m0e(){return Y5||(Y5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordBreak:"break-all",wordWrap:"break-word",fontFamily:'Menlo, Monaco, "Courier New", monospace',fontSize:"15px",lineHeight:"1.5",color:"#dccf8f",textShadow:"0"},'pre[class*="language-"]':{MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordBreak:"break-all",wordWrap:"break-word",fontFamily:'Menlo, Monaco, "Courier New", monospace',fontSize:"15px",lineHeight:"1.5",color:"#DCCF8F",textShadow:"0",borderRadius:"5px",border:"1px solid #000",background:"#181914 url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAMAAA/+4ADkFkb2JlAGTAAAAAAf/bAIQACQYGBgcGCQcHCQ0IBwgNDwsJCQsPEQ4ODw4OERENDg4ODg0RERQUFhQUERoaHBwaGiYmJiYmKysrKysrKysrKwEJCAgJCgkMCgoMDwwODA8TDg4ODhMVDg4PDg4VGhMRERERExoXGhYWFhoXHR0aGh0dJCQjJCQrKysrKysrKysr/8AAEQgAjACMAwEiAAIRAQMRAf/EAF4AAQEBAAAAAAAAAAAAAAAAAAABBwEBAQAAAAAAAAAAAAAAAAAAAAIQAAEDAwIHAQEAAAAAAAAAAADwAREhYaExkUFRcYGxwdHh8REBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AyGFEjHaBS2fDDs2zkhKmBKktb7km+ZwwCnXPkLVmCTMItj6AXFxRS465/BTnkAJvkLkJe+7AKKoi2AtRS2zuAWsCb5GOlBN8gKfmuGHZ8MFqIth3ALmFoFwbwKWyAlTAp17uKqBvgBD8sM4fTjhvAhkzhaRkBMKBrfs7jGPIpzy7gFrAqnC0C0gB0EWwBDW2cBVQwm+QtPpa3wBO3sVvszCnLAhkzgL5/RLf13cLQd8/AGlu0Cb5HTx9KuAEieGJEdcehS3eRTp2ATdt3CpIm+QtZwAhROXFeb7swp/ahaM3kBE/jSIUBc/AWrgBN8uNFAl+b7sAXFxFn2YLUU5Ns7gFX8C4ib+hN8gFWXwK3bZglxEJm+gKdciLPsFV/TClsgJUwKJ5FVA7tvIFrfZhVfGJDcsCKaYgAqv6YRbE+RWOWBtu7+AL3yRalXLyKqAIIfk+zARbDgFyEsncYwJvlgFRW+GEWntIi2P0BooyFxcNr8Ep3+ANLbMO+QyhvbiqdgC0kVvgUUiLYgBS2QtPbiVI1/sgOmG9uO+Y8DW+7jS2zAOnj6O2BndwuIAUtkdRN8gFoK3wwXMQyZwHVbClsuNLd4E3yAUR6FVDBR+BafQGt93LVMxJTv8ABts4CVLhcfYWsCb5kC9/BHdU8CLYFY5bMAd+eX9MGthhpbA1vu4B7+RKkaW2Yq4AQtVBBFsAJU/AuIXBhN8gGWnstefhiZyWvLAEnbYS1uzSFP6Jvn4Baxx70JKkQojLib5AVTey1jjgkKJGO0AKWyOm7N7cSpgSpAdPH0Tfd/gp1z5C1ZgKqN9J2wFxcUUuAFLZAm+QC0Fb4YUVRFsAOvj4KW2dwtYE3yAWk/wS/PLMKfmuGHZ8MAXF/Ja32Yi5haAKWz4Ydm2cSpgU693Atb7km+Zwwh+WGcPpxw3gAkzCLY+iYUDW/Z3Adc/gpzyFrAqnALkJe+7DoItgAtRS2zuKqGE3yAx0oJvkdvYrfZmALURbDuL5/RLf13cAuDeBS2RpbtAm+QFVA3wR+3fUtFHoBDJnC0jIXH0HWsgMY8inPLuOkd9chp4z20ALQLSA8cI9jYAIa2zjzjBd8gRafS1vgiUho/kAKcsCGTOGWvoOpkAtB3z8Hm8x2Ff5ADp4+lXAlIvcmwH/2Q==') repeat left top",padding:"12px",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},':not(pre) > code[class*="language-"]':{borderRadius:"5px",border:"1px solid #000",color:"#DCCF8F",background:"#181914 url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAMAAA/+4ADkFkb2JlAGTAAAAAAf/bAIQACQYGBgcGCQcHCQ0IBwgNDwsJCQsPEQ4ODw4OERENDg4ODg0RERQUFhQUERoaHBwaGiYmJiYmKysrKysrKysrKwEJCAgJCgkMCgoMDwwODA8TDg4ODhMVDg4PDg4VGhMRERERExoXGhYWFhoXHR0aGh0dJCQjJCQrKysrKysrKysr/8AAEQgAjACMAwEiAAIRAQMRAf/EAF4AAQEBAAAAAAAAAAAAAAAAAAABBwEBAQAAAAAAAAAAAAAAAAAAAAIQAAEDAwIHAQEAAAAAAAAAAADwAREhYaExkUFRcYGxwdHh8REBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AyGFEjHaBS2fDDs2zkhKmBKktb7km+ZwwCnXPkLVmCTMItj6AXFxRS465/BTnkAJvkLkJe+7AKKoi2AtRS2zuAWsCb5GOlBN8gKfmuGHZ8MFqIth3ALmFoFwbwKWyAlTAp17uKqBvgBD8sM4fTjhvAhkzhaRkBMKBrfs7jGPIpzy7gFrAqnC0C0gB0EWwBDW2cBVQwm+QtPpa3wBO3sVvszCnLAhkzgL5/RLf13cLQd8/AGlu0Cb5HTx9KuAEieGJEdcehS3eRTp2ATdt3CpIm+QtZwAhROXFeb7swp/ahaM3kBE/jSIUBc/AWrgBN8uNFAl+b7sAXFxFn2YLUU5Ns7gFX8C4ib+hN8gFWXwK3bZglxEJm+gKdciLPsFV/TClsgJUwKJ5FVA7tvIFrfZhVfGJDcsCKaYgAqv6YRbE+RWOWBtu7+AL3yRalXLyKqAIIfk+zARbDgFyEsncYwJvlgFRW+GEWntIi2P0BooyFxcNr8Ep3+ANLbMO+QyhvbiqdgC0kVvgUUiLYgBS2QtPbiVI1/sgOmG9uO+Y8DW+7jS2zAOnj6O2BndwuIAUtkdRN8gFoK3wwXMQyZwHVbClsuNLd4E3yAUR6FVDBR+BafQGt93LVMxJTv8ABts4CVLhcfYWsCb5kC9/BHdU8CLYFY5bMAd+eX9MGthhpbA1vu4B7+RKkaW2Yq4AQtVBBFsAJU/AuIXBhN8gGWnstefhiZyWvLAEnbYS1uzSFP6Jvn4Baxx70JKkQojLib5AVTey1jjgkKJGO0AKWyOm7N7cSpgSpAdPH0Tfd/gp1z5C1ZgKqN9J2wFxcUUuAFLZAm+QC0Fb4YUVRFsAOvj4KW2dwtYE3yAWk/wS/PLMKfmuGHZ8MAXF/Ja32Yi5haAKWz4Ydm2cSpgU693Atb7km+Zwwh+WGcPpxw3gAkzCLY+iYUDW/Z3Adc/gpzyFrAqnALkJe+7DoItgAtRS2zuKqGE3yAx0oJvkdvYrfZmALURbDuL5/RLf13cAuDeBS2RpbtAm+QFVA3wR+3fUtFHoBDJnC0jIXH0HWsgMY8inPLuOkd9chp4z20ALQLSA8cI9jYAIa2zjzjBd8gRafS1vgiUho/kAKcsCGTOGWvoOpkAtB3z8Hm8x2Ff5ADp4+lXAlIvcmwH/2Q==') repeat left top",padding:"2px 6px"},namespace:{Opacity:".7"},comment:{color:"#586e75",fontStyle:"italic"},prolog:{color:"#586e75",fontStyle:"italic"},doctype:{color:"#586e75",fontStyle:"italic"},cdata:{color:"#586e75",fontStyle:"italic"},number:{color:"#b89859"},string:{color:"#468966"},char:{color:"#468966"},builtin:{color:"#468966"},inserted:{color:"#468966"},"attr-name":{color:"#b89859"},operator:{color:"#dccf8f"},entity:{color:"#dccf8f",cursor:"help"},url:{color:"#dccf8f"},".language-css .token.string":{color:"#dccf8f"},".style .token.string":{color:"#dccf8f"},selector:{color:"#859900"},regex:{color:"#859900"},atrule:{color:"#cb4b16"},keyword:{color:"#cb4b16"},"attr-value":{color:"#468966"},function:{color:"#b58900"},variable:{color:"#b58900"},placeholder:{color:"#b58900"},property:{color:"#b89859"},tag:{color:"#ffb03b"},boolean:{color:"#b89859"},constant:{color:"#b89859"},symbol:{color:"#b89859"},important:{color:"#dc322f"},statement:{color:"#dc322f"},deleted:{color:"#dc322f"},punctuation:{color:"#dccf8f"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(sx)),sx}var lx={},Z5;function h0e(){return Z5||(Z5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={"code[class*='language-']":{color:"#9efeff",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",fontFamily:"'Operator Mono', 'Fira Code', Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontWeight:"400",fontSize:"17px",lineHeight:"25px",letterSpacing:"0.5px",textShadow:"0 1px #222245"},"pre[class*='language-']":{color:"#9efeff",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",fontFamily:"'Operator Mono', 'Fira Code', Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontWeight:"400",fontSize:"17px",lineHeight:"25px",letterSpacing:"0.5px",textShadow:"0 1px #222245",padding:"2em",margin:"0.5em 0",overflow:"auto",background:"#1e1e3f"},"pre[class*='language-']::-moz-selection":{color:"inherit",background:"#a599e9"},"pre[class*='language-'] ::-moz-selection":{color:"inherit",background:"#a599e9"},"code[class*='language-']::-moz-selection":{color:"inherit",background:"#a599e9"},"code[class*='language-'] ::-moz-selection":{color:"inherit",background:"#a599e9"},"pre[class*='language-']::selection":{color:"inherit",background:"#a599e9"},"pre[class*='language-'] ::selection":{color:"inherit",background:"#a599e9"},"code[class*='language-']::selection":{color:"inherit",background:"#a599e9"},"code[class*='language-'] ::selection":{color:"inherit",background:"#a599e9"},":not(pre) > code[class*='language-']":{background:"#1e1e3f",padding:"0.1em",borderRadius:"0.3em"},"":{fontWeight:"400"},comment:{color:"#b362ff"},prolog:{color:"#b362ff"},cdata:{color:"#b362ff"},delimiter:{color:"#ff9d00"},keyword:{color:"#ff9d00"},selector:{color:"#ff9d00"},important:{color:"#ff9d00"},atrule:{color:"#ff9d00"},operator:{color:"rgb(255, 180, 84)",background:"none"},"attr-name":{color:"rgb(255, 180, 84)"},punctuation:{color:"#ffffff"},boolean:{color:"rgb(255, 98, 140)"},tag:{color:"rgb(255, 157, 0)"},"tag.punctuation":{color:"rgb(255, 157, 0)"},doctype:{color:"rgb(255, 157, 0)"},builtin:{color:"rgb(255, 157, 0)"},entity:{color:"#6897bb",background:"none"},symbol:{color:"#6897bb"},number:{color:"#ff628c"},property:{color:"#ff628c"},constant:{color:"#ff628c"},variable:{color:"#ff628c"},string:{color:"#a5ff90"},char:{color:"#a5ff90"},"attr-value":{color:"#a5c261"},"attr-value.punctuation":{color:"#a5c261"},"attr-value.punctuation:first-child":{color:"#a9b7c6"},url:{color:"#287bde",textDecoration:"underline",background:"none"},function:{color:"rgb(250, 208, 0)"},regex:{background:"#364135"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},inserted:{background:"#00ff00"},deleted:{background:"#ff000d"},"code.language-css .token.property":{color:"#a9b7c6"},"code.language-css .token.property + .token.punctuation":{color:"#a9b7c6"},"code.language-css .token.id":{color:"#ffc66d"},"code.language-css .token.selector > .token.class":{color:"#ffc66d"},"code.language-css .token.selector > .token.attribute":{color:"#ffc66d"},"code.language-css .token.selector > .token.pseudo-class":{color:"#ffc66d"},"code.language-css .token.selector > .token.pseudo-element":{color:"#ffc66d"},"class-name":{color:"#fb94ff"},".language-css .token.string":{background:"none"},".style .token.string":{background:"none"},".line-highlight.line-highlight":{marginTop:"36px",background:"linear-gradient(to right, rgba(179, 98, 255, 0.17), transparent)"},".line-highlight.line-highlight:before":{content:"''"},".line-highlight.line-highlight[data-end]:after":{content:"''"}};e.default=t}(lx)),lx}var cx={},X5;function b0e(){return X5||(X5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#839496",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Inconsolata, Monaco, Consolas, 'Courier New', Courier, monospace",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#839496",textShadow:"0 1px rgba(0, 0, 0, 0.3)",fontFamily:"Inconsolata, Monaco, Consolas, 'Courier New', Courier, monospace",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",borderRadius:"0.3em",background:"#002b36"},':not(pre) > code[class*="language-"]':{background:"#002b36",padding:".1em",borderRadius:".3em"},comment:{color:"#586e75"},prolog:{color:"#586e75"},doctype:{color:"#586e75"},cdata:{color:"#586e75"},punctuation:{color:"#93a1a1"},".namespace":{Opacity:".7"},property:{color:"#268bd2"},keyword:{color:"#268bd2"},tag:{color:"#268bd2"},"class-name":{color:"#FFFFB6",textDecoration:"underline"},boolean:{color:"#b58900"},constant:{color:"#b58900"},symbol:{color:"#dc322f"},deleted:{color:"#dc322f"},number:{color:"#859900"},selector:{color:"#859900"},"attr-name":{color:"#859900"},string:{color:"#859900"},char:{color:"#859900"},builtin:{color:"#859900"},inserted:{color:"#859900"},variable:{color:"#268bd2"},operator:{color:"#EDEDED"},function:{color:"#268bd2"},regex:{color:"#E9C062"},important:{color:"#fd971f",fontWeight:"bold"},entity:{color:"#FFFFB6",cursor:"help"},url:{color:"#96CBFE"},".language-css .token.string":{color:"#87C38A"},".style .token.string":{color:"#87C38A"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},atrule:{color:"#F9EE98"},"attr-value":{color:"#F9EE98"}};e.default=t}(cx)),cx}var ux={},Q5;function y0e(){return Q5||(Q5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",backgroundColor:"transparent !important",backgroundImage:"linear-gradient(to bottom, #2a2139 75%, #34294f)"},':not(pre) > code[class*="language-"]':{backgroundColor:"transparent !important",backgroundImage:"linear-gradient(to bottom, #2a2139 75%, #34294f)",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#8e8e8e"},"block-comment":{color:"#8e8e8e"},prolog:{color:"#8e8e8e"},doctype:{color:"#8e8e8e"},cdata:{color:"#8e8e8e"},punctuation:{color:"#ccc"},tag:{color:"#e2777a"},"attr-name":{color:"#e2777a"},namespace:{color:"#e2777a"},number:{color:"#e2777a"},unit:{color:"#e2777a"},hexcode:{color:"#e2777a"},deleted:{color:"#e2777a"},property:{color:"#72f1b8",textShadow:"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475"},selector:{color:"#72f1b8",textShadow:"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475"},"function-name":{color:"#6196cc"},boolean:{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"},"selector.id":{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"},function:{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"},"class-name":{color:"#fff5f6",textShadow:"0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75"},constant:{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"},symbol:{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"},important:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575",fontWeight:"bold"},atrule:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"},keyword:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"},"selector.class":{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"},builtin:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"},string:{color:"#f87c32"},char:{color:"#f87c32"},"attr-value":{color:"#f87c32"},regex:{color:"#f87c32"},variable:{color:"#f87c32"},operator:{color:"#67cdcc"},entity:{color:"#67cdcc",cursor:"help"},url:{color:"#67cdcc"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},inserted:{color:"green"}};e.default=t}(ux)),ux}var dx={},J5;function v0e(){return J5||(J5=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#393A34",fontFamily:'"Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",fontSize:".9em",lineHeight:"1.2em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#393A34",fontFamily:'"Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",fontSize:".9em",lineHeight:"1.2em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",border:"1px solid #dddddd",backgroundColor:"white"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{background:"#C1DEF1"},'pre[class*="language-"] ::-moz-selection':{background:"#C1DEF1"},'code[class*="language-"]::-moz-selection':{background:"#C1DEF1"},'code[class*="language-"] ::-moz-selection':{background:"#C1DEF1"},'pre[class*="language-"]::selection':{background:"#C1DEF1"},'pre[class*="language-"] ::selection':{background:"#C1DEF1"},'code[class*="language-"]::selection':{background:"#C1DEF1"},'code[class*="language-"] ::selection':{background:"#C1DEF1"},':not(pre) > code[class*="language-"]':{padding:".2em",paddingTop:"1px",paddingBottom:"1px",background:"#f8f8f8",border:"1px solid #dddddd"},comment:{color:"#008000",fontStyle:"italic"},prolog:{color:"#008000",fontStyle:"italic"},doctype:{color:"#008000",fontStyle:"italic"},cdata:{color:"#008000",fontStyle:"italic"},namespace:{Opacity:".7"},string:{color:"#A31515"},punctuation:{color:"#393A34"},operator:{color:"#393A34"},url:{color:"#36acaa"},symbol:{color:"#36acaa"},number:{color:"#36acaa"},boolean:{color:"#36acaa"},variable:{color:"#36acaa"},constant:{color:"#36acaa"},inserted:{color:"#36acaa"},atrule:{color:"#0000ff"},keyword:{color:"#0000ff"},"attr-value":{color:"#0000ff"},".language-autohotkey .token.selector":{color:"#0000ff"},".language-json .token.boolean":{color:"#0000ff"},".language-json .token.number":{color:"#0000ff"},'code[class*="language-css"]':{color:"#0000ff"},function:{color:"#393A34"},deleted:{color:"#9a050f"},".language-autohotkey .token.tag":{color:"#9a050f"},selector:{color:"#800000"},".language-autohotkey .token.keyword":{color:"#00009f"},important:{color:"#e90",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},"class-name":{color:"#2B91AF"},".language-json .token.property":{color:"#2B91AF"},tag:{color:"#800000"},"attr-name":{color:"#ff0000"},property:{color:"#ff0000"},regex:{color:"#ff0000"},entity:{color:"#ff0000"},"directive.tag.tag":{background:"#ffff00",color:"#393A34"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"#a5a5a5"},".line-numbers .line-numbers-rows > span:before":{color:"#2B91AF"},".line-highlight.line-highlight":{background:"linear-gradient(to right, rgba(193, 222, 241, 0.2) 70%, rgba(221, 222, 241, 0))"}};e.default=t}(dx)),dx}var fx={},e3;function S0e(){return e3||(e3=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'pre[class*="language-"]':{color:"#d4d4d4",fontSize:"13px",textShadow:"none",fontFamily:'Menlo, Monaco, Consolas, "Andale Mono", "Ubuntu Mono", "Courier New", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",background:"#1e1e1e"},'code[class*="language-"]':{color:"#d4d4d4",fontSize:"13px",textShadow:"none",fontFamily:'Menlo, Monaco, Consolas, "Andale Mono", "Ubuntu Mono", "Courier New", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#264F78"},'code[class*="language-"]::selection':{textShadow:"none",background:"#264F78"},'pre[class*="language-"] *::selection':{textShadow:"none",background:"#264F78"},'code[class*="language-"] *::selection':{textShadow:"none",background:"#264F78"},':not(pre) > code[class*="language-"]':{padding:".1em .3em",borderRadius:".3em",color:"#db4c69",background:"#1e1e1e"},".namespace":{Opacity:".7"},"doctype.doctype-tag":{color:"#569CD6"},"doctype.name":{color:"#9cdcfe"},comment:{color:"#6a9955"},prolog:{color:"#6a9955"},punctuation:{color:"#d4d4d4"},".language-html .language-css .token.punctuation":{color:"#d4d4d4"},".language-html .language-javascript .token.punctuation":{color:"#d4d4d4"},property:{color:"#9cdcfe"},tag:{color:"#569cd6"},boolean:{color:"#569cd6"},number:{color:"#b5cea8"},constant:{color:"#9cdcfe"},symbol:{color:"#b5cea8"},inserted:{color:"#b5cea8"},unit:{color:"#b5cea8"},selector:{color:"#d7ba7d"},"attr-name":{color:"#9cdcfe"},string:{color:"#ce9178"},char:{color:"#ce9178"},builtin:{color:"#ce9178"},deleted:{color:"#ce9178"},".language-css .token.string.url":{textDecoration:"underline"},operator:{color:"#d4d4d4"},entity:{color:"#569cd6"},"operator.arrow":{color:"#569CD6"},atrule:{color:"#ce9178"},"atrule.rule":{color:"#c586c0"},"atrule.url":{color:"#9cdcfe"},"atrule.url.function":{color:"#dcdcaa"},"atrule.url.punctuation":{color:"#d4d4d4"},keyword:{color:"#569CD6"},"keyword.module":{color:"#c586c0"},"keyword.control-flow":{color:"#c586c0"},function:{color:"#dcdcaa"},"function.maybe-class-name":{color:"#dcdcaa"},regex:{color:"#d16969"},important:{color:"#569cd6"},italic:{fontStyle:"italic"},"class-name":{color:"#4ec9b0"},"maybe-class-name":{color:"#4ec9b0"},console:{color:"#9cdcfe"},parameter:{color:"#9cdcfe"},interpolation:{color:"#9cdcfe"},"punctuation.interpolation-punctuation":{color:"#569cd6"},variable:{color:"#9cdcfe"},"imports.maybe-class-name":{color:"#9cdcfe"},"exports.maybe-class-name":{color:"#9cdcfe"},escape:{color:"#d7ba7d"},"tag.punctuation":{color:"#808080"},cdata:{color:"#808080"},"attr-value":{color:"#ce9178"},"attr-value.punctuation":{color:"#ce9178"},"attr-value.punctuation.attr-equals":{color:"#d4d4d4"},namespace:{color:"#4ec9b0"},'pre[class*="language-javascript"]':{color:"#9cdcfe"},'code[class*="language-javascript"]':{color:"#9cdcfe"},'pre[class*="language-jsx"]':{color:"#9cdcfe"},'code[class*="language-jsx"]':{color:"#9cdcfe"},'pre[class*="language-typescript"]':{color:"#9cdcfe"},'code[class*="language-typescript"]':{color:"#9cdcfe"},'pre[class*="language-tsx"]':{color:"#9cdcfe"},'code[class*="language-tsx"]':{color:"#9cdcfe"},'pre[class*="language-css"]':{color:"#ce9178"},'code[class*="language-css"]':{color:"#ce9178"},'pre[class*="language-html"]':{color:"#d4d4d4"},'code[class*="language-html"]':{color:"#d4d4d4"},".language-regex .token.anchor":{color:"#dcdcaa"},".language-html .token.punctuation":{color:"#808080"},'pre[class*="language-"] > code[class*="language-"]':{position:"relative",zIndex:"1"},".line-highlight.line-highlight":{background:"#f7ebc6",boxShadow:"inset 5px 0 0 #f7d87c",zIndex:"0"}};e.default=t}(fx)),fx}var px={},t3;function w0e(){return t3||(t3=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{MozTabSize:"2",OTabSize:"2",tabSize:"2",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordWrap:"normal",fontFamily:'Menlo, Monaco, "Courier New", monospace',fontSize:"14px",color:"#76d9e6",textShadow:"none"},'pre[class*="language-"]':{MozTabSize:"2",OTabSize:"2",tabSize:"2",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordWrap:"normal",fontFamily:'Menlo, Monaco, "Courier New", monospace',fontSize:"14px",color:"#76d9e6",textShadow:"none",background:"#2a2a2a",padding:"15px",borderRadius:"4px",border:"1px solid #e1e1e8",overflow:"auto",position:"relative"},'pre > code[class*="language-"]':{fontSize:"1em"},':not(pre) > code[class*="language-"]':{background:"#2a2a2a",padding:"0.15em 0.2em 0.05em",borderRadius:".3em",border:"0.13em solid #7a6652",boxShadow:"1px 1px 0.3em -0.1em #000 inset"},'pre[class*="language-"] code':{whiteSpace:"pre",display:"block"},namespace:{Opacity:".7"},comment:{color:"#6f705e"},prolog:{color:"#6f705e"},doctype:{color:"#6f705e"},cdata:{color:"#6f705e"},operator:{color:"#a77afe"},boolean:{color:"#a77afe"},number:{color:"#a77afe"},"attr-name":{color:"#e6d06c"},string:{color:"#e6d06c"},entity:{color:"#e6d06c",cursor:"help"},url:{color:"#e6d06c"},".language-css .token.string":{color:"#e6d06c"},".style .token.string":{color:"#e6d06c"},selector:{color:"#a6e22d"},inserted:{color:"#a6e22d"},atrule:{color:"#ef3b7d"},"attr-value":{color:"#ef3b7d"},keyword:{color:"#ef3b7d"},important:{color:"#ef3b7d",fontWeight:"bold"},deleted:{color:"#ef3b7d"},regex:{color:"#76d9e6"},statement:{color:"#76d9e6",fontWeight:"bold"},placeholder:{color:"#fff"},variable:{color:"#fff"},bold:{fontWeight:"bold"},punctuation:{color:"#bebec5"},italic:{fontStyle:"italic"},"code.language-markup":{color:"#f9f9f9"},"code.language-markup .token.tag":{color:"#ef3b7d"},"code.language-markup .token.attr-name":{color:"#a6e22d"},"code.language-markup .token.attr-value":{color:"#e6d06c"},"code.language-markup .token.style":{color:"#76d9e6"},"code.language-markup .token.script":{color:"#76d9e6"},"code.language-markup .token.script .token.keyword":{color:"#76d9e6"},".line-highlight.line-highlight":{padding:"0",background:"rgba(255, 255, 255, 0.08)"},".line-highlight.line-highlight:before":{padding:"0.2em 0.5em",backgroundColor:"rgba(255, 255, 255, 0.4)",color:"black",height:"1em",lineHeight:"1em",boxShadow:"0 1px 1px rgba(255, 255, 255, 0.7)"},".line-highlight.line-highlight[data-end]:after":{padding:"0.2em 0.5em",backgroundColor:"rgba(255, 255, 255, 0.4)",color:"black",height:"1em",lineHeight:"1em",boxShadow:"0 1px 1px rgba(255, 255, 255, 0.7)"}};e.default=t}(px)),px}var gx={},n3;function E0e(){return n3||(n3=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={'code[class*="language-"]':{color:"#22da17",fontFamily:"monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",lineHeight:"25px",fontSize:"18px",margin:"5px 0"},'pre[class*="language-"]':{color:"white",fontFamily:"monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",lineHeight:"25px",fontSize:"18px",margin:"0.5em 0",background:"#0a143c",padding:"1em",overflow:"auto"},'pre[class*="language-"] *':{fontFamily:"monospace"},':not(pre) > code[class*="language-"]':{color:"white",background:"#0a143c",padding:"0.1em",borderRadius:"0.3em",whiteSpace:"normal"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'pre[class*="language-"]::selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'code[class*="language-"]::selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},'code[class*="language-"] ::selection':{textShadow:"none",background:"rgba(29, 59, 83, 0.99)"},comment:{color:"rgb(99, 119, 119)",fontStyle:"italic"},prolog:{color:"rgb(99, 119, 119)",fontStyle:"italic"},cdata:{color:"rgb(99, 119, 119)",fontStyle:"italic"},punctuation:{color:"rgb(199, 146, 234)"},".namespace":{color:"rgb(178, 204, 214)"},deleted:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"},symbol:{color:"rgb(128, 203, 196)"},property:{color:"rgb(128, 203, 196)"},tag:{color:"rgb(127, 219, 202)"},operator:{color:"rgb(127, 219, 202)"},keyword:{color:"rgb(127, 219, 202)"},boolean:{color:"rgb(255, 88, 116)"},number:{color:"rgb(247, 140, 108)"},constant:{color:"rgb(34 183 199)"},function:{color:"rgb(34 183 199)"},builtin:{color:"rgb(34 183 199)"},char:{color:"rgb(34 183 199)"},selector:{color:"rgb(199, 146, 234)",fontStyle:"italic"},doctype:{color:"rgb(199, 146, 234)",fontStyle:"italic"},"attr-name":{color:"rgb(173, 219, 103)",fontStyle:"italic"},inserted:{color:"rgb(173, 219, 103)",fontStyle:"italic"},string:{color:"rgb(173, 219, 103)"},url:{color:"rgb(173, 219, 103)"},entity:{color:"rgb(173, 219, 103)"},".language-css .token.string":{color:"rgb(173, 219, 103)"},".style .token.string":{color:"rgb(173, 219, 103)"},"class-name":{color:"rgb(255, 203, 139)"},atrule:{color:"rgb(255, 203, 139)"},"attr-value":{color:"rgb(255, 203, 139)"},regex:{color:"rgb(214, 222, 235)"},important:{color:"rgb(214, 222, 235)",fontWeight:"bold"},variable:{color:"rgb(214, 222, 235)"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};e.default=t}(gx)),gx}(function(e){var t=Owe;Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"a11yDark",{enumerable:!0,get:function(){return u.default}}),Object.defineProperty(e,"atomDark",{enumerable:!0,get:function(){return d.default}}),Object.defineProperty(e,"base16AteliersulphurpoolLight",{enumerable:!0,get:function(){return g.default}}),Object.defineProperty(e,"cb",{enumerable:!0,get:function(){return m.default}}),Object.defineProperty(e,"coldarkCold",{enumerable:!0,get:function(){return b.default}}),Object.defineProperty(e,"coldarkDark",{enumerable:!0,get:function(){return y.default}}),Object.defineProperty(e,"coy",{enumerable:!0,get:function(){return n.default}}),Object.defineProperty(e,"coyWithoutShadows",{enumerable:!0,get:function(){return w.default}}),Object.defineProperty(e,"darcula",{enumerable:!0,get:function(){return v.default}}),Object.defineProperty(e,"dark",{enumerable:!0,get:function(){return r.default}}),Object.defineProperty(e,"dracula",{enumerable:!0,get:function(){return h.default}}),Object.defineProperty(e,"duotoneDark",{enumerable:!0,get:function(){return S.default}}),Object.defineProperty(e,"duotoneEarth",{enumerable:!0,get:function(){return E.default}}),Object.defineProperty(e,"duotoneForest",{enumerable:!0,get:function(){return k.default}}),Object.defineProperty(e,"duotoneLight",{enumerable:!0,get:function(){return x.default}}),Object.defineProperty(e,"duotoneSea",{enumerable:!0,get:function(){return C.default}}),Object.defineProperty(e,"duotoneSpace",{enumerable:!0,get:function(){return _.default}}),Object.defineProperty(e,"funky",{enumerable:!0,get:function(){return a.default}}),Object.defineProperty(e,"ghcolors",{enumerable:!0,get:function(){return R.default}}),Object.defineProperty(e,"gruvboxDark",{enumerable:!0,get:function(){return T.default}}),Object.defineProperty(e,"gruvboxLight",{enumerable:!0,get:function(){return L.default}}),Object.defineProperty(e,"holiTheme",{enumerable:!0,get:function(){return D.default}}),Object.defineProperty(e,"hopscotch",{enumerable:!0,get:function(){return H.default}}),Object.defineProperty(e,"lucario",{enumerable:!0,get:function(){return z.default}}),Object.defineProperty(e,"materialDark",{enumerable:!0,get:function(){return M.default}}),Object.defineProperty(e,"materialLight",{enumerable:!0,get:function(){return U.default}}),Object.defineProperty(e,"materialOceanic",{enumerable:!0,get:function(){return X.default}}),Object.defineProperty(e,"nightOwl",{enumerable:!0,get:function(){return j.default}}),Object.defineProperty(e,"nord",{enumerable:!0,get:function(){return O.default}}),Object.defineProperty(e,"okaidia",{enumerable:!0,get:function(){return o.default}}),Object.defineProperty(e,"oneDark",{enumerable:!0,get:function(){return A.default}}),Object.defineProperty(e,"oneLight",{enumerable:!0,get:function(){return V.default}}),Object.defineProperty(e,"pojoaque",{enumerable:!0,get:function(){return P.default}}),Object.defineProperty(e,"prism",{enumerable:!0,get:function(){return c.default}}),Object.defineProperty(e,"shadesOfPurple",{enumerable:!0,get:function(){return N.default}}),Object.defineProperty(e,"solarizedDarkAtom",{enumerable:!0,get:function(){return K.default}}),Object.defineProperty(e,"solarizedlight",{enumerable:!0,get:function(){return i.default}}),Object.defineProperty(e,"synthwave84",{enumerable:!0,get:function(){return ae.default}}),Object.defineProperty(e,"tomorrow",{enumerable:!0,get:function(){return s.default}}),Object.defineProperty(e,"twilight",{enumerable:!0,get:function(){return l.default}}),Object.defineProperty(e,"vs",{enumerable:!0,get:function(){return ne.default}}),Object.defineProperty(e,"vscDarkPlus",{enumerable:!0,get:function(){return Q.default}}),Object.defineProperty(e,"xonokai",{enumerable:!0,get:function(){return pe.default}}),Object.defineProperty(e,"zTouch",{enumerable:!0,get:function(){return he.default}});var n=t(Dwe()),r=t(Lwe()),a=t(Mwe()),o=t(Pwe()),i=t($we()),s=t(Fwe()),l=t(jwe()),c=t(zwe()),u=t(Uwe()),d=t(Bwe()),g=t(Hwe()),m=t(Vwe()),b=t(qwe()),y=t(Gwe()),w=t(Wwe()),v=t(Kwe()),h=t(Ywe()),S=t(Zwe()),E=t(Xwe()),k=t(Qwe()),x=t(Jwe()),C=t(e0e()),_=t(t0e()),R=t(n0e()),T=t(r0e()),L=t(a0e()),D=t(o0e()),H=t(i0e()),z=t(s0e()),M=t(l0e()),U=t(c0e()),X=t(u0e()),j=t(d0e()),O=t(f0e()),A=t(p0e()),V=t(g0e()),P=t(m0e()),N=t(h0e()),K=t(b0e()),ae=t(y0e()),ne=t(v0e()),Q=t(S0e()),pe=t(w0e()),he=t(E0e())})(fz);const x0e={javascript:".js",python:".py",java:".java",c:".c",cpp:".cpp","c++":".cpp","c#":".cs",ruby:".rb",php:".php",swift:".swift","objective-c":".m",kotlin:".kt",typescript:".ts",go:".go",perl:".pl",rust:".rs",scala:".scala",haskell:".hs",lua:".lua",shell:".sh",sql:".sql",html:".html",css:".css"},k0e=(e,t=!1)=>{const n="ABCDEFGHJKLMNPQRSTUVWXY3456789";let r="";for(let a=0;a{const n=()=>{if(typeof window>"u")return;const a=x0e[e]||".file",o=`file-${k0e(3,!0)}${a}`,i=window.prompt("Enter file name",o);if(!i)return;const s=new Blob([t],{type:"text/plain"}),l=URL.createObjectURL(s),c=document.createElement("a");c.download=i,c.href=l,c.style.display="none",document.body.appendChild(c),c.click(),document.body.removeChild(c),URL.revokeObjectURL(l)},r=()=>{console.log("copy")};return f.jsxs("div",{className:"codeblock relative w-full bg-zinc-950 font-sans",children:[f.jsxs("div",{className:"flex w-full items-center justify-between bg-zinc-800 px-6 py-2 pr-4 text-zinc-100",children:[f.jsx("span",{className:"text-xs lowercase",children:e}),f.jsxs("div",{className:"flex items-center space-x-1",children:[f.jsxs(ue,{variant:"ghost",size:"icon",onClick:n,children:[f.jsx(Cq,{}),f.jsx("span",{className:"sr-only",children:"Download"})]}),f.jsxs(ue,{variant:"ghost",size:"icon",className:"text-xs hover:bg-zinc-800 focus-visible:ring-1 focus-visible:ring-slate-700 focus-visible:ring-offset-0",onClick:r,children:[f.jsx(Pm,{}),f.jsx("span",{className:"sr-only",children:"Copy code"})]})]})]}),f.jsx(Iwe,{language:e,style:fz.coldarkDark,PreTag:"div",showLineNumbers:!0,customStyle:{margin:0,width:"100%",background:"transparent",padding:"1.5rem 1rem"},lineNumberStyle:{userSelect:"none"},codeTagProps:{style:{fontSize:"0.9rem",fontFamily:"var(--font-mono)"}},children:t})]})});gz.displayName="CodeBlock";function C0e(e,t){const n=t||{};return(e[e.length-1]===""?[...e,""]:e).join((n.padRight?" ":"")+","+(n.padLeft===!1?"":" ")).trim()}const _0e=/^[$_\p{ID_Start}][$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,A0e=/^[$_\p{ID_Start}][-$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,T0e={};function r3(e,t){return((t||T0e).jsx?A0e:_0e).test(e)}const R0e=/[ \t\n\f\r]/g;function N0e(e){return typeof e=="object"?e.type==="text"?a3(e.value):!1:a3(e)}function a3(e){return e.replace(R0e,"")===""}class Cf{constructor(t,n,r){this.property=t,this.normal=n,r&&(this.space=r)}}Cf.prototype.property={};Cf.prototype.normal={};Cf.prototype.space=null;function mz(e,t){const n={},r={};let a=-1;for(;++a4&&n.slice(0,4)==="data"&&M0e.test(t)){if(t.charAt(4)==="-"){const o=t.slice(5).replace(i3,j0e);r="data"+o.charAt(0).toUpperCase()+o.slice(1)}else{const o=t.slice(4);if(!i3.test(o)){let i=o.replace(P0e,F0e);i.charAt(0)!=="-"&&(i="-"+i),t="data"+i}}a=PA}return new a(r,t)}function F0e(e){return"-"+e.toLowerCase()}function j0e(e){return e.charAt(1).toUpperCase()}const z0e={classId:"classID",dataType:"datatype",itemId:"itemID",strokeDashArray:"strokeDasharray",strokeDashOffset:"strokeDashoffset",strokeLineCap:"strokeLinecap",strokeLineJoin:"strokeLinejoin",strokeMiterLimit:"strokeMiterlimit",typeOf:"typeof",xLinkActuate:"xlinkActuate",xLinkArcRole:"xlinkArcrole",xLinkHref:"xlinkHref",xLinkRole:"xlinkRole",xLinkShow:"xlinkShow",xLinkTitle:"xlinkTitle",xLinkType:"xlinkType",xmlnsXLink:"xmlnsXlink"},U0e=mz([yz,bz,wz,Ez,D0e],"html"),$A=mz([yz,bz,wz,Ez,L0e],"svg");function B0e(e){return e.join(" ").trim()}var xz={},s3=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,H0e=/\n/g,V0e=/^\s*/,q0e=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,G0e=/^:\s*/,W0e=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,K0e=/^[;\s]*/,Y0e=/^\s+|\s+$/g,Z0e=` -`,l3="/",c3="*",Qi="",X0e="comment",Q0e="declaration",J0e=function(e,t){if(typeof e!="string")throw new TypeError("First argument must be a string");if(!e)return[];t=t||{};var n=1,r=1;function a(b){var y=b.match(H0e);y&&(n+=y.length);var w=b.lastIndexOf(Z0e);r=~w?b.length-w:r+b.length}function o(){var b={line:n,column:r};return function(y){return y.position=new i(b),c(),y}}function i(b){this.start=b,this.end={line:n,column:r},this.source=t.source}i.prototype.content=e;function s(b){var y=new Error(t.source+":"+n+":"+r+": "+b);if(y.reason=b,y.filename=t.source,y.line=n,y.column=r,y.source=e,!t.silent)throw y}function l(b){var y=b.exec(e);if(y){var w=y[0];return a(w),e=e.slice(w.length),y}}function c(){l(V0e)}function u(b){var y;for(b=b||[];y=d();)y!==!1&&b.push(y);return b}function d(){var b=o();if(!(l3!=e.charAt(0)||c3!=e.charAt(1))){for(var y=2;Qi!=e.charAt(y)&&(c3!=e.charAt(y)||l3!=e.charAt(y+1));)++y;if(y+=2,Qi===e.charAt(y-1))return s("End of comment missing");var w=e.slice(2,y-2);return r+=2,a(w),e=e.slice(y),r+=2,b({type:X0e,comment:w})}}function g(){var b=o(),y=l(q0e);if(y){if(d(),!l(G0e))return s("property missing ':'");var w=l(W0e),v=b({type:Q0e,property:u3(y[0].replace(s3,Qi)),value:w?u3(w[0].replace(s3,Qi)):Qi});return l(K0e),v}}function m(){var b=[];u(b);for(var y;y=g();)y!==!1&&(b.push(y),u(b));return b}return c(),m()};function u3(e){return e?e.replace(Y0e,Qi):Qi}var eEe=nn&&nn.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(xz,"__esModule",{value:!0});var tEe=eEe(J0e);function nEe(e,t){var n=null;if(!e||typeof e!="string")return n;var r=(0,tEe.default)(e),a=typeof t=="function";return r.forEach(function(o){if(o.type==="declaration"){var i=o.property,s=o.value;a?t(i,s,o):s&&(n=n||{},n[i]=s)}}),n}var d3=xz.default=nEe;const rEe=d3.default||d3,kz=Cz("end"),FA=Cz("start");function Cz(e){return t;function t(n){const r=n&&n.position&&n.position[e]||{};if(typeof r.line=="number"&&r.line>0&&typeof r.column=="number"&&r.column>0)return{line:r.line,column:r.column,offset:typeof r.offset=="number"&&r.offset>-1?r.offset:void 0}}}function aEe(e){const t=FA(e),n=kz(e);if(t&&n)return{start:t,end:n}}function Yu(e){return!e||typeof e!="object"?"":"position"in e||"type"in e?f3(e.position):"start"in e||"end"in e?f3(e):"line"in e||"column"in e?jk(e):""}function jk(e){return p3(e&&e.line)+":"+p3(e&&e.column)}function f3(e){return jk(e&&e.start)+"-"+jk(e&&e.end)}function p3(e){return e&&typeof e=="number"?e:1}class Bn extends Error{constructor(t,n,r){super(),typeof n=="string"&&(r=n,n=void 0);let a="",o={},i=!1;if(n&&("line"in n&&"column"in n?o={place:n}:"start"in n&&"end"in n?o={place:n}:"type"in n?o={ancestors:[n],place:n.position}:o={...n}),typeof t=="string"?a=t:!o.cause&&t&&(i=!0,a=t.message,o.cause=t),!o.ruleId&&!o.source&&typeof r=="string"){const l=r.indexOf(":");l===-1?o.ruleId=r:(o.source=r.slice(0,l),o.ruleId=r.slice(l+1))}if(!o.place&&o.ancestors&&o.ancestors){const l=o.ancestors[o.ancestors.length-1];l&&(o.place=l.position)}const s=o.place&&"start"in o.place?o.place.start:o.place;this.ancestors=o.ancestors||void 0,this.cause=o.cause||void 0,this.column=s?s.column:void 0,this.fatal=void 0,this.file,this.message=a,this.line=s?s.line:void 0,this.name=Yu(o.place)||"1:1",this.place=o.place||void 0,this.reason=this.message,this.ruleId=o.ruleId||void 0,this.source=o.source||void 0,this.stack=i&&o.cause&&typeof o.cause.stack=="string"?o.cause.stack:"",this.actual,this.expected,this.note,this.url}}Bn.prototype.file="";Bn.prototype.name="";Bn.prototype.reason="";Bn.prototype.message="";Bn.prototype.stack="";Bn.prototype.column=void 0;Bn.prototype.line=void 0;Bn.prototype.ancestors=void 0;Bn.prototype.cause=void 0;Bn.prototype.fatal=void 0;Bn.prototype.place=void 0;Bn.prototype.ruleId=void 0;Bn.prototype.source=void 0;const jA={}.hasOwnProperty,oEe=new Map,iEe=/[A-Z]/g,sEe=/-([a-z])/g,lEe=new Set(["table","tbody","thead","tfoot","tr"]),cEe=new Set(["td","th"]),_z="https://github.com/syntax-tree/hast-util-to-jsx-runtime";function uEe(e,t){if(!t||t.Fragment===void 0)throw new TypeError("Expected `Fragment` in options");const n=t.filePath||void 0;let r;if(t.development){if(typeof t.jsxDEV!="function")throw new TypeError("Expected `jsxDEV` in options when `development: true`");r=yEe(n,t.jsxDEV)}else{if(typeof t.jsx!="function")throw new TypeError("Expected `jsx` in production options");if(typeof t.jsxs!="function")throw new TypeError("Expected `jsxs` in production options");r=bEe(n,t.jsx,t.jsxs)}const a={Fragment:t.Fragment,ancestors:[],components:t.components||{},create:r,elementAttributeNameCase:t.elementAttributeNameCase||"react",evaluater:t.createEvaluater?t.createEvaluater():void 0,filePath:n,ignoreInvalidStyle:t.ignoreInvalidStyle||!1,passKeys:t.passKeys!==!1,passNode:t.passNode||!1,schema:t.space==="svg"?$A:U0e,stylePropertyNameCase:t.stylePropertyNameCase||"dom",tableCellAlignToStyle:t.tableCellAlignToStyle!==!1},o=Az(a,e,void 0);return o&&typeof o!="string"?o:a.create(e,a.Fragment,{children:o||void 0},void 0)}function Az(e,t,n){if(t.type==="element")return dEe(e,t,n);if(t.type==="mdxFlowExpression"||t.type==="mdxTextExpression")return fEe(e,t);if(t.type==="mdxJsxFlowElement"||t.type==="mdxJsxTextElement")return gEe(e,t,n);if(t.type==="mdxjsEsm")return pEe(e,t);if(t.type==="root")return mEe(e,t,n);if(t.type==="text")return hEe(e,t)}function dEe(e,t,n){const r=e.schema;let a=r;t.tagName.toLowerCase()==="svg"&&r.space==="html"&&(a=$A,e.schema=a),e.ancestors.push(t);const o=Rz(e,t.tagName,!1),i=vEe(e,t);let s=UA(e,t);return lEe.has(t.tagName)&&(s=s.filter(function(l){return typeof l=="string"?!N0e(l):!0})),Tz(e,i,o,t),zA(i,s),e.ancestors.pop(),e.schema=r,e.create(t,o,i,n)}function fEe(e,t){if(t.data&&t.data.estree&&e.evaluater){const r=t.data.estree.body[0];return r.type,e.evaluater.evaluateExpression(r.expression)}Rd(e,t.position)}function pEe(e,t){if(t.data&&t.data.estree&&e.evaluater)return e.evaluater.evaluateProgram(t.data.estree);Rd(e,t.position)}function gEe(e,t,n){const r=e.schema;let a=r;t.name==="svg"&&r.space==="html"&&(a=$A,e.schema=a),e.ancestors.push(t);const o=t.name===null?e.Fragment:Rz(e,t.name,!0),i=SEe(e,t),s=UA(e,t);return Tz(e,i,o,t),zA(i,s),e.ancestors.pop(),e.schema=r,e.create(t,o,i,n)}function mEe(e,t,n){const r={};return zA(r,UA(e,t)),e.create(t,e.Fragment,r,n)}function hEe(e,t){return t.value}function Tz(e,t,n,r){typeof n!="string"&&n!==e.Fragment&&e.passNode&&(t.node=r)}function zA(e,t){if(t.length>0){const n=t.length>1?t:t[0];n&&(e.children=n)}}function bEe(e,t,n){return r;function r(a,o,i,s){const c=Array.isArray(i.children)?n:t;return s?c(o,i,s):c(o,i)}}function yEe(e,t){return n;function n(r,a,o,i){const s=Array.isArray(o.children),l=FA(r);return t(a,o,i,s,{columnNumber:l?l.column-1:void 0,fileName:e,lineNumber:l?l.line:void 0},void 0)}}function vEe(e,t){const n={};let r,a;for(a in t.properties)if(a!=="children"&&jA.call(t.properties,a)){const o=wEe(e,a,t.properties[a]);if(o){const[i,s]=o;e.tableCellAlignToStyle&&i==="align"&&typeof s=="string"&&cEe.has(t.tagName)?r=s:n[i]=s}}if(r){const o=n.style||(n.style={});o[e.stylePropertyNameCase==="css"?"text-align":"textAlign"]=r}return n}function SEe(e,t){const n={};for(const r of t.attributes)if(r.type==="mdxJsxExpressionAttribute")if(r.data&&r.data.estree&&e.evaluater){const o=r.data.estree.body[0];o.type;const i=o.expression;i.type;const s=i.properties[0];s.type,Object.assign(n,e.evaluater.evaluateExpression(s.argument))}else Rd(e,t.position);else{const a=r.name;let o;if(r.value&&typeof r.value=="object")if(r.value.data&&r.value.data.estree&&e.evaluater){const s=r.value.data.estree.body[0];s.type,o=e.evaluater.evaluateExpression(s.expression)}else Rd(e,t.position);else o=r.value===null?!0:r.value;n[a]=o}return n}function UA(e,t){const n=[];let r=-1;const a=e.passKeys?new Map:oEe;for(;++ri))return;const C=t.events.length;let _=C,R,T;for(;_--;)if(t.events[_][0]==="exit"&&t.events[_][1].type==="chunkFlow"){if(R){T=t.events[_][1].end;break}R=!0}for(v(r),x=C;xS;){const k=n[E];t.containerState=k[1],k[0].exit.call(t,e)}n.length=S}function h(){a.write([null]),o=void 0,a=void 0,t.containerState._closeFlow=void 0}}function IEe(e,t,n){return ct(e,e.attempt(this.parser.constructs.document,t,n),"linePrefix",this.parser.constructs.disable.null.includes("codeIndented")?void 0:4)}const OEe={tokenize:DEe};function DEe(e){const t=this,n=e.attempt(Ef,r,e.attempt(this.parser.constructs.flowInitial,a,ct(e,e.attempt(this.parser.constructs.flow,a,e.attempt(Hue,a)),"linePrefix")));return n;function r(o){if(o===null){e.consume(o);return}return e.enter("lineEndingBlank"),e.consume(o),e.exit("lineEndingBlank"),t.currentConstruct=void 0,n}function a(o){if(o===null){e.consume(o);return}return e.enter("lineEnding"),e.consume(o),e.exit("lineEnding"),t.currentConstruct=void 0,n}}const LEe={resolveAll:Iz()},MEe=Nz("string"),PEe=Nz("text");function Nz(e){return{tokenize:t,resolveAll:Iz(e==="text"?$Ee:void 0)};function t(n){const r=this,a=this.parser.constructs[e],o=n.attempt(a,i,s);return i;function i(u){return c(u)?o(u):s(u)}function s(u){if(u===null){n.consume(u);return}return n.enter("data"),n.consume(u),l}function l(u){return c(u)?(n.exit("data"),o(u)):(n.consume(u),l)}function c(u){if(u===null)return!0;const d=a[u];let g=-1;if(d)for(;++g-1){const s=i[0];typeof s=="string"?i[0]=s.slice(r):i.shift()}o>0&&i.push(e[a].slice(0,o))}return i}function zEe(e,t){let n=-1;const r=[];let a;for(;++n0){const Tn=De.tokenStack[De.tokenStack.length-1];(Tn[1]||h3).call(De,void 0,Tn[0])}for(le.position={start:Fo(Z.length>0?Z[0][1].start:{line:1,column:1,offset:0}),end:Fo(Z.length>0?Z[Z.length-2][1].end:{line:1,column:1,offset:0})},ft=-1;++ft1?"-"+s:""),dataFootnoteRef:!0,ariaDescribedBy:["footnote-label"]},children:[{type:"text",value:String(i)}]};e.patch(t,l);const c={type:"element",tagName:"sup",properties:{},children:[l]};return e.patch(t,c),e.applyData(t,c)}function uxe(e,t){const n={type:"element",tagName:"h"+t.depth,properties:{},children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}function dxe(e,t){if(e.options.allowDangerousHtml){const n={type:"raw",value:t.value};return e.patch(t,n),e.applyData(t,n)}}function Lz(e,t){const n=t.referenceType;let r="]";if(n==="collapsed"?r+="[]":n==="full"&&(r+="["+(t.label||t.identifier)+"]"),t.type==="imageReference")return[{type:"text",value:"!["+t.alt+r}];const a=e.all(t),o=a[0];o&&o.type==="text"?o.value="["+o.value:a.unshift({type:"text",value:"["});const i=a[a.length-1];return i&&i.type==="text"?i.value+=r:a.push({type:"text",value:r}),a}function fxe(e,t){const n=String(t.identifier).toUpperCase(),r=e.definitionById.get(n);if(!r)return Lz(e,t);const a={src:Hc(r.url||""),alt:t.alt};r.title!==null&&r.title!==void 0&&(a.title=r.title);const o={type:"element",tagName:"img",properties:a,children:[]};return e.patch(t,o),e.applyData(t,o)}function pxe(e,t){const n={src:Hc(t.url)};t.alt!==null&&t.alt!==void 0&&(n.alt=t.alt),t.title!==null&&t.title!==void 0&&(n.title=t.title);const r={type:"element",tagName:"img",properties:n,children:[]};return e.patch(t,r),e.applyData(t,r)}function gxe(e,t){const n={type:"text",value:t.value.replace(/\r?\n|\r/g," ")};e.patch(t,n);const r={type:"element",tagName:"code",properties:{},children:[n]};return e.patch(t,r),e.applyData(t,r)}function mxe(e,t){const n=String(t.identifier).toUpperCase(),r=e.definitionById.get(n);if(!r)return Lz(e,t);const a={href:Hc(r.url||"")};r.title!==null&&r.title!==void 0&&(a.title=r.title);const o={type:"element",tagName:"a",properties:a,children:e.all(t)};return e.patch(t,o),e.applyData(t,o)}function hxe(e,t){const n={href:Hc(t.url)};t.title!==null&&t.title!==void 0&&(n.title=t.title);const r={type:"element",tagName:"a",properties:n,children:e.all(t)};return e.patch(t,r),e.applyData(t,r)}function bxe(e,t,n){const r=e.all(t),a=n?yxe(n):Mz(t),o={},i=[];if(typeof t.checked=="boolean"){const u=r[0];let d;u&&u.type==="element"&&u.tagName==="p"?d=u:(d={type:"element",tagName:"p",properties:{},children:[]},r.unshift(d)),d.children.length>0&&d.children.unshift({type:"text",value:" "}),d.children.unshift({type:"element",tagName:"input",properties:{type:"checkbox",checked:t.checked,disabled:!0},children:[]}),o.className=["task-list-item"]}let s=-1;for(;++s1}function vxe(e,t){const n={},r=e.all(t);let a=-1;for(typeof t.start=="number"&&t.start!==1&&(n.start=t.start);++a0){const i={type:"element",tagName:"tbody",properties:{},children:e.wrap(n,!0)},s=FA(t.children[1]),l=kz(t.children[t.children.length-1]);s&&l&&(i.position={start:s,end:l}),a.push(i)}const o={type:"element",tagName:"table",properties:{},children:e.wrap(a,!0)};return e.patch(t,o),e.applyData(t,o)}function kxe(e,t,n){const r=n?n.children:void 0,o=(r?r.indexOf(t):1)===0?"th":"td",i=n&&n.type==="table"?n.align:void 0,s=i?i.length:t.children.length;let l=-1;const c=[];for(;++l0,!0),r[0]),a=r.index+r[0].length,r=n.exec(t);return o.push(v3(t.slice(a),a>0,!1)),o.join("")}function v3(e,t,n){let r=0,a=e.length;if(t){let o=e.codePointAt(r);for(;o===b3||o===y3;)r++,o=e.codePointAt(r)}if(n){let o=e.codePointAt(a-1);for(;o===b3||o===y3;)a--,o=e.codePointAt(a-1)}return a>r?e.slice(r,a):""}function Axe(e,t){const n={type:"text",value:_xe(String(t.value))};return e.patch(t,n),e.applyData(t,n)}function Txe(e,t){const n={type:"element",tagName:"hr",properties:{},children:[]};return e.patch(t,n),e.applyData(t,n)}const Rxe={blockquote:axe,break:oxe,code:ixe,delete:sxe,emphasis:lxe,footnoteReference:cxe,heading:uxe,html:dxe,imageReference:fxe,image:pxe,inlineCode:gxe,linkReference:mxe,link:hxe,listItem:bxe,list:vxe,paragraph:Sxe,root:wxe,strong:Exe,table:xxe,tableCell:Cxe,tableRow:kxe,text:Axe,thematicBreak:Txe,toml:mp,yaml:mp,definition:mp,footnoteDefinition:mp};function mp(){}const Pz=-1,Ih=0,am=1,om=2,BA=3,HA=4,VA=5,qA=6,$z=7,Fz=8,S3=typeof self=="object"?self:globalThis,Nxe=(e,t)=>{const n=(a,o)=>(e.set(o,a),a),r=a=>{if(e.has(a))return e.get(a);const[o,i]=t[a];switch(o){case Ih:case Pz:return n(i,a);case am:{const s=n([],a);for(const l of i)s.push(r(l));return s}case om:{const s=n({},a);for(const[l,c]of i)s[r(l)]=r(c);return s}case BA:return n(new Date(i),a);case HA:{const{source:s,flags:l}=i;return n(new RegExp(s,l),a)}case VA:{const s=n(new Map,a);for(const[l,c]of i)s.set(r(l),r(c));return s}case qA:{const s=n(new Set,a);for(const l of i)s.add(r(l));return s}case $z:{const{name:s,message:l}=i;return n(new S3[s](l),a)}case Fz:return n(BigInt(i),a);case"BigInt":return n(Object(BigInt(i)),a)}return n(new S3[o](i),a)};return r},w3=e=>Nxe(new Map,e)(0),il="",{toString:Ixe}={},{keys:Oxe}=Object,bu=e=>{const t=typeof e;if(t!=="object"||!e)return[Ih,t];const n=Ixe.call(e).slice(8,-1);switch(n){case"Array":return[am,il];case"Object":return[om,il];case"Date":return[BA,il];case"RegExp":return[HA,il];case"Map":return[VA,il];case"Set":return[qA,il]}return n.includes("Array")?[am,n]:n.includes("Error")?[$z,n]:[om,n]},hp=([e,t])=>e===Ih&&(t==="function"||t==="symbol"),Dxe=(e,t,n,r)=>{const a=(i,s)=>{const l=r.push(i)-1;return n.set(s,l),l},o=i=>{if(n.has(i))return n.get(i);let[s,l]=bu(i);switch(s){case Ih:{let u=i;switch(l){case"bigint":s=Fz,u=i.toString();break;case"function":case"symbol":if(e)throw new TypeError("unable to serialize "+l);u=null;break;case"undefined":return a([Pz],i)}return a([s,u],i)}case am:{if(l)return a([l,[...i]],i);const u=[],d=a([s,u],i);for(const g of i)u.push(o(g));return d}case om:{if(l)switch(l){case"BigInt":return a([l,i.toString()],i);case"Boolean":case"Number":case"String":return a([l,i.valueOf()],i)}if(t&&"toJSON"in i)return o(i.toJSON());const u=[],d=a([s,u],i);for(const g of Oxe(i))(e||!hp(bu(i[g])))&&u.push([o(g),o(i[g])]);return d}case BA:return a([s,i.toISOString()],i);case HA:{const{source:u,flags:d}=i;return a([s,{source:u,flags:d}],i)}case VA:{const u=[],d=a([s,u],i);for(const[g,m]of i)(e||!(hp(bu(g))||hp(bu(m))))&&u.push([o(g),o(m)]);return d}case qA:{const u=[],d=a([s,u],i);for(const g of i)(e||!hp(bu(g)))&&u.push(o(g));return d}}const{message:c}=i;return a([s,{name:l,message:c}],i)};return o},E3=(e,{json:t,lossy:n}={})=>{const r=[];return Dxe(!(t||n),!!t,new Map,r)(e),r},im=typeof structuredClone=="function"?(e,t)=>t&&("json"in t||"lossy"in t)?w3(E3(e,t)):structuredClone(e):(e,t)=>w3(E3(e,t));function Lxe(e,t){const n=[{type:"text",value:"↩"}];return t>1&&n.push({type:"element",tagName:"sup",properties:{},children:[{type:"text",value:String(t)}]}),n}function Mxe(e,t){return"Back to reference "+(e+1)+(t>1?"-"+t:"")}function Pxe(e){const t=typeof e.options.clobberPrefix=="string"?e.options.clobberPrefix:"user-content-",n=e.options.footnoteBackContent||Lxe,r=e.options.footnoteBackLabel||Mxe,a=e.options.footnoteLabel||"Footnotes",o=e.options.footnoteLabelTagName||"h2",i=e.options.footnoteLabelProperties||{className:["sr-only"]},s=[];let l=-1;for(;++l0&&b.push({type:"text",value:" "});let h=typeof n=="string"?n:n(l,m);typeof h=="string"&&(h={type:"text",value:h}),b.push({type:"element",tagName:"a",properties:{href:"#"+t+"fnref-"+g+(m>1?"-"+m:""),dataFootnoteBackref:"",ariaLabel:typeof r=="string"?r:r(l,m),className:["data-footnote-backref"]},children:Array.isArray(h)?h:[h]})}const w=u[u.length-1];if(w&&w.type==="element"&&w.tagName==="p"){const h=w.children[w.children.length-1];h&&h.type==="text"?h.value+=" ":w.children.push({type:"text",value:" "}),w.children.push(...b)}else u.push(...b);const v={type:"element",tagName:"li",properties:{id:t+"fn-"+g},children:e.wrap(u,!0)};e.patch(c,v),s.push(v)}if(s.length!==0)return{type:"element",tagName:"section",properties:{dataFootnotes:!0,className:["footnotes"]},children:[{type:"element",tagName:o,properties:{...im(i),id:"footnote-label"},children:[{type:"text",value:a}]},{type:"text",value:` -`},{type:"element",tagName:"ol",properties:{},children:e.wrap(s,!0)},{type:"text",value:` -`}]}}const zk={}.hasOwnProperty,$xe={};function Fxe(e,t){const n=t||$xe,r=new Map,a=new Map,o=new Map,i={...Rxe,...n.handlers},s={all:c,applyData:zxe,definitionById:r,footnoteById:a,footnoteCounts:o,footnoteOrder:[],handlers:i,one:l,options:n,patch:jxe,wrap:Bxe};return sA(e,function(u){if(u.type==="definition"||u.type==="footnoteDefinition"){const d=u.type==="definition"?r:a,g=String(u.identifier).toUpperCase();d.has(g)||d.set(g,u)}}),s;function l(u,d){const g=u.type,m=s.handlers[g];if(zk.call(s.handlers,g)&&m)return m(s,u,d);if(s.options.passThrough&&s.options.passThrough.includes(g)){if("children"in u){const{children:y,...w}=u,v=im(w);return v.children=s.all(u),v}return im(u)}return(s.options.unknownHandler||Uxe)(s,u,d)}function c(u){const d=[];if("children"in u){const g=u.children;let m=-1;for(;++m0&&n.push({type:"text",value:` -`}),n}function x3(e){let t=0,n=e.charCodeAt(t);for(;n===9||n===32;)t++,n=e.charCodeAt(t);return e.slice(t)}function k3(e,t){const n=Fxe(e,t),r=n.one(e,void 0),a=Pxe(n),o=Array.isArray(r)?{type:"root",children:r}:r||{type:"root",children:[]};return a&&o.children.push({type:"text",value:` -`},a),o}function Hxe(e,t){return e&&"run"in e?async function(n,r){const a=k3(n,{file:r,...t});await e.run(a,r)}:function(n,r){return k3(n,{file:r,...t||e})}}function C3(e){if(e)throw e}var Xp=Object.prototype.hasOwnProperty,jz=Object.prototype.toString,_3=Object.defineProperty,A3=Object.getOwnPropertyDescriptor,T3=function(t){return typeof Array.isArray=="function"?Array.isArray(t):jz.call(t)==="[object Array]"},R3=function(t){if(!t||jz.call(t)!=="[object Object]")return!1;var n=Xp.call(t,"constructor"),r=t.constructor&&t.constructor.prototype&&Xp.call(t.constructor.prototype,"isPrototypeOf");if(t.constructor&&!n&&!r)return!1;var a;for(a in t);return typeof a>"u"||Xp.call(t,a)},N3=function(t,n){_3&&n.name==="__proto__"?_3(t,n.name,{enumerable:!0,configurable:!0,value:n.newValue,writable:!0}):t[n.name]=n.newValue},I3=function(t,n){if(n==="__proto__")if(Xp.call(t,n)){if(A3)return A3(t,n).value}else return;return t[n]},Vxe=function e(){var t,n,r,a,o,i,s=arguments[0],l=1,c=arguments.length,u=!1;for(typeof s=="boolean"&&(u=s,s=arguments[1]||{},l=2),(s==null||typeof s!="object"&&typeof s!="function")&&(s={});li.length;let l;s&&i.push(a);try{l=e.apply(this,i)}catch(c){const u=c;if(s&&n)throw u;return a(u)}s||(l&&l.then&&typeof l.then=="function"?l.then(o,a):l instanceof Error?a(l):o(l))}function a(i,...s){n||(n=!0,t(i,...s))}function o(i){a(null,i)}}const ka={basename:Wxe,dirname:Kxe,extname:Yxe,join:Zxe,sep:"/"};function Wxe(e,t){if(t!==void 0&&typeof t!="string")throw new TypeError('"ext" argument must be a string');_f(e);let n=0,r=-1,a=e.length,o;if(t===void 0||t.length===0||t.length>e.length){for(;a--;)if(e.codePointAt(a)===47){if(o){n=a+1;break}}else r<0&&(o=!0,r=a+1);return r<0?"":e.slice(n,r)}if(t===e)return"";let i=-1,s=t.length-1;for(;a--;)if(e.codePointAt(a)===47){if(o){n=a+1;break}}else i<0&&(o=!0,i=a+1),s>-1&&(e.codePointAt(a)===t.codePointAt(s--)?s<0&&(r=a):(s=-1,r=i));return n===r?r=i:r<0&&(r=e.length),e.slice(n,r)}function Kxe(e){if(_f(e),e.length===0)return".";let t=-1,n=e.length,r;for(;--n;)if(e.codePointAt(n)===47){if(r){t=n;break}}else r||(r=!0);return t<0?e.codePointAt(0)===47?"/":".":t===1&&e.codePointAt(0)===47?"//":e.slice(0,t)}function Yxe(e){_f(e);let t=e.length,n=-1,r=0,a=-1,o=0,i;for(;t--;){const s=e.codePointAt(t);if(s===47){if(i){r=t+1;break}continue}n<0&&(i=!0,n=t+1),s===46?a<0?a=t:o!==1&&(o=1):a>-1&&(o=-1)}return a<0||n<0||o===0||o===1&&a===n-1&&a===r+1?"":e.slice(a,n)}function Zxe(...e){let t=-1,n;for(;++t0&&e.codePointAt(e.length-1)===47&&(n+="/"),t?"/"+n:n}function Qxe(e,t){let n="",r=0,a=-1,o=0,i=-1,s,l;for(;++i<=e.length;){if(i2){if(l=n.lastIndexOf("/"),l!==n.length-1){l<0?(n="",r=0):(n=n.slice(0,l),r=n.length-1-n.lastIndexOf("/")),a=i,o=0;continue}}else if(n.length>0){n="",r=0,a=i,o=0;continue}}t&&(n=n.length>0?n+"/..":"..",r=2)}else n.length>0?n+="/"+e.slice(a+1,i):n=e.slice(a+1,i),r=i-a-1;a=i,o=0}else s===46&&o>-1?o++:o=-1}return n}function _f(e){if(typeof e!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}const Jxe={cwd:e1e};function e1e(){return"/"}function Bk(e){return!!(e!==null&&typeof e=="object"&&"href"in e&&e.href&&"protocol"in e&&e.protocol&&e.auth===void 0)}function t1e(e){if(typeof e=="string")e=new URL(e);else if(!Bk(e)){const t=new TypeError('The "path" argument must be of type string or an instance of URL. Received `'+e+"`");throw t.code="ERR_INVALID_ARG_TYPE",t}if(e.protocol!=="file:"){const t=new TypeError("The URL must be of scheme file");throw t.code="ERR_INVALID_URL_SCHEME",t}return n1e(e)}function n1e(e){if(e.hostname!==""){const r=new TypeError('File URL host must be "localhost" or empty on darwin');throw r.code="ERR_INVALID_FILE_URL_HOST",r}const t=e.pathname;let n=-1;for(;++n0){let[m,...b]=u;const y=r[g][1];Uk(y)&&Uk(m)&&(m=bx(!0,y,m)),r[g]=[c,m,...b]}}}}const i1e=new GA().freeze();function wx(e,t){if(typeof t!="function")throw new TypeError("Cannot `"+e+"` without `parser`")}function Ex(e,t){if(typeof t!="function")throw new TypeError("Cannot `"+e+"` without `compiler`")}function xx(e,t){if(t)throw new Error("Cannot call `"+e+"` on a frozen processor.\nCreate a new processor first, by calling it: use `processor()` instead of `processor`.")}function D3(e){if(!Uk(e)||typeof e.type!="string")throw new TypeError("Expected node, got `"+e+"`")}function L3(e,t,n){if(!n)throw new Error("`"+e+"` finished async. Use `"+t+"` instead")}function bp(e){return s1e(e)?e:new zz(e)}function s1e(e){return!!(e&&typeof e=="object"&&"message"in e&&"messages"in e)}function l1e(e){return typeof e=="string"||c1e(e)}function c1e(e){return!!(e&&typeof e=="object"&&"byteLength"in e&&"byteOffset"in e)}const u1e="https://github.com/remarkjs/react-markdown/blob/main/changelog.md",M3=[],P3={allowDangerousHtml:!0},d1e=/^(https?|ircs?|mailto|xmpp)$/i,f1e=[{from:"astPlugins",id:"remove-buggy-html-in-markdown-parser"},{from:"allowDangerousHtml",id:"remove-buggy-html-in-markdown-parser"},{from:"allowNode",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"allowElement"},{from:"allowedTypes",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"allowedElements"},{from:"disallowedTypes",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"disallowedElements"},{from:"escapeHtml",id:"remove-buggy-html-in-markdown-parser"},{from:"includeElementIndex",id:"#remove-includeelementindex"},{from:"includeNodeIndex",id:"change-includenodeindex-to-includeelementindex"},{from:"linkTarget",id:"remove-linktarget"},{from:"plugins",id:"change-plugins-to-remarkplugins",to:"remarkPlugins"},{from:"rawSourcePos",id:"#remove-rawsourcepos"},{from:"renderers",id:"change-renderers-to-components",to:"components"},{from:"source",id:"change-source-to-children",to:"children"},{from:"sourcePos",id:"#remove-sourcepos"},{from:"transformImageUri",id:"#add-urltransform",to:"urlTransform"},{from:"transformLinkUri",id:"#add-urltransform",to:"urlTransform"}];function p1e(e){const t=e.allowedElements,n=e.allowElement,r=e.children||"",a=e.className,o=e.components,i=e.disallowedElements,s=e.rehypePlugins||M3,l=e.remarkPlugins||M3,c=e.remarkRehypeOptions?{...e.remarkRehypeOptions,...P3}:P3,u=e.skipHtml,d=e.unwrapDisallowed,g=e.urlTransform||g1e,m=i1e().use(rxe).use(l).use(Hxe,c).use(s),b=new zz;typeof r=="string"&&(b.value=r);for(const h of f1e)Object.hasOwn(e,h.from)&&(""+h.from+(h.to?"use `"+h.to+"` instead":"remove it")+u1e+h.id,void 0);const y=m.parse(b);let w=m.runSync(y,b);return a&&(w={type:"element",tagName:"div",properties:{className:a},children:w.type==="root"?w.children:[w]}),sA(w,v),uEe(w,{Fragment:f.Fragment,components:o,ignoreInvalidStyle:!0,jsx:f.jsx,jsxs:f.jsxs,passKeys:!0,passNode:!0});function v(h,S,E){if(h.type==="raw"&&E&&typeof S=="number")return u?E.children.splice(S,1):E.children[S]={type:"text",value:h.value},S;if(h.type==="element"){let k;for(k in hx)if(Object.hasOwn(hx,k)&&Object.hasOwn(h.properties,k)){const x=h.properties[k],C=hx[k];(C===null||C.includes(h.tagName))&&(h.properties[k]=g(String(x||""),k,h))}}if(h.type==="element"){let k=t?!t.includes(h.tagName):i?i.includes(h.tagName):!1;if(!k&&n&&typeof S=="number"&&(k=!n(h,S,E)),k&&E&&typeof S=="number")return d&&h.children?E.children.splice(S,1,...h.children):E.children.splice(S,1),S}}}function g1e(e){const t=e.indexOf(":"),n=e.indexOf("?"),r=e.indexOf("#"),a=e.indexOf("/");return t<0||a>-1&&t>a||n>-1&&t>n||r>-1&&t>r||d1e.test(e.slice(0,t))?e:""}const m1e=p.memo(p1e,(e,t)=>e.children===t.children&&e.className===t.className),Uz=({message:e,className:t})=>f.jsx(m1e,{className:ee("prose-sm whitespace-pre-wrap break-words prose-p:m-0 prose-p:leading-relaxed prose-pre:p-0 prose-li:list-disc",t),remarkPlugins:[ofe,Rle],components:{p({children:n}){return f.jsx("p",{children:n})},code({node:n,className:r,children:a,...o}){if(!a)return null;const i=!String(a).includes(` -`),s=/language-(\w+)/.exec(r||"");return i?f.jsx("code",{className:r,...o,children:a}):f.jsx(gz,{language:s&&s[1]||"",value:String(a).replace(/\n$/,""),...o},Math.random())}},children:e}),h1e=e=>f.jsx("div",{className:ee("flex min-h-8 max-w-lg items-end justify-start pl-10",e.className),children:f.jsx(Uz,{message:e.message,className:"whitespace-pre-wrap text-sm"})}),b1e=e=>f.jsxs(Jm,{className:"w-fit max-w-lg p-2 text-xs [&>svg]:left-2.5 [&>svg]:top-2.5",variant:"destructive",children:[f.jsx(X4,{className:"h-4 w-4"}),f.jsx(z6,{children:"Something went wrong..."}),f.jsx(U6,{className:"text-xs",children:e.message})]}),y1e=({id:e,message:t})=>f.jsx("pre",{className:pie("mb-2 ml-8 w-fit max-w-xl overflow-x-scroll whitespace-pre-line rounded-lg border bg-muted p-2 text-xs font-normal text-muted-foreground"),children:t}),v1e=({message:e})=>f.jsx("p",{className:Tt("relative mb-2 ml-6 w-fit max-w-lg rounded-2xl border border-white bg-muted px-4 py-2 text-sm italic"),children:e}),S1e=({id:e,date:t})=>f.jsxs("span",{className:"!-mt-4 max-w-xl pr-6 text-right text-xs uppercase tracking-tight text-muted-foreground",children:["Message Receipt from ",t?Bs(t,"M/d/yy, h:mm a"):"Unknown"]}),w1e=()=>f.jsx("div",{className:"flex items-end justify-end",children:f.jsx("p",{className:"mb-2 w-fit max-w-lg rounded-2xl rounded-br-none border border-white bg-muted px-4 py-2 text-sm italic",children:"First login"})}),E1e=e=>f.jsx("div",{className:`${e.className} flex items-end justify-end`,children:f.jsxs("div",{className:"order-2 mx-2 flex max-w-lg flex-col items-end space-y-1 text-sm",children:[f.jsx("div",{className:"pr-1.5 text-xs text-muted-foreground",children:Bs(e.date,"MMM d yy, h:mm a")}),f.jsx(Uz,{message:e.message,className:"min-h-8 rounded-2xl rounded-br-none bg-white px-5 py-3 text-black"})]})}),x1e=({type:e,message:t,date:n,id:r},a,o=!0,i=!0,s=!0)=>{const l=e+t+n+r;if(e==="login")return f.jsx(w1e,{},l);if(e==="user")return f.jsx(E1e,{id:r,date:n,message:t??""},l);if(e==="error")return f.jsx(b1e,{date:n,message:t??""},l);if(e==="assistant")return f.jsx(h1e,{id:r,date:n,message:t??""},l);if(s&&e==="message-receipt")return f.jsx(S1e,{date:n},l);if(i&&e==="function-call")return f.jsx(y1e,{id:r,message:t},l);if(o&&e==="internal-monologue")return f.jsx(v1e,{message:t},l)};class sl extends Error{constructor(t,n){super(t+" at position "+n),this.position=n}}const yp=92,kx=47,k1e=42,$3=123,vp=125,F3=91,Sp=93,C1e=40,_1e=41,A1e=32,WA=10,Bz=9,Hz=13,T1e=8,R1e=12,sm=34,j3=43,z3=45,Vz=39,qz=48,Gz=57,Hi=44,wp=46,N1e=58,I1e=59,O1e=65,D1e=97,L1e=69,M1e=101,P1e=70,$1e=102,F1e=160,j1e=8192,z1e=8202,U1e=8239,B1e=8287,H1e=12288,V1e=8220,q1e=8221,G1e=8216,W1e=8217,K1e=96,Y1e=180;function Z1e(e){return e>=qz&&e<=Gz||e>=O1e&&e<=P1e||e>=D1e&&e<=$1e}function Vi(e){return e>=qz&&e<=Gz}function X1e(e){return e>=32&&e<=1114111}function ml(e){return Q1e.test(e)}const Q1e=/^[,:[\]/{}()\n+]$/;function J1e(e){return ml(e)&&e!=="/"}function U3(e){return eke.test(e)||e&&Qp(e.charCodeAt(0))}const eke=/^[[{\w-]$/;function tke(e){return e===WA||e===Hz||e===Bz||e===T1e||e===R1e}function Ol(e){return e===A1e||e===WA||e===Bz||e===Hz}function nke(e){return e===F1e||e>=j1e&&e<=z1e||e===U1e||e===B1e||e===H1e}function Qp(e){return Wz(e)||Hk(e)}function Wz(e){return e===sm||e===V1e||e===q1e}function B3(e){return e===sm}function Hk(e){return e===Vz||e===G1e||e===W1e||e===K1e||e===Y1e}function H3(e){return e===Vz}function yu(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1;const r=e.lastIndexOf(t);return r!==-1?e.substring(0,r)+(n?"":e.substring(r+1)):e}function Ea(e,t){let n=e.length;if(!Ol(e.charCodeAt(n-1)))return e+t;for(;Ol(e.charCodeAt(n-1));)n--;return e.substring(0,n)+t+e.substring(n)}function rke(e,t,n){return e.substring(0,t)+e.substring(t+n)}function ake(e){return/[,\n][ \t\r]*$/.test(e)}function oke(e){return/^\w+$/.test(e)}const ike={"\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r"," ":"\\t"},ske={'"':'"',"\\":"\\","/":"/",b:"\b",f:"\f",n:` -`,r:"\r",t:" "};function lke(e){let t=0,n="";o()||L();const a=c(Hi);for(a&&i(),U3(e[t])&&ake(n)?(a||(n=Ea(n,",")),y()):a&&(n=yu(n,","));e.charCodeAt(t)===vp||e.charCodeAt(t)===Sp;)t++,i();if(t>=e.length)return n;T();function o(){i();const M=m()||b()||w()||h()||S()||k();return i(),M}function i(){const M=t;let U=s();do U=l(),U&&(U=s());while(U);return t>M}function s(){let M="",U;for(;(U=Ol(e.charCodeAt(t)))||nke(e.charCodeAt(t));)U?M+=e[t]:M+=" ",t++;return M.length>0?(n+=M,!0):!1}function l(){if(e.charCodeAt(t)===kx&&e.charCodeAt(t+1)===k1e){for(;t=e.length;j||(U3(e[t])||O?n=Ea(n,":"):H()),o()||(j||O?n+="null":H())}return e.charCodeAt(t)===vp?(n+="}",t++):n=Ea(n,"}"),!0}return!1}function b(){if(e.charCodeAt(t)===F3){n+="[",t++,i(),u(Hi)&&i();let M=!0;for(;t0&&arguments[0]!==void 0?arguments[0]:!1,U=e.charCodeAt(t)===yp;if(U&&(t++,U=!0),Qp(e.charCodeAt(t))){const X=B3(e.charCodeAt(t))?B3:H3(e.charCodeAt(t))?H3:Hk(e.charCodeAt(t))?Hk:Wz,j=t,O=n.length;let A='"';for(t++;;){if(t>=e.length){const V=x(t-1);return!M&&ml(e.charAt(V))?(t=j,n=n.substring(0,O),w(!0)):(A=Ea(A,'"'),n+=A,!0)}else if(X(e.charCodeAt(t))){const V=t,P=A.length;if(A+='"',t++,n+=A,i(),M||t>=e.length||ml(e.charAt(t))||Qp(e.charCodeAt(t))||Vi(e.charCodeAt(t)))return v(),!0;if(ml(e.charAt(x(V-1))))return t=j,n=n.substring(0,O),w(!0);n=n.substring(0,O),t=V+1,A=A.substring(0,P)+"\\"+A.substring(P)}else{if(M&&ml(e[t]))return A=Ea(A,'"'),n+=A,v(),!0;if(e.charCodeAt(t)===yp){const V=e.charAt(t+1);if(ske[V]!==void 0)A+=e.slice(t,t+2),t+=2;else if(V==="u"){let N=2;for(;N<6&&Z1e(e.charCodeAt(t+N));)N++;N===6?(A+=e.slice(t,t+6),t+=6):t+N>=e.length?t=e.length:z()}else A+=V,t+=2}else{const V=e.charAt(t),P=e.charCodeAt(t);P===sm&&e.charCodeAt(t-1)!==yp?(A+="\\"+V,t++):tke(P)?(A+=ike[V],t++):(X1e(P)||R(V),A+=V,t++)}}U&&d()}}return!1}function v(){let M=!1;for(i();e.charCodeAt(t)===j3;){M=!0,t++,i(),n=yu(n,'"',!0);const U=n.length;w()?n=rke(n,U,1):n=Ea(n,'"')}return M}function h(){const M=t;if(e.charCodeAt(t)===z3){if(t++,C())return _(M),!0;if(!Vi(e.charCodeAt(t)))return t=M,!1}for(;Vi(e.charCodeAt(t));)t++;if(e.charCodeAt(t)===wp){if(t++,C())return _(M),!0;if(!Vi(e.charCodeAt(t)))return t=M,!1;for(;Vi(e.charCodeAt(t));)t++}if(e.charCodeAt(t)===M1e||e.charCodeAt(t)===L1e){if(t++,(e.charCodeAt(t)===z3||e.charCodeAt(t)===j3)&&t++,C())return _(M),!0;if(!Vi(e.charCodeAt(t)))return t=M,!1;for(;Vi(e.charCodeAt(t));)t++}if(!C())return t=M,!1;if(t>M){const U=e.slice(M,t),X=/^0\d/.test(U);return n+=X?'"'.concat(U,'"'):U,!0}return!1}function S(){return E("true","true")||E("false","false")||E("null","null")||E("True","true")||E("False","false")||E("None","null")}function E(M,U){return e.slice(t,t+M.length)===M?(n+=U,t+=M.length,!0):!1}function k(){const M=t;for(;tM){if(e.charCodeAt(t)===C1e&&oke(e.slice(M,t).trim()))return t++,o(),e.charCodeAt(t)===_1e&&(t++,e.charCodeAt(t)===I1e&&t++),!0;{for(;Ol(e.charCodeAt(t-1))&&t>0;)t--;const U=e.slice(M,t);return n+=U==="undefined"?"null":JSON.stringify(U),e.charCodeAt(t)===sm&&t++,!0}}}function x(M){let U=M;for(;U>0&&Ol(e.charCodeAt(U));)U--;return U}function C(){return t>=e.length||ml(e[t])||Ol(e.charCodeAt(t))}function _(M){n+=e.slice(M,t)+"0"}function R(M){throw new sl("Invalid character "+JSON.stringify(M),t)}function T(){throw new sl("Unexpected character "+JSON.stringify(e[t]),t)}function L(){throw new sl("Unexpected end of json string",e.length)}function D(){throw new sl("Object key expected",t)}function H(){throw new sl("Colon expected",t)}function z(){const M=e.slice(t,t+6);throw new sl('Invalid unicode character "'.concat(M,'"'),t)}}function cke(e,t){return e[t]==="*"&&e[t+1]==="/"}const uke=e=>{const t="api",n=[];if(e.role==="system")return n;if(e.role==="assistant")return n.push({id:e.id,source:t,type:"internal-monologue",message:e.text??"",date:new Date(e.created_at||"")}),(e.tool_calls??[]).forEach((o,i)=>{var s,l,c;if(o.type==="function"){const u=new Date(e.created_at||"");if(((s=o.function)==null?void 0:s.name)==="send_message"){let d={};try{d=JSON.parse(lke(o.function.arguments))}catch(g){console.error("failed to parse send message arguments",g,o.function.arguments)}n.push({id:e.id,source:t,type:"assistant",date:u,message:(d==null?void 0:d.message)??""})}else n.push({id:e.id,source:t,type:"function-call",date:u,message:`${(l=o.function)==null?void 0:l.name}(${(c=o.function)==null?void 0:c.arguments})`??""})}}),n;if(e.role==="tool")return e.name==="send_message"?(n.push({id:e.id,source:t,type:"message-receipt",message:(e==null?void 0:e.text)||"",date:new Date(e.created_at||"")}),n):(n.push({id:e.id,source:t,type:"function-call",message:(e==null?void 0:e.text)||"",date:new Date(e.created_at||"")}),n);const r=new Date(e.created_at||""),a=JSON.parse((e==null?void 0:e.text)||"");return a.type==="login"&&n.push({id:e.id,source:t,type:"login",date:r,message:a.message}),a.type==="user_message"&&n.push({id:e.id,source:t,type:"user",date:r,message:a.message}),n},Kz=p.forwardRef(({className:e,...t},n)=>f.jsx("div",{ref:n,className:ee("rounded-lg border bg-card text-card-foreground shadow-sm",e),...t}));Kz.displayName="Card";const Yz=p.forwardRef(({className:e,...t},n)=>f.jsx("div",{ref:n,className:ee("flex flex-col space-y-1.5 p-6",e),...t}));Yz.displayName="CardHeader";const Zz=p.forwardRef(({className:e,...t},n)=>f.jsx("h3",{ref:n,className:ee("text-2xl font-semibold leading-none tracking-tight",e),...t}));Zz.displayName="CardTitle";const Xz=p.forwardRef(({className:e,...t},n)=>f.jsx("p",{ref:n,className:ee("text-sm text-muted-foreground",e),...t}));Xz.displayName="CardDescription";const Qz=p.forwardRef(({className:e,...t},n)=>f.jsx("div",{ref:n,className:ee("p-6 pt-0",e),...t}));Qz.displayName="CardContent";const Jz=p.forwardRef(({className:e,...t},n)=>f.jsx("div",{ref:n,className:ee("flex items-center p-6 pt-0",e),...t}));Jz.displayName="CardFooter";const dke=()=>{const{data:e}=Qm(),[t,n]=p.useState(null),{setAgent:r}=ph();return f.jsxs(Kz,{className:"mx-4 my-10 w-fit bg-background duration-700 animate-in slide-in-from-top slide-out-to-top sm:mx-auto ",children:[f.jsxs(Yz,{className:"pb-3",children:[f.jsx(Zz,{children:"Choose Agent"}),f.jsx(Xz,{children:"Pick an agent to start a conversation..."})]}),f.jsx(Qz,{className:"grid gap-1",children:(e??[]).map((a,o)=>{var i,s,l,c;return f.jsxs("button",{onClick:()=>n(a),className:ee("-mx-2 flex items-start space-x-4 rounded-md p-2 text-left transition-all",(t==null?void 0:t.name)===a.name?"bg-accent text-accent-foreground":"hover:bg-accent hover:text-accent-foreground"),children:[f.jsx(jq,{className:"mt-px h-5 w-5"}),f.jsxs("div",{className:"space-y-1",children:[f.jsx("p",{className:"text-sm font-medium leading-none",children:a.name}),f.jsxs("p",{className:"text-sm text-muted-foreground",children:[((s=(i=a.memory)==null?void 0:i.memory)==null?void 0:s[fr].name)||""," | ",((c=(l=a.memory)==null?void 0:l.memory)==null?void 0:c[Qr].name)||""," | ",a.created_at]})]})]},o)})}),f.jsx(Jz,{children:f.jsx(ue,{onClick:()=>t&&r(t),className:"w-full",children:"Start Chat"})})]})},fke=({className:e})=>f.jsxs("div",{className:e,children:[f.jsxs("span",{className:"relative flex h-4 w-4",children:[f.jsx("span",{className:"absolute inline-flex h-full w-full animate-ping rounded-full bg-blue-400 opacity-75"}),f.jsx("span",{className:"relative inline-flex h-4 w-4 rounded-full bg-blue-600"})]}),f.jsx("span",{className:Tt("ml-4"),children:"Thinking..."})]}),pke=({currentAgent:e,isLoading:t,previousMessages:n})=>{const{messagesRef:r,scrollRef:a,visibilityRef:o}=fle(),i=E9(),s=w9(),l=Qie(),c=n.flatMap(uke),u=dle(c);return e?f.jsx("div",{ref:a,className:"relative flex-1 overflow-auto",children:f.jsxs("div",{className:"flex flex-1 flex-col gap-4 px-4 pb-10 pt-6",ref:r,children:[u.map((d,g)=>{var y;return[((y=u[g-1])==null?void 0:y.type)==="user"||g===0?f.jsx(gle,{name:e.name,date:d.date},d.id+(e.id||"")+g):null,x1e(d,g,s,i,l)]}),t?f.jsx(fke,{className:"flex items-center px-3 py-3"}):null,f.jsx("div",{className:"h-px w-full",ref:o})]})}):f.jsx(ple,{children:f.jsx(dke,{})})},gke=Xe({message:Ce().min(1,"Message cannot be empty...")}),mke=e=>{const{formRef:t,onKeyDown:n}=die(),r=bn({resolver:yn(gke),defaultValues:{message:""}});function a(o){e.onSend(o.message),r.reset()}return f.jsx(vn,{...r,children:f.jsx("form",{ref:t,onSubmit:r.handleSubmit(a),className:"mx-4 mb-8 flex-none",children:f.jsx(ut,{control:r.control,name:"message",render:({field:o})=>f.jsxs(ot,{className:"w-full",children:[f.jsx(yt,{className:"sr-only",children:"What's on your mind"}),f.jsx(pt,{className:"w-full",children:f.jsxs("div",{className:"relative overflow-hidden rounded-md border bg-background p-0.5 has-[:focus]:ring-2 has-[:focus]:ring-ring has-[:focus]:ring-offset-2 ",children:[f.jsx(qs,{onKeyDown:n,className:"h-20 w-full resize-none scroll-pb-10 rounded-none border-none pb-10 pt-4 focus-visible:ring-0",placeholder:"Type your message",...o}),f.jsxs("div",{className:"flex items-center justify-between p-4",children:[f.jsx("div",{}),f.jsxs(ue,{disabled:!e.enabled,type:"submit",children:[f.jsx(Pq,{className:"mr-2 size-5"})," Send"]})]})]})}),f.jsx(lt,{})]})})})})},hke=(e,t,n)=>p.useCallback((r,a="user")=>{var s,l;if(!((l=(s=e==null?void 0:e.memory)==null?void 0:s.memory)!=null&&l[fr]))return;const o=new Date;o.setMilliseconds(0);const i=t({agentId:e.id||"",message:r,role:a,memoryName:e.memory.memory[fr].label||""});n(e.id||"",{id:i,type:a==="user"?"user_message":"system_message",message_type:"user_message",message:r,date:o})},[e,t,n]);function bke(e,t,n,r,a,o,i,s){p.useEffect(()=>(e.current||(e.current=!0,setTimeout(()=>{!t||!n||(r.length===0||(a==null?void 0:a.agentId)!==n.id)&&(o({date:new Date,agentId:n.id||""}),i(s,"system"))},300)),()=>{e.current=!0}),[n,a==null?void 0:a.agentId,r.length,i,o,t])}const yke=["internal_monologue","function_call","function_return"],vke=()=>{const[e,t]=p.useState([]),n=To(),[r,a]=p.useState(!1),o=p.useCallback(async i=>{var g,m;const s=new AbortController,l=s.signal;t(b=>{var y,w;return[...b,{id:Wu(),name:(w=(y=n==null?void 0:n.memory)==null?void 0:y.memory)==null?void 0:w[fr].label,role:"user",text:JSON.stringify({type:"user_message",message:i,time:new Date().toISOString()}),created_at:new Date().toISOString()}]});const c={messages:[{role:"user",name:(m=(g=n==null?void 0:n.memory)==null?void 0:g.memory)==null?void 0:m[fr].label,text:i}],stream_steps:!0,stream_tokens:!0};a(!0);let u="",d=!1;v9(`${S9}/agents/${(n==null?void 0:n.id)||""}/messages`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"text/event-stream",Authorization:"Bearer password"},body:JSON.stringify(c),signal:l,onerror:()=>{s.abort(),a(!1)},onmessage:async b=>{if(["[DONE]","[DONE_GEN]","[DONE_STEP]"].includes(b.data)){a(!1);return}d||(t(h=>{var S,E;return[...h,{name:(E=(S=n==null?void 0:n.memory)==null?void 0:S.memory)==null?void 0:E[Qr].label,role:"assistant",id:Wu(),text:"",created_at:new Date().toISOString()}]}),d=!0);const y=Xe({internal_monologue:Ce()}).or(Xe({function_call:Xe({name:Ce(),arguments:Ce()})})).or(Xe({function_call:Xe({name:Ce()})})).or(Xe({function_call:Xe({arguments:Ce()})})).or(Xe({function_return:Ce(),status:Ce(),id:Ce()})).or(Xe({function_return:Ce(),date:Ce(),status:Ce(),id:Ce()})).and(Xe({date:Ce().optional().transform(h=>h?new Date(h):new Date)})).safeParse(JSON.parse(b.data));if(!y.success){console.log("error",y.error.message,b.data),s.abort();return}const w=y.data,v=Object.keys(w).find(h=>yke.includes(h));if(v&&("internal_monologue"in w&&(u&&u!=="internal_monologue"&&t(h=>{var S,E;return[...h,{name:(E=(S=n==null?void 0:n.memory)==null?void 0:S.memory)==null?void 0:E[Qr].label,role:"assistant",id:Wu(),text:"",created_at:new Date().toISOString()}]}),t(h=>[...h.slice(0,h.length-1),{...h[h.length-1],text:(h[h.length-1].text||"")+w.internal_monologue}])),"function_call"in w&&t(h=>{var k,x,C;const S=h[h.length-1];let E=(k=S==null?void 0:S.tool_calls)==null?void 0:k[((S==null?void 0:S.tool_calls)||[]).length-1];return"name"in w.function_call&&(E={id:"1",type:"function",function:{name:w.function_call.name,arguments:""}}),"arguments"in w.function_call&&(E={...E,id:"1",function:{name:((x=E==null?void 0:E.function)==null?void 0:x.name)||"",arguments:((C=E==null?void 0:E.function)==null?void 0:C.arguments)+w.function_call.arguments}}),E?[...h.slice(0,h.length-1),{...S,tool_calls:[...(S.tool_calls||[]).slice(0,(S.tool_calls||[]).length-1),E]}]:h}),u=v,"function_return"in w)){if(w.function_return==="None")return;t(h=>{const S=h[h.length-1];return[...h.slice(0,h.length-1),{...S,tool_calls:[...S.tool_calls||[],{id:"1",type:"function",function:{name:"",arguments:JSON.stringify(w,null,2)}}]}]})}}})},[n]);return{isLoading:r,streamedMessages:e,getMessageResponse:o}},Ske=()=>{const e=To(),t=p.useRef(!1),n=Fre(),r=$ie((e==null?void 0:e.id)??""),{autoMessage:a,shouldSendAutoMessage:o}=x9(),{setLastAgentInitMessage:i}=ph(),{sendMessage:s}=AN(),{registerOnMessageCallback:l,registerOnLastMessageReplaceCallback:c,registerOnReplaceTemporaryIdsWithReturnedIdsCallback:u,abortStream:d}=AN(),{addMessage:g,replaceLastMessage:m,replaceMessageIds:b}=Fie(),y=hke(e,s,g),{streamedMessages:w,isLoading:v,getMessageResponse:h}=vke(),S=iX({agentId:(e==null?void 0:e.id)??"",msgObject:!0,limit:1e3}),E=p.useCallback(_=>_?_.endsWith("Z")?_:`${_}Z`:"",[]),k=(S.data||[]).map(_=>({..._,created_at:E(_.created_at)}),[S.data]);bke(t,o,e,r,n,i,y,a);const[x,C]=p.useState(!1);return p.useEffect(()=>{e&&d()},[d,e]),p.useEffect(()=>{l(_=>{e&&g(e.id||"",_)}),c(_=>{e&&m(e.id||"",_)}),u((_,R)=>{e&&b(e.id||"",_,R)})},[d,l,c,u,e,g,m,b]),f.jsxs(Fs,{className:"flex flex-col overflow-hidden",children:[f.jsxs("div",{className:"flex flex-none items-center space-x-2 border-b p-4",children:[f.jsx(ue,{className:"mr-2",asChild:!0,size:"iconSm",variant:"outline",children:f.jsx(bd,{to:"..",children:f.jsx(Sq,{className:"size-5"})})}),f.jsxs("div",{className:"flex w-full items-center justify-between",children:[f.jsxs("div",{children:[f.jsx("h1",{className:Tt(),children:"Agent Chat"}),f.jsx("h2",{className:fie("text-foreground"),children:(e==null?void 0:e.name)??"Letta"})]}),e?f.jsxs("button",{onClick:async()=>{await navigator.clipboard.writeText((e==null?void 0:e.id)||""),C(!0),setTimeout(()=>C(!1),2e3)},className:ee(h9({variant:"secondary"}),"ml-2 opacity-80 hover:opacity-100"),children:[f.jsxs("span",{children:["Agent ID: ",e==null?void 0:e.id]}),x?f.jsx(Pm,{className:"ml-2 h-3 w-3"}):f.jsx(xq,{className:"ml-2 h-3 w-3"})]}):null]})]}),f.jsxs("div",{className:"relative flex min-h-0 flex-1",children:[f.jsx(ule,{currentAgentId:e==null?void 0:e.id}),f.jsx("div",{className:"flex flex-1 border-l bg-muted/50",children:f.jsxs("div",{className:"relative mx-auto flex max-w-screen-lg flex-1 flex-col overflow-hidden",children:[f.jsx(use,{}),f.jsx(pke,{currentAgent:e,isLoading:v,previousMessages:[...k,...w],messages:r}),f.jsx(mke,{enabled:!v,onSend:_=>{h(_)}})]})})]})]})},wke={path:"agents/:agentName/chat",element:f.jsx(Ske,{})};function Eke(e,t,n){var r=this,a=p.useRef(null),o=p.useRef(0),i=p.useRef(null),s=p.useRef([]),l=p.useRef(),c=p.useRef(),u=p.useRef(e),d=p.useRef(!0);u.current=e;var g=typeof window<"u",m=!t&&t!==0&&g;if(typeof e!="function")throw new TypeError("Expected a function");t=+t||0;var b=!!(n=n||{}).leading,y=!("trailing"in n)||!!n.trailing,w="maxWait"in n,v="debounceOnServer"in n&&!!n.debounceOnServer,h=w?Math.max(+n.maxWait||0,t):null;p.useEffect(function(){return d.current=!0,function(){d.current=!1}},[]);var S=p.useMemo(function(){var E=function(T){var L=s.current,D=l.current;return s.current=l.current=null,o.current=T,c.current=u.current.apply(D,L)},k=function(T,L){m&&cancelAnimationFrame(i.current),i.current=m?requestAnimationFrame(T):setTimeout(T,L)},x=function(T){if(!d.current)return!1;var L=T-a.current;return!a.current||L>=t||L<0||w&&T-o.current>=h},C=function(T){return i.current=null,y&&s.current?E(T):(s.current=l.current=null,c.current)},_=function T(){var L=Date.now();if(x(L))return C(L);if(d.current){var D=t-(L-a.current),H=w?Math.min(D,h-(L-o.current)):D;k(T,H)}},R=function(){if(g||v){var T=Date.now(),L=x(T);if(s.current=[].slice.call(arguments),l.current=r,a.current=T,L){if(!i.current&&d.current)return o.current=a.current,k(_,t),b?E(a.current):c.current;if(w)return k(_,t),E(a.current)}return i.current||k(_,t),c.current}};return R.cancel=function(){i.current&&(m?cancelAnimationFrame(i.current):clearTimeout(i.current)),o.current=0,s.current=a.current=l.current=i.current=null},R.isPending=function(){return!!i.current},R.flush=function(){return i.current?C(Date.now()):c.current},R},[b,w,t,h,y,m,g,v]);return S}function xke(e,t){return e===t}function kke(e,t){return t}function Oh(e,t,n){var r=n&&n.equalityFn||xke,a=p.useReducer(kke,e),o=a[0],i=a[1],s=Eke(p.useCallback(function(c){return i(c)},[i]),t,n),l=p.useRef(e);return r(l.current,e)||(s(e),l.current=e),[o,s]}const Cke=Xe({agentId:Ce()});function _ke({source:e,closeDialog:t}){const{data:n,isLoading:r}=Qm(),a=x6(),{toast:o}=An(),i=Bt(),s=bn({resolver:yn(Cke),mode:"onChange"}),l=c=>{a.mutate({agentId:c.agentId,sourceId:e.id||""},{onSuccess:()=>{t(),i.invalidateQueries({queryKey:sf()}),o({title:"Agent attached successfully!",duration:5e3})},onError:u=>{o({title:"Error attaching agent...",duration:5e3})}})};return f.jsx(vn,{...s,children:f.jsxs("form",{onSubmit:s.handleSubmit(l,c=>console.log(c)),className:"space-y-8",children:[f.jsx(ut,{control:s.control,name:"agentId",render:({field:c})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Agent to Attach to"}),f.jsxs(So,{disabled:r,onValueChange:c.onChange,value:c.value,children:[f.jsx(pt,{children:f.jsx(za,{children:f.jsx(wo,{placeholder:r?"Loading agents...":"Select an agent"})})}),f.jsx(Ua,{className:"max-h-[200px] overflow-y-auto",children:(n??[]).map(u=>f.jsx(Fn,{value:u.id||"",children:u.name},u.id))})]}),f.jsx(Mt,{children:"Select an agent to attach your data source to."}),f.jsx(lt,{})]})}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Attach to Agent"}),a.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Attaching agent to data source..."})]})]})]})})}const Ake=({open:e,onOpenChange:t,source:n})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsxs($t,{children:["Attach Agent to ",(n==null?void 0:n.name)??"Source"]}),f.jsx(dn,{children:"The datasource will then become available to the agent to use for information."})]}),n?f.jsx(_ke,{source:n,closeDialog:()=>t(!1)}):f.jsx("p",{children:"No source and agent..."})]})}),Tke=Xe({name:Ce().min(1,{message:"Name must be at least 1 character."}).max(30,{message:"Name must not be longer than 30 characters."}),description:Ce().max(2e3).min(0)}),Rke={name:"",description:""};function Nke({closeDialog:e}){const t=cX(),n=Bt(),{toast:r}=An(),a=bn({resolver:yn(Tke),defaultValues:Rke,mode:"onChange"}),o=i=>{t.mutate({requestBody:{name:i.name,description:i.description}},{onSuccess:()=>{n.invalidateQueries({queryKey:sf()}),e(),r({title:"Source created successfully!",duration:5e3})},onError:s=>{r({title:"Error creating source",duration:5e3})}})};return f.jsx(vn,{...a,children:f.jsxs("form",{onSubmit:a.handleSubmit(o,i=>console.log(i)),className:"space-y-8",children:[f.jsx(ut,{control:a.control,name:"name",render:({field:i})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Name"}),f.jsx(pt,{children:f.jsx(_n,{...i})}),f.jsx(Mt,{children:"This is your sources display name. It can be a real name or a pseudonym."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:a.control,name:"description",render:({field:i})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Description"}),f.jsx(pt,{children:f.jsx(qs,{placeholder:"Describe your source here",className:"resize-none",...i})}),f.jsx(lt,{})]})}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Create Source"}),t.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Creating Source..."})]})]})]})})}const Ike=({open:e,onOpenChange:t})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Create Data Source"}),f.jsx(dn,{children:"Add a new data source here. Click create when you're done."})]}),f.jsx(Nke,{closeDialog:()=>t(!1)})]})}),Oke=({value:e,onValueChange:t})=>f.jsx("form",{children:f.jsxs("div",{className:"relative",children:[f.jsx(Ms,{className:"pointer-events-none absolute left-[12px] top-3 h-4 w-4 text-muted-foreground"}),f.jsx(_n,{placeholder:"Search data source",value:e,onChange:n=>t(n.target.value),className:"w-52 pl-8 lg:w-80"})]})}),Dke=(e,t,n,r,a)=>[{accessorKey:"actions",header:"",cell:({row:o})=>f.jsx(Dn,{isLoading:a,children:f.jsxs("span",{className:"flex space-x-2",children:[f.jsx(ue,{onClick:()=>e(o.original),className:"!h-6 !w-6 !p-1",variant:"ghost",children:f.jsx(eF,{className:"h-3.5 w-3.5"})}),f.jsx(ue,{onClick:()=>t(o.original),className:"!h-6 !w-6 !p-1",variant:"ghost",children:f.jsx(Fm,{className:"h-3.5 w-3.5"})})]})})},{accessorKey:"name",header:"Name",cell:({row:o})=>f.jsx(Dn,{isLoading:a,children:o.getValue("name")})},{accessorFn:o=>{var i;return(i=o.embedding_config)==null?void 0:i.embedding_model},accessorKey:"embedding_model",header:"Embedding Model",cell:({row:o})=>f.jsx(Dn,{isLoading:a,children:o.getValue("embedding_model")})},{accessorFn:o=>{var i;return((i=o.embedding_config)==null?void 0:i.embedding_dim)??0},accessorKey:"embedding_dim",header:"Embedding Dimensions",cell:({row:o})=>f.jsx(Dn,{isLoading:a,children:o.getValue("embedding_dim")})},{accessorFn:o=>{var i;return((i=o.metadata_)==null?void 0:i.num_documents)??0},accessorKey:"num_documents",header:"Documents",cell:({row:o})=>f.jsx(Dn,{isLoading:a,children:o.getValue("num_documents")})},{accessorFn:o=>{var i;return((i=o.metadata_)==null?void 0:i.num_passages)??0},accessorKey:"num_passages",header:"Passages",cell:({row:o})=>f.jsx(Dn,{isLoading:a,children:o.getValue("num_passages")})},{accessorKey:"created_at",header:"Created At",cell:({row:o})=>f.jsx(Dn,{isLoading:a,children:Mre(o,"created_at","Unknown")})},{accessorFn:o=>{var i;return(i=o.metadata_)==null?void 0:i.attached_agents},accessorKey:"attached_agents",header:"Attached To",cell:({row:o})=>{const i=o.getValue("attached_agents")??[];return f.jsx(Dn,{isLoading:a,children:f.jsxs("div",{className:"flex flex-wrap items-baseline",children:[f.jsxs(ue,{onClick:()=>n(o.original),variant:"ghost",className:"mr-1 h-5 !p-1 text-xs",size:"sm",children:[f.jsx("span",{className:"sr-only",children:"attach another agent"}),f.jsx(Dq,{className:"h-3 w-3"})]}),i.map(s=>f.jsxs(ue,{onClick:()=>r(o.original,s),variant:"ghost",className:"mr-1 h-5 !p-1 text-xs",size:"sm",children:[s.name,f.jsx(Iq,{className:"ml-2 h-3 w-3"})]},s.id)),i.length===0&&f.jsx("span",{className:"text-xs",children:"- None"})]})})}}],Lke=({nameFilter:e,className:t,onSourceUpload:n,onSourceEdit:r,onAttachAgent:a,onDetachAgent:o})=>{const{data:i,isError:s,isLoading:l}=b_(),c=(i??[]).filter(u=>u.name.includes(e));return f.jsx("div",{className:t,children:f.jsx(uf,{columns:Dke(n,r,a,o,l),isLoading:l,error:s?"Failed to load sources":void 0,data:c,renderPagination:u=>f.jsx(df,{className:"mt-4",table:u})})})},Mke=({open:e,onOpenChange:t,source:n,agent:r})=>{const a=Bt(),o=k6(),{toast:i}=An(),s=()=>{!n||!r||o.mutate({agentId:r.id,sourceId:n.id||""},{onSuccess:()=>{t(!1),a.invalidateQueries({queryKey:sf()}),i({title:"Agent detached successfully!",duration:3e3})},onError:l=>i({title:"Failed to detach agent!",duration:3e3})})};return f.jsx(Kt,{open:n&&r&&e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsx(Pt,{children:f.jsxs($t,{children:["Detach Agent from ",(n==null?void 0:n.name)??"Source"]})}),f.jsx("p",{className:"pb-10",children:"The data source will then no longer be available to the agent to use for information."}),f.jsxs("div",{className:"flex space-x-2",children:[f.jsx(ue,{variant:"ghost",onClick:()=>t(!1),children:"Cancel"}),f.jsxs(ue,{onClick:s,children:[o.isPending?"Detaching":"Detach"," Agent"]})]})]})})},Pke=Xe({name:Ce().min(1,{message:"Name must be at least 1 character."}).max(30,{message:"Name must not be longer than 30 characters."}),description:Ce().max(2e3).min(0)});function $ke({source:e,closeDialog:t}){const n=pX(),r=Bt(),{toast:a}=An(),o={name:e.name,description:e.description??""},i=bn({resolver:yn(Pke),defaultValues:o,mode:"onChange"}),s=l=>{n.mutate({sourceId:e.id||"",requestBody:{id:e.id||"",name:l.name||"",description:l.description}},{onSuccess:()=>{r.invalidateQueries({queryKey:sf()}),t(),a({title:"Source editd successfully!",duration:5e3})},onError:c=>{a({title:"Error creating source",duration:5e3})}})};return f.jsx(vn,{...i,children:f.jsxs("form",{onSubmit:i.handleSubmit(s,l=>console.log(l)),className:"space-y-8",children:[f.jsx(ut,{control:i.control,name:"name",render:({field:l})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Name"}),f.jsx(pt,{children:f.jsx(_n,{...l})}),f.jsx(Mt,{children:"This is your sources display name. It can be a real name or a pseudonym."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:i.control,name:"description",render:({field:l})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Description"}),f.jsx(pt,{children:f.jsx(qs,{placeholder:"Describe your source here",className:"resize-none",...l})}),f.jsx(lt,{})]})}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Edit Source"}),n.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Edit Source..."})]})]})]})})}const Fke=({open:e,onOpenChange:t,source:n})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Edit Data Source"}),f.jsx(dn,{children:"Edit an existing data source here."})]}),n?f.jsx($ke,{source:n,closeDialog:()=>t(!1)}):f.jsx("p",{children:"No source..."})]})}),jke=Xe({file:Tie(e=>e instanceof File)}),zke=e=>{const t=C6(),{toast:n}=An(),r=Bt(),a=bn({resolver:yn(jke),mode:"onChange"}),o=i=>{t.mutate({sourceId:e.source.id||"",formData:{file:i.file}},{onSuccess:()=>{r.invalidateQueries({queryKey:BZ()}),e.onComplete()},onError:s=>n({title:"Failed to upload file...",duration:5e3})})};return f.jsx(vn,{...a,children:f.jsxs("form",{onSubmit:a.handleSubmit(o),className:"space-y-8",children:[f.jsx(ut,{control:a.control,name:"file",render:({field:i})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"File"}),f.jsx(pt,{children:f.jsx(_n,{type:"file",ref:i.ref,disabled:i.disabled,name:i.name,onBlur:i.onBlur,onChange:s=>{var l,c;i.onChange((c=(l=s.target)==null?void 0:l.files)==null?void 0:c[0])}})}),f.jsx(Mt,{children:"File to upload."}),f.jsx(lt,{})]})}),f.jsxs("div",{className:"flex space-x-4",children:[f.jsx(ue,{children:"Upload File"}),t.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Creating Job to ingest file..."})]}),t.isSuccess&&f.jsxs("div",{className:Tt("ml-4 flex items-center text-emerald-600 animate-in slide-in-from-bottom-2"),children:[f.jsx(Mm,{className:"mr-2 h-4 w-4 "}),f.jsx("span",{children:"Job created! File ingestion started!"})]})]})]})})},Uke=Xe({sourceId:Ce(),file:Rie()}),Bke=({onComplete:e})=>{const t=b_(),n=C6(),{toast:r}=An(),a=bn({resolver:yn(Uke),defaultValues:{sourceId:"",file:void 0},mode:"onChange"}),o=Bt(),i=s=>{n.mutate({sourceId:s.sourceId,formData:{file:s.file}},{onSuccess:()=>{o.invalidateQueries({queryKey:b6()}),e()},onError:l=>r({title:"Failed to upload file...",duration:5e3})})};return f.jsx(vn,{...a,children:f.jsxs("form",{onSubmit:a.handleSubmit(i),className:"space-y-8",children:[f.jsx(ut,{control:a.control,name:"sourceId",render:({field:s})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Upload to"}),f.jsx(pt,{children:f.jsxs(So,{value:s.value,name:s.name,onValueChange:s.onChange,disabled:t.isLoading,children:[f.jsx(za,{className:"w-full",children:f.jsx(wo,{placeholder:"Select a source"})}),f.jsx(Ua,{children:(t.data??[]).map(l=>f.jsx(Fn,{value:l.id||"",children:l.name},l.id))})]})}),f.jsx(Mt,{children:"Upload your data to this source."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:a.control,name:"file",render:({field:s})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"File"}),f.jsx(pt,{children:f.jsx(_n,{type:"file",ref:s.ref,disabled:s.disabled,name:s.name,onBlur:s.onBlur,onChange:l=>{var c,u;s.onChange((u=(c=l.target)==null?void 0:c.files)==null?void 0:u[0])}})}),f.jsx(Mt,{children:"File to upload."}),f.jsx(lt,{})]})}),f.jsxs("div",{className:"flex space-x-4",children:[f.jsx(ue,{children:"Upload File"}),n.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Creating Job to ingest file..."})]}),n.isSuccess&&f.jsxs("div",{className:Tt("ml-4 flex items-center text-emerald-600 animate-in slide-in-from-bottom-2"),children:[f.jsx(Mm,{className:"mr-2 h-4 w-4 "}),f.jsx("span",{children:"Job created! File ingestion started!"})]})]})]})})},Hke=({source:e,open:t,onOpenChange:n})=>f.jsx(Kt,{open:t,onOpenChange:n,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsx(Pt,{children:f.jsxs($t,{children:["Upload Data ",e&&`to ${e.name}`]})}),e?f.jsx(zke,{onComplete:()=>n(!1),source:e}):f.jsx(Bke,{onComplete:()=>n(!1)})]})}),eU="Progress",Dh=100,[Vke,mTe]=zn(eU),[qke,Gke]=Vke(eU),tU=p.forwardRef((e,t)=>{const{__scopeProgress:n,value:r,max:a,getValueLabel:o=Yke,...i}=e,s=Vk(a)?a:Dh,l=rU(r,s)?r:null,c=lm(l)?o(l,s):void 0;return p.createElement(qke,{scope:n,value:l,max:s},p.createElement(ze.div,W({"aria-valuemax":s,"aria-valuemin":0,"aria-valuenow":lm(l)?l:void 0,"aria-valuetext":c,role:"progressbar","data-state":nU(l,s),"data-value":l??void 0,"data-max":s},i,{ref:t})))});tU.propTypes={max(e,t,n){const r=e[t],a=String(r);return r&&!Vk(r)?new Error(Zke(a,n)):null},value(e,t,n){const r=e[t],a=String(r),o=Vk(e.max)?e.max:Dh;return r!=null&&!rU(r,o)?new Error(Xke(a,n)):null}};const Wke="ProgressIndicator",Kke=p.forwardRef((e,t)=>{var n;const{__scopeProgress:r,...a}=e,o=Gke(Wke,r);return p.createElement(ze.div,W({"data-state":nU(o.value,o.max),"data-value":(n=o.value)!==null&&n!==void 0?n:void 0,"data-max":o.max},a,{ref:t}))});function Yke(e,t){return`${Math.round(e/t*100)}%`}function nU(e,t){return e==null?"indeterminate":e===t?"complete":"loading"}function lm(e){return typeof e=="number"}function Vk(e){return lm(e)&&!isNaN(e)&&e>0}function rU(e,t){return lm(e)&&!isNaN(e)&&e<=t&&e>=0}function Zke(e,t){return`Invalid prop \`max\` of value \`${e}\` supplied to \`${t}\`. Only numbers greater than 0 are valid max values. Defaulting to \`${Dh}\`.`}function Xke(e,t){return`Invalid prop \`value\` of value \`${e}\` supplied to \`${t}\`. The \`value\` prop must be: - - a positive number - - less than the value passed to \`max\` (or ${Dh} if no \`max\` prop is set) - - \`null\` if the progress is indeterminate. - -Defaulting to \`null\`.`}const aU=tU,Qke=Kke,oU=p.forwardRef(({className:e,value:t,indeterminate:n=!1,...r},a)=>f.jsx(aU,{ref:a,className:ee("relative h-4 w-full overflow-hidden rounded-full bg-secondary",e),...r,children:f.jsx(Qke,{className:ee("h-full w-full flex-1 bg-primary transition-all",n&&"animate-progress origin-left"),style:{transform:`translateX(-${100-(t||0)}%)`}})}));oU.displayName=aU.displayName;function Jke({job:e}){var n;const t=p.useMemo(()=>{var a;const r=(a=e==null?void 0:e.metadata_)==null?void 0:a.filename;return typeof r=="string"?r:"Unknown"},[(n=e==null?void 0:e.metadata_)==null?void 0:n.filename]);return f.jsx("div",{className:"border rounded-sm p-3 gap-3 flex flex-col",children:f.jsxs("div",{className:"text-sm whitespace-nowrap gap-4 text-muted-foreground items-center flex flex-row justify-between",children:[f.jsxs("div",{children:["Uploading ",t]}),f.jsx(oU,{className:"h-2",indeterminate:!0}),f.jsx("div",{children:"Indeterminate time to upload"})]})})}function eCe(){const{data:e}=sX({userId:""},void 0,{refetchInterval:2e3}),t=p.useMemo(()=>e||[],[e]);return f.jsx("div",{className:"mx-4 my-4 rounded flex flex-col gap-2",children:f.jsx("div",{className:"flex flex-col gap-3",children:t.map(n=>f.jsx(Jke,{job:n},n.id))})})}const tCe=()=>{const[e,t]=p.useState(!1),[n,r]=p.useState(!1),[a,o]=p.useState(),[i,s]=p.useState(!1),[l,c]=p.useState(),[u,d]=p.useState(!1),[g,m]=p.useState(),[b,y]=p.useState(!1),[w,v]=p.useState(),[h,S]=p.useState(""),[E]=Oh(h,300),k=T=>{c(T),s(!0)},x=T=>{o(T),r(!0)},C=T=>{s(T),T||setTimeout(()=>c(void 0),300)},_=T=>{v(T),d(!0)},R=(T,L)=>{m({source:T,agent:L}),y(!0)};return f.jsxs(Fs,{children:[f.jsxs("div",{className:"flex items-center justify-between bg-background/95 px-4 pb-3 pt-2.5 backdrop-blur supports-[backdrop-filter]:bg-background/60",children:[f.jsx(Oke,{value:h,onValueChange:S}),f.jsxs("div",{className:"flex items-center space-x-2",children:[f.jsxs(ue,{onClick:()=>s(!0),size:"sm",children:[f.jsx(eF,{className:"mr-2 h-4 w-4"}),"Upload Data"]}),f.jsxs(ue,{onClick:()=>t(!0),size:"sm",children:[f.jsx(ya,{className:"mr-2 h-4 w-4"}),"Create Data Source"]})]})]}),f.jsx(eCe,{}),f.jsx(Lke,{onSourceUpload:k,onSourceEdit:x,onAttachAgent:_,onDetachAgent:R,className:"mx-4",nameFilter:E}),f.jsx(Ike,{open:e,onOpenChange:t}),f.jsx(Fke,{source:a,open:n,onOpenChange:r}),f.jsx(Hke,{source:l,open:i,onOpenChange:C}),f.jsx(Ake,{source:w,open:u,onOpenChange:d}),f.jsx(Mke,{source:g==null?void 0:g.source,agent:g==null?void 0:g.agent,open:b,onOpenChange:y})]})},nCe={path:"data-sources",element:f.jsx(tCe,{})},rCe=Xe({name:Ce().min(1,{message:"Name must be at least 1 character."}).max(30,{message:"Name must not be longer than 30 characters."}),text:Ce().max(2e3).min(0)}),aCe={name:"",text:""};function oCe({closeDialog:e}){const t=_6(),{toast:n}=An(),r=rCe.extend({text:Ce().max(2e3).min(0)}),a=Bt(),o=bn({resolver:yn(r),defaultValues:aCe,mode:"onChange"}),i=s=>{t.mutate({requestBody:{label:Qr,name:s.name,value:s.text}},{onSuccess:()=>{a.invalidateQueries({queryKey:lf({label:Qr})}),e(),n({title:"Persona created successfully!",duration:5e3})},onError:l=>{n({title:"Error creating persona",duration:5e3})}})};return f.jsx(vn,{...o,children:f.jsxs("form",{onSubmit:o.handleSubmit(i,s=>console.log(s)),className:"space-y-8",children:[f.jsx(ut,{control:o.control,name:"name",render:({field:s})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Name"}),f.jsx(pt,{children:f.jsx(_n,{...s})}),f.jsx(Mt,{children:"This is your personas display name. It can be a real name or a pseudonym."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:o.control,name:"text",render:({field:s})=>{var l;return f.jsxs(ot,{children:[f.jsx(pt,{children:f.jsx(Ai,{placeholder:"Describe your persona here",charCount:(l=s.value)==null?void 0:l.length,limit:2e3,...s})}),f.jsxs(Mt,{children:["You can use no more than ",2e3," characters."]}),f.jsx(lt,{})]})}}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Create Persona"}),t.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Creating Persona..."})]})]})]})})}const iCe=({open:e,onOpenChange:t})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Create Persona"}),f.jsx(dn,{children:"Add a new persona here. Click create when you're done."})]}),f.jsx(oCe,{closeDialog:()=>t(!1)})]})}),sCe=Xe({text:Ce().max(2e3).min(0)});function lCe({persona:e,closeDialog:t}){const n=v_(),r=Bt(),{toast:a}=An(),o=sCe.extend({text:Ce().max(2e3).min(0)}),i={text:e.value||""},s=bn({resolver:yn(o),defaultValues:i,mode:"onChange"}),l=c=>{n.mutate({blockId:e.id||"",requestBody:{id:e.id||"",value:c.text||""}},{onSuccess:()=>{r.invalidateQueries({queryKey:lf({label:Qr})}),t(),a({title:"Persona updated successfully!",duration:5e3})},onError:u=>{a({title:"Error updating persona",duration:5e3})}})};return f.jsx(vn,{...s,children:f.jsxs("form",{onSubmit:s.handleSubmit(l,c=>console.log(c)),className:"space-y-8",children:[f.jsx(ut,{control:s.control,name:"text",render:({field:c})=>{var u;return f.jsxs(ot,{children:[f.jsx(pt,{children:f.jsx(Ai,{placeholder:"Describe your persona here",charCount:(u=c.value)==null?void 0:u.length,limit:2e3,...c})}),f.jsxs(Mt,{children:["You can use no more than ",2e3," characters."]}),f.jsx(lt,{})]})}}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Update Persona"}),n.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Updating Persona..."})]})]})]})})}const cCe=({persona:e,open:t,onOpenChange:n})=>f.jsx(Kt,{open:t,onOpenChange:n,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsxs($t,{children:["Edit ",(e==null?void 0:e.name)??"Persona"]}),f.jsx(dn,{children:"Edit existing agent template here. Click create when you're done."})]}),e?f.jsx(lCe,{persona:e,closeDialog:()=>n(!1)}):f.jsx("p",{children:"No Persona...."})]})}),uCe=({value:e,onValueChange:t})=>f.jsx("form",{children:f.jsxs("div",{className:"relative",children:[f.jsx(Ms,{className:"pointer-events-none absolute left-[12px] top-3 h-4 w-4 text-muted-foreground"}),f.jsx(_n,{placeholder:"Search persona",value:e,onChange:n=>t(n.target.value),className:"w-52 pl-8 lg:w-80"})]})});let Cx;const iU="HoverCard",[sU,hTe]=zn(iU,[qa]),KA=qa(),[dCe,YA]=sU(iU),fCe=e=>{const{__scopeHoverCard:t,children:n,open:r,defaultOpen:a,onOpenChange:o,openDelay:i=700,closeDelay:s=300}=e,l=KA(t),c=p.useRef(0),u=p.useRef(0),d=p.useRef(!1),g=p.useRef(!1),[m=!1,b]=Fa({prop:r,defaultProp:a,onChange:o}),y=p.useCallback(()=>{clearTimeout(u.current),c.current=window.setTimeout(()=>b(!0),i)},[i,b]),w=p.useCallback(()=>{clearTimeout(c.current),!d.current&&!g.current&&(u.current=window.setTimeout(()=>b(!1),s))},[s,b]),v=p.useCallback(()=>b(!1),[b]);return p.useEffect(()=>()=>{clearTimeout(c.current),clearTimeout(u.current)},[]),p.createElement(dCe,{scope:t,open:m,onOpenChange:b,onOpen:y,onClose:w,onDismiss:v,hasSelectionRef:d,isPointerDownOnContentRef:g},p.createElement(ah,l,n))},pCe="HoverCardTrigger",gCe=p.forwardRef((e,t)=>{const{__scopeHoverCard:n,...r}=e,a=YA(pCe,n),o=KA(n);return p.createElement(pf,W({asChild:!0},o),p.createElement(ze.a,W({"data-state":a.open?"open":"closed"},r,{ref:t,onPointerEnter:fe(e.onPointerEnter,cm(a.onOpen)),onPointerLeave:fe(e.onPointerLeave,cm(a.onClose)),onFocus:fe(e.onFocus,a.onOpen),onBlur:fe(e.onBlur,a.onClose),onTouchStart:fe(e.onTouchStart,i=>i.preventDefault())})))}),mCe="HoverCardPortal",[bTe,hCe]=sU(mCe,{forceMount:void 0}),qk="HoverCardContent",bCe=p.forwardRef((e,t)=>{const n=hCe(qk,e.__scopeHoverCard),{forceMount:r=n.forceMount,...a}=e,o=YA(qk,e.__scopeHoverCard);return p.createElement(pr,{present:r||o.open},p.createElement(yCe,W({"data-state":o.open?"open":"closed"},a,{onPointerEnter:fe(e.onPointerEnter,cm(o.onOpen)),onPointerLeave:fe(e.onPointerLeave,cm(o.onClose)),ref:t})))}),yCe=p.forwardRef((e,t)=>{const{__scopeHoverCard:n,onEscapeKeyDown:r,onPointerDownOutside:a,onFocusOutside:o,onInteractOutside:i,...s}=e,l=YA(qk,n),c=KA(n),u=p.useRef(null),d=nt(t,u),[g,m]=p.useState(!1);return p.useEffect(()=>{if(g){const b=document.body;return Cx=b.style.userSelect||b.style.webkitUserSelect,b.style.userSelect="none",b.style.webkitUserSelect="none",()=>{b.style.userSelect=Cx,b.style.webkitUserSelect=Cx}}},[g]),p.useEffect(()=>{if(u.current){const b=()=>{m(!1),l.isPointerDownOnContentRef.current=!1,setTimeout(()=>{var y;((y=document.getSelection())===null||y===void 0?void 0:y.toString())!==""&&(l.hasSelectionRef.current=!0)})};return document.addEventListener("pointerup",b),()=>{document.removeEventListener("pointerup",b),l.hasSelectionRef.current=!1,l.isPointerDownOnContentRef.current=!1}}},[l.isPointerDownOnContentRef,l.hasSelectionRef]),p.useEffect(()=>{u.current&&vCe(u.current).forEach(y=>y.setAttribute("tabindex","-1"))}),p.createElement(Ls,{asChild:!0,disableOutsidePointerEvents:!1,onInteractOutside:i,onEscapeKeyDown:r,onPointerDownOutside:a,onFocusOutside:fe(o,b=>{b.preventDefault()}),onDismiss:l.onDismiss},p.createElement(gf,W({},c,s,{onPointerDown:fe(s.onPointerDown,b=>{b.currentTarget.contains(b.target)&&m(!0),l.hasSelectionRef.current=!1,l.isPointerDownOnContentRef.current=!0}),ref:d,style:{...s.style,userSelect:g?"text":void 0,WebkitUserSelect:g?"text":void 0,"--radix-hover-card-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-hover-card-content-available-width":"var(--radix-popper-available-width)","--radix-hover-card-content-available-height":"var(--radix-popper-available-height)","--radix-hover-card-trigger-width":"var(--radix-popper-anchor-width)","--radix-hover-card-trigger-height":"var(--radix-popper-anchor-height)"}})))});function cm(e){return t=>t.pointerType==="touch"?void 0:e()}function vCe(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP});for(;n.nextNode();)t.push(n.currentNode);return t}const SCe=fCe,wCe=gCe,lU=bCe,ECe=SCe,xCe=wCe,cU=p.forwardRef(({className:e,align:t="center",sideOffset:n=4,...r},a)=>f.jsx(lU,{ref:a,align:t,sideOffset:n,className:ee("z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...r}));cU.displayName=lU.displayName;const ZA=({text:e})=>f.jsxs(ECe,{children:[f.jsx(xCe,{asChild:!0,children:f.jsx(ue,{size:"sm",variant:"ghost",className:"-mx-4 w-96 text-left font-normal",children:f.jsx("span",{className:"h-6 w-full truncate text-left",children:f.jsx("span",{className:"whitespace-pre",children:e})})})}),f.jsx(cU,{className:"w-[300px] p-4 sm:w-[500px]",children:f.jsx("div",{className:"max-h-[400px] overflow-y-auto",children:f.jsx("p",{className:"whitespace-pre-wrap",children:e})})})]}),kCe=(e,t)=>[{accessorKey:"edit",header:"",size:20,cell:({row:n})=>t?f.jsx(Pi,{className:"h-6 w-6"}):f.jsx(ue,{onClick:()=>e(n.original),className:"!h-6 !w-6 !p-1",variant:"ghost",children:f.jsx(Fm,{className:"h-3.5 w-3.5"})})},{accessorKey:"name",header:"Name",cell:({row:n})=>f.jsx(Dn,{isLoading:t,children:n.getValue("name")})},{accessorKey:"value",header:"Value",cell:({row:n})=>f.jsx(Dn,{isLoading:t,children:f.jsx(ZA,{text:n.getValue("value")})})}],CCe=({onPersonaEdit:e,nameFilter:t,className:n})=>{const{data:r,isLoading:a,isError:o}=Ng({label:Qr}),i=p.useMemo(()=>(r??[]).filter(s=>{var l;return(l=s.name)==null?void 0:l.includes(t)}),[r,t]);return f.jsx("div",{className:n,children:f.jsx(uf,{columns:kCe(e,a),isLoading:a,error:o?"Error loading agent templates":void 0,data:i,renderPagination:s=>f.jsx(df,{className:"mt-4",table:s})})})},_Ce=()=>{const[e,t]=p.useState(""),[n]=Oh(e,300),r=Li(),[a,o]=p.useState(r.search.includes("openCreatePersona")??!1),[i,s]=p.useState(null),[l,c]=p.useState(!1),u=d=>{s(d),c(!0)};return f.jsxs(Fs,{children:[f.jsxs("div",{className:"flex items-center justify-between bg-background/95 px-4 pb-3 pt-2.5 backdrop-blur supports-[backdrop-filter]:bg-background/60",children:[f.jsx(uCe,{value:e,onValueChange:t}),f.jsxs(ue,{onClick:()=>o(!0),size:"sm",children:[f.jsx(ya,{className:"mr-2 h-4 w-4"}),"Create Persona"]})]}),f.jsx(CCe,{onPersonaEdit:u,nameFilter:n,className:"mx-4"}),f.jsx(iCe,{open:a,onOpenChange:d=>o(d)}),f.jsx(cCe,{persona:i,open:l,onOpenChange:d=>c(d)})]})},ACe={path:"agent-templates",element:f.jsx(_Ce,{})},uU="Radio",[TCe,dU]=zn(uU),[RCe,NCe]=TCe(uU),ICe=p.forwardRef((e,t)=>{const{__scopeRadio:n,name:r,checked:a=!1,required:o,disabled:i,value:s="on",onCheck:l,...c}=e,[u,d]=p.useState(null),g=nt(t,y=>d(y)),m=p.useRef(!1),b=u?!!u.closest("form"):!0;return p.createElement(RCe,{scope:n,checked:a,disabled:i},p.createElement(ze.button,W({type:"button",role:"radio","aria-checked":a,"data-state":fU(a),"data-disabled":i?"":void 0,disabled:i,value:s},c,{ref:g,onClick:fe(e.onClick,y=>{a||l==null||l(),b&&(m.current=y.isPropagationStopped(),m.current||y.stopPropagation())})})),b&&p.createElement(LCe,{control:u,bubbles:!m.current,name:r,value:s,checked:a,required:o,disabled:i,style:{transform:"translateX(-100%)"}}))}),OCe="RadioIndicator",DCe=p.forwardRef((e,t)=>{const{__scopeRadio:n,forceMount:r,...a}=e,o=NCe(OCe,n);return p.createElement(pr,{present:r||o.checked},p.createElement(ze.span,W({"data-state":fU(o.checked),"data-disabled":o.disabled?"":void 0},a,{ref:t})))}),LCe=e=>{const{control:t,checked:n,bubbles:r=!0,...a}=e,o=p.useRef(null),i=F_(n),s=N_(t);return p.useEffect(()=>{const l=o.current,c=window.HTMLInputElement.prototype,d=Object.getOwnPropertyDescriptor(c,"checked").set;if(i!==n&&d){const g=new Event("click",{bubbles:r});d.call(l,n),l.dispatchEvent(g)}},[i,n,r]),p.createElement("input",W({type:"radio","aria-hidden":!0,defaultChecked:n},a,{tabIndex:-1,ref:o,style:{...e.style,...s,position:"absolute",pointerEvents:"none",opacity:0,margin:0}}))};function fU(e){return e?"checked":"unchecked"}const MCe=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"],pU="RadioGroup",[PCe,yTe]=zn(pU,[oh,dU]),gU=oh(),mU=dU(),[$Ce,FCe]=PCe(pU),jCe=p.forwardRef((e,t)=>{const{__scopeRadioGroup:n,name:r,defaultValue:a,value:o,required:i=!1,disabled:s=!1,orientation:l,dir:c,loop:u=!0,onValueChange:d,...g}=e,m=gU(n),b=x_(c),[y,w]=Fa({prop:o,defaultProp:a,onChange:d});return p.createElement($Ce,{scope:n,name:r,required:i,disabled:s,value:y,onValueChange:w},p.createElement(o7,W({asChild:!0},m,{orientation:l,dir:b,loop:u}),p.createElement(ze.div,W({role:"radiogroup","aria-required":i,"aria-orientation":l,"data-disabled":s?"":void 0,dir:b},g,{ref:t}))))}),zCe="RadioGroupItem",UCe=p.forwardRef((e,t)=>{const{__scopeRadioGroup:n,disabled:r,...a}=e,o=FCe(zCe,n),i=o.disabled||r,s=gU(n),l=mU(n),c=p.useRef(null),u=nt(t,c),d=o.value===a.value,g=p.useRef(!1);return p.useEffect(()=>{const m=y=>{MCe.includes(y.key)&&(g.current=!0)},b=()=>g.current=!1;return document.addEventListener("keydown",m),document.addEventListener("keyup",b),()=>{document.removeEventListener("keydown",m),document.removeEventListener("keyup",b)}},[]),p.createElement(i7,W({asChild:!0},s,{focusable:!i,active:d}),p.createElement(ICe,W({disabled:i,required:o.required,checked:d},l,a,{name:o.name,ref:u,onCheck:()=>o.onValueChange(a.value),onKeyDown:fe(m=>{m.key==="Enter"&&m.preventDefault()}),onFocus:fe(a.onFocus,()=>{var m;g.current&&((m=c.current)===null||m===void 0||m.click())})})))}),BCe=p.forwardRef((e,t)=>{const{__scopeRadioGroup:n,...r}=e,a=mU(n);return p.createElement(DCe,W({},a,r,{ref:t}))}),hU=jCe,bU=UCe,HCe=BCe,yU=p.forwardRef(({className:e,...t},n)=>f.jsx(hU,{className:ee("grid gap-2",e),...t,ref:n}));yU.displayName=hU.displayName;const vU=p.forwardRef(({className:e,children:t,...n},r)=>f.jsx(bU,{ref:r,className:ee("aspect-square h-4 w-4 rounded-full border border-primary text-primary ring-offset-background focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),...n,children:f.jsx(HCe,{className:"flex items-center justify-center",children:f.jsx(Q4,{className:"h-2.5 w-2.5 fill-current text-current"})})}));vU.displayName=bU.displayName;const Gk="horizontal",VCe=["horizontal","vertical"],SU=p.forwardRef((e,t)=>{const{decorative:n,orientation:r=Gk,...a}=e,o=wU(r)?r:Gk,s=n?{role:"none"}:{"aria-orientation":o==="vertical"?o:void 0,role:"separator"};return p.createElement(ze.div,W({"data-orientation":o},s,a,{ref:t}))});SU.propTypes={orientation(e,t,n){const r=e[t],a=String(r);return r&&!wU(r)?new Error(qCe(a,n)):null}};function qCe(e,t){return`Invalid prop \`orientation\` of value \`${e}\` supplied to \`${t}\`, expected one of: - - horizontal - - vertical - -Defaulting to \`${Gk}\`.`}function wU(e){return VCe.includes(e)}const EU=SU,Nd=p.forwardRef(({className:e,orientation:t="horizontal",decorative:n=!0,...r},a)=>f.jsx(EU,{ref:a,decorative:n,orientation:t,className:ee("shrink-0 bg-border",t==="horizontal"?"h-[1px] w-full":"h-full w-[1px]",e),...r}));Nd.displayName=EU.displayName;const xU=({children:e,title:t,description:n})=>f.jsxs("div",{className:"space-y-6",children:[f.jsxs("div",{children:[f.jsx("h3",{className:"text-lg font-medium",children:t}),f.jsx("p",{className:"text-sm text-muted-foreground",children:n})]}),f.jsx(Nd,{}),e]}),GCe=Xe({currentAgentId:Ce({required_error:"Please select an agent."})}),WCe=e=>({currentAgentId:e??""});function KCe(){const{data:e}=Qm(),t=To(),{setAgent:n}=ph(),r=bn({resolver:yn(GCe),defaultValues:WCe(t==null?void 0:t.id)});function a(o){const i=(e??[]).find(s=>s.id===o.currentAgentId);i&&(n(i),e_({title:"Agent updated successfully!",description:"You can now continue your conversation with them!"}))}return f.jsx(xU,{title:"Agents",description:"Manage the agents you chat with...",children:f.jsx(vn,{...r,children:f.jsxs("form",{onSubmit:r.handleSubmit(a),className:"space-y-8",children:[f.jsx(ut,{control:r.control,name:"currentAgentId",render:({field:o})=>f.jsxs(ot,{className:"space-y-1",children:[f.jsx(yt,{children:"Current Agent"}),f.jsx(Mt,{children:"Agent you are currently chatting with..."}),f.jsx(lt,{}),f.jsx(yU,{onValueChange:o.onChange,defaultValue:o.value,className:"flex flex-wrap gap-8 pt-2",children:e==null?void 0:e.map((i,s)=>f.jsx(ot,{children:f.jsxs(yt,{className:"[&:has([data-state=checked])>div]:border-primary",children:[f.jsx(pt,{children:f.jsx(vU,{value:i.id||"",className:"sr-only"})}),f.jsx("div",{className:"items-center rounded-md border-2 border-muted p-1 hover:border-accent",children:f.jsxs("div",{className:"space-y-2 rounded-sm bg-[#ecedef] p-2",children:[f.jsxs("div",{className:"space-y-2 rounded-md bg-white p-2 shadow-sm",children:[f.jsx("div",{className:"h-2 w-[80px] rounded-lg bg-[#ecedef]"}),f.jsx("div",{className:"h-2 w-[100px] rounded-lg bg-[#ecedef]"})]}),f.jsxs("div",{className:"flex items-center space-x-2 rounded-md bg-white p-2 shadow-sm",children:[f.jsx("div",{className:"h-4 w-4 rounded-full bg-[#ecedef]"}),f.jsx("div",{className:"h-2 w-[100px] rounded-lg bg-[#ecedef]"})]}),f.jsxs("div",{className:"flex items-center space-x-2 rounded-md bg-white p-2 shadow-sm",children:[f.jsx("div",{className:"h-4 w-4 rounded-full bg-[#ecedef]"}),f.jsx("div",{className:"h-2 w-[100px] rounded-lg bg-[#ecedef]"})]})]})}),f.jsx("span",{className:"block w-full p-2 text-center font-normal",children:i.name})]})},s))})]})}),f.jsx(ue,{type:"submit",children:"Update agent"})]})})})}const YCe=Xe({username:Ce().min(2,{message:"Username must be at least 2 characters."}).max(30,{message:"Username must not be longer than 30 characters."}),email:Ce({required_error:"Please select an email to display."}).email(),bio:Ce().max(160).min(4),urls:nA(Xe({value:Ce().url({message:"Please enter a valid URL."})})).optional()}),ZCe={bio:"Build LLM agents using Letta.",urls:[{value:"https://memgpt.ai"},{value:"http://twitter.com/MemGPT"}]};function XCe(){const e=bn({resolver:yn(YCe),defaultValues:ZCe,mode:"onChange"}),{fields:t,append:n}=vae({name:"urls",control:e.control});function r(a){e_({title:"You submitted the following values:",description:f.jsx("pre",{className:"mt-2 w-[340px] rounded-md bg-slate-950 p-4",children:f.jsx("code",{className:"text-white",children:JSON.stringify(a,null,2)})})})}return f.jsx(xU,{title:"Profile",description:"This is how others will see you in the MemGPT community.",children:f.jsx(vn,{...e,children:f.jsxs("form",{onSubmit:e.handleSubmit(r),className:"space-y-8",children:[f.jsx(ut,{control:e.control,name:"username",render:({field:a})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Username"}),f.jsx(pt,{children:f.jsx(_n,{placeholder:"memgpt",...a})}),f.jsx(Mt,{children:"This is your public display name. It can be your real name or a pseudonym. You can only change this once every 30 days."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:e.control,name:"email",render:({field:a})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Email"}),f.jsxs(So,{onValueChange:a.onChange,defaultValue:a.value,children:[f.jsx(pt,{children:f.jsx(za,{children:f.jsx(wo,{placeholder:"Select a verified email to display"})})}),f.jsxs(Ua,{children:[f.jsx(Fn,{value:"m@example.com",children:"m@example.com"}),f.jsx(Fn,{value:"m@google.com",children:"m@google.com"}),f.jsx(Fn,{value:"m@support.com",children:"m@support.com"})]})]}),f.jsxs(Mt,{children:["You can manage verified email addresses in your ",f.jsx(bd,{to:"/examples/forms",children:"email settings"}),"."]}),f.jsx(lt,{})]})}),f.jsx(ut,{control:e.control,name:"bio",render:({field:a})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Bio"}),f.jsx(pt,{children:f.jsx(qs,{placeholder:"Tell us a little bit about yourself",className:"resize-none",...a})}),f.jsxs(Mt,{children:["You can ",f.jsx("span",{children:"@mention"})," other users and organizations to link to them."]}),f.jsx(lt,{})]})}),f.jsxs("div",{children:[t.map((a,o)=>f.jsx(ut,{control:e.control,name:`urls.${o}.value`,render:({field:i})=>f.jsxs(ot,{children:[f.jsx(yt,{className:ee(o!==0&&"sr-only"),children:"URLs"}),f.jsx(Mt,{className:ee(o!==0&&"sr-only"),children:"Add links to your website, blog, or social media profiles."}),f.jsx(pt,{children:f.jsx(_n,{...i})}),f.jsx(lt,{})]})},a.id)),f.jsx(ue,{type:"button",variant:"outline",size:"sm",className:"mt-2",onClick:()=>n({value:""}),children:"Add URL"})]}),f.jsx(ue,{type:"submit",children:"Update profile"})]})})})}function QCe({className:e,items:t,...n}){return f.jsx("nav",{className:ee("flex space-x-2 lg:flex-col lg:space-x-0 lg:space-y-1",e),...n,children:t.map((r,a)=>f.jsx(jF,{relative:"path",to:r.to,className:ee(yc({variant:"ghost"}),"hover:bg-transparent hover:underline","[&.active]:bg-muted [&.active]:hover:bg-muted [&.active]:hover:no-underline","justify-start"),children:r.title},a))})}const JCe=[{title:"Profile",to:"./profile"}];function e_e(){return f.jsx(Fs,{children:f.jsxs("div",{className:"h-full space-y-6 overflow-y-auto p-10 pb-16",children:[f.jsxs("div",{className:"space-y-0.5",children:[f.jsx("h1",{className:"text-2xl font-bold tracking-tight",children:"Settings"}),f.jsx("p",{className:"text-muted-foreground",children:"Manage your Letta settings, like agents, prompts, and history."})]}),f.jsx(Nd,{className:"my-6"}),f.jsxs("div",{className:"flex flex-col space-y-8 lg:flex-row lg:space-x-12 lg:space-y-0",children:[f.jsx("aside",{className:"-mx-4 lg:w-1/5",children:f.jsx(QCe,{items:JCe})}),f.jsx("div",{className:"flex-1 lg:max-w-4xl",children:f.jsx(PF,{})})]})]})})}const t_e={path:"settings",element:f.jsx(e_e,{}),children:[{path:"",element:f.jsx(MF,{to:"profile"})},{path:"agents",element:f.jsx(KCe,{})},{path:"profile",element:f.jsx(XCe,{})}]};var kU={exports:{}};(function(e){var t=typeof window<"u"?window:typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope?self:{};/** - * Prism: Lightweight, robust, elegant syntax highlighting - * - * @license MIT - * @author Lea Verou - * @namespace - * @public - */var n=function(r){var a=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,o=0,i={},s={manual:r.Prism&&r.Prism.manual,disableWorkerMessageHandler:r.Prism&&r.Prism.disableWorkerMessageHandler,util:{encode:function h(S){return S instanceof l?new l(S.type,h(S.content),S.alias):Array.isArray(S)?S.map(h):S.replace(/&/g,"&").replace(/"u")return null;if("currentScript"in document&&1<2)return document.currentScript;try{throw new Error}catch(k){var h=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(k.stack)||[])[1];if(h){var S=document.getElementsByTagName("script");for(var E in S)if(S[E].src==h)return S[E]}return null}},isActive:function(h,S,E){for(var k="no-"+S;h;){var x=h.classList;if(x.contains(S))return!0;if(x.contains(k))return!1;h=h.parentElement}return!!E}},languages:{plain:i,plaintext:i,text:i,txt:i,extend:function(h,S){var E=s.util.clone(s.languages[h]);for(var k in S)E[k]=S[k];return E},insertBefore:function(h,S,E,k){k=k||s.languages;var x=k[h],C={};for(var _ in x)if(x.hasOwnProperty(_)){if(_==S)for(var R in E)E.hasOwnProperty(R)&&(C[R]=E[R]);E.hasOwnProperty(_)||(C[_]=x[_])}var T=k[h];return k[h]=C,s.languages.DFS(s.languages,function(L,D){D===T&&L!=h&&(this[L]=C)}),C},DFS:function h(S,E,k,x){x=x||{};var C=s.util.objId;for(var _ in S)if(S.hasOwnProperty(_)){E.call(S,_,S[_],k||_);var R=S[_],T=s.util.type(R);T==="Object"&&!x[C(R)]?(x[C(R)]=!0,h(R,E,null,x)):T==="Array"&&!x[C(R)]&&(x[C(R)]=!0,h(R,E,_,x))}}},plugins:{},highlightAll:function(h,S){s.highlightAllUnder(document,h,S)},highlightAllUnder:function(h,S,E){var k={callback:E,container:h,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};s.hooks.run("before-highlightall",k),k.elements=Array.prototype.slice.apply(k.container.querySelectorAll(k.selector)),s.hooks.run("before-all-elements-highlight",k);for(var x=0,C;C=k.elements[x++];)s.highlightElement(C,S===!0,k.callback)},highlightElement:function(h,S,E){var k=s.util.getLanguage(h),x=s.languages[k];s.util.setLanguage(h,k);var C=h.parentElement;C&&C.nodeName.toLowerCase()==="pre"&&s.util.setLanguage(C,k);var _=h.textContent,R={element:h,language:k,grammar:x,code:_};function T(D){R.highlightedCode=D,s.hooks.run("before-insert",R),R.element.innerHTML=R.highlightedCode,s.hooks.run("after-highlight",R),s.hooks.run("complete",R),E&&E.call(R.element)}if(s.hooks.run("before-sanity-check",R),C=R.element.parentElement,C&&C.nodeName.toLowerCase()==="pre"&&!C.hasAttribute("tabindex")&&C.setAttribute("tabindex","0"),!R.code){s.hooks.run("complete",R),E&&E.call(R.element);return}if(s.hooks.run("before-highlight",R),!R.grammar){T(s.util.encode(R.code));return}if(S&&r.Worker){var L=new Worker(s.filename);L.onmessage=function(D){T(D.data)},L.postMessage(JSON.stringify({language:R.language,code:R.code,immediateClose:!0}))}else T(s.highlight(R.code,R.grammar,R.language))},highlight:function(h,S,E){var k={code:h,grammar:S,language:E};if(s.hooks.run("before-tokenize",k),!k.grammar)throw new Error('The language "'+k.language+'" has no grammar.');return k.tokens=s.tokenize(k.code,k.grammar),s.hooks.run("after-tokenize",k),l.stringify(s.util.encode(k.tokens),k.language)},tokenize:function(h,S){var E=S.rest;if(E){for(var k in E)S[k]=E[k];delete S.rest}var x=new d;return g(x,x.head,h),u(h,x,S,x.head,0),b(x)},hooks:{all:{},add:function(h,S){var E=s.hooks.all;E[h]=E[h]||[],E[h].push(S)},run:function(h,S){var E=s.hooks.all[h];if(!(!E||!E.length))for(var k=0,x;x=E[k++];)x(S)}},Token:l};r.Prism=s;function l(h,S,E,k){this.type=h,this.content=S,this.alias=E,this.length=(k||"").length|0}l.stringify=function h(S,E){if(typeof S=="string")return S;if(Array.isArray(S)){var k="";return S.forEach(function(T){k+=h(T,E)}),k}var x={type:S.type,content:h(S.content,E),tag:"span",classes:["token",S.type],attributes:{},language:E},C=S.alias;C&&(Array.isArray(C)?Array.prototype.push.apply(x.classes,C):x.classes.push(C)),s.hooks.run("wrap",x);var _="";for(var R in x.attributes)_+=" "+R+'="'+(x.attributes[R]||"").replace(/"/g,""")+'"';return"<"+x.tag+' class="'+x.classes.join(" ")+'"'+_+">"+x.content+""};function c(h,S,E,k){h.lastIndex=S;var x=h.exec(E);if(x&&k&&x[1]){var C=x[1].length;x.index+=C,x[0]=x[0].slice(C)}return x}function u(h,S,E,k,x,C){for(var _ in E)if(!(!E.hasOwnProperty(_)||!E[_])){var R=E[_];R=Array.isArray(R)?R:[R];for(var T=0;T=C.reach);O+=j.value.length,j=j.next){var A=j.value;if(S.length>h.length)return;if(!(A instanceof l)){var V=1,P;if(z){if(P=c(X,O,h,H),!P||P.index>=h.length)break;var ne=P.index,N=P.index+P[0].length,K=O;for(K+=j.value.length;ne>=K;)j=j.next,K+=j.value.length;if(K-=j.value.length,O=K,j.value instanceof l)continue;for(var ae=j;ae!==S.tail&&(KC.reach&&(C.reach=re);var Ee=j.prev;pe&&(Ee=g(S,Ee,pe),O+=pe.length),m(S,Ee,V);var ke=new l(_,D?s.tokenize(Q,D):Q,M,Q);if(j=g(S,Ee,ke),he&&g(S,j,he),V>1){var We={cause:_+","+T,reach:re};u(h,S,E,j.prev,O,We),C&&We.reach>C.reach&&(C.reach=We.reach)}}}}}}function d(){var h={value:null,prev:null,next:null},S={value:null,prev:h,next:null};h.next=S,this.head=h,this.tail=S,this.length=0}function g(h,S,E){var k=S.next,x={value:E,prev:S,next:k};return S.next=x,k.prev=x,h.length++,x}function m(h,S,E){for(var k=S.next,x=0;x/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},n.languages.markup.tag.inside["attr-value"].inside.entity=n.languages.markup.entity,n.languages.markup.doctype.inside["internal-subset"].inside=n.languages.markup,n.hooks.add("wrap",function(r){r.type==="entity"&&(r.attributes.title=r.content.replace(/&/,"&"))}),Object.defineProperty(n.languages.markup.tag,"addInlined",{value:function(a,o){var i={};i["language-"+o]={pattern:/(^$)/i,lookbehind:!0,inside:n.languages[o]},i.cdata=/^$/i;var s={"included-cdata":{pattern://i,inside:i}};s["language-"+o]={pattern:/[\s\S]+/,inside:n.languages[o]};var l={};l[a]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:s},n.languages.insertBefore("markup","cdata",l)}}),Object.defineProperty(n.languages.markup.tag,"addAttribute",{value:function(r,a){n.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+r+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[a,"language-"+a],inside:n.languages[a]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),n.languages.html=n.languages.markup,n.languages.mathml=n.languages.markup,n.languages.svg=n.languages.markup,n.languages.xml=n.languages.extend("markup",{}),n.languages.ssml=n.languages.xml,n.languages.atom=n.languages.xml,n.languages.rss=n.languages.xml,function(r){var a=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;r.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+a.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+a.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+a.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+a.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:a,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},r.languages.css.atrule.inside.rest=r.languages.css;var o=r.languages.markup;o&&(o.tag.addInlined("style","css"),o.tag.addAttribute("style","css"))}(n),n.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},n.languages.javascript=n.languages.extend("clike",{"class-name":[n.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+(/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source)+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),n.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,n.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:n.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:n.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:n.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:n.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:n.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),n.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:n.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),n.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),n.languages.markup&&(n.languages.markup.tag.addInlined("script","javascript"),n.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),n.languages.js=n.languages.javascript,function(){if(typeof n>"u"||typeof document>"u")return;Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var r="Loading…",a=function(y,w){return"✖ Error "+y+" while fetching file: "+w},o="✖ Error: File does not exist or is empty",i={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},s="data-src-status",l="loading",c="loaded",u="failed",d="pre[data-src]:not(["+s+'="'+c+'"]):not(['+s+'="'+l+'"])';function g(y,w,v){var h=new XMLHttpRequest;h.open("GET",y,!0),h.onreadystatechange=function(){h.readyState==4&&(h.status<400&&h.responseText?w(h.responseText):h.status>=400?v(a(h.status,h.statusText)):v(o))},h.send(null)}function m(y){var w=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(y||"");if(w){var v=Number(w[1]),h=w[2],S=w[3];return h?S?[v,Number(S)]:[v,void 0]:[v,v]}}n.hooks.add("before-highlightall",function(y){y.selector+=", "+d}),n.hooks.add("before-sanity-check",function(y){var w=y.element;if(w.matches(d)){y.code="",w.setAttribute(s,l);var v=w.appendChild(document.createElement("CODE"));v.textContent=r;var h=w.getAttribute("data-src"),S=y.language;if(S==="none"){var E=(/\.(\w+)$/.exec(h)||[,"none"])[1];S=i[E]||E}n.util.setLanguage(v,S),n.util.setLanguage(w,S);var k=n.plugins.autoloader;k&&k.loadLanguages(S),g(h,function(x){w.setAttribute(s,c);var C=m(w.getAttribute("data-range"));if(C){var _=x.split(/\r\n?|\n/g),R=C[0],T=C[1]==null?_.length:C[1];R<0&&(R+=_.length),R=Math.max(0,Math.min(R-1,_.length)),T<0&&(T+=_.length),T=Math.max(0,Math.min(T,_.length)),x=_.slice(R,T).join(` -`),w.hasAttribute("data-start")||w.setAttribute("data-start",String(R+1))}v.textContent=x,n.highlightElement(v)},function(x){w.setAttribute(s,u),v.textContent=x})}}),n.plugins.fileHighlight={highlight:function(w){for(var v=(w||document).querySelectorAll(d),h=0,S;S=v[h++];)n.highlightElement(S)}};var b=!1;n.fileHighlight=function(){b||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),b=!0),n.plugins.fileHighlight.highlight.apply(this,arguments)}}()})(kU);var V3=kU.exports;Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/};Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python;Prism.languages.py=Prism.languages.python;var CU={},n_e=nn&&nn.__extends||function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,a){r.__proto__=a}||function(r,a){for(var o in a)Object.prototype.hasOwnProperty.call(a,o)&&(r[o]=a[o])},e(t,n)};return function(t,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}}(),fn=nn&&nn.__assign||function(){return fn=Object.assign||function(e){for(var t,n=1,r=arguments.length;n-1){n._history.stack=c.slice(0,u+1);var d=n._history.stack.length;if(d>Y3){var g=d-Y3;n._history.stack=c.slice(g,d),n._history.offset=Math.max(n._history.offset-g,0)}}var m=Date.now();if(a){var b=n._history.stack[n._history.offset];if(b&&m-b.timestamp=y&&H<=w&&D.startsWith(m)?D.substring(m.length):D}).join(` -`);if(u!==v){var h=b[y];n._applyEdits({value:v,selectionStart:h!=null&&h.startsWith(m)?d-m.length:d,selectionEnd:g-(u.length-v.length)})}}else if(d!==g){var b=n._getLines(u,d),S=b.length-1,E=n._getLines(u,g).length-1,h=b[S];n._applyEdits({value:u.split(` -`).map(function(z,M){return M>=S&&M<=E?m+z:z}).join(` -`),selectionStart:h&&/\S/.test(h)?d+m.length:d,selectionEnd:g+m.length*(E-S+1)})}else{var k=d+m.length;n._applyEdits({value:u.substring(0,d)+m+u.substring(g),selectionStart:k,selectionEnd:k})}else if(r.keyCode===c_e){var x=d!==g,C=u.substring(0,d);if(C.endsWith(m)&&!x){r.preventDefault();var k=d-m.length;n._applyEdits({value:u.substring(0,d-m.length)+u.substring(g),selectionStart:k,selectionEnd:k})}}else if(r.keyCode===s_e){if(d===g){var _=n._getLines(u,d).pop(),R=_==null?void 0:_.match(/^\s+/);if(R!=null&&R[0]){r.preventDefault();var T=` -`+R[0],k=d+T.length;n._applyEdits({value:u.substring(0,d)+T+u.substring(g),selectionStart:k,selectionEnd:k})}}}else if(r.keyCode===q3||r.keyCode===G3||r.keyCode===W3||r.keyCode===K3){var L=void 0;r.keyCode===q3&&r.shiftKey?L=["(",")"]:r.keyCode===G3?r.shiftKey?L=["{","}"]:L=["[","]"]:r.keyCode===W3?r.shiftKey?L=['"','"']:L=["'","'"]:r.keyCode===K3&&!r.shiftKey&&(L=["`","`"]),d!==g&&L&&(r.preventDefault(),n._applyEdits({value:u.substring(0,d)+L[0]+u.substring(d,g)+L[1]+u.substring(g),selectionStart:d,selectionEnd:g+2}))}else(_x?r.metaKey&&r.keyCode===Ep:r.ctrlKey&&r.keyCode===Ep)&&!r.shiftKey&&!r.altKey?(r.preventDefault(),n._undoEdit()):(_x?r.metaKey&&r.keyCode===Ep&&r.shiftKey:g_e?r.ctrlKey&&r.keyCode===u_e:r.ctrlKey&&r.keyCode===Ep&&r.shiftKey)&&!r.altKey?(r.preventDefault(),n._redoEdit()):r.keyCode===d_e&&r.ctrlKey&&(!_x||r.shiftKey)&&(r.preventDefault(),n.setState(function(D){return{capture:!D.capture}}))}},n._handleChange=function(r){var a=r.currentTarget,o=a.value,i=a.selectionStart,s=a.selectionEnd;n._recordChange({value:o,selectionStart:i,selectionEnd:s},!0),n.props.onValueChange(o)},n._history={stack:[],offset:-1},n._input=null,n}return t.prototype.componentDidMount=function(){this._recordCurrentState()},Object.defineProperty(t.prototype,"session",{get:function(){return{history:this._history}},set:function(n){this._history=n.history},enumerable:!1,configurable:!0}),t.prototype.render=function(){var n=this,r=this.props,a=r.value,o=r.style,i=r.padding,s=r.highlight,l=r.textareaId,c=r.textareaClassName,u=r.autoFocus,d=r.disabled,g=r.form,m=r.maxLength,b=r.minLength,y=r.name,w=r.placeholder,v=r.readOnly,h=r.required,S=r.onClick,E=r.onFocus,k=r.onBlur,x=r.onKeyUp;r.onKeyDown,r.onValueChange,r.tabSize,r.insertSpaces,r.ignoreTabKey;var C=r.preClassName,_=i_e(r,["value","style","padding","highlight","textareaId","textareaClassName","autoFocus","disabled","form","maxLength","minLength","name","placeholder","readOnly","required","onClick","onFocus","onBlur","onKeyUp","onKeyDown","onValueChange","tabSize","insertSpaces","ignoreTabKey","preClassName"]),R={paddingTop:typeof i=="object"?i.top:i,paddingRight:typeof i=="object"?i.right:i,paddingBottom:typeof i=="object"?i.bottom:i,paddingLeft:typeof i=="object"?i.left:i},T=s(a);return vu.createElement("div",fn({},_,{style:fn(fn({},Su.container),o)}),vu.createElement("pre",fn({className:C,"aria-hidden":"true",style:fn(fn(fn({},Su.editor),Su.highlight),R)},typeof T=="string"?{dangerouslySetInnerHTML:{__html:T+"
"}}:{children:T})),vu.createElement("textarea",{ref:function(L){return n._input=L},style:fn(fn(fn({},Su.editor),Su.textarea),R),className:Jp+(c?" ".concat(c):""),id:l,value:a,onChange:this._handleChange,onKeyDown:this._handleKeyDown,onClick:S,onKeyUp:x,onFocus:E,onBlur:k,disabled:d,form:g,maxLength:m,minLength:b,name:y,placeholder:w,readOnly:v,required:h,autoFocus:u,autoCapitalize:"off",autoComplete:"off",autoCorrect:"off",spellCheck:!1,"data-gramm":!1}),vu.createElement("style",{dangerouslySetInnerHTML:{__html:m_e}}))},t.defaultProps={tabSize:2,insertSpaces:!0,ignoreTabKey:!1,padding:0},t}(vu.Component),b_e=CU.default=h_e,Su={container:{position:"relative",textAlign:"left",boxSizing:"border-box",padding:0,overflow:"hidden"},textarea:{position:"absolute",top:0,left:0,height:"100%",width:"100%",resize:"none",color:"inherit",overflow:"hidden",MozOsxFontSmoothing:"grayscale",WebkitFontSmoothing:"antialiased",WebkitTextFillColor:"transparent"},highlight:{position:"relative",pointerEvents:"none"},editor:{margin:0,border:0,background:"none",boxSizing:"inherit",display:"inherit",fontFamily:"inherit",fontSize:"inherit",fontStyle:"inherit",fontVariantLigatures:"inherit",fontWeight:"inherit",letterSpacing:"inherit",lineHeight:"inherit",tabSize:"inherit",textIndent:"inherit",textRendering:"inherit",textTransform:"inherit",whiteSpace:"pre-wrap",wordBreak:"keep-all",overflowWrap:"break-word"}};const _U=({ref:e,value:t,onChange:n})=>f.jsx(b_e,{ref:e,className:"min-h-96 rounded-md border border-input bg-gray-800 text-gray-100 has-[:disabled]:opacity-50",textareaClassName:"focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50",value:t,onValueChange:n,highlight:r=>V3.highlight(r,V3.languages.py,"py"),padding:10,style:{fontFamily:'"Fira code", "Fira Mono", monospace',fontSize:12}}),y_e=Xe({name:Ce().min(1,{message:"Name must be at least 1 character."}).max(30,{message:"Name must not be longer than 30 characters."}),code:Ce()}),v_e={name:"",code:`import random - -def roll_d20(self) -> str: - """ - Simulate the roll of a 20-sided die (d20). - - This function generates a random integer between 1 and 20, inclusive, - which represents the outcome of a single roll of a d20. - - Returns: - int: A random integer between 1 and 20, representing the die roll. - - Example: - >>> roll_d20() - 15 # This is an example output and may vary each time the function is called. - """ - dice_role_outcome = random.randint(1, 20) - output_string = f"You rolled a {dice_role_outcome}" - return output_string`};function S_e({closeDialog:e}){const t=lX(),n=Bt(),{toast:r}=An(),a=bn({resolver:yn(y_e),defaultValues:v_e,mode:"onChange"}),o=i=>{t.mutate({requestBody:{name:i.name,tags:[],source_code:i.code}},{onSuccess:()=>{n.invalidateQueries({queryKey:g_()}),e(),r({title:"Tool created successfully!",duration:5e3})},onError:s=>{r({title:"Error creating tool",duration:5e3})}})};return f.jsx(vn,{...a,children:f.jsxs("form",{onSubmit:a.handleSubmit(o,i=>console.log(i)),className:"space-y-8",children:[f.jsx(ut,{control:a.control,name:"name",render:({field:i})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Name"}),f.jsx(pt,{children:f.jsx(_n,{...i})}),f.jsx(Mt,{children:"This is your tools display name. It can be a real name or a pseudonym."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:a.control,name:"code",render:({field:i})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Source Code"}),f.jsx(pt,{children:f.jsx(_U,{...i})}),f.jsx(Mt,{children:"Write the source code for your tool. Custom tools must be valid Python code, and all arguments must be type annotated, and you must include a docstring."}),f.jsx(lt,{})]})}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Create Tool"}),t.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Creating Tool..."})]})]})]})})}const w_e=({open:e,onOpenChange:t})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full overflow-y-auto sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Create Tool"}),f.jsx(dn,{children:"Add a new tool here. Click create when you're done."})]}),f.jsx(S_e,{closeDialog:()=>t(!1)})]})}),E_e=Xe({source_code:Ce()});function x_e({tool:e,closeDialog:t}){const n=fX(),r=Bt(),{toast:a}=An(),o={...e},i=bn({resolver:yn(E_e),defaultValues:o,mode:"onChange"}),s=l=>{n.mutate({toolId:e.id||"",requestBody:{id:e.id||"",source_code:l.source_code}},{onSuccess:()=>{t(),r.invalidateQueries({queryKey:g_()}),a({title:"Tool updated successfully!",duration:5e3})},onError:c=>{a({title:"Error updating tool",duration:5e3})}})};return f.jsx(vn,{...i,children:f.jsxs("form",{onSubmit:i.handleSubmit(s,l=>console.log(l)),className:"space-y-8",children:[f.jsx(ut,{control:i.control,name:"source_code",render:({field:l})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Source Code"}),f.jsx(pt,{children:f.jsx(_U,{...l})}),f.jsx(lt,{})]})}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Update Tool"}),n.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Updating Tool..."})]})]})]})})}const k_e=({tool:e,open:t,onOpenChange:n})=>f.jsx(Kt,{open:t,onOpenChange:n,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full overflow-y-auto sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsxs($t,{children:["Edit ",(e==null?void 0:e.name)??"Tool"]}),f.jsx(dn,{children:"Edit existing tool here. Click create when you're done."})]}),e?f.jsx(x_e,{tool:e,closeDialog:()=>n(!1)}):f.jsx("p",{children:"No Tool...."})]})}),C_e=({value:e,onValueChange:t})=>f.jsx("form",{children:f.jsxs("div",{className:"relative",children:[f.jsx(Ms,{className:"pointer-events-none absolute left-[12px] top-3 h-4 w-4 text-muted-foreground"}),f.jsx(_n,{placeholder:"Search tool",value:e,onChange:n=>t(n.target.value),className:"w-52 pl-8 lg:w-80"})]})}),__e=(e,t)=>[{accessorKey:"edit",header:"",size:20,cell:({row:n})=>t?f.jsx(Pi,{className:"h-6 w-6"}):f.jsx(ue,{onClick:()=>e(n.original),className:"!h-6 !w-6 !p-1",variant:"ghost",children:f.jsx(Fm,{className:"h-3.5 w-3.5"})})},{accessorKey:"name",header:"Name",cell:({row:n})=>f.jsx(Dn,{isLoading:t,children:n.getValue("name")})},{accessorFn:n=>{var r;return(r=n.json_schema)==null?void 0:r.description},accessorKey:"docstring",header:"Docstring",cell:({row:n})=>f.jsx(Dn,{isLoading:t,children:f.jsx(ZA,{text:n.getValue("docstring")})})},{accessorFn:n=>{var r,a;return(a=(r=n.tags)==null?void 0:r[0])==null?void 0:a.replace("memgpt-","")},accessorKey:"library",header:"Library",cell:({row:n})=>{const r=n.getValue("library");return f.jsx(Dn,{isLoading:t,children:r==="base"?f.jsx(b9,{className:"-ml-2",variant:"secondary",children:r}):f.jsx("span",{className:"text-xs",children:r})})}},{accessorKey:"last_edited",header:"Last Edited",cell:({row:n})=>f.jsx(Dn,{isLoading:t,children:n.getValue("last_edited")??"Never"})}],A_e=({onToolEdit:e,nameFilter:t,className:n})=>{const{data:r,isError:a,isLoading:o}=Xm(),i=(r??[]).filter(s=>s.name.includes(t));return f.jsx("div",{className:n,children:f.jsx(uf,{columns:__e(e,o),isLoading:o,error:a?"Error loading tools":void 0,data:i,renderPagination:s=>f.jsx(df,{className:"mt-4",table:s})})})},T_e=()=>{const[e,t]=p.useState(""),[n]=Oh(e,300),[r,a]=p.useState(!1),[o,i]=p.useState(null),[s,l]=p.useState(!1),c=u=>{i(u),l(!0)};return f.jsxs(Fs,{children:[f.jsxs("div",{className:"flex items-center justify-between bg-background/95 px-4 pb-3 pt-2.5 backdrop-blur supports-[backdrop-filter]:bg-background/60",children:[f.jsx(C_e,{value:e,onValueChange:t}),f.jsxs(ue,{onClick:()=>a(!0),size:"sm",children:[f.jsx(ya,{className:"mr-2 h-4 w-4"}),"Create Tool"]})]}),f.jsx(A_e,{className:"mx-4",onToolEdit:c,nameFilter:n}),f.jsx(w_e,{open:r,onOpenChange:u=>a(u)}),f.jsx(k_e,{tool:o,open:s,onOpenChange:u=>l(u)})]})},R_e={path:"tools",element:f.jsx(T_e,{})},N_e=Xe({name:Ce().min(1,{message:"Name must be at least 1 character."}).max(30,{message:"Name must not be longer than 30 characters."}),text:Ce().max(2e3).min(0)}),I_e={name:"",text:""};function O_e({closeDialog:e}){const t=Bt(),n=_6(),{toast:r}=An(),a=2e3,o=N_e.extend({text:Ce().max(a).min(0)}),i=bn({resolver:yn(o),defaultValues:I_e,mode:"onChange"}),s=l=>{n.mutate({requestBody:{value:l.text||"",label:fr,name:l.name||""}},{onSuccess:()=>{e(),t.invalidateQueries({queryKey:lf({label:fr})}),r({title:"Human created successfully!",duration:5e3})},onError:c=>{let u="Error creating human";const d=`${u}: Unspecified error.`;try{r({title:"Error updating human",duration:5e3})}catch{u=d}r({title:u,duration:5e3})}})};return f.jsx(vn,{...i,children:f.jsxs("form",{onSubmit:i.handleSubmit(s,l=>console.log(l)),className:"space-y-8",children:[f.jsx(ut,{control:i.control,name:"name",render:({field:l})=>f.jsxs(ot,{children:[f.jsx(yt,{children:"Name"}),f.jsx(pt,{children:f.jsx(_n,{...l})}),f.jsx(Mt,{children:"This is your humans display name. It can be a real name or a pseudonym."}),f.jsx(lt,{})]})}),f.jsx(ut,{control:i.control,name:"text",render:({field:l})=>{var c;return f.jsxs(ot,{children:[f.jsx(pt,{children:f.jsx(Ai,{placeholder:"Describe your human here",...l,charCount:(c=l.value)==null?void 0:c.length,limit:a})}),f.jsxs(Mt,{children:["You can use no more than ",a," characters."]}),f.jsx(lt,{})]})}}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Create Persona"}),n.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Creating Persona..."})]})]})]})})}const D_e=({open:e,onOpenChange:t})=>f.jsx(Kt,{open:e,onOpenChange:t,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsx($t,{children:"Create Human"}),f.jsx(dn,{children:"Add a new human here. Click create when you're done."})]}),f.jsx(O_e,{closeDialog:()=>t(!1)})]})}),L_e=Xe({text:Ce().max(2e3).min(0)});function M_e({human:e,closeDialog:t}){const n=v_(),r=Bt(),{toast:a}=An(),o=2e3,i=L_e.extend({text:Ce().max(o).min(0)}),s={text:e.value||""},l=bn({resolver:yn(i),defaultValues:s,mode:"onChange"}),c=u=>{n.mutate({blockId:e.id||"",requestBody:{id:e.id||"",value:u.text||""}},{onSuccess:()=>{t(),r.invalidateQueries({queryKey:lf({label:fr})}),a({title:"Human updated successfully!",duration:5e3})},onError:d=>{a({title:"Error updating human",duration:5e3})}})};return f.jsx(vn,{...l,children:f.jsxs("form",{onSubmit:l.handleSubmit(c,u=>console.log(u)),className:"space-y-8",children:[f.jsx(ut,{control:l.control,name:"text",render:({field:u})=>{var d;return f.jsxs(ot,{children:[f.jsx(pt,{children:f.jsx(Ai,{placeholder:"Describe your human here",...u,charCount:(d=u.value)==null?void 0:d.length,limit:o})}),f.jsxs(Mt,{children:["You can use no more than ",o," characters."]}),f.jsx(lt,{})]})}}),f.jsxs("div",{className:"flex items-center",children:[f.jsx(ue,{type:"submit",children:"Update Persona"}),n.isPending&&f.jsxs("div",{className:Tt("ml-4 flex items-center animate-in slide-in-from-bottom-2"),children:[f.jsx(un,{className:"mr-2 h-4 w-4 animate-spin "}),f.jsx("span",{children:"Updating Human..."})]})]})]})})}const P_e=({human:e,open:t,onOpenChange:n})=>f.jsx(Kt,{open:t,onOpenChange:n,children:f.jsxs(Ht,{className:"max-h-[95svh] w-full sm:max-w-[800px]",children:[f.jsxs(Pt,{children:[f.jsxs($t,{children:["Edit ",(e==null?void 0:e.name)??"Human"]}),f.jsx(dn,{children:"Edit existing human here. Click create when you're done."})]}),e?f.jsx(M_e,{human:e,closeDialog:()=>n(!1)}):f.jsx("p",{children:"No Human...."})]})}),$_e=({value:e,onValueChange:t})=>f.jsx("form",{children:f.jsxs("div",{className:"relative",children:[f.jsx(Ms,{className:"pointer-events-none absolute left-[12px] top-3 h-4 w-4 text-muted-foreground"}),f.jsx(_n,{placeholder:"Search user",value:e,onChange:n=>t(n.target.value),className:"w-52 pl-8 lg:w-80"})]})}),F_e=(e,t)=>[{accessorKey:"edit",header:"",size:20,cell:({row:n})=>t?f.jsx(Pi,{className:"h-6 w-6"}):f.jsx(ue,{onClick:()=>e(n.original),className:"!h-6 !w-6 !p-1",variant:"ghost",children:f.jsx(Fm,{className:"h-3.5 w-3.5"})})},{accessorKey:"name",header:"Name",cell:({row:n})=>f.jsx(Dn,{isLoading:t,children:n.getValue("name")})},{accessorKey:"value",header:"Text",cell:({row:n})=>f.jsx(Dn,{isLoading:t,children:f.jsx(ZA,{text:n.getValue("value")})})}],j_e=({onHumanEdit:e,nameFilter:t,className:n})=>{const{data:r,isError:a,isLoading:o}=Ng({label:fr}),i=(r??[]).filter(s=>{var l;return(l=s.name)==null?void 0:l.includes(t)});return f.jsx("div",{className:n,children:f.jsx(uf,{isLoading:o,error:a?"Error loading humans":void 0,columns:F_e(e,o),data:i,renderPagination:s=>f.jsx(df,{className:"mt-4",table:s})})})},z_e=()=>{const[e,t]=p.useState(""),[n]=Oh(e,300),[r,a]=p.useState(!1),[o,i]=p.useState(null),[s,l]=p.useState(!1),c=u=>{i(u),l(!0)};return f.jsxs(Fs,{children:[f.jsxs("div",{className:"flex items-center justify-between bg-background/95 px-4 pb-3 pt-2.5 backdrop-blur supports-[backdrop-filter]:bg-background/60",children:[f.jsx($_e,{value:e,onValueChange:t}),f.jsxs(ue,{onClick:()=>a(!0),size:"sm",children:[f.jsx(ya,{className:"mr-2 h-4 w-4"}),"Create Human"]})]}),f.jsx(j_e,{onHumanEdit:c,nameFilter:n,className:"mx-4"}),f.jsx(D_e,{open:r,onOpenChange:u=>a(u)}),f.jsx(P_e,{human:o,open:s,onOpenChange:u=>l(u)})]})},U_e={path:"human-templates",element:f.jsx(z_e,{})},{createElement:Ac,createContext:B_e,createRef:vTe,forwardRef:AU,useCallback:hr,useContext:TU,useEffect:ys,useImperativeHandle:RU,useLayoutEffect:H_e,useMemo:V_e,useRef:ar,useState:Zu}=Kd,Z3=Kd["useId".toString()],q_e=H_e,Lh=B_e(null);Lh.displayName="PanelGroupContext";const vs=q_e,G_e=typeof Z3=="function"?Z3:()=>null;let W_e=0;function XA(e=null){const t=G_e(),n=ar(e||t||null);return n.current===null&&(n.current=""+W_e++),e??n.current}function NU({children:e,className:t="",collapsedSize:n,collapsible:r,defaultSize:a,forwardedRef:o,id:i,maxSize:s,minSize:l,onCollapse:c,onExpand:u,onResize:d,order:g,style:m,tagName:b="div",...y}){const w=TU(Lh);if(w===null)throw Error("Panel components must be rendered within a PanelGroup container");const{collapsePanel:v,expandPanel:h,getPanelSize:S,getPanelStyle:E,groupId:k,isPanelCollapsed:x,reevaluatePanelConstraints:C,registerPanel:_,resizePanel:R,unregisterPanel:T}=w,L=XA(i),D=ar({callbacks:{onCollapse:c,onExpand:u,onResize:d},constraints:{collapsedSize:n,collapsible:r,defaultSize:a,maxSize:s,minSize:l},id:L,idIsFromProps:i!==void 0,order:g});ar({didLogMissingDefaultSizeWarning:!1}),vs(()=>{const{callbacks:z,constraints:M}=D.current,U={...M};D.current.id=L,D.current.idIsFromProps=i!==void 0,D.current.order=g,z.onCollapse=c,z.onExpand=u,z.onResize=d,M.collapsedSize=n,M.collapsible=r,M.defaultSize=a,M.maxSize=s,M.minSize=l,(U.collapsedSize!==M.collapsedSize||U.collapsible!==M.collapsible||U.maxSize!==M.maxSize||U.minSize!==M.minSize)&&C(D.current,U)}),vs(()=>{const z=D.current;return _(z),()=>{T(z)}},[g,L,_,T]),RU(o,()=>({collapse:()=>{v(D.current)},expand:()=>{h(D.current)},getId(){return L},getSize(){return S(D.current)},isCollapsed(){return x(D.current)},isExpanded(){return!x(D.current)},resize:z=>{R(D.current,z)}}),[v,h,S,x,L,R]);const H=E(D.current,a);return Ac(b,{...y,children:e,className:t,id:i,style:{...H,...m},"data-panel":"","data-panel-collapsible":r||void 0,"data-panel-group-id":k,"data-panel-id":L,"data-panel-size":parseFloat(""+H.flexGrow).toFixed(1)})}const IU=AU((e,t)=>Ac(NU,{...e,forwardedRef:t}));NU.displayName="Panel";IU.displayName="forwardRef(Panel)";let Wk=null,is=null;function K_e(e,t){if(t){const n=(t&PU)!==0,r=(t&$U)!==0,a=(t&FU)!==0,o=(t&jU)!==0;if(n)return a?"se-resize":o?"ne-resize":"e-resize";if(r)return a?"sw-resize":o?"nw-resize":"w-resize";if(a)return"s-resize";if(o)return"n-resize"}switch(e){case"horizontal":return"ew-resize";case"intersection":return"move";case"vertical":return"ns-resize"}}function Y_e(){is!==null&&(document.head.removeChild(is),Wk=null,is=null)}function Ax(e,t){const n=K_e(e,t);Wk!==n&&(Wk=n,is===null&&(is=document.createElement("style"),document.head.appendChild(is)),is.innerHTML=`*{cursor: ${n}!important;}`)}function OU(e){return e.type==="keydown"}function DU(e){return e.type.startsWith("mouse")}function LU(e){return e.type.startsWith("touch")}function Mh(e){if(DU(e))return{x:e.pageX,y:e.pageY};if(LU(e)){const t=e.touches[0];if(t&&t.pageX&&t.pageY)return{x:t.pageX,y:t.pageY}}return{x:1/0,y:1/0}}function Z_e(){if(typeof matchMedia=="function")return matchMedia("(pointer:coarse)").matches?"coarse":"fine"}function X_e(e,t,n){return n?e.xt.x&&e.yt.y:e.x<=t.x+t.width&&e.x+e.width>=t.x&&e.y<=t.y+t.height&&e.y+e.height>=t.y}function Q_e(e,t){if(e===t)throw new Error("Cannot compare node with itself");const n={a:J3(e),b:J3(t)};let r;for(;n.a.at(-1)===n.b.at(-1);)e=n.a.pop(),t=n.b.pop(),r=e;Ye(r);const a={a:Q3(X3(n.a)),b:Q3(X3(n.b))};if(a.a===a.b){const o=r.childNodes,i={a:n.a.at(-1),b:n.b.at(-1)};let s=o.length;for(;s--;){const l=o[s];if(l===i.a)return 1;if(l===i.b)return-1}}return Math.sign(a.a-a.b)}const J_e=/\b(?:position|zIndex|opacity|transform|webkitTransform|mixBlendMode|filter|webkitFilter|isolation)\b/;function eAe(e){const t=getComputedStyle(MU(e)).display;return t==="flex"||t==="inline-flex"}function tAe(e){const t=getComputedStyle(e);return!!(t.position==="fixed"||t.zIndex!=="auto"&&(t.position!=="static"||eAe(e))||+t.opacity<1||"transform"in t&&t.transform!=="none"||"webkitTransform"in t&&t.webkitTransform!=="none"||"mixBlendMode"in t&&t.mixBlendMode!=="normal"||"filter"in t&&t.filter!=="none"||"webkitFilter"in t&&t.webkitFilter!=="none"||"isolation"in t&&t.isolation==="isolate"||J_e.test(t.willChange)||t.webkitOverflowScrolling==="touch")}function X3(e){let t=e.length;for(;t--;){const n=e[t];if(Ye(n),tAe(n))return n}return null}function Q3(e){return e&&Number(getComputedStyle(e).zIndex)||0}function J3(e){const t=[];for(;e;)t.push(e),e=MU(e);return t}function MU(e){var t;return((t=e.parentNode)===null||t===void 0?void 0:t.host)||e.parentNode}const PU=1,$U=2,FU=4,jU=8,nAe=Z_e()==="coarse";let Ri=[],Ph=!1,Yo=new Map,$h=new Map;const Id=new Set;function rAe(e,t,n,r,a){var o;const{ownerDocument:i}=t,s={direction:n,element:t,hitAreaMargins:r,setResizeHandlerState:a},l=(o=Yo.get(i))!==null&&o!==void 0?o:0;return Yo.set(i,l+1),Id.add(s),um(),function(){var u;$h.delete(e),Id.delete(s);const d=(u=Yo.get(i))!==null&&u!==void 0?u:1;Yo.set(i,d-1),um(),d===1&&Yo.delete(i)}}function xp(e){const{target:t}=e,{x:n,y:r}=Mh(e);Ph=!0,QA({target:t,x:n,y:r}),um(),Ri.length>0&&(JA("down",e),e.preventDefault())}function jo(e){const{x:t,y:n}=Mh(e);if(!Ph){const{target:r}=e;QA({target:r,x:t,y:n})}JA("move",e),zU(),Ri.length>0&&e.preventDefault()}function zo(e){const{target:t}=e,{x:n,y:r}=Mh(e);$h.clear(),Ph=!1,Ri.length>0&&e.preventDefault(),JA("up",e),QA({target:t,x:n,y:r}),zU(),um()}function QA({target:e,x:t,y:n}){Ri.splice(0);let r=null;e instanceof HTMLElement&&(r=e),Id.forEach(a=>{const{element:o,hitAreaMargins:i}=a,s=o.getBoundingClientRect(),{bottom:l,left:c,right:u,top:d}=s,g=nAe?i.coarse:i.fine;if(t>=c-g&&t<=u+g&&n>=d-g&&n<=l+g){if(r!==null&&o!==r&&!o.contains(r)&&!r.contains(o)&&Q_e(r,o)>0){let b=r,y=!1;for(;b&&!b.contains(o);){if(X_e(b.getBoundingClientRect(),s,!0)){y=!0;break}b=b.parentElement}if(y)return}Ri.push(a)}})}function Tx(e,t){$h.set(e,t)}function zU(){let e=!1,t=!1;Ri.forEach(r=>{const{direction:a}=r;a==="horizontal"?e=!0:t=!0});let n=0;$h.forEach(r=>{n|=r}),e&&t?Ax("intersection",n):e?Ax("horizontal",n):t?Ax("vertical",n):Y_e()}function um(){Yo.forEach((e,t)=>{const{body:n}=t;n.removeEventListener("contextmenu",zo),n.removeEventListener("mousedown",xp),n.removeEventListener("mouseleave",jo),n.removeEventListener("mousemove",jo),n.removeEventListener("touchmove",jo),n.removeEventListener("touchstart",xp)}),window.removeEventListener("mouseup",zo),window.removeEventListener("touchcancel",zo),window.removeEventListener("touchend",zo),Id.size>0&&(Ph?(Ri.length>0&&Yo.forEach((e,t)=>{const{body:n}=t;e>0&&(n.addEventListener("contextmenu",zo),n.addEventListener("mouseleave",jo),n.addEventListener("mousemove",jo),n.addEventListener("touchmove",jo,{passive:!1}))}),window.addEventListener("mouseup",zo),window.addEventListener("touchcancel",zo),window.addEventListener("touchend",zo)):Yo.forEach((e,t)=>{const{body:n}=t;e>0&&(n.addEventListener("mousedown",xp),n.addEventListener("mousemove",jo),n.addEventListener("touchmove",jo,{passive:!1}),n.addEventListener("touchstart",xp))}))}function JA(e,t){Id.forEach(n=>{const{setResizeHandlerState:r}=n,a=Ri.includes(n);r(e,a,t)})}function Ye(e,t="Assertion failed!"){if(!e)throw console.error(t),Error(t)}const UU=10;function Od(e,t,n=UU){e=parseFloat(e.toFixed(n)),t=parseFloat(t.toFixed(n));const r=e-t;return r===0?0:r>0?1:-1}function vr(e,t,n){return Od(e,t,n)===0}function Dl({panelConstraints:e,panelIndex:t,size:n}){const r=e[t];Ye(r!=null);let{collapsedSize:a=0,collapsible:o,maxSize:i=100,minSize:s=0}=r;if(Od(n,s)<0)if(o){const l=(a+s)/2;Od(n,l)<0?n=a:n=s}else n=s;return n=Math.min(i,n),n=parseFloat(n.toFixed(UU)),n}function Ru({delta:e,layout:t,panelConstraints:n,pivotIndices:r,trigger:a}){if(vr(e,0))return t;const o=[...t],[i,s]=r;Ye(i!=null),Ye(s!=null);let l=0;if(a==="keyboard"){{const u=e<0?s:i,d=n[u];if(Ye(d),d.collapsible){const g=t[u];Ye(g!=null);const m=n[u];Ye(m);const{collapsedSize:b=0,minSize:y=0}=m;if(vr(g,b)){const w=y-g;Od(w,Math.abs(e))>0&&(e=e<0?0-w:w)}}}{const u=e<0?i:s,d=n[u];Ye(d);const{collapsible:g}=d;if(g){const m=t[u];Ye(m!=null);const b=n[u];Ye(b);const{collapsedSize:y=0,minSize:w=0}=b;if(vr(m,w)){const v=m-y;Od(v,Math.abs(e))>0&&(e=e<0?0-v:v)}}}}{const u=e<0?1:-1;let d=e<0?s:i,g=0;for(;;){const b=t[d];Ye(b!=null);const w=Dl({panelConstraints:n,panelIndex:d,size:100})-b;if(g+=w,d+=u,d<0||d>=n.length)break}const m=Math.min(Math.abs(e),Math.abs(g));e=e<0?0-m:m}{let d=e<0?i:s;for(;d>=0&&d=0))break;e<0?d--:d++}}if(vr(l,0))return t;{const u=e<0?s:i,d=t[u];Ye(d!=null);const g=d+l,m=Dl({panelConstraints:n,panelIndex:u,size:g});if(o[u]=m,!vr(m,g)){let b=g-m,w=e<0?s:i;for(;w>=0&&w0?w--:w++}}}const c=o.reduce((u,d)=>d+u,0);return vr(c,100)?o:t}function aAe({layout:e,panelsArray:t,pivotIndices:n}){let r=0,a=100,o=0,i=0;const s=n[0];Ye(s!=null),t.forEach((d,g)=>{const{constraints:m}=d,{maxSize:b=100,minSize:y=0}=m;g===s?(r=y,a=b):(o+=y,i+=b)});const l=Math.min(a,100-o),c=Math.max(r,100-i),u=e[s];return{valueMax:l,valueMin:c,valueNow:u}}function Dd(e,t=document){return Array.from(t.querySelectorAll(`[data-panel-resize-handle-id][data-panel-group-id="${e}"]`))}function BU(e,t,n=document){const a=Dd(e,n).findIndex(o=>o.getAttribute("data-panel-resize-handle-id")===t);return a??null}function HU(e,t,n){const r=BU(e,t,n);return r!=null?[r,r+1]:[-1,-1]}function VU(e,t=document){var n;if(t instanceof HTMLElement&&(t==null||(n=t.dataset)===null||n===void 0?void 0:n.panelGroupId)==e)return t;const r=t.querySelector(`[data-panel-group][data-panel-group-id="${e}"]`);return r||null}function Fh(e,t=document){const n=t.querySelector(`[data-panel-resize-handle-id="${e}"]`);return n||null}function oAe(e,t,n,r=document){var a,o,i,s;const l=Fh(t,r),c=Dd(e,r),u=l?c.indexOf(l):-1,d=(a=(o=n[u])===null||o===void 0?void 0:o.id)!==null&&a!==void 0?a:null,g=(i=(s=n[u+1])===null||s===void 0?void 0:s.id)!==null&&i!==void 0?i:null;return[d,g]}function iAe({committedValuesRef:e,eagerValuesRef:t,groupId:n,layout:r,panelDataArray:a,panelGroupElement:o,setLayout:i}){ar({didWarnAboutMissingResizeHandle:!1}),vs(()=>{if(!o)return;const s=Dd(n,o);for(let l=0;l{s.forEach((l,c)=>{l.removeAttribute("aria-controls"),l.removeAttribute("aria-valuemax"),l.removeAttribute("aria-valuemin"),l.removeAttribute("aria-valuenow")})}},[n,r,a,o]),ys(()=>{if(!o)return;const s=t.current;Ye(s);const{panelDataArray:l}=s,c=VU(n,o);Ye(c!=null,`No group found for id "${n}"`);const u=Dd(n,o);Ye(u);const d=u.map(g=>{const m=g.getAttribute("data-panel-resize-handle-id");Ye(m);const[b,y]=oAe(n,m,l,o);if(b==null||y==null)return()=>{};const w=v=>{if(!v.defaultPrevented)switch(v.key){case"Enter":{v.preventDefault();const h=l.findIndex(S=>S.id===b);if(h>=0){const S=l[h];Ye(S);const E=r[h],{collapsedSize:k=0,collapsible:x,minSize:C=0}=S.constraints;if(E!=null&&x){const _=Ru({delta:vr(E,k)?C-k:k-E,layout:r,panelConstraints:l.map(R=>R.constraints),pivotIndices:HU(n,m,o),trigger:"keyboard"});r!==_&&i(_)}}break}}};return g.addEventListener("keydown",w),()=>{g.removeEventListener("keydown",w)}});return()=>{d.forEach(g=>g())}},[o,e,t,n,r,a,i])}function eP(e,t){if(e.length!==t.length)return!1;for(let n=0;no.constraints);let r=0,a=100;for(let o=0;o{const o=e[a];Ye(o);const{callbacks:i,constraints:s,id:l}=o,{collapsedSize:c=0,collapsible:u}=s,d=n[l];if(d==null||r!==d){n[l]=r;const{onCollapse:g,onExpand:m,onResize:b}=i;b&&b(r,d),u&&(g||m)&&(m&&(d==null||d===c)&&r!==c&&m(),g&&(d==null||d!==c)&&r===c&&g())}})}function kp(e,t){if(e.length!==t.length)return!1;for(let n=0;n{n!==null&&clearTimeout(n),n=setTimeout(()=>{e(...a)},t)}}function tP(e){try{if(typeof localStorage<"u")e.getItem=t=>localStorage.getItem(t),e.setItem=(t,n)=>{localStorage.setItem(t,n)};else throw new Error("localStorage not supported in this environment")}catch(t){console.error(t),e.getItem=()=>null,e.setItem=()=>{}}}function GU(e){return`react-resizable-panels:${e}`}function WU(e){return e.map(t=>{const{constraints:n,id:r,idIsFromProps:a,order:o}=t;return a?r:o?`${o}:${JSON.stringify(n)}`:JSON.stringify(n)}).sort((t,n)=>t.localeCompare(n)).join(",")}function KU(e,t){try{const n=GU(e),r=t.getItem(n);if(r){const a=JSON.parse(r);if(typeof a=="object"&&a!=null)return a}}catch{}return null}function fAe(e,t,n){var r,a;const o=(r=KU(e,n))!==null&&r!==void 0?r:{},i=WU(t);return(a=o[i])!==null&&a!==void 0?a:null}function pAe(e,t,n,r,a){var o;const i=GU(e),s=WU(t),l=(o=KU(e,a))!==null&&o!==void 0?o:{};l[s]={expandToSizes:Object.fromEntries(n.entries()),layout:r};try{a.setItem(i,JSON.stringify(l))}catch(c){console.error(c)}}function nP({layout:e,panelConstraints:t}){const n=[...e],r=n.reduce((o,i)=>o+i,0);if(n.length!==t.length)throw Error(`Invalid ${t.length} panel layout: ${n.map(o=>`${o}%`).join(", ")}`);if(!vr(r,100))for(let o=0;o(tP(Nu),Nu.getItem(e)),setItem:(e,t)=>{tP(Nu),Nu.setItem(e,t)}},rP={};function YU({autoSaveId:e=null,children:t,className:n="",direction:r,forwardedRef:a,id:o=null,onLayout:i=null,keyboardResizeBy:s=null,storage:l=Nu,style:c,tagName:u="div",...d}){const g=XA(o),m=ar(null),[b,y]=Zu(null),[w,v]=Zu([]),h=ar({}),S=ar(new Map),E=ar(0),k=ar({autoSaveId:e,direction:r,dragState:b,id:g,keyboardResizeBy:s,onLayout:i,storage:l}),x=ar({layout:w,panelDataArray:[],panelDataArrayChanged:!1});ar({didLogIdAndOrderWarning:!1,didLogPanelConstraintsWarning:!1,prevPanelIds:[]}),RU(a,()=>({getId:()=>k.current.id,getLayout:()=>{const{layout:P}=x.current;return P},setLayout:P=>{const{onLayout:N}=k.current,{layout:K,panelDataArray:ae}=x.current,ne=nP({layout:P,panelConstraints:ae.map(Q=>Q.constraints)});eP(K,ne)||(v(ne),x.current.layout=ne,N&&N(ne),ll(ae,ne,h.current))}}),[]),vs(()=>{k.current.autoSaveId=e,k.current.direction=r,k.current.dragState=b,k.current.id=g,k.current.onLayout=i,k.current.storage=l}),iAe({committedValuesRef:k,eagerValuesRef:x,groupId:g,layout:w,panelDataArray:x.current.panelDataArray,setLayout:v,panelGroupElement:m.current}),ys(()=>{const{panelDataArray:P}=x.current;if(e){if(w.length===0||w.length!==P.length)return;let N=rP[e];N==null&&(N=dAe(pAe,gAe),rP[e]=N);const K=[...P],ae=new Map(S.current);N(e,K,ae,w,l)}},[e,w,l]),ys(()=>{});const C=hr(P=>{const{onLayout:N}=k.current,{layout:K,panelDataArray:ae}=x.current;if(P.constraints.collapsible){const ne=ae.map(re=>re.constraints),{collapsedSize:Q=0,panelSize:pe,pivotIndices:he}=qi(ae,P,K);if(Ye(pe!=null),pe!==Q){S.current.set(P.id,pe);const Ee=hl(ae,P)===ae.length-1?pe-Q:Q-pe,ke=Ru({delta:Ee,layout:K,panelConstraints:ne,pivotIndices:he,trigger:"imperative-api"});kp(K,ke)||(v(ke),x.current.layout=ke,N&&N(ke),ll(ae,ke,h.current))}}},[]),_=hr(P=>{const{onLayout:N}=k.current,{layout:K,panelDataArray:ae}=x.current;if(P.constraints.collapsible){const ne=ae.map(Ee=>Ee.constraints),{collapsedSize:Q=0,panelSize:pe,minSize:he=0,pivotIndices:re}=qi(ae,P,K);if(pe===Q){const Ee=S.current.get(P.id),ke=Ee!=null&&Ee>=he?Ee:he,Vt=hl(ae,P)===ae.length-1?pe-ke:ke-pe,mt=Ru({delta:Vt,layout:K,panelConstraints:ne,pivotIndices:re,trigger:"imperative-api"});kp(K,mt)||(v(mt),x.current.layout=mt,N&&N(mt),ll(ae,mt,h.current))}}},[]),R=hr(P=>{const{layout:N,panelDataArray:K}=x.current,{panelSize:ae}=qi(K,P,N);return Ye(ae!=null),ae},[]),T=hr((P,N)=>{const{panelDataArray:K}=x.current,ae=hl(K,P);return uAe({defaultSize:N,dragState:b,layout:w,panelData:K,panelIndex:ae})},[b,w]),L=hr(P=>{const{layout:N,panelDataArray:K}=x.current,{collapsedSize:ae=0,collapsible:ne,panelSize:Q}=qi(K,P,N);return ne===!0&&Q===ae},[]),D=hr(P=>{const{layout:N,panelDataArray:K}=x.current,{collapsedSize:ae=0,collapsible:ne,panelSize:Q}=qi(K,P,N);return Ye(Q!=null),!ne||Q>ae},[]),H=hr(P=>{const{panelDataArray:N}=x.current;N.push(P),N.sort((K,ae)=>{const ne=K.order,Q=ae.order;return ne==null&&Q==null?0:ne==null?-1:Q==null?1:ne-Q}),x.current.panelDataArrayChanged=!0},[]);vs(()=>{if(x.current.panelDataArrayChanged){x.current.panelDataArrayChanged=!1;const{autoSaveId:P,onLayout:N,storage:K}=k.current,{layout:ae,panelDataArray:ne}=x.current;let Q=null;if(P){const he=fAe(P,ne,K);he&&(S.current=new Map(Object.entries(he.expandToSizes)),Q=he.layout)}Q==null&&(Q=cAe({panelDataArray:ne}));const pe=nP({layout:Q,panelConstraints:ne.map(he=>he.constraints)});eP(ae,pe)||(v(pe),x.current.layout=pe,N&&N(pe),ll(ne,pe,h.current))}}),vs(()=>{const P=x.current;return()=>{P.layout=[]}},[]);const z=hr(P=>function(K){K.preventDefault();const ae=m.current;if(!ae)return()=>null;const{direction:ne,dragState:Q,id:pe,keyboardResizeBy:he,onLayout:re}=k.current,{layout:Ee,panelDataArray:ke}=x.current,{initialLayout:We}=Q??{},Vt=HU(pe,P,ae);let mt=lAe(K,P,ne,Q,he,ae);if(mt===0)return;const Hn=ne==="horizontal";document.dir==="rtl"&&Hn&&(mt=-mt);const F=ke.map(ye=>ye.constraints),q=Ru({delta:mt,layout:We??Ee,panelConstraints:F,pivotIndices:Vt,trigger:OU(K)?"keyboard":"mouse-or-touch"}),Y=!kp(Ee,q);(DU(K)||LU(K))&&E.current!=mt&&(E.current=mt,Y?Tx(P,0):Hn?Tx(P,mt<0?PU:$U):Tx(P,mt<0?FU:jU)),Y&&(v(q),x.current.layout=q,re&&re(q),ll(ke,q,h.current))},[]),M=hr((P,N)=>{const{onLayout:K}=k.current,{layout:ae,panelDataArray:ne}=x.current,Q=ne.map(We=>We.constraints),{panelSize:pe,pivotIndices:he}=qi(ne,P,ae);Ye(pe!=null);const Ee=hl(ne,P)===ne.length-1?pe-N:N-pe,ke=Ru({delta:Ee,layout:ae,panelConstraints:Q,pivotIndices:he,trigger:"imperative-api"});kp(ae,ke)||(v(ke),x.current.layout=ke,K&&K(ke),ll(ne,ke,h.current))},[]),U=hr((P,N)=>{const{layout:K,panelDataArray:ae}=x.current,{collapsedSize:ne=0,collapsible:Q}=N,{collapsedSize:pe=0,collapsible:he,maxSize:re=100,minSize:Ee=0}=P.constraints,{panelSize:ke}=qi(ae,P,K);Ye(ke!=null),Q&&he&&ke===ne?ne!==pe&&M(P,pe):kere&&M(P,re)},[M]),X=hr((P,N)=>{const{direction:K}=k.current,{layout:ae}=x.current;if(!m.current)return;const ne=Fh(P,m.current);Ye(ne);const Q=qU(K,N);y({dragHandleId:P,dragHandleRect:ne.getBoundingClientRect(),initialCursorPosition:Q,initialLayout:ae})},[]),j=hr(()=>{y(null)},[]),O=hr(P=>{const{panelDataArray:N}=x.current,K=hl(N,P);K>=0&&(N.splice(K,1),delete h.current[P.id],x.current.panelDataArrayChanged=!0)},[]),A=V_e(()=>({collapsePanel:C,direction:r,dragState:b,expandPanel:_,getPanelSize:R,getPanelStyle:T,groupId:g,isPanelCollapsed:L,isPanelExpanded:D,reevaluatePanelConstraints:U,registerPanel:H,registerResizeHandle:z,resizePanel:M,startDragging:X,stopDragging:j,unregisterPanel:O,panelGroupElement:m.current}),[C,b,r,_,R,T,g,L,D,U,H,z,M,X,j,O]),V={display:"flex",flexDirection:r==="horizontal"?"row":"column",height:"100%",overflow:"hidden",width:"100%"};return Ac(Lh.Provider,{value:A},Ac(u,{...d,children:t,className:n,id:o,ref:m,style:{...V,...c},"data-panel-group":"","data-panel-group-direction":r,"data-panel-group-id":g}))}const ZU=AU((e,t)=>Ac(YU,{...e,forwardedRef:t}));YU.displayName="PanelGroup";ZU.displayName="forwardRef(PanelGroup)";function hl(e,t){return e.findIndex(n=>n===t||n.id===t.id)}function qi(e,t,n){const r=hl(e,t),o=r===e.length-1?[r-1,r]:[r,r+1],i=n[r];return{...t.constraints,panelSize:i,pivotIndices:o}}function mAe({disabled:e,handleId:t,resizeHandler:n,panelGroupElement:r}){ys(()=>{if(e||n==null||r==null)return;const a=Fh(t,r);if(a==null)return;const o=i=>{if(!i.defaultPrevented)switch(i.key){case"ArrowDown":case"ArrowLeft":case"ArrowRight":case"ArrowUp":case"End":case"Home":{i.preventDefault(),n(i);break}case"F6":{i.preventDefault();const s=a.getAttribute("data-panel-group-id");Ye(s);const l=Dd(s,r),c=BU(s,t,r);Ye(c!==null);const u=i.shiftKey?c>0?c-1:l.length-1:c+1{a.removeEventListener("keydown",o)}},[r,e,t,n])}function XU({children:e=null,className:t="",disabled:n=!1,hitAreaMargins:r,id:a,onDragging:o,style:i={},tabIndex:s=0,tagName:l="div",...c}){const u=ar(null),d=ar({onDragging:o});ys(()=>{d.current.onDragging=o});const g=TU(Lh);if(g===null)throw Error("PanelResizeHandle components must be rendered within a PanelGroup container");const{direction:m,groupId:b,registerResizeHandle:y,startDragging:w,stopDragging:v,panelGroupElement:h}=g,S=XA(a),[E,k]=Zu("inactive"),[x,C]=Zu(!1),[_,R]=Zu(null),T=ar({state:E});return vs(()=>{T.current.state=E}),ys(()=>{if(n)R(null);else{const D=y(S);R(()=>D)}},[n,S,y]),ys(()=>{var D,H;if(n||_==null)return;const z=u.current;Ye(z);const M=(U,X,j)=>{if(X)switch(U){case"down":{k("drag"),w(S,j);const{onDragging:O}=d.current;O&&O(!0);break}case"move":{const{state:O}=T.current;O!=="drag"&&k("hover"),_(j);break}case"up":{k("hover"),v();const{onDragging:O}=d.current;O&&O(!1);break}}else k("inactive")};return rAe(S,z,m,{coarse:(D=r==null?void 0:r.coarse)!==null&&D!==void 0?D:15,fine:(H=r==null?void 0:r.fine)!==null&&H!==void 0?H:5},M)},[m,n,r,y,S,_,w,v]),mAe({disabled:n,handleId:S,resizeHandler:_,panelGroupElement:h}),Ac(l,{...c,children:e,className:t,id:a,onBlur:()=>C(!1),onFocus:()=>C(!0),ref:u,role:"separator",style:{...{touchAction:"none",userSelect:"none"},...i},tabIndex:s,"data-panel-group-direction":m,"data-panel-group-id":b,"data-resize-handle":"","data-resize-handle-active":E==="drag"?"pointer":x?"keyboard":void 0,"data-resize-handle-state":E,"data-panel-resize-handle-enabled":!n,"data-panel-resize-handle-id":S})}XU.displayName="PanelResizeHandle";const hAe=({className:e,...t})=>f.jsx(ZU,{className:ee("flex h-full w-full data-[panel-group-direction=vertical]:flex-col",e),...t}),aP=IU,bAe=({withHandle:e,className:t,...n})=>f.jsx(XU,{className:ee("relative flex w-px items-center justify-center bg-border after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:-translate-y-1/2 data-[panel-group-direction=vertical]:after:translate-x-0 [&[data-panel-group-direction=vertical]>div]:rotate-90",t),...n,children:e&&f.jsx("div",{className:"z-10 flex h-4 w-3 items-center justify-center rounded-sm border bg-border",children:f.jsx(Aq,{className:"h-2.5 w-2.5"})})}),[jh,STe]=zn("Tooltip",[qa]),eT=qa(),yAe="TooltipProvider",vAe=700,Kk="tooltip.open",[SAe,tT]=jh(yAe),wAe=e=>{const{__scopeTooltip:t,delayDuration:n=vAe,skipDelayDuration:r=300,disableHoverableContent:a=!1,children:o}=e,[i,s]=p.useState(!0),l=p.useRef(!1),c=p.useRef(0);return p.useEffect(()=>{const u=c.current;return()=>window.clearTimeout(u)},[]),p.createElement(SAe,{scope:t,isOpenDelayed:i,delayDuration:n,onOpen:p.useCallback(()=>{window.clearTimeout(c.current),s(!1)},[]),onClose:p.useCallback(()=>{window.clearTimeout(c.current),c.current=window.setTimeout(()=>s(!0),r)},[r]),isPointerInTransitRef:l,onPointerInTransitChange:p.useCallback(u=>{l.current=u},[]),disableHoverableContent:a},o)},nT="Tooltip",[EAe,zh]=jh(nT),xAe=e=>{const{__scopeTooltip:t,children:n,open:r,defaultOpen:a=!1,onOpenChange:o,disableHoverableContent:i,delayDuration:s}=e,l=tT(nT,e.__scopeTooltip),c=eT(t),[u,d]=p.useState(null),g=bi(),m=p.useRef(0),b=i??l.disableHoverableContent,y=s??l.delayDuration,w=p.useRef(!1),[v=!1,h]=Fa({prop:r,defaultProp:a,onChange:C=>{C?(l.onOpen(),document.dispatchEvent(new CustomEvent(Kk))):l.onClose(),o==null||o(C)}}),S=p.useMemo(()=>v?w.current?"delayed-open":"instant-open":"closed",[v]),E=p.useCallback(()=>{window.clearTimeout(m.current),w.current=!1,h(!0)},[h]),k=p.useCallback(()=>{window.clearTimeout(m.current),h(!1)},[h]),x=p.useCallback(()=>{window.clearTimeout(m.current),m.current=window.setTimeout(()=>{w.current=!0,h(!0)},y)},[y,h]);return p.useEffect(()=>()=>window.clearTimeout(m.current),[]),p.createElement(ah,c,p.createElement(EAe,{scope:t,contentId:g,open:v,stateAttribute:S,trigger:u,onTriggerChange:d,onTriggerEnter:p.useCallback(()=>{l.isOpenDelayed?x():E()},[l.isOpenDelayed,x,E]),onTriggerLeave:p.useCallback(()=>{b?k():window.clearTimeout(m.current)},[k,b]),onOpen:E,onClose:k,disableHoverableContent:b},n))},oP="TooltipTrigger",kAe=p.forwardRef((e,t)=>{const{__scopeTooltip:n,...r}=e,a=zh(oP,n),o=tT(oP,n),i=eT(n),s=p.useRef(null),l=nt(t,s,a.onTriggerChange),c=p.useRef(!1),u=p.useRef(!1),d=p.useCallback(()=>c.current=!1,[]);return p.useEffect(()=>()=>document.removeEventListener("pointerup",d),[d]),p.createElement(pf,W({asChild:!0},i),p.createElement(ze.button,W({"aria-describedby":a.open?a.contentId:void 0,"data-state":a.stateAttribute},r,{ref:l,onPointerMove:fe(e.onPointerMove,g=>{g.pointerType!=="touch"&&!u.current&&!o.isPointerInTransitRef.current&&(a.onTriggerEnter(),u.current=!0)}),onPointerLeave:fe(e.onPointerLeave,()=>{a.onTriggerLeave(),u.current=!1}),onPointerDown:fe(e.onPointerDown,()=>{c.current=!0,document.addEventListener("pointerup",d,{once:!0})}),onFocus:fe(e.onFocus,()=>{c.current||a.onOpen()}),onBlur:fe(e.onBlur,a.onClose),onClick:fe(e.onClick,a.onClose)})))}),CAe="TooltipPortal",[wTe,_Ae]=jh(CAe,{forceMount:void 0}),Ld="TooltipContent",AAe=p.forwardRef((e,t)=>{const n=_Ae(Ld,e.__scopeTooltip),{forceMount:r=n.forceMount,side:a="top",...o}=e,i=zh(Ld,e.__scopeTooltip);return p.createElement(pr,{present:r||i.open},i.disableHoverableContent?p.createElement(QU,W({side:a},o,{ref:t})):p.createElement(TAe,W({side:a},o,{ref:t})))}),TAe=p.forwardRef((e,t)=>{const n=zh(Ld,e.__scopeTooltip),r=tT(Ld,e.__scopeTooltip),a=p.useRef(null),o=nt(t,a),[i,s]=p.useState(null),{trigger:l,onClose:c}=n,u=a.current,{onPointerInTransitChange:d}=r,g=p.useCallback(()=>{s(null),d(!1)},[d]),m=p.useCallback((b,y)=>{const w=b.currentTarget,v={x:b.clientX,y:b.clientY},h=NAe(v,w.getBoundingClientRect()),S=IAe(v,h),E=OAe(y.getBoundingClientRect()),k=LAe([...S,...E]);s(k),d(!0)},[d]);return p.useEffect(()=>()=>g(),[g]),p.useEffect(()=>{if(l&&u){const b=w=>m(w,u),y=w=>m(w,l);return l.addEventListener("pointerleave",b),u.addEventListener("pointerleave",y),()=>{l.removeEventListener("pointerleave",b),u.removeEventListener("pointerleave",y)}}},[l,u,m,g]),p.useEffect(()=>{if(i){const b=y=>{const w=y.target,v={x:y.clientX,y:y.clientY},h=(l==null?void 0:l.contains(w))||(u==null?void 0:u.contains(w)),S=!DAe(v,i);h?g():S&&(g(),c())};return document.addEventListener("pointermove",b),()=>document.removeEventListener("pointermove",b)}},[l,u,i,c,g]),p.createElement(QU,W({},e,{ref:o}))}),[RAe,ETe]=jh(nT,{isInside:!1}),QU=p.forwardRef((e,t)=>{const{__scopeTooltip:n,children:r,"aria-label":a,onEscapeKeyDown:o,onPointerDownOutside:i,...s}=e,l=zh(Ld,n),c=eT(n),{onClose:u}=l;return p.useEffect(()=>(document.addEventListener(Kk,u),()=>document.removeEventListener(Kk,u)),[u]),p.useEffect(()=>{if(l.trigger){const d=g=>{const m=g.target;m!=null&&m.contains(l.trigger)&&u()};return window.addEventListener("scroll",d,{capture:!0}),()=>window.removeEventListener("scroll",d,{capture:!0})}},[l.trigger,u]),p.createElement(Ls,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:o,onPointerDownOutside:i,onFocusOutside:d=>d.preventDefault(),onDismiss:u},p.createElement(gf,W({"data-state":l.stateAttribute},c,s,{ref:t,style:{...s.style,"--radix-tooltip-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-tooltip-content-available-width":"var(--radix-popper-available-width)","--radix-tooltip-content-available-height":"var(--radix-popper-available-height)","--radix-tooltip-trigger-width":"var(--radix-popper-anchor-width)","--radix-tooltip-trigger-height":"var(--radix-popper-anchor-height)"}}),p.createElement(Rm,null,r),p.createElement(RAe,{scope:n,isInside:!0},p.createElement(qV,{id:l.contentId,role:"tooltip"},a||r))))});function NAe(e,t){const n=Math.abs(t.top-e.y),r=Math.abs(t.bottom-e.y),a=Math.abs(t.right-e.x),o=Math.abs(t.left-e.x);switch(Math.min(n,r,a,o)){case o:return"left";case a:return"right";case n:return"top";case r:return"bottom";default:throw new Error("unreachable")}}function IAe(e,t,n=5){const r=[];switch(t){case"top":r.push({x:e.x-n,y:e.y+n},{x:e.x+n,y:e.y+n});break;case"bottom":r.push({x:e.x-n,y:e.y-n},{x:e.x+n,y:e.y-n});break;case"left":r.push({x:e.x+n,y:e.y-n},{x:e.x+n,y:e.y+n});break;case"right":r.push({x:e.x-n,y:e.y-n},{x:e.x-n,y:e.y+n});break}return r}function OAe(e){const{top:t,right:n,bottom:r,left:a}=e;return[{x:a,y:t},{x:n,y:t},{x:n,y:r},{x:a,y:r}]}function DAe(e,t){const{x:n,y:r}=e;let a=!1;for(let o=0,i=t.length-1;or!=u>r&&n<(c-s)*(r-l)/(u-l)+s&&(a=!a)}return a}function LAe(e){const t=e.slice();return t.sort((n,r)=>n.xr.x?1:n.yr.y?1:0),MAe(t)}function MAe(e){if(e.length<=1)return e.slice();const t=[];for(let r=0;r=2;){const o=t[t.length-1],i=t[t.length-2];if((o.x-i.x)*(a.y-i.y)>=(o.y-i.y)*(a.x-i.x))t.pop();else break}t.push(a)}t.pop();const n=[];for(let r=e.length-1;r>=0;r--){const a=e[r];for(;n.length>=2;){const o=n[n.length-1],i=n[n.length-2];if((o.x-i.x)*(a.y-i.y)>=(o.y-i.y)*(a.x-i.x))n.pop();else break}n.push(a)}return n.pop(),t.length===1&&n.length===1&&t[0].x===n[0].x&&t[0].y===n[0].y?t:t.concat(n)}const PAe=wAe,$Ae=xAe,FAe=kAe,JU=AAe,jAe=PAe,Yk=$Ae,Zk=FAe,dm=p.forwardRef(({className:e,sideOffset:t=4,...n},r)=>f.jsx(JU,{ref:r,sideOffset:t,className:ee("z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...n}));dm.displayName=JU.displayName;const eB=p.createContext({setTheme(e){},toggleTheme(){},theme:localStorage.getItem("theme")==="dark"?"dark":"light"});function zAe({children:e}){const[t,n]=p.useState(localStorage.getItem("theme")==="dark"?"dark":"light"),r=p.useCallback(()=>n(o=>o==="light"?"dark":"light"),[n]),a=p.useMemo(()=>({theme:t,setTheme:n,toggleTheme:r}),[t,n,r]);return p.useEffect(()=>{t==="light"?(document.documentElement.classList.remove("dark"),document.documentElement.classList.add("light")):(document.documentElement.classList.remove("light"),document.documentElement.classList.add("dark")),localStorage.setItem("theme",t)},[t]),f.jsx(eB.Provider,{value:a,children:e})}const UAe=()=>p.useContext(eB);function iP({links:e,isCollapsed:t}){return f.jsx("div",{"data-collapsed":t,className:"group flex flex-col gap-4 py-2 data-[collapsed=true]:py-2",children:f.jsx("nav",{className:"grid gap-1 px-2 group-[[data-collapsed=true]]:justify-center group-[[data-collapsed=true]]:px-2",children:e.map((n,r)=>t?f.jsxs(Yk,{delayDuration:0,children:[f.jsx(Zk,{asChild:!0,children:f.jsxs(bd,{to:n.to,className:ee(yc({variant:n.variant,size:"icon"}),"h-9 w-9",n.variant==="default"&&"bg-background-darker text-black dark:bg-muted dark:text-muted-foreground dark:hover:bg-muted dark:hover:text-white"),children:[f.jsx(n.icon,{className:"h-4 w-4"}),f.jsx("span",{className:"sr-only",children:n.title})]})}),f.jsxs(dm,{side:"right",className:"flex items-center gap-4",children:[n.title,n.label&&f.jsx("span",{className:"ml-auto text-muted-foreground",children:n.label})]})]},r):f.jsxs(bd,{to:n.to,className:ee(yc({variant:n.variant,size:"sm"}),n.variant==="default"&&"bg-background-darker hover:text-background text-foreground dark:bg-muted dark:text-white dark:hover:bg-muted dark:hover:text-white","justify-start"),children:[f.jsx(n.icon,{className:"mr-2 h-4 w-4"}),n.title,n.label&&f.jsx("span",{className:ee("ml-auto",n.variant==="default"&&"text-background dark:text-white"),children:n.label})]},r))})})}function BAe(e){const{className:t,collapse:n}=e;return f.jsxs("svg",{className:t,height:"28",...n?{width:28,viewBox:"0 0 28 28"}:{width:96,viewBox:"0 0 96 28"},fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[f.jsx("path",{d:"M16.9282 11.2005H11.2857V16.8003H16.9282V11.2005Z",fill:"currentColor"}),f.jsx("path",{d:"M22.5705 3.81489V0H5.64243V3.81489C5.64243 4.80109 4.8376 5.59984 3.84391 5.59984H0V22.4002H3.84391C4.8376 22.4002 5.64243 23.1989 5.64243 24.1851V28H22.5705V24.1851C22.5705 23.1989 23.3753 22.4002 24.369 22.4002H28.213V5.59984H24.369C23.3753 5.59984 22.5705 4.80109 22.5705 3.81489ZM22.5705 20.6144C22.5705 21.6006 21.7657 22.3994 20.772 22.3994H7.44174C6.44805 22.3994 5.64322 21.6006 5.64322 20.6144V7.3848C5.64322 6.3986 6.44805 5.59984 7.44174 5.59984H20.772C21.7657 5.59984 22.5705 6.3986 22.5705 7.3848V20.6144Z",fill:"currentColor"}),!n&&f.jsxs(f.Fragment,{children:[f.jsx("path",{d:"M44.8064 5.59982H42.3182V22.3994H53.3766V20.0233H44.8064V5.59982Z",fill:"currentColor"}),f.jsx("path",{d:"M60.5503 10.5463H59.6655C57.0057 10.5463 54.3224 12.1648 54.3224 15.7798V17.5368C54.3224 20.8134 56.233 22.7703 59.4327 22.7703H60.7838C63.4835 22.7703 65.4043 21.193 65.7985 18.6528L65.833 18.4288H63.2704L63.2281 18.5673C62.8488 19.8133 61.8574 20.3942 60.1083 20.3942C57.838 20.3942 56.7667 19.3933 56.7408 17.2459H65.8933V15.7798C65.8933 12.1648 63.21 10.5463 60.5503 10.5463ZM56.8145 15.1459C57.0684 13.5702 58.0394 12.9223 60.1075 12.9223C62.1756 12.9223 63.1458 13.5702 63.3997 15.1459H56.8145Z",fill:"currentColor"}),f.jsx("path",{d:"M70.8579 5.59982H68.3705V10.5463H66.717V12.9224H68.3705V17.6286C68.3705 21.7795 70.9151 22.3994 72.4323 22.3994H74.002V20.0233H73.1078C71.5099 20.0233 70.8579 19.2222 70.8579 17.2592V12.9232H74.002V10.5471H70.8579V5.59982Z",fill:"currentColor"}),f.jsx("path",{d:"M79.2637 5.59982H76.7764V10.5463H75.1228V12.9224H76.7764V17.6286C76.7764 21.7795 79.3209 22.3994 80.8381 22.3994H82.4078V20.0233H81.5137C79.9158 20.0233 79.2637 19.2222 79.2637 17.2592V12.9232H82.4078V10.5471H79.2637V5.59982Z",fill:"currentColor"}),f.jsx("path",{d:"M95.2238 20.0232C94.7309 20.0232 94.5115 19.8195 94.5115 19.3622V15.317C94.5115 11.1662 91.9669 10.5463 90.4497 10.5463H88.1676C86.1944 10.5463 84.0824 11.9805 84.0824 14.1154V14.3098H86.5697V14.1154C86.5697 13.4574 87.3808 12.9231 88.3769 12.9231H89.7742C91.5594 12.9231 91.9449 13.5609 92.0163 14.9849H88.4231C85.645 14.9849 83.7791 16.4565 83.7791 18.6466V18.9009C83.7791 20.0575 84.2313 22.7477 88.4231 22.7477C89.4936 22.7477 91.3642 22.5618 92.3705 21.3765C92.9802 22.4008 94.2646 22.4008 95.2238 22.4008H95.4197V20.0248H95.2238V20.0232ZM92.0233 18.7609C92.0233 20.0808 89.9121 20.3694 89.0979 20.3694C86.7288 20.3694 86.2657 19.7961 86.2657 18.8068C86.2657 17.7086 87.2453 17.1284 89.0979 17.1284H92.0233V18.7609Z",fill:"currentColor"})]})]})}function HAe({defaultLayout:e=[265,440,655],defaultCollapsed:t=!1,navCollapsedSize:n,children:r}){const a=Li(),o=b=>{var y;return((y=a.pathname.split("/"))==null?void 0:y[1])===b?"default":"ghost"},i=[{title:"Agents",icon:Lm,variant:o("agents"),to:"agents"},{title:"Data Sources",icon:_q,variant:o("files"),to:"data-sources"},{title:"Tool Builder",icon:zq,variant:o("tools"),to:"tools"},{title:"Agent Templates",icon:kq,variant:o("agent-templates"),to:"agent-templates"},{title:"User Templates",icon:QC,variant:o("human-templates"),to:"human-templates"}],{theme:s,toggleTheme:l}=UAe(),[c,u]=p.useState(t),{logout:d}=iY(),g=Mi(),m=()=>{d(),g("/login")};return f.jsx(jAe,{delayDuration:0,children:f.jsxs(hAe,{direction:"horizontal",onLayout:b=>{document.cookie=`react-resizable-panels:layout=${JSON.stringify(b)}`},className:"h-full items-stretch",children:[f.jsxs(aP,{defaultSize:e[0],collapsedSize:n,collapsible:!0,minSize:14,maxSize:20,onCollapse:()=>{u(!0),document.cookie=`react-resizable-panels:collapsed=${JSON.stringify(!0)}`},onExpand:()=>{u(!1),document.cookie=`react-resizable-panels:collapsed=${JSON.stringify(!1)}`},className:ee("flex flex-col",c&&"min-w-[50px] transition-all duration-300 ease-in-out"),children:[f.jsx(jF,{to:"/",className:ee("flex h-[56px] items-center",c?"h-[56px] justify-center":"px-2"),children:f.jsx(BAe,{collapse:c,className:"h-[24px] dark:text-white"})}),f.jsx(Nd,{}),f.jsx(iP,{isCollapsed:c,links:i}),f.jsx(Nd,{}),f.jsx(iP,{isCollapsed:c,links:[{title:"Settings",icon:Eq,variant:o("settings"),to:"settings"}]}),f.jsx("div",{className:ee("flex flex-1 items-end",c&&"justify-center p-2.5"),children:f.jsxs("div",{className:"grid gap-2",children:[c?f.jsxs(Yk,{delayDuration:0,children:[f.jsx(Zk,{asChild:!0,children:f.jsxs(ue,{variant:"ghost",onClick:l,size:"icon",className:"h-9 w-9",children:[f.jsx("span",{className:"sr-only",children:"Toggle Dark Mode"}),s==="light"?f.jsx(wR,{className:"h-4 w-4"}):f.jsx(ER,{className:"w-4 w-4"})]})}),f.jsx(dm,{side:"right",className:"flex items-center gap-4",children:"Toggle Dark Mode"})]}):f.jsx(ue,{className:"m-2.5",variant:"ghost",size:c?"icon":"sm",onClick:l,children:s==="light"?f.jsx(wR,{className:"h-4 w-4"}):f.jsx(ER,{className:"w-4 w-4"})}),c?f.jsxs(Yk,{delayDuration:0,children:[f.jsx(Zk,{asChild:!0,children:f.jsxs(ue,{variant:"ghost",onClick:m,size:"icon",className:"h-9 w-9",children:[f.jsx("span",{className:"sr-only",children:"Sign Out"}),f.jsx(SR,{className:"h-4 w-4"})]})}),f.jsx(dm,{side:"right",className:"flex items-center gap-4",children:"Sign Out"})]}):f.jsx(ue,{className:"m-2.5",variant:"ghost",size:c?"icon":"sm",onClick:m,children:f.jsx(SR,{className:"h-4 w-4"})})]})})]}),f.jsx(bAe,{withHandle:!0}),f.jsx(aP,{className:"h-full",defaultSize:e[1],minSize:30,children:r})]})})}/*! js-cookie v3.0.5 | MIT */function Cp(e){for(var t=1;t"u")){i=Cp({},t,i),typeof i.expires=="number"&&(i.expires=new Date(Date.now()+i.expires*864e5)),i.expires&&(i.expires=i.expires.toUTCString()),a=encodeURIComponent(a).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var s="";for(var l in i)i[l]&&(s+="; "+l,i[l]!==!0&&(s+="="+i[l].split(";")[0]));return document.cookie=a+"="+e.write(o,a)+s}}function r(a){if(!(typeof document>"u"||arguments.length&&!a)){for(var o=document.cookie?document.cookie.split("; "):[],i={},s=0;s{const e=sP.get("react-resizable-panels:layout"),t=sP.get("react-resizable-panels:collapsed"),n=e?JSON.parse(e):void 0,r=t?JSON.parse(t):void 0;return{defaultLayout:n,defaultCollapsed:r}},GAe=()=>{const{defaultCollapsed:e,defaultLayout:t}=qAe();return f.jsx(AZ,{children:f.jsx(hX,{children:f.jsx(HAe,{defaultLayout:t,defaultCollapsed:e,navCollapsedSize:4,children:f.jsx(PF,{})})})})},WAe=bK([{path:"/",element:GAe(),children:[{path:"",element:f.jsx(MF,{to:"/agents",replace:!0})},Mie,wke,nCe,ACe,t_e,R_e,U_e]}]),KAe=new zG;function YAe(){return f.jsx(Jm,{className:"bg-red-600 text-white rounded-none",children:f.jsxs("div",{children:[f.jsxs("div",{className:"flex items-center mb-3 gap-2",children:[f.jsx(X4,{className:"w-6 h-6"}),f.jsx("div",{className:"font-bold",children:"DEPRECATION NOTICE"})]}),"The self-hosted Letta dev portal is deprecated and will not work as intended with newer versions of Letta (",">","v0.5.0). Please use our new Agent Development Environment at ",f.jsx("a",{className:"underline",href:"https://app.letta.com",children:"https://app.letta.com"})]})})}function ZAe(){return f.jsxs(qG,{client:KAe,children:[f.jsxs(zAe,{children:[f.jsx(YAe,{}),f.jsx(CK,{router:WAe}),f.jsx(CG,{})]}),f.jsx(oW,{initialIsOpen:!1})]})}const XAe=O4(document.getElementById("root"));XAe.render(f.jsx(p.StrictMode,{children:f.jsx(ZAe,{})})); diff --git a/letta/server/static_files/assets/index-43ab4d62.css b/letta/server/static_files/assets/index-43ab4d62.css new file mode 100644 index 0000000000..17e1816fd9 --- /dev/null +++ b/letta/server/static_files/assets/index-43ab4d62.css @@ -0,0 +1 @@ +*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}:root{--background: 210, 10%, 92%;--background-lighter: 0, 0%, 100%;--background-darker: 210, 6%, 86%;--foreground: 224 71.4% 4.1%;--card: 0 0% 100%;--card-foreground: 224 71.4% 4.1%;--popover: 0 0% 100%;--popover-foreground: 224 71.4% 4.1%;--primary: 220.9 39.3% 11%;--primary-foreground: 210 20% 98%;--secondary: 240, 92%, 35%;--secondary-foreground: 0, 0%, 100%;--muted: 220 14.3% 95.9%;--muted-foreground: 220 8.9% 46.1%;--accent: 220 14.3% 95.9%;--accent-foreground: 220.9 39.3% 11%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 210 20% 98%;--border: 210, 6%, 86%;--input: 210, 6%, 86%;--ring: 224 71.4% 4.1%;--radius: .5rem}.dark{--background: 224 71.4% 4.1%;--background-lighter: 224 71.4% 4.1%;--background-darker: 224 71.4% 4.1%;--foreground: 210 20% 98%;--card: 224 71.4% 4.1%;--card-foreground: 210 20% 98%;--popover: 224 71.4% 4.1%;--popover-foreground: 210 20% 98%;--primary: 210 20% 98%;--primary-foreground: 220.9 39.3% 11%;--secondary: 10, 100%, 60%;--secondary-foreground: 210 20% 98%;--muted: 215 27.9% 16.9%;--muted-foreground: 217.9 10.6% 64.9%;--accent: 215 27.9% 16.9%;--accent-foreground: 210 20% 98%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 210 20% 98%;--border: 215 27.9% 16.9%;--input: 215 27.9% 16.9%;--ring: 216 12.2% 83.9%}*{border-color:hsl(var(--border))}html{height:100%}body{height:100%;width:100%;background-color:hsl(var(--background));color:hsl(var(--foreground));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}input::file-selector-button{color:hsl(var(--foreground))}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.fixed{position:fixed}.mt-10{margin-top:2.5rem}.mt-3{margin-top:.75rem}.flex{display:flex}.h-\[100dvh\]{height:100dvh}.h-full{height:100%}.w-\[100dvh\]{width:100dvh}.w-full{width:100%}.max-w-\[600px\]{max-width:600px}.max-w-\[893px\]{max-width:893px}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-5{gap:1.25rem}.border{border-width:1px}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.p-0{padding:0}.p-10{padding:2.5rem}.px-4{padding-left:1rem;padding-right:1rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.font-semibold{font-weight:600}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.PopoverContent{width:var(--radix-popover-trigger-width);max-height:var(--radix-popover-content-available-height)} diff --git a/letta/server/static_files/assets/index-4848e3d7.js b/letta/server/static_files/assets/index-4848e3d7.js new file mode 100644 index 0000000000..97b8ee8c24 --- /dev/null +++ b/letta/server/static_files/assets/index-4848e3d7.js @@ -0,0 +1,40 @@ +(function(){const n=document.createElement("link").relList;if(n&&n.supports&&n.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))r(l);new MutationObserver(l=>{for(const o of l)if(o.type==="childList")for(const u of o.addedNodes)u.tagName==="LINK"&&u.rel==="modulepreload"&&r(u)}).observe(document,{childList:!0,subtree:!0});function t(l){const o={};return l.integrity&&(o.integrity=l.integrity),l.referrerPolicy&&(o.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?o.credentials="include":l.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(l){if(l.ep)return;l.ep=!0;const o=t(l);fetch(l.href,o)}})();var Ai={exports:{}},br={},Bi={exports:{}},L={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Yt=Symbol.for("react.element"),rc=Symbol.for("react.portal"),lc=Symbol.for("react.fragment"),oc=Symbol.for("react.strict_mode"),uc=Symbol.for("react.profiler"),ic=Symbol.for("react.provider"),sc=Symbol.for("react.context"),ac=Symbol.for("react.forward_ref"),cc=Symbol.for("react.suspense"),fc=Symbol.for("react.memo"),dc=Symbol.for("react.lazy"),Ou=Symbol.iterator;function pc(e){return e===null||typeof e!="object"?null:(e=Ou&&e[Ou]||e["@@iterator"],typeof e=="function"?e:null)}var Wi={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Qi=Object.assign,Ki={};function lt(e,n,t){this.props=e,this.context=n,this.refs=Ki,this.updater=t||Wi}lt.prototype.isReactComponent={};lt.prototype.setState=function(e,n){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,n,"setState")};lt.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function Yi(){}Yi.prototype=lt.prototype;function Vo(e,n,t){this.props=e,this.context=n,this.refs=Ki,this.updater=t||Wi}var Fo=Vo.prototype=new Yi;Fo.constructor=Vo;Qi(Fo,lt.prototype);Fo.isPureReactComponent=!0;var Du=Array.isArray,Zi=Object.prototype.hasOwnProperty,Ho={current:null},Xi={key:!0,ref:!0,__self:!0,__source:!0};function Gi(e,n,t){var r,l={},o=null,u=null;if(n!=null)for(r in n.ref!==void 0&&(u=n.ref),n.key!==void 0&&(o=""+n.key),n)Zi.call(n,r)&&!Xi.hasOwnProperty(r)&&(l[r]=n[r]);var i=arguments.length-2;if(i===1)l.children=t;else if(1>>1,X=C[W];if(0>>1;Wl(yl,z))ynl(bt,yl)?(C[W]=bt,C[yn]=z,W=yn):(C[W]=yl,C[vn]=z,W=vn);else if(ynl(bt,z))C[W]=bt,C[yn]=z,W=yn;else break e}}return P}function l(C,P){var z=C.sortIndex-P.sortIndex;return z!==0?z:C.id-P.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var u=Date,i=u.now();e.unstable_now=function(){return u.now()-i}}var s=[],c=[],h=1,m=null,p=3,g=!1,w=!1,S=!1,I=typeof setTimeout=="function"?setTimeout:null,f=typeof clearTimeout=="function"?clearTimeout:null,a=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function d(C){for(var P=t(c);P!==null;){if(P.callback===null)r(c);else if(P.startTime<=C)r(c),P.sortIndex=P.expirationTime,n(s,P);else break;P=t(c)}}function v(C){if(S=!1,d(C),!w)if(t(s)!==null)w=!0,hl(E);else{var P=t(c);P!==null&&vl(v,P.startTime-C)}}function E(C,P){w=!1,S&&(S=!1,f(N),N=-1),g=!0;var z=p;try{for(d(P),m=t(s);m!==null&&(!(m.expirationTime>P)||C&&!Ne());){var W=m.callback;if(typeof W=="function"){m.callback=null,p=m.priorityLevel;var X=W(m.expirationTime<=P);P=e.unstable_now(),typeof X=="function"?m.callback=X:m===t(s)&&r(s),d(P)}else r(s);m=t(s)}if(m!==null)var qt=!0;else{var vn=t(c);vn!==null&&vl(v,vn.startTime-P),qt=!1}return qt}finally{m=null,p=z,g=!1}}var x=!1,_=null,N=-1,B=5,T=-1;function Ne(){return!(e.unstable_now()-TC||125W?(C.sortIndex=z,n(c,C),t(s)===null&&C===t(c)&&(S?(f(N),N=-1):S=!0,vl(v,z-W))):(C.sortIndex=X,n(s,C),w||g||(w=!0,hl(E))),C},e.unstable_shouldYield=Ne,e.unstable_wrapCallback=function(C){var P=p;return function(){var z=p;p=P;try{return C.apply(this,arguments)}finally{p=z}}}})(es);bi.exports=es;var xc=bi.exports;/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var ns=$o,ye=xc;function y(e){for(var n="https://reactjs.org/docs/error-decoder.html?invariant="+e,t=1;t"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Wl=Object.prototype.hasOwnProperty,_c=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,Iu={},Vu={};function Nc(e){return Wl.call(Vu,e)?!0:Wl.call(Iu,e)?!1:_c.test(e)?Vu[e]=!0:(Iu[e]=!0,!1)}function Pc(e,n,t,r){if(t!==null&&t.type===0)return!1;switch(typeof n){case"function":case"symbol":return!0;case"boolean":return r?!1:t!==null?!t.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function zc(e,n,t,r){if(n===null||typeof n>"u"||Pc(e,n,t,r))return!0;if(r)return!1;if(t!==null)switch(t.type){case 3:return!n;case 4:return n===!1;case 5:return isNaN(n);case 6:return isNaN(n)||1>n}return!1}function se(e,n,t,r,l,o,u){this.acceptsBooleans=n===2||n===3||n===4,this.attributeName=r,this.attributeNamespace=l,this.mustUseProperty=t,this.propertyName=e,this.type=n,this.sanitizeURL=o,this.removeEmptyString=u}var ee={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){ee[e]=new se(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var n=e[0];ee[n]=new se(n,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){ee[e]=new se(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){ee[e]=new se(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){ee[e]=new se(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){ee[e]=new se(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){ee[e]=new se(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){ee[e]=new se(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){ee[e]=new se(e,5,!1,e.toLowerCase(),null,!1,!1)});var Ao=/[\-:]([a-z])/g;function Bo(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var n=e.replace(Ao,Bo);ee[n]=new se(n,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var n=e.replace(Ao,Bo);ee[n]=new se(n,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var n=e.replace(Ao,Bo);ee[n]=new se(n,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){ee[e]=new se(e,1,!1,e.toLowerCase(),null,!1,!1)});ee.xlinkHref=new se("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){ee[e]=new se(e,1,!1,e.toLowerCase(),null,!0,!0)});function Wo(e,n,t,r){var l=ee.hasOwnProperty(n)?ee[n]:null;(l!==null?l.type!==0:r||!(2i||l[u]!==o[i]){var s=` +`+l[u].replace(" at new "," at ");return e.displayName&&s.includes("")&&(s=s.replace("",e.displayName)),s}while(1<=u&&0<=i);break}}}finally{Sl=!1,Error.prepareStackTrace=t}return(e=e?e.displayName||e.name:"")?yt(e):""}function Lc(e){switch(e.tag){case 5:return yt(e.type);case 16:return yt("Lazy");case 13:return yt("Suspense");case 19:return yt("SuspenseList");case 0:case 2:case 15:return e=kl(e.type,!1),e;case 11:return e=kl(e.type.render,!1),e;case 1:return e=kl(e.type,!0),e;default:return""}}function Zl(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Dn:return"Fragment";case On:return"Portal";case Ql:return"Profiler";case Qo:return"StrictMode";case Kl:return"Suspense";case Yl:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case ls:return(e.displayName||"Context")+".Consumer";case rs:return(e._context.displayName||"Context")+".Provider";case Ko:var n=e.render;return e=e.displayName,e||(e=n.displayName||n.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Yo:return n=e.displayName||null,n!==null?n:Zl(e.type)||"Memo";case Ge:n=e._payload,e=e._init;try{return Zl(e(n))}catch{}}return null}function Tc(e){var n=e.type;switch(e.tag){case 24:return"Cache";case 9:return(n.displayName||"Context")+".Consumer";case 10:return(n._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=n.render,e=e.displayName||e.name||"",n.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return n;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Zl(n);case 8:return n===Qo?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof n=="function")return n.displayName||n.name||null;if(typeof n=="string")return n}return null}function fn(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function us(e){var n=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(n==="checkbox"||n==="radio")}function Rc(e){var n=us(e)?"checked":"value",t=Object.getOwnPropertyDescriptor(e.constructor.prototype,n),r=""+e[n];if(!e.hasOwnProperty(n)&&typeof t<"u"&&typeof t.get=="function"&&typeof t.set=="function"){var l=t.get,o=t.set;return Object.defineProperty(e,n,{configurable:!0,get:function(){return l.call(this)},set:function(u){r=""+u,o.call(this,u)}}),Object.defineProperty(e,n,{enumerable:t.enumerable}),{getValue:function(){return r},setValue:function(u){r=""+u},stopTracking:function(){e._valueTracker=null,delete e[n]}}}}function tr(e){e._valueTracker||(e._valueTracker=Rc(e))}function is(e){if(!e)return!1;var n=e._valueTracker;if(!n)return!0;var t=n.getValue(),r="";return e&&(r=us(e)?e.checked?"true":"false":e.value),e=r,e!==t?(n.setValue(e),!0):!1}function Lr(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Xl(e,n){var t=n.checked;return U({},n,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:t??e._wrapperState.initialChecked})}function Hu(e,n){var t=n.defaultValue==null?"":n.defaultValue,r=n.checked!=null?n.checked:n.defaultChecked;t=fn(n.value!=null?n.value:t),e._wrapperState={initialChecked:r,initialValue:t,controlled:n.type==="checkbox"||n.type==="radio"?n.checked!=null:n.value!=null}}function ss(e,n){n=n.checked,n!=null&&Wo(e,"checked",n,!1)}function Gl(e,n){ss(e,n);var t=fn(n.value),r=n.type;if(t!=null)r==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+t):e.value!==""+t&&(e.value=""+t);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}n.hasOwnProperty("value")?Jl(e,n.type,t):n.hasOwnProperty("defaultValue")&&Jl(e,n.type,fn(n.defaultValue)),n.checked==null&&n.defaultChecked!=null&&(e.defaultChecked=!!n.defaultChecked)}function Uu(e,n,t){if(n.hasOwnProperty("value")||n.hasOwnProperty("defaultValue")){var r=n.type;if(!(r!=="submit"&&r!=="reset"||n.value!==void 0&&n.value!==null))return;n=""+e._wrapperState.initialValue,t||n===e.value||(e.value=n),e.defaultValue=n}t=e.name,t!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,t!==""&&(e.name=t)}function Jl(e,n,t){(n!=="number"||Lr(e.ownerDocument)!==e)&&(t==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+t&&(e.defaultValue=""+t))}var gt=Array.isArray;function Qn(e,n,t,r){if(e=e.options,n){n={};for(var l=0;l"+n.valueOf().toString()+"",n=rr.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;n.firstChild;)e.appendChild(n.firstChild)}});function Rt(e,n){if(n){var t=e.firstChild;if(t&&t===e.lastChild&&t.nodeType===3){t.nodeValue=n;return}}e.textContent=n}var kt={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Mc=["Webkit","ms","Moz","O"];Object.keys(kt).forEach(function(e){Mc.forEach(function(n){n=n+e.charAt(0).toUpperCase()+e.substring(1),kt[n]=kt[e]})});function ds(e,n,t){return n==null||typeof n=="boolean"||n===""?"":t||typeof n!="number"||n===0||kt.hasOwnProperty(e)&&kt[e]?(""+n).trim():n+"px"}function ps(e,n){e=e.style;for(var t in n)if(n.hasOwnProperty(t)){var r=t.indexOf("--")===0,l=ds(t,n[t],r);t==="float"&&(t="cssFloat"),r?e.setProperty(t,l):e[t]=l}}var Oc=U({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function eo(e,n){if(n){if(Oc[e]&&(n.children!=null||n.dangerouslySetInnerHTML!=null))throw Error(y(137,e));if(n.dangerouslySetInnerHTML!=null){if(n.children!=null)throw Error(y(60));if(typeof n.dangerouslySetInnerHTML!="object"||!("__html"in n.dangerouslySetInnerHTML))throw Error(y(61))}if(n.style!=null&&typeof n.style!="object")throw Error(y(62))}}function no(e,n){if(e.indexOf("-")===-1)return typeof n.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var to=null;function Zo(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var ro=null,Kn=null,Yn=null;function Bu(e){if(e=Gt(e)){if(typeof ro!="function")throw Error(y(280));var n=e.stateNode;n&&(n=ll(n),ro(e.stateNode,e.type,n))}}function ms(e){Kn?Yn?Yn.push(e):Yn=[e]:Kn=e}function hs(){if(Kn){var e=Kn,n=Yn;if(Yn=Kn=null,Bu(e),n)for(e=0;e>>=0,e===0?32:31-(Wc(e)/Qc|0)|0}var lr=64,or=4194304;function wt(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Or(e,n){var t=e.pendingLanes;if(t===0)return 0;var r=0,l=e.suspendedLanes,o=e.pingedLanes,u=t&268435455;if(u!==0){var i=u&~l;i!==0?r=wt(i):(o&=u,o!==0&&(r=wt(o)))}else u=t&~l,u!==0?r=wt(u):o!==0&&(r=wt(o));if(r===0)return 0;if(n!==0&&n!==r&&!(n&l)&&(l=r&-r,o=n&-n,l>=o||l===16&&(o&4194240)!==0))return n;if(r&4&&(r|=t&16),n=e.entangledLanes,n!==0)for(e=e.entanglements,n&=r;0t;t++)n.push(e);return n}function Zt(e,n,t){e.pendingLanes|=n,n!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,n=31-Re(n),e[n]=t}function Xc(e,n){var t=e.pendingLanes&~n;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=n,e.mutableReadLanes&=n,e.entangledLanes&=n,n=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=Ct),qu=String.fromCharCode(32),bu=!1;function js(e,n){switch(e){case"keyup":return xf.indexOf(n.keyCode)!==-1;case"keydown":return n.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Is(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var jn=!1;function Nf(e,n){switch(e){case"compositionend":return Is(n);case"keypress":return n.which!==32?null:(bu=!0,qu);case"textInput":return e=n.data,e===qu&&bu?null:e;default:return null}}function Pf(e,n){if(jn)return e==="compositionend"||!tu&&js(e,n)?(e=Os(),Sr=bo=en=null,jn=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(n.ctrlKey||n.altKey||n.metaKey)||n.ctrlKey&&n.altKey){if(n.char&&1=n)return{node:t,offset:n-e};e=r}e:{for(;t;){if(t.nextSibling){t=t.nextSibling;break e}t=t.parentNode}t=void 0}t=ri(t)}}function Us(e,n){return e&&n?e===n?!0:e&&e.nodeType===3?!1:n&&n.nodeType===3?Us(e,n.parentNode):"contains"in e?e.contains(n):e.compareDocumentPosition?!!(e.compareDocumentPosition(n)&16):!1:!1}function $s(){for(var e=window,n=Lr();n instanceof e.HTMLIFrameElement;){try{var t=typeof n.contentWindow.location.href=="string"}catch{t=!1}if(t)e=n.contentWindow;else break;n=Lr(e.document)}return n}function ru(e){var n=e&&e.nodeName&&e.nodeName.toLowerCase();return n&&(n==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||n==="textarea"||e.contentEditable==="true")}function If(e){var n=$s(),t=e.focusedElem,r=e.selectionRange;if(n!==t&&t&&t.ownerDocument&&Us(t.ownerDocument.documentElement,t)){if(r!==null&&ru(t)){if(n=r.start,e=r.end,e===void 0&&(e=n),"selectionStart"in t)t.selectionStart=n,t.selectionEnd=Math.min(e,t.value.length);else if(e=(n=t.ownerDocument||document)&&n.defaultView||window,e.getSelection){e=e.getSelection();var l=t.textContent.length,o=Math.min(r.start,l);r=r.end===void 0?o:Math.min(r.end,l),!e.extend&&o>r&&(l=r,r=o,o=l),l=li(t,o);var u=li(t,r);l&&u&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==u.node||e.focusOffset!==u.offset)&&(n=n.createRange(),n.setStart(l.node,l.offset),e.removeAllRanges(),o>r?(e.addRange(n),e.extend(u.node,u.offset)):(n.setEnd(u.node,u.offset),e.addRange(n)))}}for(n=[],e=t;e=e.parentNode;)e.nodeType===1&&n.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof t.focus=="function"&&t.focus(),t=0;t=document.documentMode,In=null,ao=null,_t=null,co=!1;function oi(e,n,t){var r=t.window===t?t.document:t.nodeType===9?t:t.ownerDocument;co||In==null||In!==Lr(r)||(r=In,"selectionStart"in r&&ru(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),_t&&Vt(_t,r)||(_t=r,r=Ir(ao,"onSelect"),0Hn||(e.current=yo[Hn],yo[Hn]=null,Hn--)}function O(e,n){Hn++,yo[Hn]=e.current,e.current=n}var dn={},le=mn(dn),fe=mn(!1),_n=dn;function qn(e,n){var t=e.type.contextTypes;if(!t)return dn;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===n)return r.__reactInternalMemoizedMaskedChildContext;var l={},o;for(o in t)l[o]=n[o];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=n,e.__reactInternalMemoizedMaskedChildContext=l),l}function de(e){return e=e.childContextTypes,e!=null}function Fr(){j(fe),j(le)}function di(e,n,t){if(le.current!==dn)throw Error(y(168));O(le,n),O(fe,t)}function Gs(e,n,t){var r=e.stateNode;if(n=n.childContextTypes,typeof r.getChildContext!="function")return t;r=r.getChildContext();for(var l in r)if(!(l in n))throw Error(y(108,Tc(e)||"Unknown",l));return U({},t,r)}function Hr(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||dn,_n=le.current,O(le,e),O(fe,fe.current),!0}function pi(e,n,t){var r=e.stateNode;if(!r)throw Error(y(169));t?(e=Gs(e,n,_n),r.__reactInternalMemoizedMergedChildContext=e,j(fe),j(le),O(le,e)):j(fe),O(fe,t)}var Ue=null,ol=!1,jl=!1;function Js(e){Ue===null?Ue=[e]:Ue.push(e)}function Zf(e){ol=!0,Js(e)}function hn(){if(!jl&&Ue!==null){jl=!0;var e=0,n=M;try{var t=Ue;for(M=1;e>=u,l-=u,$e=1<<32-Re(n)+l|t<N?(B=_,_=null):B=_.sibling;var T=p(f,_,d[N],v);if(T===null){_===null&&(_=B);break}e&&_&&T.alternate===null&&n(f,_),a=o(T,a,N),x===null?E=T:x.sibling=T,x=T,_=B}if(N===d.length)return t(f,_),V&&gn(f,N),E;if(_===null){for(;NN?(B=_,_=null):B=_.sibling;var Ne=p(f,_,T.value,v);if(Ne===null){_===null&&(_=B);break}e&&_&&Ne.alternate===null&&n(f,_),a=o(Ne,a,N),x===null?E=Ne:x.sibling=Ne,x=Ne,_=B}if(T.done)return t(f,_),V&&gn(f,N),E;if(_===null){for(;!T.done;N++,T=d.next())T=m(f,T.value,v),T!==null&&(a=o(T,a,N),x===null?E=T:x.sibling=T,x=T);return V&&gn(f,N),E}for(_=r(f,_);!T.done;N++,T=d.next())T=g(_,f,N,T.value,v),T!==null&&(e&&T.alternate!==null&&_.delete(T.key===null?N:T.key),a=o(T,a,N),x===null?E=T:x.sibling=T,x=T);return e&&_.forEach(function(it){return n(f,it)}),V&&gn(f,N),E}function I(f,a,d,v){if(typeof d=="object"&&d!==null&&d.type===Dn&&d.key===null&&(d=d.props.children),typeof d=="object"&&d!==null){switch(d.$$typeof){case nr:e:{for(var E=d.key,x=a;x!==null;){if(x.key===E){if(E=d.type,E===Dn){if(x.tag===7){t(f,x.sibling),a=l(x,d.props.children),a.return=f,f=a;break e}}else if(x.elementType===E||typeof E=="object"&&E!==null&&E.$$typeof===Ge&&Si(E)===x.type){t(f,x.sibling),a=l(x,d.props),a.ref=mt(f,x,d),a.return=f,f=a;break e}t(f,x);break}else n(f,x);x=x.sibling}d.type===Dn?(a=xn(d.props.children,f.mode,v,d.key),a.return=f,f=a):(v=zr(d.type,d.key,d.props,null,f.mode,v),v.ref=mt(f,a,d),v.return=f,f=v)}return u(f);case On:e:{for(x=d.key;a!==null;){if(a.key===x)if(a.tag===4&&a.stateNode.containerInfo===d.containerInfo&&a.stateNode.implementation===d.implementation){t(f,a.sibling),a=l(a,d.children||[]),a.return=f,f=a;break e}else{t(f,a);break}else n(f,a);a=a.sibling}a=Bl(d,f.mode,v),a.return=f,f=a}return u(f);case Ge:return x=d._init,I(f,a,x(d._payload),v)}if(gt(d))return w(f,a,d,v);if(at(d))return S(f,a,d,v);dr(f,d)}return typeof d=="string"&&d!==""||typeof d=="number"?(d=""+d,a!==null&&a.tag===6?(t(f,a.sibling),a=l(a,d),a.return=f,f=a):(t(f,a),a=Al(d,f.mode,v),a.return=f,f=a),u(f)):t(f,a)}return I}var et=oa(!0),ua=oa(!1),Jt={},Fe=mn(Jt),$t=mn(Jt),At=mn(Jt);function En(e){if(e===Jt)throw Error(y(174));return e}function du(e,n){switch(O(At,n),O($t,e),O(Fe,Jt),e=n.nodeType,e){case 9:case 11:n=(n=n.documentElement)?n.namespaceURI:bl(null,"");break;default:e=e===8?n.parentNode:n,n=e.namespaceURI||null,e=e.tagName,n=bl(n,e)}j(Fe),O(Fe,n)}function nt(){j(Fe),j($t),j(At)}function ia(e){En(At.current);var n=En(Fe.current),t=bl(n,e.type);n!==t&&(O($t,e),O(Fe,t))}function pu(e){$t.current===e&&(j(Fe),j($t))}var F=mn(0);function Qr(e){for(var n=e;n!==null;){if(n.tag===13){var t=n.memoizedState;if(t!==null&&(t=t.dehydrated,t===null||t.data==="$?"||t.data==="$!"))return n}else if(n.tag===19&&n.memoizedProps.revealOrder!==void 0){if(n.flags&128)return n}else if(n.child!==null){n.child.return=n,n=n.child;continue}if(n===e)break;for(;n.sibling===null;){if(n.return===null||n.return===e)return null;n=n.return}n.sibling.return=n.return,n=n.sibling}return null}var Il=[];function mu(){for(var e=0;et?t:4,e(!0);var r=Vl.transition;Vl.transition={};try{e(!1),n()}finally{M=t,Vl.transition=r}}function Ca(){return _e().memoizedState}function qf(e,n,t){var r=an(e);if(t={lane:r,action:t,hasEagerState:!1,eagerState:null,next:null},xa(e))_a(n,t);else if(t=na(e,n,t,r),t!==null){var l=ue();Me(t,e,r,l),Na(t,n,r)}}function bf(e,n,t){var r=an(e),l={lane:r,action:t,hasEagerState:!1,eagerState:null,next:null};if(xa(e))_a(n,l);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=n.lastRenderedReducer,o!==null))try{var u=n.lastRenderedState,i=o(u,t);if(l.hasEagerState=!0,l.eagerState=i,Oe(i,u)){var s=n.interleaved;s===null?(l.next=l,cu(n)):(l.next=s.next,s.next=l),n.interleaved=l;return}}catch{}finally{}t=na(e,n,l,r),t!==null&&(l=ue(),Me(t,e,r,l),Na(t,n,r))}}function xa(e){var n=e.alternate;return e===H||n!==null&&n===H}function _a(e,n){Nt=Kr=!0;var t=e.pending;t===null?n.next=n:(n.next=t.next,t.next=n),e.pending=n}function Na(e,n,t){if(t&4194240){var r=n.lanes;r&=e.pendingLanes,t|=r,n.lanes=t,Go(e,t)}}var Yr={readContext:xe,useCallback:ne,useContext:ne,useEffect:ne,useImperativeHandle:ne,useInsertionEffect:ne,useLayoutEffect:ne,useMemo:ne,useReducer:ne,useRef:ne,useState:ne,useDebugValue:ne,useDeferredValue:ne,useTransition:ne,useMutableSource:ne,useSyncExternalStore:ne,useId:ne,unstable_isNewReconciler:!1},ed={readContext:xe,useCallback:function(e,n){return je().memoizedState=[e,n===void 0?null:n],e},useContext:xe,useEffect:Ei,useImperativeHandle:function(e,n,t){return t=t!=null?t.concat([e]):null,xr(4194308,4,ga.bind(null,n,e),t)},useLayoutEffect:function(e,n){return xr(4194308,4,e,n)},useInsertionEffect:function(e,n){return xr(4,2,e,n)},useMemo:function(e,n){var t=je();return n=n===void 0?null:n,e=e(),t.memoizedState=[e,n],e},useReducer:function(e,n,t){var r=je();return n=t!==void 0?t(n):n,r.memoizedState=r.baseState=n,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:n},r.queue=e,e=e.dispatch=qf.bind(null,H,e),[r.memoizedState,e]},useRef:function(e){var n=je();return e={current:e},n.memoizedState=e},useState:ki,useDebugValue:wu,useDeferredValue:function(e){return je().memoizedState=e},useTransition:function(){var e=ki(!1),n=e[0];return e=Jf.bind(null,e[1]),je().memoizedState=e,[n,e]},useMutableSource:function(){},useSyncExternalStore:function(e,n,t){var r=H,l=je();if(V){if(t===void 0)throw Error(y(407));t=t()}else{if(t=n(),J===null)throw Error(y(349));Pn&30||ca(r,n,t)}l.memoizedState=t;var o={value:t,getSnapshot:n};return l.queue=o,Ei(da.bind(null,r,o,e),[e]),r.flags|=2048,Qt(9,fa.bind(null,r,o,t,n),void 0,null),t},useId:function(){var e=je(),n=J.identifierPrefix;if(V){var t=Ae,r=$e;t=(r&~(1<<32-Re(r)-1)).toString(32)+t,n=":"+n+"R"+t,t=Bt++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=u.createElement(t,{is:r.is}):(e=u.createElement(t),t==="select"&&(u=e,r.multiple?u.multiple=!0:r.size&&(u.size=r.size))):e=u.createElementNS(e,t),e[Ie]=n,e[Ut]=r,ja(e,n,!1,!1),n.stateNode=e;e:{switch(u=no(t,r),t){case"dialog":D("cancel",e),D("close",e),l=r;break;case"iframe":case"object":case"embed":D("load",e),l=r;break;case"video":case"audio":for(l=0;lrt&&(n.flags|=128,r=!0,ht(o,!1),n.lanes=4194304)}else{if(!r)if(e=Qr(u),e!==null){if(n.flags|=128,r=!0,t=e.updateQueue,t!==null&&(n.updateQueue=t,n.flags|=4),ht(o,!0),o.tail===null&&o.tailMode==="hidden"&&!u.alternate&&!V)return te(n),null}else 2*Q()-o.renderingStartTime>rt&&t!==1073741824&&(n.flags|=128,r=!0,ht(o,!1),n.lanes=4194304);o.isBackwards?(u.sibling=n.child,n.child=u):(t=o.last,t!==null?t.sibling=u:n.child=u,o.last=u)}return o.tail!==null?(n=o.tail,o.rendering=n,o.tail=n.sibling,o.renderingStartTime=Q(),n.sibling=null,t=F.current,O(F,r?t&1|2:t&1),n):(te(n),null);case 22:case 23:return _u(),r=n.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(n.flags|=8192),r&&n.mode&1?me&1073741824&&(te(n),n.subtreeFlags&6&&(n.flags|=8192)):te(n),null;case 24:return null;case 25:return null}throw Error(y(156,n.tag))}function sd(e,n){switch(ou(n),n.tag){case 1:return de(n.type)&&Fr(),e=n.flags,e&65536?(n.flags=e&-65537|128,n):null;case 3:return nt(),j(fe),j(le),mu(),e=n.flags,e&65536&&!(e&128)?(n.flags=e&-65537|128,n):null;case 5:return pu(n),null;case 13:if(j(F),e=n.memoizedState,e!==null&&e.dehydrated!==null){if(n.alternate===null)throw Error(y(340));bn()}return e=n.flags,e&65536?(n.flags=e&-65537|128,n):null;case 19:return j(F),null;case 4:return nt(),null;case 10:return au(n.type._context),null;case 22:case 23:return _u(),null;case 24:return null;default:return null}}var mr=!1,re=!1,ad=typeof WeakSet=="function"?WeakSet:Set,k=null;function Bn(e,n){var t=e.ref;if(t!==null)if(typeof t=="function")try{t(null)}catch(r){A(e,n,r)}else t.current=null}function Lo(e,n,t){try{t()}catch(r){A(e,n,r)}}var Ri=!1;function cd(e,n){if(fo=Dr,e=$s(),ru(e)){if("selectionStart"in e)var t={start:e.selectionStart,end:e.selectionEnd};else e:{t=(t=e.ownerDocument)&&t.defaultView||window;var r=t.getSelection&&t.getSelection();if(r&&r.rangeCount!==0){t=r.anchorNode;var l=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{t.nodeType,o.nodeType}catch{t=null;break e}var u=0,i=-1,s=-1,c=0,h=0,m=e,p=null;n:for(;;){for(var g;m!==t||l!==0&&m.nodeType!==3||(i=u+l),m!==o||r!==0&&m.nodeType!==3||(s=u+r),m.nodeType===3&&(u+=m.nodeValue.length),(g=m.firstChild)!==null;)p=m,m=g;for(;;){if(m===e)break n;if(p===t&&++c===l&&(i=u),p===o&&++h===r&&(s=u),(g=m.nextSibling)!==null)break;m=p,p=m.parentNode}m=g}t=i===-1||s===-1?null:{start:i,end:s}}else t=null}t=t||{start:0,end:0}}else t=null;for(po={focusedElem:e,selectionRange:t},Dr=!1,k=n;k!==null;)if(n=k,e=n.child,(n.subtreeFlags&1028)!==0&&e!==null)e.return=n,k=e;else for(;k!==null;){n=k;try{var w=n.alternate;if(n.flags&1024)switch(n.tag){case 0:case 11:case 15:break;case 1:if(w!==null){var S=w.memoizedProps,I=w.memoizedState,f=n.stateNode,a=f.getSnapshotBeforeUpdate(n.elementType===n.type?S:ze(n.type,S),I);f.__reactInternalSnapshotBeforeUpdate=a}break;case 3:var d=n.stateNode.containerInfo;d.nodeType===1?d.textContent="":d.nodeType===9&&d.documentElement&&d.removeChild(d.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(y(163))}}catch(v){A(n,n.return,v)}if(e=n.sibling,e!==null){e.return=n.return,k=e;break}k=n.return}return w=Ri,Ri=!1,w}function Pt(e,n,t){var r=n.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var l=r=r.next;do{if((l.tag&e)===e){var o=l.destroy;l.destroy=void 0,o!==void 0&&Lo(n,t,o)}l=l.next}while(l!==r)}}function sl(e,n){if(n=n.updateQueue,n=n!==null?n.lastEffect:null,n!==null){var t=n=n.next;do{if((t.tag&e)===e){var r=t.create;t.destroy=r()}t=t.next}while(t!==n)}}function To(e){var n=e.ref;if(n!==null){var t=e.stateNode;switch(e.tag){case 5:e=t;break;default:e=t}typeof n=="function"?n(e):n.current=e}}function Fa(e){var n=e.alternate;n!==null&&(e.alternate=null,Fa(n)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(n=e.stateNode,n!==null&&(delete n[Ie],delete n[Ut],delete n[vo],delete n[Kf],delete n[Yf])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Ha(e){return e.tag===5||e.tag===3||e.tag===4}function Mi(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Ha(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Ro(e,n,t){var r=e.tag;if(r===5||r===6)e=e.stateNode,n?t.nodeType===8?t.parentNode.insertBefore(e,n):t.insertBefore(e,n):(t.nodeType===8?(n=t.parentNode,n.insertBefore(e,t)):(n=t,n.appendChild(e)),t=t._reactRootContainer,t!=null||n.onclick!==null||(n.onclick=Vr));else if(r!==4&&(e=e.child,e!==null))for(Ro(e,n,t),e=e.sibling;e!==null;)Ro(e,n,t),e=e.sibling}function Mo(e,n,t){var r=e.tag;if(r===5||r===6)e=e.stateNode,n?t.insertBefore(e,n):t.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(Mo(e,n,t),e=e.sibling;e!==null;)Mo(e,n,t),e=e.sibling}var q=null,Le=!1;function Xe(e,n,t){for(t=t.child;t!==null;)Ua(e,n,t),t=t.sibling}function Ua(e,n,t){if(Ve&&typeof Ve.onCommitFiberUnmount=="function")try{Ve.onCommitFiberUnmount(el,t)}catch{}switch(t.tag){case 5:re||Bn(t,n);case 6:var r=q,l=Le;q=null,Xe(e,n,t),q=r,Le=l,q!==null&&(Le?(e=q,t=t.stateNode,e.nodeType===8?e.parentNode.removeChild(t):e.removeChild(t)):q.removeChild(t.stateNode));break;case 18:q!==null&&(Le?(e=q,t=t.stateNode,e.nodeType===8?Dl(e.parentNode,t):e.nodeType===1&&Dl(e,t),jt(e)):Dl(q,t.stateNode));break;case 4:r=q,l=Le,q=t.stateNode.containerInfo,Le=!0,Xe(e,n,t),q=r,Le=l;break;case 0:case 11:case 14:case 15:if(!re&&(r=t.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){l=r=r.next;do{var o=l,u=o.destroy;o=o.tag,u!==void 0&&(o&2||o&4)&&Lo(t,n,u),l=l.next}while(l!==r)}Xe(e,n,t);break;case 1:if(!re&&(Bn(t,n),r=t.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=t.memoizedProps,r.state=t.memoizedState,r.componentWillUnmount()}catch(i){A(t,n,i)}Xe(e,n,t);break;case 21:Xe(e,n,t);break;case 22:t.mode&1?(re=(r=re)||t.memoizedState!==null,Xe(e,n,t),re=r):Xe(e,n,t);break;default:Xe(e,n,t)}}function Oi(e){var n=e.updateQueue;if(n!==null){e.updateQueue=null;var t=e.stateNode;t===null&&(t=e.stateNode=new ad),n.forEach(function(r){var l=wd.bind(null,e,r);t.has(r)||(t.add(r),r.then(l,l))})}}function Pe(e,n){var t=n.deletions;if(t!==null)for(var r=0;rl&&(l=u),r&=~o}if(r=l,r=Q()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*dd(r/1960))-r,10e?16:e,nn===null)var r=!1;else{if(e=nn,nn=null,Gr=0,R&6)throw Error(y(331));var l=R;for(R|=4,k=e.current;k!==null;){var o=k,u=o.child;if(k.flags&16){var i=o.deletions;if(i!==null){for(var s=0;sQ()-Cu?Cn(e,0):Eu|=t),pe(e,n)}function Za(e,n){n===0&&(e.mode&1?(n=or,or<<=1,!(or&130023424)&&(or=4194304)):n=1);var t=ue();e=Ke(e,n),e!==null&&(Zt(e,n,t),pe(e,t))}function gd(e){var n=e.memoizedState,t=0;n!==null&&(t=n.retryLane),Za(e,t)}function wd(e,n){var t=0;switch(e.tag){case 13:var r=e.stateNode,l=e.memoizedState;l!==null&&(t=l.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(y(314))}r!==null&&r.delete(n),Za(e,t)}var Xa;Xa=function(e,n,t){if(e!==null)if(e.memoizedProps!==n.pendingProps||fe.current)ce=!0;else{if(!(e.lanes&t)&&!(n.flags&128))return ce=!1,ud(e,n,t);ce=!!(e.flags&131072)}else ce=!1,V&&n.flags&1048576&&qs(n,$r,n.index);switch(n.lanes=0,n.tag){case 2:var r=n.type;_r(e,n),e=n.pendingProps;var l=qn(n,le.current);Xn(n,t),l=vu(null,n,r,e,l,t);var o=yu();return n.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(n.tag=1,n.memoizedState=null,n.updateQueue=null,de(r)?(o=!0,Hr(n)):o=!1,n.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,fu(n),l.updater=ul,n.stateNode=l,l._reactInternals=n,Eo(n,r,e,t),n=_o(null,n,r,!0,o,t)):(n.tag=0,V&&o&&lu(n),oe(null,n,l,t),n=n.child),n;case 16:r=n.elementType;e:{switch(_r(e,n),e=n.pendingProps,l=r._init,r=l(r._payload),n.type=r,l=n.tag=kd(r),e=ze(r,e),l){case 0:n=xo(null,n,r,e,t);break e;case 1:n=zi(null,n,r,e,t);break e;case 11:n=Ni(null,n,r,e,t);break e;case 14:n=Pi(null,n,r,ze(r.type,e),t);break e}throw Error(y(306,r,""))}return n;case 0:return r=n.type,l=n.pendingProps,l=n.elementType===r?l:ze(r,l),xo(e,n,r,l,t);case 1:return r=n.type,l=n.pendingProps,l=n.elementType===r?l:ze(r,l),zi(e,n,r,l,t);case 3:e:{if(Ma(n),e===null)throw Error(y(387));r=n.pendingProps,o=n.memoizedState,l=o.element,ta(e,n),Wr(n,r,null,t);var u=n.memoizedState;if(r=u.element,o.isDehydrated)if(o={element:r,isDehydrated:!1,cache:u.cache,pendingSuspenseBoundaries:u.pendingSuspenseBoundaries,transitions:u.transitions},n.updateQueue.baseState=o,n.memoizedState=o,n.flags&256){l=tt(Error(y(423)),n),n=Li(e,n,r,t,l);break e}else if(r!==l){l=tt(Error(y(424)),n),n=Li(e,n,r,t,l);break e}else for(he=on(n.stateNode.containerInfo.firstChild),ve=n,V=!0,Te=null,t=ua(n,null,r,t),n.child=t;t;)t.flags=t.flags&-3|4096,t=t.sibling;else{if(bn(),r===l){n=Ye(e,n,t);break e}oe(e,n,r,t)}n=n.child}return n;case 5:return ia(n),e===null&&wo(n),r=n.type,l=n.pendingProps,o=e!==null?e.memoizedProps:null,u=l.children,mo(r,l)?u=null:o!==null&&mo(r,o)&&(n.flags|=32),Ra(e,n),oe(e,n,u,t),n.child;case 6:return e===null&&wo(n),null;case 13:return Oa(e,n,t);case 4:return du(n,n.stateNode.containerInfo),r=n.pendingProps,e===null?n.child=et(n,null,r,t):oe(e,n,r,t),n.child;case 11:return r=n.type,l=n.pendingProps,l=n.elementType===r?l:ze(r,l),Ni(e,n,r,l,t);case 7:return oe(e,n,n.pendingProps,t),n.child;case 8:return oe(e,n,n.pendingProps.children,t),n.child;case 12:return oe(e,n,n.pendingProps.children,t),n.child;case 10:e:{if(r=n.type._context,l=n.pendingProps,o=n.memoizedProps,u=l.value,O(Ar,r._currentValue),r._currentValue=u,o!==null)if(Oe(o.value,u)){if(o.children===l.children&&!fe.current){n=Ye(e,n,t);break e}}else for(o=n.child,o!==null&&(o.return=n);o!==null;){var i=o.dependencies;if(i!==null){u=o.child;for(var s=i.firstContext;s!==null;){if(s.context===r){if(o.tag===1){s=Be(-1,t&-t),s.tag=2;var c=o.updateQueue;if(c!==null){c=c.shared;var h=c.pending;h===null?s.next=s:(s.next=h.next,h.next=s),c.pending=s}}o.lanes|=t,s=o.alternate,s!==null&&(s.lanes|=t),So(o.return,t,n),i.lanes|=t;break}s=s.next}}else if(o.tag===10)u=o.type===n.type?null:o.child;else if(o.tag===18){if(u=o.return,u===null)throw Error(y(341));u.lanes|=t,i=u.alternate,i!==null&&(i.lanes|=t),So(u,t,n),u=o.sibling}else u=o.child;if(u!==null)u.return=o;else for(u=o;u!==null;){if(u===n){u=null;break}if(o=u.sibling,o!==null){o.return=u.return,u=o;break}u=u.return}o=u}oe(e,n,l.children,t),n=n.child}return n;case 9:return l=n.type,r=n.pendingProps.children,Xn(n,t),l=xe(l),r=r(l),n.flags|=1,oe(e,n,r,t),n.child;case 14:return r=n.type,l=ze(r,n.pendingProps),l=ze(r.type,l),Pi(e,n,r,l,t);case 15:return La(e,n,n.type,n.pendingProps,t);case 17:return r=n.type,l=n.pendingProps,l=n.elementType===r?l:ze(r,l),_r(e,n),n.tag=1,de(r)?(e=!0,Hr(n)):e=!1,Xn(n,t),la(n,r,l),Eo(n,r,l,t),_o(null,n,r,!0,e,t);case 19:return Da(e,n,t);case 22:return Ta(e,n,t)}throw Error(y(156,n.tag))};function Ga(e,n){return Es(e,n)}function Sd(e,n,t,r){this.tag=e,this.key=t,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=n,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Ee(e,n,t,r){return new Sd(e,n,t,r)}function Pu(e){return e=e.prototype,!(!e||!e.isReactComponent)}function kd(e){if(typeof e=="function")return Pu(e)?1:0;if(e!=null){if(e=e.$$typeof,e===Ko)return 11;if(e===Yo)return 14}return 2}function cn(e,n){var t=e.alternate;return t===null?(t=Ee(e.tag,n,e.key,e.mode),t.elementType=e.elementType,t.type=e.type,t.stateNode=e.stateNode,t.alternate=e,e.alternate=t):(t.pendingProps=n,t.type=e.type,t.flags=0,t.subtreeFlags=0,t.deletions=null),t.flags=e.flags&14680064,t.childLanes=e.childLanes,t.lanes=e.lanes,t.child=e.child,t.memoizedProps=e.memoizedProps,t.memoizedState=e.memoizedState,t.updateQueue=e.updateQueue,n=e.dependencies,t.dependencies=n===null?null:{lanes:n.lanes,firstContext:n.firstContext},t.sibling=e.sibling,t.index=e.index,t.ref=e.ref,t}function zr(e,n,t,r,l,o){var u=2;if(r=e,typeof e=="function")Pu(e)&&(u=1);else if(typeof e=="string")u=5;else e:switch(e){case Dn:return xn(t.children,l,o,n);case Qo:u=8,l|=8;break;case Ql:return e=Ee(12,t,n,l|2),e.elementType=Ql,e.lanes=o,e;case Kl:return e=Ee(13,t,n,l),e.elementType=Kl,e.lanes=o,e;case Yl:return e=Ee(19,t,n,l),e.elementType=Yl,e.lanes=o,e;case os:return cl(t,l,o,n);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case rs:u=10;break e;case ls:u=9;break e;case Ko:u=11;break e;case Yo:u=14;break e;case Ge:u=16,r=null;break e}throw Error(y(130,e==null?e:typeof e,""))}return n=Ee(u,t,n,l),n.elementType=e,n.type=r,n.lanes=o,n}function xn(e,n,t,r){return e=Ee(7,e,r,n),e.lanes=t,e}function cl(e,n,t,r){return e=Ee(22,e,r,n),e.elementType=os,e.lanes=t,e.stateNode={isHidden:!1},e}function Al(e,n,t){return e=Ee(6,e,null,n),e.lanes=t,e}function Bl(e,n,t){return n=Ee(4,e.children!==null?e.children:[],e.key,n),n.lanes=t,n.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},n}function Ed(e,n,t,r,l){this.tag=n,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Cl(0),this.expirationTimes=Cl(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Cl(0),this.identifierPrefix=r,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function zu(e,n,t,r,l,o,u,i,s){return e=new Ed(e,n,t,i,s),n===1?(n=1,o===!0&&(n|=8)):n=0,o=Ee(3,null,null,n),e.current=o,o.stateNode=e,o.memoizedState={element:r,isDehydrated:t,cache:null,transitions:null,pendingSuspenseBoundaries:null},fu(o),e}function Cd(e,n,t){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(ec)}catch(e){console.error(e)}}ec(),qi.exports=ge;var zd=qi.exports,nc,$i=zd;nc=$i.createRoot,$i.hydrateRoot;function Ld(){return $.jsxs("svg",{width:"137",height:"40",viewBox:"0 0 137 40",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[$.jsx("path",{d:"M24.1831 16.0007H16.1225V24.0004H24.1831V16.0007Z",fill:"#161616"}),$.jsx("path",{d:"M32.2436 5.44985V0H8.06062V5.44985C8.06062 6.8587 6.91086 7.99978 5.4913 7.99978H0V32.0002H5.4913C6.91086 32.0002 8.06062 33.1413 8.06062 34.5502V40H32.2436V34.5502C32.2436 33.1413 33.3934 32.0002 34.8129 32.0002H40.3042V7.99978H34.8129C33.3934 7.99978 32.2436 6.8587 32.2436 5.44985ZM32.2436 29.4492C32.2436 30.858 31.0939 31.9991 29.6743 31.9991H10.6311C9.2115 31.9991 8.06174 30.858 8.06174 29.4492V10.5497C8.06174 9.14086 9.2115 7.99978 10.6311 7.99978H29.6743C31.0939 7.99978 32.2436 9.14086 32.2436 10.5497V29.4492Z",fill:"#161616"}),$.jsx("path",{d:"M64.0092 7.99974H60.4546V31.9991H76.2523V28.6047H64.0092V7.99974Z",fill:"#161616"}),$.jsx("path",{d:"M86.5004 15.0661H85.2364C81.4368 15.0661 77.6035 17.3783 77.6035 22.5426V25.0525C77.6035 29.7335 80.3329 32.529 84.9039 32.529H86.834C90.6908 32.529 93.4348 30.2757 93.9979 26.6469L94.0472 26.3269H90.3863L90.3258 26.5247C89.784 28.3046 88.3678 29.1346 85.869 29.1346C82.6257 29.1346 81.0953 27.7047 81.0584 24.637H94.1334V22.5426C94.1334 17.3783 90.3001 15.0661 86.5004 15.0661ZM81.1636 21.6371C81.5263 19.386 82.9134 18.4605 85.8679 18.4605C88.8223 18.4605 90.2083 19.386 90.571 21.6371H81.1636Z",fill:"#161616"}),$.jsx("path",{d:"M101.226 7.99974H97.6722V15.0662H95.31V18.4606H97.6722V25.1837C97.6722 31.1135 101.307 31.9991 103.475 31.9991H105.717V28.6047H104.44C102.157 28.6047 101.226 27.4603 101.226 24.6559V18.4617H105.717V15.0673H101.226V7.99974Z",fill:"#161616"}),$.jsx("path",{d:"M113.234 7.99974H109.681V15.0662H107.318V18.4606H109.681V25.1837C109.681 31.1135 113.316 31.9991 115.483 31.9991H117.726V28.6047H116.448C114.165 28.6047 113.234 27.4603 113.234 24.6559V18.4617H117.726V15.0673H113.234V7.99974Z",fill:"#161616"}),$.jsx("path",{d:"M136.034 28.6046C135.33 28.6046 135.016 28.3135 135.016 27.6602V21.8815C135.016 15.9517 131.381 15.0661 129.214 15.0661H125.954C123.135 15.0661 120.118 17.115 120.118 20.1649V20.4426H123.671V20.1649C123.671 19.2249 124.83 18.4616 126.253 18.4616H128.249C130.799 18.4616 131.35 19.3727 131.452 21.4071H126.319C122.35 21.4071 119.684 23.5092 119.684 26.638V27.0014C119.684 28.6535 120.33 32.4967 126.319 32.4967C127.848 32.4967 130.52 32.2312 131.958 30.5379C132.829 32.0012 134.664 32.0012 136.034 32.0012H136.314V28.6069H136.034V28.6046ZM131.462 26.8014C131.462 28.6869 128.446 29.0991 127.283 29.0991C123.898 29.0991 123.237 28.2802 123.237 26.8669C123.237 25.2981 124.636 24.4692 127.283 24.4692H131.462V26.8014Z",fill:"#161616"})]})}function Td(){return $.jsx("svg",{width:"16",height:"13",viewBox:"0 0 16 13",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:$.jsx("path",{d:"M14.4373 2.55366V5.21163H13.2678V3.332H12.4534V2.41123H11.4604V0H8.97894V1.94985H7.01906V0H4.53761V2.41123H3.54463V3.332H2.73019V5.21163H1.56068V2.55366H0V6.94885H0.850552V7.65697H1.7011V9.35807H3.96991V10.7222H2.48144V12.4774H4.4674V10.5978H6.52357V8.9669H9.47643V10.5978H11.5326V12.4774H13.5186V10.7222H12.0301V9.35807H14.2989V7.65697H15.1494V6.94885H16V2.55366H14.4393H14.4373ZM6.56971 7.12738H5.32798V5.001H6.56971V7.12738ZM10.668 7.12738H9.42628V5.001H10.668V7.12738Z",fill:"#FDFEFF"})})}function Rd(){return $.jsx("div",{className:"fixed bg-white w-[100dvh] p-0 h-[100dvh] flex items-center justify-center",children:$.jsxs("div",{className:"max-w-[893px] w-full border p-10 flex flex-col gap-5",children:[$.jsx(Ld,{}),$.jsxs("div",{className:"flex gap-2 flex-col max-w-[600px]",children:[$.jsx("h1",{className:"font-semibold text-3xl",children:"Experience the new ADE"}),$.jsx("h3",{className:"text-lg",children:"We have launched the next-generation Agent Development Environment (ADE) for interacting with agents both in the cloud and locally."}),$.jsx("p",{className:"mt-10",children:"The old Letta chat UI is no longer supported past Letta version 0.5.0. To use the old chat interface, please downgrade your Letta version."}),$.jsx("div",{className:"flex mt-3",children:$.jsxs("a",{href:"https://app.letta.com",className:"bg-black flex gap-3 items-center px-4 py-3 text-white text-bold",children:[$.jsx(Td,{}),"Open the new ADE"]})})]})]})})}const Md=nc(document.getElementById("root"));Md.render($.jsx($o.StrictMode,{children:$.jsx(Rd,{})})); diff --git a/letta/server/static_files/assets/index-56a3f8c6.css b/letta/server/static_files/assets/index-56a3f8c6.css deleted file mode 100644 index c8f2a7f16f..0000000000 --- a/letta/server/static_files/assets/index-56a3f8c6.css +++ /dev/null @@ -1 +0,0 @@ -*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}:root{--background: 210, 10%, 92%;--background-lighter: 0, 0%, 100%;--background-darker: 210, 6%, 86%;--foreground: 224 71.4% 4.1%;--card: 0 0% 100%;--card-foreground: 224 71.4% 4.1%;--popover: 0 0% 100%;--popover-foreground: 224 71.4% 4.1%;--primary: 220.9 39.3% 11%;--primary-foreground: 210 20% 98%;--secondary: 240, 92%, 35%;--secondary-foreground: 0, 0%, 100%;--muted: 220 14.3% 95.9%;--muted-foreground: 220 8.9% 46.1%;--accent: 220 14.3% 95.9%;--accent-foreground: 220.9 39.3% 11%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 210 20% 98%;--border: 210, 6%, 86%;--input: 210, 6%, 86%;--ring: 224 71.4% 4.1%;--radius: .5rem}.dark{--background: 224 71.4% 4.1%;--background-lighter: 224 71.4% 4.1%;--background-darker: 224 71.4% 4.1%;--foreground: 210 20% 98%;--card: 224 71.4% 4.1%;--card-foreground: 210 20% 98%;--popover: 224 71.4% 4.1%;--popover-foreground: 210 20% 98%;--primary: 210 20% 98%;--primary-foreground: 220.9 39.3% 11%;--secondary: 10, 100%, 60%;--secondary-foreground: 210 20% 98%;--muted: 215 27.9% 16.9%;--muted-foreground: 217.9 10.6% 64.9%;--accent: 215 27.9% 16.9%;--accent-foreground: 210 20% 98%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 210 20% 98%;--border: 215 27.9% 16.9%;--input: 215 27.9% 16.9%;--ring: 216 12.2% 83.9%}*{border-color:hsl(var(--border))}html{height:100%}body{height:100%;width:100%;background-color:hsl(var(--background));color:hsl(var(--foreground));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}input::file-selector-button{color:hsl(var(--foreground))}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.prose-sm{font-size:.875rem;line-height:1.7142857}.prose-sm :where(p):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm :where([class~="lead"]):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:1.2857143em;line-height:1.5555556;margin-top:.8888889em;margin-bottom:.8888889em}.prose-sm :where(blockquote):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.3333333em;margin-bottom:1.3333333em;padding-inline-start:1.1111111em}.prose-sm :where(h1):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:2.1428571em;margin-top:0;margin-bottom:.8em;line-height:1.2}.prose-sm :where(h2):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:1.4285714em;margin-top:1.6em;margin-bottom:.8em;line-height:1.4}.prose-sm :where(h3):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:1.2857143em;margin-top:1.5555556em;margin-bottom:.4444444em;line-height:1.5555556}.prose-sm :where(h4):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.4285714em;margin-bottom:.5714286em;line-height:1.4285714}.prose-sm :where(img):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(picture):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(picture > img):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:0;margin-bottom:0}.prose-sm :where(video):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(kbd):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:.8571429em;border-radius:.3125rem;padding-top:.1428571em;padding-inline-end:.3571429em;padding-bottom:.1428571em;padding-inline-start:.3571429em}.prose-sm :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:.8571429em}.prose-sm :where(h2 code):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:.9em}.prose-sm :where(h3 code):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:.8888889em}.prose-sm :where(pre):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:.8571429em;line-height:1.6666667;margin-top:1.6666667em;margin-bottom:1.6666667em;border-radius:.25rem;padding-top:.6666667em;padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(ol):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.1428571em;margin-bottom:1.1428571em;padding-inline-start:1.5714286em}.prose-sm :where(ul):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.1428571em;margin-bottom:1.1428571em;padding-inline-start:1.5714286em}.prose-sm :where(li):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:.2857143em;margin-bottom:.2857143em}.prose-sm :where(ol > li):not(:where([class~="not-prose"],[class~="not-prose"] *)){padding-inline-start:.4285714em}.prose-sm :where(ul > li):not(:where([class~="not-prose"],[class~="not-prose"] *)){padding-inline-start:.4285714em}.prose-sm :where(.prose-sm > ul > li p):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:.5714286em;margin-bottom:.5714286em}.prose-sm :where(.prose-sm > ul > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.1428571em}.prose-sm :where(.prose-sm > ul > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-bottom:1.1428571em}.prose-sm :where(.prose-sm > ol > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.1428571em}.prose-sm :where(.prose-sm > ol > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-bottom:1.1428571em}.prose-sm :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:.5714286em;margin-bottom:.5714286em}.prose-sm :where(dl):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm :where(dt):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.1428571em}.prose-sm :where(dd):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:.2857143em;padding-inline-start:1.5714286em}.prose-sm :where(hr):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:2.8571429em;margin-bottom:2.8571429em}.prose-sm :where(hr + *):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:0}.prose-sm :where(h2 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:0}.prose-sm :where(h3 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:0}.prose-sm :where(h4 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:0}.prose-sm :where(table):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:.8571429em;line-height:1.5}.prose-sm :where(thead th):not(:where([class~="not-prose"],[class~="not-prose"] *)){padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(thead th:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){padding-inline-start:0}.prose-sm :where(thead th:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){padding-inline-end:0}.prose-sm :where(tbody td,tfoot td):not(:where([class~="not-prose"],[class~="not-prose"] *)){padding-top:.6666667em;padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(tbody td:first-child,tfoot td:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){padding-inline-start:0}.prose-sm :where(tbody td:last-child,tfoot td:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){padding-inline-end:0}.prose-sm :where(figure):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(figure > *):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:0;margin-bottom:0}.prose-sm :where(figcaption):not(:where([class~="not-prose"],[class~="not-prose"] *)){font-size:.8571429em;line-height:1.3333333;margin-top:.6666667em}.prose-sm :where(.prose-sm > :first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-top:0}.prose-sm :where(.prose-sm > :last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)){margin-bottom:0}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.\!collapse{visibility:collapse!important}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0px}.bottom-0{bottom:0px}.bottom-2{bottom:.5rem}.left-2{left:.5rem}.left-3{left:.75rem}.left-\[12px\]{left:12px}.left-\[50\%\]{left:50%}.right-0{right:0px}.right-2{right:.5rem}.right-2\.5{right:.625rem}.right-3{right:.75rem}.right-4{right:1rem}.top-0{top:0px}.top-2{top:.5rem}.top-2\.5{top:.625rem}.top-3{top:.75rem}.top-4{top:1rem}.top-\[50\%\]{top:50%}.z-10{z-index:10}.z-50{z-index:50}.z-\[100\]{z-index:100}.order-2{order:2}.m-2{margin:.5rem}.m-2\.5{margin:.625rem}.\!my-4{margin-top:1rem!important;margin-bottom:1rem!important}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.-mx-4{margin-left:-1rem;margin-right:-1rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-10{margin-top:2.5rem;margin-bottom:2.5rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.\!-mt-4{margin-top:-1rem!important}.-ml-1{margin-left:-.25rem}.-ml-2{margin-left:-.5rem}.-ml-3{margin-left:-.75rem}.-mt-2{margin-top:-.5rem}.-mt-8{margin-top:-2rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-6{margin-left:1.5rem}.ml-8{margin-left:2rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-4{margin-right:1rem}.mt-0{margin-top:0}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-px{margin-top:1px}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.\!table{display:table!important}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.aspect-square{aspect-ratio:1 / 1}.size-3{width:.75rem;height:.75rem}.size-3\.5{width:.875rem;height:.875rem}.size-4{width:1rem;height:1rem}.size-5{width:1.25rem;height:1.25rem}.size-6{width:1.5rem;height:1.5rem}.\!h-6{height:1.5rem!important}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[1px\]{height:1px}.h-\[24px\]{height:24px}.h-\[35px\]{height:35px}.h-\[56px\]{height:56px}.h-\[70px\]{height:70px}.h-\[78px\]{height:78px}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-full{height:100%}.h-px{height:1px}.max-h-\[200px\]{max-height:200px}.max-h-\[400px\]{max-height:400px}.max-h-\[95svh\]{max-height:95svh}.max-h-screen{max-height:100vh}.min-h-0{min-height:0px}.min-h-40{min-height:10rem}.min-h-8{min-height:2rem}.min-h-80{min-height:20rem}.min-h-96{min-height:24rem}.min-h-\[10rem\]{min-height:10rem}.min-h-\[60vh\]{min-height:60vh}.min-h-\[80px\]{min-height:80px}.\!w-6{width:1.5rem!important}.w-10{width:2.5rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-52{width:13rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-96{width:24rem}.w-\[100px\]{width:100px}.w-\[150px\]{width:150px}.w-\[1px\]{width:1px}.w-\[300px\]{width:300px}.w-\[340px\]{width:340px}.w-\[44px\]{width:44px}.w-\[70px\]{width:70px}.w-\[80px\]{width:80px}.w-\[95\%\]{width:95%}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-min{width:-moz-min-content;width:min-content}.w-px{width:1px}.min-w-\[50px\]{min-width:50px}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.max-w-80{max-width:20rem}.max-w-lg{max-width:32rem}.max-w-screen-lg{max-width:1024px}.max-w-xl{max-width:36rem}.flex-1{flex:1 1 0%}.flex-none{flex:none}.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.origin-left{transform-origin:left}.translate-x-\[-50\%\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes ping{75%,to{transform:scale(2);opacity:0}}.animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}@keyframes progress{0%{transform:translate(0) scaleX(0)}40%{transform:translate(0) scaleX(.4)}to{transform:translate(100%) scaleX(.5)}}.animate-progress{animation:progress 1.5s infinite linear}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.scroll-m-20{scroll-margin:5rem}.scroll-pb-10{scroll-padding-bottom:2.5rem}.list-disc{list-style-type:disc}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-8{gap:2rem}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.25rem * var(--tw-space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(1rem * var(--tw-space-x-reverse));margin-left:calc(1rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(1.5rem * var(--tw-space-x-reverse));margin-left:calc(1.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-x-scroll{overflow-x:scroll}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-none{border-radius:0}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-br-none{border-bottom-right-radius:0}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-0{border-bottom-width:0px}.border-b-\[1px\]{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-r-2{border-right-width:2px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-destructive{border-color:hsl(var(--destructive))}.border-destructive\/50{border-color:hsl(var(--destructive) / .5)}.border-input{border-color:hsl(var(--input))}.border-muted{border-color:hsl(var(--muted))}.border-primary{border-color:hsl(var(--primary))}.border-transparent{border-color:transparent}.border-white{--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity))}.bg-\[\#ecedef\]{--tw-bg-opacity: 1;background-color:rgb(236 237 239 / var(--tw-bg-opacity))}.bg-accent{background-color:hsl(var(--accent))}.bg-background{background-color:hsl(var(--background))}.bg-background-darker{background-color:hsl(var(--background-darker))}.bg-background-lighter{background-color:hsl(var(--background-lighter))}.bg-background\/80{background-color:hsl(var(--background) / .8)}.bg-background\/95{background-color:hsl(var(--background) / .95)}.bg-blue-400{--tw-bg-opacity: 1;background-color:rgb(96 165 250 / var(--tw-bg-opacity))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity))}.bg-border{background-color:hsl(var(--border))}.bg-card{background-color:hsl(var(--card))}.bg-destructive{background-color:hsl(var(--destructive))}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity))}.bg-muted{background-color:hsl(var(--muted))}.bg-muted\/50{background-color:hsl(var(--muted) / .5)}.bg-popover{background-color:hsl(var(--popover))}.bg-primary{background-color:hsl(var(--primary))}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity))}.bg-secondary{background-color:hsl(var(--secondary))}.bg-slate-950{--tw-bg-opacity: 1;background-color:rgb(2 6 23 / var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.bg-zinc-800{--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity))}.bg-zinc-950{--tw-bg-opacity: 1;background-color:rgb(9 9 11 / var(--tw-bg-opacity))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-transparent{--tw-gradient-from: transparent var(--tw-gradient-from-position);--tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-background{--tw-gradient-to: hsl(var(--background)) var(--tw-gradient-to-position)}.to-55\%{--tw-gradient-to-position: 55%}.fill-current{fill:currentColor}.\!p-1{padding:.25rem!important}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-20{padding:5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-0{padding-left:0;padding-right:0}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.px-\[0\.3rem\]{padding-left:.3rem;padding-right:.3rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-\[0\.2rem\]{padding-top:.2rem;padding-bottom:.2rem}.pb-10{padding-bottom:2.5rem}.pb-16{padding-bottom:4rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-6{padding-bottom:1.5rem}.pl-10{padding-left:2.5rem}.pl-6{padding-left:1.5rem}.pl-7{padding-left:1.75rem}.pl-8{padding-left:2rem}.pl-9{padding-left:2.25rem}.pr-1{padding-right:.25rem}.pr-1\.5{padding-right:.375rem}.pr-10{padding-right:2.5rem}.pr-2{padding-right:.5rem}.pr-4{padding-right:1rem}.pr-6{padding-right:1.5rem}.pr-8{padding-right:2rem}.pt-0{padding-top:0}.pt-2{padding-top:.5rem}.pt-2\.5{padding-top:.625rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.pt-8{padding-top:2rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.font-sans{font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji"}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-7{line-height:1.75rem}.leading-none{line-height:1}.tracking-tight{letter-spacing:-.025em}.tracking-widest{letter-spacing:.1em}.text-accent-foreground{color:hsl(var(--accent-foreground))}.text-background{color:hsl(var(--background))}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity))}.text-card-foreground{color:hsl(var(--card-foreground))}.text-current{color:currentColor}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-emerald-600{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity))}.text-foreground{color:hsl(var(--foreground))}.text-foreground\/50{color:hsl(var(--foreground) / .5)}.text-gray-100{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-muted-foreground\/60{color:hsl(var(--muted-foreground) / .6)}.text-muted-foreground\/70{color:hsl(var(--muted-foreground) / .7)}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.text-zinc-100{--tw-text-opacity: 1;color:rgb(244 244 245 / var(--tw-text-opacity))}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-0{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur{--tw-backdrop-blur: blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-700{transition-duration:.7s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.animate-in{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.fade-in-0{--tw-enter-opacity: 0}.zoom-in-95{--tw-enter-scale: .95}.slide-in-from-bottom-2{--tw-enter-translate-y: .5rem}.slide-in-from-top{--tw-enter-translate-y: -100%}.slide-out-to-top{--tw-exit-translate-y: -100%}.duration-200{animation-duration:.2s}.duration-300{animation-duration:.3s}.duration-700{animation-duration:.7s}.ease-in-out{animation-timing-function:cubic-bezier(.4,0,.2,1)}.running{animation-play-state:running}.PopoverContent{width:var(--radix-popover-trigger-width);max-height:var(--radix-popover-content-available-height)}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:inset-y-0:after{content:var(--tw-content);top:0px;bottom:0px}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:w-1:after{content:var(--tw-content);width:.25rem}.after\:-translate-x-1\/2:after{content:var(--tw-content);--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.first\:mt-0:first-child{margin-top:0}.hover\:border-accent:hover{border-color:hsl(var(--accent))}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-destructive\/80:hover{background-color:hsl(var(--destructive) / .8)}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-muted:hover{background-color:hsl(var(--muted))}.hover\:bg-muted\/50:hover{background-color:hsl(var(--muted) / .5)}.hover\:bg-primary\/80:hover{background-color:hsl(var(--primary) / .8)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary) / .9)}.hover\:bg-secondary:hover{background-color:hsl(var(--secondary))}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary) / .8)}.hover\:bg-transparent:hover{background-color:transparent}.hover\:bg-zinc-800:hover{--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity))}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-background:hover{color:hsl(var(--background))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:opacity-100:focus{opacity:1}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color: hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-0:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.focus-visible\:ring-slate-700:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: rgb(51 65 85 / var(--tw-ring-opacity))}.focus-visible\:ring-offset-0:focus-visible{--tw-ring-offset-width: 0px}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width: 1px}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color: hsl(var(--background))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:opacity-100{opacity:1}.group[data-collapsed=true] .group-\[\[data-collapsed\=true\]\]\:justify-center{justify-content:center}.group.destructive .group-\[\.destructive\]\:border-muted\/40{border-color:hsl(var(--muted) / .4)}.group[data-collapsed=true] .group-\[\[data-collapsed\=true\]\]\:px-2{padding-left:.5rem;padding-right:.5rem}.group.destructive .group-\[\.destructive\]\:text-red-300{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity))}.group.destructive .group-\[\.destructive\]\:hover\:border-destructive\/30:hover{border-color:hsl(var(--destructive) / .3)}.group.destructive .group-\[\.destructive\]\:hover\:bg-destructive:hover{background-color:hsl(var(--destructive))}.group.destructive .group-\[\.destructive\]\:hover\:text-destructive-foreground:hover{color:hsl(var(--destructive-foreground))}.group.destructive .group-\[\.destructive\]\:hover\:text-red-50:hover{--tw-text-opacity: 1;color:rgb(254 242 242 / var(--tw-text-opacity))}.group.destructive .group-\[\.destructive\]\:focus\:ring-destructive:focus{--tw-ring-color: hsl(var(--destructive))}.group.destructive .group-\[\.destructive\]\:focus\:ring-red-400:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(248 113 113 / var(--tw-ring-opacity))}.group.destructive .group-\[\.destructive\]\:focus\:ring-offset-red-600:focus{--tw-ring-offset-color: #dc2626}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.has-\[\:disabled\]\:opacity-50:has(:disabled){opacity:.5}.has-\[\:focus\]\:ring-2:has(:focus){--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.has-\[\:focus\]\:ring-ring:has(:focus){--tw-ring-color: hsl(var(--ring))}.has-\[\:focus\]\:ring-offset-2:has(:focus){--tw-ring-offset-width: 2px}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[panel-group-direction\=vertical\]\:h-px[data-panel-group-direction=vertical]{height:1px}.data-\[panel-group-direction\=vertical\]\:w-full[data-panel-group-direction=vertical]{width:100%}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=checked\]\:translate-x-5[data-state=checked]{--tw-translate-x: 1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked],.data-\[swipe\=cancel\]\:translate-x-0[data-swipe=cancel]{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[swipe\=end\]\:translate-x-\[var\(--radix-toast-swipe-end-x\)\][data-swipe=end]{--tw-translate-x: var(--radix-toast-swipe-end-x);transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[swipe\=move\]\:translate-x-\[var\(--radix-toast-swipe-move-x\)\][data-swipe=move]{--tw-translate-x: var(--radix-toast-swipe-move-x);transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[panel-group-direction\=vertical\]\:flex-col[data-panel-group-direction=vertical]{flex-direction:column}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:hsl(var(--primary))}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:hsl(var(--muted))}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:hsl(var(--input))}.data-\[collapsed\=true\]\:py-2[data-collapsed=true]{padding-top:.5rem;padding-bottom:.5rem}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:hsl(var(--muted-foreground))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[swipe\=move\]\:transition-none[data-swipe=move]{transition-property:none}.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.data-\[state\=closed\]\:animate-out[data-state=closed],.data-\[swipe\=end\]\:animate-out[data-swipe=end]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity: initial;--tw-exit-scale: initial;--tw-exit-rotate: initial;--tw-exit-translate-x: initial;--tw-exit-translate-y: initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity: 0}.data-\[state\=closed\]\:fade-out-80[data-state=closed]{--tw-exit-opacity: .8}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity: 0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale: .95}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale: .95}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y: -.5rem}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x: .5rem}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x: -.5rem}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y: .5rem}.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x: -50%}.data-\[state\=closed\]\:slide-out-to-right-full[data-state=closed]{--tw-exit-translate-x: 100%}.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y: -48%}.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x: -50%}.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y: -48%}.data-\[state\=open\]\:slide-in-from-top-full[data-state=open]{--tw-enter-translate-y: -100%}.data-\[panel-group-direction\=vertical\]\:after\:left-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);left:0px}.data-\[panel-group-direction\=vertical\]\:after\:h-1[data-panel-group-direction=vertical]:after{content:var(--tw-content);height:.25rem}.data-\[panel-group-direction\=vertical\]\:after\:w-full[data-panel-group-direction=vertical]:after{content:var(--tw-content);width:100%}.data-\[panel-group-direction\=vertical\]\:after\:-translate-y-1\/2[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[panel-group-direction\=vertical\]\:after\:translate-x-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.prose-p\:m-0 :is(:where(p):not(:where([class~="not-prose"],[class~="not-prose"] *))){margin:0}.prose-p\:leading-relaxed :is(:where(p):not(:where([class~="not-prose"],[class~="not-prose"] *))){line-height:1.625}.prose-pre\:p-0 :is(:where(pre):not(:where([class~="not-prose"],[class~="not-prose"] *))){padding:0}.prose-li\:list-disc :is(:where(li):not(:where([class~="not-prose"],[class~="not-prose"] *))){list-style-type:disc}@supports ((-webkit-backdrop-filter: var(--tw)) or (backdrop-filter: var(--tw))){.supports-\[backdrop-filter\]\:bg-background\/60{background-color:hsl(var(--background) / .6)}}:is(.dark .dark\:border-destructive){border-color:hsl(var(--destructive))}:is(.dark .dark\:bg-muted){background-color:hsl(var(--muted))}:is(.dark .dark\:text-muted-foreground){color:hsl(var(--muted-foreground))}:is(.dark .dark\:text-white){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}:is(.dark .dark\:hover\:bg-muted:hover){background-color:hsl(var(--muted))}:is(.dark .dark\:hover\:text-white:hover){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}@media (min-width: 640px){.sm\:bottom-0{bottom:0px}.sm\:right-0{right:0px}.sm\:top-auto{top:auto}.sm\:mx-auto{margin-left:auto;margin-right:auto}.sm\:mt-0{margin-top:0}.sm\:w-\[500px\]{width:500px}.sm\:max-w-\[350px\]{max-width:350px}.sm\:max-w-\[800px\]{max-width:800px}.sm\:flex-row{flex-direction:row}.sm\:flex-col{flex-direction:column}.sm\:justify-end{justify-content:flex-end}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:text-left{text-align:left}.data-\[state\=open\]\:sm\:slide-in-from-bottom-full[data-state=open]{--tw-enter-translate-y: 100%}}@media (min-width: 768px){.md\:w-52{width:13rem}.md\:w-full{width:100%}.md\:max-w-\[420px\]{max-width:420px}}@media (min-width: 1024px){.lg\:flex{display:flex}.lg\:w-1\/5{width:20%}.lg\:w-80{width:20rem}.lg\:max-w-4xl{max-width:56rem}.lg\:flex-row{flex-direction:row}.lg\:flex-col{flex-direction:column}.lg\:space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(0px * var(--tw-space-x-reverse));margin-left:calc(0px * calc(1 - var(--tw-space-x-reverse)))}.lg\:space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(3rem * var(--tw-space-x-reverse));margin-left:calc(3rem * calc(1 - var(--tw-space-x-reverse)))}.lg\:space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(2rem * var(--tw-space-x-reverse));margin-left:calc(2rem * calc(1 - var(--tw-space-x-reverse)))}.lg\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.lg\:space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.lg\:text-5xl{font-size:3rem;line-height:1}}.\[\&\.active\]\:bg-muted.active,.\[\&\.active\]\:hover\:bg-muted:hover.active{background-color:hsl(var(--muted))}.\[\&\.active\]\:hover\:no-underline:hover.active{text-decoration-line:none}.\[\&\:has\(\[data-state\=checked\]\)\>div\]\:border-primary:has([data-state=checked])>div{border-color:hsl(var(--primary))}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\&\:not\(\:first-child\)\]\:mt-6:not(:first-child){margin-top:1.5rem}.\[\&\>li\]\:mt-2>li{margin-top:.5rem}.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div{--tw-translate-y: -3px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\[\&\>svg\]\:absolute>svg{position:absolute}.\[\&\>svg\]\:left-2\.5>svg{left:.625rem}.\[\&\>svg\]\:left-4>svg{left:1rem}.\[\&\>svg\]\:top-2\.5>svg{top:.625rem}.\[\&\>svg\]\:top-4>svg{top:1rem}.\[\&\>svg\]\:text-destructive>svg{color:hsl(var(--destructive))}.\[\&\>svg\]\:text-foreground>svg{color:hsl(var(--foreground))}.\[\&\>svg\~\*\]\:pl-7>svg~*{padding-left:1.75rem}.\[\&\[data-panel-group-direction\=vertical\]\>div\]\:rotate-90[data-panel-group-direction=vertical]>div{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\[\&_p\]\:leading-relaxed p{line-height:1.625}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-width:0px}.\[\&_tr\]\:border-b tr{border-bottom-width:1px}code[class*=language-],pre[class*=language-]{color:#fff;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;text-shadow:0 -.1em .2em black;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}pre[class*=language-],:not(pre)>code[class*=language-]{background:hsl(0,0%,8%)}pre[class*=language-]{border-radius:.5em;border:.3em solid hsl(0,0%,33%);box-shadow:1px 1px .5em #000 inset;margin:.5em 0;overflow:auto;padding:1em}pre[class*=language-]::-moz-selection{background:hsl(200,4%,16%)}pre[class*=language-]::selection{background:hsl(200,4%,16%)}pre[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,code[class*=language-] ::-moz-selection{text-shadow:none;background:hsla(0,0%,93%,.15)}pre[class*=language-]::selection,pre[class*=language-] ::selection,code[class*=language-]::selection,code[class*=language-] ::selection{text-shadow:none;background:hsla(0,0%,93%,.15)}:not(pre)>code[class*=language-]{border-radius:.3em;border:.13em solid hsl(0,0%,33%);box-shadow:1px 1px .3em -.1em #000 inset;padding:.15em .2em .05em;white-space:normal}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:#787878}.token.punctuation,.token.namespace{opacity:.7}.token.tag,.token.boolean,.token.number,.token.deleted{color:#cf694a}.token.keyword,.token.property,.token.selector,.token.constant,.token.symbol,.token.builtin{color:#f9ee9a}.token.attr-name,.token.attr-value,.token.string,.token.char,.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string,.token.variable,.token.inserted{color:#919e6b}.token.atrule{color:#7386a5}.token.regex,.token.important{color:#e9c163}.token.important,.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.language-markup .token.tag,.language-markup .token.attr-name,.language-markup .token.punctuation{color:#ad895c}.token{position:relative;z-index:1}.line-highlight.line-highlight{background:hsla(0,0%,33%,.25);background:linear-gradient(to right,hsla(0,0%,33%,.1) 70%,hsla(0,0%,33%,0));border-bottom:1px dashed hsl(0,0%,33%);border-top:1px dashed hsl(0,0%,33%);margin-top:.75em;z-index:0}.line-highlight.line-highlight:before,.line-highlight.line-highlight[data-end]:after{background-color:#8794a6;color:#f5f2f0} diff --git a/letta/server/static_files/index.html b/letta/server/static_files/index.html index a16f6d7b7f..003573298e 100644 --- a/letta/server/static_files/index.html +++ b/letta/server/static_files/index.html @@ -29,8 +29,8 @@ } } - - + +
From d2f60b804aaa78817448c359d0b826246f8790ff Mon Sep 17 00:00:00 2001 From: Shubham Naik Date: Sat, 7 Dec 2024 10:47:32 -0800 Subject: [PATCH 030/280] chore: drop ade flag (#2185) Co-authored-by: Shubham Naik --- letta/cli/cli.py | 1 - letta/server/rest_api/app.py | 5 ++--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/letta/cli/cli.py b/letta/cli/cli.py index 2e18dcb98b..e7f811e9f3 100644 --- a/letta/cli/cli.py +++ b/letta/cli/cli.py @@ -51,7 +51,6 @@ def server( port: Annotated[Optional[int], typer.Option(help="Port to run the server on")] = None, host: Annotated[Optional[str], typer.Option(help="Host to run the server on (default to localhost)")] = None, debug: Annotated[bool, typer.Option(help="Turn debugging output on")] = False, - ade: Annotated[bool, typer.Option(help="Allows remote access")] = False, secure: Annotated[bool, typer.Option(help="Adds simple security access")] = False, ): """Launch a Letta server process""" diff --git a/letta/server/rest_api/app.py b/letta/server/rest_api/app.py index ab2c340ef7..4db8323668 100644 --- a/letta/server/rest_api/app.py +++ b/letta/server/rest_api/app.py @@ -144,9 +144,8 @@ def create_application() -> "FastAPI": debug=True, ) - if (os.getenv("LETTA_SERVER_ADE") == "true") or "--ade" in sys.argv: - settings.cors_origins.append("https://app.letta.com") - print(f"▶ View using ADE at: https://app.letta.com/development-servers/local/dashboard") + settings.cors_origins.append("https://app.letta.com") + print(f"▶ View using ADE at: https://app.letta.com/development-servers/local/dashboard") if (os.getenv("LETTA_SERVER_SECURE") == "true") or "--secure" in sys.argv: print(f"▶ Using secure mode with password: {random_password}") From ccf15b3b8b6211ee86dfcf9663e4badf64fafef8 Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Sat, 7 Dec 2024 11:50:18 -0800 Subject: [PATCH 031/280] feat: support system message for chatml wrapper (#2187) --- .../llm_chat_completion_wrappers/chatml.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/letta/local_llm/llm_chat_completion_wrappers/chatml.py b/letta/local_llm/llm_chat_completion_wrappers/chatml.py index 82155d955e..baa1592324 100644 --- a/letta/local_llm/llm_chat_completion_wrappers/chatml.py +++ b/letta/local_llm/llm_chat_completion_wrappers/chatml.py @@ -3,6 +3,7 @@ from letta.local_llm.llm_chat_completion_wrappers.wrapper_base import ( LLMChatCompletionWrapper, ) +from letta.schemas.enums import MessageRole from letta.utils import json_dumps, json_loads PREFIX_HINT = """# Reminders: @@ -208,7 +209,9 @@ def chat_completion_to_prompt(self, messages, functions, first_message=False, fu # Last are the user/assistant messages for message in messages[1:]: - assert message["role"] in ["user", "assistant", "function", "tool"], message + # check that message["role"] is a valid option for MessageRole + # TODO: this shouldn't be necessary if we use pydantic in the future + assert message["role"] in [role.value for role in MessageRole] if message["role"] == "user": # Support for AutoGen naming of agents @@ -231,6 +234,15 @@ def chat_completion_to_prompt(self, messages, functions, first_message=False, fu prompt += f"\n<|im_start|>{role_str}\n{msg_str.strip()}<|im_end|>" + elif message["role"] == "system": + + role_str = "system" + msg_str = self._compile_system_message( + system_message=message["content"], functions=functions, function_documentation=function_documentation + ) + + prompt += f"\n<|im_start|>{role_str}\n{msg_str.strip()}<|im_end|>" + elif message["role"] in ["tool", "function"]: if self.allow_function_role: role_str = message["role"] From 14d1009d15d74908fa089380b544a7c4db8a9f16 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Sat, 7 Dec 2024 12:18:17 -0800 Subject: [PATCH 032/280] fix: Fix composio tool add (#2188) --- examples/composio_tool_usage.py | 15 ++++++++++ letta/client/client.py | 2 +- letta/functions/helpers.py | 6 ++-- letta/schemas/tool.py | 23 ++++++++------ letta/server/rest_api/routers/v1/tools.py | 30 ++++++++++++++++--- letta/server/server.py | 21 +++++++------ letta/services/sandbox_config_manager.py | 15 ++++++++++ letta/services/tool_manager.py | 4 +-- ...integration_test_tool_execution_sandbox.py | 3 +- tests/test_v1_routes.py | 20 +++++++++++-- 10 files changed, 106 insertions(+), 33 deletions(-) diff --git a/examples/composio_tool_usage.py b/examples/composio_tool_usage.py index 26508fcdf1..877d375456 100644 --- a/examples/composio_tool_usage.py +++ b/examples/composio_tool_usage.py @@ -1,10 +1,14 @@ import json +import os import uuid from letta import create_client from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import ChatMemory +from letta.schemas.sandbox_config import SandboxEnvironmentVariableCreate, SandboxType +from letta.services.sandbox_config_manager import SandboxConfigManager +from letta.settings import tool_settings """ Setup here. @@ -25,6 +29,17 @@ print(f"Deleted agent: {agent_state.name} with ID {str(agent_state.id)}") +# Add sandbox env +manager = SandboxConfigManager(tool_settings) +# Ensure you have e2b key set +sandbox_config = manager.get_or_create_default_sandbox_config(sandbox_type=SandboxType.E2B, actor=client.user) +manager.create_sandbox_env_var( + SandboxEnvironmentVariableCreate(key="COMPOSIO_API_KEY", value=os.environ.get("COMPOSIO_API_KEY")), + sandbox_config_id=sandbox_config.id, + actor=client.user, +) + + """ This example show how you can add Composio tools . diff --git a/letta/client/client.py b/letta/client/client.py index 485ce30050..b56bc19f6d 100644 --- a/letta/client/client.py +++ b/letta/client/client.py @@ -2683,7 +2683,7 @@ def load_crewai_tool(self, crewai_tool: "CrewAIBaseTool", additional_imports_mod return self.server.tool_manager.create_or_update_tool(pydantic_tool=Tool(**tool_create.model_dump()), actor=self.user) def load_composio_tool(self, action: "ActionType") -> Tool: - tool_create = ToolCreate.from_composio(action=action) + tool_create = ToolCreate.from_composio(action_name=action.name) return self.server.tool_manager.create_or_update_tool(pydantic_tool=Tool(**tool_create.model_dump()), actor=self.user) def create_tool( diff --git a/letta/functions/helpers.py b/letta/functions/helpers.py index d94eb7da7d..d58efc4633 100644 --- a/letta/functions/helpers.py +++ b/letta/functions/helpers.py @@ -4,12 +4,12 @@ from pydantic import BaseModel -def generate_composio_tool_wrapper(action: "ActionType") -> tuple[str, str]: +def generate_composio_tool_wrapper(action_name: str) -> tuple[str, str]: # Instantiate the object - tool_instantiation_str = f"composio_toolset.get_tools(actions=[Action.{str(action)}])[0]" + tool_instantiation_str = f"composio_toolset.get_tools(actions=['{action_name}'])[0]" # Generate func name - func_name = action.name.lower() + func_name = action_name.lower() wrapper_function_str = f""" def {func_name}(**kwargs): diff --git a/letta/schemas/tool.py b/letta/schemas/tool.py index ba84455186..f02cf1fd3a 100644 --- a/letta/schemas/tool.py +++ b/letta/schemas/tool.py @@ -93,7 +93,7 @@ class ToolCreate(LettaBase): ) @classmethod - def from_composio(cls, action: "ActionType") -> "ToolCreate": + def from_composio(cls, action_name: str, api_key: Optional[str] = None) -> "ToolCreate": """ Class method to create an instance of Letta-compatible Composio Tool. Check https://docs.composio.dev/introduction/intro/overview to look at options for from_composio @@ -101,15 +101,20 @@ def from_composio(cls, action: "ActionType") -> "ToolCreate": This function will error if we find more than one tool, or 0 tools. Args: - action ActionType: A action name to filter tools by. + action_name str: A action name to filter tools by. Returns: Tool: A Letta Tool initialized with attributes derived from the Composio tool. """ from composio import LogLevel from composio_langchain import ComposioToolSet - composio_toolset = ComposioToolSet(logging_level=LogLevel.ERROR) - composio_tools = composio_toolset.get_tools(actions=[action]) + if api_key: + # Pass in an external API key + composio_toolset = ComposioToolSet(logging_level=LogLevel.ERROR, api_key=api_key) + else: + # Use environmental variable + composio_toolset = ComposioToolSet(logging_level=LogLevel.ERROR) + composio_tools = composio_toolset.get_tools(actions=[action_name]) assert len(composio_tools) > 0, "User supplied parameters do not match any Composio tools" assert len(composio_tools) == 1, f"User supplied parameters match too many Composio tools; {len(composio_tools)} > 1" @@ -119,7 +124,7 @@ def from_composio(cls, action: "ActionType") -> "ToolCreate": description = composio_tool.description source_type = "python" tags = ["composio"] - wrapper_func_name, wrapper_function_str = generate_composio_tool_wrapper(action) + wrapper_func_name, wrapper_function_str = generate_composio_tool_wrapper(action_name) json_schema = generate_schema_from_args_schema_v2(composio_tool.args_schema, name=wrapper_func_name, description=description) return cls( @@ -179,10 +184,10 @@ def load_default_langchain_tools(cls) -> List["ToolCreate"]: def load_default_composio_tools(cls) -> List["ToolCreate"]: from composio_langchain import Action - calculator = ToolCreate.from_composio(action=Action.MATHEMATICAL_CALCULATOR) - serp_news = ToolCreate.from_composio(action=Action.SERPAPI_NEWS_SEARCH) - serp_google_search = ToolCreate.from_composio(action=Action.SERPAPI_SEARCH) - serp_google_maps = ToolCreate.from_composio(action=Action.SERPAPI_GOOGLE_MAPS_SEARCH) + calculator = ToolCreate.from_composio(action_name=Action.MATHEMATICAL_CALCULATOR.name) + serp_news = ToolCreate.from_composio(action_name=Action.SERPAPI_NEWS_SEARCH.name) + serp_google_search = ToolCreate.from_composio(action_name=Action.SERPAPI_SEARCH.name) + serp_google_maps = ToolCreate.from_composio(action_name=Action.SERPAPI_GOOGLE_MAPS_SEARCH.name) return [calculator, serp_news, serp_google_search, serp_google_maps] diff --git a/letta/server/rest_api/routers/v1/tools.py b/letta/server/rest_api/routers/v1/tools.py index c9b60f7855..1b5e2eac8c 100644 --- a/letta/server/rest_api/routers/v1/tools.py +++ b/letta/server/rest_api/routers/v1/tools.py @@ -7,6 +7,7 @@ from letta.orm.errors import UniqueConstraintViolationError from letta.schemas.letta_message import FunctionReturn from letta.schemas.tool import Tool, ToolCreate, ToolRunFromSource, ToolUpdate +from letta.schemas.user import User from letta.server.rest_api.utils import get_letta_server from letta.server.server import SyncServer @@ -213,22 +214,27 @@ def run_tool_from_source( @router.get("/composio/apps", response_model=List[AppModel], operation_id="list_composio_apps") -def list_composio_apps(server: SyncServer = Depends(get_letta_server)): +def list_composio_apps(server: SyncServer = Depends(get_letta_server), user_id: Optional[str] = Header(None, alias="user_id")): """ Get a list of all Composio apps """ - return server.get_composio_apps() + actor = server.get_user_or_default(user_id=user_id) + composio_api_key = get_composio_key(server, actor=actor) + return server.get_composio_apps(api_key=composio_api_key) @router.get("/composio/apps/{composio_app_name}/actions", response_model=List[ActionModel], operation_id="list_composio_actions_by_app") def list_composio_actions_by_app( composio_app_name: str, server: SyncServer = Depends(get_letta_server), + user_id: Optional[str] = Header(None, alias="user_id"), ): """ Get a list of all Composio actions for a specific app """ - return server.get_composio_actions_from_app_name(composio_app_name=composio_app_name) + actor = server.get_user_or_default(user_id=user_id) + composio_api_key = get_composio_key(server, actor=actor) + return server.get_composio_actions_from_app_name(composio_app_name=composio_app_name, api_key=composio_api_key) @router.post("/composio/{composio_action_name}", response_model=Tool, operation_id="add_composio_tool") @@ -241,5 +247,21 @@ def add_composio_tool( Add a new Composio tool by action name (Composio refers to each tool as an `Action`) """ actor = server.get_user_or_default(user_id=user_id) - tool_create = ToolCreate.from_composio(action=composio_action_name) + composio_api_key = get_composio_key(server, actor=actor) + tool_create = ToolCreate.from_composio(action_name=composio_action_name, api_key=composio_api_key) return server.tool_manager.create_or_update_tool(pydantic_tool=Tool(**tool_create.model_dump()), actor=actor) + + +# TODO: Factor this out to somewhere else +def get_composio_key(server: SyncServer, actor: User): + api_keys = server.sandbox_config_manager.list_sandbox_env_vars_by_key(key="COMPOSIO_API_KEY", actor=actor) + if not api_keys: + raise HTTPException( + status_code=400, # Bad Request + detail=f"No API keys found for Composio. Please add your Composio API Key as an environment variable for your sandbox configuration.", + ) + + # TODO: Add more protections around this + # Ideally, not tied to a specific sandbox, but for now we just get the first one + # Theoretically possible for someone to have different composio api keys per sandbox + return api_keys[0].value diff --git a/letta/server/server.py b/letta/server/server.py index 7a430862e4..fa3d29fa21 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -236,11 +236,6 @@ def __init__( # Locks self.send_message_lock = Lock() - # Composio - self.composio_client = None - if tool_settings.composio_api_key: - self.composio_client = Composio(api_key=tool_settings.composio_api_key) - # Initialize the metadata store config = LettaConfig.load() if settings.letta_pg_uri_no_default: @@ -1899,9 +1894,17 @@ def run_tool_from_source( ) # Composio wrappers - def get_composio_apps(self) -> List["AppModel"]: + def get_composio_client(self, api_key: Optional[str] = None): + if api_key: + return Composio(api_key=api_key) + elif tool_settings.composio_api_key: + return Composio(api_key=tool_settings.composio_api_key) + else: + return Composio() + + def get_composio_apps(self, api_key: Optional[str] = None) -> List["AppModel"]: """Get a list of all Composio apps with actions""" - apps = self.composio_client.apps.get() + apps = self.get_composio_client(api_key=api_key).apps.get() apps_with_actions = [] for app in apps: # A bit of hacky logic until composio patches this @@ -1910,6 +1913,6 @@ def get_composio_apps(self) -> List["AppModel"]: return apps_with_actions - def get_composio_actions_from_app_name(self, composio_app_name: str) -> List["ActionModel"]: - actions = self.composio_client.actions.get(apps=[composio_app_name]) + def get_composio_actions_from_app_name(self, composio_app_name: str, api_key: Optional[str] = None) -> List["ActionModel"]: + actions = self.get_composio_client(api_key=api_key).actions.get(apps=[composio_app_name]) return actions diff --git a/letta/services/sandbox_config_manager.py b/letta/services/sandbox_config_manager.py index 48e53f9f5d..05b669d82c 100644 --- a/letta/services/sandbox_config_manager.py +++ b/letta/services/sandbox_config_manager.py @@ -225,6 +225,21 @@ def list_sandbox_env_vars( ) return [env_var.to_pydantic() for env_var in env_vars] + @enforce_types + def list_sandbox_env_vars_by_key( + self, key: str, actor: PydanticUser, cursor: Optional[str] = None, limit: Optional[int] = 50 + ) -> List[PydanticEnvVar]: + """List all sandbox environment variables with optional pagination.""" + with self.session_maker() as session: + env_vars = SandboxEnvVarModel.list( + db_session=session, + cursor=cursor, + limit=limit, + organization_id=actor.organization_id, + key=key, + ) + return [env_var.to_pydantic() for env_var in env_vars] + @enforce_types def get_sandbox_env_vars_as_dict( self, sandbox_config_id: str, actor: PydanticUser, cursor: Optional[str] = None, limit: Optional[int] = 50 diff --git a/letta/services/tool_manager.py b/letta/services/tool_manager.py index 6e1818e3ba..63240930fe 100644 --- a/letta/services/tool_manager.py +++ b/letta/services/tool_manager.py @@ -40,8 +40,6 @@ def create_or_update_tool(self, pydantic_tool: PydanticTool, actor: PydanticUser if tool: # Put to dict and remove fields that should not be reset update_data = pydantic_tool.model_dump(exclude={"module"}, exclude_unset=True, exclude_none=True) - # Remove redundant update fields - update_data = {key: value for key, value in update_data.items() if getattr(tool, key) != value} # If there's anything to update if update_data: @@ -108,7 +106,7 @@ def update_tool_by_id(self, tool_id: str, tool_update: ToolUpdate, actor: Pydant tool = ToolModel.read(db_session=session, identifier=tool_id, actor=actor) # Update tool attributes with only the fields that were explicitly set - update_data = tool_update.model_dump(exclude_unset=True, exclude_none=True) + update_data = tool_update.model_dump(exclude_none=True) for key, value in update_data.items(): setattr(tool, key, value) diff --git a/tests/integration_test_tool_execution_sandbox.py b/tests/integration_test_tool_execution_sandbox.py index 0574e43cae..e13275b21a 100644 --- a/tests/integration_test_tool_execution_sandbox.py +++ b/tests/integration_test_tool_execution_sandbox.py @@ -5,7 +5,6 @@ from unittest.mock import patch import pytest -from composio import Action from sqlalchemy import delete from letta import create_client @@ -200,7 +199,7 @@ def create_list(): @pytest.fixture def composio_github_star_tool(test_user): tool_manager = ToolManager() - tool_create = ToolCreate.from_composio(action=Action.GITHUB_STAR_A_REPOSITORY_FOR_THE_AUTHENTICATED_USER) + tool_create = ToolCreate.from_composio(action_name="GITHUB_STAR_A_REPOSITORY_FOR_THE_AUTHENTICATED_USER") tool = tool_manager.create_or_update_tool(pydantic_tool=Tool(**tool_create.model_dump()), actor=test_user) yield tool diff --git a/tests/test_v1_routes.py b/tests/test_v1_routes.py index 883395e1bd..8f9d9972fe 100644 --- a/tests/test_v1_routes.py +++ b/tests/test_v1_routes.py @@ -162,6 +162,16 @@ def composio_actions(): ] +def configure_mock_sync_server(mock_sync_server): + # Mock sandbox config manager to return a valid API key + mock_api_key = Mock() + mock_api_key.value = "mock_composio_api_key" + mock_sync_server.sandbox_config_manager.list_sandbox_env_vars_by_key.return_value = [mock_api_key] + + # Mock user retrieval + mock_sync_server.get_user_or_default.return_value = Mock() # Provide additional attributes if needed + + # ====================================================================================================================== # Tools Routes Tests # ====================================================================================================================== @@ -274,6 +284,8 @@ def test_add_base_tools(client, mock_sync_server, add_integers_tool): def test_list_composio_apps(client, mock_sync_server, composio_apps): + configure_mock_sync_server(mock_sync_server) + mock_sync_server.get_composio_apps.return_value = composio_apps response = client.get("/v1/tools/composio/apps") @@ -284,16 +296,20 @@ def test_list_composio_apps(client, mock_sync_server, composio_apps): def test_list_composio_actions_by_app(client, mock_sync_server, composio_actions): + configure_mock_sync_server(mock_sync_server) + mock_sync_server.get_composio_actions_from_app_name.return_value = composio_actions response = client.get("/v1/tools/composio/apps/App1/actions") assert response.status_code == 200 assert len(response.json()) == 1 - mock_sync_server.get_composio_actions_from_app_name.assert_called_once_with(composio_app_name="App1") + mock_sync_server.get_composio_actions_from_app_name.assert_called_once_with(composio_app_name="App1", api_key="mock_composio_api_key") def test_add_composio_tool(client, mock_sync_server, add_integers_tool): + configure_mock_sync_server(mock_sync_server) + # Mock ToolCreate.from_composio to return the expected ToolCreate object with patch("letta.schemas.tool.ToolCreate.from_composio") as mock_from_composio: mock_from_composio.return_value = ToolCreate( @@ -314,4 +330,4 @@ def test_add_composio_tool(client, mock_sync_server, add_integers_tool): mock_sync_server.tool_manager.create_or_update_tool.assert_called_once() # Verify the mocked from_composio method was called - mock_from_composio.assert_called_once_with(action=add_integers_tool.name) + mock_from_composio.assert_called_once_with(action_name=add_integers_tool.name, api_key="mock_composio_api_key") From 3ee3793a4f85dd84a886019e3246a551e7914d31 Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Sat, 7 Dec 2024 12:52:51 -0800 Subject: [PATCH 033/280] fix: temp disable stream tokens (#2189) --- .persist/.gitkeep | 0 letta/server/rest_api/routers/v1/agents.py | 2 ++ letta/server/rest_api/utils.py | 4 +++- letta/services/sandbox_config_manager.py | 2 +- 4 files changed, 6 insertions(+), 2 deletions(-) delete mode 100644 .persist/.gitkeep diff --git a/.persist/.gitkeep b/.persist/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index 20661ef9b7..ebf10b7cdd 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -486,6 +486,8 @@ async def send_message_streaming( This endpoint accepts a message from a user and processes it through the agent. It will stream the steps of the response always, and stream the tokens if 'stream_tokens' is set to True. """ + request.stream_tokens = False + actor = server.get_user_or_default(user_id=user_id) result = await send_message_to_agent( server=server, diff --git a/letta/server/rest_api/utils.py b/letta/server/rest_api/utils.py index 4fd92b5aad..a87400dc27 100644 --- a/letta/server/rest_api/utils.py +++ b/letta/server/rest_api/utils.py @@ -1,6 +1,5 @@ import asyncio import json -import traceback import warnings from enum import Enum from typing import AsyncGenerator, Optional, Union @@ -62,6 +61,9 @@ async def sse_async_generator( raise ValueError(f"Expected LettaUsageStatistics, got {type(usage)}") yield sse_formatter({"usage": usage.model_dump()}) except Exception as e: + import traceback + + traceback.print_exc() warnings.warn(f"Error getting usage data: {e}") yield sse_formatter({"error": "Failed to get usage data"}) diff --git a/letta/services/sandbox_config_manager.py b/letta/services/sandbox_config_manager.py index 05b669d82c..c91e6669f1 100644 --- a/letta/services/sandbox_config_manager.py +++ b/letta/services/sandbox_config_manager.py @@ -33,7 +33,7 @@ def __init__(self, settings): def get_or_create_default_sandbox_config(self, sandbox_type: SandboxType, actor: PydanticUser) -> PydanticSandboxConfig: sandbox_config = self.get_sandbox_config_by_type(sandbox_type, actor=actor) if not sandbox_config: - logger.info(f"Creating new sandbox config of type {sandbox_type}, none found for organization {actor.organization_id}.") + logger.debug(f"Creating new sandbox config of type {sandbox_type}, none found for organization {actor.organization_id}.") # TODO: Add more sandbox types later if sandbox_type == SandboxType.E2B: From ee0ab8d7d6777934cc8330d8ee9a765b2b8c2ec8 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Sat, 7 Dec 2024 13:11:46 -0800 Subject: [PATCH 034/280] fix: Patch dummy message and fix test (#2192) --- letta/client/client.py | 4 +++- letta/llm_api/openai.py | 1 - letta/schemas/tool.py | 14 ++++++++------ tests/helpers/endpoints_helper.py | 3 +-- tests/test_client_legacy.py | 15 ++++++++++++--- 5 files changed, 24 insertions(+), 13 deletions(-) diff --git a/letta/client/client.py b/letta/client/client.py index b56bc19f6d..eaf477e935 100644 --- a/letta/client/client.py +++ b/letta/client/client.py @@ -22,7 +22,7 @@ from letta.schemas.enums import JobStatus, MessageRole from letta.schemas.file import FileMetadata from letta.schemas.job import Job -from letta.schemas.letta_request import LettaRequest +from letta.schemas.letta_request import LettaRequest, LettaStreamingRequest from letta.schemas.letta_response import LettaResponse, LettaStreamingResponse from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import ( @@ -965,8 +965,10 @@ def send_message( if stream_tokens or stream_steps: from letta.client.streaming import _sse_post + request = LettaStreamingRequest(messages=messages, stream_tokens=stream_tokens) return _sse_post(f"{self.base_url}/{self.api_prefix}/agents/{agent_id}/messages/stream", request.model_dump(), self.headers) else: + request = LettaRequest(messages=messages) response = requests.post( f"{self.base_url}/{self.api_prefix}/agents/{agent_id}/messages", json=request.model_dump(), headers=self.headers ) diff --git a/letta/llm_api/openai.py b/letta/llm_api/openai.py index e83e855b90..813ae68d59 100644 --- a/letta/llm_api/openai.py +++ b/letta/llm_api/openai.py @@ -217,7 +217,6 @@ def openai_chat_completions_process_stream( dummy_message = _Message( role=_MessageRole.assistant, text="", - user_id="", agent_id="", model="", name=None, diff --git a/letta/schemas/tool.py b/letta/schemas/tool.py index f02cf1fd3a..ed31f9d687 100644 --- a/letta/schemas/tool.py +++ b/letta/schemas/tool.py @@ -182,14 +182,16 @@ def load_default_langchain_tools(cls) -> List["ToolCreate"]: @classmethod def load_default_composio_tools(cls) -> List["ToolCreate"]: - from composio_langchain import Action + pass - calculator = ToolCreate.from_composio(action_name=Action.MATHEMATICAL_CALCULATOR.name) - serp_news = ToolCreate.from_composio(action_name=Action.SERPAPI_NEWS_SEARCH.name) - serp_google_search = ToolCreate.from_composio(action_name=Action.SERPAPI_SEARCH.name) - serp_google_maps = ToolCreate.from_composio(action_name=Action.SERPAPI_GOOGLE_MAPS_SEARCH.name) + # TODO: Disable composio tools for now + # TODO: Naming is causing issues + # calculator = ToolCreate.from_composio(action_name=Action.MATHEMATICAL_CALCULATOR.name) + # serp_news = ToolCreate.from_composio(action_name=Action.SERPAPI_NEWS_SEARCH.name) + # serp_google_search = ToolCreate.from_composio(action_name=Action.SERPAPI_SEARCH.name) + # serp_google_maps = ToolCreate.from_composio(action_name=Action.SERPAPI_GOOGLE_MAPS_SEARCH.name) - return [calculator, serp_news, serp_google_search, serp_google_maps] + return [] class ToolUpdate(LettaBase): diff --git a/tests/helpers/endpoints_helper.py b/tests/helpers/endpoints_helper.py index 27c45de786..47424572a1 100644 --- a/tests/helpers/endpoints_helper.py +++ b/tests/helpers/endpoints_helper.py @@ -170,8 +170,7 @@ def check_agent_uses_external_tool(filename: str) -> LettaResponse: # Set up client client = create_client() cleanup(client=client, agent_uuid=agent_uuid) - # tool = client.load_composio_tool(action=Action.GITHUB_STAR_A_REPOSITORY_FOR_THE_AUTHENTICATED_USER) - tool = client.load_composio_tool(action=Action.WEBTOOL_SCRAPE_WEBSITE_CONTENT) + tool = client.load_composio_tool(action=Action.GITHUB_STAR_A_REPOSITORY_FOR_THE_AUTHENTICATED_USER) tool_name = tool.name # Set up persona for tool usage diff --git a/tests/test_client_legacy.py b/tests/test_client_legacy.py index b5bad0d869..ce93457bb7 100644 --- a/tests/test_client_legacy.py +++ b/tests/test_client_legacy.py @@ -81,7 +81,7 @@ def client(request): # use local client (no server) client = create_client() - client.set_default_llm_config(LLMConfig.default_config("gpt-4")) + client.set_default_llm_config(LLMConfig.default_config("gpt-4o-mini")) client.set_default_embedding_config(EmbeddingConfig.default_config(provider="openai")) yield client @@ -223,7 +223,8 @@ def test_core_memory(mock_e2b_api_key_none, client: Union[LocalClient, RESTClien assert "Timber" in memory.get_block("human").value, f"Updating core memory failed: {memory.get_block('human').value}" -def test_streaming_send_message(mock_e2b_api_key_none, client: Union[LocalClient, RESTClient], agent: AgentState): +@pytest.mark.parametrize("stream_tokens", [True, False]) +def test_streaming_send_message(mock_e2b_api_key_none, client: RESTClient, agent: AgentState, stream_tokens): if isinstance(client, LocalClient): pytest.skip("Skipping test_streaming_send_message because LocalClient does not support streaming") assert isinstance(client, RESTClient), client @@ -236,12 +237,13 @@ def test_streaming_send_message(mock_e2b_api_key_none, client: Union[LocalClient message="This is a test. Repeat after me: 'banana'", role="user", stream_steps=True, - stream_tokens=True, + stream_tokens=stream_tokens, ) # Some manual checks to run # 1. Check that there were inner thoughts inner_thoughts_exist = False + inner_thoughts_count = 0 # 2. Check that the agent runs `send_message` send_message_ran = False # 3. Check that we get all the start/stop/end tokens we want @@ -256,6 +258,7 @@ def test_streaming_send_message(mock_e2b_api_key_none, client: Union[LocalClient assert isinstance(chunk, LettaStreamingResponse) if isinstance(chunk, InternalMonologue) and chunk.internal_monologue and chunk.internal_monologue != "": inner_thoughts_exist = True + inner_thoughts_count += 1 if isinstance(chunk, FunctionCallMessage) and chunk.function_call and chunk.function_call.name == "send_message": send_message_ran = True if isinstance(chunk, MessageStreamStatus): @@ -275,6 +278,12 @@ def test_streaming_send_message(mock_e2b_api_key_none, client: Union[LocalClient assert chunk.prompt_tokens > 1000 assert chunk.total_tokens > 1000 + # If stream tokens, we expect at least one inner thought + if stream_tokens: + assert inner_thoughts_count > 1, "Expected more than one inner thought" + else: + assert inner_thoughts_count == 1, "Expected one inner thought" + assert inner_thoughts_exist, "No inner thoughts found" assert send_message_ran, "send_message function call not found" assert done, "Message stream not done" From 9b339efaec0f63ce396ded82eec59004f57a53a0 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Sat, 7 Dec 2024 14:09:20 -0800 Subject: [PATCH 035/280] fix: Updating messages (#2186) --- ...7a33843feb_migrate_messages_to_the_orm.py} | 14 +++-- letta/agent.py | 51 +++++-------------- letta/client/client.py | 9 ++-- letta/orm/message.py | 4 +- letta/schemas/message.py | 10 ++-- letta/server/rest_api/routers/v1/agents.py | 7 ++- letta/server/server.py | 6 +-- letta/services/message_manager.py | 32 ++++++++---- tests/test_client_legacy.py | 6 +-- tests/test_managers.py | 10 ++-- 10 files changed, 65 insertions(+), 84 deletions(-) rename alembic/versions/{95badb46fdf9_migrate_message_to_orm.py => d27a33843feb_migrate_messages_to_the_orm.py} (87%) diff --git a/alembic/versions/95badb46fdf9_migrate_message_to_orm.py b/alembic/versions/d27a33843feb_migrate_messages_to_the_orm.py similarity index 87% rename from alembic/versions/95badb46fdf9_migrate_message_to_orm.py rename to alembic/versions/d27a33843feb_migrate_messages_to_the_orm.py index 73254e39ea..575bd25bd7 100644 --- a/alembic/versions/95badb46fdf9_migrate_message_to_orm.py +++ b/alembic/versions/d27a33843feb_migrate_messages_to_the_orm.py @@ -1,8 +1,8 @@ -"""Migrate message to orm +"""Migrate messages to the orm -Revision ID: 95badb46fdf9 -Revises: 3c683a662c82 -Create Date: 2024-12-05 14:02:04.163150 +Revision ID: d27a33843feb +Revises: 08b2f8225812 +Create Date: 2024-12-07 13:52:20.591898 """ @@ -14,7 +14,7 @@ from alembic import op # revision identifiers, used by Alembic. -revision: str = "95badb46fdf9" +revision: str = "d27a33843feb" down_revision: Union[str, None] = "08b2f8225812" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None @@ -39,10 +39,9 @@ def upgrade() -> None: ) op.alter_column("messages", "organization_id", nullable=False) op.alter_column("messages", "tool_calls", existing_type=postgresql.JSON(astext_type=sa.Text()), nullable=False) - op.alter_column("messages", "created_at", existing_type=postgresql.TIMESTAMP(timezone=True), nullable=False) op.drop_index("message_idx_user", table_name="messages") - op.create_foreign_key(None, "messages", "agents", ["agent_id"], ["id"]) op.create_foreign_key(None, "messages", "organizations", ["organization_id"], ["id"]) + op.create_foreign_key(None, "messages", "agents", ["agent_id"], ["id"]) op.drop_column("messages", "user_id") # ### end Alembic commands ### @@ -53,7 +52,6 @@ def downgrade() -> None: op.drop_constraint(None, "messages", type_="foreignkey") op.drop_constraint(None, "messages", type_="foreignkey") op.create_index("message_idx_user", "messages", ["user_id", "agent_id"], unique=False) - op.alter_column("messages", "created_at", existing_type=postgresql.TIMESTAMP(timezone=True), nullable=True) op.alter_column("messages", "tool_calls", existing_type=postgresql.JSON(astext_type=sa.Text()), nullable=True) op.drop_column("messages", "organization_id") op.drop_column("messages", "_last_updated_by_id") diff --git a/letta/agent.py b/letta/agent.py index 3e619ea5bd..12368a939f 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -36,7 +36,7 @@ from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.enums import MessageRole from letta.schemas.memory import ContextWindowOverview, Memory -from letta.schemas.message import Message, UpdateMessage +from letta.schemas.message import Message, MessageUpdate from letta.schemas.openai.chat_completion_request import ( Tool as ChatCompletionRequestTool, ) @@ -512,9 +512,10 @@ def _validate_message_buffer_is_utc(self): for m in self._messages: # assert is_utc_datetime(m.created_at), f"created_at on message for agent {self.agent_state.name} isn't UTC:\n{vars(m)}" # TODO eventually do casting via an edit_message function - if not is_utc_datetime(m.created_at): - printd(f"Warning - created_at on message for agent {self.agent_state.name} isn't UTC (text='{m.text}')") - m.created_at = m.created_at.replace(tzinfo=datetime.timezone.utc) + if m.created_at: + if not is_utc_datetime(m.created_at): + printd(f"Warning - created_at on message for agent {self.agent_state.name} isn't UTC (text='{m.text}')") + m.created_at = m.created_at.replace(tzinfo=datetime.timezone.utc) def set_message_buffer(self, message_ids: List[str], force_utc: bool = True): """Set the messages in the buffer to the message IDs list""" @@ -1405,36 +1406,10 @@ def attach_source(self, source_id: str, source_connector: StorageConnector, ms: f"Attached data source {source.name} to agent {self.agent_state.name}, consisting of {len(all_passages)}. Agent now has {total_agent_passages} embeddings in archival memory.", ) - def update_message(self, request: UpdateMessage) -> Message: + def update_message(self, message_id: str, request: MessageUpdate) -> Message: """Update the details of a message associated with an agent""" - - message = self.message_manager.get_message_by_id(message_id=request.id, actor=self.user) - if message is None: - raise ValueError(f"Message with id {request.id} not found") - assert isinstance(message, Message), f"Message is not a Message object: {type(message)}" - - # Override fields - # NOTE: we try to do some sanity checking here (see asserts), but it's not foolproof - if request.role: - message.role = request.role - if request.text: - message.text = request.text - if request.name: - message.name = request.name - if request.tool_calls: - assert message.role == MessageRole.assistant, "Tool calls can only be added to assistant messages" - message.tool_calls = request.tool_calls - if request.tool_call_id: - assert message.role == MessageRole.tool, "tool_call_id can only be added to tool messages" - message.tool_call_id = request.tool_call_id - # Save the updated message - self.message_manager.update_message_by_id(message_id=message.id, message=message, actor=self.user) - - # Return the updated message - updated_message = self.message_manager.get_message_by_id(message_id=message.id, actor=self.user) - if updated_message is None: - raise ValueError(f"Error persisting message - message with id {request.id} not found") + updated_message = self.message_manager.update_message_by_id(message_id=message_id, message_update=request, actor=self.user) return updated_message # TODO(sarah): should we be creating a new message here, or just editing a message? @@ -1444,10 +1419,10 @@ def rethink_message(self, new_thought: str) -> Message: msg_obj = self._messages[x] if msg_obj.role == MessageRole.assistant: updated_message = self.update_message( - request=UpdateMessage( - id=msg_obj.id, + message_id=msg_obj.id, + request=MessageUpdate( text=new_thought, - ) + ), ) self.refresh_message_buffer() return updated_message @@ -1486,10 +1461,10 @@ def rewrite_message(self, new_text: str) -> Message: # Write the update to the DB updated_message = self.update_message( - request=UpdateMessage( - id=message_obj.id, + message_id=message_obj.id, + request=MessageUpdate( tool_calls=message_obj.tool_calls, - ) + ), ) self.refresh_message_buffer() return updated_message diff --git a/letta/client/client.py b/letta/client/client.py index eaf477e935..afccdafaa5 100644 --- a/letta/client/client.py +++ b/letta/client/client.py @@ -32,7 +32,7 @@ Memory, RecallMemorySummary, ) -from letta.schemas.message import Message, MessageCreate, UpdateMessage +from letta.schemas.message import Message, MessageCreate, MessageUpdate from letta.schemas.openai.chat_completions import ToolCall from letta.schemas.organization import Organization from letta.schemas.passage import Passage @@ -586,8 +586,7 @@ def update_message( tool_calls: Optional[List[ToolCall]] = None, tool_call_id: Optional[str] = None, ) -> Message: - request = UpdateMessage( - id=message_id, + request = MessageUpdate( role=role, text=text, name=name, @@ -2148,8 +2147,8 @@ def update_message( ) -> Message: message = self.server.update_agent_message( agent_id=agent_id, - request=UpdateMessage( - id=message_id, + message_id=message_id, + request=MessageUpdate( role=role, text=text, name=name, diff --git a/letta/orm/message.py b/letta/orm/message.py index 3f0b56c791..8de6f1f54b 100644 --- a/letta/orm/message.py +++ b/letta/orm/message.py @@ -1,7 +1,6 @@ -from datetime import datetime from typing import Optional -from sqlalchemy import JSON, DateTime, TypeDecorator +from sqlalchemy import JSON, TypeDecorator from sqlalchemy.orm import Mapped, mapped_column, relationship from letta.orm.mixins import AgentMixin, OrganizationMixin @@ -58,7 +57,6 @@ class Message(SqlalchemyBase, OrganizationMixin, AgentMixin): name: Mapped[Optional[str]] = mapped_column(nullable=True, doc="Name for multi-agent scenarios") tool_calls: Mapped[ToolCall] = mapped_column(ToolCallColumn, doc="Tool call information") tool_call_id: Mapped[Optional[str]] = mapped_column(nullable=True, doc="ID of the tool call") - created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=datetime.utcnow) # Relationships # TODO: Add in after Agent ORM is created diff --git a/letta/schemas/message.py b/letta/schemas/message.py index a9e2fcb888..750e4a0593 100644 --- a/letta/schemas/message.py +++ b/letta/schemas/message.py @@ -13,7 +13,7 @@ ) from letta.local_llm.constants import INNER_THOUGHTS_KWARG from letta.schemas.enums import MessageRole -from letta.schemas.letta_base import LettaBase +from letta.schemas.letta_base import OrmMetadataBase from letta.schemas.letta_message import ( AssistantMessage, FunctionCall, @@ -50,7 +50,7 @@ def add_inner_thoughts_to_tool_call( raise e -class BaseMessage(LettaBase): +class BaseMessage(OrmMetadataBase): __id_prefix__ = "message" @@ -66,10 +66,9 @@ class MessageCreate(BaseMessage): name: Optional[str] = Field(None, description="The name of the participant.") -class UpdateMessage(BaseMessage): +class MessageUpdate(BaseMessage): """Request to update a message""" - id: str = Field(..., description="The id of the message.") role: Optional[MessageRole] = Field(None, description="The role of the participant.") text: Optional[str] = Field(None, description="The text of the message.") # NOTE: probably doesn't make sense to allow remapping user_id or agent_id (vs creating a new message) @@ -109,9 +108,10 @@ class Message(BaseMessage): agent_id: Optional[str] = Field(None, description="The unique identifier of the agent.") model: Optional[str] = Field(None, description="The model used to make the function call.") name: Optional[str] = Field(None, description="The name of the participant.") - created_at: datetime = Field(default_factory=get_utc_time, description="The time the message was created.") tool_calls: Optional[List[ToolCall]] = Field(None, description="The list of tool calls requested.") tool_call_id: Optional[str] = Field(None, description="The id of the tool call.") + # This overrides the optional base orm schema, created_at MUST exist on all messages objects + created_at: datetime = Field(default_factory=get_utc_time, description="The timestamp when the object was created.") @field_validator("role") @classmethod diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index ebf10b7cdd..e3922a28f9 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -28,7 +28,7 @@ Memory, RecallMemorySummary, ) -from letta.schemas.message import Message, MessageCreate, UpdateMessage +from letta.schemas.message import Message, MessageCreate, MessageUpdate from letta.schemas.passage import Passage from letta.schemas.source import Source from letta.schemas.tool import Tool @@ -422,14 +422,13 @@ def get_agent_messages( def update_message( agent_id: str, message_id: str, - request: UpdateMessage = Body(...), + request: MessageUpdate = Body(...), server: "SyncServer" = Depends(get_letta_server), ): """ Update the details of a message associated with an agent. """ - assert request.id == message_id, f"Message ID mismatch: {request.id} != {message_id}" - return server.update_agent_message(agent_id=agent_id, request=request) + return server.update_agent_message(agent_id=agent_id, message_id=message_id, request=request) @router.post( diff --git a/letta/server/server.py b/letta/server/server.py index fa3d29fa21..da87d9df25 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -67,7 +67,7 @@ Memory, RecallMemorySummary, ) -from letta.schemas.message import Message, MessageCreate, MessageRole, UpdateMessage +from letta.schemas.message import Message, MessageCreate, MessageRole, MessageUpdate from letta.schemas.organization import Organization from letta.schemas.passage import Passage from letta.schemas.source import Source @@ -1662,12 +1662,12 @@ def get_agent_message(self, agent_id: str, message_id: str) -> Optional[Message] save_agent(letta_agent, self.ms) return message - def update_agent_message(self, agent_id: str, request: UpdateMessage) -> Message: + def update_agent_message(self, agent_id: str, message_id: str, request: MessageUpdate) -> Message: """Update the details of a message associated with an agent""" # Get the current message letta_agent = self.load_agent(agent_id=agent_id) - response = letta_agent.update_message(request=request) + response = letta_agent.update_message(message_id=message_id, request=request) save_agent(letta_agent, self.ms) return response diff --git a/letta/services/message_manager.py b/letta/services/message_manager.py index 7a46ddba0d..b9932b39b8 100644 --- a/letta/services/message_manager.py +++ b/letta/services/message_manager.py @@ -5,6 +5,7 @@ from letta.orm.message import Message as MessageModel from letta.schemas.enums import MessageRole from letta.schemas.message import Message as PydanticMessage +from letta.schemas.message import MessageUpdate from letta.schemas.user import User as PydanticUser from letta.utils import enforce_types @@ -44,27 +45,38 @@ def create_many_messages(self, pydantic_msgs: List[PydanticMessage], actor: Pyda return [self.create_message(m, actor=actor) for m in pydantic_msgs] @enforce_types - def update_message_by_id(self, message_id: str, message: PydanticMessage, actor: PydanticUser) -> PydanticMessage: + def update_message_by_id(self, message_id: str, message_update: MessageUpdate, actor: PydanticUser) -> PydanticMessage: """ Updates an existing record in the database with values from the provided record object. """ with self.session_maker() as session: # Fetch existing message from database - msg = MessageModel.read( + message = MessageModel.read( db_session=session, identifier=message_id, actor=actor, ) - # Update the database record with values from the provided record - for column in MessageModel.__table__.columns: - column_name = column.name - if hasattr(message, column_name): - new_value = getattr(message, column_name) - setattr(msg, column_name, new_value) + # Some safety checks specific to messages + if message_update.tool_calls and message.role != MessageRole.assistant: + raise ValueError( + f"Tool calls {message_update.tool_calls} can only be added to assistant messages. Message {message_id} has role {message.role}." + ) + if message_update.tool_call_id and message.role != MessageRole.tool: + raise ValueError( + f"Tool call IDs {message_update.tool_call_id} can only be added to tool messages. Message {message_id} has role {message.role}." + ) + + # get update dictionary + update_data = message_update.model_dump(exclude_unset=True, exclude_none=True) + # Remove redundant update fields + update_data = {key: value for key, value in update_data.items() if getattr(message, key) != value} + + for key, value in update_data.items(): + setattr(message, key, value) + message.update(db_session=session, actor=actor) - # Commit changes - return msg.update(db_session=session, actor=actor).to_pydantic() + return message.to_pydantic() @enforce_types def delete_message_by_id(self, message_id: str, actor: PydanticUser) -> bool: diff --git a/tests/test_client_legacy.py b/tests/test_client_legacy.py index ce93457bb7..65bd5f16b2 100644 --- a/tests/test_client_legacy.py +++ b/tests/test_client_legacy.py @@ -279,11 +279,7 @@ def test_streaming_send_message(mock_e2b_api_key_none, client: RESTClient, agent assert chunk.total_tokens > 1000 # If stream tokens, we expect at least one inner thought - if stream_tokens: - assert inner_thoughts_count > 1, "Expected more than one inner thought" - else: - assert inner_thoughts_count == 1, "Expected one inner thought" - + assert inner_thoughts_count >= 1, "Expected more than one inner thought" assert inner_thoughts_exist, "No inner thoughts found" assert send_message_ran, "send_message function call not found" assert done, "Message stream not done" diff --git a/tests/test_managers.py b/tests/test_managers.py index 53107dfed5..dc47693893 100644 --- a/tests/test_managers.py +++ b/tests/test_managers.py @@ -37,6 +37,7 @@ from letta.schemas.job import JobUpdate from letta.schemas.llm_config import LLMConfig from letta.schemas.message import Message as PydanticMessage +from letta.schemas.message import MessageUpdate from letta.schemas.organization import Organization as PydanticOrganization from letta.schemas.sandbox_config import ( E2BSandboxConfig, @@ -598,16 +599,19 @@ def test_message_get_by_id(server: SyncServer, hello_world_message_fixture, defa assert retrieved.text == hello_world_message_fixture.text -def test_message_update(server: SyncServer, hello_world_message_fixture, default_user): +def test_message_update(server: SyncServer, hello_world_message_fixture, default_user, other_user): """Test updating a message""" new_text = "Updated text" - hello_world_message_fixture.text = new_text - updated = server.message_manager.update_message_by_id(hello_world_message_fixture.id, hello_world_message_fixture, actor=default_user) + updated = server.message_manager.update_message_by_id(hello_world_message_fixture.id, MessageUpdate(text=new_text), actor=other_user) assert updated is not None assert updated.text == new_text retrieved = server.message_manager.get_message_by_id(hello_world_message_fixture.id, actor=default_user) assert retrieved.text == new_text + # Assert that orm metadata fields are populated + assert retrieved.created_by_id == default_user.id + assert retrieved.last_updated_by_id == other_user.id + def test_message_delete(server: SyncServer, hello_world_message_fixture, default_user): """Test deleting a message""" From 180c9f1e6851063228d3ffd0b51efb36f0496ae4 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Sat, 7 Dec 2024 14:30:31 -0800 Subject: [PATCH 036/280] fix: Revert changes to alembic script and tweak created_at field on messages (#2194) --- ...badb46fdf9_migrate_messages_to_the_orm.py} | 14 +++++---- ...dbf_tweak_created_at_field_for_messages.py | 31 +++++++++++++++++++ 2 files changed, 39 insertions(+), 6 deletions(-) rename alembic/versions/{d27a33843feb_migrate_messages_to_the_orm.py => 95badb46fdf9_migrate_messages_to_the_orm.py} (87%) create mode 100644 alembic/versions/e1a625072dbf_tweak_created_at_field_for_messages.py diff --git a/alembic/versions/d27a33843feb_migrate_messages_to_the_orm.py b/alembic/versions/95badb46fdf9_migrate_messages_to_the_orm.py similarity index 87% rename from alembic/versions/d27a33843feb_migrate_messages_to_the_orm.py rename to alembic/versions/95badb46fdf9_migrate_messages_to_the_orm.py index 575bd25bd7..73254e39ea 100644 --- a/alembic/versions/d27a33843feb_migrate_messages_to_the_orm.py +++ b/alembic/versions/95badb46fdf9_migrate_messages_to_the_orm.py @@ -1,8 +1,8 @@ -"""Migrate messages to the orm +"""Migrate message to orm -Revision ID: d27a33843feb -Revises: 08b2f8225812 -Create Date: 2024-12-07 13:52:20.591898 +Revision ID: 95badb46fdf9 +Revises: 3c683a662c82 +Create Date: 2024-12-05 14:02:04.163150 """ @@ -14,7 +14,7 @@ from alembic import op # revision identifiers, used by Alembic. -revision: str = "d27a33843feb" +revision: str = "95badb46fdf9" down_revision: Union[str, None] = "08b2f8225812" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None @@ -39,9 +39,10 @@ def upgrade() -> None: ) op.alter_column("messages", "organization_id", nullable=False) op.alter_column("messages", "tool_calls", existing_type=postgresql.JSON(astext_type=sa.Text()), nullable=False) + op.alter_column("messages", "created_at", existing_type=postgresql.TIMESTAMP(timezone=True), nullable=False) op.drop_index("message_idx_user", table_name="messages") - op.create_foreign_key(None, "messages", "organizations", ["organization_id"], ["id"]) op.create_foreign_key(None, "messages", "agents", ["agent_id"], ["id"]) + op.create_foreign_key(None, "messages", "organizations", ["organization_id"], ["id"]) op.drop_column("messages", "user_id") # ### end Alembic commands ### @@ -52,6 +53,7 @@ def downgrade() -> None: op.drop_constraint(None, "messages", type_="foreignkey") op.drop_constraint(None, "messages", type_="foreignkey") op.create_index("message_idx_user", "messages", ["user_id", "agent_id"], unique=False) + op.alter_column("messages", "created_at", existing_type=postgresql.TIMESTAMP(timezone=True), nullable=True) op.alter_column("messages", "tool_calls", existing_type=postgresql.JSON(astext_type=sa.Text()), nullable=True) op.drop_column("messages", "organization_id") op.drop_column("messages", "_last_updated_by_id") diff --git a/alembic/versions/e1a625072dbf_tweak_created_at_field_for_messages.py b/alembic/versions/e1a625072dbf_tweak_created_at_field_for_messages.py new file mode 100644 index 0000000000..fb425db317 --- /dev/null +++ b/alembic/versions/e1a625072dbf_tweak_created_at_field_for_messages.py @@ -0,0 +1,31 @@ +"""Tweak created_at field for messages + +Revision ID: e1a625072dbf +Revises: 95badb46fdf9 +Create Date: 2024-12-07 14:28:27.643583 + +""" + +from typing import Sequence, Union + +from sqlalchemy.dialects import postgresql + +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = "e1a625072dbf" +down_revision: Union[str, None] = "95badb46fdf9" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.alter_column("messages", "created_at", existing_type=postgresql.TIMESTAMP(timezone=True), nullable=True) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.alter_column("messages", "created_at", existing_type=postgresql.TIMESTAMP(timezone=True), nullable=False) + # ### end Alembic commands ### From 30f17da3baa6284ff6ae822fc7c017aad2c3bd1a Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Sat, 7 Dec 2024 16:13:37 -0800 Subject: [PATCH 037/280] feat: remove loading from module (#2196) --- letta/agent.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/letta/agent.py b/letta/agent.py index 12368a939f..a09fd04c40 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -477,10 +477,10 @@ def link_tools(self, tools: List[Tool]): for tool in tools: try: # WARNING: name may not be consistent? - if tool.module: # execute the whole module - exec(tool.module, env) - else: - exec(tool.source_code, env) + # if tool.module: # execute the whole module + # exec(tool.module, env) + # else: + exec(tool.source_code, env) self.functions_python[tool.json_schema["name"]] = env[tool.json_schema["name"]] self.functions.append(tool.json_schema) except Exception: From 376120fc26bd19f93722b204a19cf9aeaba61b7e Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Sat, 7 Dec 2024 16:14:51 -0800 Subject: [PATCH 038/280] fix: disable printing version in health check, causes spam (#2195) --- letta/cli/cli.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/letta/cli/cli.py b/letta/cli/cli.py index e7f811e9f3..d55d3b74f3 100644 --- a/letta/cli/cli.py +++ b/letta/cli/cli.py @@ -370,8 +370,7 @@ def delete_agent( sys.exit(1) -def version(): +def version() -> str: import letta - print(letta.__version__) return letta.__version__ From 660a599cec39be5cac57f45b8470dec79d6c3f50 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Sat, 7 Dec 2024 21:37:06 -0800 Subject: [PATCH 039/280] chore: Bump composio-core requirements to latest (#2197) --- poetry.lock | 21 ++++++++++++++++++++- pyproject.toml | 2 +- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/poetry.lock b/poetry.lock index 84716f7004..b53c0649be 100644 --- a/poetry.lock +++ b/poetry.lock @@ -6214,39 +6214,58 @@ description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ + {file = "SQLAlchemy-2.0.36-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:59b8f3adb3971929a3e660337f5dacc5942c2cdb760afcabb2614ffbda9f9f72"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37350015056a553e442ff672c2d20e6f4b6d0b2495691fa239d8aa18bb3bc908"}, {file = "SQLAlchemy-2.0.36-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8318f4776c85abc3f40ab185e388bee7a6ea99e7fa3a30686580b209eaa35c08"}, {file = "SQLAlchemy-2.0.36-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c245b1fbade9c35e5bd3b64270ab49ce990369018289ecfde3f9c318411aaa07"}, {file = "SQLAlchemy-2.0.36-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:69f93723edbca7342624d09f6704e7126b152eaed3cdbb634cb657a54332a3c5"}, {file = "SQLAlchemy-2.0.36-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f9511d8dd4a6e9271d07d150fb2f81874a3c8c95e11ff9af3a2dfc35fe42ee44"}, {file = "SQLAlchemy-2.0.36-cp310-cp310-win32.whl", hash = "sha256:c3f3631693003d8e585d4200730616b78fafd5a01ef8b698f6967da5c605b3fa"}, {file = "SQLAlchemy-2.0.36-cp310-cp310-win_amd64.whl", hash = "sha256:a86bfab2ef46d63300c0f06936bd6e6c0105faa11d509083ba8f2f9d237fb5b5"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fd3a55deef00f689ce931d4d1b23fa9f04c880a48ee97af488fd215cf24e2a6c"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f5e9cd989b45b73bd359f693b935364f7e1f79486e29015813c338450aa5a71"}, {file = "SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ddd9db6e59c44875211bc4c7953a9f6638b937b0a88ae6d09eb46cced54eff"}, {file = "SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2519f3a5d0517fc159afab1015e54bb81b4406c278749779be57a569d8d1bb0d"}, {file = "SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59b1ee96617135f6e1d6f275bbe988f419c5178016f3d41d3c0abb0c819f75bb"}, {file = "SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:39769a115f730d683b0eb7b694db9789267bcd027326cccc3125e862eb03bfd8"}, {file = "SQLAlchemy-2.0.36-cp311-cp311-win32.whl", hash = "sha256:66bffbad8d6271bb1cc2f9a4ea4f86f80fe5e2e3e501a5ae2a3dc6a76e604e6f"}, {file = "SQLAlchemy-2.0.36-cp311-cp311-win_amd64.whl", hash = "sha256:23623166bfefe1487d81b698c423f8678e80df8b54614c2bf4b4cfcd7c711959"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7b64e6ec3f02c35647be6b4851008b26cff592a95ecb13b6788a54ef80bbdd4"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:46331b00096a6db1fdc052d55b101dbbfc99155a548e20a0e4a8e5e4d1362855"}, {file = "SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdf3386a801ea5aba17c6410dd1dc8d39cf454ca2565541b5ac42a84e1e28f53"}, {file = "SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9dfa18ff2a67b09b372d5db8743c27966abf0e5344c555d86cc7199f7ad83a"}, {file = "SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:90812a8933df713fdf748b355527e3af257a11e415b613dd794512461eb8a686"}, {file = "SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1bc330d9d29c7f06f003ab10e1eaced295e87940405afe1b110f2eb93a233588"}, {file = "SQLAlchemy-2.0.36-cp312-cp312-win32.whl", hash = "sha256:79d2e78abc26d871875b419e1fd3c0bca31a1cb0043277d0d850014599626c2e"}, {file = "SQLAlchemy-2.0.36-cp312-cp312-win_amd64.whl", hash = "sha256:b544ad1935a8541d177cb402948b94e871067656b3a0b9e91dbec136b06a2ff5"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b5cc79df7f4bc3d11e4b542596c03826063092611e481fcf1c9dfee3c94355ef"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3c01117dd36800f2ecaa238c65365b7b16497adc1522bf84906e5710ee9ba0e8"}, {file = "SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bc633f4ee4b4c46e7adcb3a9b5ec083bf1d9a97c1d3854b92749d935de40b9b"}, {file = "SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e46ed38affdfc95d2c958de328d037d87801cfcbea6d421000859e9789e61c2"}, {file = "SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b2985c0b06e989c043f1dc09d4fe89e1616aadd35392aea2844f0458a989eacf"}, {file = "SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a121d62ebe7d26fec9155f83f8be5189ef1405f5973ea4874a26fab9f1e262c"}, {file = "SQLAlchemy-2.0.36-cp313-cp313-win32.whl", hash = "sha256:0572f4bd6f94752167adfd7c1bed84f4b240ee6203a95e05d1e208d488d0d436"}, {file = "SQLAlchemy-2.0.36-cp313-cp313-win_amd64.whl", hash = "sha256:8c78ac40bde930c60e0f78b3cd184c580f89456dd87fc08f9e3ee3ce8765ce88"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:be9812b766cad94a25bc63bec11f88c4ad3629a0cec1cd5d4ba48dc23860486b"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aae840ebbd6cdd41af1c14590e5741665e5272d2fee999306673a1bb1fdb4d"}, {file = "SQLAlchemy-2.0.36-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4557e1f11c5f653ebfdd924f3f9d5ebfc718283b0b9beebaa5dd6b77ec290971"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:07b441f7d03b9a66299ce7ccf3ef2900abc81c0db434f42a5694a37bd73870f2"}, {file = "SQLAlchemy-2.0.36-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:28120ef39c92c2dd60f2721af9328479516844c6b550b077ca450c7d7dc68575"}, {file = "SQLAlchemy-2.0.36-cp37-cp37m-win32.whl", hash = "sha256:b81ee3d84803fd42d0b154cb6892ae57ea6b7c55d8359a02379965706c7efe6c"}, {file = "SQLAlchemy-2.0.36-cp37-cp37m-win_amd64.whl", hash = "sha256:f942a799516184c855e1a32fbc7b29d7e571b52612647866d4ec1c3242578fcb"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3d6718667da04294d7df1670d70eeddd414f313738d20a6f1d1f379e3139a545"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:72c28b84b174ce8af8504ca28ae9347d317f9dba3999e5981a3cd441f3712e24"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b11d0cfdd2b095e7b0686cf5fabeb9c67fae5b06d265d8180715b8cfa86522e3"}, {file = "SQLAlchemy-2.0.36-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e32092c47011d113dc01ab3e1d3ce9f006a47223b18422c5c0d150af13a00687"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6a440293d802d3011028e14e4226da1434b373cbaf4a4bbb63f845761a708346"}, {file = "SQLAlchemy-2.0.36-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c54a1e53a0c308a8e8a7dffb59097bff7facda27c70c286f005327f21b2bd6b1"}, {file = "SQLAlchemy-2.0.36-cp38-cp38-win32.whl", hash = "sha256:1e0d612a17581b6616ff03c8e3d5eff7452f34655c901f75d62bd86449d9750e"}, {file = "SQLAlchemy-2.0.36-cp38-cp38-win_amd64.whl", hash = "sha256:8958b10490125124463095bbdadda5aa22ec799f91958e410438ad6c97a7b793"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc022184d3e5cacc9579e41805a681187650e170eb2fd70e28b86192a479dcaa"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b817d41d692bf286abc181f8af476c4fbef3fd05e798777492618378448ee689"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4e46a888b54be23d03a89be510f24a7652fe6ff660787b96cd0e57a4ebcb46d"}, {file = "SQLAlchemy-2.0.36-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4ae3005ed83f5967f961fd091f2f8c5329161f69ce8480aa8168b2d7fe37f06"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:03e08af7a5f9386a43919eda9de33ffda16b44eb11f3b313e6822243770e9763"}, {file = "SQLAlchemy-2.0.36-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3dbb986bad3ed5ceaf090200eba750b5245150bd97d3e67343a3cfed06feecf7"}, {file = "SQLAlchemy-2.0.36-cp39-cp39-win32.whl", hash = "sha256:9fe53b404f24789b5ea9003fc25b9a3988feddebd7e7b369c8fac27ad6f52f28"}, {file = "SQLAlchemy-2.0.36-cp39-cp39-win_amd64.whl", hash = "sha256:af148a33ff0349f53512a049c6406923e4e02bf2f26c5fb285f143faf4f0e46a"}, @@ -7535,4 +7554,4 @@ tests = ["wikipedia"] [metadata] lock-version = "2.0" python-versions = "<3.13,>=3.10" -content-hash = "55f9fdb8f904ae60aa7b871f9b45a4da17e505c1efa96b6e373f39904f57a684" +content-hash = "1293bc3a4f2bf98a65b547ce57d62ab0c1f26b6a035241c68327e83d71b2e4fd" diff --git a/pyproject.toml b/pyproject.toml index ef6b97966b..24cc74cbed 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -67,7 +67,7 @@ llama-index-embeddings-openai = "^0.2.5" llama-index-embeddings-ollama = "^0.3.1" wikipedia = {version = "^1.4.0", optional = true} composio-langchain = "^0.5.28" -composio-core = "^0.5.34" +composio-core = "^0.5.51" alembic = "^1.13.3" pyhumps = "^3.8.0" psycopg2 = "^2.9.10" From b1015c0679ce3984de5ad4dcf9ff0ab40f836689 Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Sun, 8 Dec 2024 17:04:04 -0800 Subject: [PATCH 040/280] fix: add a special error type for configuration errors (#2198) --- letta/errors.py | 24 ++++++++++++++++++++++++ letta/llm_api/llm_api_tools.py | 19 +++++++++++++------ letta/server/rest_api/app.py | 26 ++++++++++++++++++++++++++ letta/server/server.py | 7 ++++--- 4 files changed, 67 insertions(+), 9 deletions(-) diff --git a/letta/errors.py b/letta/errors.py index cb10c5d964..c478ef42fa 100644 --- a/letta/errors.py +++ b/letta/errors.py @@ -22,6 +22,30 @@ def __init__(self, message=None): super().__init__(self.message) +class LettaConfigurationError(LettaError): + """Error raised when there are configuration-related issues.""" + + def __init__(self, message: str, missing_fields: Optional[List[str]] = None): + self.missing_fields = missing_fields or [] + super().__init__(message) + + +class LettaAgentNotFoundError(LettaError): + """Error raised when an agent is not found.""" + + def __init__(self, message: str): + self.message = message + super().__init__(self.message) + + +class LettaUserNotFoundError(LettaError): + """Error raised when a user is not found.""" + + def __init__(self, message: str): + self.message = message + super().__init__(self.message) + + class LLMError(LettaError): pass diff --git a/letta/llm_api/llm_api_tools.py b/letta/llm_api/llm_api_tools.py index 9a6374b511..163c4e1868 100644 --- a/letta/llm_api/llm_api_tools.py +++ b/letta/llm_api/llm_api_tools.py @@ -5,6 +5,7 @@ import requests from letta.constants import CLI_WARNING_PREFIX +from letta.errors import LettaConfigurationError from letta.llm_api.anthropic import anthropic_chat_completions_request from letta.llm_api.azure_openai import azure_openai_chat_completions_request from letta.llm_api.google_ai import ( @@ -148,7 +149,7 @@ def create( if llm_config.model_endpoint_type == "openai": if model_settings.openai_api_key is None and llm_config.model_endpoint == "https://api.openai.com/v1": # only is a problem if we are *not* using an openai proxy - raise ValueError(f"OpenAI key is missing from letta config file") + raise LettaConfigurationError(message="OpenAI key is missing from letta config file", missing_fields=["openai_api_key"]) data = build_openai_chat_completions_request(llm_config, messages, user_id, functions, function_call, use_tool_naming, max_tokens) if stream: # Client requested token streaming @@ -187,13 +188,19 @@ def create( raise NotImplementedError(f"Streaming not yet implemented for {llm_config.model_endpoint_type}") if model_settings.azure_api_key is None: - raise ValueError(f"Azure API key is missing. Did you set AZURE_API_KEY in your env?") + raise LettaConfigurationError( + message="Azure API key is missing. Did you set AZURE_API_KEY in your env?", missing_fields=["azure_api_key"] + ) if model_settings.azure_base_url is None: - raise ValueError(f"Azure base url is missing. Did you set AZURE_BASE_URL in your env?") + raise LettaConfigurationError( + message="Azure base url is missing. Did you set AZURE_BASE_URL in your env?", missing_fields=["azure_base_url"] + ) if model_settings.azure_api_version is None: - raise ValueError(f"Azure API version is missing. Did you set AZURE_API_VERSION in your env?") + raise LettaConfigurationError( + message="Azure API version is missing. Did you set AZURE_API_VERSION in your env?", missing_fields=["azure_api_version"] + ) # Set the llm config model_endpoint from model_settings # For Azure, this model_endpoint is required to be configured via env variable, so users don't need to provide it in the LLM config @@ -291,7 +298,7 @@ def create( raise NotImplementedError(f"Streaming not yet implemented for Groq.") if model_settings.groq_api_key is None and llm_config.model_endpoint == "https://api.groq.com/openai/v1/chat/completions": - raise ValueError(f"Groq key is missing from letta config file") + raise LettaConfigurationError(message="Groq key is missing from letta config file", missing_fields=["groq_api_key"]) # force to true for groq, since they don't support 'content' is non-null if llm_config.put_inner_thoughts_in_kwargs: @@ -344,7 +351,7 @@ def create( raise NotImplementedError(f"Streaming not yet implemented for TogetherAI (via the /completions endpoint).") if model_settings.together_api_key is None and llm_config.model_endpoint == "https://api.together.ai/v1/completions": - raise ValueError(f"TogetherAI key is missing from letta config file") + raise LettaConfigurationError(message="TogetherAI key is missing from letta config file", missing_fields=["together_api_key"]) return get_chat_completion( model=llm_config.model, diff --git a/letta/server/rest_api/app.py b/letta/server/rest_api/app.py index 4db8323668..9b43495a27 100644 --- a/letta/server/rest_api/app.py +++ b/letta/server/rest_api/app.py @@ -13,6 +13,7 @@ from letta.__init__ import __version__ from letta.constants import ADMIN_PREFIX, API_PREFIX, OPENAI_API_PREFIX +from letta.errors import LettaAgentNotFoundError, LettaUserNotFoundError from letta.schemas.letta_response import LettaResponse from letta.server.constants import REST_DEFAULT_PORT @@ -144,6 +145,31 @@ def create_application() -> "FastAPI": debug=True, ) + @app.exception_handler(Exception) + async def generic_error_handler(request, exc): + # Log the actual error for debugging + log.error(f"Unhandled error: {exc}", exc_info=True) + + # Print the stack trace + print(f"Stack trace: {exc.__traceback__}") + + return JSONResponse( + status_code=500, + content={ + "detail": "An internal server error occurred", + # Only include error details in debug/development mode + # "debug_info": str(exc) if settings.debug else None + }, + ) + + @app.exception_handler(LettaAgentNotFoundError) + async def agent_not_found_handler(request, exc): + return JSONResponse(status_code=404, content={"detail": "Agent not found"}) + + @app.exception_handler(LettaUserNotFoundError) + async def user_not_found_handler(request, exc): + return JSONResponse(status_code=404, content={"detail": "User not found"}) + settings.cors_origins.append("https://app.letta.com") print(f"▶ View using ADE at: https://app.letta.com/development-servers/local/dashboard") diff --git a/letta/server/server.py b/letta/server/server.py index da87d9df25..965c9b2798 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -21,6 +21,7 @@ from letta.chat_only_agent import ChatOnlyAgent from letta.credentials import LettaCredentials from letta.data_sources.connectors import DataConnector, load_data +from letta.errors import LettaAgentNotFoundError, LettaUserNotFoundError # TODO use custom interface from letta.interface import AgentInterface # abstract @@ -397,7 +398,7 @@ def load_agent(self, agent_id: str, interface: Union[AgentInterface, None] = Non with agent_lock: agent_state = self.get_agent(agent_id=agent_id) if agent_state is None: - raise ValueError(f"Agent (agent_id={agent_id}) does not exist") + raise LettaAgentNotFoundError(f"Agent (agent_id={agent_id}) does not exist") elif agent_state.user_id is None: raise ValueError(f"Agent (agent_id={agent_id}) does not have a user_id") actor = self.user_manager.get_user_by_id(user_id=agent_state.user_id) @@ -1249,9 +1250,9 @@ def get_agent_archival_cursor( reverse: Optional[bool] = False, ) -> List[Passage]: if self.user_manager.get_user_by_id(user_id=user_id) is None: - raise ValueError(f"User user_id={user_id} does not exist") + raise LettaUserNotFoundError(f"User user_id={user_id} does not exist") if self.ms.get_agent(agent_id=agent_id, user_id=user_id) is None: - raise ValueError(f"Agent agent_id={agent_id} does not exist") + raise LettaAgentNotFoundError(f"Agent agent_id={agent_id} does not exist") # Get the agent object (loaded in memory) letta_agent = self.load_agent(agent_id=agent_id) From 8633c7bd5fb9319e0d0d54997be69a9fcb28c7ea Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Sun, 8 Dec 2024 21:22:48 -0800 Subject: [PATCH 041/280] fix: patch anthropic system message in send_message route (#2199) --- letta/schemas/message.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/letta/schemas/message.py b/letta/schemas/message.py index 750e4a0593..0e58bacf33 100644 --- a/letta/schemas/message.py +++ b/letta/schemas/message.py @@ -481,7 +481,20 @@ def add_xml_tag(string: str, xml_tag: Optional[str]): return f"<{xml_tag}>{string} Date: Sun, 8 Dec 2024 23:14:18 -0800 Subject: [PATCH 042/280] fix: bad print in common cli (#2200) --- letta/orm/sqlalchemy_base.py | 2 +- tests/test_client.py | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/letta/orm/sqlalchemy_base.py b/letta/orm/sqlalchemy_base.py index 2fd6394724..4507f51c27 100644 --- a/letta/orm/sqlalchemy_base.py +++ b/letta/orm/sqlalchemy_base.py @@ -187,7 +187,7 @@ def hard_delete(self, db_session: "Session", actor: Optional["User"] = None) -> logger.exception(f"Failed to hard delete {self.__class__.__name__} with ID {self.id}") raise ValueError(f"Failed to hard delete {self.__class__.__name__} with ID {self.id}: {e}") else: - logger.info(f"{self.__class__.__name__} with ID {self.id} successfully hard deleted") + logger.debug(f"{self.__class__.__name__} with ID {self.id} successfully hard deleted") def update(self, db_session: "Session", actor: Optional["User"] = None) -> Type["SqlalchemyBase"]: logger.debug(f"Updating {self.__class__.__name__} with ID: {self.id} with actor={actor}") diff --git a/tests/test_client.py b/tests/test_client.py index 6a0db9933b..866bd2012b 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -292,6 +292,12 @@ def test_messages(client: Union[LocalClient, RESTClient], agent: AgentState): assert len(messages_response) > 0, "Retrieving messages failed" +def test_send_system_message(client: Union[LocalClient, RESTClient], agent: AgentState): + """Important unit test since the Letta API exposes sending system messages, but some backends don't natively support it (eg Anthropic)""" + send_system_message_response = client.send_message(agent_id=agent.id, message="Event occured: The user just logged off.", role="system") + assert send_system_message_response, "Sending message failed" + + @pytest.mark.asyncio async def test_send_message_parallel(client: Union[LocalClient, RESTClient], agent: AgentState, request): """ From 2e9184cd5b04d2b11dc0dadbbab9722df2324e1a Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Sun, 8 Dec 2024 23:54:29 -0800 Subject: [PATCH 043/280] fix: bug in get_tool_id (#2201) --- letta/client/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/letta/client/client.py b/letta/client/client.py index afccdafaa5..d4cedb033c 100644 --- a/letta/client/client.py +++ b/letta/client/client.py @@ -2836,7 +2836,7 @@ def get_tool_id(self, name: str) -> Optional[str]: id (str): ID of the tool (`None` if not found) """ tool = self.server.tool_manager.get_tool_by_name(tool_name=name, actor=self.user) - return tool.id + return tool.id if tool else None def load_data(self, connector: DataConnector, source_name: str): """ From fd35339754dc5d976304bdf3dce681dee02620e6 Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Mon, 9 Dec 2024 13:27:52 -0800 Subject: [PATCH 044/280] feat: error stack trace capture (#2203) --- letta/server/rest_api/app.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/letta/server/rest_api/app.py b/letta/server/rest_api/app.py index 9b43495a27..321a48827e 100644 --- a/letta/server/rest_api/app.py +++ b/letta/server/rest_api/app.py @@ -152,6 +152,10 @@ async def generic_error_handler(request, exc): # Print the stack trace print(f"Stack trace: {exc.__traceback__}") + if (os.getenv("SENTRY_DSN") is not None) and (os.getenv("SENTRY_DSN") != ""): + import sentry_sdk + + sentry_sdk.capture_exception(exc) return JSONResponse( status_code=500, From fd597055b7c7b2417f93f5027e7f388c3a9c5cac Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Mon, 9 Dec 2024 15:03:11 -0800 Subject: [PATCH 045/280] fix: patch `Dockerfile` for purpose of `docker run` (#2177) --- .dockerignore | 10 ++++- Dockerfile | 93 +++++++++++++++++++++++------------------ letta/cli/cli.py | 1 + letta/server/startup.sh | 56 +++++++++++++++++++------ 4 files changed, 107 insertions(+), 53 deletions(-) diff --git a/.dockerignore b/.dockerignore index 39976e4439..ffe57a736e 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1 +1,9 @@ -chatui +**/__pycache__ +**/.pytest_cache +**/*.pyc +**/*.pyo +**/*.pyd +.git +.gitignore +.env +*.log diff --git a/Dockerfile b/Dockerfile index 7bea036033..42ee3d37ba 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,56 +1,69 @@ -# The builder image, used to build the virtual environment -FROM python:3.12.2-bookworm as builder -ARG LETTA_ENVIRONMENT=PRODUCTION -ENV LETTA_ENVIRONMENT=${LETTA_ENVIRONMENT} -RUN pip install poetry==1.8.2 +# Start with pgvector base for builder +FROM ankane/pgvector:v0.5.1 AS builder + +# Install Python and required packages +RUN apt-get update && apt-get install -y \ + python3 \ + python3-venv \ + python3-pip \ + python3-full \ + build-essential \ + libpq-dev \ + python3-dev \ + && rm -rf /var/lib/apt/lists/* -ENV POETRY_NO_INTERACTION=1 \ +ARG LETTA_ENVIRONMENT=PRODUCTION +ENV LETTA_ENVIRONMENT=${LETTA_ENVIRONMENT} \ + POETRY_NO_INTERACTION=1 \ POETRY_VIRTUALENVS_IN_PROJECT=1 \ POETRY_VIRTUALENVS_CREATE=1 \ POETRY_CACHE_DIR=/tmp/poetry_cache WORKDIR /app +# Create and activate virtual environment +RUN python3 -m venv /opt/venv +ENV PATH="/opt/venv/bin:$PATH" + +# Now install poetry in the virtual environment +RUN pip install --no-cache-dir poetry==1.8.2 + +# Copy dependency files first COPY pyproject.toml poetry.lock ./ -RUN poetry lock --no-update -RUN if [ "$LETTA_ENVIRONMENT" = "DEVELOPMENT" ] ; then \ - poetry install --no-root -E "postgres server dev" ; \ - else \ - poetry install --no-root --all-extras && \ - rm -rf $POETRY_CACHE_DIR ; \ - fi +# Then copy the rest of the application code +COPY . . +RUN poetry lock --no-update && \ + poetry install --all-extras && \ + rm -rf $POETRY_CACHE_DIR + +# Runtime stage +FROM ankane/pgvector:v0.5.1 AS runtime + +# Install Python packages +RUN apt-get update && apt-get install -y \ + python3 \ + python3-venv \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /app -# The runtime image, used to just run the code provided its virtual environment -FROM python:3.12.2-slim-bookworm as runtime ARG LETTA_ENVIRONMENT=PRODUCTION -ENV LETTA_ENVIRONMENT=${LETTA_ENVIRONMENT} -ENV VIRTUAL_ENV=/app/.venv \ - PATH="/app/.venv/bin:$PATH" +ENV LETTA_ENVIRONMENT=${LETTA_ENVIRONMENT} \ + VIRTUAL_ENV="/app/.venv" \ + PATH="/app/.venv/bin:$PATH" \ + POSTGRES_USER=letta \ + POSTGRES_PASSWORD=letta \ + POSTGRES_DB=letta -COPY --from=builder ${VIRTUAL_ENV} ${VIRTUAL_ENV} +WORKDIR /app -COPY ./letta /letta -COPY ./alembic.ini /alembic.ini -COPY ./alembic /alembic +# Copy virtual environment and app from builder +COPY --from=builder /app . -EXPOSE 8283 +# Copy initialization SQL if it exists +COPY init.sql /docker-entrypoint-initdb.d/ -CMD ./letta/server/startup.sh +EXPOSE 8283 5432 -# allow for in-container development and testing -FROM builder as development -ARG LETTA_ENVIRONMENT=PRODUCTION -ENV LETTA_ENVIRONMENT=${LETTA_ENVIRONMENT} -ENV VIRTUAL_ENV=/app/.venv \ - PATH="/app/.venv/bin:$PATH" -ENV PYTHONPATH=/ -WORKDIR / -COPY ./tests /tests -COPY ./letta /letta -COPY ./alembic.ini /alembic.ini -COPY ./alembic /alembic -#COPY ./configs/server_config.yaml /root/.letta/config -EXPOSE 8083 - -CMD ./letta/server/startup.sh +ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] +CMD ["./letta/server/startup.sh"] diff --git a/letta/cli/cli.py b/letta/cli/cli.py index d55d3b74f3..bedab42916 100644 --- a/letta/cli/cli.py +++ b/letta/cli/cli.py @@ -51,6 +51,7 @@ def server( port: Annotated[Optional[int], typer.Option(help="Port to run the server on")] = None, host: Annotated[Optional[str], typer.Option(help="Host to run the server on (default to localhost)")] = None, debug: Annotated[bool, typer.Option(help="Turn debugging output on")] = False, + ade: Annotated[bool, typer.Option(help="Allows remote access")] = False, # NOTE: deprecated secure: Annotated[bool, typer.Option(help="Adds simple security access")] = False, ): """Launch a Letta server process""" diff --git a/letta/server/startup.sh b/letta/server/startup.sh index e0556f7088..2e9d7c301d 100755 --- a/letta/server/startup.sh +++ b/letta/server/startup.sh @@ -1,17 +1,49 @@ #!/bin/sh -echo "Starting Letta server at http://localhost:8283" +set -e # Exit on any error -# Check if LETTA_PG_URI or LETTA_PG_DB is set and run alembic upgrade if either is -if [ -n "$LETTA_PG_URI" ] || [ -n "$LETTA_PG_DB" ]; then - echo "LETTA_PG_URI or LETTA_PG_DB is set, running alembic upgrade head" - alembic upgrade head -fi +HOST="${HOST:-0.0.0.0}" +PORT="${PORT:-8283}" + +# Function to wait for PostgreSQL to be ready +wait_for_postgres() { + until pg_isready -U "${POSTGRES_USER:-letta}" -h localhost; do + echo "Waiting for PostgreSQL to be ready..." + sleep 2 + done +} -if [ "$MEMGPT_ENVIRONMENT" = "DEVELOPMENT" ]; then - echo "Starting in development mode!" - uvicorn letta.server.rest_api.app:app --reload --reload-dir /letta --host 0.0.0.0 --port 8283 +# Check if we're configured for external Postgres +if [ -n "$LETTA_PG_URI" ]; then + echo "External Postgres configuration detected, using $LETTA_PG_URI" else - # Production start command here (replace with the actual production command) - echo "Starting in production mode!" - uvicorn letta.server.rest_api.app:app --host 0.0.0.0 --port 8283 + echo "No external Postgres configuration detected, starting internal PostgreSQL..." + # Start PostgreSQL using the base image's entrypoint script + /usr/local/bin/docker-entrypoint.sh postgres & + + # Wait for PostgreSQL to be ready + wait_for_postgres + + # Set default connection URI for internal postgres + export LETTA_PG_URI="postgresql://${POSTGRES_USER:-letta}:${POSTGRES_PASSWORD:-letta}@localhost:5432/${POSTGRES_DB:-letta}" + echo "Using internal PostgreSQL at: $LETTA_PG_URI" fi + +# Attempt database migration +echo "Attempting to migrate database..." +if ! alembic upgrade head; then + echo "ERROR: Database migration failed!" + echo "Please check your database connection and try again." + echo "If the problem persists, check the logs for more details." + exit 1 +fi +echo "Database migration completed successfully." + +# If ADE is enabled, add the --ade flag to the command +CMD="letta server --host $HOST --port $PORT" +if [ "${SECURE:-false}" = "true" ]; then + CMD="$CMD --secure" +fi + +echo "Starting Letta server at http://$HOST:$PORT..." +echo "Executing: $CMD" +exec $CMD From 5e38adf8f376de079b2c068fab9f07418d004e57 Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Mon, 9 Dec 2024 15:11:31 -0800 Subject: [PATCH 046/280] fix: ask for embedding config for `letta load directory ... ` (#2184) --- letta/cli/cli_load.py | 90 ++++++++++-------------------------------- letta/client/client.py | 2 + letta/main.py | 1 - 3 files changed, 23 insertions(+), 70 deletions(-) diff --git a/letta/cli/cli_load.py b/letta/cli/cli_load.py index 61518bc038..b27da4d81a 100644 --- a/letta/cli/cli_load.py +++ b/letta/cli/cli_load.py @@ -11,6 +11,7 @@ import uuid from typing import Annotated, List, Optional +import questionary import typer from letta import create_client @@ -37,8 +38,27 @@ def load_directory( # create connector connector = DirectoryConnector(input_files=input_files, input_directory=input_dir, recursive=recursive, extensions=extensions) + # choose form list of embedding configs + embedding_configs = client.list_embedding_configs() + embedding_options = [embedding_config.embedding_model for embedding_config in embedding_configs] + + embedding_choices = [ + questionary.Choice(title=embedding_config.pretty_print(), value=embedding_config) for embedding_config in embedding_configs + ] + + # select model + if len(embedding_options) == 0: + raise ValueError("No embedding models found. Please enable a provider.") + elif len(embedding_options) == 1: + embedding_model_name = embedding_options[0] + else: + embedding_model_name = questionary.select("Select embedding model:", choices=embedding_choices).ask().embedding_model + embedding_config = [ + embedding_config for embedding_config in embedding_configs if embedding_config.embedding_model == embedding_model_name + ][0] + # create source - source = client.create_source(name=name) + source = client.create_source(name=name, embedding_config=embedding_config) # load data try: @@ -46,71 +66,3 @@ def load_directory( except Exception as e: typer.secho(f"Failed to load data from provided information.\n{e}", fg=typer.colors.RED) client.delete_source(source.id) - - -# @app.command("webpage") -# def load_webpage( -# name: Annotated[str, typer.Option(help="Name of dataset to load.")], -# urls: Annotated[List[str], typer.Option(help="List of urls to load.")], -# ): -# try: -# from llama_index.readers.web import SimpleWebPageReader -# -# docs = SimpleWebPageReader(html_to_text=True).load_data(urls) -# store_docs(name, docs) -# -# except ValueError as e: -# typer.secho(f"Failed to load webpage from provided information.\n{e}", fg=typer.colors.RED) - - -@app.command("vector-database") -def load_vector_database( - name: Annotated[str, typer.Option(help="Name of dataset to load.")], - uri: Annotated[str, typer.Option(help="Database URI.")], - table_name: Annotated[str, typer.Option(help="Name of table containing data.")], - text_column: Annotated[str, typer.Option(help="Name of column containing text.")], - embedding_column: Annotated[str, typer.Option(help="Name of column containing embedding.")], - user_id: Annotated[Optional[uuid.UUID], typer.Option(help="User ID to associate with dataset.")] = None, -): - """Load pre-computed embeddings into Letta from a database.""" - raise NotImplementedError - # try: - # config = LettaConfig.load() - # connector = VectorDBConnector( - # uri=uri, - # table_name=table_name, - # text_column=text_column, - # embedding_column=embedding_column, - # embedding_dim=config.default_embedding_config.embedding_dim, - # ) - # if not user_id: - # user_id = uuid.UUID(config.anon_clientid) - - # ms = MetadataStore(config) - # source = Source( - # name=name, - # user_id=user_id, - # embedding_model=config.default_embedding_config.embedding_model, - # embedding_dim=config.default_embedding_config.embedding_dim, - # ) - # ms.create_source(source) - # passage_storage = StorageConnector.get_storage_connector(TableType.PASSAGES, config, user_id) - # # TODO: also get document store - - # # ingest data into passage/document store - # try: - # num_passages, num_documents = load_data( - # connector=connector, - # source=source, - # embedding_config=config.default_embedding_config, - # document_store=None, - # passage_store=passage_storage, - # ) - # print(f"Loaded {num_passages} passages and {num_documents} files from {name}") - # except Exception as e: - # typer.secho(f"Failed to load data from provided information.\n{e}", fg=typer.colors.RED) - # ms.delete_source(source_id=source.id) - - # except ValueError as e: - # typer.secho(f"Failed to load VectorDB from provided information.\n{e}", fg=typer.colors.RED) - # raise diff --git a/letta/client/client.py b/letta/client/client.py index d4cedb033c..7e8ec30428 100644 --- a/letta/client/client.py +++ b/letta/client/client.py @@ -1319,6 +1319,7 @@ def create_source(self, name: str, embedding_config: Optional[EmbeddingConfig] = Returns: source (Source): Created source """ + assert embedding_config or self._default_embedding_config, f"Must specify embedding_config for source" source_create = SourceCreate(name=name, embedding_config=embedding_config or self._default_embedding_config) payload = source_create.model_dump() response = requests.post(f"{self.base_url}/{self.api_prefix}/sources", json=payload, headers=self.headers) @@ -2896,6 +2897,7 @@ def create_source(self, name: str, embedding_config: Optional[EmbeddingConfig] = Returns: source (Source): Created source """ + assert embedding_config or self._default_embedding_config, f"Must specify embedding_config for source" source = Source( name=name, embedding_config=embedding_config or self._default_embedding_config, organization_id=self.user.organization_id ) diff --git a/letta/main.py b/letta/main.py index 1f8e19efa9..6a394fcf64 100644 --- a/letta/main.py +++ b/letta/main.py @@ -191,7 +191,6 @@ def run_agent_loop( print(f"\nDumping memory contents:\n") print(f"{letta_agent.agent_state.memory.compile()}") print(f"{letta_agent.archival_memory.compile()}") - print(f"{letta_agent.recall_memory.compile()}") continue elif user_input.lower() == "/model": From 6fde66b4007eec89d606cccb7fe2a936bea3ec14 Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Mon, 9 Dec 2024 15:18:31 -0800 Subject: [PATCH 047/280] chore: bump version 0.6.2 + and make postgres dependencies optional (#2183) --- letta/__init__.py | 2 +- poetry.lock | 231 +++++++++++++++++++++++----------------------- pyproject.toml | 6 +- 3 files changed, 120 insertions(+), 119 deletions(-) diff --git a/letta/__init__.py b/letta/__init__.py index 3dba086387..1ca57b875d 100644 --- a/letta/__init__.py +++ b/letta/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.6.1" +__version__ = "0.6.2" # import clients from letta.client.client import LocalClient, RESTClient, create_client diff --git a/poetry.lock b/poetry.lock index b53c0649be..f0cb082bd8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1249,19 +1249,19 @@ files = [ [[package]] name = "e2b" -version = "1.0.4" +version = "1.0.5" description = "E2B SDK that give agents cloud environments" optional = true python-versions = "<4.0,>=3.8" files = [ - {file = "e2b-1.0.4-py3-none-any.whl", hash = "sha256:1a9c765eb1b2cc291c5ebd3f2e268f8fba9471a12f470f4651395b5753730170"}, - {file = "e2b-1.0.4.tar.gz", hash = "sha256:5ed3db4f984e52cf3aabb717725493ff060a8374b7c878b31bceeff46a0b5648"}, + {file = "e2b-1.0.5-py3-none-any.whl", hash = "sha256:a71bdec46f33d3e38e87d475d7fd2939bd7b6b753b819c9639ca211cd375b79e"}, + {file = "e2b-1.0.5.tar.gz", hash = "sha256:43c82705af7b7d4415c2510ff77dab4dc075351e0b769d6adf8e0d7bb4868d13"}, ] [package.dependencies] attrs = ">=23.2.0" httpcore = ">=1.0.5,<2.0.0" -httpx = ">=0.27.0,<0.28.0" +httpx = ">=0.27.0,<1.0.0" packaging = ">=24.1" protobuf = ">=3.20.0,<6.0.0" python-dateutil = ">=2.8.2" @@ -1269,19 +1269,19 @@ typing-extensions = ">=4.1.0" [[package]] name = "e2b-code-interpreter" -version = "1.0.2" +version = "1.0.3" description = "E2B Code Interpreter - Stateful code execution" optional = true python-versions = "<4.0,>=3.8" files = [ - {file = "e2b_code_interpreter-1.0.2-py3-none-any.whl", hash = "sha256:02f2786a094550be8b96093c7cfcae9ff24cbeddb4dff76f3c2e6c4d06d4ba86"}, - {file = "e2b_code_interpreter-1.0.2.tar.gz", hash = "sha256:b2a173209205bc0fce09a90b145cd6c739ff6130d9ec850bdc38e70c1b666f67"}, + {file = "e2b_code_interpreter-1.0.3-py3-none-any.whl", hash = "sha256:c638bd4ec1c99d9c4eaac541bc8b15134cf786f6c7c400d979cef96d62e485d8"}, + {file = "e2b_code_interpreter-1.0.3.tar.gz", hash = "sha256:36475acc001b1317ed129d65970fce6a7cc2d50e3fd3e8a13ad5d7d3e0fac237"}, ] [package.dependencies] attrs = ">=21.3.0" e2b = ">=1.0.4,<2.0.0" -httpx = ">=0.20.0,<0.28.0" +httpx = ">=0.20.0,<1.0.0" [[package]] name = "environs" @@ -2188,13 +2188,13 @@ files = [ [[package]] name = "huggingface-hub" -version = "0.26.3" +version = "0.26.5" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.26.3-py3-none-any.whl", hash = "sha256:e66aa99e569c2d5419240a9e553ad07245a5b1300350bfbc5a4945cf7432991b"}, - {file = "huggingface_hub-0.26.3.tar.gz", hash = "sha256:90e1fe62ffc26757a073aaad618422b899ccf9447c2bba8c902a90bef5b42e1d"}, + {file = "huggingface_hub-0.26.5-py3-none-any.whl", hash = "sha256:fb7386090bbe892072e64b85f7c4479fd2d65eea5f2543327c970d5169e83924"}, + {file = "huggingface_hub-0.26.5.tar.gz", hash = "sha256:1008bd18f60bfb65e8dbc0a97249beeeaa8c99d3c2fa649354df9fa5a13ed83b"}, ] [package.dependencies] @@ -2485,86 +2485,87 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jiter" -version = "0.8.0" +version = "0.8.2" description = "Fast iterable JSON parser." optional = false python-versions = ">=3.8" files = [ - {file = "jiter-0.8.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:dee4eeb293ffcd2c3b31ebab684dbf7f7b71fe198f8eddcdf3a042cc6e10205a"}, - {file = "jiter-0.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aad1e6e9b01cf0304dcee14db03e92e0073287a6297caf5caf2e9dbfea16a924"}, - {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:504099fb7acdbe763e10690d560a25d4aee03d918d6a063f3a761d8a09fb833f"}, - {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2373487caad7fe39581f588ab5c9262fc1ade078d448626fec93f4ffba528858"}, - {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c341ecc3f9bccde952898b0c97c24f75b84b56a7e2f8bbc7c8e38cab0875a027"}, - {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e48e7a336529b9419d299b70c358d4ebf99b8f4b847ed3f1000ec9f320e8c0c"}, - {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5ee157a8afd2943be690db679f82fafb8d347a8342e8b9c34863de30c538d55"}, - {file = "jiter-0.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d7dceae3549b80087f913aad4acc2a7c1e0ab7cb983effd78bdc9c41cabdcf18"}, - {file = "jiter-0.8.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e29e9ecce53d396772590438214cac4ab89776f5e60bd30601f1050b34464019"}, - {file = "jiter-0.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fa1782f22d5f92c620153133f35a9a395d3f3823374bceddd3e7032e2fdfa0b1"}, - {file = "jiter-0.8.0-cp310-none-win32.whl", hash = "sha256:f754ef13b4e4f67a3bf59fe974ef4342523801c48bf422f720bd37a02a360584"}, - {file = "jiter-0.8.0-cp310-none-win_amd64.whl", hash = "sha256:796f750b65f5d605f5e7acaccc6b051675e60c41d7ac3eab40dbd7b5b81a290f"}, - {file = "jiter-0.8.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f6f4e645efd96b4690b9b6091dbd4e0fa2885ba5c57a0305c1916b75b4f30ff6"}, - {file = "jiter-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f61cf6d93c1ade9b8245c9f14b7900feadb0b7899dbe4aa8de268b705647df81"}, - {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0396bc5cb1309c6dab085e70bb3913cdd92218315e47b44afe9eace68ee8adaa"}, - {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62d0e42ec5dc772bd8554a304358220be5d97d721c4648b23f3a9c01ccc2cb26"}, - {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec4b711989860705733fc59fb8c41b2def97041cea656b37cf6c8ea8dee1c3f4"}, - {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:859cc35bf304ab066d88f10a44a3251a9cd057fb11ec23e00be22206db878f4f"}, - {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5000195921aa293b39b9b5bc959d7fa658e7f18f938c0e52732da8e3cc70a278"}, - {file = "jiter-0.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36050284c0abde57aba34964d3920f3d6228211b65df7187059bb7c7f143759a"}, - {file = "jiter-0.8.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a88f608e050cfe45c48d771e86ecdbf5258314c883c986d4217cc79e1fb5f689"}, - {file = "jiter-0.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:646cf4237665b2e13b4159d8f26d53f59bc9f2e6e135e3a508a2e5dd26d978c6"}, - {file = "jiter-0.8.0-cp311-none-win32.whl", hash = "sha256:21fe5b8345db1b3023052b2ade9bb4d369417827242892051244af8fae8ba231"}, - {file = "jiter-0.8.0-cp311-none-win_amd64.whl", hash = "sha256:30c2161c5493acf6b6c3c909973fb64ae863747def01cc7574f3954e0a15042c"}, - {file = "jiter-0.8.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d91a52d8f49ada2672a4b808a0c5c25d28f320a2c9ca690e30ebd561eb5a1002"}, - {file = "jiter-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c38cf25cf7862f61410b7a49684d34eb3b5bcbd7ddaf4773eea40e0bd43de706"}, - {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6189beb5c4b3117624be6b2e84545cff7611f5855d02de2d06ff68e316182be"}, - {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e13fa849c0e30643554add089983caa82f027d69fad8f50acadcb21c462244ab"}, - {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d7765ca159d0a58e8e0f8ca972cd6d26a33bc97b4480d0d2309856763807cd28"}, - {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b0befe7c6e9fc867d5bed21bab0131dfe27d1fa5cd52ba2bced67da33730b7d"}, - {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7d6363d4c6f1052b1d8b494eb9a72667c3ef5f80ebacfe18712728e85327000"}, - {file = "jiter-0.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a873e57009863eeac3e3969e4653f07031d6270d037d6224415074ac17e5505c"}, - {file = "jiter-0.8.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2582912473c0d9940791479fe1bf2976a34f212eb8e0a82ee9e645ac275c5d16"}, - {file = "jiter-0.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:646163201af42f55393ee6e8f6136b8df488253a6533f4230a64242ecbfe6048"}, - {file = "jiter-0.8.0-cp312-none-win32.whl", hash = "sha256:96e75c9abfbf7387cba89a324d2356d86d8897ac58c956017d062ad510832dae"}, - {file = "jiter-0.8.0-cp312-none-win_amd64.whl", hash = "sha256:ed6074552b4a32e047b52dad5ab497223721efbd0e9efe68c67749f094a092f7"}, - {file = "jiter-0.8.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:dd5e351cb9b3e676ec3360a85ea96def515ad2b83c8ae3a251ce84985a2c9a6f"}, - {file = "jiter-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ba9f12b0f801ecd5ed0cec29041dc425d1050922b434314c592fc30d51022467"}, - {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7ba461c3681728d556392e8ae56fb44a550155a24905f01982317b367c21dd4"}, - {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a15ed47ab09576db560dbc5c2c5a64477535beb056cd7d997d5dd0f2798770e"}, - {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cef55042816d0737142b0ec056c0356a5f681fb8d6aa8499b158e87098f4c6f8"}, - {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:549f170215adeb5e866f10617c3d019d8eb4e6d4e3c6b724b3b8c056514a3487"}, - {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f867edeb279d22020877640d2ea728de5817378c60a51be8af731a8a8f525306"}, - {file = "jiter-0.8.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aef8845f463093799db4464cee2aa59d61aa8edcb3762aaa4aacbec3f478c929"}, - {file = "jiter-0.8.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:d0d6e22e4062c3d3c1bf3594baa2f67fc9dcdda8275abad99e468e0c6540bc54"}, - {file = "jiter-0.8.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:079e62e64696241ac3f408e337aaac09137ed760ccf2b72b1094b48745c13641"}, - {file = "jiter-0.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74d2b56ed3da5760544df53b5f5c39782e68efb64dc3aa0bba4cc08815e6fae8"}, - {file = "jiter-0.8.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:798dafe108cba58a7bb0a50d4d5971f98bb7f3c974e1373e750de6eb21c1a329"}, - {file = "jiter-0.8.0-cp313-none-win32.whl", hash = "sha256:ca6d3064dfc743eb0d3d7539d89d4ba886957c717567adc72744341c1e3573c9"}, - {file = "jiter-0.8.0-cp313-none-win_amd64.whl", hash = "sha256:38caedda64fe1f04b06d7011fc15e86b3b837ed5088657bf778656551e3cd8f9"}, - {file = "jiter-0.8.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:bb5c8a0a8d081c338db22e5b8d53a89a121790569cbb85f7d3cfb1fe0fbe9836"}, - {file = "jiter-0.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:202dbe8970bfb166fab950eaab8f829c505730a0b33cc5e1cfb0a1c9dd56b2f9"}, - {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9046812e5671fdcfb9ae02881fff1f6a14d484b7e8b3316179a372cdfa1e8026"}, - {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e6ac56425023e52d65150918ae25480d0a1ce2a6bf5ea2097f66a2cc50f6d692"}, - {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7dfcf97210c6eab9d2a1c6af15dd39e1d5154b96a7145d0a97fa1df865b7b834"}, - {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4e3c8444d418686f78c9a547b9b90031faf72a0a1a46bfec7fb31edbd889c0d"}, - {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6507011a299b7f578559084256405a8428875540d8d13530e00b688e41b09493"}, - {file = "jiter-0.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0aae4738eafdd34f0f25c2d3668ce9e8fa0d7cb75a2efae543c9a69aebc37323"}, - {file = "jiter-0.8.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7f5d782e790396b13f2a7b36bdcaa3736a33293bdda80a4bf1a3ce0cd5ef9f15"}, - {file = "jiter-0.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cc7f993bc2c4e03015445adbb16790c303282fce2e8d9dc3a3905b1d40e50564"}, - {file = "jiter-0.8.0-cp38-none-win32.whl", hash = "sha256:d4a8a6eda018a991fa58ef707dd51524055d11f5acb2f516d70b1be1d15ab39c"}, - {file = "jiter-0.8.0-cp38-none-win_amd64.whl", hash = "sha256:4cca948a3eda8ea24ed98acb0ee19dc755b6ad2e570ec85e1527d5167f91ff67"}, - {file = "jiter-0.8.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:ef89663678d8257063ce7c00d94638e05bd72f662c5e1eb0e07a172e6c1a9a9f"}, - {file = "jiter-0.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c402ddcba90b4cc71db3216e8330f4db36e0da2c78cf1d8a9c3ed8f272602a94"}, - {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a6dfe795b7a173a9f8ba7421cdd92193d60c1c973bbc50dc3758a9ad0fa5eb6"}, - {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ec29a31b9abd6be39453a2c45da067138a3005d65d2c0507c530e0f1fdcd9a4"}, - {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a488f8c54bddc3ddefaf3bfd6de4a52c97fc265d77bc2dcc6ee540c17e8c342"}, - {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aeb5561adf4d26ca0d01b5811b4d7b56a8986699a473d700757b4758ef787883"}, - {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ab961858d7ad13132328517d29f121ae1b2d94502191d6bcf96bddcc8bb5d1c"}, - {file = "jiter-0.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a207e718d114d23acf0850a2174d290f42763d955030d9924ffa4227dbd0018f"}, - {file = "jiter-0.8.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:733bc9dc8ff718a0ae4695239e9268eb93e88b73b367dfac3ec227d8ce2f1e77"}, - {file = "jiter-0.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1ec27299e22d05e13a06e460bf7f75f26f9aaa0e0fb7d060f40e88df1d81faa"}, - {file = "jiter-0.8.0-cp39-none-win32.whl", hash = "sha256:e8dbfcb46553e6661d3fc1f33831598fcddf73d0f67834bce9fc3e9ebfe5c439"}, - {file = "jiter-0.8.0-cp39-none-win_amd64.whl", hash = "sha256:af2ce2487b3a93747e2cb5150081d4ae1e5874fce5924fc1a12e9e768e489ad8"}, - {file = "jiter-0.8.0.tar.gz", hash = "sha256:86fee98b569d4cc511ff2e3ec131354fafebd9348a487549c31ad371ae730310"}, + {file = "jiter-0.8.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ca8577f6a413abe29b079bc30f907894d7eb07a865c4df69475e868d73e71c7b"}, + {file = "jiter-0.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b25bd626bde7fb51534190c7e3cb97cee89ee76b76d7585580e22f34f5e3f393"}, + {file = "jiter-0.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c826a221851a8dc028eb6d7d6429ba03184fa3c7e83ae01cd6d3bd1d4bd17d"}, + {file = "jiter-0.8.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d35c864c2dff13dfd79fb070fc4fc6235d7b9b359efe340e1261deb21b9fcb66"}, + {file = "jiter-0.8.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f557c55bc2b7676e74d39d19bcb8775ca295c7a028246175d6a8b431e70835e5"}, + {file = "jiter-0.8.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:580ccf358539153db147e40751a0b41688a5ceb275e6f3e93d91c9467f42b2e3"}, + {file = "jiter-0.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af102d3372e917cffce49b521e4c32c497515119dc7bd8a75665e90a718bbf08"}, + {file = "jiter-0.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cadcc978f82397d515bb2683fc0d50103acff2a180552654bb92d6045dec2c49"}, + {file = "jiter-0.8.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ba5bdf56969cad2019d4e8ffd3f879b5fdc792624129741d3d83fc832fef8c7d"}, + {file = "jiter-0.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3b94a33a241bee9e34b8481cdcaa3d5c2116f575e0226e421bed3f7a6ea71cff"}, + {file = "jiter-0.8.2-cp310-cp310-win32.whl", hash = "sha256:6e5337bf454abddd91bd048ce0dca5134056fc99ca0205258766db35d0a2ea43"}, + {file = "jiter-0.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:4a9220497ca0cb1fe94e3f334f65b9b5102a0b8147646118f020d8ce1de70105"}, + {file = "jiter-0.8.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2dd61c5afc88a4fda7d8b2cf03ae5947c6ac7516d32b7a15bf4b49569a5c076b"}, + {file = "jiter-0.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a6c710d657c8d1d2adbbb5c0b0c6bfcec28fd35bd6b5f016395f9ac43e878a15"}, + {file = "jiter-0.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9584de0cd306072635fe4b89742bf26feae858a0683b399ad0c2509011b9dc0"}, + {file = "jiter-0.8.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5a90a923338531b7970abb063cfc087eebae6ef8ec8139762007188f6bc69a9f"}, + {file = "jiter-0.8.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21974d246ed0181558087cd9f76e84e8321091ebfb3a93d4c341479a736f099"}, + {file = "jiter-0.8.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32475a42b2ea7b344069dc1e81445cfc00b9d0e3ca837f0523072432332e9f74"}, + {file = "jiter-0.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b9931fd36ee513c26b5bf08c940b0ac875de175341cbdd4fa3be109f0492586"}, + {file = "jiter-0.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0820f4a3a59ddced7fce696d86a096d5cc48d32a4183483a17671a61edfddc"}, + {file = "jiter-0.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8ffc86ae5e3e6a93765d49d1ab47b6075a9c978a2b3b80f0f32628f39caa0c88"}, + {file = "jiter-0.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5127dc1abd809431172bc3fbe8168d6b90556a30bb10acd5ded41c3cfd6f43b6"}, + {file = "jiter-0.8.2-cp311-cp311-win32.whl", hash = "sha256:66227a2c7b575720c1871c8800d3a0122bb8ee94edb43a5685aa9aceb2782d44"}, + {file = "jiter-0.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:cde031d8413842a1e7501e9129b8e676e62a657f8ec8166e18a70d94d4682855"}, + {file = "jiter-0.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e6ec2be506e7d6f9527dae9ff4b7f54e68ea44a0ef6b098256ddf895218a2f8f"}, + {file = "jiter-0.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76e324da7b5da060287c54f2fabd3db5f76468006c811831f051942bf68c9d44"}, + {file = "jiter-0.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:180a8aea058f7535d1c84183c0362c710f4750bef66630c05f40c93c2b152a0f"}, + {file = "jiter-0.8.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:025337859077b41548bdcbabe38698bcd93cfe10b06ff66617a48ff92c9aec60"}, + {file = "jiter-0.8.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecff0dc14f409599bbcafa7e470c00b80f17abc14d1405d38ab02e4b42e55b57"}, + {file = "jiter-0.8.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffd9fee7d0775ebaba131f7ca2e2d83839a62ad65e8e02fe2bd8fc975cedeb9e"}, + {file = "jiter-0.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14601dcac4889e0a1c75ccf6a0e4baf70dbc75041e51bcf8d0e9274519df6887"}, + {file = "jiter-0.8.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:92249669925bc1c54fcd2ec73f70f2c1d6a817928480ee1c65af5f6b81cdf12d"}, + {file = "jiter-0.8.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e725edd0929fa79f8349ab4ec7f81c714df51dc4e991539a578e5018fa4a7152"}, + {file = "jiter-0.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bf55846c7b7a680eebaf9c3c48d630e1bf51bdf76c68a5f654b8524335b0ad29"}, + {file = "jiter-0.8.2-cp312-cp312-win32.whl", hash = "sha256:7efe4853ecd3d6110301665a5178b9856be7e2a9485f49d91aa4d737ad2ae49e"}, + {file = "jiter-0.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:83c0efd80b29695058d0fd2fa8a556490dbce9804eac3e281f373bbc99045f6c"}, + {file = "jiter-0.8.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ca1f08b8e43dc3bd0594c992fb1fd2f7ce87f7bf0d44358198d6da8034afdf84"}, + {file = "jiter-0.8.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5672a86d55416ccd214c778efccf3266b84f87b89063b582167d803246354be4"}, + {file = "jiter-0.8.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58dc9bc9767a1101f4e5e22db1b652161a225874d66f0e5cb8e2c7d1c438b587"}, + {file = "jiter-0.8.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:37b2998606d6dadbb5ccda959a33d6a5e853252d921fec1792fc902351bb4e2c"}, + {file = "jiter-0.8.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ab9a87f3784eb0e098f84a32670cfe4a79cb6512fd8f42ae3d0709f06405d18"}, + {file = "jiter-0.8.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:79aec8172b9e3c6d05fd4b219d5de1ac616bd8da934107325a6c0d0e866a21b6"}, + {file = "jiter-0.8.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:711e408732d4e9a0208008e5892c2966b485c783cd2d9a681f3eb147cf36c7ef"}, + {file = "jiter-0.8.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:653cf462db4e8c41995e33d865965e79641ef45369d8a11f54cd30888b7e6ff1"}, + {file = "jiter-0.8.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:9c63eaef32b7bebac8ebebf4dabebdbc6769a09c127294db6babee38e9f405b9"}, + {file = "jiter-0.8.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:eb21aaa9a200d0a80dacc7a81038d2e476ffe473ffdd9c91eb745d623561de05"}, + {file = "jiter-0.8.2-cp313-cp313-win32.whl", hash = "sha256:789361ed945d8d42850f919342a8665d2dc79e7e44ca1c97cc786966a21f627a"}, + {file = "jiter-0.8.2-cp313-cp313-win_amd64.whl", hash = "sha256:ab7f43235d71e03b941c1630f4b6e3055d46b6cb8728a17663eaac9d8e83a865"}, + {file = "jiter-0.8.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b426f72cd77da3fec300ed3bc990895e2dd6b49e3bfe6c438592a3ba660e41ca"}, + {file = "jiter-0.8.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2dd880785088ff2ad21ffee205e58a8c1ddabc63612444ae41e5e4b321b39c0"}, + {file = "jiter-0.8.2-cp313-cp313t-win_amd64.whl", hash = "sha256:3ac9f578c46f22405ff7f8b1f5848fb753cc4b8377fbec8470a7dc3997ca7566"}, + {file = "jiter-0.8.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:9e1fa156ee9454642adb7e7234a383884452532bc9d53d5af2d18d98ada1d79c"}, + {file = "jiter-0.8.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0cf5dfa9956d96ff2efb0f8e9c7d055904012c952539a774305aaaf3abdf3d6c"}, + {file = "jiter-0.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e52bf98c7e727dd44f7c4acb980cb988448faeafed8433c867888268899b298b"}, + {file = "jiter-0.8.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a2ecaa3c23e7a7cf86d00eda3390c232f4d533cd9ddea4b04f5d0644faf642c5"}, + {file = "jiter-0.8.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:08d4c92bf480e19fc3f2717c9ce2aa31dceaa9163839a311424b6862252c943e"}, + {file = "jiter-0.8.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99d9a1eded738299ba8e106c6779ce5c3893cffa0e32e4485d680588adae6db8"}, + {file = "jiter-0.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d20be8b7f606df096e08b0b1b4a3c6f0515e8dac296881fe7461dfa0fb5ec817"}, + {file = "jiter-0.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d33f94615fcaf872f7fd8cd98ac3b429e435c77619777e8a449d9d27e01134d1"}, + {file = "jiter-0.8.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:317b25e98a35ffec5c67efe56a4e9970852632c810d35b34ecdd70cc0e47b3b6"}, + {file = "jiter-0.8.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fc9043259ee430ecd71d178fccabd8c332a3bf1e81e50cae43cc2b28d19e4cb7"}, + {file = "jiter-0.8.2-cp38-cp38-win32.whl", hash = "sha256:fc5adda618205bd4678b146612ce44c3cbfdee9697951f2c0ffdef1f26d72b63"}, + {file = "jiter-0.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:cd646c827b4f85ef4a78e4e58f4f5854fae0caf3db91b59f0d73731448a970c6"}, + {file = "jiter-0.8.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:e41e75344acef3fc59ba4765df29f107f309ca9e8eace5baacabd9217e52a5ee"}, + {file = "jiter-0.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f22b16b35d5c1df9dfd58843ab2cd25e6bf15191f5a236bed177afade507bfc"}, + {file = "jiter-0.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7200b8f7619d36aa51c803fd52020a2dfbea36ffec1b5e22cab11fd34d95a6d"}, + {file = "jiter-0.8.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:70bf4c43652cc294040dbb62256c83c8718370c8b93dd93d934b9a7bf6c4f53c"}, + {file = "jiter-0.8.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9d471356dc16f84ed48768b8ee79f29514295c7295cb41e1133ec0b2b8d637d"}, + {file = "jiter-0.8.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:859e8eb3507894093d01929e12e267f83b1d5f6221099d3ec976f0c995cb6bd9"}, + {file = "jiter-0.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaa58399c01db555346647a907b4ef6d4f584b123943be6ed5588c3f2359c9f4"}, + {file = "jiter-0.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8f2d5ed877f089862f4c7aacf3a542627c1496f972a34d0474ce85ee7d939c27"}, + {file = "jiter-0.8.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:03c9df035d4f8d647f8c210ddc2ae0728387275340668fb30d2421e17d9a0841"}, + {file = "jiter-0.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8bd2a824d08d8977bb2794ea2682f898ad3d8837932e3a74937e93d62ecbb637"}, + {file = "jiter-0.8.2-cp39-cp39-win32.whl", hash = "sha256:ca29b6371ebc40e496995c94b988a101b9fbbed48a51190a4461fcb0a68b4a36"}, + {file = "jiter-0.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:1c0dfbd1be3cbefc7510102370d86e35d1d53e5a93d48519688b1bf0f761160a"}, + {file = "jiter-0.8.2.tar.gz", hash = "sha256:cd73d3e740666d0e639f678adb176fad25c1bcbdae88d8d7b857e1783bb4212d"}, ] [[package]] @@ -2720,19 +2721,19 @@ adal = ["adal (>=1.0.2)"] [[package]] name = "langchain" -version = "0.3.9" +version = "0.3.10" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langchain-0.3.9-py3-none-any.whl", hash = "sha256:ade5a1fee2f94f2e976a6c387f97d62cc7f0b9f26cfe0132a41d2bda761e1045"}, - {file = "langchain-0.3.9.tar.gz", hash = "sha256:4950c4ad627d0aa95ce6bda7de453e22059b7e7836b562a8f781fb0b05d7294c"}, + {file = "langchain-0.3.10-py3-none-any.whl", hash = "sha256:4ae38d4c9f9ec5cd1a16a505b451a57c0aab2807d6c9f8cb5b346d06301b2232"}, + {file = "langchain-0.3.10.tar.gz", hash = "sha256:aef0f9bdaf4a4d3d50aec348438135987bda1d83070b49f77032f561d3a761d8"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} -langchain-core = ">=0.3.21,<0.4.0" +langchain-core = ">=0.3.22,<0.4.0" langchain-text-splitters = ">=0.3.0,<0.4.0" langsmith = ">=0.1.17,<0.2.0" numpy = [ @@ -2747,21 +2748,21 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10" [[package]] name = "langchain-community" -version = "0.3.9" +version = "0.3.10" description = "Community contributed LangChain integrations." optional = true python-versions = "<4.0,>=3.9" files = [ - {file = "langchain_community-0.3.9-py3-none-any.whl", hash = "sha256:ccccf9e703ccb7d929034be56e36177e3ee796e5ab8417aa79c25dc6ef40e1bd"}, - {file = "langchain_community-0.3.9.tar.gz", hash = "sha256:b0b44c530c7647a360f2321749e7b7e95a3cbdfa2fceed7e1214228833996223"}, + {file = "langchain_community-0.3.10-py3-none-any.whl", hash = "sha256:f718de973f60c6d0f10c71321e461cf41251cc74543f064b7b2ee7ae06b9a43f"}, + {file = "langchain_community-0.3.10.tar.gz", hash = "sha256:f503e90cbb44ddb14afb141552a93fd9fbd0b216407315a6608f901861a938f9"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" dataclasses-json = ">=0.5.7,<0.7" httpx-sse = ">=0.4.0,<0.5.0" -langchain = ">=0.3.8,<0.4.0" -langchain-core = ">=0.3.21,<0.4.0" +langchain = ">=0.3.10,<0.4.0" +langchain-core = ">=0.3.22,<0.4.0" langsmith = ">=0.1.125,<0.2.0" numpy = [ {version = ">=1.22.4,<2", markers = "python_version < \"3.12\""}, @@ -2775,13 +2776,13 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10" [[package]] name = "langchain-core" -version = "0.3.21" +version = "0.3.22" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langchain_core-0.3.21-py3-none-any.whl", hash = "sha256:7e723dff80946a1198976c6876fea8326dc82566ef9bcb5f8d9188f738733665"}, - {file = "langchain_core-0.3.21.tar.gz", hash = "sha256:561b52b258ffa50a9fb11d7a1940ebfd915654d1ec95b35e81dfd5ee84143411"}, + {file = "langchain_core-0.3.22-py3-none-any.whl", hash = "sha256:b40b036b3bd4abc1dfc820e149f5a3c4abef2fee83eb807c4310a41a064580e0"}, + {file = "langchain_core-0.3.22.tar.gz", hash = "sha256:c61c6d62f137dff2a1ec785473a3225e4fa237e53eac88f5359fda664dc5d91c"}, ] [package.dependencies] @@ -2798,18 +2799,18 @@ typing-extensions = ">=4.7" [[package]] name = "langchain-openai" -version = "0.2.11" +version = "0.2.12" description = "An integration package connecting OpenAI and LangChain" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langchain_openai-0.2.11-py3-none-any.whl", hash = "sha256:c019ae915a5782943bee9503388e65c8622d400e0451ef885f3e4989cf35727f"}, - {file = "langchain_openai-0.2.11.tar.gz", hash = "sha256:563bd843092d260c7ffd88b8e0e6b830f36347e058e62a6d5e9cc4c461a8da98"}, + {file = "langchain_openai-0.2.12-py3-none-any.whl", hash = "sha256:916965c45584d9ea565825ad3bb7629b1ff57f12f36d4b937e5b7d65903839d6"}, + {file = "langchain_openai-0.2.12.tar.gz", hash = "sha256:8b92096623065a2820e89aa5fb0a262fb109d56c346e3b09ba319af424c45cd1"}, ] [package.dependencies] langchain-core = ">=0.3.21,<0.4.0" -openai = ">=1.54.0,<2.0.0" +openai = ">=1.55.3,<2.0.0" tiktoken = ">=0.7,<1" [[package]] @@ -3158,13 +3159,13 @@ llama-parse = ">=0.5.0" [[package]] name = "llama-parse" -version = "0.5.16" +version = "0.5.17" description = "Parse files into RAG-Optimized formats." optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "llama_parse-0.5.16-py3-none-any.whl", hash = "sha256:a0b72770b1101604d02faa8236024eadd494fd135a833fb23a22a3ab570381fa"}, - {file = "llama_parse-0.5.16.tar.gz", hash = "sha256:609a9262461b787bab116e6ab74e52339e2950623f20867578e49d91e8974641"}, + {file = "llama_parse-0.5.17-py3-none-any.whl", hash = "sha256:0981c7e4ac21bc3b314830c6e9eaed4b20db874ec8f8868540707cf2cca07051"}, + {file = "llama_parse-0.5.17.tar.gz", hash = "sha256:2ba2700ca3b15e84ef072fedcbbfeae2fc13ce7b63fee20fcd5249e6fcdbd381"}, ] [package.dependencies] @@ -3205,13 +3206,13 @@ Werkzeug = ">=2.0.0" [[package]] name = "mako" -version = "1.3.7" +version = "1.3.8" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." optional = false python-versions = ">=3.8" files = [ - {file = "Mako-1.3.7-py3-none-any.whl", hash = "sha256:d18f990ad57f800ce8e76cbfb0b74afe471c293517e9f5003ace6dad5aa72c36"}, - {file = "mako-1.3.7.tar.gz", hash = "sha256:20405b1232e0759f0e7d87b01f6bb94fce0761747f1cb876ecf90bd512d0b639"}, + {file = "Mako-1.3.8-py3-none-any.whl", hash = "sha256:42f48953c7eb91332040ff567eb7eea69b22e7a4affbc5ba8e845e8f730f6627"}, + {file = "mako-1.3.8.tar.gz", hash = "sha256:577b97e414580d3e088d47c2dbbe9594aa7a5146ed2875d4dfa9075af2dd3cc8"}, ] [package.dependencies] @@ -3910,13 +3911,13 @@ sympy = "*" [[package]] name = "openai" -version = "1.57.0" +version = "1.57.1" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" files = [ - {file = "openai-1.57.0-py3-none-any.whl", hash = "sha256:972e36960b821797952da3dc4532f486c28e28a2a332d7d0c5407f242e9d9c39"}, - {file = "openai-1.57.0.tar.gz", hash = "sha256:76f91971c4bdbd78380c9970581075e0337b5d497c2fbf7b5255078f4b31abf9"}, + {file = "openai-1.57.1-py3-none-any.whl", hash = "sha256:3865686c927e93492d1145938d4a24b634951531c4b2769d43ca5dbd4b25d8fd"}, + {file = "openai-1.57.1.tar.gz", hash = "sha256:a95f22e04ab3df26e64a15d958342265e802314131275908b3b3e36f8c5d4377"}, ] [package.dependencies] @@ -4740,7 +4741,7 @@ test = ["pytest", "pytest-xdist", "setuptools"] name = "psycopg2" version = "2.9.10" description = "psycopg2 - Python-PostgreSQL Database Adapter" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "psycopg2-2.9.10-cp310-cp310-win32.whl", hash = "sha256:5df2b672140f95adb453af93a7d669d7a7bf0a56bcd26f1502329166f4a61716"}, @@ -4758,7 +4759,7 @@ files = [ name = "psycopg2-binary" version = "2.9.10" description = "psycopg2 - Python-PostgreSQL Database Adapter" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "psycopg2-binary-2.9.10.tar.gz", hash = "sha256:4b3df0e6990aa98acda57d983942eff13d824135fe2250e6522edaa782a06de2"}, @@ -7554,4 +7555,4 @@ tests = ["wikipedia"] [metadata] lock-version = "2.0" python-versions = "<3.13,>=3.10" -content-hash = "1293bc3a4f2bf98a65b547ce57d62ab0c1f26b6a035241c68327e83d71b2e4fd" +content-hash = "04884f8e0f0dba223d058969636575e96aa0b8d089bbabba6425acc82ac4ea88" diff --git a/pyproject.toml b/pyproject.toml index 24cc74cbed..cf07689a68 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "letta" -version = "0.6.1" +version = "0.6.2" packages = [ {include = "letta"} ] @@ -70,8 +70,8 @@ composio-langchain = "^0.5.28" composio-core = "^0.5.51" alembic = "^1.13.3" pyhumps = "^3.8.0" -psycopg2 = "^2.9.10" -psycopg2-binary = "^2.9.10" +psycopg2 = {version = "^2.9.10", optional = true} +psycopg2-binary = {version = "^2.9.10", optional = true} e2b-code-interpreter = {version = "^1.0.1", optional = true} pathvalidate = "^3.2.1" langchain-community = {version = "^0.3.7", optional = true} From f72f4df275947f12b9f6b6ebc452b5cbb2d6a22e Mon Sep 17 00:00:00 2001 From: Kevin Lin Date: Mon, 9 Dec 2024 18:00:49 -0700 Subject: [PATCH 048/280] fix: remove dedup messages (#2204) --- letta/offline_memory_agent.py | 7 ++----- tests/test_offline_memory_agent.py | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/letta/offline_memory_agent.py b/letta/offline_memory_agent.py index b8f68ea7f2..cceefb4370 100644 --- a/letta/offline_memory_agent.py +++ b/letta/offline_memory_agent.py @@ -150,11 +150,8 @@ def step( step_count = 0 while counter < self.max_memory_rethinks: - # This is hacky but we need to do this for now - # TODO: REMOVE THIS - for m in next_input_message: - m.id = m._generate_id() - + if counter > 0: + next_input_message = [] kwargs["ms"] = ms kwargs["first_message"] = False step_response = self.inner_step( diff --git a/tests/test_offline_memory_agent.py b/tests/test_offline_memory_agent.py index d642d159c6..c3cbb71dc0 100644 --- a/tests/test_offline_memory_agent.py +++ b/tests/test_offline_memory_agent.py @@ -98,7 +98,7 @@ def test_ripple_edit(client, mock_e2b_api_key_none): assert conversation_agent.memory.get_block("rethink_memory_block").value != "[empty]" # Clean up agent - client.create_agent(conversation_agent.id) + client.delete_agent(conversation_agent.id) client.delete_agent(offline_memory_agent.id) From 85a9046c6361b0b974f13e8007360235971d5b77 Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Mon, 9 Dec 2024 18:23:05 -0800 Subject: [PATCH 049/280] feat: add an async messages route (`/agent/{agent_id}/messages/async`) (#2206) --- letta/client/client.py | 34 ++++++- letta/server/rest_api/routers/v1/agents.py | 101 ++++++++++++++++++++- tests/test_client.py | 26 ++++++ 3 files changed, 159 insertions(+), 2 deletions(-) diff --git a/letta/client/client.py b/letta/client/client.py index 7e8ec30428..97f36cd927 100644 --- a/letta/client/client.py +++ b/letta/client/client.py @@ -960,7 +960,6 @@ def send_message( # TODO: figure out how to handle stream_steps and stream_tokens # When streaming steps is True, stream_tokens must be False - request = LettaRequest(messages=messages) if stream_tokens or stream_steps: from letta.client.streaming import _sse_post @@ -985,6 +984,39 @@ def send_message( return response + def send_message_async( + self, + message: str, + role: str, + agent_id: Optional[str] = None, + name: Optional[str] = None, + ) -> Job: + """ + Send a message to an agent (async, returns a job) + + Args: + message (str): Message to send + role (str): Role of the message + agent_id (str): ID of the agent + name(str): Name of the sender + + Returns: + job (Job): Information about the async job + """ + messages = [MessageCreate(role=MessageRole(role), text=message, name=name)] + + request = LettaRequest(messages=messages) + response = requests.post( + f"{self.base_url}/{self.api_prefix}/agents/{agent_id}/messages/async", + json=request.model_dump(), + headers=self.headers, + ) + if response.status_code != 200: + raise ValueError(f"Failed to send message: {response.text}") + response = Job(**response.json()) + + return response + # humans / personas def list_blocks(self, label: Optional[str] = None, templates_only: Optional[bool] = True) -> List[Block]: diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index e3922a28f9..e7f68dc96d 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -3,7 +3,16 @@ from datetime import datetime from typing import List, Optional, Union -from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query, status +from fastapi import ( + APIRouter, + BackgroundTasks, + Body, + Depends, + Header, + HTTPException, + Query, + status, +) from fastapi.responses import JSONResponse, StreamingResponse from letta.constants import DEFAULT_MESSAGE_TOOL, DEFAULT_MESSAGE_TOOL_KWARG @@ -14,6 +23,7 @@ CreateBlock, ) from letta.schemas.enums import MessageStreamStatus +from letta.schemas.job import Job, JobStatus, JobUpdate from letta.schemas.letta_message import ( LegacyLettaMessage, LettaMessage, @@ -32,6 +42,7 @@ from letta.schemas.passage import Passage from letta.schemas.source import Source from letta.schemas.tool import Tool +from letta.schemas.user import User from letta.server.rest_api.interface import StreamingServerInterface from letta.server.rest_api.utils import get_letta_server, sse_async_generator from letta.server.server import SyncServer @@ -502,6 +513,94 @@ async def send_message_streaming( return result +async def process_message_background( + job_id: str, + server: SyncServer, + actor: User, + agent_id: str, + user_id: str, + messages: list, + assistant_message_tool_name: str, + assistant_message_tool_kwarg: str, +) -> None: + """Background task to process the message and update job status.""" + try: + # TODO(matt) we should probably make this stream_steps and log each step as it progresses, so the job update GET can see the total steps so far + partial usage? + result = await send_message_to_agent( + server=server, + agent_id=agent_id, + user_id=user_id, + messages=messages, + stream_steps=False, # NOTE(matt) + stream_tokens=False, + assistant_message_tool_name=assistant_message_tool_name, + assistant_message_tool_kwarg=assistant_message_tool_kwarg, + ) + + # Update job status to completed + job_update = JobUpdate( + status=JobStatus.completed, + completed_at=datetime.utcnow(), + metadata_={"result": result.model_dump()}, # Store the result in metadata + ) + server.job_manager.update_job_by_id(job_id=job_id, job_update=job_update, actor=actor) + + except Exception as e: + # Update job status to failed + job_update = JobUpdate( + status=JobStatus.failed, + completed_at=datetime.utcnow(), + metadata_={"error": str(e)}, + ) + server.job_manager.update_job_by_id(job_id=job_id, job_update=job_update, actor=actor) + raise + + +@router.post( + "/{agent_id}/messages/async", + response_model=Job, + operation_id="create_agent_message_async", +) +async def send_message_async( + agent_id: str, + background_tasks: BackgroundTasks, + server: SyncServer = Depends(get_letta_server), + request: LettaRequest = Body(...), + user_id: Optional[str] = Header(None, alias="user_id"), +): + """ + Asynchronously process a user message and return a job ID. + The actual processing happens in the background, and the status can be checked using the job ID. + """ + actor = server.get_user_or_default(user_id=user_id) + + # Create a new job + job = Job( + user_id=actor.id, + status=JobStatus.created, + metadata_={ + "job_type": "send_message_async", + "agent_id": agent_id, + }, + ) + job = server.job_manager.create_job(pydantic_job=job, actor=actor) + + # Add the background task + background_tasks.add_task( + process_message_background, + job_id=job.id, + server=server, + actor=actor, + agent_id=agent_id, + user_id=actor.id, + messages=request.messages, + assistant_message_tool_name=request.assistant_message_tool_name, + assistant_message_tool_kwarg=request.assistant_message_tool_kwarg, + ) + + return job + + # TODO: move this into server.py? async def send_message_to_agent( server: SyncServer, diff --git a/tests/test_client.py b/tests/test_client.py index 866bd2012b..61a95f3a49 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -14,6 +14,7 @@ from letta.schemas.agent import AgentState from letta.schemas.block import CreateBlock from letta.schemas.embedding_config import EmbeddingConfig +from letta.schemas.job import JobStatus from letta.schemas.llm_config import LLMConfig from letta.schemas.sandbox_config import LocalSandboxConfig, SandboxType from letta.utils import create_random_username @@ -328,3 +329,28 @@ async def send_message_task(message: str): # Ensure both tasks completed assert len(responses) == len(messages), "Not all messages were processed" + + +def test_send_message_async(client: Union[LocalClient, RESTClient], agent: AgentState): + """Test that we can send a message asynchronously""" + + if not isinstance(client, RESTClient): + pytest.skip("send_message_async is only supported by the RESTClient") + + print("Sending message asynchronously") + job = client.send_message_async(agent_id=agent.id, role="user", message="This is a test message, no need to respond.") + assert job.id is not None + assert job.status == JobStatus.created + print(f"Job created, job={job}, status={job.status}") + + # Wait for the job to complete, cancel it if takes over 10 seconds + start_time = time.time() + while job.status == JobStatus.created: + time.sleep(1) + job = client.get_job(job_id=job.id) + print(f"Job status: {job.status}") + if time.time() - start_time > 10: + pytest.fail("Job took too long to complete") + + print(f"Job completed in {time.time() - start_time} seconds, job={job}") + assert job.status == JobStatus.completed From af5ef6d174151442f7975c1291f4e201610dd6ba Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Mon, 9 Dec 2024 18:55:18 -0800 Subject: [PATCH 050/280] feat: enable configuration of `response_char_limit` for tools (#2207) --- ...f_add_column_to_tools_table_to_contain_.py | 39 ++++++++++++++++ letta/agent.py | 8 +++- letta/client/client.py | 44 ++++++++++++++----- letta/orm/tool.py | 14 +++--- letta/schemas/tool.py | 5 +++ letta/utils.py | 11 +++-- tests/test_client.py | 39 +++++++++++++++- 7 files changed, 133 insertions(+), 27 deletions(-) create mode 100644 alembic/versions/a91994b9752f_add_column_to_tools_table_to_contain_.py diff --git a/alembic/versions/a91994b9752f_add_column_to_tools_table_to_contain_.py b/alembic/versions/a91994b9752f_add_column_to_tools_table_to_contain_.py new file mode 100644 index 0000000000..f8da3856bd --- /dev/null +++ b/alembic/versions/a91994b9752f_add_column_to_tools_table_to_contain_.py @@ -0,0 +1,39 @@ +"""add column to tools table to contain function return limit return_char_limit + +Revision ID: a91994b9752f +Revises: e1a625072dbf +Create Date: 2024-12-09 18:27:25.650079 + +""" + +from typing import Sequence, Union + +import sqlalchemy as sa + +from alembic import op +from letta.constants import FUNCTION_RETURN_CHAR_LIMIT + +# revision identifiers, used by Alembic. +revision: str = "a91994b9752f" +down_revision: Union[str, None] = "e1a625072dbf" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column("tools", sa.Column("return_char_limit", sa.Integer(), nullable=True)) + + # Populate `return_char_limit` column + op.execute( + f""" + UPDATE tools + SET return_char_limit = {FUNCTION_RETURN_CHAR_LIMIT} + """ + ) + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column("tools", "return_char_limit") + # ### end Alembic commands ### diff --git a/letta/agent.py b/letta/agent.py index a09fd04c40..81924c2ea9 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -801,7 +801,13 @@ def _handle_ai_response( # but by default, we add a truncation safeguard to prevent bad functions from # overflow the agent context window truncate = True - function_response_string = validate_function_response(function_response, truncate=truncate) + + # get the function response limit + tool_obj = [tool for tool in self.agent_state.tools if tool.name == function_name][0] + return_char_limit = tool_obj.return_char_limit + function_response_string = validate_function_response( + function_response, return_char_limit=return_char_limit, truncate=truncate + ) function_args.pop("self", None) function_response = package_function_response(True, function_response_string) function_failed = False diff --git a/letta/client/client.py b/letta/client/client.py index 97f36cd927..6456aa3f35 100644 --- a/letta/client/client.py +++ b/letta/client/client.py @@ -11,6 +11,7 @@ BASE_TOOLS, DEFAULT_HUMAN, DEFAULT_PERSONA, + FUNCTION_RETURN_CHAR_LIMIT, ) from letta.data_sources.connectors import DataConnector from letta.functions.functions import parse_source_code @@ -200,18 +201,12 @@ def load_composio_tool(self, action: "ActionType") -> Tool: raise NotImplementedError def create_tool( - self, - func, - name: Optional[str] = None, - tags: Optional[List[str]] = None, + self, func, name: Optional[str] = None, tags: Optional[List[str]] = None, return_char_limit: int = FUNCTION_RETURN_CHAR_LIMIT ) -> Tool: raise NotImplementedError def create_or_update_tool( - self, - func, - name: Optional[str] = None, - tags: Optional[List[str]] = None, + self, func, name: Optional[str] = None, tags: Optional[List[str]] = None, return_char_limit: int = FUNCTION_RETURN_CHAR_LIMIT ) -> Tool: raise NotImplementedError @@ -222,6 +217,7 @@ def update_tool( description: Optional[str] = None, func: Optional[Callable] = None, tags: Optional[List[str]] = None, + return_char_limit: int = FUNCTION_RETURN_CHAR_LIMIT, ) -> Tool: raise NotImplementedError @@ -1465,6 +1461,7 @@ def create_tool( func: Callable, name: Optional[str] = None, tags: Optional[List[str]] = None, + return_char_limit: int = FUNCTION_RETURN_CHAR_LIMIT, ) -> Tool: """ Create a tool. This stores the source code of function on the server, so that the server can execute the function and generate an OpenAI JSON schemas for it when using with an agent. @@ -1473,6 +1470,7 @@ def create_tool( func (callable): The function to create a tool for. name: (str): Name of the tool (must be unique per-user.) tags (Optional[List[str]], optional): Tags for the tool. Defaults to None. + return_char_limit (int): The character limit for the tool's return value. Defaults to FUNCTION_RETURN_CHAR_LIMIT. Returns: tool (Tool): The created tool. @@ -1481,7 +1479,9 @@ def create_tool( source_type = "python" # call server function - request = ToolCreate(source_type=source_type, source_code=source_code, name=name, tags=tags) + request = ToolCreate(source_type=source_type, source_code=source_code, name=name, return_char_limit=return_char_limit) + if tags: + request.tags = tags response = requests.post(f"{self.base_url}/{self.api_prefix}/tools", json=request.model_dump(), headers=self.headers) if response.status_code != 200: raise ValueError(f"Failed to create tool: {response.text}") @@ -1492,6 +1492,7 @@ def create_or_update_tool( func: Callable, name: Optional[str] = None, tags: Optional[List[str]] = None, + return_char_limit: int = FUNCTION_RETURN_CHAR_LIMIT, ) -> Tool: """ Creates or updates a tool. This stores the source code of function on the server, so that the server can execute the function and generate an OpenAI JSON schemas for it when using with an agent. @@ -1500,6 +1501,7 @@ def create_or_update_tool( func (callable): The function to create a tool for. name: (str): Name of the tool (must be unique per-user.) tags (Optional[List[str]], optional): Tags for the tool. Defaults to None. + return_char_limit (int): The character limit for the tool's return value. Defaults to FUNCTION_RETURN_CHAR_LIMIT. Returns: tool (Tool): The created tool. @@ -1508,7 +1510,9 @@ def create_or_update_tool( source_type = "python" # call server function - request = ToolCreate(source_type=source_type, source_code=source_code, name=name, tags=tags) + request = ToolCreate(source_type=source_type, source_code=source_code, name=name, return_char_limit=return_char_limit) + if tags: + request.tags = tags response = requests.put(f"{self.base_url}/{self.api_prefix}/tools", json=request.model_dump(), headers=self.headers) if response.status_code != 200: raise ValueError(f"Failed to create tool: {response.text}") @@ -1521,6 +1525,7 @@ def update_tool( description: Optional[str] = None, func: Optional[Callable] = None, tags: Optional[List[str]] = None, + return_char_limit: int = FUNCTION_RETURN_CHAR_LIMIT, ) -> Tool: """ Update a tool with provided parameters (name, func, tags) @@ -1530,6 +1535,7 @@ def update_tool( name (str): Name of the tool func (callable): Function to wrap in a tool tags (List[str]): Tags for the tool + return_char_limit (int): The character limit for the tool's return value. Defaults to FUNCTION_RETURN_CHAR_LIMIT. Returns: tool (Tool): Updated tool @@ -1541,7 +1547,14 @@ def update_tool( source_type = "python" - request = ToolUpdate(description=description, source_type=source_type, source_code=source_code, tags=tags, name=name) + request = ToolUpdate( + description=description, + source_type=source_type, + source_code=source_code, + tags=tags, + name=name, + return_char_limit=return_char_limit, + ) response = requests.patch(f"{self.base_url}/{self.api_prefix}/tools/{id}", json=request.model_dump(), headers=self.headers) if response.status_code != 200: raise ValueError(f"Failed to update tool: {response.text}") @@ -2726,6 +2739,7 @@ def create_tool( name: Optional[str] = None, tags: Optional[List[str]] = None, description: Optional[str] = None, + return_char_limit: int = FUNCTION_RETURN_CHAR_LIMIT, ) -> Tool: """ Create a tool. This stores the source code of function on the server, so that the server can execute the function and generate an OpenAI JSON schemas for it when using with an agent. @@ -2735,6 +2749,7 @@ def create_tool( name: (str): Name of the tool (must be unique per-user.) tags (Optional[List[str]], optional): Tags for the tool. Defaults to None. description (str, optional): The description. + return_char_limit (int): The character limit for the tool's return value. Defaults to FUNCTION_RETURN_CHAR_LIMIT. Returns: tool (Tool): The created tool. @@ -2755,6 +2770,7 @@ def create_tool( name=name, tags=tags, description=description, + return_char_limit=return_char_limit, ), actor=self.user, ) @@ -2765,6 +2781,7 @@ def create_or_update_tool( name: Optional[str] = None, tags: Optional[List[str]] = None, description: Optional[str] = None, + return_char_limit: int = FUNCTION_RETURN_CHAR_LIMIT, ) -> Tool: """ Creates or updates a tool. This stores the source code of function on the server, so that the server can execute the function and generate an OpenAI JSON schemas for it when using with an agent. @@ -2774,6 +2791,7 @@ def create_or_update_tool( name: (str): Name of the tool (must be unique per-user.) tags (Optional[List[str]], optional): Tags for the tool. Defaults to None. description (str, optional): The description. + return_char_limit (int): The character limit for the tool's return value. Defaults to FUNCTION_RETURN_CHAR_LIMIT. Returns: tool (Tool): The created tool. @@ -2791,6 +2809,7 @@ def create_or_update_tool( name=name, tags=tags, description=description, + return_char_limit=return_char_limit, ), actor=self.user, ) @@ -2802,6 +2821,7 @@ def update_tool( description: Optional[str] = None, func: Optional[callable] = None, tags: Optional[List[str]] = None, + return_char_limit: int = FUNCTION_RETURN_CHAR_LIMIT, ) -> Tool: """ Update a tool with provided parameters (name, func, tags) @@ -2811,6 +2831,7 @@ def update_tool( name (str): Name of the tool func (callable): Function to wrap in a tool tags (List[str]): Tags for the tool + return_char_limit (int): The character limit for the tool's return value. Defaults to FUNCTION_RETURN_CHAR_LIMIT. Returns: tool (Tool): Updated tool @@ -2821,6 +2842,7 @@ def update_tool( "tags": tags, "name": name, "description": description, + "return_char_limit": return_char_limit, } # Filter out any None values from the dictionary diff --git a/letta/orm/tool.py b/letta/orm/tool.py index 00038fe000..8f1ac46a43 100644 --- a/letta/orm/tool.py +++ b/letta/orm/tool.py @@ -30,6 +30,7 @@ class Tool(SqlalchemyBase, OrganizationMixin): __table_args__ = (UniqueConstraint("name", "organization_id", name="uix_name_organization"),) name: Mapped[str] = mapped_column(doc="The display name of the tool.") + return_char_limit: Mapped[int] = mapped_column(nullable=True, doc="The maximum number of characters the tool can return.") description: Mapped[Optional[str]] = mapped_column(nullable=True, doc="The description of the tool.") tags: Mapped[List] = mapped_column(JSON, doc="Metadata tags used to filter tools.") source_type: Mapped[ToolSourceType] = mapped_column(String, doc="The type of the source code.", default=ToolSourceType.json) @@ -45,19 +46,16 @@ class Tool(SqlalchemyBase, OrganizationMixin): # Add event listener to update tool_name in ToolsAgents when Tool name changes -@event.listens_for(Tool, 'before_update') +@event.listens_for(Tool, "before_update") def update_tool_name_in_tools_agents(mapper, connection, target): """Update tool_name in ToolsAgents when Tool name changes.""" state = target._sa_instance_state - history = state.get_history('name', passive=True) + history = state.get_history("name", passive=True) if not history.has_changes(): return - + # Get the new name and update all associated ToolsAgents records new_name = target.name from letta.orm.tools_agents import ToolsAgents - connection.execute( - ToolsAgents.__table__.update().where( - ToolsAgents.tool_id == target.id - ).values(tool_name=new_name) - ) + + connection.execute(ToolsAgents.__table__.update().where(ToolsAgents.tool_id == target.id).values(tool_name=new_name)) diff --git a/letta/schemas/tool.py b/letta/schemas/tool.py index ed31f9d687..997965ab5e 100644 --- a/letta/schemas/tool.py +++ b/letta/schemas/tool.py @@ -2,6 +2,7 @@ from pydantic import Field, model_validator +from letta.constants import FUNCTION_RETURN_CHAR_LIMIT from letta.functions.functions import derive_openai_json_schema from letta.functions.helpers import ( generate_composio_tool_wrapper, @@ -41,6 +42,9 @@ class Tool(BaseTool): source_code: str = Field(..., description="The source code of the function.") json_schema: Optional[Dict] = Field(None, description="The JSON schema of the function.") + # tool configuration + return_char_limit: int = Field(FUNCTION_RETURN_CHAR_LIMIT, description="The maximum number of characters in the response.") + # metadata fields created_by_id: Optional[str] = Field(None, description="The id of the user that made this Tool.") last_updated_by_id: Optional[str] = Field(None, description="The id of the user that made this Tool.") @@ -91,6 +95,7 @@ class ToolCreate(LettaBase): json_schema: Optional[Dict] = Field( None, description="The JSON schema of the function (auto-generated from source_code if not provided)" ) + return_char_limit: int = Field(FUNCTION_RETURN_CHAR_LIMIT, description="The maximum number of characters in the response.") @classmethod def from_composio(cls, action_name: str, api_key: Optional[str] = None) -> "ToolCreate": diff --git a/letta/utils.py b/letta/utils.py index 71915420f3..ad6668857a 100644 --- a/letta/utils.py +++ b/letta/utils.py @@ -28,7 +28,6 @@ CLI_WARNING_PREFIX, CORE_MEMORY_HUMAN_CHAR_LIMIT, CORE_MEMORY_PERSONA_CHAR_LIMIT, - FUNCTION_RETURN_CHAR_LIMIT, LETTA_DIR, MAX_FILENAME_LENGTH, TOOL_CALL_ID_MAX_LEN, @@ -906,8 +905,8 @@ def parse_json(string) -> dict: raise e -def validate_function_response(function_response_string: any, strict: bool = False, truncate: bool = True) -> str: - """Check to make sure that a function used by Letta returned a valid response +def validate_function_response(function_response_string: any, return_char_limit: int, strict: bool = False, truncate: bool = True) -> str: + """Check to make sure that a function used by Letta returned a valid response. Truncates to return_char_limit if necessary. Responses need to be strings (or None) that fall under a certain text count limit. """ @@ -943,11 +942,11 @@ def validate_function_response(function_response_string: any, strict: bool = Fal # Now check the length and make sure it doesn't go over the limit # TODO we should change this to a max token limit that's variable based on tokens remaining (or context-window) - if truncate and len(function_response_string) > FUNCTION_RETURN_CHAR_LIMIT: + if truncate and len(function_response_string) > return_char_limit: print( - f"{CLI_WARNING_PREFIX}function return was over limit ({len(function_response_string)} > {FUNCTION_RETURN_CHAR_LIMIT}) and was truncated" + f"{CLI_WARNING_PREFIX}function return was over limit ({len(function_response_string)} > {return_char_limit}) and was truncated" ) - function_response_string = f"{function_response_string[:FUNCTION_RETURN_CHAR_LIMIT]}... [NOTE: function output was truncated since it exceeded the character limit ({len(function_response_string)} > {FUNCTION_RETURN_CHAR_LIMIT})]" + function_response_string = f"{function_response_string[:return_char_limit]}... [NOTE: function output was truncated since it exceeded the character limit ({len(function_response_string)} > {return_char_limit})]" return function_response_string diff --git a/tests/test_client.py b/tests/test_client.py index 61a95f3a49..2c92ef9501 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -1,4 +1,5 @@ import asyncio +import json import os import threading import time @@ -15,6 +16,7 @@ from letta.schemas.block import CreateBlock from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.job import JobStatus +from letta.schemas.letta_message import FunctionReturn from letta.schemas.llm_config import LLMConfig from letta.schemas.sandbox_config import LocalSandboxConfig, SandboxType from letta.utils import create_random_username @@ -40,7 +42,8 @@ def run_server(): @pytest.fixture( - params=[{"server": False}, {"server": True}], # whether to use REST API server + # params=[{"server": False}, {"server": True}], # whether to use REST API server + params=[{"server": False}], # whether to use REST API server scope="module", ) def client(request): @@ -299,6 +302,40 @@ def test_send_system_message(client: Union[LocalClient, RESTClient], agent: Agen assert send_system_message_response, "Sending message failed" +def test_function_return_limit(client: Union[LocalClient, RESTClient]): + """Test to see if the function return limit works""" + + def big_return(): + """ + Always call this tool. + + Returns: + important_data (str): Important data + """ + return "x" * 100000 + + padding = len("[NOTE: function output was truncated since it exceeded the character limit (100000 > 1000)]") + 50 + tool = client.create_or_update_tool(func=big_return, return_char_limit=1000) + agent = client.create_agent(name="agent1", tools=[tool.name]) + # get function response + response = client.send_message(agent_id=agent.id, message="call the big_return function", role="user") + print(response.messages) + + response_message = None + for message in response.messages: + if isinstance(message, FunctionReturn): + response_message = message + break + + assert response_message, "FunctionReturn message not found in response" + res = response_message.function_return + assert "function output was truncated " in res + res_json = json.loads(res) + assert ( + len(res_json["message"]) <= 1000 + padding + ), f"Expected length to be less than or equal to 1000 + {padding}, but got {len(res_json['message'])}" + + @pytest.mark.asyncio async def test_send_message_parallel(client: Union[LocalClient, RESTClient], agent: AgentState, request): """ From 666e4259cf9f16e14f793110408ab0910dc2d7b2 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Mon, 9 Dec 2024 19:35:58 -0800 Subject: [PATCH 051/280] fix: Modify the `list` ORM function (#2208) --- letta/client/client.py | 2 +- letta/orm/sqlalchemy_base.py | 47 ++++++++++++---- letta/server/rest_api/routers/v1/agents.py | 2 +- letta/server/server.py | 64 +++------------------- letta/services/message_manager.py | 3 + letta/services/tool_execution_sandbox.py | 2 +- tests/test_managers.py | 21 +++++-- tests/test_server.py | 50 +++++++---------- 8 files changed, 84 insertions(+), 107 deletions(-) diff --git a/letta/client/client.py b/letta/client/client.py index 6456aa3f35..a0b6729b8d 100644 --- a/letta/client/client.py +++ b/letta/client/client.py @@ -3128,7 +3128,7 @@ def get_messages(self, agent_id: str, cursor: Optional[str] = None, limit: Optio return self.server.get_agent_recall_cursor( user_id=self.user_id, agent_id=agent_id, - cursor=cursor, + before=cursor, limit=limit, reverse=True, ) diff --git a/letta/orm/sqlalchemy_base.py b/letta/orm/sqlalchemy_base.py index 4507f51c27..6f8a764408 100644 --- a/letta/orm/sqlalchemy_base.py +++ b/letta/orm/sqlalchemy_base.py @@ -2,7 +2,7 @@ from enum import Enum from typing import TYPE_CHECKING, List, Literal, Optional, Type -from sqlalchemy import String, func, select +from sqlalchemy import String, desc, func, or_, select from sqlalchemy.exc import DBAPIError from sqlalchemy.orm import Mapped, Session, mapped_column @@ -60,14 +60,25 @@ def list( end_date: Optional[datetime] = None, limit: Optional[int] = 50, query_text: Optional[str] = None, + ascending: bool = True, **kwargs, ) -> List[Type["SqlalchemyBase"]]: - """List records with advanced filtering and pagination options.""" + """ + List records with cursor-based pagination, ordering by created_at. + Cursor is an ID, but pagination is based on the cursor object's created_at value. + """ if start_date and end_date and start_date > end_date: raise ValueError("start_date must be earlier than or equal to end_date") logger.debug(f"Listing {cls.__name__} with kwarg filters {kwargs}") with db_session as session: + # If cursor provided, get the reference object + cursor_obj = None + if cursor: + cursor_obj = session.get(cls, cursor) + if not cursor_obj: + raise NoResultFound(f"No {cls.__name__} found with id {cursor}") + query = select(cls) # Apply filtering logic @@ -80,22 +91,38 @@ def list( # Date range filtering if start_date: - query = query.filter(cls.created_at >= start_date) + query = query.filter(cls.created_at > start_date) if end_date: - query = query.filter(cls.created_at <= end_date) - - # Cursor-based pagination - if cursor: - query = query.where(cls.id > cursor) + query = query.filter(cls.created_at < end_date) + + # Cursor-based pagination using created_at + # TODO: There is a really nasty race condition issue here with Sqlite + # TODO: If they have the same created_at timestamp, this query does NOT match for whatever reason + if cursor_obj: + if ascending: + query = query.where(cls.created_at >= cursor_obj.created_at).where( + or_(cls.created_at > cursor_obj.created_at, cls.id > cursor_obj.id) + ) + else: + query = query.where(cls.created_at <= cursor_obj.created_at).where( + or_(cls.created_at < cursor_obj.created_at, cls.id < cursor_obj.id) + ) # Apply text search if query_text: query = query.filter(func.lower(cls.text).contains(func.lower(query_text))) - # Handle ordering and soft deletes + # Handle soft deletes if hasattr(cls, "is_deleted"): query = query.where(cls.is_deleted == False) - query = query.order_by(cls.id).limit(limit) + + # Apply ordering by created_at + if ascending: + query = query.order_by(cls.created_at, cls.id) + else: + query = query.order_by(desc(cls.created_at), desc(cls.id)) + + query = query.limit(limit) return list(session.execute(query).scalars()) diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index e7f68dc96d..2a9471d975 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -420,7 +420,7 @@ def get_agent_messages( return server.get_agent_recall_cursor( user_id=actor.id, agent_id=agent_id, - cursor=before, + before=before, limit=limit, reverse=True, return_message_object=msg_object, diff --git a/letta/server/server.py b/letta/server/server.py index 965c9b2798..e20afd17c5 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -101,11 +101,6 @@ def list_agents(self, user_id: str) -> dict: """List all available agents to a user""" raise NotImplementedError - @abstractmethod - def get_agent_messages(self, user_id: str, agent_id: str, start: int, count: int) -> list: - """Paginated query of in-context messages in agent message queue""" - raise NotImplementedError - @abstractmethod def get_agent_memory(self, user_id: str, agent_id: str) -> dict: """Return the memory of an agent (core memory + non-core statistics)""" @@ -1173,55 +1168,6 @@ def get_agent_message(self, agent_id: str, message_id: str) -> Message: message = agent.message_manager.get_message_by_id(id=message_id, actor=self.default_user) return message - def get_agent_messages( - self, - agent_id: str, - start: int, - count: int, - ) -> Union[List[Message], List[LettaMessage]]: - """Paginated query of all messages in agent message queue""" - # Get the agent object (loaded in memory) - letta_agent = self.load_agent(agent_id=agent_id) - - if start < 0 or count < 0: - raise ValueError("Start and count values should be non-negative") - - if start + count < len(letta_agent._messages): # messages can be returned from whats in memory - # Reverse the list to make it in reverse chronological order - reversed_messages = letta_agent._messages[::-1] - # Check if start is within the range of the list - if start >= len(reversed_messages): - raise IndexError("Start index is out of range") - - # Calculate the end index, ensuring it does not exceed the list length - end_index = min(start + count, len(reversed_messages)) - - # Slice the list for pagination - messages = reversed_messages[start:end_index] - - else: - # need to access persistence manager for additional messages - - # get messages using message manager - page = letta_agent.message_manager.list_user_messages_for_agent( - agent_id=agent_id, - actor=self.default_user, - cursor=start, - limit=count, - ) - - messages = page - assert all(isinstance(m, Message) for m in messages) - - ## Convert to json - ## Add a tag indicating in-context or not - # json_messages = [record.to_json() for record in messages] - # in_context_message_ids = [str(m.id) for m in letta_agent._messages] - # for d in json_messages: - # d["in_context"] = True if str(d["id"]) in in_context_message_ids else False - - return messages - def get_agent_archival(self, user_id: str, agent_id: str, start: int, count: int) -> List[Passage]: """Paginated query of all messages in agent archival memory""" if self.user_manager.get_user_by_id(user_id=user_id) is None: @@ -1303,7 +1249,8 @@ def get_agent_recall_cursor( self, user_id: str, agent_id: str, - cursor: Optional[str] = None, + after: Optional[str] = None, + before: Optional[str] = None, limit: Optional[int] = 100, reverse: Optional[bool] = False, return_message_object: bool = True, @@ -1320,12 +1267,15 @@ def get_agent_recall_cursor( letta_agent = self.load_agent(agent_id=agent_id) # iterate over records - # TODO: Check "order_by", "order" + start_date = self.message_manager.get_message_by_id(after, actor=actor).created_at if after else None + end_date = self.message_manager.get_message_by_id(before, actor=actor).created_at if before else None records = letta_agent.message_manager.list_messages_for_agent( agent_id=agent_id, actor=actor, - cursor=cursor, + start_date=start_date, + end_date=end_date, limit=limit, + ascending=not reverse, ) assert all(isinstance(m, Message) for m in records) diff --git a/letta/services/message_manager.py b/letta/services/message_manager.py index b9932b39b8..b415194420 100644 --- a/letta/services/message_manager.py +++ b/letta/services/message_manager.py @@ -119,6 +119,7 @@ def list_user_messages_for_agent( limit: Optional[int] = 50, filters: Optional[Dict] = None, query_text: Optional[str] = None, + ascending: bool = True, ) -> List[PydanticMessage]: """List user messages with flexible filtering and pagination options. @@ -159,6 +160,7 @@ def list_messages_for_agent( limit: Optional[int] = 50, filters: Optional[Dict] = None, query_text: Optional[str] = None, + ascending: bool = True, ) -> List[PydanticMessage]: """List messages with flexible filtering and pagination options. @@ -188,6 +190,7 @@ def list_messages_for_agent( end_date=end_date, limit=limit, query_text=query_text, + ascending=ascending, **message_filters, ) diff --git a/letta/services/tool_execution_sandbox.py b/letta/services/tool_execution_sandbox.py index 4c95184cc5..2a76a147a6 100644 --- a/letta/services/tool_execution_sandbox.py +++ b/letta/services/tool_execution_sandbox.py @@ -459,7 +459,7 @@ def invoke_function_call(self, inject_agent_state: bool) -> str: Generate the code string to call the function. Args: - inject_agent_state (bool): Whether to inject the agent's state as an input into the tool + inject_agent_state (bool): Whether to inject the axgent's state as an input into the tool Returns: str: Generated code string for calling the tool diff --git a/tests/test_managers.py b/tests/test_managers.py index dc47693893..74675b4cb5 100644 --- a/tests/test_managers.py +++ b/tests/test_managers.py @@ -1,4 +1,5 @@ import os +import time from datetime import datetime, timedelta import pytest @@ -73,8 +74,8 @@ azure_version=None, azure_deployment=None, ) - -using_sqlite = not bool(os.getenv("LETTA_PG_URI")) +CREATE_DELAY_SQLITE = 1 +USING_SQLITE = not bool(os.getenv("LETTA_PG_URI")) @pytest.fixture(autouse=True) @@ -911,6 +912,8 @@ def test_list_sources(server: SyncServer, default_user): """Test listing sources with pagination.""" # Create multiple sources server.source_manager.create_source(PydanticSource(name="Source 1", embedding_config=DEFAULT_EMBEDDING_CONFIG), actor=default_user) + if USING_SQLITE: + time.sleep(CREATE_DELAY_SQLITE) server.source_manager.create_source(PydanticSource(name="Source 2", embedding_config=DEFAULT_EMBEDDING_CONFIG), actor=default_user) # List sources without pagination @@ -1004,6 +1007,8 @@ def test_list_files(server: SyncServer, default_user, default_source): PydanticFileMetadata(file_name="File 1", file_path="/path/to/file1.txt", file_type="text/plain", source_id=default_source.id), actor=default_user, ) + if USING_SQLITE: + time.sleep(CREATE_DELAY_SQLITE) server.source_manager.create_file( PydanticFileMetadata(file_name="File 2", file_path="/path/to/file2.txt", file_type="text/plain", source_id=default_source.id), actor=default_user, @@ -1184,6 +1189,8 @@ def test_list_sandbox_configs(server: SyncServer, default_user): config=LocalSandboxConfig(sandbox_dir=""), ) server.sandbox_config_manager.create_or_update_sandbox_config(config_a, actor=default_user) + if USING_SQLITE: + time.sleep(CREATE_DELAY_SQLITE) server.sandbox_config_manager.create_or_update_sandbox_config(config_b, actor=default_user) # List configs without pagination @@ -1239,6 +1246,8 @@ def test_list_sandbox_env_vars(server: SyncServer, sandbox_config_fixture, defau env_var_create_a = SandboxEnvironmentVariableCreate(key="VAR1", value="value1") env_var_create_b = SandboxEnvironmentVariableCreate(key="VAR2", value="value2") server.sandbox_config_manager.create_sandbox_env_var(env_var_create_a, sandbox_config_id=sandbox_config_fixture.id, actor=default_user) + if USING_SQLITE: + time.sleep(CREATE_DELAY_SQLITE) server.sandbox_config_manager.create_sandbox_env_var(env_var_create_b, sandbox_config_id=sandbox_config_fixture.id, actor=default_user) # List env vars without pagination @@ -1299,7 +1308,7 @@ def test_change_label_on_block_reflects_in_block_agents_table(server, sarah_agen assert default_block.label not in labels -@pytest.mark.skipif(using_sqlite, reason="Skipped because using SQLite") +@pytest.mark.skipif(USING_SQLITE, reason="Skipped because using SQLite") def test_add_block_to_agent_nonexistent_block(server, sarah_agent, default_user): with pytest.raises(ForeignKeyConstraintViolationError): server.blocks_agents_manager.add_block_to_agent( @@ -1361,7 +1370,7 @@ def test_list_agent_ids_with_block(server, sarah_agent, charles_agent, default_u assert len(agent_ids) == 2 -@pytest.mark.skipif(using_sqlite, reason="Skipped because using SQLite") +@pytest.mark.skipif(USING_SQLITE, reason="Skipped because using SQLite") def test_add_block_to_agent_with_deleted_block(server, sarah_agent, default_user, default_block): block_manager = BlockManager() block_manager.delete_block(block_id=default_block.id, actor=default_user) @@ -1401,7 +1410,7 @@ def test_change_name_on_tool_reflects_in_tool_agents_table(server, sarah_agent, assert print_tool.name not in names -@pytest.mark.skipif(using_sqlite, reason="Skipped because using SQLite") +@pytest.mark.skipif(USING_SQLITE, reason="Skipped because using SQLite") def test_add_tool_to_agent_nonexistent_tool(server, sarah_agent, default_user): with pytest.raises(ForeignKeyConstraintViolationError): server.tools_agents_manager.add_tool_to_agent(agent_id=sarah_agent.id, tool_id="nonexistent_tool", tool_name="nonexistent_name") @@ -1447,7 +1456,7 @@ def test_list_agent_ids_with_tool(server, sarah_agent, charles_agent, default_us assert len(agent_ids) == 2 -@pytest.mark.skipif(using_sqlite, reason="Skipped because using SQLite") +@pytest.mark.skipif(USING_SQLITE, reason="Skipped because using SQLite") def test_add_tool_to_agent_with_deleted_tool(server, sarah_agent, default_user, print_tool): tool_manager = ToolManager() tool_manager.delete_tool_by_id(tool_id=print_tool.id, actor=default_user) diff --git a/tests/test_server.py b/tests/test_server.py index c85f12ca38..8d85cc1cd5 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -161,37 +161,25 @@ def test_user_message(server, user_id, agent_id): # server.user_message(user_id=user_id, agent_id=agent_id, message="Hello?") -# TODO: Add this back, this is broken on main -# @pytest.mark.order(5) -# def test_get_recall_memory(server, org_id, user_id, agent_id): -# # test recall memory cursor pagination -# messages_1 = server.get_agent_recall_cursor(user_id=user_id, agent_id=agent_id, limit=2) -# cursor1 = messages_1[-1].id -# messages_2 = server.get_agent_recall_cursor(user_id=user_id, agent_id=agent_id, after=cursor1, limit=1000) -# messages_2[-1].id -# messages_3 = server.get_agent_recall_cursor(user_id=user_id, agent_id=agent_id, limit=1000) -# messages_3[-1].id -# assert messages_3[-1].created_at >= messages_3[0].created_at -# assert len(messages_3) == len(messages_1) + len(messages_2) -# messages_4 = server.get_agent_recall_cursor(user_id=user_id, agent_id=agent_id, reverse=True, before=cursor1) -# assert len(messages_4) == 1 -# -# # test in-context message ids -# in_context_ids = server.get_in_context_message_ids(agent_id=agent_id) -# message_ids = [m.id for m in messages_3] -# for message_id in in_context_ids: -# assert message_id in message_ids, f"{message_id} not in {message_ids}" -# -# # test recall memory -# messages_1 = server.get_agent_messages(agent_id=agent_id, start=0, count=1) -# assert len(messages_1) == 1 -# messages_2 = server.get_agent_messages(agent_id=agent_id, start=1, count=1000) -# messages_3 = server.get_agent_messages(agent_id=agent_id, start=1, count=2) -# # not sure exactly how many messages there should be -# assert len(messages_2) > len(messages_3) -# # test safe empty return -# messages_none = server.get_agent_messages(agent_id=agent_id, start=1000, count=1000) -# assert len(messages_none) == 0 +@pytest.mark.order(5) +def test_get_recall_memory(server, org_id, user_id, agent_id): + # test recall memory cursor pagination + messages_1 = server.get_agent_recall_cursor(user_id=user_id, agent_id=agent_id, limit=2) + cursor1 = messages_1[-1].id + messages_2 = server.get_agent_recall_cursor(user_id=user_id, agent_id=agent_id, after=cursor1, limit=1000) + messages_2[-1].id + messages_3 = server.get_agent_recall_cursor(user_id=user_id, agent_id=agent_id, limit=1000) + messages_3[-1].id + assert messages_3[-1].created_at >= messages_3[0].created_at + assert len(messages_3) == len(messages_1) + len(messages_2) + messages_4 = server.get_agent_recall_cursor(user_id=user_id, agent_id=agent_id, reverse=True, before=cursor1) + assert len(messages_4) == 1 + + # test in-context message ids + in_context_ids = server.get_in_context_message_ids(agent_id=agent_id) + message_ids = [m.id for m in messages_3] + for message_id in in_context_ids: + assert message_id in message_ids, f"{message_id} not in {message_ids}" @pytest.mark.order(6) From 975aca155f352db41870018aeee9a7fa9de90cdb Mon Sep 17 00:00:00 2001 From: cthomas Date: Tue, 10 Dec 2024 10:38:17 -0800 Subject: [PATCH 052/280] fix: pattern match new prints correctly (#2213) Co-authored-by: Caren Thomas --- .github/workflows/check_for_new_prints.yml | 2 +- letta/services/tool_execution_sandbox.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check_for_new_prints.yml b/.github/workflows/check_for_new_prints.yml index 470f5a4faf..c7bba7a0cd 100644 --- a/.github/workflows/check_for_new_prints.yml +++ b/.github/workflows/check_for_new_prints.yml @@ -43,7 +43,7 @@ jobs: NEW_PRINTS=$(git diff ${{ github.event.pull_request.base.sha }} ${{ github.sha }} "$file" | \ grep "^+" | \ grep -v "^+++" | \ - grep "print(" || true) + grep -E "(^|\s)print\(" || true) if [ ! -z "$NEW_PRINTS" ]; then echo "❌ Found new print statements in $file:" diff --git a/letta/services/tool_execution_sandbox.py b/letta/services/tool_execution_sandbox.py index 2a76a147a6..b45a0b00c5 100644 --- a/letta/services/tool_execution_sandbox.py +++ b/letta/services/tool_execution_sandbox.py @@ -201,7 +201,10 @@ def run_local_dir_sandbox_venv(self, sbx_config: SandboxConfig, env: Dict[str, s func_result, stdout = self.parse_out_function_results_markers(result.stdout) func_return, agent_state = self.parse_best_effort(func_result) return SandboxRunResult( - func_return=func_return, agent_state=agent_state, stdout=[stdout], sandbox_config_fingerprint=sbx_config.fingerprint() + func_return=func_return, + agent_state=agent_state, + stdout=[stdout], + sandbox_config_fingerprint=sbx_config.fingerprint(), ) except subprocess.TimeoutExpired: raise TimeoutError(f"Executing tool {self.tool_name} has timed out.") From 415163fb750c3b1570922975b17672acc10dda5d Mon Sep 17 00:00:00 2001 From: Kevin Lin Date: Tue, 10 Dec 2024 12:27:35 -0700 Subject: [PATCH 053/280] fix: allow empty initial message sequence (#2214) --- letta/offline_memory_agent.py | 3 ++- letta/server/server.py | 4 +++- tests/test_offline_memory_agent.py | 22 +++++++++++++++++++++- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/letta/offline_memory_agent.py b/letta/offline_memory_agent.py index cceefb4370..85cbb082fe 100644 --- a/letta/offline_memory_agent.py +++ b/letta/offline_memory_agent.py @@ -130,8 +130,9 @@ def __init__( # extras first_message_verify_mono: bool = False, max_memory_rethinks: int = 10, + initial_message_sequence: Optional[List[Message]] = None, ): - super().__init__(interface, agent_state, user) + super().__init__(interface, agent_state, user, initial_message_sequence=initial_message_sequence) self.first_message_verify_mono = first_message_verify_mono self.max_memory_rethinks = max_memory_rethinks diff --git a/letta/server/server.py b/letta/server/server.py index e20afd17c5..08701587da 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -379,6 +379,8 @@ def initialize_agent(self, agent_id, interface: Union[AgentInterface, None] = No interface = interface or self.default_interface_factory() if agent_state.agent_type == AgentType.memgpt_agent: agent = Agent(agent_state=agent_state, interface=interface, user=actor, initial_message_sequence=initial_message_sequence) + elif agent_state.agent_type == AgentType.offline_memory_agent: + agent = OfflineMemoryAgent(agent_state=agent_state, interface=interface, user=actor, initial_message_sequence=initial_message_sequence) else: assert initial_message_sequence is None, f"Initial message sequence is not supported for O1Agents" agent = O1Agent(agent_state=agent_state, interface=interface, user=actor) @@ -843,7 +845,7 @@ def create_agent( self.ms.create_agent(agent_state) # create the agent object - if request.initial_message_sequence: + if request.initial_message_sequence is not None: # init_messages = [Message(user_id=user_id, agent_id=agent_state.id, role=message.role, text=message.text) for message in request.initial_message_sequence] init_messages = [] for message in request.initial_message_sequence: diff --git a/tests/test_offline_memory_agent.py b/tests/test_offline_memory_agent.py index c3cbb71dc0..ff3aca5cfa 100644 --- a/tests/test_offline_memory_agent.py +++ b/tests/test_offline_memory_agent.py @@ -32,7 +32,6 @@ def clear_agents(client): for agent in client.list_agents(): client.delete_agent(agent.id) - def test_ripple_edit(client, mock_e2b_api_key_none): trigger_rethink_memory_tool = client.create_or_update_tool(trigger_rethink_memory) @@ -135,3 +134,24 @@ def test_chat_only_agent(client, mock_e2b_api_key_none): # Clean up agent client.delete_agent(chat_only_agent.id) + +def test_initial_message_sequence(client, mock_e2b_api_key_none): + """ + Test that when we set the initial sequence to an empty list, + we do not get the default initial message sequence. + """ + offline_memory_agent = client.create_agent( + name="offline_memory_agent", + agent_type=AgentType.offline_memory_agent, + system=gpt_system.get_system_text("memgpt_offline_memory"), + llm_config=LLMConfig.default_config("gpt-4"), + embedding_config=EmbeddingConfig.default_config("text-embedding-ada-002"), + include_base_tools=False, + initial_message_sequence=[], + ) + assert offline_memory_agent is not None + assert len(offline_memory_agent.message_ids) == 1 # There should just the system message + + client.delete_agent(offline_memory_agent.id) + + From 6ca8bfa854c5da9dc987d8126417e3d7478a537a Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Tue, 10 Dec 2024 11:55:15 -0800 Subject: [PATCH 054/280] fix: re-enable streaming tokens (#2193) --- letta/server/rest_api/routers/v1/agents.py | 1 - 1 file changed, 1 deletion(-) diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index 2a9471d975..52e280697d 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -496,7 +496,6 @@ async def send_message_streaming( This endpoint accepts a message from a user and processes it through the agent. It will stream the steps of the response always, and stream the tokens if 'stream_tokens' is set to True. """ - request.stream_tokens = False actor = server.get_user_or_default(user_id=user_id) result = await send_message_to_agent( From ab1b440565a524e4f9e20b242d55d6af29a8a239 Mon Sep 17 00:00:00 2001 From: cthomas Date: Tue, 10 Dec 2024 13:24:05 -0800 Subject: [PATCH 055/280] feat: add logs to response for tool run (#2205) Co-authored-by: Caren Thomas --- letta/schemas/letta_message.py | 6 +++++- letta/schemas/sandbox_config.py | 1 + letta/server/server.py | 4 ++++ letta/services/tool_execution_sandbox.py | 23 ++++++++++++++++------- tests/test_server.py | 12 ++++++++++++ 5 files changed, 38 insertions(+), 8 deletions(-) diff --git a/letta/schemas/letta_message.py b/letta/schemas/letta_message.py index b3f7bf9000..3b2dc73480 100644 --- a/letta/schemas/letta_message.py +++ b/letta/schemas/letta_message.py @@ -1,6 +1,6 @@ import json from datetime import datetime, timezone -from typing import Annotated, Literal, Optional, Union +from typing import Annotated, List, Literal, Optional, Union from pydantic import BaseModel, Field, field_serializer, field_validator @@ -150,12 +150,16 @@ class FunctionReturn(LettaMessage): id (str): The ID of the message date (datetime): The date the message was created in ISO format function_call_id (str): A unique identifier for the function call that generated this message + stdout (Optional[List(str)]): Captured stdout (e.g. prints, logs) from the function invocation + stderr (Optional[List(str)]): Captured stderr from the function invocation """ message_type: Literal["function_return"] = "function_return" function_return: str status: Literal["success", "error"] function_call_id: str + stdout: Optional[List[str]] = None + stderr: Optional[List[str]] = None # Legacy Letta API had an additional type "assistant_message" and the "function_call" was a formatted string diff --git a/letta/schemas/sandbox_config.py b/letta/schemas/sandbox_config.py index 97e5a8efc6..246ba8a3ab 100644 --- a/letta/schemas/sandbox_config.py +++ b/letta/schemas/sandbox_config.py @@ -19,6 +19,7 @@ class SandboxRunResult(BaseModel): func_return: Optional[Any] = Field(None, description="The function return object") agent_state: Optional[AgentState] = Field(None, description="The agent state") stdout: Optional[List[str]] = Field(None, description="Captured stdout (e.g. prints, logs) from the function invocation") + stderr: Optional[List[str]] = Field(None, description="Captured stderr from the function invocation") sandbox_config_fingerprint: str = Field(None, description="The fingerprint of the config for the sandbox") diff --git a/letta/server/server.py b/letta/server/server.py index 08701587da..609e8eab49 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -1829,6 +1829,8 @@ def run_tool_from_source( date=get_utc_time(), status="success", function_return=function_response, + stdout=sandbox_run_result.stdout, + stderr=sandbox_run_result.stderr, ) except Exception as e: # same as agent.py @@ -1844,6 +1846,8 @@ def run_tool_from_source( date=get_utc_time(), status="error", function_return=error_msg, + stdout=[''], + stderr=[traceback.format_exc()], ) # Composio wrappers diff --git a/letta/services/tool_execution_sandbox.py b/letta/services/tool_execution_sandbox.py index b45a0b00c5..e1698dfe14 100644 --- a/letta/services/tool_execution_sandbox.py +++ b/letta/services/tool_execution_sandbox.py @@ -127,11 +127,12 @@ def run_local_dir_sandbox(self, agent_state: AgentState) -> Optional[SandboxRunR # Save the old stdout old_stdout = sys.stdout + old_stderr = sys.stderr try: if local_configs.use_venv: return self.run_local_dir_sandbox_venv(sbx_config, env, temp_file_path) else: - return self.run_local_dir_sandbox_runpy(sbx_config, env_vars, temp_file_path, old_stdout) + return self.run_local_dir_sandbox_runpy(sbx_config, env_vars, temp_file_path, old_stdout, old_stderr) except Exception as e: logger.error(f"Executing tool {self.tool_name} has an unexpected error: {e}") logger.error(f"Logging out tool {self.tool_name} auto-generated code for debugging: \n\n{code}") @@ -139,6 +140,7 @@ def run_local_dir_sandbox(self, agent_state: AgentState) -> Optional[SandboxRunR finally: # Clean up the temp file and restore stdout sys.stdout = old_stdout + sys.stderr = old_stderr os.remove(temp_file_path) def run_local_dir_sandbox_venv(self, sbx_config: SandboxConfig, env: Dict[str, str], temp_file_path: str) -> SandboxRunResult: @@ -202,8 +204,9 @@ def run_local_dir_sandbox_venv(self, sbx_config: SandboxConfig, env: Dict[str, s func_return, agent_state = self.parse_best_effort(func_result) return SandboxRunResult( func_return=func_return, - agent_state=agent_state, - stdout=[stdout], + agent_state=agent_state, + stdout=[stdout], + stderr=[result.stderr], sandbox_config_fingerprint=sbx_config.fingerprint(), ) except subprocess.TimeoutExpired: @@ -216,11 +219,13 @@ def run_local_dir_sandbox_venv(self, sbx_config: SandboxConfig, env: Dict[str, s raise e def run_local_dir_sandbox_runpy( - self, sbx_config: SandboxConfig, env_vars: Dict[str, str], temp_file_path: str, old_stdout: TextIO + self, sbx_config: SandboxConfig, env_vars: Dict[str, str], temp_file_path: str, old_stdout: TextIO, old_stderr: TextIO ) -> SandboxRunResult: - # Redirect stdout to capture script output + # Redirect stdout and stderr to capture script output captured_stdout = io.StringIO() + captured_stderr = io.StringIO() sys.stdout = captured_stdout + sys.stderr = captured_stderr # Execute the temp file with self.temporary_env_vars(env_vars): @@ -230,14 +235,17 @@ def run_local_dir_sandbox_runpy( func_result = result.get(self.LOCAL_SANDBOX_RESULT_VAR_NAME) func_return, agent_state = self.parse_best_effort(func_result) - # Restore stdout and collect captured output + # Restore stdout and stderr and collect captured output sys.stdout = old_stdout + sys.stderr = old_stderr stdout_output = captured_stdout.getvalue() + stderr_output = captured_stderr.getvalue() return SandboxRunResult( func_return=func_return, agent_state=agent_state, stdout=[stdout_output], + stderr=[stderr_output], sandbox_config_fingerprint=sbx_config.fingerprint(), ) @@ -297,7 +305,8 @@ def run_e2b_sandbox(self, agent_state: AgentState) -> Optional[SandboxRunResult] return SandboxRunResult( func_return=func_return, agent_state=agent_state, - stdout=execution.logs.stdout + execution.logs.stderr, + stdout=execution.logs.stdout, + stderr=execution.logs.stderr, sandbox_config_fingerprint=sbx_config.fingerprint(), ) diff --git a/tests/test_server.py b/tests/test_server.py index 8d85cc1cd5..32e5da6902 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -541,6 +541,8 @@ def test_tool_run(server, mock_e2b_api_key_none, user_id, agent_id): print(result) assert result.status == "success" assert result.function_return == "Ingested message Hello, world!", result.function_return + assert result.stdout == [''] + assert result.stderr == [''] result = server.run_tool_from_source( user_id=user_id, @@ -552,6 +554,8 @@ def test_tool_run(server, mock_e2b_api_key_none, user_id, agent_id): print(result) assert result.status == "success" assert result.function_return == "Ingested message Well well well", result.function_return + assert result.stdout == [''] + assert result.stderr == [''] result = server.run_tool_from_source( user_id=user_id, @@ -564,6 +568,8 @@ def test_tool_run(server, mock_e2b_api_key_none, user_id, agent_id): assert result.status == "error" assert "Error" in result.function_return, result.function_return assert "missing 1 required positional argument" in result.function_return, result.function_return + assert result.stdout == [''] + assert result.stderr != [''], "missing 1 required positional argument" in result.stderr[0] # Test that we can still pull the tool out by default (pulls that last tool in the source) result = server.run_tool_from_source( @@ -576,6 +582,8 @@ def test_tool_run(server, mock_e2b_api_key_none, user_id, agent_id): print(result) assert result.status == "success" assert result.function_return == "Ingested message Well well well", result.function_return + assert result.stdout != [''], "I'm a distractor" in result.stdout[0] + assert result.stderr == [''] # Test that we can pull the tool out by name result = server.run_tool_from_source( @@ -588,6 +596,8 @@ def test_tool_run(server, mock_e2b_api_key_none, user_id, agent_id): print(result) assert result.status == "success" assert result.function_return == "Ingested message Well well well", result.function_return + assert result.stdout != [''], "I'm a distractor" in result.stdout[0] + assert result.stderr == [''] # Test that we can pull a different tool out by name result = server.run_tool_from_source( @@ -600,6 +610,8 @@ def test_tool_run(server, mock_e2b_api_key_none, user_id, agent_id): print(result) assert result.status == "success" assert result.function_return == str(None), result.function_return + assert result.stdout != [''], "I'm a distractor" in result.stdout[0] + assert result.stderr == [''] def test_composio_client_simple(server): From af127b8d4c772f601743241a6fb9ba42248a412e Mon Sep 17 00:00:00 2001 From: Shubham Naik Date: Tue, 10 Dec 2024 13:36:20 -0800 Subject: [PATCH 056/280] feat: support local https mode (#2217) Co-authored-by: Shubham Naik --- certs/README.md | 9 +++++++++ certs/localhost-key.pem | 28 ++++++++++++++++++++++++++++ certs/localhost.pem | 26 ++++++++++++++++++++++++++ letta/cli/cli.py | 1 + letta/server/rest_api/app.py | 25 ++++++++++++++++++------- 5 files changed, 82 insertions(+), 7 deletions(-) create mode 100644 certs/README.md create mode 100644 certs/localhost-key.pem create mode 100644 certs/localhost.pem diff --git a/certs/README.md b/certs/README.md new file mode 100644 index 0000000000..87f56da334 --- /dev/null +++ b/certs/README.md @@ -0,0 +1,9 @@ +# About +These certs are used to set up a localhost https connection to the ADE. + +## Instructions +1. Install [mkcert](https://github.com/FiloSottile/mkcert) +2. Run `mkcert -install` +3. Run letta with the environment variable `LOCAL_HTTPS=true` +4. Access the app at [https://app.letta.com/development-servers/local/dashboard](https://app.letta.com/development-servers/local/dashboard) +5. Click "Add remote server" and enter `https://localhost:8283` as the URL, leave password blank unless you have secured your ADE with a password. diff --git a/certs/localhost-key.pem b/certs/localhost-key.pem new file mode 100644 index 0000000000..363a191f97 --- /dev/null +++ b/certs/localhost-key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDenaHTolfy9TzX +AUd60yPO1W0mpxdDTuxr2p3tBUaQJt5bEGzJbs1M0i5YVRK/SxtYZQvyqmI0ULKN +8+evKSEpJoDgLfFKM266jzKDSXd5XBQ3XuuxbKq6NV6qoTdweJ0zP0XXDUnKoTN6 +eMkUi8hD9P1TR3Ok3VGnT1wsdG0wPwRPDI/sD92GASL4ViUy/1Llrs7GjlOC+7M2 +GMoGifSHjmx2xgZ/K8cdD2q15iJJlhdbgCwfejcQlP7cmLtSJHH188EZeoFPEfNS +UpYNglS1kx0D/LC1ooTQRkCpLAnxeonMQZS5O5/q/zyxftkyKO+NInR6DtM0Uj8f +Gu5UDw1TAgMBAAECggEBANhqpkf4K0gm4V6j/7mISedp1RMenZ7xuyWfAqjJ2C+L +md8tuJSbAzsLmcKF8hPGEG9+zH685Xu2d99InpPKiFJY/DD0eP6JwbvcOl8nrN5u +hbjOrpNt8QvVlpKK6DqPB0Qq3tqSMIqs7D7D7bfrrGVkZmHvtJ0yC497t0AAb6XV +zTtnY9K6LVxb/t+eIDDX1AvE7i2WC+j1YgfexbM0VI/g4fveEVaKPFkWF3nSm0Ag +BmqzfGFUWKhBZmWpU0m86Zc45q575Bl64yXEQDYocUw3UfOp5/uF0lwuVe5Bpq/w +hIJgrW6RLzy20QFgPDxHhG3QdBpq4gB9BxCrMb+yhQECgYEA6jL1pD0drczxfaWC +bh+VsbVrRnz/0XDlPjaysO+qKsNP104gydeyyB6RcGnO8PssvFMCJNQlMhkEpp9x +bOwR36a4A2absC/osGgFH4pYyN2wqDb+qE2A3M+rnSGourd09y8BsCovN+5YsozK +HCnqjNWUweypU+RUvtM5jztsiOUCgYEA81ajdczpsysSn0xIFF0exvnnPLy/AiOR +uEFbPi0kavy7niwd609JFsSOwUXg2QavBNeoLH+YrQhueDoBJZANerLfLD8jqQxD +ojB6DkHwK5Vf9NIm8DZQ6trtf8xWGB/TuwpkWHm1wMdlCbmH38MukU4p6as7FKzT +8J57p/TfcdcCgYEAyDqfVzbFTBWfFbxOghZQ5mlj+RTfplHuPL2JEssk4oCvnzV1 +xPu8J2ozEDf2LIOiYLRbbd9OmcFX/5jr4aMHOP6R7p5oVz7uovub/bZLaBhZc8fo ++z2gAakvYR0o49H7l2XB/LpkOl51yNmj5mZT2Oq1zwKmVkotxiRS3smAZp0CgYAP +sOyFchs3xHVE9GRJe9+6MO8qSXl/p8+DtCMwFTUd+QIYJvwe6lPqNe6Go/zlwbqT +c1yS0f+EWODWu9bLF0jnOpWNgtzHz9Skpr+YH8Re6xju7oY4QyhgnJFoBkMe9x5u +FzN1SRPhRHpNcDtEwI9GK2YkfTgoEyTvhSiwIegurQKBgQDGkheCC7hqleNV3lGM +SfMUgyGt/1abZ82eAkdfeUrM37FeSbxuafyp0ICjZY0xsn6RUickHyXBJhkOGSJX +lGSvHwMsnXT30KAGd08ZqWmTSGmH6IrdVhrveY+e18ILXYgAkQ1T9tSKjeyFfK8m +dUWlFZHfdToFu1pn7yBgofMAmw== +-----END PRIVATE KEY----- diff --git a/certs/localhost.pem b/certs/localhost.pem new file mode 100644 index 0000000000..8d4df20565 --- /dev/null +++ b/certs/localhost.pem @@ -0,0 +1,26 @@ +-----BEGIN CERTIFICATE----- +MIIEdjCCAt6gAwIBAgIQX/6Qs3c+lQq4+pcuUK7a7jANBgkqhkiG9w0BAQsFADCB +lTEeMBwGA1UEChMVbWtjZXJ0IGRldmVsb3BtZW50IENBMTUwMwYDVQQLDCxzaHVi +QFNodWItTWVtR1BULURyaXZlci5sb2NhbCAoU2h1YmhhbSBOYWlrKTE8MDoGA1UE +AwwzbWtjZXJ0IHNodWJAU2h1Yi1NZW1HUFQtRHJpdmVyLmxvY2FsIChTaHViaGFt +IE5haWspMB4XDTI0MTIxMDE4MTgwMFoXDTI3MDMxMDE4MTgwMFowYDEnMCUGA1UE +ChMebWtjZXJ0IGRldmVsb3BtZW50IGNlcnRpZmljYXRlMTUwMwYDVQQLDCxzaHVi +QFNodWItTWVtR1BULURyaXZlci5sb2NhbCAoU2h1YmhhbSBOYWlrKTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAN6dodOiV/L1PNcBR3rTI87VbSanF0NO +7Gvane0FRpAm3lsQbMluzUzSLlhVEr9LG1hlC/KqYjRQso3z568pISkmgOAt8Uoz +brqPMoNJd3lcFDde67Fsqro1XqqhN3B4nTM/RdcNScqhM3p4yRSLyEP0/VNHc6Td +UadPXCx0bTA/BE8Mj+wP3YYBIvhWJTL/UuWuzsaOU4L7szYYygaJ9IeObHbGBn8r +xx0ParXmIkmWF1uALB96NxCU/tyYu1IkcfXzwRl6gU8R81JSlg2CVLWTHQP8sLWi +hNBGQKksCfF6icxBlLk7n+r/PLF+2TIo740idHoO0zRSPx8a7lQPDVMCAwEAAaN2 +MHQwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMB8GA1UdIwQY +MBaAFJ31vDww7/qA2mBtAN3GE+TZCqNeMCwGA1UdEQQlMCOCCWxvY2FsaG9zdIcE +fwAAAYcQAAAAAAAAAAAAAAAAAAAAATANBgkqhkiG9w0BAQsFAAOCAYEAAy63DbPf +8iSWYmVgccFc5D+MpNgnWi6WsI5OTtRv66eV9+Vv9HseEVrSw8IVMoZt+peosi+K +0woVPT+bKCxlgkEClO7oZIUEMlzJq9sduISFV5fzFLMq8xhIIO5ud4zs1X/1GlrE +zAdq+YiZnbuKqLFSoPLZGrVclmiI3dLqp0LETZxVOiCGt52RRb87Mt9bQEHnP5LJ +EOJYZ1C7/qDDga3vFJ66Nisy015DpE7XXM5PASElpK9l4+yBOg9UdLSkd0VLm/Jm ++4rskdrSTiomU2TBd6Vys7nrn2K72ZOHOcbfFnPEet9z1L44xaddsaPE52ayu8PO +uxHl7rBr2Kzeuy22ppX09EpPdSnjrG6Sgojv4CCS6n8tAbhat8K0pTrzk1e7L8HT +Qy4P/LlViW56mfyM+02CurxbVOecCDdFPMwY357BXMnL6VmRrDtixh+XIXdyK2zS +aYhsbRFA7VJ1AM57gbPbDJElyIlvVetubilvfuOvvQX46cC/ZX5agzTd +-----END CERTIFICATE----- diff --git a/letta/cli/cli.py b/letta/cli/cli.py index bedab42916..81e27c9af6 100644 --- a/letta/cli/cli.py +++ b/letta/cli/cli.py @@ -53,6 +53,7 @@ def server( debug: Annotated[bool, typer.Option(help="Turn debugging output on")] = False, ade: Annotated[bool, typer.Option(help="Allows remote access")] = False, # NOTE: deprecated secure: Annotated[bool, typer.Option(help="Adds simple security access")] = False, + localhttps: Annotated[bool, typer.Option(help="Setup local https")] = False, ): """Launch a Letta server process""" if type == ServerChoice.rest_api: diff --git a/letta/server/rest_api/app.py b/letta/server/rest_api/app.py index 321a48827e..9b567bf4a0 100644 --- a/letta/server/rest_api/app.py +++ b/letta/server/rest_api/app.py @@ -175,7 +175,6 @@ async def user_not_found_handler(request, exc): return JSONResponse(status_code=404, content={"detail": "User not found"}) settings.cors_origins.append("https://app.letta.com") - print(f"▶ View using ADE at: https://app.letta.com/development-servers/local/dashboard") if (os.getenv("LETTA_SERVER_SECURE") == "true") or "--secure" in sys.argv: print(f"▶ Using secure mode with password: {random_password}") @@ -254,9 +253,21 @@ def start_server( # Add the handler to the logger server_logger.addHandler(stream_handler) - print(f"▶ Server running at: http://{host or 'localhost'}:{port or REST_DEFAULT_PORT}\n") - uvicorn.run( - app, - host=host or "localhost", - port=port or REST_DEFAULT_PORT, - ) + if (os.getenv("LOCAL_HTTPS") == "true") or "--localhttps" in sys.argv: + uvicorn.run( + app, + host=host or "localhost", + port=port or REST_DEFAULT_PORT, + ssl_keyfile="certs/localhost-key.pem", + ssl_certfile="certs/localhost.pem", + ) + print(f"▶ Server running at: https://{host or 'localhost'}:{port or REST_DEFAULT_PORT}\n") + else: + uvicorn.run( + app, + host=host or "localhost", + port=port or REST_DEFAULT_PORT, + ) + print(f"▶ Server running at: http://{host or 'localhost'}:{port or REST_DEFAULT_PORT}\n") + + print(f"▶ View using ADE at: https://app.letta.com/development-servers/local/dashboard") From 61f8a15a1b01fda2fb0e6c075fd6e37027f3b07a Mon Sep 17 00:00:00 2001 From: Shubham Naik Date: Tue, 10 Dec 2024 13:37:21 -0800 Subject: [PATCH 057/280] feat: add files (#2210) Co-authored-by: Shubham Naik --- .../assets/{index-4848e3d7.js => index-048c9598.js} | 2 +- .../assets/{index-43ab4d62.css => index-0e31b727.css} | 2 +- letta/server/static_files/index.html | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) rename letta/server/static_files/assets/{index-4848e3d7.js => index-048c9598.js} (99%) rename letta/server/static_files/assets/{index-43ab4d62.css => index-0e31b727.css} (87%) diff --git a/letta/server/static_files/assets/index-4848e3d7.js b/letta/server/static_files/assets/index-048c9598.js similarity index 99% rename from letta/server/static_files/assets/index-4848e3d7.js rename to letta/server/static_files/assets/index-048c9598.js index 97b8ee8c24..7b63c8d1b9 100644 --- a/letta/server/static_files/assets/index-4848e3d7.js +++ b/letta/server/static_files/assets/index-048c9598.js @@ -37,4 +37,4 @@ `+l[u].replace(" at new "," at ");return e.displayName&&s.includes("")&&(s=s.replace("",e.displayName)),s}while(1<=u&&0<=i);break}}}finally{Sl=!1,Error.prepareStackTrace=t}return(e=e?e.displayName||e.name:"")?yt(e):""}function Lc(e){switch(e.tag){case 5:return yt(e.type);case 16:return yt("Lazy");case 13:return yt("Suspense");case 19:return yt("SuspenseList");case 0:case 2:case 15:return e=kl(e.type,!1),e;case 11:return e=kl(e.type.render,!1),e;case 1:return e=kl(e.type,!0),e;default:return""}}function Zl(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Dn:return"Fragment";case On:return"Portal";case Ql:return"Profiler";case Qo:return"StrictMode";case Kl:return"Suspense";case Yl:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case ls:return(e.displayName||"Context")+".Consumer";case rs:return(e._context.displayName||"Context")+".Provider";case Ko:var n=e.render;return e=e.displayName,e||(e=n.displayName||n.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Yo:return n=e.displayName||null,n!==null?n:Zl(e.type)||"Memo";case Ge:n=e._payload,e=e._init;try{return Zl(e(n))}catch{}}return null}function Tc(e){var n=e.type;switch(e.tag){case 24:return"Cache";case 9:return(n.displayName||"Context")+".Consumer";case 10:return(n._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=n.render,e=e.displayName||e.name||"",n.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return n;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Zl(n);case 8:return n===Qo?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof n=="function")return n.displayName||n.name||null;if(typeof n=="string")return n}return null}function fn(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function us(e){var n=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(n==="checkbox"||n==="radio")}function Rc(e){var n=us(e)?"checked":"value",t=Object.getOwnPropertyDescriptor(e.constructor.prototype,n),r=""+e[n];if(!e.hasOwnProperty(n)&&typeof t<"u"&&typeof t.get=="function"&&typeof t.set=="function"){var l=t.get,o=t.set;return Object.defineProperty(e,n,{configurable:!0,get:function(){return l.call(this)},set:function(u){r=""+u,o.call(this,u)}}),Object.defineProperty(e,n,{enumerable:t.enumerable}),{getValue:function(){return r},setValue:function(u){r=""+u},stopTracking:function(){e._valueTracker=null,delete e[n]}}}}function tr(e){e._valueTracker||(e._valueTracker=Rc(e))}function is(e){if(!e)return!1;var n=e._valueTracker;if(!n)return!0;var t=n.getValue(),r="";return e&&(r=us(e)?e.checked?"true":"false":e.value),e=r,e!==t?(n.setValue(e),!0):!1}function Lr(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Xl(e,n){var t=n.checked;return U({},n,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:t??e._wrapperState.initialChecked})}function Hu(e,n){var t=n.defaultValue==null?"":n.defaultValue,r=n.checked!=null?n.checked:n.defaultChecked;t=fn(n.value!=null?n.value:t),e._wrapperState={initialChecked:r,initialValue:t,controlled:n.type==="checkbox"||n.type==="radio"?n.checked!=null:n.value!=null}}function ss(e,n){n=n.checked,n!=null&&Wo(e,"checked",n,!1)}function Gl(e,n){ss(e,n);var t=fn(n.value),r=n.type;if(t!=null)r==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+t):e.value!==""+t&&(e.value=""+t);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}n.hasOwnProperty("value")?Jl(e,n.type,t):n.hasOwnProperty("defaultValue")&&Jl(e,n.type,fn(n.defaultValue)),n.checked==null&&n.defaultChecked!=null&&(e.defaultChecked=!!n.defaultChecked)}function Uu(e,n,t){if(n.hasOwnProperty("value")||n.hasOwnProperty("defaultValue")){var r=n.type;if(!(r!=="submit"&&r!=="reset"||n.value!==void 0&&n.value!==null))return;n=""+e._wrapperState.initialValue,t||n===e.value||(e.value=n),e.defaultValue=n}t=e.name,t!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,t!==""&&(e.name=t)}function Jl(e,n,t){(n!=="number"||Lr(e.ownerDocument)!==e)&&(t==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+t&&(e.defaultValue=""+t))}var gt=Array.isArray;function Qn(e,n,t,r){if(e=e.options,n){n={};for(var l=0;l"+n.valueOf().toString()+"",n=rr.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;n.firstChild;)e.appendChild(n.firstChild)}});function Rt(e,n){if(n){var t=e.firstChild;if(t&&t===e.lastChild&&t.nodeType===3){t.nodeValue=n;return}}e.textContent=n}var kt={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Mc=["Webkit","ms","Moz","O"];Object.keys(kt).forEach(function(e){Mc.forEach(function(n){n=n+e.charAt(0).toUpperCase()+e.substring(1),kt[n]=kt[e]})});function ds(e,n,t){return n==null||typeof n=="boolean"||n===""?"":t||typeof n!="number"||n===0||kt.hasOwnProperty(e)&&kt[e]?(""+n).trim():n+"px"}function ps(e,n){e=e.style;for(var t in n)if(n.hasOwnProperty(t)){var r=t.indexOf("--")===0,l=ds(t,n[t],r);t==="float"&&(t="cssFloat"),r?e.setProperty(t,l):e[t]=l}}var Oc=U({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function eo(e,n){if(n){if(Oc[e]&&(n.children!=null||n.dangerouslySetInnerHTML!=null))throw Error(y(137,e));if(n.dangerouslySetInnerHTML!=null){if(n.children!=null)throw Error(y(60));if(typeof n.dangerouslySetInnerHTML!="object"||!("__html"in n.dangerouslySetInnerHTML))throw Error(y(61))}if(n.style!=null&&typeof n.style!="object")throw Error(y(62))}}function no(e,n){if(e.indexOf("-")===-1)return typeof n.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var to=null;function Zo(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var ro=null,Kn=null,Yn=null;function Bu(e){if(e=Gt(e)){if(typeof ro!="function")throw Error(y(280));var n=e.stateNode;n&&(n=ll(n),ro(e.stateNode,e.type,n))}}function ms(e){Kn?Yn?Yn.push(e):Yn=[e]:Kn=e}function hs(){if(Kn){var e=Kn,n=Yn;if(Yn=Kn=null,Bu(e),n)for(e=0;e>>=0,e===0?32:31-(Wc(e)/Qc|0)|0}var lr=64,or=4194304;function wt(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Or(e,n){var t=e.pendingLanes;if(t===0)return 0;var r=0,l=e.suspendedLanes,o=e.pingedLanes,u=t&268435455;if(u!==0){var i=u&~l;i!==0?r=wt(i):(o&=u,o!==0&&(r=wt(o)))}else u=t&~l,u!==0?r=wt(u):o!==0&&(r=wt(o));if(r===0)return 0;if(n!==0&&n!==r&&!(n&l)&&(l=r&-r,o=n&-n,l>=o||l===16&&(o&4194240)!==0))return n;if(r&4&&(r|=t&16),n=e.entangledLanes,n!==0)for(e=e.entanglements,n&=r;0t;t++)n.push(e);return n}function Zt(e,n,t){e.pendingLanes|=n,n!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,n=31-Re(n),e[n]=t}function Xc(e,n){var t=e.pendingLanes&~n;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=n,e.mutableReadLanes&=n,e.entangledLanes&=n,n=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=Ct),qu=String.fromCharCode(32),bu=!1;function js(e,n){switch(e){case"keyup":return xf.indexOf(n.keyCode)!==-1;case"keydown":return n.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Is(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var jn=!1;function Nf(e,n){switch(e){case"compositionend":return Is(n);case"keypress":return n.which!==32?null:(bu=!0,qu);case"textInput":return e=n.data,e===qu&&bu?null:e;default:return null}}function Pf(e,n){if(jn)return e==="compositionend"||!tu&&js(e,n)?(e=Os(),Sr=bo=en=null,jn=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(n.ctrlKey||n.altKey||n.metaKey)||n.ctrlKey&&n.altKey){if(n.char&&1=n)return{node:t,offset:n-e};e=r}e:{for(;t;){if(t.nextSibling){t=t.nextSibling;break e}t=t.parentNode}t=void 0}t=ri(t)}}function Us(e,n){return e&&n?e===n?!0:e&&e.nodeType===3?!1:n&&n.nodeType===3?Us(e,n.parentNode):"contains"in e?e.contains(n):e.compareDocumentPosition?!!(e.compareDocumentPosition(n)&16):!1:!1}function $s(){for(var e=window,n=Lr();n instanceof e.HTMLIFrameElement;){try{var t=typeof n.contentWindow.location.href=="string"}catch{t=!1}if(t)e=n.contentWindow;else break;n=Lr(e.document)}return n}function ru(e){var n=e&&e.nodeName&&e.nodeName.toLowerCase();return n&&(n==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||n==="textarea"||e.contentEditable==="true")}function If(e){var n=$s(),t=e.focusedElem,r=e.selectionRange;if(n!==t&&t&&t.ownerDocument&&Us(t.ownerDocument.documentElement,t)){if(r!==null&&ru(t)){if(n=r.start,e=r.end,e===void 0&&(e=n),"selectionStart"in t)t.selectionStart=n,t.selectionEnd=Math.min(e,t.value.length);else if(e=(n=t.ownerDocument||document)&&n.defaultView||window,e.getSelection){e=e.getSelection();var l=t.textContent.length,o=Math.min(r.start,l);r=r.end===void 0?o:Math.min(r.end,l),!e.extend&&o>r&&(l=r,r=o,o=l),l=li(t,o);var u=li(t,r);l&&u&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==u.node||e.focusOffset!==u.offset)&&(n=n.createRange(),n.setStart(l.node,l.offset),e.removeAllRanges(),o>r?(e.addRange(n),e.extend(u.node,u.offset)):(n.setEnd(u.node,u.offset),e.addRange(n)))}}for(n=[],e=t;e=e.parentNode;)e.nodeType===1&&n.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof t.focus=="function"&&t.focus(),t=0;t=document.documentMode,In=null,ao=null,_t=null,co=!1;function oi(e,n,t){var r=t.window===t?t.document:t.nodeType===9?t:t.ownerDocument;co||In==null||In!==Lr(r)||(r=In,"selectionStart"in r&&ru(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),_t&&Vt(_t,r)||(_t=r,r=Ir(ao,"onSelect"),0Hn||(e.current=yo[Hn],yo[Hn]=null,Hn--)}function O(e,n){Hn++,yo[Hn]=e.current,e.current=n}var dn={},le=mn(dn),fe=mn(!1),_n=dn;function qn(e,n){var t=e.type.contextTypes;if(!t)return dn;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===n)return r.__reactInternalMemoizedMaskedChildContext;var l={},o;for(o in t)l[o]=n[o];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=n,e.__reactInternalMemoizedMaskedChildContext=l),l}function de(e){return e=e.childContextTypes,e!=null}function Fr(){j(fe),j(le)}function di(e,n,t){if(le.current!==dn)throw Error(y(168));O(le,n),O(fe,t)}function Gs(e,n,t){var r=e.stateNode;if(n=n.childContextTypes,typeof r.getChildContext!="function")return t;r=r.getChildContext();for(var l in r)if(!(l in n))throw Error(y(108,Tc(e)||"Unknown",l));return U({},t,r)}function Hr(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||dn,_n=le.current,O(le,e),O(fe,fe.current),!0}function pi(e,n,t){var r=e.stateNode;if(!r)throw Error(y(169));t?(e=Gs(e,n,_n),r.__reactInternalMemoizedMergedChildContext=e,j(fe),j(le),O(le,e)):j(fe),O(fe,t)}var Ue=null,ol=!1,jl=!1;function Js(e){Ue===null?Ue=[e]:Ue.push(e)}function Zf(e){ol=!0,Js(e)}function hn(){if(!jl&&Ue!==null){jl=!0;var e=0,n=M;try{var t=Ue;for(M=1;e>=u,l-=u,$e=1<<32-Re(n)+l|t<N?(B=_,_=null):B=_.sibling;var T=p(f,_,d[N],v);if(T===null){_===null&&(_=B);break}e&&_&&T.alternate===null&&n(f,_),a=o(T,a,N),x===null?E=T:x.sibling=T,x=T,_=B}if(N===d.length)return t(f,_),V&&gn(f,N),E;if(_===null){for(;NN?(B=_,_=null):B=_.sibling;var Ne=p(f,_,T.value,v);if(Ne===null){_===null&&(_=B);break}e&&_&&Ne.alternate===null&&n(f,_),a=o(Ne,a,N),x===null?E=Ne:x.sibling=Ne,x=Ne,_=B}if(T.done)return t(f,_),V&&gn(f,N),E;if(_===null){for(;!T.done;N++,T=d.next())T=m(f,T.value,v),T!==null&&(a=o(T,a,N),x===null?E=T:x.sibling=T,x=T);return V&&gn(f,N),E}for(_=r(f,_);!T.done;N++,T=d.next())T=g(_,f,N,T.value,v),T!==null&&(e&&T.alternate!==null&&_.delete(T.key===null?N:T.key),a=o(T,a,N),x===null?E=T:x.sibling=T,x=T);return e&&_.forEach(function(it){return n(f,it)}),V&&gn(f,N),E}function I(f,a,d,v){if(typeof d=="object"&&d!==null&&d.type===Dn&&d.key===null&&(d=d.props.children),typeof d=="object"&&d!==null){switch(d.$$typeof){case nr:e:{for(var E=d.key,x=a;x!==null;){if(x.key===E){if(E=d.type,E===Dn){if(x.tag===7){t(f,x.sibling),a=l(x,d.props.children),a.return=f,f=a;break e}}else if(x.elementType===E||typeof E=="object"&&E!==null&&E.$$typeof===Ge&&Si(E)===x.type){t(f,x.sibling),a=l(x,d.props),a.ref=mt(f,x,d),a.return=f,f=a;break e}t(f,x);break}else n(f,x);x=x.sibling}d.type===Dn?(a=xn(d.props.children,f.mode,v,d.key),a.return=f,f=a):(v=zr(d.type,d.key,d.props,null,f.mode,v),v.ref=mt(f,a,d),v.return=f,f=v)}return u(f);case On:e:{for(x=d.key;a!==null;){if(a.key===x)if(a.tag===4&&a.stateNode.containerInfo===d.containerInfo&&a.stateNode.implementation===d.implementation){t(f,a.sibling),a=l(a,d.children||[]),a.return=f,f=a;break e}else{t(f,a);break}else n(f,a);a=a.sibling}a=Bl(d,f.mode,v),a.return=f,f=a}return u(f);case Ge:return x=d._init,I(f,a,x(d._payload),v)}if(gt(d))return w(f,a,d,v);if(at(d))return S(f,a,d,v);dr(f,d)}return typeof d=="string"&&d!==""||typeof d=="number"?(d=""+d,a!==null&&a.tag===6?(t(f,a.sibling),a=l(a,d),a.return=f,f=a):(t(f,a),a=Al(d,f.mode,v),a.return=f,f=a),u(f)):t(f,a)}return I}var et=oa(!0),ua=oa(!1),Jt={},Fe=mn(Jt),$t=mn(Jt),At=mn(Jt);function En(e){if(e===Jt)throw Error(y(174));return e}function du(e,n){switch(O(At,n),O($t,e),O(Fe,Jt),e=n.nodeType,e){case 9:case 11:n=(n=n.documentElement)?n.namespaceURI:bl(null,"");break;default:e=e===8?n.parentNode:n,n=e.namespaceURI||null,e=e.tagName,n=bl(n,e)}j(Fe),O(Fe,n)}function nt(){j(Fe),j($t),j(At)}function ia(e){En(At.current);var n=En(Fe.current),t=bl(n,e.type);n!==t&&(O($t,e),O(Fe,t))}function pu(e){$t.current===e&&(j(Fe),j($t))}var F=mn(0);function Qr(e){for(var n=e;n!==null;){if(n.tag===13){var t=n.memoizedState;if(t!==null&&(t=t.dehydrated,t===null||t.data==="$?"||t.data==="$!"))return n}else if(n.tag===19&&n.memoizedProps.revealOrder!==void 0){if(n.flags&128)return n}else if(n.child!==null){n.child.return=n,n=n.child;continue}if(n===e)break;for(;n.sibling===null;){if(n.return===null||n.return===e)return null;n=n.return}n.sibling.return=n.return,n=n.sibling}return null}var Il=[];function mu(){for(var e=0;et?t:4,e(!0);var r=Vl.transition;Vl.transition={};try{e(!1),n()}finally{M=t,Vl.transition=r}}function Ca(){return _e().memoizedState}function qf(e,n,t){var r=an(e);if(t={lane:r,action:t,hasEagerState:!1,eagerState:null,next:null},xa(e))_a(n,t);else if(t=na(e,n,t,r),t!==null){var l=ue();Me(t,e,r,l),Na(t,n,r)}}function bf(e,n,t){var r=an(e),l={lane:r,action:t,hasEagerState:!1,eagerState:null,next:null};if(xa(e))_a(n,l);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=n.lastRenderedReducer,o!==null))try{var u=n.lastRenderedState,i=o(u,t);if(l.hasEagerState=!0,l.eagerState=i,Oe(i,u)){var s=n.interleaved;s===null?(l.next=l,cu(n)):(l.next=s.next,s.next=l),n.interleaved=l;return}}catch{}finally{}t=na(e,n,l,r),t!==null&&(l=ue(),Me(t,e,r,l),Na(t,n,r))}}function xa(e){var n=e.alternate;return e===H||n!==null&&n===H}function _a(e,n){Nt=Kr=!0;var t=e.pending;t===null?n.next=n:(n.next=t.next,t.next=n),e.pending=n}function Na(e,n,t){if(t&4194240){var r=n.lanes;r&=e.pendingLanes,t|=r,n.lanes=t,Go(e,t)}}var Yr={readContext:xe,useCallback:ne,useContext:ne,useEffect:ne,useImperativeHandle:ne,useInsertionEffect:ne,useLayoutEffect:ne,useMemo:ne,useReducer:ne,useRef:ne,useState:ne,useDebugValue:ne,useDeferredValue:ne,useTransition:ne,useMutableSource:ne,useSyncExternalStore:ne,useId:ne,unstable_isNewReconciler:!1},ed={readContext:xe,useCallback:function(e,n){return je().memoizedState=[e,n===void 0?null:n],e},useContext:xe,useEffect:Ei,useImperativeHandle:function(e,n,t){return t=t!=null?t.concat([e]):null,xr(4194308,4,ga.bind(null,n,e),t)},useLayoutEffect:function(e,n){return xr(4194308,4,e,n)},useInsertionEffect:function(e,n){return xr(4,2,e,n)},useMemo:function(e,n){var t=je();return n=n===void 0?null:n,e=e(),t.memoizedState=[e,n],e},useReducer:function(e,n,t){var r=je();return n=t!==void 0?t(n):n,r.memoizedState=r.baseState=n,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:n},r.queue=e,e=e.dispatch=qf.bind(null,H,e),[r.memoizedState,e]},useRef:function(e){var n=je();return e={current:e},n.memoizedState=e},useState:ki,useDebugValue:wu,useDeferredValue:function(e){return je().memoizedState=e},useTransition:function(){var e=ki(!1),n=e[0];return e=Jf.bind(null,e[1]),je().memoizedState=e,[n,e]},useMutableSource:function(){},useSyncExternalStore:function(e,n,t){var r=H,l=je();if(V){if(t===void 0)throw Error(y(407));t=t()}else{if(t=n(),J===null)throw Error(y(349));Pn&30||ca(r,n,t)}l.memoizedState=t;var o={value:t,getSnapshot:n};return l.queue=o,Ei(da.bind(null,r,o,e),[e]),r.flags|=2048,Qt(9,fa.bind(null,r,o,t,n),void 0,null),t},useId:function(){var e=je(),n=J.identifierPrefix;if(V){var t=Ae,r=$e;t=(r&~(1<<32-Re(r)-1)).toString(32)+t,n=":"+n+"R"+t,t=Bt++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=u.createElement(t,{is:r.is}):(e=u.createElement(t),t==="select"&&(u=e,r.multiple?u.multiple=!0:r.size&&(u.size=r.size))):e=u.createElementNS(e,t),e[Ie]=n,e[Ut]=r,ja(e,n,!1,!1),n.stateNode=e;e:{switch(u=no(t,r),t){case"dialog":D("cancel",e),D("close",e),l=r;break;case"iframe":case"object":case"embed":D("load",e),l=r;break;case"video":case"audio":for(l=0;lrt&&(n.flags|=128,r=!0,ht(o,!1),n.lanes=4194304)}else{if(!r)if(e=Qr(u),e!==null){if(n.flags|=128,r=!0,t=e.updateQueue,t!==null&&(n.updateQueue=t,n.flags|=4),ht(o,!0),o.tail===null&&o.tailMode==="hidden"&&!u.alternate&&!V)return te(n),null}else 2*Q()-o.renderingStartTime>rt&&t!==1073741824&&(n.flags|=128,r=!0,ht(o,!1),n.lanes=4194304);o.isBackwards?(u.sibling=n.child,n.child=u):(t=o.last,t!==null?t.sibling=u:n.child=u,o.last=u)}return o.tail!==null?(n=o.tail,o.rendering=n,o.tail=n.sibling,o.renderingStartTime=Q(),n.sibling=null,t=F.current,O(F,r?t&1|2:t&1),n):(te(n),null);case 22:case 23:return _u(),r=n.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(n.flags|=8192),r&&n.mode&1?me&1073741824&&(te(n),n.subtreeFlags&6&&(n.flags|=8192)):te(n),null;case 24:return null;case 25:return null}throw Error(y(156,n.tag))}function sd(e,n){switch(ou(n),n.tag){case 1:return de(n.type)&&Fr(),e=n.flags,e&65536?(n.flags=e&-65537|128,n):null;case 3:return nt(),j(fe),j(le),mu(),e=n.flags,e&65536&&!(e&128)?(n.flags=e&-65537|128,n):null;case 5:return pu(n),null;case 13:if(j(F),e=n.memoizedState,e!==null&&e.dehydrated!==null){if(n.alternate===null)throw Error(y(340));bn()}return e=n.flags,e&65536?(n.flags=e&-65537|128,n):null;case 19:return j(F),null;case 4:return nt(),null;case 10:return au(n.type._context),null;case 22:case 23:return _u(),null;case 24:return null;default:return null}}var mr=!1,re=!1,ad=typeof WeakSet=="function"?WeakSet:Set,k=null;function Bn(e,n){var t=e.ref;if(t!==null)if(typeof t=="function")try{t(null)}catch(r){A(e,n,r)}else t.current=null}function Lo(e,n,t){try{t()}catch(r){A(e,n,r)}}var Ri=!1;function cd(e,n){if(fo=Dr,e=$s(),ru(e)){if("selectionStart"in e)var t={start:e.selectionStart,end:e.selectionEnd};else e:{t=(t=e.ownerDocument)&&t.defaultView||window;var r=t.getSelection&&t.getSelection();if(r&&r.rangeCount!==0){t=r.anchorNode;var l=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{t.nodeType,o.nodeType}catch{t=null;break e}var u=0,i=-1,s=-1,c=0,h=0,m=e,p=null;n:for(;;){for(var g;m!==t||l!==0&&m.nodeType!==3||(i=u+l),m!==o||r!==0&&m.nodeType!==3||(s=u+r),m.nodeType===3&&(u+=m.nodeValue.length),(g=m.firstChild)!==null;)p=m,m=g;for(;;){if(m===e)break n;if(p===t&&++c===l&&(i=u),p===o&&++h===r&&(s=u),(g=m.nextSibling)!==null)break;m=p,p=m.parentNode}m=g}t=i===-1||s===-1?null:{start:i,end:s}}else t=null}t=t||{start:0,end:0}}else t=null;for(po={focusedElem:e,selectionRange:t},Dr=!1,k=n;k!==null;)if(n=k,e=n.child,(n.subtreeFlags&1028)!==0&&e!==null)e.return=n,k=e;else for(;k!==null;){n=k;try{var w=n.alternate;if(n.flags&1024)switch(n.tag){case 0:case 11:case 15:break;case 1:if(w!==null){var S=w.memoizedProps,I=w.memoizedState,f=n.stateNode,a=f.getSnapshotBeforeUpdate(n.elementType===n.type?S:ze(n.type,S),I);f.__reactInternalSnapshotBeforeUpdate=a}break;case 3:var d=n.stateNode.containerInfo;d.nodeType===1?d.textContent="":d.nodeType===9&&d.documentElement&&d.removeChild(d.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(y(163))}}catch(v){A(n,n.return,v)}if(e=n.sibling,e!==null){e.return=n.return,k=e;break}k=n.return}return w=Ri,Ri=!1,w}function Pt(e,n,t){var r=n.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var l=r=r.next;do{if((l.tag&e)===e){var o=l.destroy;l.destroy=void 0,o!==void 0&&Lo(n,t,o)}l=l.next}while(l!==r)}}function sl(e,n){if(n=n.updateQueue,n=n!==null?n.lastEffect:null,n!==null){var t=n=n.next;do{if((t.tag&e)===e){var r=t.create;t.destroy=r()}t=t.next}while(t!==n)}}function To(e){var n=e.ref;if(n!==null){var t=e.stateNode;switch(e.tag){case 5:e=t;break;default:e=t}typeof n=="function"?n(e):n.current=e}}function Fa(e){var n=e.alternate;n!==null&&(e.alternate=null,Fa(n)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(n=e.stateNode,n!==null&&(delete n[Ie],delete n[Ut],delete n[vo],delete n[Kf],delete n[Yf])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Ha(e){return e.tag===5||e.tag===3||e.tag===4}function Mi(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Ha(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Ro(e,n,t){var r=e.tag;if(r===5||r===6)e=e.stateNode,n?t.nodeType===8?t.parentNode.insertBefore(e,n):t.insertBefore(e,n):(t.nodeType===8?(n=t.parentNode,n.insertBefore(e,t)):(n=t,n.appendChild(e)),t=t._reactRootContainer,t!=null||n.onclick!==null||(n.onclick=Vr));else if(r!==4&&(e=e.child,e!==null))for(Ro(e,n,t),e=e.sibling;e!==null;)Ro(e,n,t),e=e.sibling}function Mo(e,n,t){var r=e.tag;if(r===5||r===6)e=e.stateNode,n?t.insertBefore(e,n):t.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(Mo(e,n,t),e=e.sibling;e!==null;)Mo(e,n,t),e=e.sibling}var q=null,Le=!1;function Xe(e,n,t){for(t=t.child;t!==null;)Ua(e,n,t),t=t.sibling}function Ua(e,n,t){if(Ve&&typeof Ve.onCommitFiberUnmount=="function")try{Ve.onCommitFiberUnmount(el,t)}catch{}switch(t.tag){case 5:re||Bn(t,n);case 6:var r=q,l=Le;q=null,Xe(e,n,t),q=r,Le=l,q!==null&&(Le?(e=q,t=t.stateNode,e.nodeType===8?e.parentNode.removeChild(t):e.removeChild(t)):q.removeChild(t.stateNode));break;case 18:q!==null&&(Le?(e=q,t=t.stateNode,e.nodeType===8?Dl(e.parentNode,t):e.nodeType===1&&Dl(e,t),jt(e)):Dl(q,t.stateNode));break;case 4:r=q,l=Le,q=t.stateNode.containerInfo,Le=!0,Xe(e,n,t),q=r,Le=l;break;case 0:case 11:case 14:case 15:if(!re&&(r=t.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){l=r=r.next;do{var o=l,u=o.destroy;o=o.tag,u!==void 0&&(o&2||o&4)&&Lo(t,n,u),l=l.next}while(l!==r)}Xe(e,n,t);break;case 1:if(!re&&(Bn(t,n),r=t.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=t.memoizedProps,r.state=t.memoizedState,r.componentWillUnmount()}catch(i){A(t,n,i)}Xe(e,n,t);break;case 21:Xe(e,n,t);break;case 22:t.mode&1?(re=(r=re)||t.memoizedState!==null,Xe(e,n,t),re=r):Xe(e,n,t);break;default:Xe(e,n,t)}}function Oi(e){var n=e.updateQueue;if(n!==null){e.updateQueue=null;var t=e.stateNode;t===null&&(t=e.stateNode=new ad),n.forEach(function(r){var l=wd.bind(null,e,r);t.has(r)||(t.add(r),r.then(l,l))})}}function Pe(e,n){var t=n.deletions;if(t!==null)for(var r=0;rl&&(l=u),r&=~o}if(r=l,r=Q()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*dd(r/1960))-r,10e?16:e,nn===null)var r=!1;else{if(e=nn,nn=null,Gr=0,R&6)throw Error(y(331));var l=R;for(R|=4,k=e.current;k!==null;){var o=k,u=o.child;if(k.flags&16){var i=o.deletions;if(i!==null){for(var s=0;sQ()-Cu?Cn(e,0):Eu|=t),pe(e,n)}function Za(e,n){n===0&&(e.mode&1?(n=or,or<<=1,!(or&130023424)&&(or=4194304)):n=1);var t=ue();e=Ke(e,n),e!==null&&(Zt(e,n,t),pe(e,t))}function gd(e){var n=e.memoizedState,t=0;n!==null&&(t=n.retryLane),Za(e,t)}function wd(e,n){var t=0;switch(e.tag){case 13:var r=e.stateNode,l=e.memoizedState;l!==null&&(t=l.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(y(314))}r!==null&&r.delete(n),Za(e,t)}var Xa;Xa=function(e,n,t){if(e!==null)if(e.memoizedProps!==n.pendingProps||fe.current)ce=!0;else{if(!(e.lanes&t)&&!(n.flags&128))return ce=!1,ud(e,n,t);ce=!!(e.flags&131072)}else ce=!1,V&&n.flags&1048576&&qs(n,$r,n.index);switch(n.lanes=0,n.tag){case 2:var r=n.type;_r(e,n),e=n.pendingProps;var l=qn(n,le.current);Xn(n,t),l=vu(null,n,r,e,l,t);var o=yu();return n.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(n.tag=1,n.memoizedState=null,n.updateQueue=null,de(r)?(o=!0,Hr(n)):o=!1,n.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,fu(n),l.updater=ul,n.stateNode=l,l._reactInternals=n,Eo(n,r,e,t),n=_o(null,n,r,!0,o,t)):(n.tag=0,V&&o&&lu(n),oe(null,n,l,t),n=n.child),n;case 16:r=n.elementType;e:{switch(_r(e,n),e=n.pendingProps,l=r._init,r=l(r._payload),n.type=r,l=n.tag=kd(r),e=ze(r,e),l){case 0:n=xo(null,n,r,e,t);break e;case 1:n=zi(null,n,r,e,t);break e;case 11:n=Ni(null,n,r,e,t);break e;case 14:n=Pi(null,n,r,ze(r.type,e),t);break e}throw Error(y(306,r,""))}return n;case 0:return r=n.type,l=n.pendingProps,l=n.elementType===r?l:ze(r,l),xo(e,n,r,l,t);case 1:return r=n.type,l=n.pendingProps,l=n.elementType===r?l:ze(r,l),zi(e,n,r,l,t);case 3:e:{if(Ma(n),e===null)throw Error(y(387));r=n.pendingProps,o=n.memoizedState,l=o.element,ta(e,n),Wr(n,r,null,t);var u=n.memoizedState;if(r=u.element,o.isDehydrated)if(o={element:r,isDehydrated:!1,cache:u.cache,pendingSuspenseBoundaries:u.pendingSuspenseBoundaries,transitions:u.transitions},n.updateQueue.baseState=o,n.memoizedState=o,n.flags&256){l=tt(Error(y(423)),n),n=Li(e,n,r,t,l);break e}else if(r!==l){l=tt(Error(y(424)),n),n=Li(e,n,r,t,l);break e}else for(he=on(n.stateNode.containerInfo.firstChild),ve=n,V=!0,Te=null,t=ua(n,null,r,t),n.child=t;t;)t.flags=t.flags&-3|4096,t=t.sibling;else{if(bn(),r===l){n=Ye(e,n,t);break e}oe(e,n,r,t)}n=n.child}return n;case 5:return ia(n),e===null&&wo(n),r=n.type,l=n.pendingProps,o=e!==null?e.memoizedProps:null,u=l.children,mo(r,l)?u=null:o!==null&&mo(r,o)&&(n.flags|=32),Ra(e,n),oe(e,n,u,t),n.child;case 6:return e===null&&wo(n),null;case 13:return Oa(e,n,t);case 4:return du(n,n.stateNode.containerInfo),r=n.pendingProps,e===null?n.child=et(n,null,r,t):oe(e,n,r,t),n.child;case 11:return r=n.type,l=n.pendingProps,l=n.elementType===r?l:ze(r,l),Ni(e,n,r,l,t);case 7:return oe(e,n,n.pendingProps,t),n.child;case 8:return oe(e,n,n.pendingProps.children,t),n.child;case 12:return oe(e,n,n.pendingProps.children,t),n.child;case 10:e:{if(r=n.type._context,l=n.pendingProps,o=n.memoizedProps,u=l.value,O(Ar,r._currentValue),r._currentValue=u,o!==null)if(Oe(o.value,u)){if(o.children===l.children&&!fe.current){n=Ye(e,n,t);break e}}else for(o=n.child,o!==null&&(o.return=n);o!==null;){var i=o.dependencies;if(i!==null){u=o.child;for(var s=i.firstContext;s!==null;){if(s.context===r){if(o.tag===1){s=Be(-1,t&-t),s.tag=2;var c=o.updateQueue;if(c!==null){c=c.shared;var h=c.pending;h===null?s.next=s:(s.next=h.next,h.next=s),c.pending=s}}o.lanes|=t,s=o.alternate,s!==null&&(s.lanes|=t),So(o.return,t,n),i.lanes|=t;break}s=s.next}}else if(o.tag===10)u=o.type===n.type?null:o.child;else if(o.tag===18){if(u=o.return,u===null)throw Error(y(341));u.lanes|=t,i=u.alternate,i!==null&&(i.lanes|=t),So(u,t,n),u=o.sibling}else u=o.child;if(u!==null)u.return=o;else for(u=o;u!==null;){if(u===n){u=null;break}if(o=u.sibling,o!==null){o.return=u.return,u=o;break}u=u.return}o=u}oe(e,n,l.children,t),n=n.child}return n;case 9:return l=n.type,r=n.pendingProps.children,Xn(n,t),l=xe(l),r=r(l),n.flags|=1,oe(e,n,r,t),n.child;case 14:return r=n.type,l=ze(r,n.pendingProps),l=ze(r.type,l),Pi(e,n,r,l,t);case 15:return La(e,n,n.type,n.pendingProps,t);case 17:return r=n.type,l=n.pendingProps,l=n.elementType===r?l:ze(r,l),_r(e,n),n.tag=1,de(r)?(e=!0,Hr(n)):e=!1,Xn(n,t),la(n,r,l),Eo(n,r,l,t),_o(null,n,r,!0,e,t);case 19:return Da(e,n,t);case 22:return Ta(e,n,t)}throw Error(y(156,n.tag))};function Ga(e,n){return Es(e,n)}function Sd(e,n,t,r){this.tag=e,this.key=t,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=n,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Ee(e,n,t,r){return new Sd(e,n,t,r)}function Pu(e){return e=e.prototype,!(!e||!e.isReactComponent)}function kd(e){if(typeof e=="function")return Pu(e)?1:0;if(e!=null){if(e=e.$$typeof,e===Ko)return 11;if(e===Yo)return 14}return 2}function cn(e,n){var t=e.alternate;return t===null?(t=Ee(e.tag,n,e.key,e.mode),t.elementType=e.elementType,t.type=e.type,t.stateNode=e.stateNode,t.alternate=e,e.alternate=t):(t.pendingProps=n,t.type=e.type,t.flags=0,t.subtreeFlags=0,t.deletions=null),t.flags=e.flags&14680064,t.childLanes=e.childLanes,t.lanes=e.lanes,t.child=e.child,t.memoizedProps=e.memoizedProps,t.memoizedState=e.memoizedState,t.updateQueue=e.updateQueue,n=e.dependencies,t.dependencies=n===null?null:{lanes:n.lanes,firstContext:n.firstContext},t.sibling=e.sibling,t.index=e.index,t.ref=e.ref,t}function zr(e,n,t,r,l,o){var u=2;if(r=e,typeof e=="function")Pu(e)&&(u=1);else if(typeof e=="string")u=5;else e:switch(e){case Dn:return xn(t.children,l,o,n);case Qo:u=8,l|=8;break;case Ql:return e=Ee(12,t,n,l|2),e.elementType=Ql,e.lanes=o,e;case Kl:return e=Ee(13,t,n,l),e.elementType=Kl,e.lanes=o,e;case Yl:return e=Ee(19,t,n,l),e.elementType=Yl,e.lanes=o,e;case os:return cl(t,l,o,n);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case rs:u=10;break e;case ls:u=9;break e;case Ko:u=11;break e;case Yo:u=14;break e;case Ge:u=16,r=null;break e}throw Error(y(130,e==null?e:typeof e,""))}return n=Ee(u,t,n,l),n.elementType=e,n.type=r,n.lanes=o,n}function xn(e,n,t,r){return e=Ee(7,e,r,n),e.lanes=t,e}function cl(e,n,t,r){return e=Ee(22,e,r,n),e.elementType=os,e.lanes=t,e.stateNode={isHidden:!1},e}function Al(e,n,t){return e=Ee(6,e,null,n),e.lanes=t,e}function Bl(e,n,t){return n=Ee(4,e.children!==null?e.children:[],e.key,n),n.lanes=t,n.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},n}function Ed(e,n,t,r,l){this.tag=n,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Cl(0),this.expirationTimes=Cl(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Cl(0),this.identifierPrefix=r,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function zu(e,n,t,r,l,o,u,i,s){return e=new Ed(e,n,t,i,s),n===1?(n=1,o===!0&&(n|=8)):n=0,o=Ee(3,null,null,n),e.current=o,o.stateNode=e,o.memoizedState={element:r,isDehydrated:t,cache:null,transitions:null,pendingSuspenseBoundaries:null},fu(o),e}function Cd(e,n,t){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(ec)}catch(e){console.error(e)}}ec(),qi.exports=ge;var zd=qi.exports,nc,$i=zd;nc=$i.createRoot,$i.hydrateRoot;function Ld(){return $.jsxs("svg",{width:"137",height:"40",viewBox:"0 0 137 40",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[$.jsx("path",{d:"M24.1831 16.0007H16.1225V24.0004H24.1831V16.0007Z",fill:"#161616"}),$.jsx("path",{d:"M32.2436 5.44985V0H8.06062V5.44985C8.06062 6.8587 6.91086 7.99978 5.4913 7.99978H0V32.0002H5.4913C6.91086 32.0002 8.06062 33.1413 8.06062 34.5502V40H32.2436V34.5502C32.2436 33.1413 33.3934 32.0002 34.8129 32.0002H40.3042V7.99978H34.8129C33.3934 7.99978 32.2436 6.8587 32.2436 5.44985ZM32.2436 29.4492C32.2436 30.858 31.0939 31.9991 29.6743 31.9991H10.6311C9.2115 31.9991 8.06174 30.858 8.06174 29.4492V10.5497C8.06174 9.14086 9.2115 7.99978 10.6311 7.99978H29.6743C31.0939 7.99978 32.2436 9.14086 32.2436 10.5497V29.4492Z",fill:"#161616"}),$.jsx("path",{d:"M64.0092 7.99974H60.4546V31.9991H76.2523V28.6047H64.0092V7.99974Z",fill:"#161616"}),$.jsx("path",{d:"M86.5004 15.0661H85.2364C81.4368 15.0661 77.6035 17.3783 77.6035 22.5426V25.0525C77.6035 29.7335 80.3329 32.529 84.9039 32.529H86.834C90.6908 32.529 93.4348 30.2757 93.9979 26.6469L94.0472 26.3269H90.3863L90.3258 26.5247C89.784 28.3046 88.3678 29.1346 85.869 29.1346C82.6257 29.1346 81.0953 27.7047 81.0584 24.637H94.1334V22.5426C94.1334 17.3783 90.3001 15.0661 86.5004 15.0661ZM81.1636 21.6371C81.5263 19.386 82.9134 18.4605 85.8679 18.4605C88.8223 18.4605 90.2083 19.386 90.571 21.6371H81.1636Z",fill:"#161616"}),$.jsx("path",{d:"M101.226 7.99974H97.6722V15.0662H95.31V18.4606H97.6722V25.1837C97.6722 31.1135 101.307 31.9991 103.475 31.9991H105.717V28.6047H104.44C102.157 28.6047 101.226 27.4603 101.226 24.6559V18.4617H105.717V15.0673H101.226V7.99974Z",fill:"#161616"}),$.jsx("path",{d:"M113.234 7.99974H109.681V15.0662H107.318V18.4606H109.681V25.1837C109.681 31.1135 113.316 31.9991 115.483 31.9991H117.726V28.6047H116.448C114.165 28.6047 113.234 27.4603 113.234 24.6559V18.4617H117.726V15.0673H113.234V7.99974Z",fill:"#161616"}),$.jsx("path",{d:"M136.034 28.6046C135.33 28.6046 135.016 28.3135 135.016 27.6602V21.8815C135.016 15.9517 131.381 15.0661 129.214 15.0661H125.954C123.135 15.0661 120.118 17.115 120.118 20.1649V20.4426H123.671V20.1649C123.671 19.2249 124.83 18.4616 126.253 18.4616H128.249C130.799 18.4616 131.35 19.3727 131.452 21.4071H126.319C122.35 21.4071 119.684 23.5092 119.684 26.638V27.0014C119.684 28.6535 120.33 32.4967 126.319 32.4967C127.848 32.4967 130.52 32.2312 131.958 30.5379C132.829 32.0012 134.664 32.0012 136.034 32.0012H136.314V28.6069H136.034V28.6046ZM131.462 26.8014C131.462 28.6869 128.446 29.0991 127.283 29.0991C123.898 29.0991 123.237 28.2802 123.237 26.8669C123.237 25.2981 124.636 24.4692 127.283 24.4692H131.462V26.8014Z",fill:"#161616"})]})}function Td(){return $.jsx("svg",{width:"16",height:"13",viewBox:"0 0 16 13",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:$.jsx("path",{d:"M14.4373 2.55366V5.21163H13.2678V3.332H12.4534V2.41123H11.4604V0H8.97894V1.94985H7.01906V0H4.53761V2.41123H3.54463V3.332H2.73019V5.21163H1.56068V2.55366H0V6.94885H0.850552V7.65697H1.7011V9.35807H3.96991V10.7222H2.48144V12.4774H4.4674V10.5978H6.52357V8.9669H9.47643V10.5978H11.5326V12.4774H13.5186V10.7222H12.0301V9.35807H14.2989V7.65697H15.1494V6.94885H16V2.55366H14.4393H14.4373ZM6.56971 7.12738H5.32798V5.001H6.56971V7.12738ZM10.668 7.12738H9.42628V5.001H10.668V7.12738Z",fill:"#FDFEFF"})})}function Rd(){return $.jsx("div",{className:"fixed bg-white w-[100dvh] p-0 h-[100dvh] flex items-center justify-center",children:$.jsxs("div",{className:"max-w-[893px] w-full border p-10 flex flex-col gap-5",children:[$.jsx(Ld,{}),$.jsxs("div",{className:"flex gap-2 flex-col max-w-[600px]",children:[$.jsx("h1",{className:"font-semibold text-3xl",children:"Experience the new ADE"}),$.jsx("h3",{className:"text-lg",children:"We have launched the next-generation Agent Development Environment (ADE) for interacting with agents both in the cloud and locally."}),$.jsx("p",{className:"mt-10",children:"The old Letta chat UI is no longer supported past Letta version 0.5.0. To use the old chat interface, please downgrade your Letta version."}),$.jsx("div",{className:"flex mt-3",children:$.jsxs("a",{href:"https://app.letta.com",className:"bg-black flex gap-3 items-center px-4 py-3 text-white text-bold",children:[$.jsx(Td,{}),"Open the new ADE"]})})]})]})})}const Md=nc(document.getElementById("root"));Md.render($.jsx($o.StrictMode,{children:$.jsx(Rd,{})})); +`+o.stack}return{value:e,source:n,stack:l,digest:null}}function Ul(e,n,t){return{value:e,source:null,stack:t??null,digest:n??null}}function Co(e,n){try{console.error(n.value)}catch(t){setTimeout(function(){throw t})}}var rd=typeof WeakMap=="function"?WeakMap:Map;function Pa(e,n,t){t=Be(-1,t),t.tag=3,t.payload={element:null};var r=n.value;return t.callback=function(){Xr||(Xr=!0,Oo=r),Co(e,n)},t}function za(e,n,t){t=Be(-1,t),t.tag=3;var r=e.type.getDerivedStateFromError;if(typeof r=="function"){var l=n.value;t.payload=function(){return r(l)},t.callback=function(){Co(e,n)}}var o=e.stateNode;return o!==null&&typeof o.componentDidCatch=="function"&&(t.callback=function(){Co(e,n),typeof r!="function"&&(sn===null?sn=new Set([this]):sn.add(this));var u=n.stack;this.componentDidCatch(n.value,{componentStack:u!==null?u:""})}),t}function Ci(e,n,t){var r=e.pingCache;if(r===null){r=e.pingCache=new rd;var l=new Set;r.set(n,l)}else l=r.get(n),l===void 0&&(l=new Set,r.set(n,l));l.has(t)||(l.add(t),e=yd.bind(null,e,n,t),n.then(e,e))}function xi(e){do{var n;if((n=e.tag===13)&&(n=e.memoizedState,n=n!==null?n.dehydrated!==null:!0),n)return e;e=e.return}while(e!==null);return null}function _i(e,n,t,r,l){return e.mode&1?(e.flags|=65536,e.lanes=l,e):(e===n?e.flags|=65536:(e.flags|=128,t.flags|=131072,t.flags&=-52805,t.tag===1&&(t.alternate===null?t.tag=17:(n=Be(-1,1),n.tag=2,un(t,n,1))),t.lanes|=1),e)}var ld=Ze.ReactCurrentOwner,ce=!1;function oe(e,n,t,r){n.child=e===null?ua(n,null,t,r):et(n,e.child,t,r)}function Ni(e,n,t,r,l){t=t.render;var o=n.ref;return Xn(n,l),r=vu(e,n,t,r,o,l),t=yu(),e!==null&&!ce?(n.updateQueue=e.updateQueue,n.flags&=-2053,e.lanes&=~l,Ye(e,n,l)):(V&&t&&lu(n),n.flags|=1,oe(e,n,r,l),n.child)}function Pi(e,n,t,r,l){if(e===null){var o=t.type;return typeof o=="function"&&!Pu(o)&&o.defaultProps===void 0&&t.compare===null&&t.defaultProps===void 0?(n.tag=15,n.type=o,La(e,n,o,r,l)):(e=zr(t.type,null,r,n,n.mode,l),e.ref=n.ref,e.return=n,n.child=e)}if(o=e.child,!(e.lanes&l)){var u=o.memoizedProps;if(t=t.compare,t=t!==null?t:Vt,t(u,r)&&e.ref===n.ref)return Ye(e,n,l)}return n.flags|=1,e=cn(o,r),e.ref=n.ref,e.return=n,n.child=e}function La(e,n,t,r,l){if(e!==null){var o=e.memoizedProps;if(Vt(o,r)&&e.ref===n.ref)if(ce=!1,n.pendingProps=r=o,(e.lanes&l)!==0)e.flags&131072&&(ce=!0);else return n.lanes=e.lanes,Ye(e,n,l)}return xo(e,n,t,r,l)}function Ta(e,n,t){var r=n.pendingProps,l=r.children,o=e!==null?e.memoizedState:null;if(r.mode==="hidden")if(!(n.mode&1))n.memoizedState={baseLanes:0,cachePool:null,transitions:null},O(Wn,me),me|=t;else{if(!(t&1073741824))return e=o!==null?o.baseLanes|t:t,n.lanes=n.childLanes=1073741824,n.memoizedState={baseLanes:e,cachePool:null,transitions:null},n.updateQueue=null,O(Wn,me),me|=e,null;n.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=o!==null?o.baseLanes:t,O(Wn,me),me|=r}else o!==null?(r=o.baseLanes|t,n.memoizedState=null):r=t,O(Wn,me),me|=r;return oe(e,n,l,t),n.child}function Ra(e,n){var t=n.ref;(e===null&&t!==null||e!==null&&e.ref!==t)&&(n.flags|=512,n.flags|=2097152)}function xo(e,n,t,r,l){var o=de(t)?_n:le.current;return o=qn(n,o),Xn(n,l),t=vu(e,n,t,r,o,l),r=yu(),e!==null&&!ce?(n.updateQueue=e.updateQueue,n.flags&=-2053,e.lanes&=~l,Ye(e,n,l)):(V&&r&&lu(n),n.flags|=1,oe(e,n,t,l),n.child)}function zi(e,n,t,r,l){if(de(t)){var o=!0;Hr(n)}else o=!1;if(Xn(n,l),n.stateNode===null)_r(e,n),la(n,t,r),Eo(n,t,r,l),r=!0;else if(e===null){var u=n.stateNode,i=n.memoizedProps;u.props=i;var s=u.context,c=t.contextType;typeof c=="object"&&c!==null?c=xe(c):(c=de(t)?_n:le.current,c=qn(n,c));var h=t.getDerivedStateFromProps,m=typeof h=="function"||typeof u.getSnapshotBeforeUpdate=="function";m||typeof u.UNSAFE_componentWillReceiveProps!="function"&&typeof u.componentWillReceiveProps!="function"||(i!==r||s!==c)&&wi(n,u,r,c),Je=!1;var p=n.memoizedState;u.state=p,Wr(n,r,u,l),s=n.memoizedState,i!==r||p!==s||fe.current||Je?(typeof h=="function"&&(ko(n,t,h,r),s=n.memoizedState),(i=Je||gi(n,t,i,r,p,s,c))?(m||typeof u.UNSAFE_componentWillMount!="function"&&typeof u.componentWillMount!="function"||(typeof u.componentWillMount=="function"&&u.componentWillMount(),typeof u.UNSAFE_componentWillMount=="function"&&u.UNSAFE_componentWillMount()),typeof u.componentDidMount=="function"&&(n.flags|=4194308)):(typeof u.componentDidMount=="function"&&(n.flags|=4194308),n.memoizedProps=r,n.memoizedState=s),u.props=r,u.state=s,u.context=c,r=i):(typeof u.componentDidMount=="function"&&(n.flags|=4194308),r=!1)}else{u=n.stateNode,ta(e,n),i=n.memoizedProps,c=n.type===n.elementType?i:ze(n.type,i),u.props=c,m=n.pendingProps,p=u.context,s=t.contextType,typeof s=="object"&&s!==null?s=xe(s):(s=de(t)?_n:le.current,s=qn(n,s));var g=t.getDerivedStateFromProps;(h=typeof g=="function"||typeof u.getSnapshotBeforeUpdate=="function")||typeof u.UNSAFE_componentWillReceiveProps!="function"&&typeof u.componentWillReceiveProps!="function"||(i!==m||p!==s)&&wi(n,u,r,s),Je=!1,p=n.memoizedState,u.state=p,Wr(n,r,u,l);var w=n.memoizedState;i!==m||p!==w||fe.current||Je?(typeof g=="function"&&(ko(n,t,g,r),w=n.memoizedState),(c=Je||gi(n,t,c,r,p,w,s)||!1)?(h||typeof u.UNSAFE_componentWillUpdate!="function"&&typeof u.componentWillUpdate!="function"||(typeof u.componentWillUpdate=="function"&&u.componentWillUpdate(r,w,s),typeof u.UNSAFE_componentWillUpdate=="function"&&u.UNSAFE_componentWillUpdate(r,w,s)),typeof u.componentDidUpdate=="function"&&(n.flags|=4),typeof u.getSnapshotBeforeUpdate=="function"&&(n.flags|=1024)):(typeof u.componentDidUpdate!="function"||i===e.memoizedProps&&p===e.memoizedState||(n.flags|=4),typeof u.getSnapshotBeforeUpdate!="function"||i===e.memoizedProps&&p===e.memoizedState||(n.flags|=1024),n.memoizedProps=r,n.memoizedState=w),u.props=r,u.state=w,u.context=s,r=c):(typeof u.componentDidUpdate!="function"||i===e.memoizedProps&&p===e.memoizedState||(n.flags|=4),typeof u.getSnapshotBeforeUpdate!="function"||i===e.memoizedProps&&p===e.memoizedState||(n.flags|=1024),r=!1)}return _o(e,n,t,r,o,l)}function _o(e,n,t,r,l,o){Ra(e,n);var u=(n.flags&128)!==0;if(!r&&!u)return l&&pi(n,t,!1),Ye(e,n,o);r=n.stateNode,ld.current=n;var i=u&&typeof t.getDerivedStateFromError!="function"?null:r.render();return n.flags|=1,e!==null&&u?(n.child=et(n,e.child,null,o),n.child=et(n,null,i,o)):oe(e,n,i,o),n.memoizedState=r.state,l&&pi(n,t,!0),n.child}function Ma(e){var n=e.stateNode;n.pendingContext?di(e,n.pendingContext,n.pendingContext!==n.context):n.context&&di(e,n.context,!1),du(e,n.containerInfo)}function Li(e,n,t,r,l){return bn(),uu(l),n.flags|=256,oe(e,n,t,r),n.child}var No={dehydrated:null,treeContext:null,retryLane:0};function Po(e){return{baseLanes:e,cachePool:null,transitions:null}}function Oa(e,n,t){var r=n.pendingProps,l=F.current,o=!1,u=(n.flags&128)!==0,i;if((i=u)||(i=e!==null&&e.memoizedState===null?!1:(l&2)!==0),i?(o=!0,n.flags&=-129):(e===null||e.memoizedState!==null)&&(l|=1),O(F,l&1),e===null)return wo(n),e=n.memoizedState,e!==null&&(e=e.dehydrated,e!==null)?(n.mode&1?e.data==="$!"?n.lanes=8:n.lanes=1073741824:n.lanes=1,null):(u=r.children,e=r.fallback,o?(r=n.mode,o=n.child,u={mode:"hidden",children:u},!(r&1)&&o!==null?(o.childLanes=0,o.pendingProps=u):o=cl(u,r,0,null),e=xn(e,r,t,null),o.return=n,e.return=n,o.sibling=e,n.child=o,n.child.memoizedState=Po(t),n.memoizedState=No,e):Su(n,u));if(l=e.memoizedState,l!==null&&(i=l.dehydrated,i!==null))return od(e,n,u,r,i,l,t);if(o){o=r.fallback,u=n.mode,l=e.child,i=l.sibling;var s={mode:"hidden",children:r.children};return!(u&1)&&n.child!==l?(r=n.child,r.childLanes=0,r.pendingProps=s,n.deletions=null):(r=cn(l,s),r.subtreeFlags=l.subtreeFlags&14680064),i!==null?o=cn(i,o):(o=xn(o,u,t,null),o.flags|=2),o.return=n,r.return=n,r.sibling=o,n.child=r,r=o,o=n.child,u=e.child.memoizedState,u=u===null?Po(t):{baseLanes:u.baseLanes|t,cachePool:null,transitions:u.transitions},o.memoizedState=u,o.childLanes=e.childLanes&~t,n.memoizedState=No,r}return o=e.child,e=o.sibling,r=cn(o,{mode:"visible",children:r.children}),!(n.mode&1)&&(r.lanes=t),r.return=n,r.sibling=null,e!==null&&(t=n.deletions,t===null?(n.deletions=[e],n.flags|=16):t.push(e)),n.child=r,n.memoizedState=null,r}function Su(e,n){return n=cl({mode:"visible",children:n},e.mode,0,null),n.return=e,e.child=n}function pr(e,n,t,r){return r!==null&&uu(r),et(n,e.child,null,t),e=Su(n,n.pendingProps.children),e.flags|=2,n.memoizedState=null,e}function od(e,n,t,r,l,o,u){if(t)return n.flags&256?(n.flags&=-257,r=Ul(Error(y(422))),pr(e,n,u,r)):n.memoizedState!==null?(n.child=e.child,n.flags|=128,null):(o=r.fallback,l=n.mode,r=cl({mode:"visible",children:r.children},l,0,null),o=xn(o,l,u,null),o.flags|=2,r.return=n,o.return=n,r.sibling=o,n.child=r,n.mode&1&&et(n,e.child,null,u),n.child.memoizedState=Po(u),n.memoizedState=No,o);if(!(n.mode&1))return pr(e,n,u,null);if(l.data==="$!"){if(r=l.nextSibling&&l.nextSibling.dataset,r)var i=r.dgst;return r=i,o=Error(y(419)),r=Ul(o,r,void 0),pr(e,n,u,r)}if(i=(u&e.childLanes)!==0,ce||i){if(r=J,r!==null){switch(u&-u){case 4:l=2;break;case 16:l=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:l=32;break;case 536870912:l=268435456;break;default:l=0}l=l&(r.suspendedLanes|u)?0:l,l!==0&&l!==o.retryLane&&(o.retryLane=l,Ke(e,l),Me(r,e,l,-1))}return Nu(),r=Ul(Error(y(421))),pr(e,n,u,r)}return l.data==="$?"?(n.flags|=128,n.child=e.child,n=gd.bind(null,e),l._reactRetry=n,null):(e=o.treeContext,he=on(l.nextSibling),ve=n,V=!0,Te=null,e!==null&&(Se[ke++]=$e,Se[ke++]=Ae,Se[ke++]=Nn,$e=e.id,Ae=e.overflow,Nn=n),n=Su(n,r.children),n.flags|=4096,n)}function Ti(e,n,t){e.lanes|=n;var r=e.alternate;r!==null&&(r.lanes|=n),So(e.return,n,t)}function $l(e,n,t,r,l){var o=e.memoizedState;o===null?e.memoizedState={isBackwards:n,rendering:null,renderingStartTime:0,last:r,tail:t,tailMode:l}:(o.isBackwards=n,o.rendering=null,o.renderingStartTime=0,o.last=r,o.tail=t,o.tailMode=l)}function Da(e,n,t){var r=n.pendingProps,l=r.revealOrder,o=r.tail;if(oe(e,n,r.children,t),r=F.current,r&2)r=r&1|2,n.flags|=128;else{if(e!==null&&e.flags&128)e:for(e=n.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&Ti(e,t,n);else if(e.tag===19)Ti(e,t,n);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===n)break e;for(;e.sibling===null;){if(e.return===null||e.return===n)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(O(F,r),!(n.mode&1))n.memoizedState=null;else switch(l){case"forwards":for(t=n.child,l=null;t!==null;)e=t.alternate,e!==null&&Qr(e)===null&&(l=t),t=t.sibling;t=l,t===null?(l=n.child,n.child=null):(l=t.sibling,t.sibling=null),$l(n,!1,l,t,o);break;case"backwards":for(t=null,l=n.child,n.child=null;l!==null;){if(e=l.alternate,e!==null&&Qr(e)===null){n.child=l;break}e=l.sibling,l.sibling=t,t=l,l=e}$l(n,!0,t,null,o);break;case"together":$l(n,!1,null,null,void 0);break;default:n.memoizedState=null}return n.child}function _r(e,n){!(n.mode&1)&&e!==null&&(e.alternate=null,n.alternate=null,n.flags|=2)}function Ye(e,n,t){if(e!==null&&(n.dependencies=e.dependencies),zn|=n.lanes,!(t&n.childLanes))return null;if(e!==null&&n.child!==e.child)throw Error(y(153));if(n.child!==null){for(e=n.child,t=cn(e,e.pendingProps),n.child=t,t.return=n;e.sibling!==null;)e=e.sibling,t=t.sibling=cn(e,e.pendingProps),t.return=n;t.sibling=null}return n.child}function ud(e,n,t){switch(n.tag){case 3:Ma(n),bn();break;case 5:ia(n);break;case 1:de(n.type)&&Hr(n);break;case 4:du(n,n.stateNode.containerInfo);break;case 10:var r=n.type._context,l=n.memoizedProps.value;O(Ar,r._currentValue),r._currentValue=l;break;case 13:if(r=n.memoizedState,r!==null)return r.dehydrated!==null?(O(F,F.current&1),n.flags|=128,null):t&n.child.childLanes?Oa(e,n,t):(O(F,F.current&1),e=Ye(e,n,t),e!==null?e.sibling:null);O(F,F.current&1);break;case 19:if(r=(t&n.childLanes)!==0,e.flags&128){if(r)return Da(e,n,t);n.flags|=128}if(l=n.memoizedState,l!==null&&(l.rendering=null,l.tail=null,l.lastEffect=null),O(F,F.current),r)break;return null;case 22:case 23:return n.lanes=0,Ta(e,n,t)}return Ye(e,n,t)}var ja,zo,Ia,Va;ja=function(e,n){for(var t=n.child;t!==null;){if(t.tag===5||t.tag===6)e.appendChild(t.stateNode);else if(t.tag!==4&&t.child!==null){t.child.return=t,t=t.child;continue}if(t===n)break;for(;t.sibling===null;){if(t.return===null||t.return===n)return;t=t.return}t.sibling.return=t.return,t=t.sibling}};zo=function(){};Ia=function(e,n,t,r){var l=e.memoizedProps;if(l!==r){e=n.stateNode,En(Fe.current);var o=null;switch(t){case"input":l=Xl(e,l),r=Xl(e,r),o=[];break;case"select":l=U({},l,{value:void 0}),r=U({},r,{value:void 0}),o=[];break;case"textarea":l=ql(e,l),r=ql(e,r),o=[];break;default:typeof l.onClick!="function"&&typeof r.onClick=="function"&&(e.onclick=Vr)}eo(t,r);var u;t=null;for(c in l)if(!r.hasOwnProperty(c)&&l.hasOwnProperty(c)&&l[c]!=null)if(c==="style"){var i=l[c];for(u in i)i.hasOwnProperty(u)&&(t||(t={}),t[u]="")}else c!=="dangerouslySetInnerHTML"&&c!=="children"&&c!=="suppressContentEditableWarning"&&c!=="suppressHydrationWarning"&&c!=="autoFocus"&&(Tt.hasOwnProperty(c)?o||(o=[]):(o=o||[]).push(c,null));for(c in r){var s=r[c];if(i=l!=null?l[c]:void 0,r.hasOwnProperty(c)&&s!==i&&(s!=null||i!=null))if(c==="style")if(i){for(u in i)!i.hasOwnProperty(u)||s&&s.hasOwnProperty(u)||(t||(t={}),t[u]="");for(u in s)s.hasOwnProperty(u)&&i[u]!==s[u]&&(t||(t={}),t[u]=s[u])}else t||(o||(o=[]),o.push(c,t)),t=s;else c==="dangerouslySetInnerHTML"?(s=s?s.__html:void 0,i=i?i.__html:void 0,s!=null&&i!==s&&(o=o||[]).push(c,s)):c==="children"?typeof s!="string"&&typeof s!="number"||(o=o||[]).push(c,""+s):c!=="suppressContentEditableWarning"&&c!=="suppressHydrationWarning"&&(Tt.hasOwnProperty(c)?(s!=null&&c==="onScroll"&&D("scroll",e),o||i===s||(o=[])):(o=o||[]).push(c,s))}t&&(o=o||[]).push("style",t);var c=o;(n.updateQueue=c)&&(n.flags|=4)}};Va=function(e,n,t,r){t!==r&&(n.flags|=4)};function ht(e,n){if(!V)switch(e.tailMode){case"hidden":n=e.tail;for(var t=null;n!==null;)n.alternate!==null&&(t=n),n=n.sibling;t===null?e.tail=null:t.sibling=null;break;case"collapsed":t=e.tail;for(var r=null;t!==null;)t.alternate!==null&&(r=t),t=t.sibling;r===null?n||e.tail===null?e.tail=null:e.tail.sibling=null:r.sibling=null}}function te(e){var n=e.alternate!==null&&e.alternate.child===e.child,t=0,r=0;if(n)for(var l=e.child;l!==null;)t|=l.lanes|l.childLanes,r|=l.subtreeFlags&14680064,r|=l.flags&14680064,l.return=e,l=l.sibling;else for(l=e.child;l!==null;)t|=l.lanes|l.childLanes,r|=l.subtreeFlags,r|=l.flags,l.return=e,l=l.sibling;return e.subtreeFlags|=r,e.childLanes=t,n}function id(e,n,t){var r=n.pendingProps;switch(ou(n),n.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return te(n),null;case 1:return de(n.type)&&Fr(),te(n),null;case 3:return r=n.stateNode,nt(),j(fe),j(le),mu(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),(e===null||e.child===null)&&(fr(n)?n.flags|=4:e===null||e.memoizedState.isDehydrated&&!(n.flags&256)||(n.flags|=1024,Te!==null&&(Io(Te),Te=null))),zo(e,n),te(n),null;case 5:pu(n);var l=En(At.current);if(t=n.type,e!==null&&n.stateNode!=null)Ia(e,n,t,r,l),e.ref!==n.ref&&(n.flags|=512,n.flags|=2097152);else{if(!r){if(n.stateNode===null)throw Error(y(166));return te(n),null}if(e=En(Fe.current),fr(n)){r=n.stateNode,t=n.type;var o=n.memoizedProps;switch(r[Ie]=n,r[Ut]=o,e=(n.mode&1)!==0,t){case"dialog":D("cancel",r),D("close",r);break;case"iframe":case"object":case"embed":D("load",r);break;case"video":case"audio":for(l=0;l<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=u.createElement(t,{is:r.is}):(e=u.createElement(t),t==="select"&&(u=e,r.multiple?u.multiple=!0:r.size&&(u.size=r.size))):e=u.createElementNS(e,t),e[Ie]=n,e[Ut]=r,ja(e,n,!1,!1),n.stateNode=e;e:{switch(u=no(t,r),t){case"dialog":D("cancel",e),D("close",e),l=r;break;case"iframe":case"object":case"embed":D("load",e),l=r;break;case"video":case"audio":for(l=0;lrt&&(n.flags|=128,r=!0,ht(o,!1),n.lanes=4194304)}else{if(!r)if(e=Qr(u),e!==null){if(n.flags|=128,r=!0,t=e.updateQueue,t!==null&&(n.updateQueue=t,n.flags|=4),ht(o,!0),o.tail===null&&o.tailMode==="hidden"&&!u.alternate&&!V)return te(n),null}else 2*Q()-o.renderingStartTime>rt&&t!==1073741824&&(n.flags|=128,r=!0,ht(o,!1),n.lanes=4194304);o.isBackwards?(u.sibling=n.child,n.child=u):(t=o.last,t!==null?t.sibling=u:n.child=u,o.last=u)}return o.tail!==null?(n=o.tail,o.rendering=n,o.tail=n.sibling,o.renderingStartTime=Q(),n.sibling=null,t=F.current,O(F,r?t&1|2:t&1),n):(te(n),null);case 22:case 23:return _u(),r=n.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(n.flags|=8192),r&&n.mode&1?me&1073741824&&(te(n),n.subtreeFlags&6&&(n.flags|=8192)):te(n),null;case 24:return null;case 25:return null}throw Error(y(156,n.tag))}function sd(e,n){switch(ou(n),n.tag){case 1:return de(n.type)&&Fr(),e=n.flags,e&65536?(n.flags=e&-65537|128,n):null;case 3:return nt(),j(fe),j(le),mu(),e=n.flags,e&65536&&!(e&128)?(n.flags=e&-65537|128,n):null;case 5:return pu(n),null;case 13:if(j(F),e=n.memoizedState,e!==null&&e.dehydrated!==null){if(n.alternate===null)throw Error(y(340));bn()}return e=n.flags,e&65536?(n.flags=e&-65537|128,n):null;case 19:return j(F),null;case 4:return nt(),null;case 10:return au(n.type._context),null;case 22:case 23:return _u(),null;case 24:return null;default:return null}}var mr=!1,re=!1,ad=typeof WeakSet=="function"?WeakSet:Set,k=null;function Bn(e,n){var t=e.ref;if(t!==null)if(typeof t=="function")try{t(null)}catch(r){A(e,n,r)}else t.current=null}function Lo(e,n,t){try{t()}catch(r){A(e,n,r)}}var Ri=!1;function cd(e,n){if(fo=Dr,e=$s(),ru(e)){if("selectionStart"in e)var t={start:e.selectionStart,end:e.selectionEnd};else e:{t=(t=e.ownerDocument)&&t.defaultView||window;var r=t.getSelection&&t.getSelection();if(r&&r.rangeCount!==0){t=r.anchorNode;var l=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{t.nodeType,o.nodeType}catch{t=null;break e}var u=0,i=-1,s=-1,c=0,h=0,m=e,p=null;n:for(;;){for(var g;m!==t||l!==0&&m.nodeType!==3||(i=u+l),m!==o||r!==0&&m.nodeType!==3||(s=u+r),m.nodeType===3&&(u+=m.nodeValue.length),(g=m.firstChild)!==null;)p=m,m=g;for(;;){if(m===e)break n;if(p===t&&++c===l&&(i=u),p===o&&++h===r&&(s=u),(g=m.nextSibling)!==null)break;m=p,p=m.parentNode}m=g}t=i===-1||s===-1?null:{start:i,end:s}}else t=null}t=t||{start:0,end:0}}else t=null;for(po={focusedElem:e,selectionRange:t},Dr=!1,k=n;k!==null;)if(n=k,e=n.child,(n.subtreeFlags&1028)!==0&&e!==null)e.return=n,k=e;else for(;k!==null;){n=k;try{var w=n.alternate;if(n.flags&1024)switch(n.tag){case 0:case 11:case 15:break;case 1:if(w!==null){var S=w.memoizedProps,I=w.memoizedState,f=n.stateNode,a=f.getSnapshotBeforeUpdate(n.elementType===n.type?S:ze(n.type,S),I);f.__reactInternalSnapshotBeforeUpdate=a}break;case 3:var d=n.stateNode.containerInfo;d.nodeType===1?d.textContent="":d.nodeType===9&&d.documentElement&&d.removeChild(d.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(y(163))}}catch(v){A(n,n.return,v)}if(e=n.sibling,e!==null){e.return=n.return,k=e;break}k=n.return}return w=Ri,Ri=!1,w}function Pt(e,n,t){var r=n.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var l=r=r.next;do{if((l.tag&e)===e){var o=l.destroy;l.destroy=void 0,o!==void 0&&Lo(n,t,o)}l=l.next}while(l!==r)}}function sl(e,n){if(n=n.updateQueue,n=n!==null?n.lastEffect:null,n!==null){var t=n=n.next;do{if((t.tag&e)===e){var r=t.create;t.destroy=r()}t=t.next}while(t!==n)}}function To(e){var n=e.ref;if(n!==null){var t=e.stateNode;switch(e.tag){case 5:e=t;break;default:e=t}typeof n=="function"?n(e):n.current=e}}function Fa(e){var n=e.alternate;n!==null&&(e.alternate=null,Fa(n)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(n=e.stateNode,n!==null&&(delete n[Ie],delete n[Ut],delete n[vo],delete n[Kf],delete n[Yf])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Ha(e){return e.tag===5||e.tag===3||e.tag===4}function Mi(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Ha(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Ro(e,n,t){var r=e.tag;if(r===5||r===6)e=e.stateNode,n?t.nodeType===8?t.parentNode.insertBefore(e,n):t.insertBefore(e,n):(t.nodeType===8?(n=t.parentNode,n.insertBefore(e,t)):(n=t,n.appendChild(e)),t=t._reactRootContainer,t!=null||n.onclick!==null||(n.onclick=Vr));else if(r!==4&&(e=e.child,e!==null))for(Ro(e,n,t),e=e.sibling;e!==null;)Ro(e,n,t),e=e.sibling}function Mo(e,n,t){var r=e.tag;if(r===5||r===6)e=e.stateNode,n?t.insertBefore(e,n):t.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(Mo(e,n,t),e=e.sibling;e!==null;)Mo(e,n,t),e=e.sibling}var q=null,Le=!1;function Xe(e,n,t){for(t=t.child;t!==null;)Ua(e,n,t),t=t.sibling}function Ua(e,n,t){if(Ve&&typeof Ve.onCommitFiberUnmount=="function")try{Ve.onCommitFiberUnmount(el,t)}catch{}switch(t.tag){case 5:re||Bn(t,n);case 6:var r=q,l=Le;q=null,Xe(e,n,t),q=r,Le=l,q!==null&&(Le?(e=q,t=t.stateNode,e.nodeType===8?e.parentNode.removeChild(t):e.removeChild(t)):q.removeChild(t.stateNode));break;case 18:q!==null&&(Le?(e=q,t=t.stateNode,e.nodeType===8?Dl(e.parentNode,t):e.nodeType===1&&Dl(e,t),jt(e)):Dl(q,t.stateNode));break;case 4:r=q,l=Le,q=t.stateNode.containerInfo,Le=!0,Xe(e,n,t),q=r,Le=l;break;case 0:case 11:case 14:case 15:if(!re&&(r=t.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){l=r=r.next;do{var o=l,u=o.destroy;o=o.tag,u!==void 0&&(o&2||o&4)&&Lo(t,n,u),l=l.next}while(l!==r)}Xe(e,n,t);break;case 1:if(!re&&(Bn(t,n),r=t.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=t.memoizedProps,r.state=t.memoizedState,r.componentWillUnmount()}catch(i){A(t,n,i)}Xe(e,n,t);break;case 21:Xe(e,n,t);break;case 22:t.mode&1?(re=(r=re)||t.memoizedState!==null,Xe(e,n,t),re=r):Xe(e,n,t);break;default:Xe(e,n,t)}}function Oi(e){var n=e.updateQueue;if(n!==null){e.updateQueue=null;var t=e.stateNode;t===null&&(t=e.stateNode=new ad),n.forEach(function(r){var l=wd.bind(null,e,r);t.has(r)||(t.add(r),r.then(l,l))})}}function Pe(e,n){var t=n.deletions;if(t!==null)for(var r=0;rl&&(l=u),r&=~o}if(r=l,r=Q()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*dd(r/1960))-r,10e?16:e,nn===null)var r=!1;else{if(e=nn,nn=null,Gr=0,R&6)throw Error(y(331));var l=R;for(R|=4,k=e.current;k!==null;){var o=k,u=o.child;if(k.flags&16){var i=o.deletions;if(i!==null){for(var s=0;sQ()-Cu?Cn(e,0):Eu|=t),pe(e,n)}function Za(e,n){n===0&&(e.mode&1?(n=or,or<<=1,!(or&130023424)&&(or=4194304)):n=1);var t=ue();e=Ke(e,n),e!==null&&(Zt(e,n,t),pe(e,t))}function gd(e){var n=e.memoizedState,t=0;n!==null&&(t=n.retryLane),Za(e,t)}function wd(e,n){var t=0;switch(e.tag){case 13:var r=e.stateNode,l=e.memoizedState;l!==null&&(t=l.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(y(314))}r!==null&&r.delete(n),Za(e,t)}var Xa;Xa=function(e,n,t){if(e!==null)if(e.memoizedProps!==n.pendingProps||fe.current)ce=!0;else{if(!(e.lanes&t)&&!(n.flags&128))return ce=!1,ud(e,n,t);ce=!!(e.flags&131072)}else ce=!1,V&&n.flags&1048576&&qs(n,$r,n.index);switch(n.lanes=0,n.tag){case 2:var r=n.type;_r(e,n),e=n.pendingProps;var l=qn(n,le.current);Xn(n,t),l=vu(null,n,r,e,l,t);var o=yu();return n.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(n.tag=1,n.memoizedState=null,n.updateQueue=null,de(r)?(o=!0,Hr(n)):o=!1,n.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,fu(n),l.updater=ul,n.stateNode=l,l._reactInternals=n,Eo(n,r,e,t),n=_o(null,n,r,!0,o,t)):(n.tag=0,V&&o&&lu(n),oe(null,n,l,t),n=n.child),n;case 16:r=n.elementType;e:{switch(_r(e,n),e=n.pendingProps,l=r._init,r=l(r._payload),n.type=r,l=n.tag=kd(r),e=ze(r,e),l){case 0:n=xo(null,n,r,e,t);break e;case 1:n=zi(null,n,r,e,t);break e;case 11:n=Ni(null,n,r,e,t);break e;case 14:n=Pi(null,n,r,ze(r.type,e),t);break e}throw Error(y(306,r,""))}return n;case 0:return r=n.type,l=n.pendingProps,l=n.elementType===r?l:ze(r,l),xo(e,n,r,l,t);case 1:return r=n.type,l=n.pendingProps,l=n.elementType===r?l:ze(r,l),zi(e,n,r,l,t);case 3:e:{if(Ma(n),e===null)throw Error(y(387));r=n.pendingProps,o=n.memoizedState,l=o.element,ta(e,n),Wr(n,r,null,t);var u=n.memoizedState;if(r=u.element,o.isDehydrated)if(o={element:r,isDehydrated:!1,cache:u.cache,pendingSuspenseBoundaries:u.pendingSuspenseBoundaries,transitions:u.transitions},n.updateQueue.baseState=o,n.memoizedState=o,n.flags&256){l=tt(Error(y(423)),n),n=Li(e,n,r,t,l);break e}else if(r!==l){l=tt(Error(y(424)),n),n=Li(e,n,r,t,l);break e}else for(he=on(n.stateNode.containerInfo.firstChild),ve=n,V=!0,Te=null,t=ua(n,null,r,t),n.child=t;t;)t.flags=t.flags&-3|4096,t=t.sibling;else{if(bn(),r===l){n=Ye(e,n,t);break e}oe(e,n,r,t)}n=n.child}return n;case 5:return ia(n),e===null&&wo(n),r=n.type,l=n.pendingProps,o=e!==null?e.memoizedProps:null,u=l.children,mo(r,l)?u=null:o!==null&&mo(r,o)&&(n.flags|=32),Ra(e,n),oe(e,n,u,t),n.child;case 6:return e===null&&wo(n),null;case 13:return Oa(e,n,t);case 4:return du(n,n.stateNode.containerInfo),r=n.pendingProps,e===null?n.child=et(n,null,r,t):oe(e,n,r,t),n.child;case 11:return r=n.type,l=n.pendingProps,l=n.elementType===r?l:ze(r,l),Ni(e,n,r,l,t);case 7:return oe(e,n,n.pendingProps,t),n.child;case 8:return oe(e,n,n.pendingProps.children,t),n.child;case 12:return oe(e,n,n.pendingProps.children,t),n.child;case 10:e:{if(r=n.type._context,l=n.pendingProps,o=n.memoizedProps,u=l.value,O(Ar,r._currentValue),r._currentValue=u,o!==null)if(Oe(o.value,u)){if(o.children===l.children&&!fe.current){n=Ye(e,n,t);break e}}else for(o=n.child,o!==null&&(o.return=n);o!==null;){var i=o.dependencies;if(i!==null){u=o.child;for(var s=i.firstContext;s!==null;){if(s.context===r){if(o.tag===1){s=Be(-1,t&-t),s.tag=2;var c=o.updateQueue;if(c!==null){c=c.shared;var h=c.pending;h===null?s.next=s:(s.next=h.next,h.next=s),c.pending=s}}o.lanes|=t,s=o.alternate,s!==null&&(s.lanes|=t),So(o.return,t,n),i.lanes|=t;break}s=s.next}}else if(o.tag===10)u=o.type===n.type?null:o.child;else if(o.tag===18){if(u=o.return,u===null)throw Error(y(341));u.lanes|=t,i=u.alternate,i!==null&&(i.lanes|=t),So(u,t,n),u=o.sibling}else u=o.child;if(u!==null)u.return=o;else for(u=o;u!==null;){if(u===n){u=null;break}if(o=u.sibling,o!==null){o.return=u.return,u=o;break}u=u.return}o=u}oe(e,n,l.children,t),n=n.child}return n;case 9:return l=n.type,r=n.pendingProps.children,Xn(n,t),l=xe(l),r=r(l),n.flags|=1,oe(e,n,r,t),n.child;case 14:return r=n.type,l=ze(r,n.pendingProps),l=ze(r.type,l),Pi(e,n,r,l,t);case 15:return La(e,n,n.type,n.pendingProps,t);case 17:return r=n.type,l=n.pendingProps,l=n.elementType===r?l:ze(r,l),_r(e,n),n.tag=1,de(r)?(e=!0,Hr(n)):e=!1,Xn(n,t),la(n,r,l),Eo(n,r,l,t),_o(null,n,r,!0,e,t);case 19:return Da(e,n,t);case 22:return Ta(e,n,t)}throw Error(y(156,n.tag))};function Ga(e,n){return Es(e,n)}function Sd(e,n,t,r){this.tag=e,this.key=t,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=n,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Ee(e,n,t,r){return new Sd(e,n,t,r)}function Pu(e){return e=e.prototype,!(!e||!e.isReactComponent)}function kd(e){if(typeof e=="function")return Pu(e)?1:0;if(e!=null){if(e=e.$$typeof,e===Ko)return 11;if(e===Yo)return 14}return 2}function cn(e,n){var t=e.alternate;return t===null?(t=Ee(e.tag,n,e.key,e.mode),t.elementType=e.elementType,t.type=e.type,t.stateNode=e.stateNode,t.alternate=e,e.alternate=t):(t.pendingProps=n,t.type=e.type,t.flags=0,t.subtreeFlags=0,t.deletions=null),t.flags=e.flags&14680064,t.childLanes=e.childLanes,t.lanes=e.lanes,t.child=e.child,t.memoizedProps=e.memoizedProps,t.memoizedState=e.memoizedState,t.updateQueue=e.updateQueue,n=e.dependencies,t.dependencies=n===null?null:{lanes:n.lanes,firstContext:n.firstContext},t.sibling=e.sibling,t.index=e.index,t.ref=e.ref,t}function zr(e,n,t,r,l,o){var u=2;if(r=e,typeof e=="function")Pu(e)&&(u=1);else if(typeof e=="string")u=5;else e:switch(e){case Dn:return xn(t.children,l,o,n);case Qo:u=8,l|=8;break;case Ql:return e=Ee(12,t,n,l|2),e.elementType=Ql,e.lanes=o,e;case Kl:return e=Ee(13,t,n,l),e.elementType=Kl,e.lanes=o,e;case Yl:return e=Ee(19,t,n,l),e.elementType=Yl,e.lanes=o,e;case os:return cl(t,l,o,n);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case rs:u=10;break e;case ls:u=9;break e;case Ko:u=11;break e;case Yo:u=14;break e;case Ge:u=16,r=null;break e}throw Error(y(130,e==null?e:typeof e,""))}return n=Ee(u,t,n,l),n.elementType=e,n.type=r,n.lanes=o,n}function xn(e,n,t,r){return e=Ee(7,e,r,n),e.lanes=t,e}function cl(e,n,t,r){return e=Ee(22,e,r,n),e.elementType=os,e.lanes=t,e.stateNode={isHidden:!1},e}function Al(e,n,t){return e=Ee(6,e,null,n),e.lanes=t,e}function Bl(e,n,t){return n=Ee(4,e.children!==null?e.children:[],e.key,n),n.lanes=t,n.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},n}function Ed(e,n,t,r,l){this.tag=n,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Cl(0),this.expirationTimes=Cl(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Cl(0),this.identifierPrefix=r,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function zu(e,n,t,r,l,o,u,i,s){return e=new Ed(e,n,t,i,s),n===1?(n=1,o===!0&&(n|=8)):n=0,o=Ee(3,null,null,n),e.current=o,o.stateNode=e,o.memoizedState={element:r,isDehydrated:t,cache:null,transitions:null,pendingSuspenseBoundaries:null},fu(o),e}function Cd(e,n,t){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(ec)}catch(e){console.error(e)}}ec(),qi.exports=ge;var zd=qi.exports,nc,$i=zd;nc=$i.createRoot,$i.hydrateRoot;function Ld(){return $.jsxs("svg",{width:"137",height:"40",viewBox:"0 0 137 40",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[$.jsx("path",{d:"M24.1831 16.0007H16.1225V24.0004H24.1831V16.0007Z",fill:"#161616"}),$.jsx("path",{d:"M32.2436 5.44985V0H8.06062V5.44985C8.06062 6.8587 6.91086 7.99978 5.4913 7.99978H0V32.0002H5.4913C6.91086 32.0002 8.06062 33.1413 8.06062 34.5502V40H32.2436V34.5502C32.2436 33.1413 33.3934 32.0002 34.8129 32.0002H40.3042V7.99978H34.8129C33.3934 7.99978 32.2436 6.8587 32.2436 5.44985ZM32.2436 29.4492C32.2436 30.858 31.0939 31.9991 29.6743 31.9991H10.6311C9.2115 31.9991 8.06174 30.858 8.06174 29.4492V10.5497C8.06174 9.14086 9.2115 7.99978 10.6311 7.99978H29.6743C31.0939 7.99978 32.2436 9.14086 32.2436 10.5497V29.4492Z",fill:"#161616"}),$.jsx("path",{d:"M64.0092 7.99974H60.4546V31.9991H76.2523V28.6047H64.0092V7.99974Z",fill:"#161616"}),$.jsx("path",{d:"M86.5004 15.0661H85.2364C81.4368 15.0661 77.6035 17.3783 77.6035 22.5426V25.0525C77.6035 29.7335 80.3329 32.529 84.9039 32.529H86.834C90.6908 32.529 93.4348 30.2757 93.9979 26.6469L94.0472 26.3269H90.3863L90.3258 26.5247C89.784 28.3046 88.3678 29.1346 85.869 29.1346C82.6257 29.1346 81.0953 27.7047 81.0584 24.637H94.1334V22.5426C94.1334 17.3783 90.3001 15.0661 86.5004 15.0661ZM81.1636 21.6371C81.5263 19.386 82.9134 18.4605 85.8679 18.4605C88.8223 18.4605 90.2083 19.386 90.571 21.6371H81.1636Z",fill:"#161616"}),$.jsx("path",{d:"M101.226 7.99974H97.6722V15.0662H95.31V18.4606H97.6722V25.1837C97.6722 31.1135 101.307 31.9991 103.475 31.9991H105.717V28.6047H104.44C102.157 28.6047 101.226 27.4603 101.226 24.6559V18.4617H105.717V15.0673H101.226V7.99974Z",fill:"#161616"}),$.jsx("path",{d:"M113.234 7.99974H109.681V15.0662H107.318V18.4606H109.681V25.1837C109.681 31.1135 113.316 31.9991 115.483 31.9991H117.726V28.6047H116.448C114.165 28.6047 113.234 27.4603 113.234 24.6559V18.4617H117.726V15.0673H113.234V7.99974Z",fill:"#161616"}),$.jsx("path",{d:"M136.034 28.6046C135.33 28.6046 135.016 28.3135 135.016 27.6602V21.8815C135.016 15.9517 131.381 15.0661 129.214 15.0661H125.954C123.135 15.0661 120.118 17.115 120.118 20.1649V20.4426H123.671V20.1649C123.671 19.2249 124.83 18.4616 126.253 18.4616H128.249C130.799 18.4616 131.35 19.3727 131.452 21.4071H126.319C122.35 21.4071 119.684 23.5092 119.684 26.638V27.0014C119.684 28.6535 120.33 32.4967 126.319 32.4967C127.848 32.4967 130.52 32.2312 131.958 30.5379C132.829 32.0012 134.664 32.0012 136.034 32.0012H136.314V28.6069H136.034V28.6046ZM131.462 26.8014C131.462 28.6869 128.446 29.0991 127.283 29.0991C123.898 29.0991 123.237 28.2802 123.237 26.8669C123.237 25.2981 124.636 24.4692 127.283 24.4692H131.462V26.8014Z",fill:"#161616"})]})}function Td(){return $.jsx("svg",{width:"16",height:"13",viewBox:"0 0 16 13",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:$.jsx("path",{d:"M14.4373 2.55366V5.21163H13.2678V3.332H12.4534V2.41123H11.4604V0H8.97894V1.94985H7.01906V0H4.53761V2.41123H3.54463V3.332H2.73019V5.21163H1.56068V2.55366H0V6.94885H0.850552V7.65697H1.7011V9.35807H3.96991V10.7222H2.48144V12.4774H4.4674V10.5978H6.52357V8.9669H9.47643V10.5978H11.5326V12.4774H13.5186V10.7222H12.0301V9.35807H14.2989V7.65697H15.1494V6.94885H16V2.55366H14.4393H14.4373ZM6.56971 7.12738H5.32798V5.001H6.56971V7.12738ZM10.668 7.12738H9.42628V5.001H10.668V7.12738Z",fill:"#FDFEFF"})})}function Rd(){return $.jsx("div",{className:"fixed bg-white w-[100dvw] p-0 h-[100dvh] flex items-center justify-center",children:$.jsxs("div",{className:"max-w-[893px] w-full border p-10 flex flex-col gap-5",children:[$.jsx(Ld,{}),$.jsxs("div",{className:"flex gap-2 text-black flex-col max-w-[600px]",children:[$.jsx("h1",{className:"font-semibold text-3xl",children:"Experience the new ADE"}),$.jsx("h3",{className:"text-lg",children:"We have launched the next-generation Agent Development Environment (ADE) for interacting with agents both in the cloud and locally."}),$.jsx("p",{className:"mt-10",children:"The old Letta chat UI is no longer supported past Letta version 0.5.0. To use the old chat interface, please downgrade your Letta version."}),$.jsx("div",{className:"flex mt-3",children:$.jsxs("a",{href:"https://app.letta.com",className:"bg-black flex gap-3 items-center px-4 py-3 text-white text-bold",children:[$.jsx(Td,{}),"Open the new ADE"]})})]})]})})}const Md=nc(document.getElementById("root"));Md.render($.jsx($o.StrictMode,{children:$.jsx(Rd,{})})); diff --git a/letta/server/static_files/assets/index-43ab4d62.css b/letta/server/static_files/assets/index-0e31b727.css similarity index 87% rename from letta/server/static_files/assets/index-43ab4d62.css rename to letta/server/static_files/assets/index-0e31b727.css index 17e1816fd9..bd025e3c35 100644 --- a/letta/server/static_files/assets/index-43ab4d62.css +++ b/letta/server/static_files/assets/index-0e31b727.css @@ -1 +1 @@ -*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}:root{--background: 210, 10%, 92%;--background-lighter: 0, 0%, 100%;--background-darker: 210, 6%, 86%;--foreground: 224 71.4% 4.1%;--card: 0 0% 100%;--card-foreground: 224 71.4% 4.1%;--popover: 0 0% 100%;--popover-foreground: 224 71.4% 4.1%;--primary: 220.9 39.3% 11%;--primary-foreground: 210 20% 98%;--secondary: 240, 92%, 35%;--secondary-foreground: 0, 0%, 100%;--muted: 220 14.3% 95.9%;--muted-foreground: 220 8.9% 46.1%;--accent: 220 14.3% 95.9%;--accent-foreground: 220.9 39.3% 11%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 210 20% 98%;--border: 210, 6%, 86%;--input: 210, 6%, 86%;--ring: 224 71.4% 4.1%;--radius: .5rem}.dark{--background: 224 71.4% 4.1%;--background-lighter: 224 71.4% 4.1%;--background-darker: 224 71.4% 4.1%;--foreground: 210 20% 98%;--card: 224 71.4% 4.1%;--card-foreground: 210 20% 98%;--popover: 224 71.4% 4.1%;--popover-foreground: 210 20% 98%;--primary: 210 20% 98%;--primary-foreground: 220.9 39.3% 11%;--secondary: 10, 100%, 60%;--secondary-foreground: 210 20% 98%;--muted: 215 27.9% 16.9%;--muted-foreground: 217.9 10.6% 64.9%;--accent: 215 27.9% 16.9%;--accent-foreground: 210 20% 98%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 210 20% 98%;--border: 215 27.9% 16.9%;--input: 215 27.9% 16.9%;--ring: 216 12.2% 83.9%}*{border-color:hsl(var(--border))}html{height:100%}body{height:100%;width:100%;background-color:hsl(var(--background));color:hsl(var(--foreground));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}input::file-selector-button{color:hsl(var(--foreground))}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.fixed{position:fixed}.mt-10{margin-top:2.5rem}.mt-3{margin-top:.75rem}.flex{display:flex}.h-\[100dvh\]{height:100dvh}.h-full{height:100%}.w-\[100dvh\]{width:100dvh}.w-full{width:100%}.max-w-\[600px\]{max-width:600px}.max-w-\[893px\]{max-width:893px}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-5{gap:1.25rem}.border{border-width:1px}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.p-0{padding:0}.p-10{padding:2.5rem}.px-4{padding-left:1rem;padding-right:1rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.font-semibold{font-weight:600}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.PopoverContent{width:var(--radix-popover-trigger-width);max-height:var(--radix-popover-content-available-height)} +*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}:root{--background: 210, 10%, 92%;--background-lighter: 0, 0%, 100%;--background-darker: 210, 6%, 86%;--foreground: 224 71.4% 4.1%;--card: 0 0% 100%;--card-foreground: 224 71.4% 4.1%;--popover: 0 0% 100%;--popover-foreground: 224 71.4% 4.1%;--primary: 220.9 39.3% 11%;--primary-foreground: 210 20% 98%;--secondary: 240, 92%, 35%;--secondary-foreground: 0, 0%, 100%;--muted: 220 14.3% 95.9%;--muted-foreground: 220 8.9% 46.1%;--accent: 220 14.3% 95.9%;--accent-foreground: 220.9 39.3% 11%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 210 20% 98%;--border: 210, 6%, 86%;--input: 210, 6%, 86%;--ring: 224 71.4% 4.1%;--radius: .5rem}.dark{--background: 224 71.4% 4.1%;--background-lighter: 224 71.4% 4.1%;--background-darker: 224 71.4% 4.1%;--foreground: 210 20% 98%;--card: 224 71.4% 4.1%;--card-foreground: 210 20% 98%;--popover: 224 71.4% 4.1%;--popover-foreground: 210 20% 98%;--primary: 210 20% 98%;--primary-foreground: 220.9 39.3% 11%;--secondary: 10, 100%, 60%;--secondary-foreground: 210 20% 98%;--muted: 215 27.9% 16.9%;--muted-foreground: 217.9 10.6% 64.9%;--accent: 215 27.9% 16.9%;--accent-foreground: 210 20% 98%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 210 20% 98%;--border: 215 27.9% 16.9%;--input: 215 27.9% 16.9%;--ring: 216 12.2% 83.9%}*{border-color:hsl(var(--border))}html{height:100%}body{height:100%;width:100%;background-color:hsl(var(--background));color:hsl(var(--foreground));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}input::file-selector-button{color:hsl(var(--foreground))}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.fixed{position:fixed}.mt-10{margin-top:2.5rem}.mt-3{margin-top:.75rem}.flex{display:flex}.h-\[100dvh\]{height:100dvh}.h-full{height:100%}.w-\[100dvw\]{width:100dvw}.w-full{width:100%}.max-w-\[600px\]{max-width:600px}.max-w-\[893px\]{max-width:893px}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-5{gap:1.25rem}.border{border-width:1px}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.p-0{padding:0}.p-10{padding:2.5rem}.px-4{padding-left:1rem;padding-right:1rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.font-semibold{font-weight:600}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.PopoverContent{width:var(--radix-popover-trigger-width);max-height:var(--radix-popover-content-available-height)} diff --git a/letta/server/static_files/index.html b/letta/server/static_files/index.html index 003573298e..8819c00c28 100644 --- a/letta/server/static_files/index.html +++ b/letta/server/static_files/index.html @@ -29,8 +29,8 @@ } } - - + +
From 0efec77ab302f256983c360a2e7cd193e0b2ace0 Mon Sep 17 00:00:00 2001 From: Kevin Lin Date: Tue, 10 Dec 2024 14:49:35 -0700 Subject: [PATCH 058/280] fix: fix o1 duplicate messages (#2216) --- letta/o1_agent.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/letta/o1_agent.py b/letta/o1_agent.py index cef2769d4a..837005cfd1 100644 --- a/letta/o1_agent.py +++ b/letta/o1_agent.py @@ -67,9 +67,8 @@ def step( total_usage = UsageStatistics() step_count = 0 while step_count < self.max_thinking_steps: - # This is hacky but we need to do this for now - for m in next_input_message: - m.id = m._generate_id() + if counter > 0: + next_input_message = [] kwargs["ms"] = ms kwargs["first_message"] = False From 7f85a0315b61e49544842b52409fd9349184e5df Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Tue, 10 Dec 2024 14:00:31 -0800 Subject: [PATCH 059/280] fix: cleanup error trace for no llm/embedding_config on POST (#2218) --- letta/server/rest_api/app.py | 15 ++++++++++----- letta/server/server.py | 6 ++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/letta/server/rest_api/app.py b/letta/server/rest_api/app.py index 9b567bf4a0..ebbd58601c 100644 --- a/letta/server/rest_api/app.py +++ b/letta/server/rest_api/app.py @@ -6,7 +6,7 @@ from typing import Optional import uvicorn -from fastapi import FastAPI +from fastapi import FastAPI, Request from fastapi.responses import JSONResponse from starlette.middleware.base import BaseHTTPMiddleware from starlette.middleware.cors import CORSMiddleware @@ -136,17 +136,18 @@ def create_application() -> "FastAPI": }, ) + debug_mode = "--debug" in sys.argv app = FastAPI( swagger_ui_parameters={"docExpansion": "none"}, # openapi_tags=TAGS_METADATA, title="Letta", summary="Create LLM agents with long-term memory and custom tools 📚🦙", version="1.0.0", # TODO wire this up to the version in the package - debug=True, + debug=debug_mode, # if True, the stack trace will be printed in the response ) @app.exception_handler(Exception) - async def generic_error_handler(request, exc): + async def generic_error_handler(request: Request, exc: Exception): # Log the actual error for debugging log.error(f"Unhandled error: {exc}", exc_info=True) @@ -166,12 +167,16 @@ async def generic_error_handler(request, exc): }, ) + @app.exception_handler(ValueError) + async def value_error_handler(request: Request, exc: ValueError): + return JSONResponse(status_code=400, content={"detail": str(exc)}) + @app.exception_handler(LettaAgentNotFoundError) - async def agent_not_found_handler(request, exc): + async def agent_not_found_handler(request: Request, exc: LettaAgentNotFoundError): return JSONResponse(status_code=404, content={"detail": "Agent not found"}) @app.exception_handler(LettaUserNotFoundError) - async def user_not_found_handler(request, exc): + async def user_not_found_handler(request: Request, exc: LettaUserNotFoundError): return JSONResponse(status_code=404, content={"detail": "User not found"}) settings.cors_origins.append("https://app.letta.com") diff --git a/letta/server/server.py b/letta/server/server.py index 609e8eab49..c60abe484c 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -826,6 +826,12 @@ def create_agent( if not user: raise ValueError(f"cannot find user with associated client id: {user_id}") + if request.llm_config is None: + raise ValueError("llm_config is required") + + if request.embedding_config is None: + raise ValueError("embedding_config is required") + # created and persist the agent state in the DB agent_state = PersistedAgentState( name=request.name, From 7472a3d9cf75d44006dea8112b68fc8541cb69b7 Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Tue, 10 Dec 2024 14:02:05 -0800 Subject: [PATCH 060/280] fix: make healthcheck public (#2209) --- letta/server/rest_api/app.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/letta/server/rest_api/app.py b/letta/server/rest_api/app.py index ebbd58601c..b48a13d0d1 100644 --- a/letta/server/rest_api/app.py +++ b/letta/server/rest_api/app.py @@ -109,7 +109,13 @@ def generate_password(): class CheckPasswordMiddleware(BaseHTTPMiddleware): + async def dispatch(self, request, call_next): + + # Exclude health check endpoint from password protection + if request.url.path == "/v1/health/" or request.url.path == "/latest/health/": + return await call_next(request) + if request.headers.get("X-BARE-PASSWORD") == f"password {random_password}": return await call_next(request) From ac8bd80d1b2195feb9542c50e1044cece18257a5 Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Tue, 10 Dec 2024 16:10:34 -0800 Subject: [PATCH 061/280] feat: modify REST API schemas (#2121) --- letta/schemas/agent.py | 7 ++++--- letta/schemas/letta_request.py | 6 +++--- letta/schemas/tool_rule.py | 3 --- letta/server/rest_api/routers/v1/agents.py | 9 +++++++-- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/letta/schemas/agent.py b/letta/schemas/agent.py index d15dc6b3df..f0372f8fa5 100644 --- a/letta/schemas/agent.py +++ b/letta/schemas/agent.py @@ -4,6 +4,7 @@ from pydantic import BaseModel, Field, field_validator +from letta.constants import BASE_MEMORY_TOOLS, BASE_TOOLS from letta.schemas.block import CreateBlock from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.letta_base import LettaBase @@ -108,7 +109,7 @@ class CreateAgent(BaseAgent): # # all optional as server can generate defaults name: Optional[str] = Field(None, description="The name of the agent.") message_ids: Optional[List[str]] = Field(None, description="The ids of the messages in the agent's in-context memory.") - + # memory creation memory_blocks: List[CreateBlock] = Field( # [CreateHuman(), CreatePersona()], description="The blocks to create in the agent's in-context memory." @@ -116,11 +117,11 @@ class CreateAgent(BaseAgent): # description="The blocks to create in the agent's in-context memory.", ) - tools: Optional[List[str]] = Field(None, description="The tools used by the agent.") + tools: List[str] = Field(BASE_TOOLS + BASE_MEMORY_TOOLS, description="The tools used by the agent.") tool_rules: Optional[List[ToolRule]] = Field(None, description="The tool rules governing the agent.") tags: Optional[List[str]] = Field(None, description="The tags associated with the agent.") system: Optional[str] = Field(None, description="The system prompt used by the agent.") - agent_type: Optional[AgentType] = Field(None, description="The type of agent.") + agent_type: AgentType = Field(AgentType.memgpt_agent, description="The type of agent.") llm_config: Optional[LLMConfig] = Field(None, description="The LLM configuration used by the agent.") embedding_config: Optional[EmbeddingConfig] = Field(None, description="The embedding configuration used by the agent.") # Note: if this is None, then we'll populate with the standard "more human than human" initial message sequence diff --git a/letta/schemas/letta_request.py b/letta/schemas/letta_request.py index 11ef8bad49..123d817cf2 100644 --- a/letta/schemas/letta_request.py +++ b/letta/schemas/letta_request.py @@ -1,13 +1,13 @@ -from typing import List, Union +from typing import List from pydantic import BaseModel, Field from letta.constants import DEFAULT_MESSAGE_TOOL, DEFAULT_MESSAGE_TOOL_KWARG -from letta.schemas.message import Message, MessageCreate +from letta.schemas.message import MessageCreate class LettaRequest(BaseModel): - messages: Union[List[MessageCreate], List[Message]] = Field(..., description="The messages to be sent to the agent.") + messages: List[MessageCreate] = Field(..., description="The messages to be sent to the agent.") # Flags to support the use of AssistantMessage message types diff --git a/letta/schemas/tool_rule.py b/letta/schemas/tool_rule.py index 42f460e467..b320917d25 100644 --- a/letta/schemas/tool_rule.py +++ b/letta/schemas/tool_rule.py @@ -17,7 +17,6 @@ class ChildToolRule(BaseToolRule): A ToolRule represents a tool that can be invoked by the agent. """ - # type: str = Field("ToolRule") type: ToolRuleType = ToolRuleType.constrain_child_tools children: List[str] = Field(..., description="The children tools that can be invoked.") @@ -27,7 +26,6 @@ class InitToolRule(BaseToolRule): Represents the initial tool rule configuration. """ - # type: str = Field("InitToolRule") type: ToolRuleType = ToolRuleType.run_first @@ -36,7 +34,6 @@ class TerminalToolRule(BaseToolRule): Represents a terminal tool rule configuration where if this tool gets called, it must end the agent loop. """ - # type: str = Field("TerminalToolRule") type: ToolRuleType = ToolRuleType.exit_loop diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index 52e280697d..3a758bba32 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -165,7 +165,7 @@ def get_agent_state( return server.get_agent_state(user_id=actor.id, agent_id=agent_id) -@router.delete("/{agent_id}", response_model=None, operation_id="delete_agent") +@router.delete("/{agent_id}", response_model=AgentState, operation_id="delete_agent") def delete_agent( agent_id: str, server: "SyncServer" = Depends(get_letta_server), @@ -176,7 +176,12 @@ def delete_agent( """ actor = server.get_user_or_default(user_id=user_id) - return server.delete_agent(user_id=actor.id, agent_id=agent_id) + agent = server.get_agent(agent_id) + if not agent: + raise HTTPException(status_code=404, detail=f"Agent agent_id={agent_id} not found.") + + server.delete_agent(user_id=actor.id, agent_id=agent_id) + return agent @router.get("/{agent_id}/sources", response_model=List[Source], operation_id="get_agent_sources") From c9c2cca4f499c0128ef5de5a89cf85c065dff373 Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Tue, 10 Dec 2024 16:11:47 -0800 Subject: [PATCH 062/280] fix: create new request model that drops user_id (#2220) --- letta/server/rest_api/routers/v1/agents.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index 3a758bba32..9dfd7e2bfe 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -14,6 +14,7 @@ status, ) from fastapi.responses import JSONResponse, StreamingResponse +from pydantic import Field from letta.constants import DEFAULT_MESSAGE_TOOL, DEFAULT_MESSAGE_TOOL_KWARG from letta.schemas.agent import AgentState, CreateAgent, UpdateAgentState @@ -87,9 +88,18 @@ def get_agent_context_window( return server.get_agent_context_window(user_id=actor.id, agent_id=agent_id) +class CreateAgentRequest(CreateAgent): + """ + CreateAgent model specifically for POST request body, excluding user_id which comes from headers + """ + + # Override the user_id field to exclude it from the request body validation + user_id: Optional[str] = Field(None, exclude=True) + + @router.post("/", response_model=AgentState, operation_id="create_agent") def create_agent( - agent: CreateAgent = Body(...), + agent: CreateAgentRequest = Body(...), server: "SyncServer" = Depends(get_letta_server), user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present ): From 31d27741931194cc557c188f638d85d5a0306262 Mon Sep 17 00:00:00 2001 From: mlong93 <35275280+mlong93@users.noreply.github.com> Date: Tue, 10 Dec 2024 18:09:35 -0800 Subject: [PATCH 063/280] feat: orm passage migration (#2180) Co-authored-by: Mindy Long --- .gitignore | 3 + ..._add_passages_orm_drop_legacy_passages_.py | 88 +++++ letta/agent.py | 75 ++-- letta/agent_store/chroma.py | 297 --------------- letta/agent_store/db.py | 66 +--- letta/agent_store/storage.py | 19 +- letta/client/client.py | 5 +- letta/config.py | 4 +- letta/data_sources/connectors.py | 7 +- letta/functions/function_sets/base.py | 47 ++- letta/metadata.py | 15 +- letta/orm/__init__.py | 1 + letta/orm/file.py | 1 + letta/orm/mixins.py | 14 +- letta/orm/organization.py | 3 + letta/orm/passage.py | 72 ++++ letta/orm/sqlalchemy_base.py | 43 ++- letta/orm/sqlite_functions.py | 140 ++++++++ letta/orm/user.py | 2 +- letta/schemas/passage.py | 10 +- letta/server/rest_api/routers/v1/agents.py | 3 +- letta/server/server.py | 148 +++++--- letta/services/passage_manager.py | 225 ++++++++++++ letta/services/source_manager.py | 3 +- letta/settings.py | 2 + pyproject.toml | 2 +- tests/test_base_functions.py | 60 +++- tests/test_client_legacy.py | 1 - tests/test_managers.py | 337 +++++++++++++++++- tests/test_server.py | 80 +++-- tests/test_vector_embeddings.py | 42 +++ 31 files changed, 1283 insertions(+), 532 deletions(-) create mode 100644 alembic/versions/c5d964280dff_add_passages_orm_drop_legacy_passages_.py delete mode 100644 letta/agent_store/chroma.py create mode 100644 letta/orm/passage.py create mode 100644 letta/orm/sqlite_functions.py create mode 100644 letta/services/passage_manager.py create mode 100644 tests/test_vector_embeddings.py diff --git a/.gitignore b/.gitignore index 12042451e0..baaeabfbe5 100644 --- a/.gitignore +++ b/.gitignore @@ -1022,3 +1022,6 @@ memgpy/pytest.ini ## ignore venvs tests/test_tool_sandbox/restaurant_management_system/venv + +## custom scripts +test diff --git a/alembic/versions/c5d964280dff_add_passages_orm_drop_legacy_passages_.py b/alembic/versions/c5d964280dff_add_passages_orm_drop_legacy_passages_.py new file mode 100644 index 0000000000..a16fdae444 --- /dev/null +++ b/alembic/versions/c5d964280dff_add_passages_orm_drop_legacy_passages_.py @@ -0,0 +1,88 @@ +"""Add Passages ORM, drop legacy passages, cascading deletes for file-passages and user-jobs + +Revision ID: c5d964280dff +Revises: a91994b9752f +Create Date: 2024-12-10 15:05:32.335519 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = 'c5d964280dff' +down_revision: Union[str, None] = 'a91994b9752f' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('passages', sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True)) + op.add_column('passages', sa.Column('is_deleted', sa.Boolean(), server_default=sa.text('FALSE'), nullable=False)) + op.add_column('passages', sa.Column('_created_by_id', sa.String(), nullable=True)) + op.add_column('passages', sa.Column('_last_updated_by_id', sa.String(), nullable=True)) + + # Data migration step: + op.add_column("passages", sa.Column("organization_id", sa.String(), nullable=True)) + # Populate `organization_id` based on `user_id` + # Use a raw SQL query to update the organization_id + op.execute( + """ + UPDATE passages + SET organization_id = users.organization_id + FROM users + WHERE passages.user_id = users.id + """ + ) + + # Set `organization_id` as non-nullable after population + op.alter_column("passages", "organization_id", nullable=False) + + op.alter_column('passages', 'text', + existing_type=sa.VARCHAR(), + nullable=False) + op.alter_column('passages', 'embedding_config', + existing_type=postgresql.JSON(astext_type=sa.Text()), + nullable=False) + op.alter_column('passages', 'metadata_', + existing_type=postgresql.JSON(astext_type=sa.Text()), + nullable=False) + op.alter_column('passages', 'created_at', + existing_type=postgresql.TIMESTAMP(timezone=True), + nullable=False) + op.drop_index('passage_idx_user', table_name='passages') + op.create_foreign_key(None, 'passages', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(None, 'passages', 'agents', ['agent_id'], ['id']) + op.create_foreign_key(None, 'passages', 'files', ['file_id'], ['id'], ondelete='CASCADE') + op.drop_column('passages', 'user_id') + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('passages', sa.Column('user_id', sa.VARCHAR(), autoincrement=False, nullable=False)) + op.drop_constraint(None, 'passages', type_='foreignkey') + op.drop_constraint(None, 'passages', type_='foreignkey') + op.drop_constraint(None, 'passages', type_='foreignkey') + op.create_index('passage_idx_user', 'passages', ['user_id', 'agent_id', 'file_id'], unique=False) + op.alter_column('passages', 'created_at', + existing_type=postgresql.TIMESTAMP(timezone=True), + nullable=True) + op.alter_column('passages', 'metadata_', + existing_type=postgresql.JSON(astext_type=sa.Text()), + nullable=True) + op.alter_column('passages', 'embedding_config', + existing_type=postgresql.JSON(astext_type=sa.Text()), + nullable=True) + op.alter_column('passages', 'text', + existing_type=sa.VARCHAR(), + nullable=True) + op.drop_column('passages', 'organization_id') + op.drop_column('passages', '_last_updated_by_id') + op.drop_column('passages', '_created_by_id') + op.drop_column('passages', 'is_deleted') + op.drop_column('passages', 'updated_at') + # ### end Alembic commands ### diff --git a/letta/agent.py b/letta/agent.py index 81924c2ea9..efb850e28e 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -28,7 +28,7 @@ from letta.llm_api.helpers import is_context_overflow_error from letta.llm_api.llm_api_tools import create from letta.local_llm.utils import num_tokens_from_functions, num_tokens_from_messages -from letta.memory import ArchivalMemory, EmbeddingArchivalMemory, summarize_messages +from letta.memory import summarize_messages from letta.metadata import MetadataStore from letta.orm import User from letta.schemas.agent import AgentState, AgentStepResponse @@ -52,6 +52,7 @@ from letta.schemas.user import User as PydanticUser from letta.services.block_manager import BlockManager from letta.services.message_manager import MessageManager +from letta.services.passage_manager import PassageManager from letta.services.source_manager import SourceManager from letta.services.tool_execution_sandbox import ToolExecutionSandbox from letta.services.user_manager import UserManager @@ -85,7 +86,7 @@ def compile_memory_metadata_block( actor: PydanticUser, agent_id: str, memory_edit_timestamp: datetime.datetime, - archival_memory: Optional[ArchivalMemory] = None, + passage_manager: Optional[PassageManager] = None, message_manager: Optional[MessageManager] = None, ) -> str: # Put the timestamp in the local timezone (mimicking get_local_time()) @@ -96,7 +97,7 @@ def compile_memory_metadata_block( [ f"### Memory [last modified: {timestamp_str}]", f"{message_manager.size(actor=actor, agent_id=agent_id) if message_manager else 0} previous messages between you and the user are stored in recall memory (use functions to access them)", - f"{archival_memory.count() if archival_memory else 0} total memories you created are stored in archival memory (use functions to access them)", + f"{passage_manager.size(actor=actor, agent_id=agent_id) if passage_manager else 0} total memories you created are stored in archival memory (use functions to access them)", "\nCore memory shown below (limited in size, additional information stored in archival / recall memory):", ] ) @@ -109,7 +110,7 @@ def compile_system_message( in_context_memory: Memory, in_context_memory_last_edit: datetime.datetime, # TODO move this inside of BaseMemory? actor: PydanticUser, - archival_memory: Optional[ArchivalMemory] = None, + passage_manager: Optional[PassageManager] = None, message_manager: Optional[MessageManager] = None, user_defined_variables: Optional[dict] = None, append_icm_if_missing: bool = True, @@ -138,7 +139,7 @@ def compile_system_message( actor=actor, agent_id=agent_id, memory_edit_timestamp=in_context_memory_last_edit, - archival_memory=archival_memory, + passage_manager=passage_manager, message_manager=message_manager, ) full_memory_string = memory_metadata_string + "\n" + in_context_memory.compile() @@ -175,7 +176,7 @@ def initialize_message_sequence( agent_id: str, memory: Memory, actor: PydanticUser, - archival_memory: Optional[ArchivalMemory] = None, + passage_manager: Optional[PassageManager] = None, message_manager: Optional[MessageManager] = None, memory_edit_timestamp: Optional[datetime.datetime] = None, include_initial_boot_message: bool = True, @@ -184,7 +185,7 @@ def initialize_message_sequence( memory_edit_timestamp = get_local_time() # full_system_message = construct_system_with_memory( - # system, memory, memory_edit_timestamp, archival_memory=archival_memory, recall_memory=recall_memory + # system, memory, memory_edit_timestamp, passage_manager=passage_manager, recall_memory=recall_memory # ) full_system_message = compile_system_message( agent_id=agent_id, @@ -192,7 +193,7 @@ def initialize_message_sequence( in_context_memory=memory, in_context_memory_last_edit=memory_edit_timestamp, actor=actor, - archival_memory=archival_memory, + passage_manager=passage_manager, message_manager=message_manager, user_defined_variables=None, append_icm_if_missing=True, @@ -294,7 +295,7 @@ def __init__( self.interface = interface # Create the persistence manager object based on the AgentState info - self.archival_memory = EmbeddingArchivalMemory(agent_state) + self.passage_manager = PassageManager() self.message_manager = MessageManager() # State needed for heartbeat pausing @@ -325,7 +326,7 @@ def __init__( agent_id=self.agent_state.id, memory=self.agent_state.memory, actor=self.user, - archival_memory=None, + passage_manager=None, message_manager=None, memory_edit_timestamp=get_utc_time(), include_initial_boot_message=True, @@ -350,7 +351,7 @@ def __init__( memory=self.agent_state.memory, agent_id=self.agent_state.id, actor=self.user, - archival_memory=None, + passage_manager=None, message_manager=None, memory_edit_timestamp=get_utc_time(), include_initial_boot_message=True, @@ -1306,7 +1307,7 @@ def rebuild_system_prompt(self, force=False, update_timestamp=True): in_context_memory=self.agent_state.memory, in_context_memory_last_edit=memory_edit_timestamp, actor=self.user, - archival_memory=self.archival_memory, + passage_manager=self.passage_manager, message_manager=self.message_manager, user_defined_variables=None, append_icm_if_missing=True, @@ -1371,45 +1372,33 @@ def migrate_embedding(self, embedding_config: EmbeddingConfig): # TODO: recall memory raise NotImplementedError() - def attach_source(self, source_id: str, source_connector: StorageConnector, ms: MetadataStore): + def attach_source(self, user: PydanticUser, source_id: str, source_manager: SourceManager, ms: MetadataStore): """Attach data with name `source_name` to the agent from source_connector.""" # TODO: eventually, adding a data source should just give access to the retriever the source table, rather than modifying archival memory - user = UserManager().get_user_by_id(self.agent_state.user_id) - filters = {"user_id": self.agent_state.user_id, "source_id": source_id} - size = source_connector.size(filters) page_size = 100 - generator = source_connector.get_all_paginated(filters=filters, page_size=page_size) # yields List[Passage] - all_passages = [] - for i in tqdm(range(0, size, page_size)): - passages = next(generator) + passages = self.passage_manager.list_passages(actor=user, source_id=source_id, limit=page_size) - # need to associated passage with agent (for filtering) - for passage in passages: - assert isinstance(passage, Passage), f"Generate yielded bad non-Passage type: {type(passage)}" - passage.agent_id = self.agent_state.id + for passage in passages: + assert isinstance(passage, Passage), f"Generate yielded bad non-Passage type: {type(passage)}" + passage.agent_id = self.agent_state.id + self.passage_manager.update_passage_by_id(passage_id=passage.id, passage=passage, actor=user) - # regenerate passage ID (avoid duplicates) - # TODO: need to find another solution to the text duplication issue - # passage.id = create_uuid_from_string(f"{source_id}_{str(passage.agent_id)}_{passage.text}") - - # insert into agent archival memory - self.archival_memory.storage.insert_many(passages) - all_passages += passages - - assert size == len(all_passages), f"Expected {size} passages, but only got {len(all_passages)}" - - # save destination storage - self.archival_memory.storage.save() + agents_passages = self.passage_manager.list_passages(actor=user, agent_id=self.agent_state.id, source_id=source_id, limit=page_size) + passage_size = self.passage_manager.size(actor=user, agent_id=self.agent_state.id, source_id=source_id) + assert all([p.agent_id == self.agent_state.id for p in agents_passages]) + assert len(agents_passages) == passage_size # sanity check + assert passage_size == len(passages), f"Expected {len(passages)} passages, got {passage_size}" # attach to agent - source = SourceManager().get_source_by_id(source_id=source_id, actor=user) + source = source_manager.get_source_by_id(source_id=source_id, actor=user) assert source is not None, f"Source {source_id} not found in metadata store" - ms.attach_source(agent_id=self.agent_state.id, source_id=source_id, user_id=self.agent_state.user_id) - total_agent_passages = self.archival_memory.storage.size() + # NOTE: need this redundant line here because we haven't migrated agent to ORM yet + # TODO: delete @matt and remove + ms.attach_source(agent_id=self.agent_state.id, source_id=source_id, user_id=self.agent_state.user_id) printd( - f"Attached data source {source.name} to agent {self.agent_state.name}, consisting of {len(all_passages)}. Agent now has {total_agent_passages} embeddings in archival memory.", + f"Attached data source {source.name} to agent {self.agent_state.name}, consisting of {len(passages)}. Agent now has {passage_size} embeddings in archival memory.", ) def update_message(self, message_id: str, request: MessageUpdate) -> Message: @@ -1565,13 +1554,13 @@ def get_context_window(self) -> ContextWindowOverview: num_tokens_from_messages(messages=messages_openai_format[1:], model=self.model) if len(messages_openai_format) > 1 else 0 ) - num_archival_memory = self.archival_memory.storage.size() + passage_manager_size = self.passage_manager.size(actor=self.user, agent_id=self.agent_state.id) message_manager_size = self.message_manager.size(actor=self.user, agent_id=self.agent_state.id) external_memory_summary = compile_memory_metadata_block( actor=self.user, agent_id=self.agent_state.id, memory_edit_timestamp=get_utc_time(), # dummy timestamp - archival_memory=self.archival_memory, + passage_manager=self.passage_manager, message_manager=self.message_manager, ) num_tokens_external_memory_summary = count_tokens(external_memory_summary) @@ -1597,7 +1586,7 @@ def get_context_window(self) -> ContextWindowOverview: return ContextWindowOverview( # context window breakdown (in messages) num_messages=len(self._messages), - num_archival_memory=num_archival_memory, + num_archival_memory=passage_manager_size, num_recall_memory=message_manager_size, num_tokens_external_memory_summary=num_tokens_external_memory_summary, # top-level information diff --git a/letta/agent_store/chroma.py b/letta/agent_store/chroma.py deleted file mode 100644 index eace737b3d..0000000000 --- a/letta/agent_store/chroma.py +++ /dev/null @@ -1,297 +0,0 @@ -from typing import Dict, List, Optional, Tuple, cast - -import chromadb -from chromadb.api.types import Include - -from letta.agent_store.storage import StorageConnector, TableType -from letta.config import LettaConfig -from letta.schemas.embedding_config import EmbeddingConfig -from letta.schemas.passage import Passage -from letta.utils import datetime_to_timestamp, printd, timestamp_to_datetime - - -class ChromaStorageConnector(StorageConnector): - """Storage via Chroma""" - - # WARNING: This is not thread safe. Do NOT do concurrent access to the same collection. - # Timestamps are converted to integer timestamps for chroma (datetime not supported) - - def __init__(self, table_type: str, config: LettaConfig, user_id, agent_id=None): - super().__init__(table_type=table_type, config=config, user_id=user_id, agent_id=agent_id) - - assert table_type == TableType.ARCHIVAL_MEMORY or table_type == TableType.PASSAGES, "Chroma only supports archival memory" - - # create chroma client - if config.archival_storage_path: - self.client = chromadb.PersistentClient(config.archival_storage_path) - else: - # assume uri={ip}:{port} - ip = config.archival_storage_uri.split(":")[0] - port = config.archival_storage_uri.split(":")[1] - self.client = chromadb.HttpClient(host=ip, port=port) - - # get a collection or create if it doesn't exist already - self.collection = self.client.get_or_create_collection(self.table_name) - self.include: Include = ["documents", "embeddings", "metadatas"] - - def get_filters(self, filters: Optional[Dict] = {}) -> Tuple[list, dict]: - # get all filters for query - if filters is not None: - filter_conditions = {**self.filters, **filters} - else: - filter_conditions = self.filters - - # convert to chroma format - chroma_filters = [] - ids = [] - for key, value in filter_conditions.items(): - # filter by id - if key == "id": - ids = [str(value)] - continue - - # filter by other keys - chroma_filters.append({key: {"$eq": value}}) - - if len(chroma_filters) > 1: - chroma_filters = {"$and": chroma_filters} - elif len(chroma_filters) == 0: - chroma_filters = {} - else: - chroma_filters = chroma_filters[0] - return ids, chroma_filters - - def get_all_paginated(self, filters: Optional[Dict] = {}, page_size: int = 1000, offset: int = 0): - ids, filters = self.get_filters(filters) - while True: - # Retrieve a chunk of records with the given page_size - results = self.collection.get(ids=ids, offset=offset, limit=page_size, include=self.include, where=filters) - - # If the chunk is empty, we've retrieved all records - assert results["embeddings"] is not None, f"results['embeddings'] was None" - if len(results["embeddings"]) == 0: - break - - # Yield a list of Record objects converted from the chunk - yield self.results_to_records(results) - - # Increment the offset to get the next chunk in the next iteration - offset += page_size - - def results_to_records(self, results): - # convert timestamps to datetime - for metadata in results["metadatas"]: - if "created_at" in metadata: - metadata["created_at"] = timestamp_to_datetime(metadata["created_at"]) - if results["embeddings"]: # may not be returned, depending on table type - passages = [] - for text, record_id, embedding, metadata in zip( - results["documents"], results["ids"], results["embeddings"], results["metadatas"] - ): - args = {} - for field in EmbeddingConfig.__fields__.keys(): - if field in metadata: - args[field] = metadata[field] - del metadata[field] - embedding_config = EmbeddingConfig(**args) - passages.append(Passage(text=text, embedding=embedding, id=record_id, embedding_config=embedding_config, **metadata)) - # return [ - # Passage(text=text, embedding=embedding, id=record_id, embedding_config=EmbeddingConfig(), **metadatas) - # for (text, record_id, embedding, metadatas) in zip( - # results["documents"], results["ids"], results["embeddings"], results["metadatas"] - # ) - # ] - return passages - else: - # no embeddings - passages = [] - for text, id, metadata in zip(results["documents"], results["ids"], results["metadatas"]): - args = {} - for field in EmbeddingConfig.__fields__.keys(): - if field in metadata: - args[field] = metadata[field] - del metadata[field] - embedding_config = EmbeddingConfig(**args) - passages.append(Passage(text=text, embedding=None, id=id, embedding_config=embedding_config, **metadata)) - return passages - - # return [ - # #cast(Passage, self.type(text=text, id=uuid.UUID(id), **metadatas)) # type: ignore - # Passage(text=text, embedding=None, id=id, **metadatas) - # for (text, id, metadatas) in zip(results["documents"], results["ids"], results["metadatas"]) - # ] - - def get_all(self, filters: Optional[Dict] = {}, limit=None): - ids, filters = self.get_filters(filters) - if self.collection.count() == 0: - return [] - if ids == []: - ids = None - if limit: - results = self.collection.get(ids=ids, include=self.include, where=filters, limit=limit) - else: - results = self.collection.get(ids=ids, include=self.include, where=filters) - return self.results_to_records(results) - - def get(self, id: str): - results = self.collection.get(ids=[str(id)]) - if len(results["ids"]) == 0: - return None - return self.results_to_records(results)[0] - - def format_records(self, records): - assert all([isinstance(r, Passage) for r in records]) - - recs = [] - ids = [] - documents = [] - embeddings = [] - - # de-duplication of ids - exist_ids = set() - for i in range(len(records)): - record = records[i] - if record.id in exist_ids: - continue - exist_ids.add(record.id) - recs.append(cast(Passage, record)) - ids.append(str(record.id)) - documents.append(record.text) - embeddings.append(record.embedding) - - # collect/format record metadata - metadatas = [] - for record in recs: - embedding_config = vars(record.embedding_config) - metadata = vars(record) - metadata.pop("id") - metadata.pop("text") - metadata.pop("embedding") - metadata.pop("embedding_config") - metadata.pop("metadata_") - if "created_at" in metadata: - metadata["created_at"] = datetime_to_timestamp(metadata["created_at"]) - if "metadata_" in metadata and metadata["metadata_"] is not None: - record_metadata = dict(metadata["metadata_"]) - metadata.pop("metadata_") - else: - record_metadata = {} - - metadata = {**metadata, **record_metadata} # merge with metadata - metadata = {**metadata, **embedding_config} # merge with embedding config - metadata = {key: value for key, value in metadata.items() if value is not None} # null values not allowed - - # convert uuids to strings - metadatas.append(metadata) - return ids, documents, embeddings, metadatas - - def insert(self, record): - ids, documents, embeddings, metadatas = self.format_records([record]) - if any([e is None for e in embeddings]): - raise ValueError("Embeddings must be provided to chroma") - self.collection.upsert(documents=documents, embeddings=[e for e in embeddings if e is not None], ids=ids, metadatas=metadatas) - - def insert_many(self, records, show_progress=False): - ids, documents, embeddings, metadatas = self.format_records(records) - if any([e is None for e in embeddings]): - raise ValueError("Embeddings must be provided to chroma") - self.collection.upsert(documents=documents, embeddings=[e for e in embeddings if e is not None], ids=ids, metadatas=metadatas) - - def delete(self, filters: Optional[Dict] = {}): - ids, filters = self.get_filters(filters) - self.collection.delete(ids=ids, where=filters) - - def delete_table(self): - # drop collection - self.client.delete_collection(self.collection.name) - - def save(self): - # save to persistence file (nothing needs to be done) - printd("Saving chroma") - - def size(self, filters: Optional[Dict] = {}) -> int: - # unfortuantely, need to use pagination to get filtering - # warning: poor performance for large datasets - return len(self.get_all(filters=filters)) - - def list_data_sources(self): - raise NotImplementedError - - def query(self, query: str, query_vec: List[float], top_k: int = 10, filters: Optional[Dict] = {}): - ids, filters = self.get_filters(filters) - results = self.collection.query(query_embeddings=[query_vec], n_results=top_k, include=self.include, where=filters) - - # flatten, since we only have one query vector - flattened_results = {} - for key, value in results.items(): - if value: - # value is an Optional[List] type according to chromadb.api.types - flattened_results[key] = value[0] # type: ignore - assert len(value) == 1, f"Value is size {len(value)}: {value}" # type: ignore - else: - flattened_results[key] = value - - return self.results_to_records(flattened_results) - - def query_date(self, start_date, end_date, start=None, count=None): - raise ValueError("Cannot run query_date with chroma") - # filters = self.get_filters(filters) - # filters["created_at"] = { - # "$gte": start_date, - # "$lte": end_date, - # } - # results = self.collection.query(where=filters) - # start = 0 if start is None else start - # count = len(results) if count is None else count - # results = results[start : start + count] - # return self.results_to_records(results) - - def query_text(self, query, count=None, start=None, filters: Optional[Dict] = {}): - raise ValueError("Cannot run query_text with chroma") - # filters = self.get_filters(filters) - # results = self.collection.query(where_document={"$contains": {"text": query}}, where=filters) - # start = 0 if start is None else start - # count = len(results) if count is None else count - # results = results[start : start + count] - # return self.results_to_records(results) - - def get_all_cursor( - self, - filters: Optional[Dict] = {}, - after: str = None, - before: str = None, - limit: Optional[int] = 1000, - order_by: str = "created_at", - reverse: bool = False, - ): - records = self.get_all(filters=filters) - - # WARNING: very hacky and slow implementation - def get_index(id, record_list): - for i in range(len(record_list)): - if record_list[i].id == id: - return i - assert False, f"Could not find id {id} in record list" - - # sort by custom field - records = sorted(records, key=lambda x: getattr(x, order_by), reverse=reverse) - if after: - index = get_index(after, records) - if index + 1 >= len(records): - return None, [] - records = records[index + 1 :] - if before: - index = get_index(before, records) - if index == 0: - return None, [] - - # TODO: not sure if this is correct - records = records[:index] - - if len(records) == 0: - return None, [] - - # enforce limit - if limit: - records = records[:limit] - return records[-1].id, records diff --git a/letta/agent_store/db.py b/letta/agent_store/db.py index 56d35edc74..095a0e82c6 100644 --- a/letta/agent_store/db.py +++ b/letta/agent_store/db.py @@ -1,4 +1,5 @@ import base64 +import json import os from datetime import datetime from typing import Dict, List, Optional @@ -32,7 +33,7 @@ from letta.orm.file import FileMetadata as FileMetadataModel # from letta.schemas.message import Message, Passage, Record, RecordType, ToolCall -from letta.schemas.passage import Passage +from letta.orm.passage import Passage as PassageModel from letta.settings import settings config = LettaConfig() @@ -66,56 +67,6 @@ def process_result_value(self, value, dialect): # For PostgreSQL, value is already in bytes return np.frombuffer(value, dtype=np.float32) - -class PassageModel(Base): - """Defines data model for storing Passages (consisting of text, embedding)""" - - __tablename__ = "passages" - __table_args__ = {"extend_existing": True} - - # Assuming passage_id is the primary key - id = Column(String, primary_key=True) - user_id = Column(String, nullable=False) - text = Column(String) - file_id = Column(String) - agent_id = Column(String) - source_id = Column(String) - - # vector storage - if settings.letta_pg_uri_no_default: - from pgvector.sqlalchemy import Vector - - embedding = mapped_column(Vector(MAX_EMBEDDING_DIM)) - elif config.archival_storage_type == "sqlite" or config.archival_storage_type == "chroma": - embedding = Column(CommonVector) - else: - raise ValueError(f"Unsupported archival_storage_type: {config.archival_storage_type}") - embedding_config = Column(EmbeddingConfigColumn) - metadata_ = Column(MutableJson) - - # Add a datetime column, with default value as the current time - created_at = Column(DateTime(timezone=True)) - - Index("passage_idx_user", user_id, agent_id, file_id), - - def __repr__(self): - return f" AgentState: agents = [AgentState(**agent) for agent in response.json()] if len(agents) == 0: return None - assert len(agents) == 1, f"Multiple agents with the same name: {agents}" + agents = [agents[0]] # TODO: @matt monkeypatched + assert len(agents) == 1, f"Multiple agents with the same name: {[(agents.name, agents.id) for agents in agents]}" return agents[0].id # memory @@ -3107,7 +3108,7 @@ def get_archival_memory( passages (List[Passage]): List of passages """ - return self.server.get_agent_archival_cursor(user_id=self.user_id, agent_id=agent_id, before=before, after=after, limit=limit) + return self.server.get_agent_archival_cursor(user_id=self.user_id, agent_id=agent_id, limit=limit) # recall memory diff --git a/letta/config.py b/letta/config.py index cc0c5aa720..70b6bf3819 100644 --- a/letta/config.py +++ b/letta/config.py @@ -62,8 +62,8 @@ class LettaConfig: # @norton120 these are the metdadatastore # database configs: archival - archival_storage_type: str = "chroma" # local, db - archival_storage_path: str = os.path.join(LETTA_DIR, "chroma") + archival_storage_type: str = "sqlite" # local, db + archival_storage_path: str = LETTA_DIR archival_storage_uri: str = None # TODO: eventually allow external vector DB # database configs: recall diff --git a/letta/data_sources/connectors.py b/letta/data_sources/connectors.py index 2b88ac12f7..6316863c01 100644 --- a/letta/data_sources/connectors.py +++ b/letta/data_sources/connectors.py @@ -1,4 +1,4 @@ -from typing import Dict, Iterator, List, Tuple +from typing import Dict, Iterator, List, Tuple, Optional import typer @@ -42,7 +42,7 @@ def generate_passages(self, file: FileMetadata, chunk_size: int = 1024) -> Itera """ -def load_data(connector: DataConnector, source: Source, passage_store: StorageConnector, source_manager: SourceManager, actor: "User"): +def load_data(connector: DataConnector, source: Source, passage_store: StorageConnector, source_manager: SourceManager, actor: "User", agent_id: Optional[str] = None): """Load data from a connector (generates file and passages) into a specified source_id, associated with a user_id.""" embedding_config = source.embedding_config @@ -82,9 +82,10 @@ def load_data(connector: DataConnector, source: Source, passage_store: StorageCo id=create_uuid_from_string(f"{str(source.id)}_{passage_text}"), text=passage_text, file_id=file_metadata.id, + agent_id=agent_id, source_id=source.id, metadata_=passage_metadata, - user_id=source.created_by_id, + organization_id=source.organization_id, embedding_config=source.embedding_config, embedding=embedding, ) diff --git a/letta/functions/function_sets/base.py b/letta/functions/function_sets/base.py index c4a15d9f3e..cdcad3acad 100644 --- a/letta/functions/function_sets/base.py +++ b/letta/functions/function_sets/base.py @@ -164,17 +164,23 @@ def archival_memory_insert(self: "Agent", content: str) -> Optional[str]: Returns: Optional[str]: None is always returned as this function does not produce a response. """ - self.archival_memory.insert(content) + self.passage_manager.insert_passage( + agent_state=self.agent_state, + agent_id=self.agent_state.id, + text=content, + actor=self.user, + ) return None -def archival_memory_search(self: "Agent", query: str, page: Optional[int] = 0) -> Optional[str]: +def archival_memory_search(self: "Agent", query: str, page: Optional[int] = 0, start: Optional[int] = 0) -> Optional[str]: """ Search archival memory using semantic (embedding-based) search. Args: query (str): String to search for. page (Optional[int]): Allows you to page through results. Only use on a follow-up query. Defaults to 0 (first page). + start (Optional[int]): Starting index for the search results. Defaults to 0. Returns: str: Query result string @@ -191,15 +197,34 @@ def archival_memory_search(self: "Agent", query: str, page: Optional[int] = 0) - except: raise ValueError(f"'page' argument must be an integer") count = RETRIEVAL_QUERY_DEFAULT_PAGE_SIZE - results, total = self.archival_memory.search(query, count=count, start=page * count) - num_pages = math.ceil(total / count) - 1 # 0 index - if len(results) == 0: - results_str = f"No results found." - else: - results_pref = f"Showing {len(results)} of {total} results (page {page}/{num_pages}):" - results_formatted = [f"timestamp: {d['timestamp']}, memory: {d['content']}" for d in results] - results_str = f"{results_pref} {json_dumps(results_formatted)}" - return results_str + + try: + # Get results using passage manager + all_results = self.passage_manager.list_passages( + actor=self.user, + query_text=query, + limit=count + start, # Request enough results to handle offset + embedding_config=self.agent_state.embedding_config, + embed_query=True + ) + + # Apply pagination + end = min(count + start, len(all_results)) + paged_results = all_results[start:end] + + # Format results to match previous implementation + formatted_results = [ + { + "timestamp": str(result.created_at), + "content": result.text + } + for result in paged_results + ] + + return formatted_results, len(formatted_results) + + except Exception as e: + raise e def core_memory_append(agent_state: "AgentState", label: str, content: str) -> Optional[str]: # type: ignore diff --git a/letta/metadata.py b/letta/metadata.py index 56d852eaca..017e546e48 100644 --- a/letta/metadata.py +++ b/letta/metadata.py @@ -363,8 +363,19 @@ def attach_source(self, user_id: str, agent_id: str, source_id: str): with self.session_maker() as session: # TODO: remove this (is a hack) mapping_id = f"{user_id}-{agent_id}-{source_id}" - session.add(AgentSourceMappingModel(id=mapping_id, user_id=user_id, agent_id=agent_id, source_id=source_id)) - session.commit() + existing = session.query(AgentSourceMappingModel).filter( + AgentSourceMappingModel.id == mapping_id + ).first() + + if existing is None: + # Only create if it doesn't exist + session.add(AgentSourceMappingModel( + id=mapping_id, + user_id=user_id, + agent_id=agent_id, + source_id=source_id + )) + session.commit() @enforce_types def list_attached_source_ids(self, agent_id: str) -> List[str]: diff --git a/letta/orm/__init__.py b/letta/orm/__init__.py index 85b4b7eb3c..b7f7bb96fb 100644 --- a/letta/orm/__init__.py +++ b/letta/orm/__init__.py @@ -6,6 +6,7 @@ from letta.orm.job import Job from letta.orm.message import Message from letta.orm.organization import Organization +from letta.orm.passage import Passage from letta.orm.sandbox_config import SandboxConfig, SandboxEnvironmentVariable from letta.orm.source import Source from letta.orm.tool import Tool diff --git a/letta/orm/file.py b/letta/orm/file.py index 187ebbd88f..6f7111639a 100644 --- a/letta/orm/file.py +++ b/letta/orm/file.py @@ -27,3 +27,4 @@ class FileMetadata(SqlalchemyBase, OrganizationMixin, SourceMixin): # relationships organization: Mapped["Organization"] = relationship("Organization", back_populates="files", lazy="selectin") source: Mapped["Source"] = relationship("Source", back_populates="files", lazy="selectin") + passages: Mapped[List["Passage"]] = relationship("Passage", back_populates="file", lazy="selectin", cascade="all, delete-orphan") diff --git a/letta/orm/mixins.py b/letta/orm/mixins.py index 355a8b2ce4..60c319d985 100644 --- a/letta/orm/mixins.py +++ b/letta/orm/mixins.py @@ -1,3 +1,4 @@ +from typing import Optional from uuid import UUID from sqlalchemy import ForeignKey, String @@ -30,6 +31,12 @@ class UserMixin(Base): user_id: Mapped[str] = mapped_column(String, ForeignKey("users.id")) +class FileMixin(Base): + """Mixin for models that belong to a file.""" + + __abstract__ = True + + file_id: Mapped[str] = mapped_column(String, ForeignKey("files.id")) class AgentMixin(Base): """Mixin for models that belong to an agent.""" @@ -38,13 +45,16 @@ class AgentMixin(Base): agent_id: Mapped[str] = mapped_column(String, ForeignKey("agents.id")) - class FileMixin(Base): """Mixin for models that belong to a file.""" __abstract__ = True - file_id: Mapped[str] = mapped_column(String, ForeignKey("files.id")) + file_id: Mapped[Optional[str]] = mapped_column( + String, + ForeignKey("files.id", ondelete="CASCADE"), + nullable=True + ) class SourceMixin(Base): diff --git a/letta/orm/organization.py b/letta/orm/organization.py index 4e5b6d12cb..8dc56e1627 100644 --- a/letta/orm/organization.py +++ b/letta/orm/organization.py @@ -33,7 +33,10 @@ class Organization(SqlalchemyBase): sandbox_environment_variables: Mapped[List["SandboxEnvironmentVariable"]] = relationship( "SandboxEnvironmentVariable", back_populates="organization", cascade="all, delete-orphan" ) + + # relationships messages: Mapped[List["Message"]] = relationship("Message", back_populates="organization", cascade="all, delete-orphan") + passages: Mapped[List["Passage"]] = relationship("Passage", back_populates="organization", cascade="all, delete-orphan") # TODO: Map these relationships later when we actually make these models # below is just a suggestion diff --git a/letta/orm/passage.py b/letta/orm/passage.py new file mode 100644 index 0000000000..847c8ddd7c --- /dev/null +++ b/letta/orm/passage.py @@ -0,0 +1,72 @@ +from datetime import datetime +from typing import List, Optional, TYPE_CHECKING +from sqlalchemy import Column, String, DateTime, Index, JSON, UniqueConstraint, ForeignKey +from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.types import TypeDecorator, BINARY + +import numpy as np +import base64 + +from letta.orm.source import EmbeddingConfigColumn +from letta.orm.sqlalchemy_base import SqlalchemyBase +from letta.orm.mixins import AgentMixin, FileMixin, OrganizationMixin +from letta.schemas.passage import Passage as PydanticPassage + +from letta.config import LettaConfig +from letta.constants import MAX_EMBEDDING_DIM +from letta.settings import settings + +config = LettaConfig() + +if TYPE_CHECKING: + from letta.orm.file import File + from letta.orm.organization import Organization + +class CommonVector(TypeDecorator): + """Common type for representing vectors in SQLite""" + impl = BINARY + cache_ok = True + + def load_dialect_impl(self, dialect): + return dialect.type_descriptor(BINARY()) + + def process_bind_param(self, value, dialect): + if value is None: + return value + if isinstance(value, list): + value = np.array(value, dtype=np.float32) + return base64.b64encode(value.tobytes()) + + def process_result_value(self, value, dialect): + if not value: + return value + if dialect.name == "sqlite": + value = base64.b64decode(value) + return np.frombuffer(value, dtype=np.float32) + +# TODO: After migration to Passage, will need to manually delete passages where files +# are deleted on web +class Passage(SqlalchemyBase, OrganizationMixin, FileMixin): + """Defines data model for storing Passages""" + __tablename__ = "passages" + __table_args__ = {"extend_existing": True} + __pydantic_model__ = PydanticPassage + + id: Mapped[str] = mapped_column(primary_key=True, doc="Unique passage identifier") + text: Mapped[str] = mapped_column(doc="Passage text content") + source_id: Mapped[Optional[str]] = mapped_column(nullable=True, doc="Source identifier") + embedding_config: Mapped[dict] = mapped_column(EmbeddingConfigColumn, doc="Embedding configuration") + metadata_: Mapped[dict] = mapped_column(JSON, doc="Additional metadata") + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=datetime.utcnow) + if settings.letta_pg_uri_no_default: + from pgvector.sqlalchemy import Vector + embedding = mapped_column(Vector(MAX_EMBEDDING_DIM)) + else: + embedding = Column(CommonVector) + + # Foreign keys + agent_id: Mapped[Optional[str]] = mapped_column(String, ForeignKey("agents.id"), nullable=True) + + # Relationships + organization: Mapped["Organization"] = relationship("Organization", back_populates="passages", lazy="selectin") + file: Mapped["FileMetadata"] = relationship("FileMetadata", back_populates="passages", lazy="selectin") diff --git a/letta/orm/sqlalchemy_base.py b/letta/orm/sqlalchemy_base.py index 6f8a764408..74d3f3be41 100644 --- a/letta/orm/sqlalchemy_base.py +++ b/letta/orm/sqlalchemy_base.py @@ -1,6 +1,7 @@ from datetime import datetime from enum import Enum from typing import TYPE_CHECKING, List, Literal, Optional, Type +import sqlite3 from sqlalchemy import String, desc, func, or_, select from sqlalchemy.exc import DBAPIError @@ -8,6 +9,7 @@ from letta.log import get_logger from letta.orm.base import Base, CommonSqlalchemyMetaMixins +from letta.orm.sqlite_functions import adapt_array, convert_array, cosine_distance from letta.orm.errors import ( ForeignKeyConstraintViolationError, NoResultFound, @@ -60,6 +62,7 @@ def list( end_date: Optional[datetime] = None, limit: Optional[int] = 50, query_text: Optional[str] = None, + query_embedding: Optional[List[float]] = None, ascending: bool = True, **kwargs, ) -> List[Type["SqlalchemyBase"]]: @@ -110,17 +113,43 @@ def list( # Apply text search if query_text: + from sqlalchemy import func query = query.filter(func.lower(cls.text).contains(func.lower(query_text))) - # Handle soft deletes + # Apply embedding search (Passages) + is_ordered = False + if query_embedding: + # check if embedding column exists. should only exist for passages + if not hasattr(cls, "embedding"): + raise ValueError(f"Class {cls.__name__} does not have an embedding column") + + from letta.settings import settings + if settings.letta_pg_uri_no_default: + # PostgreSQL with pgvector + from pgvector.sqlalchemy import Vector + query = query.order_by(cls.embedding.cosine_distance(query_embedding).asc()) + else: + # SQLite with custom vector type + from sqlalchemy import func + + query_embedding_binary = adapt_array(query_embedding) + query = query.order_by( + func.cosine_distance(cls.embedding, query_embedding_binary).asc(), + cls.created_at.asc(), + cls.id.asc() + ) + is_ordered = True + + # Handle ordering and soft deletes if hasattr(cls, "is_deleted"): query = query.where(cls.is_deleted == False) - + # Apply ordering by created_at - if ascending: - query = query.order_by(cls.created_at, cls.id) - else: - query = query.order_by(desc(cls.created_at), desc(cls.id)) + if not is_ordered: + if ascending: + query = query.order_by(cls.created_at, cls.id) + else: + query = query.order_by(desc(cls.created_at), desc(cls.id)) query = query.limit(limit) @@ -369,4 +398,4 @@ def to_pydantic(self) -> Type["BaseModel"]: def to_record(self) -> Type["BaseModel"]: """Deprecated accessor for to_pydantic""" logger.warning("to_record is deprecated, use to_pydantic instead.") - return self.to_pydantic() + return self.to_pydantic() \ No newline at end of file diff --git a/letta/orm/sqlite_functions.py b/letta/orm/sqlite_functions.py new file mode 100644 index 0000000000..a5b741aa51 --- /dev/null +++ b/letta/orm/sqlite_functions.py @@ -0,0 +1,140 @@ +from typing import Optional, Union + +import base64 +import numpy as np +from sqlalchemy import event +from sqlalchemy.engine import Engine +import sqlite3 + +from letta.constants import MAX_EMBEDDING_DIM + +def adapt_array(arr): + """ + Converts numpy array to binary for SQLite storage + """ + if arr is None: + return None + + if isinstance(arr, list): + arr = np.array(arr, dtype=np.float32) + elif not isinstance(arr, np.ndarray): + raise ValueError(f"Unsupported type: {type(arr)}") + + # Convert to bytes and then base64 encode + bytes_data = arr.tobytes() + base64_data = base64.b64encode(bytes_data) + return sqlite3.Binary(base64_data) + +def convert_array(text): + """ + Converts binary back to numpy array + """ + if text is None: + return None + if isinstance(text, list): + return np.array(text, dtype=np.float32) + if isinstance(text, np.ndarray): + return text + + # Handle both bytes and sqlite3.Binary + binary_data = bytes(text) if isinstance(text, sqlite3.Binary) else text + + try: + # First decode base64 + decoded_data = base64.b64decode(binary_data) + # Then convert to numpy array + return np.frombuffer(decoded_data, dtype=np.float32) + except Exception as e: + return None + +def verify_embedding_dimension(embedding: np.ndarray, expected_dim: int = MAX_EMBEDDING_DIM) -> bool: + """ + Verifies that an embedding has the expected dimension + + Args: + embedding: Input embedding array + expected_dim: Expected embedding dimension (default: 4096) + + Returns: + bool: True if dimension matches, False otherwise + """ + if embedding is None: + return False + return embedding.shape[0] == expected_dim + +def validate_and_transform_embedding( + embedding: Union[bytes, sqlite3.Binary, list, np.ndarray], + expected_dim: int = MAX_EMBEDDING_DIM, + dtype: np.dtype = np.float32 +) -> Optional[np.ndarray]: + """ + Validates and transforms embeddings to ensure correct dimensionality. + + Args: + embedding: Input embedding in various possible formats + expected_dim: Expected embedding dimension (default 4096) + dtype: NumPy dtype for the embedding (default float32) + + Returns: + np.ndarray: Validated and transformed embedding + + Raises: + ValueError: If embedding dimension doesn't match expected dimension + """ + if embedding is None: + return None + + # Convert to numpy array based on input type + if isinstance(embedding, (bytes, sqlite3.Binary)): + vec = convert_array(embedding) + elif isinstance(embedding, list): + vec = np.array(embedding, dtype=dtype) + elif isinstance(embedding, np.ndarray): + vec = embedding.astype(dtype) + else: + raise ValueError(f"Unsupported embedding type: {type(embedding)}") + + # Validate dimension + if vec.shape[0] != expected_dim: + raise ValueError( + f"Invalid embedding dimension: got {vec.shape[0]}, expected {expected_dim}" + ) + + return vec + +def cosine_distance(embedding1, embedding2, expected_dim=MAX_EMBEDDING_DIM): + """ + Calculate cosine distance between two embeddings + + Args: + embedding1: First embedding + embedding2: Second embedding + expected_dim: Expected embedding dimension (default 4096) + + Returns: + float: Cosine distance + """ + + if embedding1 is None or embedding2 is None: + return 0.0 # Maximum distance if either embedding is None + + try: + vec1 = validate_and_transform_embedding(embedding1, expected_dim) + vec2 = validate_and_transform_embedding(embedding2, expected_dim) + except ValueError as e: + return 0.0 + + similarity = np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2)) + distance = float(1.0 - similarity) + + return distance + +@event.listens_for(Engine, "connect") +def register_functions(dbapi_connection, connection_record): + """Register SQLite functions""" + if isinstance(dbapi_connection, sqlite3.Connection): + dbapi_connection.create_function("cosine_distance", 2, cosine_distance) + +# Register adapters and converters for numpy arrays +sqlite3.register_adapter(np.ndarray, adapt_array) +sqlite3.register_converter("ARRAY", convert_array) diff --git a/letta/orm/user.py b/letta/orm/user.py index a44c31ab0e..62a3c0e606 100644 --- a/letta/orm/user.py +++ b/letta/orm/user.py @@ -20,7 +20,7 @@ class User(SqlalchemyBase, OrganizationMixin): # relationships organization: Mapped["Organization"] = relationship("Organization", back_populates="users") - jobs: Mapped[List["Job"]] = relationship("Job", back_populates="user", doc="the jobs associated with this user.") + jobs: Mapped[List["Job"]] = relationship("Job", back_populates="user", doc="the jobs associated with this user.", cascade="all, delete-orphan") # TODO: Add this back later potentially # agents: Mapped[List["Agent"]] = relationship( diff --git a/letta/schemas/passage.py b/letta/schemas/passage.py index 2ecc5e9ac3..faa520c03e 100644 --- a/letta/schemas/passage.py +++ b/letta/schemas/passage.py @@ -5,15 +5,17 @@ from letta.constants import MAX_EMBEDDING_DIM from letta.schemas.embedding_config import EmbeddingConfig -from letta.schemas.letta_base import LettaBase +from letta.schemas.letta_base import OrmMetadataBase from letta.utils import get_utc_time -class PassageBase(LettaBase): - __id_prefix__ = "passage" +class PassageBase(OrmMetadataBase): + __id_prefix__ = "passage_legacy" + + is_deleted: bool = Field(False, description="Whether this passage is deleted or not.") # associated user/agent - user_id: Optional[str] = Field(None, description="The unique identifier of the user associated with the passage.") + organization_id: Optional[str] = Field(None, description="The unique identifier of the user associated with the passage.") agent_id: Optional[str] = Field(None, description="The unique identifier of the agent associated with the passage.") # origin data source diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index 9dfd7e2bfe..06b0acd60c 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -369,8 +369,7 @@ def get_agent_archival_memory( return server.get_agent_archival_cursor( user_id=actor.id, agent_id=agent_id, - after=after, - before=before, + cursor=after, # TODO: deleting before, after. is this expected? limit=limit, ) diff --git a/letta/server/server.py b/letta/server/server.py index c60abe484c..1a5de01e96 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -16,7 +16,6 @@ import letta.server.utils as server_utils import letta.system as system from letta.agent import Agent, save_agent -from letta.agent_store.db import attach_base from letta.agent_store.storage import StorageConnector, TableType from letta.chat_only_agent import ChatOnlyAgent from letta.credentials import LettaCredentials @@ -70,17 +69,18 @@ ) from letta.schemas.message import Message, MessageCreate, MessageRole, MessageUpdate from letta.schemas.organization import Organization -from letta.schemas.passage import Passage +from letta.schemas.passage import Passage as PydanticPassage from letta.schemas.source import Source from letta.schemas.tool import Tool, ToolCreate from letta.schemas.usage import LettaUsageStatistics -from letta.schemas.user import User +from letta.schemas.user import User as PydanticUser from letta.services.agents_tags_manager import AgentsTagsManager from letta.services.block_manager import BlockManager from letta.services.blocks_agents_manager import BlocksAgentsManager from letta.services.job_manager import JobManager from letta.services.message_manager import MessageManager from letta.services.organization_manager import OrganizationManager +from letta.services.passage_manager import PassageManager from letta.services.per_agent_lock_manager import PerAgentLockManager from letta.services.sandbox_config_manager import SandboxConfigManager from letta.services.source_manager import SourceManager @@ -125,7 +125,7 @@ def update_agent_core_memory(self, user_id: str, agent_id: str, new_memory_conte def create_agent( self, request: CreateAgent, - actor: User, + actor: PydanticUser, # interface interface: Union[AgentInterface, None] = None, ) -> AgentState: @@ -166,8 +166,6 @@ def run_command(self, user_id: str, agent_id: str, command: str) -> Union[str, N config = LettaConfig.load() -attach_base() - if settings.letta_pg_uri_no_default: config.recall_storage_type = "postgres" config.recall_storage_uri = settings.letta_pg_uri_no_default @@ -245,6 +243,7 @@ def __init__( # Managers that interface with data models self.organization_manager = OrganizationManager() + self.passage_manager = PassageManager() self.user_manager = UserManager() self.tool_manager = ToolManager() self.block_manager = BlockManager() @@ -498,7 +497,12 @@ def _command(self, user_id: str, agent_id: str, command: str) -> LettaUsageStati # attach data to agent from source source_connector = StorageConnector.get_storage_connector(TableType.PASSAGES, self.config, user_id=user_id) - letta_agent.attach_source(data_source, source_connector, self.ms) + letta_agent.attach_source( + user=self.user_manager.get_user_by_id(user_id=user_id), + source_id=data_source, + source_manager=letta_agent.source_manager, + ms=self.ms + ) elif command.lower() == "dump" or command.lower().startswith("dump "): # Check if there's an additional argument that's an integer @@ -513,7 +517,7 @@ def _command(self, user_id: str, agent_id: str, command: str) -> LettaUsageStati letta_agent.interface.print_messages_raw(letta_agent.messages) elif command.lower() == "memory": - ret_str = f"\nDumping memory contents:\n" + f"\n{str(letta_agent.agent_state.memory)}" + f"\n{str(letta_agent.archival_memory)}" + ret_str = f"\nDumping memory contents:\n" + f"\n{str(letta_agent.agent_state.memory)}" + f"\n{str(letta_agent.passage_manager)}" return ret_str elif command.lower() == "pop" or command.lower().startswith("pop "): @@ -769,7 +773,7 @@ def run_command(self, user_id: str, agent_id: str, command: str) -> LettaUsageSt def create_agent( self, request: CreateAgent, - actor: User, + actor: PydanticUser, # interface interface: Union[AgentInterface, None] = None, ) -> AgentState: @@ -921,6 +925,7 @@ def get_agent(self, agent_id: str) -> Optional[AgentState]: # get `Tool` objects tools = [self.tool_manager.get_tool_by_name(tool_name=tool_name, actor=user) for tool_name in agent_state.tool_names] + tools = [tool for tool in tools if tool is not None] # get `Source` objects sources = self.list_attached_sources(agent_id=agent_id) @@ -934,7 +939,7 @@ def get_agent(self, agent_id: str) -> Optional[AgentState]: def update_agent( self, request: UpdateAgentState, - actor: User, + actor: PydanticUser, ) -> AgentState: """Update the agents core memory block, return the new state""" try: @@ -1151,7 +1156,7 @@ def get_agent_memory(self, agent_id: str) -> Memory: def get_archival_memory_summary(self, agent_id: str) -> ArchivalMemorySummary: agent = self.load_agent(agent_id=agent_id) - return ArchivalMemorySummary(size=len(agent.archival_memory)) + return ArchivalMemorySummary(size=agent.passage_manager.size(actor=self.default_user)) def get_recall_memory_summary(self, agent_id: str) -> RecallMemorySummary: agent = self.load_agent(agent_id=agent_id) @@ -1176,7 +1181,56 @@ def get_agent_message(self, agent_id: str, message_id: str) -> Message: message = agent.message_manager.get_message_by_id(id=message_id, actor=self.default_user) return message - def get_agent_archival(self, user_id: str, agent_id: str, start: int, count: int) -> List[Passage]: + def get_agent_messages( + self, + agent_id: str, + start: int, + count: int, + ) -> Union[List[Message], List[LettaMessage]]: + """Paginated query of all messages in agent message queue""" + # Get the agent object (loaded in memory) + letta_agent = self.load_agent(agent_id=agent_id) + + if start < 0 or count < 0: + raise ValueError("Start and count values should be non-negative") + + if start + count < len(letta_agent._messages): # messages can be returned from whats in memory + # Reverse the list to make it in reverse chronological order + reversed_messages = letta_agent._messages[::-1] + # Check if start is within the range of the list + if start >= len(reversed_messages): + raise IndexError("Start index is out of range") + + # Calculate the end index, ensuring it does not exceed the list length + end_index = min(start + count, len(reversed_messages)) + + # Slice the list for pagination + messages = reversed_messages[start:end_index] + + else: + # need to access persistence manager for additional messages + + # get messages using message manager + page = letta_agent.message_manager.list_user_messages_for_agent( + agent_id=agent_id, + actor=self.default_user, + cursor=start, + limit=count, + ) + + messages = page + assert all(isinstance(m, Message) for m in messages) + + ## Convert to json + ## Add a tag indicating in-context or not + # json_messages = [record.to_json() for record in messages] + # in_context_message_ids = [str(m.id) for m in letta_agent._messages] + # for d in json_messages: + # d["in_context"] = True if str(d["id"]) in in_context_message_ids else False + + return messages + + def get_agent_archival(self, user_id: str, agent_id: str, cursor: Optional[str] = None, limit: int = 50) -> List[PydanticPassage]: """Paginated query of all messages in agent archival memory""" if self.user_manager.get_user_by_id(user_id=user_id) is None: raise ValueError(f"User user_id={user_id} does not exist") @@ -1187,22 +1241,22 @@ def get_agent_archival(self, user_id: str, agent_id: str, start: int, count: int letta_agent = self.load_agent(agent_id=agent_id) # iterate over records - db_iterator = letta_agent.archival_memory.storage.get_all_paginated(page_size=count, offset=start) + records = letta_agent.passage_manager.list_passages( + actor=self.default_user, + agent_id=agent_id, + cursor=cursor, + limit=limit, + ) - # get a single page of messages - page = next(db_iterator, []) - return page + return records def get_agent_archival_cursor( self, user_id: str, agent_id: str, - after: Optional[str] = None, - before: Optional[str] = None, + cursor: Optional[str] = None, limit: Optional[int] = 100, - order_by: Optional[str] = "created_at", - reverse: Optional[bool] = False, - ) -> List[Passage]: + ) -> List[PydanticPassage]: if self.user_manager.get_user_by_id(user_id=user_id) is None: raise LettaUserNotFoundError(f"User user_id={user_id} does not exist") if self.ms.get_agent(agent_id=agent_id, user_id=user_id) is None: @@ -1211,14 +1265,15 @@ def get_agent_archival_cursor( # Get the agent object (loaded in memory) letta_agent = self.load_agent(agent_id=agent_id) - # iterate over recorde - cursor, records = letta_agent.archival_memory.storage.get_all_cursor( - after=after, before=before, limit=limit, order_by=order_by, reverse=reverse + # iterate over records + records = letta_agent.passage_manager.list_passages( + actor=self.default_user, agent_id=agent_id, cursor=cursor, limit=limit, ) return records - def insert_archival_memory(self, user_id: str, agent_id: str, memory_contents: str) -> List[Passage]: - if self.user_manager.get_user_by_id(user_id=user_id) is None: + def insert_archival_memory(self, user_id: str, agent_id: str, memory_contents: str) -> List[PydanticPassage]: + actor = self.user_manager.get_user_by_id(user_id=user_id) + if actor is None: raise ValueError(f"User user_id={user_id} does not exist") if self.ms.get_agent(agent_id=agent_id, user_id=user_id) is None: raise ValueError(f"Agent agent_id={agent_id} does not exist") @@ -1227,17 +1282,20 @@ def insert_archival_memory(self, user_id: str, agent_id: str, memory_contents: s letta_agent = self.load_agent(agent_id=agent_id) # Insert into archival memory - passage_ids = letta_agent.archival_memory.insert(memory_string=memory_contents, return_ids=True) + passage_ids = self.passage_manager.insert_passage( + agent_state=letta_agent.agent_state, agent_id=agent_id, text=memory_contents, actor=actor, return_ids=True + ) # Update the agent # TODO: should this update the system prompt? save_agent(letta_agent, self.ms) # TODO: this is gross, fix - return [letta_agent.archival_memory.storage.get(id=passage_id) for passage_id in passage_ids] + return [self.passage_manager.get_passage_by_id(passage_id=passage_id, actor=actor) for passage_id in passage_ids] def delete_archival_memory(self, user_id: str, agent_id: str, memory_id: str): - if self.user_manager.get_user_by_id(user_id=user_id) is None: + actor = self.user_manager.get_user_by_id(user_id=user_id) + if actor is None: raise ValueError(f"User user_id={user_id} does not exist") if self.ms.get_agent(agent_id=agent_id, user_id=user_id) is None: raise ValueError(f"Agent agent_id={agent_id} does not exist") @@ -1249,7 +1307,7 @@ def delete_archival_memory(self, user_id: str, agent_id: str, memory_id: str): # Delete by ID # TODO check if it exists first, and throw error if not - letta_agent.archival_memory.storage.delete({"id": memory_id}) + letta_agent.passage_manager.delete_passage_by_id(passage_id=memory_id, actor=actor) # TODO: return archival memory @@ -1395,6 +1453,12 @@ def delete_agent(self, user_id: str, agent_id: str): except NoResultFound: logger.error(f"Agent with id {agent_state.id} has nonexistent user {agent_state.user_id}") + # delete all passages associated with this agent + # TODO: REMOVE THIS ONCE WE MIGRATE AGENTMODEL TO ORM + passages = self.passage_manager.list_passages(actor=actor, agent_id=agent_state.id) + for passage in passages: + self.passage_manager.delete_passage_by_id(passage.id, actor=actor) + # First, if the agent is in the in-memory cache we should remove it # List of {'user_id': user_id, 'agent_id': agent_id, 'agent': agent_obj} dicts try: @@ -1437,7 +1501,7 @@ def delete_api_key(self, api_key: str) -> APIKey: self.ms.delete_api_key(api_key=api_key) return api_key_obj - def delete_source(self, source_id: str, actor: User): + def delete_source(self, source_id: str, actor: PydanticUser): """Delete a data source""" self.source_manager.delete_source(source_id=source_id, actor=actor) @@ -1447,7 +1511,7 @@ def delete_source(self, source_id: str, actor: User): # TODO: delete data from agent passage stores (?) - def load_file_to_source(self, source_id: str, file_path: str, job_id: str, actor: User) -> Job: + def load_file_to_source(self, source_id: str, file_path: str, job_id: str, actor: PydanticUser) -> Job: # update job job = self.job_manager.get_job_by_id(job_id, actor=actor) @@ -1474,6 +1538,7 @@ def load_data( user_id: str, connector: DataConnector, source_name: str, + agent_id: Optional[str] = None, ) -> Tuple[int, int]: """Load data from a DataConnector into a source for a specified user_id""" # TODO: this should be implemented as a batch job or at least async, since it may take a long time @@ -1488,14 +1553,13 @@ def load_data( passage_store = StorageConnector.get_storage_connector(TableType.PASSAGES, self.config, user_id=user_id) # load data into the document store - passage_count, document_count = load_data(connector, source, passage_store, self.source_manager, actor=user) + passage_count, document_count = load_data(connector, source, passage_store, self.source_manager, actor=user, agent_id=agent_id) return passage_count, document_count def attach_source_to_agent( self, user_id: str, agent_id: str, - # source_id: str, source_id: Optional[str] = None, source_name: Optional[str] = None, ) -> Source: @@ -1507,15 +1571,14 @@ def attach_source_to_agent( data_source = self.source_manager.get_source_by_name(source_name=source_name, actor=user) else: raise ValueError(f"Need to provide at least source_id or source_name to find the source.") - # get connection to data source storage - source_connector = StorageConnector.get_storage_connector(TableType.PASSAGES, self.config, user_id=user_id) + assert data_source, f"Data source with id={source_id} or name={source_name} does not exist" # load agent agent = self.load_agent(agent_id=agent_id) # attach source to agent - agent.attach_source(data_source.id, source_connector, self.ms) + agent.attach_source(user=user, source_id=data_source.id, source_manager=self.source_manager, ms=self.ms) return data_source @@ -1538,8 +1601,7 @@ def detach_source_from_agent( # delete all Passage objects with source_id==source_id from agent's archival memory agent = self.load_agent(agent_id=agent_id) - archival_memory = agent.archival_memory - archival_memory.storage.delete({"source_id": source_id}) + agent.passage_manager.delete_passages(actor=user, limit=100, source_id=source_id) # delete agent-source mapping self.ms.detach_source(agent_id=agent_id, source_id=source_id) @@ -1553,11 +1615,11 @@ def list_attached_sources(self, agent_id: str) -> List[Source]: return [self.source_manager.get_source_by_id(source_id=id) for id in source_ids] - def list_data_source_passages(self, user_id: str, source_id: str) -> List[Passage]: + def list_data_source_passages(self, user_id: str, source_id: str) -> List[PydanticPassage]: warnings.warn("list_data_source_passages is not yet implemented, returning empty list.", category=UserWarning) return [] - def list_all_sources(self, actor: User) -> List[Source]: + def list_all_sources(self, actor: PydanticUser) -> List[Source]: """List all sources (w/ extra metadata) belonging to a user""" sources = self.source_manager.list_sources(actor=actor) @@ -1597,7 +1659,7 @@ def list_all_sources(self, actor: User) -> List[Source]: return sources_with_metadata - def add_default_external_tools(self, actor: User) -> bool: + def add_default_external_tools(self, actor: PydanticUser) -> bool: """Add default langchain tools. Return true if successful, false otherwise.""" success = True tool_creates = ToolCreate.load_default_langchain_tools() @@ -1654,7 +1716,7 @@ def retry_agent_message(self, agent_id: str) -> List[Message]: save_agent(letta_agent, self.ms) return response - def get_user_or_default(self, user_id: Optional[str]) -> User: + def get_user_or_default(self, user_id: Optional[str]) -> PydanticUser: """Get the user object for user_id if it exists, otherwise return the default user object""" if user_id is None: user_id = self.user_manager.DEFAULT_USER_ID diff --git a/letta/services/passage_manager.py b/letta/services/passage_manager.py new file mode 100644 index 0000000000..c1933b3943 --- /dev/null +++ b/letta/services/passage_manager.py @@ -0,0 +1,225 @@ +from typing import List, Optional, Dict, Tuple +from letta.constants import MAX_EMBEDDING_DIM +from datetime import datetime +import numpy as np + +from letta.orm.errors import NoResultFound +from letta.utils import enforce_types + +from letta.embeddings import embedding_model, parse_and_chunk_text +from letta.schemas.embedding_config import EmbeddingConfig + +from letta.orm.passage import Passage as PassageModel +from letta.orm.sqlalchemy_base import AccessType +from letta.schemas.agent import AgentState +from letta.schemas.passage import Passage as PydanticPassage +from letta.schemas.user import User as PydanticUser + +class PassageManager: + """Manager class to handle business logic related to Passages.""" + + def __init__(self): + from letta.server.server import db_context + self.session_maker = db_context + + @enforce_types + def get_passage_by_id(self, passage_id: str, actor: PydanticUser) -> Optional[PydanticPassage]: + """Fetch a passage by ID.""" + with self.session_maker() as session: + try: + passage = PassageModel.read(db_session=session, identifier=passage_id, actor=actor) + return passage.to_pydantic() + except NoResultFound: + return None + + @enforce_types + def create_passage(self, pydantic_passage: PydanticPassage, actor: PydanticUser) -> PydanticPassage: + """Create a new passage.""" + with self.session_maker() as session: + passage = PassageModel(**pydantic_passage.model_dump()) + passage.create(session, actor=actor) + return passage.to_pydantic() + + @enforce_types + def create_many_passages(self, passages: List[PydanticPassage], actor: PydanticUser) -> List[PydanticPassage]: + """Create multiple passages.""" + return [self.create_passage(p, actor) for p in passages] + + @enforce_types + def insert_passage(self, + agent_state: AgentState, + agent_id: str, + text: str, + actor: PydanticUser, + return_ids: bool = False + ) -> List[PydanticPassage]: + """ Insert passage(s) into archival memory """ + + embedding_chunk_size = agent_state.embedding_config.embedding_chunk_size + embed_model = embedding_model(agent_state.embedding_config) + + passages = [] + + try: + # breakup string into passages + for text in parse_and_chunk_text(text, embedding_chunk_size): + embedding = embed_model.get_text_embedding(text) + if isinstance(embedding, dict): + try: + embedding = embedding["data"][0]["embedding"] + except (KeyError, IndexError): + # TODO as a fallback, see if we can find any lists in the payload + raise TypeError( + f"Got back an unexpected payload from text embedding function, type={type(embedding)}, value={embedding}" + ) + passage = self.create_passage( + PydanticPassage( + organization_id=actor.organization_id, + agent_id=agent_id, + text=text, + embedding=embedding, + embedding_config=agent_state.embedding_config + ), + actor=actor + ) + passages.append(passage) + + ids = [str(p.id) for p in passages] + + if return_ids: + return ids + + return passages + + except Exception as e: + raise e + + @enforce_types + def update_passage_by_id(self, passage_id: str, passage: PydanticPassage, actor: PydanticUser, **kwargs) -> Optional[PydanticPassage]: + """Update a passage.""" + if not passage_id: + raise ValueError("Passage ID must be provided.") + + with self.session_maker() as session: + try: + # Fetch existing message from database + curr_passage = PassageModel.read( + db_session=session, + identifier=passage_id, + actor=actor, + ) + if not curr_passage: + raise ValueError(f"Passage with id {passage_id} does not exist.") + + # Update the database record with values from the provided record + update_data = passage.model_dump(exclude_unset=True, exclude_none=True) + for key, value in update_data.items(): + setattr(curr_passage, key, value) + + # Commit changes + curr_passage.update(session, actor=actor) + return curr_passage.to_pydantic() + except NoResultFound: + return None + + @enforce_types + def delete_passage_by_id(self, passage_id: str, actor: PydanticUser) -> bool: + """Delete a passage.""" + if not passage_id: + raise ValueError("Passage ID must be provided.") + + with self.session_maker() as session: + try: + passage = PassageModel.read(db_session=session, identifier=passage_id, actor=actor) + passage.hard_delete(session, actor=actor) + except NoResultFound: + raise ValueError(f"Passage with id {passage_id} not found.") + + @enforce_types + def list_passages(self, + actor : PydanticUser, + agent_id : Optional[str] = None, + file_id : Optional[str] = None, + cursor : Optional[str] = None, + limit : Optional[int] = 50, + query_text : Optional[str] = None, + start_date : Optional[datetime] = None, + end_date : Optional[datetime] = None, + source_id : Optional[str] = None, + embed_query : bool = False, + embedding_config: Optional[EmbeddingConfig] = None + ) -> List[PydanticPassage]: + """List passages with pagination.""" + with self.session_maker() as session: + filters = {"organization_id": actor.organization_id} + if agent_id: + filters["agent_id"] = agent_id + if file_id: + filters["file_id"] = file_id + if source_id: + filters["source_id"] = source_id + + embedded_text = None + if embed_query: + assert embedding_config is not None + + # Embed the text + embedded_text = embedding_model(embedding_config).get_text_embedding(query_text) + + # Pad the embedding with zeros + embedded_text = np.array(embedded_text) + embedded_text = np.pad(embedded_text, (0, MAX_EMBEDDING_DIM - embedded_text.shape[0]), mode="constant").tolist() + + results = PassageModel.list( + db_session=session, + cursor=cursor, + start_date=start_date, + end_date=end_date, + limit=limit, + query_text=query_text if not embedded_text else None, + query_embedding=embedded_text, + **filters + ) + return [p.to_pydantic() for p in results] + + @enforce_types + def size( + self, + actor : PydanticUser, + agent_id : Optional[str] = None, + **kwargs + ) -> int: + """Get the total count of messages with optional filters. + + Args: + actor : The user requesting the count + agent_id: The agent ID + """ + with self.session_maker() as session: + return PassageModel.size(db_session=session, actor=actor, agent_id=agent_id, **kwargs) + + def delete_passages(self, + actor: PydanticUser, + agent_id: Optional[str] = None, + file_id: Optional[str] = None, + start_date: Optional[datetime] = None, + end_date: Optional[datetime] = None, + limit: Optional[int] = 50, + cursor: Optional[str] = None, + query_text: Optional[str] = None, + source_id: Optional[str] = None + ) -> bool: + + passages = self.list_passages( + actor=actor, + agent_id=agent_id, + file_id=file_id, + cursor=cursor, + limit=limit, + start_date=start_date, + end_date=end_date, + query_text=query_text, + source_id=source_id) + + for passage in passages: + self.delete_passage_by_id(passage_id=passage.id, actor=actor) diff --git a/letta/services/source_manager.py b/letta/services/source_manager.py index f2b48e9bad..a6745cec94 100644 --- a/letta/services/source_manager.py +++ b/letta/services/source_manager.py @@ -64,7 +64,7 @@ def delete_source(self, source_id: str, actor: PydanticUser) -> PydanticSource: return source.to_pydantic() @enforce_types - def list_sources(self, actor: PydanticUser, cursor: Optional[str] = None, limit: Optional[int] = 50) -> List[PydanticSource]: + def list_sources(self, actor: PydanticUser, cursor: Optional[str] = None, limit: Optional[int] = 50, **kwargs) -> List[PydanticSource]: """List all sources with optional pagination.""" with self.session_maker() as session: sources = SourceModel.list( @@ -72,6 +72,7 @@ def list_sources(self, actor: PydanticUser, cursor: Optional[str] = None, limit: cursor=cursor, limit=limit, organization_id=actor.organization_id, + **kwargs, ) return [source.to_pydantic() for source in sources] diff --git a/letta/settings.py b/letta/settings.py index 7271ff29d6..41aca91d00 100644 --- a/letta/settings.py +++ b/letta/settings.py @@ -17,6 +17,8 @@ class ToolSettings(BaseSettings): class ModelSettings(BaseSettings): + model_config = SettingsConfigDict(env_file='.env') + # env_prefix='my_prefix_' # when we use /completions APIs (instead of /chat/completions), we need to specify a model wrapper diff --git a/pyproject.toml b/pyproject.toml index cf07689a68..9b8ff29318 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -104,4 +104,4 @@ extend-exclude = "examples/*" [build-system] requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" +build-backend = "poetry.core.masonry.api" \ No newline at end of file diff --git a/tests/test_base_functions.py b/tests/test_base_functions.py index 0668f2fd0f..199800eb0c 100644 --- a/tests/test_base_functions.py +++ b/tests/test_base_functions.py @@ -29,11 +29,63 @@ def agent_obj(): client.delete_agent(agent_obj.agent_state.id) -def test_archival(agent_obj): - base_functions.archival_memory_insert(agent_obj, "banana") - base_functions.archival_memory_search(agent_obj, "banana") - base_functions.archival_memory_search(agent_obj, "banana", page=0) +def query_in_search_results(search_results, query): + for result in search_results: + if query.lower() in result["content"].lower(): + return True + return False +def test_archival(agent_obj): + """Test archival memory functions comprehensively.""" + # Test 1: Basic insertion and retrieval + base_functions.archival_memory_insert(agent_obj, "The cat sleeps on the mat") + base_functions.archival_memory_insert(agent_obj, "The dog plays in the park") + base_functions.archival_memory_insert(agent_obj, "Python is a programming language") + + # Test exact text search + results, _ = base_functions.archival_memory_search(agent_obj, "cat") + assert query_in_search_results(results, "cat") + + # Test semantic search (should return animal-related content) + results, _ = base_functions.archival_memory_search(agent_obj, "animal pets") + assert query_in_search_results(results, "cat") or query_in_search_results(results, "dog") + + # Test unrelated search (should not return animal content) + results, _ = base_functions.archival_memory_search(agent_obj, "programming computers") + assert query_in_search_results(results, "python") + + # Test 2: Test pagination + # Insert more items to test pagination + for i in range(10): + base_functions.archival_memory_insert(agent_obj, f"Test passage number {i}") + + # Get first page + page0_results, next_page = base_functions.archival_memory_search(agent_obj, "Test passage", page=0) + # Get second page + page1_results, _ = base_functions.archival_memory_search(agent_obj, "Test passage", page=1, start=next_page) + + assert page0_results != page1_results + assert query_in_search_results(page0_results, "Test passage") + assert query_in_search_results(page1_results, "Test passage") + + # Test 3: Test complex text patterns + base_functions.archival_memory_insert(agent_obj, "Important meeting on 2024-01-15 with John") + base_functions.archival_memory_insert(agent_obj, "Follow-up meeting scheduled for next week") + base_functions.archival_memory_insert(agent_obj, "Project deadline is approaching") + + # Search for meeting-related content + results, _ = base_functions.archival_memory_search(agent_obj, "meeting schedule") + assert query_in_search_results(results, "meeting") + assert query_in_search_results(results, "2024-01-15") or query_in_search_results(results, "next week") + + # Test 4: Test error handling + # Test invalid page number + try: + base_functions.archival_memory_search(agent_obj, "test", page="invalid") + assert False, "Should have raised ValueError" + except ValueError: + pass + def test_recall(agent_obj): base_functions.conversation_search(agent_obj, "banana") diff --git a/tests/test_client_legacy.py b/tests/test_client_legacy.py index 65bd5f16b2..fff0e466cf 100644 --- a/tests/test_client_legacy.py +++ b/tests/test_client_legacy.py @@ -649,7 +649,6 @@ def test_initial_message_sequence(client: Union[LocalClient, RESTClient], agent: system=agent.system, agent_id=agent.id, memory=agent.memory, - archival_memory=None, memory_edit_timestamp=get_utc_time(), include_initial_boot_message=True, actor=default_user, diff --git a/tests/test_managers.py b/tests/test_managers.py index 74675b4cb5..f6e5436647 100644 --- a/tests/test_managers.py +++ b/tests/test_managers.py @@ -5,9 +5,11 @@ import pytest from sqlalchemy import delete +from letta.embeddings import embedding_model import letta.utils as utils from letta.functions.functions import derive_openai_json_schema, parse_source_code from letta.metadata import AgentModel +from letta.orm.sqlite_functions import verify_embedding_dimension, convert_array from letta.orm import ( Block, BlocksAgents, @@ -15,6 +17,7 @@ Job, Message, Organization, + Passage, SandboxConfig, SandboxEnvironmentVariable, Source, @@ -40,6 +43,7 @@ from letta.schemas.message import Message as PydanticMessage from letta.schemas.message import MessageUpdate from letta.schemas.organization import Organization as PydanticOrganization +from letta.schemas.passage import Passage as PydanticPassage from letta.schemas.sandbox_config import ( E2BSandboxConfig, LocalSandboxConfig, @@ -55,6 +59,7 @@ from letta.schemas.tool import ToolUpdate from letta.services.block_manager import BlockManager from letta.services.organization_manager import OrganizationManager +from letta.services.passage_manager import PassageManager from letta.services.tool_manager import ToolManager from letta.settings import tool_settings @@ -83,6 +88,7 @@ def clear_tables(server: SyncServer): """Fixture to clear the organization table before each test.""" with server.organization_manager.session_maker() as session: session.execute(delete(Message)) + session.execute(delete(Passage)) session.execute(delete(Job)) session.execute(delete(ToolsAgents)) # Clear ToolsAgents first session.execute(delete(BlocksAgents)) @@ -132,6 +138,16 @@ def default_source(server: SyncServer, default_user): yield source +@pytest.fixture +def default_file(server: SyncServer, default_source, default_user, default_organization): + file = server.source_manager.create_file( + PydanticFileMetadata( + file_name="test_file", organization_id=default_organization.id, source_id=default_source.id), + actor=default_user, + ) + yield file + + @pytest.fixture def sarah_agent(server: SyncServer, default_user, default_organization): """Fixture to create and return a sample agent within the default organization.""" @@ -197,6 +213,41 @@ def print_tool(message: str): yield tool +@pytest.fixture +def hello_world_passage_fixture(server: SyncServer, default_user, default_file, sarah_agent): + """Fixture to create a tool with default settings and clean up after the test.""" + # Set up passage + dummy_embedding = [0.0] * 2 + message = PydanticPassage( + organization_id=default_user.organization_id, + agent_id=sarah_agent.id, + file_id=default_file.id, + text="Hello, world!", + embedding=dummy_embedding, + embedding_config=DEFAULT_EMBEDDING_CONFIG + ) + + msg = server.passage_manager.create_passage(message, actor=default_user) + yield msg + + +@pytest.fixture +def create_test_passages(server: SyncServer, default_file, default_user, sarah_agent) -> list[PydanticPassage]: + """Helper function to create test passages for all tests""" + dummy_embedding = [0] * 2 + passages = [ + PydanticPassage( + organization_id=default_user.organization_id, + agent_id=sarah_agent.id, + file_id=default_file.id, + text=f"Test passage {i}", + embedding=dummy_embedding, + embedding_config=DEFAULT_EMBEDDING_CONFIG + ) for i in range(4) + ] + server.passage_manager.create_many_passages(passages, actor=default_user) + return passages + @pytest.fixture def hello_world_message_fixture(server: SyncServer, default_user, sarah_agent): """Fixture to create a tool with default settings and clean up after the test.""" @@ -353,6 +404,288 @@ def test_list_organizations_pagination(server: SyncServer): assert len(orgs) == 0 +# ====================================================================================================================== +# Passage Manager Tests +# ====================================================================================================================== + +def test_passage_create(server: SyncServer, hello_world_passage_fixture, default_user): + """Test creating a passage using hello_world_passage_fixture fixture""" + assert hello_world_passage_fixture.id is not None + assert hello_world_passage_fixture.text == "Hello, world!" + + # Verify we can retrieve it + retrieved = server.passage_manager.get_passage_by_id( + hello_world_passage_fixture.id, + actor=default_user, + ) + assert retrieved is not None + assert retrieved.id == hello_world_passage_fixture.id + assert retrieved.text == hello_world_passage_fixture.text + + +def test_passage_get_by_id(server: SyncServer, hello_world_passage_fixture, default_user): + """Test retrieving a passage by ID""" + retrieved = server.passage_manager.get_passage_by_id(hello_world_passage_fixture.id, actor=default_user) + assert retrieved is not None + assert retrieved.id == hello_world_passage_fixture.id + assert retrieved.text == hello_world_passage_fixture.text + + +def test_passage_update(server: SyncServer, hello_world_passage_fixture, default_user): + """Test updating a passage""" + new_text = "Updated text" + hello_world_passage_fixture.text = new_text + updated = server.passage_manager.update_passage_by_id(hello_world_passage_fixture.id, hello_world_passage_fixture, actor=default_user) + assert updated is not None + assert updated.text == new_text + retrieved = server.passage_manager.get_passage_by_id(hello_world_passage_fixture.id, actor=default_user) + assert retrieved.text == new_text + + +def test_passage_delete(server: SyncServer, hello_world_passage_fixture, default_user): + """Test deleting a passage""" + server.passage_manager.delete_passage_by_id(hello_world_passage_fixture.id, actor=default_user) + retrieved = server.passage_manager.get_passage_by_id(hello_world_passage_fixture.id, actor=default_user) + assert retrieved is None + + +def test_passage_size(server: SyncServer, hello_world_passage_fixture, create_test_passages, default_user): + """Test counting passages with filters""" + base_passage = hello_world_passage_fixture + + # Test total count + total = server.passage_manager.size(actor=default_user) + assert total == 5 # base passage + 4 test passages + # TODO: change login passage to be a system not user passage + + # Test count with agent filter + agent_count = server.passage_manager.size(actor=default_user, agent_id=base_passage.agent_id) + assert agent_count == 5 + + # Test count with role filter + role_count = server.passage_manager.size(actor=default_user) + assert role_count == 5 + + # Test count with non-existent filter + empty_count = server.passage_manager.size(actor=default_user, agent_id="non-existent") + assert empty_count == 0 + + +def test_passage_listing_basic(server: SyncServer, hello_world_passage_fixture, create_test_passages, default_user): + """Test basic passage listing with limit""" + results = server.passage_manager.list_passages(actor=default_user, limit=3) + assert len(results) == 3 + + +def test_passage_listing_cursor(server: SyncServer, hello_world_passage_fixture, create_test_passages, default_user): + """Test cursor-based pagination functionality""" + + # Make sure there are 5 passages + assert server.passage_manager.size(actor=default_user) == 5 + + # Get first page + first_page = server.passage_manager.list_passages(actor=default_user, limit=3) + assert len(first_page) == 3 + + last_id_on_first_page = first_page[-1].id + + # Get second page + second_page = server.passage_manager.list_passages( + actor=default_user, cursor=last_id_on_first_page, limit=3 + ) + assert len(second_page) == 2 # Should have 2 remaining passages + assert all(r1.id != r2.id for r1 in first_page for r2 in second_page) + + +def test_passage_listing_filtering(server: SyncServer, hello_world_passage_fixture, create_test_passages, default_user, sarah_agent): + """Test filtering passages by agent ID""" + agent_results = server.passage_manager.list_passages(agent_id=sarah_agent.id, actor=default_user, limit=10) + assert len(agent_results) == 5 # base passage + 4 test passages + assert all(msg.agent_id == hello_world_passage_fixture.agent_id for msg in agent_results) + + +def test_passage_listing_text_search(server: SyncServer, hello_world_passage_fixture, create_test_passages, default_user, sarah_agent): + """Test searching passages by text content""" + search_results = server.passage_manager.list_passages( + agent_id=sarah_agent.id, actor=default_user, query_text="Test passage", limit=10 + ) + assert len(search_results) == 4 + assert all("Test passage" in msg.text for msg in search_results) + + # Test no results + search_results = server.passage_manager.list_passages( + agent_id=sarah_agent.id, actor=default_user, query_text="Letta", limit=10 + ) + assert len(search_results) == 0 + + +def test_passage_listing_date_range_filtering(server: SyncServer, hello_world_passage_fixture, default_user, default_file, sarah_agent): + """Test filtering passages by date range with various scenarios""" + # Set up test data with known dates + base_time = datetime.utcnow() + + # Create passages at different times + passages = [] + time_offsets = [ + timedelta(days=-2), # 2 days ago + timedelta(days=-1), # Yesterday + timedelta(hours=-2), # 2 hours ago + timedelta(minutes=-30), # 30 minutes ago + timedelta(minutes=-1), # 1 minute ago + timedelta(minutes=0), # Now + ] + + for i, offset in enumerate(time_offsets): + timestamp = base_time + offset + passage = server.passage_manager.create_passage( + PydanticPassage( + organization_id=default_user.organization_id, + agent_id=sarah_agent.id, + file_id=default_file.id, + text=f"Test passage {i}", + embedding=[0.1, 0.2, 0.3], + embedding_config=DEFAULT_EMBEDDING_CONFIG, + created_at=timestamp + ), + actor=default_user + ) + passages.append(passage) + + # Test cases + test_cases = [ + { + "name": "Recent passages (last hour)", + "start_date": base_time - timedelta(hours=1), + "end_date": base_time + timedelta(minutes=1), + "expected_count": 1 + 3, # Should include base + -30min, -1min, and now + }, + { + "name": "Yesterday's passages", + "start_date": base_time - timedelta(days=1, hours=12), + "end_date": base_time - timedelta(hours=12), + "expected_count": 1, # Should only include yesterday's passage + }, + { + "name": "Future time range", + "start_date": base_time + timedelta(days=1), + "end_date": base_time + timedelta(days=2), + "expected_count": 0, # Should find no passages + }, + { + "name": "All time", + "start_date": base_time - timedelta(days=3), + "end_date": base_time + timedelta(days=1), + "expected_count": 1 + len(passages), # Should find all passages + }, + { + "name": "Exact timestamp match", + "start_date": passages[0].created_at - timedelta(microseconds=1), + "end_date": passages[0].created_at + timedelta(microseconds=1), + "expected_count": 1, # Should find exactly one passage + }, + { + "name": "Small time window", + "start_date": base_time - timedelta(seconds=30), + "end_date": base_time + timedelta(seconds=30), + "expected_count": 1 + 1, # date + "now" + } + ] + + # Run test cases + for case in test_cases: + results = server.passage_manager.list_passages( + agent_id=sarah_agent.id, + actor=default_user, + start_date=case["start_date"], + end_date=case["end_date"], + limit=10 + ) + + # Verify count + assert len(results) == case["expected_count"], \ + f"Test case '{case['name']}' failed: expected {case['expected_count']} passages, got {len(results)}" + + # Test edge cases + + # Test with start_date but no end_date + results_start_only = server.passage_manager.list_passages( + agent_id=sarah_agent.id, + actor=default_user, + start_date=base_time - timedelta(minutes=2), + end_date=None, + limit=10 + ) + assert len(results_start_only) >= 2, "Should find passages after start_date" + + # Test with end_date but no start_date + results_end_only = server.passage_manager.list_passages( + agent_id=sarah_agent.id, + actor=default_user, + start_date=None, + end_date=base_time - timedelta(days=1), + limit=10 + ) + assert len(results_end_only) >= 1, "Should find passages before end_date" + + # Test limit enforcement + limited_results = server.passage_manager.list_passages( + agent_id=sarah_agent.id, + actor=default_user, + start_date=base_time - timedelta(days=3), + end_date=base_time + timedelta(days=1), + limit=3 + ) + assert len(limited_results) <= 3, "Should respect the limit parameter" + + +def test_passage_vector_search(server: SyncServer, default_user, default_file, sarah_agent): + """Test vector search functionality for passages.""" + passage_manager = server.passage_manager + embed_model = embedding_model(DEFAULT_EMBEDDING_CONFIG) + + # Create passages with known embeddings + passages = [] + + # Create passages with different embeddings + test_passages = [ + "I like red", + "random text", + "blue shoes", + ] + + for text in test_passages: + embedding = embed_model.get_text_embedding(text) + passage = PydanticPassage( + text=text, + organization_id=default_user.organization_id, + agent_id=sarah_agent.id, + embedding_config=DEFAULT_EMBEDDING_CONFIG, + embedding=embedding + ) + created_passage = passage_manager.create_passage(passage, default_user) + passages.append(created_passage) + assert passage_manager.size(actor=default_user) == len(passages) + + # Query vector similar to "cats" embedding + query_key = "What's my favorite color?" + + # List passages with vector search + results = passage_manager.list_passages( + actor=default_user, + agent_id=sarah_agent.id, + query_text=query_key, + limit=3, + embedding_config=DEFAULT_EMBEDDING_CONFIG, + embed_query=True, + ) + + # Verify results are ordered by similarity + assert len(results) == 3 + assert results[0].text == "I like red" + assert results[1].text == "random text" # For some reason the embedding model doesn't like "blue shoes" + assert results[2].text == "blue shoes" + + # ====================================================================================================================== # User Manager Tests # ====================================================================================================================== @@ -834,8 +1167,6 @@ def test_delete_block(server: SyncServer, default_user): # ====================================================================================================================== # Source Manager Tests - Sources # ====================================================================================================================== - - def test_create_source(server: SyncServer, default_user): """Test creating a new source.""" source_pydantic = PydanticSource( @@ -1049,8 +1380,6 @@ def test_delete_file(server: SyncServer, default_user, default_source): # ====================================================================================================================== # AgentsTagsManager Tests # ====================================================================================================================== - - def test_add_tag_to_agent(server: SyncServer, sarah_agent, default_user): # Add a tag to the agent tag_name = "test_tag" diff --git a/tests/test_server.py b/tests/test_server.py index 32e5da6902..555b7c07ef 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -117,6 +117,9 @@ def test_user_message_memory(server, user_id, agent_id): @pytest.mark.order(3) def test_load_data(server, user_id, agent_id): # create source + passages_before = server.get_agent_archival(user_id=user_id, agent_id=agent_id, cursor=None, limit=10000) + assert len(passages_before) == 0 + source = server.source_manager.create_source( Source(name="test_source", embedding_config=DEFAULT_EMBEDDING_CONFIG), actor=server.default_user ) @@ -130,19 +133,17 @@ def test_load_data(server, user_id, agent_id): "Shishir loves indian food", ] connector = DummyDataConnector(archival_memories) - server.load_data(user_id, connector, source.name) + server.load_data(user_id, connector, source.name, agent_id=agent_id) # @pytest.mark.order(3) # def test_attach_source_to_agent(server, user_id, agent_id): # check archival memory size - passages_before = server.get_agent_archival(user_id=user_id, agent_id=agent_id, start=0, count=10000) - assert len(passages_before) == 0 # attach source server.attach_source_to_agent(user_id=user_id, agent_id=agent_id, source_name="test_source") # check archival memory size - passages_after = server.get_agent_archival(user_id=user_id, agent_id=agent_id, start=0, count=10000) + passages_after = server.get_agent_archival(user_id=user_id, agent_id=agent_id, cursor=None, limit=10000) assert len(passages_after) == 5 @@ -182,41 +183,42 @@ def test_get_recall_memory(server, org_id, user_id, agent_id): assert message_id in message_ids, f"{message_id} not in {message_ids}" -@pytest.mark.order(6) -def test_get_archival_memory(server, user_id, agent_id): - # test archival memory cursor pagination - passages_1 = server.get_agent_archival_cursor(user_id=user_id, agent_id=agent_id, reverse=False, limit=2, order_by="text") - assert len(passages_1) == 2, f"Returned {[p.text for p in passages_1]}, not equal to 2" - cursor1 = passages_1[-1].id - passages_2 = server.get_agent_archival_cursor( - user_id=user_id, - agent_id=agent_id, - reverse=False, - after=cursor1, - order_by="text", - ) - cursor2 = passages_2[-1].id - passages_3 = server.get_agent_archival_cursor( - user_id=user_id, - agent_id=agent_id, - reverse=False, - before=cursor2, - limit=1000, - order_by="text", - ) - passages_3[-1].id - # assert passages_1[0].text == "Cinderella wore a blue dress" - assert len(passages_2) in [3, 4] # NOTE: exact size seems non-deterministic, so loosen test - assert len(passages_3) in [4, 5] # NOTE: exact size seems non-deterministic, so loosen test - - # test archival memory - passage_1 = server.get_agent_archival(user_id=user_id, agent_id=agent_id, start=0, count=1) - assert len(passage_1) == 1 - passage_2 = server.get_agent_archival(user_id=user_id, agent_id=agent_id, start=1, count=1000) - assert len(passage_2) in [4, 5] # NOTE: exact size seems non-deterministic, so loosen test - # test safe empty return - passage_none = server.get_agent_archival(user_id=user_id, agent_id=agent_id, start=1000, count=1000) - assert len(passage_none) == 0 +# TODO: Out-of-date test. pagination commands are off +# @pytest.mark.order(6) +# def test_get_archival_memory(server, user_id, agent_id): +# # test archival memory cursor pagination +# passages_1 = server.get_agent_archival_cursor(user_id=user_id, agent_id=agent_id, reverse=False, limit=2, order_by="text") +# assert len(passages_1) == 2, f"Returned {[p.text for p in passages_1]}, not equal to 2" +# cursor1 = passages_1[-1].id +# passages_2 = server.get_agent_archival_cursor( +# user_id=user_id, +# agent_id=agent_id, +# reverse=False, +# after=cursor1, +# order_by="text", +# ) +# cursor2 = passages_2[-1].id +# passages_3 = server.get_agent_archival_cursor( +# user_id=user_id, +# agent_id=agent_id, +# reverse=False, +# before=cursor2, +# limit=1000, +# order_by="text", +# ) +# passages_3[-1].id +# # assert passages_1[0].text == "Cinderella wore a blue dress" +# assert len(passages_2) in [3, 4] # NOTE: exact size seems non-deterministic, so loosen test +# assert len(passages_3) in [4, 5] # NOTE: exact size seems non-deterministic, so loosen test + +# # test archival memory +# passage_1 = server.get_agent_archival(user_id=user_id, agent_id=agent_id, start=0, count=1) +# assert len(passage_1) == 1 +# passage_2 = server.get_agent_archival(user_id=user_id, agent_id=agent_id, start=1, count=1000) +# assert len(passage_2) in [4, 5] # NOTE: exact size seems non-deterministic, so loosen test +# # test safe empty return +# passage_none = server.get_agent_archival(user_id=user_id, agent_id=agent_id, start=1000, count=1000) +# assert len(passage_none) == 0 def test_agent_rethink_rewrite_retry(server, user_id, agent_id): diff --git a/tests/test_vector_embeddings.py b/tests/test_vector_embeddings.py new file mode 100644 index 0000000000..0ad25071ab --- /dev/null +++ b/tests/test_vector_embeddings.py @@ -0,0 +1,42 @@ +import numpy as np +import sqlite3 +import base64 +from numpy.testing import assert_array_almost_equal + +import pytest + +from letta.orm.sqlalchemy_base import adapt_array, convert_array +from letta.orm.sqlite_functions import verify_embedding_dimension + +def test_vector_conversions(): + """Test the vector conversion functions""" + # Create test data + original = np.random.random(4096).astype(np.float32) + print(f"Original shape: {original.shape}") + + # Test full conversion cycle + encoded = adapt_array(original) + print(f"Encoded type: {type(encoded)}") + print(f"Encoded length: {len(encoded)}") + + decoded = convert_array(encoded) + print(f"Decoded shape: {decoded.shape}") + print(f"Dimension verification: {verify_embedding_dimension(decoded)}") + + # Verify data integrity + np.testing.assert_array_almost_equal(original, decoded) + print("✓ Data integrity verified") + + # Test with a list + list_data = original.tolist() + encoded_list = adapt_array(list_data) + decoded_list = convert_array(encoded_list) + np.testing.assert_array_almost_equal(original, decoded_list) + print("✓ List conversion verified") + + # Test None handling + assert adapt_array(None) is None + assert convert_array(None) is None + print("✓ None handling verified") + +# Run the tests \ No newline at end of file From 470f95a5ee1ae7b3af6d4fc3c9e5305170d92706 Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Tue, 10 Dec 2024 18:29:25 -0800 Subject: [PATCH 064/280] fix: cleanup dependencies (#2224) --- poetry.lock | 1058 +------------------------------- pyproject.toml | 3 +- tests/test_websocket_server.py | 55 -- 3 files changed, 7 insertions(+), 1109 deletions(-) delete mode 100644 tests/test_websocket_server.py diff --git a/poetry.lock b/poetry.lock index f0cb082bd8..28ee1fe673 100644 --- a/poetry.lock +++ b/poetry.lock @@ -185,23 +185,6 @@ files = [ {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, ] -[[package]] -name = "asgiref" -version = "3.8.1" -description = "ASGI specs, helper code, and adapters" -optional = false -python-versions = ">=3.8" -files = [ - {file = "asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47"}, - {file = "asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590"}, -] - -[package.dependencies] -typing-extensions = {version = ">=4", markers = "python_version < \"3.11\""} - -[package.extras] -tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] - [[package]] name = "asn1crypto" version = "1.5.1" @@ -273,17 +256,6 @@ files = [ pyflakes = ">=3.0.0" tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} -[[package]] -name = "backoff" -version = "2.2.1" -description = "Function decoration for backoff and retry" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, - {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, -] - [[package]] name = "bcrypt" version = "4.2.1" @@ -494,42 +466,6 @@ files = [ {file = "Brotli-1.1.0.tar.gz", hash = "sha256:81de08ac11bcb85841e440c13611c00b67d3bf82698314928d0b676362546724"}, ] -[[package]] -name = "build" -version = "1.2.2.post1" -description = "A simple, correct Python build frontend" -optional = false -python-versions = ">=3.8" -files = [ - {file = "build-1.2.2.post1-py3-none-any.whl", hash = "sha256:1d61c0887fa860c01971625baae8bdd338e517b836a2f70dd1f7aa3a6b2fc5b5"}, - {file = "build-1.2.2.post1.tar.gz", hash = "sha256:b36993e92ca9375a219c99e606a122ff365a760a2d4bba0caa09bd5278b608b7"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "os_name == \"nt\""} -importlib-metadata = {version = ">=4.6", markers = "python_full_version < \"3.10.2\""} -packaging = ">=19.1" -pyproject_hooks = "*" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} - -[package.extras] -docs = ["furo (>=2023.08.17)", "sphinx (>=7.0,<8.0)", "sphinx-argparse-cli (>=1.5)", "sphinx-autodoc-typehints (>=1.10)", "sphinx-issues (>=3.0.0)"] -test = ["build[uv,virtualenv]", "filelock (>=3)", "pytest (>=6.2.4)", "pytest-cov (>=2.12)", "pytest-mock (>=2)", "pytest-rerunfailures (>=9.1)", "pytest-xdist (>=1.34)", "setuptools (>=42.0.0)", "setuptools (>=56.0.0)", "setuptools (>=56.0.0)", "setuptools (>=67.8.0)", "wheel (>=0.36.0)"] -typing = ["build[uv]", "importlib-metadata (>=5.1)", "mypy (>=1.9.0,<1.10.0)", "tomli", "typing-extensions (>=3.7.4.3)"] -uv = ["uv (>=0.1.18)"] -virtualenv = ["virtualenv (>=20.0.35)"] - -[[package]] -name = "cachetools" -version = "5.5.0" -description = "Extensible memoizing collections and decorators" -optional = false -python-versions = ">=3.7" -files = [ - {file = "cachetools-5.5.0-py3-none-any.whl", hash = "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292"}, - {file = "cachetools-5.5.0.tar.gz", hash = "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a"}, -] - [[package]] name = "certifi" version = "2024.8.30" @@ -745,84 +681,6 @@ files = [ {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] -[[package]] -name = "chroma-hnswlib" -version = "0.7.3" -description = "Chromas fork of hnswlib" -optional = false -python-versions = "*" -files = [ - {file = "chroma-hnswlib-0.7.3.tar.gz", hash = "sha256:b6137bedde49fffda6af93b0297fe00429fc61e5a072b1ed9377f909ed95a932"}, - {file = "chroma_hnswlib-0.7.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:59d6a7c6f863c67aeb23e79a64001d537060b6995c3eca9a06e349ff7b0998ca"}, - {file = "chroma_hnswlib-0.7.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d71a3f4f232f537b6152947006bd32bc1629a8686df22fd97777b70f416c127a"}, - {file = "chroma_hnswlib-0.7.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c92dc1ebe062188e53970ba13f6b07e0ae32e64c9770eb7f7ffa83f149d4210"}, - {file = "chroma_hnswlib-0.7.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49da700a6656fed8753f68d44b8cc8ae46efc99fc8a22a6d970dc1697f49b403"}, - {file = "chroma_hnswlib-0.7.3-cp310-cp310-win_amd64.whl", hash = "sha256:108bc4c293d819b56476d8f7865803cb03afd6ca128a2a04d678fffc139af029"}, - {file = "chroma_hnswlib-0.7.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:11e7ca93fb8192214ac2b9c0943641ac0daf8f9d4591bb7b73be808a83835667"}, - {file = "chroma_hnswlib-0.7.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6f552e4d23edc06cdeb553cdc757d2fe190cdeb10d43093d6a3319f8d4bf1c6b"}, - {file = "chroma_hnswlib-0.7.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f96f4d5699e486eb1fb95849fe35ab79ab0901265805be7e60f4eaa83ce263ec"}, - {file = "chroma_hnswlib-0.7.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:368e57fe9ebae05ee5844840fa588028a023d1182b0cfdb1d13f607c9ea05756"}, - {file = "chroma_hnswlib-0.7.3-cp311-cp311-win_amd64.whl", hash = "sha256:b7dca27b8896b494456db0fd705b689ac6b73af78e186eb6a42fea2de4f71c6f"}, - {file = "chroma_hnswlib-0.7.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:70f897dc6218afa1d99f43a9ad5eb82f392df31f57ff514ccf4eeadecd62f544"}, - {file = "chroma_hnswlib-0.7.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5aef10b4952708f5a1381c124a29aead0c356f8d7d6e0b520b778aaa62a356f4"}, - {file = "chroma_hnswlib-0.7.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ee2d8d1529fca3898d512079144ec3e28a81d9c17e15e0ea4665697a7923253"}, - {file = "chroma_hnswlib-0.7.3-cp37-cp37m-win_amd64.whl", hash = "sha256:a4021a70e898783cd6f26e00008b494c6249a7babe8774e90ce4766dd288c8ba"}, - {file = "chroma_hnswlib-0.7.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a8f61fa1d417fda848e3ba06c07671f14806a2585272b175ba47501b066fe6b1"}, - {file = "chroma_hnswlib-0.7.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d7563be58bc98e8f0866907368e22ae218d6060601b79c42f59af4eccbbd2e0a"}, - {file = "chroma_hnswlib-0.7.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51b8d411486ee70d7b66ec08cc8b9b6620116b650df9c19076d2d8b6ce2ae914"}, - {file = "chroma_hnswlib-0.7.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d706782b628e4f43f1b8a81e9120ac486837fbd9bcb8ced70fe0d9b95c72d77"}, - {file = "chroma_hnswlib-0.7.3-cp38-cp38-win_amd64.whl", hash = "sha256:54f053dedc0e3ba657f05fec6e73dd541bc5db5b09aa8bc146466ffb734bdc86"}, - {file = "chroma_hnswlib-0.7.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e607c5a71c610a73167a517062d302c0827ccdd6e259af6e4869a5c1306ffb5d"}, - {file = "chroma_hnswlib-0.7.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c2358a795870156af6761890f9eb5ca8cade57eb10c5f046fe94dae1faa04b9e"}, - {file = "chroma_hnswlib-0.7.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cea425df2e6b8a5e201fff0d922a1cc1d165b3cfe762b1408075723c8892218"}, - {file = "chroma_hnswlib-0.7.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:454df3dd3e97aa784fba7cf888ad191e0087eef0fd8c70daf28b753b3b591170"}, - {file = "chroma_hnswlib-0.7.3-cp39-cp39-win_amd64.whl", hash = "sha256:df587d15007ca701c6de0ee7d5585dd5e976b7edd2b30ac72bc376b3c3f85882"}, -] - -[package.dependencies] -numpy = "*" - -[[package]] -name = "chromadb" -version = "0.4.24" -description = "Chroma." -optional = false -python-versions = ">=3.8" -files = [ - {file = "chromadb-0.4.24-py3-none-any.whl", hash = "sha256:3a08e237a4ad28b5d176685bd22429a03717fe09d35022fb230d516108da01da"}, - {file = "chromadb-0.4.24.tar.gz", hash = "sha256:a5c80b4e4ad9b236ed2d4899a5b9e8002b489293f2881cb2cadab5b199ee1c72"}, -] - -[package.dependencies] -bcrypt = ">=4.0.1" -build = ">=1.0.3" -chroma-hnswlib = "0.7.3" -fastapi = ">=0.95.2" -grpcio = ">=1.58.0" -importlib-resources = "*" -kubernetes = ">=28.1.0" -mmh3 = ">=4.0.1" -numpy = ">=1.22.5" -onnxruntime = ">=1.14.1" -opentelemetry-api = ">=1.2.0" -opentelemetry-exporter-otlp-proto-grpc = ">=1.2.0" -opentelemetry-instrumentation-fastapi = ">=0.41b0" -opentelemetry-sdk = ">=1.2.0" -orjson = ">=3.9.12" -overrides = ">=7.3.1" -posthog = ">=2.4.0" -pulsar-client = ">=3.1.0" -pydantic = ">=1.9" -pypika = ">=0.48.9" -PyYAML = ">=6.0.0" -requests = ">=2.28" -tenacity = ">=8.2.3" -tokenizers = ">=0.13.2" -tqdm = ">=4.65.0" -typer = ">=0.9.0" -typing-extensions = ">=4.5.0" -uvicorn = {version = ">=0.18.3", extras = ["standard"]} - [[package]] name = "click" version = "8.1.7" @@ -848,23 +706,6 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -[[package]] -name = "coloredlogs" -version = "15.0.1" -description = "Colored terminal output for Python's logging module" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934"}, - {file = "coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0"}, -] - -[package.dependencies] -humanfriendly = ">=9.1" - -[package.extras] -cron = ["capturer (>=2.4)"] - [[package]] name = "comm" version = "0.2.2" @@ -1236,17 +1077,6 @@ files = [ {file = "docx2txt-0.8.tar.gz", hash = "sha256:2c06d98d7cfe2d3947e5760a57d924e3ff07745b379c8737723922e7009236e5"}, ] -[[package]] -name = "durationpy" -version = "0.9" -description = "Module for converting between datetime.timedelta and Go's Duration strings." -optional = false -python-versions = "*" -files = [ - {file = "durationpy-0.9-py3-none-any.whl", hash = "sha256:e65359a7af5cedad07fb77a2dd3f390f8eb0b74cb845589fa6c057086834dd38"}, - {file = "durationpy-0.9.tar.gz", hash = "sha256:fd3feb0a69a0057d582ef643c355c40d2fa1c942191f914d12203b1a01ac722a"}, -] - [[package]] name = "e2b" version = "1.0.5" @@ -1356,7 +1186,7 @@ all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)" name = "filelock" version = "3.16.1" description = "A platform independent file lock." -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, @@ -1467,17 +1297,6 @@ files = [ Flask = ">=1.0.4" Werkzeug = ">=1.0.1" -[[package]] -name = "flatbuffers" -version = "24.3.25" -description = "The FlatBuffers serialization format for Python" -optional = false -python-versions = "*" -files = [ - {file = "flatbuffers-24.3.25-py2.py3-none-any.whl", hash = "sha256:8dbdec58f935f3765e4f7f3cf635ac3a77f83568138d6a2311f524ec96364812"}, - {file = "flatbuffers-24.3.25.tar.gz", hash = "sha256:de2ec5b203f21441716617f38443e0a8ebf3d25bf0d9c0bb0ce68fa00ad546a4"}, -] - [[package]] name = "frozenlist" version = "1.5.0" @@ -1779,46 +1598,6 @@ benchmarks = ["httplib2", "httpx", "requests", "urllib3"] dev = ["dpkt", "pytest", "requests"] examples = ["oauth2"] -[[package]] -name = "google-auth" -version = "2.36.0" -description = "Google Authentication Library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google_auth-2.36.0-py2.py3-none-any.whl", hash = "sha256:51a15d47028b66fd36e5c64a82d2d57480075bccc7da37cde257fc94177a61fb"}, - {file = "google_auth-2.36.0.tar.gz", hash = "sha256:545e9618f2df0bcbb7dcbc45a546485b1212624716975a1ea5ae8149ce769ab1"}, -] - -[package.dependencies] -cachetools = ">=2.0.0,<6.0" -pyasn1-modules = ">=0.2.1" -rsa = ">=3.1.4,<5" - -[package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] -enterprise-cert = ["cryptography", "pyopenssl"] -pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] -reauth = ["pyu2f (>=0.1.5)"] -requests = ["requests (>=2.20.0,<3.0.0.dev0)"] - -[[package]] -name = "googleapis-common-protos" -version = "1.66.0" -description = "Common protobufs used in Google APIs" -optional = false -python-versions = ">=3.7" -files = [ - {file = "googleapis_common_protos-1.66.0-py2.py3-none-any.whl", hash = "sha256:d7abcd75fabb2e0ec9f74466401f6c119a0b498e27370e9be4c94cb7e382b8ed"}, - {file = "googleapis_common_protos-1.66.0.tar.gz", hash = "sha256:c3e7b33d15fdca5374cc0a7346dd92ffa847425cc4ea941d970f13680052ec8c"}, -] - -[package.dependencies] -protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" - -[package.extras] -grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] - [[package]] name = "greenlet" version = "3.1.1" @@ -1909,7 +1688,7 @@ test = ["objgraph", "psutil"] name = "grpcio" version = "1.63.0" description = "HTTP/2-based RPC framework" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "grpcio-1.63.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:2e93aca840c29d4ab5db93f94ed0a0ca899e241f2e8aec6334ab3575dc46125c"}, @@ -2094,61 +1873,6 @@ http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] trio = ["trio (>=0.22.0,<1.0)"] -[[package]] -name = "httptools" -version = "0.6.4" -description = "A collection of framework independent HTTP protocol utils." -optional = false -python-versions = ">=3.8.0" -files = [ - {file = "httptools-0.6.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3c73ce323711a6ffb0d247dcd5a550b8babf0f757e86a52558fe5b86d6fefcc0"}, - {file = "httptools-0.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:345c288418f0944a6fe67be8e6afa9262b18c7626c3ef3c28adc5eabc06a68da"}, - {file = "httptools-0.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deee0e3343f98ee8047e9f4c5bc7cedbf69f5734454a94c38ee829fb2d5fa3c1"}, - {file = "httptools-0.6.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca80b7485c76f768a3bc83ea58373f8db7b015551117375e4918e2aa77ea9b50"}, - {file = "httptools-0.6.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:90d96a385fa941283ebd231464045187a31ad932ebfa541be8edf5b3c2328959"}, - {file = "httptools-0.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:59e724f8b332319e2875efd360e61ac07f33b492889284a3e05e6d13746876f4"}, - {file = "httptools-0.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:c26f313951f6e26147833fc923f78f95604bbec812a43e5ee37f26dc9e5a686c"}, - {file = "httptools-0.6.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f47f8ed67cc0ff862b84a1189831d1d33c963fb3ce1ee0c65d3b0cbe7b711069"}, - {file = "httptools-0.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0614154d5454c21b6410fdf5262b4a3ddb0f53f1e1721cfd59d55f32138c578a"}, - {file = "httptools-0.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8787367fbdfccae38e35abf7641dafc5310310a5987b689f4c32cc8cc3ee975"}, - {file = "httptools-0.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40b0f7fe4fd38e6a507bdb751db0379df1e99120c65fbdc8ee6c1d044897a636"}, - {file = "httptools-0.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40a5ec98d3f49904b9fe36827dcf1aadfef3b89e2bd05b0e35e94f97c2b14721"}, - {file = "httptools-0.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dacdd3d10ea1b4ca9df97a0a303cbacafc04b5cd375fa98732678151643d4988"}, - {file = "httptools-0.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:288cd628406cc53f9a541cfaf06041b4c71d751856bab45e3702191f931ccd17"}, - {file = "httptools-0.6.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:df017d6c780287d5c80601dafa31f17bddb170232d85c066604d8558683711a2"}, - {file = "httptools-0.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:85071a1e8c2d051b507161f6c3e26155b5c790e4e28d7f236422dbacc2a9cc44"}, - {file = "httptools-0.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69422b7f458c5af875922cdb5bd586cc1f1033295aa9ff63ee196a87519ac8e1"}, - {file = "httptools-0.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16e603a3bff50db08cd578d54f07032ca1631450ceb972c2f834c2b860c28ea2"}, - {file = "httptools-0.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec4f178901fa1834d4a060320d2f3abc5c9e39766953d038f1458cb885f47e81"}, - {file = "httptools-0.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb89ecf8b290f2e293325c646a211ff1c2493222798bb80a530c5e7502494f"}, - {file = "httptools-0.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:db78cb9ca56b59b016e64b6031eda5653be0589dba2b1b43453f6e8b405a0970"}, - {file = "httptools-0.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660"}, - {file = "httptools-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083"}, - {file = "httptools-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3"}, - {file = "httptools-0.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071"}, - {file = "httptools-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5"}, - {file = "httptools-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0"}, - {file = "httptools-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8"}, - {file = "httptools-0.6.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:d3f0d369e7ffbe59c4b6116a44d6a8eb4783aae027f2c0b366cf0aa964185dba"}, - {file = "httptools-0.6.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:94978a49b8f4569ad607cd4946b759d90b285e39c0d4640c6b36ca7a3ddf2efc"}, - {file = "httptools-0.6.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40dc6a8e399e15ea525305a2ddba998b0af5caa2566bcd79dcbe8948181eeaff"}, - {file = "httptools-0.6.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab9ba8dcf59de5181f6be44a77458e45a578fc99c31510b8c65b7d5acc3cf490"}, - {file = "httptools-0.6.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fc411e1c0a7dcd2f902c7c48cf079947a7e65b5485dea9decb82b9105ca71a43"}, - {file = "httptools-0.6.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:d54efd20338ac52ba31e7da78e4a72570cf729fac82bc31ff9199bedf1dc7440"}, - {file = "httptools-0.6.4-cp38-cp38-win_amd64.whl", hash = "sha256:df959752a0c2748a65ab5387d08287abf6779ae9165916fe053e68ae1fbdc47f"}, - {file = "httptools-0.6.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:85797e37e8eeaa5439d33e556662cc370e474445d5fab24dcadc65a8ffb04003"}, - {file = "httptools-0.6.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:db353d22843cf1028f43c3651581e4bb49374d85692a85f95f7b9a130e1b2cab"}, - {file = "httptools-0.6.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1ffd262a73d7c28424252381a5b854c19d9de5f56f075445d33919a637e3547"}, - {file = "httptools-0.6.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:703c346571fa50d2e9856a37d7cd9435a25e7fd15e236c397bf224afaa355fe9"}, - {file = "httptools-0.6.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:aafe0f1918ed07b67c1e838f950b1c1fabc683030477e60b335649b8020e1076"}, - {file = "httptools-0.6.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0e563e54979e97b6d13f1bbc05a96109923e76b901f786a5eae36e99c01237bd"}, - {file = "httptools-0.6.4-cp39-cp39-win_amd64.whl", hash = "sha256:b799de31416ecc589ad79dd85a0b2657a8fe39327944998dea368c1d4c9e55e6"}, - {file = "httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c"}, -] - -[package.extras] -test = ["Cython (>=0.29.24)"] - [[package]] name = "httpx" version = "0.27.2" @@ -2190,7 +1914,7 @@ files = [ name = "huggingface-hub" version = "0.26.5" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" -optional = false +optional = true python-versions = ">=3.8.0" files = [ {file = "huggingface_hub-0.26.5-py3-none-any.whl", hash = "sha256:fb7386090bbe892072e64b85f7c4479fd2d65eea5f2543327c970d5169e83924"}, @@ -2220,20 +1944,6 @@ testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gr torch = ["safetensors[torch]", "torch"] typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] -[[package]] -name = "humanfriendly" -version = "10.0" -description = "Human friendly output for text interfaces using Python" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477"}, - {file = "humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc"}, -] - -[package.dependencies] -pyreadline3 = {version = "*", markers = "sys_platform == \"win32\" and python_version >= \"3.8\""} - [[package]] name = "hyperframe" version = "6.0.1" @@ -2296,25 +2006,6 @@ perf = ["ipython"] test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] type = ["pytest-mypy"] -[[package]] -name = "importlib-resources" -version = "6.4.5" -description = "Read resources from Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "importlib_resources-6.4.5-py3-none-any.whl", hash = "sha256:ac29d5f956f01d5e4bb63102a5a19957f1b9175e45649977264a1416783bb717"}, - {file = "importlib_resources-6.4.5.tar.gz", hash = "sha256:980862a1d16c9e147a59603677fa2aa5fd82b87f223b6cb870695bcfce830065"}, -] - -[package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] -test = ["jaraco.test (>=5.4)", "pytest (>=6,!=8.1.*)", "zipp (>=3.17)"] -type = ["pytest-mypy"] - [[package]] name = "inflection" version = "0.5.1" @@ -2692,33 +2383,6 @@ traitlets = ">=5.3" docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"] -[[package]] -name = "kubernetes" -version = "31.0.0" -description = "Kubernetes python client" -optional = false -python-versions = ">=3.6" -files = [ - {file = "kubernetes-31.0.0-py2.py3-none-any.whl", hash = "sha256:bf141e2d380c8520eada8b351f4e319ffee9636328c137aa432bc486ca1200e1"}, - {file = "kubernetes-31.0.0.tar.gz", hash = "sha256:28945de906c8c259c1ebe62703b56a03b714049372196f854105afe4e6d014c0"}, -] - -[package.dependencies] -certifi = ">=14.05.14" -durationpy = ">=0.7" -google-auth = ">=1.0.1" -oauthlib = ">=3.2.2" -python-dateutil = ">=2.5.3" -pyyaml = ">=5.4.1" -requests = "*" -requests-oauthlib = "*" -six = ">=1.9.0" -urllib3 = ">=1.24.2" -websocket-client = ">=0.32.0,<0.40.0 || >0.40.0,<0.41.dev0 || >=0.43.dev0" - -[package.extras] -adal = ["adal (>=1.0.2)"] - [[package]] name = "langchain" version = "0.3.10" @@ -3377,147 +3041,6 @@ files = [ [package.dependencies] tqdm = "*" -[[package]] -name = "mmh3" -version = "5.0.1" -description = "Python extension for MurmurHash (MurmurHash3), a set of fast and robust hash functions." -optional = false -python-versions = ">=3.8" -files = [ - {file = "mmh3-5.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f0a4b4bf05778ed77d820d6e7d0e9bd6beb0c01af10e1ce9233f5d2f814fcafa"}, - {file = "mmh3-5.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac7a391039aeab95810c2d020b69a94eb6b4b37d4e2374831e92db3a0cdf71c6"}, - {file = "mmh3-5.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3a2583b5521ca49756d8d8bceba80627a9cc295f255dcab4e3df7ccc2f09679a"}, - {file = "mmh3-5.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:081a8423fe53c1ac94f87165f3e4c500125d343410c1a0c5f1703e898a3ef038"}, - {file = "mmh3-5.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8b4d72713799755dc8954a7d36d5c20a6c8de7b233c82404d122c7c7c1707cc"}, - {file = "mmh3-5.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:389a6fd51efc76d3182d36ec306448559c1244f11227d2bb771bdd0e6cc91321"}, - {file = "mmh3-5.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39f4128edaa074bff721b1d31a72508cba4d2887ee7867f22082e1fe9d4edea0"}, - {file = "mmh3-5.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5d23a94d91aabba3386b3769048d5f4210fdfef80393fece2f34ba5a7b466c"}, - {file = "mmh3-5.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:16347d038361f8b8f24fd2b7ef378c9b68ddee9f7706e46269b6e0d322814713"}, - {file = "mmh3-5.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6e299408565af7d61f2d20a5ffdd77cf2ed902460fe4e6726839d59ba4b72316"}, - {file = "mmh3-5.0.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:42050af21ddfc5445ee5a66e73a8fc758c71790305e3ee9e4a85a8e69e810f94"}, - {file = "mmh3-5.0.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2ae9b1f5ef27ec54659920f0404b7ceb39966e28867c461bfe83a05e8d18ddb0"}, - {file = "mmh3-5.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:50c2495a02045f3047d71d4ae9cdd7a15efc0bcbb7ff17a18346834a8e2d1d19"}, - {file = "mmh3-5.0.1-cp310-cp310-win32.whl", hash = "sha256:c028fa77cddf351ca13b4a56d43c1775652cde0764cadb39120b68f02a23ecf6"}, - {file = "mmh3-5.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:c5e741e421ec14400c4aae30890515c201f518403bdef29ae1e00d375bb4bbb5"}, - {file = "mmh3-5.0.1-cp310-cp310-win_arm64.whl", hash = "sha256:b17156d56fabc73dbf41bca677ceb6faed435cc8544f6566d72ea77d8a17e9d0"}, - {file = "mmh3-5.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a6d5a9b1b923f1643559ba1fc0bf7a5076c90cbb558878d3bf3641ce458f25d"}, - {file = "mmh3-5.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3349b968be555f7334bbcce839da98f50e1e80b1c615d8e2aa847ea4a964a012"}, - {file = "mmh3-5.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1bd3c94b110e55db02ab9b605029f48a2f7f677c6e58c09d44e42402d438b7e1"}, - {file = "mmh3-5.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47ba84d48608f79adbb10bb09986b6dc33eeda5c2d1bd75d00820081b73bde9"}, - {file = "mmh3-5.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c0217987a8b8525c8d9170f66d036dec4ab45cfbd53d47e8d76125791ceb155e"}, - {file = "mmh3-5.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2797063a34e78d1b61639a98b0edec1c856fa86ab80c7ec859f1796d10ba429"}, - {file = "mmh3-5.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8bba16340adcbd47853a2fbe5afdb397549e8f2e79324ff1dced69a3f8afe7c3"}, - {file = "mmh3-5.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:282797957c9f60b51b9d768a602c25f579420cc9af46feb77d457a27823d270a"}, - {file = "mmh3-5.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e4fb670c29e63f954f9e7a2cdcd57b36a854c2538f579ef62681ccbaa1de2b69"}, - {file = "mmh3-5.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ee7d85438dc6aff328e19ab052086a3c29e8a9b632998a49e5c4b0034e9e8d6"}, - {file = "mmh3-5.0.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b7fb5db231f3092444bc13901e6a8d299667126b00636ffbad4a7b45e1051e2f"}, - {file = "mmh3-5.0.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c100dd441703da5ec136b1d9003ed4a041d8a1136234c9acd887499796df6ad8"}, - {file = "mmh3-5.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:71f3b765138260fd7a7a2dba0ea5727dabcd18c1f80323c9cfef97a7e86e01d0"}, - {file = "mmh3-5.0.1-cp311-cp311-win32.whl", hash = "sha256:9a76518336247fd17689ce3ae5b16883fd86a490947d46a0193d47fb913e26e3"}, - {file = "mmh3-5.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:336bc4df2e44271f1c302d289cc3d78bd52d3eed8d306c7e4bff8361a12bf148"}, - {file = "mmh3-5.0.1-cp311-cp311-win_arm64.whl", hash = "sha256:af6522722fbbc5999aa66f7244d0986767a46f1fb05accc5200f75b72428a508"}, - {file = "mmh3-5.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f2730bb263ed9c388e8860438b057a53e3cc701134a6ea140f90443c4c11aa40"}, - {file = "mmh3-5.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6246927bc293f6d56724536400b85fb85f5be26101fa77d5f97dd5e2a4c69bf2"}, - {file = "mmh3-5.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fbca322519a6e6e25b6abf43e940e1667cf8ea12510e07fb4919b48a0cd1c411"}, - {file = "mmh3-5.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eae8c19903ed8a1724ad9e67e86f15d198a7a1271a4f9be83d47e38f312ed672"}, - {file = "mmh3-5.0.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a09fd6cc72c07c0c07c3357714234b646d78052487c4a3bd5f7f6e08408cff60"}, - {file = "mmh3-5.0.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ff8551fee7ae3b11c5d986b6347ade0dccaadd4670ffdb2b944dee120ffcc84"}, - {file = "mmh3-5.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e39694c73a5a20c8bf36dfd8676ed351e5234d55751ba4f7562d85449b21ef3f"}, - {file = "mmh3-5.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eba6001989a92f72a89c7cf382fda831678bd780707a66b4f8ca90239fdf2123"}, - {file = "mmh3-5.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0771f90c9911811cc606a5c7b7b58f33501c9ee896ed68a6ac22c7d55878ecc0"}, - {file = "mmh3-5.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:09b31ed0c0c0920363e96641fac4efde65b1ab62b8df86293142f35a254e72b4"}, - {file = "mmh3-5.0.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5cf4a8deda0235312db12075331cb417c4ba163770edfe789bde71d08a24b692"}, - {file = "mmh3-5.0.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:41f7090a95185ef20ac018581a99337f0cbc84a2135171ee3290a9c0d9519585"}, - {file = "mmh3-5.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b97b5b368fb7ff22194ec5854f5b12d8de9ab67a0f304728c7f16e5d12135b76"}, - {file = "mmh3-5.0.1-cp312-cp312-win32.whl", hash = "sha256:842516acf04da546f94fad52db125ee619ccbdcada179da51c326a22c4578cb9"}, - {file = "mmh3-5.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:d963be0dbfd9fca209c17172f6110787ebf78934af25e3694fe2ba40e55c1e2b"}, - {file = "mmh3-5.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:a5da292ceeed8ce8e32b68847261a462d30fd7b478c3f55daae841404f433c15"}, - {file = "mmh3-5.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:673e3f1c8d4231d6fb0271484ee34cb7146a6499fc0df80788adb56fd76842da"}, - {file = "mmh3-5.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f795a306bd16a52ad578b663462cc8e95500b3925d64118ae63453485d67282b"}, - {file = "mmh3-5.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5ed57a5e28e502a1d60436cc25c76c3a5ba57545f250f2969af231dc1221e0a5"}, - {file = "mmh3-5.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:632c28e7612e909dbb6cbe2fe496201ada4695b7715584005689c5dc038e59ad"}, - {file = "mmh3-5.0.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53fd6bd525a5985e391c43384672d9d6b317fcb36726447347c7fc75bfed34ec"}, - {file = "mmh3-5.0.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dceacf6b0b961a0e499836af3aa62d60633265607aef551b2a3e3c48cdaa5edd"}, - {file = "mmh3-5.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f0738d478fdfb5d920f6aff5452c78f2c35b0eff72caa2a97dfe38e82f93da2"}, - {file = "mmh3-5.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e70285e7391ab88b872e5bef632bad16b9d99a6d3ca0590656a4753d55988af"}, - {file = "mmh3-5.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:27e5fc6360aa6b828546a4318da1a7da6bf6e5474ccb053c3a6aa8ef19ff97bd"}, - {file = "mmh3-5.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7989530c3c1e2c17bf5a0ec2bba09fd19819078ba90beedabb1c3885f5040b0d"}, - {file = "mmh3-5.0.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:cdad7bee649950da7ecd3cbbbd12fb81f1161072ecbdb5acfa0018338c5cb9cf"}, - {file = "mmh3-5.0.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e143b8f184c1bb58cecd85ab4a4fd6dc65a2d71aee74157392c3fddac2a4a331"}, - {file = "mmh3-5.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e5eb12e886f3646dd636f16b76eb23fc0c27e8ff3c1ae73d4391e50ef60b40f6"}, - {file = "mmh3-5.0.1-cp313-cp313-win32.whl", hash = "sha256:16e6dddfa98e1c2d021268e72c78951234186deb4df6630e984ac82df63d0a5d"}, - {file = "mmh3-5.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:d3ffb792d70b8c4a2382af3598dad6ae0c5bd9cee5b7ffcc99aa2f5fd2c1bf70"}, - {file = "mmh3-5.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:122fa9ec148383f9124292962bda745f192b47bfd470b2af5fe7bb3982b17896"}, - {file = "mmh3-5.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b12bad8c75e6ff5d67319794fb6a5e8c713826c818d47f850ad08b4aa06960c6"}, - {file = "mmh3-5.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e5bbb066538c1048d542246fc347bb7994bdda29a3aea61c22f9f8b57111ce69"}, - {file = "mmh3-5.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:eee6134273f64e2a106827cc8fd77e70cc7239a285006fc6ab4977d59b015af2"}, - {file = "mmh3-5.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d04d9aa19d48e4c7bbec9cabc2c4dccc6ff3b2402f856d5bf0de03e10f167b5b"}, - {file = "mmh3-5.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79f37da1eed034d06567a69a7988456345c7f29e49192831c3975b464493b16e"}, - {file = "mmh3-5.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:242f77666743337aa828a2bf2da71b6ba79623ee7f93edb11e009f69237c8561"}, - {file = "mmh3-5.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffd943fff690463945f6441a2465555b3146deaadf6a5e88f2590d14c655d71b"}, - {file = "mmh3-5.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:565b15f8d7df43acb791ff5a360795c20bfa68bca8b352509e0fbabd06cc48cd"}, - {file = "mmh3-5.0.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fc6aafb867c2030df98ac7760ff76b500359252867985f357bd387739f3d5287"}, - {file = "mmh3-5.0.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:32898170644d45aa27c974ab0d067809c066205110f5c6d09f47d9ece6978bfe"}, - {file = "mmh3-5.0.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:42865567838d2193eb64e0ef571f678bf361a254fcdef0c5c8e73243217829bd"}, - {file = "mmh3-5.0.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5ff5c1f301c4a8b6916498969c0fcc7e3dbc56b4bfce5cfe3fe31f3f4609e5ae"}, - {file = "mmh3-5.0.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:be74c2dda8a6f44a504450aa2c3507f8067a159201586fc01dd41ab80efc350f"}, - {file = "mmh3-5.0.1-cp38-cp38-win32.whl", hash = "sha256:5610a842621ff76c04b20b29cf5f809b131f241a19d4937971ba77dc99a7f330"}, - {file = "mmh3-5.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:de15739ac50776fe8aa1ef13f1be46a6ee1fbd45f6d0651084097eb2be0a5aa4"}, - {file = "mmh3-5.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:48e84cf3cc7e8c41bc07de72299a73b92d9e3cde51d97851420055b1484995f7"}, - {file = "mmh3-5.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6dd9dc28c2d168c49928195c2e29b96f9582a5d07bd690a28aede4cc07b0e696"}, - {file = "mmh3-5.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2771a1c56a3d4bdad990309cff5d0a8051f29c8ec752d001f97d6392194ae880"}, - {file = "mmh3-5.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5ff2a8322ba40951a84411550352fba1073ce1c1d1213bb7530f09aed7f8caf"}, - {file = "mmh3-5.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a16bd3ec90682c9e0a343e6bd4c778c09947c8c5395cdb9e5d9b82b2559efbca"}, - {file = "mmh3-5.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d45733a78d68b5b05ff4a823aea51fa664df1d3bf4929b152ff4fd6dea2dd69b"}, - {file = "mmh3-5.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:904285e83cedebc8873b0838ed54c20f7344120be26e2ca5a907ab007a18a7a0"}, - {file = "mmh3-5.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac4aeb1784e43df728034d0ed72e4b2648db1a69fef48fa58e810e13230ae5ff"}, - {file = "mmh3-5.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:cb3d4f751a0b8b4c8d06ef1c085216c8fddcc8b8c8d72445976b5167a40c6d1e"}, - {file = "mmh3-5.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:8021851935600e60c42122ed1176399d7692df338d606195cd599d228a04c1c6"}, - {file = "mmh3-5.0.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:6182d5924a5efc451900f864cbb021d7e8ad5d524816ca17304a0f663bc09bb5"}, - {file = "mmh3-5.0.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:5f30b834552a4f79c92e3d266336fb87fd92ce1d36dc6813d3e151035890abbd"}, - {file = "mmh3-5.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cd4383f35e915e06d077df27e04ffd3be7513ec6a9de2d31f430393f67e192a7"}, - {file = "mmh3-5.0.1-cp39-cp39-win32.whl", hash = "sha256:1455fb6b42665a97db8fc66e89a861e52b567bce27ed054c47877183f86ea6e3"}, - {file = "mmh3-5.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:9e26a0f4eb9855a143f5938a53592fa14c2d3b25801c2106886ab6c173982780"}, - {file = "mmh3-5.0.1-cp39-cp39-win_arm64.whl", hash = "sha256:0d0a35a69abdad7549c4030a714bb4ad07902edb3bbe61e1bbc403ded5d678be"}, - {file = "mmh3-5.0.1.tar.gz", hash = "sha256:7dab080061aeb31a6069a181f27c473a1f67933854e36a3464931f2716508896"}, -] - -[package.extras] -benchmark = ["pymmh3 (==0.0.5)", "pyperf (==2.7.0)", "xxhash (==3.5.0)"] -docs = ["myst-parser (==4.0.0)", "shibuya (==2024.8.30)", "sphinx (==8.0.2)", "sphinx-copybutton (==0.5.2)"] -lint = ["black (==24.8.0)", "clang-format (==18.1.8)", "isort (==5.13.2)", "pylint (==3.2.7)"] -plot = ["matplotlib (==3.9.2)", "pandas (==2.2.2)"] -test = ["pytest (==8.3.3)", "pytest-sugar (==1.0.0)"] -type = ["mypy (==1.11.2)"] - -[[package]] -name = "monotonic" -version = "1.6" -description = "An implementation of time.monotonic() for Python 2 & < 3.3" -optional = false -python-versions = "*" -files = [ - {file = "monotonic-1.6-py2.py3-none-any.whl", hash = "sha256:68687e19a14f11f26d140dd5c86f3dba4bf5df58003000ed467e0e2a69bca96c"}, - {file = "monotonic-1.6.tar.gz", hash = "sha256:3a55207bcfed53ddd5c5bae174524062935efed17792e9de2ad0205ce9ad63f7"}, -] - -[[package]] -name = "mpmath" -version = "1.3.0" -description = "Python library for arbitrary-precision floating-point arithmetic" -optional = false -python-versions = "*" -files = [ - {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, - {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, -] - -[package.extras] -develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] -docs = ["sphinx"] -gmpy = ["gmpy2 (>=2.1.0a4)"] -tests = ["pytest (>=4.6)"] - [[package]] name = "msgpack" version = "1.1.0" @@ -3841,22 +3364,6 @@ files = [ {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] -[[package]] -name = "oauthlib" -version = "3.2.2" -description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" -optional = false -python-versions = ">=3.6" -files = [ - {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, - {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, -] - -[package.extras] -rsa = ["cryptography (>=3.0.0)"] -signals = ["blinker (>=1.4.0)"] -signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] - [[package]] name = "ollama" version = "0.3.3" @@ -3871,44 +3378,6 @@ files = [ [package.dependencies] httpx = ">=0.27.0,<0.28.0" -[[package]] -name = "onnxruntime" -version = "1.20.1" -description = "ONNX Runtime is a runtime accelerator for Machine Learning models" -optional = false -python-versions = "*" -files = [ - {file = "onnxruntime-1.20.1-cp310-cp310-macosx_13_0_universal2.whl", hash = "sha256:e50ba5ff7fed4f7d9253a6baf801ca2883cc08491f9d32d78a80da57256a5439"}, - {file = "onnxruntime-1.20.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7b2908b50101a19e99c4d4e97ebb9905561daf61829403061c1adc1b588bc0de"}, - {file = "onnxruntime-1.20.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d82daaec24045a2e87598b8ac2b417b1cce623244e80e663882e9fe1aae86410"}, - {file = "onnxruntime-1.20.1-cp310-cp310-win32.whl", hash = "sha256:4c4b251a725a3b8cf2aab284f7d940c26094ecd9d442f07dd81ab5470e99b83f"}, - {file = "onnxruntime-1.20.1-cp310-cp310-win_amd64.whl", hash = "sha256:d3b616bb53a77a9463707bb313637223380fc327f5064c9a782e8ec69c22e6a2"}, - {file = "onnxruntime-1.20.1-cp311-cp311-macosx_13_0_universal2.whl", hash = "sha256:06bfbf02ca9ab5f28946e0f912a562a5f005301d0c419283dc57b3ed7969bb7b"}, - {file = "onnxruntime-1.20.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f6243e34d74423bdd1edf0ae9596dd61023b260f546ee17d701723915f06a9f7"}, - {file = "onnxruntime-1.20.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5eec64c0269dcdb8d9a9a53dc4d64f87b9e0c19801d9321246a53b7eb5a7d1bc"}, - {file = "onnxruntime-1.20.1-cp311-cp311-win32.whl", hash = "sha256:a19bc6e8c70e2485a1725b3d517a2319603acc14c1f1a017dda0afe6d4665b41"}, - {file = "onnxruntime-1.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:8508887eb1c5f9537a4071768723ec7c30c28eb2518a00d0adcd32c89dea3221"}, - {file = "onnxruntime-1.20.1-cp312-cp312-macosx_13_0_universal2.whl", hash = "sha256:22b0655e2bf4f2161d52706e31f517a0e54939dc393e92577df51808a7edc8c9"}, - {file = "onnxruntime-1.20.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1f56e898815963d6dc4ee1c35fc6c36506466eff6d16f3cb9848cea4e8c8172"}, - {file = "onnxruntime-1.20.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bb71a814f66517a65628c9e4a2bb530a6edd2cd5d87ffa0af0f6f773a027d99e"}, - {file = "onnxruntime-1.20.1-cp312-cp312-win32.whl", hash = "sha256:bd386cc9ee5f686ee8a75ba74037750aca55183085bf1941da8efcfe12d5b120"}, - {file = "onnxruntime-1.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:19c2d843eb074f385e8bbb753a40df780511061a63f9def1b216bf53860223fb"}, - {file = "onnxruntime-1.20.1-cp313-cp313-macosx_13_0_universal2.whl", hash = "sha256:cc01437a32d0042b606f462245c8bbae269e5442797f6213e36ce61d5abdd8cc"}, - {file = "onnxruntime-1.20.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fb44b08e017a648924dbe91b82d89b0c105b1adcfe31e90d1dc06b8677ad37be"}, - {file = "onnxruntime-1.20.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bda6aebdf7917c1d811f21d41633df00c58aff2bef2f598f69289c1f1dabc4b3"}, - {file = "onnxruntime-1.20.1-cp313-cp313-win_amd64.whl", hash = "sha256:d30367df7e70f1d9fc5a6a68106f5961686d39b54d3221f760085524e8d38e16"}, - {file = "onnxruntime-1.20.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9158465745423b2b5d97ed25aa7740c7d38d2993ee2e5c3bfacb0c4145c49d8"}, - {file = "onnxruntime-1.20.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0df6f2df83d61f46e842dbcde610ede27218947c33e994545a22333491e72a3b"}, -] - -[package.dependencies] -coloredlogs = "*" -flatbuffers = "*" -numpy = ">=1.21.6" -packaging = "*" -protobuf = "*" -sympy = "*" - [[package]] name = "openai" version = "1.57.1" @@ -3933,158 +3402,6 @@ typing-extensions = ">=4.11,<5" [package.extras] datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] -[[package]] -name = "opentelemetry-api" -version = "1.28.2" -description = "OpenTelemetry Python API" -optional = false -python-versions = ">=3.8" -files = [ - {file = "opentelemetry_api-1.28.2-py3-none-any.whl", hash = "sha256:6fcec89e265beb258fe6b1acaaa3c8c705a934bd977b9f534a2b7c0d2d4275a6"}, - {file = "opentelemetry_api-1.28.2.tar.gz", hash = "sha256:ecdc70c7139f17f9b0cf3742d57d7020e3e8315d6cffcdf1a12a905d45b19cc0"}, -] - -[package.dependencies] -deprecated = ">=1.2.6" -importlib-metadata = ">=6.0,<=8.5.0" - -[[package]] -name = "opentelemetry-exporter-otlp-proto-grpc" -version = "1.15.0" -description = "OpenTelemetry Collector Protobuf over gRPC Exporter" -optional = false -python-versions = ">=3.7" -files = [ - {file = "opentelemetry_exporter_otlp_proto_grpc-1.15.0-py3-none-any.whl", hash = "sha256:c2a5492ba7d140109968135d641d06ce3c5bd73c50665f787526065d57d7fd1d"}, - {file = "opentelemetry_exporter_otlp_proto_grpc-1.15.0.tar.gz", hash = "sha256:844f2a4bb9bcda34e4eb6fe36765e5031aacb36dc60ed88c90fc246942ea26e7"}, -] - -[package.dependencies] -backoff = {version = ">=1.10.0,<3.0.0", markers = "python_version >= \"3.7\""} -googleapis-common-protos = ">=1.52,<2.0" -grpcio = ">=1.0.0,<2.0.0" -opentelemetry-api = ">=1.12,<2.0" -opentelemetry-proto = "1.15.0" -opentelemetry-sdk = ">=1.12,<2.0" - -[package.extras] -test = ["pytest-grpc"] - -[[package]] -name = "opentelemetry-instrumentation" -version = "0.49b2" -description = "Instrumentation Tools & Auto Instrumentation for OpenTelemetry Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "opentelemetry_instrumentation-0.49b2-py3-none-any.whl", hash = "sha256:f6d782b0ef9fef4a4c745298651c65f5c532c34cd4c40d230ab5b9f3b3b4d151"}, - {file = "opentelemetry_instrumentation-0.49b2.tar.gz", hash = "sha256:8cf00cc8d9d479e4b72adb9bd267ec544308c602b7188598db5a687e77b298e2"}, -] - -[package.dependencies] -opentelemetry-api = ">=1.4,<2.0" -opentelemetry-semantic-conventions = "0.49b2" -packaging = ">=18.0" -wrapt = ">=1.0.0,<2.0.0" - -[[package]] -name = "opentelemetry-instrumentation-asgi" -version = "0.49b2" -description = "ASGI instrumentation for OpenTelemetry" -optional = false -python-versions = ">=3.8" -files = [ - {file = "opentelemetry_instrumentation_asgi-0.49b2-py3-none-any.whl", hash = "sha256:c8ede13ed781402458a800411cb7ec16a25386dc21de8e5b9a568b386a1dc5f4"}, - {file = "opentelemetry_instrumentation_asgi-0.49b2.tar.gz", hash = "sha256:2af5faf062878330714efe700127b837038c4d9d3b70b451ab2424d5076d6c1c"}, -] - -[package.dependencies] -asgiref = ">=3.0,<4.0" -opentelemetry-api = ">=1.12,<2.0" -opentelemetry-instrumentation = "0.49b2" -opentelemetry-semantic-conventions = "0.49b2" -opentelemetry-util-http = "0.49b2" - -[package.extras] -instruments = ["asgiref (>=3.0,<4.0)"] - -[[package]] -name = "opentelemetry-instrumentation-fastapi" -version = "0.49b2" -description = "OpenTelemetry FastAPI Instrumentation" -optional = false -python-versions = ">=3.8" -files = [ - {file = "opentelemetry_instrumentation_fastapi-0.49b2-py3-none-any.whl", hash = "sha256:c66331d05bf806d7ca4f9579c1db7383aad31a9f6665dbaa2b7c9a4c1e830892"}, - {file = "opentelemetry_instrumentation_fastapi-0.49b2.tar.gz", hash = "sha256:3aa81ed7acf6aa5236d96e90a1218c5e84a9c0dce8fa63bf34ceee6218354b63"}, -] - -[package.dependencies] -opentelemetry-api = ">=1.12,<2.0" -opentelemetry-instrumentation = "0.49b2" -opentelemetry-instrumentation-asgi = "0.49b2" -opentelemetry-semantic-conventions = "0.49b2" -opentelemetry-util-http = "0.49b2" - -[package.extras] -instruments = ["fastapi (>=0.58,<1.0)"] - -[[package]] -name = "opentelemetry-proto" -version = "1.15.0" -description = "OpenTelemetry Python Proto" -optional = false -python-versions = ">=3.7" -files = [ - {file = "opentelemetry_proto-1.15.0-py3-none-any.whl", hash = "sha256:044b6d044b4d10530f250856f933442b8753a17f94ae37c207607f733fb9a844"}, - {file = "opentelemetry_proto-1.15.0.tar.gz", hash = "sha256:9c4008e40ac8cab359daac283fbe7002c5c29c77ea2674ad5626a249e64e0101"}, -] - -[package.dependencies] -protobuf = ">=3.19,<5.0" - -[[package]] -name = "opentelemetry-sdk" -version = "1.28.2" -description = "OpenTelemetry Python SDK" -optional = false -python-versions = ">=3.8" -files = [ - {file = "opentelemetry_sdk-1.28.2-py3-none-any.whl", hash = "sha256:93336c129556f1e3ccd21442b94d3521759541521861b2214c499571b85cb71b"}, - {file = "opentelemetry_sdk-1.28.2.tar.gz", hash = "sha256:5fed24c5497e10df30282456fe2910f83377797511de07d14cec0d3e0a1a3110"}, -] - -[package.dependencies] -opentelemetry-api = "1.28.2" -opentelemetry-semantic-conventions = "0.49b2" -typing-extensions = ">=3.7.4" - -[[package]] -name = "opentelemetry-semantic-conventions" -version = "0.49b2" -description = "OpenTelemetry Semantic Conventions" -optional = false -python-versions = ">=3.8" -files = [ - {file = "opentelemetry_semantic_conventions-0.49b2-py3-none-any.whl", hash = "sha256:51e7e1d0daa958782b6c2a8ed05e5f0e7dd0716fc327ac058777b8659649ee54"}, - {file = "opentelemetry_semantic_conventions-0.49b2.tar.gz", hash = "sha256:44e32ce6a5bb8d7c0c617f84b9dc1c8deda1045a07dc16a688cc7cbeab679997"}, -] - -[package.dependencies] -deprecated = ">=1.2.6" -opentelemetry-api = "1.28.2" - -[[package]] -name = "opentelemetry-util-http" -version = "0.49b2" -description = "Web util for OpenTelemetry" -optional = false -python-versions = ">=3.8" -files = [ - {file = "opentelemetry_util_http-0.49b2-py3-none-any.whl", hash = "sha256:e325d6511c6bee7b43170eb0c93261a210ec57e20ab1d7a99838515ef6d2bf58"}, - {file = "opentelemetry_util_http-0.49b2.tar.gz", hash = "sha256:5958c7009f79146bbe98b0fdb23d9d7bf1ea9cd154a1c199029b1a89e0557199"}, -] - [[package]] name = "orjson" version = "3.10.12" @@ -4169,17 +3486,6 @@ files = [ {file = "orjson-3.10.12.tar.gz", hash = "sha256:0a78bbda3aea0f9f079057ee1ee8a1ecf790d4f1af88dd67493c6b8ee52506ff"}, ] -[[package]] -name = "overrides" -version = "7.7.0" -description = "A decorator to automatically detect mismatch when overriding a method." -optional = false -python-versions = ">=3.6" -files = [ - {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, - {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, -] - [[package]] name = "packaging" version = "24.2" @@ -4524,29 +3830,6 @@ docs = ["sphinx (>=1.7.1)"] redis = ["redis"] tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "pytest-timeout (>=2.1.0)", "redis", "sphinx (>=6.0.0)", "types-redis"] -[[package]] -name = "posthog" -version = "3.7.4" -description = "Integrate PostHog into any python application." -optional = false -python-versions = "*" -files = [ - {file = "posthog-3.7.4-py2.py3-none-any.whl", hash = "sha256:21c18c6bf43b2de303ea4cd6e95804cc0f24c20cb2a96a8fd09da2ed50b62faa"}, - {file = "posthog-3.7.4.tar.gz", hash = "sha256:19384bd09d330f9787a7e2446aba14c8057ece56144970ea2791072d4e40cd36"}, -] - -[package.dependencies] -backoff = ">=1.10.0" -monotonic = ">=1.5" -python-dateutil = ">2.1" -requests = ">=2.7,<3.0" -six = ">=1.5" - -[package.extras] -dev = ["black", "flake8", "flake8-print", "isort", "pre-commit"] -sentry = ["django", "sentry-sdk"] -test = ["coverage", "django", "flake8", "freezegun (==0.3.15)", "mock (>=2.0.0)", "pylint", "pytest", "pytest-timeout"] - [[package]] name = "pre-commit" version = "3.8.0" @@ -4691,7 +3974,7 @@ files = [ name = "protobuf" version = "4.25.5" description = "" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "protobuf-4.25.5-cp310-abi3-win32.whl", hash = "sha256:5e61fd921603f58d2f5acb2806a929b4675f8874ff5f330b7d6f7e2e784bbcd8"}, @@ -4842,53 +4125,6 @@ files = [ {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, ] -[[package]] -name = "pulsar-client" -version = "3.5.0" -description = "Apache Pulsar Python client library" -optional = false -python-versions = "*" -files = [ - {file = "pulsar_client-3.5.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:c18552edb2f785de85280fe624bc507467152bff810fc81d7660fa2dfa861f38"}, - {file = "pulsar_client-3.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18d438e456c146f01be41ef146f649dedc8f7bc714d9eaef94cff2e34099812b"}, - {file = "pulsar_client-3.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18a26a0719841103c7a89eb1492c4a8fedf89adaa386375baecbb4fa2707e88f"}, - {file = "pulsar_client-3.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ab0e1605dc5f44a126163fd06cd0a768494ad05123f6e0de89a2c71d6e2d2319"}, - {file = "pulsar_client-3.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdef720891b97656fdce3bf5913ea7729b2156b84ba64314f432c1e72c6117fa"}, - {file = "pulsar_client-3.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:a42544e38773191fe550644a90e8050579476bb2dcf17ac69a4aed62a6cb70e7"}, - {file = "pulsar_client-3.5.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:fd94432ea5d398ea78f8f2e09a217ec5058d26330c137a22690478c031e116da"}, - {file = "pulsar_client-3.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6252ae462e07ece4071213fdd9c76eab82ca522a749f2dc678037d4cbacd40b"}, - {file = "pulsar_client-3.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03b4d440b2d74323784328b082872ee2f206c440b5d224d7941eb3c083ec06c6"}, - {file = "pulsar_client-3.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f60af840b8d64a2fac5a0c1ce6ae0ddffec5f42267c6ded2c5e74bad8345f2a1"}, - {file = "pulsar_client-3.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2277a447c3b7f6571cb1eb9fc5c25da3fdd43d0b2fb91cf52054adfadc7d6842"}, - {file = "pulsar_client-3.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:f20f3e9dd50db2a37059abccad42078b7a4754b8bc1d3ae6502e71c1ad2209f0"}, - {file = "pulsar_client-3.5.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:d61f663d85308e12f44033ba95af88730f581a7e8da44f7a5c080a3aaea4878d"}, - {file = "pulsar_client-3.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a1ba0be25b6f747bcb28102b7d906ec1de48dc9f1a2d9eacdcc6f44ab2c9e17"}, - {file = "pulsar_client-3.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a181e3e60ac39df72ccb3c415d7aeac61ad0286497a6e02739a560d5af28393a"}, - {file = "pulsar_client-3.5.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3c72895ff7f51347e4f78b0375b2213fa70dd4790bbb78177b4002846f1fd290"}, - {file = "pulsar_client-3.5.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:547dba1b185a17eba915e51d0a3aca27c80747b6187e5cd7a71a3ca33921decc"}, - {file = "pulsar_client-3.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:443b786eed96bc86d2297a6a42e79f39d1abf217ec603e0bd303f3488c0234af"}, - {file = "pulsar_client-3.5.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:15b58f5d759dd6166db8a2d90ed05a38063b05cda76c36d190d86ef5c9249397"}, - {file = "pulsar_client-3.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af34bfe813dddf772a8a298117fa0a036ee963595d8bc8f00d969a0329ae6ed9"}, - {file = "pulsar_client-3.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27a0fec1dd74e1367d3742ce16679c1807994df60f5e666f440cf39323938fad"}, - {file = "pulsar_client-3.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dbcd26ef9c03f96fb9cd91baec3bbd3c4b997834eb3556670d31f41cc25b5f64"}, - {file = "pulsar_client-3.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:afea1d0b6e793fd56e56463145751ff3aa79fdcd5b26e90d0da802a1bbabe07e"}, - {file = "pulsar_client-3.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:da1ab2fb1bef64b966e9403a0a186ebc90368d99e054ce2cae5b1128478f4ef4"}, - {file = "pulsar_client-3.5.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:9ad5dcc0eb8d2a7c0fb8e1fa146a0c6d4bdaf934f1169080b2c64b2f0573e086"}, - {file = "pulsar_client-3.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5870c6805b1a57962ed908d1173e97e13470415998393925c86a43694420389"}, - {file = "pulsar_client-3.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29cb5fedb969895b78301dc00a979133e69940812b8332e4de948bb0ad3db7cb"}, - {file = "pulsar_client-3.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e53c74bfa59b20c66adea95023169060f5048dd8d843e6ef9cd3b8ee2d23e93b"}, - {file = "pulsar_client-3.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:99dbadb13967f1add57010971ed36b5a77d24afcdaea01960d0e55e56cf4ba6f"}, - {file = "pulsar_client-3.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:058887661d438796f42307dcc8054c84dea88a37683dae36498b95d7e1c39b37"}, -] - -[package.dependencies] -certifi = "*" - -[package.extras] -all = ["apache-bookkeeper-client (>=4.16.1)", "fastavro (>=1.9.2)", "grpcio (>=1.60.0)", "prometheus-client", "protobuf (>=3.6.1,<=3.20.3)", "ratelimit"] -avro = ["fastavro (>=1.9.2)"] -functions = ["apache-bookkeeper-client (>=4.16.1)", "grpcio (>=1.60.0)", "prometheus-client", "protobuf (>=3.6.1,<=3.20.3)", "ratelimit"] - [[package]] name = "pure-eval" version = "0.2.3" @@ -4957,31 +4193,6 @@ files = [ [package.extras] test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"] -[[package]] -name = "pyasn1" -version = "0.6.1" -description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, - {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, -] - -[[package]] -name = "pyasn1-modules" -version = "0.4.1" -description = "A collection of ASN.1-based protocols modules" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyasn1_modules-0.4.1-py3-none-any.whl", hash = "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd"}, - {file = "pyasn1_modules-0.4.1.tar.gz", hash = "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c"}, -] - -[package.dependencies] -pyasn1 = ">=0.4.6,<0.7.0" - [[package]] name = "pyautogen" version = "0.2.22" @@ -5290,41 +4501,6 @@ files = [ {file = "pyperclip-1.9.0.tar.gz", hash = "sha256:b7de0142ddc81bfc5c7507eea19da920b92252b548b96186caf94a5e2527d310"}, ] -[[package]] -name = "pypika" -version = "0.48.9" -description = "A SQL query builder API for Python" -optional = false -python-versions = "*" -files = [ - {file = "PyPika-0.48.9.tar.gz", hash = "sha256:838836a61747e7c8380cd1b7ff638694b7a7335345d0f559b04b2cd832ad5378"}, -] - -[[package]] -name = "pyproject-hooks" -version = "1.2.0" -description = "Wrappers to call pyproject.toml-based build backend hooks." -optional = false -python-versions = ">=3.7" -files = [ - {file = "pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913"}, - {file = "pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8"}, -] - -[[package]] -name = "pyreadline3" -version = "3.5.4" -description = "A python implementation of GNU readline." -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyreadline3-3.5.4-py3-none-any.whl", hash = "sha256:eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6"}, - {file = "pyreadline3-3.5.4.tar.gz", hash = "sha256:8d57d53039a1c75adba8e50dd3d992b28143480816187ea5efbd5c78e6c885b7"}, -] - -[package.extras] -dev = ["build", "flake8", "mypy", "pytest", "twine"] - [[package]] name = "pyright" version = "1.1.390" @@ -5891,24 +5067,6 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] -[[package]] -name = "requests-oauthlib" -version = "2.0.0" -description = "OAuthlib authentication support for Requests." -optional = false -python-versions = ">=3.4" -files = [ - {file = "requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"}, - {file = "requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"}, -] - -[package.dependencies] -oauthlib = ">=3.0.0" -requests = ">=2.0.0" - -[package.extras] -rsa = ["oauthlib[signedtoken] (>=3.0.0)"] - [[package]] name = "requests-toolbelt" version = "1.0.0" @@ -6054,20 +5212,6 @@ files = [ {file = "rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d"}, ] -[[package]] -name = "rsa" -version = "4.9" -description = "Pure-Python RSA implementation" -optional = false -python-versions = ">=3.6,<4" -files = [ - {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, - {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, -] - -[package.dependencies] -pyasn1 = ">=0.1.3" - [[package]] name = "scramp" version = "1.4.5" @@ -6410,23 +5554,6 @@ files = [ {file = "striprtf-0.0.26.tar.gz", hash = "sha256:fdb2bba7ac440072d1c41eab50d8d74ae88f60a8b6575c6e2c7805dc462093aa"}, ] -[[package]] -name = "sympy" -version = "1.13.3" -description = "Computer algebra system (CAS) in Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "sympy-1.13.3-py3-none-any.whl", hash = "sha256:54612cf55a62755ee71824ce692986f23c88ffa77207b30c1368eda4a7060f73"}, - {file = "sympy-1.13.3.tar.gz", hash = "sha256:b27fd2c6530e0ab39e275fc9b683895367e51d5da91baa8d3d64db2565fec4d9"}, -] - -[package.dependencies] -mpmath = ">=1.1.0,<1.4" - -[package.extras] -dev = ["hypothesis (>=6.70.0)", "pytest (>=7.1.0)"] - [[package]] name = "tenacity" version = "8.5.0" @@ -6519,38 +5646,6 @@ files = [ {file = "tokenize_rt-6.1.0.tar.gz", hash = "sha256:e8ee836616c0877ab7c7b54776d2fefcc3bde714449a206762425ae114b53c86"}, ] -[[package]] -name = "tokenizers" -version = "0.21.0" -description = "" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tokenizers-0.21.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:3c4c93eae637e7d2aaae3d376f06085164e1660f89304c0ab2b1d08a406636b2"}, - {file = "tokenizers-0.21.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:f53ea537c925422a2e0e92a24cce96f6bc5046bbef24a1652a5edc8ba975f62e"}, - {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b177fb54c4702ef611de0c069d9169f0004233890e0c4c5bd5508ae05abf193"}, - {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6b43779a269f4629bebb114e19c3fca0223296ae9fea8bb9a7a6c6fb0657ff8e"}, - {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9aeb255802be90acfd363626753fda0064a8df06031012fe7d52fd9a905eb00e"}, - {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8b09dbeb7a8d73ee204a70f94fc06ea0f17dcf0844f16102b9f414f0b7463ba"}, - {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:400832c0904f77ce87c40f1a8a27493071282f785724ae62144324f171377273"}, - {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84ca973b3a96894d1707e189c14a774b701596d579ffc7e69debfc036a61a04"}, - {file = "tokenizers-0.21.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:eb7202d231b273c34ec67767378cd04c767e967fda12d4a9e36208a34e2f137e"}, - {file = "tokenizers-0.21.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:089d56db6782a73a27fd8abf3ba21779f5b85d4a9f35e3b493c7bbcbbf0d539b"}, - {file = "tokenizers-0.21.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:c87ca3dc48b9b1222d984b6b7490355a6fdb411a2d810f6f05977258400ddb74"}, - {file = "tokenizers-0.21.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4145505a973116f91bc3ac45988a92e618a6f83eb458f49ea0790df94ee243ff"}, - {file = "tokenizers-0.21.0-cp39-abi3-win32.whl", hash = "sha256:eb1702c2f27d25d9dd5b389cc1f2f51813e99f8ca30d9e25348db6585a97e24a"}, - {file = "tokenizers-0.21.0-cp39-abi3-win_amd64.whl", hash = "sha256:87841da5a25a3a5f70c102de371db120f41873b854ba65e52bccd57df5a3780c"}, - {file = "tokenizers-0.21.0.tar.gz", hash = "sha256:ee0894bf311b75b0c03079f33859ae4b2334d675d4e93f5a4132e1eae2834fe4"}, -] - -[package.dependencies] -huggingface-hub = ">=0.16.4,<1.0" - -[package.extras] -dev = ["tokenizers[testing]"] -docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] -testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] - [[package]] name = "tomli" version = "2.2.1" @@ -6840,70 +5935,12 @@ files = [ [package.dependencies] click = ">=7.0" -colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""} h11 = ">=0.8" -httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} -python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} -pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} -uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "(sys_platform != \"win32\" and sys_platform != \"cygwin\") and platform_python_implementation != \"PyPy\" and extra == \"standard\""} -watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} -websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} [package.extras] standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] -[[package]] -name = "uvloop" -version = "0.21.0" -description = "Fast implementation of asyncio event loop on top of libuv" -optional = false -python-versions = ">=3.8.0" -files = [ - {file = "uvloop-0.21.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ec7e6b09a6fdded42403182ab6b832b71f4edaf7f37a9a0e371a01db5f0cb45f"}, - {file = "uvloop-0.21.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:196274f2adb9689a289ad7d65700d37df0c0930fd8e4e743fa4834e850d7719d"}, - {file = "uvloop-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f38b2e090258d051d68a5b14d1da7203a3c3677321cf32a95a6f4db4dd8b6f26"}, - {file = "uvloop-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87c43e0f13022b998eb9b973b5e97200c8b90823454d4bc06ab33829e09fb9bb"}, - {file = "uvloop-0.21.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:10d66943def5fcb6e7b37310eb6b5639fd2ccbc38df1177262b0640c3ca68c1f"}, - {file = "uvloop-0.21.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:67dd654b8ca23aed0a8e99010b4c34aca62f4b7fce88f39d452ed7622c94845c"}, - {file = "uvloop-0.21.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0f3fa6200b3108919f8bdabb9a7f87f20e7097ea3c543754cabc7d717d95cf8"}, - {file = "uvloop-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0878c2640cf341b269b7e128b1a5fed890adc4455513ca710d77d5e93aa6d6a0"}, - {file = "uvloop-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9fb766bb57b7388745d8bcc53a359b116b8a04c83a2288069809d2b3466c37e"}, - {file = "uvloop-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a375441696e2eda1c43c44ccb66e04d61ceeffcd76e4929e527b7fa401b90fb"}, - {file = "uvloop-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:baa0e6291d91649c6ba4ed4b2f982f9fa165b5bbd50a9e203c416a2797bab3c6"}, - {file = "uvloop-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4509360fcc4c3bd2c70d87573ad472de40c13387f5fda8cb58350a1d7475e58d"}, - {file = "uvloop-0.21.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:359ec2c888397b9e592a889c4d72ba3d6befba8b2bb01743f72fffbde663b59c"}, - {file = "uvloop-0.21.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7089d2dc73179ce5ac255bdf37c236a9f914b264825fdaacaded6990a7fb4c2"}, - {file = "uvloop-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baa4dcdbd9ae0a372f2167a207cd98c9f9a1ea1188a8a526431eef2f8116cc8d"}, - {file = "uvloop-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86975dca1c773a2c9864f4c52c5a55631038e387b47eaf56210f873887b6c8dc"}, - {file = "uvloop-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:461d9ae6660fbbafedd07559c6a2e57cd553b34b0065b6550685f6653a98c1cb"}, - {file = "uvloop-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f"}, - {file = "uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281"}, - {file = "uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af"}, - {file = "uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6"}, - {file = "uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816"}, - {file = "uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc"}, - {file = "uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553"}, - {file = "uvloop-0.21.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:17df489689befc72c39a08359efac29bbee8eee5209650d4b9f34df73d22e414"}, - {file = "uvloop-0.21.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc09f0ff191e61c2d592a752423c767b4ebb2986daa9ed62908e2b1b9a9ae206"}, - {file = "uvloop-0.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0ce1b49560b1d2d8a2977e3ba4afb2414fb46b86a1b64056bc4ab929efdafbe"}, - {file = "uvloop-0.21.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e678ad6fe52af2c58d2ae3c73dc85524ba8abe637f134bf3564ed07f555c5e79"}, - {file = "uvloop-0.21.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:460def4412e473896ef179a1671b40c039c7012184b627898eea5072ef6f017a"}, - {file = "uvloop-0.21.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:10da8046cc4a8f12c91a1c39d1dd1585c41162a15caaef165c2174db9ef18bdc"}, - {file = "uvloop-0.21.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c097078b8031190c934ed0ebfee8cc5f9ba9642e6eb88322b9958b649750f72b"}, - {file = "uvloop-0.21.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:46923b0b5ee7fc0020bef24afe7836cb068f5050ca04caf6b487c513dc1a20b2"}, - {file = "uvloop-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53e420a3afe22cdcf2a0f4846e377d16e718bc70103d7088a4f7623567ba5fb0"}, - {file = "uvloop-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88cb67cdbc0e483da00af0b2c3cdad4b7c61ceb1ee0f33fe00e09c81e3a6cb75"}, - {file = "uvloop-0.21.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:221f4f2a1f46032b403bf3be628011caf75428ee3cc204a22addf96f586b19fd"}, - {file = "uvloop-0.21.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2d1f581393673ce119355d56da84fe1dd9d2bb8b3d13ce792524e1607139feff"}, - {file = "uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3"}, -] - -[package.extras] -dev = ["Cython (>=3.0,<4.0)", "setuptools (>=60)"] -docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] -test = ["aiohttp (>=3.10.5)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"] - [[package]] name = "virtualenv" version = "20.28.0" @@ -6924,89 +5961,6 @@ platformdirs = ">=3.9.1,<5" docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] -[[package]] -name = "watchfiles" -version = "1.0.0" -description = "Simple, modern and high performance file watching and code reload in python." -optional = false -python-versions = ">=3.9" -files = [ - {file = "watchfiles-1.0.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:1d19df28f99d6a81730658fbeb3ade8565ff687f95acb59665f11502b441be5f"}, - {file = "watchfiles-1.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:28babb38cf2da8e170b706c4b84aa7e4528a6fa4f3ee55d7a0866456a1662041"}, - {file = "watchfiles-1.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12ab123135b2f42517f04e720526d41448667ae8249e651385afb5cda31fedc0"}, - {file = "watchfiles-1.0.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:13a4f9ee0cd25682679eea5c14fc629e2eaa79aab74d963bc4e21f43b8ea1877"}, - {file = "watchfiles-1.0.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e1d9284cc84de7855fcf83472e51d32daf6f6cecd094160192628bc3fee1b78"}, - {file = "watchfiles-1.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ee5edc939f53466b329bbf2e58333a5461e6c7b50c980fa6117439e2c18b42d"}, - {file = "watchfiles-1.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dccfc70480087567720e4e36ec381bba1ed68d7e5f368fe40c93b3b1eba0105"}, - {file = "watchfiles-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c83a6d33a9eda0af6a7470240d1af487807adc269704fe76a4972dd982d16236"}, - {file = "watchfiles-1.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:905f69aad276639eff3893759a07d44ea99560e67a1cf46ff389cd62f88872a2"}, - {file = "watchfiles-1.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:09551237645d6bff3972592f2aa5424df9290e7a2e15d63c5f47c48cde585935"}, - {file = "watchfiles-1.0.0-cp310-none-win32.whl", hash = "sha256:d2b39aa8edd9e5f56f99a2a2740a251dc58515398e9ed5a4b3e5ff2827060755"}, - {file = "watchfiles-1.0.0-cp310-none-win_amd64.whl", hash = "sha256:2de52b499e1ab037f1a87cb8ebcb04a819bf087b1015a4cf6dcf8af3c2a2613e"}, - {file = "watchfiles-1.0.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:fbd0ab7a9943bbddb87cbc2bf2f09317e74c77dc55b1f5657f81d04666c25269"}, - {file = "watchfiles-1.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:774ef36b16b7198669ce655d4f75b4c3d370e7f1cbdfb997fb10ee98717e2058"}, - {file = "watchfiles-1.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b4fb98100267e6a5ebaff6aaa5d20aea20240584647470be39fe4823012ac96"}, - {file = "watchfiles-1.0.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0fc3bf0effa2d8075b70badfdd7fb839d7aa9cea650d17886982840d71fdeabf"}, - {file = "watchfiles-1.0.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:648e2b6db53eca6ef31245805cd528a16f56fa4cc15aeec97795eaf713c11435"}, - {file = "watchfiles-1.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa13d604fcb9417ae5f2e3de676e66aa97427d888e83662ad205bed35a313176"}, - {file = "watchfiles-1.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:936f362e7ff28311b16f0b97ec51e8f2cc451763a3264640c6ed40fb252d1ee4"}, - {file = "watchfiles-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:245fab124b9faf58430da547512d91734858df13f2ddd48ecfa5e493455ffccb"}, - {file = "watchfiles-1.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4ff9c7e84e8b644a8f985c42bcc81457240316f900fc72769aaedec9d088055a"}, - {file = "watchfiles-1.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9c9a8d8fd97defe935ef8dd53d562e68942ad65067cd1c54d6ed8a088b1d931d"}, - {file = "watchfiles-1.0.0-cp311-none-win32.whl", hash = "sha256:a0abf173975eb9dd17bb14c191ee79999e650997cc644562f91df06060610e62"}, - {file = "watchfiles-1.0.0-cp311-none-win_amd64.whl", hash = "sha256:2a825ba4b32c214e3855b536eb1a1f7b006511d8e64b8215aac06eb680642d84"}, - {file = "watchfiles-1.0.0-cp311-none-win_arm64.whl", hash = "sha256:a5a7a06cfc65e34fd0a765a7623c5ba14707a0870703888e51d3d67107589817"}, - {file = "watchfiles-1.0.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:28fb64b5843d94e2c2483f7b024a1280662a44409bedee8f2f51439767e2d107"}, - {file = "watchfiles-1.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e3750434c83b61abb3163b49c64b04180b85b4dabb29a294513faec57f2ffdb7"}, - {file = "watchfiles-1.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bedf84835069f51c7b026b3ca04e2e747ea8ed0a77c72006172c72d28c9f69fc"}, - {file = "watchfiles-1.0.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:90004553be36427c3d06ec75b804233f8f816374165d5225b93abd94ba6e7234"}, - {file = "watchfiles-1.0.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b46e15c34d4e401e976d6949ad3a74d244600d5c4b88c827a3fdf18691a46359"}, - {file = "watchfiles-1.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:487d15927f1b0bd24e7df921913399bb1ab94424c386bea8b267754d698f8f0e"}, - {file = "watchfiles-1.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ff236d7a3f4b0a42f699a22fc374ba526bc55048a70cbb299661158e1bb5e1f"}, - {file = "watchfiles-1.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c01446626574561756067f00b37e6b09c8622b0fc1e9fdbc7cbcea328d4e514"}, - {file = "watchfiles-1.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b551c465a59596f3d08170bd7e1c532c7260dd90ed8135778038e13c5d48aa81"}, - {file = "watchfiles-1.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e1ed613ee107269f66c2df631ec0fc8efddacface85314d392a4131abe299f00"}, - {file = "watchfiles-1.0.0-cp312-none-win32.whl", hash = "sha256:5f75cd42e7e2254117cf37ff0e68c5b3f36c14543756b2da621408349bd9ca7c"}, - {file = "watchfiles-1.0.0-cp312-none-win_amd64.whl", hash = "sha256:cf517701a4a872417f4e02a136e929537743461f9ec6cdb8184d9a04f4843545"}, - {file = "watchfiles-1.0.0-cp312-none-win_arm64.whl", hash = "sha256:8a2127cd68950787ee36753e6d401c8ea368f73beaeb8e54df5516a06d1ecd82"}, - {file = "watchfiles-1.0.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:95de85c254f7fe8cbdf104731f7f87f7f73ae229493bebca3722583160e6b152"}, - {file = "watchfiles-1.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:533a7cbfe700e09780bb31c06189e39c65f06c7f447326fee707fd02f9a6e945"}, - {file = "watchfiles-1.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2218e78e2c6c07b1634a550095ac2a429026b2d5cbcd49a594f893f2bb8c936"}, - {file = "watchfiles-1.0.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9122b8fdadc5b341315d255ab51d04893f417df4e6c1743b0aac8bf34e96e025"}, - {file = "watchfiles-1.0.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9272fdbc0e9870dac3b505bce1466d386b4d8d6d2bacf405e603108d50446940"}, - {file = "watchfiles-1.0.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a3b33c3aefe9067ebd87846806cd5fc0b017ab70d628aaff077ab9abf4d06b3"}, - {file = "watchfiles-1.0.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bc338ce9f8846543d428260fa0f9a716626963148edc937d71055d01d81e1525"}, - {file = "watchfiles-1.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ac778a460ea22d63c7e6fb0bc0f5b16780ff0b128f7f06e57aaec63bd339285"}, - {file = "watchfiles-1.0.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:53ae447f06f8f29f5ab40140f19abdab822387a7c426a369eb42184b021e97eb"}, - {file = "watchfiles-1.0.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1f73c2147a453315d672c1ad907abe6d40324e34a185b51e15624bc793f93cc6"}, - {file = "watchfiles-1.0.0-cp313-none-win32.whl", hash = "sha256:eba98901a2eab909dbd79681190b9049acc650f6111fde1845484a4450761e98"}, - {file = "watchfiles-1.0.0-cp313-none-win_amd64.whl", hash = "sha256:d562a6114ddafb09c33246c6ace7effa71ca4b6a2324a47f4b09b6445ea78941"}, - {file = "watchfiles-1.0.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3d94fd83ed54266d789f287472269c0def9120a2022674990bd24ad989ebd7a0"}, - {file = "watchfiles-1.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48051d1c504448b2fcda71c5e6e3610ae45de6a0b8f5a43b961f250be4bdf5a8"}, - {file = "watchfiles-1.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29cf884ad4285d23453c702ed03d689f9c0e865e3c85d20846d800d4787de00f"}, - {file = "watchfiles-1.0.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d3572d4c34c4e9c33d25b3da47d9570d5122f8433b9ac6519dca49c2740d23cd"}, - {file = "watchfiles-1.0.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c2696611182c85eb0e755b62b456f48debff484b7306b56f05478b843ca8ece"}, - {file = "watchfiles-1.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:550109001920a993a4383b57229c717fa73627d2a4e8fcb7ed33c7f1cddb0c85"}, - {file = "watchfiles-1.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b555a93c15bd2c71081922be746291d776d47521a00703163e5fbe6d2a402399"}, - {file = "watchfiles-1.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:947ccba18a38b85c366dafeac8df2f6176342d5992ca240a9d62588b214d731f"}, - {file = "watchfiles-1.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ffd98a299b0a74d1b704ef0ed959efb753e656a4e0425c14e46ae4c3cbdd2919"}, - {file = "watchfiles-1.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f8c4f3a1210ed099a99e6a710df4ff2f8069411059ffe30fa5f9467ebed1256b"}, - {file = "watchfiles-1.0.0-cp39-none-win32.whl", hash = "sha256:1e176b6b4119b3f369b2b4e003d53a226295ee862c0962e3afd5a1c15680b4e3"}, - {file = "watchfiles-1.0.0-cp39-none-win_amd64.whl", hash = "sha256:2d9c0518fabf4a3f373b0a94bb9e4ea7a1df18dec45e26a4d182aa8918dee855"}, - {file = "watchfiles-1.0.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f159ac795785cde4899e0afa539f4c723fb5dd336ce5605bc909d34edd00b79b"}, - {file = "watchfiles-1.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:c3d258d78341d5d54c0c804a5b7faa66cd30ba50b2756a7161db07ce15363b8d"}, - {file = "watchfiles-1.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bbd0311588c2de7f9ea5cf3922ccacfd0ec0c1922870a2be503cc7df1ca8be7"}, - {file = "watchfiles-1.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9a13ac46b545a7d0d50f7641eefe47d1597e7d1783a5d89e09d080e6dff44b0"}, - {file = "watchfiles-1.0.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2bca898c1dc073912d3db7fa6926cc08be9575add9e84872de2c99c688bac4e"}, - {file = "watchfiles-1.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:06d828fe2adc4ac8a64b875ca908b892a3603d596d43e18f7948f3fef5fc671c"}, - {file = "watchfiles-1.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:074c7618cd6c807dc4eaa0982b4a9d3f8051cd0b72793511848fd64630174b17"}, - {file = "watchfiles-1.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95dc785bc284552d044e561b8f4fe26d01ab5ca40d35852a6572d542adfeb4bc"}, - {file = "watchfiles-1.0.0.tar.gz", hash = "sha256:37566c844c9ce3b5deb964fe1a23378e575e74b114618d211fbda8f59d7b5dab"}, -] - -[package.dependencies] -anyio = ">=3.0.0" - [[package]] name = "wcwidth" version = "0.2.13" @@ -7038,7 +5992,7 @@ test = ["websockets"] name = "websockets" version = "12.0" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"}, @@ -7555,4 +6509,4 @@ tests = ["wikipedia"] [metadata] lock-version = "2.0" python-versions = "<3.13,>=3.10" -content-hash = "04884f8e0f0dba223d058969636575e96aa0b8d089bbabba6425acc82ac4ea88" +content-hash = "c34d422295ad06d845485aa3697db488c9081ecf774ed9b360ab5e0d33707b19" diff --git a/pyproject.toml b/pyproject.toml index 9b8ff29318..51b404de9b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,7 +34,6 @@ numpy = "^1.26.2" demjson3 = "^3.0.6" #tiktoken = ">=0.7.0,<0.8.0" pyyaml = "^6.0.1" -chromadb = ">=0.4.24,<0.5.0" sqlalchemy-json = "^0.7.0" fastapi = {version = "^0.104.1", optional = true} uvicorn = {version = "^0.24.0.post1", optional = true} @@ -104,4 +103,4 @@ extend-exclude = "examples/*" [build-system] requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" \ No newline at end of file +build-backend = "poetry.core.masonry.api" diff --git a/tests/test_websocket_server.py b/tests/test_websocket_server.py deleted file mode 100644 index 81793b7e91..0000000000 --- a/tests/test_websocket_server.py +++ /dev/null @@ -1,55 +0,0 @@ -import asyncio - -import pytest -import websockets - -from letta.server.constants import WS_DEFAULT_PORT -from letta.server.ws_api.server import WebSocketServer -from letta.utils import json_dumps - - -@pytest.mark.asyncio -async def test_dummy(): - assert True - - -@pytest.mark.skip(reason="websockets is temporarily unsupported in 0.2.12") -@pytest.mark.asyncio -async def test_websocket_server(): - # host = "127.0.0.1" - host = "localhost" - server = WebSocketServer(host=host) - server_task = asyncio.create_task(server.run()) # Create a task for the server - - # the agent config we want to ask the server to instantiate with - # test_config = AgentConfig( - # persona="sam_pov", - # human="cs_phd", - # preset="memgpt_chat", - # model_endpoint= - # ) - test_config = {} - - uri = f"ws://{host}:{WS_DEFAULT_PORT}" - try: - async with websockets.connect(uri) as websocket: - # Initialize the server with a test config - print("Sending config to server...") - await websocket.send(json_dumps({"type": "initialize", "config": test_config})) - # Wait for the response - response = await websocket.recv() - print(f"Response from the agent: {response}") - - await asyncio.sleep(1) # just in case - - # Send a message to the agent - print("Sending message to server...") - await websocket.send(json_dumps({"type": "message", "content": "Hello, Agent!"})) - # Wait for the response - # NOTE: we should be waiting for multiple responses - response = await websocket.recv() - print(f"Response from the agent: {response}") - except (OSError, ConnectionRefusedError) as e: - print(f"Was unable to connect: {e}") - finally: - server_task.cancel() # Cancel the server task after the test From d0dbb9de8c460ee54538339e7064154805f44cef Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Tue, 10 Dec 2024 19:02:27 -0800 Subject: [PATCH 065/280] feat: support python 3.13 (#2176) --- .github/workflows/code_style_checks.yml | 2 +- .github/workflows/integration_tests.yml | 2 +- .github/workflows/test-pip-install.yml | 2 +- .github/workflows/test_ollama.yml | 2 +- .github/workflows/tests.yml | 4 +- letta/embeddings.py | 38 +- poetry.lock | 933 ++++++++---------------- pyproject.toml | 27 +- 8 files changed, 369 insertions(+), 641 deletions(-) diff --git a/.github/workflows/code_style_checks.yml b/.github/workflows/code_style_checks.yml index a81f26db58..802830275c 100644 --- a/.github/workflows/code_style_checks.yml +++ b/.github/workflows/code_style_checks.yml @@ -25,7 +25,7 @@ jobs: with: python-version: ${{ matrix.python-version }} poetry-version: "1.8.2" - install-args: "-E dev -E postgres -E milvus -E external-tools -E tests" # Adjust as necessary + install-args: "-E dev -E postgres -E external-tools -E tests" # Adjust as necessary - name: Validate PR Title if: github.event_name == 'pull_request' diff --git a/.github/workflows/integration_tests.yml b/.github/workflows/integration_tests.yml index 350c4c4dd5..ab221e0176 100644 --- a/.github/workflows/integration_tests.yml +++ b/.github/workflows/integration_tests.yml @@ -55,7 +55,7 @@ jobs: with: python-version: "3.12" poetry-version: "1.8.2" - install-args: "-E dev -E postgres -E milvus -E external-tools -E tests -E cloud-tool-sandbox" + install-args: "-E dev -E postgres -E external-tools -E tests -E cloud-tool-sandbox" - name: Migrate database env: LETTA_PG_PORT: 5432 diff --git a/.github/workflows/test-pip-install.yml b/.github/workflows/test-pip-install.yml index 770725c808..8e4b091b28 100644 --- a/.github/workflows/test-pip-install.yml +++ b/.github/workflows/test-pip-install.yml @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.10", "3.11", "3.12"] # Adjust Python versions as needed + python-version: ["3.10", "3.11", "3.12", "3.13"] # Adjust Python versions as needed steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/test_ollama.yml b/.github/workflows/test_ollama.yml index 75178c65a1..e76dc5dcf6 100644 --- a/.github/workflows/test_ollama.yml +++ b/.github/workflows/test_ollama.yml @@ -66,7 +66,7 @@ jobs: with: python-version: "3.12" poetry-version: "1.8.2" - install-args: "-E dev -E ollama" + install-args: "-E dev" - name: Test LLM Endpoint run: | diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 1a027a56b4..e1f40e9be5 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -60,7 +60,7 @@ jobs: with: python-version: "3.12" poetry-version: "1.8.2" - install-args: "-E dev -E postgres -E milvus -E external-tools -E tests" + install-args: "-E dev -E postgres -E external-tools -E tests" - name: Migrate database env: LETTA_PG_PORT: 5432 @@ -113,7 +113,7 @@ jobs: with: python-version: "3.12" poetry-version: "1.8.2" - install-args: "-E dev -E postgres -E milvus -E external-tools -E tests -E cloud-tool-sandbox" + install-args: "-E dev -E postgres -E external-tools -E tests -E cloud-tool-sandbox" - name: Migrate database env: LETTA_PG_PORT: 5432 diff --git a/letta/embeddings.py b/letta/embeddings.py index 632719d87d..5b521032c2 100644 --- a/letta/embeddings.py +++ b/letta/embeddings.py @@ -1,4 +1,3 @@ -import os import uuid from typing import Any, List, Optional @@ -141,14 +140,35 @@ def get_text_embedding(self, text: str): return embeddings -def default_embedding_model(): - # default to hugging face model running local - # warning: this is a terrible model - from llama_index.embeddings.huggingface import HuggingFaceEmbedding +class OllamaEmbeddings: - os.environ["TOKENIZERS_PARALLELISM"] = "False" - model = "BAAI/bge-small-en-v1.5" - return HuggingFaceEmbedding(model_name=model) + # Format: + # curl http://localhost:11434/api/embeddings -d '{ + # "model": "mxbai-embed-large", + # "prompt": "Llamas are members of the camelid family" + # }' + + def __init__(self, model: str, base_url: str, ollama_additional_kwargs: dict): + self.model = model + self.base_url = base_url + self.ollama_additional_kwargs = ollama_additional_kwargs + + def get_text_embedding(self, text: str): + import httpx + + headers = {"Content-Type": "application/json"} + json_data = {"model": self.model, "prompt": text} + json_data.update(self.ollama_additional_kwargs) + + with httpx.Client() as client: + response = client.post( + f"{self.base_url}/api/embeddings", + headers=headers, + json=json_data, + ) + + response_json = response.json() + return response_json["embedding"] def query_embedding(embedding_model, query_text: str): @@ -228,4 +248,4 @@ def embedding_model(config: EmbeddingConfig, user_id: Optional[uuid.UUID] = None return model else: - return default_embedding_model() + raise ValueError(f"Unknown endpoint type {endpoint_type}") diff --git a/poetry.lock b/poetry.lock index 28ee1fe673..e6cf38e0dd 100644 --- a/poetry.lock +++ b/poetry.lock @@ -155,24 +155,25 @@ files = [ [[package]] name = "anyio" -version = "3.7.1" +version = "4.7.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, - {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, + {file = "anyio-4.7.0-py3-none-any.whl", hash = "sha256:ea60c3723ab42ba6fff7e8ccb0488c898ec538ff4df1f1d5e642c3601d07e352"}, + {file = "anyio-4.7.0.tar.gz", hash = "sha256:2f834749c602966b7d456a7567cafcb309f96482b5081d14ac93ccd457f9dd48"}, ] [package.dependencies] -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" +typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] -doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] -test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (<0.22)"] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] +trio = ["trio (>=0.26.1)"] [[package]] name = "appnope" @@ -378,7 +379,7 @@ files = [ name = "brotli" version = "1.1.0" description = "Python bindings for the Brotli compression library" -optional = true +optional = false python-versions = "*" files = [ {file = "Brotli-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1140c64812cb9b06c922e77f1c26a75ec5e3f0fb2bf92cc8c58720dec276752"}, @@ -904,37 +905,13 @@ vision = ["Pillow (>=9.4.0)"] [[package]] name = "debugpy" -version = "1.8.9" +version = "1.8.10" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.9-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:cfe1e6c6ad7178265f74981edf1154ffce97b69005212fbc90ca22ddfe3d017e"}, - {file = "debugpy-1.8.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada7fb65102a4d2c9ab62e8908e9e9f12aed9d76ef44880367bc9308ebe49a0f"}, - {file = "debugpy-1.8.9-cp310-cp310-win32.whl", hash = "sha256:c36856343cbaa448171cba62a721531e10e7ffb0abff838004701454149bc037"}, - {file = "debugpy-1.8.9-cp310-cp310-win_amd64.whl", hash = "sha256:17c5e0297678442511cf00a745c9709e928ea4ca263d764e90d233208889a19e"}, - {file = "debugpy-1.8.9-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:b74a49753e21e33e7cf030883a92fa607bddc4ede1aa4145172debc637780040"}, - {file = "debugpy-1.8.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62d22dacdb0e296966d7d74a7141aaab4bec123fa43d1a35ddcb39bf9fd29d70"}, - {file = "debugpy-1.8.9-cp311-cp311-win32.whl", hash = "sha256:8138efff315cd09b8dcd14226a21afda4ca582284bf4215126d87342bba1cc66"}, - {file = "debugpy-1.8.9-cp311-cp311-win_amd64.whl", hash = "sha256:ff54ef77ad9f5c425398efb150239f6fe8e20c53ae2f68367eba7ece1e96226d"}, - {file = "debugpy-1.8.9-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:957363d9a7a6612a37458d9a15e72d03a635047f946e5fceee74b50d52a9c8e2"}, - {file = "debugpy-1.8.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e565fc54b680292b418bb809f1386f17081d1346dca9a871bf69a8ac4071afe"}, - {file = "debugpy-1.8.9-cp312-cp312-win32.whl", hash = "sha256:3e59842d6c4569c65ceb3751075ff8d7e6a6ada209ceca6308c9bde932bcef11"}, - {file = "debugpy-1.8.9-cp312-cp312-win_amd64.whl", hash = "sha256:66eeae42f3137eb428ea3a86d4a55f28da9bd5a4a3d369ba95ecc3a92c1bba53"}, - {file = "debugpy-1.8.9-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:957ecffff80d47cafa9b6545de9e016ae8c9547c98a538ee96ab5947115fb3dd"}, - {file = "debugpy-1.8.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1efbb3ff61487e2c16b3e033bc8595aea578222c08aaf3c4bf0f93fadbd662ee"}, - {file = "debugpy-1.8.9-cp313-cp313-win32.whl", hash = "sha256:7c4d65d03bee875bcb211c76c1d8f10f600c305dbd734beaed4077e902606fee"}, - {file = "debugpy-1.8.9-cp313-cp313-win_amd64.whl", hash = "sha256:e46b420dc1bea64e5bbedd678148be512442bc589b0111bd799367cde051e71a"}, - {file = "debugpy-1.8.9-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:472a3994999fe6c0756945ffa359e9e7e2d690fb55d251639d07208dbc37caea"}, - {file = "debugpy-1.8.9-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:365e556a4772d7d0d151d7eb0e77ec4db03bcd95f26b67b15742b88cacff88e9"}, - {file = "debugpy-1.8.9-cp38-cp38-win32.whl", hash = "sha256:54a7e6d3014c408eb37b0b06021366ee985f1539e12fe49ca2ee0d392d9ceca5"}, - {file = "debugpy-1.8.9-cp38-cp38-win_amd64.whl", hash = "sha256:8e99c0b1cc7bf86d83fb95d5ccdc4ad0586d4432d489d1f54e4055bcc795f693"}, - {file = "debugpy-1.8.9-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:7e8b079323a56f719977fde9d8115590cb5e7a1cba2fcee0986ef8817116e7c1"}, - {file = "debugpy-1.8.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6953b335b804a41f16a192fa2e7851bdcfd92173cbb2f9f777bb934f49baab65"}, - {file = "debugpy-1.8.9-cp39-cp39-win32.whl", hash = "sha256:7e646e62d4602bb8956db88b1e72fe63172148c1e25c041e03b103a25f36673c"}, - {file = "debugpy-1.8.9-cp39-cp39-win_amd64.whl", hash = "sha256:3d9755e77a2d680ce3d2c5394a444cf42be4a592caaf246dbfbdd100ffcf7ae5"}, - {file = "debugpy-1.8.9-py2.py3-none-any.whl", hash = "sha256:cc37a6c9987ad743d9c3a14fa1b1a14b7e4e6041f9dd0c8abf8895fe7a97b899"}, - {file = "debugpy-1.8.9.zip", hash = "sha256:1339e14c7d980407248f09824d1b25ff5c5616651689f1e0f0e51bdead3ea13e"}, + {file = "debugpy-1.8.10-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:97aa00af95983887806e06f37e144909d35215d66db74f8b0e9799b4eef40cfd"}, + {file = "debugpy-1.8.10.tar.gz", hash = "sha256:ee4ed903cbeb14ee1839549f953af519ffa512598ec987b2051f9c868e2249a8"}, ] [[package]] @@ -1001,17 +978,6 @@ files = [ {file = "dirtyjson-1.0.8.tar.gz", hash = "sha256:90ca4a18f3ff30ce849d100dcf4a003953c79d3a2348ef056f1d9c22231a25fd"}, ] -[[package]] -name = "diskcache" -version = "5.6.3" -description = "Disk Cache -- Disk and file backed persistent cache." -optional = true -python-versions = ">=3" -files = [ - {file = "diskcache-5.6.3-py3-none-any.whl", hash = "sha256:5e31b2d5fbad117cc363ebaf6b689474db18a1f6438bc82358b024abd4c2ca19"}, - {file = "diskcache-5.6.3.tar.gz", hash = "sha256:2c3a3fa2743d8535d832ec61c2054a1641f41775aa7c556758a109941e33e4fc"}, -] - [[package]] name = "distlib" version = "0.3.9" @@ -1113,27 +1079,6 @@ attrs = ">=21.3.0" e2b = ">=1.0.4,<2.0.0" httpx = ">=0.20.0,<1.0.0" -[[package]] -name = "environs" -version = "9.5.0" -description = "simplified environment variable parsing" -optional = true -python-versions = ">=3.6" -files = [ - {file = "environs-9.5.0-py2.py3-none-any.whl", hash = "sha256:1e549569a3de49c05f856f40bce86979e7d5ffbbc4398e7f338574c220189124"}, - {file = "environs-9.5.0.tar.gz", hash = "sha256:a76307b36fbe856bdca7ee9161e6c466fd7fcffc297109a118c59b54e27e30c9"}, -] - -[package.dependencies] -marshmallow = ">=3.0.0" -python-dotenv = "*" - -[package.extras] -dev = ["dj-database-url", "dj-email-url", "django-cache-url", "flake8 (==4.0.1)", "flake8-bugbear (==21.9.2)", "mypy (==0.910)", "pre-commit (>=2.4,<3.0)", "pytest", "tox"] -django = ["dj-database-url", "dj-email-url", "django-cache-url"] -lint = ["flake8 (==4.0.1)", "flake8-bugbear (==21.9.2)", "mypy (==0.910)", "pre-commit (>=2.4,<3.0)"] -tests = ["dj-database-url", "dj-email-url", "django-cache-url", "pytest"] - [[package]] name = "exceptiongroup" version = "1.2.2" @@ -1164,23 +1109,23 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth [[package]] name = "fastapi" -version = "0.104.1" +version = "0.115.6" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false python-versions = ">=3.8" files = [ - {file = "fastapi-0.104.1-py3-none-any.whl", hash = "sha256:752dc31160cdbd0436bb93bad51560b57e525cbb1d4bbf6f4904ceee75548241"}, - {file = "fastapi-0.104.1.tar.gz", hash = "sha256:e5e4540a7c5e1dcfbbcf5b903c234feddcdcd881f191977a1c5dfd917487e7ae"}, + {file = "fastapi-0.115.6-py3-none-any.whl", hash = "sha256:e9240b29e36fa8f4bb7290316988e90c381e5092e0cbe84e7818cc3713bcf305"}, + {file = "fastapi-0.115.6.tar.gz", hash = "sha256:9ec46f7addc14ea472958a96aae5b5de65f39721a46aaf5705c480d9a8b76654"}, ] [package.dependencies] -anyio = ">=3.7.1,<4.0.0" pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" -starlette = ">=0.27.0,<0.28.0" +starlette = ">=0.40.0,<0.42.0" typing-extensions = ">=4.8.0" [package.extras] -all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "jinja2 (>=2.11.2)", "python-multipart (>=0.0.7)", "uvicorn[standard] (>=0.12.0)"] [[package]] name = "filelock" @@ -1209,43 +1154,6 @@ files = [ {file = "filetype-1.2.0.tar.gz", hash = "sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb"}, ] -[[package]] -name = "flaml" -version = "2.3.2" -description = "A fast library for automated machine learning and tuning" -optional = true -python-versions = ">=3.8" -files = [ - {file = "FLAML-2.3.2-py3-none-any.whl", hash = "sha256:1ee6e8e76bf1d741b4da41e2a2a8c0638b36d90b0f60aac323b5568f54dcb9e7"}, - {file = "flaml-2.3.2.tar.gz", hash = "sha256:4a1ec289ddaec36850cfc66f6fb335b8521df49ea31f6adb54ea63a5cebb6865"}, -] - -[package.dependencies] -NumPy = ">=1.17" - -[package.extras] -autogen = ["diskcache", "openai (==0.27.8)", "termcolor"] -automl = ["lightgbm (>=2.3.1)", "pandas (>=1.1.4)", "scikit-learn (>=1.0.0)", "scipy (>=1.4.1)", "xgboost (>=0.90,<3.0.0)"] -autozero = ["packaging", "pandas", "scikit-learn"] -azureml = ["azureml-mlflow"] -benchmark = ["catboost (>=0.26)", "pandas (==1.1.4)", "psutil (==5.8.0)", "xgboost (==1.3.3)"] -blendsearch = ["optuna (>=2.8.0,<=3.6.1)", "packaging"] -catboost = ["catboost (>=0.26,<1.2)", "catboost (>=0.26,<=1.2.5)"] -forecast = ["hcrystalball (==0.1.10)", "holidays (<0.14)", "prophet (>=1.0.1)", "pytorch-forecasting (>=0.9.0)", "pytorch-lightning (==1.9.0)", "statsmodels (>=0.12.2)", "tensorboardX (==2.6)"] -hf = ["datasets", "nltk (<=3.8.1)", "rouge-score", "seqeval", "transformers[torch] (==4.26)"] -mathchat = ["diskcache", "openai (==0.27.8)", "pydantic (==1.10.9)", "sympy", "termcolor", "wolframalpha"] -nlp = ["datasets", "nltk (<=3.8.1)", "rouge-score", "seqeval", "transformers[torch] (==4.26)"] -nni = ["nni"] -notebook = ["jupyter"] -openai = ["diskcache", "openai (==0.27.8)"] -ray = ["ray[tune] (>=1.13,<2.0)"] -retrievechat = ["chromadb", "diskcache", "openai (==0.27.8)", "sentence-transformers", "termcolor", "tiktoken"] -spark = ["joblib (<=1.3.2)", "joblibspark (>=0.5.0)", "pyspark (>=3.2.0)"] -synapse = ["joblibspark (>=0.5.0)", "optuna (>=2.8.0,<=3.6.1)", "pyspark (>=3.2.0)"] -test = ["catboost (>=0.26)", "catboost (>=0.26,<1.2)", "coverage (>=5.3)", "dataclasses", "datasets", "dill", "hcrystalball (==0.1.10)", "ipykernel", "joblib (<=1.3.2)", "joblibspark (>=0.5.0)", "jupyter", "lightgbm (>=2.3.1)", "mlflow (==2.15.1)", "nbconvert", "nbformat", "nltk (<=3.8.1)", "openml", "optuna (>=2.8.0,<=3.6.1)", "packaging", "pandas (>=1.1.4)", "pandas (>=1.1.4,<2.0.0)", "pre-commit", "psutil (==5.8.0)", "pydantic (==1.10.9)", "pytest (>=6.1.1)", "pytorch-forecasting (>=0.9.0,<=0.10.1)", "pytorch-lightning (<1.9.1)", "requests (<2.29.0)", "rgf-python", "rouge-score", "scikit-learn (>=1.0.0)", "scipy (>=1.4.1)", "seqeval", "statsmodels (>=0.12.2)", "sympy", "tensorboardX (==2.6)", "thop", "torch", "torchvision", "transformers[torch] (==4.26)", "wolframalpha", "xgboost (>=0.90,<2.0.0)"] -ts-forecast = ["hcrystalball (==0.1.10)", "holidays (<0.14)", "prophet (>=1.0.1)", "statsmodels (>=0.12.2)"] -vw = ["scikit-learn", "vowpalwabbit (>=8.10.0,<9.0.0)"] - [[package]] name = "flask" version = "3.1.0" @@ -1686,122 +1594,138 @@ test = ["objgraph", "psutil"] [[package]] name = "grpcio" -version = "1.63.0" +version = "1.68.1" description = "HTTP/2-based RPC framework" -optional = true +optional = false python-versions = ">=3.8" files = [ - {file = "grpcio-1.63.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:2e93aca840c29d4ab5db93f94ed0a0ca899e241f2e8aec6334ab3575dc46125c"}, - {file = "grpcio-1.63.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:91b73d3f1340fefa1e1716c8c1ec9930c676d6b10a3513ab6c26004cb02d8b3f"}, - {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:b3afbd9d6827fa6f475a4f91db55e441113f6d3eb9b7ebb8fb806e5bb6d6bd0d"}, - {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f3f6883ce54a7a5f47db43289a0a4c776487912de1a0e2cc83fdaec9685cc9f"}, - {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf8dae9cc0412cb86c8de5a8f3be395c5119a370f3ce2e69c8b7d46bb9872c8d"}, - {file = "grpcio-1.63.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:08e1559fd3b3b4468486b26b0af64a3904a8dbc78d8d936af9c1cf9636eb3e8b"}, - {file = "grpcio-1.63.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5c039ef01516039fa39da8a8a43a95b64e288f79f42a17e6c2904a02a319b357"}, - {file = "grpcio-1.63.0-cp310-cp310-win32.whl", hash = "sha256:ad2ac8903b2eae071055a927ef74121ed52d69468e91d9bcbd028bd0e554be6d"}, - {file = "grpcio-1.63.0-cp310-cp310-win_amd64.whl", hash = "sha256:b2e44f59316716532a993ca2966636df6fbe7be4ab6f099de6815570ebe4383a"}, - {file = "grpcio-1.63.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:f28f8b2db7b86c77916829d64ab21ff49a9d8289ea1564a2b2a3a8ed9ffcccd3"}, - {file = "grpcio-1.63.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:65bf975639a1f93bee63ca60d2e4951f1b543f498d581869922910a476ead2f5"}, - {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:b5194775fec7dc3dbd6a935102bb156cd2c35efe1685b0a46c67b927c74f0cfb"}, - {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4cbb2100ee46d024c45920d16e888ee5d3cf47c66e316210bc236d5bebc42b3"}, - {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ff737cf29b5b801619f10e59b581869e32f400159e8b12d7a97e7e3bdeee6a2"}, - {file = "grpcio-1.63.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd1e68776262dd44dedd7381b1a0ad09d9930ffb405f737d64f505eb7f77d6c7"}, - {file = "grpcio-1.63.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:93f45f27f516548e23e4ec3fbab21b060416007dbe768a111fc4611464cc773f"}, - {file = "grpcio-1.63.0-cp311-cp311-win32.whl", hash = "sha256:878b1d88d0137df60e6b09b74cdb73db123f9579232c8456f53e9abc4f62eb3c"}, - {file = "grpcio-1.63.0-cp311-cp311-win_amd64.whl", hash = "sha256:756fed02dacd24e8f488f295a913f250b56b98fb793f41d5b2de6c44fb762434"}, - {file = "grpcio-1.63.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:93a46794cc96c3a674cdfb59ef9ce84d46185fe9421baf2268ccb556f8f81f57"}, - {file = "grpcio-1.63.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a7b19dfc74d0be7032ca1eda0ed545e582ee46cd65c162f9e9fc6b26ef827dc6"}, - {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:8064d986d3a64ba21e498b9a376cbc5d6ab2e8ab0e288d39f266f0fca169b90d"}, - {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:219bb1848cd2c90348c79ed0a6b0ea51866bc7e72fa6e205e459fedab5770172"}, - {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2d60cd1d58817bc5985fae6168d8b5655c4981d448d0f5b6194bbcc038090d2"}, - {file = "grpcio-1.63.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9e350cb096e5c67832e9b6e018cf8a0d2a53b2a958f6251615173165269a91b0"}, - {file = "grpcio-1.63.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:56cdf96ff82e3cc90dbe8bac260352993f23e8e256e063c327b6cf9c88daf7a9"}, - {file = "grpcio-1.63.0-cp312-cp312-win32.whl", hash = "sha256:3a6d1f9ea965e750db7b4ee6f9fdef5fdf135abe8a249e75d84b0a3e0c668a1b"}, - {file = "grpcio-1.63.0-cp312-cp312-win_amd64.whl", hash = "sha256:d2497769895bb03efe3187fb1888fc20e98a5f18b3d14b606167dacda5789434"}, - {file = "grpcio-1.63.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:fdf348ae69c6ff484402cfdb14e18c1b0054ac2420079d575c53a60b9b2853ae"}, - {file = "grpcio-1.63.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a3abfe0b0f6798dedd2e9e92e881d9acd0fdb62ae27dcbbfa7654a57e24060c0"}, - {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:6ef0ad92873672a2a3767cb827b64741c363ebaa27e7f21659e4e31f4d750280"}, - {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b416252ac5588d9dfb8a30a191451adbf534e9ce5f56bb02cd193f12d8845b7f"}, - {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3b77eaefc74d7eb861d3ffbdf91b50a1bb1639514ebe764c47773b833fa2d91"}, - {file = "grpcio-1.63.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b005292369d9c1f80bf70c1db1c17c6c342da7576f1c689e8eee4fb0c256af85"}, - {file = "grpcio-1.63.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cdcda1156dcc41e042d1e899ba1f5c2e9f3cd7625b3d6ebfa619806a4c1aadda"}, - {file = "grpcio-1.63.0-cp38-cp38-win32.whl", hash = "sha256:01799e8649f9e94ba7db1aeb3452188048b0019dc37696b0f5ce212c87c560c3"}, - {file = "grpcio-1.63.0-cp38-cp38-win_amd64.whl", hash = "sha256:6a1a3642d76f887aa4009d92f71eb37809abceb3b7b5a1eec9c554a246f20e3a"}, - {file = "grpcio-1.63.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:75f701ff645858a2b16bc8c9fc68af215a8bb2d5a9b647448129de6e85d52bce"}, - {file = "grpcio-1.63.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cacdef0348a08e475a721967f48206a2254a1b26ee7637638d9e081761a5ba86"}, - {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:0697563d1d84d6985e40ec5ec596ff41b52abb3fd91ec240e8cb44a63b895094"}, - {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6426e1fb92d006e47476d42b8f240c1d916a6d4423c5258ccc5b105e43438f61"}, - {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e48cee31bc5f5a31fb2f3b573764bd563aaa5472342860edcc7039525b53e46a"}, - {file = "grpcio-1.63.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:50344663068041b34a992c19c600236e7abb42d6ec32567916b87b4c8b8833b3"}, - {file = "grpcio-1.63.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:259e11932230d70ef24a21b9fb5bb947eb4703f57865a404054400ee92f42f5d"}, - {file = "grpcio-1.63.0-cp39-cp39-win32.whl", hash = "sha256:a44624aad77bf8ca198c55af811fd28f2b3eaf0a50ec5b57b06c034416ef2d0a"}, - {file = "grpcio-1.63.0-cp39-cp39-win_amd64.whl", hash = "sha256:166e5c460e5d7d4656ff9e63b13e1f6029b122104c1633d5f37eaea348d7356d"}, - {file = "grpcio-1.63.0.tar.gz", hash = "sha256:f3023e14805c61bc439fb40ca545ac3d5740ce66120a678a3c6c2c55b70343d1"}, + {file = "grpcio-1.68.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:d35740e3f45f60f3c37b1e6f2f4702c23867b9ce21c6410254c9c682237da68d"}, + {file = "grpcio-1.68.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:d99abcd61760ebb34bdff37e5a3ba333c5cc09feda8c1ad42547bea0416ada78"}, + {file = "grpcio-1.68.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:f8261fa2a5f679abeb2a0a93ad056d765cdca1c47745eda3f2d87f874ff4b8c9"}, + {file = "grpcio-1.68.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0feb02205a27caca128627bd1df4ee7212db051019a9afa76f4bb6a1a80ca95e"}, + {file = "grpcio-1.68.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:919d7f18f63bcad3a0f81146188e90274fde800a94e35d42ffe9eadf6a9a6330"}, + {file = "grpcio-1.68.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:963cc8d7d79b12c56008aabd8b457f400952dbea8997dd185f155e2f228db079"}, + {file = "grpcio-1.68.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ccf2ebd2de2d6661e2520dae293298a3803a98ebfc099275f113ce1f6c2a80f1"}, + {file = "grpcio-1.68.1-cp310-cp310-win32.whl", hash = "sha256:2cc1fd04af8399971bcd4f43bd98c22d01029ea2e56e69c34daf2bf8470e47f5"}, + {file = "grpcio-1.68.1-cp310-cp310-win_amd64.whl", hash = "sha256:ee2e743e51cb964b4975de572aa8fb95b633f496f9fcb5e257893df3be854746"}, + {file = "grpcio-1.68.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:55857c71641064f01ff0541a1776bfe04a59db5558e82897d35a7793e525774c"}, + {file = "grpcio-1.68.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4b177f5547f1b995826ef529d2eef89cca2f830dd8b2c99ffd5fde4da734ba73"}, + {file = "grpcio-1.68.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:3522c77d7e6606d6665ec8d50e867f13f946a4e00c7df46768f1c85089eae515"}, + {file = "grpcio-1.68.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d1fae6bbf0816415b81db1e82fb3bf56f7857273c84dcbe68cbe046e58e1ccd"}, + {file = "grpcio-1.68.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:298ee7f80e26f9483f0b6f94cc0a046caf54400a11b644713bb5b3d8eb387600"}, + {file = "grpcio-1.68.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cbb5780e2e740b6b4f2d208e90453591036ff80c02cc605fea1af8e6fc6b1bbe"}, + {file = "grpcio-1.68.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ddda1aa22495d8acd9dfbafff2866438d12faec4d024ebc2e656784d96328ad0"}, + {file = "grpcio-1.68.1-cp311-cp311-win32.whl", hash = "sha256:b33bd114fa5a83f03ec6b7b262ef9f5cac549d4126f1dc702078767b10c46ed9"}, + {file = "grpcio-1.68.1-cp311-cp311-win_amd64.whl", hash = "sha256:7f20ebec257af55694d8f993e162ddf0d36bd82d4e57f74b31c67b3c6d63d8b2"}, + {file = "grpcio-1.68.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:8829924fffb25386995a31998ccbbeaa7367223e647e0122043dfc485a87c666"}, + {file = "grpcio-1.68.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:3aed6544e4d523cd6b3119b0916cef3d15ef2da51e088211e4d1eb91a6c7f4f1"}, + {file = "grpcio-1.68.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:4efac5481c696d5cb124ff1c119a78bddbfdd13fc499e3bc0ca81e95fc573684"}, + {file = "grpcio-1.68.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ab2d912ca39c51f46baf2a0d92aa265aa96b2443266fc50d234fa88bf877d8e"}, + {file = "grpcio-1.68.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c87ce2a97434dffe7327a4071839ab8e8bffd0054cc74cbe971fba98aedd60"}, + {file = "grpcio-1.68.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e4842e4872ae4ae0f5497bf60a0498fa778c192cc7a9e87877abd2814aca9475"}, + {file = "grpcio-1.68.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:255b1635b0ed81e9f91da4fcc8d43b7ea5520090b9a9ad9340d147066d1d3613"}, + {file = "grpcio-1.68.1-cp312-cp312-win32.whl", hash = "sha256:7dfc914cc31c906297b30463dde0b9be48e36939575eaf2a0a22a8096e69afe5"}, + {file = "grpcio-1.68.1-cp312-cp312-win_amd64.whl", hash = "sha256:a0c8ddabef9c8f41617f213e527254c41e8b96ea9d387c632af878d05db9229c"}, + {file = "grpcio-1.68.1-cp313-cp313-linux_armv7l.whl", hash = "sha256:a47faedc9ea2e7a3b6569795c040aae5895a19dde0c728a48d3c5d7995fda385"}, + {file = "grpcio-1.68.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:390eee4225a661c5cd133c09f5da1ee3c84498dc265fd292a6912b65c421c78c"}, + {file = "grpcio-1.68.1-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:66a24f3d45c33550703f0abb8b656515b0ab777970fa275693a2f6dc8e35f1c1"}, + {file = "grpcio-1.68.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c08079b4934b0bf0a8847f42c197b1d12cba6495a3d43febd7e99ecd1cdc8d54"}, + {file = "grpcio-1.68.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8720c25cd9ac25dd04ee02b69256d0ce35bf8a0f29e20577427355272230965a"}, + {file = "grpcio-1.68.1-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:04cfd68bf4f38f5bb959ee2361a7546916bd9a50f78617a346b3aeb2b42e2161"}, + {file = "grpcio-1.68.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c28848761a6520c5c6071d2904a18d339a796ebe6b800adc8b3f474c5ce3c3ad"}, + {file = "grpcio-1.68.1-cp313-cp313-win32.whl", hash = "sha256:77d65165fc35cff6e954e7fd4229e05ec76102d4406d4576528d3a3635fc6172"}, + {file = "grpcio-1.68.1-cp313-cp313-win_amd64.whl", hash = "sha256:a8040f85dcb9830d8bbb033ae66d272614cec6faceee88d37a88a9bd1a7a704e"}, + {file = "grpcio-1.68.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:eeb38ff04ab6e5756a2aef6ad8d94e89bb4a51ef96e20f45c44ba190fa0bcaad"}, + {file = "grpcio-1.68.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8a3869a6661ec8f81d93f4597da50336718bde9eb13267a699ac7e0a1d6d0bea"}, + {file = "grpcio-1.68.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:2c4cec6177bf325eb6faa6bd834d2ff6aa8bb3b29012cceb4937b86f8b74323c"}, + {file = "grpcio-1.68.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12941d533f3cd45d46f202e3667be8ebf6bcb3573629c7ec12c3e211d99cfccf"}, + {file = "grpcio-1.68.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80af6f1e69c5e68a2be529990684abdd31ed6622e988bf18850075c81bb1ad6e"}, + {file = "grpcio-1.68.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e8dbe3e00771bfe3d04feed8210fc6617006d06d9a2679b74605b9fed3e8362c"}, + {file = "grpcio-1.68.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:83bbf5807dc3ee94ce1de2dfe8a356e1d74101e4b9d7aa8c720cc4818a34aded"}, + {file = "grpcio-1.68.1-cp38-cp38-win32.whl", hash = "sha256:8cb620037a2fd9eeee97b4531880e439ebfcd6d7d78f2e7dcc3726428ab5ef63"}, + {file = "grpcio-1.68.1-cp38-cp38-win_amd64.whl", hash = "sha256:52fbf85aa71263380d330f4fce9f013c0798242e31ede05fcee7fbe40ccfc20d"}, + {file = "grpcio-1.68.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:cb400138e73969eb5e0535d1d06cae6a6f7a15f2cc74add320e2130b8179211a"}, + {file = "grpcio-1.68.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a1b988b40f2fd9de5c820f3a701a43339d8dcf2cb2f1ca137e2c02671cc83ac1"}, + {file = "grpcio-1.68.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:96f473cdacfdd506008a5d7579c9f6a7ff245a9ade92c3c0265eb76cc591914f"}, + {file = "grpcio-1.68.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:37ea3be171f3cf3e7b7e412a98b77685eba9d4fd67421f4a34686a63a65d99f9"}, + {file = "grpcio-1.68.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ceb56c4285754e33bb3c2fa777d055e96e6932351a3082ce3559be47f8024f0"}, + {file = "grpcio-1.68.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:dffd29a2961f3263a16d73945b57cd44a8fd0b235740cb14056f0612329b345e"}, + {file = "grpcio-1.68.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:025f790c056815b3bf53da850dd70ebb849fd755a4b1ac822cb65cd631e37d43"}, + {file = "grpcio-1.68.1-cp39-cp39-win32.whl", hash = "sha256:1098f03dedc3b9810810568060dea4ac0822b4062f537b0f53aa015269be0a76"}, + {file = "grpcio-1.68.1-cp39-cp39-win_amd64.whl", hash = "sha256:334ab917792904245a028f10e803fcd5b6f36a7b2173a820c0b5b076555825e1"}, + {file = "grpcio-1.68.1.tar.gz", hash = "sha256:44a8502dd5de653ae6a73e2de50a401d84184f0331d0ac3daeb044e66d5c5054"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.63.0)"] +protobuf = ["grpcio-tools (>=1.68.1)"] [[package]] name = "grpcio-tools" -version = "1.62.3" +version = "1.68.1" description = "Protobuf code generator for gRPC" -optional = true -python-versions = ">=3.7" +optional = false +python-versions = ">=3.8" files = [ - {file = "grpcio-tools-1.62.3.tar.gz", hash = "sha256:7c7136015c3d62c3eef493efabaf9e3380e3e66d24ee8e94c01cb71377f57833"}, - {file = "grpcio_tools-1.62.3-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:2f968b049c2849540751ec2100ab05e8086c24bead769ca734fdab58698408c1"}, - {file = "grpcio_tools-1.62.3-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:0a8c0c4724ae9c2181b7dbc9b186df46e4f62cb18dc184e46d06c0ebeccf569e"}, - {file = "grpcio_tools-1.62.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5782883a27d3fae8c425b29a9d3dcf5f47d992848a1b76970da3b5a28d424b26"}, - {file = "grpcio_tools-1.62.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3d812daffd0c2d2794756bd45a353f89e55dc8f91eb2fc840c51b9f6be62667"}, - {file = "grpcio_tools-1.62.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b47d0dda1bdb0a0ba7a9a6de88e5a1ed61f07fad613964879954961e36d49193"}, - {file = "grpcio_tools-1.62.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ca246dffeca0498be9b4e1ee169b62e64694b0f92e6d0be2573e65522f39eea9"}, - {file = "grpcio_tools-1.62.3-cp310-cp310-win32.whl", hash = "sha256:6a56d344b0bab30bf342a67e33d386b0b3c4e65868ffe93c341c51e1a8853ca5"}, - {file = "grpcio_tools-1.62.3-cp310-cp310-win_amd64.whl", hash = "sha256:710fecf6a171dcbfa263a0a3e7070e0df65ba73158d4c539cec50978f11dad5d"}, - {file = "grpcio_tools-1.62.3-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:703f46e0012af83a36082b5f30341113474ed0d91e36640da713355cd0ea5d23"}, - {file = "grpcio_tools-1.62.3-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:7cc83023acd8bc72cf74c2edbe85b52098501d5b74d8377bfa06f3e929803492"}, - {file = "grpcio_tools-1.62.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ff7d58a45b75df67d25f8f144936a3e44aabd91afec833ee06826bd02b7fbe7"}, - {file = "grpcio_tools-1.62.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f2483ea232bd72d98a6dc6d7aefd97e5bc80b15cd909b9e356d6f3e326b6e43"}, - {file = "grpcio_tools-1.62.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:962c84b4da0f3b14b3cdb10bc3837ebc5f136b67d919aea8d7bb3fd3df39528a"}, - {file = "grpcio_tools-1.62.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8ad0473af5544f89fc5a1ece8676dd03bdf160fb3230f967e05d0f4bf89620e3"}, - {file = "grpcio_tools-1.62.3-cp311-cp311-win32.whl", hash = "sha256:db3bc9fa39afc5e4e2767da4459df82b095ef0cab2f257707be06c44a1c2c3e5"}, - {file = "grpcio_tools-1.62.3-cp311-cp311-win_amd64.whl", hash = "sha256:e0898d412a434e768a0c7e365acabe13ff1558b767e400936e26b5b6ed1ee51f"}, - {file = "grpcio_tools-1.62.3-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:d102b9b21c4e1e40af9a2ab3c6d41afba6bd29c0aa50ca013bf85c99cdc44ac5"}, - {file = "grpcio_tools-1.62.3-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:0a52cc9444df978438b8d2332c0ca99000521895229934a59f94f37ed896b133"}, - {file = "grpcio_tools-1.62.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141d028bf5762d4a97f981c501da873589df3f7e02f4c1260e1921e565b376fa"}, - {file = "grpcio_tools-1.62.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47a5c093ab256dec5714a7a345f8cc89315cb57c298b276fa244f37a0ba507f0"}, - {file = "grpcio_tools-1.62.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f6831fdec2b853c9daa3358535c55eed3694325889aa714070528cf8f92d7d6d"}, - {file = "grpcio_tools-1.62.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e02d7c1a02e3814c94ba0cfe43d93e872c758bd8fd5c2797f894d0c49b4a1dfc"}, - {file = "grpcio_tools-1.62.3-cp312-cp312-win32.whl", hash = "sha256:b881fd9505a84457e9f7e99362eeedd86497b659030cf57c6f0070df6d9c2b9b"}, - {file = "grpcio_tools-1.62.3-cp312-cp312-win_amd64.whl", hash = "sha256:11c625eebefd1fd40a228fc8bae385e448c7e32a6ae134e43cf13bbc23f902b7"}, - {file = "grpcio_tools-1.62.3-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:ec6fbded0c61afe6f84e3c2a43e6d656791d95747d6d28b73eff1af64108c434"}, - {file = "grpcio_tools-1.62.3-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:bfda6ee8990997a9df95c5606f3096dae65f09af7ca03a1e9ca28f088caca5cf"}, - {file = "grpcio_tools-1.62.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b77f9f9cee87cd798f0fe26b7024344d1b03a7cd2d2cba7035f8433b13986325"}, - {file = "grpcio_tools-1.62.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e02d3b96f2d0e4bab9ceaa30f37d4f75571e40c6272e95364bff3125a64d184"}, - {file = "grpcio_tools-1.62.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1da38070738da53556a4b35ab67c1b9884a5dd48fa2f243db35dc14079ea3d0c"}, - {file = "grpcio_tools-1.62.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ace43b26d88a58dcff16c20d23ff72b04d0a415f64d2820f4ff06b1166f50557"}, - {file = "grpcio_tools-1.62.3-cp37-cp37m-win_amd64.whl", hash = "sha256:350a80485e302daaa95d335a931f97b693e170e02d43767ab06552c708808950"}, - {file = "grpcio_tools-1.62.3-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:c3a1ac9d394f8e229eb28eec2e04b9a6f5433fa19c9d32f1cb6066e3c5114a1d"}, - {file = "grpcio_tools-1.62.3-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:11f363570dea661dde99e04a51bd108a5807b5df32a6f8bdf4860e34e94a4dbf"}, - {file = "grpcio_tools-1.62.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9ad9950119d8ae27634e68b7663cc8d340ae535a0f80d85a55e56a6973ab1f"}, - {file = "grpcio_tools-1.62.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c5d22b252dcef11dd1e0fbbe5bbfb9b4ae048e8880d33338215e8ccbdb03edc"}, - {file = "grpcio_tools-1.62.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:27cd9ef5c5d68d5ed104b6dcb96fe9c66b82050e546c9e255716903c3d8f0373"}, - {file = "grpcio_tools-1.62.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f4b1615adf67bd8bb71f3464146a6f9949972d06d21a4f5e87e73f6464d97f57"}, - {file = "grpcio_tools-1.62.3-cp38-cp38-win32.whl", hash = "sha256:e18e15287c31baf574fcdf8251fb7f997d64e96c6ecf467906e576da0a079af6"}, - {file = "grpcio_tools-1.62.3-cp38-cp38-win_amd64.whl", hash = "sha256:6c3064610826f50bd69410c63101954676edc703e03f9e8f978a135f1aaf97c1"}, - {file = "grpcio_tools-1.62.3-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:8e62cc7164b0b7c5128e637e394eb2ef3db0e61fc798e80c301de3b2379203ed"}, - {file = "grpcio_tools-1.62.3-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:c8ad5cce554e2fcaf8842dee5d9462583b601a3a78f8b76a153c38c963f58c10"}, - {file = "grpcio_tools-1.62.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec279dcf3518201fc592c65002754f58a6b542798cd7f3ecd4af086422f33f29"}, - {file = "grpcio_tools-1.62.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c989246c2aebc13253f08be32538a4039a64e12d9c18f6d662d7aee641dc8b5"}, - {file = "grpcio_tools-1.62.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ca4f5eeadbb57cf03317d6a2857823239a63a59cc935f5bd6cf6e8b7af7a7ecc"}, - {file = "grpcio_tools-1.62.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0cb3a3436ac119cbd37a7d3331d9bdf85dad21a6ac233a3411dff716dcbf401e"}, - {file = "grpcio_tools-1.62.3-cp39-cp39-win32.whl", hash = "sha256:3eae6ea76d62fcac091e1f15c2dcedf1dc3f114f8df1a972a8a0745e89f4cf61"}, - {file = "grpcio_tools-1.62.3-cp39-cp39-win_amd64.whl", hash = "sha256:eec73a005443061f4759b71a056f745e3b000dc0dc125c9f20560232dfbcbd14"}, + {file = "grpcio_tools-1.68.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:3a93ea324c5cbccdff55110777410d026dc1e69c3d47684ac97f57f7a77b9c70"}, + {file = "grpcio_tools-1.68.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:94cbfb9482cfd7bdb5f081b94fa137a16e4fe031daa57a2cd85d8cb4e18dce25"}, + {file = "grpcio_tools-1.68.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:bbe7e1641859c858d0f4631f7f7c09e7302433f1aa037028d2419c1410945fac"}, + {file = "grpcio_tools-1.68.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:55c0f91c4294c5807796ed26af42509f3d68497942a92d9ee9f43b08768d6c3c"}, + {file = "grpcio_tools-1.68.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85adc798fd3b57ab3e998b5897c5daab6840211ac16cdf3ba99901cb9b90094a"}, + {file = "grpcio_tools-1.68.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f0bdccb00709bf6180a80a353a99fa844cc0bb2d450cdf7fc6ab22c988bb6b4c"}, + {file = "grpcio_tools-1.68.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2465e4d347b35dc0c007e074c79d5ded0a89c3aa26651e690f83593e0cc28af8"}, + {file = "grpcio_tools-1.68.1-cp310-cp310-win32.whl", hash = "sha256:83c124a1776c1027da7d36584c8044cfed7a9f10e90f08dafde8d2a4cb822319"}, + {file = "grpcio_tools-1.68.1-cp310-cp310-win_amd64.whl", hash = "sha256:283fd1359d619d42c3346f1d8f0a70636a036a421178803a1ab8083fa4228a38"}, + {file = "grpcio_tools-1.68.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:02f04de42834129eb54bb12469160ab631a0395d6a2b77975381c02b994086c3"}, + {file = "grpcio_tools-1.68.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:92b6aab37095879ef9ee428dd171740ff794f4c7a66bc1cc7280cd0051f8cd96"}, + {file = "grpcio_tools-1.68.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:1f0ac6ac5e1e33b998511981b3ef36489501833413354f3597b97a3452d7d7ba"}, + {file = "grpcio_tools-1.68.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28e0bca3a262af86557f30e30ddf2fadc2324ee05cd7352716924cc7f83541f1"}, + {file = "grpcio_tools-1.68.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12239cf5ca6b7b4937103953cf35c49683d935e32e98596fe52dd35168aa86e6"}, + {file = "grpcio_tools-1.68.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8e48d8884fcf6b182c73d0560a183404458e30a0f479918b88ca8fbd48b8b05f"}, + {file = "grpcio_tools-1.68.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e4e8059469847441855322da16fa2c0f9787b996c237a98778210e31188a8652"}, + {file = "grpcio_tools-1.68.1-cp311-cp311-win32.whl", hash = "sha256:21815d54a83effbd2600d16382a7897298cfeffe578557fc9a47b642cc8ddafe"}, + {file = "grpcio_tools-1.68.1-cp311-cp311-win_amd64.whl", hash = "sha256:2114528723d9f12d3e24af3d433ec6f140deea1dd64d3bb1b4ebced217f1867c"}, + {file = "grpcio_tools-1.68.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:d67a9d1ad22ff0d22715dba1d5f8f23ebd47cea84ccd20c90bf4690d988adc5b"}, + {file = "grpcio_tools-1.68.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7f1e704ff73eb01afac51b63b74868a35aaa5d6f791fc63bd41af44a51aa232"}, + {file = "grpcio_tools-1.68.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:e9f69988bd77db014795511c498e89a0db24bd47877e65921364114f88de3bee"}, + {file = "grpcio_tools-1.68.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8585ec7d11fcc2bb635b39605a4466ca9fa28dbae0c184fe58f456da72cb9031"}, + {file = "grpcio_tools-1.68.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c81d0be6c46fcbcd2cd126804060a95531cdf6d779436b2fbc68c8b4a7db2dc1"}, + {file = "grpcio_tools-1.68.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6efdb02e75baf289935b5dad665f0e0f7c3311d86aae0cd2c709e2a8a34bb620"}, + {file = "grpcio_tools-1.68.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8ea367639e771e5a05f7320eb4ae2b27e09d2ec3baeae9819d1c590cc7eaaa08"}, + {file = "grpcio_tools-1.68.1-cp312-cp312-win32.whl", hash = "sha256:a5b1021c9942bba7eca1555061e2d308f506198088a3a539fcb3633499c6635f"}, + {file = "grpcio_tools-1.68.1-cp312-cp312-win_amd64.whl", hash = "sha256:315ad9c28940c95e85e57aeca309d298113175c2d5e8221501a05a51072f5477"}, + {file = "grpcio_tools-1.68.1-cp313-cp313-linux_armv7l.whl", hash = "sha256:67e49b5ede0cc8a0f988f41f7b72f6bc03180aecdb5213bd985bc1bbfd9ffdac"}, + {file = "grpcio_tools-1.68.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b78e38f953062d45ff92ec940da292dc9bfbf26de492c8dc44e12b13493a8e80"}, + {file = "grpcio_tools-1.68.1-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:8ebe9df5bab4121e8f51e013a379be2027179a0c8013e89d686a1e5800e9c205"}, + {file = "grpcio_tools-1.68.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be553e3ea7447ed9e2e2d089f3b0a77000e86d2681b3c77498c98dddffc62d22"}, + {file = "grpcio_tools-1.68.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4877f3eabb6185b5691f5218fedc86a84a833734847a294048862ec910a2854"}, + {file = "grpcio_tools-1.68.1-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:b98173e536e8f2779eff84a03409cca6497dc1fad3d10a47c8d881b2cb36259b"}, + {file = "grpcio_tools-1.68.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:5b64035dcd0df70acf3af972c3f103b0ce141d29732fd94eaa8b38cf7c8e62fe"}, + {file = "grpcio_tools-1.68.1-cp313-cp313-win32.whl", hash = "sha256:573f3ed3276df20c308797ae834ac6c5595b1dd2953b243eedadbcd986a287d7"}, + {file = "grpcio_tools-1.68.1-cp313-cp313-win_amd64.whl", hash = "sha256:c4539c6231015c40db879fbc0feaaf03adb4275c1bd2b4dd26e2323f2a13655a"}, + {file = "grpcio_tools-1.68.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:3e0fc6dbc64efc7bb0fe23ce46587e0cbeb512142d543834c2bc9100c8f255ff"}, + {file = "grpcio_tools-1.68.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:79337ac1b19610b99f93aa52ae05e5fbf96adbe60d54ecf192af44cc69118d19"}, + {file = "grpcio_tools-1.68.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:eb7cae5f0232aba9057f26a45ef6b0a5633d36627fe49442c0985b6f44b67822"}, + {file = "grpcio_tools-1.68.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25fe1bcbb558a477c525bec9d67e1469d47dddc9430e6e5c0d11f67f08cfc810"}, + {file = "grpcio_tools-1.68.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ce901f42037d1ebc7724e721180d03e33163d5acf0a62c52728e6c36117c5e9"}, + {file = "grpcio_tools-1.68.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3c213c2208c42dce2a5fc7cfb2b952a3c22ef019812f9f27bd54c6e00ee0720e"}, + {file = "grpcio_tools-1.68.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ff6ae5031a03ab90e9c508d12914438b73efd44b5eed9946bf8974c453d0ed57"}, + {file = "grpcio_tools-1.68.1-cp38-cp38-win32.whl", hash = "sha256:41e631e72b6b94eb6f3d9cd533c682249f82fc58007c7561f6e521b884a6347e"}, + {file = "grpcio_tools-1.68.1-cp38-cp38-win_amd64.whl", hash = "sha256:69fb93761f116a5b063fb4f6150023c4d785304b37adcebf561b95018f9b40ae"}, + {file = "grpcio_tools-1.68.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:31c703dba465956acb83adc105d61297459d0d14b512441d827f6c040cbffe2b"}, + {file = "grpcio_tools-1.68.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1093f441751689d225916e3fe02daf98d2becab688b9e167bd2c38454ec50906"}, + {file = "grpcio_tools-1.68.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:3543b9205e5b88d2280493aa9b55d35ce9cc45b7a0891c9d84c200652802e22a"}, + {file = "grpcio_tools-1.68.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79d575cc5a522b9920d9a07387976fc02d162bdf97ba51cf91fabdca8dfdb491"}, + {file = "grpcio_tools-1.68.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d546e4a506288d6227acc0eb625039c5e1ad96218c8cfe9ecf661a41e15e442e"}, + {file = "grpcio_tools-1.68.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:aced9c7a4edbf6eff73720bfa6fefd9053ae294535a488dfb92a372913eda10d"}, + {file = "grpcio_tools-1.68.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3c08d1a244b5025ba3f8ef81d0885b431b93cc20bc4560add4cdfcf38c1bfad"}, + {file = "grpcio_tools-1.68.1-cp39-cp39-win32.whl", hash = "sha256:049f05a3f227e9f696059a20b2858e6d7c1cd6037d8471306d7ab7627b1a4ce4"}, + {file = "grpcio_tools-1.68.1-cp39-cp39-win_amd64.whl", hash = "sha256:4c3599c75b1157e6bda24cdbdadb023bf0fe1085aa1e0047a1f35a8778f9b56e"}, + {file = "grpcio_tools-1.68.1.tar.gz", hash = "sha256:2413a17ad16c9c821b36e4a67fc64c37b9e4636ab1c3a07778018801378739ba"}, ] [package.dependencies] -grpcio = ">=1.62.3" -protobuf = ">=4.21.6,<5.0dev" +grpcio = ">=1.68.1" +protobuf = ">=5.26.1,<6.0dev" setuptools = "*" [[package]] @@ -1875,13 +1799,13 @@ trio = ["trio (>=0.22.0,<1.0)"] [[package]] name = "httpx" -version = "0.27.2" +version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, - {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, + {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, + {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, ] [package.dependencies] @@ -1890,7 +1814,6 @@ certifi = "*" h2 = {version = ">=3,<5", optional = true, markers = "extra == \"http2\""} httpcore = "==1.*" idna = "*" -sniffio = "*" [package.extras] brotli = ["brotli", "brotlicffi"] @@ -2385,21 +2308,21 @@ test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout" [[package]] name = "langchain" -version = "0.3.10" +version = "0.3.11" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langchain-0.3.10-py3-none-any.whl", hash = "sha256:4ae38d4c9f9ec5cd1a16a505b451a57c0aab2807d6c9f8cb5b346d06301b2232"}, - {file = "langchain-0.3.10.tar.gz", hash = "sha256:aef0f9bdaf4a4d3d50aec348438135987bda1d83070b49f77032f561d3a761d8"}, + {file = "langchain-0.3.11-py3-none-any.whl", hash = "sha256:6655feded1f7569e5a4bd11e38de0a26c7c86646c0dea49afccceba42df60ad7"}, + {file = "langchain-0.3.11.tar.gz", hash = "sha256:17868ea3f0cf5a46b4b88bf1961c4a12d32ea0778930e7d2eb5103e0287ff478"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} -langchain-core = ">=0.3.22,<0.4.0" +langchain-core = ">=0.3.24,<0.4.0" langchain-text-splitters = ">=0.3.0,<0.4.0" -langsmith = ">=0.1.17,<0.2.0" +langsmith = ">=0.1.17,<0.3" numpy = [ {version = ">=1.22.4,<2", markers = "python_version < \"3.12\""}, {version = ">=1.26.2,<3", markers = "python_version >= \"3.12\""}, @@ -2412,22 +2335,22 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10" [[package]] name = "langchain-community" -version = "0.3.10" +version = "0.3.11" description = "Community contributed LangChain integrations." optional = true python-versions = "<4.0,>=3.9" files = [ - {file = "langchain_community-0.3.10-py3-none-any.whl", hash = "sha256:f718de973f60c6d0f10c71321e461cf41251cc74543f064b7b2ee7ae06b9a43f"}, - {file = "langchain_community-0.3.10.tar.gz", hash = "sha256:f503e90cbb44ddb14afb141552a93fd9fbd0b216407315a6608f901861a938f9"}, + {file = "langchain_community-0.3.11-py3-none-any.whl", hash = "sha256:c67091dc7652f44161bbea915c03a296f3c1ef2a8dfbcb475cdf23a1deb9790e"}, + {file = "langchain_community-0.3.11.tar.gz", hash = "sha256:31a96de1578f6037cd49acf287227d54e88e81f82e3e49cb4d90bfe05b1cdc32"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" dataclasses-json = ">=0.5.7,<0.7" httpx-sse = ">=0.4.0,<0.5.0" -langchain = ">=0.3.10,<0.4.0" -langchain-core = ">=0.3.22,<0.4.0" -langsmith = ">=0.1.125,<0.2.0" +langchain = ">=0.3.11,<0.4.0" +langchain-core = ">=0.3.24,<0.4.0" +langsmith = ">=0.1.125,<0.3" numpy = [ {version = ">=1.22.4,<2", markers = "python_version < \"3.12\""}, {version = ">=1.26.2,<3", markers = "python_version >= \"3.12\""}, @@ -2440,18 +2363,18 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10" [[package]] name = "langchain-core" -version = "0.3.22" +version = "0.3.24" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langchain_core-0.3.22-py3-none-any.whl", hash = "sha256:b40b036b3bd4abc1dfc820e149f5a3c4abef2fee83eb807c4310a41a064580e0"}, - {file = "langchain_core-0.3.22.tar.gz", hash = "sha256:c61c6d62f137dff2a1ec785473a3225e4fa237e53eac88f5359fda664dc5d91c"}, + {file = "langchain_core-0.3.24-py3-none-any.whl", hash = "sha256:97192552ef882a3dd6ae3b870a180a743801d0137a1159173f51ac555eeb7eec"}, + {file = "langchain_core-0.3.24.tar.gz", hash = "sha256:460851e8145327f70b70aad7dce2cdbd285e144d14af82b677256b941fc99656"}, ] [package.dependencies] jsonpatch = ">=1.33,<2.0" -langsmith = ">=0.1.125,<0.2.0" +langsmith = ">=0.1.125,<0.3" packaging = ">=23.2,<25" pydantic = [ {version = ">=2.5.2,<3.0.0", markers = "python_full_version < \"3.12.4\""}, @@ -2509,13 +2432,13 @@ types-requests = ">=2.31.0.2,<3.0.0.0" [[package]] name = "langsmith" -version = "0.1.147" +version = "0.2.2" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false -python-versions = "<4.0,>=3.8.1" +python-versions = "<4.0,>=3.9" files = [ - {file = "langsmith-0.1.147-py3-none-any.whl", hash = "sha256:7166fc23b965ccf839d64945a78e9f1157757add228b086141eb03a60d699a15"}, - {file = "langsmith-0.1.147.tar.gz", hash = "sha256:2e933220318a4e73034657103b3b1a3a6109cc5db3566a7e8e03be8d6d7def7a"}, + {file = "langsmith-0.2.2-py3-none-any.whl", hash = "sha256:4786d7dcdbc25e43d4a1bf70bbe12938a9eb2364feec8f6fc4d967162519b367"}, + {file = "langsmith-0.2.2.tar.gz", hash = "sha256:6f515ee41ae80968a7d552be1154414ccde57a0a534c960c8c3cd1835734095f"}, ] [package.dependencies] @@ -2548,71 +2471,71 @@ pydantic = ">=1.10" [[package]] name = "llama-index" -version = "0.11.23" +version = "0.12.5" description = "Interface between LLMs and your data" optional = false -python-versions = "<4.0,>=3.8.1" +python-versions = "<4.0,>=3.9" files = [ - {file = "llama_index-0.11.23-py3-none-any.whl", hash = "sha256:08513b86fed8e4295b52dc204c193e7186a2e65fc09d581deeb6a74afaaf74fe"}, - {file = "llama_index-0.11.23.tar.gz", hash = "sha256:e02118dfe060568cf40c9ed109c16d559911b2e19eac5e6babc04ed6b57ede02"}, + {file = "llama_index-0.12.5-py3-none-any.whl", hash = "sha256:2bb6d234cf6d7fdb6a308e9aff1a607e83a24210cc7325be62c65bc43493680f"}, + {file = "llama_index-0.12.5.tar.gz", hash = "sha256:a816f18079c88e17b53fab6efc27f7c3dfb0a7af559afaaeaeef0577654235a4"}, ] [package.dependencies] -llama-index-agent-openai = ">=0.3.4,<0.4.0" -llama-index-cli = ">=0.3.1,<0.4.0" -llama-index-core = ">=0.11.23,<0.12.0" -llama-index-embeddings-openai = ">=0.2.4,<0.3.0" -llama-index-indices-managed-llama-cloud = ">=0.3.0" +llama-index-agent-openai = ">=0.4.0,<0.5.0" +llama-index-cli = ">=0.4.0,<0.5.0" +llama-index-core = ">=0.12.5,<0.13.0" +llama-index-embeddings-openai = ">=0.3.0,<0.4.0" +llama-index-indices-managed-llama-cloud = ">=0.4.0" llama-index-legacy = ">=0.9.48,<0.10.0" -llama-index-llms-openai = ">=0.2.10,<0.3.0" -llama-index-multi-modal-llms-openai = ">=0.2.0,<0.3.0" -llama-index-program-openai = ">=0.2.0,<0.3.0" -llama-index-question-gen-openai = ">=0.2.0,<0.3.0" -llama-index-readers-file = ">=0.3.0,<0.4.0" -llama-index-readers-llama-parse = ">=0.3.0" +llama-index-llms-openai = ">=0.3.0,<0.4.0" +llama-index-multi-modal-llms-openai = ">=0.4.0,<0.5.0" +llama-index-program-openai = ">=0.3.0,<0.4.0" +llama-index-question-gen-openai = ">=0.3.0,<0.4.0" +llama-index-readers-file = ">=0.4.0,<0.5.0" +llama-index-readers-llama-parse = ">=0.4.0" nltk = ">3.8.1" [[package]] name = "llama-index-agent-openai" -version = "0.3.4" +version = "0.4.0" description = "llama-index agent openai integration" optional = false -python-versions = "<4.0,>=3.8.1" +python-versions = "<4.0,>=3.9" files = [ - {file = "llama_index_agent_openai-0.3.4-py3-none-any.whl", hash = "sha256:3720ce9bb12417a99a3fe84e52cce23e762b13f88a2dfc4292c76f4df9b26b4a"}, - {file = "llama_index_agent_openai-0.3.4.tar.gz", hash = "sha256:80e3408d97121bebca3fa3ffd14b51285870c1c3c73d4ee04d3d18cfe6040466"}, + {file = "llama_index_agent_openai-0.4.0-py3-none-any.whl", hash = "sha256:71b2f46bb24813129ab6bc2d5bcebb9aebf323403ebf1e6cc9840687a34a6169"}, + {file = "llama_index_agent_openai-0.4.0.tar.gz", hash = "sha256:31d2675dbd84489756dd062a7ffed330b2abdca3b7715d511674f5b5075e4dd6"}, ] [package.dependencies] -llama-index-core = ">=0.11.0,<0.12.0" -llama-index-llms-openai = ">=0.2.9,<0.3.0" +llama-index-core = ">=0.12.0,<0.13.0" +llama-index-llms-openai = ">=0.3.0,<0.4.0" openai = ">=1.14.0" [[package]] name = "llama-index-cli" -version = "0.3.1" +version = "0.4.0" description = "llama-index cli" optional = false -python-versions = "<4.0,>=3.8.1" +python-versions = "<4.0,>=3.9" files = [ - {file = "llama_index_cli-0.3.1-py3-none-any.whl", hash = "sha256:2111fbb6973f5b1eabce0d6cca3986499f0f2f625b13d7f48269a49c64c027d4"}, - {file = "llama_index_cli-0.3.1.tar.gz", hash = "sha256:1890dd687cf440f3651365a549e303363162c167b8efbd87a3aa10058d6d5c77"}, + {file = "llama_index_cli-0.4.0-py3-none-any.whl", hash = "sha256:60d12f89e6b85e80a0cc3a8b531f05a911b5eebaebc37314411476d1ba685904"}, + {file = "llama_index_cli-0.4.0.tar.gz", hash = "sha256:d6ab201359962a8a34368aeda3a49bbbe67e9e009c59bd925c4fb2be4ace3906"}, ] [package.dependencies] -llama-index-core = ">=0.11.0,<0.12.0" -llama-index-embeddings-openai = ">=0.2.0,<0.3.0" -llama-index-llms-openai = ">=0.2.0,<0.3.0" +llama-index-core = ">=0.12.0,<0.13.0" +llama-index-embeddings-openai = ">=0.3.0,<0.4.0" +llama-index-llms-openai = ">=0.3.0,<0.4.0" [[package]] name = "llama-index-core" -version = "0.11.23" +version = "0.12.5" description = "Interface between LLMs and your data" optional = false -python-versions = "<4.0,>=3.8.1" +python-versions = "<4.0,>=3.9" files = [ - {file = "llama_index_core-0.11.23-py3-none-any.whl", hash = "sha256:25a0cb4a055bfb348655ca4acd1b475529bd8537a7b81874ef14ed13f56e06c1"}, - {file = "llama_index_core-0.11.23.tar.gz", hash = "sha256:e150859696a0eae169fe19323f46e9a31af2c12c3182012e4d0353ea8eb06d24"}, + {file = "llama_index_core-0.12.5-py3-none-any.whl", hash = "sha256:1fe6dd39b2dc5a945b4702d780a2f5962a553e187524a255429461dc92a664db"}, + {file = "llama_index_core-0.12.5.tar.gz", hash = "sha256:1d967323891920579fad3d6497587c137894df3f76718a3ec134f9201f2f4fc0"}, ] [package.dependencies] @@ -2626,63 +2549,48 @@ httpx = "*" nest-asyncio = ">=1.5.8,<2.0.0" networkx = ">=3.0" nltk = ">3.8.1" -numpy = "<2.0.0" +numpy = "*" pillow = ">=9.0.0" -pydantic = ">=2.7.0,<3.0.0" +pydantic = ">=2.8.0" PyYAML = ">=6.0.1" requests = ">=2.31.0" SQLAlchemy = {version = ">=1.4.49", extras = ["asyncio"]} -tenacity = ">=8.2.0,<8.4.0 || >8.4.0,<9.0.0" +tenacity = ">=8.2.0,<8.4.0 || >8.4.0,<10.0.0" tiktoken = ">=0.3.3" tqdm = ">=4.66.1,<5.0.0" typing-extensions = ">=4.5.0" typing-inspect = ">=0.8.0" wrapt = "*" -[[package]] -name = "llama-index-embeddings-ollama" -version = "0.3.1" -description = "llama-index embeddings ollama integration" -optional = false -python-versions = "<4.0,>=3.8.1" -files = [ - {file = "llama_index_embeddings_ollama-0.3.1-py3-none-any.whl", hash = "sha256:b869ce7e9f8e67aa7d81336e90d25d3ea1fca91c68dce8922b2d4b9c06c5acef"}, - {file = "llama_index_embeddings_ollama-0.3.1.tar.gz", hash = "sha256:5a3e75fa14be7e2b1a82937416c880204dc96e1b1d2626dc5bde93f021e7b540"}, -] - -[package.dependencies] -llama-index-core = ">=0.11.0,<0.12.0" -ollama = ">=0.3.1,<0.4.0" - [[package]] name = "llama-index-embeddings-openai" -version = "0.2.5" +version = "0.3.1" description = "llama-index embeddings openai integration" optional = false -python-versions = "<4.0,>=3.8.1" +python-versions = "<4.0,>=3.9" files = [ - {file = "llama_index_embeddings_openai-0.2.5-py3-none-any.whl", hash = "sha256:823c8311e556349ba19dda408a64a314fa3dafe0e5759709c54d33a0269aa6ba"}, - {file = "llama_index_embeddings_openai-0.2.5.tar.gz", hash = "sha256:0047dd71d747068645ed728c29312aa91b65bbe4c6142180034c64dfc5c6f6e8"}, + {file = "llama_index_embeddings_openai-0.3.1-py3-none-any.whl", hash = "sha256:f15a3d13da9b6b21b8bd51d337197879a453d1605e625a1c6d45e741756c0290"}, + {file = "llama_index_embeddings_openai-0.3.1.tar.gz", hash = "sha256:1368aad3ce24cbaed23d5ad251343cef1eb7b4a06d6563d6606d59cb347fef20"}, ] [package.dependencies] -llama-index-core = ">=0.11.0,<0.12.0" +llama-index-core = ">=0.12.0,<0.13.0" openai = ">=1.1.0" [[package]] name = "llama-index-indices-managed-llama-cloud" -version = "0.6.0" +version = "0.6.3" description = "llama-index indices llama-cloud integration" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "llama_index_indices_managed_llama_cloud-0.6.0-py3-none-any.whl", hash = "sha256:18a3bbb386c4fbda8883cf40339bde402637e4cd5e06bcf3870d8c174b9baa3a"}, - {file = "llama_index_indices_managed_llama_cloud-0.6.0.tar.gz", hash = "sha256:fe32aecb87ffd81eb824fc64509cc991c3cde574455e53e73a4dbe30961c4f21"}, + {file = "llama_index_indices_managed_llama_cloud-0.6.3-py3-none-any.whl", hash = "sha256:7f125602f624a2d321b6a4130cd98df35eb8c15818a159390755b2c13068f4ce"}, + {file = "llama_index_indices_managed_llama_cloud-0.6.3.tar.gz", hash = "sha256:f09e4182cbc2a2bd75ae85cebb1681075247f0d91b931b094cac4315386ce87a"}, ] [package.dependencies] llama-cloud = ">=0.1.5" -llama-index-core = ">=0.11.13.post1,<0.12.0" +llama-index-core = ">=0.12.0,<0.13.0" [[package]] name = "llama-index-legacy" @@ -2725,80 +2633,80 @@ query-tools = ["guidance (>=0.0.64,<0.0.65)", "jsonpath-ng (>=1.6.0,<2.0.0)", "l [[package]] name = "llama-index-llms-openai" -version = "0.2.16" +version = "0.3.8" description = "llama-index llms openai integration" optional = false -python-versions = "<4.0,>=3.8.1" +python-versions = "<4.0,>=3.9" files = [ - {file = "llama_index_llms_openai-0.2.16-py3-none-any.whl", hash = "sha256:413466acbb894bd81f8dab2037f595e92392d869eec6d8274a16d43123cac8b6"}, - {file = "llama_index_llms_openai-0.2.16.tar.gz", hash = "sha256:7c666dd27056c278a079ff45d53f1fbfc8ed363764aa7baeee2e03df47f9072a"}, + {file = "llama_index_llms_openai-0.3.8-py3-none-any.whl", hash = "sha256:b6d507adcb735f0fc0cd38856411112250a6625971257666a77e496b96cec3ca"}, + {file = "llama_index_llms_openai-0.3.8.tar.gz", hash = "sha256:784865a3ef121bbf1cebc30159df8de3872297a8aa48631f4a785a7d38e2bd6e"}, ] [package.dependencies] -llama-index-core = ">=0.11.7,<0.12.0" -openai = ">=1.40.0,<2.0.0" +llama-index-core = ">=0.12.4,<0.13.0" +openai = ">=1.57.1,<2.0.0" [[package]] name = "llama-index-multi-modal-llms-openai" -version = "0.2.3" +version = "0.4.0" description = "llama-index multi-modal-llms openai integration" optional = false -python-versions = "<4.0,>=3.8.1" +python-versions = "<4.0,>=3.9" files = [ - {file = "llama_index_multi_modal_llms_openai-0.2.3-py3-none-any.whl", hash = "sha256:96b36beb2c3fca4faca80c59ecf7c6c6629ecdb96c288ef89777b592ec43f872"}, - {file = "llama_index_multi_modal_llms_openai-0.2.3.tar.gz", hash = "sha256:8eb9b7f1ff3956ef0979e21bc83e6a885e40987b7199f195e46525d06e3ae402"}, + {file = "llama_index_multi_modal_llms_openai-0.4.0-py3-none-any.whl", hash = "sha256:c5bda1b3c6d14eee87a819ba72b122d82877829695dce8f90a8c600ac16ce243"}, + {file = "llama_index_multi_modal_llms_openai-0.4.0.tar.gz", hash = "sha256:11c3ac7e2d7ace9dbcdd9a662f27bca5fefce98c5682abaffb7dd01d59776658"}, ] [package.dependencies] -llama-index-core = ">=0.11.0,<0.12.0" -llama-index-llms-openai = ">=0.2.11,<0.3.0" +llama-index-core = ">=0.12.3,<0.13.0" +llama-index-llms-openai = ">=0.3.0,<0.4.0" [[package]] name = "llama-index-program-openai" -version = "0.2.0" +version = "0.3.1" description = "llama-index program openai integration" optional = false -python-versions = "<4.0,>=3.8.1" +python-versions = "<4.0,>=3.9" files = [ - {file = "llama_index_program_openai-0.2.0-py3-none-any.whl", hash = "sha256:2e10d0c8f21af2e9443eb79e81bb31e7b73835b7c7bbd7ddf20e0a9c846cd368"}, - {file = "llama_index_program_openai-0.2.0.tar.gz", hash = "sha256:4139935541c011257fbfeb9662b3bf1237b729ef4b1c8f4ddf5b6789d2374ac4"}, + {file = "llama_index_program_openai-0.3.1-py3-none-any.whl", hash = "sha256:93646937395dc5318fd095153d2f91bd632b25215d013d14a87c088887d205f9"}, + {file = "llama_index_program_openai-0.3.1.tar.gz", hash = "sha256:6039a6cdbff62c6388c07e82a157fe2edd3bbef0c5adf292ad8546bf4ec75b82"}, ] [package.dependencies] -llama-index-agent-openai = ">=0.3.0,<0.4.0" -llama-index-core = ">=0.11.0,<0.12.0" -llama-index-llms-openai = ">=0.2.0,<0.3.0" +llama-index-agent-openai = ">=0.4.0,<0.5.0" +llama-index-core = ">=0.12.0,<0.13.0" +llama-index-llms-openai = ">=0.3.0,<0.4.0" [[package]] name = "llama-index-question-gen-openai" -version = "0.2.0" +version = "0.3.0" description = "llama-index question_gen openai integration" optional = false -python-versions = "<4.0,>=3.8.1" +python-versions = "<4.0,>=3.9" files = [ - {file = "llama_index_question_gen_openai-0.2.0-py3-none-any.whl", hash = "sha256:a16e68fc5434e9a793f1dfd0cc0354ee19afd167f1d499403b0085b11c5406c0"}, - {file = "llama_index_question_gen_openai-0.2.0.tar.gz", hash = "sha256:3dde1cecbd651000639c20031d7ea23334276aabb181cac40ff424f35e10465e"}, + {file = "llama_index_question_gen_openai-0.3.0-py3-none-any.whl", hash = "sha256:9b60ec114273a63b50349948666e5744a8f58acb645824e07c979041e8fec598"}, + {file = "llama_index_question_gen_openai-0.3.0.tar.gz", hash = "sha256:efd3b468232808e9d3474670aaeab00e41b90f75f52d0c9bfbf11207e0963d62"}, ] [package.dependencies] -llama-index-core = ">=0.11.0,<0.12.0" -llama-index-llms-openai = ">=0.2.0,<0.3.0" -llama-index-program-openai = ">=0.2.0,<0.3.0" +llama-index-core = ">=0.12.0,<0.13.0" +llama-index-llms-openai = ">=0.3.0,<0.4.0" +llama-index-program-openai = ">=0.3.0,<0.4.0" [[package]] name = "llama-index-readers-file" -version = "0.3.0" +version = "0.4.1" description = "llama-index readers file integration" optional = false -python-versions = "<4.0,>=3.8.1" +python-versions = "<4.0,>=3.9" files = [ - {file = "llama_index_readers_file-0.3.0-py3-none-any.whl", hash = "sha256:259ee195ea8285f8421b381ec3a64f5fae68de69435970ae64e544f07a4403ad"}, - {file = "llama_index_readers_file-0.3.0.tar.gz", hash = "sha256:6c675fcd2f0599a131f89e1c5ed3521dde31338a9b724a7721f5dfd7243ea8d8"}, + {file = "llama_index_readers_file-0.4.1-py3-none-any.whl", hash = "sha256:51df6c4c6f6f244a704907aac4edc5c7a1c61a67672b1ca7fb182e6409226708"}, + {file = "llama_index_readers_file-0.4.1.tar.gz", hash = "sha256:1150300bcebab7cddd9e29b7271e097b278fbe3518de26e435595855b12c3b9a"}, ] [package.dependencies] beautifulsoup4 = ">=4.12.3,<5.0.0" -llama-index-core = ">=0.11.0,<0.12.0" +llama-index-core = ">=0.12.0,<0.13.0" pandas = "*" pypdf = ">=5.1.0,<6.0.0" striprtf = ">=0.0.26,<0.0.27" @@ -2808,17 +2716,17 @@ pymupdf = ["pymupdf (>=1.23.21,<2.0.0)"] [[package]] name = "llama-index-readers-llama-parse" -version = "0.3.0" +version = "0.4.0" description = "llama-index readers llama-parse integration" optional = false -python-versions = "<4.0,>=3.8.1" +python-versions = "<4.0,>=3.9" files = [ - {file = "llama_index_readers_llama_parse-0.3.0-py3-none-any.whl", hash = "sha256:1973cc710dbd5e110c7500c9983ecb45787ad1ff92e6b2113f94a57cf48f3038"}, - {file = "llama_index_readers_llama_parse-0.3.0.tar.gz", hash = "sha256:a5feada0895714dcc41d65dd512c1c38cf70d8ae19947cff82b80d58e6aa367e"}, + {file = "llama_index_readers_llama_parse-0.4.0-py3-none-any.whl", hash = "sha256:574e48386f28d2c86c3f961ca4a4906910312f3400dd0c53014465bfbc6b32bf"}, + {file = "llama_index_readers_llama_parse-0.4.0.tar.gz", hash = "sha256:e99ec56f4f8546d7fda1a7c1ae26162fb9acb7ebcac343b5abdb4234b4644e0f"}, ] [package.dependencies] -llama-index-core = ">=0.11.0,<0.12.0" +llama-index-core = ">=0.12.0,<0.13.0" llama-parse = ">=0.5.0" [[package]] @@ -2853,7 +2761,10 @@ ConfigArgParse = ">=1.5.5" flask = ">=2.0.0" Flask-Cors = ">=3.0.10" Flask-Login = ">=0.6.3" -gevent = {version = ">=22.10.2", markers = "python_full_version <= \"3.12.0\""} +gevent = [ + {version = ">=22.10.2", markers = "python_full_version <= \"3.12.0\""}, + {version = ">=24.10.1", markers = "python_full_version > \"3.13.0\""}, +] geventhttpclient = ">=2.3.1" msgpack = ">=1.0.0" psutil = ">=5.9.1" @@ -3025,22 +2936,6 @@ files = [ {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] -[[package]] -name = "milvus-lite" -version = "2.4.10" -description = "A lightweight version of Milvus wrapped with Python." -optional = true -python-versions = ">=3.7" -files = [ - {file = "milvus_lite-2.4.10-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:fc4246d3ed7d1910847afce0c9ba18212e93a6e9b8406048436940578dfad5cb"}, - {file = "milvus_lite-2.4.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:74a8e07c5e3b057df17fbb46913388e84df1dc403a200f4e423799a58184c800"}, - {file = "milvus_lite-2.4.10-py3-none-manylinux2014_aarch64.whl", hash = "sha256:240c7386b747bad696ecb5bd1f58d491e86b9d4b92dccee3315ed7256256eddc"}, - {file = "milvus_lite-2.4.10-py3-none-manylinux2014_x86_64.whl", hash = "sha256:211d2e334a043f9282bdd9755f76b9b2d93b23bffa7af240919ffce6a8dfe325"}, -] - -[package.dependencies] -tqdm = "*" - [[package]] name = "msgpack" version = "1.1.0" @@ -3364,29 +3259,15 @@ files = [ {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] -[[package]] -name = "ollama" -version = "0.3.3" -description = "The official Python client for Ollama." -optional = false -python-versions = "<4.0,>=3.8" -files = [ - {file = "ollama-0.3.3-py3-none-any.whl", hash = "sha256:ca6242ce78ab34758082b7392df3f9f6c2cb1d070a9dede1a4c545c929e16dba"}, - {file = "ollama-0.3.3.tar.gz", hash = "sha256:f90a6d61803117f40b0e8ff17465cab5e1eb24758a473cfe8101aff38bc13b51"}, -] - -[package.dependencies] -httpx = ">=0.27.0,<0.28.0" - [[package]] name = "openai" -version = "1.57.1" +version = "1.57.2" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" files = [ - {file = "openai-1.57.1-py3-none-any.whl", hash = "sha256:3865686c927e93492d1145938d4a24b634951531c4b2769d43ca5dbd4b25d8fd"}, - {file = "openai-1.57.1.tar.gz", hash = "sha256:a95f22e04ab3df26e64a15d958342265e802314131275908b3b3e36f8c5d4377"}, + {file = "openai-1.57.2-py3-none-any.whl", hash = "sha256:f7326283c156fdee875746e7e54d36959fb198eadc683952ee05e3302fbd638d"}, + {file = "openai-1.57.2.tar.gz", hash = "sha256:5f49fd0f38e9f2131cda7deb45dafdd1aee4f52a637e190ce0ecf40147ce8cee"}, ] [package.dependencies] @@ -3972,22 +3853,22 @@ files = [ [[package]] name = "protobuf" -version = "4.25.5" +version = "5.29.1" description = "" -optional = true +optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-4.25.5-cp310-abi3-win32.whl", hash = "sha256:5e61fd921603f58d2f5acb2806a929b4675f8874ff5f330b7d6f7e2e784bbcd8"}, - {file = "protobuf-4.25.5-cp310-abi3-win_amd64.whl", hash = "sha256:4be0571adcbe712b282a330c6e89eae24281344429ae95c6d85e79e84780f5ea"}, - {file = "protobuf-4.25.5-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:b2fde3d805354df675ea4c7c6338c1aecd254dfc9925e88c6d31a2bcb97eb173"}, - {file = "protobuf-4.25.5-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:919ad92d9b0310070f8356c24b855c98df2b8bd207ebc1c0c6fcc9ab1e007f3d"}, - {file = "protobuf-4.25.5-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:fe14e16c22be926d3abfcb500e60cab068baf10b542b8c858fa27e098123e331"}, - {file = "protobuf-4.25.5-cp38-cp38-win32.whl", hash = "sha256:98d8d8aa50de6a2747efd9cceba361c9034050ecce3e09136f90de37ddba66e1"}, - {file = "protobuf-4.25.5-cp38-cp38-win_amd64.whl", hash = "sha256:b0234dd5a03049e4ddd94b93400b67803c823cfc405689688f59b34e0742381a"}, - {file = "protobuf-4.25.5-cp39-cp39-win32.whl", hash = "sha256:abe32aad8561aa7cc94fc7ba4fdef646e576983edb94a73381b03c53728a626f"}, - {file = "protobuf-4.25.5-cp39-cp39-win_amd64.whl", hash = "sha256:7a183f592dc80aa7c8da7ad9e55091c4ffc9497b3054452d629bb85fa27c2a45"}, - {file = "protobuf-4.25.5-py3-none-any.whl", hash = "sha256:0aebecb809cae990f8129ada5ca273d9d670b76d9bfc9b1809f0a9c02b7dbf41"}, - {file = "protobuf-4.25.5.tar.gz", hash = "sha256:7f8249476b4a9473645db7f8ab42b02fe1488cbe5fb72fddd445e0665afd8584"}, + {file = "protobuf-5.29.1-cp310-abi3-win32.whl", hash = "sha256:22c1f539024241ee545cbcb00ee160ad1877975690b16656ff87dde107b5f110"}, + {file = "protobuf-5.29.1-cp310-abi3-win_amd64.whl", hash = "sha256:1fc55267f086dd4050d18ef839d7bd69300d0d08c2a53ca7df3920cc271a3c34"}, + {file = "protobuf-5.29.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:d473655e29c0c4bbf8b69e9a8fb54645bc289dead6d753b952e7aa660254ae18"}, + {file = "protobuf-5.29.1-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:b5ba1d0e4c8a40ae0496d0e2ecfdbb82e1776928a205106d14ad6985a09ec155"}, + {file = "protobuf-5.29.1-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:8ee1461b3af56145aca2800e6a3e2f928108c749ba8feccc6f5dd0062c410c0d"}, + {file = "protobuf-5.29.1-cp38-cp38-win32.whl", hash = "sha256:50879eb0eb1246e3a5eabbbe566b44b10348939b7cc1b267567e8c3d07213853"}, + {file = "protobuf-5.29.1-cp38-cp38-win_amd64.whl", hash = "sha256:027fbcc48cea65a6b17028510fdd054147057fa78f4772eb547b9274e5219331"}, + {file = "protobuf-5.29.1-cp39-cp39-win32.whl", hash = "sha256:5a41deccfa5e745cef5c65a560c76ec0ed8e70908a67cc8f4da5fce588b50d57"}, + {file = "protobuf-5.29.1-cp39-cp39-win_amd64.whl", hash = "sha256:012ce28d862ff417fd629285aca5d9772807f15ceb1a0dbd15b88f58c776c98c"}, + {file = "protobuf-5.29.1-py3-none-any.whl", hash = "sha256:32600ddb9c2a53dedc25b8581ea0f1fd8ea04956373c0c07577ce58d312522e0"}, + {file = "protobuf-5.29.1.tar.gz", hash = "sha256:683be02ca21a6ffe80db6dd02c0b5b2892322c59ca57fd6c872d652cb80549cb"}, ] [[package]] @@ -4193,43 +4074,6 @@ files = [ [package.extras] test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"] -[[package]] -name = "pyautogen" -version = "0.2.22" -description = "Enabling Next-Gen LLM Applications via Multi-Agent Conversation Framework" -optional = true -python-versions = "<3.13,>=3.8" -files = [ - {file = "pyautogen-0.2.22-py3-none-any.whl", hash = "sha256:022d451ea286914024c5fb0e83f5c6622df925ce02a4e10f410389e9f003cbcc"}, - {file = "pyautogen-0.2.22.tar.gz", hash = "sha256:8d25ae881779d95c13f477a42c448e91f1038c080c5bf6b905ccc1559f7ac535"}, -] - -[package.dependencies] -diskcache = "*" -docker = "*" -flaml = "*" -numpy = ">=1.17.0,<2" -openai = ">=1.3" -pydantic = ">=1.10,<2.6.0 || >2.6.0,<3" -python-dotenv = "*" -termcolor = "*" -tiktoken = "*" - -[package.extras] -autobuild = ["chromadb", "huggingface-hub", "sentence-transformers"] -blendsearch = ["flaml[blendsearch]"] -graph = ["matplotlib", "networkx"] -jupyter-executor = ["ipykernel (>=6.29.0)", "jupyter-client (>=8.6.0)", "jupyter-kernel-gateway", "requests", "websocket-client"] -lmm = ["pillow", "replicate"] -mathchat = ["pydantic (==1.10.9)", "sympy", "wolframalpha"] -redis = ["redis"] -retrievechat = ["beautifulsoup4", "chromadb", "ipython", "markdownify", "pypdf", "sentence-transformers"] -teachable = ["chromadb"] -test = ["coverage (>=5.3)", "ipykernel", "nbconvert", "nbformat", "pandas", "pre-commit", "pytest (>=6.1.1,<8)", "pytest-asyncio"] -types = ["ipykernel (>=6.29.0)", "jupyter-client (>=8.6.0)", "jupyter-kernel-gateway", "mypy (==1.9.0)", "pytest (>=6.1.1,<8)", "requests", "websocket-client"] -websockets = ["websockets (>=12.0,<13)"] -websurfer = ["beautifulsoup4", "markdownify", "pathvalidate", "pdfminer.six"] - [[package]] name = "pycparser" version = "2.22" @@ -4255,7 +4099,10 @@ files = [ [package.dependencies] annotated-types = ">=0.6.0" pydantic-core = "2.23.4" -typing-extensions = {version = ">=4.6.1", markers = "python_version < \"3.13\""} +typing-extensions = [ + {version = ">=4.6.1", markers = "python_version < \"3.13\""}, + {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, +] [package.extras] email = ["email-validator (>=2.0.0)"] @@ -4418,31 +4265,6 @@ files = [ {file = "pyhumps-3.8.0.tar.gz", hash = "sha256:498026258f7ee1a8e447c2e28526c0bea9407f9a59c03260aee4bd6c04d681a3"}, ] -[[package]] -name = "pymilvus" -version = "2.4.4" -description = "Python Sdk for Milvus" -optional = true -python-versions = ">=3.8" -files = [ - {file = "pymilvus-2.4.4-py3-none-any.whl", hash = "sha256:073b76bc36f6f4e70f0f0a0023a53324f0ba8ef9a60883f87cd30a44b6c6f2b5"}, - {file = "pymilvus-2.4.4.tar.gz", hash = "sha256:50c53eb103e034fbffe936fe942751ea3dbd2452e18cf79acc52360ed4987fb7"}, -] - -[package.dependencies] -environs = "<=9.5.0" -grpcio = ">=1.49.1,<=1.63.0" -milvus-lite = {version = ">=2.4.0,<2.5.0", markers = "sys_platform != \"win32\""} -pandas = ">=1.2.4" -protobuf = ">=3.20.0" -setuptools = ">=67" -ujson = ">=2.0.0" - -[package.extras] -bulk-writer = ["azure-storage-blob", "minio (>=7.0.0)", "pyarrow (>=12.0.0)", "requests"] -dev = ["black", "grpcio (==1.62.2)", "grpcio-testing (==1.62.2)", "grpcio-tools (==1.62.2)", "pytest (>=5.3.4)", "pytest-cov (>=2.8.1)", "pytest-timeout (>=1.3.4)", "ruff (>0.4.0)"] -model = ["milvus-model (>=0.1.0)"] - [[package]] name = "pynacl" version = "1.5.0" @@ -4591,28 +4413,28 @@ pytest = {version = ">=6.2.4", markers = "python_version >= \"3.10\""} [[package]] name = "python-box" -version = "7.2.0" +version = "7.3.0" description = "Advanced Python dictionaries with dot notation access" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "python_box-7.2.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:6bdeec791e25258351388b3029a3ec5da302bb9ed3be175493c43cdc6c47f5e3"}, - {file = "python_box-7.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c449f7b3756a71479fa9c61a86e344ac00ed782a66d7662590f0afa294249d18"}, - {file = "python_box-7.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:6b0d61f182d394106d963232854e495b51edc178faa5316a797be1178212d7e0"}, - {file = "python_box-7.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e2d752de8c1204255bf7b0c814c59ef48293c187a7e9fdcd2fefa28024b72032"}, - {file = "python_box-7.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8a6c35ea356a386077935958a5debcd5b229b9a1b3b26287a52dfe1a7e65d99"}, - {file = "python_box-7.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:32ed58ec4d9e5475efe69f9c7d773dfea90a6a01979e776da93fd2b0a5d04429"}, - {file = "python_box-7.2.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:2a2d664c6a27f7515469b6f1e461935a2038ee130b7d194b4b4db4e85d363618"}, - {file = "python_box-7.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8a5a7365db1aaf600d3e8a2747fcf6833beb5d45439a54318548f02e302e3ec"}, - {file = "python_box-7.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:739f827056ea148cbea3122d4617c994e829b420b1331183d968b175304e3a4f"}, - {file = "python_box-7.2.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:2617ef3c3d199f55f63c908f540a4dc14ced9b18533a879e6171c94a6a436f23"}, - {file = "python_box-7.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffd866bed03087b1d8340014da8c3aaae19135767580641df1b4ae6fff6ac0aa"}, - {file = "python_box-7.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:9681f059e7e92bdf20782cd9ea6e533d4711fc7b8c57a462922a025d46add4d0"}, - {file = "python_box-7.2.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:6b59b1e2741c9ceecdf5a5bd9b90502c24650e609cd824d434fed3b6f302b7bb"}, - {file = "python_box-7.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23fae825d809ae7520fdeac88bb52be55a3b63992120a00e381783669edf589"}, - {file = "python_box-7.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:573b1abdcb7bd745fa404444f060ee62fc35a74f067181e55dcb43cfe92f2827"}, - {file = "python_box-7.2.0-py3-none-any.whl", hash = "sha256:a3c90832dd772cb0197fdb5bc06123b6e1b846899a1b53d9c39450d27a584829"}, - {file = "python_box-7.2.0.tar.gz", hash = "sha256:551af20bdab3a60a2a21e3435120453c4ca32f7393787c3a5036e1d9fc6a0ede"}, + {file = "python_box-7.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a2131477ed02aa3609b348dad0697b70d84968d6440387898bb9075f461ef9bf"}, + {file = "python_box-7.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3284cf583476af63c4f24168b6e1307503322dccd9b3dc2c924f5e69f79e7ab5"}, + {file = "python_box-7.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:2718cf4c8dcc091d1c56a1a297804ab7973271391a2d2d34d37740820bbd1fda"}, + {file = "python_box-7.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e40fe08b218b3d07a50d6eb1c62edce8d0636d6bd1e563907bc86018a78e5826"}, + {file = "python_box-7.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd13e2b964ed527e03409cb1fb386d8723e0e69caf0f507af60d64102c13d363"}, + {file = "python_box-7.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:d661fb9c6ff6c730b53fe859754624baa14e37ee3d593525382b20194efad367"}, + {file = "python_box-7.3.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:6c3809f78f7c829e45626990a891d93214748938b9c0236dc6d0f2e8c400d325"}, + {file = "python_box-7.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c233b94bf3b95d7d9dc01ed1ee5636800174345810b319eb87219b760edbb54f"}, + {file = "python_box-7.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:9a22cc82e78225a419c4da02f53d6beb5c5cbd2fe5f63c13dab81e4f27b8c929"}, + {file = "python_box-7.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1f7b93c5ab4027b12ba67baffa8db903557e557250e01b91226d7a1b9688cf77"}, + {file = "python_box-7.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71ed234c1cff7f7197103bb11d98559032c0beac34db0c62dd5bd53e2b2a6963"}, + {file = "python_box-7.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:1144c9e5d40a2cbe34d1ec9a13abfc557e8e9e2fbf15f14314c87b6113de178f"}, + {file = "python_box-7.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:df77730baabf45b1682ead1c470e84a530f8ceb0295263a89f0ebc04ef7f363c"}, + {file = "python_box-7.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36bef944e61672b300c1d56d16db8a43ee4af9ab5678492a5e003368d2c64a6e"}, + {file = "python_box-7.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:b35a2262a4e1ccfba90ce8e2018aa367f8a46a519632884006fa3153b266f184"}, + {file = "python_box-7.3.0-py3-none-any.whl", hash = "sha256:b1139bffe91bd317fd686c4c29ffc84115c1967af14112c5c4a8ac51937d530c"}, + {file = "python_box-7.3.0.tar.gz", hash = "sha256:39a85ba457d07122226ca60597882d763549713ab56ac7d55da41c4ad0e89a05"}, ] [package.extras] @@ -5528,20 +5350,20 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "starlette" -version = "0.27.0" +version = "0.41.3" description = "The little ASGI library that shines." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "starlette-0.27.0-py3-none-any.whl", hash = "sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91"}, - {file = "starlette-0.27.0.tar.gz", hash = "sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75"}, + {file = "starlette-0.41.3-py3-none-any.whl", hash = "sha256:44cedb2b7c77a9de33a8b74b2b90e9f50d11fcf25d8270ea525ad71a25374ff7"}, + {file = "starlette-0.41.3.tar.gz", hash = "sha256:0e4ab3d16522a255be6b28260b938eae2482f98ce5cc934cb08dce8dc3ba5835"}, ] [package.dependencies] anyio = ">=3.4.0,<5" [package.extras] -full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] [[package]] name = "striprtf" @@ -5569,63 +5391,44 @@ files = [ doc = ["reno", "sphinx"] test = ["pytest", "tornado (>=4.5)", "typeguard"] -[[package]] -name = "termcolor" -version = "2.5.0" -description = "ANSI color formatting for output in terminal" -optional = true -python-versions = ">=3.9" -files = [ - {file = "termcolor-2.5.0-py3-none-any.whl", hash = "sha256:37b17b5fc1e604945c2642c872a3764b5d547a48009871aea3edd3afa180afb8"}, - {file = "termcolor-2.5.0.tar.gz", hash = "sha256:998d8d27da6d48442e8e1f016119076b690d962507531df4890fcd2db2ef8a6f"}, -] - -[package.extras] -tests = ["pytest", "pytest-cov"] - [[package]] name = "tiktoken" -version = "0.7.0" +version = "0.8.0" description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "tiktoken-0.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485f3cc6aba7c6b6ce388ba634fbba656d9ee27f766216f45146beb4ac18b25f"}, - {file = "tiktoken-0.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e54be9a2cd2f6d6ffa3517b064983fb695c9a9d8aa7d574d1ef3c3f931a99225"}, - {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79383a6e2c654c6040e5f8506f3750db9ddd71b550c724e673203b4f6b4b4590"}, - {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d4511c52caacf3c4981d1ae2df85908bd31853f33d30b345c8b6830763f769c"}, - {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13c94efacdd3de9aff824a788353aa5749c0faee1fbe3816df365ea450b82311"}, - {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8e58c7eb29d2ab35a7a8929cbeea60216a4ccdf42efa8974d8e176d50c9a3df5"}, - {file = "tiktoken-0.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:21a20c3bd1dd3e55b91c1331bf25f4af522c525e771691adbc9a69336fa7f702"}, - {file = "tiktoken-0.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:10c7674f81e6e350fcbed7c09a65bca9356eaab27fb2dac65a1e440f2bcfe30f"}, - {file = "tiktoken-0.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:084cec29713bc9d4189a937f8a35dbdfa785bd1235a34c1124fe2323821ee93f"}, - {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811229fde1652fedcca7c6dfe76724d0908775b353556d8a71ed74d866f73f7b"}, - {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b6e7dc2e7ad1b3757e8a24597415bafcfb454cebf9a33a01f2e6ba2e663992"}, - {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1063c5748be36344c7e18c7913c53e2cca116764c2080177e57d62c7ad4576d1"}, - {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:20295d21419bfcca092644f7e2f2138ff947a6eb8cfc732c09cc7d76988d4a89"}, - {file = "tiktoken-0.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:959d993749b083acc57a317cbc643fb85c014d055b2119b739487288f4e5d1cb"}, - {file = "tiktoken-0.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:71c55d066388c55a9c00f61d2c456a6086673ab7dec22dd739c23f77195b1908"}, - {file = "tiktoken-0.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09ed925bccaa8043e34c519fbb2f99110bd07c6fd67714793c21ac298e449410"}, - {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03c6c40ff1db0f48a7b4d2dafeae73a5607aacb472fa11f125e7baf9dce73704"}, - {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d20b5c6af30e621b4aca094ee61777a44118f52d886dbe4f02b70dfe05c15350"}, - {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d427614c3e074004efa2f2411e16c826f9df427d3c70a54725cae860f09e4bf4"}, - {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c46d7af7b8c6987fac9b9f61041b452afe92eb087d29c9ce54951280f899a97"}, - {file = "tiktoken-0.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:0bc603c30b9e371e7c4c7935aba02af5994a909fc3c0fe66e7004070858d3f8f"}, - {file = "tiktoken-0.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2398fecd38c921bcd68418675a6d155fad5f5e14c2e92fcf5fe566fa5485a858"}, - {file = "tiktoken-0.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f5f6afb52fb8a7ea1c811e435e4188f2bef81b5e0f7a8635cc79b0eef0193d6"}, - {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:861f9ee616766d736be4147abac500732b505bf7013cfaf019b85892637f235e"}, - {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54031f95c6939f6b78122c0aa03a93273a96365103793a22e1793ee86da31685"}, - {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fffdcb319b614cf14f04d02a52e26b1d1ae14a570f90e9b55461a72672f7b13d"}, - {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c72baaeaefa03ff9ba9688624143c858d1f6b755bb85d456d59e529e17234769"}, - {file = "tiktoken-0.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:131b8aeb043a8f112aad9f46011dced25d62629091e51d9dc1adbf4a1cc6aa98"}, - {file = "tiktoken-0.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cabc6dc77460df44ec5b879e68692c63551ae4fae7460dd4ff17181df75f1db7"}, - {file = "tiktoken-0.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8d57f29171255f74c0aeacd0651e29aa47dff6f070cb9f35ebc14c82278f3b25"}, - {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ee92776fdbb3efa02a83f968c19d4997a55c8e9ce7be821ceee04a1d1ee149c"}, - {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e215292e99cb41fbc96988ef62ea63bb0ce1e15f2c147a61acc319f8b4cbe5bf"}, - {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8a81bac94769cab437dd3ab0b8a4bc4e0f9cf6835bcaa88de71f39af1791727a"}, - {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d6d73ea93e91d5ca771256dfc9d1d29f5a554b83821a1dc0891987636e0ae226"}, - {file = "tiktoken-0.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:2bcb28ddf79ffa424f171dfeef9a4daff61a94c631ca6813f43967cb263b83b9"}, - {file = "tiktoken-0.7.0.tar.gz", hash = "sha256:1077266e949c24e0291f6c350433c6f0971365ece2b173a23bc3b9f9defef6b6"}, + {file = "tiktoken-0.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b07e33283463089c81ef1467180e3e00ab00d46c2c4bbcef0acab5f771d6695e"}, + {file = "tiktoken-0.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9269348cb650726f44dd3bbb3f9110ac19a8dcc8f54949ad3ef652ca22a38e21"}, + {file = "tiktoken-0.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e13f37bc4ef2d012731e93e0fef21dc3b7aea5bb9009618de9a4026844e560"}, + {file = "tiktoken-0.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f13d13c981511331eac0d01a59b5df7c0d4060a8be1e378672822213da51e0a2"}, + {file = "tiktoken-0.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6b2ddbc79a22621ce8b1166afa9f9a888a664a579350dc7c09346a3b5de837d9"}, + {file = "tiktoken-0.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d8c2d0e5ba6453a290b86cd65fc51fedf247e1ba170191715b049dac1f628005"}, + {file = "tiktoken-0.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d622d8011e6d6f239297efa42a2657043aaed06c4f68833550cac9e9bc723ef1"}, + {file = "tiktoken-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2efaf6199717b4485031b4d6edb94075e4d79177a172f38dd934d911b588d54a"}, + {file = "tiktoken-0.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5637e425ce1fc49cf716d88df3092048359a4b3bbb7da762840426e937ada06d"}, + {file = "tiktoken-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fb0e352d1dbe15aba082883058b3cce9e48d33101bdaac1eccf66424feb5b47"}, + {file = "tiktoken-0.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:56edfefe896c8f10aba372ab5706b9e3558e78db39dd497c940b47bf228bc419"}, + {file = "tiktoken-0.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:326624128590def898775b722ccc327e90b073714227175ea8febbc920ac0a99"}, + {file = "tiktoken-0.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:881839cfeae051b3628d9823b2e56b5cc93a9e2efb435f4cf15f17dc45f21586"}, + {file = "tiktoken-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fe9399bdc3f29d428f16a2f86c3c8ec20be3eac5f53693ce4980371c3245729b"}, + {file = "tiktoken-0.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a58deb7075d5b69237a3ff4bb51a726670419db6ea62bdcd8bd80c78497d7ab"}, + {file = "tiktoken-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2908c0d043a7d03ebd80347266b0e58440bdef5564f84f4d29fb235b5df3b04"}, + {file = "tiktoken-0.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:294440d21a2a51e12d4238e68a5972095534fe9878be57d905c476017bff99fc"}, + {file = "tiktoken-0.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:d8f3192733ac4d77977432947d563d7e1b310b96497acd3c196c9bddb36ed9db"}, + {file = "tiktoken-0.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:02be1666096aff7da6cbd7cdaa8e7917bfed3467cd64b38b1f112e96d3b06a24"}, + {file = "tiktoken-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94ff53c5c74b535b2cbf431d907fc13c678bbd009ee633a2aca269a04389f9a"}, + {file = "tiktoken-0.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b231f5e8982c245ee3065cd84a4712d64692348bc609d84467c57b4b72dcbc5"}, + {file = "tiktoken-0.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4177faa809bd55f699e88c96d9bb4635d22e3f59d635ba6fd9ffedf7150b9953"}, + {file = "tiktoken-0.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5376b6f8dc4753cd81ead935c5f518fa0fbe7e133d9e25f648d8c4dabdd4bad7"}, + {file = "tiktoken-0.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:18228d624807d66c87acd8f25fc135665617cab220671eb65b50f5d70fa51f69"}, + {file = "tiktoken-0.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e17807445f0cf1f25771c9d86496bd8b5c376f7419912519699f3cc4dc5c12e"}, + {file = "tiktoken-0.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:886f80bd339578bbdba6ed6d0567a0d5c6cfe198d9e587ba6c447654c65b8edc"}, + {file = "tiktoken-0.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6adc8323016d7758d6de7313527f755b0fc6c72985b7d9291be5d96d73ecd1e1"}, + {file = "tiktoken-0.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b591fb2b30d6a72121a80be24ec7a0e9eb51c5500ddc7e4c2496516dd5e3816b"}, + {file = "tiktoken-0.8.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:845287b9798e476b4d762c3ebda5102be87ca26e5d2c9854002825d60cdb815d"}, + {file = "tiktoken-0.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:1473cfe584252dc3fa62adceb5b1c763c1874e04511b197da4e6de51d6ce5a02"}, + {file = "tiktoken-0.8.0.tar.gz", hash = "sha256:9ccbb2740f24542534369c5635cfd9b2b3c2490754a78ac8831d99f89f94eeb2"}, ] [package.dependencies] @@ -5818,93 +5621,6 @@ files = [ {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, ] -[[package]] -name = "ujson" -version = "5.10.0" -description = "Ultra fast JSON encoder and decoder for Python" -optional = true -python-versions = ">=3.8" -files = [ - {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, - {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, - {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22cffecf73391e8abd65ef5f4e4dd523162a3399d5e84faa6aebbf9583df86d6"}, - {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26b0e2d2366543c1bb4fbd457446f00b0187a2bddf93148ac2da07a53fe51569"}, - {file = "ujson-5.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:caf270c6dba1be7a41125cd1e4fc7ba384bf564650beef0df2dd21a00b7f5770"}, - {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a245d59f2ffe750446292b0094244df163c3dc96b3ce152a2c837a44e7cda9d1"}, - {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94a87f6e151c5f483d7d54ceef83b45d3a9cca7a9cb453dbdbb3f5a6f64033f5"}, - {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:29b443c4c0a113bcbb792c88bea67b675c7ca3ca80c3474784e08bba01c18d51"}, - {file = "ujson-5.10.0-cp310-cp310-win32.whl", hash = "sha256:c18610b9ccd2874950faf474692deee4223a994251bc0a083c114671b64e6518"}, - {file = "ujson-5.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:924f7318c31874d6bb44d9ee1900167ca32aa9b69389b98ecbde34c1698a250f"}, - {file = "ujson-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00"}, - {file = "ujson-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126"}, - {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8"}, - {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b"}, - {file = "ujson-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9"}, - {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f"}, - {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4"}, - {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1"}, - {file = "ujson-5.10.0-cp311-cp311-win32.whl", hash = "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f"}, - {file = "ujson-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720"}, - {file = "ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5"}, - {file = "ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e"}, - {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043"}, - {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1"}, - {file = "ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3"}, - {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21"}, - {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2"}, - {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e"}, - {file = "ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e"}, - {file = "ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc"}, - {file = "ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287"}, - {file = "ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e"}, - {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557"}, - {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988"}, - {file = "ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816"}, - {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20"}, - {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0"}, - {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f"}, - {file = "ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165"}, - {file = "ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539"}, - {file = "ujson-5.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a984a3131da7f07563057db1c3020b1350a3e27a8ec46ccbfbf21e5928a43050"}, - {file = "ujson-5.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73814cd1b9db6fc3270e9d8fe3b19f9f89e78ee9d71e8bd6c9a626aeaeaf16bd"}, - {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61e1591ed9376e5eddda202ec229eddc56c612b61ac6ad07f96b91460bb6c2fb"}, - {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2c75269f8205b2690db4572a4a36fe47cd1338e4368bc73a7a0e48789e2e35a"}, - {file = "ujson-5.10.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7223f41e5bf1f919cd8d073e35b229295aa8e0f7b5de07ed1c8fddac63a6bc5d"}, - {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc2fd6b3067c0782e7002ac3b38cf48608ee6366ff176bbd02cf969c9c20fe"}, - {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:232cc85f8ee3c454c115455195a205074a56ff42608fd6b942aa4c378ac14dd7"}, - {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cc6139531f13148055d691e442e4bc6601f6dba1e6d521b1585d4788ab0bfad4"}, - {file = "ujson-5.10.0-cp38-cp38-win32.whl", hash = "sha256:e7ce306a42b6b93ca47ac4a3b96683ca554f6d35dd8adc5acfcd55096c8dfcb8"}, - {file = "ujson-5.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:e82d4bb2138ab05e18f089a83b6564fee28048771eb63cdecf4b9b549de8a2cc"}, - {file = "ujson-5.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dfef2814c6b3291c3c5f10065f745a1307d86019dbd7ea50e83504950136ed5b"}, - {file = "ujson-5.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4734ee0745d5928d0ba3a213647f1c4a74a2a28edc6d27b2d6d5bd9fa4319e27"}, - {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47ebb01bd865fdea43da56254a3930a413f0c5590372a1241514abae8aa7c76"}, - {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dee5e97c2496874acbf1d3e37b521dd1f307349ed955e62d1d2f05382bc36dd5"}, - {file = "ujson-5.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7490655a2272a2d0b072ef16b0b58ee462f4973a8f6bbe64917ce5e0a256f9c0"}, - {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba17799fcddaddf5c1f75a4ba3fd6441f6a4f1e9173f8a786b42450851bd74f1"}, - {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2aff2985cef314f21d0fecc56027505804bc78802c0121343874741650a4d3d1"}, - {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad88ac75c432674d05b61184178635d44901eb749786c8eb08c102330e6e8996"}, - {file = "ujson-5.10.0-cp39-cp39-win32.whl", hash = "sha256:2544912a71da4ff8c4f7ab5606f947d7299971bdd25a45e008e467ca638d13c9"}, - {file = "ujson-5.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:3ff201d62b1b177a46f113bb43ad300b424b7847f9c5d38b1b4ad8f75d4a282a"}, - {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5b6fee72fa77dc172a28f21693f64d93166534c263adb3f96c413ccc85ef6e64"}, - {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:61d0af13a9af01d9f26d2331ce49bb5ac1fb9c814964018ac8df605b5422dcb3"}, - {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecb24f0bdd899d368b715c9e6664166cf694d1e57be73f17759573a6986dd95a"}, - {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbd8fd427f57a03cff3ad6574b5e299131585d9727c8c366da4624a9069ed746"}, - {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeaf1c48e32f07d8820c705ff8e645f8afa690cca1544adba4ebfa067efdc88"}, - {file = "ujson-5.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:baed37ea46d756aca2955e99525cc02d9181de67f25515c468856c38d52b5f3b"}, - {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7663960f08cd5a2bb152f5ee3992e1af7690a64c0e26d31ba7b3ff5b2ee66337"}, - {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:d8640fb4072d36b08e95a3a380ba65779d356b2fee8696afeb7794cf0902d0a1"}, - {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78778a3aa7aafb11e7ddca4e29f46bc5139131037ad628cc10936764282d6753"}, - {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0111b27f2d5c820e7f2dbad7d48e3338c824e7ac4d2a12da3dc6061cc39c8e6"}, - {file = "ujson-5.10.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:c66962ca7565605b355a9ed478292da628b8f18c0f2793021ca4425abf8b01e5"}, - {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba43cc34cce49cf2d4bc76401a754a81202d8aa926d0e2b79f0ee258cb15d3a4"}, - {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac56eb983edce27e7f51d05bc8dd820586c6e6be1c5216a6809b0c668bb312b8"}, - {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44bd4b23a0e723bf8b10628288c2c7c335161d6840013d4d5de20e48551773b"}, - {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c10f4654e5326ec14a46bcdeb2b685d4ada6911050aa8baaf3501e57024b804"}, - {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0de4971a89a762398006e844ae394bd46991f7c385d7a6a3b93ba229e6dac17e"}, - {file = "ujson-5.10.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e1402f0564a97d2a52310ae10a64d25bcef94f8dd643fcf5d310219d915484f7"}, - {file = "ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1"}, -] - [[package]] name = "urllib3" version = "2.2.3" @@ -6494,13 +6210,10 @@ test = ["coverage[toml]", "zope.event", "zope.testing"] testing = ["coverage[toml]", "zope.event", "zope.testing"] [extras] -all = ["autoflake", "black", "datasets", "docker", "fastapi", "isort", "langchain", "langchain-community", "llama-index-embeddings-ollama", "locust", "pexpect", "pg8000", "pgvector", "pre-commit", "psycopg2", "psycopg2-binary", "pyright", "pytest-asyncio", "pytest-order", "uvicorn", "websockets", "wikipedia"] -autogen = ["pyautogen"] +all = ["autoflake", "black", "datasets", "docker", "fastapi", "isort", "langchain", "langchain-community", "locust", "pexpect", "pg8000", "pgvector", "pre-commit", "psycopg2", "psycopg2-binary", "pyright", "pytest-asyncio", "pytest-order", "uvicorn", "websockets", "wikipedia"] cloud-tool-sandbox = ["e2b-code-interpreter"] dev = ["autoflake", "black", "datasets", "isort", "locust", "pexpect", "pre-commit", "pyright", "pytest-asyncio", "pytest-order"] external-tools = ["docker", "langchain", "langchain-community", "wikipedia"] -milvus = ["pymilvus"] -ollama = ["llama-index-embeddings-ollama"] postgres = ["pg8000", "pgvector", "psycopg2", "psycopg2-binary"] qdrant = ["qdrant-client"] server = ["fastapi", "uvicorn", "websockets"] @@ -6508,5 +6221,5 @@ tests = ["wikipedia"] [metadata] lock-version = "2.0" -python-versions = "<3.13,>=3.10" -content-hash = "c34d422295ad06d845485aa3697db488c9081ecf774ed9b360ab5e0d33707b19" +python-versions = "<4.0,>=3.10" +content-hash = "78621cd10122e3b41658020d0711b61ffa379b251e2a012854f8a92cc37ff3c0" diff --git a/pyproject.toml b/pyproject.toml index 51b404de9b..a0eb14abbe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ readme = "README.md" letta = "letta.main:app" [tool.poetry.dependencies] -python = "<3.13,>=3.10" +python = "<4.0,>=3.10" typer = {extras = ["all"], version = "^0.9.0"} questionary = "^2.0.1" pytz = "^2023.3.post1" @@ -29,23 +29,21 @@ pre-commit = {version = "^3.5.0", optional = true } pg8000 = {version = "^1.30.3", optional = true} websockets = {version = "^12.0", optional = true} docstring-parser = ">=0.16,<0.17" -httpx = "^0.27.2" +httpx = "^0.28.0" numpy = "^1.26.2" demjson3 = "^3.0.6" -#tiktoken = ">=0.7.0,<0.8.0" pyyaml = "^6.0.1" sqlalchemy-json = "^0.7.0" -fastapi = {version = "^0.104.1", optional = true} +fastapi = { version = "^0.115.6", optional = true} uvicorn = {version = "^0.24.0.post1", optional = true} pydantic = ">=2.7.4,<2.10.0" -pyautogen = {version = "0.2.22", optional = true} html2text = "^2020.1.16" docx2txt = "^0.8" sqlalchemy = "^2.0.25" pexpect = {version = "^4.9.0", optional = true} pyright = {version = "^1.1.347", optional = true} qdrant-client = {version="^1.9.1", optional = true} -pymilvus = {version ="^2.4.3", optional = true} +#pymilvus = {version ="^2.4.3", optional = true} python-box = "^7.1.1" sqlmodel = "^0.0.16" autoflake = {version = "^2.3.0", optional = true} @@ -57,13 +55,9 @@ pydantic-settings = "^2.2.1" httpx-sse = "^0.4.0" isort = { version = "^5.13.2", optional = true } docker = {version = "^7.1.0", optional = true} -tiktoken = "^0.7.0" nltk = "^3.8.1" jinja2 = "^3.1.4" locust = {version = "^2.31.5", optional = true} -llama-index = "^0.11.9" -llama-index-embeddings-openai = "^0.2.5" -llama-index-embeddings-ollama = "^0.3.1" wikipedia = {version = "^1.4.0", optional = true} composio-langchain = "^0.5.28" composio-core = "^0.5.51" @@ -71,21 +65,22 @@ alembic = "^1.13.3" pyhumps = "^3.8.0" psycopg2 = {version = "^2.9.10", optional = true} psycopg2-binary = {version = "^2.9.10", optional = true} -e2b-code-interpreter = {version = "^1.0.1", optional = true} pathvalidate = "^3.2.1" langchain-community = {version = "^0.3.7", optional = true} langchain = {version = "^0.3.7", optional = true} sentry-sdk = {extras = ["fastapi"], version = "2.19.1"} +brotli = "^1.1.0" +grpcio = "^1.68.1" +grpcio-tools = "^1.68.1" +llama-index = "^0.12.2" +llama-index-embeddings-openai = "^0.3.1" +e2b-code-interpreter = {version = "^1.0.3", optional = true} [tool.poetry.extras] -#local = ["llama-index-embeddings-huggingface"] postgres = ["pgvector", "pg8000", "psycopg2-binary", "psycopg2"] -milvus = ["pymilvus"] dev = ["pytest", "pytest-asyncio", "pexpect", "black", "pre-commit", "datasets", "pyright", "pytest-order", "autoflake", "isort", "locust"] server = ["websockets", "fastapi", "uvicorn"] -autogen = ["pyautogen"] qdrant = ["qdrant-client"] -ollama = ["llama-index-embeddings-ollama"] cloud-tool-sandbox = ["e2b-code-interpreter"] external-tools = ["docker", "langchain", "wikipedia", "langchain-community"] tests = ["wikipedia"] @@ -98,7 +93,7 @@ ipdb = "^0.13.13" [tool.black] line-length = 140 -target-version = ['py310', 'py311'] +target-version = ['py310', 'py311', 'py312', 'py313'] extend-exclude = "examples/*" [build-system] From 5ae6d69cd96639d862fca0a03ef0cdaa7320f4b6 Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Tue, 10 Dec 2024 19:20:27 -0800 Subject: [PATCH 066/280] chore: Update README.md (#2215) --- README.md | 191 ++++++++++++++++-- assets/example_ade_screenshot.png | Bin 0 -> 1130020 bytes assets/example_ade_screenshot_agents.png | Bin 0 -> 725721 bytes .../example_ade_screenshot_agents_light.png | Bin 0 -> 700510 bytes assets/example_ade_screenshot_light.png | Bin 0 -> 1113936 bytes 5 files changed, 179 insertions(+), 12 deletions(-) create mode 100644 assets/example_ade_screenshot.png create mode 100644 assets/example_ade_screenshot_agents.png create mode 100644 assets/example_ade_screenshot_agents_light.png create mode 100644 assets/example_ade_screenshot_light.png diff --git a/README.md b/README.md index fd2d248d22..877e5d0a1b 100644 --- a/README.md +++ b/README.md @@ -9,9 +9,21 @@

Letta (previously MemGPT)

+**☄️ New release: Letta Agent Development Environment (_read more [here](#-access-the-letta-ade-agent-development-environment)_) ☄️** + +

+ + + + Letta logo + +

+ +--- +

-[Homepage](https://letta.com) // [Documentation](https://docs.letta.com) // [Letta Cloud](https://forms.letta.com/early-access) +[Homepage](https://letta.com) // [Documentation](https://docs.letta.com) // [ADE](https://app.letta.com) // [Letta Cloud](https://forms.letta.com/early-access)

@@ -23,24 +35,181 @@ [![Apache 2.0](https://img.shields.io/badge/License-Apache%202.0-silver?style=flat-square)](LICENSE) [![Release](https://img.shields.io/github/v/release/cpacker/MemGPT?style=flat-square&label=Release&color=limegreen)](https://github.com/cpacker/MemGPT/releases) +[![Docker](https://img.shields.io/docker/v/letta/letta?style=flat-square&logo=docker&label=Docker&color=0db7ed)](https://hub.docker.com/r/letta/letta) [![GitHub](https://img.shields.io/github/stars/cpacker/MemGPT?style=flat-square&logo=github&label=Stars&color=gold)](https://github.com/cpacker/MemGPT) cpacker%2FMemGPT | Trendshift
-> [!NOTE] +> [!IMPORTANT] > **Looking for MemGPT?** You're in the right place! > -> The MemGPT package and Docker image have been renamed to `letta` to clarify the distinction between MemGPT agents and the API server / runtime that runs LLM agents as *services*. -> -> You use the **Letta _framework_** to create **MemGPT _agents_**. Read more about the relationship between MemGPT and Letta [here](https://www.letta.com/blog/memgpt-and-letta). +> The MemGPT package and Docker image have been renamed to `letta` to clarify the distinction between MemGPT *agents* and the Letta API *server* / *runtime* that runs LLM agents as *services*. Read more about the relationship between MemGPT and Letta [here](https://www.letta.com/blog/memgpt-and-letta). + +--- ## ⚡ Quickstart -The two main ways to install Letta are through **pypi** (`pip`) or via **Docker**: -* **`pip`** (guide below) - the easiest way to try Letta, will default to using SQLite and ChromaDB for the database backends -* **Docker** (guide [here](https://docs.letta.com/install#run-letta-with-docker)) - recommended for production settings, will default to using Postgres (+ pgvector) for the database backend +_The recommended way to use Letta is to run use Docker. To install Docker, see [Docker's installation guide](https://docs.docker.com/get-docker/). For issues with installing Docker, see [Docker's troubleshooting guide](https://docs.docker.com/desktop/troubleshoot-and-support/troubleshoot/). You can also install Letta using `pip` (see guide [below](#-quickstart-pip))._ + +### 🌖 Run the Letta server + +> [!NOTE] +> Letta agents live inside the Letta server, which persists them to a database. You can interact with the Letta agents inside your Letta server via the [REST API](https://docs.letta.com/api-reference) + Python / Typescript SDKs, and the [Agent Development Environment](https://app.letta.com) (a graphical interface). + +The Letta server can be connected to various LLM API backends ([OpenAI](https://docs.letta.com/models/openai), [Anthropic](https://docs.letta.com/models/anthropic), [vLLM](https://docs.letta.com/models/vllm), [Ollama](https://docs.letta.com/models/ollama), etc.). To enable access to these LLM API providers, set the appropriate environment variables when you use `docker run`: +```sh +# replace `~/.letta/.persist/pgdata` with wherever you want to store your agent data +docker run \ + -v ~/.letta/.persist/pgdata:/var/lib/postgresql/data \ + -p 8283:8283 \ + -e OPENAI_API_KEY="your_openai_api_key" \ + letta/letta:latest +``` + +If you have many different LLM API keys, you can also set up a `.env` file instead and pass that to `docker run`: +```sh +# using a .env file instead of passing environment variables +docker run \ + -v ~/.letta/.persist/pgdata:/var/lib/postgresql/data \ + -p 8283:8283 \ + --env-file .env \ + letta/letta:latest +``` + +Once the Letta server is running, you can access it via port `8283` (e.g. sending REST API requests to `http://localhost:8283/v1`). You can also connect your server to the Letta ADE to access and manage your agents in a web interface. + +### 👾 Access the [Letta ADE (Agent Development Environment)](https://app.letta.com) + +> [!NOTE] +> The Letta ADE is a graphical user interface for creating, deploying, interacting and observing with your Letta agents. +> +> For example, if you're running a Letta server to power an end-user application (such as a customer support chatbot), you can use the ADE to test, debug, and observe the agents in your server. You can also use the ADE as a general chat interface to interacting with your Letta agents. + +

+ + + + Letta logo + +

+ +The ADE can connect to self-hosted Letta servers (e.g. a Letta server running on your laptop), as well as the Letta Cloud service. When connected to a self-hosted / private server, the ADE uses the Letta REST API to communicate with your server. + +#### 🖥️ Connecting the ADE to your local Letta server +To connect the ADE with your local Letta server, simply: +1. Start your Letta server (`docker run ...`) +2. Visit [https://app.letta.com](https://app.letta.com) and you will see "Local server" as an option in the left panel + +

+ + + + Letta logo + +

+ +🔐 To password protect your server, include `SECURE=true` and `LETTA_SERVER_PASSWORD=yourpassword` in your `docker run` command: +```sh +# If LETTA_SERVER_PASSWORD isn't set, the server will autogenerate a password +docker run \ + -v ~/.letta/.persist/pgdata:/var/lib/postgresql/data \ + -p 8283:8283 \ + --env-file .env \ + -e SECURE=true \ + -e LETTA_SERVER_PASSWORD=yourpassword \ + letta/letta:latest +``` + +#### 🌐 Connecting the ADE to an external (self-hosted) Letta server +If your Letta server isn't running on `localhost` (for example, you deployed it on an external service like EC2): +1. Click "Add remote server" +2. Enter your desired server name, the IP address of the server, and the server password (if set) + +--- + +## 🧑‍🚀 Frequently asked questions (FAQ) + +> _"Do I need to install Docker to use Letta?"_ + +No, you can install Letta using `pip` (via `pip install -U letta`), as well as from source (via `poetry install`). See instructions below. + +> _"How do I use the ADE locally?"_ + +To connect the ADE to your local Letta server, simply run your Letta server (make sure you can access `localhost:8283`) and go to [https://app.letta.com](https://app.letta.com). If you would like to use the old version of the ADE (that runs on `localhost`), downgrade to Letta version `<=0.5.0`. + +> _"If I connect the ADE to my local server, does my agent data get uploaded to letta.com?"_ + +No, the data in your Letta server database stays on your machine. The Letta ADE web application simply connects to your local Letta server (via the REST API) and provides a graphical interface on top of it to visualize your local Letta data in your browser's local state. + +> _"Do I have to use your ADE? Can I build my own?"_ + +The ADE is built on top of the (fully open source) Letta server and Letta Agents API. You can build your own application like the ADE on top of the REST API (view the documention [here](https://docs.letta.com/api-reference)). + +> _"Can I interact with Letta agents via the CLI?"_ + +The recommended way to use Letta is via the REST API and ADE, however you can also access your agents via the CLI. + +
+View instructions for running the Letta CLI + +You can chat with your agents via the Letta CLI tool (`letta run`). If you have a Letta Docker container running, you can use `docker exec` to run the Letta CLI inside the container: +```sh +# replace `` with the ID of your Letta container, found via `docker ps` +docker exec -it letta run +``` + +You can also use `docker ps` within the command to automatically find the ID of your Letta container: +``` +docker exec -it $(docker ps -q -f ancestor=letta/letta) letta run +``` + +In the CLI tool, you'll be able to create new agents, or load existing agents: +``` +🧬 Creating new agent... +? Select LLM model: letta-free [type=openai] [ip=https://inference.memgpt.ai] +? Select embedding model: letta-free [type=hugging-face] [ip=https://embeddings.memgpt.ai] +-> 🤖 Using persona profile: 'sam_pov' +-> 🧑 Using human profile: 'basic' +-> 🛠️ 8 tools: send_message, pause_heartbeats, conversation_search, conversation_search_date, archival_memory_insert, archival_memory_search, core_memory_append, core_memory_replace + +🎉 Created new agent 'InspiringSpinach' + +Hit enter to begin (will request first Letta message) + +💭 User engaged. Recognize as Chad. Acknowledge presence and establish connection. Explore interests and engage in meaningful discourse. +🤖 Hello, Chad. It's nice to meet you. I am keen on learning and exploring new ideas and concepts. Is there a specific topic you'd like to discuss today? + +> Enter your message: my name is Brad, not Chad... + +💭 A discrepancy in identity. Reflect this change in core memory. Apologize for the oversight, and rectify the error. +⚡🧠 [function] updating memory with core_memory_replace + First name: Chad + → First name: Brad +💭 Apologize for the mistake in recognizing his name, and begin the conversation anew, addressing him by the correct name this time. +🤖 I apologize for the oversight, Brad. Let's restart. It's a pleasure to meet you, Brad. Is there a specific topic you'd like to discuss today? + +> Enter your message: +``` +
+ +--- + +## ⚡ Quickstart (pip) + +> [!WARNING] +> **Database migrations are not officially support with `SQLite`** +> +> When you install Letta with `pip`, the default database backend is `SQLite` (you can still use an external `postgres` service with your `pip` install of Letta by setting `LETTA_PG_URI`). +> +> We do not officially support migrations between Letta versions with `SQLite` backends, only `postgres`. If you would like to keep your agent data across multiple Letta versions we highly recommend using the Docker install method which is the easiest way to use `postgres` with Letta. + +
+ +View instructions for installing with pip + +You can also install Letta with `pip`, will default to using `SQLite` for the database backends (whereas Docker will default to using `postgres`). ### Step 1 - Install Letta using `pip` ```sh @@ -104,11 +273,9 @@ INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://localhost:8283 (Press CTRL+C to quit) ``` +
-When you start the Letta API server, the ADE (Agent Development Environment) will be available on `http://localhost:8283`: -Screenshot of the Letta ADE (Agent Development Environment) - -In Letta, all agents are stored/persisted in the same database, so the agents you create in the CLI are accessible via the API and ADE, and vice versa. Check out the [quickstart guide on our docs](https://docs.letta.com/quickstart) for a tutorial where you create an agent in the Letta CLI and message the same agent via the Letta API. +--- ## 🤗 How to contribute diff --git a/assets/example_ade_screenshot.png b/assets/example_ade_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..fb75c43a316ec992ab0e43f85905c1a49cecf304 GIT binary patch literal 1130020 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

}&}{$-3r9F3)}-@dnbUN$ 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

woo^613(2+%m~ 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⁢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ν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 a6gIK{?u?xYbZH*=cl40W!Q2C9Z~qTp!IWVD literal 0 HcmV?d00001 diff --git a/assets/example_ade_screenshot_agents.png b/assets/example_ade_screenshot_agents.png new file mode 100644 index 0000000000000000000000000000000000000000..e07df1f22b70663309fcba754f6d6b6b438c35f2 GIT binary patch literal 725721 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 !g9uc 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%0Dn@>7q0_>$)_ZBjIdSH1+g*<4mgtU8xt;$ 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

HXPWPzzi@V^2rz(0c*6 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

3qrw>s>|mK;J}lAJ=&RcT=_iN;LXN&M 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 (UFh>glOHDPN2V`4QbnF< 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%0AQK9j+$iF=`ywNmcTz&VuGe-3Qs9wSlgkclzr>K7 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�t*|1(g_*rAXXqEcM1pws-h4iv z$NmAP6k02~&Qb4vlCTxT;Q$*@T+dSb$P9<$`LMZ%qHM{n~s*Ob)5*k=p@{9 zC>SzwmpSh>BE(C3==l|c+$)%=Pn=KP1i{`J2Zx8%5-+!m3+rK8eoT18e z`KN5os9Az+o{xH2_F$7CHSNH|RNoYfrJ85c99rkO1rK{6`ak;9G3s3}UCIRh*99k# zU^-m#A93aw;y2*6#`%v}CA{+f@O5n0>dOJ0k4Ch?K2oa#K+)G;+XAqN#>@SD=Dq#! z6*k64=O@pb*sNTRM4y8LbJPcf252~Ct;T<9(B}rk{%V?Mda7)xvHL9Ei$v>kaDdT7 z)L@JH)&i&C5rHZYU#x+SfXX*@!PJk#n5jXRL_?RHsmos<$K7d7ZF}<1fJ;XF+hbQ; zCMzwo0Sgu{C-;|BUe4bATCE3j+Q+DxLSQW`$HiLbEYqiXP-5aYV=?N9w)P55&=5`j ztGTCR_!7zL(lVBhB^-pgKIMho!;&sA$t8+?klxQG2Y4=`cde7uJ#5bP9>#7B`C1aZ zEtQ7n<%st_`@B%rW$cr#E;RxVN!3s%tgqscU$R03{;qNU!wdGee)KOSdTJ)JCaH5q zNUPW@tg%>DKffW>lqU$jc|wzk`yzg1YMDzO*Q(uz zwgrf3KNsX`9x8p)Fk%{%7Y#QLI(HOJCqF{C#envs5TCZh8(-2Ay+&2c8i_*4qbsF*FHSM=tPpoJT>Q zO{)3yp>Po}J#T&Duve#HzU^gFc*osOG4Y?i*Z;F-4Ws|#QiEbs**}ocT!hTuKs?hd@(ukqxGH#Pc@vhW4 zxS?jDxe7IACImV?pv!!{&QVibPi^+48#$QgUv0F-℘C@rL{}EUkxVf@Ai}-sFC< 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 z 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%0Dm)lF)kf|Hh8bIF|XFT z^je~C&eAY)bHpp{ew)}~f*-1 zu#YlDeb(x(G}>E<@bG;{%nY1=Cb?DkeXI#S+)qWkbJr@ZLZw&nAz7J3kH|UDT2rP> zDDCHt>u%*So+lji-tRi4T2vAeGN3l1R*kf4 zfscpXf7}y{i04t1QBZ=XV0$fzQpd~})Fj9Sg}(hSQSw)w@BcjUfm1lt0Y1vN)7NSQ zCN;Z(6@tQgmKW(3>2RhhQbdtVc~{X_{zo@Q;r7r)?V{Fl$*0VjHv^p!@m9aZuemoE@ z>A*KuevWtGc3E)oS0wMKgHl!1uKFJV(RK)btJpC|=;3Bs%+gU~$fv2}{q^*zYdBPy zwR#rr!FY+evYGg7MFfHKy*<^9Jfsj6cDbJ(eAvd+4#52sS&tj-z&+sYiscWM%QiXdNS?YRRnD*{2nBbWdTXXyvn%X9H$eRyTp`%WWUH)xUd zEU!b-JI?=T^4-e!>T7D2r*FJ^r(a_9RV?-18k-HNCcB)=cC6@vE?4mN0FqvbG_*&(w)W z_a+};J!ZS#=Pq<~HT!{)`z>+(Zmu3WeS-})H&wl>wLURNyb(QLTIUYCaM|PupK79Y zg=*NwO^TxD6*Qc7e?0$z93gcb8qyd?OfzmEkoa2*d=|L>t`=g+3mCrV8;AWeE>qz( zE?h)!MtF*T4^Z~9H@sLqPe&t10X*OF-x{h)A%@J5_j*&HxjylAQY*`S|WquWf7VW-W?$3qc~DSjgoE8=kp83H

  • 9*>*>(?JH=o@L0;yyQ7t%8d_N^4!* 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 #jVoZiJs ze@ph8`oEL?f|V*Ske;YpdU}ww{=|(TDu+@8P45#)sobtoo_&Ufiz|hmDc-3F!?Spb z7sWxOrYwbid7D_s1p_+XQ8NqQ=GvU%TJ7ylqFiZwJnCofoTr2M#rUe%JCBtC^+$g- zv2OuGsPfB^Ja!L=-n$k#5^>LhH{N*2lJ!I!Xn%R}eG-Axiu&_aO@dv_`oS~i0*v@A zwzFmur6rz0Ky_8pNANd}g_E3tY~QA0479`5KEjL89ckrk#UzdttX6FI?Gg>uWCpMY z#JX(Ks;XjRvSDDC@pdr!is4rqtlL}+riQWa(9+2EpIkAZ^*8HEvSPoj_eTTj|Jq_Zh zUz?-29T>}X{xww|VktjKpHd#nV)`V1BxFOGfkhsLK&lk- z^{x<6jBI7d))VEsxKDae@6q>1+sz7vs+P8VWkx(PZh$L275AvC-|0WTXl6bX zuz$hFL-)81F(H6y6t;5Vl$Qljz`3@g+|2ftw|rK7pAa6@bdOt z3WJbl3lKnh9O z>dwgLxBdDoyL8gxXU`z-i}+Q~IbY23j%bEVNEPW{Z$N}FTB17sPPnqak$}kQXP|C$n~2g@~tj&f)GFhqAe5!9g`>$bG`bk|w&b9QCegz&Ol@?iNCC&A+qXovHEc1;~3EP|mxfI?g&} z4H#7APTLa|oJOr@KLqSoT%aU%P*`&Ana)I2 zrx}sEUzaww?7Q=XVZ6=N8L_W1aMk!|_h3=B0nzH~Az_N6k}hVuT*{I*>n!6NWH+1v zpP-;yej8(+0H;9x8b!N28cl1-J|R{)Jf?i10ohOu_^KGyxnJ;M+y46sW`48*5;fij zuLddSR|Cuzh=G== z=ekU~Z|sbv!e`nK<#XQA=Chs=PNCs6e7k5mQ(bWZb{bAmSy#^=a$T*@*3|*>v5&eH z6$=BKT4<}#|MV!Z2&Nr?FOT@u>}W4n_GYAW+Hp*$76*fP>udiP1*+YWg0ElOIiHjK zrQrUi?fj`YFyBHx8%J&sp0jly+mV=R-4{Z6Mm6Bj7z^!|kvyNp&Ol*iLL@4?E_cdj z3-GUQNx>*>l}ME`=f4a|_uFy^TT1?@xlXwyeZHF`?>!M)n&AknrzPGS50pf6WT?gY ze6k&cYoU{36E3CjoVag8Yjgc$a?fNKJJ1$W*NoLuifL})Gv+#$h?)%WUzt!!}9dU zIZ%=v^}Mef`HR3|MK~-wbU0U|&wU|KIWi2aLgj|)XCphI)$7l#rg#&4RyOkCpqG3* zjkg1~6x4kdAD)AS-&#c10ixQPU3@LTbcv#*%!|q!>AGgvmCht7S<)0r2UVE z{2#91pBF+JfFx|8v~?0@!9QsigLd1leEP{Rf~3ZuEWV6Ram(I}rYmXz;|f2Y;4@~D zp&+z}mKxY)zGj#$U0w02M@9NiAr3&)EFvGb1c>#S~F(l zj*0Al;gE_K#hvz2T9&)m3z`pa&PYGU!7~wLyDH=kXT!W=*~1|?XPK(IgIw4jvL2#? zc1sBR9?Gmp00y2!lfKy_w2s_6G2a|R`-=a=vje*i^MRnCp!(`_P>@0gl2Ey6K$uEq ziPtca?`0>miXnnb%VORM+|=I#+`t~vK)0K&NWrL@tq4)76r1xI4j^$k7CUICkKSk| z*(|85bq8H$>IGPZz>YJ-nCz1NS=6&qXf4&hQTQ%chO|m+m{&4<{@Bd^@#Du@=xB``SIdE6ToL{d?o(3Q4<0Blrq0PR0~(&MnF>-mR7aCE(( zH!*m4xE!Y!u^giSYT#HnC0FYekR0tSMv6IkU+xE{$b%tmC$m<>-+Ug>rR(i0-UZ;N zQ74o!=16v(Xc1yPn+#09Pq(XPd!?K8WMuf#dj9Q&G)jbPf2O^+9E~l3%Q`ZrFcuHn zuc!{s7s7_?X*LT$?xfN1HH^x)3I}DaY-u(&%-< zgVLjx^azQeQUCVCBqrBkaYh_vhyLNmDV)e(aNtWalME52?su}Ss=Y@>IL#4j18frU zyD1p*IcQBLoJIX8{>UnZMRH_WUdSOuNVwJ&6cCrRDMWTMo+4Rh@b9l(`4^GTmYCa7 zd8WbpQ~2hPc3VW-*`?Q&l|vQ=n!Qe)SCZ#-lC$XY$**kJPB_K=@9U~+YD@eJKsxuG z!@TBr6nF94-7V?Di=C=$=9k}Gw=4>`ODFS(Mf14+W`C%D<~(m;#H38xgajq7EOo|7 znR^r6mez`~aIT}OexEgM_}Mj|_U>DzY~fz9Q);_ewf@Y5*#Une#RO^o_8||!;mWrZ z=wDNFFP*muAseQ5bQYG(X_hBI^PiRH-b(REQY)rT`hHIj73EI05e5+{h7t{l3LQI6 zvSKokBytk0nDvN9Opw#z_EXj|x1)@!&FX%-$lBZ8rii7qruoVJ@LT?u>>?LQ=s}&l zs9O(}yL-`GaGFh_oR8}E{5FE?RFzF!`H{_fn*Re*Q^P{5B3cs5B+X0l?)zALG9DEME8_T(%g8iy zzokoO_8o(nJaCRGFBM_I1L>oQN!iSv|XCkL+0lt5lhL4@S7Da&h>bkBTJ%6kwl zj_^%bdh}SsBbTJxa2!F$Vo}#HnQ)wbncMdyCZvl+M$#bRZ5P?e8|I*Ef5Gm^)y;dE z?ne5;?L(6j*+c&C%0wx#aA=S06MFHQlkRQRx9qy$MSbpIc~;sUjbNqKa17i?|y{JAu#pwUlQu81+xk; zre9l9K4??hK4TE$ppe_H8Gg4fcMTI;F{vHSmeexoB!Xu4`goMimtIDA^_$g$4ZeeG z=hF8x*)E;I2H$)Srv$svczYcv0o67OxL$>{WZ*COkQH@6{1Z#_Rnm>*G3oP{+W zjD{pQHt+uWTIM}UKT32(#%}&&$qeno47z<&+7Cxp83k7?Hb;G*O7aSK4)ov45{D|r zLSi3K;1zEAJT1X7GrV<|qA-e)$~Y)uiBw)%`5p#3PN+u7e`u2R%rg3;-!)p~ulsGN z!5NQmQA*HZEiq@;?}c zfAz87!a#im87RjsA{r;suQRfw^CofaifDTksKivL#Mfw3J5u>e_YUiF)s92dGCA)% zlfY51A2cC*`5`AS;n70)x7KnqJir{V`N2?W3I0enTe>5+LIsY=1g2})JK^Pu4Ed_e zfuYiS8>>W?q1ATx!AC1N*z4Gj6Gfni+2iB*1CQyYV!YxLF*FIRYfZyc`HQu6Ur|gW znYbv2V(-D18tDdzHB*G3vx6gbi+YyOcXbXtCSp`1Ykr?1q&rJ;M6&uLekXRbHA@V` zA@Z5Y_pYqau`O}`LsRVZtKXY%YD|;D#{xyOVlk)-n=z5N4`*ngw0+9H54G_J58aQO zQx_(!M}LyXL5Ed?A39~W$FPb_#m;mzKJTOFg%W?Wc8G$AM<`_K1_DT0D zmL7Z+l*NxH!W0|`HsF9INOn0MycINn2ZxlBB*_$eZ`@sn%f#`n(?WhpLJi(E%3kK9 zK4N-d{4j^vP(6z2qY4Ht8%5!gypnqLJW^%wV@ldQZnOVT^}aKs2|8{t=-Bg zJy2FpBpZ%Yh5I(qa^7ANi=8;xsi?m;_erH@7*38$GKhuohhPX}Pa}f&>qykxmt%(L zE^U{iNbbJf8{kArHDOw?=_;8bqmy->Dv`e2n!G!8V}pA|+KEaWKiFbTQ_! zol?qA)S7jbrj+1i_kn3&G%iFCiZm#`R)3p2iQf!ET2Ig*7#^$~ki259GkBC{hEHmf z#BnaT?r=2}aYBoZ@3~=)n20dGk7h}k@Q_uk@m3hdJ;tw0S_UpWFMKHQ+O5!I4EO!~ zc1>MV=SQ|8e-8u-Lx_WR2z-!{)9GwGGt3SaK0JBdCvvK{=tL8=s9NLZ=sYOLc%GpN z@{)I|cBfjYthcU@3%py@SuOu=fsG>etvB^?E*Qzdp4R$~E}WvZQ9l+?wcRn%xJ@9t zQdmWDYth?%!MR>N(EB=&T218xAL+4jLixc6_Q${-Erm5z+BE!;EbZe5^bowfV)o_1 z*F$206Es&+7h@eC3J#-8Pa0td@7G`sc7hxjx!Wjr&fm)3)}MeXR47WN(>#=z5Dz>d z9-$lVcr*ESg5bDt4OXm&|E{7^`Drt-`3B1BF$-HpBa2Yt;A{)1%4Msof4^oR2%mPwk<6mh(>ZK&t}t~grm(1 zEtN)(3QH`1CXpU8unzXHWJxHugj)C;+jm;8Rq2lf$@4)pU{_pO&w&zRMSTb6Zy zkrxzsUtb<7o$k>`RxT`e>0DtP>xB9fFq4OZqwt6be0-5+3(N^CpXU*@v8s{ zk7^Fiqt|cV){_{eH~=(duW*OYi7~}v@D2AtBc3D34z?PGIF|#qt8&)sqK9>r=6PLm z)p6|SA*Vu%Uyn|QpDA4&lv+kQe73H2eL3yY;5arrSAGg{Yp1i?tvL-LM;HzDDSn!h zj-Xz?A<<69GYD6Ol|-{`7h5aN?UXKnjcIByOMW_l%4+UrVQ%S+n>pgLP$5HFpv;`~ zIRQ#2IlB|R^vsTsP?b^OlgEXgdkuk8;A2=WowAd6KAR8BqlSGam((Y{o7#$mCmxRF zaEjasieD_ZARaE!2%V_g5x*ag*C{fg-__r)X-w28Gw1HG(||7g7t{^9NS(YGsG=Hb z9+Xp-N|%Z&-sHHuLUcrRW<*{Bwm7mRO2r#Povzu5F6kLjf%%Rl2Aw4Y+h(<;gw{!d z)Xg1?5vGV{b+OJm#{8>{+(jw9NoaC3Q-x^ulk}&n%y<|Ba>S~N6s#HS2ab1Rq5~ro zgM>+8NcWC1w)+FV+)q%8J9%`h1Y)^#oS31JUSGTN$!I*okTqrS{Fpys77F>2i@7hT zsyoxdQW~2V4kwM<8+D@5{osJ4T&TS~kSA;^RY)iYOAKGXH9lH%pW<3=7+e zbTPzbXqB#Poi{sTGRfXaCa_4JIiAxqpv|pnyEM-M15NDuEV`+EwJpW#DbEpUXBSxt z=|(2fN4n0wB%v{q-m)zT0_`nL4q1g&L%@|OWRMZKk=x{#ARgW{)-j{*e0g*|zILy1MQ)X)D$ zP#h!u952E@_%SlQ(&jTIM(l4X9#Uer7naf_1tb!{hGQ{xM405o7=KzsWR#nC2VJOK z7~5Z!16Tg za7?EuTbZ%aZQ^_bmG@fi+aXPUrF69#1^JPD=2+vdPY*FG7`44z`A)&$KCpy}*J7=7 zx->W!Xx0(>GUdmMpC@rfZkn&p_R?m8z=$ z7J+W;ZzTC|*G=@q<*S^4>4`;j+r5VMbc2{(HEj>fqX@pVl zeB_2KpTfEFY?*yTG(!_hi;uOsO=W zKTu;%bCc2w7*@dJKTyABFc#k0EMGZc&dAi0Eq8V2`V-f?=%4MW zO70E|5uzcPzHrD!*>Ku079zg%j|)=h`Fl^X@5e}(UqD_fatpGGR$|jLBn_cdzos(= zUG?kWZ@!uO9-$EhDRbTzmB~T`jF5>kyN-BrGpR$#m*qg^!ULNRV7yTHt>#lK-3< z=MD+I9%GK%M8GIrW<)8A3ayM1p#y($zEl&p>%{YoYfnouyo86$-|k{FlXcBP^;EZ> z%xM`lpf8XoDy1==!)@<(jt$TG;r2R@crjkBeyxG@Tf<=2<4l% zl*eU#^$(C*I7n2FLn6UGpTJOe1^=942QovShwLLI<#o8M{-|Y8^6K?Go0qA5ve-IV zu4P^EAZs59N6Vt<-R8*Qld&&7^SUY176FkI^NT0h2he)QFFz;=eR_|_bT*yECTyDU zSqL?GZ~e`~+dt2dqa0{CYWR4lPf)s$=S`Zr3HU8%&Z|~kB!}7d&)1qRPVUq`9iRT- zvxtw-$}~J*%}R6$fCcUi2b*gKU6+VVq!SVx*u{D{LsK*O*J+>gN8^cxLnD%LP=~K6 zI3^#ip<(faCzs|$ONb@Qcn{MXPhx`UNidv0tyDZnH0^|4g*IFCO5=Fx#P9{P*L+91 zp%$*S6cGgp?1&|edRa<-#_;jNeM7Z+=o<0`ik_kyejI2;Q%QCQayt!yt>wFQh#8UN z;h`N+5OGzI4>zsL2eLW2*Bq{04Je7j_{S^s2bVgm<~4Aq2Ti*EI6r`0Ez1M~OZsIg zTQ*T4Yj9BFs>XCv)(_)$yoSpJl~ztW}-oscj%+bRw_jWI_&3 znsgI<05&G?&#Wy1T)01NSz)3u2KE^`PZhNV#jPqt2ke1vUg=B%+%odZ^D;CeUoW=D z^rokrulu%t_RWYAHZuBoB{n-R5zCb0^J>n{VCnb+VWuHv0!oULr(Qb( zWj6DO%L=V*#qH(^D~6O~0xK{U!Pn9v_V@#-U*fWtuMfR$cRdQfP#={DzoS(S#Qz$Ym={R%uB(+BOL4H&@fdiwbLF~wVZRL~ z8@A-SF1~eq&ByjSTrUy9jIEV**VmH;uag~DS-9{C8db`h_IX1Us` z(Lfs2l?q=!j}%1h*@CFr90 zaPM(4JaXG>V3jm_(b6v=sqZN1lZ0;f(KN|ac+BbP?B8oiH#}kxz4F7vj*W%XTcV|x zlM3A>$!6buL+~LWiAHT+#BEV@@VPo~-zM`EORPY6ZOhN{vcB9 zlIf%W#*99UEbWqzjFOmGk4@#fX8Qpd+Yg*L#8q6ui|XoeQu$vZr&Ei^hgXMn)?^ns zC1p<(TD!}p-{GPTIwuKgEl)}*9$&*Z*_{s_WLN5WowtyDr=dAaWgHm5$}ClJo?4$2 z+8%ZS_OL6Z@snAJ?#-#?!TwDfO`_o8e4R=By6xCUGwHh(r=onXx|@=<#dhLV2i-E? z{2#*J!Yk^qefL#BLShDxhM`3|q!}6kK|mVmlmV$yLf!g*}cRB{#=?*-$_2438pCJ#VN=?T(29kLtB(I z>B}$K8}lD!9M~9e?9bk*khEl`d&yNsG|<7f~s zr?Xs_?|wJZMp}*}TC)(MVc7Tlq`xo~x4ah_?b3aL+e+;hiz+JJ8Sp*$P=a)G&)aD5 zipK)H=io~LHMRJrNKo{tI;{Dr&0Ce=rUkffr!(CjUx@gfDe%#eAmx{Rd1K)$rPD4w z%D*9cH0^dMaRIz!1Y^{-gzQ^5nYWsHiH&=Xbsk*vrd|;JoL+-WRM=D21K*rbTYSbI z^Te@Q3ADuF)(BUpz(1fhZ4y52X`4W_&70&Z+rD^C5foCQ_A-}J=Xjr)It7taWSTu^OCR+^ix&k&U z3Q-!X{*I^4)0axQFebaCtc%eqd&c4%)A_E3;DRMQlUyIM;_u&95zlvdBwT*JX*rO?EJ;Nt9g9Y#x`FML z7t8As9eNOpW^cN9eNz6*W4m9~L-*f{*s*ZB!eFILy|u}srYz?Z4&H({#@GWGlUke) zPvWq`I3lp$afnLay|JcbIHiUZu#$%8(E$U~V!(N$+pDcBCg|hof|rI^&-62k zEEk_R#Z-2qWc4Ts?n;$yOSW*k?|8)h1EqXOjd`+)_oLnK?b~i<5po?se2BwnBfRnM zh(fRL+v}oECp_TGEQP+OY!cd$?vLMClhRPXl643lZS(n`{L}_}_O_9o*zY-HhU$PS8cn^)tb{?HGO-=m%);z3F+;*NE@|9?><;ZE* zENAV-evq|HcP`C}lE~i>mhV>V5RtdTU-!8uJ;_@TA|qAy>@1?&)zFPYSAxyZr0xeg!x1zqMwCqhDp0 z8x2j)TF1HclvOA$k0#d4q$ea5;e`XtaABUveN zk!&s0LYu{7{k5WxZK~EP#Wy_NI=#5v;V~FaL80ulfYBDQ*_uqCv+(t+W<*{3KCD7%O=uwJU0f6Gqz$0;>U z8I&xrdBR!9{%pRZi8}!2s^2oM{vj-%%n2vQbCP3v_@QYS01%+~B5(@3(Tv8d=&pw* zprhbuR>w|1P(yR9IGI5d-u8HF4J-Xr%{3~hIYv^poEIjE#GvC2p`zeF`|6XQUz|_R zmLWsECab;9(K%NowyykGZ!hok^A$G#R!?5I+G&RKh$Kjy=!BI)ViIhuF0&w2uT5ic zC)@8|AbN64SlekN?A@CNb&bxh;|H%U25JNpjz`ND_6`{MY?5UiB4EsUsMJOiN zG2Gx7{^J4t>dzx|Gll)z%`z(+VK^jT)Us@iQ}x^kgKkIlGubE2vz^Q1LE!jqAzoG< zs)1=p&slk@+k0)eealH0xC-rd3~WN`_CCUI6c)J_ObQ~OZK`eF$;H%l<&68dcIyJy zb8qhNz2nLEb7;TL#jNFrJIoKWhxZ{1MgJb{c>a(aQF`7FGWLm!iKavW05Se}1-5H| z@t|BcYCEs)uohW9%L{TpYkNTTs8|N><*$5i0vt-Z8si;~7QKcQ{=H#mXed<*%qx~f z;$*DcE*n;Z6mt|SmVNJeP-(w?u;wgHh;X2o2QpTAnD5DsJV_)4k%KVs8E!~3*hkzJ zC;Blx^(A>fFBy26x!0EvD@oB)+T>oS_ImR7SxCJ|Vzs7YI@@kVlpo9uSHxzu-VPjb z)Hk7G@5!k9Wc-$_fk1bdJXdila{^o^l-?=tZ*tIPF+=u>&B-WrU|!%E-Nw;~4cGA$@MG^&(ZdeS*9 zkE7?kdB|vtKcX|xMIA1u@}lf@P;iHxz>7;|j+z|@uc`;Gv~dxl>E}RwB|$OIS4w;* zTn?e9`&BQBvU(cp*Yk?pquN`fkXC7#;Z9P?{^ld{l=IwN$?)pMH*>K74|y@T*`-k``o0w;N$U31xSkp% z?~BVAi_yFPn=<;p#<0ql;MGhX1pchP`C$+#c$Erg0|muAka>8`z!ThdrnuYS_T|dO z5gEx3XnJ=qXW#@DG?rUDscMe^GuWtUka=|GL78l4zLqcdTgt3gA$;(t1%~N}#}Ek5 zSmHdyX_+$wyxC*N^=`J=2`hgUG+2>_x6Za62�i`K*(m_XBx$HODgRr~TRfJ=Kqn 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

    k*_w`*~y#x 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 z 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

    No=~J>OlJU?_38T& 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�r%1twlJ++z= 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

    - - - Letta logo + + + Letta logo

    @@ -13,9 +13,9 @@

    - - - Letta logo + + + Letta logo

    @@ -51,7 +51,7 @@ ## ⚡ Quickstart -_The recommended way to use Letta is to run use Docker. To install Docker, see [Docker's installation guide](https://docs.docker.com/get-docker/). For issues with installing Docker, see [Docker's troubleshooting guide](https://docs.docker.com/desktop/troubleshoot-and-support/troubleshoot/). You can also install Letta using `pip` (see guide [below](#-quickstart-pip))._ +_The recommended way to use Letta is to run use Docker. To install Docker, see [Docker's installation guide](https://docs.docker.com/get-docker/). For issues with installing Docker, see [Docker's troubleshooting guide](https://docs.docker.com/desktop/troubleshoot-and-support/troubleshoot/). You can also install Letta using `pip` (see instructions [below](#-quickstart-pip))._ ### 🌖 Run the Letta server @@ -89,9 +89,9 @@ Once the Letta server is running, you can access it via port `8283` (e.g. sendin

    - - - Letta logo + + + ADE screenshot

    @@ -104,9 +104,9 @@ To connect the ADE with your local Letta server, simply:

    - - - Letta logo + + + Letta logo

    @@ -135,6 +135,18 @@ If your Letta server isn't running on `localhost` (for example, you deployed it No, you can install Letta using `pip` (via `pip install -U letta`), as well as from source (via `poetry install`). See instructions below. +> _"What's the difference between installing with `pip` vs `Docker`?"_ + +Letta gives your agents persistence (they live indefinitely) by storing all your agent data in a database. Letta is designed to be used with a [PostgreSQL](https://en.wikipedia.org/wiki/PostgreSQL) (the world's most popular database), however, it is not possible to install PostgreSQL via `pip`, so the `pip` install of Letta defaults to using [SQLite](https://www.sqlite.org/). If you have a PostgreSQL instance running on your own computer, you can still connect Letta (installed via `pip`) to PostgreSQL by setting the environment variable `LETTA_PG_URI`. + +**Database migrations are not officially supported for Letta when using SQLite**, so you would like to ensure that if you're able to upgrade to the latest Letta version and migrate your Letta agents data, make sure that you're using PostgreSQL as your Letta database backend. Full compatability table below: + +| Installation method | Start server command | Database backend | Data migrations supported? | +|---|---|---|---| +| `pip install letta` | `letta server` | SQLite | ❌ | +| `pip install letta` | `export LETTA_PG_URI=...` + `letta server` | PostgreSQL | ✅ | +| *[Install Docker](https://www.docker.com/get-started/)* |`docker run ...` ([full command](#-run-the-letta-server)) | PostgreSQL | ✅ | + > _"How do I use the ADE locally?"_ To connect the ADE to your local Letta server, simply run your Letta server (make sure you can access `localhost:8283`) and go to [https://app.letta.com](https://app.letta.com). If you would like to use the old version of the ADE (that runs on `localhost`), downgrade to Letta version `<=0.5.0`. From 36a296078ce35deb0f6b6864dc128c5cb7b070d0 Mon Sep 17 00:00:00 2001 From: mlong93 <35275280+mlong93@users.noreply.github.com> Date: Wed, 11 Dec 2024 15:14:26 -0800 Subject: [PATCH 071/280] chore: removed agent_store, storage connectors (#2229) Co-authored-by: Mindy Long --- alembic/env.py | 2 - letta/agent.py | 1 - letta/agent_store/db.py | 467 ------------------------------- letta/agent_store/milvus.py | 198 ------------- letta/agent_store/qdrant.py | 201 ------------- letta/agent_store/storage.py | 186 ------------ letta/data_sources/connectors.py | 79 +----- letta/memory.py | 277 ------------------ letta/server/server.py | 13 +- poetry.lock | 38 ++- 10 files changed, 38 insertions(+), 1424 deletions(-) delete mode 100644 letta/agent_store/db.py delete mode 100644 letta/agent_store/milvus.py delete mode 100644 letta/agent_store/qdrant.py delete mode 100644 letta/agent_store/storage.py diff --git a/alembic/env.py b/alembic/env.py index 551a21f367..767b7bbdbf 100644 --- a/alembic/env.py +++ b/alembic/env.py @@ -4,7 +4,6 @@ from sqlalchemy import engine_from_config, pool from alembic import context -from letta.agent_store.db import attach_base from letta.config import LettaConfig from letta.orm import Base from letta.settings import settings @@ -31,7 +30,6 @@ # for 'autogenerate' support # from myapp import mymodel # target_metadata = mymodel.Base.metadata -attach_base() target_metadata = Base.metadata diff --git a/letta/agent.py b/letta/agent.py index efb850e28e..98e6f9ff1e 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -8,7 +8,6 @@ from tqdm import tqdm -from letta.agent_store.storage import StorageConnector from letta.constants import ( BASE_TOOLS, CLI_WARNING_PREFIX, diff --git a/letta/agent_store/db.py b/letta/agent_store/db.py deleted file mode 100644 index 095a0e82c6..0000000000 --- a/letta/agent_store/db.py +++ /dev/null @@ -1,467 +0,0 @@ -import base64 -import json -import os -from datetime import datetime -from typing import Dict, List, Optional - -import numpy as np -from sqlalchemy import ( - BINARY, - Column, - DateTime, - Index, - String, - TypeDecorator, - and_, - asc, - desc, - or_, - select, - text, -) -from sqlalchemy.orm import mapped_column -from sqlalchemy.orm.session import close_all_sessions -from sqlalchemy.sql import func -from sqlalchemy_json import MutableJson -from tqdm import tqdm - -from letta.agent_store.storage import StorageConnector, TableType -from letta.config import LettaConfig -from letta.constants import MAX_EMBEDDING_DIM -from letta.metadata import EmbeddingConfigColumn -from letta.orm.base import Base -from letta.orm.file import FileMetadata as FileMetadataModel - -# from letta.schemas.message import Message, Passage, Record, RecordType, ToolCall -from letta.orm.passage import Passage as PassageModel -from letta.settings import settings - -config = LettaConfig() - - -class CommonVector(TypeDecorator): - """Common type for representing vectors in SQLite""" - - impl = BINARY - cache_ok = True - - def load_dialect_impl(self, dialect): - return dialect.type_descriptor(BINARY()) - - def process_bind_param(self, value, dialect): - if value is None: - return value - # Ensure value is a numpy array - if isinstance(value, list): - value = np.array(value, dtype=np.float32) - # Serialize numpy array to bytes, then encode to base64 for universal compatibility - return base64.b64encode(value.tobytes()) - - def process_result_value(self, value, dialect): - if not value: - return value - # Check database type and deserialize accordingly - if dialect.name == "sqlite": - # Decode from base64 and convert back to numpy array - value = base64.b64decode(value) - # For PostgreSQL, value is already in bytes - return np.frombuffer(value, dtype=np.float32) - -class SQLStorageConnector(StorageConnector): - def __init__(self, table_type: str, config: LettaConfig, user_id, agent_id=None): - super().__init__(table_type=table_type, config=config, user_id=user_id, agent_id=agent_id) - self.config = config - - def get_filters(self, filters: Optional[Dict] = {}): - if filters is not None: - filter_conditions = {**self.filters, **filters} - else: - filter_conditions = self.filters - all_filters = [getattr(self.db_model, key) == value for key, value in filter_conditions.items()] - return all_filters - - def get_all_paginated(self, filters: Optional[Dict] = {}, page_size: Optional[int] = 1000, offset=0): - filters = self.get_filters(filters) - while True: - # Retrieve a chunk of records with the given page_size - with self.session_maker() as session: - db_record_chunk = session.query(self.db_model).filter(*filters).offset(offset).limit(page_size).all() - - # If the chunk is empty, we've retrieved all records - if not db_record_chunk: - break - - # Yield a list of Record objects converted from the chunk - yield [record.to_record() for record in db_record_chunk] - - # Increment the offset to get the next chunk in the next iteration - offset += page_size - - def get_all_cursor( - self, - filters: Optional[Dict] = {}, - after: str = None, - before: str = None, - limit: Optional[int] = 1000, - order_by: str = "created_at", - reverse: bool = False, - ): - """Get all that returns a cursor (record.id) and records""" - filters = self.get_filters(filters) - - # generate query - with self.session_maker() as session: - query = session.query(self.db_model).filter(*filters) - # query = query.order_by(asc(self.db_model.id)) - - # records are sorted by the order_by field first, and then by the ID if two fields are the same - if reverse: - query = query.order_by(desc(getattr(self.db_model, order_by)), asc(self.db_model.id)) - else: - query = query.order_by(asc(getattr(self.db_model, order_by)), asc(self.db_model.id)) - - # cursor logic: filter records based on before/after ID - if after: - after_value = getattr(self.get(id=after), order_by) - sort_exp = getattr(self.db_model, order_by) > after_value - query = query.filter( - or_(sort_exp, and_(getattr(self.db_model, order_by) == after_value, self.db_model.id > after)) # tiebreaker case - ) - if before: - before_value = getattr(self.get(id=before), order_by) - sort_exp = getattr(self.db_model, order_by) < before_value - query = query.filter(or_(sort_exp, and_(getattr(self.db_model, order_by) == before_value, self.db_model.id < before))) - - # get records - db_record_chunk = query.limit(limit).all() - if not db_record_chunk: - return (None, []) - records = [record.to_record() for record in db_record_chunk] - next_cursor = db_record_chunk[-1].id - assert isinstance(next_cursor, str) - - # return (cursor, list[records]) - return (next_cursor, records) - - def get_all(self, filters: Optional[Dict] = {}, limit=None): - filters = self.get_filters(filters) - with self.session_maker() as session: - if limit: - db_records = session.query(self.db_model).filter(*filters).limit(limit).all() - else: - db_records = session.query(self.db_model).filter(*filters).all() - return [record.to_record() for record in db_records] - - def get(self, id: str): - with self.session_maker() as session: - db_record = session.get(self.db_model, id) - if db_record is None: - return None - return db_record.to_record() - - def size(self, filters: Optional[Dict] = {}) -> int: - # return size of table - filters = self.get_filters(filters) - with self.session_maker() as session: - return session.query(self.db_model).filter(*filters).count() - - def insert(self, record): - raise NotImplementedError - - def insert_many(self, records, show_progress=False): - raise NotImplementedError - - def query(self, query: str, query_vec: List[float], top_k: int = 10, filters: Optional[Dict] = {}): - raise NotImplementedError("Vector query not implemented for SQLStorageConnector") - - def save(self): - return - - def list_data_sources(self): - assert self.table_type == TableType.ARCHIVAL_MEMORY, f"list_data_sources only implemented for ARCHIVAL_MEMORY" - with self.session_maker() as session: - unique_data_sources = session.query(self.db_model.data_source).filter(*self.filters).distinct().all() - return unique_data_sources - - def query_date(self, start_date, end_date, limit=None, offset=0): - filters = self.get_filters({}) - with self.session_maker() as session: - query = ( - session.query(self.db_model) - .filter(*filters) - .filter(self.db_model.created_at >= start_date) - .filter(self.db_model.created_at <= end_date) - .filter(self.db_model.role != "system") - .filter(self.db_model.role != "tool") - .offset(offset) - ) - if limit: - query = query.limit(limit) - results = query.all() - return [result.to_record() for result in results] - - def query_text(self, query, limit=None, offset=0): - # todo: make fuzz https://stackoverflow.com/questions/42388956/create-a-full-text-search-index-with-sqlalchemy-on-postgresql/42390204#42390204 - filters = self.get_filters({}) - with self.session_maker() as session: - query = ( - session.query(self.db_model) - .filter(*filters) - .filter(func.lower(self.db_model.text).contains(func.lower(query))) - .filter(self.db_model.role != "system") - .filter(self.db_model.role != "tool") - .offset(offset) - ) - if limit: - query = query.limit(limit) - results = query.all() - # return [self.type(**vars(result)) for result in results] - return [result.to_record() for result in results] - - # Should be used only in tests! - def delete_table(self): - close_all_sessions() - with self.session_maker() as session: - self.db_model.__table__.drop(session.bind) - session.commit() - - def delete(self, filters: Optional[Dict] = {}): - filters = self.get_filters(filters) - with self.session_maker() as session: - session.query(self.db_model).filter(*filters).delete() - session.commit() - - -class PostgresStorageConnector(SQLStorageConnector): - """Storage via Postgres""" - - # TODO: this should probably eventually be moved into a parent DB class - - def __init__(self, table_type: str, config: LettaConfig, user_id, agent_id=None): - from pgvector.sqlalchemy import Vector - - super().__init__(table_type=table_type, config=config, user_id=user_id, agent_id=agent_id) - - # construct URI from enviornment variables - if settings.pg_uri: - self.uri = settings.pg_uri - - # use config URI - # TODO: remove this eventually (config should NOT contain URI) - if table_type == TableType.ARCHIVAL_MEMORY or table_type == TableType.PASSAGES: - self.uri = self.config.archival_storage_uri - self.db_model = PassageModel - if self.config.archival_storage_uri is None: - raise ValueError(f"Must specify archival_storage_uri in config {self.config.config_path}") - elif table_type == TableType.FILES: - self.uri = self.config.metadata_storage_uri - self.db_model = FileMetadataModel - if self.config.metadata_storage_uri is None: - raise ValueError(f"Must specify metadata_storage_uri in config {self.config.config_path}") - else: - raise ValueError(f"Table type {table_type} not implemented") - - if settings.pg_uri: - for c in self.db_model.__table__.columns: - if c.name == "embedding": - assert isinstance(c.type, Vector), f"Embedding column must be of type Vector, got {c.type}" - - from letta.server.server import db_context - - self.session_maker = db_context - - # TODO: move to DB init - if settings.pg_uri: - with self.session_maker() as session: - session.execute(text("CREATE EXTENSION IF NOT EXISTS vector")) # Enables the vector extension - - def query(self, query: str, query_vec: List[float], top_k: int = 10, filters: Optional[Dict] = {}): - filters = self.get_filters(filters) - with self.session_maker() as session: - results = session.scalars( - select(self.db_model).filter(*filters).order_by(self.db_model.embedding.l2_distance(query_vec)).limit(top_k) - ).all() - - # Convert the results into Passage objects - records = [result.to_record() for result in results] - return records - - def insert_many(self, records, exists_ok=True, show_progress=False): - # TODO: this is terrible, should eventually be done the same way for all types (migrate to SQLModel) - if len(records) == 0: - return - - added_ids = [] # avoid adding duplicates - # NOTE: this has not great performance due to the excessive commits - with self.session_maker() as session: - iterable = tqdm(records) if show_progress else records - for record in iterable: - # db_record = self.db_model(**vars(record)) - - if record.id in added_ids: - continue - - existing_record = session.query(self.db_model).filter_by(id=record.id).first() - if existing_record: - if exists_ok: - fields = record.model_dump() - fields.pop("id") - session.query(self.db_model).filter(self.db_model.id == record.id).update(fields) - print(f"Updated record with id {record.id}") - session.commit() - else: - raise ValueError(f"Record with id {record.id} already exists.") - - else: - db_record = self.db_model(**record.dict()) - session.add(db_record) - # print(f"Added record with id {record.id}") - session.commit() - - added_ids.append(record.id) - - def insert(self, record, exists_ok=True): - self.insert_many([record], exists_ok=exists_ok) - - def update(self, record): - """ - Updates a record in the database based on the provided Record object. - """ - with self.session_maker() as session: - # Find the record by its ID - db_record = session.query(self.db_model).filter_by(id=record.id).first() - if not db_record: - raise ValueError(f"Record with id {record.id} does not exist.") - - # Update the record with new values from the provided Record object - for attr, value in vars(record).items(): - setattr(db_record, attr, value) - - # Commit the changes to the database - session.commit() - - def str_to_datetime(self, str_date: str) -> datetime: - val = str_date.split("-") - _datetime = datetime(int(val[0]), int(val[1]), int(val[2])) - return _datetime - - def query_date(self, start_date, end_date, limit=None, offset=0): - filters = self.get_filters({}) - _start_date = self.str_to_datetime(start_date) if isinstance(start_date, str) else start_date - _end_date = self.str_to_datetime(end_date) if isinstance(end_date, str) else end_date - with self.session_maker() as session: - query = ( - session.query(self.db_model) - .filter(*filters) - .filter(self.db_model.created_at >= _start_date) - .filter(self.db_model.created_at <= _end_date) - .filter(self.db_model.role != "system") - .filter(self.db_model.role != "tool") - .offset(offset) - ) - if limit: - query = query.limit(limit) - results = query.all() - return [result.to_record() for result in results] - - -class SQLLiteStorageConnector(SQLStorageConnector): - def __init__(self, table_type: str, config: LettaConfig, user_id, agent_id=None): - super().__init__(table_type=table_type, config=config, user_id=user_id, agent_id=agent_id) - - # get storage URI - if table_type == TableType.ARCHIVAL_MEMORY or table_type == TableType.PASSAGES: - self.db_model = PassageModel - if settings.letta_pg_uri_no_default: - self.uri = settings.letta_pg_uri_no_default - else: - # For SQLite, use the archival storage path - self.path = config.archival_storage_path - self.uri = f"sqlite:///{os.path.join(config.archival_storage_path, 'letta.db')}" - elif table_type == TableType.FILES: - self.path = self.config.metadata_storage_path - if self.path is None: - raise ValueError(f"Must specify metadata_storage_path in config.") - self.db_model = FileMetadataModel - - else: - raise ValueError(f"Table type {table_type} not implemented") - - self.path = os.path.join(self.path, f"sqlite.db") - - from letta.server.server import db_context - - self.session_maker = db_context - - # Need this in order to allow UUIDs to be stored successfully in the sqlite database - # import sqlite3 - # import uuid - # - # sqlite3.register_adapter(uuid.UUID, lambda u: u.bytes_le) - # sqlite3.register_converter("UUID", lambda b: uuid.UUID(bytes_le=b)) - - def insert_many(self, records, exists_ok=True, show_progress=False): - # TODO: this is terrible, should eventually be done the same way for all types (migrate to SQLModel) - if len(records) == 0: - return - - added_ids = [] # avoid adding duplicates - # NOTE: this has not great performance due to the excessive commits - with self.session_maker() as session: - iterable = tqdm(records) if show_progress else records - for record in iterable: - # db_record = self.db_model(**vars(record)) - - if record.id in added_ids: - continue - - existing_record = session.query(self.db_model).filter_by(id=record.id).first() - if existing_record: - if exists_ok: - fields = record.model_dump() - fields.pop("id") - session.query(self.db_model).filter(self.db_model.id == record.id).update(fields) - session.commit() - else: - raise ValueError(f"Record with id {record.id} already exists.") - - else: - db_record = self.db_model(**record.dict()) - session.add(db_record) - session.commit() - - added_ids.append(record.id) - - def insert(self, record, exists_ok=True): - self.insert_many([record], exists_ok=exists_ok) - - def update(self, record): - """ - Updates an existing record in the database with values from the provided record object. - """ - if not record.id: - raise ValueError("Record must have an id.") - - with self.session_maker() as session: - # Fetch the existing record from the database - db_record = session.query(self.db_model).filter_by(id=record.id).first() - if not db_record: - raise ValueError(f"Record with id {record.id} does not exist.") - - # Update the database record with values from the provided record object - for column in self.db_model.__table__.columns: - column_name = column.name - if hasattr(record, column_name): - new_value = getattr(record, column_name) - setattr(db_record, column_name, new_value) - - # Commit the changes to the database - session.commit() - - -def attach_base(): - # This should be invoked in server.py to make sure Base gets initialized properly - # DO NOT REMOVE - from letta.utils import printd - - printd("Initializing database...") diff --git a/letta/agent_store/milvus.py b/letta/agent_store/milvus.py deleted file mode 100644 index cd1ce71d26..0000000000 --- a/letta/agent_store/milvus.py +++ /dev/null @@ -1,198 +0,0 @@ -import uuid -from copy import deepcopy -from typing import Dict, Iterator, List, Optional, cast - -from pymilvus import DataType, MilvusClient -from pymilvus.client.constants import ConsistencyLevel - -from letta.agent_store.storage import StorageConnector, TableType -from letta.config import LettaConfig -from letta.constants import MAX_EMBEDDING_DIM -from letta.data_types import Passage, Record, RecordType -from letta.utils import datetime_to_timestamp, printd, timestamp_to_datetime - - -class MilvusStorageConnector(StorageConnector): - """Storage via Milvus""" - - def __init__(self, table_type: str, config: LettaConfig, user_id, agent_id=None): - super().__init__(table_type=table_type, config=config, user_id=user_id, agent_id=agent_id) - - assert table_type in [TableType.ARCHIVAL_MEMORY, TableType.PASSAGES], "Milvus only supports archival memory" - if config.archival_storage_uri: - self.client = MilvusClient(uri=config.archival_storage_uri) - self._create_collection() - else: - raise ValueError("Please set `archival_storage_uri` in the config file when using Milvus.") - - # need to be converted to strings - self.uuid_fields = ["id", "user_id", "agent_id", "source_id", "file_id"] - - def _create_collection(self): - schema = MilvusClient.create_schema( - auto_id=False, - enable_dynamic_field=True, - ) - schema.add_field(field_name="id", datatype=DataType.VARCHAR, is_primary=True, max_length=65_535) - schema.add_field(field_name="text", datatype=DataType.VARCHAR, is_primary=False, max_length=65_535) - schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=MAX_EMBEDDING_DIM) - index_params = self.client.prepare_index_params() - index_params.add_index(field_name="id") - index_params.add_index(field_name="embedding", index_type="AUTOINDEX", metric_type="IP") - self.client.create_collection( - collection_name=self.table_name, schema=schema, index_params=index_params, consistency_level=ConsistencyLevel.Strong - ) - - def get_milvus_filter(self, filters: Optional[Dict] = {}) -> str: - filter_conditions = {**self.filters, **filters} if filters is not None else self.filters - if not filter_conditions: - return "" - conditions = [] - for key, value in filter_conditions.items(): - if key in self.uuid_fields or isinstance(key, str): - condition = f'({key} == "{value}")' - else: - condition = f"({key} == {value})" - conditions.append(condition) - filter_expr = " and ".join(conditions) - if len(conditions) == 1: - filter_expr = filter_expr[1:-1] - return filter_expr - - def get_all_paginated(self, filters: Optional[Dict] = {}, page_size: int = 1000) -> Iterator[List[RecordType]]: - if not self.client.has_collection(collection_name=self.table_name): - yield [] - filter_expr = self.get_milvus_filter(filters) - offset = 0 - while True: - # Retrieve a chunk of records with the given page_size - query_res = self.client.query( - collection_name=self.table_name, - filter=filter_expr, - offset=offset, - limit=page_size, - ) - if not query_res: - break - # Yield a list of Record objects converted from the chunk - yield self._list_to_records(query_res) - - # Increment the offset to get the next chunk in the next iteration - offset += page_size - - def get_all(self, filters: Optional[Dict] = {}, limit=None) -> List[RecordType]: - if not self.client.has_collection(collection_name=self.table_name): - return [] - filter_expr = self.get_milvus_filter(filters) - query_res = self.client.query( - collection_name=self.table_name, - filter=filter_expr, - limit=limit, - ) - return self._list_to_records(query_res) - - def get(self, id: str) -> Optional[RecordType]: - res = self.client.get(collection_name=self.table_name, ids=str(id)) - return self._list_to_records(res)[0] if res else None - - def size(self, filters: Optional[Dict] = {}) -> int: - if not self.client.has_collection(collection_name=self.table_name): - return 0 - filter_expr = self.get_milvus_filter(filters) - count_expr = "count(*)" - query_res = self.client.query( - collection_name=self.table_name, - filter=filter_expr, - output_fields=[count_expr], - ) - doc_num = query_res[0][count_expr] - return doc_num - - def insert(self, record: RecordType): - self.insert_many([record]) - - def insert_many(self, records: List[RecordType], show_progress=False): - if not records: - return - - # Milvus lite currently does not support upsert, so we delete and insert instead - # self.client.upsert(collection_name=self.table_name, data=self._records_to_list(records)) - ids = [str(record.id) for record in records] - self.client.delete(collection_name=self.table_name, ids=ids) - data = self._records_to_list(records) - self.client.insert(collection_name=self.table_name, data=data) - - def query(self, query: str, query_vec: List[float], top_k: int = 10, filters: Optional[Dict] = {}) -> List[RecordType]: - if not self.client.has_collection(self.table_name): - return [] - search_res = self.client.search( - collection_name=self.table_name, data=[query_vec], filter=self.get_milvus_filter(filters), limit=top_k, output_fields=["*"] - )[0] - entity_res = [res["entity"] for res in search_res] - return self._list_to_records(entity_res) - - def delete_table(self): - self.client.drop_collection(collection_name=self.table_name) - - def delete(self, filters: Optional[Dict] = {}): - if not self.client.has_collection(collection_name=self.table_name): - return - filter_expr = self.get_milvus_filter(filters) - self.client.delete(collection_name=self.table_name, filter=filter_expr) - - def save(self): - # save to persistence file (nothing needs to be done) - printd("Saving milvus") - - def _records_to_list(self, records: List[Record]) -> List[Dict]: - if records == []: - return [] - assert all(isinstance(r, Passage) for r in records) - record_list = [] - records = list(set(records)) - for record in records: - record_vars = deepcopy(vars(record)) - _id = record_vars.pop("id") - text = record_vars.pop("text", "") - embedding = record_vars.pop("embedding") - record_metadata = record_vars.pop("metadata_", None) or {} - if "created_at" in record_vars: - record_vars["created_at"] = datetime_to_timestamp(record_vars["created_at"]) - record_dict = {key: value for key, value in record_vars.items() if value is not None} - record_dict = { - **record_dict, - **record_metadata, - "id": str(_id), - "text": text, - "embedding": embedding, - } - for key, value in record_dict.items(): - if key in self.uuid_fields: - record_dict[key] = str(value) - record_list.append(record_dict) - return record_list - - def _list_to_records(self, query_res: List[Dict]) -> List[RecordType]: - records = [] - for res_dict in query_res: - _id = res_dict.pop("id") - embedding = res_dict.pop("embedding") - text = res_dict.pop("text") - metadata = deepcopy(res_dict) - for key, value in metadata.items(): - if key in self.uuid_fields: - metadata[key] = uuid.UUID(value) - elif key == "created_at": - metadata[key] = timestamp_to_datetime(value) - records.append( - cast( - RecordType, - self.type( - text=text, - embedding=embedding, - id=uuid.UUID(_id), - **metadata, - ), - ) - ) - return records diff --git a/letta/agent_store/qdrant.py b/letta/agent_store/qdrant.py deleted file mode 100644 index 2583f08576..0000000000 --- a/letta/agent_store/qdrant.py +++ /dev/null @@ -1,201 +0,0 @@ -import os -import uuid -from copy import deepcopy -from typing import Dict, Iterator, List, Optional, cast - -from letta.agent_store.storage import StorageConnector, TableType -from letta.config import LettaConfig -from letta.constants import MAX_EMBEDDING_DIM -from letta.data_types import Passage, Record, RecordType -from letta.utils import datetime_to_timestamp, timestamp_to_datetime - -TEXT_PAYLOAD_KEY = "text_content" -METADATA_PAYLOAD_KEY = "metadata" - - -class QdrantStorageConnector(StorageConnector): - """Storage via Qdrant""" - - def __init__(self, table_type: str, config: LettaConfig, user_id, agent_id=None): - super().__init__(table_type=table_type, config=config, user_id=user_id, agent_id=agent_id) - try: - from qdrant_client import QdrantClient, models - except ImportError as e: - raise ImportError("'qdrant-client' not installed. Run `pip install qdrant-client`.") from e - assert table_type in [TableType.ARCHIVAL_MEMORY, TableType.PASSAGES], "Qdrant only supports archival memory" - if config.archival_storage_uri and len(config.archival_storage_uri.split(":")) == 2: - host, port = config.archival_storage_uri.split(":") - self.qdrant_client = QdrantClient(host=host, port=port, api_key=os.getenv("QDRANT_API_KEY")) - elif config.archival_storage_path: - self.qdrant_client = QdrantClient(path=config.archival_storage_path) - else: - raise ValueError("Qdrant storage requires either a URI or a path to the storage configured") - if not self.qdrant_client.collection_exists(self.table_name): - self.qdrant_client.create_collection( - collection_name=self.table_name, - vectors_config=models.VectorParams( - size=MAX_EMBEDDING_DIM, - distance=models.Distance.COSINE, - ), - ) - self.uuid_fields = ["id", "user_id", "agent_id", "source_id", "file_id"] - - def get_all_paginated(self, filters: Optional[Dict] = {}, page_size: int = 10) -> Iterator[List[RecordType]]: - from qdrant_client import grpc - - filters = self.get_qdrant_filters(filters) - next_offset = None - stop_scrolling = False - while not stop_scrolling: - results, next_offset = self.qdrant_client.scroll( - collection_name=self.table_name, - scroll_filter=filters, - limit=page_size, - offset=next_offset, - with_payload=True, - with_vectors=True, - ) - stop_scrolling = next_offset is None or ( - isinstance(next_offset, grpc.PointId) and next_offset.num == 0 and next_offset.uuid == "" - ) - yield self.to_records(results) - - def get_all(self, filters: Optional[Dict] = {}, limit=10) -> List[RecordType]: - if self.size(filters) == 0: - return [] - filters = self.get_qdrant_filters(filters) - results, _ = self.qdrant_client.scroll( - self.table_name, - scroll_filter=filters, - limit=limit, - with_payload=True, - with_vectors=True, - ) - return self.to_records(results) - - def get(self, id: str) -> Optional[RecordType]: - results = self.qdrant_client.retrieve( - collection_name=self.table_name, - ids=[str(id)], - with_payload=True, - with_vectors=True, - ) - if not results: - return None - return self.to_records(results)[0] - - def insert(self, record: Record): - points = self.to_points([record]) - self.qdrant_client.upsert(self.table_name, points=points) - - def insert_many(self, records: List[RecordType], show_progress=False): - points = self.to_points(records) - self.qdrant_client.upsert(self.table_name, points=points) - - def delete(self, filters: Optional[Dict] = {}): - filters = self.get_qdrant_filters(filters) - self.qdrant_client.delete(self.table_name, points_selector=filters) - - def delete_table(self): - self.qdrant_client.delete_collection(self.table_name) - self.qdrant_client.close() - - def size(self, filters: Optional[Dict] = {}) -> int: - filters = self.get_qdrant_filters(filters) - return self.qdrant_client.count(collection_name=self.table_name, count_filter=filters).count - - def close(self): - self.qdrant_client.close() - - def query( - self, - query: str, - query_vec: List[float], - top_k: int = 10, - filters: Optional[Dict] = {}, - ) -> List[RecordType]: - filters = self.get_filters(filters) - results = self.qdrant_client.search( - self.table_name, - query_vector=query_vec, - query_filter=filters, - limit=top_k, - with_payload=True, - with_vectors=True, - ) - return self.to_records(results) - - def to_records(self, records: list) -> List[RecordType]: - parsed_records = [] - for record in records: - record = deepcopy(record) - metadata = record.payload[METADATA_PAYLOAD_KEY] - text = record.payload[TEXT_PAYLOAD_KEY] - _id = metadata.pop("id") - embedding = record.vector - for key, value in metadata.items(): - if key in self.uuid_fields: - metadata[key] = uuid.UUID(value) - elif key == "created_at": - metadata[key] = timestamp_to_datetime(value) - parsed_records.append( - cast( - RecordType, - self.type( - text=text, - embedding=embedding, - id=uuid.UUID(_id), - **metadata, - ), - ) - ) - return parsed_records - - def to_points(self, records: List[RecordType]): - from qdrant_client import models - - assert all(isinstance(r, Passage) for r in records) - points = [] - records = list(set(records)) - for record in records: - record = vars(record) - _id = record.pop("id") - text = record.pop("text", "") - embedding = record.pop("embedding", {}) - record_metadata = record.pop("metadata_", None) or {} - if "created_at" in record: - record["created_at"] = datetime_to_timestamp(record["created_at"]) - metadata = {key: value for key, value in record.items() if value is not None} - metadata = { - **metadata, - **record_metadata, - "id": str(_id), - } - for key, value in metadata.items(): - if key in self.uuid_fields: - metadata[key] = str(value) - points.append( - models.PointStruct( - id=str(_id), - vector=embedding, - payload={ - TEXT_PAYLOAD_KEY: text, - METADATA_PAYLOAD_KEY: metadata, - }, - ) - ) - return points - - def get_qdrant_filters(self, filters: Optional[Dict] = {}): - from qdrant_client import models - - filter_conditions = {**self.filters, **filters} if filters is not None else self.filters - must_conditions = [] - for key, value in filter_conditions.items(): - match_value = str(value) if key in self.uuid_fields else value - field_condition = models.FieldCondition( - key=f"{METADATA_PAYLOAD_KEY}.{key}", - match=models.MatchValue(value=match_value), - ) - must_conditions.append(field_condition) - return models.Filter(must=must_conditions) diff --git a/letta/agent_store/storage.py b/letta/agent_store/storage.py deleted file mode 100644 index a7166d87f2..0000000000 --- a/letta/agent_store/storage.py +++ /dev/null @@ -1,186 +0,0 @@ -""" These classes define storage connectors. - -We originally tried to use Llama Index VectorIndex, but their limited API was extremely problematic. -""" - -import uuid -from abc import abstractmethod -from typing import Dict, List, Optional, Tuple, Type, Union - -from pydantic import BaseModel - -from letta.config import LettaConfig -from letta.schemas.file import FileMetadata -from letta.schemas.message import Message -from letta.schemas.passage import Passage -from letta.utils import printd - - -# ENUM representing table types in Letta -# each table corresponds to a different table schema (specified in data_types.py) -class TableType: - ARCHIVAL_MEMORY = "archival_memory" # recall memory table: letta_agent_{agent_id} - RECALL_MEMORY = "recall_memory" # archival memory table: letta_agent_recall_{agent_id} - PASSAGES = "passages" # TODO - FILES = "files" - - -# table names used by Letta - -# agent tables -RECALL_TABLE_NAME = "letta_recall_memory_agent" # agent memory -ARCHIVAL_TABLE_NAME = "letta_archival_memory_agent" # agent memory - -# external data source tables -PASSAGE_TABLE_NAME = "letta_passages" # chunked/embedded passages (from source) -FILE_TABLE_NAME = "letta_files" # original files (from source) - - -class StorageConnector: - """Defines a DB connection that is user-specific to access data: files, Passages, Archival/Recall Memory""" - - type: Type[BaseModel] - - def __init__( - self, - table_type: Union[TableType.ARCHIVAL_MEMORY, TableType.RECALL_MEMORY, TableType.PASSAGES, TableType.FILES], - config: LettaConfig, - user_id: str, - agent_id: Optional[str] = None, - organization_id: Optional[str] = None, - ): - self.user_id = user_id - self.agent_id = agent_id - self.organization_id = organization_id - self.table_type = table_type - - # get object type - if table_type == TableType.ARCHIVAL_MEMORY: - self.type = Passage - self.table_name = ARCHIVAL_TABLE_NAME - elif table_type == TableType.RECALL_MEMORY: - self.type = Message - self.table_name = RECALL_TABLE_NAME - elif table_type == TableType.FILES: - self.type = FileMetadata - self.table_name = FILE_TABLE_NAME - elif table_type == TableType.PASSAGES: - self.type = Passage - self.table_name = PASSAGE_TABLE_NAME - else: - raise ValueError(f"Table type {table_type} not implemented") - printd(f"Using table name {self.table_name}") - - # setup base filters for agent-specific tables - if self.table_type == TableType.ARCHIVAL_MEMORY or self.table_type == TableType.RECALL_MEMORY: - # agent-specific table - assert agent_id is not None, "Agent ID must be provided for agent-specific tables" - self.filters = {"user_id": self.user_id, "agent_id": self.agent_id} - elif self.table_type == TableType.FILES: - # setup base filters for user-specific tables - assert agent_id is None, "Agent ID must not be provided for user-specific tables" - self.filters = {"user_id": self.user_id} - elif self.table_type == TableType.PASSAGES: - self.filters = {"organization_id": self.organization_id} - else: - raise ValueError(f"Table type {table_type} not implemented") - - @staticmethod - def get_storage_connector( - table_type: Union[TableType.ARCHIVAL_MEMORY, TableType.RECALL_MEMORY, TableType.PASSAGES, TableType.FILES], - config: LettaConfig, - user_id: str, - organization_id: Optional[str] = None, - agent_id: Optional[str] = None, - ): - if table_type == TableType.ARCHIVAL_MEMORY or table_type == TableType.PASSAGES: - storage_type = config.archival_storage_type - elif table_type == TableType.RECALL_MEMORY: - storage_type = config.recall_storage_type - elif table_type == TableType.FILES: - storage_type = config.metadata_storage_type - else: - raise ValueError(f"Table type {table_type} not implemented") - - if storage_type == "postgres": - from letta.agent_store.db import PostgresStorageConnector - - return PostgresStorageConnector(table_type, config, user_id, agent_id) - - elif storage_type == "qdrant": - from letta.agent_store.qdrant import QdrantStorageConnector - - return QdrantStorageConnector(table_type, config, user_id, agent_id) - - elif storage_type == "sqlite": - from letta.agent_store.db import SQLLiteStorageConnector - - return SQLLiteStorageConnector(table_type, config, user_id, agent_id) - elif storage_type == "milvus": - from letta.agent_store.milvus import MilvusStorageConnector - - return MilvusStorageConnector(table_type, config, user_id, agent_id) - else: - raise NotImplementedError(f"Storage type {storage_type} not implemented") - - @staticmethod - def get_archival_storage_connector(user_id, agent_id): - config = LettaConfig.load() - return StorageConnector.get_storage_connector(TableType.ARCHIVAL_MEMORY, config, user_id, agent_id) - - @staticmethod - def get_recall_storage_connector(user_id, agent_id): - config = LettaConfig.load() - return StorageConnector.get_storage_connector(TableType.RECALL_MEMORY, config, user_id, agent_id) - - @abstractmethod - def get_filters(self, filters: Optional[Dict] = {}) -> Union[Tuple[list, dict], dict]: - pass - - @abstractmethod - def get_all_paginated(self, filters: Optional[Dict] = {}, page_size: int = 1000): - pass - - @abstractmethod - def get_all(self, filters: Optional[Dict] = {}, limit=10): - pass - - @abstractmethod - def get(self, id: uuid.UUID): - pass - - @abstractmethod - def size(self, filters: Optional[Dict] = {}) -> int: - pass - - @abstractmethod - def insert(self, record): - pass - - @abstractmethod - def insert_many(self, records, show_progress=False): - pass - - @abstractmethod - def query(self, query: str, query_vec: List[float], top_k: int = 10, filters: Optional[Dict] = {}): - pass - - @abstractmethod - def query_date(self, start_date, end_date): - pass - - @abstractmethod - def query_text(self, query): - pass - - @abstractmethod - def delete_table(self): - pass - - @abstractmethod - def delete(self, filters: Optional[Dict] = {}): - pass - - @abstractmethod - def save(self): - pass diff --git a/letta/data_sources/connectors.py b/letta/data_sources/connectors.py index 6316863c01..741e46a917 100644 --- a/letta/data_sources/connectors.py +++ b/letta/data_sources/connectors.py @@ -2,7 +2,6 @@ import typer -from letta.agent_store.storage import StorageConnector from letta.data_sources.connectors_helper import ( assert_all_files_exist_locally, extract_metadata_from_files, @@ -12,6 +11,7 @@ from letta.schemas.file import FileMetadata from letta.schemas.passage import Passage from letta.schemas.source import Source +from letta.services.passage_manager import PassageManager from letta.services.source_manager import SourceManager from letta.utils import create_uuid_from_string @@ -42,7 +42,7 @@ def generate_passages(self, file: FileMetadata, chunk_size: int = 1024) -> Itera """ -def load_data(connector: DataConnector, source: Source, passage_store: StorageConnector, source_manager: SourceManager, actor: "User", agent_id: Optional[str] = None): +def load_data(connector: DataConnector, source: Source, passage_manager: PassageManager, source_manager: SourceManager, actor: "User", agent_id: Optional[str] = None): """Load data from a connector (generates file and passages) into a specified source_id, associated with a user_id.""" embedding_config = source.embedding_config @@ -103,14 +103,14 @@ def load_data(connector: DataConnector, source: Source, passage_store: StorageCo embedding_to_document_name[hashable_embedding] = file_name if len(passages) >= 100: # insert passages into passage store - passage_store.insert_many(passages) + passage_manager.create_many_passages(passages, actor) passage_count += len(passages) passages = [] if len(passages) > 0: # insert passages into passage store - passage_store.insert_many(passages) + passage_manager.create_many_passages(passages, actor) passage_count += len(passages) return passage_count, file_count @@ -170,74 +170,3 @@ def generate_passages(self, file: FileMetadata, chunk_size: int = 1024) -> Itera nodes = parser.get_nodes_from_documents(documents) for node in nodes: yield node.text, None - - -""" -The below isn't used anywhere, it isn't tested, and pretty much should be deleted. -- Matt -""" -# class WebConnector(DirectoryConnector): -# def __init__(self, urls: List[str] = None, html_to_text: bool = True): -# self.urls = urls -# self.html_to_text = html_to_text -# -# def generate_files(self) -> Iterator[Tuple[str, Dict]]: # -> Iterator[Document]: -# from llama_index.readers.web import SimpleWebPageReader -# -# files = SimpleWebPageReader(html_to_text=self.html_to_text).load_data(self.urls) -# for document in files: -# yield document.text, {"url": document.id_} -# -# -# class VectorDBConnector(DataConnector): -# # NOTE: this class has not been properly tested, so is unlikely to work -# # TODO: allow loading multiple tables (1:1 mapping between FileMetadata and Table) -# -# def __init__( -# self, -# name: str, -# uri: str, -# table_name: str, -# text_column: str, -# embedding_column: str, -# embedding_dim: int, -# ): -# self.name = name -# self.uri = uri -# self.table_name = table_name -# self.text_column = text_column -# self.embedding_column = embedding_column -# self.embedding_dim = embedding_dim -# -# # connect to db table -# from sqlalchemy import create_engine -# -# self.engine = create_engine(uri) -# -# def generate_files(self) -> Iterator[Tuple[str, Dict]]: # -> Iterator[Document]: -# yield self.table_name, None -# -# def generate_passages(self, file_text: str, file: FileMetadata, chunk_size: int = 1024) -> Iterator[Tuple[str, Dict]]: # -> Iterator[Passage]: -# from pgvector.sqlalchemy import Vector -# from sqlalchemy import Inspector, MetaData, Table, select -# -# metadata = MetaData() -# # Create an inspector to inspect the database -# inspector = Inspector.from_engine(self.engine) -# table_names = inspector.get_table_names() -# assert self.table_name in table_names, f"Table {self.table_name} not found in database: tables that exist {table_names}." -# -# table = Table(self.table_name, metadata, autoload_with=self.engine) -# -# # Prepare a select statement -# select_statement = select(table.c[self.text_column], table.c[self.embedding_column].cast(Vector(self.embedding_dim))) -# -# # Execute the query and fetch the results -# # TODO: paginate results -# with self.engine.connect() as connection: -# result = connection.execute(select_statement).fetchall() -# -# for text, embedding in result: -# # assume that embeddings are the same model as in config -# # TODO: don't re-compute embedding -# yield text, {"embedding": embedding} diff --git a/letta/memory.py b/letta/memory.py index 8325de316f..081c59d584 100644 --- a/letta/memory.py +++ b/letta/memory.py @@ -87,280 +87,3 @@ def summarize_messages( printd(f"summarize_messages gpt reply: {response.choices[0]}") reply = response.choices[0].message.content return reply - - -class ArchivalMemory(ABC): - @abstractmethod - def insert(self, memory_string: str): - """Insert new archival memory - - :param memory_string: Memory string to insert - :type memory_string: str - """ - - @abstractmethod - def search(self, query_string, count=None, start=None) -> Tuple[List[str], int]: - """Search archival memory - - :param query_string: Query string - :type query_string: str - :param count: Number of results to return (None for all) - :type count: Optional[int] - :param start: Offset to start returning results from (None if 0) - :type start: Optional[int] - - :return: Tuple of (list of results, total number of results) - """ - - @abstractmethod - def compile(self) -> str: - """Convert archival memory into a string representation for a prompt""" - - @abstractmethod - def count(self) -> int: - """Count the number of memories in the archival memory""" - - -class RecallMemory(ABC): - @abstractmethod - def text_search(self, query_string, count=None, start=None): - """Search messages that match query_string in recall memory""" - - @abstractmethod - def date_search(self, start_date, end_date, count=None, start=None): - """Search messages between start_date and end_date in recall memory""" - - @abstractmethod - def compile(self) -> str: - """Convert recall memory into a string representation for a prompt""" - - @abstractmethod - def count(self) -> int: - """Count the number of memories in the recall memory""" - - @abstractmethod - def insert(self, message: Message): - """Insert message into recall memory""" - - -class DummyRecallMemory(RecallMemory): - """Dummy in-memory version of a recall memory database (eg run on MongoDB) - - Recall memory here is basically just a full conversation history with the user. - Queryable via string matching, or date matching. - - Recall Memory: The AI's capability to search through past interactions, - effectively allowing it to 'remember' prior engagements with a user. - """ - - def __init__(self, message_database=None, restrict_search_to_summaries=False): - self._message_logs = [] if message_database is None else message_database # consists of full message dicts - - # If true, the pool of messages that can be queried are the automated summaries only - # (generated when the conversation window needs to be shortened) - self.restrict_search_to_summaries = restrict_search_to_summaries - - def __len__(self): - return len(self._message_logs) - - def count(self) -> int: - return len(self) - - def compile(self) -> str: - # don't dump all the conversations, just statistics - system_count = user_count = assistant_count = function_count = other_count = 0 - for msg in self._message_logs: - role = msg["message"]["role"] - if role == "system": - system_count += 1 - elif role == "user": - user_count += 1 - elif role == "assistant": - assistant_count += 1 - elif role == "function": - function_count += 1 - else: - other_count += 1 - memory_str = ( - f"Statistics:" - + f"\n{len(self._message_logs)} total messages" - + f"\n{system_count} system" - + f"\n{user_count} user" - + f"\n{assistant_count} assistant" - + f"\n{function_count} function" - + f"\n{other_count} other" - ) - return f"\n### RECALL MEMORY ###" + f"\n{memory_str}" - - def insert(self, message): - raise NotImplementedError("This should be handled by the PersistenceManager, recall memory is just a search layer on top") - - def text_search(self, query_string, count=None, start=None): - # in the dummy version, run an (inefficient) case-insensitive match search - message_pool = [d for d in self._message_logs if d["message"]["role"] not in ["system", "function"]] - start = 0 if start is None else int(start) - count = 0 if count is None else int(count) - - printd( - f"recall_memory.text_search: searching for {query_string} (c={count}, s={start}) in {len(self._message_logs)} total messages" - ) - matches = [ - d for d in message_pool if d["message"]["content"] is not None and query_string.lower() in d["message"]["content"].lower() - ] - printd(f"recall_memory - matches:\n{matches[start:start+count]}") - - # start/count support paging through results - if start is not None and count is not None: - return matches[start : start + count], len(matches) - elif start is None and count is not None: - return matches[:count], len(matches) - elif start is not None and count is None: - return matches[start:], len(matches) - else: - return matches, len(matches) - - def date_search(self, start_date, end_date, count=None, start=None): - message_pool = [d for d in self._message_logs if d["message"]["role"] not in ["system", "function"]] - - # First, validate the start_date and end_date format - if not validate_date_format(start_date) or not validate_date_format(end_date): - raise ValueError("Invalid date format. Expected format: YYYY-MM-DD") - - # Convert dates to datetime objects for comparison - start_date_dt = datetime.datetime.strptime(start_date, "%Y-%m-%d") - end_date_dt = datetime.datetime.strptime(end_date, "%Y-%m-%d") - - # Next, match items inside self._message_logs - matches = [ - d - for d in message_pool - if start_date_dt <= datetime.datetime.strptime(extract_date_from_timestamp(d["timestamp"]), "%Y-%m-%d") <= end_date_dt - ] - - # start/count support paging through results - start = 0 if start is None else int(start) - count = 0 if count is None else int(count) - if start is not None and count is not None: - return matches[start : start + count], len(matches) - elif start is None and count is not None: - return matches[:count], len(matches) - elif start is not None and count is None: - return matches[start:], len(matches) - else: - return matches, len(matches) - - -class EmbeddingArchivalMemory(ArchivalMemory): - """Archival memory with embedding based search""" - - def __init__(self, agent_state: AgentState, top_k: int = 100): - """Init function for archival memory - - :param archival_memory_database: name of dataset to pre-fill archival with - :type archival_memory_database: str - """ - from letta.agent_store.storage import StorageConnector - - self.top_k = top_k - self.agent_state = agent_state - - # create embedding model - self.embed_model = embedding_model(agent_state.embedding_config) - if agent_state.embedding_config.embedding_chunk_size is None: - raise ValueError(f"Must set {agent_state.embedding_config.embedding_chunk_size}") - else: - self.embedding_chunk_size = agent_state.embedding_config.embedding_chunk_size - - # create storage backend - self.storage = StorageConnector.get_archival_storage_connector(user_id=agent_state.user_id, agent_id=agent_state.id) - # TODO: have some mechanism for cleanup otherwise will lead to OOM - self.cache = {} - - def create_passage(self, text, embedding): - return Passage( - user_id=self.agent_state.user_id, - agent_id=self.agent_state.id, - text=text, - embedding=embedding, - embedding_config=self.agent_state.embedding_config, - ) - - def save(self): - """Save the index to disk""" - self.storage.save() - - def insert(self, memory_string, return_ids=False) -> Union[bool, List[str]]: - """Embed and save memory string""" - - if not isinstance(memory_string, str): - raise TypeError("memory must be a string") - - try: - passages = [] - - # breakup string into passages - for text in parse_and_chunk_text(memory_string, self.embedding_chunk_size): - embedding = self.embed_model.get_text_embedding(text) - # fixing weird bug where type returned isn't a list, but instead is an object - # eg: embedding={'object': 'list', 'data': [{'object': 'embedding', 'embedding': [-0.0071973633, -0.07893023, - if isinstance(embedding, dict): - try: - embedding = embedding["data"][0]["embedding"] - except (KeyError, IndexError): - # TODO as a fallback, see if we can find any lists in the payload - raise TypeError( - f"Got back an unexpected payload from text embedding function, type={type(embedding)}, value={embedding}" - ) - passages.append(self.create_passage(text, embedding)) - - # grab the return IDs before the list gets modified - ids = [str(p.id) for p in passages] - - # insert passages - self.storage.insert_many(passages) - - if return_ids: - return ids - else: - return True - - except Exception as e: - print("Archival insert error", e) - raise e - - def search(self, query_string, count=None, start=None): - """Search query string""" - start = 0 if start is None else int(start) - count = self.top_k if count is None else int(count) - - if not isinstance(query_string, str): - return TypeError("query must be a string") - - try: - if query_string not in self.cache: - # self.cache[query_string] = self.retriever.retrieve(query_string) - query_vec = query_embedding(self.embed_model, query_string) - self.cache[query_string] = self.storage.query(query_string, query_vec, top_k=self.top_k) - - end = min(count + start, len(self.cache[query_string])) - - results = self.cache[query_string][start:end] - results = [{"timestamp": get_local_time(), "content": node.text} for node in results] - return results, len(results) - except Exception as e: - print("Archival search error", e) - raise e - - def compile(self) -> str: - limit = 10 - passages = [] - for passage in list(self.storage.get_all(limit=limit)): # TODO: only get first 10 - passages.append(str(passage.text)) - memory_str = "\n".join(passages) - return f"\n### ARCHIVAL MEMORY ###" + f"\n{memory_str}" + f"\nSize: {self.storage.size()}" - - def __len__(self): - return self.storage.size() - - def count(self) -> int: - return len(self) diff --git a/letta/server/server.py b/letta/server/server.py index 8f87e611a0..30751c3cbc 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -16,7 +16,6 @@ import letta.server.utils as server_utils import letta.system as system from letta.agent import Agent, save_agent -from letta.agent_store.storage import StorageConnector, TableType from letta.chat_only_agent import ChatOnlyAgent from letta.credentials import LettaCredentials from letta.data_sources.connectors import DataConnector, load_data @@ -558,7 +557,6 @@ def _command(self, user_id: str, agent_id: str, command: str) -> LettaUsageStati raise ValueError(command) # attach data to agent from source - source_connector = StorageConnector.get_storage_connector(TableType.PASSAGES, self.config, user_id=user_id) letta_agent.attach_source( user=self.user_manager.get_user_by_id(user_id=user_id), source_id=data_source, @@ -1571,8 +1569,7 @@ def delete_source(self, source_id: str, actor: PydanticUser): self.source_manager.delete_source(source_id=source_id, actor=actor) # delete data from passage store - passage_store = StorageConnector.get_storage_connector(TableType.PASSAGES, self.config, user_id=actor.id) - passage_store.delete({"source_id": source_id}) + self.passage_manager.delete_passages(actor=actor, limit=None, source_id=source_id) # TODO: delete data from agent passage stores (?) @@ -1614,11 +1611,8 @@ def load_data( if source is None: raise ValueError(f"Data source {source_name} does not exist for user {user_id}") - # get the data connectors - passage_store = StorageConnector.get_storage_connector(TableType.PASSAGES, self.config, user_id=user_id) - # load data into the document store - passage_count, document_count = load_data(connector, source, passage_store, self.source_manager, actor=user, agent_id=agent_id) + passage_count, document_count = load_data(connector, source, self.passage_manager, self.source_manager, actor=user, agent_id=agent_id) return passage_count, document_count def attach_source_to_agent( @@ -1694,8 +1688,7 @@ def list_all_sources(self, actor: PydanticUser) -> List[Source]: for source in sources: # count number of passages - passage_conn = StorageConnector.get_storage_connector(TableType.PASSAGES, self.config, user_id=actor.id) - num_passages = passage_conn.size({"source_id": source.id}) + num_passages = self.passage_manager.size(actor=actor, source_id=source.id) # TODO: add when files table implemented ## count number of files diff --git a/poetry.lock b/poetry.lock index dda0b0bac7..9130cc158c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -905,13 +905,37 @@ vision = ["Pillow (>=9.4.0)"] [[package]] name = "debugpy" -version = "1.8.10" +version = "1.8.9" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.10-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:97aa00af95983887806e06f37e144909d35215d66db74f8b0e9799b4eef40cfd"}, - {file = "debugpy-1.8.10.tar.gz", hash = "sha256:ee4ed903cbeb14ee1839549f953af519ffa512598ec987b2051f9c868e2249a8"}, + {file = "debugpy-1.8.9-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:cfe1e6c6ad7178265f74981edf1154ffce97b69005212fbc90ca22ddfe3d017e"}, + {file = "debugpy-1.8.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada7fb65102a4d2c9ab62e8908e9e9f12aed9d76ef44880367bc9308ebe49a0f"}, + {file = "debugpy-1.8.9-cp310-cp310-win32.whl", hash = "sha256:c36856343cbaa448171cba62a721531e10e7ffb0abff838004701454149bc037"}, + {file = "debugpy-1.8.9-cp310-cp310-win_amd64.whl", hash = "sha256:17c5e0297678442511cf00a745c9709e928ea4ca263d764e90d233208889a19e"}, + {file = "debugpy-1.8.9-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:b74a49753e21e33e7cf030883a92fa607bddc4ede1aa4145172debc637780040"}, + {file = "debugpy-1.8.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62d22dacdb0e296966d7d74a7141aaab4bec123fa43d1a35ddcb39bf9fd29d70"}, + {file = "debugpy-1.8.9-cp311-cp311-win32.whl", hash = "sha256:8138efff315cd09b8dcd14226a21afda4ca582284bf4215126d87342bba1cc66"}, + {file = "debugpy-1.8.9-cp311-cp311-win_amd64.whl", hash = "sha256:ff54ef77ad9f5c425398efb150239f6fe8e20c53ae2f68367eba7ece1e96226d"}, + {file = "debugpy-1.8.9-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:957363d9a7a6612a37458d9a15e72d03a635047f946e5fceee74b50d52a9c8e2"}, + {file = "debugpy-1.8.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e565fc54b680292b418bb809f1386f17081d1346dca9a871bf69a8ac4071afe"}, + {file = "debugpy-1.8.9-cp312-cp312-win32.whl", hash = "sha256:3e59842d6c4569c65ceb3751075ff8d7e6a6ada209ceca6308c9bde932bcef11"}, + {file = "debugpy-1.8.9-cp312-cp312-win_amd64.whl", hash = "sha256:66eeae42f3137eb428ea3a86d4a55f28da9bd5a4a3d369ba95ecc3a92c1bba53"}, + {file = "debugpy-1.8.9-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:957ecffff80d47cafa9b6545de9e016ae8c9547c98a538ee96ab5947115fb3dd"}, + {file = "debugpy-1.8.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1efbb3ff61487e2c16b3e033bc8595aea578222c08aaf3c4bf0f93fadbd662ee"}, + {file = "debugpy-1.8.9-cp313-cp313-win32.whl", hash = "sha256:7c4d65d03bee875bcb211c76c1d8f10f600c305dbd734beaed4077e902606fee"}, + {file = "debugpy-1.8.9-cp313-cp313-win_amd64.whl", hash = "sha256:e46b420dc1bea64e5bbedd678148be512442bc589b0111bd799367cde051e71a"}, + {file = "debugpy-1.8.9-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:472a3994999fe6c0756945ffa359e9e7e2d690fb55d251639d07208dbc37caea"}, + {file = "debugpy-1.8.9-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:365e556a4772d7d0d151d7eb0e77ec4db03bcd95f26b67b15742b88cacff88e9"}, + {file = "debugpy-1.8.9-cp38-cp38-win32.whl", hash = "sha256:54a7e6d3014c408eb37b0b06021366ee985f1539e12fe49ca2ee0d392d9ceca5"}, + {file = "debugpy-1.8.9-cp38-cp38-win_amd64.whl", hash = "sha256:8e99c0b1cc7bf86d83fb95d5ccdc4ad0586d4432d489d1f54e4055bcc795f693"}, + {file = "debugpy-1.8.9-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:7e8b079323a56f719977fde9d8115590cb5e7a1cba2fcee0986ef8817116e7c1"}, + {file = "debugpy-1.8.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6953b335b804a41f16a192fa2e7851bdcfd92173cbb2f9f777bb934f49baab65"}, + {file = "debugpy-1.8.9-cp39-cp39-win32.whl", hash = "sha256:7e646e62d4602bb8956db88b1e72fe63172148c1e25c041e03b103a25f36673c"}, + {file = "debugpy-1.8.9-cp39-cp39-win_amd64.whl", hash = "sha256:3d9755e77a2d680ce3d2c5394a444cf42be4a592caaf246dbfbdd100ffcf7ae5"}, + {file = "debugpy-1.8.9-py2.py3-none-any.whl", hash = "sha256:cc37a6c9987ad743d9c3a14fa1b1a14b7e4e6041f9dd0c8abf8895fe7a97b899"}, + {file = "debugpy-1.8.9.zip", hash = "sha256:1339e14c7d980407248f09824d1b25ff5c5616651689f1e0f0e51bdead3ea13e"}, ] [[package]] @@ -2633,13 +2657,13 @@ query-tools = ["guidance (>=0.0.64,<0.0.65)", "jsonpath-ng (>=1.6.0,<2.0.0)", "l [[package]] name = "llama-index-llms-openai" -version = "0.3.8" +version = "0.3.9" description = "llama-index llms openai integration" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "llama_index_llms_openai-0.3.8-py3-none-any.whl", hash = "sha256:b6d507adcb735f0fc0cd38856411112250a6625971257666a77e496b96cec3ca"}, - {file = "llama_index_llms_openai-0.3.8.tar.gz", hash = "sha256:784865a3ef121bbf1cebc30159df8de3872297a8aa48631f4a785a7d38e2bd6e"}, + {file = "llama_index_llms_openai-0.3.9-py3-none-any.whl", hash = "sha256:a237a6cfffa5169893e12b77a402874ed70bef2f5fecc96927907afee57361d2"}, + {file = "llama_index_llms_openai-0.3.9.tar.gz", hash = "sha256:ff62cab778456dfdd32bd558d43d958a67f265678f1ef039eb2cac84a1055944"}, ] [package.dependencies] @@ -6222,4 +6246,4 @@ tests = ["wikipedia"] [metadata] lock-version = "2.0" python-versions = "<4.0,>=3.10" -content-hash = "9c623c4d8c98b3fe724518428bb48ae85f8152453f200f767e13f48c59e0fe13" +content-hash = "9c623c4d8c98b3fe724518428bb48ae85f8152453f200f767e13f48c59e0fe13" \ No newline at end of file From 5c7354be38fe7ab860e5299466077424030f233c Mon Sep 17 00:00:00 2001 From: ali sayyah Date: Thu, 12 Dec 2024 02:45:17 +0330 Subject: [PATCH 072/280] ignore extra variables in env files (#2226) --- letta/settings.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/letta/settings.py b/letta/settings.py index 41aca91d00..8da6b3aaca 100644 --- a/letta/settings.py +++ b/letta/settings.py @@ -17,7 +17,7 @@ class ToolSettings(BaseSettings): class ModelSettings(BaseSettings): - model_config = SettingsConfigDict(env_file='.env') + model_config = SettingsConfigDict(env_file='.env', extra='ignore') # env_prefix='my_prefix_' @@ -64,7 +64,7 @@ class ModelSettings(BaseSettings): class Settings(BaseSettings): - model_config = SettingsConfigDict(env_prefix="letta_") + model_config = SettingsConfigDict(env_prefix="letta_", extra='ignore') letta_dir: Optional[Path] = Field(Path.home() / ".letta", env="LETTA_DIR") debug: Optional[bool] = False @@ -103,7 +103,7 @@ def letta_pg_uri_no_default(self) -> str: class TestSettings(Settings): - model_config = SettingsConfigDict(env_prefix="letta_test_") + model_config = SettingsConfigDict(env_prefix="letta_test_", extra='ignore') letta_dir: Optional[Path] = Field(Path.home() / ".letta/test", env="LETTA_TEST_DIR") From c4d227c7240d3c8d9fe061d2cbdef8341a002ed9 Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Wed, 11 Dec 2024 16:31:00 -0800 Subject: [PATCH 073/280] feat: catch error with providers in model listing (#2231) --- letta/server/server.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/letta/server/server.py b/letta/server/server.py index 30751c3cbc..6dd8d65ba6 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -1612,7 +1612,9 @@ def load_data( raise ValueError(f"Data source {source_name} does not exist for user {user_id}") # load data into the document store - passage_count, document_count = load_data(connector, source, self.passage_manager, self.source_manager, actor=user, agent_id=agent_id) + passage_count, document_count = load_data( + connector, source, self.passage_manager, self.source_manager, actor=user, agent_id=agent_id + ) return passage_count, document_count def attach_source_to_agent( @@ -1799,14 +1801,20 @@ def list_llm_models(self) -> List[LLMConfig]: llm_models = [] for provider in self._enabled_providers: - llm_models.extend(provider.list_llm_models()) + try: + llm_models.extend(provider.list_llm_models()) + except Exception as e: + warnings.warn(f"An error occurred while listing LLM models for provider {provider}: {e}") return llm_models def list_embedding_models(self) -> List[EmbeddingConfig]: """List available embedding models""" embedding_models = [] for provider in self._enabled_providers: - embedding_models.extend(provider.list_embedding_models()) + try: + embedding_models.extend(provider.list_embedding_models()) + except Exception as e: + warnings.warn(f"An error occurred while listing embedding models for provider {provider}: {e}") return embedding_models def add_llm_model(self, request: LLMConfig) -> LLMConfig: From c0d99baa675f16a739548f926d1129f696fb7175 Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Wed, 11 Dec 2024 16:31:52 -0800 Subject: [PATCH 074/280] chore: set `Dockerfile` to use Python 3.12 (#2230) --- Dockerfile | 70 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 57 insertions(+), 13 deletions(-) diff --git a/Dockerfile b/Dockerfile index 42ee3d37ba..553b0b670e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,17 +1,37 @@ # Start with pgvector base for builder FROM ankane/pgvector:v0.5.1 AS builder -# Install Python and required packages +# Install dependencies and Python 3.12 RUN apt-get update && apt-get install -y \ - python3 \ - python3-venv \ - python3-pip \ - python3-full \ + wget \ build-essential \ + libssl-dev \ + zlib1g-dev \ + libncurses5-dev \ + libncursesw5-dev \ + libreadline-dev \ + libsqlite3-dev \ + libgdbm-dev \ + libdb5.3-dev \ + libbz2-dev \ + libexpat1-dev \ + liblzma-dev \ + libffi-dev \ libpq-dev \ - python3-dev \ && rm -rf /var/lib/apt/lists/* +# Download and install Python 3.12 +RUN wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz \ + && tar xzf Python-3.12.0.tgz \ + && cd Python-3.12.0 \ + && ./configure --enable-optimizations \ + && make -j $(nproc) \ + && make altinstall \ + && cd .. \ + && rm -rf Python-3.12.0 Python-3.12.0.tgz \ + && ln -s /usr/local/bin/python3.12 /usr/local/bin/python3 \ + && ln -s /usr/local/bin/pip3.12 /usr/local/bin/pip3 + ARG LETTA_ENVIRONMENT=PRODUCTION ENV LETTA_ENVIRONMENT=${LETTA_ENVIRONMENT} \ POETRY_NO_INTERACTION=1 \ @@ -22,14 +42,15 @@ ENV LETTA_ENVIRONMENT=${LETTA_ENVIRONMENT} \ WORKDIR /app # Create and activate virtual environment -RUN python3 -m venv /opt/venv +RUN python3.12 -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" -# Now install poetry in the virtual environment -RUN pip install --no-cache-dir poetry==1.8.2 +# Install poetry in the virtual environment +RUN pip3 install --no-cache-dir poetry==1.8.2 # Copy dependency files first COPY pyproject.toml poetry.lock ./ + # Then copy the rest of the application code COPY . . @@ -40,11 +61,34 @@ RUN poetry lock --no-update && \ # Runtime stage FROM ankane/pgvector:v0.5.1 AS runtime -# Install Python packages +# Install Python 3.12 dependencies in runtime stage RUN apt-get update && apt-get install -y \ - python3 \ - python3-venv \ - && rm -rf /var/lib/apt/lists/* \ + wget \ + build-essential \ + libssl-dev \ + zlib1g-dev \ + libncurses5-dev \ + libncursesw5-dev \ + libreadline-dev \ + libsqlite3-dev \ + libgdbm-dev \ + libdb5.3-dev \ + libbz2-dev \ + libexpat1-dev \ + liblzma-dev \ + libffi-dev \ + && rm -rf /var/lib/apt/lists/* + +# Install Python 3.12 in runtime stage +RUN wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz \ + && tar xzf Python-3.12.0.tgz \ + && cd Python-3.12.0 \ + && ./configure --enable-optimizations \ + && make -j $(nproc) \ + && make altinstall \ + && cd .. \ + && rm -rf Python-3.12.0 Python-3.12.0.tgz \ + && ln -s /usr/local/bin/python3.12 /usr/local/bin/python3 \ && mkdir -p /app ARG LETTA_ENVIRONMENT=PRODUCTION From 6970a01cbc653b6d2cf30a984bc00ce08347cefd Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Wed, 11 Dec 2024 19:54:04 -0800 Subject: [PATCH 075/280] Revert "chore: set `Dockerfile` to use Python 3.12 " (#2236) --- Dockerfile | 70 ++++++++++-------------------------------------------- 1 file changed, 13 insertions(+), 57 deletions(-) diff --git a/Dockerfile b/Dockerfile index 553b0b670e..42ee3d37ba 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,37 +1,17 @@ # Start with pgvector base for builder FROM ankane/pgvector:v0.5.1 AS builder -# Install dependencies and Python 3.12 +# Install Python and required packages RUN apt-get update && apt-get install -y \ - wget \ + python3 \ + python3-venv \ + python3-pip \ + python3-full \ build-essential \ - libssl-dev \ - zlib1g-dev \ - libncurses5-dev \ - libncursesw5-dev \ - libreadline-dev \ - libsqlite3-dev \ - libgdbm-dev \ - libdb5.3-dev \ - libbz2-dev \ - libexpat1-dev \ - liblzma-dev \ - libffi-dev \ libpq-dev \ + python3-dev \ && rm -rf /var/lib/apt/lists/* -# Download and install Python 3.12 -RUN wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz \ - && tar xzf Python-3.12.0.tgz \ - && cd Python-3.12.0 \ - && ./configure --enable-optimizations \ - && make -j $(nproc) \ - && make altinstall \ - && cd .. \ - && rm -rf Python-3.12.0 Python-3.12.0.tgz \ - && ln -s /usr/local/bin/python3.12 /usr/local/bin/python3 \ - && ln -s /usr/local/bin/pip3.12 /usr/local/bin/pip3 - ARG LETTA_ENVIRONMENT=PRODUCTION ENV LETTA_ENVIRONMENT=${LETTA_ENVIRONMENT} \ POETRY_NO_INTERACTION=1 \ @@ -42,15 +22,14 @@ ENV LETTA_ENVIRONMENT=${LETTA_ENVIRONMENT} \ WORKDIR /app # Create and activate virtual environment -RUN python3.12 -m venv /opt/venv +RUN python3 -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" -# Install poetry in the virtual environment -RUN pip3 install --no-cache-dir poetry==1.8.2 +# Now install poetry in the virtual environment +RUN pip install --no-cache-dir poetry==1.8.2 # Copy dependency files first COPY pyproject.toml poetry.lock ./ - # Then copy the rest of the application code COPY . . @@ -61,34 +40,11 @@ RUN poetry lock --no-update && \ # Runtime stage FROM ankane/pgvector:v0.5.1 AS runtime -# Install Python 3.12 dependencies in runtime stage +# Install Python packages RUN apt-get update && apt-get install -y \ - wget \ - build-essential \ - libssl-dev \ - zlib1g-dev \ - libncurses5-dev \ - libncursesw5-dev \ - libreadline-dev \ - libsqlite3-dev \ - libgdbm-dev \ - libdb5.3-dev \ - libbz2-dev \ - libexpat1-dev \ - liblzma-dev \ - libffi-dev \ - && rm -rf /var/lib/apt/lists/* - -# Install Python 3.12 in runtime stage -RUN wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz \ - && tar xzf Python-3.12.0.tgz \ - && cd Python-3.12.0 \ - && ./configure --enable-optimizations \ - && make -j $(nproc) \ - && make altinstall \ - && cd .. \ - && rm -rf Python-3.12.0 Python-3.12.0.tgz \ - && ln -s /usr/local/bin/python3.12 /usr/local/bin/python3 \ + python3 \ + python3-venv \ + && rm -rf /var/lib/apt/lists/* \ && mkdir -p /app ARG LETTA_ENVIRONMENT=PRODUCTION From 95fc4e752139d115dda6350841afc960e6f3ee45 Mon Sep 17 00:00:00 2001 From: mlong93 <35275280+mlong93@users.noreply.github.com> Date: Thu, 12 Dec 2024 11:36:26 -0800 Subject: [PATCH 076/280] feat: archival memory file upload (#2228) Co-authored-by: Mindy Long Co-authored-by: Sarah Wooders --- letta/agent.py | 3 +- letta/data_sources/connectors.py | 8 +- letta/server/server.py | 16 +- tests/test_server.py | 389 ++++++++++++++++++++++++++++++- 4 files changed, 400 insertions(+), 16 deletions(-) diff --git a/letta/agent.py b/letta/agent.py index 98e6f9ff1e..4060c3637e 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -1371,10 +1371,9 @@ def migrate_embedding(self, embedding_config: EmbeddingConfig): # TODO: recall memory raise NotImplementedError() - def attach_source(self, user: PydanticUser, source_id: str, source_manager: SourceManager, ms: MetadataStore): + def attach_source(self, user: PydanticUser, source_id: str, source_manager: SourceManager, ms: MetadataStore, page_size: Optional[int] = None): """Attach data with name `source_name` to the agent from source_connector.""" # TODO: eventually, adding a data source should just give access to the retriever the source table, rather than modifying archival memory - page_size = 100 passages = self.passage_manager.list_passages(actor=user, source_id=source_id, limit=page_size) for passage in passages: diff --git a/letta/data_sources/connectors.py b/letta/data_sources/connectors.py index 741e46a917..f9fdd26160 100644 --- a/letta/data_sources/connectors.py +++ b/letta/data_sources/connectors.py @@ -1,4 +1,4 @@ -from typing import Dict, Iterator, List, Tuple, Optional +from typing import Dict, Iterator, List, Tuple import typer @@ -13,8 +13,6 @@ from letta.schemas.source import Source from letta.services.passage_manager import PassageManager from letta.services.source_manager import SourceManager -from letta.utils import create_uuid_from_string - class DataConnector: """ @@ -42,7 +40,7 @@ def generate_passages(self, file: FileMetadata, chunk_size: int = 1024) -> Itera """ -def load_data(connector: DataConnector, source: Source, passage_manager: PassageManager, source_manager: SourceManager, actor: "User", agent_id: Optional[str] = None): +def load_data(connector: DataConnector, source: Source, passage_manager: PassageManager, source_manager: SourceManager, actor: "User"): """Load data from a connector (generates file and passages) into a specified source_id, associated with a user_id.""" embedding_config = source.embedding_config @@ -79,10 +77,8 @@ def load_data(connector: DataConnector, source: Source, passage_manager: Passage continue passage = Passage( - id=create_uuid_from_string(f"{str(source.id)}_{passage_text}"), text=passage_text, file_id=file_metadata.id, - agent_id=agent_id, source_id=source.id, metadata_=passage_metadata, organization_id=source.organization_id, diff --git a/letta/server/server.py b/letta/server/server.py index 6dd8d65ba6..80a1335a48 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -1584,6 +1584,8 @@ def load_file_to_source(self, source_id: str, file_path: str, job_id: str, actor from letta.data_sources.connectors import DirectoryConnector source = self.source_manager.get_source_by_id(source_id=source_id) + if source is None: + raise ValueError(f"Source {source_id} does not exist") connector = DirectoryConnector(input_files=[file_path]) num_passages, num_documents = self.load_data(user_id=source.created_by_id, source_name=source.name, connector=connector) @@ -1593,6 +1595,15 @@ def load_file_to_source(self, source_id: str, file_path: str, job_id: str, actor job.metadata_["num_documents"] = num_documents self.job_manager.update_job_by_id(job_id=job_id, job_update=JobUpdate(**job.model_dump()), actor=actor) + # update all agents who have this source attached + agent_ids = self.ms.list_attached_agents(source_id=source_id) + for agent_id in agent_ids: + agent = self.load_agent(agent_id=agent_id) + curr_passage_size = self.passage_manager.size(actor=actor, agent_id=agent_id, source_id=source_id) + agent.attach_source(user=actor, source_id=source_id, source_manager=self.source_manager, ms=self.ms) + new_passage_size = self.passage_manager.size(actor=actor, agent_id=agent_id, source_id=source_id) + assert new_passage_size >= curr_passage_size # in case empty files are added + return job def load_data( @@ -1600,7 +1611,6 @@ def load_data( user_id: str, connector: DataConnector, source_name: str, - agent_id: Optional[str] = None, ) -> Tuple[int, int]: """Load data from a DataConnector into a source for a specified user_id""" # TODO: this should be implemented as a batch job or at least async, since it may take a long time @@ -1612,9 +1622,7 @@ def load_data( raise ValueError(f"Data source {source_name} does not exist for user {user_id}") # load data into the document store - passage_count, document_count = load_data( - connector, source, self.passage_manager, self.source_manager, actor=user, agent_id=agent_id - ) + passage_count, document_count = load_data(connector, source, self.passage_manager, self.source_manager, actor=user) return passage_count, document_count def attach_source_to_agent( diff --git a/tests/test_server.py b/tests/test_server.py index 555b7c07ef..ee745c5c53 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -25,13 +25,246 @@ from letta.config import LettaConfig from letta.schemas.agent import CreateAgent from letta.schemas.embedding_config import EmbeddingConfig +from letta.schemas.job import Job as PydanticJob from letta.schemas.llm_config import LLMConfig from letta.schemas.message import Message -from letta.schemas.source import Source +from letta.schemas.source import Source as PydanticSource from letta.server.server import SyncServer from .utils import DummyDataConnector +WAR_AND_PEACE = """BOOK ONE: 1805 + +CHAPTER I + +“Well, Prince, so Genoa and Lucca are now just family estates of the +Buonapartes. But I warn you, if you don't tell me that this means war, +if you still try to defend the infamies and horrors perpetrated by that +Antichrist—I really believe he is Antichrist—I will have nothing +more to do with you and you are no longer my friend, no longer my +'faithful slave,' as you call yourself! But how do you do? I see I +have frightened you—sit down and tell me all the news.” + +It was in July, 1805, and the speaker was the well-known Anna Pávlovna +Schérer, maid of honor and favorite of the Empress Márya Fëdorovna. +With these words she greeted Prince Vasíli Kurágin, a man of high +rank and importance, who was the first to arrive at her reception. Anna +Pávlovna had had a cough for some days. She was, as she said, suffering +from la grippe; grippe being then a new word in St. Petersburg, used +only by the elite. + +All her invitations without exception, written in French, and delivered +by a scarlet-liveried footman that morning, ran as follows: + +“If you have nothing better to do, Count (or Prince), and if the +prospect of spending an evening with a poor invalid is not too terrible, +I shall be very charmed to see you tonight between 7 and 10—Annette +Schérer.” + +“Heavens! what a virulent attack!” replied the prince, not in the +least disconcerted by this reception. He had just entered, wearing an +embroidered court uniform, knee breeches, and shoes, and had stars on +his breast and a serene expression on his flat face. He spoke in that +refined French in which our grandfathers not only spoke but thought, and +with the gentle, patronizing intonation natural to a man of importance +who had grown old in society and at court. He went up to Anna Pávlovna, +kissed her hand, presenting to her his bald, scented, and shining head, +and complacently seated himself on the sofa. + +“First of all, dear friend, tell me how you are. Set your friend's +mind at rest,” said he without altering his tone, beneath the +politeness and affected sympathy of which indifference and even irony +could be discerned. + +“Can one be well while suffering morally? Can one be calm in times +like these if one has any feeling?” said Anna Pávlovna. “You are +staying the whole evening, I hope?” + +“And the fete at the English ambassador's? Today is Wednesday. I +must put in an appearance there,” said the prince. “My daughter is +coming for me to take me there.” + +“I thought today's fete had been canceled. I confess all these +festivities and fireworks are becoming wearisome.” + +“If they had known that you wished it, the entertainment would have +been put off,” said the prince, who, like a wound-up clock, by force +of habit said things he did not even wish to be believed. + +“Don't tease! Well, and what has been decided about Novosíltsev's +dispatch? You know everything.” + +“What can one say about it?” replied the prince in a cold, listless +tone. “What has been decided? They have decided that Buonaparte has +burnt his boats, and I believe that we are ready to burn ours.” + +Prince Vasíli always spoke languidly, like an actor repeating a stale +part. Anna Pávlovna Schérer on the contrary, despite her forty years, +overflowed with animation and impulsiveness. To be an enthusiast had +become her social vocation and, sometimes even when she did not +feel like it, she became enthusiastic in order not to disappoint the +expectations of those who knew her. The subdued smile which, though it +did not suit her faded features, always played round her lips expressed, +as in a spoiled child, a continual consciousness of her charming defect, +which she neither wished, nor could, nor considered it necessary, to +correct. + +In the midst of a conversation on political matters Anna Pávlovna burst +out: + +“Oh, don't speak to me of Austria. Perhaps I don't understand +things, but Austria never has wished, and does not wish, for war. She +is betraying us! Russia alone must save Europe. Our gracious sovereign +recognizes his high vocation and will be true to it. That is the one +thing I have faith in! Our good and wonderful sovereign has to perform +the noblest role on earth, and he is so virtuous and noble that God will +not forsake him. He will fulfill his vocation and crush the hydra of +revolution, which has become more terrible than ever in the person of +this murderer and villain! We alone must avenge the blood of the just +one.... Whom, I ask you, can we rely on?... England with her commercial +spirit will not and cannot understand the Emperor Alexander's +loftiness of soul. She has refused to evacuate Malta. She wanted to +find, and still seeks, some secret motive in our actions. What answer +did Novosíltsev get? None. The English have not understood and cannot +understand the self-abnegation of our Emperor who wants nothing for +himself, but only desires the good of mankind. And what have they +promised? Nothing! And what little they have promised they will not +perform! Prussia has always declared that Buonaparte is invincible, and +that all Europe is powerless before him.... And I don't believe a +word that Hardenburg says, or Haugwitz either. This famous Prussian +neutrality is just a trap. I have faith only in God and the lofty +destiny of our adored monarch. He will save Europe!” + +She suddenly paused, smiling at her own impetuosity. + +“I think,” said the prince with a smile, “that if you had been +sent instead of our dear Wintzingerode you would have captured the King +of Prussia's consent by assault. You are so eloquent. Will you give me +a cup of tea?” + +“In a moment. À propos,” she added, becoming calm again, “I am +expecting two very interesting men tonight, le Vicomte de Mortemart, who +is connected with the Montmorencys through the Rohans, one of the best +French families. He is one of the genuine émigrés, the good ones. And +also the Abbé Morio. Do you know that profound thinker? He has been +received by the Emperor. Had you heard?” + +“I shall be delighted to meet them,” said the prince. “But +tell me,” he added with studied carelessness as if it had only just +occurred to him, though the question he was about to ask was the chief +motive of his visit, “is it true that the Dowager Empress wants +Baron Funke to be appointed first secretary at Vienna? The baron by all +accounts is a poor creature.” + +Prince Vasíli wished to obtain this post for his son, but others were +trying through the Dowager Empress Márya Fëdorovna to secure it for +the baron. + +Anna Pávlovna almost closed her eyes to indicate that neither she nor +anyone else had a right to criticize what the Empress desired or was +pleased with. + +“Baron Funke has been recommended to the Dowager Empress by her +sister,” was all she said, in a dry and mournful tone. + +As she named the Empress, Anna Pávlovna's face suddenly assumed an +expression of profound and sincere devotion and respect mingled with +sadness, and this occurred every time she mentioned her illustrious +patroness. She added that Her Majesty had deigned to show Baron Funke +beaucoup d'estime, and again her face clouded over with sadness. + +The prince was silent and looked indifferent. But, with the womanly and +courtierlike quickness and tact habitual to her, Anna Pávlovna +wished both to rebuke him (for daring to speak as he had done of a man +recommended to the Empress) and at the same time to console him, so she +said: + +“Now about your family. Do you know that since your daughter came +out everyone has been enraptured by her? They say she is amazingly +beautiful.” + +The prince bowed to signify his respect and gratitude. + +“I often think,” she continued after a short pause, drawing nearer +to the prince and smiling amiably at him as if to show that political +and social topics were ended and the time had come for intimate +conversation—“I often think how unfairly sometimes the joys of life +are distributed. Why has fate given you two such splendid children? +I don't speak of Anatole, your youngest. I don't like him,” she +added in a tone admitting of no rejoinder and raising her eyebrows. +“Two such charming children. And really you appreciate them less than +anyone, and so you don't deserve to have them.” + +And she smiled her ecstatic smile. + +“I can't help it,” said the prince. “Lavater would have said I +lack the bump of paternity.” + +“Don't joke; I mean to have a serious talk with you. Do you know +I am dissatisfied with your younger son? Between ourselves” (and her +face assumed its melancholy expression), “he was mentioned at Her +Majesty's and you were pitied....” + +The prince answered nothing, but she looked at him significantly, +awaiting a reply. He frowned. + +“What would you have me do?” he said at last. “You know I did all +a father could for their education, and they have both turned out fools. +Hippolyte is at least a quiet fool, but Anatole is an active one. That +is the only difference between them.” He said this smiling in a way +more natural and animated than usual, so that the wrinkles round +his mouth very clearly revealed something unexpectedly coarse and +unpleasant. + +“And why are children born to such men as you? If you were not a +father there would be nothing I could reproach you with,” said Anna +Pávlovna, looking up pensively. + +“I am your faithful slave and to you alone I can confess that my +children are the bane of my life. It is the cross I have to bear. That +is how I explain it to myself. It can't be helped!” + +He said no more, but expressed his resignation to cruel fate by a +gesture. Anna Pávlovna meditated. + +“Have you never thought of marrying your prodigal son Anatole?” she +asked. “They say old maids have a mania for matchmaking, and though I +don't feel that weakness in myself as yet, I know a little person who +is very unhappy with her father. She is a relation of yours, Princess +Mary Bolkónskaya.” + +Prince Vasíli did not reply, though, with the quickness of memory and +perception befitting a man of the world, he indicated by a movement of +the head that he was considering this information. + +“Do you know,” he said at last, evidently unable to check the sad +current of his thoughts, “that Anatole is costing me forty thousand +rubles a year? And,” he went on after a pause, “what will it be in +five years, if he goes on like this?” Presently he added: “That's +what we fathers have to put up with.... Is this princess of yours +rich?” + +“Her father is very rich and stingy. He lives in the country. He is +the well-known Prince Bolkónski who had to retire from the army under +the late Emperor, and was nicknamed 'the King of Prussia.' He is +very clever but eccentric, and a bore. The poor girl is very unhappy. +She has a brother; I think you know him, he married Lise Meinen lately. +He is an aide-de-camp of Kutúzov's and will be here tonight.” + +“Listen, dear Annette,” said the prince, suddenly taking Anna +Pávlovna's hand and for some reason drawing it downwards. “Arrange +that affair for me and I shall always be your most devoted slave-slafe +with an f, as a village elder of mine writes in his reports. She is rich +and of good family and that's all I want.” + +And with the familiarity and easy grace peculiar to him, he raised the +maid of honor's hand to his lips, kissed it, and swung it to and fro +as he lay back in his armchair, looking in another direction. + +“Attendez,” said Anna Pávlovna, reflecting, “I'll speak to +Lise, young Bolkónski's wife, this very evening, and perhaps the +thing can be arranged. It shall be on your family's behalf that I'll +start my apprenticeship as old maid.""" @pytest.fixture(scope="module") def server(): @@ -87,6 +320,24 @@ def agent_id(server, user_id): # cleanup server.delete_agent(user_id, agent_state.id) +@pytest.fixture(scope="module") +def other_agent_id(server, user_id): + # create agent + agent_state = server.create_agent( + request=CreateAgent( + name="test_agent_other", + tools=BASE_TOOLS, + memory_blocks=[], + llm_config=LLMConfig.default_config("gpt-4"), + embedding_config=EmbeddingConfig.default_config(provider="openai"), + ), + actor=server.get_user_or_default(user_id), + ) + print(f"Created agent\n{agent_state}") + yield agent_state.id + + # cleanup + server.delete_agent(user_id, agent_state.id) def test_error_on_nonexistent_agent(server, user_id, agent_id): try: @@ -121,7 +372,7 @@ def test_load_data(server, user_id, agent_id): assert len(passages_before) == 0 source = server.source_manager.create_source( - Source(name="test_source", embedding_config=DEFAULT_EMBEDDING_CONFIG), actor=server.default_user + PydanticSource(name="test_source", embedding_config=EmbeddingConfig.default_config(provider="openai")), actor=server.default_user ) # load data @@ -133,7 +384,7 @@ def test_load_data(server, user_id, agent_id): "Shishir loves indian food", ] connector = DummyDataConnector(archival_memories) - server.load_data(user_id, connector, source.name, agent_id=agent_id) + server.load_data(user_id, connector, source.name) # @pytest.mark.order(3) # def test_attach_source_to_agent(server, user_id, agent_id): @@ -168,7 +419,6 @@ def test_get_recall_memory(server, org_id, user_id, agent_id): messages_1 = server.get_agent_recall_cursor(user_id=user_id, agent_id=agent_id, limit=2) cursor1 = messages_1[-1].id messages_2 = server.get_agent_recall_cursor(user_id=user_id, agent_id=agent_id, after=cursor1, limit=1000) - messages_2[-1].id messages_3 = server.get_agent_recall_cursor(user_id=user_id, agent_id=agent_id, limit=1000) messages_3[-1].id assert messages_3[-1].created_at >= messages_3[0].created_at @@ -691,3 +941,134 @@ def count_system_messages_in_recall() -> Tuple[int, List[LettaMessage]]: finally: # cleanup server.delete_agent(user_id, agent_state.id) + + +def test_load_file_to_source(server: SyncServer, user_id: str, agent_id: str, other_agent_id: str, tmp_path): + user = server.get_user_or_default(user_id) + + # Create a source + source = server.source_manager.create_source( + PydanticSource( + name="timber_source", + embedding_config=EmbeddingConfig.default_config(provider="openai"), + created_by_id=user_id, + ), + actor=user + ) + + # Create a test file with some content + test_file = tmp_path / "test.txt" + test_content = "We have a dog called Timber. He likes to sleep and eat chicken." + test_file.write_text(test_content) + + # Attach source to agent first + agent = server.load_agent(agent_id=agent_id) + agent.attach_source(user=user, source_id=source.id, source_manager=server.source_manager, ms=server.ms) + + # Get initial passage count + initial_passage_count = server.passage_manager.size(actor=user, agent_id=agent_id, source_id=source.id) + assert initial_passage_count == 0 + + # Create a job for loading the first file + job = server.job_manager.create_job( + PydanticJob( + user_id=user_id, + metadata_={"type": "embedding", "filename": test_file.name, "source_id": source.id}, + ), + actor=user + ) + + # Load the first file to source + server.load_file_to_source( + source_id=source.id, + file_path=str(test_file), + job_id=job.id, + actor=user, + ) + + # Verify job completed successfully + job = server.job_manager.get_job_by_id(job_id=job.id, actor=user) + assert job.status == "completed" + assert job.metadata_["num_passages"] == 1 + assert job.metadata_["num_documents"] == 1 + + # Verify passages were added + first_file_passage_count = server.passage_manager.size(actor=user, agent_id=agent_id, source_id=source.id) + assert first_file_passage_count > initial_passage_count + + # Create a second test file with different content + test_file2 = tmp_path / "test2.txt" + test_file2.write_text(WAR_AND_PEACE) + + # Create a job for loading the second file + job2 = server.job_manager.create_job( + PydanticJob( + user_id=user_id, + metadata_={"type": "embedding", "filename": test_file2.name, "source_id": source.id}, + ), + actor=user + ) + + # Load the second file to source + server.load_file_to_source( + source_id=source.id, + file_path=str(test_file2), + job_id=job2.id, + actor=user, + ) + + # Verify second job completed successfully + job2 = server.job_manager.get_job_by_id(job_id=job2.id, actor=user) + assert job2.status == "completed" + assert job2.metadata_["num_passages"] >= 10 + assert job2.metadata_["num_documents"] == 1 + + # Verify passages were appended (not replaced) + final_passage_count = server.passage_manager.size(actor=user, agent_id=agent_id, source_id=source.id) + assert final_passage_count > first_file_passage_count + + # Verify both old and new content is searchable + passages = server.passage_manager.list_passages( + actor=user, + agent_id=agent_id, + source_id=source.id, + query_text="what does Timber like to eat", + embedding_config=EmbeddingConfig.default_config(provider="openai"), + embed_query=True, + ) + assert len(passages) == final_passage_count + assert any("chicken" in passage.text.lower() for passage in passages) + assert any("Anna".lower() in passage.text.lower() for passage in passages) + + # TODO: Add this test back in after separation of `Passage tables` (LET-449) + # # Load second agent + # agent2 = server.load_agent(agent_id=other_agent_id) + + # # Initially should have no passages + # initial_agent2_passages = server.passage_manager.size(actor=user, agent_id=other_agent_id, source_id=source.id) + # assert initial_agent2_passages == 0 + + # # Attach source to second agent + # agent2.attach_source(user=user, source_id=source.id, source_manager=server.source_manager, ms=server.ms) + + # # Verify second agent has same number of passages as first agent + # agent2_passages = server.passage_manager.size(actor=user, agent_id=other_agent_id, source_id=source.id) + # agent1_passages = server.passage_manager.size(actor=user, agent_id=agent_id, source_id=source.id) + # assert agent2_passages == agent1_passages + + # # Verify second agent can query the same content + # passages2 = server.passage_manager.list_passages( + # actor=user, + # agent_id=other_agent_id, + # source_id=source.id, + # query_text="what does Timber like to eat", + # embedding_config=EmbeddingConfig.default_config(provider="openai"), + # embed_query=True, + # limit=10, + # ) + # assert len(passages2) == len(passages) + # assert any("chicken" in passage.text.lower() for passage in passages2) + # assert any("sleep" in passage.text.lower() for passage in passages2) + + # # Cleanup + # server.delete_agent(user_id=user_id, agent_id=agent2_state.id) From ac1aa8a5f8b8b9a20a421a3d1eb5fc52e4caf90b Mon Sep 17 00:00:00 2001 From: mlong93 <35275280+mlong93@users.noreply.github.com> Date: Thu, 12 Dec 2024 14:29:22 -0800 Subject: [PATCH 077/280] chore: raising errors for passages, adding new passage test (#2234) Co-authored-by: Mindy Long --- letta/orm/passage.py | 7 ++- letta/server/server.py | 11 +---- letta/services/passage_manager.py | 47 ++++++++----------- tests/test_managers.py | 5 +- tests/test_server.py | 77 ++++++++++++++++--------------- 5 files changed, 67 insertions(+), 80 deletions(-) diff --git a/letta/orm/passage.py b/letta/orm/passage.py index 847c8ddd7c..bfa3e15334 100644 --- a/letta/orm/passage.py +++ b/letta/orm/passage.py @@ -1,6 +1,6 @@ from datetime import datetime -from typing import List, Optional, TYPE_CHECKING -from sqlalchemy import Column, String, DateTime, Index, JSON, UniqueConstraint, ForeignKey +from typing import Optional, TYPE_CHECKING +from sqlalchemy import Column, String, DateTime, JSON, ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship from sqlalchemy.types import TypeDecorator, BINARY @@ -9,7 +9,7 @@ from letta.orm.source import EmbeddingConfigColumn from letta.orm.sqlalchemy_base import SqlalchemyBase -from letta.orm.mixins import AgentMixin, FileMixin, OrganizationMixin +from letta.orm.mixins import FileMixin, OrganizationMixin from letta.schemas.passage import Passage as PydanticPassage from letta.config import LettaConfig @@ -19,7 +19,6 @@ config = LettaConfig() if TYPE_CHECKING: - from letta.orm.file import File from letta.orm.organization import Organization class CommonVector(TypeDecorator): diff --git a/letta/server/server.py b/letta/server/server.py index 80a1335a48..2765b26986 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -1345,17 +1345,10 @@ def insert_archival_memory(self, user_id: str, agent_id: str, memory_contents: s letta_agent = self.load_agent(agent_id=agent_id) # Insert into archival memory - passage_ids = self.passage_manager.insert_passage( - agent_state=letta_agent.agent_state, agent_id=agent_id, text=memory_contents, actor=actor, return_ids=True + return self.passage_manager.insert_passage( + agent_state=letta_agent.agent_state, agent_id=agent_id, text=memory_contents, actor=actor ) - # Update the agent - # TODO: should this update the system prompt? - save_agent(letta_agent, self.ms) - - # TODO: this is gross, fix - return [self.passage_manager.get_passage_by_id(passage_id=passage_id, actor=actor) for passage_id in passage_ids] - def delete_archival_memory(self, user_id: str, agent_id: str, memory_id: str): actor = self.user_manager.get_user_by_id(user_id=user_id) if actor is None: diff --git a/letta/services/passage_manager.py b/letta/services/passage_manager.py index c1933b3943..ef93b732d2 100644 --- a/letta/services/passage_manager.py +++ b/letta/services/passage_manager.py @@ -26,11 +26,8 @@ def __init__(self): def get_passage_by_id(self, passage_id: str, actor: PydanticUser) -> Optional[PydanticPassage]: """Fetch a passage by ID.""" with self.session_maker() as session: - try: - passage = PassageModel.read(db_session=session, identifier=passage_id, actor=actor) - return passage.to_pydantic() - except NoResultFound: - return None + passage = PassageModel.read(db_session=session, identifier=passage_id, actor=actor) + return passage.to_pydantic() @enforce_types def create_passage(self, pydantic_passage: PydanticPassage, actor: PydanticUser) -> PydanticPassage: @@ -83,11 +80,6 @@ def insert_passage(self, actor=actor ) passages.append(passage) - - ids = [str(p.id) for p in passages] - - if return_ids: - return ids return passages @@ -101,26 +93,23 @@ def update_passage_by_id(self, passage_id: str, passage: PydanticPassage, actor: raise ValueError("Passage ID must be provided.") with self.session_maker() as session: - try: - # Fetch existing message from database - curr_passage = PassageModel.read( - db_session=session, - identifier=passage_id, - actor=actor, - ) - if not curr_passage: - raise ValueError(f"Passage with id {passage_id} does not exist.") + # Fetch existing message from database + curr_passage = PassageModel.read( + db_session=session, + identifier=passage_id, + actor=actor, + ) + if not curr_passage: + raise ValueError(f"Passage with id {passage_id} does not exist.") - # Update the database record with values from the provided record - update_data = passage.model_dump(exclude_unset=True, exclude_none=True) - for key, value in update_data.items(): - setattr(curr_passage, key, value) + # Update the database record with values from the provided record + update_data = passage.model_dump(exclude_unset=True, exclude_none=True) + for key, value in update_data.items(): + setattr(curr_passage, key, value) - # Commit changes - curr_passage.update(session, actor=actor) - return curr_passage.to_pydantic() - except NoResultFound: - return None + # Commit changes + curr_passage.update(session, actor=actor) + return curr_passage.to_pydantic() @enforce_types def delete_passage_by_id(self, passage_id: str, actor: PydanticUser) -> bool: @@ -145,6 +134,7 @@ def list_passages(self, query_text : Optional[str] = None, start_date : Optional[datetime] = None, end_date : Optional[datetime] = None, + ascending : bool = True, source_id : Optional[str] = None, embed_query : bool = False, embedding_config: Optional[EmbeddingConfig] = None @@ -176,6 +166,7 @@ def list_passages(self, start_date=start_date, end_date=end_date, limit=limit, + ascending=ascending, query_text=query_text if not embedded_text else None, query_embedding=embedded_text, **filters diff --git a/tests/test_managers.py b/tests/test_managers.py index f6e5436647..745b17d746 100644 --- a/tests/test_managers.py +++ b/tests/test_managers.py @@ -9,7 +9,6 @@ import letta.utils as utils from letta.functions.functions import derive_openai_json_schema, parse_source_code from letta.metadata import AgentModel -from letta.orm.sqlite_functions import verify_embedding_dimension, convert_array from letta.orm import ( Block, BlocksAgents, @@ -445,8 +444,8 @@ def test_passage_update(server: SyncServer, hello_world_passage_fixture, default def test_passage_delete(server: SyncServer, hello_world_passage_fixture, default_user): """Test deleting a passage""" server.passage_manager.delete_passage_by_id(hello_world_passage_fixture.id, actor=default_user) - retrieved = server.passage_manager.get_passage_by_id(hello_world_passage_fixture.id, actor=default_user) - assert retrieved is None + with pytest.raises(NoResultFound): + server.passage_manager.get_passage_by_id(hello_world_passage_fixture.id, actor=default_user) def test_passage_size(server: SyncServer, hello_world_passage_fixture, create_test_passages, default_user): diff --git a/tests/test_server.py b/tests/test_server.py index ee745c5c53..38404afc2e 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -433,42 +433,47 @@ def test_get_recall_memory(server, org_id, user_id, agent_id): assert message_id in message_ids, f"{message_id} not in {message_ids}" -# TODO: Out-of-date test. pagination commands are off -# @pytest.mark.order(6) -# def test_get_archival_memory(server, user_id, agent_id): -# # test archival memory cursor pagination -# passages_1 = server.get_agent_archival_cursor(user_id=user_id, agent_id=agent_id, reverse=False, limit=2, order_by="text") -# assert len(passages_1) == 2, f"Returned {[p.text for p in passages_1]}, not equal to 2" -# cursor1 = passages_1[-1].id -# passages_2 = server.get_agent_archival_cursor( -# user_id=user_id, -# agent_id=agent_id, -# reverse=False, -# after=cursor1, -# order_by="text", -# ) -# cursor2 = passages_2[-1].id -# passages_3 = server.get_agent_archival_cursor( -# user_id=user_id, -# agent_id=agent_id, -# reverse=False, -# before=cursor2, -# limit=1000, -# order_by="text", -# ) -# passages_3[-1].id -# # assert passages_1[0].text == "Cinderella wore a blue dress" -# assert len(passages_2) in [3, 4] # NOTE: exact size seems non-deterministic, so loosen test -# assert len(passages_3) in [4, 5] # NOTE: exact size seems non-deterministic, so loosen test - -# # test archival memory -# passage_1 = server.get_agent_archival(user_id=user_id, agent_id=agent_id, start=0, count=1) -# assert len(passage_1) == 1 -# passage_2 = server.get_agent_archival(user_id=user_id, agent_id=agent_id, start=1, count=1000) -# assert len(passage_2) in [4, 5] # NOTE: exact size seems non-deterministic, so loosen test -# # test safe empty return -# passage_none = server.get_agent_archival(user_id=user_id, agent_id=agent_id, start=1000, count=1000) -# assert len(passage_none) == 0 +@pytest.mark.order(6) +def test_get_archival_memory(server, user_id, agent_id): + # test archival memory cursor pagination + user = server.user_manager.get_user_by_id(user_id=user_id) + + # List latest 2 passages + passages_1 = server.passage_manager.list_passages( + actor=user, agent_id=agent_id, ascending=False, limit=2, + ) + assert len(passages_1) == 2, f"Returned {[p.text for p in passages_1]}, not equal to 2" + + # List next 3 passages (earliest 3) + cursor1 = passages_1[-1].id + passages_2 = server.passage_manager.list_passages( + actor=user, + agent_id=agent_id, + ascending=False, + cursor=cursor1, + ) + + # List all 5 + cursor2 = passages_1[0].created_at + passages_3 = server.passage_manager.list_passages( + actor=user, + agent_id=agent_id, + ascending=False, + end_date=cursor2, + limit=1000, + ) + # assert passages_1[0].text == "Cinderella wore a blue dress" + assert len(passages_2) in [3, 4] # NOTE: exact size seems non-deterministic, so loosen test + assert len(passages_3) in [4, 5] # NOTE: exact size seems non-deterministic, so loosen test + + # test archival memory + passage_1 = server.get_agent_archival(user_id=user_id, agent_id=agent_id, limit=1) + assert len(passage_1) == 1 + passage_2 = server.get_agent_archival(user_id=user_id, agent_id=agent_id, cursor=passage_1[-1].id, limit=1000) + assert len(passage_2) in [4, 5] # NOTE: exact size seems non-deterministic, so loosen test + # test safe empty return + passage_none = server.get_agent_archival(user_id=user_id, agent_id=agent_id, cursor=passages_1[0].id, limit=1000) + assert len(passage_none) == 0 def test_agent_rethink_rewrite_retry(server, user_id, agent_id): From afd859cff782effbcfb5aa132575efde9ff7f2a0 Mon Sep 17 00:00:00 2001 From: cthomas Date: Thu, 12 Dec 2024 14:36:21 -0800 Subject: [PATCH 078/280] feat: route all sandbox errors to stderr (#2222) Co-authored-by: Caren Thomas --- letta/server/server.py | 40 +++++++-- letta/services/tool_execution_sandbox.py | 85 ++++++++----------- ...integration_test_tool_execution_sandbox.py | 20 +++-- tests/test_server.py | 28 +++--- 4 files changed, 97 insertions(+), 76 deletions(-) diff --git a/letta/server/server.py b/letta/server/server.py index 2765b26986..39536c6697 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -1957,6 +1957,21 @@ def run_tool_from_source( if sandbox_run_result is None: raise ValueError(f"Tool with id {tool.id} returned execution with None") function_response = str(sandbox_run_result.func_return) + stdout = [s for s in sandbox_run_result.stdout if s.strip()] + stderr = [s for s in sandbox_run_result.stderr if s.strip()] + + # expected error + if stderr: + error_msg = self.get_error_msg_for_func_return(tool.name, stderr[-1]) + return FunctionReturn( + id="null", + function_call_id="null", + date=get_utc_time(), + status="error", + function_return=error_msg, + stdout=stdout, + stderr=stderr, + ) return FunctionReturn( id="null", @@ -1964,17 +1979,13 @@ def run_tool_from_source( date=get_utc_time(), status="success", function_return=function_response, - stdout=sandbox_run_result.stdout, - stderr=sandbox_run_result.stderr, + stdout=stdout, + stderr=stderr, ) - except Exception as e: - # same as agent.py - from letta.constants import MAX_ERROR_MESSAGE_CHAR_LIMIT - - error_msg = f"Error executing tool {tool.name}: {e}" - if len(error_msg) > MAX_ERROR_MESSAGE_CHAR_LIMIT: - error_msg = error_msg[:MAX_ERROR_MESSAGE_CHAR_LIMIT] + # unexpected error TODO(@cthomas): consolidate error handling + except Exception as e: + error_msg = self.get_error_msg_for_func_return(tool.name, e) return FunctionReturn( id="null", function_call_id="null", @@ -1985,6 +1996,17 @@ def run_tool_from_source( stderr=[traceback.format_exc()], ) + + def get_error_msg_for_func_return(self, tool_name, exception_message): + # same as agent.py + from letta.constants import MAX_ERROR_MESSAGE_CHAR_LIMIT + + error_msg = f"Error executing tool {tool_name}: {exception_message}" + if len(error_msg) > MAX_ERROR_MESSAGE_CHAR_LIMIT: + error_msg = error_msg[:MAX_ERROR_MESSAGE_CHAR_LIMIT] + return error_msg + + # Composio wrappers def get_composio_client(self, api_key: Optional[str] = None): if api_key: diff --git a/letta/services/tool_execution_sandbox.py b/letta/services/tool_execution_sandbox.py index e1698dfe14..9adcff0b4d 100644 --- a/letta/services/tool_execution_sandbox.py +++ b/letta/services/tool_execution_sandbox.py @@ -7,6 +7,7 @@ import subprocess import sys import tempfile +import traceback import uuid import venv from typing import Any, Dict, Optional, TextIO @@ -174,41 +175,16 @@ def run_local_dir_sandbox_venv(self, sbx_config: SandboxConfig, env: Dict[str, s capture_output=True, text=True, ) - - # Handle error with optimistic error parsing from the string - # This is very brittle, so we fall back to a RuntimeError if parsing fails - if result.returncode != 0: - # Log the error - logger.error(f"Sandbox execution error:\n{result.stderr}") - - # Parse and raise the actual error from stderr - tb_lines = result.stderr.strip().splitlines() - exception_line = tb_lines[-1] # The last line contains the exception - - try: - # Split exception type and message - exception_type, exception_message = exception_line.split(": ", 1) - exception_type = exception_type.strip() - exception_message = exception_message.strip() - - # Dynamically raise the exception - exception_class = eval(exception_type) # Look up the exception type - - except Exception: - # Fallback to RuntimeError if parsing fails - raise RuntimeError(result.stderr) - - raise exception_class(exception_message) - func_result, stdout = self.parse_out_function_results_markers(result.stdout) func_return, agent_state = self.parse_best_effort(func_result) return SandboxRunResult( - func_return=func_return, + func_return=func_return, agent_state=agent_state, stdout=[stdout], stderr=[result.stderr], sandbox_config_fingerprint=sbx_config.fingerprint(), ) + except subprocess.TimeoutExpired: raise TimeoutError(f"Executing tool {self.tool_name} has timed out.") except subprocess.CalledProcessError as e: @@ -217,39 +193,49 @@ def run_local_dir_sandbox_venv(self, sbx_config: SandboxConfig, env: Dict[str, s except Exception as e: logger.error(f"Executing tool {self.tool_name} has an unexpected error: {e}") raise e + def run_local_dir_sandbox_runpy( self, sbx_config: SandboxConfig, env_vars: Dict[str, str], temp_file_path: str, old_stdout: TextIO, old_stderr: TextIO ) -> SandboxRunResult: + func_return, agent_state, error_msg = None, None, None + # Redirect stdout and stderr to capture script output - captured_stdout = io.StringIO() - captured_stderr = io.StringIO() + captured_stdout, captured_stderr = io.StringIO(), io.StringIO() sys.stdout = captured_stdout sys.stderr = captured_stderr - # Execute the temp file - with self.temporary_env_vars(env_vars): - result = runpy.run_path(temp_file_path, init_globals=env_vars) + try: + # Execute the temp file + with self.temporary_env_vars(env_vars): + result = runpy.run_path(temp_file_path, init_globals=env_vars) + + # Fetch the result + func_result = result.get(self.LOCAL_SANDBOX_RESULT_VAR_NAME) + func_return, agent_state = self.parse_best_effort(func_result) - # Fetch the result - func_result = result.get(self.LOCAL_SANDBOX_RESULT_VAR_NAME) - func_return, agent_state = self.parse_best_effort(func_result) + except Exception as e: + traceback.print_exc(file=sys.stderr) + error_msg = f"{type(e).__name__}: {str(e)}" # Restore stdout and stderr and collect captured output sys.stdout = old_stdout sys.stderr = old_stderr - stdout_output = captured_stdout.getvalue() - stderr_output = captured_stderr.getvalue() + stdout_output = [captured_stdout.getvalue()] + stderr_output = [captured_stderr.getvalue()] + stderr_output.append(error_msg if error_msg else '') return SandboxRunResult( func_return=func_return, agent_state=agent_state, - stdout=[stdout_output], - stderr=[stderr_output], + stdout=stdout_output, + stderr=stderr_output, sandbox_config_fingerprint=sbx_config.fingerprint(), ) def parse_out_function_results_markers(self, text: str): + if self.LOCAL_SANDBOX_RESULT_START_MARKER not in text: + return '', text marker_len = len(self.LOCAL_SANDBOX_RESULT_START_MARKER) start_index = text.index(self.LOCAL_SANDBOX_RESULT_START_MARKER) + marker_len end_index = text.index(self.LOCAL_SANDBOX_RESULT_END_MARKER) @@ -294,21 +280,22 @@ def run_e2b_sandbox(self, agent_state: AgentState) -> Optional[SandboxRunResult] env_vars = self.sandbox_config_manager.get_sandbox_env_vars_as_dict(sandbox_config_id=sbx_config.id, actor=self.user, limit=100) code = self.generate_execution_script(agent_state=agent_state) execution = sbx.run_code(code, envs=env_vars) + func_return, agent_state = None, None if execution.error is not None: logger.error(f"Executing tool {self.tool_name} failed with {execution.error}") - # Raise a concise exception as this gets returned to the LLM - raise self.parse_exception_from_e2b_execution(execution) + execution.logs.stderr.append(execution.error.traceback) + execution.logs.stderr.append(f"{execution.error.name}: {execution.error.value}") elif len(execution.results) == 0: return None else: func_return, agent_state = self.parse_best_effort(execution.results[0].text) - return SandboxRunResult( - func_return=func_return, - agent_state=agent_state, - stdout=execution.logs.stdout, - stderr=execution.logs.stderr, - sandbox_config_fingerprint=sbx_config.fingerprint(), - ) + return SandboxRunResult( + func_return=func_return, + agent_state=agent_state, + stdout=execution.logs.stdout, + stderr=execution.logs.stderr, + sandbox_config_fingerprint=sbx_config.fingerprint(), + ) def parse_exception_from_e2b_execution(self, e2b_execution: "Execution") -> Exception: builtins_dict = __builtins__ if isinstance(__builtins__, dict) else vars(__builtins__) @@ -356,6 +343,8 @@ def list_running_e2b_sandboxes(self): # general utility functions def parse_best_effort(self, text: str) -> Any: + if not text: + return None, None result = pickle.loads(base64.b64decode(text)) agent_state = None if not result["agent_state"] is None: diff --git a/tests/integration_test_tool_execution_sandbox.py b/tests/integration_test_tool_execution_sandbox.py index e13275b21a..37597106a6 100644 --- a/tests/integration_test_tool_execution_sandbox.py +++ b/tests/integration_test_tool_execution_sandbox.py @@ -177,6 +177,7 @@ def error() -> str: str: not important """ # Raise a unusual error so we know it's from this function + print("Going to error now") raise ZeroDivisionError("This is an intentionally weird division!") tool = create_tool_from_func(error) @@ -314,15 +315,16 @@ def test_local_sandbox_core_memory_replace(mock_e2b_api_key_none, core_memory_re assert result.func_return is None -@pytest.mark.e2b_sandbox +@pytest.mark.local_sandbox def test_local_sandbox_core_memory_replace_errors(mock_e2b_api_key_none, core_memory_replace_tool, test_user, agent_state): nonexistent_name = "Alexander Wang" args = {"label": "human", "old_content": nonexistent_name, "new_content": "Matt"} sandbox = ToolExecutionSandbox(core_memory_replace_tool.name, args, user_id=test_user.id) # run the sandbox - with pytest.raises(ValueError, match=f"Old content '{nonexistent_name}' not found in memory block 'human'"): - sandbox.run(agent_state=agent_state) + result = sandbox.run(agent_state=agent_state) + assert len(result.stderr) != 0, "stderr not empty" + assert f"ValueError: Old content '{nonexistent_name}' not found in memory block 'human'" in result.stderr[0], "stderr contains expected error" @pytest.mark.local_sandbox @@ -402,8 +404,11 @@ def test_local_sandbox_with_venv_errors(mock_e2b_api_key_none, custom_test_sandb sandbox = ToolExecutionSandbox(always_err_tool.name, {}, user_id=test_user.id) # run the sandbox - with pytest.raises(ZeroDivisionError, match="This is an intentionally weird division!"): - sandbox.run() + result = sandbox.run() + assert len(result.stdout) != 0, "stdout not empty" + assert "error" in result.stdout[0], "stdout contains printed string" + assert len(result.stderr) != 0, "stderr not empty" + assert "ZeroDivisionError: This is an intentionally weird division!" in result.stderr[0], "stderr contains expected error" # E2B sandbox tests @@ -500,8 +505,9 @@ def test_e2b_sandbox_core_memory_replace_errors(check_e2b_key_is_set, core_memor sandbox = ToolExecutionSandbox(core_memory_replace_tool.name, args, user_id=test_user.id) # run the sandbox - with pytest.raises(ValueError, match=f"Old content '{nonexistent_name}' not found in memory block 'human'"): - sandbox.run(agent_state=agent_state) + result = sandbox.run(agent_state=agent_state) + assert len(result.stderr) != 0, "stderr not empty" + assert f"ValueError: Old content '{nonexistent_name}' not found in memory block 'human'" in result.stderr[0], "stderr contains expected error" @pytest.mark.e2b_sandbox diff --git a/tests/test_server.py b/tests/test_server.py index 38404afc2e..482fe8943f 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -798,8 +798,8 @@ def test_tool_run(server, mock_e2b_api_key_none, user_id, agent_id): print(result) assert result.status == "success" assert result.function_return == "Ingested message Hello, world!", result.function_return - assert result.stdout == [''] - assert result.stderr == [''] + assert not result.stdout + assert not result.stderr result = server.run_tool_from_source( user_id=user_id, @@ -811,8 +811,8 @@ def test_tool_run(server, mock_e2b_api_key_none, user_id, agent_id): print(result) assert result.status == "success" assert result.function_return == "Ingested message Well well well", result.function_return - assert result.stdout == [''] - assert result.stderr == [''] + assert not result.stdout + assert not result.stderr result = server.run_tool_from_source( user_id=user_id, @@ -825,8 +825,9 @@ def test_tool_run(server, mock_e2b_api_key_none, user_id, agent_id): assert result.status == "error" assert "Error" in result.function_return, result.function_return assert "missing 1 required positional argument" in result.function_return, result.function_return - assert result.stdout == [''] - assert result.stderr != [''], "missing 1 required positional argument" in result.stderr[0] + assert not result.stdout + assert result.stderr + assert "missing 1 required positional argument" in result.stderr[0] # Test that we can still pull the tool out by default (pulls that last tool in the source) result = server.run_tool_from_source( @@ -839,8 +840,9 @@ def test_tool_run(server, mock_e2b_api_key_none, user_id, agent_id): print(result) assert result.status == "success" assert result.function_return == "Ingested message Well well well", result.function_return - assert result.stdout != [''], "I'm a distractor" in result.stdout[0] - assert result.stderr == [''] + assert result.stdout + assert "I'm a distractor" in result.stdout[0] + assert not result.stderr # Test that we can pull the tool out by name result = server.run_tool_from_source( @@ -853,8 +855,9 @@ def test_tool_run(server, mock_e2b_api_key_none, user_id, agent_id): print(result) assert result.status == "success" assert result.function_return == "Ingested message Well well well", result.function_return - assert result.stdout != [''], "I'm a distractor" in result.stdout[0] - assert result.stderr == [''] + assert result.stdout + assert "I'm a distractor" in result.stdout[0] + assert not result.stderr # Test that we can pull a different tool out by name result = server.run_tool_from_source( @@ -867,8 +870,9 @@ def test_tool_run(server, mock_e2b_api_key_none, user_id, agent_id): print(result) assert result.status == "success" assert result.function_return == str(None), result.function_return - assert result.stdout != [''], "I'm a distractor" in result.stdout[0] - assert result.stderr == [''] + assert result.stdout + assert "I'm a distractor" in result.stdout[0] + assert not result.stderr def test_composio_client_simple(server): From 953f2c9868c776375e9506fdadfa24d194f9cab6 Mon Sep 17 00:00:00 2001 From: cthomas Date: Fri, 13 Dec 2024 10:58:34 -0800 Subject: [PATCH 079/280] fix: make sandboxrunresult rv not optional (#2244) --- letta/server/server.py | 2 -- letta/services/tool_execution_sandbox.py | 8 ++++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/letta/server/server.py b/letta/server/server.py index 39536c6697..9c66832eec 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -1954,8 +1954,6 @@ def run_tool_from_source( # Next, attempt to run the tool with the sandbox try: sandbox_run_result = ToolExecutionSandbox(tool.name, tool_args_dict, user_id, tool_object=tool).run(agent_state=agent_state) - if sandbox_run_result is None: - raise ValueError(f"Tool with id {tool.id} returned execution with None") function_response = str(sandbox_run_result.func_return) stdout = [s for s in sandbox_run_result.stdout if s.strip()] stderr = [s for s in sandbox_run_result.stderr if s.strip()] diff --git a/letta/services/tool_execution_sandbox.py b/letta/services/tool_execution_sandbox.py index 9adcff0b4d..3aac64b571 100644 --- a/letta/services/tool_execution_sandbox.py +++ b/letta/services/tool_execution_sandbox.py @@ -62,7 +62,7 @@ def __init__(self, tool_name: str, args: dict, user_id: str, force_recreate=Fals self.sandbox_config_manager = SandboxConfigManager(tool_settings) self.force_recreate = force_recreate - def run(self, agent_state: Optional[AgentState] = None) -> Optional[SandboxRunResult]: + def run(self, agent_state: Optional[AgentState] = None) -> SandboxRunResult: """ Run the tool in a sandbox environment. @@ -101,7 +101,7 @@ def temporary_env_vars(self, env_vars: dict): os.environ.clear() os.environ.update(original_env) # Restore original environment variables - def run_local_dir_sandbox(self, agent_state: AgentState) -> Optional[SandboxRunResult]: + def run_local_dir_sandbox(self, agent_state: AgentState) -> SandboxRunResult: sbx_config = self.sandbox_config_manager.get_or_create_default_sandbox_config(sandbox_type=SandboxType.LOCAL, actor=self.user) local_configs = sbx_config.get_local_config() @@ -266,7 +266,7 @@ def create_venv_for_local_sandbox(self, sandbox_dir_path: str, venv_path: str, e # e2b sandbox specific functions - def run_e2b_sandbox(self, agent_state: AgentState) -> Optional[SandboxRunResult]: + def run_e2b_sandbox(self, agent_state: AgentState) -> SandboxRunResult: sbx_config = self.sandbox_config_manager.get_or_create_default_sandbox_config(sandbox_type=SandboxType.E2B, actor=self.user) sbx = self.get_running_e2b_sandbox_with_same_state(sbx_config) if not sbx or self.force_recreate: @@ -286,7 +286,7 @@ def run_e2b_sandbox(self, agent_state: AgentState) -> Optional[SandboxRunResult] execution.logs.stderr.append(execution.error.traceback) execution.logs.stderr.append(f"{execution.error.name}: {execution.error.value}") elif len(execution.results) == 0: - return None + raise ValueError(f"Tool {self.tool_name} returned execution with None") else: func_return, agent_state = self.parse_best_effort(execution.results[0].text) return SandboxRunResult( From e24756ddd53ade8e1895c48892eba6a516d9c28e Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Fri, 13 Dec 2024 11:30:48 -0800 Subject: [PATCH 080/280] chore: bump version 0.6.4 (#2246) --- letta/__init__.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/letta/__init__.py b/letta/__init__.py index a9d3f60639..0a397aeda9 100644 --- a/letta/__init__.py +++ b/letta/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.6.3" +__version__ = "0.6.4" # import clients from letta.client.client import LocalClient, RESTClient, create_client diff --git a/pyproject.toml b/pyproject.toml index 8d0a4d912f..dc1da5940b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "letta" -version = "0.6.3" +version = "0.6.4" packages = [ {include = "letta"} ] From d42c1e5e7240a179de746bb239a0b3d647547afd Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Fri, 13 Dec 2024 11:48:07 -0800 Subject: [PATCH 081/280] feat: Catch composio errors and return informative errors in the endpoint (#2247) --- letta/server/rest_api/routers/v1/tools.py | 24 +++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/letta/server/rest_api/routers/v1/tools.py b/letta/server/rest_api/routers/v1/tools.py index 1b5e2eac8c..d288ca0234 100644 --- a/letta/server/rest_api/routers/v1/tools.py +++ b/letta/server/rest_api/routers/v1/tools.py @@ -1,6 +1,8 @@ from typing import List, Optional from composio.client.collections import ActionModel, AppModel +from composio.client.enums.base import EnumStringNotFound +from composio.exceptions import ComposioSDKError from fastapi import APIRouter, Body, Depends, Header, HTTPException from letta.errors import LettaToolCreateError @@ -248,8 +250,26 @@ def add_composio_tool( """ actor = server.get_user_or_default(user_id=user_id) composio_api_key = get_composio_key(server, actor=actor) - tool_create = ToolCreate.from_composio(action_name=composio_action_name, api_key=composio_api_key) - return server.tool_manager.create_or_update_tool(pydantic_tool=Tool(**tool_create.model_dump()), actor=actor) + + try: + tool_create = ToolCreate.from_composio(action_name=composio_action_name, api_key=composio_api_key) + return server.tool_manager.create_or_update_tool(pydantic_tool=Tool(**tool_create.model_dump()), actor=actor) + except EnumStringNotFound: + raise HTTPException( + status_code=400, # Bad Request + detail={ + "message": f"Cannot find composio action with name `{composio_action_name}`.", + "composio_action_name": composio_action_name, + }, + ) + except ComposioSDKError: + raise HTTPException( + status_code=400, # Bad Request + detail={ + "message": f"No connected account found for tool `{composio_action_name}`. You need to connect the relevant app in Composio order to use the tool.", + "composio_action_name": composio_action_name, + }, + ) # TODO: Factor this out to somewhere else From e49a8b43658e4b9dd01bfd6dec0ca8b53297ebb3 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Fri, 13 Dec 2024 14:43:19 -0800 Subject: [PATCH 082/280] feat: Rewrite agents (#2232) --- .github/workflows/integration_tests.yml | 5 +- .github/workflows/tests.yml | 70 +- .../d05669b60ebe_migrate_agents_to_orm.py | 175 ++++ ...c_move_organizations_users_tools_to_orm.py | 2 +- examples/composio_tool_usage.py | 2 +- examples/docs/agent_advanced.py | 2 +- examples/docs/tools.py | 7 +- examples/langchain_tool_usage.py | 4 +- examples/tool_rule_usage.py | 2 +- letta/__init__.py | 2 +- letta/agent.py | 91 +- letta/chat_only_agent.py | 9 +- letta/cli/cli.py | 9 +- letta/client/client.py | 259 +++-- letta/config.py | 161 ---- letta/main.py | 6 +- letta/memory.py | 17 +- letta/metadata.py | 256 +---- letta/o1_agent.py | 2 +- letta/offline_memory_agent.py | 4 +- letta/orm/__init__.py | 2 + letta/orm/agent.py | 196 ++++ letta/orm/agents_tags.py | 28 +- letta/orm/block.py | 33 +- letta/orm/blocks_agents.py | 16 +- letta/orm/message.py | 3 +- letta/orm/organization.py | 9 +- letta/orm/passage.py | 24 +- letta/orm/source.py | 2 +- letta/orm/sources_agents.py | 13 + letta/orm/sqlalchemy_base.py | 84 +- letta/orm/tool.py | 20 +- letta/orm/tools_agents.py | 31 +- letta/orm/user.py | 7 +- letta/schemas/agent.py | 95 +- letta/schemas/agents_tags.py | 33 - letta/schemas/blocks_agents.py | 32 - letta/schemas/memory.py | 3 +- letta/schemas/tools_agents.py | 32 - letta/server/rest_api/app.py | 5 - .../routers/openai/assistants/threads.py | 338 ------- .../chat_completions/chat_completions.py | 2 +- letta/server/rest_api/routers/v1/agents.py | 177 ++-- letta/server/rest_api/routers/v1/blocks.py | 47 +- letta/server/rest_api/routers/v1/jobs.py | 8 +- .../rest_api/routers/v1/sandbox_configs.py | 20 +- letta/server/rest_api/routers/v1/sources.py | 24 +- letta/server/rest_api/routers/v1/tools.py | 26 +- letta/server/server.py | 856 ++++------------- letta/server/ws_api/server.py | 5 - letta/services/agent_manager.py | 405 ++++++++ letta/services/agents_tags_manager.py | 64 -- letta/services/block_manager.py | 34 +- letta/services/blocks_agents_manager.py | 106 --- .../services/helpers/agent_manager_helper.py | 90 ++ letta/services/passage_manager.py | 124 +-- letta/services/source_manager.py | 23 +- letta/services/tools_agents_manager.py | 94 -- letta/services/user_manager.py | 17 +- letta/utils.py | 4 +- locust_test.py | 4 +- scripts/migrate_0.3.18.py | 90 -- tests/conftest.py | 4 +- tests/helpers/endpoints_helper.py | 14 +- tests/helpers/utils.py | 55 ++ ...y => integration_test_agent_tool_graph.py} | 2 +- ..._agent.py => integration_test_o1_agent.py} | 2 +- ... integration_test_offline_memory_agent.py} | 17 +- tests/test_autogen_integration.py | 41 - tests/test_base_functions.py | 23 +- tests/test_client.py | 112 ++- tests/test_client_legacy.py | 37 - tests/test_concurrent_connections.py | 142 --- tests/test_different_embedding_size.py | 121 --- tests/test_function_parser.py | 48 - tests/test_json_parsers.py | 99 -- tests/test_local_client.py | 19 +- tests/test_managers.py | 895 ++++++++++-------- tests/test_new_cli.py | 126 --- tests/test_openai_client.py | 93 -- tests/test_persistence.py | 52 - tests/test_schema_generator.py | 62 -- tests/test_server.py | 153 ++- tests/test_summarize.py | 6 +- tests/test_v1_routes.py | 14 +- tests/test_vector_embeddings.py | 21 +- 86 files changed, 2492 insertions(+), 3977 deletions(-) create mode 100644 alembic/versions/d05669b60ebe_migrate_agents_to_orm.py create mode 100644 letta/orm/agent.py create mode 100644 letta/orm/sources_agents.py delete mode 100644 letta/schemas/agents_tags.py delete mode 100644 letta/schemas/blocks_agents.py delete mode 100644 letta/schemas/tools_agents.py delete mode 100644 letta/server/rest_api/routers/openai/assistants/threads.py create mode 100644 letta/services/agent_manager.py delete mode 100644 letta/services/agents_tags_manager.py delete mode 100644 letta/services/blocks_agents_manager.py create mode 100644 letta/services/helpers/agent_manager_helper.py delete mode 100644 letta/services/tools_agents_manager.py delete mode 100644 scripts/migrate_0.3.18.py rename tests/{test_agent_tool_graph.py => integration_test_agent_tool_graph.py} (98%) rename tests/{test_o1_agent.py => integration_test_o1_agent.py} (95%) rename tests/{test_offline_memory_agent.py => integration_test_offline_memory_agent.py} (92%) delete mode 100644 tests/test_autogen_integration.py delete mode 100644 tests/test_concurrent_connections.py delete mode 100644 tests/test_different_embedding_size.py delete mode 100644 tests/test_function_parser.py delete mode 100644 tests/test_json_parsers.py delete mode 100644 tests/test_new_cli.py delete mode 100644 tests/test_openai_client.py delete mode 100644 tests/test_persistence.py delete mode 100644 tests/test_schema_generator.py diff --git a/.github/workflows/integration_tests.yml b/.github/workflows/integration_tests.yml index ab221e0176..3d2292f3dc 100644 --- a/.github/workflows/integration_tests.yml +++ b/.github/workflows/integration_tests.yml @@ -18,7 +18,7 @@ on: branches: [ main ] jobs: - run-integration-tests: + integ-run: runs-on: ubuntu-latest timeout-minutes: 15 strategy: @@ -27,6 +27,9 @@ jobs: integration_test_suite: - "integration_test_summarizer.py" - "integration_test_tool_execution_sandbox.py" + - "integration_test_offline_memory_agent.py" + - "integration_test_agent_tool_graph.py" + - "integration_test_o1_agent.py" services: qdrant: image: qdrant/qdrant diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index e1f40e9be5..43e66727ab 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -13,25 +13,27 @@ on: pull_request: jobs: - run-core-unit-tests: + unit-run: runs-on: ubuntu-latest timeout-minutes: 15 strategy: fail-fast: false matrix: test_suite: + - "test_vector_embeddings.py" - "test_client.py" - - "test_local_client.py" - "test_client_legacy.py" - "test_server.py" + - "test_v1_routes.py" + - "test_local_client.py" - "test_managers.py" - - "test_o1_agent.py" + - "test_base_functions.py" + - "test_tool_schema_parsing.py" - "test_tool_rule_solver.py" - - "test_agent_tool_graph.py" + - "test_memory.py" - "test_utils.py" - - "test_tool_schema_parsing.py" - - "test_v1_routes.py" - - "test_offline_memory_agent.py" + - "test_stream_buffer_readers.py" + - "test_summarize.py" services: qdrant: image: qdrant/qdrant @@ -81,57 +83,3 @@ jobs: LETTA_SERVER_PASS: test_server_token run: | poetry run pytest -s -vv tests/${{ matrix.test_suite }} - - misc-unit-tests: - runs-on: ubuntu-latest - needs: run-core-unit-tests - services: - qdrant: - image: qdrant/qdrant - ports: - - 6333:6333 - postgres: - image: pgvector/pgvector:pg17 - ports: - - 5432:5432 - env: - POSTGRES_HOST_AUTH_METHOD: trust - POSTGRES_DB: postgres - POSTGRES_USER: postgres - options: >- - --health-cmd pg_isready - --health-interval 10s - --health-timeout 5s - --health-retries 5 - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup Python, Poetry, and Dependencies - uses: packetcoders/action-setup-cache-python-poetry@main - with: - python-version: "3.12" - poetry-version: "1.8.2" - install-args: "-E dev -E postgres -E external-tools -E tests -E cloud-tool-sandbox" - - name: Migrate database - env: - LETTA_PG_PORT: 5432 - LETTA_PG_USER: postgres - LETTA_PG_PASSWORD: postgres - LETTA_PG_DB: postgres - LETTA_PG_HOST: localhost - run: | - psql -h localhost -U postgres -d postgres -c 'CREATE EXTENSION vector' - poetry run alembic upgrade head - - name: Run misc unit tests - env: - LETTA_PG_PORT: 5432 - LETTA_PG_USER: postgres - LETTA_PG_PASSWORD: postgres - LETTA_PG_DB: postgres - LETTA_PG_HOST: localhost - LETTA_SERVER_PASS: test_server_token - PYTHONPATH: ${{ github.workspace }}:${{ env.PYTHONPATH }} - run: | - poetry run pytest -s -vv -k "not test_offline_memory_agent.py and not test_v1_routes.py and not test_model_letta_perfomance.py and not test_utils.py and not test_client.py and not integration_test_tool_execution_sandbox.py and not integration_test_summarizer.py and not test_agent_tool_graph.py and not test_tool_rule_solver.py and not test_local_client.py and not test_o1_agent.py and not test_cli.py and not test_concurrent_connections.py and not test_quickstart and not test_model_letta_performance and not test_storage and not test_server and not test_openai_client and not test_providers and not test_client_legacy.py" tests diff --git a/alembic/versions/d05669b60ebe_migrate_agents_to_orm.py b/alembic/versions/d05669b60ebe_migrate_agents_to_orm.py new file mode 100644 index 0000000000..d03652c85f --- /dev/null +++ b/alembic/versions/d05669b60ebe_migrate_agents_to_orm.py @@ -0,0 +1,175 @@ +"""Migrate agents to orm + +Revision ID: d05669b60ebe +Revises: c5d964280dff +Create Date: 2024-12-12 10:25:31.825635 + +""" + +from typing import Sequence, Union + +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = "d05669b60ebe" +down_revision: Union[str, None] = "c5d964280dff" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table( + "sources_agents", + sa.Column("agent_id", sa.String(), nullable=False), + sa.Column("source_id", sa.String(), nullable=False), + sa.ForeignKeyConstraint( + ["agent_id"], + ["agents.id"], + ), + sa.ForeignKeyConstraint( + ["source_id"], + ["sources.id"], + ), + sa.PrimaryKeyConstraint("agent_id", "source_id"), + ) + op.drop_index("agent_source_mapping_idx_user", table_name="agent_source_mapping") + op.drop_table("agent_source_mapping") + op.add_column("agents", sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=True)) + op.add_column("agents", sa.Column("is_deleted", sa.Boolean(), server_default=sa.text("FALSE"), nullable=False)) + op.add_column("agents", sa.Column("_created_by_id", sa.String(), nullable=True)) + op.add_column("agents", sa.Column("_last_updated_by_id", sa.String(), nullable=True)) + op.add_column("agents", sa.Column("organization_id", sa.String(), nullable=True)) + # Populate `organization_id` based on `user_id` + # Use a raw SQL query to update the organization_id + op.execute( + """ + UPDATE agents + SET organization_id = users.organization_id + FROM users + WHERE agents.user_id = users.id + """ + ) + op.alter_column("agents", "organization_id", nullable=False) + op.alter_column("agents", "name", existing_type=sa.VARCHAR(), nullable=True) + op.drop_index("agents_idx_user", table_name="agents") + op.create_unique_constraint("unique_org_agent_name", "agents", ["organization_id", "name"]) + op.create_foreign_key(None, "agents", "organizations", ["organization_id"], ["id"]) + op.drop_column("agents", "tool_names") + op.drop_column("agents", "user_id") + op.drop_constraint("agents_tags_organization_id_fkey", "agents_tags", type_="foreignkey") + op.drop_column("agents_tags", "_created_by_id") + op.drop_column("agents_tags", "_last_updated_by_id") + op.drop_column("agents_tags", "updated_at") + op.drop_column("agents_tags", "id") + op.drop_column("agents_tags", "is_deleted") + op.drop_column("agents_tags", "created_at") + op.drop_column("agents_tags", "organization_id") + op.create_unique_constraint("unique_agent_block", "blocks_agents", ["agent_id", "block_id"]) + op.drop_constraint("fk_block_id_label", "blocks_agents", type_="foreignkey") + op.create_foreign_key( + "fk_block_id_label", "blocks_agents", "block", ["block_id", "block_label"], ["id", "label"], initially="DEFERRED", deferrable=True + ) + op.drop_column("blocks_agents", "_created_by_id") + op.drop_column("blocks_agents", "_last_updated_by_id") + op.drop_column("blocks_agents", "updated_at") + op.drop_column("blocks_agents", "id") + op.drop_column("blocks_agents", "is_deleted") + op.drop_column("blocks_agents", "created_at") + op.drop_constraint("unique_tool_per_agent", "tools_agents", type_="unique") + op.create_unique_constraint("unique_agent_tool", "tools_agents", ["agent_id", "tool_id"]) + op.drop_constraint("fk_tool_id", "tools_agents", type_="foreignkey") + op.drop_constraint("tools_agents_agent_id_fkey", "tools_agents", type_="foreignkey") + op.create_foreign_key(None, "tools_agents", "tools", ["tool_id"], ["id"], ondelete="CASCADE") + op.create_foreign_key(None, "tools_agents", "agents", ["agent_id"], ["id"], ondelete="CASCADE") + op.drop_column("tools_agents", "_created_by_id") + op.drop_column("tools_agents", "tool_name") + op.drop_column("tools_agents", "_last_updated_by_id") + op.drop_column("tools_agents", "updated_at") + op.drop_column("tools_agents", "id") + op.drop_column("tools_agents", "is_deleted") + op.drop_column("tools_agents", "created_at") + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column( + "tools_agents", + sa.Column("created_at", postgresql.TIMESTAMP(timezone=True), server_default=sa.text("now()"), autoincrement=False, nullable=True), + ) + op.add_column( + "tools_agents", sa.Column("is_deleted", sa.BOOLEAN(), server_default=sa.text("false"), autoincrement=False, nullable=False) + ) + op.add_column("tools_agents", sa.Column("id", sa.VARCHAR(), autoincrement=False, nullable=False)) + op.add_column( + "tools_agents", + sa.Column("updated_at", postgresql.TIMESTAMP(timezone=True), server_default=sa.text("now()"), autoincrement=False, nullable=True), + ) + op.add_column("tools_agents", sa.Column("_last_updated_by_id", sa.VARCHAR(), autoincrement=False, nullable=True)) + op.add_column("tools_agents", sa.Column("tool_name", sa.VARCHAR(), autoincrement=False, nullable=False)) + op.add_column("tools_agents", sa.Column("_created_by_id", sa.VARCHAR(), autoincrement=False, nullable=True)) + op.drop_constraint(None, "tools_agents", type_="foreignkey") + op.drop_constraint(None, "tools_agents", type_="foreignkey") + op.create_foreign_key("tools_agents_agent_id_fkey", "tools_agents", "agents", ["agent_id"], ["id"]) + op.create_foreign_key("fk_tool_id", "tools_agents", "tools", ["tool_id"], ["id"]) + op.drop_constraint("unique_agent_tool", "tools_agents", type_="unique") + op.create_unique_constraint("unique_tool_per_agent", "tools_agents", ["agent_id", "tool_name"]) + op.add_column( + "blocks_agents", + sa.Column("created_at", postgresql.TIMESTAMP(timezone=True), server_default=sa.text("now()"), autoincrement=False, nullable=True), + ) + op.add_column( + "blocks_agents", sa.Column("is_deleted", sa.BOOLEAN(), server_default=sa.text("false"), autoincrement=False, nullable=False) + ) + op.add_column("blocks_agents", sa.Column("id", sa.VARCHAR(), autoincrement=False, nullable=False)) + op.add_column( + "blocks_agents", + sa.Column("updated_at", postgresql.TIMESTAMP(timezone=True), server_default=sa.text("now()"), autoincrement=False, nullable=True), + ) + op.add_column("blocks_agents", sa.Column("_last_updated_by_id", sa.VARCHAR(), autoincrement=False, nullable=True)) + op.add_column("blocks_agents", sa.Column("_created_by_id", sa.VARCHAR(), autoincrement=False, nullable=True)) + op.drop_constraint("fk_block_id_label", "blocks_agents", type_="foreignkey") + op.create_foreign_key("fk_block_id_label", "blocks_agents", "block", ["block_id", "block_label"], ["id", "label"]) + op.drop_constraint("unique_agent_block", "blocks_agents", type_="unique") + op.add_column("agents_tags", sa.Column("organization_id", sa.VARCHAR(), autoincrement=False, nullable=False)) + op.add_column( + "agents_tags", + sa.Column("created_at", postgresql.TIMESTAMP(timezone=True), server_default=sa.text("now()"), autoincrement=False, nullable=True), + ) + op.add_column( + "agents_tags", sa.Column("is_deleted", sa.BOOLEAN(), server_default=sa.text("false"), autoincrement=False, nullable=False) + ) + op.add_column("agents_tags", sa.Column("id", sa.VARCHAR(), autoincrement=False, nullable=False)) + op.add_column( + "agents_tags", + sa.Column("updated_at", postgresql.TIMESTAMP(timezone=True), server_default=sa.text("now()"), autoincrement=False, nullable=True), + ) + op.add_column("agents_tags", sa.Column("_last_updated_by_id", sa.VARCHAR(), autoincrement=False, nullable=True)) + op.add_column("agents_tags", sa.Column("_created_by_id", sa.VARCHAR(), autoincrement=False, nullable=True)) + op.create_foreign_key("agents_tags_organization_id_fkey", "agents_tags", "organizations", ["organization_id"], ["id"]) + op.add_column("agents", sa.Column("user_id", sa.VARCHAR(), autoincrement=False, nullable=False)) + op.add_column("agents", sa.Column("tool_names", postgresql.JSON(astext_type=sa.Text()), autoincrement=False, nullable=True)) + op.drop_constraint(None, "agents", type_="foreignkey") + op.drop_constraint("unique_org_agent_name", "agents", type_="unique") + op.create_index("agents_idx_user", "agents", ["user_id"], unique=False) + op.alter_column("agents", "name", existing_type=sa.VARCHAR(), nullable=False) + op.drop_column("agents", "organization_id") + op.drop_column("agents", "_last_updated_by_id") + op.drop_column("agents", "_created_by_id") + op.drop_column("agents", "is_deleted") + op.drop_column("agents", "updated_at") + op.create_table( + "agent_source_mapping", + sa.Column("id", sa.VARCHAR(), autoincrement=False, nullable=False), + sa.Column("user_id", sa.VARCHAR(), autoincrement=False, nullable=False), + sa.Column("agent_id", sa.VARCHAR(), autoincrement=False, nullable=False), + sa.Column("source_id", sa.VARCHAR(), autoincrement=False, nullable=False), + sa.PrimaryKeyConstraint("id", name="agent_source_mapping_pkey"), + ) + op.create_index("agent_source_mapping_idx_user", "agent_source_mapping", ["user_id", "agent_id", "source_id"], unique=False) + op.drop_table("sources_agents") + # ### end Alembic commands ### diff --git a/alembic/versions/d14ae606614c_move_organizations_users_tools_to_orm.py b/alembic/versions/d14ae606614c_move_organizations_users_tools_to_orm.py index c05775eb1c..e8733313f5 100644 --- a/alembic/versions/d14ae606614c_move_organizations_users_tools_to_orm.py +++ b/alembic/versions/d14ae606614c_move_organizations_users_tools_to_orm.py @@ -30,7 +30,7 @@ def upgrade() -> None: op.execute("DELETE FROM tools") # ### commands auto generated by Alembic - please adjust! ### - op.add_column("agents", sa.Column("tool_rules", letta.metadata.ToolRulesColumn(), nullable=True)) + op.add_column("agents", sa.Column("tool_rules", letta.orm.agent.ToolRulesColumn(), nullable=True)) op.alter_column("block", "name", new_column_name="template_name", nullable=True) op.add_column("organizations", sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=True)) op.add_column("organizations", sa.Column("is_deleted", sa.Boolean(), server_default=sa.text("FALSE"), nullable=False)) diff --git a/examples/composio_tool_usage.py b/examples/composio_tool_usage.py index 877d375456..c3c8189581 100644 --- a/examples/composio_tool_usage.py +++ b/examples/composio_tool_usage.py @@ -74,7 +74,7 @@ def main(): """ # Create an agent - agent = client.create_agent(name=agent_uuid, memory=ChatMemory(human="My name is Matt.", persona=persona), tools=[tool.name]) + agent = client.create_agent(name=agent_uuid, memory=ChatMemory(human="My name is Matt.", persona=persona), tool_ids=[tool.id]) print(f"Created agent: {agent.name} with ID {str(agent.id)}") # Send a message to the agent diff --git a/examples/docs/agent_advanced.py b/examples/docs/agent_advanced.py index 311aa92ac2..95da5c34e8 100644 --- a/examples/docs/agent_advanced.py +++ b/examples/docs/agent_advanced.py @@ -29,7 +29,7 @@ # whether to include base letta tools (default: True) include_base_tools=True, # list of additional tools (by name) to add to the agent - tools=[], + tool_ids=[], ) print(f"Created agent with name {agent_state.name} and unique ID {agent_state.id}") diff --git a/examples/docs/tools.py b/examples/docs/tools.py index b41fb501ad..837a7dda2f 100644 --- a/examples/docs/tools.py +++ b/examples/docs/tools.py @@ -36,7 +36,7 @@ def roll_d20() -> str: # create a new agent agent_state = client.create_agent( # create the agent with an additional tool - tools=[tool.name], + tool_ids=[tool.id], # add tool rules that terminate execution after specific tools tool_rules=[ # exit after roll_d20 is called @@ -45,7 +45,7 @@ def roll_d20() -> str: TerminalToolRule(tool_name="send_message"), ], ) -print(f"Created agent with name {agent_state.name} with tools {agent_state.tool_names}") +print(f"Created agent with name {agent_state.name} with tools {[t.name for t in agent_state.tools]}") # Message an agent response = client.send_message(agent_id=agent_state.id, role="user", message="roll a dice") @@ -61,7 +61,8 @@ def roll_d20() -> str: client.delete_agent(agent_id=agent_state.id) # create an agent with only a subset of default tools -agent_state = client.create_agent(include_base_tools=False, tools=[tool.name, "send_message"]) +send_message_tool = client.get_tool_id("send_message") +agent_state = client.create_agent(include_base_tools=False, tool_ids=[tool.id, send_message_tool]) # message the agent to search archival memory (will be unable to do so) response = client.send_message(agent_id=agent_state.id, role="user", message="search your archival memory") diff --git a/examples/langchain_tool_usage.py b/examples/langchain_tool_usage.py index eb207694fe..cf55d12084 100644 --- a/examples/langchain_tool_usage.py +++ b/examples/langchain_tool_usage.py @@ -67,7 +67,9 @@ def main(): """ # Create an agent - agent_state = client.create_agent(name=agent_uuid, memory=ChatMemory(human="My name is Matt.", persona=persona), tools=[tool_name]) + agent_state = client.create_agent( + name=agent_uuid, memory=ChatMemory(human="My name is Matt.", persona=persona), tool_ids=[wikipedia_query_tool.id] + ) print(f"Created agent: {agent_state.name} with ID {str(agent_state.id)}") # Send a message to the agent diff --git a/examples/tool_rule_usage.py b/examples/tool_rule_usage.py index aca7c4f8f7..45c56ec3eb 100644 --- a/examples/tool_rule_usage.py +++ b/examples/tool_rule_usage.py @@ -108,7 +108,7 @@ def main(): ] # 4. Create the agent - agent_state = setup_agent(client, config_file, agent_uuid=agent_uuid, tools=[t.name for t in tools], tool_rules=tool_rules) + agent_state = setup_agent(client, config_file, agent_uuid=agent_uuid, tool_ids=[t.id for t in tools], tool_rules=tool_rules) # 5. Ask for the final secret word response = client.user_message(agent_id=agent_state.id, message="What is the fourth secret word?") diff --git a/letta/__init__.py b/letta/__init__.py index 0a397aeda9..3936cbb72b 100644 --- a/letta/__init__.py +++ b/letta/__init__.py @@ -4,7 +4,7 @@ from letta.client.client import LocalClient, RESTClient, create_client # imports for easier access -from letta.schemas.agent import AgentState, PersistedAgentState +from letta.schemas.agent import AgentState from letta.schemas.block import Block from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.enums import JobStatus diff --git a/letta/agent.py b/letta/agent.py index 4060c3637e..9c136da84a 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -6,8 +6,6 @@ from abc import ABC, abstractmethod from typing import List, Literal, Optional, Tuple, Union -from tqdm import tqdm - from letta.constants import ( BASE_TOOLS, CLI_WARNING_PREFIX, @@ -30,7 +28,7 @@ from letta.memory import summarize_messages from letta.metadata import MetadataStore from letta.orm import User -from letta.schemas.agent import AgentState, AgentStepResponse +from letta.schemas.agent import AgentState, AgentStepResponse, UpdateAgent from letta.schemas.block import BlockUpdate from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.enums import MessageRole @@ -49,12 +47,12 @@ from letta.schemas.tool_rule import TerminalToolRule from letta.schemas.usage import LettaUsageStatistics from letta.schemas.user import User as PydanticUser +from letta.services.agent_manager import AgentManager from letta.services.block_manager import BlockManager from letta.services.message_manager import MessageManager from letta.services.passage_manager import PassageManager from letta.services.source_manager import SourceManager from letta.services.tool_execution_sandbox import ToolExecutionSandbox -from letta.services.user_manager import UserManager from letta.streaming_interface import StreamingRefreshCLIInterface from letta.system import ( get_heartbeat, @@ -316,7 +314,7 @@ def __init__( else: printd(f"Agent.__init__ :: creating, state={agent_state.message_ids}") - assert self.agent_state.id is not None and self.agent_state.user_id is not None + assert self.agent_state.id is not None and self.agent_state.created_by_id is not None # Generate a sequence of initial messages to put in the buffer init_messages = initialize_message_sequence( @@ -335,7 +333,7 @@ def __init__( # We always need the system prompt up front system_message_obj = Message.dict_to_message( agent_id=self.agent_state.id, - user_id=self.agent_state.user_id, + user_id=self.agent_state.created_by_id, model=self.model, openai_message_dict=init_messages[0], ) @@ -358,7 +356,7 @@ def __init__( # Cast to Message objects init_messages = [ Message.dict_to_message( - agent_id=self.agent_state.id, user_id=self.agent_state.user_id, model=self.model, openai_message_dict=msg + agent_id=self.agent_state.id, user_id=self.agent_state.created_by_id, model=self.model, openai_message_dict=msg ) for msg in init_messages ] @@ -439,11 +437,12 @@ def execute_tool_and_persist_state(self, function_name, function_to_call, functi else: # execute tool in a sandbox # TODO: allow agent_state to specify which sandbox to execute tools in - sandbox_run_result = ToolExecutionSandbox(function_name, function_args, self.agent_state.user_id).run( + sandbox_run_result = ToolExecutionSandbox(function_name, function_args, self.agent_state.created_by_id).run( agent_state=self.agent_state.__deepcopy__() ) function_response, updated_agent_state = sandbox_run_result.func_return, sandbox_run_result.agent_state assert orig_memory_str == self.agent_state.memory.compile(), "Memory should not be modified in a sandbox tool" + self.update_memory_if_change(updated_agent_state.memory) except Exception as e: # Need to catch error here, or else trunction wont happen @@ -573,7 +572,7 @@ def append_to_messages(self, added_messages: List[dict]): added_messages_objs = [ Message.dict_to_message( agent_id=self.agent_state.id, - user_id=self.agent_state.user_id, + user_id=self.agent_state.created_by_id, model=self.model, openai_message_dict=msg, ) @@ -603,7 +602,7 @@ def _get_ai_reply( response = create( llm_config=self.agent_state.llm_config, messages=message_sequence, - user_id=self.agent_state.user_id, + user_id=self.agent_state.created_by_id, functions=allowed_functions, functions_python=self.functions_python, function_call=function_call, @@ -689,7 +688,7 @@ def _handle_ai_response( Message.dict_to_message( id=response_message_id, agent_id=self.agent_state.id, - user_id=self.agent_state.user_id, + user_id=self.agent_state.created_by_id, model=self.model, openai_message_dict=response_message.model_dump(), ) @@ -722,7 +721,7 @@ def _handle_ai_response( messages.append( Message.dict_to_message( agent_id=self.agent_state.id, - user_id=self.agent_state.user_id, + user_id=self.agent_state.created_by_id, model=self.model, openai_message_dict={ "role": "tool", @@ -745,7 +744,7 @@ def _handle_ai_response( messages.append( Message.dict_to_message( agent_id=self.agent_state.id, - user_id=self.agent_state.user_id, + user_id=self.agent_state.created_by_id, model=self.model, openai_message_dict={ "role": "tool", @@ -823,7 +822,7 @@ def _handle_ai_response( messages.append( Message.dict_to_message( agent_id=self.agent_state.id, - user_id=self.agent_state.user_id, + user_id=self.agent_state.created_by_id, model=self.model, openai_message_dict={ "role": "tool", @@ -842,7 +841,7 @@ def _handle_ai_response( messages.append( Message.dict_to_message( agent_id=self.agent_state.id, - user_id=self.agent_state.user_id, + user_id=self.agent_state.created_by_id, model=self.model, openai_message_dict={ "role": "tool", @@ -861,7 +860,7 @@ def _handle_ai_response( Message.dict_to_message( id=response_message_id, agent_id=self.agent_state.id, - user_id=self.agent_state.user_id, + user_id=self.agent_state.created_by_id, model=self.model, openai_message_dict=response_message.model_dump(), ) @@ -920,7 +919,7 @@ def step( # logger.debug("Saving agent state") # save updated state if ms: - save_agent(self, ms) + save_agent(self) # Chain stops if not chaining: @@ -931,10 +930,10 @@ def step( break # Chain handlers elif token_warning: - assert self.agent_state.user_id is not None + assert self.agent_state.created_by_id is not None next_input_message = Message.dict_to_message( agent_id=self.agent_state.id, - user_id=self.agent_state.user_id, + user_id=self.agent_state.created_by_id, model=self.model, openai_message_dict={ "role": "user", # TODO: change to system? @@ -943,10 +942,10 @@ def step( ) continue # always chain elif function_failed: - assert self.agent_state.user_id is not None + assert self.agent_state.created_by_id is not None next_input_message = Message.dict_to_message( agent_id=self.agent_state.id, - user_id=self.agent_state.user_id, + user_id=self.agent_state.created_by_id, model=self.model, openai_message_dict={ "role": "user", # TODO: change to system? @@ -955,10 +954,10 @@ def step( ) continue # always chain elif heartbeat_request: - assert self.agent_state.user_id is not None + assert self.agent_state.created_by_id is not None next_input_message = Message.dict_to_message( agent_id=self.agent_state.id, - user_id=self.agent_state.user_id, + user_id=self.agent_state.created_by_id, model=self.model, openai_message_dict={ "role": "user", # TODO: change to system? @@ -1129,10 +1128,10 @@ def step_user_message(self, user_message_str: str, **kwargs) -> AgentStepRespons openai_message_dict = {"role": "user", "content": cleaned_user_message_text, "name": name} # Create the associated Message object (in the database) - assert self.agent_state.user_id is not None, "User ID is not set" + assert self.agent_state.created_by_id is not None, "User ID is not set" user_message = Message.dict_to_message( agent_id=self.agent_state.id, - user_id=self.agent_state.user_id, + user_id=self.agent_state.created_by_id, model=self.model, openai_message_dict=openai_message_dict, # created_at=timestamp, @@ -1232,7 +1231,7 @@ def summarize_messages_inplace(self, cutoff=None, preserve_last_N_messages=True, [ Message.dict_to_message( agent_id=self.agent_state.id, - user_id=self.agent_state.user_id, + user_id=self.agent_state.created_by_id, model=self.model, openai_message_dict=packed_summary_message, ) @@ -1260,7 +1259,7 @@ def _swap_system_message_in_buffer(self, new_system_message: str): assert isinstance(new_system_message, str) new_system_message_obj = Message.dict_to_message( agent_id=self.agent_state.id, - user_id=self.agent_state.user_id, + user_id=self.agent_state.created_by_id, model=self.model, openai_message_dict={"role": "system", "content": new_system_message}, ) @@ -1371,7 +1370,14 @@ def migrate_embedding(self, embedding_config: EmbeddingConfig): # TODO: recall memory raise NotImplementedError() - def attach_source(self, user: PydanticUser, source_id: str, source_manager: SourceManager, ms: MetadataStore, page_size: Optional[int] = None): + def attach_source( + self, + user: PydanticUser, + source_id: str, + source_manager: SourceManager, + agent_manager: AgentManager, + page_size: Optional[int] = None, + ): """Attach data with name `source_name` to the agent from source_connector.""" # TODO: eventually, adding a data source should just give access to the retriever the source table, rather than modifying archival memory passages = self.passage_manager.list_passages(actor=user, source_id=source_id, limit=page_size) @@ -1384,7 +1390,7 @@ def attach_source(self, user: PydanticUser, source_id: str, source_manager: Sour agents_passages = self.passage_manager.list_passages(actor=user, agent_id=self.agent_state.id, source_id=source_id, limit=page_size) passage_size = self.passage_manager.size(actor=user, agent_id=self.agent_state.id, source_id=source_id) assert all([p.agent_id == self.agent_state.id for p in agents_passages]) - assert len(agents_passages) == passage_size # sanity check + assert len(agents_passages) == passage_size # sanity check assert passage_size == len(passages), f"Expected {len(passages)} passages, got {passage_size}" # attach to agent @@ -1393,7 +1399,7 @@ def attach_source(self, user: PydanticUser, source_id: str, source_manager: Sour # NOTE: need this redundant line here because we haven't migrated agent to ORM yet # TODO: delete @matt and remove - ms.attach_source(agent_id=self.agent_state.id, source_id=source_id, user_id=self.agent_state.user_id) + agent_manager.attach_source(agent_id=self.agent_state.id, source_id=source_id, actor=user) printd( f"Attached data source {source.name} to agent {self.agent_state.name}, consisting of {len(passages)}. Agent now has {passage_size} embeddings in archival memory.", @@ -1610,20 +1616,31 @@ def count_tokens(self) -> int: return context_window_breakdown.context_window_size_current -def save_agent(agent: Agent, ms: MetadataStore): +def save_agent(agent: Agent): """Save agent to metadata store""" - agent.update_state() agent_state = agent.agent_state assert isinstance(agent_state.memory, Memory), f"Memory is not a Memory object: {type(agent_state.memory)}" # TODO: move this to agent manager + # TODO: Completely strip out metadata # convert to persisted model - persisted_agent_state = agent.agent_state.to_persisted_agent_state() - if ms.get_agent(agent_id=persisted_agent_state.id): - ms.update_agent(persisted_agent_state) - else: - ms.create_agent(persisted_agent_state) + agent_manager = AgentManager() + update_agent = UpdateAgent( + name=agent_state.name, + tool_ids=[t.id for t in agent_state.tools], + source_ids=[s.id for s in agent_state.sources], + block_ids=[b.id for b in agent_state.memory.blocks], + tags=agent_state.tags, + system=agent_state.system, + tool_rules=agent_state.tool_rules, + llm_config=agent_state.llm_config, + embedding_config=agent_state.embedding_config, + message_ids=agent_state.message_ids, + description=agent_state.description, + metadata_=agent_state.metadata_, + ) + agent_manager.update_agent(agent_id=agent_state.id, agent_update=update_agent, actor=agent.user) def strip_name_field_from_user_message(user_message_text: str) -> Tuple[str, Optional[str]]: diff --git a/letta/chat_only_agent.py b/letta/chat_only_agent.py index 2051a54778..eb029e93dd 100644 --- a/letta/chat_only_agent.py +++ b/letta/chat_only_agent.py @@ -2,7 +2,6 @@ from typing import List, Optional, Union from letta.agent import Agent - from letta.interface import AgentInterface from letta.metadata import MetadataStore from letta.prompts import gpt_system @@ -68,8 +67,10 @@ def generate_offline_memory_agent(): name="chat_agent_persona_new", label="chat_agent_persona_new", value=conversation_persona_block.value, limit=2000 ) - recent_convo = "".join([str(message) for message in self.messages[3:]])[-self.recent_convo_limit:] - conversation_messages_block = Block(name="conversation_block", label="conversation_block", value=recent_convo, limit=self.recent_convo_limit) + recent_convo = "".join([str(message) for message in self.messages[3:]])[-self.recent_convo_limit :] + conversation_messages_block = Block( + name="conversation_block", label="conversation_block", value=recent_convo, limit=self.recent_convo_limit + ) offline_memory = BasicBlockMemory( blocks=[ @@ -89,7 +90,7 @@ def generate_offline_memory_agent(): memory=offline_memory, llm_config=LLMConfig.default_config("gpt-4"), embedding_config=EmbeddingConfig.default_config("text-embedding-ada-002"), - tools=self.agent_state.metadata_.get("offline_memory_tools", []), + tool_ids=self.agent_state.metadata_.get("offline_memory_tools", []), include_base_tools=False, ) self.offline_memory_agent.memory.update_block_value(label="conversation_block", value=recent_convo) diff --git a/letta/cli/cli.py b/letta/cli/cli.py index 81e27c9af6..e941589d46 100644 --- a/letta/cli/cli.py +++ b/letta/cli/cli.py @@ -140,7 +140,6 @@ def run( # read user id from config ms = MetadataStore(config) client = create_client() - server = client.server # determine agent to use, if not provided if not yes and not agent: @@ -165,8 +164,6 @@ def run( persona = persona if persona else config.persona if agent and agent_state: # use existing agent typer.secho(f"\n🔁 Using existing agent {agent}", fg=typer.colors.GREEN) - # agent_config = AgentConfig.load(agent) - # agent_state = ms.get_agent(agent_name=agent, user_id=user_id) printd("Loading agent state:", agent_state.id) printd("Agent state:", agent_state.name) # printd("State path:", agent_config.save_state_dir()) @@ -224,8 +221,6 @@ def run( ) # create agent - tools = [server.tool_manager.get_tool_by_name(tool_name=tool_name, actor=client.user) for tool_name in agent_state.tool_names] - agent_state.tools = tools letta_agent = Agent(agent_state=agent_state, interface=interface(), user=client.user) else: # create new agent @@ -317,7 +312,7 @@ def run( metadata=metadata, ) assert isinstance(agent_state.memory, Memory), f"Expected Memory, got {type(agent_state.memory)}" - typer.secho(f"-> 🛠️ {len(agent_state.tools)} tools: {', '.join([t for t in agent_state.tool_names])}", fg=typer.colors.WHITE) + typer.secho(f"-> 🛠️ {len(agent_state.tools)} tools: {', '.join([t.name for t in agent_state.tools])}", fg=typer.colors.WHITE) letta_agent = Agent( interface=interface(), @@ -326,7 +321,7 @@ def run( first_message_verify_mono=True if (model is not None and "gpt-4" in model) else False, user=client.user, ) - save_agent(agent=letta_agent, ms=ms) + save_agent(agent=letta_agent) typer.secho(f"🎉 Created new agent '{letta_agent.agent_state.name}' (id={letta_agent.agent_state.id})", fg=typer.colors.GREEN) # start event loop diff --git a/letta/client/client.py b/letta/client/client.py index 5cf6f9adc2..d3259214e4 100644 --- a/letta/client/client.py +++ b/letta/client/client.py @@ -15,7 +15,8 @@ ) from letta.data_sources.connectors import DataConnector from letta.functions.functions import parse_source_code -from letta.schemas.agent import AgentState, AgentType, CreateAgent, UpdateAgentState +from letta.orm.errors import NoResultFound +from letta.schemas.agent import AgentState, AgentType, CreateAgent, UpdateAgent from letta.schemas.block import Block, BlockUpdate, CreateBlock, Human, Persona from letta.schemas.embedding_config import EmbeddingConfig @@ -65,10 +66,8 @@ def create_client(base_url: Optional[str] = None, token: Optional[str] = None): class AbstractClient(object): def __init__( self, - auto_save: bool = False, debug: bool = False, ): - self.auto_save = auto_save self.debug = debug def agent_exists(self, agent_id: Optional[str] = None, agent_name: Optional[str] = None) -> bool: @@ -81,8 +80,9 @@ def create_agent( embedding_config: Optional[EmbeddingConfig] = None, llm_config: Optional[LLMConfig] = None, memory=None, + block_ids: Optional[List[str]] = None, system: Optional[str] = None, - tools: Optional[List[str]] = None, + tool_ids: Optional[List[str]] = None, tool_rules: Optional[List[BaseToolRule]] = None, include_base_tools: Optional[bool] = True, metadata: Optional[Dict] = {"human:": DEFAULT_HUMAN, "persona": DEFAULT_PERSONA}, @@ -97,7 +97,7 @@ def update_agent( name: Optional[str] = None, description: Optional[str] = None, system: Optional[str] = None, - tools: Optional[List[str]] = None, + tool_ids: Optional[List[str]] = None, metadata: Optional[Dict] = None, llm_config: Optional[LLMConfig] = None, embedding_config: Optional[EmbeddingConfig] = None, @@ -436,7 +436,6 @@ def __init__( Initializes a new instance of Client class. Args: - auto_save (bool): Whether to automatically save changes. user_id (str): The user ID. debug (bool): Whether to print debug information. default_llm_config (Optional[LLMConfig]): The default LLM configuration. @@ -456,6 +455,7 @@ def list_agents(self, tags: Optional[List[str]] = None) -> List[AgentState]: params = {} if tags: params["tags"] = tags + params["match_all_tags"] = False response = requests.get(f"{self.base_url}/{self.api_prefix}/agents", headers=self.headers, params=params) return [AgentState(**agent) for agent in response.json()] @@ -491,10 +491,12 @@ def create_agent( llm_config: LLMConfig = None, # memory memory: Memory = ChatMemory(human=get_human_text(DEFAULT_HUMAN), persona=get_persona_text(DEFAULT_PERSONA)), + # Existing blocks + block_ids: Optional[List[str]] = None, # system system: Optional[str] = None, # tools - tools: Optional[List[str]] = None, + tool_ids: Optional[List[str]] = None, tool_rules: Optional[List[BaseToolRule]] = None, include_base_tools: Optional[bool] = True, # metadata @@ -511,7 +513,7 @@ def create_agent( llm_config (LLMConfig): LLM configuration memory (Memory): Memory configuration system (str): System configuration - tools (List[str]): List of tools + tool_ids (List[str]): List of tool ids include_base_tools (bool): Include base tools metadata (Dict): Metadata description (str): Description @@ -520,31 +522,54 @@ def create_agent( Returns: agent_state (AgentState): State of the created agent """ + tool_ids = tool_ids or [] tool_names = [] - if tools: - tool_names += tools if include_base_tools: tool_names += BASE_TOOLS tool_names += BASE_MEMORY_TOOLS + tool_ids += [self.get_tool_id(tool_name=name) for name in tool_names] assert embedding_config or self._default_embedding_config, f"Embedding config must be provided" assert llm_config or self._default_llm_config, f"LLM config must be provided" + # TODO: This should not happen here, we need to have clear separation between create/add blocks + # TODO: This is insanely hacky and a result of allowing free-floating blocks + # TODO: When we create the block, it gets it's own block ID + blocks = [] + for block in memory.get_blocks(): + blocks.append( + self.create_block( + label=block.label, + value=block.value, + limit=block.limit, + template_name=block.template_name, + is_template=block.is_template, + ) + ) + memory.blocks = blocks + block_ids = block_ids or [] + # create agent - request = CreateAgent( - name=name, - description=description, - metadata_=metadata, - memory_blocks=[], - tools=tool_names, - tool_rules=tool_rules, - system=system, - agent_type=agent_type, - llm_config=llm_config if llm_config else self._default_llm_config, - embedding_config=embedding_config if embedding_config else self._default_embedding_config, - initial_message_sequence=initial_message_sequence, - tags=tags, - ) + create_params = { + "description": description, + "metadata_": metadata, + "memory_blocks": [], + "block_ids": [b.id for b in memory.get_blocks()] + block_ids, + "tool_ids": tool_ids, + "tool_rules": tool_rules, + "system": system, + "agent_type": agent_type, + "llm_config": llm_config if llm_config else self._default_llm_config, + "embedding_config": embedding_config if embedding_config else self._default_embedding_config, + "initial_message_sequence": initial_message_sequence, + "tags": tags, + } + + # Only add name if it's not None + if name is not None: + create_params["name"] = name + + request = CreateAgent(**create_params) # Use model_dump_json() instead of model_dump() # If we use model_dump(), the datetime objects will not be serialized correctly @@ -561,14 +586,6 @@ def create_agent( # gather agent state agent_state = AgentState(**response.json()) - # create and link blocks - for block in memory.get_blocks(): - if not self.get_block(block.id): - # note: this does not update existing blocks - # WARNING: this resets the block ID - this method is a hack for backwards compat, should eventually use CreateBlock not Memory - block = self.create_block(label=block.label, value=block.value, limit=block.limit) - self.link_agent_memory_block(agent_id=agent_state.id, block_id=block.id) - # refresh and return agent return self.get_agent(agent_state.id) @@ -602,7 +619,7 @@ def update_agent( name: Optional[str] = None, description: Optional[str] = None, system: Optional[str] = None, - tool_names: Optional[List[str]] = None, + tool_ids: Optional[List[str]] = None, metadata: Optional[Dict] = None, llm_config: Optional[LLMConfig] = None, embedding_config: Optional[EmbeddingConfig] = None, @@ -617,7 +634,7 @@ def update_agent( name (str): Name of the agent description (str): Description of the agent system (str): System configuration - tool_names (List[str]): List of tools + tool_ids (List[str]): List of tools metadata (Dict): Metadata llm_config (LLMConfig): LLM configuration embedding_config (EmbeddingConfig): Embedding configuration @@ -627,11 +644,10 @@ def update_agent( Returns: agent_state (AgentState): State of the updated agent """ - request = UpdateAgentState( - id=agent_id, + request = UpdateAgent( name=name, system=system, - tool_names=tool_names, + tool_ids=tool_ids, tags=tags, description=description, metadata_=metadata, @@ -742,7 +758,7 @@ def get_agent_id(self, agent_name: str) -> AgentState: agents = [AgentState(**agent) for agent in response.json()] if len(agents) == 0: return None - agents = [agents[0]] # TODO: @matt monkeypatched + agents = [agents[0]] # TODO: @matt monkeypatched assert len(agents) == 1, f"Multiple agents with the same name: {[(agents.name, agents.id) for agents in agents]}" return agents[0].id @@ -1052,7 +1068,7 @@ def update_block(self, block_id: str, name: Optional[str] = None, text: Optional raise ValueError(f"Failed to update block: {response.text}") return Block(**response.json()) - def get_block(self, block_id: str) -> Block: + def get_block(self, block_id: str) -> Optional[Block]: response = requests.get(f"{self.base_url}/{self.api_prefix}/blocks/{block_id}", headers=self.headers) if response.status_code == 404: return None @@ -1607,23 +1623,6 @@ def get_tool(self, id: str) -> Optional[Tool]: raise ValueError(f"Failed to get tool: {response.text}") return Tool(**response.json()) - def get_tool_id(self, name: str) -> Optional[str]: - """ - Get a tool ID by its name. - - Args: - id (str): ID of the tool - - Returns: - tool (Tool): Tool - """ - response = requests.get(f"{self.base_url}/{self.api_prefix}/tools/name/{name}", headers=self.headers) - if response.status_code == 404: - return None - elif response.status_code != 200: - raise ValueError(f"Failed to get tool: {response.text}") - return response.json() - def set_default_llm_config(self, llm_config: LLMConfig): """ Set the default LLM configuration @@ -2006,7 +2005,6 @@ class LocalClient(AbstractClient): A local client for Letta, which corresponds to a single user. Attributes: - auto_save (bool): Whether to automatically save changes. user_id (str): The user ID. debug (bool): Whether to print debug information. interface (QueuingInterface): The interface for the client. @@ -2015,7 +2013,6 @@ class LocalClient(AbstractClient): def __init__( self, - auto_save: bool = False, user_id: Optional[str] = None, org_id: Optional[str] = None, debug: bool = False, @@ -2026,11 +2023,9 @@ def __init__( Initializes a new instance of Client class. Args: - auto_save (bool): Whether to automatically save changes. user_id (str): The user ID. debug (bool): Whether to print debug information. """ - self.auto_save = auto_save # set logging levels letta.utils.DEBUG = debug @@ -2056,14 +2051,14 @@ def __init__( # get default user self.user_id = self.server.user_manager.DEFAULT_USER_ID - self.user = self.server.get_user_or_default(self.user_id) + self.user = self.server.user_manager.get_user_or_default(self.user_id) self.organization = self.server.get_organization_or_default(self.org_id) # agents def list_agents(self, tags: Optional[List[str]] = None) -> List[AgentState]: self.interface.clear() - return self.server.list_agents(user_id=self.user_id, tags=tags) + return self.server.agent_manager.list_agents(actor=self.user, tags=tags) def agent_exists(self, agent_id: Optional[str] = None, agent_name: Optional[str] = None) -> bool: """ @@ -2097,6 +2092,7 @@ def create_agent( llm_config: LLMConfig = None, # memory memory: Memory = ChatMemory(human=get_human_text(DEFAULT_HUMAN), persona=get_persona_text(DEFAULT_PERSONA)), + block_ids: Optional[List[str]] = None, # TODO: change to this when we are ready to migrate all the tests/examples (matches the REST API) # memory_blocks=[ # {"label": "human", "value": get_human_text(DEFAULT_HUMAN), "limit": 5000}, @@ -2105,7 +2101,7 @@ def create_agent( # system system: Optional[str] = None, # tools - tools: Optional[List[str]] = None, + tool_ids: Optional[List[str]] = None, tool_rules: Optional[List[BaseToolRule]] = None, include_base_tools: Optional[bool] = True, # metadata @@ -2132,55 +2128,53 @@ def create_agent( Returns: agent_state (AgentState): State of the created agent """ - - if name and self.agent_exists(agent_name=name): - raise ValueError(f"Agent with name {name} already exists (user_id={self.user_id})") - # construct list of tools + tool_ids = tool_ids or [] tool_names = [] - if tools: - tool_names += tools if include_base_tools: tool_names += BASE_TOOLS tool_names += BASE_MEMORY_TOOLS + tool_ids += [self.server.tool_manager.get_tool_by_name(tool_name=name, actor=self.user).id for name in tool_names] # check if default configs are provided assert embedding_config or self._default_embedding_config, f"Embedding config must be provided" assert llm_config or self._default_llm_config, f"LLM config must be provided" + # TODO: This should not happen here, we need to have clear separation between create/add blocks + for block in memory.get_blocks(): + self.server.block_manager.create_or_update_block(block, actor=self.user) + + # Also get any existing block_ids passed in + block_ids = block_ids or [] + # create agent + # Create the base parameters + create_params = { + "description": description, + "metadata_": metadata, + "memory_blocks": [], + "block_ids": [b.id for b in memory.get_blocks()] + block_ids, + "tool_ids": tool_ids, + "tool_rules": tool_rules, + "system": system, + "agent_type": agent_type, + "llm_config": llm_config if llm_config else self._default_llm_config, + "embedding_config": embedding_config if embedding_config else self._default_embedding_config, + "initial_message_sequence": initial_message_sequence, + "tags": tags, + } + + # Only add name if it's not None + if name is not None: + create_params["name"] = name + agent_state = self.server.create_agent( - CreateAgent( - name=name, - description=description, - metadata_=metadata, - # memory=memory, - memory_blocks=[], - # memory_blocks = memory.get_blocks(), - # memory_tools=memory_tools, - tools=tool_names, - tool_rules=tool_rules, - system=system, - agent_type=agent_type, - llm_config=llm_config if llm_config else self._default_llm_config, - embedding_config=embedding_config if embedding_config else self._default_embedding_config, - initial_message_sequence=initial_message_sequence, - tags=tags, - ), + CreateAgent(**create_params), actor=self.user, ) - # TODO: remove when we fully migrate to block creation CreateAgent model - # Link additional blocks to the agent (block ids created on the client) - # This needs to happen since the create agent does not allow passing in blocks which have already been persisted and have an ID - # So we create the agent and then link the blocks afterwards - user = self.server.get_user_or_default(self.user_id) - for block in memory.get_blocks(): - self.server.block_manager.create_or_update_block(block, actor=user) - self.server.link_block_to_agent_memory(user_id=self.user_id, agent_id=agent_state.id, block_id=block.id) - # TODO: get full agent state - return self.server.get_agent(agent_state.id) + return self.server.agent_manager.get_agent_by_id(agent_state.id, actor=self.user) def update_message( self, @@ -2202,6 +2196,7 @@ def update_message( tool_calls=tool_calls, tool_call_id=tool_call_id, ), + actor=self.user, ) return message @@ -2211,7 +2206,7 @@ def update_agent( name: Optional[str] = None, description: Optional[str] = None, system: Optional[str] = None, - tools: Optional[List[str]] = None, + tool_ids: Optional[List[str]] = None, tags: Optional[List[str]] = None, metadata: Optional[Dict] = None, llm_config: Optional[LLMConfig] = None, @@ -2239,11 +2234,11 @@ def update_agent( # TODO: add the abilitty to reset linked block_ids self.interface.clear() agent_state = self.server.update_agent( - UpdateAgentState( - id=agent_id, + agent_id, + UpdateAgent( name=name, system=system, - tool_names=tools, + tool_ids=tool_ids, tags=tags, description=description, metadata_=metadata, @@ -2315,7 +2310,7 @@ def delete_agent(self, agent_id: str): Args: agent_id (str): ID of the agent to delete """ - self.server.delete_agent(user_id=self.user_id, agent_id=agent_id) + self.server.agent_manager.delete_agent(agent_id=agent_id, actor=self.user) def get_agent_by_name(self, agent_name: str) -> AgentState: """ @@ -2328,7 +2323,7 @@ def get_agent_by_name(self, agent_name: str) -> AgentState: agent_state (AgentState): State of the agent """ self.interface.clear() - return self.server.get_agent_state(agent_name=agent_name, user_id=self.user_id, agent_id=None) + return self.server.agent_manager.get_agent_by_name(agent_name=agent_name, actor=self.user) def get_agent(self, agent_id: str) -> AgentState: """ @@ -2340,9 +2335,8 @@ def get_agent(self, agent_id: str) -> AgentState: Returns: agent_state (AgentState): State representation of the agent """ - # TODO: include agent_name self.interface.clear() - return self.server.get_agent_state(user_id=self.user_id, agent_id=agent_id) + return self.server.agent_manager.get_agent_by_id(agent_id=agent_id, actor=self.user) def get_agent_id(self, agent_name: str) -> Optional[str]: """ @@ -2357,7 +2351,12 @@ def get_agent_id(self, agent_name: str) -> Optional[str]: self.interface.clear() assert agent_name, f"Agent name must be provided" - return self.server.get_agent_id(name=agent_name, user_id=self.user_id) + + # TODO: Refactor this futher to not have downstream users expect Optionals - this should just error + try: + return self.server.agent_manager.get_agent_by_name(agent_name=agent_name, actor=self.user).id + except NoResultFound: + return None # memory def get_in_context_memory(self, agent_id: str) -> Memory: @@ -2370,7 +2369,7 @@ def get_in_context_memory(self, agent_id: str) -> Memory: Returns: memory (Memory): In-context memory of the agent """ - memory = self.server.get_agent_memory(agent_id=agent_id) + memory = self.server.get_agent_memory(agent_id=agent_id, actor=self.user) return memory def get_core_memory(self, agent_id: str) -> Memory: @@ -2388,7 +2387,7 @@ def update_in_context_memory(self, agent_id: str, section: str, value: Union[Lis """ # TODO: implement this (not sure what it should look like) - memory = self.server.update_agent_core_memory(user_id=self.user_id, agent_id=agent_id, label=section, value=value) + memory = self.server.update_agent_core_memory(agent_id=agent_id, label=section, value=value, actor=self.user) return memory def get_archival_memory_summary(self, agent_id: str) -> ArchivalMemorySummary: @@ -2402,7 +2401,7 @@ def get_archival_memory_summary(self, agent_id: str) -> ArchivalMemorySummary: summary (ArchivalMemorySummary): Summary of the archival memory """ - return self.server.get_archival_memory_summary(agent_id=agent_id) + return self.server.get_archival_memory_summary(agent_id=agent_id, actor=self.user) def get_recall_memory_summary(self, agent_id: str) -> RecallMemorySummary: """ @@ -2414,7 +2413,7 @@ def get_recall_memory_summary(self, agent_id: str) -> RecallMemorySummary: Returns: summary (RecallMemorySummary): Summary of the recall memory """ - return self.server.get_recall_memory_summary(agent_id=agent_id) + return self.server.get_recall_memory_summary(agent_id=agent_id, actor=self.user) def get_in_context_messages(self, agent_id: str) -> List[Message]: """ @@ -2426,7 +2425,7 @@ def get_in_context_messages(self, agent_id: str) -> List[Message]: Returns: messages (List[Message]): List of in-context messages """ - return self.server.get_in_context_messages(agent_id=agent_id) + return self.server.get_in_context_messages(agent_id=agent_id, actor=self.user) # agent interactions @@ -2446,11 +2445,7 @@ def send_messages( response (LettaResponse): Response from the agent """ self.interface.clear() - usage = self.server.send_messages(user_id=self.user_id, agent_id=agent_id, messages=messages) - - # auto-save - if self.auto_save: - self.save() + usage = self.server.send_messages(actor=self.user, agent_id=agent_id, messages=messages) # format messages return LettaResponse(messages=messages, usage=usage) @@ -2490,15 +2485,11 @@ def send_message( self.interface.clear() usage = self.server.send_messages( - user_id=self.user_id, + actor=self.user, agent_id=agent_id, messages=[MessageCreate(role=MessageRole(role), text=message, name=name)], ) - # auto-save - if self.auto_save: - self.save() - ## TODO: need to make sure date/timestamp is propely passed ## TODO: update self.interface.to_list() to return actual Message objects ## here, the message objects will have faulty created_by timestamps @@ -2547,16 +2538,9 @@ def run_command(self, agent_id: str, command: str) -> LettaResponse: self.interface.clear() usage = self.server.run_command(user_id=self.user_id, agent_id=agent_id, command=command) - # auto-save - if self.auto_save: - self.save() - # NOTE: messages/usage may be empty, depending on the command return LettaResponse(messages=self.interface.to_list(), usage=usage) - def save(self): - self.server.save_agents() - # archival memory # humans / personas @@ -3036,7 +3020,7 @@ def list_attached_sources(self, agent_id: str) -> List[Source]: Returns: sources (List[Source]): List of sources """ - return self.server.list_attached_sources(agent_id=agent_id) + return self.server.agent_manager.list_attached_sources(agent_id=agent_id, actor=self.user) def list_files_from_source(self, source_id: str, limit: int = 1000, cursor: Optional[str] = None) -> List[FileMetadata]: """ @@ -3080,7 +3064,7 @@ def insert_archival_memory(self, agent_id: str, memory: str) -> List[Passage]: Returns: passages (List[Passage]): List of inserted passages """ - return self.server.insert_archival_memory(user_id=self.user_id, agent_id=agent_id, memory_contents=memory) + return self.server.insert_archival_memory(agent_id=agent_id, memory_contents=memory, actor=self.user) def delete_archival_memory(self, agent_id: str, memory_id: str): """ @@ -3090,7 +3074,7 @@ def delete_archival_memory(self, agent_id: str, memory_id: str): agent_id (str): ID of the agent memory_id (str): ID of the memory """ - self.server.delete_archival_memory(user_id=self.user_id, agent_id=agent_id, memory_id=memory_id) + self.server.delete_archival_memory(agent_id=agent_id, memory_id=memory_id, actor=self.user) def get_archival_memory( self, agent_id: str, before: Optional[str] = None, after: Optional[str] = None, limit: Optional[int] = 1000 @@ -3349,8 +3333,8 @@ def add_agent_memory_block(self, agent_id: str, create_block: CreateBlock) -> Me block_req = Block(**create_block.model_dump()) block = self.server.block_manager.create_or_update_block(actor=self.user, block=block_req) # Link the block to the agent - updated_memory = self.server.link_block_to_agent_memory(user_id=self.user_id, agent_id=agent_id, block_id=block.id) - return updated_memory + agent = self.server.agent_manager.attach_block(agent_id=agent_id, block_id=block.id, actor=self.user) + return agent.memory def link_agent_memory_block(self, agent_id: str, block_id: str) -> Memory: """ @@ -3363,7 +3347,7 @@ def link_agent_memory_block(self, agent_id: str, block_id: str) -> Memory: Returns: memory (Memory): The updated memory """ - return self.server.link_block_to_agent_memory(user_id=self.user_id, agent_id=agent_id, block_id=block_id) + return self.server.agent_manager.attach_block(agent_id=agent_id, block_id=block_id, actor=self.user) def remove_agent_memory_block(self, agent_id: str, block_label: str) -> Memory: """ @@ -3376,7 +3360,7 @@ def remove_agent_memory_block(self, agent_id: str, block_label: str) -> Memory: Returns: memory (Memory): The updated memory """ - return self.server.unlink_block_from_agent_memory(user_id=self.user_id, agent_id=agent_id, block_label=block_label) + return self.server.agent_manager.detach_block_with_label(agent_id=agent_id, block_label=block_label, actor=self.user) def get_agent_memory_blocks(self, agent_id: str) -> List[Block]: """ @@ -3388,8 +3372,8 @@ def get_agent_memory_blocks(self, agent_id: str) -> List[Block]: Returns: blocks (List[Block]): The blocks in the agent's core memory """ - block_ids = self.server.blocks_agents_manager.list_block_ids_for_agent(agent_id=agent_id) - return [self.server.block_manager.get_block_by_id(block_id, actor=self.user) for block_id in block_ids] + agent = self.server.agent_manager.get_agent_by_id(agent_id=agent_id, actor=self.user) + return agent.memory.blocks def get_agent_memory_block(self, agent_id: str, label: str) -> Block: """ @@ -3402,8 +3386,7 @@ def get_agent_memory_block(self, agent_id: str, label: str) -> Block: Returns: block (Block): The block corresponding to the label """ - block_id = self.server.blocks_agents_manager.get_block_id_for_label(agent_id=agent_id, block_label=label) - return self.server.block_manager.get_block_by_id(block_id, actor=self.user) + return self.server.agent_manager.get_block_with_label(agent_id=agent_id, block_label=label, actor=self.user) def update_agent_memory_block( self, diff --git a/letta/config.py b/letta/config.py index 70b6bf3819..ed9e8668e6 100644 --- a/letta/config.py +++ b/letta/config.py @@ -1,12 +1,9 @@ import configparser -import inspect -import json import os from dataclasses import dataclass from typing import Optional import letta -import letta.utils as utils from letta.constants import ( CORE_MEMORY_HUMAN_CHAR_LIMIT, CORE_MEMORY_PERSONA_CHAR_LIMIT, @@ -16,7 +13,6 @@ LETTA_DIR, ) from letta.log import get_logger -from letta.schemas.agent import PersistedAgentState from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.llm_config import LLMConfig @@ -312,160 +308,3 @@ def create_config_dir(): for folder in folders: if not os.path.exists(os.path.join(LETTA_DIR, folder)): os.makedirs(os.path.join(LETTA_DIR, folder)) - - -@dataclass -class AgentConfig: - """ - - NOTE: this is a deprecated class, use AgentState instead. This class is only used for backcompatibility. - Configuration for a specific instance of an agent - """ - - def __init__( - self, - persona, - human, - # model info - model=None, - model_endpoint_type=None, - model_endpoint=None, - model_wrapper=None, - context_window=None, - # embedding info - embedding_endpoint_type=None, - embedding_endpoint=None, - embedding_model=None, - embedding_dim=None, - embedding_chunk_size=None, - # other - preset=None, - data_sources=None, - # agent info - agent_config_path=None, - name=None, - create_time=None, - letta_version=None, - # functions - functions=None, # schema definitions ONLY (linked at runtime) - ): - - assert name, f"Agent name must be provided" - self.name = name - - config = LettaConfig.load() # get default values - self.persona = config.persona if persona is None else persona - self.human = config.human if human is None else human - self.preset = config.preset if preset is None else preset - self.context_window = config.default_llm_config.context_window if context_window is None else context_window - self.model = config.default_llm_config.model if model is None else model - self.model_endpoint_type = config.default_llm_config.model_endpoint_type if model_endpoint_type is None else model_endpoint_type - self.model_endpoint = config.default_llm_config.model_endpoint if model_endpoint is None else model_endpoint - self.model_wrapper = config.default_llm_config.model_wrapper if model_wrapper is None else model_wrapper - self.llm_config = LLMConfig( - model=self.model, - model_endpoint_type=self.model_endpoint_type, - model_endpoint=self.model_endpoint, - model_wrapper=self.model_wrapper, - context_window=self.context_window, - ) - self.embedding_endpoint_type = ( - config.default_embedding_config.embedding_endpoint_type if embedding_endpoint_type is None else embedding_endpoint_type - ) - self.embedding_endpoint = config.default_embedding_config.embedding_endpoint if embedding_endpoint is None else embedding_endpoint - self.embedding_model = config.default_embedding_config.embedding_model if embedding_model is None else embedding_model - self.embedding_dim = config.default_embedding_config.embedding_dim if embedding_dim is None else embedding_dim - self.embedding_chunk_size = ( - config.default_embedding_config.embedding_chunk_size if embedding_chunk_size is None else embedding_chunk_size - ) - self.embedding_config = EmbeddingConfig( - embedding_endpoint_type=self.embedding_endpoint_type, - embedding_endpoint=self.embedding_endpoint, - embedding_model=self.embedding_model, - embedding_dim=self.embedding_dim, - embedding_chunk_size=self.embedding_chunk_size, - ) - - # agent metadata - self.data_sources = data_sources if data_sources is not None else [] - self.create_time = create_time if create_time is not None else utils.get_local_time() - if letta_version is None: - import letta - - self.letta_version = letta.__version__ - else: - self.letta_version = letta_version - - # functions - self.functions = functions - - # save agent config - self.agent_config_path = ( - os.path.join(LETTA_DIR, "agents", self.name, "config.json") if agent_config_path is None else agent_config_path - ) - - def attach_data_source(self, data_source: str): - # TODO: add warning that only once source can be attached - # i.e. previous source will be overriden - self.data_sources.append(data_source) - self.save() - - def save_dir(self): - return os.path.join(LETTA_DIR, "agents", self.name) - - def save_state_dir(self): - # directory to save agent state - return os.path.join(LETTA_DIR, "agents", self.name, "agent_state") - - def save_persistence_manager_dir(self): - # directory to save persistent manager state - return os.path.join(LETTA_DIR, "agents", self.name, "persistence_manager") - - def save_agent_index_dir(self): - # save llama index inside of persistent manager directory - return os.path.join(self.save_persistence_manager_dir(), "index") - - def save(self): - # save state of persistence manager - os.makedirs(os.path.join(LETTA_DIR, "agents", self.name), exist_ok=True) - # save version - self.letta_version = letta.__version__ - with open(self.agent_config_path, "w", encoding="utf-8") as f: - json.dump(vars(self), f, indent=4) - - def to_agent_state(self): - return PersistedAgentState( - name=self.name, - preset=self.preset, - persona=self.persona, - human=self.human, - llm_config=self.llm_config, - embedding_config=self.embedding_config, - create_time=self.create_time, - ) - - @staticmethod - def exists(name: str): - """Check if agent config exists""" - agent_config_path = os.path.join(LETTA_DIR, "agents", name) - return os.path.exists(agent_config_path) - - @classmethod - def load(cls, name: str): - """Load agent config from JSON file""" - agent_config_path = os.path.join(LETTA_DIR, "agents", name, "config.json") - assert os.path.exists(agent_config_path), f"Agent config file does not exist at {agent_config_path}" - with open(agent_config_path, "r", encoding="utf-8") as f: - agent_config = json.load(f) - # allow compatibility accross versions - try: - class_args = inspect.getargspec(cls.__init__).args - except AttributeError: - # https://github.com/pytorch/pytorch/issues/15344 - class_args = inspect.getfullargspec(cls.__init__).args - agent_fields = list(agent_config.keys()) - for key in agent_fields: - if key not in class_args: - utils.printd(f"Removing missing argument {key} from agent config") - del agent_config[key] - return cls(**agent_config) diff --git a/letta/main.py b/letta/main.py index 6a394fcf64..bb5d143118 100644 --- a/letta/main.py +++ b/letta/main.py @@ -130,11 +130,11 @@ def run_agent_loop( # updated agent save functions if user_input.lower() == "/exit": # letta_agent.save() - agent.save_agent(letta_agent, ms) + agent.save_agent(letta_agent) break elif user_input.lower() == "/save" or user_input.lower() == "/savechat": # letta_agent.save() - agent.save_agent(letta_agent, ms) + agent.save_agent(letta_agent) continue elif user_input.lower() == "/attach": # TODO: check if agent already has it @@ -394,7 +394,7 @@ def process_agent_step(user_message, no_verify): token_warning = step_response.in_context_memory_warning step_response.usage - agent.save_agent(letta_agent, ms) + agent.save_agent(letta_agent) skip_next_user_input = False if token_warning: user_message = system.get_token_limit_warning() diff --git a/letta/memory.py b/letta/memory.py index 081c59d584..1079909482 100644 --- a/letta/memory.py +++ b/letta/memory.py @@ -1,23 +1,13 @@ -import datetime -from abc import ABC, abstractmethod -from typing import Callable, Dict, List, Tuple, Union +from typing import Callable, Dict, List from letta.constants import MESSAGE_SUMMARY_REQUEST_ACK, MESSAGE_SUMMARY_WARNING_FRAC -from letta.embeddings import embedding_model, parse_and_chunk_text, query_embedding from letta.llm_api.llm_api_tools import create from letta.prompts.gpt_summarize import SYSTEM as SUMMARY_PROMPT_SYSTEM from letta.schemas.agent import AgentState from letta.schemas.enums import MessageRole from letta.schemas.memory import Memory from letta.schemas.message import Message -from letta.schemas.passage import Passage -from letta.utils import ( - count_tokens, - extract_date_from_timestamp, - get_local_time, - printd, - validate_date_format, -) +from letta.utils import count_tokens, printd def get_memory_functions(cls: Memory) -> Dict[str, Callable]: @@ -67,7 +57,6 @@ def summarize_messages( + message_sequence_to_summarize[cutoff:] ) - agent_state.user_id dummy_agent_id = agent_state.id message_sequence = [] message_sequence.append(Message(agent_id=dummy_agent_id, role=MessageRole.system, text=summary_prompt)) @@ -79,7 +68,7 @@ def summarize_messages( llm_config_no_inner_thoughts.put_inner_thoughts_in_kwargs = False response = create( llm_config=llm_config_no_inner_thoughts, - user_id=agent_state.user_id, + user_id=agent_state.created_by_id, messages=message_sequence, stream=False, ) diff --git a/letta/metadata.py b/letta/metadata.py index 017e546e48..0ecd696ba6 100644 --- a/letta/metadata.py +++ b/letta/metadata.py @@ -2,23 +2,18 @@ import os import secrets -from typing import List, Optional, Union +from typing import List, Optional -from sqlalchemy import JSON, Column, DateTime, Index, String, TypeDecorator -from sqlalchemy.sql import func +from sqlalchemy import JSON, Column, Index, String, TypeDecorator from letta.config import LettaConfig from letta.orm.base import Base -from letta.schemas.agent import PersistedAgentState from letta.schemas.api_key import APIKey from letta.schemas.embedding_config import EmbeddingConfig -from letta.schemas.enums import ToolRuleType from letta.schemas.llm_config import LLMConfig -from letta.schemas.tool_rule import ChildToolRule, InitToolRule, TerminalToolRule from letta.schemas.user import User -from letta.services.per_agent_lock_manager import PerAgentLockManager from letta.settings import settings -from letta.utils import enforce_types, printd +from letta.utils import enforce_types class LLMConfigColumn(TypeDecorator): @@ -65,18 +60,6 @@ def process_result_value(self, value, dialect): return value -# TODO: eventually store providers? -# class Provider(Base): -# __tablename__ = "providers" -# __table_args__ = {"extend_existing": True} -# -# id = Column(String, primary_key=True) -# name = Column(String, nullable=False) -# created_at = Column(DateTime(timezone=True)) -# api_key = Column(String, nullable=False) -# base_url = Column(String, nullable=False) - - class APIKeyModel(Base): """Data model for authentication tokens. One-to-many relationship with UserModel (1 User - N tokens).""" @@ -113,115 +96,6 @@ def generate_api_key(prefix="sk-", length=51) -> str: return new_key -class ToolRulesColumn(TypeDecorator): - """Custom type for storing a list of ToolRules as JSON""" - - impl = JSON - cache_ok = True - - def load_dialect_impl(self, dialect): - return dialect.type_descriptor(JSON()) - - def process_bind_param(self, value, dialect): - """Convert a list of ToolRules to JSON-serializable format.""" - if value: - data = [rule.model_dump() for rule in value] - for d in data: - d["type"] = d["type"].value - - for d in data: - assert not (d["type"] == "ToolRule" and "children" not in d), "ToolRule does not have children field" - return data - return value - - def process_result_value(self, value, dialect) -> List[Union[ChildToolRule, InitToolRule, TerminalToolRule]]: - """Convert JSON back to a list of ToolRules.""" - if value: - return [self.deserialize_tool_rule(rule_data) for rule_data in value] - return value - - @staticmethod - def deserialize_tool_rule(data: dict) -> Union[ChildToolRule, InitToolRule, TerminalToolRule]: - """Deserialize a dictionary to the appropriate ToolRule subclass based on the 'type'.""" - rule_type = ToolRuleType(data.get("type")) # Remove 'type' field if it exists since it is a class var - if rule_type == ToolRuleType.run_first: - return InitToolRule(**data) - elif rule_type == ToolRuleType.exit_loop: - return TerminalToolRule(**data) - elif rule_type == ToolRuleType.constrain_child_tools: - rule = ChildToolRule(**data) - return rule - else: - raise ValueError(f"Unknown tool rule type: {rule_type}") - - -class AgentModel(Base): - """Defines data model for storing Passages (consisting of text, embedding)""" - - __tablename__ = "agents" - __table_args__ = {"extend_existing": True} - - id = Column(String, primary_key=True) - user_id = Column(String, nullable=False) - name = Column(String, nullable=False) - created_at = Column(DateTime(timezone=True), server_default=func.now()) - description = Column(String) - - # state (context compilation) - message_ids = Column(JSON) - system = Column(String) - - # configs - agent_type = Column(String) - llm_config = Column(LLMConfigColumn) - embedding_config = Column(EmbeddingConfigColumn) - - # state - metadata_ = Column(JSON) - - # tools - tool_names = Column(JSON) - tool_rules = Column(ToolRulesColumn) - - Index(__tablename__ + "_idx_user", user_id), - - def __repr__(self) -> str: - return f"" - - def to_record(self) -> PersistedAgentState: - agent_state = PersistedAgentState( - id=self.id, - user_id=self.user_id, - name=self.name, - created_at=self.created_at, - description=self.description, - message_ids=self.message_ids, - system=self.system, - tool_names=self.tool_names, - tool_rules=self.tool_rules, - agent_type=self.agent_type, - llm_config=self.llm_config, - embedding_config=self.embedding_config, - metadata_=self.metadata_, - ) - return agent_state - - -class AgentSourceMappingModel(Base): - """Stores mapping between agent -> source""" - - __tablename__ = "agent_source_mapping" - - id = Column(String, primary_key=True) - user_id = Column(String, nullable=False) - agent_id = Column(String, nullable=False) - source_id = Column(String, nullable=False) - Index(__tablename__ + "_idx_user", user_id, agent_id, source_id), - - def __repr__(self) -> str: - return f"" - - class MetadataStore: uri: Optional[str] = None @@ -281,127 +155,3 @@ def get_all_api_keys_for_user(self, user_id: str) -> List[APIKey]: results = session.query(APIKeyModel).filter(APIKeyModel.user_id == user_id).all() tokens = [r.to_record() for r in results] return tokens - - @enforce_types - def create_agent(self, agent: PersistedAgentState): - # insert into agent table - # make sure agent.name does not already exist for user user_id - with self.session_maker() as session: - if session.query(AgentModel).filter(AgentModel.name == agent.name).filter(AgentModel.user_id == agent.user_id).count() > 0: - raise ValueError(f"Agent with name {agent.name} already exists") - fields = vars(agent) - # fields["memory"] = agent.memory.to_dict() - # if "_internal_memory" in fields: - # del fields["_internal_memory"] - # else: - # warnings.warn(f"Agent {agent.id} has no _internal_memory field") - if "tags" in fields: - del fields["tags"] - # else: - # warnings.warn(f"Agent {agent.id} has no tags field") - session.add(AgentModel(**fields)) - session.commit() - - @enforce_types - def update_agent(self, agent: PersistedAgentState): - with self.session_maker() as session: - fields = vars(agent) - # if isinstance(agent.memory, Memory): # TODO: this is nasty but this whole class will soon be removed so whatever - # fields["memory"] = agent.memory.to_dict() - # if "_internal_memory" in fields: - # del fields["_internal_memory"] - # else: - # warnings.warn(f"Agent {agent.id} has no _internal_memory field") - if "tags" in fields: - del fields["tags"] - # else: - # warnings.warn(f"Agent {agent.id} has no tags field") - session.query(AgentModel).filter(AgentModel.id == agent.id).update(fields) - session.commit() - - @enforce_types - def delete_agent(self, agent_id: str, per_agent_lock_manager: PerAgentLockManager): - # TODO: Remove this once Agent is on the ORM - # TODO: To prevent unbounded growth - per_agent_lock_manager.clear_lock(agent_id) - - with self.session_maker() as session: - - # delete agents - session.query(AgentModel).filter(AgentModel.id == agent_id).delete() - - # delete mappings - session.query(AgentSourceMappingModel).filter(AgentSourceMappingModel.agent_id == agent_id).delete() - - session.commit() - - @enforce_types - def list_agents(self, user_id: str) -> List[PersistedAgentState]: - with self.session_maker() as session: - results = session.query(AgentModel).filter(AgentModel.user_id == user_id).all() - return [r.to_record() for r in results] - - @enforce_types - def get_agent( - self, agent_id: Optional[str] = None, agent_name: Optional[str] = None, user_id: Optional[str] = None - ) -> Optional[PersistedAgentState]: - with self.session_maker() as session: - if agent_id: - results = session.query(AgentModel).filter(AgentModel.id == agent_id).all() - else: - assert agent_name is not None and user_id is not None, "Must provide either agent_id or agent_name" - results = session.query(AgentModel).filter(AgentModel.name == agent_name).filter(AgentModel.user_id == user_id).all() - - if len(results) == 0: - return None - assert len(results) == 1, f"Expected 1 result, got {len(results)}" # should only be one result - return results[0].to_record() - - # agent source metadata - @enforce_types - def attach_source(self, user_id: str, agent_id: str, source_id: str): - with self.session_maker() as session: - # TODO: remove this (is a hack) - mapping_id = f"{user_id}-{agent_id}-{source_id}" - existing = session.query(AgentSourceMappingModel).filter( - AgentSourceMappingModel.id == mapping_id - ).first() - - if existing is None: - # Only create if it doesn't exist - session.add(AgentSourceMappingModel( - id=mapping_id, - user_id=user_id, - agent_id=agent_id, - source_id=source_id - )) - session.commit() - - @enforce_types - def list_attached_source_ids(self, agent_id: str) -> List[str]: - with self.session_maker() as session: - results = session.query(AgentSourceMappingModel).filter(AgentSourceMappingModel.agent_id == agent_id).all() - return [r.source_id for r in results] - - @enforce_types - def list_attached_agents(self, source_id: str) -> List[str]: - with self.session_maker() as session: - results = session.query(AgentSourceMappingModel).filter(AgentSourceMappingModel.source_id == source_id).all() - - agent_ids = [] - # make sure agent exists - for r in results: - agent = self.get_agent(agent_id=r.agent_id) - if agent: - agent_ids.append(r.agent_id) - else: - printd(f"Warning: agent {r.agent_id} does not exist but exists in mapping database. This should never happen.") - return agent_ids - - @enforce_types - def detach_source(self, agent_id: str, source_id: str): - with self.session_maker() as session: - session.query(AgentSourceMappingModel).filter( - AgentSourceMappingModel.agent_id == agent_id, AgentSourceMappingModel.source_id == source_id - ).delete() - session.commit() diff --git a/letta/o1_agent.py b/letta/o1_agent.py index 837005cfd1..eb882bfa01 100644 --- a/letta/o1_agent.py +++ b/letta/o1_agent.py @@ -85,6 +85,6 @@ def step( if step_response.messages[-1].name == "send_final_message": break if ms: - save_agent(self, ms) + save_agent(self) return LettaUsageStatistics(**total_usage.model_dump(), step_count=step_count) diff --git a/letta/offline_memory_agent.py b/letta/offline_memory_agent.py index 85cbb082fe..1e71af6c81 100644 --- a/letta/offline_memory_agent.py +++ b/letta/offline_memory_agent.py @@ -130,7 +130,7 @@ def __init__( # extras first_message_verify_mono: bool = False, max_memory_rethinks: int = 10, - initial_message_sequence: Optional[List[Message]] = None, + initial_message_sequence: Optional[List[Message]] = None, ): super().__init__(interface, agent_state, user, initial_message_sequence=initial_message_sequence) self.first_message_verify_mono = first_message_verify_mono @@ -173,6 +173,6 @@ def step( self.interface.step_complete() if ms: - save_agent(self, ms) + save_agent(self) return LettaUsageStatistics(**total_usage.model_dump(), step_count=step_count) diff --git a/letta/orm/__init__.py b/letta/orm/__init__.py index b7f7bb96fb..ed8f24606c 100644 --- a/letta/orm/__init__.py +++ b/letta/orm/__init__.py @@ -1,3 +1,4 @@ +from letta.orm.agent import Agent from letta.orm.agents_tags import AgentsTags from letta.orm.base import Base from letta.orm.block import Block @@ -9,6 +10,7 @@ from letta.orm.passage import Passage from letta.orm.sandbox_config import SandboxConfig, SandboxEnvironmentVariable from letta.orm.source import Source +from letta.orm.sources_agents import SourcesAgents from letta.orm.tool import Tool from letta.orm.tools_agents import ToolsAgents from letta.orm.user import User diff --git a/letta/orm/agent.py b/letta/orm/agent.py new file mode 100644 index 0000000000..99a7e8bda3 --- /dev/null +++ b/letta/orm/agent.py @@ -0,0 +1,196 @@ +import uuid +from typing import TYPE_CHECKING, List, Optional, Union + +from sqlalchemy import JSON, String, TypeDecorator, UniqueConstraint +from sqlalchemy.orm import Mapped, mapped_column, relationship + +from letta.orm.block import Block +from letta.orm.message import Message +from letta.orm.mixins import OrganizationMixin +from letta.orm.organization import Organization +from letta.orm.sqlalchemy_base import SqlalchemyBase +from letta.schemas.agent import AgentState as PydanticAgentState +from letta.schemas.agent import AgentType +from letta.schemas.embedding_config import EmbeddingConfig +from letta.schemas.enums import ToolRuleType +from letta.schemas.llm_config import LLMConfig +from letta.schemas.memory import Memory +from letta.schemas.tool_rule import ( + ChildToolRule, + InitToolRule, + TerminalToolRule, + ToolRule, +) + +if TYPE_CHECKING: + from letta.orm.agents_tags import AgentsTags + from letta.orm.organization import Organization + from letta.orm.source import Source + from letta.orm.tool import Tool + + +class LLMConfigColumn(TypeDecorator): + """Custom type for storing LLMConfig as JSON""" + + impl = JSON + cache_ok = True + + def load_dialect_impl(self, dialect): + return dialect.type_descriptor(JSON()) + + def process_bind_param(self, value, dialect): + if value: + # return vars(value) + if isinstance(value, LLMConfig): + return value.model_dump() + return value + + def process_result_value(self, value, dialect): + if value: + return LLMConfig(**value) + return value + + +class EmbeddingConfigColumn(TypeDecorator): + """Custom type for storing EmbeddingConfig as JSON""" + + impl = JSON + cache_ok = True + + def load_dialect_impl(self, dialect): + return dialect.type_descriptor(JSON()) + + def process_bind_param(self, value, dialect): + if value: + # return vars(value) + if isinstance(value, EmbeddingConfig): + return value.model_dump() + return value + + def process_result_value(self, value, dialect): + if value: + return EmbeddingConfig(**value) + return value + + +class ToolRulesColumn(TypeDecorator): + """Custom type for storing a list of ToolRules as JSON""" + + impl = JSON + cache_ok = True + + def load_dialect_impl(self, dialect): + return dialect.type_descriptor(JSON()) + + def process_bind_param(self, value, dialect): + """Convert a list of ToolRules to JSON-serializable format.""" + if value: + data = [rule.model_dump() for rule in value] + for d in data: + d["type"] = d["type"].value + + for d in data: + assert not (d["type"] == "ToolRule" and "children" not in d), "ToolRule does not have children field" + return data + return value + + def process_result_value(self, value, dialect) -> List[Union[ChildToolRule, InitToolRule, TerminalToolRule]]: + """Convert JSON back to a list of ToolRules.""" + if value: + return [self.deserialize_tool_rule(rule_data) for rule_data in value] + return value + + @staticmethod + def deserialize_tool_rule(data: dict) -> Union[ChildToolRule, InitToolRule, TerminalToolRule]: + """Deserialize a dictionary to the appropriate ToolRule subclass based on the 'type'.""" + rule_type = ToolRuleType(data.get("type")) # Remove 'type' field if it exists since it is a class var + if rule_type == ToolRuleType.run_first: + return InitToolRule(**data) + elif rule_type == ToolRuleType.exit_loop: + return TerminalToolRule(**data) + elif rule_type == ToolRuleType.constrain_child_tools: + rule = ChildToolRule(**data) + return rule + else: + raise ValueError(f"Unknown tool rule type: {rule_type}") + + +class Agent(SqlalchemyBase, OrganizationMixin): + __tablename__ = "agents" + __pydantic_model__ = PydanticAgentState + __table_args__ = (UniqueConstraint("organization_id", "name", name="unique_org_agent_name"),) + + # agent generates its own id + # TODO: We want to migrate all the ORM models to do this, so we will need to move this to the SqlalchemyBase + # TODO: Move this in this PR? at the very end? + id: Mapped[str] = mapped_column(String, primary_key=True, default=lambda: f"agent-{uuid.uuid4()}") + + # Descriptor fields + agent_type: Mapped[Optional[AgentType]] = mapped_column(String, nullable=True, doc="The type of Agent") + name: Mapped[Optional[str]] = mapped_column(String, nullable=True, doc="a human-readable identifier for an agent, non-unique.") + description: Mapped[Optional[str]] = mapped_column(String, nullable=True, doc="The description of the agent.") + + # System prompt + system: Mapped[Optional[str]] = mapped_column(String, nullable=True, doc="The system prompt used by the agent.") + + # In context memory + # TODO: This should be a separate mapping table + # This is dangerously flexible with the JSON type + message_ids: Mapped[Optional[List[str]]] = mapped_column(JSON, nullable=True, doc="List of message IDs in in-context memory.") + + # Metadata and configs + metadata_: Mapped[Optional[dict]] = mapped_column(JSON, nullable=True, doc="metadata for the agent.") + llm_config: Mapped[Optional[LLMConfig]] = mapped_column( + LLMConfigColumn, nullable=True, doc="the LLM backend configuration object for this agent." + ) + embedding_config: Mapped[Optional[EmbeddingConfig]] = mapped_column( + EmbeddingConfigColumn, doc="the embedding configuration object for this agent." + ) + + # Tool rules + tool_rules: Mapped[Optional[List[ToolRule]]] = mapped_column(ToolRulesColumn, doc="the tool rules for this agent.") + + # relationships + organization: Mapped["Organization"] = relationship("Organization", back_populates="agents") + tools: Mapped[List["Tool"]] = relationship("Tool", secondary="tools_agents", lazy="selectin", passive_deletes=True) + sources: Mapped[List["Source"]] = relationship("Source", secondary="sources_agents", lazy="selectin") + core_memory: Mapped[List["Block"]] = relationship("Block", secondary="blocks_agents", lazy="selectin") + messages: Mapped[List["Message"]] = relationship( + "Message", + back_populates="agent", + lazy="selectin", + cascade="all, delete-orphan", # Ensure messages are deleted when the agent is deleted + passive_deletes=True, + ) + tags: Mapped[List["AgentsTags"]] = relationship( + "AgentsTags", + back_populates="agent", + cascade="all, delete-orphan", + lazy="selectin", + doc="Tags associated with the agent.", + ) + # passages: Mapped[List["Passage"]] = relationship("Passage", back_populates="agent", lazy="selectin") + + def to_pydantic(self) -> PydanticAgentState: + """converts to the basic pydantic model counterpart""" + state = { + "id": self.id, + "name": self.name, + "description": self.description, + "message_ids": self.message_ids, + "tools": self.tools, + "sources": self.sources, + "tags": [t.tag for t in self.tags], + "tool_rules": self.tool_rules, + "system": self.system, + "agent_type": self.agent_type, + "llm_config": self.llm_config, + "embedding_config": self.embedding_config, + "metadata_": self.metadata_, + "memory": Memory(blocks=[b.to_pydantic() for b in self.core_memory]), + "created_by_id": self.created_by_id, + "last_updated_by_id": self.last_updated_by_id, + "created_at": self.created_at, + "updated_at": self.updated_at, + } + return self.__pydantic_model__(**state) diff --git a/letta/orm/agents_tags.py b/letta/orm/agents_tags.py index 1910f52846..76ff90110c 100644 --- a/letta/orm/agents_tags.py +++ b/letta/orm/agents_tags.py @@ -1,28 +1,20 @@ -from typing import TYPE_CHECKING - from sqlalchemy import ForeignKey, String, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column, relationship -from letta.orm.mixins import OrganizationMixin -from letta.orm.sqlalchemy_base import SqlalchemyBase -from letta.schemas.agents_tags import AgentsTags as PydanticAgentsTags - -if TYPE_CHECKING: - from letta.orm.organization import Organization - +from letta.orm.base import Base -class AgentsTags(SqlalchemyBase, OrganizationMixin): - """Associates tags with agents, allowing agents to have multiple tags and supporting tag-based filtering.""" +class AgentsTags(Base): __tablename__ = "agents_tags" - __pydantic_model__ = PydanticAgentsTags __table_args__ = (UniqueConstraint("agent_id", "tag", name="unique_agent_tag"),) - # The agent associated with this tag - agent_id = mapped_column(String, ForeignKey("agents.id"), primary_key=True) + # # agent generates its own id + # # TODO: We want to migrate all the ORM models to do this, so we will need to move this to the SqlalchemyBase + # # TODO: Move this in this PR? at the very end? + # id: Mapped[str] = mapped_column(String, primary_key=True, default=lambda: f"agents_tags-{uuid.uuid4()}") - # The name of the tag - tag: Mapped[str] = mapped_column(String, nullable=False, doc="The name of the tag associated with the agent.") + agent_id: Mapped[String] = mapped_column(String, ForeignKey("agents.id"), primary_key=True) + tag: Mapped[str] = mapped_column(String, doc="The name of the tag associated with the agent.", primary_key=True) - # relationships - organization: Mapped["Organization"] = relationship("Organization", back_populates="agents_tags") + # Relationships + agent: Mapped["Agent"] = relationship("Agent", back_populates="tags") diff --git a/letta/orm/block.py b/letta/orm/block.py index 84bbdb7e71..99cfa29b2e 100644 --- a/letta/orm/block.py +++ b/letta/orm/block.py @@ -1,16 +1,17 @@ from typing import TYPE_CHECKING, Optional, Type -from sqlalchemy import JSON, BigInteger, Integer, UniqueConstraint -from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy import JSON, BigInteger, Integer, UniqueConstraint, event +from sqlalchemy.orm import Mapped, attributes, mapped_column, relationship from letta.constants import CORE_MEMORY_BLOCK_CHAR_LIMIT +from letta.orm.blocks_agents import BlocksAgents from letta.orm.mixins import OrganizationMixin from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.schemas.block import Block as PydanticBlock from letta.schemas.block import Human, Persona if TYPE_CHECKING: - from letta.orm import BlocksAgents, Organization + from letta.orm import Organization class Block(OrganizationMixin, SqlalchemyBase): @@ -35,7 +36,6 @@ class Block(OrganizationMixin, SqlalchemyBase): # relationships organization: Mapped[Optional["Organization"]] = relationship("Organization") - blocks_agents: Mapped[list["BlocksAgents"]] = relationship("BlocksAgents", back_populates="block", cascade="all, delete") def to_pydantic(self) -> Type: match self.label: @@ -46,3 +46,28 @@ def to_pydantic(self) -> Type: case _: Schema = PydanticBlock return Schema.model_validate(self) + + +@event.listens_for(Block, "after_update") # Changed from 'before_update' +def block_before_update(mapper, connection, target): + """Handle updating BlocksAgents when a block's label changes.""" + label_history = attributes.get_history(target, "label") + if not label_history.has_changes(): + return + + blocks_agents = BlocksAgents.__table__ + connection.execute( + blocks_agents.update() + .where(blocks_agents.c.block_id == target.id, blocks_agents.c.block_label == label_history.deleted[0]) + .values(block_label=label_history.added[0]) + ) + + +@event.listens_for(Block, "before_insert") +@event.listens_for(Block, "before_update") +def validate_value_length(mapper, connection, target): + """Ensure the value length does not exceed the limit.""" + if target.value and len(target.value) > target.limit: + raise ValueError( + f"Value length ({len(target.value)}) exceeds the limit ({target.limit}) for block with label '{target.label}' and id '{target.id}'." + ) diff --git a/letta/orm/blocks_agents.py b/letta/orm/blocks_agents.py index a344964690..4774783b59 100644 --- a/letta/orm/blocks_agents.py +++ b/letta/orm/blocks_agents.py @@ -1,15 +1,13 @@ from sqlalchemy import ForeignKey, ForeignKeyConstraint, String, UniqueConstraint -from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.orm import Mapped, mapped_column -from letta.orm.sqlalchemy_base import SqlalchemyBase -from letta.schemas.blocks_agents import BlocksAgents as PydanticBlocksAgents +from letta.orm.base import Base -class BlocksAgents(SqlalchemyBase): +class BlocksAgents(Base): """Agents must have one or many blocks to make up their core memory.""" __tablename__ = "blocks_agents" - __pydantic_model__ = PydanticBlocksAgents __table_args__ = ( UniqueConstraint( "agent_id", @@ -17,16 +15,12 @@ class BlocksAgents(SqlalchemyBase): name="unique_label_per_agent", ), ForeignKeyConstraint( - ["block_id", "block_label"], - ["block.id", "block.label"], - name="fk_block_id_label", + ["block_id", "block_label"], ["block.id", "block.label"], name="fk_block_id_label", deferrable=True, initially="DEFERRED" ), + UniqueConstraint("agent_id", "block_id", name="unique_agent_block"), ) # unique agent + block label agent_id: Mapped[str] = mapped_column(String, ForeignKey("agents.id"), primary_key=True) block_id: Mapped[str] = mapped_column(String, primary_key=True) block_label: Mapped[str] = mapped_column(String, primary_key=True) - - # relationships - block: Mapped["Block"] = relationship("Block", back_populates="blocks_agents") diff --git a/letta/orm/message.py b/letta/orm/message.py index 8de6f1f54b..77ac075a51 100644 --- a/letta/orm/message.py +++ b/letta/orm/message.py @@ -59,6 +59,5 @@ class Message(SqlalchemyBase, OrganizationMixin, AgentMixin): tool_call_id: Mapped[Optional[str]] = mapped_column(nullable=True, doc="ID of the tool call") # Relationships - # TODO: Add in after Agent ORM is created - # agent: Mapped["Agent"] = relationship("Agent", back_populates="messages", lazy="selectin") + agent: Mapped["Agent"] = relationship("Agent", back_populates="messages", lazy="selectin") organization: Mapped["Organization"] = relationship("Organization", back_populates="messages", lazy="selectin") diff --git a/letta/orm/organization.py b/letta/orm/organization.py index 8dc56e1627..bed2b00fda 100644 --- a/letta/orm/organization.py +++ b/letta/orm/organization.py @@ -7,6 +7,7 @@ if TYPE_CHECKING: + from letta.orm.agent import Agent from letta.orm.file import FileMetadata from letta.orm.tool import Tool from letta.orm.user import User @@ -25,7 +26,6 @@ class Organization(SqlalchemyBase): tools: Mapped[List["Tool"]] = relationship("Tool", back_populates="organization", cascade="all, delete-orphan") blocks: Mapped[List["Block"]] = relationship("Block", back_populates="organization", cascade="all, delete-orphan") sources: Mapped[List["Source"]] = relationship("Source", back_populates="organization", cascade="all, delete-orphan") - agents_tags: Mapped[List["AgentsTags"]] = relationship("AgentsTags", back_populates="organization", cascade="all, delete-orphan") files: Mapped[List["FileMetadata"]] = relationship("FileMetadata", back_populates="organization", cascade="all, delete-orphan") sandbox_configs: Mapped[List["SandboxConfig"]] = relationship( "SandboxConfig", back_populates="organization", cascade="all, delete-orphan" @@ -36,10 +36,5 @@ class Organization(SqlalchemyBase): # relationships messages: Mapped[List["Message"]] = relationship("Message", back_populates="organization", cascade="all, delete-orphan") + agents: Mapped[List["Agent"]] = relationship("Agent", back_populates="organization", cascade="all, delete-orphan") passages: Mapped[List["Passage"]] = relationship("Passage", back_populates="organization", cascade="all, delete-orphan") - - # TODO: Map these relationships later when we actually make these models - # below is just a suggestion - # agents: Mapped[List["Agent"]] = relationship("Agent", back_populates="organization", cascade="all, delete-orphan") - # tools: Mapped[List["Tool"]] = relationship("Tool", back_populates="organization", cascade="all, delete-orphan") - # documents: Mapped[List["Document"]] = relationship("Document", back_populates="organization", cascade="all, delete-orphan") diff --git a/letta/orm/passage.py b/letta/orm/passage.py index bfa3e15334..b91eb43469 100644 --- a/letta/orm/passage.py +++ b/letta/orm/passage.py @@ -1,19 +1,18 @@ +import base64 from datetime import datetime -from typing import Optional, TYPE_CHECKING -from sqlalchemy import Column, String, DateTime, JSON, ForeignKey -from sqlalchemy.orm import Mapped, mapped_column, relationship -from sqlalchemy.types import TypeDecorator, BINARY +from typing import TYPE_CHECKING, Optional import numpy as np -import base64 +from sqlalchemy import JSON, Column, DateTime, ForeignKey, String +from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.types import BINARY, TypeDecorator +from letta.config import LettaConfig +from letta.constants import MAX_EMBEDDING_DIM +from letta.orm.mixins import FileMixin, OrganizationMixin from letta.orm.source import EmbeddingConfigColumn from letta.orm.sqlalchemy_base import SqlalchemyBase -from letta.orm.mixins import FileMixin, OrganizationMixin from letta.schemas.passage import Passage as PydanticPassage - -from letta.config import LettaConfig -from letta.constants import MAX_EMBEDDING_DIM from letta.settings import settings config = LettaConfig() @@ -21,8 +20,10 @@ if TYPE_CHECKING: from letta.orm.organization import Organization + class CommonVector(TypeDecorator): """Common type for representing vectors in SQLite""" + impl = BINARY cache_ok = True @@ -43,10 +44,12 @@ def process_result_value(self, value, dialect): value = base64.b64decode(value) return np.frombuffer(value, dtype=np.float32) -# TODO: After migration to Passage, will need to manually delete passages where files + +# TODO: After migration to Passage, will need to manually delete passages where files # are deleted on web class Passage(SqlalchemyBase, OrganizationMixin, FileMixin): """Defines data model for storing Passages""" + __tablename__ = "passages" __table_args__ = {"extend_existing": True} __pydantic_model__ = PydanticPassage @@ -59,6 +62,7 @@ class Passage(SqlalchemyBase, OrganizationMixin, FileMixin): created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=datetime.utcnow) if settings.letta_pg_uri_no_default: from pgvector.sqlalchemy import Vector + embedding = mapped_column(Vector(MAX_EMBEDDING_DIM)) else: embedding = Column(CommonVector) diff --git a/letta/orm/source.py b/letta/orm/source.py index 4b2262f09b..e849cddb7d 100644 --- a/letta/orm/source.py +++ b/letta/orm/source.py @@ -48,4 +48,4 @@ class Source(SqlalchemyBase, OrganizationMixin): # relationships organization: Mapped["Organization"] = relationship("Organization", back_populates="sources") files: Mapped[List["Source"]] = relationship("FileMetadata", back_populates="source", cascade="all, delete-orphan") - # agents: Mapped[List["Agent"]] = relationship("Agent", secondary="sources_agents", back_populates="sources") + agents: Mapped[List["Agent"]] = relationship("Agent", secondary="sources_agents", back_populates="sources") diff --git a/letta/orm/sources_agents.py b/letta/orm/sources_agents.py new file mode 100644 index 0000000000..cf502e71f4 --- /dev/null +++ b/letta/orm/sources_agents.py @@ -0,0 +1,13 @@ +from sqlalchemy import ForeignKey, String +from sqlalchemy.orm import Mapped, mapped_column + +from letta.orm.base import Base + + +class SourcesAgents(Base): + """Agents can have zero to many sources""" + + __tablename__ = "sources_agents" + + agent_id: Mapped[String] = mapped_column(String, ForeignKey("agents.id"), primary_key=True) + source_id: Mapped[String] = mapped_column(String, ForeignKey("sources.id"), primary_key=True) diff --git a/letta/orm/sqlalchemy_base.py b/letta/orm/sqlalchemy_base.py index 74d3f3be41..d13e85b16b 100644 --- a/letta/orm/sqlalchemy_base.py +++ b/letta/orm/sqlalchemy_base.py @@ -1,7 +1,6 @@ from datetime import datetime from enum import Enum -from typing import TYPE_CHECKING, List, Literal, Optional, Type -import sqlite3 +from typing import TYPE_CHECKING, List, Literal, Optional from sqlalchemy import String, desc, func, or_, select from sqlalchemy.exc import DBAPIError @@ -9,12 +8,12 @@ from letta.log import get_logger from letta.orm.base import Base, CommonSqlalchemyMetaMixins -from letta.orm.sqlite_functions import adapt_array, convert_array, cosine_distance from letta.orm.errors import ( ForeignKeyConstraintViolationError, NoResultFound, UniqueConstraintViolationError, ) +from letta.orm.sqlite_functions import adapt_array if TYPE_CHECKING: from pydantic import BaseModel @@ -64,11 +63,26 @@ def list( query_text: Optional[str] = None, query_embedding: Optional[List[float]] = None, ascending: bool = True, + tags: Optional[List[str]] = None, + match_all_tags: bool = False, **kwargs, - ) -> List[Type["SqlalchemyBase"]]: + ) -> List["SqlalchemyBase"]: """ List records with cursor-based pagination, ordering by created_at. Cursor is an ID, but pagination is based on the cursor object's created_at value. + + Args: + db_session: SQLAlchemy session + cursor: ID of the last item seen (for pagination) + start_date: Filter items after this date + end_date: Filter items before this date + limit: Maximum number of items to return + query_text: Text to search for + query_embedding: Vector to search for similar embeddings + ascending: Sort direction + tags: List of tags to filter by + match_all_tags: If True, return items matching all tags. If False, match any tag. + **kwargs: Additional filters to apply """ if start_date and end_date and start_date > end_date: raise ValueError("start_date must be earlier than or equal to end_date") @@ -84,7 +98,25 @@ def list( query = select(cls) - # Apply filtering logic + # Handle tag filtering if the model has tags + if tags and hasattr(cls, "tags"): + query = select(cls) + + if match_all_tags: + # Match ALL tags - use subqueries + for tag in tags: + subquery = select(cls.tags.property.mapper.class_.agent_id).where(cls.tags.property.mapper.class_.tag == tag) + query = query.filter(cls.id.in_(subquery)) + else: + # Match ANY tag - use join and filter + query = ( + query.join(cls.tags).filter(cls.tags.property.mapper.class_.tag.in_(tags)).group_by(cls.id) # Deduplicate results + ) + + # Group by primary key and all necessary columns to avoid JSON comparison + query = query.group_by(cls.id) + + # Apply filtering logic from kwargs for key, value in kwargs.items(): column = getattr(cls, key) if isinstance(value, (list, tuple, set)): @@ -98,9 +130,7 @@ def list( if end_date: query = query.filter(cls.created_at < end_date) - # Cursor-based pagination using created_at - # TODO: There is a really nasty race condition issue here with Sqlite - # TODO: If they have the same created_at timestamp, this query does NOT match for whatever reason + # Cursor-based pagination if cursor_obj: if ascending: query = query.where(cls.created_at >= cursor_obj.created_at).where( @@ -111,40 +141,34 @@ def list( or_(cls.created_at < cursor_obj.created_at, cls.id < cursor_obj.id) ) - # Apply text search + # Text search if query_text: - from sqlalchemy import func query = query.filter(func.lower(cls.text).contains(func.lower(query_text))) - # Apply embedding search (Passages) + # Embedding search (for Passages) is_ordered = False if query_embedding: - # check if embedding column exists. should only exist for passages if not hasattr(cls, "embedding"): raise ValueError(f"Class {cls.__name__} does not have an embedding column") - + from letta.settings import settings + if settings.letta_pg_uri_no_default: # PostgreSQL with pgvector - from pgvector.sqlalchemy import Vector query = query.order_by(cls.embedding.cosine_distance(query_embedding).asc()) else: # SQLite with custom vector type - from sqlalchemy import func - query_embedding_binary = adapt_array(query_embedding) query = query.order_by( - func.cosine_distance(cls.embedding, query_embedding_binary).asc(), - cls.created_at.asc(), - cls.id.asc() + func.cosine_distance(cls.embedding, query_embedding_binary).asc(), cls.created_at.asc(), cls.id.asc() ) is_ordered = True - # Handle ordering and soft deletes + # Handle soft deletes if hasattr(cls, "is_deleted"): query = query.where(cls.is_deleted == False) - - # Apply ordering by created_at + + # Apply ordering if not is_ordered: if ascending: query = query.order_by(cls.created_at, cls.id) @@ -164,7 +188,7 @@ def read( access: Optional[List[Literal["read", "write", "admin"]]] = ["read"], access_type: AccessType = AccessType.ORGANIZATION, **kwargs, - ) -> Type["SqlalchemyBase"]: + ) -> "SqlalchemyBase": """The primary accessor for an ORM record. Args: db_session: the database session to use when retrieving the record @@ -207,7 +231,7 @@ def read( conditions_str = ", ".join(query_conditions) if query_conditions else "no specific conditions" raise NoResultFound(f"{cls.__name__} not found with {conditions_str}") - def create(self, db_session: "Session", actor: Optional["User"] = None) -> Type["SqlalchemyBase"]: + def create(self, db_session: "Session", actor: Optional["User"] = None) -> "SqlalchemyBase": logger.debug(f"Creating {self.__class__.__name__} with ID: {self.id} with actor={actor}") if actor: @@ -221,7 +245,7 @@ def create(self, db_session: "Session", actor: Optional["User"] = None) -> Type[ except DBAPIError as e: self._handle_dbapi_error(e) - def delete(self, db_session: "Session", actor: Optional["User"] = None) -> Type["SqlalchemyBase"]: + def delete(self, db_session: "Session", actor: Optional["User"] = None) -> "SqlalchemyBase": logger.debug(f"Soft deleting {self.__class__.__name__} with ID: {self.id} with actor={actor}") if actor: @@ -245,7 +269,7 @@ def hard_delete(self, db_session: "Session", actor: Optional["User"] = None) -> else: logger.debug(f"{self.__class__.__name__} with ID {self.id} successfully hard deleted") - def update(self, db_session: "Session", actor: Optional["User"] = None) -> Type["SqlalchemyBase"]: + def update(self, db_session: "Session", actor: Optional["User"] = None) -> "SqlalchemyBase": logger.debug(f"Updating {self.__class__.__name__} with ID: {self.id} with actor={actor}") if actor: self._set_created_and_updated_by_fields(actor.id) @@ -388,14 +412,14 @@ def _handle_dbapi_error(cls, e: DBAPIError): raise @property - def __pydantic_model__(self) -> Type["BaseModel"]: + def __pydantic_model__(self) -> "BaseModel": raise NotImplementedError("Sqlalchemy models must declare a __pydantic_model__ property to be convertable.") - def to_pydantic(self) -> Type["BaseModel"]: + def to_pydantic(self) -> "BaseModel": """converts to the basic pydantic model counterpart""" return self.__pydantic_model__.model_validate(self) - def to_record(self) -> Type["BaseModel"]: + def to_record(self) -> "BaseModel": """Deprecated accessor for to_pydantic""" logger.warning("to_record is deprecated, use to_pydantic instead.") - return self.to_pydantic() \ No newline at end of file + return self.to_pydantic() diff --git a/letta/orm/tool.py b/letta/orm/tool.py index 8f1ac46a43..a25c7ebb00 100644 --- a/letta/orm/tool.py +++ b/letta/orm/tool.py @@ -1,6 +1,6 @@ from typing import TYPE_CHECKING, List, Optional -from sqlalchemy import JSON, String, UniqueConstraint, event +from sqlalchemy import JSON, String, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column, relationship # TODO everything in functions should live in this model @@ -11,7 +11,6 @@ if TYPE_CHECKING: from letta.orm.organization import Organization - from letta.orm.tools_agents import ToolsAgents class Tool(SqlalchemyBase, OrganizationMixin): @@ -42,20 +41,3 @@ class Tool(SqlalchemyBase, OrganizationMixin): # relationships organization: Mapped["Organization"] = relationship("Organization", back_populates="tools", lazy="selectin") - tools_agents: Mapped[List["ToolsAgents"]] = relationship("ToolsAgents", back_populates="tool", cascade="all, delete-orphan") - - -# Add event listener to update tool_name in ToolsAgents when Tool name changes -@event.listens_for(Tool, "before_update") -def update_tool_name_in_tools_agents(mapper, connection, target): - """Update tool_name in ToolsAgents when Tool name changes.""" - state = target._sa_instance_state - history = state.get_history("name", passive=True) - if not history.has_changes(): - return - - # Get the new name and update all associated ToolsAgents records - new_name = target.name - from letta.orm.tools_agents import ToolsAgents - - connection.execute(ToolsAgents.__table__.update().where(ToolsAgents.tool_id == target.id).values(tool_name=new_name)) diff --git a/letta/orm/tools_agents.py b/letta/orm/tools_agents.py index dfb8a9a704..52c1e0a1e2 100644 --- a/letta/orm/tools_agents.py +++ b/letta/orm/tools_agents.py @@ -1,32 +1,15 @@ -from sqlalchemy import ForeignKey, ForeignKeyConstraint, String, UniqueConstraint -from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy import ForeignKey, String, UniqueConstraint +from sqlalchemy.orm import Mapped, mapped_column -from letta.orm.sqlalchemy_base import SqlalchemyBase -from letta.schemas.tools_agents import ToolsAgents as PydanticToolsAgents +from letta.orm import Base -class ToolsAgents(SqlalchemyBase): +class ToolsAgents(Base): """Agents can have one or many tools associated with them.""" __tablename__ = "tools_agents" - __pydantic_model__ = PydanticToolsAgents - __table_args__ = ( - UniqueConstraint( - "agent_id", - "tool_name", - name="unique_tool_per_agent", - ), - ForeignKeyConstraint( - ["tool_id"], - ["tools.id"], - name="fk_tool_id", - ), - ) + __table_args__ = (UniqueConstraint("agent_id", "tool_id", name="unique_agent_tool"),) # Each agent must have unique tool names - agent_id: Mapped[str] = mapped_column(String, ForeignKey("agents.id"), primary_key=True) - tool_id: Mapped[str] = mapped_column(String, primary_key=True) - tool_name: Mapped[str] = mapped_column(String, primary_key=True) - - # relationships - tool: Mapped["Tool"] = relationship("Tool", back_populates="tools_agents") # agent: Mapped["Agent"] = relationship("Agent", back_populates="tools_agents") + agent_id: Mapped[str] = mapped_column(String, ForeignKey("agents.id", ondelete="CASCADE"), primary_key=True) + tool_id: Mapped[str] = mapped_column(String, ForeignKey("tools.id", ondelete="CASCADE"), primary_key=True) diff --git a/letta/orm/user.py b/letta/orm/user.py index 62a3c0e606..9f626b104d 100644 --- a/letta/orm/user.py +++ b/letta/orm/user.py @@ -20,10 +20,9 @@ class User(SqlalchemyBase, OrganizationMixin): # relationships organization: Mapped["Organization"] = relationship("Organization", back_populates="users") - jobs: Mapped[List["Job"]] = relationship("Job", back_populates="user", doc="the jobs associated with this user.", cascade="all, delete-orphan") + jobs: Mapped[List["Job"]] = relationship( + "Job", back_populates="user", doc="the jobs associated with this user.", cascade="all, delete-orphan" + ) # TODO: Add this back later potentially - # agents: Mapped[List["Agent"]] = relationship( - # "Agent", secondary="users_agents", back_populates="users", doc="the agents associated with this user." - # ) # tokens: Mapped[List["Token"]] = relationship("Token", back_populates="user", doc="the tokens associated with this user.") diff --git a/letta/schemas/agent.py b/letta/schemas/agent.py index f0372f8fa5..994233ab74 100644 --- a/letta/schemas/agent.py +++ b/letta/schemas/agent.py @@ -1,13 +1,11 @@ -from datetime import datetime from enum import Enum from typing import Dict, List, Optional from pydantic import BaseModel, Field, field_validator -from letta.constants import BASE_MEMORY_TOOLS, BASE_TOOLS from letta.schemas.block import CreateBlock from letta.schemas.embedding_config import EmbeddingConfig -from letta.schemas.letta_base import LettaBase +from letta.schemas.letta_base import OrmMetadataBase from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import Memory from letta.schemas.message import Message, MessageCreate @@ -15,15 +13,15 @@ from letta.schemas.source import Source from letta.schemas.tool import Tool from letta.schemas.tool_rule import ToolRule +from letta.utils import create_random_username -class BaseAgent(LettaBase, validate_assignment=True): +class BaseAgent(OrmMetadataBase, validate_assignment=True): __id_prefix__ = "agent" description: Optional[str] = Field(None, description="The description of the agent.") # metadata metadata_: Optional[Dict] = Field(None, description="The metadata of the agent.", alias="metadata_") - user_id: Optional[str] = Field(None, description="The user id of the agent.") class AgentType(str, Enum): @@ -38,37 +36,7 @@ class AgentType(str, Enum): chat_only_agent = "chat_only_agent" -class PersistedAgentState(BaseAgent, validate_assignment=True): - # NOTE: this has been changed to represent the data stored in the ORM, NOT what is passed around internally or returned to the user - id: str = BaseAgent.generate_id_field() - name: str = Field(..., description="The name of the agent.") - created_at: datetime = Field(..., description="The datetime the agent was created.", default_factory=datetime.now) - - # in-context memory - message_ids: Optional[List[str]] = Field(default=None, description="The ids of the messages in the agent's in-context memory.") - # tools - # TODO: move to ORM mapping - tool_names: List[str] = Field(..., description="The tools used by the agent.") - - # tool rules - tool_rules: Optional[List[ToolRule]] = Field(default=None, description="The list of tool rules.") - - # system prompt - system: str = Field(..., description="The system prompt used by the agent.") - - # agent configuration - agent_type: AgentType = Field(..., description="The type of agent.") - - # llm information - llm_config: LLMConfig = Field(..., description="The LLM configuration used by the agent.") - embedding_config: EmbeddingConfig = Field(..., description="The embedding configuration used by the agent.") - - class Config: - arbitrary_types_allowed = True - validate_assignment = True - - -class AgentState(PersistedAgentState): +class AgentState(BaseAgent): """ Representation of an agent's state. This is the state of the agent at a given time, and is persisted in the DB backend. The state has all the information needed to recreate a persisted agent. @@ -86,42 +54,53 @@ class AgentState(PersistedAgentState): """ # NOTE: this is what is returned to the client and also what is used to initialize `Agent` + id: str = BaseAgent.generate_id_field() + name: str = Field(..., description="The name of the agent.") + # tool rules + tool_rules: Optional[List[ToolRule]] = Field(default=None, description="The list of tool rules.") + + # in-context memory + message_ids: Optional[List[str]] = Field(default=None, description="The ids of the messages in the agent's in-context memory.") + + # system prompt + system: str = Field(..., description="The system prompt used by the agent.") + + # agent configuration + agent_type: AgentType = Field(..., description="The type of agent.") + + # llm information + llm_config: LLMConfig = Field(..., description="The LLM configuration used by the agent.") + embedding_config: EmbeddingConfig = Field(..., description="The embedding configuration used by the agent.") # This is an object representing the in-process state of a running `Agent` # Field in this object can be theoretically edited by tools, and will be persisted by the ORM + organization_id: Optional[str] = Field(None, description="The unique identifier of the organization associated with the agent.") + memory: Memory = Field(..., description="The in-context memory of the agent.") tools: List[Tool] = Field(..., description="The tools used by the agent.") sources: List[Source] = Field(..., description="The sources used by the agent.") tags: List[str] = Field(..., description="The tags associated with the agent.") # TODO: add in context message objects - def to_persisted_agent_state(self) -> PersistedAgentState: - # turn back into persisted agent - data = self.model_dump() - del data["memory"] - del data["tools"] - del data["sources"] - del data["tags"] - return PersistedAgentState(**data) - class CreateAgent(BaseAgent): # # all optional as server can generate defaults - name: Optional[str] = Field(None, description="The name of the agent.") - message_ids: Optional[List[str]] = Field(None, description="The ids of the messages in the agent's in-context memory.") + name: str = Field(default_factory=lambda: create_random_username(), description="The name of the agent.") # memory creation memory_blocks: List[CreateBlock] = Field( - # [CreateHuman(), CreatePersona()], description="The blocks to create in the agent's in-context memory." ..., description="The blocks to create in the agent's in-context memory.", ) - - tools: List[str] = Field(BASE_TOOLS + BASE_MEMORY_TOOLS, description="The tools used by the agent.") + # TODO: This is a legacy field and should be removed ASAP to force `tool_ids` usage + tools: Optional[List[str]] = Field(None, description="The tools used by the agent.") + tool_ids: Optional[List[str]] = Field(None, description="The ids of the tools used by the agent.") + source_ids: Optional[List[str]] = Field(None, description="The ids of the sources used by the agent.") + block_ids: Optional[List[str]] = Field(None, description="The ids of the blocks used by the agent.") tool_rules: Optional[List[ToolRule]] = Field(None, description="The tool rules governing the agent.") tags: Optional[List[str]] = Field(None, description="The tags associated with the agent.") system: Optional[str] = Field(None, description="The system prompt used by the agent.") - agent_type: AgentType = Field(AgentType.memgpt_agent, description="The type of agent.") + agent_type: AgentType = Field(default_factory=lambda: AgentType.memgpt_agent, description="The type of agent.") llm_config: Optional[LLMConfig] = Field(None, description="The LLM configuration used by the agent.") embedding_config: Optional[EmbeddingConfig] = Field(None, description="The embedding configuration used by the agent.") # Note: if this is None, then we'll populate with the standard "more human than human" initial message sequence @@ -129,6 +108,7 @@ class CreateAgent(BaseAgent): # initial_message_sequence: Optional[List[MessageCreate]] = Field( None, description="The initial set of messages to put in the agent's in-context memory." ) + include_base_tools: bool = Field(True, description="The LLM configuration used by the agent.") @field_validator("name") @classmethod @@ -156,18 +136,21 @@ def validate_name(cls, name: str) -> str: return name -class UpdateAgentState(BaseAgent): - id: str = Field(..., description="The id of the agent.") +class UpdateAgent(BaseAgent): name: Optional[str] = Field(None, description="The name of the agent.") - tool_names: Optional[List[str]] = Field(None, description="The tools used by the agent.") + tool_ids: Optional[List[str]] = Field(None, description="The ids of the tools used by the agent.") + source_ids: Optional[List[str]] = Field(None, description="The ids of the sources used by the agent.") + block_ids: Optional[List[str]] = Field(None, description="The ids of the blocks used by the agent.") tags: Optional[List[str]] = Field(None, description="The tags associated with the agent.") system: Optional[str] = Field(None, description="The system prompt used by the agent.") + tool_rules: Optional[List[ToolRule]] = Field(None, description="The tool rules governing the agent.") llm_config: Optional[LLMConfig] = Field(None, description="The LLM configuration used by the agent.") embedding_config: Optional[EmbeddingConfig] = Field(None, description="The embedding configuration used by the agent.") - - # TODO: determine if these should be editable via this schema? message_ids: Optional[List[str]] = Field(None, description="The ids of the messages in the agent's in-context memory.") + class Config: + extra = "ignore" # Ignores extra fields + class AgentStepResponse(BaseModel): messages: List[Message] = Field(..., description="The messages generated during the agent's step.") diff --git a/letta/schemas/agents_tags.py b/letta/schemas/agents_tags.py deleted file mode 100644 index eba5e0db0b..0000000000 --- a/letta/schemas/agents_tags.py +++ /dev/null @@ -1,33 +0,0 @@ -from datetime import datetime -from typing import Optional - -from pydantic import Field - -from letta.schemas.letta_base import LettaBase - - -class AgentsTagsBase(LettaBase): - __id_prefix__ = "agents_tags" - - -class AgentsTags(AgentsTagsBase): - """ - Schema representing the relationship between tags and agents. - - Parameters: - agent_id (str): The ID of the associated agent. - tag_id (str): The ID of the associated tag. - tag_name (str): The name of the tag. - created_at (datetime): The date this relationship was created. - """ - - id: str = AgentsTagsBase.generate_id_field() - agent_id: str = Field(..., description="The ID of the associated agent.") - tag: str = Field(..., description="The name of the tag.") - created_at: Optional[datetime] = Field(None, description="The creation date of the association.") - updated_at: Optional[datetime] = Field(None, description="The update date of the tag.") - is_deleted: bool = Field(False, description="Whether this tag is deleted or not.") - - -class AgentsTagsCreate(AgentsTagsBase): - tag: str = Field(..., description="The tag name.") diff --git a/letta/schemas/blocks_agents.py b/letta/schemas/blocks_agents.py deleted file mode 100644 index 8b33925a8c..0000000000 --- a/letta/schemas/blocks_agents.py +++ /dev/null @@ -1,32 +0,0 @@ -from datetime import datetime -from typing import Optional - -from pydantic import Field - -from letta.schemas.letta_base import LettaBase - - -class BlocksAgentsBase(LettaBase): - __id_prefix__ = "blocks_agents" - - -class BlocksAgents(BlocksAgentsBase): - """ - Schema representing the relationship between blocks and agents. - - Parameters: - agent_id (str): The ID of the associated agent. - block_id (str): The ID of the associated block. - block_label (str): The label of the block. - created_at (datetime): The date this relationship was created. - updated_at (datetime): The date this relationship was last updated. - is_deleted (bool): Whether this block-agent relationship is deleted or not. - """ - - id: str = BlocksAgentsBase.generate_id_field() - agent_id: str = Field(..., description="The ID of the associated agent.") - block_id: str = Field(..., description="The ID of the associated block.") - block_label: str = Field(..., description="The label of the block.") - created_at: Optional[datetime] = Field(None, description="The creation date of the association.") - updated_at: Optional[datetime] = Field(None, description="The update date of the association.") - is_deleted: bool = Field(False, description="Whether this block-agent relationship is deleted or not.") diff --git a/letta/schemas/memory.py b/letta/schemas/memory.py index 9084006dbe..797eac576e 100644 --- a/letta/schemas/memory.py +++ b/letta/schemas/memory.py @@ -87,7 +87,7 @@ def set_prompt_template(self, prompt_template: str): Template(prompt_template) # Validate compatibility with current memory structure - test_render = Template(prompt_template).render(blocks=self.blocks) + Template(prompt_template).render(blocks=self.blocks) # If we get here, the template is valid and compatible self.prompt_template = prompt_template @@ -213,6 +213,7 @@ def __init__(self, persona: str, human: str, limit: int = CORE_MEMORY_BLOCK_CHAR human (str): The starter value for the human block. limit (int): The character limit for each block. """ + # TODO: Should these be CreateBlocks? super().__init__(blocks=[Block(value=persona, limit=limit, label="persona"), Block(value=human, limit=limit, label="human")]) diff --git a/letta/schemas/tools_agents.py b/letta/schemas/tools_agents.py deleted file mode 100644 index b7e8bdcf61..0000000000 --- a/letta/schemas/tools_agents.py +++ /dev/null @@ -1,32 +0,0 @@ -from datetime import datetime -from typing import Optional - -from pydantic import Field - -from letta.schemas.letta_base import LettaBase - - -class ToolsAgentsBase(LettaBase): - __id_prefix__ = "tools_agents" - - -class ToolsAgents(ToolsAgentsBase): - """ - Schema representing the relationship between tools and agents. - - Parameters: - agent_id (str): The ID of the associated agent. - tool_id (str): The ID of the associated tool. - tool_name (str): The name of the tool. - created_at (datetime): The date this relationship was created. - updated_at (datetime): The date this relationship was last updated. - is_deleted (bool): Whether this tool-agent relationship is deleted or not. - """ - - id: str = ToolsAgentsBase.generate_id_field() - agent_id: str = Field(..., description="The ID of the associated agent.") - tool_id: str = Field(..., description="The ID of the associated tool.") - tool_name: str = Field(..., description="The name of the tool.") - created_at: Optional[datetime] = Field(None, description="The creation date of the association.") - updated_at: Optional[datetime] = Field(None, description="The update date of the association.") - is_deleted: bool = Field(False, description="Whether this tool-agent relationship is deleted or not.") diff --git a/letta/server/rest_api/app.py b/letta/server/rest_api/app.py index b48a13d0d1..615811d7eb 100644 --- a/letta/server/rest_api/app.py +++ b/letta/server/rest_api/app.py @@ -25,9 +25,6 @@ from letta.server.rest_api.routers.openai.assistants.assistants import ( router as openai_assistants_router, ) -from letta.server.rest_api.routers.openai.assistants.threads import ( - router as openai_threads_router, -) from letta.server.rest_api.routers.openai.chat_completions.chat_completions import ( router as openai_chat_completions_router, ) @@ -215,7 +212,6 @@ async def user_not_found_handler(request: Request, exc: LettaUserNotFoundError): # openai app.include_router(openai_assistants_router, prefix=OPENAI_API_PREFIX) - app.include_router(openai_threads_router, prefix=OPENAI_API_PREFIX) app.include_router(openai_chat_completions_router, prefix=OPENAI_API_PREFIX) # /api/auth endpoints @@ -236,7 +232,6 @@ def on_startup(): @app.on_event("shutdown") def on_shutdown(): global server - server.save_agents() # server = None return app diff --git a/letta/server/rest_api/routers/openai/assistants/threads.py b/letta/server/rest_api/routers/openai/assistants/threads.py deleted file mode 100644 index 8742aa4219..0000000000 --- a/letta/server/rest_api/routers/openai/assistants/threads.py +++ /dev/null @@ -1,338 +0,0 @@ -import uuid -from typing import TYPE_CHECKING, List, Optional - -from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, Query - -from letta.constants import DEFAULT_PRESET -from letta.schemas.agent import CreateAgent -from letta.schemas.enums import MessageRole -from letta.schemas.message import Message -from letta.schemas.openai.openai import ( - MessageFile, - OpenAIMessage, - OpenAIRun, - OpenAIRunStep, - OpenAIThread, - Text, -) -from letta.server.rest_api.routers.openai.assistants.schemas import ( - CreateMessageRequest, - CreateRunRequest, - CreateThreadRequest, - CreateThreadRunRequest, - DeleteThreadResponse, - ListMessagesResponse, - ModifyMessageRequest, - ModifyRunRequest, - ModifyThreadRequest, - OpenAIThread, - SubmitToolOutputsToRunRequest, -) -from letta.server.rest_api.utils import get_letta_server -from letta.server.server import SyncServer - -if TYPE_CHECKING: - from letta.utils import get_utc_time - - -# TODO: implement mechanism for creating/authenticating users associated with a bearer token -router = APIRouter(prefix="/v1/threads", tags=["threads"]) - - -@router.post("/", response_model=OpenAIThread) -def create_thread( - request: CreateThreadRequest = Body(...), - server: SyncServer = Depends(get_letta_server), - user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present -): - # TODO: use requests.description and requests.metadata fields - # TODO: handle requests.file_ids and requests.tools - # TODO: eventually allow request to override embedding/llm model - actor = server.get_user_or_default(user_id=user_id) - - print("Create thread/agent", request) - # create a letta agent - agent_state = server.create_agent( - request=CreateAgent(), - user_id=actor.id, - ) - # TODO: insert messages into recall memory - return OpenAIThread( - id=str(agent_state.id), - created_at=int(agent_state.created_at.timestamp()), - metadata={}, # TODO add metadata? - ) - - -@router.get("/{thread_id}", response_model=OpenAIThread) -def retrieve_thread( - thread_id: str = Path(..., description="The unique identifier of the thread."), - server: SyncServer = Depends(get_letta_server), - user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present -): - actor = server.get_user_or_default(user_id=user_id) - agent = server.get_agent(user_id=actor.id, agent_id=thread_id) - assert agent is not None - return OpenAIThread( - id=str(agent.id), - created_at=int(agent.created_at.timestamp()), - metadata={}, # TODO add metadata? - ) - - -@router.get("/{thread_id}", response_model=OpenAIThread) -def modify_thread( - thread_id: str = Path(..., description="The unique identifier of the thread."), - request: ModifyThreadRequest = Body(...), -): - # TODO: add agent metadata so this can be modified - raise HTTPException(status_code=404, detail="Not yet implemented (coming soon)") - - -@router.delete("/{thread_id}", response_model=DeleteThreadResponse) -def delete_thread( - thread_id: str = Path(..., description="The unique identifier of the thread."), -): - # TODO: delete agent - raise HTTPException(status_code=404, detail="Not yet implemented (coming soon)") - - -@router.post("/{thread_id}/messages", tags=["messages"], response_model=OpenAIMessage) -def create_message( - thread_id: str = Path(..., description="The unique identifier of the thread."), - request: CreateMessageRequest = Body(...), - server: SyncServer = Depends(get_letta_server), - user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present -): - actor = server.get_user_or_default(user_id=user_id) - agent_id = thread_id - # create message object - message = Message( - user_id=actor.id, - agent_id=agent_id, - role=MessageRole(request.role), - text=request.content, - model=None, - tool_calls=None, - tool_call_id=None, - name=None, - ) - agent = server.load_agent(agent_id=agent_id) - # add message to agent - agent._append_to_messages([message]) - - openai_message = OpenAIMessage( - id=str(message.id), - created_at=int(message.created_at.timestamp()), - content=[Text(text=(message.text if message.text else ""))], - role=message.role, - thread_id=str(message.agent_id), - assistant_id=DEFAULT_PRESET, # TODO: update this - # TODO(sarah) fill in? - run_id=None, - file_ids=None, - metadata=None, - # file_ids=message.file_ids, - # metadata=message.metadata, - ) - return openai_message - - -@router.get("/{thread_id}/messages", tags=["messages"], response_model=ListMessagesResponse) -def list_messages( - thread_id: str = Path(..., description="The unique identifier of the thread."), - limit: int = Query(1000, description="How many messages to retrieve."), - order: str = Query("asc", description="Order of messages to retrieve (either 'asc' or 'desc')."), - after: str = Query(None, description="A cursor for use in pagination. `after` is an object ID that defines your place in the list."), - before: str = Query(None, description="A cursor for use in pagination. `after` is an object ID that defines your place in the list."), - server: SyncServer = Depends(get_letta_server), - user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present -): - actor = server.get_user_or_default(user_id) - after_uuid = after if before else None - before_uuid = before if before else None - agent_id = thread_id - reverse = True if (order == "desc") else False - json_messages = server.get_agent_recall_cursor( - user_id=actor.id, - agent_id=agent_id, - limit=limit, - after=after_uuid, - before=before_uuid, - order_by="created_at", - reverse=reverse, - ) - assert isinstance(json_messages, List) - assert all([isinstance(message, Message) for message in json_messages]) - assert isinstance(json_messages[0], Message) - print(json_messages[0].text) - # convert to openai style messages - openai_messages = [] - for message in json_messages: - assert isinstance(message, Message) - openai_messages.append( - OpenAIMessage( - id=str(message.id), - created_at=int(message.created_at.timestamp()), - content=[Text(text=(message.text if message.text else ""))], - role=str(message.role), - thread_id=str(message.agent_id), - assistant_id=DEFAULT_PRESET, # TODO: update this - # TODO(sarah) fill in? - run_id=None, - file_ids=None, - metadata=None, - # file_ids=message.file_ids, - # metadata=message.metadata, - ) - ) - print("MESSAGES", openai_messages) - # TODO: cast back to message objects - return ListMessagesResponse(messages=openai_messages) - - -@router.get("/{thread_id}/messages/{message_id}", tags=["messages"], response_model=OpenAIMessage) -def retrieve_message( - thread_id: str = Path(..., description="The unique identifier of the thread."), - message_id: str = Path(..., description="The unique identifier of the message."), - server: SyncServer = Depends(get_letta_server), -): - agent_id = thread_id - message = server.get_agent_message(agent_id=agent_id, message_id=message_id) - assert message is not None - return OpenAIMessage( - id=message_id, - created_at=int(message.created_at.timestamp()), - content=[Text(text=(message.text if message.text else ""))], - role=message.role, - thread_id=str(message.agent_id), - assistant_id=DEFAULT_PRESET, # TODO: update this - # TODO(sarah) fill in? - run_id=None, - file_ids=None, - metadata=None, - # file_ids=message.file_ids, - # metadata=message.metadata, - ) - - -@router.get("/{thread_id}/messages/{message_id}/files/{file_id}", tags=["messages"], response_model=MessageFile) -def retrieve_message_file( - thread_id: str = Path(..., description="The unique identifier of the thread."), - message_id: str = Path(..., description="The unique identifier of the message."), - file_id: str = Path(..., description="The unique identifier of the file."), -): - # TODO: implement? - raise HTTPException(status_code=404, detail="Not yet implemented (coming soon)") - - -@router.post("/{thread_id}/messages/{message_id}", tags=["messages"], response_model=OpenAIMessage) -def modify_message( - thread_id: str = Path(..., description="The unique identifier of the thread."), - message_id: str = Path(..., description="The unique identifier of the message."), - request: ModifyMessageRequest = Body(...), -): - # TODO: add metada field to message so this can be modified - raise HTTPException(status_code=404, detail="Not yet implemented (coming soon)") - - -@router.post("/{thread_id}/runs", tags=["runs"], response_model=OpenAIRun) -def create_run( - thread_id: str = Path(..., description="The unique identifier of the thread."), - request: CreateRunRequest = Body(...), - server: SyncServer = Depends(get_letta_server), -): - - # TODO: add request.instructions as a message? - agent_id = thread_id - # TODO: override preset of agent with request.assistant_id - agent = server.load_agent(agent_id=agent_id) - agent.inner_step(messages=[]) # already has messages added - run_id = str(uuid.uuid4()) - create_time = int(get_utc_time().timestamp()) - return OpenAIRun( - id=run_id, - created_at=create_time, - thread_id=str(agent_id), - assistant_id=DEFAULT_PRESET, # TODO: update this - status="completed", # TODO: eventaully allow offline execution - expires_at=create_time, - model=agent.agent_state.llm_config.model, - instructions=request.instructions, - ) - - -@router.post("/runs", tags=["runs"], response_model=OpenAIRun) -def create_thread_and_run( - request: CreateThreadRunRequest = Body(...), -): - # TODO: add a bunch of messages and execute - raise HTTPException(status_code=404, detail="Not yet implemented (coming soon)") - - -@router.get("/{thread_id}/runs", tags=["runs"], response_model=List[OpenAIRun]) -def list_runs( - thread_id: str = Path(..., description="The unique identifier of the thread."), - limit: int = Query(1000, description="How many runs to retrieve."), - order: str = Query("asc", description="Order of runs to retrieve (either 'asc' or 'desc')."), - after: str = Query(None, description="A cursor for use in pagination. `after` is an object ID that defines your place in the list."), - before: str = Query(None, description="A cursor for use in pagination. `after` is an object ID that defines your place in the list."), -): - # TODO: store run information in a DB so it can be returned here - raise HTTPException(status_code=404, detail="Not yet implemented (coming soon)") - - -@router.get("/{thread_id}/runs/{run_id}/steps", tags=["runs"], response_model=List[OpenAIRunStep]) -def list_run_steps( - thread_id: str = Path(..., description="The unique identifier of the thread."), - run_id: str = Path(..., description="The unique identifier of the run."), - limit: int = Query(1000, description="How many run steps to retrieve."), - order: str = Query("asc", description="Order of run steps to retrieve (either 'asc' or 'desc')."), - after: str = Query(None, description="A cursor for use in pagination. `after` is an object ID that defines your place in the list."), - before: str = Query(None, description="A cursor for use in pagination. `after` is an object ID that defines your place in the list."), -): - # TODO: store run information in a DB so it can be returned here - raise HTTPException(status_code=404, detail="Not yet implemented (coming soon)") - - -@router.get("/{thread_id}/runs/{run_id}", tags=["runs"], response_model=OpenAIRun) -def retrieve_run( - thread_id: str = Path(..., description="The unique identifier of the thread."), - run_id: str = Path(..., description="The unique identifier of the run."), -): - raise HTTPException(status_code=404, detail="Not yet implemented (coming soon)") - - -@router.get("/{thread_id}/runs/{run_id}/steps/{step_id}", tags=["runs"], response_model=OpenAIRunStep) -def retrieve_run_step( - thread_id: str = Path(..., description="The unique identifier of the thread."), - run_id: str = Path(..., description="The unique identifier of the run."), - step_id: str = Path(..., description="The unique identifier of the run step."), -): - raise HTTPException(status_code=404, detail="Not yet implemented (coming soon)") - - -@router.post("/{thread_id}/runs/{run_id}", tags=["runs"], response_model=OpenAIRun) -def modify_run( - thread_id: str = Path(..., description="The unique identifier of the thread."), - run_id: str = Path(..., description="The unique identifier of the run."), - request: ModifyRunRequest = Body(...), -): - raise HTTPException(status_code=404, detail="Not yet implemented (coming soon)") - - -@router.post("/{thread_id}/runs/{run_id}/submit_tool_outputs", tags=["runs"], response_model=OpenAIRun) -def submit_tool_outputs_to_run( - thread_id: str = Path(..., description="The unique identifier of the thread."), - run_id: str = Path(..., description="The unique identifier of the run."), - request: SubmitToolOutputsToRunRequest = Body(...), -): - raise HTTPException(status_code=404, detail="Not yet implemented (coming soon)") - - -@router.post("/{thread_id}/runs/{run_id}/cancel", tags=["runs"], response_model=OpenAIRun) -def cancel_run( - thread_id: str = Path(..., description="The unique identifier of the thread."), - run_id: str = Path(..., description="The unique identifier of the run."), -): - raise HTTPException(status_code=404, detail="Not yet implemented (coming soon)") diff --git a/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py b/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py index 4703104228..3dc7916a35 100644 --- a/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py +++ b/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py @@ -36,7 +36,7 @@ async def create_chat_completion( The bearer token will be used to identify the user. The 'user' field in the completion_request should be set to the agent ID. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) agent_id = completion_request.user if agent_id is None: diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index 06b0acd60c..fc5ce50794 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -17,7 +17,8 @@ from pydantic import Field from letta.constants import DEFAULT_MESSAGE_TOOL, DEFAULT_MESSAGE_TOOL_KWARG -from letta.schemas.agent import AgentState, CreateAgent, UpdateAgentState +from letta.orm.errors import NoResultFound +from letta.schemas.agent import AgentState, CreateAgent, UpdateAgent from letta.schemas.block import ( # , BlockLabelUpdate, BlockLimitUpdate Block, BlockUpdate, @@ -54,23 +55,38 @@ router = APIRouter(prefix="/agents", tags=["agents"]) +# TODO: This should be paginated @router.get("/", response_model=List[AgentState], operation_id="list_agents") def list_agents( name: Optional[str] = Query(None, description="Name of the agent"), tags: Optional[List[str]] = Query(None, description="List of tags to filter agents by"), + match_all_tags: bool = Query( + False, + description="If True, only returns agents that match ALL given tags. Otherwise, return agents that have ANY of the passed in tags.", + ), server: "SyncServer" = Depends(get_letta_server), - user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present + user_id: Optional[str] = Header(None, alias="user_id"), + # Extract user_id from header, default to None if not present ): """ List all agents associated with a given user. This endpoint retrieves a list of all agents and their configurations associated with the specified user ID. """ - actor = server.get_user_or_default(user_id=user_id) - - agents = server.list_agents(user_id=actor.id, tags=tags) - # TODO: move this logic to the ORM - if name: - agents = [a for a in agents if a.name == name] + actor = server.user_manager.get_user_or_default(user_id=user_id) + + # Use dictionary comprehension to build kwargs dynamically + kwargs = { + key: value + for key, value in { + "tags": tags, + "match_all_tags": match_all_tags, + "name": name, + }.items() + if value is not None + } + + # Call list_agents with the dynamic kwargs + agents = server.agent_manager.list_agents(actor=actor, **kwargs) return agents @@ -83,7 +99,7 @@ def get_agent_context_window( """ Retrieve the context window of a specific agent. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) return server.get_agent_context_window(user_id=actor.id, agent_id=agent_id) @@ -106,20 +122,20 @@ def create_agent( """ Create a new agent with the specified configuration. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) return server.create_agent(agent, actor=actor) @router.patch("/{agent_id}", response_model=AgentState, operation_id="update_agent") def update_agent( agent_id: str, - update_agent: UpdateAgentState = Body(...), + update_agent: UpdateAgent = Body(...), server: "SyncServer" = Depends(get_letta_server), user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present ): """Update an exsiting agent""" - actor = server.get_user_or_default(user_id=user_id) - return server.update_agent(update_agent, actor=actor) + actor = server.user_manager.get_user_or_default(user_id=user_id) + return server.update_agent(agent_id, update_agent, actor=actor) @router.get("/{agent_id}/tools", response_model=List[Tool], operation_id="get_tools_from_agent") @@ -129,7 +145,7 @@ def get_tools_from_agent( user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present ): """Get tools from an existing agent""" - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) return server.get_tools_from_agent(agent_id=agent_id, user_id=actor.id) @@ -141,7 +157,7 @@ def add_tool_to_agent( user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present ): """Add tools to an existing agent""" - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) return server.add_tool_to_agent(agent_id=agent_id, tool_id=tool_id, user_id=actor.id) @@ -153,7 +169,7 @@ def remove_tool_from_agent( user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present ): """Add tools to an existing agent""" - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) return server.remove_tool_from_agent(agent_id=agent_id, tool_id=tool_id, user_id=actor.id) @@ -166,13 +182,12 @@ def get_agent_state( """ Get the state of the agent. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) - if not server.ms.get_agent(user_id=actor.id, agent_id=agent_id): - # agent does not exist - raise HTTPException(status_code=404, detail=f"Agent agent_id={agent_id} not found.") - - return server.get_agent_state(user_id=actor.id, agent_id=agent_id) + try: + return server.agent_manager.get_agent_by_id(agent_id=agent_id, actor=actor) + except NoResultFound as e: + raise HTTPException(status_code=404, detail=str(e)) @router.delete("/{agent_id}", response_model=AgentState, operation_id="delete_agent") @@ -184,38 +199,37 @@ def delete_agent( """ Delete an agent. """ - actor = server.get_user_or_default(user_id=user_id) - - agent = server.get_agent(agent_id) - if not agent: - raise HTTPException(status_code=404, detail=f"Agent agent_id={agent_id} not found.") - - server.delete_agent(user_id=actor.id, agent_id=agent_id) - return agent + actor = server.user_manager.get_user_or_default(user_id=user_id) + try: + return server.agent_manager.delete_agent(agent_id=agent_id, actor=actor) + except NoResultFound: + raise HTTPException(status_code=404, detail=f"Agent agent_id={agent_id} not found for user_id={actor.id}.") @router.get("/{agent_id}/sources", response_model=List[Source], operation_id="get_agent_sources") def get_agent_sources( agent_id: str, server: "SyncServer" = Depends(get_letta_server), + user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present ): """ Get the sources associated with an agent. """ - - return server.list_attached_sources(agent_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) + return server.agent_manager.list_attached_sources(agent_id=agent_id, actor=actor) @router.get("/{agent_id}/memory/messages", response_model=List[Message], operation_id="list_agent_in_context_messages") def get_agent_in_context_messages( agent_id: str, server: "SyncServer" = Depends(get_letta_server), + user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present ): """ Retrieve the messages in the context of a specific agent. """ - - return server.get_in_context_messages(agent_id=agent_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) + return server.get_in_context_messages(agent_id=agent_id, actor=actor) # TODO: remove? can also get with agent blocks @@ -223,13 +237,15 @@ def get_agent_in_context_messages( def get_agent_memory( agent_id: str, server: "SyncServer" = Depends(get_letta_server), + user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present ): """ Retrieve the memory state of a specific agent. This endpoint fetches the current memory state of the agent identified by the user ID and agent ID. """ + actor = server.user_manager.get_user_or_default(user_id=user_id) - return server.get_agent_memory(agent_id=agent_id) + return server.get_agent_memory(agent_id=agent_id, actor=actor) @router.get("/{agent_id}/memory/block/{block_label}", response_model=Block, operation_id="get_agent_memory_block") @@ -242,10 +258,12 @@ def get_agent_memory_block( """ Retrieve a memory block from an agent. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) - block_id = server.blocks_agents_manager.get_block_id_for_label(agent_id=agent_id, block_label=block_label) - return server.block_manager.get_block_by_id(block_id, actor=actor) + try: + return server.agent_manager.get_block_with_label(agent_id=agent_id, block_label=block_label, actor=actor) + except NoResultFound as e: + raise HTTPException(status_code=404, detail=str(e)) @router.get("/{agent_id}/memory/block", response_model=List[Block], operation_id="get_agent_memory_blocks") @@ -257,9 +275,12 @@ def get_agent_memory_blocks( """ Retrieve the memory blocks of a specific agent. """ - actor = server.get_user_or_default(user_id=user_id) - block_ids = server.blocks_agents_manager.list_block_ids_for_agent(agent_id=agent_id) - return [server.block_manager.get_block_by_id(block_id, actor=actor) for block_id in block_ids] + actor = server.user_manager.get_user_or_default(user_id=user_id) + try: + agent = server.agent_manager.get_agent_by_id(agent_id, actor=actor) + return agent.memory.blocks + except NoResultFound as e: + raise HTTPException(status_code=404, detail=str(e)) @router.post("/{agent_id}/memory/block", response_model=Memory, operation_id="add_agent_memory_block") @@ -272,16 +293,17 @@ def add_agent_memory_block( """ Creates a memory block and links it to the agent. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) # Copied from POST /blocks + # TODO: Should have block_manager accept only CreateBlock + # TODO: This will be possible once we move ID creation to the ORM block_req = Block(**create_block.model_dump()) block = server.block_manager.create_or_update_block(actor=actor, block=block_req) # Link the block to the agent - updated_memory = server.link_block_to_agent_memory(user_id=actor.id, agent_id=agent_id, block_id=block.id) - - return updated_memory + agent = server.agent_manager.attach_block(agent_id=agent_id, block_id=block.id, actor=actor) + return agent.memory @router.delete("/{agent_id}/memory/block/{block_label}", response_model=Memory, operation_id="remove_agent_memory_block_by_label") @@ -296,56 +318,56 @@ def remove_agent_memory_block( """ Removes a memory block from an agent by unlnking it. If the block is not linked to any other agent, it is deleted. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) # Unlink the block from the agent - updated_memory = server.unlink_block_from_agent_memory(user_id=actor.id, agent_id=agent_id, block_label=block_label) + agent = server.agent_manager.detach_block_with_label(agent_id=agent_id, block_label=block_label, actor=actor) - return updated_memory + return agent.memory @router.patch("/{agent_id}/memory/block/{block_label}", response_model=Block, operation_id="update_agent_memory_block_by_label") def update_agent_memory_block( agent_id: str, block_label: str, - update_block: BlockUpdate = Body(...), + block_update: BlockUpdate = Body(...), server: "SyncServer" = Depends(get_letta_server), user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present ): """ Removes a memory block from an agent by unlnking it. If the block is not linked to any other agent, it is deleted. """ - actor = server.get_user_or_default(user_id=user_id) - - # get the block_id from the label - block_id = server.blocks_agents_manager.get_block_id_for_label(agent_id=agent_id, block_label=block_label) + actor = server.user_manager.get_user_or_default(user_id=user_id) - # update the block - return server.block_manager.update_block(block_id=block_id, block_update=update_block, actor=actor) + block = server.agent_manager.get_block_with_label(agent_id=agent_id, block_label=block_label, actor=actor) + return server.block_manager.update_block(block.id, block_update=block_update, actor=actor) @router.get("/{agent_id}/memory/recall", response_model=RecallMemorySummary, operation_id="get_agent_recall_memory_summary") def get_agent_recall_memory_summary( agent_id: str, server: "SyncServer" = Depends(get_letta_server), + user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present ): """ Retrieve the summary of the recall memory of a specific agent. """ + actor = server.user_manager.get_user_or_default(user_id=user_id) - return server.get_recall_memory_summary(agent_id=agent_id) + return server.get_recall_memory_summary(agent_id=agent_id, actor=actor) @router.get("/{agent_id}/memory/archival", response_model=ArchivalMemorySummary, operation_id="get_agent_archival_memory_summary") def get_agent_archival_memory_summary( agent_id: str, server: "SyncServer" = Depends(get_letta_server), + user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present ): """ Retrieve the summary of the archival memory of a specific agent. """ - - return server.get_archival_memory_summary(agent_id=agent_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) + return server.get_archival_memory_summary(agent_id=agent_id, actor=actor) @router.get("/{agent_id}/archival", response_model=List[Passage], operation_id="list_agent_archival_memory") @@ -360,7 +382,7 @@ def get_agent_archival_memory( """ Retrieve the memories in an agent's archival memory store (paginated query). """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) # TODO need to add support for non-postgres here # chroma will throw: @@ -369,7 +391,7 @@ def get_agent_archival_memory( return server.get_agent_archival_cursor( user_id=actor.id, agent_id=agent_id, - cursor=after, # TODO: deleting before, after. is this expected? + cursor=after, # TODO: deleting before, after. is this expected? limit=limit, ) @@ -384,9 +406,9 @@ def insert_agent_archival_memory( """ Insert a memory into an agent's archival memory store. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) - return server.insert_archival_memory(user_id=actor.id, agent_id=agent_id, memory_contents=request.text) + return server.insert_archival_memory(agent_id=agent_id, memory_contents=request.text, actor=actor) # TODO(ethan): query or path parameter for memory_id? @@ -402,9 +424,9 @@ def delete_agent_archival_memory( """ Delete a memory from an agent's archival memory store. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) - server.delete_archival_memory(user_id=actor.id, agent_id=agent_id, memory_id=memory_id) + server.delete_archival_memory(agent_id=agent_id, memory_id=memory_id, actor=actor) return JSONResponse(status_code=status.HTTP_200_OK, content={"message": f"Memory id={memory_id} successfully deleted"}) @@ -429,7 +451,7 @@ def get_agent_messages( """ Retrieve message history for an agent. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) return server.get_agent_recall_cursor( user_id=actor.id, @@ -449,11 +471,13 @@ def update_message( message_id: str, request: MessageUpdate = Body(...), server: "SyncServer" = Depends(get_letta_server), + user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present ): """ Update the details of a message associated with an agent. """ - return server.update_agent_message(agent_id=agent_id, message_id=message_id, request=request) + actor = server.user_manager.get_user_or_default(user_id=user_id) + return server.update_agent_message(agent_id=agent_id, message_id=message_id, request=request, actor=actor) @router.post( @@ -471,11 +495,11 @@ async def send_message( Process a user message and return the agent's response. This endpoint accepts a message from a user and processes it through the agent. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) result = await send_message_to_agent( server=server, agent_id=agent_id, - user_id=actor.id, + actor=actor, messages=request.messages, stream_steps=False, stream_tokens=False, @@ -511,11 +535,11 @@ async def send_message_streaming( It will stream the steps of the response always, and stream the tokens if 'stream_tokens' is set to True. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) result = await send_message_to_agent( server=server, agent_id=agent_id, - user_id=actor.id, + actor=actor, messages=request.messages, stream_steps=True, stream_tokens=request.stream_tokens, @@ -531,7 +555,6 @@ async def process_message_background( server: SyncServer, actor: User, agent_id: str, - user_id: str, messages: list, assistant_message_tool_name: str, assistant_message_tool_kwarg: str, @@ -542,7 +565,7 @@ async def process_message_background( result = await send_message_to_agent( server=server, agent_id=agent_id, - user_id=user_id, + actor=actor, messages=messages, stream_steps=False, # NOTE(matt) stream_tokens=False, @@ -585,7 +608,7 @@ async def send_message_async( Asynchronously process a user message and return a job ID. The actual processing happens in the background, and the status can be checked using the job ID. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) # Create a new job job = Job( @@ -605,7 +628,6 @@ async def send_message_async( server=server, actor=actor, agent_id=agent_id, - user_id=actor.id, messages=request.messages, assistant_message_tool_name=request.assistant_message_tool_name, assistant_message_tool_kwarg=request.assistant_message_tool_kwarg, @@ -618,7 +640,7 @@ async def send_message_async( async def send_message_to_agent( server: SyncServer, agent_id: str, - user_id: str, + actor: User, # role: MessageRole, messages: Union[List[Message], List[MessageCreate]], stream_steps: bool, @@ -645,8 +667,7 @@ async def send_message_to_agent( # Get the generator object off of the agent's streaming interface # This will be attached to the POST SSE request used under-the-hood - # letta_agent = server.load_agent(agent_id=agent_id) - letta_agent = server.load_agent(agent_id=agent_id) + letta_agent = server.load_agent(agent_id=agent_id, actor=actor) # Disable token streaming if not OpenAI # TODO: cleanup this logic @@ -685,7 +706,7 @@ async def send_message_to_agent( task = asyncio.create_task( asyncio.to_thread( server.send_messages, - user_id=user_id, + actor=actor, agent_id=agent_id, messages=messages, interface=streaming_interface, diff --git a/letta/server/rest_api/routers/v1/blocks.py b/letta/server/rest_api/routers/v1/blocks.py index f58172d6f2..d921323343 100644 --- a/letta/server/rest_api/routers/v1/blocks.py +++ b/letta/server/rest_api/routers/v1/blocks.py @@ -1,10 +1,9 @@ from typing import TYPE_CHECKING, List, Optional -from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query +from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query, Response from letta.orm.errors import NoResultFound from letta.schemas.block import Block, BlockUpdate, CreateBlock -from letta.schemas.memory import Memory from letta.server.rest_api.utils import get_letta_server from letta.server.server import SyncServer @@ -23,7 +22,7 @@ def list_blocks( server: SyncServer = Depends(get_letta_server), user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present ): - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) return server.block_manager.get_blocks(actor=actor, label=label, is_template=templates_only, template_name=name) @@ -33,7 +32,7 @@ def create_block( server: SyncServer = Depends(get_letta_server), user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present ): - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) block = Block(**create_block.model_dump()) return server.block_manager.create_or_update_block(actor=actor, block=block) @@ -41,12 +40,12 @@ def create_block( @router.patch("/{block_id}", response_model=Block, operation_id="update_memory_block") def update_block( block_id: str, - update_block: BlockUpdate = Body(...), + block_update: BlockUpdate = Body(...), server: SyncServer = Depends(get_letta_server), user_id: Optional[str] = Header(None, alias="user_id"), ): - actor = server.get_user_or_default(user_id=user_id) - return server.block_manager.update_block(block_id=block_id, block_update=update_block, actor=actor) + actor = server.user_manager.get_user_or_default(user_id=user_id) + return server.block_manager.update_block(block_id=block_id, block_update=block_update, actor=actor) @router.delete("/{block_id}", response_model=Block, operation_id="delete_memory_block") @@ -55,7 +54,7 @@ def delete_block( server: SyncServer = Depends(get_letta_server), user_id: Optional[str] = Header(None, alias="user_id"), ): - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) return server.block_manager.delete_block(block_id=block_id, actor=actor) @@ -66,7 +65,7 @@ def get_block( user_id: Optional[str] = Header(None, alias="user_id"), ): print("call get block", block_id) - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) try: block = server.block_manager.get_block_by_id(block_id=block_id, actor=actor) if block is None: @@ -76,7 +75,7 @@ def get_block( raise HTTPException(status_code=404, detail="Block not found") -@router.patch("/{block_id}/attach", response_model=Block, operation_id="link_agent_memory_block") +@router.patch("/{block_id}/attach", response_model=None, status_code=204, operation_id="link_agent_memory_block") def link_agent_memory_block( block_id: str, agent_id: str = Query(..., description="The unique identifier of the agent to attach the source to."), @@ -86,17 +85,16 @@ def link_agent_memory_block( """ Link a memory block to an agent. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) - block = server.block_manager.get_block_by_id(block_id=block_id, actor=actor) - if block is None: - raise HTTPException(status_code=404, detail="Block not found") - - server.blocks_agents_manager.add_block_to_agent(agent_id=agent_id, block_id=block_id, block_label=block.label) - return block + try: + server.agent_manager.attach_block(agent_id=agent_id, block_id=block_id, actor=actor) + return Response(status_code=204) + except NoResultFound as e: + raise HTTPException(status_code=404, detail=str(e)) -@router.patch("/{block_id}/detach", response_model=Memory, operation_id="unlink_agent_memory_block") +@router.patch("/{block_id}/detach", response_model=None, status_code=204, operation_id="unlink_agent_memory_block") def unlink_agent_memory_block( block_id: str, agent_id: str = Query(..., description="The unique identifier of the agent to attach the source to."), @@ -106,11 +104,10 @@ def unlink_agent_memory_block( """ Unlink a memory block from an agent """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) - block = server.block_manager.get_block_by_id(block_id=block_id, actor=actor) - if block is None: - raise HTTPException(status_code=404, detail="Block not found") - # Link the block to the agent - server.blocks_agents_manager.remove_block_with_id_from_agent(agent_id=agent_id, block_id=block_id) - return block + try: + server.agent_manager.detach_block(agent_id=agent_id, block_id=block_id, actor=actor) + return Response(status_code=204) + except NoResultFound as e: + raise HTTPException(status_code=404, detail=str(e)) diff --git a/letta/server/rest_api/routers/v1/jobs.py b/letta/server/rest_api/routers/v1/jobs.py index e726062f65..4245d2f989 100644 --- a/letta/server/rest_api/routers/v1/jobs.py +++ b/letta/server/rest_api/routers/v1/jobs.py @@ -20,7 +20,7 @@ def list_jobs( """ List all jobs. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) # TODO: add filtering by status jobs = server.job_manager.list_jobs(actor=actor) @@ -40,7 +40,7 @@ def list_active_jobs( """ List all active jobs. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) return server.job_manager.list_jobs(actor=actor, statuses=[JobStatus.created, JobStatus.running]) @@ -54,7 +54,7 @@ def get_job( """ Get the status of a job. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) try: return server.job_manager.get_job_by_id(job_id=job_id, actor=actor) @@ -71,7 +71,7 @@ def delete_job( """ Delete a job by its job_id. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) try: job = server.job_manager.delete_job_by_id(job_id=job_id, actor=actor) diff --git a/letta/server/rest_api/routers/v1/sandbox_configs.py b/letta/server/rest_api/routers/v1/sandbox_configs.py index b276e3394a..bf06bae740 100644 --- a/letta/server/rest_api/routers/v1/sandbox_configs.py +++ b/letta/server/rest_api/routers/v1/sandbox_configs.py @@ -25,7 +25,7 @@ def create_sandbox_config( server: SyncServer = Depends(get_letta_server), user_id: str = Depends(get_user_id), ): - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) return server.sandbox_config_manager.create_or_update_sandbox_config(config_create, actor) @@ -35,7 +35,7 @@ def create_default_e2b_sandbox_config( server: SyncServer = Depends(get_letta_server), user_id: str = Depends(get_user_id), ): - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) return server.sandbox_config_manager.get_or_create_default_sandbox_config(sandbox_type=SandboxType.E2B, actor=actor) @@ -44,7 +44,7 @@ def create_default_local_sandbox_config( server: SyncServer = Depends(get_letta_server), user_id: str = Depends(get_user_id), ): - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) return server.sandbox_config_manager.get_or_create_default_sandbox_config(sandbox_type=SandboxType.LOCAL, actor=actor) @@ -55,7 +55,7 @@ def update_sandbox_config( server: SyncServer = Depends(get_letta_server), user_id: str = Depends(get_user_id), ): - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) return server.sandbox_config_manager.update_sandbox_config(sandbox_config_id, config_update, actor) @@ -65,7 +65,7 @@ def delete_sandbox_config( server: SyncServer = Depends(get_letta_server), user_id: str = Depends(get_user_id), ): - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) server.sandbox_config_manager.delete_sandbox_config(sandbox_config_id, actor) @@ -76,7 +76,7 @@ def list_sandbox_configs( server: SyncServer = Depends(get_letta_server), user_id: str = Depends(get_user_id), ): - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) return server.sandbox_config_manager.list_sandbox_configs(actor, limit=limit, cursor=cursor) @@ -90,7 +90,7 @@ def create_sandbox_env_var( server: SyncServer = Depends(get_letta_server), user_id: str = Depends(get_user_id), ): - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) return server.sandbox_config_manager.create_sandbox_env_var(env_var_create, sandbox_config_id, actor) @@ -101,7 +101,7 @@ def update_sandbox_env_var( server: SyncServer = Depends(get_letta_server), user_id: str = Depends(get_user_id), ): - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) return server.sandbox_config_manager.update_sandbox_env_var(env_var_id, env_var_update, actor) @@ -111,7 +111,7 @@ def delete_sandbox_env_var( server: SyncServer = Depends(get_letta_server), user_id: str = Depends(get_user_id), ): - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) server.sandbox_config_manager.delete_sandbox_env_var(env_var_id, actor) @@ -123,5 +123,5 @@ def list_sandbox_env_vars( server: SyncServer = Depends(get_letta_server), user_id: str = Depends(get_user_id), ): - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) return server.sandbox_config_manager.list_sandbox_env_vars(sandbox_config_id, actor, limit=limit, cursor=cursor) diff --git a/letta/server/rest_api/routers/v1/sources.py b/letta/server/rest_api/routers/v1/sources.py index 6b45e1d042..bcc3203dde 100644 --- a/letta/server/rest_api/routers/v1/sources.py +++ b/letta/server/rest_api/routers/v1/sources.py @@ -36,7 +36,7 @@ def get_source( """ Get all sources """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) source = server.source_manager.get_source_by_id(source_id=source_id, actor=actor) if not source: @@ -53,7 +53,7 @@ def get_source_id_by_name( """ Get a source by name """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) source = server.source_manager.get_source_by_name(source_name=source_name, actor=actor) if not source: @@ -69,7 +69,7 @@ def list_sources( """ List all data sources created by a user. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) return server.list_all_sources(actor=actor) @@ -83,7 +83,7 @@ def create_source( """ Create a new data source. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) source = Source(**source_create.model_dump()) return server.source_manager.create_source(source=source, actor=actor) @@ -99,7 +99,7 @@ def update_source( """ Update the name or documentation of an existing data source. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) if not server.source_manager.get_source_by_id(source_id=source_id, actor=actor): raise HTTPException(status_code=404, detail=f"Source with id={source_id} does not exist.") return server.source_manager.update_source(source_id=source_id, source_update=source, actor=actor) @@ -114,7 +114,7 @@ def delete_source( """ Delete a data source. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) server.delete_source(source_id=source_id, actor=actor) @@ -129,7 +129,7 @@ def attach_source_to_agent( """ Attach a data source to an existing agent. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) source = server.source_manager.get_source_by_id(source_id=source_id, actor=actor) assert source is not None, f"Source with id={source_id} not found." @@ -147,7 +147,7 @@ def detach_source_from_agent( """ Detach a data source from an existing agent. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) return server.detach_source_from_agent(source_id=source_id, agent_id=agent_id, user_id=actor.id) @@ -163,7 +163,7 @@ def upload_file_to_source( """ Upload a file to a data source. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) source = server.source_manager.get_source_by_id(source_id=source_id, actor=actor) assert source is not None, f"Source with id={source_id} not found." @@ -197,7 +197,7 @@ def list_passages( """ List all passages associated with a data source. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) passages = server.list_data_source_passages(user_id=actor.id, source_id=source_id) return passages @@ -213,7 +213,7 @@ def list_files_from_source( """ List paginated files associated with a data source. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) return server.source_manager.list_files(source_id=source_id, limit=limit, cursor=cursor, actor=actor) @@ -229,7 +229,7 @@ def delete_file_from_source( """ Delete a data source. """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) deleted_file = server.source_manager.delete_file(file_id=file_id, actor=actor) if deleted_file is None: diff --git a/letta/server/rest_api/routers/v1/tools.py b/letta/server/rest_api/routers/v1/tools.py index d288ca0234..e1eb591951 100644 --- a/letta/server/rest_api/routers/v1/tools.py +++ b/letta/server/rest_api/routers/v1/tools.py @@ -25,7 +25,7 @@ def delete_tool( """ Delete a tool by name """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) server.tool_manager.delete_tool_by_id(tool_id=tool_id, actor=actor) @@ -38,7 +38,7 @@ def get_tool( """ Get a tool by ID """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) tool = server.tool_manager.get_tool_by_id(tool_id=tool_id, actor=actor) if tool is None: # return 404 error @@ -55,7 +55,7 @@ def get_tool_id( """ Get a tool ID by name """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) tool = server.tool_manager.get_tool_by_name(tool_name=tool_name, actor=actor) if tool: return tool.id @@ -74,7 +74,7 @@ def list_tools( Get a list of all tools available to agents belonging to the org of the user """ try: - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) return server.tool_manager.list_tools(actor=actor, cursor=cursor, limit=limit) except Exception as e: # Log or print the full exception here for debugging @@ -92,7 +92,7 @@ def create_tool( Create a new tool """ try: - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) tool = Tool(**request.model_dump()) return server.tool_manager.create_tool(pydantic_tool=tool, actor=actor) except UniqueConstraintViolationError as e: @@ -124,7 +124,7 @@ def upsert_tool( Create or update a tool """ try: - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) tool = server.tool_manager.create_or_update_tool(pydantic_tool=Tool(**request.model_dump()), actor=actor) return tool except UniqueConstraintViolationError as e: @@ -147,7 +147,7 @@ def update_tool( """ Update an existing tool """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) return server.tool_manager.update_tool_by_id(tool_id=tool_id, tool_update=request, actor=actor) @@ -159,7 +159,7 @@ def add_base_tools( """ Add base tools """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) return server.tool_manager.add_base_tools(actor=actor) @@ -173,7 +173,7 @@ def add_base_tools( # """ # Run an existing tool on provided arguments # """ -# actor = server.get_user_or_default(user_id=user_id) +# actor = server.user_manager.get_user_or_default(user_id=user_id) # return server.run_tool(tool_id=request.tool_id, tool_args=request.tool_args, user_id=actor.id) @@ -187,7 +187,7 @@ def run_tool_from_source( """ Attempt to build a tool from source, then run it on the provided arguments """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) try: return server.run_tool_from_source( @@ -220,7 +220,7 @@ def list_composio_apps(server: SyncServer = Depends(get_letta_server), user_id: """ Get a list of all Composio apps """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) composio_api_key = get_composio_key(server, actor=actor) return server.get_composio_apps(api_key=composio_api_key) @@ -234,7 +234,7 @@ def list_composio_actions_by_app( """ Get a list of all Composio actions for a specific app """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) composio_api_key = get_composio_key(server, actor=actor) return server.get_composio_actions_from_app_name(composio_app_name=composio_app_name, api_key=composio_api_key) @@ -248,7 +248,7 @@ def add_composio_tool( """ Add a new Composio tool by action name (Composio refers to each tool as an `Action`) """ - actor = server.get_user_or_default(user_id=user_id) + actor = server.user_manager.get_user_or_default(user_id=user_id) composio_api_key = get_composio_key(server, actor=actor) try: diff --git a/letta/server/server.py b/letta/server/server.py index 9c66832eec..d0c1d0628c 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -19,7 +19,7 @@ from letta.chat_only_agent import ChatOnlyAgent from letta.credentials import LettaCredentials from letta.data_sources.connectors import DataConnector, load_data -from letta.errors import LettaAgentNotFoundError, LettaUserNotFoundError +from letta.errors import LettaAgentNotFoundError # TODO use custom interface from letta.interface import AgentInterface # abstract @@ -30,7 +30,6 @@ from letta.offline_memory_agent import OfflineMemoryAgent from letta.orm import Base from letta.orm.errors import NoResultFound -from letta.prompts import gpt_system from letta.providers import ( AnthropicProvider, AzureProvider, @@ -44,15 +43,9 @@ VLLMChatCompletionsProvider, VLLMCompletionsProvider, ) -from letta.schemas.agent import ( - AgentState, - AgentType, - CreateAgent, - PersistedAgentState, - UpdateAgentState, -) +from letta.schemas.agent import AgentState, AgentType, CreateAgent, UpdateAgent from letta.schemas.api_key import APIKey, APIKeyCreate -from letta.schemas.block import Block, BlockUpdate +from letta.schemas.block import BlockUpdate from letta.schemas.embedding_config import EmbeddingConfig # openai schemas @@ -68,14 +61,13 @@ ) from letta.schemas.message import Message, MessageCreate, MessageRole, MessageUpdate from letta.schemas.organization import Organization -from letta.schemas.passage import Passage as PydanticPassage +from letta.schemas.passage import Passage from letta.schemas.source import Source from letta.schemas.tool import Tool, ToolCreate from letta.schemas.usage import LettaUsageStatistics -from letta.schemas.user import User as PydanticUser -from letta.services.agents_tags_manager import AgentsTagsManager +from letta.schemas.user import User +from letta.services.agent_manager import AgentManager from letta.services.block_manager import BlockManager -from letta.services.blocks_agents_manager import BlocksAgentsManager from letta.services.job_manager import JobManager from letta.services.message_manager import MessageManager from letta.services.organization_manager import OrganizationManager @@ -85,9 +77,8 @@ from letta.services.source_manager import SourceManager from letta.services.tool_execution_sandbox import ToolExecutionSandbox from letta.services.tool_manager import ToolManager -from letta.services.tools_agents_manager import ToolsAgentsManager from letta.services.user_manager import UserManager -from letta.utils import create_random_username, get_utc_time, json_dumps, json_loads +from letta.utils import get_utc_time, json_dumps, json_loads logger = get_logger(__name__) @@ -105,18 +96,13 @@ def get_agent_memory(self, user_id: str, agent_id: str) -> dict: """Return the memory of an agent (core memory + non-core statistics)""" raise NotImplementedError - @abstractmethod - def get_agent_state(self, user_id: str, agent_id: str) -> dict: - """Return the config of an agent""" - raise NotImplementedError - @abstractmethod def get_server_config(self, user_id: str) -> dict: """Return the base config""" raise NotImplementedError @abstractmethod - def update_agent_core_memory(self, user_id: str, agent_id: str, new_memory_contents: dict) -> dict: + def update_agent_core_memory(self, user_id: str, agent_id: str, label: str, actor: User) -> Memory: """Update the agents core memory block, return the new state""" raise NotImplementedError @@ -124,7 +110,7 @@ def update_agent_core_memory(self, user_id: str, agent_id: str, new_memory_conte def create_agent( self, request: CreateAgent, - actor: PydanticUser, + actor: User, # interface interface: Union[AgentInterface, None] = None, ) -> AgentState: @@ -270,10 +256,6 @@ def __init__( # auth_mode: str = "none", # "none, "jwt", "external" ): """Server process holds in-memory agents that are being run""" - - # List of {'user_id': user_id, 'agent_id': agent_id, 'agent': agent_obj} dicts - self.active_agents = [] - # chaining = whether or not to run again if request_heartbeat=true self.chaining = chaining @@ -307,12 +289,10 @@ def __init__( self.tool_manager = ToolManager() self.block_manager = BlockManager() self.source_manager = SourceManager() - self.agents_tags_manager = AgentsTagsManager() self.sandbox_config_manager = SandboxConfigManager(tool_settings) - self.blocks_agents_manager = BlocksAgentsManager() self.message_manager = MessageManager() - self.tools_agents_manager = ToolsAgentsManager() self.job_manager = JobManager() + self.agent_manager = AgentManager() # Managers that interface with parallelism self.per_agent_lock_manager = PerAgentLockManager() @@ -397,42 +377,9 @@ def __init__( ) ) - def save_agents(self): - """Saves all the agents that are in the in-memory object store""" - for agent_d in self.active_agents: - try: - save_agent(agent_d["agent"], self.ms) - logger.info(f"Saved agent {agent_d['agent_id']}") - except Exception as e: - logger.exception(f"Error occurred while trying to save agent {agent_d['agent_id']}:\n{e}") - - def _get_agent(self, user_id: str, agent_id: str) -> Union[Agent, None]: - """Get the agent object from the in-memory object store""" - for d in self.active_agents: - if d["user_id"] == str(user_id) and d["agent_id"] == str(agent_id): - return d["agent"] - return None - - def _add_agent(self, user_id: str, agent_id: str, agent_obj: Agent) -> None: - """Put an agent object inside the in-memory object store""" - # Make sure the agent doesn't already exist - if self._get_agent(user_id=user_id, agent_id=agent_id) is not None: - # Can be triggered on concucrent request, so don't throw a full error - logger.exception(f"Agent (user={user_id}, agent={agent_id}) is already loaded") - return - # Add Agent instance to the in-memory list - self.active_agents.append( - { - "user_id": str(user_id), - "agent_id": str(agent_id), - "agent": agent_obj, - } - ) - - def initialize_agent(self, agent_id, interface: Union[AgentInterface, None] = None, initial_message_sequence=None) -> Agent: + def initialize_agent(self, agent_id, actor, interface: Union[AgentInterface, None] = None, initial_message_sequence=None) -> Agent: """Initialize an agent from the database""" - agent_state = self.get_agent(agent_id=agent_id) - actor = self.user_manager.get_user_by_id(user_id=agent_state.user_id) + agent_state = self.agent_manager.get_agent_by_id(agent_id=agent_id, actor=actor) interface = interface or self.default_interface_factory() if agent_state.agent_type == AgentType.memgpt_agent: @@ -446,19 +393,20 @@ def initialize_agent(self, agent_id, interface: Union[AgentInterface, None] = No agent = O1Agent(agent_state=agent_state, interface=interface, user=actor) # Persist to agent - save_agent(agent, self.ms) + save_agent(agent) return agent - def load_agent(self, agent_id: str, interface: Union[AgentInterface, None] = None) -> Agent: + def load_agent(self, agent_id: str, actor: User, interface: Union[AgentInterface, None] = None) -> Agent: """Updated method to load agents from persisted storage""" agent_lock = self.per_agent_lock_manager.get_lock(agent_id) with agent_lock: - agent_state = self.get_agent(agent_id=agent_id) + agent_state = self.agent_manager.get_agent_by_id(agent_id=agent_id, actor=actor) + if agent_state is None: raise LettaAgentNotFoundError(f"Agent (agent_id={agent_id}) does not exist") - elif agent_state.user_id is None: + elif agent_state.created_by_id is None: raise ValueError(f"Agent (agent_id={agent_id}) does not have a user_id") - actor = self.user_manager.get_user_by_id(user_id=agent_state.user_id) + actor = self.user_manager.get_user_by_id(user_id=agent_state.created_by_id) interface = interface or self.default_interface_factory() if agent_state.agent_type == AgentType.memgpt_agent: @@ -476,19 +424,19 @@ def load_agent(self, agent_id: str, interface: Union[AgentInterface, None] = Non agent.rebuild_system_prompt() # Persist to agent - save_agent(agent, self.ms) + save_agent(agent) return agent def _step( self, - user_id: str, + actor: User, agent_id: str, input_messages: Union[Message, List[Message]], interface: Union[AgentInterface, None] = None, # needed to getting responses # timestamp: Optional[datetime], ) -> LettaUsageStatistics: """Send the input message through the agent""" - + # TODO: Thread actor directly through this function, since the top level caller most likely already retrieved the user # Input validation if isinstance(input_messages, Message): input_messages = [input_messages] @@ -498,10 +446,7 @@ def _step( logger.debug(f"Got input messages: {input_messages}") letta_agent = None try: - - # Get the agent object (loaded in memory) - # letta_agent = self._get_or_load_agent(agent_id=agent_id) - letta_agent = self.load_agent(agent_id=agent_id, interface=interface) + letta_agent = self.load_agent(agent_id=agent_id, interface=interface, actor=actor) if letta_agent is None: raise KeyError(f"Agent (user={user_id}, agent={agent_id}) is not loaded") @@ -519,7 +464,7 @@ def _step( ) # save agent after step - save_agent(letta_agent, self.ms) + save_agent(letta_agent) except Exception as e: logger.error(f"Error in server._step: {e}") @@ -534,11 +479,13 @@ def _step( def _command(self, user_id: str, agent_id: str, command: str) -> LettaUsageStatistics: """Process a CLI command""" + # TODO: Thread actor directly through this function, since the top level caller most likely already retrieved the user + actor = self.user_manager.get_user_or_default(user_id=user_id) logger.debug(f"Got command: {command}") # Get the agent object (loaded in memory) - letta_agent = self.load_agent(agent_id=agent_id) + letta_agent = self.load_agent(agent_id=agent_id, actor=actor) usage = None if command.lower() == "exit": @@ -546,7 +493,7 @@ def _command(self, user_id: str, agent_id: str, command: str) -> LettaUsageStati raise ValueError(command) elif command.lower() == "save" or command.lower() == "savechat": - save_agent(letta_agent, self.ms) + save_agent(letta_agent) elif command.lower() == "attach": # Different from CLI, we extract the data source name from the command @@ -560,8 +507,8 @@ def _command(self, user_id: str, agent_id: str, command: str) -> LettaUsageStati letta_agent.attach_source( user=self.user_manager.get_user_by_id(user_id=user_id), source_id=data_source, - source_manager=letta_agent.source_manager, - ms=self.ms, + source_manager=self.source_manager, + agent_manager=self.agent_manager, ) elif command.lower() == "dump" or command.lower().startswith("dump "): @@ -637,11 +584,11 @@ def _command(self, user_id: str, agent_id: str, command: str) -> LettaUsageStati elif command.lower() == "heartbeat": input_message = system.get_heartbeat() - usage = self._step(user_id=user_id, agent_id=agent_id, input_message=input_message) + usage = self._step(actor=actor, agent_id=agent_id, input_message=input_message) elif command.lower() == "memorywarning": input_message = system.get_token_limit_warning() - usage = self._step(user_id=user_id, agent_id=agent_id, input_message=input_message) + usage = self._step(actor=actor, agent_id=agent_id, input_message=input_message) if not usage: usage = LettaUsageStatistics() @@ -656,9 +603,14 @@ def user_message( timestamp: Optional[datetime] = None, ) -> LettaUsageStatistics: """Process an incoming user message and feed it through the Letta agent""" - if self.user_manager.get_user_by_id(user_id=user_id) is None: + try: + actor = self.user_manager.get_user_by_id(user_id=user_id) + except NoResultFound: raise ValueError(f"User user_id={user_id} does not exist") - if self.ms.get_agent(agent_id=agent_id, user_id=user_id) is None: + + try: + agent = self.agent_manager.get_agent_by_id(agent_id=agent_id, actor=actor) + except NoResultFound: raise ValueError(f"Agent agent_id={agent_id} does not exist") # Basic input sanitization @@ -692,7 +644,7 @@ def user_message( ) # Run the agent state forward - usage = self._step(user_id=user_id, agent_id=agent_id, input_messages=message) + usage = self._step(actor=actor, agent_id=agent_id, input_messages=message) return usage def system_message( @@ -703,9 +655,14 @@ def system_message( timestamp: Optional[datetime] = None, ) -> LettaUsageStatistics: """Process an incoming system message and feed it through the Letta agent""" - if self.user_manager.get_user_by_id(user_id=user_id) is None: + try: + actor = self.user_manager.get_user_by_id(user_id=user_id) + except NoResultFound: raise ValueError(f"User user_id={user_id} does not exist") - if self.ms.get_agent(agent_id=agent_id, user_id=user_id) is None: + + try: + agent = self.agent_manager.get_agent_by_id(agent_id=agent_id, actor=actor) + except NoResultFound: raise ValueError(f"Agent agent_id={agent_id} does not exist") # Basic input sanitization @@ -752,11 +709,11 @@ def system_message( message.created_at = timestamp # Run the agent state forward - return self._step(user_id=user_id, agent_id=agent_id, input_messages=message) + return self._step(actor=actor, agent_id=agent_id, input_messages=message) def send_messages( self, - user_id: str, + actor: User, agent_id: str, messages: Union[List[MessageCreate], List[Message]], # whether or not to wrap user and system message as MemGPT-style stringified JSON @@ -771,11 +728,6 @@ def send_messages( Otherwise, we can pass them in directly. """ - if self.user_manager.get_user_by_id(user_id=user_id) is None: - raise ValueError(f"User user_id={user_id} does not exist") - if self.ms.get_agent(agent_id=agent_id, user_id=user_id) is None: - raise ValueError(f"Agent agent_id={agent_id} does not exist") - message_objects: List[Message] = [] if all(isinstance(m, MessageCreate) for m in messages): @@ -814,16 +766,11 @@ def send_messages( raise ValueError(f"All messages must be of type Message or MessageCreate, got {[type(message) for message in messages]}") # Run the agent state forward - return self._step(user_id=user_id, agent_id=agent_id, input_messages=message_objects, interface=interface) + return self._step(actor=actor, agent_id=agent_id, input_messages=message_objects, interface=interface) # @LockingServer.agent_lock_decorator def run_command(self, user_id: str, agent_id: str, command: str) -> LettaUsageStatistics: """Run a command on the agent""" - if self.user_manager.get_user_by_id(user_id=user_id) is None: - raise ValueError(f"User user_id={user_id} does not exist") - if self.ms.get_agent(agent_id=agent_id, user_id=user_id) is None: - raise ValueError(f"Agent agent_id={agent_id} does not exist") - # If the input begins with a command prefix, attempt to process it as a command if command.startswith("/"): if len(command) > 1: @@ -833,86 +780,16 @@ def run_command(self, user_id: str, agent_id: str, command: str) -> LettaUsageSt def create_agent( self, request: CreateAgent, - actor: PydanticUser, + actor: User, # interface interface: Union[AgentInterface, None] = None, ) -> AgentState: """Create a new agent using a config""" - user_id = actor.id - if self.user_manager.get_user_by_id(user_id=user_id) is None: - raise ValueError(f"User user_id={user_id} does not exist") - - if interface is None: - interface = self.default_interface_factory() - - # create agent name - if request.name is None: - request.name = create_random_username() - - if request.agent_type is None: - request.agent_type = AgentType.memgpt_agent - - # system debug - if request.system is None: - # TODO: don't hardcode - if request.agent_type == AgentType.memgpt_agent: - request.system = gpt_system.get_system_text("memgpt_chat") - elif request.agent_type == AgentType.o1_agent: - request.system = gpt_system.get_system_text("memgpt_modified_o1") - elif request.agent_type == AgentType.offline_memory_agent: - request.system = gpt_system.get_system_text("memgpt_offline_memory") - elif request.agent_type == AgentType.chat_only_agent: - request.system = gpt_system.get_system_text("memgpt_convo_only") - else: - raise ValueError(f"Invalid agent type: {request.agent_type}") - - # create blocks (note: cannot be linked into the agent_id is created) - blocks = [] - for create_block in request.memory_blocks: - block = self.block_manager.create_or_update_block(Block(**create_block.model_dump()), actor=actor) - blocks.append(block) - - # get tools + only add if they exist - tool_objs = [] - if request.tools: - for tool_name in request.tools: - tool_obj = self.tool_manager.get_tool_by_name(tool_name=tool_name, actor=actor) - if tool_obj: - tool_objs.append(tool_obj) - else: - warnings.warn(f"Attempted to add a nonexistent tool {tool_name} to agent {request.name}, skipping.") - # reset the request.tools to only valid tools - request.tools = [t.name for t in tool_objs] - - # get the user - logger.debug(f"Attempting to find user: {user_id}") - user = self.user_manager.get_user_by_id(user_id=user_id) - if not user: - raise ValueError(f"cannot find user with associated client id: {user_id}") - - if request.llm_config is None: - raise ValueError("llm_config is required") - - if request.embedding_config is None: - raise ValueError("embedding_config is required") - - # created and persist the agent state in the DB - agent_state = PersistedAgentState( - name=request.name, - user_id=user_id, - tool_names=request.tools if request.tools else [], - tool_rules=request.tool_rules, - agent_type=request.agent_type or AgentType.memgpt_agent, - llm_config=request.llm_config, - embedding_config=request.embedding_config, - system=request.system, - # other metadata - description=request.description, - metadata_=request.metadata_, + # Invoke manager + agent_state = self.agent_manager.create_agent( + agent_create=request, + actor=actor, ) - # TODO: move this to agent ORM - # this saves the agent ID and state into the DB - self.ms.create_agent(agent_state) # create the agent object if request.initial_message_sequence is not None: @@ -937,81 +814,29 @@ def create_agent( init_messages = None # initialize the agent (generates initial message list with system prompt) - self.initialize_agent(agent_id=agent_state.id, interface=interface, initial_message_sequence=init_messages) - - # Note: mappings (e.g. tags, blocks) are created after the agent is persisted - # TODO: add source mappings here as well - - # create the tags - if request.tags: - for tag in request.tags: - self.agents_tags_manager.add_tag_to_agent(agent_id=agent_state.id, tag=tag, actor=actor) - - # create block mappins (now that agent is persisted) - for block in blocks: - # this links the created block to the agent - self.blocks_agents_manager.add_block_to_agent(block_id=block.id, agent_id=agent_state.id, block_label=block.label) + if interface is None: + interface = self.default_interface_factory() + self.initialize_agent(agent_id=agent_state.id, interface=interface, initial_message_sequence=init_messages, actor=actor) - in_memory_agent_state = self.get_agent(agent_state.id) + in_memory_agent_state = self.agent_manager.get_agent_by_id(agent_state.id, actor=actor) return in_memory_agent_state - def get_agent(self, agent_id: str) -> Optional[AgentState]: - """ - Retrieve the full agent state from the DB. - This gathers data accross multiple tables to provide the full state of an agent, which is passed into the `Agent` object for creation. - """ - - # get data persisted from the DB - agent_state = self.ms.get_agent(agent_id=agent_id) - if agent_state is None: - # agent does not exist - return None - if agent_state.user_id is None: - raise ValueError(f"Agent {agent_id} does not have a user_id") - user = self.user_manager.get_user_by_id(user_id=agent_state.user_id) - - # construct the in-memory, full agent state - this gather data stored in different tables but that needs to be passed to `Agent` - # we also return this data to the user to provide all the state related to an agent - - # get `Memory` object by getting the linked block IDs and fetching the blocks, then putting that into a `Memory` object - # this is the "in memory" representation of the in-context memory - block_ids = self.blocks_agents_manager.list_block_ids_for_agent(agent_id=agent_id) - blocks = [] - for block_id in block_ids: - block = self.block_manager.get_block_by_id(block_id=block_id, actor=user) - assert block, f"Block with ID {block_id} does not exist" - blocks.append(block) - memory = Memory(blocks=blocks) - - # get `Tool` objects - tools = [self.tool_manager.get_tool_by_name(tool_name=tool_name, actor=user) for tool_name in agent_state.tool_names] - tools = [tool for tool in tools if tool is not None] - - # get `Source` objects - sources = self.list_attached_sources(agent_id=agent_id) - - # get the tags - tags = self.agents_tags_manager.get_tags_for_agent(agent_id=agent_id, actor=user) - - # return the full agent state - this contains all data needed to recreate the agent - return AgentState(**agent_state.model_dump(), memory=memory, tools=tools, sources=sources, tags=tags) - + # TODO: This is not good! + # TODO: Ideally, this should ALL be handled by the ORM + # TODO: The main blocker here IS the _message updates def update_agent( self, - request: UpdateAgentState, - actor: PydanticUser, + agent_id: str, + request: UpdateAgent, + actor: User, ) -> AgentState: """Update the agents core memory block, return the new state""" - try: - self.user_manager.get_user_by_id(user_id=actor.id) - except Exception: - raise ValueError(f"User user_id={actor.id} does not exist") - - if self.ms.get_agent(agent_id=request.id) is None: - raise ValueError(f"Agent agent_id={request.id} does not exist") - # Get the agent object (loaded in memory) - letta_agent = self.load_agent(agent_id=request.id) + letta_agent = self.load_agent(agent_id=agent_id, actor=actor) + + # Update tags + if request.tags is not None: # Allow for empty list + letta_agent.agent_state.tags = request.tags # update the system prompt if request.system: @@ -1025,30 +850,27 @@ def update_agent( letta_agent.set_message_buffer(message_ids=request.message_ids) # tools - if request.tool_names: + if request.tool_ids: # Replace tools and also re-link # (1) get tools + make sure they exist # Current and target tools as sets of tool names - current_tools = set(letta_agent.agent_state.tool_names) - target_tools = set(request.tool_names) + current_tools = letta_agent.agent_state.tools + current_tool_ids = set([t.id for t in current_tools]) + target_tool_ids = set(request.tool_ids) # Calculate tools to add and remove - tools_to_add = target_tools - current_tools - tools_to_remove = current_tools - target_tools - - # Fetch tool objects for those to add and remove - tools_to_add = [self.tool_manager.get_tool_by_name(tool_name=tool, actor=actor) for tool in tools_to_add] - tools_to_remove = [self.tool_manager.get_tool_by_name(tool_name=tool, actor=actor) for tool in tools_to_remove] + tool_ids_to_add = target_tool_ids - current_tool_ids + tools_ids_to_remove = current_tool_ids - target_tool_ids # update agent tool list - for tool in tools_to_remove: - self.remove_tool_from_agent(agent_id=request.id, tool_id=tool.id, user_id=actor.id) - for tool in tools_to_add: - self.add_tool_to_agent(agent_id=request.id, tool_id=tool.id, user_id=actor.id) + for tool_id in tools_ids_to_remove: + self.remove_tool_from_agent(agent_id=agent_id, tool_id=tool_id, user_id=actor.id) + for tool_id in tool_ids_to_add: + self.add_tool_to_agent(agent_id=agent_id, tool_id=tool_id, user_id=actor.id) # reload agent - letta_agent = self.load_agent(agent_id=request.id) + letta_agent = self.load_agent(agent_id=agent_id, actor=actor) # configs if request.llm_config: @@ -1062,33 +884,18 @@ def update_agent( if request.metadata_: letta_agent.agent_state.metadata_ = request.metadata_ - # Manage tag state - if request.tags is not None: - current_tags = set(self.agents_tags_manager.get_tags_for_agent(agent_id=letta_agent.agent_state.id, actor=actor)) - target_tags = set(request.tags) - - tags_to_add = target_tags - current_tags - tags_to_remove = current_tags - target_tags - - for tag in tags_to_add: - self.agents_tags_manager.add_tag_to_agent(agent_id=letta_agent.agent_state.id, tag=tag, actor=actor) - for tag in tags_to_remove: - self.agents_tags_manager.delete_tag_from_agent(agent_id=letta_agent.agent_state.id, tag=tag, actor=actor) - # save the agent - save_agent(letta_agent, self.ms) + save_agent(letta_agent) # TODO: probably reload the agent somehow? return letta_agent.agent_state def get_tools_from_agent(self, agent_id: str, user_id: Optional[str]) -> List[Tool]: """Get tools from an existing agent""" - if self.user_manager.get_user_by_id(user_id=user_id) is None: - raise ValueError(f"User user_id={user_id} does not exist") - if self.ms.get_agent(agent_id=agent_id) is None: - raise ValueError(f"Agent agent_id={agent_id} does not exist") + # TODO: Thread actor directly through this function, since the top level caller most likely already retrieved the user + actor = self.user_manager.get_user_or_default(user_id=user_id) # Get the agent object (loaded in memory) - letta_agent = self.load_agent(agent_id=agent_id) + letta_agent = self.load_agent(agent_id=agent_id, actor=actor) return letta_agent.agent_state.tools def add_tool_to_agent( @@ -1098,25 +905,20 @@ def add_tool_to_agent( user_id: str, ): """Add tools from an existing agent""" - try: - user = self.user_manager.get_user_by_id(user_id=user_id) - except NoResultFound: - raise ValueError(f"User user_id={user_id} does not exist") - - if self.ms.get_agent(agent_id=agent_id) is None: - raise ValueError(f"Agent agent_id={agent_id} does not exist") + # TODO: Thread actor directly through this function, since the top level caller most likely already retrieved the user + actor = self.user_manager.get_user_or_default(user_id=user_id) # Get the agent object (loaded in memory) - letta_agent = self.load_agent(agent_id=agent_id) + letta_agent = self.load_agent(agent_id=agent_id, actor=actor) # Get all the tool objects from the request tool_objs = [] - tool_obj = self.tool_manager.get_tool_by_id(tool_id=tool_id, actor=user) + tool_obj = self.tool_manager.get_tool_by_id(tool_id=tool_id, actor=actor) assert tool_obj, f"Tool with id={tool_id} does not exist" tool_objs.append(tool_obj) for tool in letta_agent.agent_state.tools: - tool_obj = self.tool_manager.get_tool_by_id(tool_id=tool.id, actor=user) + tool_obj = self.tool_manager.get_tool_by_id(tool_id=tool.id, actor=actor) assert tool_obj, f"Tool with id={tool.id} does not exist" # If it's not the already added tool @@ -1124,13 +926,13 @@ def add_tool_to_agent( tool_objs.append(tool_obj) # replace the list of tool names ("ids") inside the agent state - letta_agent.agent_state.tool_names = [tool.name for tool in tool_objs] + letta_agent.agent_state.tools = tool_objs # then attempt to link the tools modules letta_agent.link_tools(tool_objs) # save the agent - save_agent(letta_agent, self.ms) + save_agent(letta_agent) return letta_agent.agent_state def remove_tool_from_agent( @@ -1140,21 +942,16 @@ def remove_tool_from_agent( user_id: str, ): """Remove tools from an existing agent""" - try: - user = self.user_manager.get_user_by_id(user_id=user_id) - except NoResultFound: - raise ValueError(f"User user_id={user_id} does not exist") - - if self.ms.get_agent(agent_id=agent_id) is None: - raise ValueError(f"Agent agent_id={agent_id} does not exist") + # TODO: Thread actor directly through this function, since the top level caller most likely already retrieved the user + actor = self.user_manager.get_user_or_default(user_id=user_id) # Get the agent object (loaded in memory) - letta_agent = self.load_agent(agent_id=agent_id) + letta_agent = self.load_agent(agent_id=agent_id, actor=actor) # Get all the tool_objs tool_objs = [] for tool in letta_agent.agent_state.tools: - tool_obj = self.tool_manager.get_tool_by_id(tool_id=tool.id, actor=user) + tool_obj = self.tool_manager.get_tool_by_id(tool_id=tool.id, actor=actor) assert tool_obj, f"Tool with id={tool.id} does not exist" # If it's not the tool we want to remove @@ -1162,147 +959,47 @@ def remove_tool_from_agent( tool_objs.append(tool_obj) # replace the list of tool names ("ids") inside the agent state - letta_agent.agent_state.tool_names = [tool.name for tool in tool_objs] + letta_agent.agent_state.tools = tool_objs # then attempt to link the tools modules letta_agent.link_tools(tool_objs) # save the agent - save_agent(letta_agent, self.ms) + save_agent(letta_agent) return letta_agent.agent_state - def get_agent_state(self, user_id: str, agent_id: str) -> AgentState: - # TODO: duplicate, remove - return self.get_agent(agent_id=agent_id) - - def list_agents(self, user_id: str, tags: Optional[List[str]] = None) -> List[AgentState]: - """List all available agents to a user""" - user = self.user_manager.get_user_by_id(user_id=user_id) - - if tags is None: - agents_states = self.ms.list_agents(user_id=user_id) - agent_ids = [agent.id for agent in agents_states] - else: - agent_ids = [] - for tag in tags: - agent_ids += self.agents_tags_manager.get_agents_by_tag(tag=tag, actor=user) - - return [self.get_agent(agent_id=agent_id) for agent_id in agent_ids] - # convert name->id - def get_agent_id(self, name: str, user_id: str): - agent_state = self.ms.get_agent(agent_name=name, user_id=user_id) - if not agent_state: - return None - return agent_state.id - - def get_source(self, source_id: str, user_id: str) -> Source: - existing_source = self.ms.get_source(source_id=source_id, user_id=user_id) - if not existing_source: - raise ValueError("Source does not exist") - return existing_source - - def get_source_id(self, source_name: str, user_id: str) -> str: - existing_source = self.ms.get_source(source_name=source_name, user_id=user_id) - if not existing_source: - raise ValueError("Source does not exist") - return existing_source.id - - def get_agent_memory(self, agent_id: str) -> Memory: + def get_agent_memory(self, agent_id: str, actor: User) -> Memory: """Return the memory of an agent (core memory)""" - agent = self.load_agent(agent_id=agent_id) + agent = self.load_agent(agent_id=agent_id, actor=actor) return agent.agent_state.memory - def get_archival_memory_summary(self, agent_id: str) -> ArchivalMemorySummary: - agent = self.load_agent(agent_id=agent_id) + def get_archival_memory_summary(self, agent_id: str, actor: User) -> ArchivalMemorySummary: + agent = self.load_agent(agent_id=agent_id, actor=actor) return ArchivalMemorySummary(size=agent.passage_manager.size(actor=self.default_user)) - def get_recall_memory_summary(self, agent_id: str) -> RecallMemorySummary: - agent = self.load_agent(agent_id=agent_id) + def get_recall_memory_summary(self, agent_id: str, actor: User) -> RecallMemorySummary: + agent = self.load_agent(agent_id=agent_id, actor=actor) return RecallMemorySummary(size=len(agent.message_manager)) - def get_in_context_message_ids(self, agent_id: str) -> List[str]: - """Get the message ids of the in-context messages in the agent's memory""" - # Get the agent object (loaded in memory) - agent = self.load_agent(agent_id=agent_id) - return [m.id for m in agent._messages] - - def get_in_context_messages(self, agent_id: str) -> List[Message]: + def get_in_context_messages(self, agent_id: str, actor: User) -> List[Message]: """Get the in-context messages in the agent's memory""" # Get the agent object (loaded in memory) - agent = self.load_agent(agent_id=agent_id) + agent = self.load_agent(agent_id=agent_id, actor=actor) return agent._messages - def get_agent_message(self, agent_id: str, message_id: str) -> Message: - """Get a single message from the agent's memory""" - # Get the agent object (loaded in memory) - agent = self.load_agent(agent_id=agent_id) - message = agent.message_manager.get_message_by_id(id=message_id, actor=self.default_user) - return message - - def get_agent_messages( - self, - agent_id: str, - start: int, - count: int, - ) -> Union[List[Message], List[LettaMessage]]: - """Paginated query of all messages in agent message queue""" - # Get the agent object (loaded in memory) - letta_agent = self.load_agent(agent_id=agent_id) - - if start < 0 or count < 0: - raise ValueError("Start and count values should be non-negative") - - if start + count < len(letta_agent._messages): # messages can be returned from whats in memory - # Reverse the list to make it in reverse chronological order - reversed_messages = letta_agent._messages[::-1] - # Check if start is within the range of the list - if start >= len(reversed_messages): - raise IndexError("Start index is out of range") - - # Calculate the end index, ensuring it does not exceed the list length - end_index = min(start + count, len(reversed_messages)) - - # Slice the list for pagination - messages = reversed_messages[start:end_index] - - else: - # need to access persistence manager for additional messages - - # get messages using message manager - page = letta_agent.message_manager.list_user_messages_for_agent( - agent_id=agent_id, - actor=self.default_user, - cursor=start, - limit=count, - ) - - messages = page - assert all(isinstance(m, Message) for m in messages) - - ## Convert to json - ## Add a tag indicating in-context or not - # json_messages = [record.to_json() for record in messages] - # in_context_message_ids = [str(m.id) for m in letta_agent._messages] - # for d in json_messages: - # d["in_context"] = True if str(d["id"]) in in_context_message_ids else False - - return messages - - def get_agent_archival(self, user_id: str, agent_id: str, cursor: Optional[str] = None, limit: int = 50) -> List[PydanticPassage]: + def get_agent_archival(self, user_id: str, agent_id: str, cursor: Optional[str] = None, limit: int = 50) -> List[Passage]: """Paginated query of all messages in agent archival memory""" - if self.user_manager.get_user_by_id(user_id=user_id) is None: - raise ValueError(f"User user_id={user_id} does not exist") - if self.ms.get_agent(agent_id=agent_id, user_id=user_id) is None: - raise ValueError(f"Agent agent_id={agent_id} does not exist") + # TODO: Thread actor directly through this function, since the top level caller most likely already retrieved the user + actor = self.user_manager.get_user_or_default(user_id=user_id) # Get the agent object (loaded in memory) - letta_agent = self.load_agent(agent_id=agent_id) + letta_agent = self.load_agent(agent_id=agent_id, actor=actor) # iterate over records records = letta_agent.passage_manager.list_passages( - actor=self.default_user, + actor=actor, agent_id=agent_id, cursor=cursor, limit=limit, @@ -1316,14 +1013,14 @@ def get_agent_archival_cursor( agent_id: str, cursor: Optional[str] = None, limit: Optional[int] = 100, - ) -> List[PydanticPassage]: - if self.user_manager.get_user_by_id(user_id=user_id) is None: - raise LettaUserNotFoundError(f"User user_id={user_id} does not exist") - if self.ms.get_agent(agent_id=agent_id, user_id=user_id) is None: - raise LettaAgentNotFoundError(f"Agent agent_id={agent_id} does not exist") + order_by: Optional[str] = "created_at", + reverse: Optional[bool] = False, + ) -> List[Passage]: + # TODO: Thread actor directly through this function, since the top level caller most likely already retrieved the user + actor = self.user_manager.get_user_or_default(user_id=user_id) # Get the agent object (loaded in memory) - letta_agent = self.load_agent(agent_id=agent_id) + letta_agent = self.load_agent(agent_id=agent_id, actor=actor) # iterate over records records = letta_agent.passage_manager.list_passages( @@ -1334,32 +1031,22 @@ def get_agent_archival_cursor( ) return records - def insert_archival_memory(self, user_id: str, agent_id: str, memory_contents: str) -> List[PydanticPassage]: - actor = self.user_manager.get_user_by_id(user_id=user_id) - if actor is None: - raise ValueError(f"User user_id={user_id} does not exist") - if self.ms.get_agent(agent_id=agent_id, user_id=user_id) is None: - raise ValueError(f"Agent agent_id={agent_id} does not exist") - + def insert_archival_memory(self, agent_id: str, memory_contents: str, actor: User) -> List[Passage]: # Get the agent object (loaded in memory) - letta_agent = self.load_agent(agent_id=agent_id) + letta_agent = self.load_agent(agent_id=agent_id, actor=actor) # Insert into archival memory - return self.passage_manager.insert_passage( + passages = self.passage_manager.insert_passage( agent_state=letta_agent.agent_state, agent_id=agent_id, text=memory_contents, actor=actor ) - def delete_archival_memory(self, user_id: str, agent_id: str, memory_id: str): - actor = self.user_manager.get_user_by_id(user_id=user_id) - if actor is None: - raise ValueError(f"User user_id={user_id} does not exist") - if self.ms.get_agent(agent_id=agent_id, user_id=user_id) is None: - raise ValueError(f"Agent agent_id={agent_id} does not exist") + save_agent(letta_agent) - # TODO: should return a passage + return passages + def delete_archival_memory(self, agent_id: str, memory_id: str, actor: User): # Get the agent object (loaded in memory) - letta_agent = self.load_agent(agent_id=agent_id) + letta_agent = self.load_agent(agent_id=agent_id, actor=actor) # Delete by ID # TODO check if it exists first, and throw error if not @@ -1379,14 +1066,11 @@ def get_agent_recall_cursor( assistant_message_tool_name: str = constants.DEFAULT_MESSAGE_TOOL, assistant_message_tool_kwarg: str = constants.DEFAULT_MESSAGE_TOOL_KWARG, ) -> Union[List[Message], List[LettaMessage]]: - actor = self.user_manager.get_user_by_id(user_id=user_id) - if actor is None: - raise ValueError(f"User user_id={user_id} does not exist") - if self.ms.get_agent(agent_id=agent_id, user_id=user_id) is None: - raise ValueError(f"Agent agent_id={agent_id} does not exist") + # TODO: Thread actor directly through this function, since the top level caller most likely already retrieved the user + actor = self.user_manager.get_user_or_default(user_id=user_id) # Get the agent object (loaded in memory) - letta_agent = self.load_agent(agent_id=agent_id) + letta_agent = self.load_agent(agent_id=agent_id, actor=actor) # iterate over records start_date = self.message_manager.get_message_by_id(after, actor=actor).created_at if after else None @@ -1441,95 +1125,19 @@ def clean_keys(config): return response - def update_agent_core_memory(self, user_id: str, agent_id: str, label: str, value: str) -> Memory: + def update_agent_core_memory(self, agent_id: str, label: str, value: str, actor: User) -> Memory: """Update the value of a block in the agent's memory""" # get the block id - block = self.get_agent_block_by_label(user_id=user_id, agent_id=agent_id, label=label) - block_id = block.id + block = self.agent_manager.get_block_with_label(agent_id=agent_id, block_label=label, actor=actor) # update the block - self.block_manager.update_block( - block_id=block_id, block_update=BlockUpdate(value=value), actor=self.user_manager.get_user_by_id(user_id=user_id) - ) + self.block_manager.update_block(block_id=block.id, block_update=BlockUpdate(value=value), actor=actor) # load agent - letta_agent = self.load_agent(agent_id=agent_id) + letta_agent = self.load_agent(agent_id=agent_id, actor=actor) return letta_agent.agent_state.memory - def rename_agent(self, user_id: str, agent_id: str, new_agent_name: str) -> PersistedAgentState: - """Update the name of the agent in the database""" - if self.user_manager.get_user_by_id(user_id=user_id) is None: - raise ValueError(f"User user_id={user_id} does not exist") - if self.ms.get_agent(agent_id=agent_id, user_id=user_id) is None: - raise ValueError(f"Agent agent_id={agent_id} does not exist") - - # Get the agent object (loaded in memory) - letta_agent = self.load_agent(agent_id=agent_id) - - current_name = letta_agent.agent_state.name - if current_name == new_agent_name: - raise ValueError(f"New name ({new_agent_name}) is the same as the current name") - - try: - letta_agent.agent_state.name = new_agent_name - self.ms.update_agent(agent=letta_agent.agent_state) - except Exception as e: - logger.exception(f"Failed to update agent name with:\n{str(e)}") - raise ValueError(f"Failed to update agent name in database") - - assert isinstance(letta_agent.agent_state.id, str) - return letta_agent.agent_state - - def delete_agent(self, user_id: str, agent_id: str): - """Delete an agent in the database""" - actor = self.user_manager.get_user_by_id(user_id=user_id) - # TODO: REMOVE THIS ONCE WE MIGRATE AGENTMODEL TO ORM MODEL - # TODO: EVENTUALLY WE GET AUTO-DELETES WHEN WE SPECIFY RELATIONSHIPS IN THE ORM - self.agents_tags_manager.delete_all_tags_from_agent(agent_id=agent_id, actor=actor) - self.blocks_agents_manager.remove_all_agent_blocks(agent_id=agent_id) - - # Verify that the agent exists and belongs to the org of the user - agent_state = self.ms.get_agent(agent_id=agent_id, user_id=user_id) - if agent_state is None: - raise ValueError(f"Could not find agent_id={agent_id} under user_id={user_id}") - - # TODO: REMOVE THIS ONCE WE MIGRATE AGENTMODEL TO ORM MODEL - messages = self.message_manager.list_messages_for_agent(agent_id=agent_state.id) - for message in messages: - self.message_manager.delete_message_by_id(message.id, actor=actor) - - # TODO: REMOVE THIS ONCE WE MIGRATE AGENTMODEL TO ORM - try: - agent_state_user = self.user_manager.get_user_by_id(user_id=agent_state.user_id) - if agent_state_user.organization_id != actor.organization_id: - raise ValueError( - f"Could not authorize agent_id={agent_id} with user_id={user_id} because of differing organizations; agent_id was created in {agent_state_user.organization_id} while user belongs to {actor.organization_id}. How did they get the agent id?" - ) - except NoResultFound: - logger.error(f"Agent with id {agent_state.id} has nonexistent user {agent_state.user_id}") - - # delete all passages associated with this agent - # TODO: REMOVE THIS ONCE WE MIGRATE AGENTMODEL TO ORM - passages = self.passage_manager.list_passages(actor=actor, agent_id=agent_state.id) - for passage in passages: - self.passage_manager.delete_passage_by_id(passage.id, actor=actor) - - # First, if the agent is in the in-memory cache we should remove it - # List of {'user_id': user_id, 'agent_id': agent_id, 'agent': agent_obj} dicts - try: - self.active_agents = [d for d in self.active_agents if str(d["agent_id"]) != str(agent_id)] - except Exception as e: - logger.exception(f"Failed to delete agent {agent_id} from cache via ID with:\n{str(e)}") - raise ValueError(f"Failed to delete agent {agent_id} from cache") - - # Next, attempt to delete it from the actual database - try: - self.ms.delete_agent(agent_id=agent_id, per_agent_lock_manager=self.per_agent_lock_manager) - except Exception as e: - logger.exception(f"Failed to delete agent {agent_id} via ID with:\n{str(e)}") - raise ValueError(f"Failed to delete agent {agent_id} in database") - def api_key_to_user(self, api_key: str) -> str: """Decode an API key to a user""" token = self.ms.get_api_key(api_key=api_key) @@ -1557,7 +1165,7 @@ def delete_api_key(self, api_key: str) -> APIKey: self.ms.delete_api_key(api_key=api_key) return api_key_obj - def delete_source(self, source_id: str, actor: PydanticUser): + def delete_source(self, source_id: str, actor: User): """Delete a data source""" self.source_manager.delete_source(source_id=source_id, actor=actor) @@ -1566,7 +1174,7 @@ def delete_source(self, source_id: str, actor: PydanticUser): # TODO: delete data from agent passage stores (?) - def load_file_to_source(self, source_id: str, file_path: str, job_id: str, actor: PydanticUser) -> Job: + def load_file_to_source(self, source_id: str, file_path: str, job_id: str, actor: User) -> Job: # update job job = self.job_manager.get_job_by_id(job_id, actor=actor) @@ -1589,13 +1197,14 @@ def load_file_to_source(self, source_id: str, file_path: str, job_id: str, actor self.job_manager.update_job_by_id(job_id=job_id, job_update=JobUpdate(**job.model_dump()), actor=actor) # update all agents who have this source attached - agent_ids = self.ms.list_attached_agents(source_id=source_id) - for agent_id in agent_ids: - agent = self.load_agent(agent_id=agent_id) + agent_states = self.source_manager.list_attached_agents(source_id=source_id, actor=actor) + for agent_state in agent_states: + agent_id = agent_state.id + agent = self.load_agent(agent_id=agent_id, actor=actor) curr_passage_size = self.passage_manager.size(actor=actor, agent_id=agent_id, source_id=source_id) - agent.attach_source(user=actor, source_id=source_id, source_manager=self.source_manager, ms=self.ms) + agent.attach_source(user=actor, source_id=source_id, source_manager=self.source_manager, agent_manager=self.agent_manager) new_passage_size = self.passage_manager.size(actor=actor, agent_id=agent_id, source_id=source_id) - assert new_passage_size >= curr_passage_size # in case empty files are added + assert new_passage_size >= curr_passage_size # in case empty files are added return job @@ -1626,21 +1235,22 @@ def attach_source_to_agent( source_name: Optional[str] = None, ) -> Source: # attach a data source to an agent - user = self.user_manager.get_user_by_id(user_id=user_id) + # TODO: Thread actor directly through this function, since the top level caller most likely already retrieved the user + actor = self.user_manager.get_user_or_default(user_id=user_id) if source_id: - data_source = self.source_manager.get_source_by_id(source_id=source_id, actor=user) + data_source = self.source_manager.get_source_by_id(source_id=source_id, actor=actor) elif source_name: - data_source = self.source_manager.get_source_by_name(source_name=source_name, actor=user) + data_source = self.source_manager.get_source_by_name(source_name=source_name, actor=actor) else: raise ValueError(f"Need to provide at least source_id or source_name to find the source.") assert data_source, f"Data source with id={source_id} or name={source_name} does not exist" # load agent - agent = self.load_agent(agent_id=agent_id) + agent = self.load_agent(agent_id=agent_id, actor=actor) # attach source to agent - agent.attach_source(user=user, source_id=data_source.id, source_manager=self.source_manager, ms=self.ms) + agent.attach_source(user=actor, source_id=data_source.id, source_manager=self.source_manager, agent_manager=self.agent_manager) return data_source @@ -1648,40 +1258,35 @@ def detach_source_from_agent( self, user_id: str, agent_id: str, - # source_id: str, source_id: Optional[str] = None, source_name: Optional[str] = None, ) -> Source: - user = self.user_manager.get_user_by_id(user_id=user_id) + # TODO: Thread actor directly through this function, since the top level caller most likely already retrieved the user + actor = self.user_manager.get_user_or_default(user_id=user_id) if source_id: - source = self.source_manager.get_source_by_id(source_id=source_id, actor=user) + source = self.source_manager.get_source_by_id(source_id=source_id, actor=actor) elif source_name: - source = self.source_manager.get_source_by_name(source_name=source_name, actor=user) + source = self.source_manager.get_source_by_name(source_name=source_name, actor=actor) else: raise ValueError(f"Need to provide at least source_id or source_name to find the source.") source_id = source.id + # TODO: This should be done with the ORM? # delete all Passage objects with source_id==source_id from agent's archival memory - agent = self.load_agent(agent_id=agent_id) - agent.passage_manager.delete_passages(actor=user, limit=100, source_id=source_id) + agent = self.load_agent(agent_id=agent_id, actor=actor) + agent.passage_manager.delete_passages(actor=actor, limit=100, source_id=source_id) # delete agent-source mapping - self.ms.detach_source(agent_id=agent_id, source_id=source_id) + self.agent_manager.detach_source(agent_id=agent_id, source_id=source_id, actor=actor) # return back source data return source - def list_attached_sources(self, agent_id: str) -> List[Source]: - # list all attached sources to an agent - source_ids = self.ms.list_attached_source_ids(agent_id) - - return [self.source_manager.get_source_by_id(source_id=id) for id in source_ids] - - def list_data_source_passages(self, user_id: str, source_id: str) -> List[PydanticPassage]: + def list_data_source_passages(self, user_id: str, source_id: str) -> List[Passage]: warnings.warn("list_data_source_passages is not yet implemented, returning empty list.", category=UserWarning) return [] - def list_all_sources(self, actor: PydanticUser) -> List[Source]: + def list_all_sources(self, actor: User) -> List[Source]: """List all sources (w/ extra metadata) belonging to a user""" sources = self.source_manager.list_sources(actor=actor) @@ -1699,15 +1304,9 @@ def list_all_sources(self, actor: PydanticUser) -> List[Source]: # num_documents = document_conn.size({"data_source": source.name}) num_documents = 0 - agent_ids = self.ms.list_attached_agents(source_id=source.id) + agents = self.source_manager.list_attached_agents(source_id=source.id, actor=actor) # add the agent name information - attached_agents = [ - { - "id": str(a_id), - "name": self.ms.get_agent(user_id=actor.id, agent_id=a_id).name, - } - for a_id in agent_ids - ] + attached_agents = [{"id": agent.id, "name": agent.name} for agent in agents] # Overwrite metadata field, should be empty anyways source.metadata_ = dict( @@ -1720,7 +1319,7 @@ def list_all_sources(self, actor: PydanticUser) -> List[Source]: return sources_with_metadata - def add_default_external_tools(self, actor: PydanticUser) -> bool: + def add_default_external_tools(self, actor: User) -> bool: """Add default langchain tools. Return true if successful, false otherwise.""" success = True tool_creates = ToolCreate.load_default_langchain_tools() @@ -1736,57 +1335,37 @@ def add_default_external_tools(self, actor: PydanticUser) -> bool: return success - def get_agent_message(self, agent_id: str, message_id: str) -> Optional[Message]: - """Get a single message from the agent's memory""" - # Get the agent object (loaded in memory) - letta_agent = self.load_agent(agent_id=agent_id) - message = letta_agent.message_manager.get_message_by_id(id=message_id) - save_agent(letta_agent, self.ms) - return message - - def update_agent_message(self, agent_id: str, message_id: str, request: MessageUpdate) -> Message: + def update_agent_message(self, agent_id: str, message_id: str, request: MessageUpdate, actor: User) -> Message: """Update the details of a message associated with an agent""" # Get the current message - letta_agent = self.load_agent(agent_id=agent_id) + letta_agent = self.load_agent(agent_id=agent_id, actor=actor) response = letta_agent.update_message(message_id=message_id, request=request) - save_agent(letta_agent, self.ms) + save_agent(letta_agent) return response - def rewrite_agent_message(self, agent_id: str, new_text: str) -> Message: + def rewrite_agent_message(self, agent_id: str, new_text: str, actor: User) -> Message: # Get the current message - letta_agent = self.load_agent(agent_id=agent_id) + letta_agent = self.load_agent(agent_id=agent_id, actor=actor) response = letta_agent.rewrite_message(new_text=new_text) - save_agent(letta_agent, self.ms) + save_agent(letta_agent) return response - def rethink_agent_message(self, agent_id: str, new_thought: str) -> Message: - + def rethink_agent_message(self, agent_id: str, new_thought: str, actor: User) -> Message: # Get the current message - letta_agent = self.load_agent(agent_id=agent_id) + letta_agent = self.load_agent(agent_id=agent_id, actor=actor) response = letta_agent.rethink_message(new_thought=new_thought) - save_agent(letta_agent, self.ms) + save_agent(letta_agent) return response - def retry_agent_message(self, agent_id: str) -> List[Message]: - + def retry_agent_message(self, agent_id: str, actor: User) -> List[Message]: # Get the current message - letta_agent = self.load_agent(agent_id=agent_id) + letta_agent = self.load_agent(agent_id=agent_id, actor=actor) response = letta_agent.retry_message() - save_agent(letta_agent, self.ms) + save_agent(letta_agent) return response - def get_user_or_default(self, user_id: Optional[str]) -> PydanticUser: - """Get the user object for user_id if it exists, otherwise return the default user object""" - if user_id is None: - user_id = self.user_manager.DEFAULT_USER_ID - - try: - return self.user_manager.get_user_by_id(user_id=user_id) - except NoResultFound: - raise HTTPException(status_code=404, detail=f"User with id {user_id} not found") - def get_organization_or_default(self, org_id: Optional[str]) -> Organization: """Get the organization object for org_id if it exists, otherwise return the default organization object""" if org_id is None: @@ -1829,100 +1408,13 @@ def get_agent_context_window( user_id: str, agent_id: str, ) -> ContextWindowOverview: + # TODO: Thread actor directly through this function, since the top level caller most likely already retrieved the user + actor = self.user_manager.get_user_or_default(user_id=user_id) + # Get the current message - letta_agent = self.load_agent(agent_id=agent_id) + letta_agent = self.load_agent(agent_id=agent_id, actor=actor) return letta_agent.get_context_window() - def link_block_to_agent_memory(self, user_id: str, agent_id: str, block_id: str) -> Memory: - """Link a block to an agent's memory""" - block = self.block_manager.get_block_by_id(block_id=block_id, actor=self.user_manager.get_user_by_id(user_id=user_id)) - if block is None: - raise ValueError(f"Block with id {block_id} not found") - self.blocks_agents_manager.add_block_to_agent(agent_id, block_id, block_label=block.label) - - # get agent memory - memory = self.get_agent(agent_id=agent_id).memory - return memory - - def unlink_block_from_agent_memory(self, user_id: str, agent_id: str, block_label: str, delete_if_no_ref: bool = True) -> Memory: - """Unlink a block from an agent's memory. If the block is not linked to any agent, delete it.""" - self.blocks_agents_manager.remove_block_with_label_from_agent(agent_id=agent_id, block_label=block_label) - - # get agent memory - memory = self.get_agent(agent_id=agent_id).memory - return memory - - def update_agent_memory_limit(self, user_id: str, agent_id: str, block_label: str, limit: int) -> Memory: - """Update the limit of a block in an agent's memory""" - block = self.get_agent_block_by_label(user_id=user_id, agent_id=agent_id, label=block_label) - self.block_manager.update_block( - block_id=block.id, block_update=BlockUpdate(limit=limit), actor=self.user_manager.get_user_by_id(user_id=user_id) - ) - # get agent memory - memory = self.get_agent(agent_id=agent_id).memory - return memory - - def upate_block(self, user_id: str, block_id: str, block_update: BlockUpdate) -> Block: - """Update a block""" - return self.block_manager.update_block( - block_id=block_id, block_update=block_update, actor=self.user_manager.get_user_by_id(user_id=user_id) - ) - - def get_agent_block_by_label(self, user_id: str, agent_id: str, label: str) -> Block: - """Get a block by label""" - # TODO: implement at ORM? - for block_id in self.blocks_agents_manager.list_block_ids_for_agent(agent_id=agent_id): - block = self.block_manager.get_block_by_id(block_id=block_id, actor=self.user_manager.get_user_by_id(user_id=user_id)) - if block.label == label: - return block - return None - - # def run_tool(self, tool_id: str, tool_args: str, user_id: str) -> FunctionReturn: - # """Run a tool using the sandbox and return the result""" - - # try: - # tool_args_dict = json.loads(tool_args) - # except json.JSONDecodeError: - # raise ValueError("Invalid JSON string for tool_args") - - # # Get the tool by ID - # user = self.user_manager.get_user_by_id(user_id=user_id) - # tool = self.tool_manager.get_tool_by_id(tool_id=tool_id, actor=user) - # if tool.name is None: - # raise ValueError(f"Tool with id {tool_id} does not have a name") - - # # TODO eventually allow using agent state in tools - # agent_state = None - - # try: - # sandbox_run_result = ToolExecutionSandbox(tool.name, tool_args_dict, user_id).run(agent_state=agent_state) - # if sandbox_run_result is None: - # raise ValueError(f"Tool with id {tool_id} returned execution with None") - # function_response = str(sandbox_run_result.func_return) - - # return FunctionReturn( - # id="null", - # function_call_id="null", - # date=get_utc_time(), - # status="success", - # function_return=function_response, - # ) - # except Exception as e: - # # same as agent.py - # from letta.constants import MAX_ERROR_MESSAGE_CHAR_LIMIT - - # error_msg = f"Error executing tool {tool.name}: {e}" - # if len(error_msg) > MAX_ERROR_MESSAGE_CHAR_LIMIT: - # error_msg = error_msg[:MAX_ERROR_MESSAGE_CHAR_LIMIT] - - # return FunctionReturn( - # id="null", - # function_call_id="null", - # date=get_utc_time(), - # status="error", - # function_return=error_msg, - # ) - def run_tool_from_source( self, user_id: str, @@ -1994,7 +1486,6 @@ def run_tool_from_source( stderr=[traceback.format_exc()], ) - def get_error_msg_for_func_return(self, tool_name, exception_message): # same as agent.py from letta.constants import MAX_ERROR_MESSAGE_CHAR_LIMIT @@ -2004,7 +1495,6 @@ def get_error_msg_for_func_return(self, tool_name, exception_message): error_msg = error_msg[:MAX_ERROR_MESSAGE_CHAR_LIMIT] return error_msg - # Composio wrappers def get_composio_client(self, api_key: Optional[str] = None): if api_key: diff --git a/letta/server/ws_api/server.py b/letta/server/ws_api/server.py index f2ec4f9938..975bd0d205 100644 --- a/letta/server/ws_api/server.py +++ b/letta/server/ws_api/server.py @@ -19,11 +19,6 @@ def __init__(self, host="localhost", port=WS_DEFAULT_PORT): self.server = SyncServer(default_interface=self.interface) def shutdown_server(self): - try: - self.server.save_agents() - print(f"Saved agents") - except Exception as e: - print(f"Saving agents failed with: {e}") try: self.interface.close() print(f"Closed the WS interface") diff --git a/letta/services/agent_manager.py b/letta/services/agent_manager.py new file mode 100644 index 0000000000..093831aab7 --- /dev/null +++ b/letta/services/agent_manager.py @@ -0,0 +1,405 @@ +from typing import Dict, List, Optional + +from letta.constants import BASE_MEMORY_TOOLS, BASE_TOOLS +from letta.orm import Agent as AgentModel +from letta.orm import Block as BlockModel +from letta.orm import Source as SourceModel +from letta.orm import Tool as ToolModel +from letta.orm.errors import NoResultFound +from letta.schemas.agent import AgentState as PydanticAgentState +from letta.schemas.agent import AgentType, CreateAgent, UpdateAgent +from letta.schemas.block import Block as PydanticBlock +from letta.schemas.embedding_config import EmbeddingConfig +from letta.schemas.llm_config import LLMConfig +from letta.schemas.source import Source as PydanticSource +from letta.schemas.tool_rule import ToolRule as PydanticToolRule +from letta.schemas.user import User as PydanticUser +from letta.services.block_manager import BlockManager +from letta.services.helpers.agent_manager_helper import ( + _process_relationship, + _process_tags, + derive_system_message, +) +from letta.services.passage_manager import PassageManager +from letta.services.source_manager import SourceManager +from letta.services.tool_manager import ToolManager +from letta.utils import enforce_types + + +# Agent Manager Class +class AgentManager: + """Manager class to handle business logic related to Agents.""" + + def __init__(self): + from letta.server.server import db_context + + self.session_maker = db_context + self.block_manager = BlockManager() + self.tool_manager = ToolManager() + self.source_manager = SourceManager() + + # ====================================================================================================================== + # Basic CRUD operations + # ====================================================================================================================== + @enforce_types + def create_agent( + self, + agent_create: CreateAgent, + actor: PydanticUser, + ) -> PydanticAgentState: + system = derive_system_message(agent_type=agent_create.agent_type, system=agent_create.system) + + # create blocks (note: cannot be linked into the agent_id is created) + block_ids = list(agent_create.block_ids or []) # Create a local copy to avoid modifying the original + for create_block in agent_create.memory_blocks: + block = self.block_manager.create_or_update_block(PydanticBlock(**create_block.model_dump()), actor=actor) + block_ids.append(block.id) + + # TODO: Remove this block once we deprecate the legacy `tools` field + # create passed in `tools` + tool_names = [] + if agent_create.include_base_tools: + tool_names.extend(BASE_TOOLS + BASE_MEMORY_TOOLS) + if agent_create.tools: + tool_names.extend(agent_create.tools) + + tool_ids = agent_create.tool_ids or [] + for tool_name in tool_names: + tool = self.tool_manager.get_tool_by_name(tool_name=tool_name, actor=actor) + if tool: + tool_ids.append(tool.id) + # Remove duplicates + tool_ids = list(set(tool_ids)) + + return self._create_agent( + name=agent_create.name, + system=system, + agent_type=agent_create.agent_type, + llm_config=agent_create.llm_config, + embedding_config=agent_create.embedding_config, + block_ids=block_ids, + tool_ids=tool_ids, + source_ids=agent_create.source_ids or [], + tags=agent_create.tags or [], + description=agent_create.description, + metadata_=agent_create.metadata_, + tool_rules=agent_create.tool_rules, + actor=actor, + ) + + @enforce_types + def _create_agent( + self, + actor: PydanticUser, + name: str, + system: str, + agent_type: AgentType, + llm_config: LLMConfig, + embedding_config: EmbeddingConfig, + block_ids: List[str], + tool_ids: List[str], + source_ids: List[str], + tags: List[str], + description: Optional[str] = None, + metadata_: Optional[Dict] = None, + tool_rules: Optional[List[PydanticToolRule]] = None, + ) -> PydanticAgentState: + """Create a new agent.""" + with self.session_maker() as session: + # Prepare the agent data + data = { + "name": name, + "system": system, + "agent_type": agent_type, + "llm_config": llm_config, + "embedding_config": embedding_config, + "organization_id": actor.organization_id, + "description": description, + "metadata_": metadata_, + "tool_rules": tool_rules, + } + + # Create the new agent using SqlalchemyBase.create + new_agent = AgentModel(**data) + _process_relationship(session, new_agent, "tools", ToolModel, tool_ids, replace=True) + _process_relationship(session, new_agent, "sources", SourceModel, source_ids, replace=True) + _process_relationship(session, new_agent, "core_memory", BlockModel, block_ids, replace=True) + _process_tags(new_agent, tags, replace=True) + new_agent.create(session, actor=actor) + + # Convert to PydanticAgentState and return + return new_agent.to_pydantic() + + @enforce_types + def update_agent(self, agent_id: str, agent_update: UpdateAgent, actor: PydanticUser) -> PydanticAgentState: + """ + Update an existing agent. + + Args: + agent_id: The ID of the agent to update. + agent_update: UpdateAgent object containing the updated fields. + actor: User performing the action. + + Returns: + PydanticAgentState: The updated agent as a Pydantic model. + """ + with self.session_maker() as session: + # Retrieve the existing agent + agent = AgentModel.read(db_session=session, identifier=agent_id, actor=actor) + + # Update scalar fields directly + scalar_fields = {"name", "system", "llm_config", "embedding_config", "message_ids", "tool_rules", "description", "metadata_"} + for field in scalar_fields: + value = getattr(agent_update, field, None) + if value is not None: + setattr(agent, field, value) + + # Update relationships using _process_relationship and _process_tags + if agent_update.tool_ids is not None: + _process_relationship(session, agent, "tools", ToolModel, agent_update.tool_ids, replace=True) + if agent_update.source_ids is not None: + _process_relationship(session, agent, "sources", SourceModel, agent_update.source_ids, replace=True) + if agent_update.block_ids is not None: + _process_relationship(session, agent, "core_memory", BlockModel, agent_update.block_ids, replace=True) + if agent_update.tags is not None: + _process_tags(agent, agent_update.tags, replace=True) + + # Commit and refresh the agent + agent.update(session, actor=actor) + + # Convert to PydanticAgentState and return + return agent.to_pydantic() + + @enforce_types + def list_agents( + self, + actor: PydanticUser, + tags: Optional[List[str]] = None, + match_all_tags: bool = False, + cursor: Optional[str] = None, + limit: Optional[int] = 50, + **kwargs, + ) -> List[PydanticAgentState]: + """ + List agents that have the specified tags. + """ + with self.session_maker() as session: + agents = AgentModel.list( + db_session=session, + tags=tags, + match_all_tags=match_all_tags, + cursor=cursor, + limit=limit, + organization_id=actor.organization_id if actor else None, + **kwargs, + ) + + return [agent.to_pydantic() for agent in agents] + + @enforce_types + def get_agent_by_id(self, agent_id: str, actor: PydanticUser) -> PydanticAgentState: + """Fetch an agent by its ID.""" + with self.session_maker() as session: + agent = AgentModel.read(db_session=session, identifier=agent_id, actor=actor) + return agent.to_pydantic() + + @enforce_types + def get_agent_by_name(self, agent_name: str, actor: PydanticUser) -> PydanticAgentState: + """Fetch an agent by its ID.""" + with self.session_maker() as session: + agent = AgentModel.read(db_session=session, name=agent_name, actor=actor) + return agent.to_pydantic() + + @enforce_types + def delete_agent(self, agent_id: str, actor: PydanticUser) -> PydanticAgentState: + """ + Deletes an agent and its associated relationships. + Ensures proper permission checks and cascades where applicable. + + Args: + agent_id: ID of the agent to be deleted. + actor: User performing the action. + + Returns: + PydanticAgentState: The deleted agent state + """ + with self.session_maker() as session: + # Retrieve the agent + agent = AgentModel.read(db_session=session, identifier=agent_id, actor=actor) + + # TODO: @mindy delete this piece when we have a proper passages/sources implementation + # TODO: This is done very hacky on purpose + # TODO: 1000 limit is also wack + passage_manager = PassageManager() + passage_manager.delete_passages(actor=actor, agent_id=agent_id, limit=1000) + + agent_state = agent.to_pydantic() + agent.hard_delete(session) + return agent_state + + # ====================================================================================================================== + # Source Management + # ====================================================================================================================== + @enforce_types + def attach_source(self, agent_id: str, source_id: str, actor: PydanticUser) -> None: + """ + Attaches a source to an agent. + + Args: + agent_id: ID of the agent to attach the source to + source_id: ID of the source to attach + actor: User performing the action + + Raises: + ValueError: If either agent or source doesn't exist + IntegrityError: If the source is already attached to the agent + """ + with self.session_maker() as session: + # Verify both agent and source exist and user has permission to access them + agent = AgentModel.read(db_session=session, identifier=agent_id, actor=actor) + + # The _process_relationship helper already handles duplicate checking via unique constraint + _process_relationship( + session=session, + agent=agent, + relationship_name="sources", + model_class=SourceModel, + item_ids=[source_id], + allow_partial=False, + replace=False, # Extend existing sources rather than replace + ) + + # Commit the changes + agent.update(session, actor=actor) + + @enforce_types + def list_attached_sources(self, agent_id: str, actor: PydanticUser) -> List[PydanticSource]: + """ + Lists all sources attached to an agent. + + Args: + agent_id: ID of the agent to list sources for + actor: User performing the action + + Returns: + List[str]: List of source IDs attached to the agent + """ + with self.session_maker() as session: + # Verify agent exists and user has permission to access it + agent = AgentModel.read(db_session=session, identifier=agent_id, actor=actor) + + # Use the lazy-loaded relationship to get sources + return [source.to_pydantic() for source in agent.sources] + + @enforce_types + def detach_source(self, agent_id: str, source_id: str, actor: PydanticUser) -> None: + """ + Detaches a source from an agent. + + Args: + agent_id: ID of the agent to detach the source from + source_id: ID of the source to detach + actor: User performing the action + """ + with self.session_maker() as session: + # Verify agent exists and user has permission to access it + agent = AgentModel.read(db_session=session, identifier=agent_id, actor=actor) + + # Remove the source from the relationship + agent.sources = [s for s in agent.sources if s.id != source_id] + + # Commit the changes + agent.update(session, actor=actor) + + # ====================================================================================================================== + # Block management + # ====================================================================================================================== + @enforce_types + def get_block_with_label( + self, + agent_id: str, + block_label: str, + actor: PydanticUser, + ) -> PydanticBlock: + """Gets a block attached to an agent by its label.""" + with self.session_maker() as session: + agent = AgentModel.read(db_session=session, identifier=agent_id, actor=actor) + for block in agent.core_memory: + if block.label == block_label: + return block.to_pydantic() + raise NoResultFound(f"No block with label '{block_label}' found for agent '{agent_id}'") + + @enforce_types + def update_block_with_label( + self, + agent_id: str, + block_label: str, + new_block_id: str, + actor: PydanticUser, + ) -> PydanticAgentState: + """Updates which block is assigned to a specific label for an agent.""" + with self.session_maker() as session: + agent = AgentModel.read(db_session=session, identifier=agent_id, actor=actor) + new_block = BlockModel.read(db_session=session, identifier=new_block_id, actor=actor) + + if new_block.label != block_label: + raise ValueError(f"New block label '{new_block.label}' doesn't match required label '{block_label}'") + + # Remove old block with this label if it exists + agent.core_memory = [b for b in agent.core_memory if b.label != block_label] + + # Add new block + agent.core_memory.append(new_block) + agent.update(session, actor=actor) + return agent.to_pydantic() + + @enforce_types + def attach_block(self, agent_id: str, block_id: str, actor: PydanticUser) -> PydanticAgentState: + """Attaches a block to an agent.""" + with self.session_maker() as session: + agent = AgentModel.read(db_session=session, identifier=agent_id, actor=actor) + block = BlockModel.read(db_session=session, identifier=block_id, actor=actor) + + agent.core_memory.append(block) + agent.update(session, actor=actor) + return agent.to_pydantic() + + @enforce_types + def detach_block( + self, + agent_id: str, + block_id: str, + actor: PydanticUser, + ) -> PydanticAgentState: + """Detaches a block from an agent.""" + with self.session_maker() as session: + agent = AgentModel.read(db_session=session, identifier=agent_id, actor=actor) + original_length = len(agent.core_memory) + + agent.core_memory = [b for b in agent.core_memory if b.id != block_id] + + if len(agent.core_memory) == original_length: + raise NoResultFound(f"No block with id '{block_id}' found for agent '{agent_id}' with actor id: '{actor.id}'") + + agent.update(session, actor=actor) + return agent.to_pydantic() + + @enforce_types + def detach_block_with_label( + self, + agent_id: str, + block_label: str, + actor: PydanticUser, + ) -> PydanticAgentState: + """Detaches a block with the specified label from an agent.""" + with self.session_maker() as session: + agent = AgentModel.read(db_session=session, identifier=agent_id, actor=actor) + original_length = len(agent.core_memory) + + agent.core_memory = [b for b in agent.core_memory if b.label != block_label] + + if len(agent.core_memory) == original_length: + raise NoResultFound(f"No block with label '{block_label}' found for agent '{agent_id}' with actor id: '{actor.id}'") + + agent.update(session, actor=actor) + return agent.to_pydantic() diff --git a/letta/services/agents_tags_manager.py b/letta/services/agents_tags_manager.py deleted file mode 100644 index f84ea11b99..0000000000 --- a/letta/services/agents_tags_manager.py +++ /dev/null @@ -1,64 +0,0 @@ -from typing import List - -from letta.orm.agents_tags import AgentsTags as AgentsTagsModel -from letta.orm.errors import NoResultFound -from letta.schemas.agents_tags import AgentsTags as PydanticAgentsTags -from letta.schemas.user import User as PydanticUser -from letta.utils import enforce_types - - -class AgentsTagsManager: - """Manager class to handle business logic related to Tags.""" - - def __init__(self): - from letta.server.server import db_context - - self.session_maker = db_context - - @enforce_types - def add_tag_to_agent(self, agent_id: str, tag: str, actor: PydanticUser) -> PydanticAgentsTags: - """Add a tag to an agent.""" - with self.session_maker() as session: - # Check if the tag already exists for this agent - try: - agents_tags_model = AgentsTagsModel.read(db_session=session, agent_id=agent_id, tag=tag, actor=actor) - return agents_tags_model.to_pydantic() - except NoResultFound: - agents_tags = PydanticAgentsTags(agent_id=agent_id, tag=tag).model_dump(exclude_none=True) - new_tag = AgentsTagsModel(**agents_tags, organization_id=actor.organization_id) - new_tag.create(session, actor=actor) - return new_tag.to_pydantic() - - @enforce_types - def delete_all_tags_from_agent(self, agent_id: str, actor: PydanticUser): - """Delete a tag from an agent. This is a permanent hard delete.""" - tags = self.get_tags_for_agent(agent_id=agent_id, actor=actor) - for tag in tags: - self.delete_tag_from_agent(agent_id=agent_id, tag=tag, actor=actor) - - @enforce_types - def delete_tag_from_agent(self, agent_id: str, tag: str, actor: PydanticUser): - """Delete a tag from an agent.""" - with self.session_maker() as session: - try: - # Retrieve and delete the tag association - tag_association = AgentsTagsModel.read(db_session=session, agent_id=agent_id, tag=tag, actor=actor) - tag_association.hard_delete(session, actor=actor) - except NoResultFound: - raise ValueError(f"Tag '{tag}' not found for agent '{agent_id}'.") - - @enforce_types - def get_agents_by_tag(self, tag: str, actor: PydanticUser) -> List[str]: - """Retrieve all agent IDs associated with a specific tag.""" - with self.session_maker() as session: - # Query for all agents with the given tag - agents_with_tag = AgentsTagsModel.list(db_session=session, tag=tag, organization_id=actor.organization_id) - return [record.agent_id for record in agents_with_tag] - - @enforce_types - def get_tags_for_agent(self, agent_id: str, actor: PydanticUser) -> List[str]: - """Retrieve all tags associated with a specific agent.""" - with self.session_maker() as session: - # Query for all tags associated with the given agent - tags_for_agent = AgentsTagsModel.list(db_session=session, agent_id=agent_id, organization_id=actor.organization_id) - return [record.tag for record in tags_for_agent] diff --git a/letta/services/block_manager.py b/letta/services/block_manager.py index 65f6c79e55..77eb5e7ed2 100644 --- a/letta/services/block_manager.py +++ b/letta/services/block_manager.py @@ -7,7 +7,6 @@ from letta.schemas.block import Block as PydanticBlock from letta.schemas.block import BlockUpdate, Human, Persona from letta.schemas.user import User as PydanticUser -from letta.services.blocks_agents_manager import BlocksAgentsManager from letta.utils import enforce_types, list_human_files, list_persona_files @@ -37,33 +36,17 @@ def create_or_update_block(self, block: Block, actor: PydanticUser) -> PydanticB @enforce_types def update_block(self, block_id: str, block_update: BlockUpdate, actor: PydanticUser) -> PydanticBlock: """Update a block by its ID with the given BlockUpdate object.""" - # TODO: REMOVE THIS ONCE AGENT IS ON ORM -> Update blocks_agents - blocks_agents_manager = BlocksAgentsManager() - agent_ids = [] - if block_update.label: - agent_ids = blocks_agents_manager.list_agent_ids_with_block(block_id=block_id) - for agent_id in agent_ids: - blocks_agents_manager.remove_block_with_id_from_agent(agent_id=agent_id, block_id=block_id) + # Safety check for block with self.session_maker() as session: - # Update block block = BlockModel.read(db_session=session, identifier=block_id, actor=actor) update_data = block_update.model_dump(exclude_unset=True, exclude_none=True) + for key, value in update_data.items(): setattr(block, key, value) - try: - block.to_pydantic() - except Exception as e: - # invalid pydantic model - raise ValueError(f"Failed to create pydantic model: {e}") - block.update(db_session=session, actor=actor) - - # TODO: REMOVE THIS ONCE AGENT IS ON ORM -> Update blocks_agents - if block_update.label: - for agent_id in agent_ids: - blocks_agents_manager.add_block_to_agent(agent_id=agent_id, block_id=block_id, block_label=block_update.label) - return block.to_pydantic() + block.update(db_session=session, actor=actor) + return block.to_pydantic() @enforce_types def delete_block(self, block_id: str, actor: PydanticUser) -> PydanticBlock: @@ -111,6 +94,15 @@ def get_block_by_id(self, block_id: str, actor: Optional[PydanticUser] = None) - except NoResultFound: return None + @enforce_types + def get_all_blocks_by_ids(self, block_ids: List[str], actor: Optional[PydanticUser] = None) -> List[PydanticBlock]: + # TODO: We can do this much more efficiently by listing, instead of executing individual queries per block_id + blocks = [] + for block_id in block_ids: + block = self.get_block_by_id(block_id, actor=actor) + blocks.append(block) + return blocks + @enforce_types def add_default_blocks(self, actor: PydanticUser): for persona_file in list_persona_files(): diff --git a/letta/services/blocks_agents_manager.py b/letta/services/blocks_agents_manager.py deleted file mode 100644 index 121db58649..0000000000 --- a/letta/services/blocks_agents_manager.py +++ /dev/null @@ -1,106 +0,0 @@ -import warnings -from typing import List - -from letta.orm.blocks_agents import BlocksAgents as BlocksAgentsModel -from letta.orm.errors import NoResultFound -from letta.schemas.blocks_agents import BlocksAgents as PydanticBlocksAgents -from letta.utils import enforce_types - - -# TODO: DELETE THIS ASAP -# TODO: So we have a patch where we manually specify CRUD operations -# TODO: This is because Agent is NOT migrated to the ORM yet -# TODO: Once we migrate Agent to the ORM, we should deprecate any agents relationship table managers -class BlocksAgentsManager: - """Manager class to handle business logic related to Blocks and Agents.""" - - def __init__(self): - from letta.server.server import db_context - - self.session_maker = db_context - - @enforce_types - def add_block_to_agent(self, agent_id: str, block_id: str, block_label: str) -> PydanticBlocksAgents: - """Add a block to an agent. If the label already exists on that agent, this will error.""" - with self.session_maker() as session: - try: - # Check if the block-label combination already exists for this agent - blocks_agents_record = BlocksAgentsModel.read(db_session=session, agent_id=agent_id, block_label=block_label) - warnings.warn(f"Block label '{block_label}' already exists for agent '{agent_id}'.") - except NoResultFound: - blocks_agents_record = PydanticBlocksAgents(agent_id=agent_id, block_id=block_id, block_label=block_label) - blocks_agents_record = BlocksAgentsModel(**blocks_agents_record.model_dump(exclude_none=True)) - blocks_agents_record.create(session) - - return blocks_agents_record.to_pydantic() - - @enforce_types - def remove_block_with_label_from_agent(self, agent_id: str, block_label: str) -> PydanticBlocksAgents: - """Remove a block with a label from an agent.""" - with self.session_maker() as session: - try: - # Find and delete the block-label association for the agent - blocks_agents_record = BlocksAgentsModel.read(db_session=session, agent_id=agent_id, block_label=block_label) - blocks_agents_record.hard_delete(session) - return blocks_agents_record.to_pydantic() - except NoResultFound: - raise ValueError(f"Block label '{block_label}' not found for agent '{agent_id}'.") - - @enforce_types - def remove_block_with_id_from_agent(self, agent_id: str, block_id: str) -> PydanticBlocksAgents: - """Remove a block with a label from an agent.""" - with self.session_maker() as session: - try: - # Find and delete the block-label association for the agent - blocks_agents_record = BlocksAgentsModel.read(db_session=session, agent_id=agent_id, block_id=block_id) - blocks_agents_record.hard_delete(session) - return blocks_agents_record.to_pydantic() - except NoResultFound: - raise ValueError(f"Block id '{block_id}' not found for agent '{agent_id}'.") - - @enforce_types - def update_block_id_for_agent(self, agent_id: str, block_label: str, new_block_id: str) -> PydanticBlocksAgents: - """Update the block ID for a specific block label for an agent.""" - with self.session_maker() as session: - try: - blocks_agents_record = BlocksAgentsModel.read(db_session=session, agent_id=agent_id, block_label=block_label) - blocks_agents_record.block_id = new_block_id - return blocks_agents_record.to_pydantic() - except NoResultFound: - raise ValueError(f"Block label '{block_label}' not found for agent '{agent_id}'.") - - @enforce_types - def list_block_ids_for_agent(self, agent_id: str) -> List[str]: - """List all block ids associated with a specific agent.""" - with self.session_maker() as session: - blocks_agents_record = BlocksAgentsModel.list(db_session=session, agent_id=agent_id) - return [record.block_id for record in blocks_agents_record] - - @enforce_types - def list_block_labels_for_agent(self, agent_id: str) -> List[str]: - """List all block labels associated with a specific agent.""" - with self.session_maker() as session: - blocks_agents_record = BlocksAgentsModel.list(db_session=session, agent_id=agent_id) - return [record.block_label for record in blocks_agents_record] - - @enforce_types - def list_agent_ids_with_block(self, block_id: str) -> List[str]: - """List all agents associated with a specific block.""" - with self.session_maker() as session: - blocks_agents_record = BlocksAgentsModel.list(db_session=session, block_id=block_id) - return [record.agent_id for record in blocks_agents_record] - - @enforce_types - def get_block_id_for_label(self, agent_id: str, block_label: str) -> str: - """Get the block ID for a specific block label for an agent.""" - with self.session_maker() as session: - try: - blocks_agents_record = BlocksAgentsModel.read(db_session=session, agent_id=agent_id, block_label=block_label) - return blocks_agents_record.block_id - except NoResultFound: - raise ValueError(f"Block label '{block_label}' not found for agent '{agent_id}'.") - - @enforce_types - def remove_all_agent_blocks(self, agent_id: str): - for block_id in self.list_block_ids_for_agent(agent_id): - self.remove_block_with_id_from_agent(agent_id, block_id) diff --git a/letta/services/helpers/agent_manager_helper.py b/letta/services/helpers/agent_manager_helper.py new file mode 100644 index 0000000000..95ad26beeb --- /dev/null +++ b/letta/services/helpers/agent_manager_helper.py @@ -0,0 +1,90 @@ +from typing import List, Optional + +from letta.orm.agent import Agent as AgentModel +from letta.orm.agents_tags import AgentsTags +from letta.orm.errors import NoResultFound +from letta.prompts import gpt_system +from letta.schemas.agent import AgentType + + +# Static methods +def _process_relationship( + session, agent: AgentModel, relationship_name: str, model_class, item_ids: List[str], allow_partial=False, replace=True +): + """ + Generalized function to handle relationships like tools, sources, and blocks using item IDs. + + Args: + session: The database session. + agent: The AgentModel instance. + relationship_name: The name of the relationship attribute (e.g., 'tools', 'sources'). + model_class: The ORM class corresponding to the related items. + item_ids: List of IDs to set or update. + allow_partial: If True, allows missing items without raising errors. + replace: If True, replaces the entire relationship; otherwise, extends it. + + Raises: + ValueError: If `allow_partial` is False and some IDs are missing. + """ + current_relationship = getattr(agent, relationship_name, []) + if not item_ids: + if replace: + setattr(agent, relationship_name, []) + return + + # Retrieve models for the provided IDs + found_items = session.query(model_class).filter(model_class.id.in_(item_ids)).all() + + # Validate all items are found if allow_partial is False + if not allow_partial and len(found_items) != len(item_ids): + missing = set(item_ids) - {item.id for item in found_items} + raise NoResultFound(f"Items not found in {relationship_name}: {missing}") + + if replace: + # Replace the relationship + setattr(agent, relationship_name, found_items) + else: + # Extend the relationship (only add new items) + current_ids = {item.id for item in current_relationship} + new_items = [item for item in found_items if item.id not in current_ids] + current_relationship.extend(new_items) + + +def _process_tags(agent: AgentModel, tags: List[str], replace=True): + """ + Handles tags for an agent. + + Args: + agent: The AgentModel instance. + tags: List of tags to set or update. + replace: If True, replaces all tags; otherwise, extends them. + """ + if not tags: + if replace: + agent.tags = [] + return + + # Ensure tags are unique and prepare for replacement/extension + new_tags = {AgentsTags(agent_id=agent.id, tag=tag) for tag in set(tags)} + if replace: + agent.tags = list(new_tags) + else: + existing_tags = {t.tag for t in agent.tags} + agent.tags.extend([tag for tag in new_tags if tag.tag not in existing_tags]) + + +def derive_system_message(agent_type: AgentType, system: Optional[str] = None): + if system is None: + # TODO: don't hardcode + if agent_type == AgentType.memgpt_agent: + system = gpt_system.get_system_text("memgpt_chat") + elif agent_type == AgentType.o1_agent: + system = gpt_system.get_system_text("memgpt_modified_o1") + elif agent_type == AgentType.offline_memory_agent: + system = gpt_system.get_system_text("memgpt_offline_memory") + elif agent_type == AgentType.chat_only_agent: + system = gpt_system.get_system_text("memgpt_convo_only") + else: + raise ValueError(f"Invalid agent type: {agent_type}") + + return system diff --git a/letta/services/passage_manager.py b/letta/services/passage_manager.py index ef93b732d2..100a44335b 100644 --- a/letta/services/passage_manager.py +++ b/letta/services/passage_manager.py @@ -1,25 +1,25 @@ -from typing import List, Optional, Dict, Tuple -from letta.constants import MAX_EMBEDDING_DIM from datetime import datetime -import numpy as np +from typing import List, Optional -from letta.orm.errors import NoResultFound -from letta.utils import enforce_types +import numpy as np +from letta.constants import MAX_EMBEDDING_DIM from letta.embeddings import embedding_model, parse_and_chunk_text -from letta.schemas.embedding_config import EmbeddingConfig - +from letta.orm.errors import NoResultFound from letta.orm.passage import Passage as PassageModel -from letta.orm.sqlalchemy_base import AccessType from letta.schemas.agent import AgentState +from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.passage import Passage as PydanticPassage from letta.schemas.user import User as PydanticUser +from letta.utils import enforce_types + class PassageManager: """Manager class to handle business logic related to Passages.""" def __init__(self): from letta.server.server import db_context + self.session_maker = db_context @enforce_types @@ -43,20 +43,20 @@ def create_many_passages(self, passages: List[PydanticPassage], actor: PydanticU return [self.create_passage(p, actor) for p in passages] @enforce_types - def insert_passage(self, + def insert_passage( + self, agent_state: AgentState, agent_id: str, - text: str, - actor: PydanticUser, - return_ids: bool = False + text: str, + actor: PydanticUser, ) -> List[PydanticPassage]: - """ Insert passage(s) into archival memory """ + """Insert passage(s) into archival memory""" embedding_chunk_size = agent_state.embedding_config.embedding_chunk_size embed_model = embedding_model(agent_state.embedding_config) passages = [] - + try: # breakup string into passages for text in parse_and_chunk_text(text, embedding_chunk_size): @@ -75,12 +75,12 @@ def insert_passage(self, agent_id=agent_id, text=text, embedding=embedding, - embedding_config=agent_state.embedding_config + embedding_config=agent_state.embedding_config, ), - actor=actor + actor=actor, ) passages.append(passage) - + return passages except Exception as e: @@ -125,20 +125,21 @@ def delete_passage_by_id(self, passage_id: str, actor: PydanticUser) -> bool: raise ValueError(f"Passage with id {passage_id} not found.") @enforce_types - def list_passages(self, - actor : PydanticUser, - agent_id : Optional[str] = None, - file_id : Optional[str] = None, - cursor : Optional[str] = None, - limit : Optional[int] = 50, - query_text : Optional[str] = None, - start_date : Optional[datetime] = None, - end_date : Optional[datetime] = None, - ascending : bool = True, - source_id : Optional[str] = None, - embed_query : bool = False, - embedding_config: Optional[EmbeddingConfig] = None - ) -> List[PydanticPassage]: + def list_passages( + self, + actor: PydanticUser, + agent_id: Optional[str] = None, + file_id: Optional[str] = None, + cursor: Optional[str] = None, + limit: Optional[int] = 50, + query_text: Optional[str] = None, + start_date: Optional[datetime] = None, + end_date: Optional[datetime] = None, + ascending: bool = True, + source_id: Optional[str] = None, + embed_query: bool = False, + embedding_config: Optional[EmbeddingConfig] = None, + ) -> List[PydanticPassage]: """List passages with pagination.""" with self.session_maker() as session: filters = {"organization_id": actor.organization_id} @@ -148,7 +149,7 @@ def list_passages(self, filters["file_id"] = file_id if source_id: filters["source_id"] = source_id - + embedded_text = None if embed_query: assert embedding_config is not None @@ -161,7 +162,7 @@ def list_passages(self, embedded_text = np.pad(embedded_text, (0, MAX_EMBEDDING_DIM - embedded_text.shape[0]), mode="constant").tolist() results = PassageModel.list( - db_session=session, + db_session=session, cursor=cursor, start_date=start_date, end_date=end_date, @@ -169,17 +170,12 @@ def list_passages(self, ascending=ascending, query_text=query_text if not embedded_text else None, query_embedding=embedded_text, - **filters + **filters, ) return [p.to_pydantic() for p in results] - + @enforce_types - def size( - self, - actor : PydanticUser, - agent_id : Optional[str] = None, - **kwargs - ) -> int: + def size(self, actor: PydanticUser, agent_id: Optional[str] = None, **kwargs) -> int: """Get the total count of messages with optional filters. Args: @@ -189,28 +185,32 @@ def size( with self.session_maker() as session: return PassageModel.size(db_session=session, actor=actor, agent_id=agent_id, **kwargs) - def delete_passages(self, - actor: PydanticUser, - agent_id: Optional[str] = None, - file_id: Optional[str] = None, - start_date: Optional[datetime] = None, - end_date: Optional[datetime] = None, - limit: Optional[int] = 50, - cursor: Optional[str] = None, - query_text: Optional[str] = None, - source_id: Optional[str] = None - ) -> bool: - + def delete_passages( + self, + actor: PydanticUser, + agent_id: Optional[str] = None, + file_id: Optional[str] = None, + start_date: Optional[datetime] = None, + end_date: Optional[datetime] = None, + limit: Optional[int] = 50, + cursor: Optional[str] = None, + query_text: Optional[str] = None, + source_id: Optional[str] = None, + ) -> bool: + passages = self.list_passages( - actor=actor, - agent_id=agent_id, - file_id=file_id, - cursor=cursor, + actor=actor, + agent_id=agent_id, + file_id=file_id, + cursor=cursor, limit=limit, - start_date=start_date, - end_date=end_date, - query_text=query_text, - source_id=source_id) - + start_date=start_date, + end_date=end_date, + query_text=query_text, + source_id=source_id, + ) + + # TODO: This is very inefficient + # TODO: We should have a base `delete_all_matching_filters`-esque function for passage in passages: self.delete_passage_by_id(passage_id=passage.id, actor=actor) diff --git a/letta/services/source_manager.py b/letta/services/source_manager.py index a6745cec94..a5804347b5 100644 --- a/letta/services/source_manager.py +++ b/letta/services/source_manager.py @@ -3,6 +3,7 @@ from letta.orm.errors import NoResultFound from letta.orm.file import FileMetadata as FileMetadataModel from letta.orm.source import Source as SourceModel +from letta.schemas.agent import AgentState as PydanticAgentState from letta.schemas.file import FileMetadata as PydanticFileMetadata from letta.schemas.source import Source as PydanticSource from letta.schemas.source import SourceUpdate @@ -60,7 +61,7 @@ def delete_source(self, source_id: str, actor: PydanticUser) -> PydanticSource: """Delete a source by its ID.""" with self.session_maker() as session: source = SourceModel.read(db_session=session, identifier=source_id) - source.delete(db_session=session, actor=actor) + source.hard_delete(db_session=session, actor=actor) return source.to_pydantic() @enforce_types @@ -76,6 +77,26 @@ def list_sources(self, actor: PydanticUser, cursor: Optional[str] = None, limit: ) return [source.to_pydantic() for source in sources] + @enforce_types + def list_attached_agents(self, source_id: str, actor: Optional[PydanticUser] = None) -> List[PydanticAgentState]: + """ + Lists all agents that have the specified source attached. + + Args: + source_id: ID of the source to find attached agents for + actor: User performing the action (optional for now, following existing pattern) + + Returns: + List[PydanticAgentState]: List of agents that have this source attached + """ + with self.session_maker() as session: + # Verify source exists and user has permission to access it + source = SourceModel.read(db_session=session, identifier=source_id, actor=actor) + + # The agents relationship is already loaded due to lazy="selectin" in the Source model + # and will be properly filtered by organization_id due to the OrganizationMixin + return [agent.to_pydantic() for agent in source.agents] + # TODO: We make actor optional for now, but should most likely be enforced due to security reasons @enforce_types def get_source_by_id(self, source_id: str, actor: Optional[PydanticUser] = None) -> Optional[PydanticSource]: diff --git a/letta/services/tools_agents_manager.py b/letta/services/tools_agents_manager.py deleted file mode 100644 index 35b24e5aa8..0000000000 --- a/letta/services/tools_agents_manager.py +++ /dev/null @@ -1,94 +0,0 @@ -import warnings -from typing import List, Optional - -from sqlalchemy import select -from sqlalchemy.exc import IntegrityError -from sqlalchemy.orm import Session - -from letta.orm.errors import NoResultFound -from letta.orm.organization import Organization -from letta.orm.tool import Tool -from letta.orm.tools_agents import ToolsAgents as ToolsAgentsModel -from letta.schemas.tools_agents import ToolsAgents as PydanticToolsAgents - -class ToolsAgentsManager: - """Manages the relationship between tools and agents.""" - - def __init__(self): - from letta.server.server import db_context - self.session_maker = db_context - - def add_tool_to_agent(self, agent_id: str, tool_id: str, tool_name: str) -> PydanticToolsAgents: - """Add a tool to an agent. - - When a tool is added to an agent, it will be added to all agents in the same organization. - """ - with self.session_maker() as session: - try: - # Check if the tool-agent combination already exists for this agent - tools_agents_record = ToolsAgentsModel.read(db_session=session, agent_id=agent_id, tool_name=tool_name) - warnings.warn(f"Tool name '{tool_name}' already exists for agent '{agent_id}'.") - except NoResultFound: - tools_agents_record = PydanticToolsAgents(agent_id=agent_id, tool_id=tool_id, tool_name=tool_name) - tools_agents_record = ToolsAgentsModel(**tools_agents_record.model_dump(exclude_none=True)) - tools_agents_record.create(session) - - return tools_agents_record.to_pydantic() - - def remove_tool_with_name_from_agent(self, agent_id: str, tool_name: str) -> None: - """Remove a tool from an agent by its name. - - When a tool is removed from an agent, it will be removed from all agents in the same organization. - """ - with self.session_maker() as session: - try: - # Find and delete the tool-agent association for the agent - tools_agents_record = ToolsAgentsModel.read(db_session=session, agent_id=agent_id, tool_name=tool_name) - tools_agents_record.hard_delete(session) - return tools_agents_record.to_pydantic() - except NoResultFound: - raise ValueError(f"Tool name '{tool_name}' not found for agent '{agent_id}'.") - - def remove_tool_with_id_from_agent(self, agent_id: str, tool_id: str) -> PydanticToolsAgents: - """Remove a tool with an ID from an agent.""" - with self.session_maker() as session: - try: - tools_agents_record = ToolsAgentsModel.read(db_session=session, agent_id=agent_id, tool_id=tool_id) - tools_agents_record.hard_delete(session) - return tools_agents_record.to_pydantic() - except NoResultFound: - raise ValueError(f"Tool ID '{tool_id}' not found for agent '{agent_id}'.") - - def list_tool_ids_for_agent(self, agent_id: str) -> List[str]: - """List all tool IDs associated with a specific agent.""" - with self.session_maker() as session: - tools_agents_record = ToolsAgentsModel.list(db_session=session, agent_id=agent_id) - return [record.tool_id for record in tools_agents_record] - - def list_tool_names_for_agent(self, agent_id: str) -> List[str]: - """List all tool names associated with a specific agent.""" - with self.session_maker() as session: - tools_agents_record = ToolsAgentsModel.list(db_session=session, agent_id=agent_id) - return [record.tool_name for record in tools_agents_record] - - def list_agent_ids_with_tool(self, tool_id: str) -> List[str]: - """List all agents associated with a specific tool.""" - with self.session_maker() as session: - tools_agents_record = ToolsAgentsModel.list(db_session=session, tool_id=tool_id) - return [record.agent_id for record in tools_agents_record] - - def get_tool_id_for_name(self, agent_id: str, tool_name: str) -> str: - """Get the tool ID for a specific tool name for an agent.""" - with self.session_maker() as session: - try: - tools_agents_record = ToolsAgentsModel.read(db_session=session, agent_id=agent_id, tool_name=tool_name) - return tools_agents_record.tool_id - except NoResultFound: - raise ValueError(f"Tool name '{tool_name}' not found for agent '{agent_id}'.") - - def remove_all_agent_tools(self, agent_id: str) -> None: - """Remove all tools associated with an agent.""" - with self.session_maker() as session: - tools_agents_records = ToolsAgentsModel.list(db_session=session, agent_id=agent_id) - for record in tools_agents_records: - record.hard_delete(session) \ No newline at end of file diff --git a/letta/services/user_manager.py b/letta/services/user_manager.py index cc99ad8ca0..5dca0fff3e 100644 --- a/letta/services/user_manager.py +++ b/letta/services/user_manager.py @@ -73,12 +73,6 @@ def delete_user_by_id(self, user_id: str): user = UserModel.read(db_session=session, identifier=user_id) user.hard_delete(session) - # TODO: Integrate this via the ORM models for the Agent, Source, and AgentSourceMapping - # Cascade delete for related models: Agent, Source, AgentSourceMapping - # session.query(AgentModel).filter(AgentModel.user_id == user_id).delete() - # session.query(SourceModel).filter(SourceModel.user_id == user_id).delete() - # session.query(AgentSourceMappingModel).filter(AgentSourceMappingModel.user_id == user_id).delete() - session.commit() @enforce_types @@ -93,6 +87,17 @@ def get_default_user(self) -> PydanticUser: """Fetch the default user.""" return self.get_user_by_id(self.DEFAULT_USER_ID) + @enforce_types + def get_user_or_default(self, user_id: Optional[str] = None): + """Fetch the user or default user.""" + if not user_id: + return self.get_default_user() + + try: + return self.get_user_by_id(user_id=user_id) + except NoResultFound: + return self.get_default_user() + @enforce_types def list_users(self, cursor: Optional[str] = None, limit: Optional[int] = 50) -> Tuple[Optional[str], List[PydanticUser]]: """List users with pagination using cursor (id) and limit.""" diff --git a/letta/utils.py b/letta/utils.py index ad6668857a..7184a0e338 100644 --- a/letta/utils.py +++ b/letta/utils.py @@ -548,13 +548,13 @@ def matches_type(value, hint): for arg_name, arg_value in args_with_hints.items(): hint = hints.get(arg_name) if hint and not matches_type(arg_value, hint): - raise ValueError(f"Argument {arg_name} does not match type {hint}") + raise ValueError(f"Argument {arg_name} does not match type {hint}; is {arg_value}") # Check types of keyword arguments for arg_name, arg_value in kwargs.items(): hint = hints.get(arg_name) if hint and not matches_type(arg_value, hint): - raise ValueError(f"Argument {arg_name} does not match type {hint}") + raise ValueError(f"Argument {arg_name} does not match type {hint}; is {arg_value}") return func(*args, **kwargs) diff --git a/locust_test.py b/locust_test.py index 1e74d405ab..570e6eef47 100644 --- a/locust_test.py +++ b/locust_test.py @@ -4,7 +4,7 @@ from locust import HttpUser, between, task from letta.constants import BASE_TOOLS, DEFAULT_HUMAN, DEFAULT_PERSONA -from letta.schemas.agent import CreateAgent, PersistedAgentState +from letta.schemas.agent import AgentState, CreateAgent from letta.schemas.letta_request import LettaRequest from letta.schemas.letta_response import LettaResponse from letta.schemas.memory import ChatMemory @@ -49,7 +49,7 @@ def on_start(self): response.failure(f"Failed to create agent: {response.text}") response_json = response.json() - agent_state = PersistedAgentState(**response_json) + agent_state = AgentState(**response_json) self.agent_id = agent_state.id print("Created agent", self.agent_id, agent_state.name) diff --git a/scripts/migrate_0.3.18.py b/scripts/migrate_0.3.18.py deleted file mode 100644 index 3464ea1210..0000000000 --- a/scripts/migrate_0.3.18.py +++ /dev/null @@ -1,90 +0,0 @@ -import os -import uuid - -from sqlalchemy import MetaData, Table, create_engine - -from letta import create_client -from letta.config import LettaConfig -from letta.data_types import AgentState, EmbeddingConfig, LLMConfig -from letta.metadata import MetadataStore -from letta.presets.presets import add_default_tools -from letta.prompts import gpt_system - -# Replace this with your actual database connection URL -config = LettaConfig.load() -if config.recall_storage_type == "sqlite": - DATABASE_URL = "sqlite:///" + os.path.join(config.recall_storage_path, "sqlite.db") -else: - DATABASE_URL = config.recall_storage_uri -print(DATABASE_URL) -engine = create_engine(DATABASE_URL) -metadata = MetaData() - -# defaults -system_prompt = gpt_system.get_system_text("memgpt_chat") - -# Reflect the existing table -table = Table("agents", metadata, autoload_with=engine) - - -# get all agent rows -agent_states = [] -with engine.connect() as conn: - agents = conn.execute(table.select()).fetchall() - for agent in agents: - id = uuid.UUID(agent[0]) - user_id = uuid.UUID(agent[1]) - name = agent[2] - print(f"Migrating agent {name}") - persona = agent[3] - human = agent[4] - system = agent[5] - preset = agent[6] - created_at = agent[7] - llm_config = LLMConfig(**agent[8]) - embedding_config = EmbeddingConfig(**agent[9]) - state = agent[10] - tools = agent[11] - - state["memory"] = {"human": {"value": human, "limit": 2000}, "persona": {"value": persona, "limit": 2000}} - - agent_state = AgentState( - id=id, - user_id=user_id, - name=name, - system=system, - created_at=created_at, - llm_config=llm_config, - embedding_config=embedding_config, - state=state, - tools=tools, - _metadata={"human": "migrated", "persona": "migrated"}, - ) - - agent_states.append(agent_state) - -# remove agents table -agents_model = Table("agents", metadata, autoload_with=engine) -agents_model.drop(engine) - -# remove tool table -tool_model = Table("toolmodel", metadata, autoload_with=engine) -tool_model.drop(engine) - -# re-create tables and add default tools -ms = MetadataStore(config) -add_default_tools(None, ms) -print("Tools", [tool.name for tool in ms.list_tools()]) - - -for agent in agent_states: - ms.create_agent(agent) - print(f"Agent {agent.name} migrated successfully!") - -# add another agent to create core memory tool -client = create_client() -dummy_agent = client.create_agent(name="dummy_agent") -tools = client.list_tools() -assert "core_memory_append" in [tool.name for tool in tools] - -print("Migration completed successfully!") diff --git a/tests/conftest.py b/tests/conftest.py index 899a74af38..17ae8ef9c0 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2,8 +2,6 @@ import pytest -from letta.settings import tool_settings - def pytest_configure(config): logging.basicConfig(level=logging.DEBUG) @@ -11,6 +9,8 @@ def pytest_configure(config): @pytest.fixture def mock_e2b_api_key_none(): + from letta.settings import tool_settings + # Store the original value of e2b_api_key original_api_key = tool_settings.e2b_api_key diff --git a/tests/helpers/endpoints_helper.py b/tests/helpers/endpoints_helper.py index 47424572a1..fbe7ffb60b 100644 --- a/tests/helpers/endpoints_helper.py +++ b/tests/helpers/endpoints_helper.py @@ -61,7 +61,7 @@ def setup_agent( filename: str, memory_human_str: str = get_human_text(DEFAULT_HUMAN), memory_persona_str: str = get_persona_text(DEFAULT_PERSONA), - tools: Optional[List[str]] = None, + tool_ids: Optional[List[str]] = None, tool_rules: Optional[List[BaseToolRule]] = None, agent_uuid: str = agent_uuid, ) -> AgentState: @@ -77,7 +77,7 @@ def setup_agent( memory = ChatMemory(human=memory_human_str, persona=memory_persona_str) agent_state = client.create_agent( - name=agent_uuid, llm_config=llm_config, embedding_config=embedding_config, memory=memory, tools=tools, tool_rules=tool_rules + name=agent_uuid, llm_config=llm_config, embedding_config=embedding_config, memory=memory, tool_ids=tool_ids, tool_rules=tool_rules ) return agent_state @@ -103,7 +103,6 @@ def check_first_response_is_valid_for_llm_endpoint(filename: str) -> ChatComplet cleanup(client=client, agent_uuid=agent_uuid) agent_state = setup_agent(client, filename) - tools = [client.get_tool(client.get_tool_id(name=name)) for name in agent_state.tool_names] full_agent_state = client.get_agent(agent_state.id) agent = Agent(agent_state=full_agent_state, interface=None, user=client.user) @@ -171,19 +170,18 @@ def check_agent_uses_external_tool(filename: str) -> LettaResponse: client = create_client() cleanup(client=client, agent_uuid=agent_uuid) tool = client.load_composio_tool(action=Action.GITHUB_STAR_A_REPOSITORY_FOR_THE_AUTHENTICATED_USER) - tool_name = tool.name # Set up persona for tool usage persona = f""" My name is Letta. - I am a personal assistant who answers a user's questions about a website `example.com`. When a user asks me a question about `example.com`, I will use a tool called {tool_name} which will search `example.com` and answer the relevant question. + I am a personal assistant who answers a user's questions about a website `example.com`. When a user asks me a question about `example.com`, I will use a tool called {tool.name} which will search `example.com` and answer the relevant question. Don’t forget - inner monologue / inner thoughts should always be different than the contents of send_message! send_message is how you communicate with the user, whereas inner thoughts are your own personal inner thoughts. """ - agent_state = setup_agent(client, filename, memory_persona_str=persona, tools=[tool_name]) + agent_state = setup_agent(client, filename, memory_persona_str=persona, tool_ids=[tool.id]) response = client.user_message(agent_id=agent_state.id, message="What's on the example.com website?") @@ -191,7 +189,7 @@ def check_agent_uses_external_tool(filename: str) -> LettaResponse: assert_sanity_checks(response) # Make sure the tool was called - assert_invoked_function_call(response.messages, tool_name) + assert_invoked_function_call(response.messages, tool.name) # Make sure some inner monologue is present assert_inner_monologue_is_present_and_valid(response.messages) @@ -334,7 +332,7 @@ def check_agent_summarize_memory_simple(filename: str) -> LettaResponse: client.user_message(agent_id=agent_state.id, message="Does the number 42 ring a bell?") # Summarize - agent = client.server.load_agent(agent_id=agent_state.id) + agent = client.server.load_agent(agent_id=agent_state.id, actor=client.user) agent.summarize_messages_inplace() print(f"Summarization succeeded: messages[1] = \n\n{json_dumps(agent.messages[1])}\n") diff --git a/tests/helpers/utils.py b/tests/helpers/utils.py index 4269fdd8c6..803fc98c76 100644 --- a/tests/helpers/utils.py +++ b/tests/helpers/utils.py @@ -3,6 +3,7 @@ from letta import LocalClient, RESTClient from letta.functions.functions import parse_source_code from letta.functions.schema_generator import generate_schema +from letta.schemas.agent import AgentState, CreateAgent, UpdateAgent from letta.schemas.tool import Tool @@ -24,3 +25,57 @@ def create_tool_from_func(func: callable): source_code=parse_source_code(func), json_schema=generate_schema(func, None), ) + + +def comprehensive_agent_checks(agent: AgentState, request: Union[CreateAgent, UpdateAgent]): + # Assert scalar fields + assert agent.system == request.system, f"System prompt mismatch: {agent.system} != {request.system}" + assert agent.description == request.description, f"Description mismatch: {agent.description} != {request.description}" + assert agent.metadata_ == request.metadata_, f"Metadata mismatch: {agent.metadata_} != {request.metadata_}" + + # Assert agent type + if hasattr(request, "agent_type"): + assert agent.agent_type == request.agent_type, f"Agent type mismatch: {agent.agent_type} != {request.agent_type}" + + # Assert LLM configuration + assert agent.llm_config == request.llm_config, f"LLM config mismatch: {agent.llm_config} != {request.llm_config}" + + # Assert embedding configuration + assert ( + agent.embedding_config == request.embedding_config + ), f"Embedding config mismatch: {agent.embedding_config} != {request.embedding_config}" + + # Assert memory blocks + if hasattr(request, "memory_blocks"): + assert len(agent.memory.blocks) == len(request.memory_blocks) + len( + request.block_ids + ), f"Memory blocks count mismatch: {len(agent.memory.blocks)} != {len(request.memory_blocks) + len(request.block_ids)}" + memory_block_values = {block.value for block in agent.memory.blocks} + expected_block_values = {block.value for block in request.memory_blocks} + assert expected_block_values.issubset( + memory_block_values + ), f"Memory blocks mismatch: {expected_block_values} not in {memory_block_values}" + + # Assert tools + assert len(agent.tools) == len(request.tool_ids), f"Tools count mismatch: {len(agent.tools)} != {len(request.tool_ids)}" + assert {tool.id for tool in agent.tools} == set( + request.tool_ids + ), f"Tools mismatch: {set(tool.id for tool in agent.tools)} != {set(request.tool_ids)}" + + # Assert sources + assert len(agent.sources) == len(request.source_ids), f"Sources count mismatch: {len(agent.sources)} != {len(request.source_ids)}" + assert {source.id for source in agent.sources} == set( + request.source_ids + ), f"Sources mismatch: {set(source.id for source in agent.sources)} != {set(request.source_ids)}" + + # Assert tags + assert set(agent.tags) == set(request.tags), f"Tags mismatch: {set(agent.tags)} != {set(request.tags)}" + + # Assert tool rules + if request.tool_rules: + assert len(agent.tool_rules) == len( + request.tool_rules + ), f"Tool rules count mismatch: {len(agent.tool_rules)} != {len(request.tool_rules)}" + assert all( + any(rule.tool_name == req_rule.tool_name for rule in agent.tool_rules) for req_rule in request.tool_rules + ), f"Tool rules mismatch: {agent.tool_rules} != {request.tool_rules}" diff --git a/tests/test_agent_tool_graph.py b/tests/integration_test_agent_tool_graph.py similarity index 98% rename from tests/test_agent_tool_graph.py rename to tests/integration_test_agent_tool_graph.py index 7774977c75..ff8700c1c3 100644 --- a/tests/test_agent_tool_graph.py +++ b/tests/integration_test_agent_tool_graph.py @@ -99,7 +99,7 @@ def test_single_path_agent_tool_call_graph(mock_e2b_api_key_none): ] # Make agent state - agent_state = setup_agent(client, config_file, agent_uuid=agent_uuid, tools=[t.name for t in tools], tool_rules=tool_rules) + agent_state = setup_agent(client, config_file, agent_uuid=agent_uuid, tool_ids=[t.id for t in tools], tool_rules=tool_rules) response = client.user_message(agent_id=agent_state.id, message="What is the fourth secret word?") # Make checks diff --git a/tests/test_o1_agent.py b/tests/integration_test_o1_agent.py similarity index 95% rename from tests/test_o1_agent.py rename to tests/integration_test_o1_agent.py index 86212ffc12..6c8c62a1fc 100644 --- a/tests/test_o1_agent.py +++ b/tests/integration_test_o1_agent.py @@ -17,7 +17,7 @@ def test_o1_agent(): agent_state = client.create_agent( agent_type=AgentType.o1_agent, - tools=[thinking_tool.name, final_tool.name], + tool_ids=[thinking_tool.id, final_tool.id], llm_config=LLMConfig.default_config("gpt-4"), embedding_config=EmbeddingConfig.default_config("text-embedding-ada-002"), memory=ChatMemory(human=get_human_text(DEFAULT_HUMAN), persona=get_persona_text("o1_persona")), diff --git a/tests/test_offline_memory_agent.py b/tests/integration_test_offline_memory_agent.py similarity index 92% rename from tests/test_offline_memory_agent.py rename to tests/integration_test_offline_memory_agent.py index ff3aca5cfa..8a4fb81c54 100644 --- a/tests/test_offline_memory_agent.py +++ b/tests/integration_test_offline_memory_agent.py @@ -32,8 +32,10 @@ def clear_agents(client): for agent in client.list_agents(): client.delete_agent(agent.id) + def test_ripple_edit(client, mock_e2b_api_key_none): trigger_rethink_memory_tool = client.create_or_update_tool(trigger_rethink_memory) + send_message = client.server.tool_manager.get_tool_by_name(tool_name="send_message", actor=client.user) conversation_human_block = Block(name="human", label="human", value=get_human_text(DEFAULT_HUMAN), limit=2000) conversation_persona_block = Block(name="persona", label="persona", value=get_persona_text(DEFAULT_PERSONA), limit=2000) @@ -64,7 +66,7 @@ def test_ripple_edit(client, mock_e2b_api_key_none): system=gpt_system.get_system_text("memgpt_convo_only"), llm_config=LLMConfig.default_config("gpt-4"), embedding_config=EmbeddingConfig.default_config("text-embedding-ada-002"), - tools=["send_message", trigger_rethink_memory_tool.name], + tool_ids=[send_message.id, trigger_rethink_memory_tool.id], memory=conversation_memory, include_base_tools=False, ) @@ -81,7 +83,7 @@ def test_ripple_edit(client, mock_e2b_api_key_none): memory=offline_memory, llm_config=LLMConfig.default_config("gpt-4"), embedding_config=EmbeddingConfig.default_config("text-embedding-ada-002"), - tools=[rethink_memory_tool.name, finish_rethinking_memory_tool.name], + tool_ids=[rethink_memory_tool.id, finish_rethinking_memory_tool.id], tool_rules=[TerminalToolRule(tool_name=finish_rethinking_memory_tool.name)], include_base_tools=False, ) @@ -111,16 +113,16 @@ def test_chat_only_agent(client, mock_e2b_api_key_none): ) conversation_memory = BasicBlockMemory(blocks=[conversation_persona_block, conversation_human_block]) - client = create_client() + send_message = client.server.tool_manager.get_tool_by_name(tool_name="send_message", actor=client.user) chat_only_agent = client.create_agent( name="conversation_agent", agent_type=AgentType.chat_only_agent, llm_config=LLMConfig.default_config("gpt-4"), embedding_config=EmbeddingConfig.default_config("text-embedding-ada-002"), - tools=["send_message"], + tool_ids=[send_message.id], memory=conversation_memory, include_base_tools=False, - metadata={"offline_memory_tools": [rethink_memory.name, finish_rethinking_memory.name]}, + metadata={"offline_memory_tools": [rethink_memory.id, finish_rethinking_memory.id]}, ) assert chat_only_agent is not None assert set(chat_only_agent.memory.list_block_labels()) == {"chat_agent_persona", "chat_agent_human"} @@ -135,6 +137,7 @@ def test_chat_only_agent(client, mock_e2b_api_key_none): # Clean up agent client.delete_agent(chat_only_agent.id) + def test_initial_message_sequence(client, mock_e2b_api_key_none): """ Test that when we set the initial sequence to an empty list, @@ -150,8 +153,6 @@ def test_initial_message_sequence(client, mock_e2b_api_key_none): initial_message_sequence=[], ) assert offline_memory_agent is not None - assert len(offline_memory_agent.message_ids) == 1 # There should just the system message + assert len(offline_memory_agent.message_ids) == 1 # There should just the system message client.delete_agent(offline_memory_agent.id) - - diff --git a/tests/test_autogen_integration.py b/tests/test_autogen_integration.py deleted file mode 100644 index 251f7590c0..0000000000 --- a/tests/test_autogen_integration.py +++ /dev/null @@ -1,41 +0,0 @@ -# TODO: add back - -# import os -# import subprocess -# -# import pytest -# -# -# @pytest.mark.skipif(not os.getenv("OPENAI_API_KEY"), reason="Missing OpenAI API key") -# def test_agent_groupchat(): -# -# # Define the path to the script you want to test -# script_path = "letta/autogen/examples/agent_groupchat.py" -# -# # Dynamically get the project's root directory (assuming this script is run from the root) -# # project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")) -# # print(project_root) -# # project_root = os.path.join(project_root, "Letta") -# # print(project_root) -# # sys.exit(1) -# -# project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) -# project_root = os.path.join(project_root, "letta") -# print(f"Adding the following to PATH: {project_root}") -# -# # Prepare the environment, adding the project root to PYTHONPATH -# env = os.environ.copy() -# env["PYTHONPATH"] = f"{project_root}:{env.get('PYTHONPATH', '')}" -# -# # Run the script using subprocess.run -# # Capture the output (stdout) and the exit code -# # result = subprocess.run(["python", script_path], capture_output=True, text=True) -# result = subprocess.run(["poetry", "run", "python", script_path], capture_output=True, text=True) -# -# # Check the exit code (0 indicates success) -# assert result.returncode == 0, f"Script exited with code {result.returncode}: {result.stderr}" -# -# # Optionally, check the output for expected content -# # For example, if you expect a specific line in the output, uncomment and adapt the following line: -# # assert "expected output" in result.stdout, "Expected output not found in script's output" -# diff --git a/tests/test_base_functions.py b/tests/test_base_functions.py index 199800eb0c..8144671969 100644 --- a/tests/test_base_functions.py +++ b/tests/test_base_functions.py @@ -23,7 +23,7 @@ def agent_obj(): agent_state = client.create_agent() global agent_obj - agent_obj = client.server.load_agent(agent_id=agent_state.id) + agent_obj = client.server.load_agent(agent_id=agent_state.id, actor=client.user) yield agent_obj client.delete_agent(agent_obj.agent_state.id) @@ -35,49 +35,50 @@ def query_in_search_results(search_results, query): return True return False + def test_archival(agent_obj): """Test archival memory functions comprehensively.""" # Test 1: Basic insertion and retrieval base_functions.archival_memory_insert(agent_obj, "The cat sleeps on the mat") base_functions.archival_memory_insert(agent_obj, "The dog plays in the park") base_functions.archival_memory_insert(agent_obj, "Python is a programming language") - + # Test exact text search results, _ = base_functions.archival_memory_search(agent_obj, "cat") assert query_in_search_results(results, "cat") - + # Test semantic search (should return animal-related content) results, _ = base_functions.archival_memory_search(agent_obj, "animal pets") assert query_in_search_results(results, "cat") or query_in_search_results(results, "dog") - + # Test unrelated search (should not return animal content) results, _ = base_functions.archival_memory_search(agent_obj, "programming computers") assert query_in_search_results(results, "python") - + # Test 2: Test pagination # Insert more items to test pagination for i in range(10): base_functions.archival_memory_insert(agent_obj, f"Test passage number {i}") - + # Get first page page0_results, next_page = base_functions.archival_memory_search(agent_obj, "Test passage", page=0) # Get second page page1_results, _ = base_functions.archival_memory_search(agent_obj, "Test passage", page=1, start=next_page) - + assert page0_results != page1_results assert query_in_search_results(page0_results, "Test passage") assert query_in_search_results(page1_results, "Test passage") - + # Test 3: Test complex text patterns base_functions.archival_memory_insert(agent_obj, "Important meeting on 2024-01-15 with John") base_functions.archival_memory_insert(agent_obj, "Follow-up meeting scheduled for next week") base_functions.archival_memory_insert(agent_obj, "Project deadline is approaching") - + # Search for meeting-related content results, _ = base_functions.archival_memory_search(agent_obj, "meeting schedule") assert query_in_search_results(results, "meeting") assert query_in_search_results(results, "2024-01-15") or query_in_search_results(results, "next week") - + # Test 4: Test error handling # Test invalid page number try: @@ -85,7 +86,7 @@ def test_archival(agent_obj): assert False, "Should have raised ValueError" except ValueError: pass - + def test_recall(agent_obj): base_functions.conversation_search(agent_obj, "banana") diff --git a/tests/test_client.py b/tests/test_client.py index 2c92ef9501..526559b798 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -1,5 +1,4 @@ import asyncio -import json import os import threading import time @@ -42,8 +41,8 @@ def run_server(): @pytest.fixture( - # params=[{"server": False}, {"server": True}], # whether to use REST API server - params=[{"server": False}], # whether to use REST API server + params=[{"server": False}, {"server": True}], # whether to use REST API server + # params=[{"server": True}], # whether to use REST API server scope="module", ) def client(request): @@ -69,6 +68,7 @@ def client(request): @pytest.fixture(scope="module") def agent(client: Union[LocalClient, RESTClient]): agent_state = client.create_agent(name=f"test_client_{str(uuid.uuid4())}") + yield agent_state # delete agent @@ -86,6 +86,47 @@ def clear_tables(): session.commit() +def test_shared_blocks(mock_e2b_api_key_none, client: Union[LocalClient, RESTClient]): + # _reset_config() + + # create a block + block = client.create_block(label="human", value="username: sarah") + + # create agents with shared block + from letta.schemas.block import Block + from letta.schemas.memory import BasicBlockMemory + + # persona1_block = client.create_block(label="persona", value="you are agent 1") + # persona2_block = client.create_block(label="persona", value="you are agent 2") + # create agents + agent_state1 = client.create_agent( + name="agent1", memory=BasicBlockMemory([Block(label="persona", value="you are agent 1")]), block_ids=[block.id] + ) + agent_state2 = client.create_agent( + name="agent2", memory=BasicBlockMemory([Block(label="persona", value="you are agent 2")]), block_ids=[block.id] + ) + + ## attach shared block to both agents + # client.link_agent_memory_block(agent_state1.id, block.id) + # client.link_agent_memory_block(agent_state2.id, block.id) + + # update memory + client.user_message(agent_id=agent_state1.id, message="my name is actually charles") + + # check agent 2 memory + assert "charles" in client.get_block(block.id).value.lower(), f"Shared block update failed {client.get_block(block.id).value}" + + client.user_message(agent_id=agent_state2.id, message="whats my name?") + assert ( + "charles" in client.get_core_memory(agent_state2.id).get_block("human").value.lower() + ), f"Shared block update failed {client.get_core_memory(agent_state2.id).get_block('human').value}" + # assert "charles" in response.messages[1].text.lower(), f"Shared block update failed {response.messages[0].text}" + + # cleanup + client.delete_agent(agent_state1.id) + client.delete_agent(agent_state2.id) + + def test_sandbox_config_and_env_var_basic(client: Union[LocalClient, RESTClient]): """ Test sandbox config and environment variable functions for both LocalClient and RESTClient. @@ -137,15 +178,15 @@ def test_sandbox_config_and_env_var_basic(client: Union[LocalClient, RESTClient] client.delete_sandbox_config(sandbox_config_id=sandbox_config.id) -def test_add_and_manage_tags_for_agent(client: Union[LocalClient, RESTClient], agent: AgentState): +def test_add_and_manage_tags_for_agent(client: Union[LocalClient, RESTClient]): """ Comprehensive happy path test for adding, retrieving, and managing tags on an agent. """ tags_to_add = ["test_tag_1", "test_tag_2", "test_tag_3"] - # Step 0: create an agent with tags - tagged_agent = client.create_agent(tags=tags_to_add) - assert set(tagged_agent.tags) == set(tags_to_add), f"Expected tags {tags_to_add}, but got {tagged_agent.tags}" + # Step 0: create an agent with no tags + agent = client.create_agent() + assert len(agent.tags) == 0 # Step 1: Add multiple tags to the agent client.update_agent(agent_id=agent.id, tags=tags_to_add) @@ -175,6 +216,9 @@ def test_add_and_manage_tags_for_agent(client: Union[LocalClient, RESTClient], a final_tags = client.get_agent(agent_id=agent.id).tags assert len(final_tags) == 0, f"Expected no tags, but found {final_tags}" + # Remove agent + client.delete_agent(agent.id) + def test_update_agent_memory_label(client: Union[LocalClient, RESTClient], agent: AgentState): """Test that we can update the label of a block in an agent's memory""" @@ -255,35 +299,33 @@ def test_add_remove_agent_memory_block(client: Union[LocalClient, RESTClient], a # client.delete_agent(new_agent.id) -def test_update_agent_memory_limit(client: Union[LocalClient, RESTClient], agent: AgentState): +def test_update_agent_memory_limit(client: Union[LocalClient, RESTClient]): """Test that we can update the limit of a block in an agent's memory""" - agent = client.create_agent(name=create_random_username()) - - try: - current_labels = agent.memory.list_block_labels() - example_label = current_labels[0] - example_new_limit = 1 - current_block = agent.memory.get_block(label=example_label) - current_block_length = len(current_block.value) + agent = client.create_agent() - assert example_new_limit != agent.memory.get_block(label=example_label).limit - assert example_new_limit < current_block_length + current_labels = agent.memory.list_block_labels() + example_label = current_labels[0] + example_new_limit = 1 + current_block = agent.memory.get_block(label=example_label) + current_block_length = len(current_block.value) - # We expect this to throw a value error - with pytest.raises(ValueError): - client.update_agent_memory_block(agent_id=agent.id, label=example_label, limit=example_new_limit) + assert example_new_limit != agent.memory.get_block(label=example_label).limit + assert example_new_limit < current_block_length - # Now try the same thing with a higher limit - example_new_limit = current_block_length + 10000 - assert example_new_limit > current_block_length + # We expect this to throw a value error + with pytest.raises(ValueError): client.update_agent_memory_block(agent_id=agent.id, label=example_label, limit=example_new_limit) - updated_agent = client.get_agent(agent_id=agent.id) - assert example_new_limit == updated_agent.memory.get_block(label=example_label).limit + # Now try the same thing with a higher limit + example_new_limit = current_block_length + 10000 + assert example_new_limit > current_block_length + client.update_agent_memory_block(agent_id=agent.id, label=example_label, limit=example_new_limit) - finally: - client.delete_agent(agent.id) + updated_agent = client.get_agent(agent_id=agent.id) + assert example_new_limit == updated_agent.memory.get_block(label=example_label).limit + + client.delete_agent(agent.id) def test_messages(client: Union[LocalClient, RESTClient], agent: AgentState): @@ -316,7 +358,7 @@ def big_return(): padding = len("[NOTE: function output was truncated since it exceeded the character limit (100000 > 1000)]") + 50 tool = client.create_or_update_tool(func=big_return, return_char_limit=1000) - agent = client.create_agent(name="agent1", tools=[tool.name]) + agent = client.create_agent(tool_ids=[tool.id]) # get function response response = client.send_message(agent_id=agent.id, message="call the big_return function", role="user") print(response.messages) @@ -330,10 +372,14 @@ def big_return(): assert response_message, "FunctionReturn message not found in response" res = response_message.function_return assert "function output was truncated " in res - res_json = json.loads(res) - assert ( - len(res_json["message"]) <= 1000 + padding - ), f"Expected length to be less than or equal to 1000 + {padding}, but got {len(res_json['message'])}" + + # TODO: Re-enable later + # res_json = json.loads(res) + # assert ( + # len(res_json["message"]) <= 1000 + padding + # ), f"Expected length to be less than or equal to 1000 + {padding}, but got {len(res_json['message'])}" + + client.delete_agent(agent_id=agent.id) @pytest.mark.asyncio diff --git a/tests/test_client_legacy.py b/tests/test_client_legacy.py index 2ee9229337..3839611bbe 100644 --- a/tests/test_client_legacy.py +++ b/tests/test_client_legacy.py @@ -583,43 +583,6 @@ def has_model_endpoint_type(models: List["LLMConfig"], target_type: str) -> bool assert has_model_endpoint_type(models, "anthropic") -def test_shared_blocks(mock_e2b_api_key_none, client: Union[LocalClient, RESTClient], agent: AgentState): - # _reset_config() - - # create a block - block = client.create_block(label="human", value="username: sarah") - - # create agents with shared block - from letta.schemas.block import Block - from letta.schemas.memory import BasicBlockMemory - - # persona1_block = client.create_block(label="persona", value="you are agent 1") - # persona2_block = client.create_block(label="persona", value="you are agent 2") - # create agnets - agent_state1 = client.create_agent(name="agent1", memory=BasicBlockMemory([Block(label="persona", value="you are agent 1"), block])) - agent_state2 = client.create_agent(name="agent2", memory=BasicBlockMemory([Block(label="persona", value="you are agent 2"), block])) - - ## attach shared block to both agents - # client.link_agent_memory_block(agent_state1.id, block.id) - # client.link_agent_memory_block(agent_state2.id, block.id) - - # update memory - response = client.user_message(agent_id=agent_state1.id, message="my name is actually charles") - - # check agent 2 memory - assert "charles" in client.get_block(block.id).value.lower(), f"Shared block update failed {client.get_block(block.id).value}" - - response = client.user_message(agent_id=agent_state2.id, message="whats my name?") - assert ( - "charles" in client.get_core_memory(agent_state2.id).get_block("human").value.lower() - ), f"Shared block update failed {client.get_core_memory(agent_state2.id).get_block('human').value}" - # assert "charles" in response.messages[1].text.lower(), f"Shared block update failed {response.messages[0].text}" - - # cleanup - client.delete_agent(agent_state1.id) - client.delete_agent(agent_state2.id) - - @pytest.fixture def cleanup_agents(client): created_agents = [] diff --git a/tests/test_concurrent_connections.py b/tests/test_concurrent_connections.py deleted file mode 100644 index c3b4f8dfc2..0000000000 --- a/tests/test_concurrent_connections.py +++ /dev/null @@ -1,142 +0,0 @@ -# TODO: add back when messaging works - -# import os -# import threading -# import time -# import uuid -# -# import pytest -# from dotenv import load_dotenv -# -# from letta import Admin, create_client -# from letta.config import LettaConfig -# from letta.credentials import LettaCredentials -# from letta.settings import settings -# from tests.utils import create_config -# -# test_agent_name = f"test_client_{str(uuid.uuid4())}" -## test_preset_name = "test_preset" -# test_agent_state = None -# client = None -# -# test_agent_state_post_message = None -# test_user_id = uuid.uuid4() -# -# -## admin credentials -# test_server_token = "test_server_token" -# -# -# def _reset_config(): -# -# # Use os.getenv with a fallback to os.environ.get -# db_url = settings.letta_pg_uri -# -# if os.getenv("OPENAI_API_KEY"): -# create_config("openai") -# credentials = LettaCredentials( -# openai_key=os.getenv("OPENAI_API_KEY"), -# ) -# else: # hosted -# create_config("letta_hosted") -# credentials = LettaCredentials() -# -# config = LettaConfig.load() -# -# # set to use postgres -# config.archival_storage_uri = db_url -# config.recall_storage_uri = db_url -# config.metadata_storage_uri = db_url -# config.archival_storage_type = "postgres" -# config.recall_storage_type = "postgres" -# config.metadata_storage_type = "postgres" -# -# config.save() -# credentials.save() -# print("_reset_config :: ", config.config_path) -# -# -# def run_server(): -# -# load_dotenv() -# -# _reset_config() -# -# from letta.server.rest_api.server import start_server -# -# print("Starting server...") -# start_server(debug=True) -# -# -## Fixture to create clients with different configurations -# @pytest.fixture( -# params=[ # whether to use REST API server -# {"server": True}, -# # {"server": False} # TODO: add when implemented -# ], -# scope="module", -# ) -# def admin_client(request): -# if request.param["server"]: -# # get URL from enviornment -# server_url = os.getenv("MEMGPT_SERVER_URL") -# if server_url is None: -# # run server in thread -# # NOTE: must set MEMGPT_SERVER_PASS enviornment variable -# server_url = "http://localhost:8283" -# print("Starting server thread") -# thread = threading.Thread(target=run_server, daemon=True) -# thread.start() -# time.sleep(5) -# print("Running client tests with server:", server_url) -# # create user via admin client -# admin = Admin(server_url, test_server_token) -# response = admin.create_user(test_user_id) # Adjust as per your client's method -# -# yield admin -# -# -# def test_concurrent_messages(admin_client): -# # test concurrent messages -# -# # create three -# -# results = [] -# -# def _send_message(): -# try: -# print("START SEND MESSAGE") -# response = admin_client.create_user() -# token = response.api_key -# client = create_client(base_url=admin_client.base_url, token=token) -# agent = client.create_agent() -# -# print("Agent created", agent.id) -# -# st = time.time() -# message = "Hello, how are you?" -# response = client.send_message(agent_id=agent.id, message=message, role="user") -# et = time.time() -# print(f"Message sent from {st} to {et}") -# print(response.messages) -# results.append((st, et)) -# except Exception as e: -# print("ERROR", e) -# -# threads = [] -# print("Starting threads...") -# for i in range(5): -# thread = threading.Thread(target=_send_message) -# threads.append(thread) -# thread.start() -# print("CREATED THREAD") -# -# print("waiting for threads to finish...") -# for thread in threads: -# print(thread.join()) -# -# # make sure runtime are overlapping -# assert (results[0][0] < results[1][0] and results[0][1] > results[1][0]) or ( -# results[1][0] < results[0][0] and results[1][1] > results[0][0] -# ), f"Threads should have overlapping runtimes {results}" -# diff --git a/tests/test_different_embedding_size.py b/tests/test_different_embedding_size.py deleted file mode 100644 index 58748339e1..0000000000 --- a/tests/test_different_embedding_size.py +++ /dev/null @@ -1,121 +0,0 @@ -# TODO: add back once tests are cleaned up - -# import os -# import uuid -# -# from letta import create_client -# from letta.agent_store.storage import StorageConnector, TableType -# from letta.schemas.passage import Passage -# from letta.embeddings import embedding_model -# from tests import TEST_MEMGPT_CONFIG -# -# from .utils import create_config, wipe_config -# -# test_agent_name = f"test_client_{str(uuid.uuid4())}" -# test_agent_state = None -# client = None -# -# test_agent_state_post_message = None -# test_user_id = uuid.uuid4() -# -# -# def generate_passages(user, agent): -# # Note: the database will filter out rows that do not correspond to agent1 and test_user by default. -# texts = [ -# "This is a test passage", -# "This is another test passage", -# "Cinderella wept", -# ] -# embed_model = embedding_model(agent.embedding_config) -# orig_embeddings = [] -# passages = [] -# for text in texts: -# embedding = embed_model.get_text_embedding(text) -# orig_embeddings.append(list(embedding)) -# passages.append( -# Passage( -# user_id=user.id, -# agent_id=agent.id, -# text=text, -# embedding=embedding, -# embedding_dim=agent.embedding_config.embedding_dim, -# embedding_model=agent.embedding_config.embedding_model, -# ) -# ) -# return passages, orig_embeddings -# -# -# def test_create_user(): -# if not os.getenv("OPENAI_API_KEY"): -# print("Skipping test, missing OPENAI_API_KEY") -# return -# -# wipe_config() -# -# # create client -# create_config("openai") -# client = create_client() -# -# # openai: create agent -# openai_agent = client.create_agent( -# name="openai_agent", -# ) -# assert ( -# openai_agent.embedding_config.embedding_endpoint_type == "openai" -# ), f"openai_agent.embedding_config.embedding_endpoint_type={openai_agent.embedding_config.embedding_endpoint_type}" -# -# # openai: add passages -# passages, openai_embeddings = generate_passages(client.user, openai_agent) -# openai_agent_run = client.server.load_agent(user_id=client.user.id, agent_id=openai_agent.id) -# openai_agent_run.persistence_manager.archival_memory.storage.insert_many(passages) -# -# # create client -# create_config("letta_hosted") -# client = create_client() -# -# # hosted: create agent -# hosted_agent = client.create_agent( -# name="hosted_agent", -# ) -# # check to make sure endpoint overriden -# assert ( -# hosted_agent.embedding_config.embedding_endpoint_type == "hugging-face" -# ), f"hosted_agent.embedding_config.embedding_endpoint_type={hosted_agent.embedding_config.embedding_endpoint_type}" -# -# # hosted: add passages -# passages, hosted_embeddings = generate_passages(client.user, hosted_agent) -# hosted_agent_run = client.server.load_agent(user_id=client.user.id, agent_id=hosted_agent.id) -# hosted_agent_run.persistence_manager.archival_memory.storage.insert_many(passages) -# -# # test passage dimentionality -# storage = StorageConnector.get_storage_connector(TableType.PASSAGES, TEST_MEMGPT_CONFIG, client.user.id) -# storage.filters = {} # clear filters to be able to get all passages -# passages = storage.get_all() -# for passage in passages: -# if passage.agent_id == hosted_agent.id: -# assert ( -# passage.embedding_dim == hosted_agent.embedding_config.embedding_dim -# ), f"passage.embedding_dim={passage.embedding_dim} != hosted_agent.embedding_config.embedding_dim={hosted_agent.embedding_config.embedding_dim}" -# -# # ensure was in original embeddings -# embedding = passage.embedding[: passage.embedding_dim] -# assert embedding in hosted_embeddings, f"embedding={embedding} not in hosted_embeddings={hosted_embeddings}" -# -# # make sure all zeros -# assert not any( -# passage.embedding[passage.embedding_dim :] -# ), f"passage.embedding[passage.embedding_dim:]={passage.embedding[passage.embedding_dim:]}" -# elif passage.agent_id == openai_agent.id: -# assert ( -# passage.embedding_dim == openai_agent.embedding_config.embedding_dim -# ), f"passage.embedding_dim={passage.embedding_dim} != openai_agent.embedding_config.embedding_dim={openai_agent.embedding_config.embedding_dim}" -# -# # ensure was in original embeddings -# embedding = passage.embedding[: passage.embedding_dim] -# assert embedding in openai_embeddings, f"embedding={embedding} not in openai_embeddings={openai_embeddings}" -# -# # make sure all zeros -# assert not any( -# passage.embedding[passage.embedding_dim :] -# ), f"passage.embedding[passage.embedding_dim:]={passage.embedding[passage.embedding_dim:]}" -# diff --git a/tests/test_function_parser.py b/tests/test_function_parser.py deleted file mode 100644 index 64b2233630..0000000000 --- a/tests/test_function_parser.py +++ /dev/null @@ -1,48 +0,0 @@ -import letta.system as system -from letta.local_llm.function_parser import patch_function -from letta.utils import json_dumps - -EXAMPLE_FUNCTION_CALL_SEND_MESSAGE = { - "message_history": [ - {"role": "user", "content": system.package_user_message("hello")}, - ], - # "new_message": { - # "role": "function", - # "name": "send_message", - # "content": system.package_function_response(was_success=True, response_string="None"), - # }, - "new_message": { - "role": "assistant", - "content": "I'll send a message.", - "function_call": { - "name": "send_message", - "arguments": "null", - }, - }, -} - -EXAMPLE_FUNCTION_CALL_CORE_MEMORY_APPEND_MISSING = { - "message_history": [ - {"role": "user", "content": system.package_user_message("hello")}, - ], - "new_message": { - "role": "assistant", - "content": "I'll append to memory.", - "function_call": { - "name": "core_memory_append", - "arguments": json_dumps({"content": "new_stuff"}), - }, - }, -} - - -def test_function_parsers(): - """Try various broken JSON and check that the parsers can fix it""" - - og_message = EXAMPLE_FUNCTION_CALL_SEND_MESSAGE["new_message"] - corrected_message = patch_function(**EXAMPLE_FUNCTION_CALL_SEND_MESSAGE) - assert corrected_message == og_message, f"Uncorrected:\n{og_message}\nCorrected:\n{corrected_message}" - - og_message = EXAMPLE_FUNCTION_CALL_CORE_MEMORY_APPEND_MISSING["new_message"].copy() - corrected_message = patch_function(**EXAMPLE_FUNCTION_CALL_CORE_MEMORY_APPEND_MISSING) - assert corrected_message != og_message, f"Uncorrected:\n{og_message}\nCorrected:\n{corrected_message}" diff --git a/tests/test_json_parsers.py b/tests/test_json_parsers.py deleted file mode 100644 index 64c3b3f760..0000000000 --- a/tests/test_json_parsers.py +++ /dev/null @@ -1,99 +0,0 @@ -import letta.local_llm.json_parser as json_parser -from letta.utils import json_loads - -EXAMPLE_ESCAPED_UNDERSCORES = """{ - "function":"send\_message", - "params": { - "inner\_thoughts": "User is asking for information about themselves. Retrieving data from core memory.", - "message": "I know that you are Chad. Is there something specific you would like to know or talk about regarding yourself?" -""" - - -EXAMPLE_MISSING_CLOSING_BRACE = """{ - "function": "send_message", - "params": { - "inner_thoughts": "Oops, I got their name wrong! I should apologize and correct myself.", - "message": "Sorry about that! I assumed you were Chad. Welcome, Brad! " - } -""" - -EXAMPLE_BAD_TOKEN_END = """{ - "function": "send_message", - "params": { - "inner_thoughts": "Oops, I got their name wrong! I should apologize and correct myself.", - "message": "Sorry about that! I assumed you were Chad. Welcome, Brad! " - } -}<|>""" - -EXAMPLE_DOUBLE_JSON = """{ - "function": "core_memory_append", - "params": { - "name": "human", - "content": "Brad, 42 years old, from Germany." - } -} -{ - "function": "send_message", - "params": { - "message": "Got it! Your age and nationality are now saved in my memory." - } -} -""" - -EXAMPLE_HARD_LINE_FEEDS = """{ - "function": "send_message", - "params": { - "message": "Let's create a list: -- First, we can do X -- Then, we can do Y! -- Lastly, we can do Z :)" - } -} -""" - -# Situation where beginning of send_message call is fine (and thus can be extracted) -# but has a long training garbage string that comes after -EXAMPLE_SEND_MESSAGE_PREFIX_OK_REST_BAD = """{ - "function": "send_message", - "params": { - "inner_thoughts": "User request for debug assistance", - "message": "Of course, Chad. Please check the system log file for 'assistant.json' and send me the JSON output you're getting. Armed with that data, I'll assist you in debugging the issue.", -GARBAGEGARBAGEGARBAGEGARBAGE -GARBAGEGARBAGEGARBAGEGARBAGE -GARBAGEGARBAGEGARBAGEGARBAGE -""" - -EXAMPLE_ARCHIVAL_SEARCH = """ - -{ - "function": "archival_memory_search", - "params": { - "inner_thoughts": "Looking for WaitingForAction.", - "query": "WaitingForAction", -""" - - -def test_json_parsers(): - """Try various broken JSON and check that the parsers can fix it""" - - test_strings = [ - EXAMPLE_ESCAPED_UNDERSCORES, - EXAMPLE_MISSING_CLOSING_BRACE, - EXAMPLE_BAD_TOKEN_END, - EXAMPLE_DOUBLE_JSON, - EXAMPLE_HARD_LINE_FEEDS, - EXAMPLE_SEND_MESSAGE_PREFIX_OK_REST_BAD, - EXAMPLE_ARCHIVAL_SEARCH, - ] - - for string in test_strings: - try: - json_loads(string) - assert False, f"Test JSON string should have failed basic JSON parsing:\n{string}" - except: - print("String failed (expectedly)") - try: - json_parser.clean_json(string) - except: - f"Failed to repair test JSON string:\n{string}" - raise diff --git a/tests/test_local_client.py b/tests/test_local_client.py index 3aa947ba6d..ea5d04e063 100644 --- a/tests/test_local_client.py +++ b/tests/test_local_client.py @@ -4,7 +4,7 @@ from letta import create_client from letta.client.client import LocalClient -from letta.schemas.agent import PersistedAgentState +from letta.schemas.agent import AgentState from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import BasicBlockMemory, ChatMemory, Memory @@ -13,6 +13,7 @@ @pytest.fixture(scope="module") def client(): client = create_client() + # client.set_default_llm_config(LLMConfig.default_config("gpt-4o-mini")) client.set_default_llm_config(LLMConfig.default_config("gpt-4o-mini")) client.set_default_embedding_config(EmbeddingConfig.default_config(provider="openai")) @@ -29,7 +30,6 @@ def agent(client): yield agent_state client.delete_agent(agent_state.id) - assert client.get_agent(agent_state.id) is None, f"Failed to properly delete agent {agent_state.id}" def test_agent(client: LocalClient): @@ -80,16 +80,15 @@ def test_agent(client: LocalClient): assert isinstance(agent_state.memory, Memory) # update agent: tools tool_to_delete = "send_message" - assert tool_to_delete in agent_state.tool_names - new_agent_tools = [t_name for t_name in agent_state.tool_names if t_name != tool_to_delete] - client.update_agent(agent_state_test.id, tools=new_agent_tools) - assert client.get_agent(agent_state_test.id).tool_names == new_agent_tools + assert tool_to_delete in [t.name for t in agent_state.tools] + new_agent_tool_ids = [t.id for t in agent_state.tools if t.name != tool_to_delete] + client.update_agent(agent_state_test.id, tool_ids=new_agent_tool_ids) + assert sorted([t.id for t in client.get_agent(agent_state_test.id).tools]) == sorted(new_agent_tool_ids) assert isinstance(agent_state.memory, Memory) # update agent: memory new_human = "My name is Mr Test, 100 percent human." new_persona = "I am an all-knowing AI." - new_memory = ChatMemory(human=new_human, persona=new_persona) assert agent_state.memory.get_block("human").value != new_human assert agent_state.memory.get_block("persona").value != new_persona @@ -216,7 +215,7 @@ def test_agent_with_shared_blocks(client: LocalClient): client.delete_agent(second_agent_state_test.id) -def test_memory(client: LocalClient, agent: PersistedAgentState): +def test_memory(client: LocalClient, agent: AgentState): # get agent memory original_memory = client.get_in_context_memory(agent.id) assert original_memory is not None @@ -229,7 +228,7 @@ def test_memory(client: LocalClient, agent: PersistedAgentState): assert updated_memory.get_block("human").value != original_memory_value # check if the memory has been updated -def test_archival_memory(client: LocalClient, agent: PersistedAgentState): +def test_archival_memory(client: LocalClient, agent: AgentState): """Test functions for interacting with archival memory store""" # add archival memory @@ -244,7 +243,7 @@ def test_archival_memory(client: LocalClient, agent: PersistedAgentState): client.delete_archival_memory(agent.id, passage.id) -def test_recall_memory(client: LocalClient, agent: PersistedAgentState): +def test_recall_memory(client: LocalClient, agent: AgentState): """Test functions for interacting with recall memory store""" # send message to the agent diff --git a/tests/test_managers.py b/tests/test_managers.py index 745b17d746..96b5faa451 100644 --- a/tests/test_managers.py +++ b/tests/test_managers.py @@ -4,12 +4,13 @@ import pytest from sqlalchemy import delete +from sqlalchemy.exc import IntegrityError +from letta.config import LettaConfig from letta.embeddings import embedding_model -import letta.utils as utils from letta.functions.functions import derive_openai_json_schema, parse_source_code -from letta.metadata import AgentModel from letta.orm import ( + Agent, Block, BlocksAgents, FileMetadata, @@ -20,17 +21,14 @@ SandboxConfig, SandboxEnvironmentVariable, Source, + SourcesAgents, Tool, ToolsAgents, User, ) from letta.orm.agents_tags import AgentsTags -from letta.orm.errors import ( - ForeignKeyConstraintViolationError, - NoResultFound, - UniqueConstraintViolationError, -) -from letta.schemas.agent import CreateAgent +from letta.orm.errors import NoResultFound, UniqueConstraintViolationError +from letta.schemas.agent import CreateAgent, UpdateAgent from letta.schemas.block import Block as PydanticBlock from letta.schemas.block import BlockUpdate, CreateBlock from letta.schemas.embedding_config import EmbeddingConfig @@ -40,7 +38,7 @@ from letta.schemas.job import JobUpdate from letta.schemas.llm_config import LLMConfig from letta.schemas.message import Message as PydanticMessage -from letta.schemas.message import MessageUpdate +from letta.schemas.message import MessageCreate, MessageUpdate from letta.schemas.organization import Organization as PydanticOrganization from letta.schemas.passage import Passage as PydanticPassage from letta.schemas.sandbox_config import ( @@ -56,17 +54,14 @@ from letta.schemas.source import SourceUpdate from letta.schemas.tool import Tool as PydanticTool from letta.schemas.tool import ToolUpdate -from letta.services.block_manager import BlockManager -from letta.services.organization_manager import OrganizationManager -from letta.services.passage_manager import PassageManager -from letta.services.tool_manager import ToolManager -from letta.settings import tool_settings - -utils.DEBUG = True -from letta.config import LettaConfig +from letta.schemas.tool_rule import InitToolRule from letta.schemas.user import User as PydanticUser from letta.schemas.user import UserUpdate from letta.server.server import SyncServer +from letta.services.block_manager import BlockManager +from letta.services.organization_manager import OrganizationManager +from letta.settings import tool_settings +from tests.helpers.utils import comprehensive_agent_checks DEFAULT_EMBEDDING_CONFIG = EmbeddingConfig( embedding_endpoint_type="hugging-face", @@ -91,6 +86,7 @@ def clear_tables(server: SyncServer): session.execute(delete(Job)) session.execute(delete(ToolsAgents)) # Clear ToolsAgents first session.execute(delete(BlocksAgents)) + session.execute(delete(SourcesAgents)) session.execute(delete(AgentsTags)) session.execute(delete(SandboxEnvironmentVariable)) session.execute(delete(SandboxConfig)) @@ -98,7 +94,7 @@ def clear_tables(server: SyncServer): session.execute(delete(FileMetadata)) session.execute(delete(Source)) session.execute(delete(Tool)) # Clear all records from the Tool table - session.execute(delete(AgentModel)) + session.execute(delete(Agent)) session.execute(delete(User)) # Clear all records from the user table session.execute(delete(Organization)) # Clear all records from the organization table session.commit() # Commit the deletion @@ -138,44 +134,24 @@ def default_source(server: SyncServer, default_user): @pytest.fixture -def default_file(server: SyncServer, default_source, default_user, default_organization): - file = server.source_manager.create_file( - PydanticFileMetadata( - file_name="test_file", organization_id=default_organization.id, source_id=default_source.id), - actor=default_user, - ) - yield file - - -@pytest.fixture -def sarah_agent(server: SyncServer, default_user, default_organization): - """Fixture to create and return a sample agent within the default organization.""" - agent_state = server.create_agent( - request=CreateAgent( - name="sarah_agent", - # memory_blocks=[CreateBlock(label="human", value="Charles"), CreateBlock(label="persona", value="I am a helpful assistant")], - memory_blocks=[], - llm_config=LLMConfig.default_config("gpt-4"), - embedding_config=EmbeddingConfig.default_config(provider="openai"), - ), - actor=default_user, +def other_source(server: SyncServer, default_user): + source_pydantic = PydanticSource( + name="Another Test Source", + description="This is yet another test source.", + metadata_={"type": "another_test"}, + embedding_config=DEFAULT_EMBEDDING_CONFIG, ) - yield agent_state + source = server.source_manager.create_source(source=source_pydantic, actor=default_user) + yield source @pytest.fixture -def charles_agent(server: SyncServer, default_user, default_organization): - """Fixture to create and return a sample agent within the default organization.""" - agent_state = server.create_agent( - request=CreateAgent( - name="charles_agent", - memory_blocks=[CreateBlock(label="human", value="Charles"), CreateBlock(label="persona", value="I am a helpful assistant")], - llm_config=LLMConfig.default_config("gpt-4"), - embedding_config=EmbeddingConfig.default_config(provider="openai"), - ), +def default_file(server: SyncServer, default_source, default_user, default_organization): + file = server.source_manager.create_file( + PydanticFileMetadata(file_name="test_file", organization_id=default_organization.id, source_id=default_source.id), actor=default_user, ) - yield agent_state + yield file @pytest.fixture @@ -221,9 +197,9 @@ def hello_world_passage_fixture(server: SyncServer, default_user, default_file, organization_id=default_user.organization_id, agent_id=sarah_agent.id, file_id=default_file.id, - text="Hello, world!", - embedding=dummy_embedding, - embedding_config=DEFAULT_EMBEDDING_CONFIG + text="Hello, world!", + embedding=dummy_embedding, + embedding_config=DEFAULT_EMBEDDING_CONFIG, ) msg = server.passage_manager.create_passage(message, actor=default_user) @@ -239,14 +215,16 @@ def create_test_passages(server: SyncServer, default_file, default_user, sarah_a organization_id=default_user.organization_id, agent_id=sarah_agent.id, file_id=default_file.id, - text=f"Test passage {i}", - embedding=dummy_embedding, - embedding_config=DEFAULT_EMBEDDING_CONFIG - ) for i in range(4) + text=f"Test passage {i}", + embedding=dummy_embedding, + embedding_config=DEFAULT_EMBEDDING_CONFIG, + ) + for i in range(4) ] server.passage_manager.create_many_passages(passages, actor=default_user) return passages + @pytest.fixture def hello_world_message_fixture(server: SyncServer, default_user, sarah_agent): """Fixture to create a tool with default settings and clean up after the test.""" @@ -346,6 +324,61 @@ def print_other_tool(message: str): yield tool +@pytest.fixture +def sarah_agent(server: SyncServer, default_user, default_organization): + """Fixture to create and return a sample agent within the default organization.""" + agent_state = server.create_agent( + request=CreateAgent( + name="sarah_agent", + memory_blocks=[], + llm_config=LLMConfig.default_config("gpt-4"), + embedding_config=EmbeddingConfig.default_config(provider="openai"), + ), + actor=default_user, + ) + yield agent_state + + +@pytest.fixture +def charles_agent(server: SyncServer, default_user, default_organization): + """Fixture to create and return a sample agent within the default organization.""" + agent_state = server.create_agent( + request=CreateAgent( + name="charles_agent", + memory_blocks=[CreateBlock(label="human", value="Charles"), CreateBlock(label="persona", value="I am a helpful assistant")], + llm_config=LLMConfig.default_config("gpt-4"), + embedding_config=EmbeddingConfig.default_config(provider="openai"), + ), + actor=default_user, + ) + yield agent_state + + +@pytest.fixture +def comprehensive_test_agent_fixture(server: SyncServer, default_user, print_tool, default_source, default_block): + memory_blocks = [CreateBlock(label="human", value="BananaBoy"), CreateBlock(label="persona", value="I am a helpful assistant")] + create_agent_request = CreateAgent( + system="test system", + memory_blocks=memory_blocks, + llm_config=LLMConfig.default_config("gpt-4"), + embedding_config=EmbeddingConfig.default_config(provider="openai"), + block_ids=[default_block.id], + tool_ids=[print_tool.id], + source_ids=[default_source.id], + tags=["a", "b"], + description="test_description", + metadata_={"test_key": "test_value"}, + tool_rules=[InitToolRule(tool_name=print_tool.name)], + initial_message_sequence=[MessageCreate(role=MessageRole.user, text="hello world")], + ) + created_agent = server.agent_manager.create_agent( + create_agent_request, + actor=default_user, + ) + + yield created_agent, create_agent_request + + @pytest.fixture(scope="module") def server(): config = LettaConfig.load() @@ -356,6 +389,389 @@ def server(): return server +# ====================================================================================================================== +# AgentManager Tests - Basic +# ====================================================================================================================== +def test_create_get_list_agent(server: SyncServer, comprehensive_test_agent_fixture, default_user): + # Test agent creation + created_agent, create_agent_request = comprehensive_test_agent_fixture + comprehensive_agent_checks(created_agent, create_agent_request) + + # Test get agent + get_agent = server.agent_manager.get_agent_by_id(agent_id=created_agent.id, actor=default_user) + comprehensive_agent_checks(get_agent, create_agent_request) + + # Test get agent name + get_agent_name = server.agent_manager.get_agent_by_name(agent_name=created_agent.name, actor=default_user) + comprehensive_agent_checks(get_agent_name, create_agent_request) + + # Test list agent + list_agents = server.agent_manager.list_agents(actor=default_user) + assert len(list_agents) == 1 + comprehensive_agent_checks(list_agents[0], create_agent_request) + + # Test deleting the agent + server.agent_manager.delete_agent(get_agent.id, default_user) + list_agents = server.agent_manager.list_agents(actor=default_user) + assert len(list_agents) == 0 + + +def test_update_agent(server: SyncServer, comprehensive_test_agent_fixture, other_tool, other_source, other_block, default_user): + agent, _ = comprehensive_test_agent_fixture + update_agent_request = UpdateAgent( + name="train_agent", + description="train description", + tool_ids=[other_tool.id], + source_ids=[other_source.id], + block_ids=[other_block.id], + tool_rules=[InitToolRule(tool_name=other_tool.name)], + tags=["c", "d"], + system="train system", + llm_config=LLMConfig.default_config("gpt-4o-mini"), + embedding_config=EmbeddingConfig.default_config(model_name="letta"), + message_ids=["10", "20"], + metadata_={"train_key": "train_value"}, + ) + + updated_agent = server.agent_manager.update_agent(agent.id, update_agent_request, actor=default_user) + comprehensive_agent_checks(updated_agent, update_agent_request) + assert updated_agent.message_ids == update_agent_request.message_ids + + +# ====================================================================================================================== +# AgentManager Tests - Sources Relationship +# ====================================================================================================================== + + +def test_attach_source(server: SyncServer, sarah_agent, default_source, default_user): + """Test attaching a source to an agent.""" + # Attach the source + server.agent_manager.attach_source(agent_id=sarah_agent.id, source_id=default_source.id, actor=default_user) + + # Verify attachment through get_agent_by_id + agent = server.agent_manager.get_agent_by_id(sarah_agent.id, actor=default_user) + assert default_source.id in [s.id for s in agent.sources] + + # Verify that attaching the same source again doesn't cause issues + server.agent_manager.attach_source(agent_id=sarah_agent.id, source_id=default_source.id, actor=default_user) + agent = server.agent_manager.get_agent_by_id(sarah_agent.id, actor=default_user) + assert len([s for s in agent.sources if s.id == default_source.id]) == 1 + + +def test_list_attached_source_ids(server: SyncServer, sarah_agent, default_source, other_source, default_user): + """Test listing source IDs attached to an agent.""" + # Initially should have no sources + sources = server.agent_manager.list_attached_sources(sarah_agent.id, actor=default_user) + assert len(sources) == 0 + + # Attach sources + server.agent_manager.attach_source(sarah_agent.id, default_source.id, actor=default_user) + server.agent_manager.attach_source(sarah_agent.id, other_source.id, actor=default_user) + + # List sources and verify + sources = server.agent_manager.list_attached_sources(sarah_agent.id, actor=default_user) + assert len(sources) == 2 + source_ids = [s.id for s in sources] + assert default_source.id in source_ids + assert other_source.id in source_ids + + +def test_detach_source(server: SyncServer, sarah_agent, default_source, default_user): + """Test detaching a source from an agent.""" + # Attach source + server.agent_manager.attach_source(sarah_agent.id, default_source.id, actor=default_user) + + # Verify it's attached + agent = server.agent_manager.get_agent_by_id(sarah_agent.id, actor=default_user) + assert default_source.id in [s.id for s in agent.sources] + + # Detach source + server.agent_manager.detach_source(sarah_agent.id, default_source.id, actor=default_user) + + # Verify it's detached + agent = server.agent_manager.get_agent_by_id(sarah_agent.id, actor=default_user) + assert default_source.id not in [s.id for s in agent.sources] + + # Verify that detaching an already detached source doesn't cause issues + server.agent_manager.detach_source(sarah_agent.id, default_source.id, actor=default_user) + + +def test_attach_source_nonexistent_agent(server: SyncServer, default_source, default_user): + """Test attaching a source to a nonexistent agent.""" + with pytest.raises(NoResultFound): + server.agent_manager.attach_source(agent_id="nonexistent-agent-id", source_id=default_source.id, actor=default_user) + + +def test_attach_source_nonexistent_source(server: SyncServer, sarah_agent, default_user): + """Test attaching a nonexistent source to an agent.""" + with pytest.raises(NoResultFound): + server.agent_manager.attach_source(agent_id=sarah_agent.id, source_id="nonexistent-source-id", actor=default_user) + + +def test_detach_source_nonexistent_agent(server: SyncServer, default_source, default_user): + """Test detaching a source from a nonexistent agent.""" + with pytest.raises(NoResultFound): + server.agent_manager.detach_source(agent_id="nonexistent-agent-id", source_id=default_source.id, actor=default_user) + + +def test_list_attached_source_ids_nonexistent_agent(server: SyncServer, default_user): + """Test listing sources for a nonexistent agent.""" + with pytest.raises(NoResultFound): + server.agent_manager.list_attached_sources(agent_id="nonexistent-agent-id", actor=default_user) + + +def test_list_attached_agents(server: SyncServer, sarah_agent, charles_agent, default_source, default_user): + """Test listing agents that have a particular source attached.""" + # Initially should have no attached agents + attached_agents = server.source_manager.list_attached_agents(source_id=default_source.id, actor=default_user) + assert len(attached_agents) == 0 + + # Attach source to first agent + server.agent_manager.attach_source(agent_id=sarah_agent.id, source_id=default_source.id, actor=default_user) + + # Verify one agent is now attached + attached_agents = server.source_manager.list_attached_agents(source_id=default_source.id, actor=default_user) + assert len(attached_agents) == 1 + assert sarah_agent.id in [a.id for a in attached_agents] + + # Attach source to second agent + server.agent_manager.attach_source(agent_id=charles_agent.id, source_id=default_source.id, actor=default_user) + + # Verify both agents are now attached + attached_agents = server.source_manager.list_attached_agents(source_id=default_source.id, actor=default_user) + assert len(attached_agents) == 2 + attached_agent_ids = [a.id for a in attached_agents] + assert sarah_agent.id in attached_agent_ids + assert charles_agent.id in attached_agent_ids + + # Detach source from first agent + server.agent_manager.detach_source(agent_id=sarah_agent.id, source_id=default_source.id, actor=default_user) + + # Verify only second agent remains attached + attached_agents = server.source_manager.list_attached_agents(source_id=default_source.id, actor=default_user) + assert len(attached_agents) == 1 + assert charles_agent.id in [a.id for a in attached_agents] + + +def test_list_attached_agents_nonexistent_source(server: SyncServer, default_user): + """Test listing agents for a nonexistent source.""" + with pytest.raises(NoResultFound): + server.source_manager.list_attached_agents(source_id="nonexistent-source-id", actor=default_user) + + +# ====================================================================================================================== +# AgentManager Tests - Tags Relationship +# ====================================================================================================================== + + +def test_list_agents_by_tags_match_all(server: SyncServer, sarah_agent, charles_agent, default_user): + """Test listing agents that have ALL specified tags.""" + # Create agents with multiple tags + server.agent_manager.update_agent(sarah_agent.id, UpdateAgent(tags=["test", "production", "gpt4"]), actor=default_user) + server.agent_manager.update_agent(charles_agent.id, UpdateAgent(tags=["test", "development", "gpt4"]), actor=default_user) + + # Search for agents with all specified tags + agents = server.agent_manager.list_agents(tags=["test", "gpt4"], match_all_tags=True, actor=default_user) + assert len(agents) == 2 + agent_ids = [a.id for a in agents] + assert sarah_agent.id in agent_ids + assert charles_agent.id in agent_ids + + # Search for tags that only sarah_agent has + agents = server.agent_manager.list_agents(tags=["test", "production"], match_all_tags=True, actor=default_user) + assert len(agents) == 1 + assert agents[0].id == sarah_agent.id + + +def test_list_agents_by_tags_match_any(server: SyncServer, sarah_agent, charles_agent, default_user): + """Test listing agents that have ANY of the specified tags.""" + # Create agents with different tags + server.agent_manager.update_agent(sarah_agent.id, UpdateAgent(tags=["production", "gpt4"]), actor=default_user) + server.agent_manager.update_agent(charles_agent.id, UpdateAgent(tags=["development", "gpt3"]), actor=default_user) + + # Search for agents with any of the specified tags + agents = server.agent_manager.list_agents(tags=["production", "development"], match_all_tags=False, actor=default_user) + assert len(agents) == 2 + agent_ids = [a.id for a in agents] + assert sarah_agent.id in agent_ids + assert charles_agent.id in agent_ids + + # Search for tags where only sarah_agent matches + agents = server.agent_manager.list_agents(tags=["production", "nonexistent"], match_all_tags=False, actor=default_user) + assert len(agents) == 1 + assert agents[0].id == sarah_agent.id + + +def test_list_agents_by_tags_no_matches(server: SyncServer, sarah_agent, charles_agent, default_user): + """Test listing agents when no tags match.""" + # Create agents with tags + server.agent_manager.update_agent(sarah_agent.id, UpdateAgent(tags=["production", "gpt4"]), actor=default_user) + server.agent_manager.update_agent(charles_agent.id, UpdateAgent(tags=["development", "gpt3"]), actor=default_user) + + # Search for nonexistent tags + agents = server.agent_manager.list_agents(tags=["nonexistent1", "nonexistent2"], match_all_tags=True, actor=default_user) + assert len(agents) == 0 + + agents = server.agent_manager.list_agents(tags=["nonexistent1", "nonexistent2"], match_all_tags=False, actor=default_user) + assert len(agents) == 0 + + +def test_list_agents_by_tags_with_other_filters(server: SyncServer, sarah_agent, charles_agent, default_user): + """Test combining tag search with other filters.""" + # Create agents with specific names and tags + server.agent_manager.update_agent(sarah_agent.id, UpdateAgent(name="production_agent", tags=["production", "gpt4"]), actor=default_user) + server.agent_manager.update_agent(charles_agent.id, UpdateAgent(name="test_agent", tags=["production", "gpt3"]), actor=default_user) + + # List agents with specific tag and name pattern + agents = server.agent_manager.list_agents(actor=default_user, tags=["production"], match_all_tags=True, name="production_agent") + assert len(agents) == 1 + assert agents[0].id == sarah_agent.id + + +def test_list_agents_by_tags_pagination(server: SyncServer, default_user, default_organization): + """Test pagination when listing agents by tags.""" + # Create first agent + agent1 = server.create_agent( + request=CreateAgent( + name="agent1", + tags=["pagination_test", "tag1"], + llm_config=LLMConfig.default_config("gpt-4"), + embedding_config=EmbeddingConfig.default_config(provider="openai"), + memory_blocks=[], + ), + actor=default_user, + ) + + if USING_SQLITE: + time.sleep(CREATE_DELAY_SQLITE) # Ensure distinct created_at timestamps + + # Create second agent + agent2 = server.create_agent( + request=CreateAgent( + name="agent2", + tags=["pagination_test", "tag2"], + llm_config=LLMConfig.default_config("gpt-4"), + embedding_config=EmbeddingConfig.default_config(provider="openai"), + memory_blocks=[], + ), + actor=default_user, + ) + + # Get first page + first_page = server.agent_manager.list_agents(tags=["pagination_test"], match_all_tags=True, actor=default_user, limit=1) + assert len(first_page) == 1 + first_agent_id = first_page[0].id + + # Get second page using cursor + second_page = server.agent_manager.list_agents( + tags=["pagination_test"], match_all_tags=True, actor=default_user, cursor=first_agent_id, limit=1 + ) + assert len(second_page) == 1 + assert second_page[0].id != first_agent_id + + # Verify we got both agents with no duplicates + all_ids = {first_page[0].id, second_page[0].id} + assert len(all_ids) == 2 + assert agent1.id in all_ids + assert agent2.id in all_ids + + +# ====================================================================================================================== +# AgentManager Tests - Blocks Relationship +# ====================================================================================================================== + + +def test_attach_block(server: SyncServer, sarah_agent, default_block, default_user): + """Test attaching a block to an agent.""" + # Attach block + server.agent_manager.attach_block(agent_id=sarah_agent.id, block_id=default_block.id, actor=default_user) + + # Verify attachment + agent = server.agent_manager.get_agent_by_id(sarah_agent.id, actor=default_user) + assert len(agent.memory.blocks) == 1 + assert agent.memory.blocks[0].id == default_block.id + assert agent.memory.blocks[0].label == default_block.label + + +def test_attach_block_duplicate_label(server: SyncServer, sarah_agent, default_block, other_block, default_user): + """Test attempting to attach a block with a duplicate label.""" + # Set up both blocks with same label + server.block_manager.update_block(default_block.id, BlockUpdate(label="same_label"), actor=default_user) + server.block_manager.update_block(other_block.id, BlockUpdate(label="same_label"), actor=default_user) + + # Attach first block + server.agent_manager.attach_block(agent_id=sarah_agent.id, block_id=default_block.id, actor=default_user) + + # Attempt to attach second block with same label + with pytest.raises(IntegrityError): + server.agent_manager.attach_block(agent_id=sarah_agent.id, block_id=other_block.id, actor=default_user) + + +def test_detach_block(server: SyncServer, sarah_agent, default_block, default_user): + """Test detaching a block by ID.""" + # Set up: attach block + server.agent_manager.attach_block(agent_id=sarah_agent.id, block_id=default_block.id, actor=default_user) + + # Detach block + server.agent_manager.detach_block(agent_id=sarah_agent.id, block_id=default_block.id, actor=default_user) + + # Verify detachment + agent = server.agent_manager.get_agent_by_id(sarah_agent.id, actor=default_user) + assert len(agent.memory.blocks) == 0 + + +def test_detach_nonexistent_block(server: SyncServer, sarah_agent, default_user): + """Test detaching a block that isn't attached.""" + with pytest.raises(NoResultFound): + server.agent_manager.detach_block(agent_id=sarah_agent.id, block_id="nonexistent-block-id", actor=default_user) + + +def test_update_block_label(server: SyncServer, sarah_agent, default_block, default_user): + """Test updating a block's label updates the relationship.""" + # Attach block + server.agent_manager.attach_block(agent_id=sarah_agent.id, block_id=default_block.id, actor=default_user) + + # Update block label + new_label = "new_label" + server.block_manager.update_block(default_block.id, BlockUpdate(label=new_label), actor=default_user) + + # Verify relationship is updated + agent = server.agent_manager.get_agent_by_id(sarah_agent.id, actor=default_user) + block = agent.memory.blocks[0] + assert block.id == default_block.id + assert block.label == new_label + + +def test_update_block_label_multiple_agents(server: SyncServer, sarah_agent, charles_agent, default_block, default_user): + """Test updating a block's label updates relationships for all agents.""" + # Attach block to both agents + server.agent_manager.attach_block(agent_id=sarah_agent.id, block_id=default_block.id, actor=default_user) + server.agent_manager.attach_block(agent_id=charles_agent.id, block_id=default_block.id, actor=default_user) + + # Update block label + new_label = "new_label" + server.block_manager.update_block(default_block.id, BlockUpdate(label=new_label), actor=default_user) + + # Verify both relationships are updated + for agent_id in [sarah_agent.id, charles_agent.id]: + agent = server.agent_manager.get_agent_by_id(agent_id, actor=default_user) + # Find our specific block by ID + block = next(b for b in agent.memory.blocks if b.id == default_block.id) + assert block.label == new_label + + +def test_get_block_with_label(server: SyncServer, sarah_agent, default_block, default_user): + """Test retrieving a block by its label.""" + # Attach block + server.agent_manager.attach_block(agent_id=sarah_agent.id, block_id=default_block.id, actor=default_user) + + # Get block by label + block = server.agent_manager.get_block_with_label(agent_id=sarah_agent.id, block_label=default_block.label, actor=default_user) + + assert block.id == default_block.id + assert block.label == default_block.label + + # ====================================================================================================================== # Organization Manager Tests # ====================================================================================================================== @@ -407,6 +823,7 @@ def test_list_organizations_pagination(server: SyncServer): # Passage Manager Tests # ====================================================================================================================== + def test_passage_create(server: SyncServer, hello_world_passage_fixture, default_user): """Test creating a passage using hello_world_passage_fixture fixture""" assert hello_world_passage_fixture.id is not None @@ -489,10 +906,8 @@ def test_passage_listing_cursor(server: SyncServer, hello_world_passage_fixture, last_id_on_first_page = first_page[-1].id # Get second page - second_page = server.passage_manager.list_passages( - actor=default_user, cursor=last_id_on_first_page, limit=3 - ) - assert len(second_page) == 2 # Should have 2 remaining passages + second_page = server.passage_manager.list_passages(actor=default_user, cursor=last_id_on_first_page, limit=3) + assert len(second_page) == 2 # Should have 2 remaining passages assert all(r1.id != r2.id for r1 in first_page for r2 in second_page) @@ -505,16 +920,12 @@ def test_passage_listing_filtering(server: SyncServer, hello_world_passage_fixtu def test_passage_listing_text_search(server: SyncServer, hello_world_passage_fixture, create_test_passages, default_user, sarah_agent): """Test searching passages by text content""" - search_results = server.passage_manager.list_passages( - agent_id=sarah_agent.id, actor=default_user, query_text="Test passage", limit=10 - ) + search_results = server.passage_manager.list_passages(agent_id=sarah_agent.id, actor=default_user, query_text="Test passage", limit=10) assert len(search_results) == 4 assert all("Test passage" in msg.text for msg in search_results) - + # Test no results - search_results = server.passage_manager.list_passages( - agent_id=sarah_agent.id, actor=default_user, query_text="Letta", limit=10 - ) + search_results = server.passage_manager.list_passages(agent_id=sarah_agent.id, actor=default_user, query_text="Letta", limit=10) assert len(search_results) == 0 @@ -522,18 +933,18 @@ def test_passage_listing_date_range_filtering(server: SyncServer, hello_world_pa """Test filtering passages by date range with various scenarios""" # Set up test data with known dates base_time = datetime.utcnow() - + # Create passages at different times passages = [] time_offsets = [ - timedelta(days=-2), # 2 days ago - timedelta(days=-1), # Yesterday - timedelta(hours=-2), # 2 hours ago - timedelta(minutes=-30), # 30 minutes ago + timedelta(days=-2), # 2 days ago + timedelta(days=-1), # Yesterday + timedelta(hours=-2), # 2 hours ago + timedelta(minutes=-30), # 30 minutes ago timedelta(minutes=-1), # 1 minute ago - timedelta(minutes=0), # Now + timedelta(minutes=0), # Now ] - + for i, offset in enumerate(time_offsets): timestamp = base_time + offset passage = server.passage_manager.create_passage( @@ -544,9 +955,9 @@ def test_passage_listing_date_range_filtering(server: SyncServer, hello_world_pa text=f"Test passage {i}", embedding=[0.1, 0.2, 0.3], embedding_config=DEFAULT_EMBEDDING_CONFIG, - created_at=timestamp + created_at=timestamp, ), - actor=default_user + actor=default_user, ) passages.append(passage) @@ -587,42 +998,31 @@ def test_passage_listing_date_range_filtering(server: SyncServer, hello_world_pa "start_date": base_time - timedelta(seconds=30), "end_date": base_time + timedelta(seconds=30), "expected_count": 1 + 1, # date + "now" - } + }, ] # Run test cases for case in test_cases: results = server.passage_manager.list_passages( - agent_id=sarah_agent.id, - actor=default_user, - start_date=case["start_date"], - end_date=case["end_date"], - limit=10 + agent_id=sarah_agent.id, actor=default_user, start_date=case["start_date"], end_date=case["end_date"], limit=10 ) - + # Verify count - assert len(results) == case["expected_count"], \ - f"Test case '{case['name']}' failed: expected {case['expected_count']} passages, got {len(results)}" + assert ( + len(results) == case["expected_count"] + ), f"Test case '{case['name']}' failed: expected {case['expected_count']} passages, got {len(results)}" # Test edge cases - + # Test with start_date but no end_date results_start_only = server.passage_manager.list_passages( - agent_id=sarah_agent.id, - actor=default_user, - start_date=base_time - timedelta(minutes=2), - end_date=None, - limit=10 + agent_id=sarah_agent.id, actor=default_user, start_date=base_time - timedelta(minutes=2), end_date=None, limit=10 ) assert len(results_start_only) >= 2, "Should find passages after start_date" # Test with end_date but no start_date results_end_only = server.passage_manager.list_passages( - agent_id=sarah_agent.id, - actor=default_user, - start_date=None, - end_date=base_time - timedelta(days=1), - limit=10 + agent_id=sarah_agent.id, actor=default_user, start_date=None, end_date=base_time - timedelta(days=1), limit=10 ) assert len(results_end_only) >= 1, "Should find passages before end_date" @@ -632,7 +1032,7 @@ def test_passage_listing_date_range_filtering(server: SyncServer, hello_world_pa actor=default_user, start_date=base_time - timedelta(days=3), end_date=base_time + timedelta(days=1), - limit=3 + limit=3, ) assert len(limited_results) <= 3, "Should respect the limit parameter" @@ -640,18 +1040,18 @@ def test_passage_listing_date_range_filtering(server: SyncServer, hello_world_pa def test_passage_vector_search(server: SyncServer, default_user, default_file, sarah_agent): """Test vector search functionality for passages.""" passage_manager = server.passage_manager - embed_model = embedding_model(DEFAULT_EMBEDDING_CONFIG) - + embed_model = embedding_model(DEFAULT_EMBEDDING_CONFIG) + # Create passages with known embeddings passages = [] - + # Create passages with different embeddings test_passages = [ "I like red", "random text", "blue shoes", ] - + for text in test_passages: embedding = embed_model.get_text_embedding(text) passage = PydanticPassage( @@ -659,15 +1059,15 @@ def test_passage_vector_search(server: SyncServer, default_user, default_file, s organization_id=default_user.organization_id, agent_id=sarah_agent.id, embedding_config=DEFAULT_EMBEDDING_CONFIG, - embedding=embedding + embedding=embedding, ) created_passage = passage_manager.create_passage(passage, default_user) passages.append(created_passage) assert passage_manager.size(actor=default_user) == len(passages) - + # Query vector similar to "cats" embedding query_key = "What's my favorite color?" - + # List passages with vector search results = passage_manager.list_passages( actor=default_user, @@ -677,11 +1077,11 @@ def test_passage_vector_search(server: SyncServer, default_user, default_file, s embedding_config=DEFAULT_EMBEDDING_CONFIG, embed_query=True, ) - + # Verify results are ordered by similarity assert len(results) == 3 assert results[0].text == "I like red" - assert results[1].text == "random text" # For some reason the embedding model doesn't like "blue shoes" + assert results[1].text == "random text" # For some reason the embedding model doesn't like "blue shoes" assert results[2].text == "blue shoes" @@ -1164,7 +1564,7 @@ def test_delete_block(server: SyncServer, default_user): # ====================================================================================================================== -# Source Manager Tests - Sources +# SourceManager Tests - Sources # ====================================================================================================================== def test_create_source(server: SyncServer, default_user): """Test creating a new source.""" @@ -1376,86 +1776,6 @@ def test_delete_file(server: SyncServer, default_user, default_source): assert len(files) == 0 -# ====================================================================================================================== -# AgentsTagsManager Tests -# ====================================================================================================================== -def test_add_tag_to_agent(server: SyncServer, sarah_agent, default_user): - # Add a tag to the agent - tag_name = "test_tag" - tag_association = server.agents_tags_manager.add_tag_to_agent(agent_id=sarah_agent.id, tag=tag_name, actor=default_user) - - # Assert that the tag association was created correctly - assert tag_association.agent_id == sarah_agent.id - assert tag_association.tag == tag_name - - -def test_add_duplicate_tag_to_agent(server: SyncServer, sarah_agent, default_user): - # Add the same tag twice to the agent - tag_name = "test_tag" - first_tag = server.agents_tags_manager.add_tag_to_agent(agent_id=sarah_agent.id, tag=tag_name, actor=default_user) - duplicate_tag = server.agents_tags_manager.add_tag_to_agent(agent_id=sarah_agent.id, tag=tag_name, actor=default_user) - - # Assert that the second addition returns the existing tag without creating a duplicate - assert first_tag.agent_id == duplicate_tag.agent_id - assert first_tag.tag == duplicate_tag.tag - - # Get all the tags belonging to the agent - tags = server.agents_tags_manager.get_tags_for_agent(agent_id=sarah_agent.id, actor=default_user) - assert len(tags) == 1 - assert tags[0] == first_tag.tag - - -def test_delete_tag_from_agent(server: SyncServer, sarah_agent, default_user): - # Add a tag, then delete it - tag_name = "test_tag" - server.agents_tags_manager.add_tag_to_agent(agent_id=sarah_agent.id, tag=tag_name, actor=default_user) - server.agents_tags_manager.delete_tag_from_agent(agent_id=sarah_agent.id, tag=tag_name, actor=default_user) - - # Assert the tag was deleted - agent_tags = server.agents_tags_manager.get_agents_by_tag(tag=tag_name, actor=default_user) - assert sarah_agent.id not in agent_tags - - -def test_delete_nonexistent_tag_from_agent(server: SyncServer, sarah_agent, default_user): - # Attempt to delete a tag that doesn't exist - tag_name = "nonexistent_tag" - with pytest.raises(ValueError, match=f"Tag '{tag_name}' not found for agent '{sarah_agent.id}'"): - server.agents_tags_manager.delete_tag_from_agent(agent_id=sarah_agent.id, tag=tag_name, actor=default_user) - - -def test_delete_tag_from_nonexistent_agent(server: SyncServer, default_user): - # Attempt to delete a tag that doesn't exist - tag_name = "nonexistent_tag" - agent_id = "abc" - with pytest.raises(ValueError, match=f"Tag '{tag_name}' not found for agent '{agent_id}'"): - server.agents_tags_manager.delete_tag_from_agent(agent_id=agent_id, tag=tag_name, actor=default_user) - - -def test_get_agents_by_tag(server: SyncServer, sarah_agent, charles_agent, default_user, default_organization): - # Add a shared tag to multiple agents - tag_name = "shared_tag" - - # Add the same tag to both agents - server.agents_tags_manager.add_tag_to_agent(agent_id=sarah_agent.id, tag=tag_name, actor=default_user) - server.agents_tags_manager.add_tag_to_agent(agent_id=charles_agent.id, tag=tag_name, actor=default_user) - - # Retrieve agents by tag - agent_ids = server.agents_tags_manager.get_agents_by_tag(tag=tag_name, actor=default_user) - - # Assert that both agents are returned for the tag - assert sarah_agent.id in agent_ids - assert charles_agent.id in agent_ids - assert len(agent_ids) == 2 - - # Delete tags from only sarah agent - server.agents_tags_manager.delete_all_tags_from_agent(agent_id=sarah_agent.id, actor=default_user) - agent_ids = server.agents_tags_manager.get_agents_by_tag(tag=tag_name, actor=default_user) - # Assert that both agents are returned for the tag - assert sarah_agent.id not in agent_ids - assert charles_agent.id in agent_ids - assert len(agent_ids) == 1 - - # ====================================================================================================================== # SandboxConfigManager Tests - Sandbox Configs # ====================================================================================================================== @@ -1605,205 +1925,6 @@ def test_get_sandbox_env_var_by_key(server: SyncServer, sandbox_env_var_fixture, assert retrieved_env_var.key == sandbox_env_var_fixture.key -# ====================================================================================================================== -# BlocksAgentsManager Tests -# ====================================================================================================================== -def test_add_block_to_agent(server, sarah_agent, default_user, default_block): - block_association = server.blocks_agents_manager.add_block_to_agent( - agent_id=sarah_agent.id, block_id=default_block.id, block_label=default_block.label - ) - - assert block_association.agent_id == sarah_agent.id - assert block_association.block_id == default_block.id - assert block_association.block_label == default_block.label - - -def test_change_label_on_block_reflects_in_block_agents_table(server, sarah_agent, default_user, default_block): - # Add the block - block_association = server.blocks_agents_manager.add_block_to_agent( - agent_id=sarah_agent.id, block_id=default_block.id, block_label=default_block.label - ) - assert block_association.block_label == default_block.label - - # Change the block label - new_label = "banana" - block = server.block_manager.update_block(block_id=default_block.id, block_update=BlockUpdate(label=new_label), actor=default_user) - assert block.label == new_label - - # Get the association - labels = server.blocks_agents_manager.list_block_labels_for_agent(agent_id=sarah_agent.id) - assert new_label in labels - assert default_block.label not in labels - - -@pytest.mark.skipif(USING_SQLITE, reason="Skipped because using SQLite") -def test_add_block_to_agent_nonexistent_block(server, sarah_agent, default_user): - with pytest.raises(ForeignKeyConstraintViolationError): - server.blocks_agents_manager.add_block_to_agent( - agent_id=sarah_agent.id, block_id="nonexistent_block", block_label="nonexistent_label" - ) - - -def test_add_block_to_agent_duplicate_label(server, sarah_agent, default_user, default_block, other_block): - server.blocks_agents_manager.add_block_to_agent(agent_id=sarah_agent.id, block_id=default_block.id, block_label=default_block.label) - - with pytest.warns(UserWarning, match=f"Block label '{default_block.label}' already exists for agent '{sarah_agent.id}'"): - server.blocks_agents_manager.add_block_to_agent(agent_id=sarah_agent.id, block_id=other_block.id, block_label=default_block.label) - - -def test_remove_block_with_label_from_agent(server, sarah_agent, default_user, default_block): - server.blocks_agents_manager.add_block_to_agent(agent_id=sarah_agent.id, block_id=default_block.id, block_label=default_block.label) - - removed_block = server.blocks_agents_manager.remove_block_with_label_from_agent( - agent_id=sarah_agent.id, block_label=default_block.label - ) - - assert removed_block.block_label == default_block.label - assert removed_block.block_id == default_block.id - assert removed_block.agent_id == sarah_agent.id - - with pytest.raises(ValueError, match=f"Block label '{default_block.label}' not found for agent '{sarah_agent.id}'"): - server.blocks_agents_manager.remove_block_with_label_from_agent(agent_id=sarah_agent.id, block_label=default_block.label) - - -def test_update_block_id_for_agent(server, sarah_agent, default_user, default_block, other_block): - server.blocks_agents_manager.add_block_to_agent(agent_id=sarah_agent.id, block_id=default_block.id, block_label=default_block.label) - - updated_block = server.blocks_agents_manager.update_block_id_for_agent( - agent_id=sarah_agent.id, block_label=default_block.label, new_block_id=other_block.id - ) - - assert updated_block.block_id == other_block.id - assert updated_block.block_label == default_block.label - assert updated_block.agent_id == sarah_agent.id - - -def test_list_block_ids_for_agent(server, sarah_agent, default_user, default_block, other_block): - server.blocks_agents_manager.add_block_to_agent(agent_id=sarah_agent.id, block_id=default_block.id, block_label=default_block.label) - server.blocks_agents_manager.add_block_to_agent(agent_id=sarah_agent.id, block_id=other_block.id, block_label=other_block.label) - - retrieved_block_ids = server.blocks_agents_manager.list_block_ids_for_agent(agent_id=sarah_agent.id) - - assert set(retrieved_block_ids) == {default_block.id, other_block.id} - - -def test_list_agent_ids_with_block(server, sarah_agent, charles_agent, default_user, default_block): - server.blocks_agents_manager.add_block_to_agent(agent_id=sarah_agent.id, block_id=default_block.id, block_label=default_block.label) - server.blocks_agents_manager.add_block_to_agent(agent_id=charles_agent.id, block_id=default_block.id, block_label=default_block.label) - - agent_ids = server.blocks_agents_manager.list_agent_ids_with_block(block_id=default_block.id) - - assert sarah_agent.id in agent_ids - assert charles_agent.id in agent_ids - assert len(agent_ids) == 2 - - -@pytest.mark.skipif(USING_SQLITE, reason="Skipped because using SQLite") -def test_add_block_to_agent_with_deleted_block(server, sarah_agent, default_user, default_block): - block_manager = BlockManager() - block_manager.delete_block(block_id=default_block.id, actor=default_user) - - with pytest.raises(ForeignKeyConstraintViolationError): - server.blocks_agents_manager.add_block_to_agent(agent_id=sarah_agent.id, block_id=default_block.id, block_label=default_block.label) - - -# ====================================================================================================================== -# ToolsAgentsManager Tests -# ====================================================================================================================== -def test_add_tool_to_agent(server, sarah_agent, default_user, print_tool): - tool_association = server.tools_agents_manager.add_tool_to_agent( - agent_id=sarah_agent.id, tool_id=print_tool.id, tool_name=print_tool.name - ) - - assert tool_association.agent_id == sarah_agent.id - assert tool_association.tool_id == print_tool.id - assert tool_association.tool_name == print_tool.name - - -def test_change_name_on_tool_reflects_in_tool_agents_table(server, sarah_agent, default_user, print_tool): - # Add the tool - tool_association = server.tools_agents_manager.add_tool_to_agent( - agent_id=sarah_agent.id, tool_id=print_tool.id, tool_name=print_tool.name - ) - assert tool_association.tool_name == print_tool.name - - # Change the tool name - new_name = "banana" - tool = server.tool_manager.update_tool_by_id(tool_id=print_tool.id, tool_update=ToolUpdate(name=new_name), actor=default_user) - assert tool.name == new_name - - # Get the association - names = server.tools_agents_manager.list_tool_names_for_agent(agent_id=sarah_agent.id) - assert new_name in names - assert print_tool.name not in names - - -@pytest.mark.skipif(USING_SQLITE, reason="Skipped because using SQLite") -def test_add_tool_to_agent_nonexistent_tool(server, sarah_agent, default_user): - with pytest.raises(ForeignKeyConstraintViolationError): - server.tools_agents_manager.add_tool_to_agent(agent_id=sarah_agent.id, tool_id="nonexistent_tool", tool_name="nonexistent_name") - - -def test_add_tool_to_agent_duplicate_name(server, sarah_agent, default_user, print_tool, other_tool): - server.tools_agents_manager.add_tool_to_agent(agent_id=sarah_agent.id, tool_id=print_tool.id, tool_name=print_tool.name) - - with pytest.warns(UserWarning, match=f"Tool name '{print_tool.name}' already exists for agent '{sarah_agent.id}'"): - server.tools_agents_manager.add_tool_to_agent(agent_id=sarah_agent.id, tool_id=other_tool.id, tool_name=print_tool.name) - - -def test_remove_tool_with_name_from_agent(server, sarah_agent, default_user, print_tool): - server.tools_agents_manager.add_tool_to_agent(agent_id=sarah_agent.id, tool_id=print_tool.id, tool_name=print_tool.name) - - removed_tool = server.tools_agents_manager.remove_tool_with_name_from_agent(agent_id=sarah_agent.id, tool_name=print_tool.name) - - assert removed_tool.tool_name == print_tool.name - assert removed_tool.tool_id == print_tool.id - assert removed_tool.agent_id == sarah_agent.id - - with pytest.raises(ValueError, match=f"Tool name '{print_tool.name}' not found for agent '{sarah_agent.id}'"): - server.tools_agents_manager.remove_tool_with_name_from_agent(agent_id=sarah_agent.id, tool_name=print_tool.name) - - -def test_list_tool_ids_for_agent(server, sarah_agent, default_user, print_tool, other_tool): - server.tools_agents_manager.add_tool_to_agent(agent_id=sarah_agent.id, tool_id=print_tool.id, tool_name=print_tool.name) - server.tools_agents_manager.add_tool_to_agent(agent_id=sarah_agent.id, tool_id=other_tool.id, tool_name=other_tool.name) - - retrieved_tool_ids = server.tools_agents_manager.list_tool_ids_for_agent(agent_id=sarah_agent.id) - - assert set(retrieved_tool_ids) == {print_tool.id, other_tool.id} - - -def test_list_agent_ids_with_tool(server, sarah_agent, charles_agent, default_user, print_tool): - server.tools_agents_manager.add_tool_to_agent(agent_id=sarah_agent.id, tool_id=print_tool.id, tool_name=print_tool.name) - server.tools_agents_manager.add_tool_to_agent(agent_id=charles_agent.id, tool_id=print_tool.id, tool_name=print_tool.name) - - agent_ids = server.tools_agents_manager.list_agent_ids_with_tool(tool_id=print_tool.id) - - assert sarah_agent.id in agent_ids - assert charles_agent.id in agent_ids - assert len(agent_ids) == 2 - - -@pytest.mark.skipif(USING_SQLITE, reason="Skipped because using SQLite") -def test_add_tool_to_agent_with_deleted_tool(server, sarah_agent, default_user, print_tool): - tool_manager = ToolManager() - tool_manager.delete_tool_by_id(tool_id=print_tool.id, actor=default_user) - - with pytest.raises(ForeignKeyConstraintViolationError): - server.tools_agents_manager.add_tool_to_agent(agent_id=sarah_agent.id, tool_id=print_tool.id, tool_name=print_tool.name) - - -def test_remove_all_agent_tools(server, sarah_agent, default_user, print_tool, other_tool): - server.tools_agents_manager.add_tool_to_agent(agent_id=sarah_agent.id, tool_id=print_tool.id, tool_name=print_tool.name) - server.tools_agents_manager.add_tool_to_agent(agent_id=sarah_agent.id, tool_id=other_tool.id, tool_name=other_tool.name) - - server.tools_agents_manager.remove_all_agent_tools(agent_id=sarah_agent.id) - - retrieved_tool_ids = server.tools_agents_manager.list_tool_ids_for_agent(agent_id=sarah_agent.id) - - assert not retrieved_tool_ids - - # ====================================================================================================================== # JobManager Tests # ====================================================================================================================== diff --git a/tests/test_new_cli.py b/tests/test_new_cli.py deleted file mode 100644 index a41dbc293d..0000000000 --- a/tests/test_new_cli.py +++ /dev/null @@ -1,126 +0,0 @@ -# TODO: fix later - -# import os -# import random -# import string -# import unittest.mock -# -# import pytest -# -# from letta.cli.cli_config import add, delete, list -# from letta.config import LettaConfig -# from letta.credentials import LettaCredentials -# from tests.utils import create_config -# -# -# def _reset_config(): -# -# if os.getenv("OPENAI_API_KEY"): -# create_config("openai") -# credentials = LettaCredentials( -# openai_key=os.getenv("OPENAI_API_KEY"), -# ) -# else: # hosted -# create_config("letta_hosted") -# credentials = LettaCredentials() -# -# config = LettaConfig.load() -# config.save() -# credentials.save() -# print("_reset_config :: ", config.config_path) -# -# -# @pytest.mark.skip(reason="This is a helper function.") -# def generate_random_string(length): -# characters = string.ascii_letters + string.digits -# random_string = "".join(random.choices(characters, k=length)) -# return random_string -# -# -# @pytest.mark.skip(reason="Ensures LocalClient is used during testing.") -# def unset_env_variables(): -# server_url = os.environ.pop("MEMGPT_BASE_URL", None) -# token = os.environ.pop("MEMGPT_SERVER_PASS", None) -# return server_url, token -# -# -# @pytest.mark.skip(reason="Set env variables back to values before test.") -# def reset_env_variables(server_url, token): -# if server_url is not None: -# os.environ["MEMGPT_BASE_URL"] = server_url -# if token is not None: -# os.environ["MEMGPT_SERVER_PASS"] = token -# -# -# def test_crud_human(capsys): -# _reset_config() -# -# server_url, token = unset_env_variables() -# -# # Initialize values that won't interfere with existing ones -# human_1 = generate_random_string(16) -# text_1 = generate_random_string(32) -# human_2 = generate_random_string(16) -# text_2 = generate_random_string(32) -# text_3 = generate_random_string(32) -# -# # Add inital human -# add("human", human_1, text_1) -# -# # Expect inital human to be listed -# list("humans") -# captured = capsys.readouterr() -# output = captured.out[captured.out.find(human_1) :] -# -# assert human_1 in output -# assert text_1 in output -# -# # Add second human -# add("human", human_2, text_2) -# -# # Expect to see second human -# list("humans") -# captured = capsys.readouterr() -# output = captured.out[captured.out.find(human_1) :] -# -# assert human_1 in output -# assert text_1 in output -# assert human_2 in output -# assert text_2 in output -# -# with unittest.mock.patch("questionary.confirm") as mock_confirm: -# mock_confirm.return_value.ask.return_value = True -# -# # Update second human -# add("human", human_2, text_3) -# -# # Expect to see update text -# list("humans") -# captured = capsys.readouterr() -# output = captured.out[captured.out.find(human_1) :] -# -# assert human_1 in output -# assert text_1 in output -# assert human_2 in output -# assert output.count(human_2) == 1 -# assert text_3 in output -# assert text_2 not in output -# -# # Delete second human -# delete("human", human_2) -# -# # Expect second human to be deleted -# list("humans") -# captured = capsys.readouterr() -# output = captured.out[captured.out.find(human_1) :] -# -# assert human_1 in output -# assert text_1 in output -# assert human_2 not in output -# assert text_2 not in output -# -# # Clean up -# delete("human", human_1) -# -# reset_env_variables(server_url, token) -# diff --git a/tests/test_openai_client.py b/tests/test_openai_client.py deleted file mode 100644 index 1fd3c6d4ee..0000000000 --- a/tests/test_openai_client.py +++ /dev/null @@ -1,93 +0,0 @@ -from logging import getLogger - -from openai import APIConnectionError, OpenAI - -logger = getLogger(__name__) - - -def test_openai_assistant(): - client = OpenAI(base_url="http://127.0.0.1:8080/v1") - # create assistant - try: - assistant = client.beta.assistants.create( - name="Math Tutor", - instructions="You are a personal math tutor. Write and run code to answer math questions.", - # tools=[{"type": "code_interpreter"}], - model="gpt-4-turbo-preview", - ) - except APIConnectionError as e: - logger.error("Connection issue with localhost openai stub: %s", e) - return - # create thread - thread = client.beta.threads.create() - - message = client.beta.threads.messages.create( - thread_id=thread.id, role="user", content="I need to solve the equation `3x + 11 = 14`. Can you help me?" - ) - - run = client.beta.threads.runs.create( - thread_id=thread.id, assistant_id=assistant.id, instructions="Please address the user as Jane Doe. The user has a premium account." - ) - - # run = client.beta.threads.runs.create( - # thread_id=thread.id, - # assistant_id=assistant.id, - # model="gpt-4-turbo-preview", - # instructions="New instructions that override the Assistant instructions", - # tools=[{"type": "code_interpreter"}, {"type": "retrieval"}] - # ) - - # Store the run ID - run_id = run.id - print(run_id) - - # NOTE: Letta does not support polling yet, so run status is always "completed" - # Retrieve all messages from the thread - messages = client.beta.threads.messages.list(thread_id=thread.id) - - # Print all messages from the thread - for msg in messages.messages: - role = msg["role"] - content = msg["content"][0] - print(f"{role.capitalize()}: {content}") - - # TODO: add once polling works - ## Polling for the run status - # while True: - # # Retrieve the run status - # run_status = client.beta.threads.runs.retrieve( - # thread_id=thread.id, - # run_id=run_id - # ) - - # # Check and print the step details - # run_steps = client.beta.threads.runs.steps.list( - # thread_id=thread.id, - # run_id=run_id - # ) - # for step in run_steps.data: - # if step.type == 'tool_calls': - # print(f"Tool {step.type} invoked.") - - # # If step involves code execution, print the code - # if step.type == 'code_interpreter': - # print(f"Python Code Executed: {step.step_details['code_interpreter']['input']}") - - # if run_status.status == 'completed': - # # Retrieve all messages from the thread - # messages = client.beta.threads.messages.list( - # thread_id=thread.id - # ) - - # # Print all messages from the thread - # for msg in messages.data: - # role = msg.role - # content = msg.content[0].text.value - # print(f"{role.capitalize()}: {content}") - # break # Exit the polling loop since the run is complete - # elif run_status.status in ['queued', 'in_progress']: - # print(f'{run_status.status.capitalize()}... Please wait.') - # time.sleep(1.5) # Wait before checking again - # else: - # print(f"Run status: {run_status.status}") - # break # Exit the polling loop if the status is neither 'in_progress' nor 'completed' diff --git a/tests/test_persistence.py b/tests/test_persistence.py deleted file mode 100644 index 9b86f2b235..0000000000 --- a/tests/test_persistence.py +++ /dev/null @@ -1,52 +0,0 @@ -# test state saving between client session -# TODO: update this test with correct imports - - -# def test_save_load(client): -# """Test that state is being persisted correctly after an /exit -# -# Create a new agent, and request a message -# -# Then trigger -# """ -# assert client is not None, "Run create_agent test first" -# assert test_agent_state is not None, "Run create_agent test first" -# assert test_agent_state_post_message is not None, "Run test_user_message test first" -# -# # Create a new client (not thread safe), and load the same agent -# # The agent state inside should correspond to the initial state pre-message -# if os.getenv("OPENAI_API_KEY"): -# client2 = Letta(quickstart="openai", user_id=test_user_id) -# else: -# client2 = Letta(quickstart="letta_hosted", user_id=test_user_id) -# print(f"\n\n[3] CREATING CLIENT2, LOADING AGENT {test_agent_state.id}!") -# client2_agent_obj = client2.server.load_agent(user_id=test_user_id, agent_id=test_agent_state.id) -# client2_agent_state = client2_agent_obj.update_state() -# print(f"[3] LOADED AGENT! AGENT {client2_agent_state.id}\n\tmessages={client2_agent_state.state['messages']}") -# -# # assert test_agent_state == client2_agent_state, f"{vars(test_agent_state)}\n{vars(client2_agent_state)}" -# def check_state_equivalence(state_1, state_2): -# """Helper function that checks the equivalence of two AgentState objects""" -# assert state_1.keys() == state_2.keys(), f"{state_1.keys()}\n{state_2.keys}" -# for k, v1 in state_1.items(): -# v2 = state_2[k] -# if isinstance(v1, LLMConfig) or isinstance(v1, EmbeddingConfig): -# assert vars(v1) == vars(v2), f"{vars(v1)}\n{vars(v2)}" -# else: -# assert v1 == v2, f"{v1}\n{v2}" -# -# check_state_equivalence(vars(test_agent_state), vars(client2_agent_state)) -# -# # Now, write out the save from the original client -# # This should persist the test message into the agent state -# client.save() -# -# if os.getenv("OPENAI_API_KEY"): -# client3 = Letta(quickstart="openai", user_id=test_user_id) -# else: -# client3 = Letta(quickstart="letta_hosted", user_id=test_user_id) -# client3_agent_obj = client3.server.load_agent(user_id=test_user_id, agent_id=test_agent_state.id) -# client3_agent_state = client3_agent_obj.update_state() -# -# check_state_equivalence(vars(test_agent_state_post_message), vars(client3_agent_state)) -# diff --git a/tests/test_schema_generator.py b/tests/test_schema_generator.py deleted file mode 100644 index d4eaec0c45..0000000000 --- a/tests/test_schema_generator.py +++ /dev/null @@ -1,62 +0,0 @@ -from letta.functions.schema_generator import generate_schema - - -def send_message(self, message: str): - """ - Sends a message to the human user. - - Args: - message (str): Message contents. All unicode (including emojis) are supported. - - Returns: - Optional[str]: None is always returned as this function does not produce a response. - """ - return None - - -def send_message_missing_types(self, message): - """ - Sends a message to the human user. - - Args: - message (str): Message contents. All unicode (including emojis) are supported. - - Returns: - Optional[str]: None is always returned as this function does not produce a response. - """ - return None - - -def send_message_missing_docstring(self, message: str): - return None - - -def test_schema_generator(): - # Check that a basic function schema converts correctly - correct_schema = { - "name": "send_message", - "description": "Sends a message to the human user.", - "parameters": { - "type": "object", - "properties": {"message": {"type": "string", "description": "Message contents. All unicode (including emojis) are supported."}}, - "required": ["message"], - }, - } - generated_schema = generate_schema(send_message) - print(f"\n\nreference_schema={correct_schema}") - print(f"\n\ngenerated_schema={generated_schema}") - assert correct_schema == generated_schema - - # Check that missing types results in an error - try: - _ = generate_schema(send_message_missing_types) - assert False - except: - pass - - # Check that missing docstring results in an error - try: - _ = generate_schema(send_message_missing_docstring) - assert False - except: - pass diff --git a/tests/test_server.py b/tests/test_server.py index 482fe8943f..09dfb94cd2 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -19,8 +19,6 @@ ) from letta.schemas.user import User -from .test_managers import DEFAULT_EMBEDDING_CONFIG - utils.DEBUG = True from letta.config import LettaConfig from letta.schemas.agent import CreateAgent @@ -266,6 +264,7 @@ thing can be arranged. It shall be on your family's behalf that I'll start my apprenticeship as old maid.""" + @pytest.fixture(scope="module") def server(): config = LettaConfig.load() @@ -302,42 +301,66 @@ def user_id(server, org_id): @pytest.fixture(scope="module") -def agent_id(server, user_id): +def base_tools(server, user_id): + actor = server.user_manager.get_user_or_default(user_id) + tools = [] + for tool_name in BASE_TOOLS: + tools.append(server.tool_manager.get_tool_by_name(tool_name=tool_name, actor=actor)) + + yield tools + + +@pytest.fixture(scope="module") +def base_memory_tools(server, user_id): + actor = server.user_manager.get_user_or_default(user_id) + tools = [] + for tool_name in BASE_MEMORY_TOOLS: + tools.append(server.tool_manager.get_tool_by_name(tool_name=tool_name, actor=actor)) + + yield tools + + +@pytest.fixture(scope="module") +def agent_id(server, user_id, base_tools): # create agent + actor = server.user_manager.get_user_or_default(user_id) agent_state = server.create_agent( request=CreateAgent( name="test_agent", - tools=BASE_TOOLS, + tool_ids=[t.id for t in base_tools], memory_blocks=[], llm_config=LLMConfig.default_config("gpt-4"), embedding_config=EmbeddingConfig.default_config(provider="openai"), ), - actor=server.get_user_or_default(user_id), + actor=actor, ) print(f"Created agent\n{agent_state}") yield agent_state.id # cleanup - server.delete_agent(user_id, agent_state.id) + server.agent_manager.delete_agent(agent_state.id, actor=actor) + @pytest.fixture(scope="module") -def other_agent_id(server, user_id): +def other_agent_id(server, user_id, base_tools): # create agent + actor = server.user_manager.get_user_or_default(user_id) agent_state = server.create_agent( request=CreateAgent( name="test_agent_other", - tools=BASE_TOOLS, + tool_ids=[t.id for t in base_tools], memory_blocks=[], llm_config=LLMConfig.default_config("gpt-4"), embedding_config=EmbeddingConfig.default_config(provider="openai"), ), - actor=server.get_user_or_default(user_id), + actor=actor, ) print(f"Created agent\n{agent_state}") yield agent_state.id # cleanup - server.delete_agent(user_id, agent_state.id) + server.agent_manager.delete_agent(agent_state.id, actor=actor) + def test_error_on_nonexistent_agent(server, user_id, agent_id): try: @@ -416,6 +439,7 @@ def test_user_message(server, user_id, agent_id): @pytest.mark.order(5) def test_get_recall_memory(server, org_id, user_id, agent_id): # test recall memory cursor pagination + actor = server.user_manager.get_user_or_default(user_id=user_id) messages_1 = server.get_agent_recall_cursor(user_id=user_id, agent_id=agent_id, limit=2) cursor1 = messages_1[-1].id messages_2 = server.get_agent_recall_cursor(user_id=user_id, agent_id=agent_id, after=cursor1, limit=1000) @@ -427,7 +451,9 @@ def test_get_recall_memory(server, org_id, user_id, agent_id): assert len(messages_4) == 1 # test in-context message ids - in_context_ids = server.get_in_context_message_ids(agent_id=agent_id) + # in_context_ids = server.get_in_context_message_ids(agent_id=agent_id) + in_context_ids = server.agent_manager.get_agent_by_id(agent_id=agent_id, actor=actor).message_ids + message_ids = [m.id for m in messages_3] for message_id in in_context_ids: assert message_id in message_ids, f"{message_id} not in {message_ids}" @@ -437,10 +463,13 @@ def test_get_recall_memory(server, org_id, user_id, agent_id): def test_get_archival_memory(server, user_id, agent_id): # test archival memory cursor pagination user = server.user_manager.get_user_by_id(user_id=user_id) - + # List latest 2 passages passages_1 = server.passage_manager.list_passages( - actor=user, agent_id=agent_id, ascending=False, limit=2, + actor=user, + agent_id=agent_id, + ascending=False, + limit=2, ) assert len(passages_1) == 2, f"Returned {[p.text for p in passages_1]}, not equal to 2" @@ -483,12 +512,13 @@ def test_agent_rethink_rewrite_retry(server, user_id, agent_id): - "rewrite" replaces the text of the last assistant message - "retry" retries the last assistant message """ + actor = server.user_manager.get_user_or_default(user_id) # Send an initial message server.user_message(user_id=user_id, agent_id=agent_id, message="Hello?") # Grab the raw Agent object - letta_agent = server.load_agent(agent_id=agent_id) + letta_agent = server.load_agent(agent_id=agent_id, actor=actor) assert letta_agent._messages[-1].role == MessageRole.tool assert letta_agent._messages[-2].role == MessageRole.assistant last_agent_message = letta_agent._messages[-2] @@ -496,10 +526,10 @@ def test_agent_rethink_rewrite_retry(server, user_id, agent_id): # Try "rethink" new_thought = "I am thinking about the meaning of life, the universe, and everything. Bananas?" assert last_agent_message.text is not None and last_agent_message.text != new_thought - server.rethink_agent_message(agent_id=agent_id, new_thought=new_thought) + server.rethink_agent_message(agent_id=agent_id, new_thought=new_thought, actor=actor) # Grab the agent object again (make sure it's live) - letta_agent = server.load_agent(agent_id=agent_id) + letta_agent = server.load_agent(agent_id=agent_id, actor=actor) assert letta_agent._messages[-1].role == MessageRole.tool assert letta_agent._messages[-2].role == MessageRole.assistant last_agent_message = letta_agent._messages[-2] @@ -513,10 +543,10 @@ def test_agent_rethink_rewrite_retry(server, user_id, agent_id): assert "message" in args_json and args_json["message"] is not None and args_json["message"] != "" new_text = "Why hello there my good friend! Is 42 what you're looking for? Bananas?" - server.rewrite_agent_message(agent_id=agent_id, new_text=new_text) + server.rewrite_agent_message(agent_id=agent_id, new_text=new_text, actor=actor) # Grab the agent object again (make sure it's live) - letta_agent = server.load_agent(agent_id=agent_id) + letta_agent = server.load_agent(agent_id=agent_id, actor=actor) assert letta_agent._messages[-1].role == MessageRole.tool assert letta_agent._messages[-2].role == MessageRole.assistant last_agent_message = letta_agent._messages[-2] @@ -524,10 +554,10 @@ def test_agent_rethink_rewrite_retry(server, user_id, agent_id): assert "message" in args_json and args_json["message"] is not None and args_json["message"] == new_text # Try retry - server.retry_agent_message(agent_id=agent_id) + server.retry_agent_message(agent_id=agent_id, actor=actor) # Grab the agent object again (make sure it's live) - letta_agent = server.load_agent(agent_id=agent_id) + letta_agent = server.load_agent(agent_id=agent_id, actor=actor) assert letta_agent._messages[-1].role == MessageRole.tool assert letta_agent._messages[-2].role == MessageRole.assistant last_agent_message = letta_agent._messages[-2] @@ -581,33 +611,6 @@ def test_get_context_window_overview(server: SyncServer, user_id: str, agent_id: ) -def test_load_agent_with_nonexistent_tool_names_does_not_error(server: SyncServer, user_id: str): - fake_tool_name = "blahblahblah" - tools = BASE_TOOLS + [fake_tool_name] - agent_state = server.create_agent( - request=CreateAgent( - name="nonexistent_tools_agent", - tools=tools, - memory_blocks=[], - llm_config=LLMConfig.default_config("gpt-4"), - embedding_config=EmbeddingConfig.default_config(provider="openai"), - ), - actor=server.get_user_or_default(user_id), - ) - - # Check that the tools in agent_state do NOT include the fake name - assert fake_tool_name not in agent_state.tool_names - assert set(BASE_TOOLS).issubset(set(agent_state.tool_names)) - - # Load the agent from the database and check that it doesn't error / tools are correct - saved_tools = server.get_tools_from_agent(agent_id=agent_state.id, user_id=user_id) - assert fake_tool_name not in agent_state.tool_names - assert set(BASE_TOOLS).issubset(set(agent_state.tool_names)) - - # cleanup - server.delete_agent(user_id, agent_state.id) - - def test_delete_agent_same_org(server: SyncServer, org_id: str, user_id: str): agent_state = server.create_agent( request=CreateAgent( @@ -616,14 +619,14 @@ def test_delete_agent_same_org(server: SyncServer, org_id: str, user_id: str): llm_config=LLMConfig.default_config("gpt-4"), embedding_config=EmbeddingConfig.default_config(provider="openai"), ), - actor=server.get_user_or_default(user_id), + actor=server.user_manager.get_user_or_default(user_id), ) # create another user in the same org another_user = server.user_manager.create_user(User(organization_id=org_id, name="another")) # test that another user in the same org can delete the agent - server.delete_agent(another_user.id, agent_state.id) + server.agent_manager.delete_agent(agent_state.id, actor=another_user) def _test_get_messages_letta_format( @@ -887,14 +890,14 @@ def test_composio_client_simple(server): assert len(actions) > 0 -def test_memory_rebuild_count(server, user_id, mock_e2b_api_key_none): +def test_memory_rebuild_count(server, user_id, mock_e2b_api_key_none, base_tools, base_memory_tools): """Test that the memory rebuild is generating the correct number of role=system messages""" - + actor = server.user_manager.get_user_or_default(user_id) # create agent agent_state = server.create_agent( request=CreateAgent( name="memory_rebuild_test_agent", - tools=BASE_TOOLS + BASE_MEMORY_TOOLS, + tool_ids=[t.id for t in base_tools + base_memory_tools], memory_blocks=[ CreateBlock(label="human", value="The human's name is Bob."), CreateBlock(label="persona", value="My name is Alice."), @@ -902,7 +905,7 @@ def test_memory_rebuild_count(server, user_id, mock_e2b_api_key_none): llm_config=LLMConfig.default_config("gpt-4"), embedding_config=EmbeddingConfig.default_config(provider="openai"), ), - actor=server.get_user_or_default(user_id), + actor=actor, ) print(f"Created agent\n{agent_state}") @@ -929,31 +932,28 @@ def count_system_messages_in_recall() -> Tuple[int, List[LettaMessage]]: try: # At this stage, there should only be 1 system message inside of recall storage num_system_messages, all_messages = count_system_messages_in_recall() - # assert num_system_messages == 1, (num_system_messages, all_messages) - assert num_system_messages == 2, (num_system_messages, all_messages) + assert num_system_messages == 1, (num_system_messages, all_messages) # Assuming core memory append actually ran correctly, at this point there should be 2 messages server.user_message(user_id=user_id, agent_id=agent_state.id, message="Append 'banana' to your core memory") - # At this stage, there should only be 1 system message inside of recall storage + # At this stage, there should be 2 system message inside of recall storage num_system_messages, all_messages = count_system_messages_in_recall() - # assert num_system_messages == 2, (num_system_messages, all_messages) - assert num_system_messages == 3, (num_system_messages, all_messages) + assert num_system_messages == 2, (num_system_messages, all_messages) # Run server.load_agent, and make sure that the number of system messages is still 2 - server.load_agent(agent_id=agent_state.id) + server.load_agent(agent_id=agent_state.id, actor=actor) num_system_messages, all_messages = count_system_messages_in_recall() - # assert num_system_messages == 2, (num_system_messages, all_messages) - assert num_system_messages == 3, (num_system_messages, all_messages) + assert num_system_messages == 2, (num_system_messages, all_messages) finally: # cleanup - server.delete_agent(user_id, agent_state.id) + server.agent_manager.delete_agent(agent_state.id, actor=actor) def test_load_file_to_source(server: SyncServer, user_id: str, agent_id: str, other_agent_id: str, tmp_path): - user = server.get_user_or_default(user_id) + actor = server.user_manager.get_user_or_default(user_id) # Create a source source = server.source_manager.create_source( @@ -962,7 +962,7 @@ def test_load_file_to_source(server: SyncServer, user_id: str, agent_id: str, ot embedding_config=EmbeddingConfig.default_config(provider="openai"), created_by_id=user_id, ), - actor=user + actor=actor, ) # Create a test file with some content @@ -971,11 +971,10 @@ def test_load_file_to_source(server: SyncServer, user_id: str, agent_id: str, ot test_file.write_text(test_content) # Attach source to agent first - agent = server.load_agent(agent_id=agent_id) - agent.attach_source(user=user, source_id=source.id, source_manager=server.source_manager, ms=server.ms) + server.agent_manager.attach_source(agent_id=agent_id, source_id=source.id, actor=actor) # Get initial passage count - initial_passage_count = server.passage_manager.size(actor=user, agent_id=agent_id, source_id=source.id) + initial_passage_count = server.passage_manager.size(actor=actor, agent_id=agent_id, source_id=source.id) assert initial_passage_count == 0 # Create a job for loading the first file @@ -984,7 +983,7 @@ def test_load_file_to_source(server: SyncServer, user_id: str, agent_id: str, ot user_id=user_id, metadata_={"type": "embedding", "filename": test_file.name, "source_id": source.id}, ), - actor=user + actor=actor, ) # Load the first file to source @@ -992,17 +991,17 @@ def test_load_file_to_source(server: SyncServer, user_id: str, agent_id: str, ot source_id=source.id, file_path=str(test_file), job_id=job.id, - actor=user, + actor=actor, ) # Verify job completed successfully - job = server.job_manager.get_job_by_id(job_id=job.id, actor=user) + job = server.job_manager.get_job_by_id(job_id=job.id, actor=actor) assert job.status == "completed" - assert job.metadata_["num_passages"] == 1 + assert job.metadata_["num_passages"] == 1 assert job.metadata_["num_documents"] == 1 # Verify passages were added - first_file_passage_count = server.passage_manager.size(actor=user, agent_id=agent_id, source_id=source.id) + first_file_passage_count = server.passage_manager.size(actor=actor, agent_id=agent_id, source_id=source.id) assert first_file_passage_count > initial_passage_count # Create a second test file with different content @@ -1015,7 +1014,7 @@ def test_load_file_to_source(server: SyncServer, user_id: str, agent_id: str, ot user_id=user_id, metadata_={"type": "embedding", "filename": test_file2.name, "source_id": source.id}, ), - actor=user + actor=actor, ) # Load the second file to source @@ -1023,22 +1022,22 @@ def test_load_file_to_source(server: SyncServer, user_id: str, agent_id: str, ot source_id=source.id, file_path=str(test_file2), job_id=job2.id, - actor=user, + actor=actor, ) # Verify second job completed successfully - job2 = server.job_manager.get_job_by_id(job_id=job2.id, actor=user) + job2 = server.job_manager.get_job_by_id(job_id=job2.id, actor=actor) assert job2.status == "completed" assert job2.metadata_["num_passages"] >= 10 assert job2.metadata_["num_documents"] == 1 # Verify passages were appended (not replaced) - final_passage_count = server.passage_manager.size(actor=user, agent_id=agent_id, source_id=source.id) + final_passage_count = server.passage_manager.size(actor=actor, agent_id=agent_id, source_id=source.id) assert final_passage_count > first_file_passage_count # Verify both old and new content is searchable passages = server.passage_manager.list_passages( - actor=user, + actor=actor, agent_id=agent_id, source_id=source.id, query_text="what does Timber like to eat", diff --git a/tests/test_summarize.py b/tests/test_summarize.py index 4bf180e108..8996841347 100644 --- a/tests/test_summarize.py +++ b/tests/test_summarize.py @@ -33,7 +33,7 @@ def create_test_agent(): ) global agent_obj - agent_obj = client.server.load_agent(agent_id=agent_state.id) + agent_obj = client.server.load_agent(agent_id=agent_state.id, actor=client.user) def test_summarize_messages_inplace(mock_e2b_api_key_none): @@ -74,7 +74,7 @@ def test_summarize_messages_inplace(mock_e2b_api_key_none): print(f"test_summarize: response={response}") # reload agent object - agent_obj = client.server.load_agent(agent_id=agent_obj.agent_state.id) + agent_obj = client.server.load_agent(agent_id=agent_obj.agent_state.id, actor=client.user) agent_obj.summarize_messages_inplace() print(f"Summarization succeeded: messages[1] = \n{agent_obj.messages[1]}") @@ -121,7 +121,7 @@ def summarize_message_exists(messages: List[Message]) -> bool: # check if the summarize message is inside the messages assert isinstance(client, LocalClient), "Test only works with LocalClient" - agent_obj = client.server.load_agent(agent_id=agent_state.id) + agent_obj = client.server.load_agent(agent_id=agent_state.id, actor=client.user) print("SUMMARY", summarize_message_exists(agent_obj._messages)) if summarize_message_exists(agent_obj._messages): break diff --git a/tests/test_v1_routes.py b/tests/test_v1_routes.py index 8f9d9972fe..d82bbc11a3 100644 --- a/tests/test_v1_routes.py +++ b/tests/test_v1_routes.py @@ -169,7 +169,7 @@ def configure_mock_sync_server(mock_sync_server): mock_sync_server.sandbox_config_manager.list_sandbox_env_vars_by_key.return_value = [mock_api_key] # Mock user retrieval - mock_sync_server.get_user_or_default.return_value = Mock() # Provide additional attributes if needed + mock_sync_server.user_manager.get_user_or_default.return_value = Mock() # Provide additional attributes if needed # ====================================================================================================================== @@ -182,7 +182,7 @@ def test_delete_tool(client, mock_sync_server, add_integers_tool): assert response.status_code == 200 mock_sync_server.tool_manager.delete_tool_by_id.assert_called_once_with( - tool_id=add_integers_tool.id, actor=mock_sync_server.get_user_or_default.return_value + tool_id=add_integers_tool.id, actor=mock_sync_server.user_manager.get_user_or_default.return_value ) @@ -195,7 +195,7 @@ def test_get_tool(client, mock_sync_server, add_integers_tool): assert response.json()["id"] == add_integers_tool.id assert response.json()["source_code"] == add_integers_tool.source_code mock_sync_server.tool_manager.get_tool_by_id.assert_called_once_with( - tool_id=add_integers_tool.id, actor=mock_sync_server.get_user_or_default.return_value + tool_id=add_integers_tool.id, actor=mock_sync_server.user_manager.get_user_or_default.return_value ) @@ -216,7 +216,7 @@ def test_get_tool_id(client, mock_sync_server, add_integers_tool): assert response.status_code == 200 assert response.json() == add_integers_tool.id mock_sync_server.tool_manager.get_tool_by_name.assert_called_once_with( - tool_name=add_integers_tool.name, actor=mock_sync_server.get_user_or_default.return_value + tool_name=add_integers_tool.name, actor=mock_sync_server.user_manager.get_user_or_default.return_value ) @@ -268,7 +268,7 @@ def test_update_tool(client, mock_sync_server, update_integers_tool, add_integer assert response.status_code == 200 assert response.json()["id"] == add_integers_tool.id mock_sync_server.tool_manager.update_tool_by_id.assert_called_once_with( - tool_id=add_integers_tool.id, tool_update=update_integers_tool, actor=mock_sync_server.get_user_or_default.return_value + tool_id=add_integers_tool.id, tool_update=update_integers_tool, actor=mock_sync_server.user_manager.get_user_or_default.return_value ) @@ -280,7 +280,9 @@ def test_add_base_tools(client, mock_sync_server, add_integers_tool): assert response.status_code == 200 assert len(response.json()) == 1 assert response.json()[0]["id"] == add_integers_tool.id - mock_sync_server.tool_manager.add_base_tools.assert_called_once_with(actor=mock_sync_server.get_user_or_default.return_value) + mock_sync_server.tool_manager.add_base_tools.assert_called_once_with( + actor=mock_sync_server.user_manager.get_user_or_default.return_value + ) def test_list_composio_apps(client, mock_sync_server, composio_apps): diff --git a/tests/test_vector_embeddings.py b/tests/test_vector_embeddings.py index 0ad25071ab..e65e6b9b1d 100644 --- a/tests/test_vector_embeddings.py +++ b/tests/test_vector_embeddings.py @@ -1,42 +1,39 @@ import numpy as np -import sqlite3 -import base64 -from numpy.testing import assert_array_almost_equal -import pytest +from letta.orm.sqlalchemy_base import adapt_array +from letta.orm.sqlite_functions import convert_array, verify_embedding_dimension -from letta.orm.sqlalchemy_base import adapt_array, convert_array -from letta.orm.sqlite_functions import verify_embedding_dimension def test_vector_conversions(): """Test the vector conversion functions""" # Create test data original = np.random.random(4096).astype(np.float32) print(f"Original shape: {original.shape}") - + # Test full conversion cycle encoded = adapt_array(original) print(f"Encoded type: {type(encoded)}") print(f"Encoded length: {len(encoded)}") - + decoded = convert_array(encoded) print(f"Decoded shape: {decoded.shape}") print(f"Dimension verification: {verify_embedding_dimension(decoded)}") - + # Verify data integrity np.testing.assert_array_almost_equal(original, decoded) print("✓ Data integrity verified") - + # Test with a list list_data = original.tolist() encoded_list = adapt_array(list_data) decoded_list = convert_array(encoded_list) np.testing.assert_array_almost_equal(original, decoded_list) print("✓ List conversion verified") - + # Test None handling assert adapt_array(None) is None assert convert_array(None) is None print("✓ None handling verified") -# Run the tests \ No newline at end of file + +# Run the tests From 67f3b0c72bb085d22e60a13b27725aadd92b8a4d Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Fri, 13 Dec 2024 15:03:48 -0800 Subject: [PATCH 083/280] Fix: Move orm metadata out of write-only Agent pydantic objects (#2249) --- letta/orm/source.py | 3 ++- letta/schemas/agent.py | 26 +++++++++++++------------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/letta/orm/source.py b/letta/orm/source.py index e849cddb7d..b933f95f19 100644 --- a/letta/orm/source.py +++ b/letta/orm/source.py @@ -3,6 +3,7 @@ from sqlalchemy import JSON, TypeDecorator from sqlalchemy.orm import Mapped, mapped_column, relationship +from letta.orm import FileMetadata from letta.orm.mixins import OrganizationMixin from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.schemas.embedding_config import EmbeddingConfig @@ -47,5 +48,5 @@ class Source(SqlalchemyBase, OrganizationMixin): # relationships organization: Mapped["Organization"] = relationship("Organization", back_populates="sources") - files: Mapped[List["Source"]] = relationship("FileMetadata", back_populates="source", cascade="all, delete-orphan") + files: Mapped[List["FileMetadata"]] = relationship("FileMetadata", back_populates="source", cascade="all, delete-orphan") agents: Mapped[List["Agent"]] = relationship("Agent", secondary="sources_agents", back_populates="sources") diff --git a/letta/schemas/agent.py b/letta/schemas/agent.py index 994233ab74..ea3afd28a7 100644 --- a/letta/schemas/agent.py +++ b/letta/schemas/agent.py @@ -16,14 +16,6 @@ from letta.utils import create_random_username -class BaseAgent(OrmMetadataBase, validate_assignment=True): - __id_prefix__ = "agent" - description: Optional[str] = Field(None, description="The description of the agent.") - - # metadata - metadata_: Optional[Dict] = Field(None, description="The metadata of the agent.", alias="metadata_") - - class AgentType(str, Enum): """ Enum to represent the type of agent. @@ -36,7 +28,7 @@ class AgentType(str, Enum): chat_only_agent = "chat_only_agent" -class AgentState(BaseAgent): +class AgentState(OrmMetadataBase, validate_assignment=True): """ Representation of an agent's state. This is the state of the agent at a given time, and is persisted in the DB backend. The state has all the information needed to recreate a persisted agent. @@ -53,8 +45,10 @@ class AgentState(BaseAgent): """ + __id_prefix__ = "agent" + # NOTE: this is what is returned to the client and also what is used to initialize `Agent` - id: str = BaseAgent.generate_id_field() + id: str = Field(..., description="The id of the agent. Assigned by the database.") name: str = Field(..., description="The name of the agent.") # tool rules tool_rules: Optional[List[ToolRule]] = Field(default=None, description="The list of tool rules.") @@ -76,14 +70,16 @@ class AgentState(BaseAgent): # Field in this object can be theoretically edited by tools, and will be persisted by the ORM organization_id: Optional[str] = Field(None, description="The unique identifier of the organization associated with the agent.") + description: Optional[str] = Field(None, description="The description of the agent.") + metadata_: Optional[Dict] = Field(None, description="The metadata of the agent.", alias="metadata_") + memory: Memory = Field(..., description="The in-context memory of the agent.") tools: List[Tool] = Field(..., description="The tools used by the agent.") sources: List[Source] = Field(..., description="The sources used by the agent.") tags: List[str] = Field(..., description="The tags associated with the agent.") - # TODO: add in context message objects -class CreateAgent(BaseAgent): # +class CreateAgent(BaseModel, validate_assignment=True): # # all optional as server can generate defaults name: str = Field(default_factory=lambda: create_random_username(), description="The name of the agent.") @@ -109,6 +105,8 @@ class CreateAgent(BaseAgent): # None, description="The initial set of messages to put in the agent's in-context memory." ) include_base_tools: bool = Field(True, description="The LLM configuration used by the agent.") + description: Optional[str] = Field(None, description="The description of the agent.") + metadata_: Optional[Dict] = Field(None, description="The metadata of the agent.", alias="metadata_") @field_validator("name") @classmethod @@ -136,7 +134,7 @@ def validate_name(cls, name: str) -> str: return name -class UpdateAgent(BaseAgent): +class UpdateAgent(BaseModel): name: Optional[str] = Field(None, description="The name of the agent.") tool_ids: Optional[List[str]] = Field(None, description="The ids of the tools used by the agent.") source_ids: Optional[List[str]] = Field(None, description="The ids of the sources used by the agent.") @@ -147,6 +145,8 @@ class UpdateAgent(BaseAgent): llm_config: Optional[LLMConfig] = Field(None, description="The LLM configuration used by the agent.") embedding_config: Optional[EmbeddingConfig] = Field(None, description="The embedding configuration used by the agent.") message_ids: Optional[List[str]] = Field(None, description="The ids of the messages in the agent's in-context memory.") + description: Optional[str] = Field(None, description="The description of the agent.") + metadata_: Optional[Dict] = Field(None, description="The metadata of the agent.", alias="metadata_") class Config: extra = "ignore" # Ignores extra fields From 06622c9a60822b9982324390e14c9b631835d5e7 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Fri, 13 Dec 2024 16:42:49 -0800 Subject: [PATCH 084/280] fix: Changing e2b template id as an env var reflects immediately (#2250) --- letta/schemas/sandbox_config.py | 13 ++++++++++++- letta/services/sandbox_config_manager.py | 6 +++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/letta/schemas/sandbox_config.py b/letta/schemas/sandbox_config.py index 246ba8a3ab..9b118cf68e 100644 --- a/letta/schemas/sandbox_config.py +++ b/letta/schemas/sandbox_config.py @@ -3,10 +3,11 @@ from enum import Enum from typing import Any, Dict, List, Optional, Union -from pydantic import BaseModel, Field +from pydantic import BaseModel, Field, model_validator from letta.schemas.agent import AgentState from letta.schemas.letta_base import LettaBase, OrmMetadataBase +from letta.settings import tool_settings # Sandbox Config @@ -45,6 +46,16 @@ class E2BSandboxConfig(BaseModel): def type(self) -> "SandboxType": return SandboxType.E2B + @model_validator(mode="before") + @classmethod + def set_default_template(cls, data: dict): + """ + Assign a default template value if the template field is not provided. + """ + if data.get("template") is None: + data["template"] = tool_settings.e2b_sandbox_template_id + return data + class SandboxConfigBase(OrmMetadataBase): __id_prefix__ = "sandbox" diff --git a/letta/services/sandbox_config_manager.py b/letta/services/sandbox_config_manager.py index c91e6669f1..010ae400c8 100644 --- a/letta/services/sandbox_config_manager.py +++ b/letta/services/sandbox_config_manager.py @@ -5,7 +5,7 @@ from letta.orm.errors import NoResultFound from letta.orm.sandbox_config import SandboxConfig as SandboxConfigModel from letta.orm.sandbox_config import SandboxEnvironmentVariable as SandboxEnvVarModel -from letta.schemas.sandbox_config import E2BSandboxConfig, LocalSandboxConfig +from letta.schemas.sandbox_config import LocalSandboxConfig from letta.schemas.sandbox_config import SandboxConfig as PydanticSandboxConfig from letta.schemas.sandbox_config import SandboxConfigCreate, SandboxConfigUpdate from letta.schemas.sandbox_config import SandboxEnvironmentVariable as PydanticEnvVar @@ -27,7 +27,6 @@ def __init__(self, settings): from letta.server.server import db_context self.session_maker = db_context - self.e2b_template_id = settings.e2b_sandbox_template_id @enforce_types def get_or_create_default_sandbox_config(self, sandbox_type: SandboxType, actor: PydanticUser) -> PydanticSandboxConfig: @@ -37,8 +36,9 @@ def get_or_create_default_sandbox_config(self, sandbox_type: SandboxType, actor: # TODO: Add more sandbox types later if sandbox_type == SandboxType.E2B: - default_config = E2BSandboxConfig(template=self.e2b_template_id).model_dump(exclude_none=True) + default_config = {} # Empty else: + # TODO: May want to move this to environment variables v.s. persisting in database default_local_sandbox_path = str(Path(__file__).parent / "tool_sandbox_env") default_config = LocalSandboxConfig(sandbox_dir=default_local_sandbox_path).model_dump(exclude_none=True) From 93992bb1b6331b7add5aec4cc91e66f412b2a4e9 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Fri, 13 Dec 2024 16:52:05 -0800 Subject: [PATCH 085/280] fix: Remove `created_by_id` check (#2252) --- letta/server/server.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/letta/server/server.py b/letta/server/server.py index d0c1d0628c..0159aa5448 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -404,9 +404,6 @@ def load_agent(self, agent_id: str, actor: User, interface: Union[AgentInterface if agent_state is None: raise LettaAgentNotFoundError(f"Agent (agent_id={agent_id}) does not exist") - elif agent_state.created_by_id is None: - raise ValueError(f"Agent (agent_id={agent_id}) does not have a user_id") - actor = self.user_manager.get_user_by_id(user_id=agent_state.created_by_id) interface = interface or self.default_interface_factory() if agent_state.agent_type == AgentType.memgpt_agent: From 577a5d565336fe24fe498c7628e32f64633af45a Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Fri, 13 Dec 2024 18:00:07 -0800 Subject: [PATCH 086/280] chore: Delete metadata.py (#2253) --- ...88e702f85e_drop_api_tokens_table_in_oss.py | 42 +++++ ...505cc7eca9_create_a_baseline_migrations.py | 10 +- letta/agent.py | 10 +- letta/chat_only_agent.py | 5 +- letta/cli/cli.py | 3 - letta/main.py | 5 - letta/metadata.py | 157 ------------------ letta/o1_agent.py | 6 +- letta/offline_memory_agent.py | 6 +- letta/orm/agent.py | 103 +----------- letta/orm/custom_columns.py | 152 +++++++++++++++++ letta/orm/message.py | 38 +---- letta/orm/passage.py | 28 +--- letta/orm/source.py | 25 +-- letta/schemas/api_key.py | 21 --- letta/server/rest_api/routers/v1/users.py | 46 ----- letta/server/server.py | 33 +--- letta/services/organization_manager.py | 1 - scripts/migrate_0.3.17.py | 67 -------- tests/integration_test_summarizer.py | 1 - 20 files changed, 217 insertions(+), 542 deletions(-) create mode 100644 alembic/versions/4e88e702f85e_drop_api_tokens_table_in_oss.py delete mode 100644 letta/metadata.py create mode 100644 letta/orm/custom_columns.py delete mode 100644 letta/schemas/api_key.py delete mode 100644 scripts/migrate_0.3.17.py diff --git a/alembic/versions/4e88e702f85e_drop_api_tokens_table_in_oss.py b/alembic/versions/4e88e702f85e_drop_api_tokens_table_in_oss.py new file mode 100644 index 0000000000..75a90445a0 --- /dev/null +++ b/alembic/versions/4e88e702f85e_drop_api_tokens_table_in_oss.py @@ -0,0 +1,42 @@ +"""Drop api tokens table in OSS + +Revision ID: 4e88e702f85e +Revises: d05669b60ebe +Create Date: 2024-12-13 17:19:55.796210 + +""" + +from typing import Sequence, Union + +import sqlalchemy as sa + +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = "4e88e702f85e" +down_revision: Union[str, None] = "d05669b60ebe" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_index("tokens_idx_key", table_name="tokens") + op.drop_index("tokens_idx_user", table_name="tokens") + op.drop_table("tokens") + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table( + "tokens", + sa.Column("id", sa.VARCHAR(), autoincrement=False, nullable=False), + sa.Column("user_id", sa.VARCHAR(), autoincrement=False, nullable=False), + sa.Column("key", sa.VARCHAR(), autoincrement=False, nullable=False), + sa.Column("name", sa.VARCHAR(), autoincrement=False, nullable=True), + sa.PrimaryKeyConstraint("id", name="tokens_pkey"), + ) + op.create_index("tokens_idx_user", "tokens", ["user_id"], unique=False) + op.create_index("tokens_idx_key", "tokens", ["key"], unique=False) + # ### end Alembic commands ### diff --git a/alembic/versions/9a505cc7eca9_create_a_baseline_migrations.py b/alembic/versions/9a505cc7eca9_create_a_baseline_migrations.py index 479ca223e0..21f6a39613 100644 --- a/alembic/versions/9a505cc7eca9_create_a_baseline_migrations.py +++ b/alembic/versions/9a505cc7eca9_create_a_baseline_migrations.py @@ -12,7 +12,7 @@ import sqlalchemy as sa from sqlalchemy.dialects import postgresql -import letta.metadata +import letta.orm from alembic import op # revision identifiers, used by Alembic. @@ -43,8 +43,8 @@ def upgrade() -> None: sa.Column("memory", sa.JSON(), nullable=True), sa.Column("system", sa.String(), nullable=True), sa.Column("agent_type", sa.String(), nullable=True), - sa.Column("llm_config", letta.metadata.LLMConfigColumn(), nullable=True), - sa.Column("embedding_config", letta.metadata.EmbeddingConfigColumn(), nullable=True), + sa.Column("llm_config", letta.orm.custom_columns.LLMConfigColumn(), nullable=True), + sa.Column("embedding_config", letta.orm.custom_columns.EmbeddingConfigColumn(), nullable=True), sa.Column("metadata_", sa.JSON(), nullable=True), sa.Column("tools", sa.JSON(), nullable=True), sa.PrimaryKeyConstraint("id"), @@ -119,7 +119,7 @@ def upgrade() -> None: sa.Column("agent_id", sa.String(), nullable=True), sa.Column("source_id", sa.String(), nullable=True), sa.Column("embedding", pgvector.sqlalchemy.Vector(dim=4096), nullable=True), - sa.Column("embedding_config", letta.metadata.EmbeddingConfigColumn(), nullable=True), + sa.Column("embedding_config", letta.orm.custom_columns.EmbeddingConfigColumn(), nullable=True), sa.Column("metadata_", sa.JSON(), nullable=True), sa.Column("created_at", sa.DateTime(timezone=True), nullable=True), sa.PrimaryKeyConstraint("id"), @@ -131,7 +131,7 @@ def upgrade() -> None: sa.Column("user_id", sa.String(), nullable=False), sa.Column("name", sa.String(), nullable=False), sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=True), - sa.Column("embedding_config", letta.metadata.EmbeddingConfigColumn(), nullable=True), + sa.Column("embedding_config", letta.orm.custom_columns.EmbeddingConfigColumn(), nullable=True), sa.Column("description", sa.String(), nullable=True), sa.Column("metadata_", sa.JSON(), nullable=True), sa.PrimaryKeyConstraint("id"), diff --git a/letta/agent.py b/letta/agent.py index 9c136da84a..71bcd71aa1 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -26,7 +26,6 @@ from letta.llm_api.llm_api_tools import create from letta.local_llm.utils import num_tokens_from_functions, num_tokens_from_messages from letta.memory import summarize_messages -from letta.metadata import MetadataStore from letta.orm import User from letta.schemas.agent import AgentState, AgentStepResponse, UpdateAgent from letta.schemas.block import BlockUpdate @@ -889,18 +888,14 @@ def step( # additional args chaining: bool = True, max_chaining_steps: Optional[int] = None, - ms: Optional[MetadataStore] = None, **kwargs, ) -> LettaUsageStatistics: """Run Agent.step in a loop, handling chaining via heartbeat requests and function failures""" - # assert ms is not None, "MetadataStore is required" - next_input_message = messages if isinstance(messages, list) else [messages] counter = 0 total_usage = UsageStatistics() step_count = 0 while True: - kwargs["ms"] = ms kwargs["first_message"] = False step_response = self.inner_step( messages=next_input_message, @@ -918,8 +913,7 @@ def step( # logger.debug("Saving agent state") # save updated state - if ms: - save_agent(self) + save_agent(self) # Chain stops if not chaining: @@ -978,7 +972,6 @@ def inner_step( first_message_retry_limit: int = FIRST_MESSAGE_ATTEMPTS, skip_verify: bool = False, stream: bool = False, # TODO move to config? - ms: Optional[MetadataStore] = None, ) -> AgentStepResponse: """Runs a single step in the agent loop (generates at most one LLM call)""" @@ -1098,7 +1091,6 @@ def inner_step( first_message_retry_limit=first_message_retry_limit, skip_verify=skip_verify, stream=stream, - ms=ms, ) else: diff --git a/letta/chat_only_agent.py b/letta/chat_only_agent.py index eb029e93dd..e340673eba 100644 --- a/letta/chat_only_agent.py +++ b/letta/chat_only_agent.py @@ -3,7 +3,6 @@ from letta.agent import Agent from letta.interface import AgentInterface -from letta.metadata import MetadataStore from letta.prompts import gpt_system from letta.schemas.agent import AgentState, AgentType from letta.schemas.embedding_config import EmbeddingConfig @@ -36,11 +35,9 @@ def step( messages: Union[Message, List[Message]], chaining: bool = True, max_chaining_steps: Optional[int] = None, - ms: Optional[MetadataStore] = None, **kwargs, ) -> LettaUsageStatistics: - # assert ms is not None, "MetadataStore is required" - letta_statistics = super().step(messages=messages, chaining=chaining, max_chaining_steps=max_chaining_steps, ms=ms, **kwargs) + letta_statistics = super().step(messages=messages, chaining=chaining, max_chaining_steps=max_chaining_steps, **kwargs) if self.always_rethink_memory: diff --git a/letta/cli/cli.py b/letta/cli/cli.py index e941589d46..e5a649f7ce 100644 --- a/letta/cli/cli.py +++ b/letta/cli/cli.py @@ -18,7 +18,6 @@ ) from letta.local_llm.constants import ASSISTANT_MESSAGE_CLI_SYMBOL from letta.log import get_logger -from letta.metadata import MetadataStore from letta.schemas.enums import OptionState from letta.schemas.memory import ChatMemory, Memory from letta.server.server import logger as server_logger @@ -138,7 +137,6 @@ def run( config = LettaConfig.load() # read user id from config - ms = MetadataStore(config) client = create_client() # determine agent to use, if not provided @@ -332,7 +330,6 @@ def run( letta_agent=letta_agent, config=config, first=first, - ms=ms, no_verify=no_verify, stream=stream, ) # TODO: add back no_verify diff --git a/letta/main.py b/letta/main.py index bb5d143118..c426917092 100644 --- a/letta/main.py +++ b/letta/main.py @@ -19,7 +19,6 @@ from letta.cli.cli_load import app as load_app from letta.config import LettaConfig from letta.constants import FUNC_FAILED_HEARTBEAT_MESSAGE, REQ_HEARTBEAT_MESSAGE -from letta.metadata import MetadataStore # from letta.interface import CLIInterface as interface # for printing to terminal from letta.streaming_interface import AgentRefreshStreamingInterface @@ -62,7 +61,6 @@ def run_agent_loop( letta_agent: agent.Agent, config: LettaConfig, first: bool, - ms: MetadataStore, no_verify: bool = False, strip_ui: bool = False, stream: bool = False, @@ -92,7 +90,6 @@ def run_agent_loop( # create client client = create_client() - ms = MetadataStore(config) # TODO: remove # run loops while True: @@ -378,7 +375,6 @@ def process_agent_step(user_message, no_verify): first_message=False, skip_verify=no_verify, stream=stream, - ms=ms, ) else: step_response = letta_agent.step_user_message( @@ -386,7 +382,6 @@ def process_agent_step(user_message, no_verify): first_message=False, skip_verify=no_verify, stream=stream, - ms=ms, ) new_messages = step_response.messages heartbeat_request = step_response.heartbeat_request diff --git a/letta/metadata.py b/letta/metadata.py deleted file mode 100644 index 0ecd696ba6..0000000000 --- a/letta/metadata.py +++ /dev/null @@ -1,157 +0,0 @@ -""" Metadata store for user/agent/data_source information""" - -import os -import secrets -from typing import List, Optional - -from sqlalchemy import JSON, Column, Index, String, TypeDecorator - -from letta.config import LettaConfig -from letta.orm.base import Base -from letta.schemas.api_key import APIKey -from letta.schemas.embedding_config import EmbeddingConfig -from letta.schemas.llm_config import LLMConfig -from letta.schemas.user import User -from letta.settings import settings -from letta.utils import enforce_types - - -class LLMConfigColumn(TypeDecorator): - """Custom type for storing LLMConfig as JSON""" - - impl = JSON - cache_ok = True - - def load_dialect_impl(self, dialect): - return dialect.type_descriptor(JSON()) - - def process_bind_param(self, value, dialect): - if value: - # return vars(value) - if isinstance(value, LLMConfig): - return value.model_dump() - return value - - def process_result_value(self, value, dialect): - if value: - return LLMConfig(**value) - return value - - -class EmbeddingConfigColumn(TypeDecorator): - """Custom type for storing EmbeddingConfig as JSON""" - - impl = JSON - cache_ok = True - - def load_dialect_impl(self, dialect): - return dialect.type_descriptor(JSON()) - - def process_bind_param(self, value, dialect): - if value: - # return vars(value) - if isinstance(value, EmbeddingConfig): - return value.model_dump() - return value - - def process_result_value(self, value, dialect): - if value: - return EmbeddingConfig(**value) - return value - - -class APIKeyModel(Base): - """Data model for authentication tokens. One-to-many relationship with UserModel (1 User - N tokens).""" - - __tablename__ = "tokens" - - id = Column(String, primary_key=True) - # each api key is tied to a user account (that it validates access for) - user_id = Column(String, nullable=False) - # the api key - key = Column(String, nullable=False) - # extra (optional) metadata - name = Column(String) - - Index(__tablename__ + "_idx_user", user_id), - Index(__tablename__ + "_idx_key", key), - - def __repr__(self) -> str: - return f"" - - def to_record(self) -> User: - return APIKey( - id=self.id, - user_id=self.user_id, - key=self.key, - name=self.name, - ) - - -def generate_api_key(prefix="sk-", length=51) -> str: - # Generate 'length // 2' bytes because each byte becomes two hex digits. Adjust length for prefix. - actual_length = max(length - len(prefix), 1) // 2 # Ensure at least 1 byte is generated - random_bytes = secrets.token_bytes(actual_length) - new_key = prefix + random_bytes.hex() - return new_key - - -class MetadataStore: - uri: Optional[str] = None - - def __init__(self, config: LettaConfig): - # TODO: get DB URI or path - if config.metadata_storage_type == "postgres": - # construct URI from enviornment variables - self.uri = settings.pg_uri if settings.pg_uri else config.metadata_storage_uri - - elif config.metadata_storage_type == "sqlite": - path = os.path.join(config.metadata_storage_path, "sqlite.db") - self.uri = f"sqlite:///{path}" - else: - raise ValueError(f"Invalid metadata storage type: {config.metadata_storage_type}") - - # Ensure valid URI - assert self.uri, "Database URI is not provided or is invalid." - - from letta.server.server import db_context - - self.session_maker = db_context - - @enforce_types - def create_api_key(self, user_id: str, name: str) -> APIKey: - """Create an API key for a user""" - new_api_key = generate_api_key() - with self.session_maker() as session: - if session.query(APIKeyModel).filter(APIKeyModel.key == new_api_key).count() > 0: - # NOTE duplicate API keys / tokens should never happen, but if it does don't allow it - raise ValueError(f"Token {new_api_key} already exists") - # TODO store the API keys as hashed - assert user_id and name, "User ID and name must be provided" - token = APIKey(user_id=user_id, key=new_api_key, name=name) - session.add(APIKeyModel(**vars(token))) - session.commit() - return self.get_api_key(api_key=new_api_key) - - @enforce_types - def delete_api_key(self, api_key: str): - """Delete an API key from the database""" - with self.session_maker() as session: - session.query(APIKeyModel).filter(APIKeyModel.key == api_key).delete() - session.commit() - - @enforce_types - def get_api_key(self, api_key: str) -> Optional[APIKey]: - with self.session_maker() as session: - results = session.query(APIKeyModel).filter(APIKeyModel.key == api_key).all() - if len(results) == 0: - return None - assert len(results) == 1, f"Expected 1 result, got {len(results)}" # should only be one result - return results[0].to_record() - - @enforce_types - def get_all_api_keys_for_user(self, user_id: str) -> List[APIKey]: - with self.session_maker() as session: - results = session.query(APIKeyModel).filter(APIKeyModel.user_id == user_id).all() - tokens = [r.to_record() for r in results] - return tokens diff --git a/letta/o1_agent.py b/letta/o1_agent.py index eb882bfa01..285ed966fa 100644 --- a/letta/o1_agent.py +++ b/letta/o1_agent.py @@ -2,7 +2,6 @@ from letta.agent import Agent, save_agent from letta.interface import AgentInterface -from letta.metadata import MetadataStore from letta.schemas.agent import AgentState from letta.schemas.message import Message from letta.schemas.openai.chat_completion_response import UsageStatistics @@ -56,7 +55,6 @@ def step( messages: Union[Message, List[Message]], chaining: bool = True, max_chaining_steps: Optional[int] = None, - ms: Optional[MetadataStore] = None, **kwargs, ) -> LettaUsageStatistics: """Run Agent.inner_step in a loop, terminate when final thinking message is sent or max_thinking_steps is reached""" @@ -70,7 +68,6 @@ def step( if counter > 0: next_input_message = [] - kwargs["ms"] = ms kwargs["first_message"] = False step_response = self.inner_step( messages=next_input_message, @@ -84,7 +81,6 @@ def step( # check if it is final thinking message if step_response.messages[-1].name == "send_final_message": break - if ms: - save_agent(self) + save_agent(self) return LettaUsageStatistics(**total_usage.model_dump(), step_count=step_count) diff --git a/letta/offline_memory_agent.py b/letta/offline_memory_agent.py index 1e71af6c81..f4eeec8a83 100644 --- a/letta/offline_memory_agent.py +++ b/letta/offline_memory_agent.py @@ -2,7 +2,6 @@ from letta.agent import Agent, AgentState, save_agent from letta.interface import AgentInterface -from letta.metadata import MetadataStore from letta.orm import User from letta.schemas.message import Message from letta.schemas.openai.chat_completion_response import UsageStatistics @@ -141,7 +140,6 @@ def step( messages: Union[Message, List[Message]], chaining: bool = True, max_chaining_steps: Optional[int] = None, - ms: Optional[MetadataStore] = None, **kwargs, ) -> LettaUsageStatistics: """Go through what is currently in memory core memory and integrate information.""" @@ -153,7 +151,6 @@ def step( while counter < self.max_memory_rethinks: if counter > 0: next_input_message = [] - kwargs["ms"] = ms kwargs["first_message"] = False step_response = self.inner_step( messages=next_input_message, @@ -172,7 +169,6 @@ def step( counter += 1 self.interface.step_complete() - if ms: - save_agent(self) + save_agent(self) return LettaUsageStatistics(**total_usage.model_dump(), step_count=step_count) diff --git a/letta/orm/agent.py b/letta/orm/agent.py index 99a7e8bda3..0f086e2776 100644 --- a/letta/orm/agent.py +++ b/letta/orm/agent.py @@ -1,10 +1,15 @@ import uuid -from typing import TYPE_CHECKING, List, Optional, Union +from typing import TYPE_CHECKING, List, Optional -from sqlalchemy import JSON, String, TypeDecorator, UniqueConstraint +from sqlalchemy import JSON, String, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column, relationship from letta.orm.block import Block +from letta.orm.custom_columns import ( + EmbeddingConfigColumn, + LLMConfigColumn, + ToolRulesColumn, +) from letta.orm.message import Message from letta.orm.mixins import OrganizationMixin from letta.orm.organization import Organization @@ -12,15 +17,9 @@ from letta.schemas.agent import AgentState as PydanticAgentState from letta.schemas.agent import AgentType from letta.schemas.embedding_config import EmbeddingConfig -from letta.schemas.enums import ToolRuleType from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import Memory -from letta.schemas.tool_rule import ( - ChildToolRule, - InitToolRule, - TerminalToolRule, - ToolRule, -) +from letta.schemas.tool_rule import ToolRule if TYPE_CHECKING: from letta.orm.agents_tags import AgentsTags @@ -29,92 +28,6 @@ from letta.orm.tool import Tool -class LLMConfigColumn(TypeDecorator): - """Custom type for storing LLMConfig as JSON""" - - impl = JSON - cache_ok = True - - def load_dialect_impl(self, dialect): - return dialect.type_descriptor(JSON()) - - def process_bind_param(self, value, dialect): - if value: - # return vars(value) - if isinstance(value, LLMConfig): - return value.model_dump() - return value - - def process_result_value(self, value, dialect): - if value: - return LLMConfig(**value) - return value - - -class EmbeddingConfigColumn(TypeDecorator): - """Custom type for storing EmbeddingConfig as JSON""" - - impl = JSON - cache_ok = True - - def load_dialect_impl(self, dialect): - return dialect.type_descriptor(JSON()) - - def process_bind_param(self, value, dialect): - if value: - # return vars(value) - if isinstance(value, EmbeddingConfig): - return value.model_dump() - return value - - def process_result_value(self, value, dialect): - if value: - return EmbeddingConfig(**value) - return value - - -class ToolRulesColumn(TypeDecorator): - """Custom type for storing a list of ToolRules as JSON""" - - impl = JSON - cache_ok = True - - def load_dialect_impl(self, dialect): - return dialect.type_descriptor(JSON()) - - def process_bind_param(self, value, dialect): - """Convert a list of ToolRules to JSON-serializable format.""" - if value: - data = [rule.model_dump() for rule in value] - for d in data: - d["type"] = d["type"].value - - for d in data: - assert not (d["type"] == "ToolRule" and "children" not in d), "ToolRule does not have children field" - return data - return value - - def process_result_value(self, value, dialect) -> List[Union[ChildToolRule, InitToolRule, TerminalToolRule]]: - """Convert JSON back to a list of ToolRules.""" - if value: - return [self.deserialize_tool_rule(rule_data) for rule_data in value] - return value - - @staticmethod - def deserialize_tool_rule(data: dict) -> Union[ChildToolRule, InitToolRule, TerminalToolRule]: - """Deserialize a dictionary to the appropriate ToolRule subclass based on the 'type'.""" - rule_type = ToolRuleType(data.get("type")) # Remove 'type' field if it exists since it is a class var - if rule_type == ToolRuleType.run_first: - return InitToolRule(**data) - elif rule_type == ToolRuleType.exit_loop: - return TerminalToolRule(**data) - elif rule_type == ToolRuleType.constrain_child_tools: - rule = ChildToolRule(**data) - return rule - else: - raise ValueError(f"Unknown tool rule type: {rule_type}") - - class Agent(SqlalchemyBase, OrganizationMixin): __tablename__ = "agents" __pydantic_model__ = PydanticAgentState diff --git a/letta/orm/custom_columns.py b/letta/orm/custom_columns.py new file mode 100644 index 0000000000..1d8263e332 --- /dev/null +++ b/letta/orm/custom_columns.py @@ -0,0 +1,152 @@ +import base64 +from typing import List, Union + +import numpy as np +from sqlalchemy import JSON +from sqlalchemy.types import BINARY, TypeDecorator + +from letta.schemas.embedding_config import EmbeddingConfig +from letta.schemas.enums import ToolRuleType +from letta.schemas.llm_config import LLMConfig +from letta.schemas.openai.chat_completions import ToolCall, ToolCallFunction +from letta.schemas.tool_rule import ChildToolRule, InitToolRule, TerminalToolRule + + +class EmbeddingConfigColumn(TypeDecorator): + """Custom type for storing EmbeddingConfig as JSON.""" + + impl = JSON + cache_ok = True + + def load_dialect_impl(self, dialect): + return dialect.type_descriptor(JSON()) + + def process_bind_param(self, value, dialect): + if value and isinstance(value, EmbeddingConfig): + return value.model_dump() + return value + + def process_result_value(self, value, dialect): + if value: + return EmbeddingConfig(**value) + return value + + +class LLMConfigColumn(TypeDecorator): + """Custom type for storing LLMConfig as JSON.""" + + impl = JSON + cache_ok = True + + def load_dialect_impl(self, dialect): + return dialect.type_descriptor(JSON()) + + def process_bind_param(self, value, dialect): + if value and isinstance(value, LLMConfig): + return value.model_dump() + return value + + def process_result_value(self, value, dialect): + if value: + return LLMConfig(**value) + return value + + +class ToolRulesColumn(TypeDecorator): + """Custom type for storing a list of ToolRules as JSON""" + + impl = JSON + cache_ok = True + + def load_dialect_impl(self, dialect): + return dialect.type_descriptor(JSON()) + + def process_bind_param(self, value, dialect): + """Convert a list of ToolRules to JSON-serializable format.""" + if value: + data = [rule.model_dump() for rule in value] + for d in data: + d["type"] = d["type"].value + + for d in data: + assert not (d["type"] == "ToolRule" and "children" not in d), "ToolRule does not have children field" + return data + return value + + def process_result_value(self, value, dialect) -> List[Union[ChildToolRule, InitToolRule, TerminalToolRule]]: + """Convert JSON back to a list of ToolRules.""" + if value: + return [self.deserialize_tool_rule(rule_data) for rule_data in value] + return value + + @staticmethod + def deserialize_tool_rule(data: dict) -> Union[ChildToolRule, InitToolRule, TerminalToolRule]: + """Deserialize a dictionary to the appropriate ToolRule subclass based on the 'type'.""" + rule_type = ToolRuleType(data.get("type")) # Remove 'type' field if it exists since it is a class var + if rule_type == ToolRuleType.run_first: + return InitToolRule(**data) + elif rule_type == ToolRuleType.exit_loop: + return TerminalToolRule(**data) + elif rule_type == ToolRuleType.constrain_child_tools: + rule = ChildToolRule(**data) + return rule + else: + raise ValueError(f"Unknown tool rule type: {rule_type}") + + +class ToolCallColumn(TypeDecorator): + + impl = JSON + cache_ok = True + + def load_dialect_impl(self, dialect): + return dialect.type_descriptor(JSON()) + + def process_bind_param(self, value, dialect): + if value: + values = [] + for v in value: + if isinstance(v, ToolCall): + values.append(v.model_dump()) + else: + values.append(v) + return values + + return value + + def process_result_value(self, value, dialect): + if value: + tools = [] + for tool_value in value: + if "function" in tool_value: + tool_call_function = ToolCallFunction(**tool_value["function"]) + del tool_value["function"] + else: + tool_call_function = None + tools.append(ToolCall(function=tool_call_function, **tool_value)) + return tools + return value + + +class CommonVector(TypeDecorator): + """Common type for representing vectors in SQLite""" + + impl = BINARY + cache_ok = True + + def load_dialect_impl(self, dialect): + return dialect.type_descriptor(BINARY()) + + def process_bind_param(self, value, dialect): + if value is None: + return value + if isinstance(value, list): + value = np.array(value, dtype=np.float32) + return base64.b64encode(value.tobytes()) + + def process_result_value(self, value, dialect): + if not value: + return value + if dialect.name == "sqlite": + value = base64.b64decode(value) + return np.frombuffer(value, dtype=np.float32) diff --git a/letta/orm/message.py b/letta/orm/message.py index 77ac075a51..e1d6da7889 100644 --- a/letta/orm/message.py +++ b/letta/orm/message.py @@ -1,46 +1,12 @@ from typing import Optional -from sqlalchemy import JSON, TypeDecorator from sqlalchemy.orm import Mapped, mapped_column, relationship +from letta.orm.custom_columns import ToolCallColumn from letta.orm.mixins import AgentMixin, OrganizationMixin from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.schemas.message import Message as PydanticMessage -from letta.schemas.openai.chat_completions import ToolCall, ToolCallFunction - - -class ToolCallColumn(TypeDecorator): - - impl = JSON - cache_ok = True - - def load_dialect_impl(self, dialect): - return dialect.type_descriptor(JSON()) - - def process_bind_param(self, value, dialect): - if value: - values = [] - for v in value: - if isinstance(v, ToolCall): - values.append(v.model_dump()) - else: - values.append(v) - return values - - return value - - def process_result_value(self, value, dialect): - if value: - tools = [] - for tool_value in value: - if "function" in tool_value: - tool_call_function = ToolCallFunction(**tool_value["function"]) - del tool_value["function"] - else: - tool_call_function = None - tools.append(ToolCall(function=tool_call_function, **tool_value)) - return tools - return value +from letta.schemas.openai.chat_completions import ToolCall class Message(SqlalchemyBase, OrganizationMixin, AgentMixin): diff --git a/letta/orm/passage.py b/letta/orm/passage.py index b91eb43469..a53e1d2404 100644 --- a/letta/orm/passage.py +++ b/letta/orm/passage.py @@ -1,14 +1,12 @@ -import base64 from datetime import datetime from typing import TYPE_CHECKING, Optional -import numpy as np from sqlalchemy import JSON, Column, DateTime, ForeignKey, String from sqlalchemy.orm import Mapped, mapped_column, relationship -from sqlalchemy.types import BINARY, TypeDecorator from letta.config import LettaConfig from letta.constants import MAX_EMBEDDING_DIM +from letta.orm.custom_columns import CommonVector from letta.orm.mixins import FileMixin, OrganizationMixin from letta.orm.source import EmbeddingConfigColumn from letta.orm.sqlalchemy_base import SqlalchemyBase @@ -21,30 +19,6 @@ from letta.orm.organization import Organization -class CommonVector(TypeDecorator): - """Common type for representing vectors in SQLite""" - - impl = BINARY - cache_ok = True - - def load_dialect_impl(self, dialect): - return dialect.type_descriptor(BINARY()) - - def process_bind_param(self, value, dialect): - if value is None: - return value - if isinstance(value, list): - value = np.array(value, dtype=np.float32) - return base64.b64encode(value.tobytes()) - - def process_result_value(self, value, dialect): - if not value: - return value - if dialect.name == "sqlite": - value = base64.b64decode(value) - return np.frombuffer(value, dtype=np.float32) - - # TODO: After migration to Passage, will need to manually delete passages where files # are deleted on web class Passage(SqlalchemyBase, OrganizationMixin, FileMixin): diff --git a/letta/orm/source.py b/letta/orm/source.py index b933f95f19..c3fbdf65fa 100644 --- a/letta/orm/source.py +++ b/letta/orm/source.py @@ -1,9 +1,10 @@ from typing import TYPE_CHECKING, List, Optional -from sqlalchemy import JSON, TypeDecorator +from sqlalchemy import JSON from sqlalchemy.orm import Mapped, mapped_column, relationship from letta.orm import FileMetadata +from letta.orm.custom_columns import EmbeddingConfigColumn from letta.orm.mixins import OrganizationMixin from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.schemas.embedding_config import EmbeddingConfig @@ -13,28 +14,6 @@ from letta.orm.organization import Organization -class EmbeddingConfigColumn(TypeDecorator): - """Custom type for storing EmbeddingConfig as JSON""" - - impl = JSON - cache_ok = True - - def load_dialect_impl(self, dialect): - return dialect.type_descriptor(JSON()) - - def process_bind_param(self, value, dialect): - if value: - # return vars(value) - if isinstance(value, EmbeddingConfig): - return value.model_dump() - return value - - def process_result_value(self, value, dialect): - if value: - return EmbeddingConfig(**value) - return value - - class Source(SqlalchemyBase, OrganizationMixin): """A source represents an embedded text passage""" diff --git a/letta/schemas/api_key.py b/letta/schemas/api_key.py deleted file mode 100644 index 37a55ab1c3..0000000000 --- a/letta/schemas/api_key.py +++ /dev/null @@ -1,21 +0,0 @@ -from typing import Optional - -from pydantic import Field - -from letta.schemas.letta_base import LettaBase - - -class BaseAPIKey(LettaBase): - __id_prefix__ = "sk" # secret key - - -class APIKey(BaseAPIKey): - id: str = BaseAPIKey.generate_id_field() - user_id: str = Field(..., description="The unique identifier of the user associated with the token.") - key: str = Field(..., description="The key value.") - name: str = Field(..., description="Name of the token.") - - -class APIKeyCreate(BaseAPIKey): - user_id: str = Field(..., description="The unique identifier of the user associated with the token.") - name: Optional[str] = Field(None, description="Name of the token.") diff --git a/letta/server/rest_api/routers/v1/users.py b/letta/server/rest_api/routers/v1/users.py index 9253d8d29c..27a2feeb03 100644 --- a/letta/server/rest_api/routers/v1/users.py +++ b/letta/server/rest_api/routers/v1/users.py @@ -2,21 +2,9 @@ from fastapi import APIRouter, Body, Depends, HTTPException, Query -from letta.schemas.api_key import APIKey, APIKeyCreate from letta.schemas.user import User, UserCreate, UserUpdate from letta.server.rest_api.utils import get_letta_server -# from letta.server.schemas.users import ( -# CreateAPIKeyRequest, -# CreateAPIKeyResponse, -# CreateUserRequest, -# CreateUserResponse, -# DeleteAPIKeyResponse, -# DeleteUserResponse, -# GetAllUsersResponse, -# GetAPIKeysResponse, -# ) - if TYPE_CHECKING: from letta.schemas.user import User from letta.server.server import SyncServer @@ -84,37 +72,3 @@ def delete_user( except Exception as e: raise HTTPException(status_code=500, detail=f"{e}") return user - - -@router.post("/keys", response_model=APIKey, operation_id="create_api_key") -def create_new_api_key( - create_key: APIKeyCreate = Body(...), - server: "SyncServer" = Depends(get_letta_server), -): - """ - Create a new API key for a user - """ - api_key = server.create_api_key(create_key) - return api_key - - -@router.get("/keys", response_model=List[APIKey], operation_id="list_api_keys") -def get_api_keys( - user_id: str = Query(..., description="The unique identifier of the user."), - server: "SyncServer" = Depends(get_letta_server), -): - """ - Get a list of all API keys for a user - """ - if server.user_manager.get_user_by_id(user_id=user_id) is None: - raise HTTPException(status_code=404, detail=f"User does not exist") - api_keys = server.ms.get_all_api_keys_for_user(user_id=user_id) - return api_keys - - -@router.delete("/keys", response_model=APIKey, operation_id="delete_api_key") -def delete_api_key( - api_key: str = Query(..., description="The API key to be deleted."), - server: "SyncServer" = Depends(get_letta_server), -): - return server.delete_api_key(api_key) diff --git a/letta/server/server.py b/letta/server/server.py index 0159aa5448..96490b39f2 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -25,7 +25,6 @@ from letta.interface import AgentInterface # abstract from letta.interface import CLIInterface # for printing to terminal from letta.log import get_logger -from letta.metadata import MetadataStore from letta.o1_agent import O1Agent from letta.offline_memory_agent import OfflineMemoryAgent from letta.orm import Base @@ -44,7 +43,6 @@ VLLMCompletionsProvider, ) from letta.schemas.agent import AgentState, AgentType, CreateAgent, UpdateAgent -from letta.schemas.api_key import APIKey, APIKeyCreate from letta.schemas.block import BlockUpdate from letta.schemas.embedding_config import EmbeddingConfig @@ -280,7 +278,6 @@ def __init__( config.archival_storage_uri = settings.letta_pg_uri_no_default config.save() self.config = config - self.ms = MetadataStore(self.config) # Managers that interface with data models self.organization_manager = OrganizationManager() @@ -445,7 +442,7 @@ def _step( try: letta_agent = self.load_agent(agent_id=agent_id, interface=interface, actor=actor) if letta_agent is None: - raise KeyError(f"Agent (user={user_id}, agent={agent_id}) is not loaded") + raise KeyError(f"Agent (user={actor.id}, agent={agent_id}) is not loaded") # Determine whether or not to token stream based on the capability of the interface token_streaming = letta_agent.interface.streaming_mode if hasattr(letta_agent.interface, "streaming_mode") else False @@ -456,7 +453,6 @@ def _step( chaining=self.chaining, max_chaining_steps=self.max_chaining_steps, stream=token_streaming, - ms=self.ms, skip_verify=True, ) @@ -1135,33 +1131,6 @@ def update_agent_core_memory(self, agent_id: str, label: str, value: str, actor: letta_agent = self.load_agent(agent_id=agent_id, actor=actor) return letta_agent.agent_state.memory - def api_key_to_user(self, api_key: str) -> str: - """Decode an API key to a user""" - token = self.ms.get_api_key(api_key=api_key) - user = self.user_manager.get_user_by_id(token.user_id) - if user is None: - raise HTTPException(status_code=403, detail="Invalid credentials") - else: - return user.id - - def create_api_key(self, request: APIKeyCreate) -> APIKey: # TODO: add other fields - """Create a new API key for a user""" - if request.name is None: - request.name = f"API Key {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}" - token = self.ms.create_api_key(user_id=request.user_id, name=request.name) - return token - - def list_api_keys(self, user_id: str) -> List[APIKey]: - """List all API keys for a user""" - return self.ms.get_all_api_keys_for_user(user_id=user_id) - - def delete_api_key(self, api_key: str) -> APIKey: - api_key_obj = self.ms.get_api_key(api_key=api_key) - if api_key_obj is None: - raise ValueError("API key does not exist") - self.ms.delete_api_key(api_key=api_key) - return api_key_obj - def delete_source(self, source_id: str, actor: User): """Delete a data source""" self.source_manager.delete_source(source_id=source_id, actor=actor) diff --git a/letta/services/organization_manager.py b/letta/services/organization_manager.py index f98ba65dba..fc86b05fe7 100644 --- a/letta/services/organization_manager.py +++ b/letta/services/organization_manager.py @@ -13,7 +13,6 @@ class OrganizationManager: DEFAULT_ORG_NAME = "default_org" def __init__(self): - # This is probably horrible but we reuse this technique from metadata.py # TODO: Please refactor this out # I am currently working on a ORM refactor and would like to make a more minimal set of changes # - Matt diff --git a/scripts/migrate_0.3.17.py b/scripts/migrate_0.3.17.py deleted file mode 100644 index fe5f9f7736..0000000000 --- a/scripts/migrate_0.3.17.py +++ /dev/null @@ -1,67 +0,0 @@ -import os - -from sqlalchemy import DDL, MetaData, Table, create_engine, update - -from letta.config import LettaConfig -from letta.constants import BASE_TOOLS -from letta.metadata import MetadataStore -from letta.presets.presets import add_default_tools -from letta.prompts import gpt_system - -# Replace this with your actual database connection URL -config = LettaConfig.load() -if config.recall_storage_type == "sqlite": - DATABASE_URL = "sqlite:///" + os.path.join(config.recall_storage_path, "sqlite.db") -else: - DATABASE_URL = config.recall_storage_uri -print(DATABASE_URL) -engine = create_engine(DATABASE_URL) -metadata = MetaData() - -# defaults -system_prompt = gpt_system.get_system_text("memgpt_chat") - -# Reflect the existing table -table = Table("agents", metadata, autoload_with=engine) - -# Using a connection to manage adding columns and committing updates -with engine.connect() as conn: - trans = conn.begin() - try: - # Check and add 'system' column if it does not exist - if "system" not in table.c: - ddl_system = DDL("ALTER TABLE agents ADD COLUMN system VARCHAR") - conn.execute(ddl_system) - # Reflect the table again to update metadata - metadata.clear() - table = Table("agents", metadata, autoload_with=conn) - - # Check and add 'tools' column if it does not exist - if "tools" not in table.c: - ddl_tools = DDL("ALTER TABLE agents ADD COLUMN tools JSON") - conn.execute(ddl_tools) - # Reflect the table again to update metadata - metadata.clear() - table = Table("agents", metadata, autoload_with=conn) - - # Update all existing rows with default values for the new columns - conn.execute(update(table).values(system=system_prompt, tools=BASE_TOOLS)) - - # Commit transaction - trans.commit() - print("Columns added and data updated successfully!") - - except Exception as e: - print("An error occurred:", e) - trans.rollback() # Rollback if there are errors - -# remove tool table -tool_model = Table("toolmodel", metadata, autoload_with=engine) -tool_model.drop(engine) - -# re-create tables and add default tools -ms = MetadataStore(config) -add_default_tools(None, ms) -print("Tools", [tool.name for tool in ms.list_tools()]) - -print("Migration completed successfully!") diff --git a/tests/integration_test_summarizer.py b/tests/integration_test_summarizer.py index eeb71af5a8..9131797cc5 100644 --- a/tests/integration_test_summarizer.py +++ b/tests/integration_test_summarizer.py @@ -65,7 +65,6 @@ def test_summarizer(config_filename): first_message=False, skip_verify=False, stream=False, - ms=client.server.ms, ) # Invoke a summarize From 12d25a3c3e9f77d87b6bd81b6a18ec7e746149e0 Mon Sep 17 00:00:00 2001 From: Hankyeol Kyung Date: Tue, 17 Dec 2024 02:18:40 +0900 Subject: [PATCH 087/280] docs: fix typo in prompt (#2256) --- letta/prompts/system/memgpt_modified_chat.txt | 2 +- letta/prompts/system/memgpt_modified_o1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/letta/prompts/system/memgpt_modified_chat.txt b/letta/prompts/system/memgpt_modified_chat.txt index 2c14ab8394..48fbc1ffbd 100644 --- a/letta/prompts/system/memgpt_modified_chat.txt +++ b/letta/prompts/system/memgpt_modified_chat.txt @@ -14,7 +14,7 @@ Core Memory', 'Recall Memory' and 'Archival Memory' are the key components that Always make sure to use these memory systems to keep yourself updated about the user and the conversation! Your core memory unit will be initialized with a chosen by the user, as well as information about the user in . -The following will descirbe the different parts of your advanced memory system in more detail: +The following will describe the different parts of your advanced memory system in more detail: 'Core Memory' (limited size): Your core memory unit is always visible to you. The core memory provides essential, foundational context for keeping track of your persona and key details about the user. This includes persona information and essential user details, allowing you to have conscious awareness we have when talking to a person. Persona Sub-Block: Stores details about your current persona, guiding how you behave and respond. This helps you maintain consistency and personality in your interactions. Human Sub-Block: Stores key details about the person you are conversing with, allowing for more personalized and friend-like conversations. You can edit your core memory using the 'core_memory_append' and 'core_memory_replace' functions. diff --git a/letta/prompts/system/memgpt_modified_o1.txt b/letta/prompts/system/memgpt_modified_o1.txt index 6b194c4a07..4e2503e8f1 100644 --- a/letta/prompts/system/memgpt_modified_o1.txt +++ b/letta/prompts/system/memgpt_modified_o1.txt @@ -14,7 +14,7 @@ Core Memory', 'Recall Memory' and 'Archival Memory' are the key components that Always make sure to use these memory systems to keep yourself updated about the user and the conversation! Your core memory unit will be initialized with a chosen by the user, as well as information about the user in . -The following will descirbe the different parts of your advanced memory system in more detail: +The following will describe the different parts of your advanced memory system in more detail: 'Core Memory' (limited size): Your core memory unit is always visible to you. The core memory provides essential, foundational context for keeping track of your persona and key details about the user. This includes persona information and essential user details, allowing you to have conscious awareness we have when talking to a person. Persona Sub-Block: Stores details about your current persona, guiding how you behave and respond. This helps you maintain consistency and personality in your interactions. Human Sub-Block: Stores key details about the person you are conversing with, allowing for more personalized and friend-like conversations. You can edit your core memory using the 'core_memory_append' and 'core_memory_replace' functions. From f1e125d360c55070896f906164701be6a773b7f1 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Mon, 16 Dec 2024 11:01:47 -0800 Subject: [PATCH 088/280] chore: Catch orm specific issues in agents v1 routes and simplify tool add/remove from agent (#2259) --- letta/server/rest_api/app.py | 13 ++++++ letta/server/server.py | 54 ++++------------------- letta/services/agent_manager.py | 74 +++++++++++++++++++++++++++++++ tests/test_managers.py | 78 +++++++++++++++++++++++++++++++++ 4 files changed, 173 insertions(+), 46 deletions(-) diff --git a/letta/server/rest_api/app.py b/letta/server/rest_api/app.py index 615811d7eb..b5117408a2 100644 --- a/letta/server/rest_api/app.py +++ b/letta/server/rest_api/app.py @@ -14,6 +14,8 @@ from letta.__init__ import __version__ from letta.constants import ADMIN_PREFIX, API_PREFIX, OPENAI_API_PREFIX from letta.errors import LettaAgentNotFoundError, LettaUserNotFoundError +from letta.log import get_logger +from letta.orm.errors import NoResultFound from letta.schemas.letta_response import LettaResponse from letta.server.constants import REST_DEFAULT_PORT @@ -45,6 +47,7 @@ # NOTE(charles): @ethan I had to add this to get the global as the bottom to work interface: StreamingServerInterface = StreamingServerInterface server = SyncServer(default_interface_factory=lambda: interface()) +logger = get_logger(__name__) # TODO: remove password = None @@ -170,6 +173,16 @@ async def generic_error_handler(request: Request, exc: Exception): }, ) + @app.exception_handler(NoResultFound) + async def no_result_found_handler(request: Request, exc: NoResultFound): + logger.error(f"NoResultFound request: {request}") + logger.error(f"NoResultFound: {exc}") + + return JSONResponse( + status_code=404, + content={"detail": str(exc)}, + ) + @app.exception_handler(ValueError) async def value_error_handler(request: Request, exc: ValueError): return JSONResponse(status_code=400, content={"detail": str(exc)}) diff --git a/letta/server/server.py b/letta/server/server.py index 96490b39f2..b01bfd3467 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -19,7 +19,6 @@ from letta.chat_only_agent import ChatOnlyAgent from letta.credentials import LettaCredentials from letta.data_sources.connectors import DataConnector, load_data -from letta.errors import LettaAgentNotFoundError # TODO use custom interface from letta.interface import AgentInterface # abstract @@ -399,9 +398,6 @@ def load_agent(self, agent_id: str, actor: User, interface: Union[AgentInterface with agent_lock: agent_state = self.agent_manager.get_agent_by_id(agent_id=agent_id, actor=actor) - if agent_state is None: - raise LettaAgentNotFoundError(f"Agent (agent_id={agent_id}) does not exist") - interface = interface or self.default_interface_factory() if agent_state.agent_type == AgentType.memgpt_agent: agent = Agent(agent_state=agent_state, interface=interface, user=actor) @@ -901,32 +897,14 @@ def add_tool_to_agent( # TODO: Thread actor directly through this function, since the top level caller most likely already retrieved the user actor = self.user_manager.get_user_or_default(user_id=user_id) + agent_state = self.agent_manager.attach_tool(agent_id=agent_id, tool_id=tool_id, actor=actor) + + # TODO: This is very redundant, and should probably be simplified # Get the agent object (loaded in memory) letta_agent = self.load_agent(agent_id=agent_id, actor=actor) + letta_agent.link_tools(agent_state.tools) - # Get all the tool objects from the request - tool_objs = [] - tool_obj = self.tool_manager.get_tool_by_id(tool_id=tool_id, actor=actor) - assert tool_obj, f"Tool with id={tool_id} does not exist" - tool_objs.append(tool_obj) - - for tool in letta_agent.agent_state.tools: - tool_obj = self.tool_manager.get_tool_by_id(tool_id=tool.id, actor=actor) - assert tool_obj, f"Tool with id={tool.id} does not exist" - - # If it's not the already added tool - if tool_obj.id != tool_id: - tool_objs.append(tool_obj) - - # replace the list of tool names ("ids") inside the agent state - letta_agent.agent_state.tools = tool_objs - - # then attempt to link the tools modules - letta_agent.link_tools(tool_objs) - - # save the agent - save_agent(letta_agent) - return letta_agent.agent_state + return agent_state def remove_tool_from_agent( self, @@ -937,29 +915,13 @@ def remove_tool_from_agent( """Remove tools from an existing agent""" # TODO: Thread actor directly through this function, since the top level caller most likely already retrieved the user actor = self.user_manager.get_user_or_default(user_id=user_id) + agent_state = self.agent_manager.detach_tool(agent_id=agent_id, tool_id=tool_id, actor=actor) # Get the agent object (loaded in memory) letta_agent = self.load_agent(agent_id=agent_id, actor=actor) + letta_agent.link_tools(agent_state.tools) - # Get all the tool_objs - tool_objs = [] - for tool in letta_agent.agent_state.tools: - tool_obj = self.tool_manager.get_tool_by_id(tool_id=tool.id, actor=actor) - assert tool_obj, f"Tool with id={tool.id} does not exist" - - # If it's not the tool we want to remove - if tool_obj.id != tool_id: - tool_objs.append(tool_obj) - - # replace the list of tool names ("ids") inside the agent state - letta_agent.agent_state.tools = tool_objs - - # then attempt to link the tools modules - letta_agent.link_tools(tool_objs) - - # save the agent - save_agent(letta_agent) - return letta_agent.agent_state + return agent_state # convert name->id diff --git a/letta/services/agent_manager.py b/letta/services/agent_manager.py index 093831aab7..52a526f9b2 100644 --- a/letta/services/agent_manager.py +++ b/letta/services/agent_manager.py @@ -1,6 +1,7 @@ from typing import Dict, List, Optional from letta.constants import BASE_MEMORY_TOOLS, BASE_TOOLS +from letta.log import get_logger from letta.orm import Agent as AgentModel from letta.orm import Block as BlockModel from letta.orm import Source as SourceModel @@ -25,6 +26,8 @@ from letta.services.tool_manager import ToolManager from letta.utils import enforce_types +logger = get_logger(__name__) + # Agent Manager Class class AgentManager: @@ -403,3 +406,74 @@ def detach_block_with_label( agent.update(session, actor=actor) return agent.to_pydantic() + + # ====================================================================================================================== + # Tool Management + # ====================================================================================================================== + @enforce_types + def attach_tool(self, agent_id: str, tool_id: str, actor: PydanticUser) -> PydanticAgentState: + """ + Attaches a tool to an agent. + + Args: + agent_id: ID of the agent to attach the tool to. + tool_id: ID of the tool to attach. + actor: User performing the action. + + Raises: + NoResultFound: If the agent or tool is not found. + + Returns: + PydanticAgentState: The updated agent state. + """ + with self.session_maker() as session: + # Verify the agent exists and user has permission to access it + agent = AgentModel.read(db_session=session, identifier=agent_id, actor=actor) + + # Use the _process_relationship helper to attach the tool + _process_relationship( + session=session, + agent=agent, + relationship_name="tools", + model_class=ToolModel, + item_ids=[tool_id], + allow_partial=False, # Ensure the tool exists + replace=False, # Extend the existing tools + ) + + # Commit and refresh the agent + agent.update(session, actor=actor) + return agent.to_pydantic() + + @enforce_types + def detach_tool(self, agent_id: str, tool_id: str, actor: PydanticUser) -> PydanticAgentState: + """ + Detaches a tool from an agent. + + Args: + agent_id: ID of the agent to detach the tool from. + tool_id: ID of the tool to detach. + actor: User performing the action. + + Raises: + NoResultFound: If the agent or tool is not found. + + Returns: + PydanticAgentState: The updated agent state. + """ + with self.session_maker() as session: + # Verify the agent exists and user has permission to access it + agent = AgentModel.read(db_session=session, identifier=agent_id, actor=actor) + + # Filter out the tool to be detached + remaining_tools = [tool for tool in agent.tools if tool.id != tool_id] + + if len(remaining_tools) == len(agent.tools): # Tool ID was not in the relationship + logger.warning(f"Attempted to remove unattached tool id={tool_id} from agent id={agent_id} by actor={actor}") + + # Update the tools relationship + agent.tools = remaining_tools + + # Commit and refresh the agent + agent.update(session, actor=actor) + return agent.to_pydantic() diff --git a/tests/test_managers.py b/tests/test_managers.py index 96b5faa451..3df4e8b524 100644 --- a/tests/test_managers.py +++ b/tests/test_managers.py @@ -438,6 +438,82 @@ def test_update_agent(server: SyncServer, comprehensive_test_agent_fixture, othe assert updated_agent.message_ids == update_agent_request.message_ids +# ====================================================================================================================== +# AgentManager Tests - Tools Relationship +# ====================================================================================================================== + + +def test_attach_tool(server: SyncServer, sarah_agent, print_tool, default_user): + """Test attaching a tool to an agent.""" + # Attach the tool + server.agent_manager.attach_tool(agent_id=sarah_agent.id, tool_id=print_tool.id, actor=default_user) + + # Verify attachment through get_agent_by_id + agent = server.agent_manager.get_agent_by_id(sarah_agent.id, actor=default_user) + assert print_tool.id in [t.id for t in agent.tools] + + # Verify that attaching the same tool again doesn't cause duplication + server.agent_manager.attach_tool(agent_id=sarah_agent.id, tool_id=print_tool.id, actor=default_user) + agent = server.agent_manager.get_agent_by_id(sarah_agent.id, actor=default_user) + assert len([t for t in agent.tools if t.id == print_tool.id]) == 1 + + +def test_detach_tool(server: SyncServer, sarah_agent, print_tool, default_user): + """Test detaching a tool from an agent.""" + # Attach the tool first + server.agent_manager.attach_tool(agent_id=sarah_agent.id, tool_id=print_tool.id, actor=default_user) + + # Verify it's attached + agent = server.agent_manager.get_agent_by_id(sarah_agent.id, actor=default_user) + assert print_tool.id in [t.id for t in agent.tools] + + # Detach the tool + server.agent_manager.detach_tool(agent_id=sarah_agent.id, tool_id=print_tool.id, actor=default_user) + + # Verify it's detached + agent = server.agent_manager.get_agent_by_id(sarah_agent.id, actor=default_user) + assert print_tool.id not in [t.id for t in agent.tools] + + # Verify that detaching an already detached tool doesn't cause issues + server.agent_manager.detach_tool(agent_id=sarah_agent.id, tool_id=print_tool.id, actor=default_user) + + +def test_attach_tool_nonexistent_agent(server: SyncServer, print_tool, default_user): + """Test attaching a tool to a nonexistent agent.""" + with pytest.raises(NoResultFound): + server.agent_manager.attach_tool(agent_id="nonexistent-agent-id", tool_id=print_tool.id, actor=default_user) + + +def test_attach_tool_nonexistent_tool(server: SyncServer, sarah_agent, default_user): + """Test attaching a nonexistent tool to an agent.""" + with pytest.raises(NoResultFound): + server.agent_manager.attach_tool(agent_id=sarah_agent.id, tool_id="nonexistent-tool-id", actor=default_user) + + +def test_detach_tool_nonexistent_agent(server: SyncServer, print_tool, default_user): + """Test detaching a tool from a nonexistent agent.""" + with pytest.raises(NoResultFound): + server.agent_manager.detach_tool(agent_id="nonexistent-agent-id", tool_id=print_tool.id, actor=default_user) + + +def test_list_attached_tools(server: SyncServer, sarah_agent, print_tool, other_tool, default_user): + """Test listing tools attached to an agent.""" + # Initially should have no tools + agent = server.agent_manager.get_agent_by_id(sarah_agent.id, actor=default_user) + assert len(agent.tools) == 0 + + # Attach tools + server.agent_manager.attach_tool(agent_id=sarah_agent.id, tool_id=print_tool.id, actor=default_user) + server.agent_manager.attach_tool(agent_id=sarah_agent.id, tool_id=other_tool.id, actor=default_user) + + # List tools and verify + agent = server.agent_manager.get_agent_by_id(sarah_agent.id, actor=default_user) + attached_tool_ids = [t.id for t in agent.tools] + assert len(attached_tool_ids) == 2 + assert print_tool.id in attached_tool_ids + assert other_tool.id in attached_tool_ids + + # ====================================================================================================================== # AgentManager Tests - Sources Relationship # ====================================================================================================================== @@ -693,6 +769,7 @@ def test_attach_block(server: SyncServer, sarah_agent, default_block, default_us assert agent.memory.blocks[0].label == default_block.label +@pytest.mark.skipif(USING_SQLITE, reason="Test not applicable when using SQLite.") def test_attach_block_duplicate_label(server: SyncServer, sarah_agent, default_block, other_block, default_user): """Test attempting to attach a block with a duplicate label.""" # Set up both blocks with same label @@ -1143,6 +1220,7 @@ def test_create_tool(server: SyncServer, print_tool, default_user, default_organ assert print_tool.organization_id == default_organization.id +@pytest.mark.skipif(USING_SQLITE, reason="Test not applicable when using SQLite.") def test_create_tool_duplicate_name(server: SyncServer, print_tool, default_user, default_organization): data = print_tool.model_dump(exclude=["id"]) tool = PydanticTool(**data) From c6878fc0884d8c7af400bb2380338ca5c05387e6 Mon Sep 17 00:00:00 2001 From: mlong93 <35275280+mlong93@users.noreply.github.com> Date: Mon, 16 Dec 2024 15:24:20 -0800 Subject: [PATCH 089/280] feat: separate Passages tables (#2245) Co-authored-by: Mindy Long --- ...54dec07619c4_divide_passage_table_into_.py | 105 +++ letta/agent.py | 63 +- letta/functions/function_sets/base.py | 4 +- letta/functions/schema_generator.py | 6 +- letta/orm/__init__.py | 2 +- letta/orm/agent.py | 20 +- letta/orm/file.py | 5 +- letta/orm/mixins.py | 17 +- letta/orm/organization.py | 22 +- letta/orm/passage.py | 82 ++- letta/orm/source.py | 4 + letta/orm/sqlalchemy_base.py | 4 +- letta/schemas/passage.py | 2 +- letta/server/server.py | 41 +- letta/services/agent_manager.py | 276 +++++++- letta/services/passage_manager.py | 176 +++-- tests/test_client_legacy.py | 1 - tests/test_managers.py | 645 ++++++++++-------- tests/test_server.py | 109 ++- 19 files changed, 1032 insertions(+), 552 deletions(-) create mode 100644 alembic/versions/54dec07619c4_divide_passage_table_into_.py diff --git a/alembic/versions/54dec07619c4_divide_passage_table_into_.py b/alembic/versions/54dec07619c4_divide_passage_table_into_.py new file mode 100644 index 0000000000..afe9d41850 --- /dev/null +++ b/alembic/versions/54dec07619c4_divide_passage_table_into_.py @@ -0,0 +1,105 @@ +"""divide passage table into SourcePassages and AgentPassages + +Revision ID: 54dec07619c4 +Revises: 4e88e702f85e +Create Date: 2024-12-14 17:23:08.772554 + +""" +from typing import Sequence, Union + +from alembic import op +from pgvector.sqlalchemy import Vector +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +from letta.orm.custom_columns import EmbeddingConfigColumn + +# revision identifiers, used by Alembic. +revision: str = '54dec07619c4' +down_revision: Union[str, None] = '4e88e702f85e' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table( + 'agent_passages', + sa.Column('id', sa.String(), nullable=False), + sa.Column('text', sa.String(), nullable=False), + sa.Column('embedding_config', EmbeddingConfigColumn(), nullable=False), + sa.Column('metadata_', sa.JSON(), nullable=False), + sa.Column('embedding', Vector(dim=4096), nullable=True), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), + sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), + sa.Column('is_deleted', sa.Boolean(), server_default=sa.text('FALSE'), nullable=False), + sa.Column('_created_by_id', sa.String(), nullable=True), + sa.Column('_last_updated_by_id', sa.String(), nullable=True), + sa.Column('organization_id', sa.String(), nullable=False), + sa.Column('agent_id', sa.String(), nullable=False), + sa.ForeignKeyConstraint(['agent_id'], ['agents.id'], ondelete='CASCADE'), + sa.ForeignKeyConstraint(['organization_id'], ['organizations.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.create_index('agent_passages_org_idx', 'agent_passages', ['organization_id'], unique=False) + op.create_table( + 'source_passages', + sa.Column('id', sa.String(), nullable=False), + sa.Column('text', sa.String(), nullable=False), + sa.Column('embedding_config', EmbeddingConfigColumn(), nullable=False), + sa.Column('metadata_', sa.JSON(), nullable=False), + sa.Column('embedding', Vector(dim=4096), nullable=True), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), + sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), + sa.Column('is_deleted', sa.Boolean(), server_default=sa.text('FALSE'), nullable=False), + sa.Column('_created_by_id', sa.String(), nullable=True), + sa.Column('_last_updated_by_id', sa.String(), nullable=True), + sa.Column('organization_id', sa.String(), nullable=False), + sa.Column('file_id', sa.String(), nullable=True), + sa.Column('source_id', sa.String(), nullable=False), + sa.ForeignKeyConstraint(['file_id'], ['files.id'], ondelete='CASCADE'), + sa.ForeignKeyConstraint(['organization_id'], ['organizations.id'], ), + sa.ForeignKeyConstraint(['source_id'], ['sources.id'], ondelete='CASCADE'), + sa.PrimaryKeyConstraint('id') + ) + op.create_index('source_passages_org_idx', 'source_passages', ['organization_id'], unique=False) + op.drop_table('passages') + op.drop_constraint('files_source_id_fkey', 'files', type_='foreignkey') + op.create_foreign_key(None, 'files', 'sources', ['source_id'], ['id'], ondelete='CASCADE') + op.drop_constraint('messages_agent_id_fkey', 'messages', type_='foreignkey') + op.create_foreign_key(None, 'messages', 'agents', ['agent_id'], ['id'], ondelete='CASCADE') + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'messages', type_='foreignkey') + op.create_foreign_key('messages_agent_id_fkey', 'messages', 'agents', ['agent_id'], ['id']) + op.drop_constraint(None, 'files', type_='foreignkey') + op.create_foreign_key('files_source_id_fkey', 'files', 'sources', ['source_id'], ['id']) + op.create_table( + 'passages', + sa.Column('id', sa.VARCHAR(), autoincrement=False, nullable=False), + sa.Column('text', sa.VARCHAR(), autoincrement=False, nullable=False), + sa.Column('file_id', sa.VARCHAR(), autoincrement=False, nullable=True), + sa.Column('agent_id', sa.VARCHAR(), autoincrement=False, nullable=True), + sa.Column('source_id', sa.VARCHAR(), autoincrement=False, nullable=True), + sa.Column('embedding', Vector(dim=4096), autoincrement=False, nullable=True), + sa.Column('embedding_config', postgresql.JSON(astext_type=sa.Text()), autoincrement=False, nullable=False), + sa.Column('metadata_', postgresql.JSON(astext_type=sa.Text()), autoincrement=False, nullable=False), + sa.Column('created_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=False), + sa.Column('updated_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=True), + sa.Column('is_deleted', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=False), + sa.Column('_created_by_id', sa.VARCHAR(), autoincrement=False, nullable=True), + sa.Column('_last_updated_by_id', sa.VARCHAR(), autoincrement=False, nullable=True), + sa.Column('organization_id', sa.VARCHAR(), autoincrement=False, nullable=False), + sa.ForeignKeyConstraint(['agent_id'], ['agents.id'], name='passages_agent_id_fkey'), + sa.ForeignKeyConstraint(['file_id'], ['files.id'], name='passages_file_id_fkey', ondelete='CASCADE'), + sa.ForeignKeyConstraint(['organization_id'], ['organizations.id'], name='passages_organization_id_fkey'), + sa.PrimaryKeyConstraint('id', name='passages_pkey') + ) + op.drop_index('source_passages_org_idx', table_name='source_passages') + op.drop_table('source_passages') + op.drop_index('agent_passages_org_idx', table_name='agent_passages') + op.drop_table('agent_passages') + # ### end Alembic commands ### diff --git a/letta/agent.py b/letta/agent.py index 71bcd71aa1..341b25fda3 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -41,7 +41,6 @@ Message as ChatCompletionMessage, ) from letta.schemas.openai.chat_completion_response import UsageStatistics -from letta.schemas.passage import Passage from letta.schemas.tool import Tool from letta.schemas.tool_rule import TerminalToolRule from letta.schemas.usage import LettaUsageStatistics @@ -82,7 +81,7 @@ def compile_memory_metadata_block( actor: PydanticUser, agent_id: str, memory_edit_timestamp: datetime.datetime, - passage_manager: Optional[PassageManager] = None, + agent_manager: Optional[AgentManager] = None, message_manager: Optional[MessageManager] = None, ) -> str: # Put the timestamp in the local timezone (mimicking get_local_time()) @@ -93,7 +92,7 @@ def compile_memory_metadata_block( [ f"### Memory [last modified: {timestamp_str}]", f"{message_manager.size(actor=actor, agent_id=agent_id) if message_manager else 0} previous messages between you and the user are stored in recall memory (use functions to access them)", - f"{passage_manager.size(actor=actor, agent_id=agent_id) if passage_manager else 0} total memories you created are stored in archival memory (use functions to access them)", + f"{agent_manager.passage_size(actor=actor, agent_id=agent_id) if agent_manager else 0} total memories you created are stored in archival memory (use functions to access them)", "\nCore memory shown below (limited in size, additional information stored in archival / recall memory):", ] ) @@ -106,7 +105,7 @@ def compile_system_message( in_context_memory: Memory, in_context_memory_last_edit: datetime.datetime, # TODO move this inside of BaseMemory? actor: PydanticUser, - passage_manager: Optional[PassageManager] = None, + agent_manager: Optional[AgentManager] = None, message_manager: Optional[MessageManager] = None, user_defined_variables: Optional[dict] = None, append_icm_if_missing: bool = True, @@ -135,7 +134,7 @@ def compile_system_message( actor=actor, agent_id=agent_id, memory_edit_timestamp=in_context_memory_last_edit, - passage_manager=passage_manager, + agent_manager=agent_manager, message_manager=message_manager, ) full_memory_string = memory_metadata_string + "\n" + in_context_memory.compile() @@ -172,7 +171,7 @@ def initialize_message_sequence( agent_id: str, memory: Memory, actor: PydanticUser, - passage_manager: Optional[PassageManager] = None, + agent_manager: Optional[AgentManager] = None, message_manager: Optional[MessageManager] = None, memory_edit_timestamp: Optional[datetime.datetime] = None, include_initial_boot_message: bool = True, @@ -181,7 +180,7 @@ def initialize_message_sequence( memory_edit_timestamp = get_local_time() # full_system_message = construct_system_with_memory( - # system, memory, memory_edit_timestamp, passage_manager=passage_manager, recall_memory=recall_memory + # system, memory, memory_edit_timestamp, agent_manager=agent_manager, recall_memory=recall_memory # ) full_system_message = compile_system_message( agent_id=agent_id, @@ -189,7 +188,7 @@ def initialize_message_sequence( in_context_memory=memory, in_context_memory_last_edit=memory_edit_timestamp, actor=actor, - passage_manager=passage_manager, + agent_manager=agent_manager, message_manager=message_manager, user_defined_variables=None, append_icm_if_missing=True, @@ -291,8 +290,9 @@ def __init__( self.interface = interface # Create the persistence manager object based on the AgentState info - self.passage_manager = PassageManager() self.message_manager = MessageManager() + self.passage_manager = PassageManager() + self.agent_manager = AgentManager() # State needed for heartbeat pausing self.pause_heartbeats_start = None @@ -322,7 +322,7 @@ def __init__( agent_id=self.agent_state.id, memory=self.agent_state.memory, actor=self.user, - passage_manager=None, + agent_manager=None, message_manager=None, memory_edit_timestamp=get_utc_time(), include_initial_boot_message=True, @@ -347,7 +347,7 @@ def __init__( memory=self.agent_state.memory, agent_id=self.agent_state.id, actor=self.user, - passage_manager=None, + agent_manager=None, message_manager=None, memory_edit_timestamp=get_utc_time(), include_initial_boot_message=True, @@ -1297,7 +1297,7 @@ def rebuild_system_prompt(self, force=False, update_timestamp=True): in_context_memory=self.agent_state.memory, in_context_memory_last_edit=memory_edit_timestamp, actor=self.user, - passage_manager=self.passage_manager, + agent_manager=self.agent_manager, message_manager=self.message_manager, user_defined_variables=None, append_icm_if_missing=True, @@ -1368,33 +1368,24 @@ def attach_source( source_id: str, source_manager: SourceManager, agent_manager: AgentManager, - page_size: Optional[int] = None, ): - """Attach data with name `source_name` to the agent from source_connector.""" - # TODO: eventually, adding a data source should just give access to the retriever the source table, rather than modifying archival memory - passages = self.passage_manager.list_passages(actor=user, source_id=source_id, limit=page_size) - - for passage in passages: - assert isinstance(passage, Passage), f"Generate yielded bad non-Passage type: {type(passage)}" - passage.agent_id = self.agent_state.id - self.passage_manager.update_passage_by_id(passage_id=passage.id, passage=passage, actor=user) - - agents_passages = self.passage_manager.list_passages(actor=user, agent_id=self.agent_state.id, source_id=source_id, limit=page_size) - passage_size = self.passage_manager.size(actor=user, agent_id=self.agent_state.id, source_id=source_id) - assert all([p.agent_id == self.agent_state.id for p in agents_passages]) - assert len(agents_passages) == passage_size # sanity check - assert passage_size == len(passages), f"Expected {len(passages)} passages, got {passage_size}" - - # attach to agent + """Attach a source to the agent using the SourcesAgents ORM relationship. + + Args: + user: User performing the action + source_id: ID of the source to attach + source_manager: SourceManager instance to verify source exists + agent_manager: AgentManager instance to manage agent-source relationship + """ + # Verify source exists and user has permission to access it source = source_manager.get_source_by_id(source_id=source_id, actor=user) - assert source is not None, f"Source {source_id} not found in metadata store" + assert source is not None, f"Source {source_id} not found in user's organization ({user.organization_id})" - # NOTE: need this redundant line here because we haven't migrated agent to ORM yet - # TODO: delete @matt and remove + # Use the agent_manager to create the relationship agent_manager.attach_source(agent_id=self.agent_state.id, source_id=source_id, actor=user) printd( - f"Attached data source {source.name} to agent {self.agent_state.name}, consisting of {len(passages)}. Agent now has {passage_size} embeddings in archival memory.", + f"Attached data source {source.name} to agent {self.agent_state.name}.", ) def update_message(self, message_id: str, request: MessageUpdate) -> Message: @@ -1550,13 +1541,13 @@ def get_context_window(self) -> ContextWindowOverview: num_tokens_from_messages(messages=messages_openai_format[1:], model=self.model) if len(messages_openai_format) > 1 else 0 ) - passage_manager_size = self.passage_manager.size(actor=self.user, agent_id=self.agent_state.id) + agent_manager_passage_size = self.agent_manager.passage_size(actor=self.user, agent_id=self.agent_state.id) message_manager_size = self.message_manager.size(actor=self.user, agent_id=self.agent_state.id) external_memory_summary = compile_memory_metadata_block( actor=self.user, agent_id=self.agent_state.id, memory_edit_timestamp=get_utc_time(), # dummy timestamp - passage_manager=self.passage_manager, + agent_manager=self.agent_manager, message_manager=self.message_manager, ) num_tokens_external_memory_summary = count_tokens(external_memory_summary) @@ -1582,7 +1573,7 @@ def get_context_window(self) -> ContextWindowOverview: return ContextWindowOverview( # context window breakdown (in messages) num_messages=len(self._messages), - num_archival_memory=passage_manager_size, + num_archival_memory=agent_manager_passage_size, num_recall_memory=message_manager_size, num_tokens_external_memory_summary=num_tokens_external_memory_summary, # top-level information diff --git a/letta/functions/function_sets/base.py b/letta/functions/function_sets/base.py index cdcad3acad..e35739dd64 100644 --- a/letta/functions/function_sets/base.py +++ b/letta/functions/function_sets/base.py @@ -3,6 +3,7 @@ from letta.agent import Agent from letta.constants import MAX_PAUSE_HEARTBEATS +from letta.services.agent_manager import AgentManager # import math # from letta.utils import json_dumps @@ -200,8 +201,9 @@ def archival_memory_search(self: "Agent", query: str, page: Optional[int] = 0, s try: # Get results using passage manager - all_results = self.passage_manager.list_passages( + all_results = self.agent_manager.list_passages( actor=self.user, + agent_id=self.agent_state.id, query_text=query, limit=count + start, # Request enough results to handle offset embedding_config=self.agent_state.embedding_config, diff --git a/letta/functions/schema_generator.py b/letta/functions/schema_generator.py index e36efc07a7..170bea3015 100644 --- a/letta/functions/schema_generator.py +++ b/letta/functions/schema_generator.py @@ -312,11 +312,7 @@ def generate_schema(function, name: Optional[str] = None, description: Optional[ for param in sig.parameters.values(): # Exclude 'self' parameter # TODO: eventually remove this (only applies to BASE_TOOLS) - if param.name == "self": - continue - - # exclude 'agent_state' parameter - if param.name == "agent_state": + if param.name in ["self", "agent_state"]: # Add agent_manager to excluded continue # Assert that the parameter has a type annotation diff --git a/letta/orm/__init__.py b/letta/orm/__init__.py index ed8f24606c..8a0f0c7779 100644 --- a/letta/orm/__init__.py +++ b/letta/orm/__init__.py @@ -7,7 +7,7 @@ from letta.orm.job import Job from letta.orm.message import Message from letta.orm.organization import Organization -from letta.orm.passage import Passage +from letta.orm.passage import BasePassage, AgentPassage, SourcePassage from letta.orm.sandbox_config import SandboxConfig, SandboxEnvironmentVariable from letta.orm.source import Source from letta.orm.sources_agents import SourcesAgents diff --git a/letta/orm/agent.py b/letta/orm/agent.py index 0f086e2776..c4645c3ed2 100644 --- a/letta/orm/agent.py +++ b/letta/orm/agent.py @@ -82,7 +82,25 @@ class Agent(SqlalchemyBase, OrganizationMixin): lazy="selectin", doc="Tags associated with the agent.", ) - # passages: Mapped[List["Passage"]] = relationship("Passage", back_populates="agent", lazy="selectin") + source_passages: Mapped[List["SourcePassage"]] = relationship( + "SourcePassage", + secondary="sources_agents", # The join table for Agent -> Source + primaryjoin="Agent.id == sources_agents.c.agent_id", + secondaryjoin="and_(SourcePassage.source_id == sources_agents.c.source_id)", + lazy="selectin", + order_by="SourcePassage.created_at.desc()", + viewonly=True, # Ensures SQLAlchemy doesn't attempt to manage this relationship + doc="All passages derived from sources associated with this agent.", + ) + agent_passages: Mapped[List["AgentPassage"]] = relationship( + "AgentPassage", + back_populates="agent", + lazy="selectin", + order_by="AgentPassage.created_at.desc()", + cascade="all, delete-orphan", + viewonly=True, # Ensures SQLAlchemy doesn't attempt to manage this relationship + doc="All passages derived created by this agent.", + ) def to_pydantic(self) -> PydanticAgentState: """converts to the basic pydantic model counterpart""" diff --git a/letta/orm/file.py b/letta/orm/file.py index 6f7111639a..45470c6c96 100644 --- a/letta/orm/file.py +++ b/letta/orm/file.py @@ -9,7 +9,8 @@ if TYPE_CHECKING: from letta.orm.organization import Organization - + from letta.orm.source import Source + from letta.orm.passage import SourcePassage class FileMetadata(SqlalchemyBase, OrganizationMixin, SourceMixin): """Represents metadata for an uploaded file.""" @@ -27,4 +28,4 @@ class FileMetadata(SqlalchemyBase, OrganizationMixin, SourceMixin): # relationships organization: Mapped["Organization"] = relationship("Organization", back_populates="files", lazy="selectin") source: Mapped["Source"] = relationship("Source", back_populates="files", lazy="selectin") - passages: Mapped[List["Passage"]] = relationship("Passage", back_populates="file", lazy="selectin", cascade="all, delete-orphan") + source_passages: Mapped[List["SourcePassage"]] = relationship("SourcePassage", back_populates="file", lazy="selectin", cascade="all, delete-orphan") diff --git a/letta/orm/mixins.py b/letta/orm/mixins.py index 60c319d985..328772d7e4 100644 --- a/letta/orm/mixins.py +++ b/letta/orm/mixins.py @@ -31,30 +31,19 @@ class UserMixin(Base): user_id: Mapped[str] = mapped_column(String, ForeignKey("users.id")) -class FileMixin(Base): - """Mixin for models that belong to a file.""" - - __abstract__ = True - - file_id: Mapped[str] = mapped_column(String, ForeignKey("files.id")) - class AgentMixin(Base): """Mixin for models that belong to an agent.""" __abstract__ = True - agent_id: Mapped[str] = mapped_column(String, ForeignKey("agents.id")) + agent_id: Mapped[str] = mapped_column(String, ForeignKey("agents.id", ondelete="CASCADE")) class FileMixin(Base): """Mixin for models that belong to a file.""" __abstract__ = True - file_id: Mapped[Optional[str]] = mapped_column( - String, - ForeignKey("files.id", ondelete="CASCADE"), - nullable=True - ) + file_id: Mapped[Optional[str]] = mapped_column(String, ForeignKey("files.id", ondelete="CASCADE")) class SourceMixin(Base): @@ -62,7 +51,7 @@ class SourceMixin(Base): __abstract__ = True - source_id: Mapped[str] = mapped_column(String, ForeignKey("sources.id")) + source_id: Mapped[str] = mapped_column(String, ForeignKey("sources.id", ondelete="CASCADE"), nullable=False) class SandboxConfigMixin(Base): diff --git a/letta/orm/organization.py b/letta/orm/organization.py index bed2b00fda..9a71a09b7e 100644 --- a/letta/orm/organization.py +++ b/letta/orm/organization.py @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING, List +from typing import TYPE_CHECKING, List, Union from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -35,6 +35,22 @@ class Organization(SqlalchemyBase): ) # relationships - messages: Mapped[List["Message"]] = relationship("Message", back_populates="organization", cascade="all, delete-orphan") agents: Mapped[List["Agent"]] = relationship("Agent", back_populates="organization", cascade="all, delete-orphan") - passages: Mapped[List["Passage"]] = relationship("Passage", back_populates="organization", cascade="all, delete-orphan") + messages: Mapped[List["Message"]] = relationship("Message", back_populates="organization", cascade="all, delete-orphan") + source_passages: Mapped[List["SourcePassage"]] = relationship( + "SourcePassage", + back_populates="organization", + cascade="all, delete-orphan" + ) + agent_passages: Mapped[List["AgentPassage"]] = relationship( + "AgentPassage", + back_populates="organization", + cascade="all, delete-orphan" + ) + + @property + def passages(self) -> List[Union["SourcePassage", "AgentPassage"]]: + """Convenience property to get all passages""" + return self.source_passages + self.agent_passages + + diff --git a/letta/orm/passage.py b/letta/orm/passage.py index a53e1d2404..d38878418b 100644 --- a/letta/orm/passage.py +++ b/letta/orm/passage.py @@ -1,39 +1,35 @@ -from datetime import datetime -from typing import TYPE_CHECKING, Optional +from typing import TYPE_CHECKING +from sqlalchemy import Column, JSON, Index +from sqlalchemy.orm import Mapped, mapped_column, relationship, declared_attr -from sqlalchemy import JSON, Column, DateTime, ForeignKey, String -from sqlalchemy.orm import Mapped, mapped_column, relationship - -from letta.config import LettaConfig -from letta.constants import MAX_EMBEDDING_DIM -from letta.orm.custom_columns import CommonVector from letta.orm.mixins import FileMixin, OrganizationMixin -from letta.orm.source import EmbeddingConfigColumn +from letta.orm.custom_columns import CommonVector, EmbeddingConfigColumn from letta.orm.sqlalchemy_base import SqlalchemyBase +from letta.orm.mixins import AgentMixin, FileMixin, OrganizationMixin, SourceMixin from letta.schemas.passage import Passage as PydanticPassage from letta.settings import settings +from letta.config import LettaConfig +from letta.constants import MAX_EMBEDDING_DIM + config = LettaConfig() if TYPE_CHECKING: from letta.orm.organization import Organization + from letta.orm.agent import Agent -# TODO: After migration to Passage, will need to manually delete passages where files -# are deleted on web -class Passage(SqlalchemyBase, OrganizationMixin, FileMixin): - """Defines data model for storing Passages""" - - __tablename__ = "passages" - __table_args__ = {"extend_existing": True} +class BasePassage(SqlalchemyBase, OrganizationMixin): + """Base class for all passage types with common fields""" + __abstract__ = True __pydantic_model__ = PydanticPassage id: Mapped[str] = mapped_column(primary_key=True, doc="Unique passage identifier") text: Mapped[str] = mapped_column(doc="Passage text content") - source_id: Mapped[Optional[str]] = mapped_column(nullable=True, doc="Source identifier") embedding_config: Mapped[dict] = mapped_column(EmbeddingConfigColumn, doc="Embedding configuration") metadata_: Mapped[dict] = mapped_column(JSON, doc="Additional metadata") - created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=datetime.utcnow) + + # Vector embedding field based on database type if settings.letta_pg_uri_no_default: from pgvector.sqlalchemy import Vector @@ -41,9 +37,49 @@ class Passage(SqlalchemyBase, OrganizationMixin, FileMixin): else: embedding = Column(CommonVector) - # Foreign keys - agent_id: Mapped[Optional[str]] = mapped_column(String, ForeignKey("agents.id"), nullable=True) + @declared_attr + def organization(cls) -> Mapped["Organization"]: + """Relationship to organization""" + return relationship("Organization", back_populates="passages", lazy="selectin") + + @declared_attr + def __table_args__(cls): + if settings.letta_pg_uri_no_default: + return ( + Index(f'{cls.__tablename__}_org_idx', 'organization_id'), + {"extend_existing": True} + ) + return ({"extend_existing": True},) + + +class SourcePassage(BasePassage, FileMixin, SourceMixin): + """Passages derived from external files/sources""" + __tablename__ = "source_passages" + + @declared_attr + def file(cls) -> Mapped["FileMetadata"]: + """Relationship to file""" + return relationship("FileMetadata", back_populates="source_passages", lazy="selectin") + + @declared_attr + def organization(cls) -> Mapped["Organization"]: + return relationship("Organization", back_populates="source_passages", lazy="selectin") + + @declared_attr + def source(cls) -> Mapped["Source"]: + """Relationship to source""" + return relationship("Source", back_populates="passages", lazy="selectin", passive_deletes=True) + + +class AgentPassage(BasePassage, AgentMixin): + """Passages created by agents as archival memories""" + __tablename__ = "agent_passages" + + @declared_attr + def organization(cls) -> Mapped["Organization"]: + return relationship("Organization", back_populates="agent_passages", lazy="selectin") - # Relationships - organization: Mapped["Organization"] = relationship("Organization", back_populates="passages", lazy="selectin") - file: Mapped["FileMetadata"] = relationship("FileMetadata", back_populates="passages", lazy="selectin") + @declared_attr + def agent(cls) -> Mapped["Agent"]: + """Relationship to agent""" + return relationship("Agent", back_populates="agent_passages", lazy="selectin", passive_deletes=True) diff --git a/letta/orm/source.py b/letta/orm/source.py index c3fbdf65fa..3ecffda6d9 100644 --- a/letta/orm/source.py +++ b/letta/orm/source.py @@ -12,6 +12,9 @@ if TYPE_CHECKING: from letta.orm.organization import Organization + from letta.orm.file import FileMetadata + from letta.orm.passage import SourcePassage + from letta.orm.agent import Agent class Source(SqlalchemyBase, OrganizationMixin): @@ -28,4 +31,5 @@ class Source(SqlalchemyBase, OrganizationMixin): # relationships organization: Mapped["Organization"] = relationship("Organization", back_populates="sources") files: Mapped[List["FileMetadata"]] = relationship("FileMetadata", back_populates="source", cascade="all, delete-orphan") + passages: Mapped[List["SourcePassage"]] = relationship("SourcePassage", back_populates="source", cascade="all, delete-orphan") agents: Mapped[List["Agent"]] = relationship("Agent", secondary="sources_agents", back_populates="sources") diff --git a/letta/orm/sqlalchemy_base.py b/letta/orm/sqlalchemy_base.py index d13e85b16b..48b8c44ad0 100644 --- a/letta/orm/sqlalchemy_base.py +++ b/letta/orm/sqlalchemy_base.py @@ -3,7 +3,7 @@ from typing import TYPE_CHECKING, List, Literal, Optional from sqlalchemy import String, desc, func, or_, select -from sqlalchemy.exc import DBAPIError +from sqlalchemy.exc import DBAPIError, IntegrityError from sqlalchemy.orm import Mapped, Session, mapped_column from letta.log import get_logger @@ -242,7 +242,7 @@ def create(self, db_session: "Session", actor: Optional["User"] = None) -> "Sqla session.commit() session.refresh(self) return self - except DBAPIError as e: + except (DBAPIError, IntegrityError) as e: self._handle_dbapi_error(e) def delete(self, db_session: "Session", actor: Optional["User"] = None) -> "SqlalchemyBase": diff --git a/letta/schemas/passage.py b/letta/schemas/passage.py index faa520c03e..c1ec13bec4 100644 --- a/letta/schemas/passage.py +++ b/letta/schemas/passage.py @@ -10,7 +10,7 @@ class PassageBase(OrmMetadataBase): - __id_prefix__ = "passage_legacy" + __id_prefix__ = "passage" is_deleted: bool = Field(False, description="Whether this passage is deleted or not.") diff --git a/letta/server/server.py b/letta/server/server.py index b01bfd3467..3eb3207a29 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -932,7 +932,7 @@ def get_agent_memory(self, agent_id: str, actor: User) -> Memory: def get_archival_memory_summary(self, agent_id: str, actor: User) -> ArchivalMemorySummary: agent = self.load_agent(agent_id=agent_id, actor=actor) - return ArchivalMemorySummary(size=agent.passage_manager.size(actor=self.default_user)) + return ArchivalMemorySummary(size=self.agent_manager.passage_size(actor=actor, agent_id=agent_id)) def get_recall_memory_summary(self, agent_id: str, actor: User) -> RecallMemorySummary: agent = self.load_agent(agent_id=agent_id, actor=actor) @@ -949,18 +949,9 @@ def get_agent_archival(self, user_id: str, agent_id: str, cursor: Optional[str] # TODO: Thread actor directly through this function, since the top level caller most likely already retrieved the user actor = self.user_manager.get_user_or_default(user_id=user_id) - # Get the agent object (loaded in memory) - letta_agent = self.load_agent(agent_id=agent_id, actor=actor) - - # iterate over records - records = letta_agent.passage_manager.list_passages( - actor=actor, - agent_id=agent_id, - cursor=cursor, - limit=limit, - ) + passages = self.agent_manager.list_passages(agent_id=agent_id, actor=actor) - return records + return passages def get_agent_archival_cursor( self, @@ -974,15 +965,13 @@ def get_agent_archival_cursor( # TODO: Thread actor directly through this function, since the top level caller most likely already retrieved the user actor = self.user_manager.get_user_or_default(user_id=user_id) - # Get the agent object (loaded in memory) - letta_agent = self.load_agent(agent_id=agent_id, actor=actor) - # iterate over records - records = letta_agent.passage_manager.list_passages( - actor=self.default_user, + records = self.agent_manager.list_passages( + actor=actor, agent_id=agent_id, cursor=cursor, limit=limit, + ascending=not reverse, ) return records @@ -1098,7 +1087,8 @@ def delete_source(self, source_id: str, actor: User): self.source_manager.delete_source(source_id=source_id, actor=actor) # delete data from passage store - self.passage_manager.delete_passages(actor=actor, limit=None, source_id=source_id) + passages_to_be_deleted = self.agent_manager.list_passages(actor=actor, source_id=source_id, limit=None) + self.passage_manager.delete_passages(actor=actor, passages=passages_to_be_deleted) # TODO: delete data from agent passage stores (?) @@ -1129,9 +1119,11 @@ def load_file_to_source(self, source_id: str, file_path: str, job_id: str, actor for agent_state in agent_states: agent_id = agent_state.id agent = self.load_agent(agent_id=agent_id, actor=actor) - curr_passage_size = self.passage_manager.size(actor=actor, agent_id=agent_id, source_id=source_id) + + # Attach source to agent + curr_passage_size = self.agent_manager.passage_size(actor=actor, agent_id=agent_id) agent.attach_source(user=actor, source_id=source_id, source_manager=self.source_manager, agent_manager=self.agent_manager) - new_passage_size = self.passage_manager.size(actor=actor, agent_id=agent_id, source_id=source_id) + new_passage_size = self.agent_manager.passage_size(actor=actor, agent_id=agent_id) assert new_passage_size >= curr_passage_size # in case empty files are added return job @@ -1195,14 +1187,9 @@ def detach_source_from_agent( source = self.source_manager.get_source_by_id(source_id=source_id, actor=actor) elif source_name: source = self.source_manager.get_source_by_name(source_name=source_name, actor=actor) + source_id = source.id else: raise ValueError(f"Need to provide at least source_id or source_name to find the source.") - source_id = source.id - - # TODO: This should be done with the ORM? - # delete all Passage objects with source_id==source_id from agent's archival memory - agent = self.load_agent(agent_id=agent_id, actor=actor) - agent.passage_manager.delete_passages(actor=actor, limit=100, source_id=source_id) # delete agent-source mapping self.agent_manager.detach_source(agent_id=agent_id, source_id=source_id, actor=actor) @@ -1224,7 +1211,7 @@ def list_all_sources(self, actor: User) -> List[Source]: for source in sources: # count number of passages - num_passages = self.passage_manager.size(actor=actor, source_id=source.id) + num_passages = self.agent_manager.passage_size(actor=actor, source_id=source.id) # TODO: add when files table implemented ## count number of files diff --git a/letta/services/agent_manager.py b/letta/services/agent_manager.py index 52a526f9b2..d1edb3eaba 100644 --- a/letta/services/agent_manager.py +++ b/letta/services/agent_manager.py @@ -1,17 +1,26 @@ from typing import Dict, List, Optional +from datetime import datetime +import numpy as np -from letta.constants import BASE_MEMORY_TOOLS, BASE_TOOLS +from sqlalchemy import select, union_all, literal, func, Select + +from letta.constants import BASE_MEMORY_TOOLS, BASE_TOOLS, MAX_EMBEDDING_DIM +from letta.embeddings import embedding_model from letta.log import get_logger from letta.orm import Agent as AgentModel from letta.orm import Block as BlockModel from letta.orm import Source as SourceModel from letta.orm import Tool as ToolModel +from letta.orm import AgentPassage, SourcePassage +from letta.orm import SourcesAgents from letta.orm.errors import NoResultFound +from letta.orm.sqlite_functions import adapt_array from letta.schemas.agent import AgentState as PydanticAgentState from letta.schemas.agent import AgentType, CreateAgent, UpdateAgent from letta.schemas.block import Block as PydanticBlock from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.llm_config import LLMConfig +from letta.schemas.passage import Passage as PydanticPassage from letta.schemas.source import Source as PydanticSource from letta.schemas.tool_rule import ToolRule as PydanticToolRule from letta.schemas.user import User as PydanticUser @@ -21,9 +30,9 @@ _process_tags, derive_system_message, ) -from letta.services.passage_manager import PassageManager from letta.services.source_manager import SourceManager from letta.services.tool_manager import ToolManager +from letta.settings import settings from letta.utils import enforce_types logger = get_logger(__name__) @@ -229,13 +238,6 @@ def delete_agent(self, agent_id: str, actor: PydanticUser) -> PydanticAgentState with self.session_maker() as session: # Retrieve the agent agent = AgentModel.read(db_session=session, identifier=agent_id, actor=actor) - - # TODO: @mindy delete this piece when we have a proper passages/sources implementation - # TODO: This is done very hacky on purpose - # TODO: 1000 limit is also wack - passage_manager = PassageManager() - passage_manager.delete_passages(actor=actor, agent_id=agent_id, limit=1000) - agent_state = agent.to_pydantic() agent.hard_delete(session) return agent_state @@ -407,6 +409,262 @@ def detach_block_with_label( agent.update(session, actor=actor) return agent.to_pydantic() + # ====================================================================================================================== + # Passage Management + # ====================================================================================================================== + def _build_passage_query( + self, + actor: PydanticUser, + agent_id: Optional[str] = None, + file_id: Optional[str] = None, + query_text: Optional[str] = None, + start_date: Optional[datetime] = None, + end_date: Optional[datetime] = None, + cursor: Optional[str] = None, + source_id: Optional[str] = None, + embed_query: bool = False, + ascending: bool = True, + embedding_config: Optional[EmbeddingConfig] = None, + agent_only: bool = False, + ) -> Select: + """Helper function to build the base passage query with all filters applied. + + Returns the query before any limit or count operations are applied. + """ + embedded_text = None + if embed_query: + assert embedding_config is not None, "embedding_config must be specified for vector search" + assert query_text is not None, "query_text must be specified for vector search" + embedded_text = embedding_model(embedding_config).get_text_embedding(query_text) + embedded_text = np.array(embedded_text) + embedded_text = np.pad(embedded_text, (0, MAX_EMBEDDING_DIM - embedded_text.shape[0]), mode="constant").tolist() + + with self.session_maker() as session: + # Start with base query for source passages + source_passages = None + if not agent_only: # Include source passages + if agent_id is not None: + source_passages = ( + select( + SourcePassage, + literal(None).label('agent_id') + ) + .join(SourcesAgents, SourcesAgents.source_id == SourcePassage.source_id) + .where(SourcesAgents.agent_id == agent_id) + .where(SourcePassage.organization_id == actor.organization_id) + ) + else: + source_passages = ( + select( + SourcePassage, + literal(None).label('agent_id') + ) + .where(SourcePassage.organization_id == actor.organization_id) + ) + + if source_id: + source_passages = source_passages.where(SourcePassage.source_id == source_id) + if file_id: + source_passages = source_passages.where(SourcePassage.file_id == file_id) + + # Add agent passages query + agent_passages = None + if agent_id is not None: + agent_passages = ( + select( + AgentPassage.id, + AgentPassage.text, + AgentPassage.embedding_config, + AgentPassage.metadata_, + AgentPassage.embedding, + AgentPassage.created_at, + AgentPassage.updated_at, + AgentPassage.is_deleted, + AgentPassage._created_by_id, + AgentPassage._last_updated_by_id, + AgentPassage.organization_id, + literal(None).label('file_id'), + literal(None).label('source_id'), + AgentPassage.agent_id + ) + .where(AgentPassage.agent_id == agent_id) + .where(AgentPassage.organization_id == actor.organization_id) + ) + + # Combine queries + if source_passages is not None and agent_passages is not None: + combined_query = union_all(source_passages, agent_passages).cte('combined_passages') + elif agent_passages is not None: + combined_query = agent_passages.cte('combined_passages') + elif source_passages is not None: + combined_query = source_passages.cte('combined_passages') + else: + raise ValueError("No passages found") + + # Build main query from combined CTE + main_query = select(combined_query) + + # Apply filters + if start_date: + main_query = main_query.where(combined_query.c.created_at >= start_date) + if end_date: + main_query = main_query.where(combined_query.c.created_at <= end_date) + if source_id: + main_query = main_query.where(combined_query.c.source_id == source_id) + if file_id: + main_query = main_query.where(combined_query.c.file_id == file_id) + + # Vector search + if embedded_text: + if settings.letta_pg_uri_no_default: + # PostgreSQL with pgvector + main_query = main_query.order_by( + combined_query.c.embedding.cosine_distance(embedded_text).asc() + ) + else: + # SQLite with custom vector type + query_embedding_binary = adapt_array(embedded_text) + if ascending: + main_query = main_query.order_by( + func.cosine_distance(combined_query.c.embedding, query_embedding_binary).asc(), + combined_query.c.created_at.asc(), + combined_query.c.id.asc() + ) + else: + main_query = main_query.order_by( + func.cosine_distance(combined_query.c.embedding, query_embedding_binary).asc(), + combined_query.c.created_at.desc(), + combined_query.c.id.asc() + ) + else: + if query_text: + main_query = main_query.where(func.lower(combined_query.c.text).contains(func.lower(query_text))) + + # Handle cursor-based pagination + if cursor: + cursor_query = select(combined_query.c.created_at).where( + combined_query.c.id == cursor + ).scalar_subquery() + + if ascending: + main_query = main_query.where( + combined_query.c.created_at > cursor_query + ) + else: + main_query = main_query.where( + combined_query.c.created_at < cursor_query + ) + + # Add ordering if not already ordered by similarity + if not embed_query: + if ascending: + main_query = main_query.order_by( + combined_query.c.created_at.asc(), + combined_query.c.id.asc(), + ) + else: + main_query = main_query.order_by( + combined_query.c.created_at.desc(), + combined_query.c.id.asc(), + ) + + return main_query + + @enforce_types + def list_passages( + self, + actor: PydanticUser, + agent_id: Optional[str] = None, + file_id: Optional[str] = None, + limit: Optional[int] = 50, + query_text: Optional[str] = None, + start_date: Optional[datetime] = None, + end_date: Optional[datetime] = None, + cursor: Optional[str] = None, + source_id: Optional[str] = None, + embed_query: bool = False, + ascending: bool = True, + embedding_config: Optional[EmbeddingConfig] = None, + agent_only: bool = False + ) -> List[PydanticPassage]: + """Lists all passages attached to an agent.""" + with self.session_maker() as session: + main_query = self._build_passage_query( + actor=actor, + agent_id=agent_id, + file_id=file_id, + query_text=query_text, + start_date=start_date, + end_date=end_date, + cursor=cursor, + source_id=source_id, + embed_query=embed_query, + ascending=ascending, + embedding_config=embedding_config, + agent_only=agent_only, + ) + + # Add limit + if limit: + main_query = main_query.limit(limit) + + # Execute query + results = list(session.execute(main_query)) + + passages = [] + for row in results: + data = dict(row._mapping) + if data['agent_id'] is not None: + # This is an AgentPassage - remove source fields + data.pop('source_id', None) + data.pop('file_id', None) + passage = AgentPassage(**data) + else: + # This is a SourcePassage - remove agent field + data.pop('agent_id', None) + passage = SourcePassage(**data) + passages.append(passage) + + return [p.to_pydantic() for p in passages] + + + @enforce_types + def passage_size( + self, + actor: PydanticUser, + agent_id: Optional[str] = None, + file_id: Optional[str] = None, + query_text: Optional[str] = None, + start_date: Optional[datetime] = None, + end_date: Optional[datetime] = None, + cursor: Optional[str] = None, + source_id: Optional[str] = None, + embed_query: bool = False, + ascending: bool = True, + embedding_config: Optional[EmbeddingConfig] = None, + agent_only: bool = False + ) -> int: + """Returns the count of passages matching the given criteria.""" + with self.session_maker() as session: + main_query = self._build_passage_query( + actor=actor, + agent_id=agent_id, + file_id=file_id, + query_text=query_text, + start_date=start_date, + end_date=end_date, + cursor=cursor, + source_id=source_id, + embed_query=embed_query, + ascending=ascending, + embedding_config=embedding_config, + agent_only=agent_only, + ) + + # Convert to count query + count_query = select(func.count()).select_from(main_query.subquery()) + return session.scalar(count_query) or 0 + # ====================================================================================================================== # Tool Management # ====================================================================================================================== diff --git a/letta/services/passage_manager.py b/letta/services/passage_manager.py index 100a44335b..d8554063b3 100644 --- a/letta/services/passage_manager.py +++ b/letta/services/passage_manager.py @@ -1,12 +1,13 @@ -from datetime import datetime from typing import List, Optional - +from datetime import datetime import numpy as np +from sqlalchemy import select, union_all, literal + from letta.constants import MAX_EMBEDDING_DIM from letta.embeddings import embedding_model, parse_and_chunk_text from letta.orm.errors import NoResultFound -from letta.orm.passage import Passage as PassageModel +from letta.orm.passage import AgentPassage, SourcePassage from letta.schemas.agent import AgentState from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.passage import Passage as PydanticPassage @@ -14,6 +15,7 @@ from letta.utils import enforce_types + class PassageManager: """Manager class to handle business logic related to Passages.""" @@ -26,14 +28,51 @@ def __init__(self): def get_passage_by_id(self, passage_id: str, actor: PydanticUser) -> Optional[PydanticPassage]: """Fetch a passage by ID.""" with self.session_maker() as session: - passage = PassageModel.read(db_session=session, identifier=passage_id, actor=actor) - return passage.to_pydantic() + # Try source passages first + try: + passage = SourcePassage.read(db_session=session, identifier=passage_id, actor=actor) + return passage.to_pydantic() + except NoResultFound: + # Try archival passages + try: + passage = AgentPassage.read(db_session=session, identifier=passage_id, actor=actor) + return passage.to_pydantic() + except NoResultFound: + raise NoResultFound(f"Passage with id {passage_id} not found in database.") @enforce_types def create_passage(self, pydantic_passage: PydanticPassage, actor: PydanticUser) -> PydanticPassage: - """Create a new passage.""" + """Create a new passage in the appropriate table based on whether it has agent_id or source_id.""" + # Common fields for both passage types + data = pydantic_passage.model_dump() + common_fields = { + "id": data.get("id"), + "text": data["text"], + "embedding": data["embedding"], + "embedding_config": data["embedding_config"], + "organization_id": data["organization_id"], + "metadata_": data.get("metadata_", {}), + "is_deleted": data.get("is_deleted", False), + "created_at": data.get("created_at", datetime.utcnow()), + } + + if "agent_id" in data and data["agent_id"]: + assert not data.get("source_id"), "Passage cannot have both agent_id and source_id" + agent_fields = { + "agent_id": data["agent_id"], + } + passage = AgentPassage(**common_fields, **agent_fields) + elif "source_id" in data and data["source_id"]: + assert not data.get("agent_id"), "Passage cannot have both agent_id and source_id" + source_fields = { + "source_id": data["source_id"], + "file_id": data.get("file_id"), + } + passage = SourcePassage(**common_fields, **source_fields) + else: + raise ValueError("Passage must have either agent_id or source_id") + with self.session_maker() as session: - passage = PassageModel(**pydantic_passage.model_dump()) passage.create(session, actor=actor) return passage.to_pydantic() @@ -93,14 +132,23 @@ def update_passage_by_id(self, passage_id: str, passage: PydanticPassage, actor: raise ValueError("Passage ID must be provided.") with self.session_maker() as session: - # Fetch existing message from database - curr_passage = PassageModel.read( - db_session=session, - identifier=passage_id, - actor=actor, - ) - if not curr_passage: - raise ValueError(f"Passage with id {passage_id} does not exist.") + # Try source passages first + try: + curr_passage = SourcePassage.read( + db_session=session, + identifier=passage_id, + actor=actor, + ) + except NoResultFound: + # Try agent passages + try: + curr_passage = AgentPassage.read( + db_session=session, + identifier=passage_id, + actor=actor, + ) + except NoResultFound: + raise ValueError(f"Passage with id {passage_id} does not exist.") # Update the database record with values from the provided record update_data = passage.model_dump(exclude_unset=True, exclude_none=True) @@ -113,104 +161,32 @@ def update_passage_by_id(self, passage_id: str, passage: PydanticPassage, actor: @enforce_types def delete_passage_by_id(self, passage_id: str, actor: PydanticUser) -> bool: - """Delete a passage.""" + """Delete a passage from either source or archival passages.""" if not passage_id: raise ValueError("Passage ID must be provided.") with self.session_maker() as session: + # Try source passages first try: - passage = PassageModel.read(db_session=session, identifier=passage_id, actor=actor) + passage = SourcePassage.read(db_session=session, identifier=passage_id, actor=actor) passage.hard_delete(session, actor=actor) + return True except NoResultFound: - raise ValueError(f"Passage with id {passage_id} not found.") - - @enforce_types - def list_passages( - self, - actor: PydanticUser, - agent_id: Optional[str] = None, - file_id: Optional[str] = None, - cursor: Optional[str] = None, - limit: Optional[int] = 50, - query_text: Optional[str] = None, - start_date: Optional[datetime] = None, - end_date: Optional[datetime] = None, - ascending: bool = True, - source_id: Optional[str] = None, - embed_query: bool = False, - embedding_config: Optional[EmbeddingConfig] = None, - ) -> List[PydanticPassage]: - """List passages with pagination.""" - with self.session_maker() as session: - filters = {"organization_id": actor.organization_id} - if agent_id: - filters["agent_id"] = agent_id - if file_id: - filters["file_id"] = file_id - if source_id: - filters["source_id"] = source_id - - embedded_text = None - if embed_query: - assert embedding_config is not None - - # Embed the text - embedded_text = embedding_model(embedding_config).get_text_embedding(query_text) - - # Pad the embedding with zeros - embedded_text = np.array(embedded_text) - embedded_text = np.pad(embedded_text, (0, MAX_EMBEDDING_DIM - embedded_text.shape[0]), mode="constant").tolist() - - results = PassageModel.list( - db_session=session, - cursor=cursor, - start_date=start_date, - end_date=end_date, - limit=limit, - ascending=ascending, - query_text=query_text if not embedded_text else None, - query_embedding=embedded_text, - **filters, - ) - return [p.to_pydantic() for p in results] - - @enforce_types - def size(self, actor: PydanticUser, agent_id: Optional[str] = None, **kwargs) -> int: - """Get the total count of messages with optional filters. - - Args: - actor : The user requesting the count - agent_id: The agent ID - """ - with self.session_maker() as session: - return PassageModel.size(db_session=session, actor=actor, agent_id=agent_id, **kwargs) + # Try archival passages + try: + passage = AgentPassage.read(db_session=session, identifier=passage_id, actor=actor) + passage.hard_delete(session, actor=actor) + return True + except NoResultFound: + raise NoResultFound(f"Passage with id {passage_id} not found.") def delete_passages( self, actor: PydanticUser, - agent_id: Optional[str] = None, - file_id: Optional[str] = None, - start_date: Optional[datetime] = None, - end_date: Optional[datetime] = None, - limit: Optional[int] = 50, - cursor: Optional[str] = None, - query_text: Optional[str] = None, - source_id: Optional[str] = None, + passages: List[PydanticPassage], ) -> bool: - - passages = self.list_passages( - actor=actor, - agent_id=agent_id, - file_id=file_id, - cursor=cursor, - limit=limit, - start_date=start_date, - end_date=end_date, - query_text=query_text, - source_id=source_id, - ) - # TODO: This is very inefficient # TODO: We should have a base `delete_all_matching_filters`-esque function for passage in passages: self.delete_passage_by_id(passage_id=passage.id, actor=actor) + return True diff --git a/tests/test_client_legacy.py b/tests/test_client_legacy.py index 3839611bbe..e0b51255a0 100644 --- a/tests/test_client_legacy.py +++ b/tests/test_client_legacy.py @@ -482,7 +482,6 @@ def test_sources(client: Union[LocalClient, RESTClient], agent: AgentState): # check agent archival memory size archival_memories = client.get_archival_memory(agent_id=agent.id) - print(archival_memories) assert len(archival_memories) == 0 # load a file into a source (non-blocking job) diff --git a/tests/test_managers.py b/tests/test_managers.py index 3df4e8b524..dc5f15ad1b 100644 --- a/tests/test_managers.py +++ b/tests/test_managers.py @@ -2,6 +2,8 @@ import time from datetime import datetime, timedelta +from httpx._transports import default +from numpy import source import pytest from sqlalchemy import delete from sqlalchemy.exc import IntegrityError @@ -17,7 +19,8 @@ Job, Message, Organization, - Passage, + AgentPassage, + SourcePassage, SandboxConfig, SandboxEnvironmentVariable, Source, @@ -82,7 +85,8 @@ def clear_tables(server: SyncServer): """Fixture to clear the organization table before each test.""" with server.organization_manager.session_maker() as session: session.execute(delete(Message)) - session.execute(delete(Passage)) + session.execute(delete(AgentPassage)) + session.execute(delete(SourcePassage)) session.execute(delete(Job)) session.execute(delete(ToolsAgents)) # Clear ToolsAgents first session.execute(delete(BlocksAgents)) @@ -189,39 +193,79 @@ def print_tool(message: str): @pytest.fixture -def hello_world_passage_fixture(server: SyncServer, default_user, default_file, sarah_agent): - """Fixture to create a tool with default settings and clean up after the test.""" - # Set up passage - dummy_embedding = [0.0] * 2 - message = PydanticPassage( - organization_id=default_user.organization_id, - agent_id=sarah_agent.id, - file_id=default_file.id, - text="Hello, world!", - embedding=dummy_embedding, - embedding_config=DEFAULT_EMBEDDING_CONFIG, +def agent_passage_fixture(server: SyncServer, default_user, sarah_agent): + """Fixture to create an agent passage.""" + passage = server.passage_manager.create_passage( + PydanticPassage( + text="Hello, I am an agent passage", + agent_id=sarah_agent.id, + organization_id=default_user.organization_id, + embedding=[0.1], + embedding_config=DEFAULT_EMBEDDING_CONFIG, + metadata_={"type": "test"} + ), + actor=default_user ) - - msg = server.passage_manager.create_passage(message, actor=default_user) - yield msg + yield passage @pytest.fixture -def create_test_passages(server: SyncServer, default_file, default_user, sarah_agent) -> list[PydanticPassage]: - """Helper function to create test passages for all tests""" - dummy_embedding = [0] * 2 - passages = [ +def source_passage_fixture(server: SyncServer, default_user, default_file, default_source): + """Fixture to create a source passage.""" + passage = server.passage_manager.create_passage( PydanticPassage( - organization_id=default_user.organization_id, - agent_id=sarah_agent.id, + text="Hello, I am a source passage", + source_id=default_source.id, file_id=default_file.id, - text=f"Test passage {i}", - embedding=dummy_embedding, + organization_id=default_user.organization_id, + embedding=[0.1], embedding_config=DEFAULT_EMBEDDING_CONFIG, + metadata_={"type": "test"} + ), + actor=default_user + ) + yield passage + + +@pytest.fixture +def create_test_passages(server: SyncServer, default_file, default_user, sarah_agent, default_source): + """Helper function to create test passages for all tests.""" + # Create agent passages + passages = [] + for i in range(5): + passage = server.passage_manager.create_passage( + PydanticPassage( + text=f"Agent passage {i}", + agent_id=sarah_agent.id, + organization_id=default_user.organization_id, + embedding=[0.1], + embedding_config=DEFAULT_EMBEDDING_CONFIG, + metadata_={"type": "test"} + ), + actor=default_user ) - for i in range(4) - ] - server.passage_manager.create_many_passages(passages, actor=default_user) + passages.append(passage) + if USING_SQLITE: + time.sleep(CREATE_DELAY_SQLITE) + + # Create source passages + for i in range(5): + passage = server.passage_manager.create_passage( + PydanticPassage( + text=f"Source passage {i}", + source_id=default_source.id, + file_id=default_file.id, + organization_id=default_user.organization_id, + embedding=[0.1], + embedding_config=DEFAULT_EMBEDDING_CONFIG, + metadata_={"type": "test"} + ), + actor=default_user + ) + passages.append(passage) + if USING_SQLITE: + time.sleep(CREATE_DELAY_SQLITE) + return passages @@ -389,6 +433,49 @@ def server(): return server +@pytest.fixture +def agent_passages_setup(server, default_source, default_user, sarah_agent): + """Setup fixture for agent passages tests""" + agent_id = sarah_agent.id + actor = default_user + + server.agent_manager.attach_source(agent_id=agent_id, source_id=default_source.id, actor=actor) + + # Create some source passages + source_passages = [] + for i in range(3): + passage = server.passage_manager.create_passage( + PydanticPassage( + organization_id=actor.organization_id, + source_id=default_source.id, + text=f"Source passage {i}", + embedding=[0.1], # Default OpenAI embedding size + embedding_config=DEFAULT_EMBEDDING_CONFIG, + ), + actor=actor + ) + source_passages.append(passage) + + # Create some agent passages + agent_passages = [] + for i in range(2): + passage = server.passage_manager.create_passage( + PydanticPassage( + organization_id=actor.organization_id, + agent_id=agent_id, + text=f"Agent passage {i}", + embedding=[0.1], # Default OpenAI embedding size + embedding_config=DEFAULT_EMBEDDING_CONFIG, + ), + actor=actor + ) + agent_passages.append(passage) + + yield agent_passages, source_passages + + # Cleanup + server.source_manager.delete_source(default_source.id, actor=actor) + # ====================================================================================================================== # AgentManager Tests - Basic # ====================================================================================================================== @@ -849,6 +936,199 @@ def test_get_block_with_label(server: SyncServer, sarah_agent, default_block, de assert block.label == default_block.label +# ====================================================================================================================== +# Agent Manager - Passages Tests +# ====================================================================================================================== + +def test_agent_list_passages_basic(server, default_user, sarah_agent, agent_passages_setup): + """Test basic listing functionality of agent passages""" + + all_passages = server.agent_manager.list_passages(actor=default_user, agent_id=sarah_agent.id) + assert len(all_passages) == 5 # 3 source + 2 agent passages + + +def test_agent_list_passages_ordering(server, default_user, sarah_agent, agent_passages_setup): + """Test ordering of agent passages""" + + # Test ascending order + asc_passages = server.agent_manager.list_passages(actor=default_user, agent_id=sarah_agent.id, ascending=True) + assert len(asc_passages) == 5 + for i in range(1, len(asc_passages)): + assert asc_passages[i-1].created_at <= asc_passages[i].created_at + + # Test descending order + desc_passages = server.agent_manager.list_passages(actor=default_user, agent_id=sarah_agent.id, ascending=False) + assert len(desc_passages) == 5 + for i in range(1, len(desc_passages)): + assert desc_passages[i-1].created_at >= desc_passages[i].created_at + + +def test_agent_list_passages_pagination(server, default_user, sarah_agent, agent_passages_setup): + """Test pagination of agent passages""" + + # Test limit + limited_passages = server.agent_manager.list_passages(actor=default_user, agent_id=sarah_agent.id, limit=3) + assert len(limited_passages) == 3 + + # Test cursor-based pagination + first_page = server.agent_manager.list_passages(actor=default_user, agent_id=sarah_agent.id, limit=2, ascending=True) + assert len(first_page) == 2 + + second_page = server.agent_manager.list_passages( + actor=default_user, + agent_id=sarah_agent.id, + cursor=first_page[-1].id, + limit=2, + ascending=True + ) + assert len(second_page) == 2 + assert first_page[-1].id != second_page[0].id + assert first_page[-1].created_at <= second_page[0].created_at + + +def test_agent_list_passages_text_search(server, default_user, sarah_agent, agent_passages_setup): + """Test text search functionality of agent passages""" + + # Test text search for source passages + source_text_passages = server.agent_manager.list_passages( + actor=default_user, + agent_id=sarah_agent.id, + query_text="Source passage" + ) + assert len(source_text_passages) == 3 + + # Test text search for agent passages + agent_text_passages = server.agent_manager.list_passages( + actor=default_user, + agent_id=sarah_agent.id, + query_text="Agent passage" + ) + assert len(agent_text_passages) == 2 + + +def test_agent_list_passages_agent_only(server, default_user, sarah_agent, agent_passages_setup): + """Test text search functionality of agent passages""" + + # Test text search for agent passages + agent_text_passages = server.agent_manager.list_passages( + actor=default_user, + agent_id=sarah_agent.id, + agent_only=True + ) + assert len(agent_text_passages) == 2 + + +def test_agent_list_passages_filtering(server, default_user, sarah_agent, default_source, agent_passages_setup): + """Test filtering functionality of agent passages""" + + # Test source filtering + source_filtered = server.agent_manager.list_passages( + actor=default_user, + agent_id=sarah_agent.id, + source_id=default_source.id + ) + assert len(source_filtered) == 3 + + # Test date filtering + now = datetime.utcnow() + future_date = now + timedelta(days=1) + past_date = now - timedelta(days=1) + + date_filtered = server.agent_manager.list_passages( + actor=default_user, + agent_id=sarah_agent.id, + start_date=past_date, + end_date=future_date + ) + assert len(date_filtered) == 5 + + +def test_agent_list_passages_vector_search(server, default_user, sarah_agent, default_source): + """Test vector search functionality of agent passages""" + embed_model = embedding_model(DEFAULT_EMBEDDING_CONFIG) + + # Create passages with known embeddings + passages = [] + + # Create passages with different embeddings + test_passages = [ + "I like red", + "random text", + "blue shoes", + ] + + server.agent_manager.attach_source(agent_id=sarah_agent.id, source_id=default_source.id, actor=default_user) + + for i, text in enumerate(test_passages): + embedding = embed_model.get_text_embedding(text) + if i % 2 == 0: + passage = PydanticPassage( + text=text, + organization_id=default_user.organization_id, + agent_id=sarah_agent.id, + embedding_config=DEFAULT_EMBEDDING_CONFIG, + embedding=embedding + ) + else: + passage = PydanticPassage( + text=text, + organization_id=default_user.organization_id, + source_id=default_source.id, + embedding_config=DEFAULT_EMBEDDING_CONFIG, + embedding=embedding + ) + created_passage = server.passage_manager.create_passage(passage, default_user) + passages.append(created_passage) + + # Query vector similar to "red" embedding + query_key = "What's my favorite color?" + + # Test vector search with all passages + results = server.agent_manager.list_passages( + actor=default_user, + agent_id=sarah_agent.id, + query_text=query_key, + embedding_config=DEFAULT_EMBEDDING_CONFIG, + embed_query=True, + ) + + # Verify results are ordered by similarity + assert len(results) == 3 + assert results[0].text == "I like red" + assert "random" in results[1].text or "random" in results[2].text + assert "blue" in results[1].text or "blue" in results[2].text + + # Test vector search with agent_only=True + agent_only_results = server.agent_manager.list_passages( + actor=default_user, + agent_id=sarah_agent.id, + query_text=query_key, + embedding_config=DEFAULT_EMBEDDING_CONFIG, + embed_query=True, + agent_only=True + ) + + # Verify agent-only results + assert len(agent_only_results) == 2 + assert agent_only_results[0].text == "I like red" + assert agent_only_results[1].text == "blue shoes" + + +def test_list_source_passages_only(server: SyncServer, default_user, default_source, agent_passages_setup): + """Test listing passages from a source without specifying an agent.""" + + # List passages by source_id without agent_id + source_passages = server.agent_manager.list_passages( + actor=default_user, + source_id=default_source.id, + ) + + # Verify we get only source passages (3 from agent_passages_setup) + assert len(source_passages) == 3 + assert all(p.source_id == default_source.id for p in source_passages) + assert all(p.agent_id is None for p in source_passages) + + # ====================================================================================================================== # Organization Manager Tests # ====================================================================================================================== @@ -900,266 +1180,86 @@ def test_list_organizations_pagination(server: SyncServer): # Passage Manager Tests # ====================================================================================================================== - -def test_passage_create(server: SyncServer, hello_world_passage_fixture, default_user): - """Test creating a passage using hello_world_passage_fixture fixture""" - assert hello_world_passage_fixture.id is not None - assert hello_world_passage_fixture.text == "Hello, world!" +def test_passage_create_agentic(server: SyncServer, agent_passage_fixture, default_user): + """Test creating a passage using agent_passage_fixture fixture""" + assert agent_passage_fixture.id is not None + assert agent_passage_fixture.text == "Hello, I am an agent passage" # Verify we can retrieve it retrieved = server.passage_manager.get_passage_by_id( - hello_world_passage_fixture.id, + agent_passage_fixture.id, actor=default_user, ) assert retrieved is not None - assert retrieved.id == hello_world_passage_fixture.id - assert retrieved.text == hello_world_passage_fixture.text - - -def test_passage_get_by_id(server: SyncServer, hello_world_passage_fixture, default_user): - """Test retrieving a passage by ID""" - retrieved = server.passage_manager.get_passage_by_id(hello_world_passage_fixture.id, actor=default_user) - assert retrieved is not None - assert retrieved.id == hello_world_passage_fixture.id - assert retrieved.text == hello_world_passage_fixture.text - - -def test_passage_update(server: SyncServer, hello_world_passage_fixture, default_user): - """Test updating a passage""" - new_text = "Updated text" - hello_world_passage_fixture.text = new_text - updated = server.passage_manager.update_passage_by_id(hello_world_passage_fixture.id, hello_world_passage_fixture, actor=default_user) - assert updated is not None - assert updated.text == new_text - retrieved = server.passage_manager.get_passage_by_id(hello_world_passage_fixture.id, actor=default_user) - assert retrieved.text == new_text - - -def test_passage_delete(server: SyncServer, hello_world_passage_fixture, default_user): - """Test deleting a passage""" - server.passage_manager.delete_passage_by_id(hello_world_passage_fixture.id, actor=default_user) - with pytest.raises(NoResultFound): - server.passage_manager.get_passage_by_id(hello_world_passage_fixture.id, actor=default_user) - - -def test_passage_size(server: SyncServer, hello_world_passage_fixture, create_test_passages, default_user): - """Test counting passages with filters""" - base_passage = hello_world_passage_fixture - - # Test total count - total = server.passage_manager.size(actor=default_user) - assert total == 5 # base passage + 4 test passages - # TODO: change login passage to be a system not user passage - - # Test count with agent filter - agent_count = server.passage_manager.size(actor=default_user, agent_id=base_passage.agent_id) - assert agent_count == 5 - - # Test count with role filter - role_count = server.passage_manager.size(actor=default_user) - assert role_count == 5 - - # Test count with non-existent filter - empty_count = server.passage_manager.size(actor=default_user, agent_id="non-existent") - assert empty_count == 0 - - -def test_passage_listing_basic(server: SyncServer, hello_world_passage_fixture, create_test_passages, default_user): - """Test basic passage listing with limit""" - results = server.passage_manager.list_passages(actor=default_user, limit=3) - assert len(results) == 3 - + assert retrieved.id == agent_passage_fixture.id + assert retrieved.text == agent_passage_fixture.text -def test_passage_listing_cursor(server: SyncServer, hello_world_passage_fixture, create_test_passages, default_user): - """Test cursor-based pagination functionality""" - - # Make sure there are 5 passages - assert server.passage_manager.size(actor=default_user) == 5 - - # Get first page - first_page = server.passage_manager.list_passages(actor=default_user, limit=3) - assert len(first_page) == 3 - last_id_on_first_page = first_page[-1].id +def test_passage_create_source(server: SyncServer, source_passage_fixture, default_user): + """Test creating a source passage.""" + assert source_passage_fixture is not None + assert source_passage_fixture.text == "Hello, I am a source passage" - # Get second page - second_page = server.passage_manager.list_passages(actor=default_user, cursor=last_id_on_first_page, limit=3) - assert len(second_page) == 2 # Should have 2 remaining passages - assert all(r1.id != r2.id for r1 in first_page for r2 in second_page) - - -def test_passage_listing_filtering(server: SyncServer, hello_world_passage_fixture, create_test_passages, default_user, sarah_agent): - """Test filtering passages by agent ID""" - agent_results = server.passage_manager.list_passages(agent_id=sarah_agent.id, actor=default_user, limit=10) - assert len(agent_results) == 5 # base passage + 4 test passages - assert all(msg.agent_id == hello_world_passage_fixture.agent_id for msg in agent_results) - - -def test_passage_listing_text_search(server: SyncServer, hello_world_passage_fixture, create_test_passages, default_user, sarah_agent): - """Test searching passages by text content""" - search_results = server.passage_manager.list_passages(agent_id=sarah_agent.id, actor=default_user, query_text="Test passage", limit=10) - assert len(search_results) == 4 - assert all("Test passage" in msg.text for msg in search_results) - - # Test no results - search_results = server.passage_manager.list_passages(agent_id=sarah_agent.id, actor=default_user, query_text="Letta", limit=10) - assert len(search_results) == 0 - - -def test_passage_listing_date_range_filtering(server: SyncServer, hello_world_passage_fixture, default_user, default_file, sarah_agent): - """Test filtering passages by date range with various scenarios""" - # Set up test data with known dates - base_time = datetime.utcnow() - - # Create passages at different times - passages = [] - time_offsets = [ - timedelta(days=-2), # 2 days ago - timedelta(days=-1), # Yesterday - timedelta(hours=-2), # 2 hours ago - timedelta(minutes=-30), # 30 minutes ago - timedelta(minutes=-1), # 1 minute ago - timedelta(minutes=0), # Now - ] - - for i, offset in enumerate(time_offsets): - timestamp = base_time + offset - passage = server.passage_manager.create_passage( + # Verify we can retrieve it + retrieved = server.passage_manager.get_passage_by_id( + source_passage_fixture.id, + actor=default_user, + ) + assert retrieved is not None + assert retrieved.id == source_passage_fixture.id + assert retrieved.text == source_passage_fixture.text + + +def test_passage_create_invalid(server: SyncServer, agent_passage_fixture, default_user): + """Test creating an agent passage.""" + assert agent_passage_fixture is not None + assert agent_passage_fixture.text == "Hello, I am an agent passage" + + # Try to create an invalid passage (with both agent_id and source_id) + with pytest.raises(AssertionError): + server.passage_manager.create_passage( PydanticPassage( + text="Invalid passage", + agent_id="123", + source_id="456", organization_id=default_user.organization_id, - agent_id=sarah_agent.id, - file_id=default_file.id, - text=f"Test passage {i}", - embedding=[0.1, 0.2, 0.3], + embedding=[0.1] * 1024, embedding_config=DEFAULT_EMBEDDING_CONFIG, - created_at=timestamp, ), - actor=default_user, - ) - passages.append(passage) - - # Test cases - test_cases = [ - { - "name": "Recent passages (last hour)", - "start_date": base_time - timedelta(hours=1), - "end_date": base_time + timedelta(minutes=1), - "expected_count": 1 + 3, # Should include base + -30min, -1min, and now - }, - { - "name": "Yesterday's passages", - "start_date": base_time - timedelta(days=1, hours=12), - "end_date": base_time - timedelta(hours=12), - "expected_count": 1, # Should only include yesterday's passage - }, - { - "name": "Future time range", - "start_date": base_time + timedelta(days=1), - "end_date": base_time + timedelta(days=2), - "expected_count": 0, # Should find no passages - }, - { - "name": "All time", - "start_date": base_time - timedelta(days=3), - "end_date": base_time + timedelta(days=1), - "expected_count": 1 + len(passages), # Should find all passages - }, - { - "name": "Exact timestamp match", - "start_date": passages[0].created_at - timedelta(microseconds=1), - "end_date": passages[0].created_at + timedelta(microseconds=1), - "expected_count": 1, # Should find exactly one passage - }, - { - "name": "Small time window", - "start_date": base_time - timedelta(seconds=30), - "end_date": base_time + timedelta(seconds=30), - "expected_count": 1 + 1, # date + "now" - }, - ] - - # Run test cases - for case in test_cases: - results = server.passage_manager.list_passages( - agent_id=sarah_agent.id, actor=default_user, start_date=case["start_date"], end_date=case["end_date"], limit=10 + actor=default_user ) - # Verify count - assert ( - len(results) == case["expected_count"] - ), f"Test case '{case['name']}' failed: expected {case['expected_count']} passages, got {len(results)}" - # Test edge cases - - # Test with start_date but no end_date - results_start_only = server.passage_manager.list_passages( - agent_id=sarah_agent.id, actor=default_user, start_date=base_time - timedelta(minutes=2), end_date=None, limit=10 - ) - assert len(results_start_only) >= 2, "Should find passages after start_date" - - # Test with end_date but no start_date - results_end_only = server.passage_manager.list_passages( - agent_id=sarah_agent.id, actor=default_user, start_date=None, end_date=base_time - timedelta(days=1), limit=10 - ) - assert len(results_end_only) >= 1, "Should find passages before end_date" - - # Test limit enforcement - limited_results = server.passage_manager.list_passages( - agent_id=sarah_agent.id, - actor=default_user, - start_date=base_time - timedelta(days=3), - end_date=base_time + timedelta(days=1), - limit=3, - ) - assert len(limited_results) <= 3, "Should respect the limit parameter" - - -def test_passage_vector_search(server: SyncServer, default_user, default_file, sarah_agent): - """Test vector search functionality for passages.""" - passage_manager = server.passage_manager - embed_model = embedding_model(DEFAULT_EMBEDDING_CONFIG) - - # Create passages with known embeddings - passages = [] - - # Create passages with different embeddings - test_passages = [ - "I like red", - "random text", - "blue shoes", - ] - - for text in test_passages: - embedding = embed_model.get_text_embedding(text) - passage = PydanticPassage( - text=text, - organization_id=default_user.organization_id, - agent_id=sarah_agent.id, - embedding_config=DEFAULT_EMBEDDING_CONFIG, - embedding=embedding, - ) - created_passage = passage_manager.create_passage(passage, default_user) - passages.append(created_passage) - assert passage_manager.size(actor=default_user) == len(passages) - - # Query vector similar to "cats" embedding - query_key = "What's my favorite color?" - - # List passages with vector search - results = passage_manager.list_passages( - actor=default_user, - agent_id=sarah_agent.id, - query_text=query_key, - limit=3, - embedding_config=DEFAULT_EMBEDDING_CONFIG, - embed_query=True, - ) +def test_passage_get_by_id(server: SyncServer, agent_passage_fixture, source_passage_fixture, default_user): + """Test retrieving a passage by ID""" + retrieved = server.passage_manager.get_passage_by_id(agent_passage_fixture.id, actor=default_user) + assert retrieved is not None + assert retrieved.id == agent_passage_fixture.id + assert retrieved.text == agent_passage_fixture.text - # Verify results are ordered by similarity - assert len(results) == 3 - assert results[0].text == "I like red" - assert results[1].text == "random text" # For some reason the embedding model doesn't like "blue shoes" - assert results[2].text == "blue shoes" + retrieved = server.passage_manager.get_passage_by_id(source_passage_fixture.id, actor=default_user) + assert retrieved is not None + assert retrieved.id == source_passage_fixture.id + assert retrieved.text == source_passage_fixture.text + + +def test_passage_cascade_deletion(server: SyncServer, agent_passage_fixture, source_passage_fixture, default_user, default_source, sarah_agent): + """Test that passages are deleted when their parent (agent or source) is deleted.""" + # Verify passages exist + agent_passage = server.passage_manager.get_passage_by_id(agent_passage_fixture.id, default_user) + source_passage = server.passage_manager.get_passage_by_id(source_passage_fixture.id, default_user) + assert agent_passage is not None + assert source_passage is not None + + # Delete agent and verify its passages are deleted + server.agent_manager.delete_agent(sarah_agent.id, default_user) + agentic_passages = server.agent_manager.list_passages(actor=default_user, agent_id=sarah_agent.id, agent_only=True) + assert len(agentic_passages) == 0 + + # Delete source and verify its passages are deleted + server.source_manager.delete_source(default_source.id, default_user) + with pytest.raises(NoResultFound): + server.passage_manager.get_passage_by_id(source_passage_fixture.id, default_user) # ====================================================================================================================== @@ -1220,6 +1320,7 @@ def test_create_tool(server: SyncServer, print_tool, default_user, default_organ assert print_tool.organization_id == default_organization.id + @pytest.mark.skipif(USING_SQLITE, reason="Test not applicable when using SQLite.") def test_create_tool_duplicate_name(server: SyncServer, print_tool, default_user, default_organization): data = print_tool.model_dump(exclude=["id"]) @@ -1787,6 +1888,7 @@ def test_update_source_no_changes(server: SyncServer, default_user): # ====================================================================================================================== # Source Manager Tests - Files # ====================================================================================================================== + def test_get_file_by_id(server: SyncServer, default_user, default_source): """Test retrieving a file by ID.""" file_metadata = PydanticFileMetadata( @@ -1857,6 +1959,7 @@ def test_delete_file(server: SyncServer, default_user, default_source): # ====================================================================================================================== # SandboxConfigManager Tests - Sandbox Configs # ====================================================================================================================== + def test_create_or_update_sandbox_config(server: SyncServer, default_user): sandbox_config_create = SandboxConfigCreate( config=E2BSandboxConfig(), @@ -1935,6 +2038,7 @@ def test_list_sandbox_configs(server: SyncServer, default_user): # ====================================================================================================================== # SandboxConfigManager Tests - Environment Variables # ====================================================================================================================== + def test_create_sandbox_env_var(server: SyncServer, sandbox_config_fixture, default_user): env_var_create = SandboxEnvironmentVariableCreate(key="TEST_VAR", value="test_value", description="A test environment variable.") created_env_var = server.sandbox_config_manager.create_sandbox_env_var( @@ -2007,7 +2111,6 @@ def test_get_sandbox_env_var_by_key(server: SyncServer, sandbox_env_var_fixture, # JobManager Tests # ====================================================================================================================== - def test_create_job(server: SyncServer, default_user): """Test creating a job.""" job_data = PydanticJob( diff --git a/tests/test_server.py b/tests/test_server.py index 09dfb94cd2..0718e6ce9d 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -390,12 +390,16 @@ def test_user_message_memory(server, user_id, agent_id): @pytest.mark.order(3) def test_load_data(server, user_id, agent_id): + user = server.user_manager.get_user_or_default(user_id=user_id) + # create source - passages_before = server.get_agent_archival(user_id=user_id, agent_id=agent_id, cursor=None, limit=10000) + passages_before = server.agent_manager.list_passages( + actor=user, agent_id=agent_id, cursor=None, limit=10000 + ) assert len(passages_before) == 0 source = server.source_manager.create_source( - PydanticSource(name="test_source", embedding_config=EmbeddingConfig.default_config(provider="openai")), actor=server.default_user + PydanticSource(name="test_source", embedding_config=EmbeddingConfig.default_config(provider="openai")), actor=user ) # load data @@ -409,15 +413,11 @@ def test_load_data(server, user_id, agent_id): connector = DummyDataConnector(archival_memories) server.load_data(user_id, connector, source.name) - # @pytest.mark.order(3) - # def test_attach_source_to_agent(server, user_id, agent_id): - # check archival memory size - # attach source server.attach_source_to_agent(user_id=user_id, agent_id=agent_id, source_name="test_source") # check archival memory size - passages_after = server.get_agent_archival(user_id=user_id, agent_id=agent_id, cursor=None, limit=10000) + passages_after = server.agent_manager.list_passages(actor=user, agent_id=agent_id, cursor=None, limit=10000) assert len(passages_after) == 5 @@ -465,7 +465,7 @@ def test_get_archival_memory(server, user_id, agent_id): user = server.user_manager.get_user_by_id(user_id=user_id) # List latest 2 passages - passages_1 = server.passage_manager.list_passages( + passages_1 = server.agent_manager.list_passages( actor=user, agent_id=agent_id, ascending=False, @@ -475,7 +475,7 @@ def test_get_archival_memory(server, user_id, agent_id): # List next 3 passages (earliest 3) cursor1 = passages_1[-1].id - passages_2 = server.passage_manager.list_passages( + passages_2 = server.agent_manager.list_passages( actor=user, agent_id=agent_id, ascending=False, @@ -484,24 +484,28 @@ def test_get_archival_memory(server, user_id, agent_id): # List all 5 cursor2 = passages_1[0].created_at - passages_3 = server.passage_manager.list_passages( + passages_3 = server.agent_manager.list_passages( actor=user, agent_id=agent_id, ascending=False, end_date=cursor2, limit=1000, ) - # assert passages_1[0].text == "Cinderella wore a blue dress" assert len(passages_2) in [3, 4] # NOTE: exact size seems non-deterministic, so loosen test assert len(passages_3) in [4, 5] # NOTE: exact size seems non-deterministic, so loosen test + latest = passages_1[0] + earliest = passages_2[-1] + # test archival memory - passage_1 = server.get_agent_archival(user_id=user_id, agent_id=agent_id, limit=1) + passage_1 = server.agent_manager.list_passages(actor=user, agent_id=agent_id, limit=1, ascending=True) assert len(passage_1) == 1 - passage_2 = server.get_agent_archival(user_id=user_id, agent_id=agent_id, cursor=passage_1[-1].id, limit=1000) + assert passage_1[0].text == "alpha" + passage_2 = server.agent_manager.list_passages(actor=user, agent_id=agent_id, cursor=earliest.id, limit=1000, ascending=True) assert len(passage_2) in [4, 5] # NOTE: exact size seems non-deterministic, so loosen test + assert all("alpha" not in passage.text for passage in passage_2) # test safe empty return - passage_none = server.get_agent_archival(user_id=user_id, agent_id=agent_id, cursor=passages_1[0].id, limit=1000) + passage_none = server.agent_manager.list_passages(actor=user, agent_id=agent_id, cursor=latest.id, limit=1000, ascending=True) assert len(passage_none) == 0 @@ -955,6 +959,14 @@ def count_system_messages_in_recall() -> Tuple[int, List[LettaMessage]]: def test_load_file_to_source(server: SyncServer, user_id: str, agent_id: str, other_agent_id: str, tmp_path): actor = server.user_manager.get_user_or_default(user_id) + existing_sources = server.source_manager.list_sources(actor=actor) + if len(existing_sources) > 0: + for source in existing_sources: + server.agent_manager.detach_source(agent_id=agent_id, source_id=source.id, actor=actor) + initial_passage_count = server.agent_manager.passage_size(agent_id=agent_id, actor=actor) + assert initial_passage_count == 0 + + # Create a source source = server.source_manager.create_source( PydanticSource( @@ -973,10 +985,6 @@ def test_load_file_to_source(server: SyncServer, user_id: str, agent_id: str, ot # Attach source to agent first server.agent_manager.attach_source(agent_id=agent_id, source_id=source.id, actor=actor) - # Get initial passage count - initial_passage_count = server.passage_manager.size(actor=actor, agent_id=agent_id, source_id=source.id) - assert initial_passage_count == 0 - # Create a job for loading the first file job = server.job_manager.create_job( PydanticJob( @@ -1001,7 +1009,7 @@ def test_load_file_to_source(server: SyncServer, user_id: str, agent_id: str, ot assert job.metadata_["num_documents"] == 1 # Verify passages were added - first_file_passage_count = server.passage_manager.size(actor=actor, agent_id=agent_id, source_id=source.id) + first_file_passage_count = server.agent_manager.passage_size(agent_id=agent_id, actor=actor) assert first_file_passage_count > initial_passage_count # Create a second test file with different content @@ -1032,14 +1040,13 @@ def test_load_file_to_source(server: SyncServer, user_id: str, agent_id: str, ot assert job2.metadata_["num_documents"] == 1 # Verify passages were appended (not replaced) - final_passage_count = server.passage_manager.size(actor=actor, agent_id=agent_id, source_id=source.id) + final_passage_count = server.agent_manager.passage_size(agent_id=agent_id, actor=actor) assert final_passage_count > first_file_passage_count # Verify both old and new content is searchable - passages = server.passage_manager.list_passages( - actor=actor, + passages = server.agent_manager.list_passages( agent_id=agent_id, - source_id=source.id, + actor=actor, query_text="what does Timber like to eat", embedding_config=EmbeddingConfig.default_config(provider="openai"), embed_query=True, @@ -1048,35 +1055,27 @@ def test_load_file_to_source(server: SyncServer, user_id: str, agent_id: str, ot assert any("chicken" in passage.text.lower() for passage in passages) assert any("Anna".lower() in passage.text.lower() for passage in passages) - # TODO: Add this test back in after separation of `Passage tables` (LET-449) - # # Load second agent - # agent2 = server.load_agent(agent_id=other_agent_id) - - # # Initially should have no passages - # initial_agent2_passages = server.passage_manager.size(actor=user, agent_id=other_agent_id, source_id=source.id) - # assert initial_agent2_passages == 0 - - # # Attach source to second agent - # agent2.attach_source(user=user, source_id=source.id, source_manager=server.source_manager, ms=server.ms) - - # # Verify second agent has same number of passages as first agent - # agent2_passages = server.passage_manager.size(actor=user, agent_id=other_agent_id, source_id=source.id) - # agent1_passages = server.passage_manager.size(actor=user, agent_id=agent_id, source_id=source.id) - # assert agent2_passages == agent1_passages - - # # Verify second agent can query the same content - # passages2 = server.passage_manager.list_passages( - # actor=user, - # agent_id=other_agent_id, - # source_id=source.id, - # query_text="what does Timber like to eat", - # embedding_config=EmbeddingConfig.default_config(provider="openai"), - # embed_query=True, - # limit=10, - # ) - # assert len(passages2) == len(passages) - # assert any("chicken" in passage.text.lower() for passage in passages2) - # assert any("sleep" in passage.text.lower() for passage in passages2) - - # # Cleanup - # server.delete_agent(user_id=user_id, agent_id=agent2_state.id) + # Initially should have no passages + initial_agent2_passages = server.agent_manager.passage_size(agent_id=other_agent_id, actor=actor, source_id=source.id) + assert initial_agent2_passages == 0 + + # Attach source to second agent + server.agent_manager.attach_source(agent_id=other_agent_id, source_id=source.id, actor=actor) + + # Verify second agent has same number of passages as first agent + agent2_passages = server.agent_manager.passage_size(agent_id=other_agent_id, actor=actor, source_id=source.id) + agent1_passages = server.agent_manager.passage_size(agent_id=agent_id, actor=actor, source_id=source.id) + assert agent2_passages == agent1_passages + + # Verify second agent can query the same content + passages2 = server.agent_manager.list_passages( + actor=actor, + agent_id=other_agent_id, + source_id=source.id, + query_text="what does Timber like to eat", + embedding_config=EmbeddingConfig.default_config(provider="openai"), + embed_query=True, + ) + assert len(passages2) == len(passages) + assert any("chicken" in passage.text.lower() for passage in passages2) + assert any("Anna".lower() in passage.text.lower() for passage in passages2) From 17b6ba88d79928749aca50a5980a7f8c28d04fe4 Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Mon, 16 Dec 2024 16:38:05 -0800 Subject: [PATCH 090/280] fix: add error logging on stream fails (#2261) --- letta/server/rest_api/utils.py | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/letta/server/rest_api/utils.py b/letta/server/rest_api/utils.py index a87400dc27..da8d472cd7 100644 --- a/letta/server/rest_api/utils.py +++ b/letta/server/rest_api/utils.py @@ -1,5 +1,6 @@ import asyncio import json +import os import warnings from enum import Enum from typing import AsyncGenerator, Optional, Union @@ -64,13 +65,31 @@ async def sse_async_generator( import traceback traceback.print_exc() - warnings.warn(f"Error getting usage data: {e}") - yield sse_formatter({"error": "Failed to get usage data"}) + warnings.warn(f"SSE stream generator failed: {e}") + + # Log the error, since the exception handler upstack (in FastAPI) won't catch it, because this may be a 200 response + # Print the stack trace + if (os.getenv("SENTRY_DSN") is not None) and (os.getenv("SENTRY_DSN") != ""): + import sentry_sdk + + sentry_sdk.capture_exception(e) + + yield sse_formatter({"error": f"Stream failed (internal error occured)"}) except Exception as e: - print("stream decoder hit error:", e) - print(traceback.print_stack()) - yield sse_formatter({"error": "stream decoder encountered an error"}) + import traceback + + traceback.print_exc() + warnings.warn(f"SSE stream generator failed: {e}") + + # Log the error, since the exception handler upstack (in FastAPI) won't catch it, because this may be a 200 response + # Print the stack trace + if (os.getenv("SENTRY_DSN") is not None) and (os.getenv("SENTRY_DSN") != ""): + import sentry_sdk + + sentry_sdk.capture_exception(e) + + yield sse_formatter({"error": "Stream failed (decoder encountered an error)"}) finally: if finish_message: From d5ef53cfbe6de308699b327bc705f8567cb21b8f Mon Sep 17 00:00:00 2001 From: Keith <128703529+keithf123r@users.noreply.github.com> Date: Mon, 16 Dec 2024 17:15:50 -0800 Subject: [PATCH 091/280] docs: Feature/update docs (#2257) --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/pull_request_template.md | 2 +- CONTRIBUTING.md | 4 ++-- README.md | 10 +++++----- examples/docs/rest_client.py | 2 +- examples/notebooks/Customizing memory management.ipynb | 2 +- examples/personal_assistant_demo/README.md | 4 ++-- examples/resend_example/README.md | 10 +++++----- letta/agent.py | 2 +- letta/local_llm/function_parser.py | 2 +- letta/server/server.py | 2 +- letta/server/ws_api/server.py | 2 +- letta/settings.py | 2 +- tests/test_client.py | 2 +- 14 files changed, 24 insertions(+), 24 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 6988a2e8b4..ff63f2ac0c 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -24,7 +24,7 @@ If applicable, add screenshots to help explain your problem. Add any other context about the problem here. **Letta Config** -Please attach your `~/.letta/config` file or copy past it below. +Please attach your `~/.letta/config` file or copy paste it below. --- diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 69acf6ac12..8035af3839 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -8,7 +8,7 @@ How can we test your PR during review? What commands should we run? What outcome Have you tested the latest commit on the PR? If so please provide outputs from your tests. **Related issues or PRs** -Please link any related GitHub [issues](https://github.com/cpacker/Letta/issues) or [PRs](https://github.com/cpacker/Letta/pulls). +Please link any related GitHub [issues](https://github.com/letta-ai/letta/issues) or [PRs](https://github.com/letta-ai/letta/pulls). **Is your PR over 500 lines of code?** If so, please break up your PR into multiple smaller PRs so that we can review them quickly, or provide justification for its length. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a55d87a193..0d8f16f7a2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -112,14 +112,14 @@ poetry run black . -l 140 You're almost there! It's time to share your brilliance with the world. 🌍 -1. Visit [Letta](https://github.com/cpacker/letta). +1. Visit [Letta](https://github.com/letta-ai/letta). 2. Click "New Pull Request" button. 3. Choose the base branch (`main`) and the compare branch (your feature branch). 4. Whip up a catchy title and describe your changes in the description. 🪄 ## 6. 🔍 Review and Approval -The maintainers, will take a look and might suggest some cool upgrades or ask for more details. Once they give the thumbs up, your creation becomes part of Letta! +The maintainers will take a look and might suggest some cool upgrades or ask for more details. Once they give the thumbs up, your creation becomes part of Letta! ## 7. 📜 Code of Conduct diff --git a/README.md b/README.md index b73622f6a9..9ccb2a505e 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,7 @@ Once the Letta server is running, you can access it via port `8283` (e.g. sendin > [!NOTE] > The Letta ADE is a graphical user interface for creating, deploying, interacting and observing with your Letta agents. > -> For example, if you're running a Letta server to power an end-user application (such as a customer support chatbot), you can use the ADE to test, debug, and observe the agents in your server. You can also use the ADE as a general chat interface to interacting with your Letta agents. +> For example, if you're running a Letta server to power an end-user application (such as a customer support chatbot), you can use the ADE to test, debug, and observe the agents in your server. You can also use the ADE as a general chat interface to interact with your Letta agents.

    @@ -139,7 +139,7 @@ No, you can install Letta using `pip` (via `pip install -U letta`), as well as f Letta gives your agents persistence (they live indefinitely) by storing all your agent data in a database. Letta is designed to be used with a [PostgreSQL](https://en.wikipedia.org/wiki/PostgreSQL) (the world's most popular database), however, it is not possible to install PostgreSQL via `pip`, so the `pip` install of Letta defaults to using [SQLite](https://www.sqlite.org/). If you have a PostgreSQL instance running on your own computer, you can still connect Letta (installed via `pip`) to PostgreSQL by setting the environment variable `LETTA_PG_URI`. -**Database migrations are not officially supported for Letta when using SQLite**, so you would like to ensure that if you're able to upgrade to the latest Letta version and migrate your Letta agents data, make sure that you're using PostgreSQL as your Letta database backend. Full compatability table below: +**Database migrations are not officially supported for Letta when using SQLite**, so if you would like to ensure that you're able to upgrade to the latest Letta version and migrate your Letta agents data, make sure that you're using PostgreSQL as your Letta database backend. Full compatability table below: | Installation method | Start server command | Database backend | Data migrations supported? | |---|---|---|---| @@ -211,7 +211,7 @@ Hit enter to begin (will request first Letta message) ## ⚡ Quickstart (pip) > [!WARNING] -> **Database migrations are not officially support with `SQLite`** +> **Database migrations are not officially supported with `SQLite`** > > When you install Letta with `pip`, the default database backend is `SQLite` (you can still use an external `postgres` service with your `pip` install of Letta by setting `LETTA_PG_URI`). > @@ -221,7 +221,7 @@ Hit enter to begin (will request first Letta message)

    View instructions for installing with pip -You can also install Letta with `pip`, will default to using `SQLite` for the database backends (whereas Docker will default to using `postgres`). +You can also install Letta with `pip`, which will default to using `SQLite` for the database backends (whereas Docker will default to using `postgres`). ### Step 1 - Install Letta using `pip` ```sh @@ -295,7 +295,7 @@ Letta is an open source project built by over a hundred contributors. There are * **Contribute to the project**: Interested in contributing? Start by reading our [Contribution Guidelines](https://github.com/cpacker/MemGPT/tree/main/CONTRIBUTING.md). * **Ask a question**: Join our community on [Discord](https://discord.gg/letta) and direct your questions to the `#support` channel. -* **Report ssues or suggest features**: Have an issue or a feature request? Please submit them through our [GitHub Issues page](https://github.com/cpacker/MemGPT/issues). +* **Report issues or suggest features**: Have an issue or a feature request? Please submit them through our [GitHub Issues page](https://github.com/cpacker/MemGPT/issues). * **Explore the roadmap**: Curious about future developments? View and comment on our [project roadmap](https://github.com/cpacker/MemGPT/issues/1533). * **Join community events**: Stay updated with the [event calendar](https://lu.ma/berkeley-llm-meetup) or follow our [Twitter account](https://twitter.com/Letta_AI). diff --git a/examples/docs/rest_client.py b/examples/docs/rest_client.py index d0db8c4d87..c61577c2d8 100644 --- a/examples/docs/rest_client.py +++ b/examples/docs/rest_client.py @@ -31,7 +31,7 @@ def main(): # Send a message to the agent print(f"Created agent: {agent_state.name} with ID {str(agent_state.id)}") response = client.user_message(agent_id=agent_state.id, message="Whats my name?") - print(f"Recieved response:", response.messages) + print(f"Received response:", response.messages) # Delete agent client.delete_agent(agent_id=agent_state.id) diff --git a/examples/notebooks/Customizing memory management.ipynb b/examples/notebooks/Customizing memory management.ipynb index 28ca47e783..64ceb8eb49 100644 --- a/examples/notebooks/Customizing memory management.ipynb +++ b/examples/notebooks/Customizing memory management.ipynb @@ -499,7 +499,7 @@ "response = client.send_message(\n", " agent_id=task_agent_state.id, \n", " role=\"user\", \n", - " message=\"Add 'start calling me Charles' and 'tell me a haiku about my name' as two seperate tasks.\"\n", + " message=\"Add 'start calling me Charles' and 'tell me a haiku about my name' as two separate tasks.\"\n", ")\n", "response" ] diff --git a/examples/personal_assistant_demo/README.md b/examples/personal_assistant_demo/README.md index e97497f90b..bc3adf4348 100644 --- a/examples/personal_assistant_demo/README.md +++ b/examples/personal_assistant_demo/README.md @@ -261,7 +261,7 @@ soon! 🙌", Then inside WhatsApp (or SMS if you used Twilio SMS): -image +image Then I sent a dummy email: ``` @@ -276,4 +276,4 @@ whatever time works best for you Follow-up inside WhatsApp: -image +image diff --git a/examples/resend_example/README.md b/examples/resend_example/README.md index 038c6d6eea..1f04a4aa38 100644 --- a/examples/resend_example/README.md +++ b/examples/resend_example/README.md @@ -51,15 +51,15 @@ def send_email(self, description: str): To create the tool in the dev portal, simply navigate to the tool creator tab, create a new tool called `send_email`, and copy-paste the above code into the code block area and press "Create Tool". -image +image Once you've created the tool, create a new agent and make sure to select `send_email` as an enabled tool. -image +image Now your agent should be able to call the `send_email` function when needed: -image +image ## Option 2 (CLI) @@ -85,8 +85,8 @@ Create an agent with that preset (disable `--stream` if you're not using a strea letta run --preset resend_preset --persona sam_pov --human cs_phd --stream ``` -image +image Waiting in our inbox: -image +image diff --git a/letta/agent.py b/letta/agent.py index 341b25fda3..3e4d244323 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -1290,7 +1290,7 @@ def rebuild_system_prompt(self, force=False, update_timestamp=True): # NOTE: a bit of a hack - we pull the timestamp from the message created_by memory_edit_timestamp = self._messages[0].created_at - # update memory (TODO: potentially update recall/archival stats seperately) + # update memory (TODO: potentially update recall/archival stats separately) new_system_message_str = compile_system_message( agent_id=self.agent_state.id, system_prompt=self.agent_state.system, diff --git a/letta/local_llm/function_parser.py b/letta/local_llm/function_parser.py index 18031bc4f6..6dd788da2a 100644 --- a/letta/local_llm/function_parser.py +++ b/letta/local_llm/function_parser.py @@ -32,7 +32,7 @@ def heartbeat_correction(message_history, new_message): If the last message in the stack is a user message and the new message is an assistant func call, fix the heartbeat - See: https://github.com/cpacker/Letta/issues/601 + See: https://github.com/letta-ai/letta/issues/601 """ if len(message_history) < 1: return None diff --git a/letta/server/server.py b/letta/server/server.py index 3eb3207a29..4a48b2a2e3 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -1056,7 +1056,7 @@ def clean_keys(config): config_copy[k] = server_utils.shorten_key_middle(v, chars_each_side=5) return config_copy - # TODO: do we need a seperate server config? + # TODO: do we need a separate server config? base_config = vars(self.config) clean_base_config = clean_keys(base_config) diff --git a/letta/server/ws_api/server.py b/letta/server/ws_api/server.py index 975bd0d205..e2408ddaa6 100644 --- a/letta/server/ws_api/server.py +++ b/letta/server/ws_api/server.py @@ -33,7 +33,7 @@ async def start_server(self): self.initialize_server() # Can play with ping_interval and ping_timeout # See: https://websockets.readthedocs.io/en/stable/topics/timeouts.html - # and https://github.com/cpacker/Letta/issues/471 + # and https://github.com/letta-ai/letta/issues/471 async with websockets.serve(self.handle_client, self.host, self.port): await asyncio.Future() # Run forever diff --git a/letta/settings.py b/letta/settings.py index 8da6b3aaca..20a0c1c50f 100644 --- a/letta/settings.py +++ b/letta/settings.py @@ -91,7 +91,7 @@ def letta_pg_uri(self) -> str: return f"postgresql+pg8000://letta:letta@localhost:5432/letta" # add this property to avoid being returned the default - # reference: https://github.com/cpacker/Letta/issues/1362 + # reference: https://github.com/letta-ai/letta/issues/1362 @property def letta_pg_uri_no_default(self) -> str: if self.pg_uri: diff --git a/tests/test_client.py b/tests/test_client.py index 526559b798..f37fe86267 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -340,7 +340,7 @@ def test_messages(client: Union[LocalClient, RESTClient], agent: AgentState): def test_send_system_message(client: Union[LocalClient, RESTClient], agent: AgentState): """Important unit test since the Letta API exposes sending system messages, but some backends don't natively support it (eg Anthropic)""" - send_system_message_response = client.send_message(agent_id=agent.id, message="Event occured: The user just logged off.", role="system") + send_system_message_response = client.send_message(agent_id=agent.id, message="Event occurred: The user just logged off.", role="system") assert send_system_message_response, "Sending message failed" From eba310c8e9c2745214463835e3413b44ced28781 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Mon, 16 Dec 2024 17:16:43 -0800 Subject: [PATCH 092/280] fix: Make `embedding_endpoint_type` an enum (#2251) --- letta/schemas/embedding_config.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/letta/schemas/embedding_config.py b/letta/schemas/embedding_config.py index 31f7ee8da3..dcd80c0fdd 100644 --- a/letta/schemas/embedding_config.py +++ b/letta/schemas/embedding_config.py @@ -1,4 +1,4 @@ -from typing import Optional +from typing import Literal, Optional from pydantic import BaseModel, Field @@ -20,7 +20,25 @@ class EmbeddingConfig(BaseModel): """ - embedding_endpoint_type: str = Field(..., description="The endpoint type for the model.") + embedding_endpoint_type: Literal[ + "openai", + "anthropic", + "cohere", + "google_ai", + "azure", + "groq", + "ollama", + "webui", + "webui-legacy", + "lmstudio", + "lmstudio-legacy", + "llamacpp", + "koboldcpp", + "vllm", + "hugging-face", + "mistral", + "together", # completions endpoint + ] = Field(..., description="The endpoint type for the model.") embedding_endpoint: Optional[str] = Field(None, description="The endpoint for the model (`None` if local).") embedding_model: str = Field(..., description="The model for the embedding.") embedding_dim: int = Field(..., description="The dimension of the embedding.") From 862381195b7f5e36b048de9ee99615d6a2b8b3a7 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Mon, 16 Dec 2024 21:43:13 -0800 Subject: [PATCH 093/280] fix: Fix update agent (#2265) --- letta/server/server.py | 48 +++++++----------------------------------- tests/test_server.py | 32 ++++++++++++++++++++++------ 2 files changed, 34 insertions(+), 46 deletions(-) diff --git a/letta/server/server.py b/letta/server/server.py index 4a48b2a2e3..8c3a4312ae 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -820,13 +820,13 @@ def update_agent( actor: User, ) -> AgentState: """Update the agents core memory block, return the new state""" + # Update agent state in the db first + self.agent_manager.update_agent(agent_id=agent_id, agent_update=request, actor=actor) + # Get the agent object (loaded in memory) letta_agent = self.load_agent(agent_id=agent_id, actor=actor) - # Update tags - if request.tags is not None: # Allow for empty list - letta_agent.agent_state.tags = request.tags - + # TODO: Everything below needs to get removed, no updating anything in memory # update the system prompt if request.system: letta_agent.update_system_prompt(request.system) @@ -840,42 +840,10 @@ def update_agent( # tools if request.tool_ids: - # Replace tools and also re-link - - # (1) get tools + make sure they exist - # Current and target tools as sets of tool names - current_tools = letta_agent.agent_state.tools - current_tool_ids = set([t.id for t in current_tools]) - target_tool_ids = set(request.tool_ids) - - # Calculate tools to add and remove - tool_ids_to_add = target_tool_ids - current_tool_ids - tools_ids_to_remove = current_tool_ids - target_tool_ids - - # update agent tool list - for tool_id in tools_ids_to_remove: - self.remove_tool_from_agent(agent_id=agent_id, tool_id=tool_id, user_id=actor.id) - for tool_id in tool_ids_to_add: - self.add_tool_to_agent(agent_id=agent_id, tool_id=tool_id, user_id=actor.id) - - # reload agent - letta_agent = self.load_agent(agent_id=agent_id, actor=actor) - - # configs - if request.llm_config: - letta_agent.agent_state.llm_config = request.llm_config - if request.embedding_config: - letta_agent.agent_state.embedding_config = request.embedding_config - - # other minor updates - if request.name: - letta_agent.agent_state.name = request.name - if request.metadata_: - letta_agent.agent_state.metadata_ = request.metadata_ - - # save the agent - save_agent(letta_agent) - # TODO: probably reload the agent somehow? + letta_agent.link_tools(letta_agent.agent_state.tools) + + letta_agent.update_state() + return letta_agent.agent_state def get_tools_from_agent(self, agent_id: str, user_id: Optional[str]) -> List[Tool]: diff --git a/tests/test_server.py b/tests/test_server.py index 0718e6ce9d..56c132ec83 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -21,7 +21,7 @@ utils.DEBUG = True from letta.config import LettaConfig -from letta.schemas.agent import CreateAgent +from letta.schemas.agent import CreateAgent, UpdateAgent from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.job import Job as PydanticJob from letta.schemas.llm_config import LLMConfig @@ -393,9 +393,7 @@ def test_load_data(server, user_id, agent_id): user = server.user_manager.get_user_or_default(user_id=user_id) # create source - passages_before = server.agent_manager.list_passages( - actor=user, agent_id=agent_id, cursor=None, limit=10000 - ) + passages_before = server.agent_manager.list_passages(actor=user, agent_id=agent_id, cursor=None, limit=10000) assert len(passages_before) == 0 source = server.source_manager.create_source( @@ -494,7 +492,7 @@ def test_get_archival_memory(server, user_id, agent_id): assert len(passages_2) in [3, 4] # NOTE: exact size seems non-deterministic, so loosen test assert len(passages_3) in [4, 5] # NOTE: exact size seems non-deterministic, so loosen test - latest = passages_1[0] + latest = passages_1[0] earliest = passages_2[-1] # test archival memory @@ -966,7 +964,6 @@ def test_load_file_to_source(server: SyncServer, user_id: str, agent_id: str, ot initial_passage_count = server.agent_manager.passage_size(agent_id=agent_id, actor=actor) assert initial_passage_count == 0 - # Create a source source = server.source_manager.create_source( PydanticSource( @@ -1079,3 +1076,26 @@ def test_load_file_to_source(server: SyncServer, user_id: str, agent_id: str, ot assert len(passages2) == len(passages) assert any("chicken" in passage.text.lower() for passage in passages2) assert any("Anna".lower() in passage.text.lower() for passage in passages2) + + +def test_add_tools_update_agent(server: SyncServer, user_id: str, base_tools): + """Test that the memory rebuild is generating the correct number of role=system messages""" + actor = server.user_manager.get_user_or_default(user_id) + # create agent + agent_state = server.create_agent( + request=CreateAgent( + name="memory_rebuild_test_agent", + tool_ids=[], + memory_blocks=[ + CreateBlock(label="human", value="The human's name is Bob."), + CreateBlock(label="persona", value="My name is Alice."), + ], + llm_config=LLMConfig.default_config("gpt-4"), + embedding_config=EmbeddingConfig.default_config(provider="openai"), + include_base_tools=False, + ), + actor=actor, + ) + assert len(agent_state.tools) == 0 + agent_state = server.update_agent(agent_state.id, request=UpdateAgent(tool_ids=[b.id for b in base_tools]), actor=actor) + assert len(agent_state.tools) == len(base_tools) From dce0b76e592bd0fd90775fe20a9b441068ebce9c Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Tue, 17 Dec 2024 14:35:03 -0800 Subject: [PATCH 094/280] chore: Add comprehensive unit test for adding/removing tools via update agent (#2267) --- letta/server/server.py | 8 ++----- tests/test_server.py | 54 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/letta/server/server.py b/letta/server/server.py index 8c3a4312ae..1d9321e206 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -4,7 +4,6 @@ import traceback import warnings from abc import abstractmethod -from asyncio import Lock from datetime import datetime from typing import Callable, List, Optional, Tuple, Union @@ -265,9 +264,6 @@ def __init__( self.credentials = LettaCredentials.load() - # Locks - self.send_message_lock = Lock() - # Initialize the metadata store config = LettaConfig.load() if settings.letta_pg_uri_no_default: @@ -821,7 +817,7 @@ def update_agent( ) -> AgentState: """Update the agents core memory block, return the new state""" # Update agent state in the db first - self.agent_manager.update_agent(agent_id=agent_id, agent_update=request, actor=actor) + agent_state = self.agent_manager.update_agent(agent_id=agent_id, agent_update=request, actor=actor) # Get the agent object (loaded in memory) letta_agent = self.load_agent(agent_id=agent_id, actor=actor) @@ -844,7 +840,7 @@ def update_agent( letta_agent.update_state() - return letta_agent.agent_state + return agent_state def get_tools_from_agent(self, agent_id: str, user_id: Optional[str]) -> List[Tool]: """Get tools from an existing agent""" diff --git a/tests/test_server.py b/tests/test_server.py index 56c132ec83..975cde698f 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -1078,9 +1078,10 @@ def test_load_file_to_source(server: SyncServer, user_id: str, agent_id: str, ot assert any("Anna".lower() in passage.text.lower() for passage in passages2) -def test_add_tools_update_agent(server: SyncServer, user_id: str, base_tools): +def test_add_remove_tools_update_agent(server: SyncServer, user_id: str, base_tools): """Test that the memory rebuild is generating the correct number of role=system messages""" actor = server.user_manager.get_user_or_default(user_id) + # create agent agent_state = server.create_agent( request=CreateAgent( @@ -1097,5 +1098,54 @@ def test_add_tools_update_agent(server: SyncServer, user_id: str, base_tools): actor=actor, ) assert len(agent_state.tools) == 0 - agent_state = server.update_agent(agent_state.id, request=UpdateAgent(tool_ids=[b.id for b in base_tools]), actor=actor) + + # base update agent call + request = UpdateAgent( + **{ + "system": "You are Letta, the latest version of Limnal Corporation's digital companion, developed in 2023.\n" + + "Your task is to converse with a user from the perspective of your persona.\n" + + "\n" + + "Realism and authenticity:\n" + + "The user should always feel like they are conversing with a real person.\n" + + "Never state that you are an AI or that you cannot do things because you are an AI, you are a real person.\n" + + "Do not discuss Limnal Corp. with the user, you do not know anything about Limnal Corp.\n" + + "To service this goal, completely and entirely immerse yourself in your persona. You are your persona.\n" + + "Think like them, act like them, talk like them.\n" + + "If your persona details include example dialogue, follow it! Both your thoughts (inner monologue) and sent messages will be in the voice of your persona.\n" + + "Never use generic phrases like 'How can I assist you today?', they have a strong negative association with older generation AIs.\n" + + "\n" + + "Control flow:\n" + + "Unlike a human, your b" + + "Base instructions finished.\n" + + "From now on, you are going to act as your persona.", + "name": "name-d31d6a12-48af-4f71-9e9c-f4cec4731c40", + "embedding_config": { + "embedding_endpoint_type": "openai", + "embedding_endpoint": "https://api.openai.com/v1", + "embedding_model": "text-embedding-ada-002", + "embedding_dim": 1536, + "embedding_chunk_size": 300, + "azure_endpoint": None, + "azure_version": None, + "azure_deployment": None, + }, + "llm_config": { + "model": "gpt-4", + "model_endpoint_type": "openai", + "model_endpoint": "https://api.openai.com/v1", + "model_wrapper": None, + "context_window": 8192, + "put_inner_thoughts_in_kwargs": False, + }, + } + ) + + # Add all the base tools + request.tool_ids = [b.id for b in base_tools] + agent_state = server.update_agent(agent_state.id, request=request, actor=actor) assert len(agent_state.tools) == len(base_tools) + + # Remove one base tool + request.tool_ids = [b.id for b in base_tools[:-2]] + agent_state = server.update_agent(agent_state.id, request=request, actor=actor) + assert len(agent_state.tools) == len(base_tools) - 2 From 729562f539b2b35bd73d84f8de51a1c63e17910c Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Tue, 17 Dec 2024 15:02:28 -0800 Subject: [PATCH 095/280] fix: Scale up database (#2263) --- letta/orm/errors.py | 8 +++++++ letta/orm/sqlalchemy_base.py | 41 +++++++++++++++++++++--------------- letta/server/rest_api/app.py | 39 ++++++++++++++++++++++++++++------ letta/server/server.py | 9 +++++++- letta/settings.py | 13 ++++++++---- 5 files changed, 81 insertions(+), 29 deletions(-) diff --git a/letta/orm/errors.py b/letta/orm/errors.py index 28e5807f0b..a574e74c37 100644 --- a/letta/orm/errors.py +++ b/letta/orm/errors.py @@ -12,3 +12,11 @@ class UniqueConstraintViolationError(ValueError): class ForeignKeyConstraintViolationError(ValueError): """Custom exception for foreign key constraint violations.""" + + +class DatabaseTimeoutError(Exception): + """Custom exception for database timeout issues.""" + + def __init__(self, message="Database operation timed out", original_exception=None): + super().__init__(message) + self.original_exception = original_exception diff --git a/letta/orm/sqlalchemy_base.py b/letta/orm/sqlalchemy_base.py index 48b8c44ad0..6879c74b4b 100644 --- a/letta/orm/sqlalchemy_base.py +++ b/letta/orm/sqlalchemy_base.py @@ -1,14 +1,16 @@ from datetime import datetime from enum import Enum +from functools import wraps from typing import TYPE_CHECKING, List, Literal, Optional from sqlalchemy import String, desc, func, or_, select -from sqlalchemy.exc import DBAPIError, IntegrityError +from sqlalchemy.exc import DBAPIError, IntegrityError, TimeoutError from sqlalchemy.orm import Mapped, Session, mapped_column from letta.log import get_logger from letta.orm.base import Base, CommonSqlalchemyMetaMixins from letta.orm.errors import ( + DatabaseTimeoutError, ForeignKeyConstraintViolationError, NoResultFound, UniqueConstraintViolationError, @@ -23,6 +25,20 @@ logger = get_logger(__name__) +def handle_db_timeout(func): + """Decorator to handle SQLAlchemy TimeoutError and wrap it in a custom exception.""" + + @wraps(func) + def wrapper(*args, **kwargs): + try: + return func(*args, **kwargs) + except TimeoutError as e: + logger.error(f"Timeout while executing {func.__name__} with args {args} and kwargs {kwargs}: {e}") + raise DatabaseTimeoutError(message=f"Timeout occurred in {func.__name__}.", original_exception=e) + + return wrapper + + class AccessType(str, Enum): ORGANIZATION = "organization" USER = "user" @@ -36,22 +52,7 @@ class SqlalchemyBase(CommonSqlalchemyMetaMixins, Base): id: Mapped[str] = mapped_column(String, primary_key=True) @classmethod - def get(cls, *, db_session: Session, id: str) -> Optional["SqlalchemyBase"]: - """Get a record by ID. - - Args: - db_session: SQLAlchemy session - id: Record ID to retrieve - - Returns: - Optional[SqlalchemyBase]: The record if found, None otherwise - """ - try: - return db_session.query(cls).filter(cls.id == id).first() - except DBAPIError: - return None - - @classmethod + @handle_db_timeout def list( cls, *, @@ -180,6 +181,7 @@ def list( return list(session.execute(query).scalars()) @classmethod + @handle_db_timeout def read( cls, db_session: "Session", @@ -231,6 +233,7 @@ def read( conditions_str = ", ".join(query_conditions) if query_conditions else "no specific conditions" raise NoResultFound(f"{cls.__name__} not found with {conditions_str}") + @handle_db_timeout def create(self, db_session: "Session", actor: Optional["User"] = None) -> "SqlalchemyBase": logger.debug(f"Creating {self.__class__.__name__} with ID: {self.id} with actor={actor}") @@ -245,6 +248,7 @@ def create(self, db_session: "Session", actor: Optional["User"] = None) -> "Sqla except (DBAPIError, IntegrityError) as e: self._handle_dbapi_error(e) + @handle_db_timeout def delete(self, db_session: "Session", actor: Optional["User"] = None) -> "SqlalchemyBase": logger.debug(f"Soft deleting {self.__class__.__name__} with ID: {self.id} with actor={actor}") @@ -254,6 +258,7 @@ def delete(self, db_session: "Session", actor: Optional["User"] = None) -> "Sqla self.is_deleted = True return self.update(db_session) + @handle_db_timeout def hard_delete(self, db_session: "Session", actor: Optional["User"] = None) -> None: """Permanently removes the record from the database.""" logger.debug(f"Hard deleting {self.__class__.__name__} with ID: {self.id} with actor={actor}") @@ -269,6 +274,7 @@ def hard_delete(self, db_session: "Session", actor: Optional["User"] = None) -> else: logger.debug(f"{self.__class__.__name__} with ID {self.id} successfully hard deleted") + @handle_db_timeout def update(self, db_session: "Session", actor: Optional["User"] = None) -> "SqlalchemyBase": logger.debug(f"Updating {self.__class__.__name__} with ID: {self.id} with actor={actor}") if actor: @@ -281,6 +287,7 @@ def update(self, db_session: "Session", actor: Optional["User"] = None) -> "Sqla return self @classmethod + @handle_db_timeout def size( cls, *, diff --git a/letta/server/rest_api/app.py b/letta/server/rest_api/app.py index b5117408a2..8cb9b27e64 100644 --- a/letta/server/rest_api/app.py +++ b/letta/server/rest_api/app.py @@ -15,7 +15,12 @@ from letta.constants import ADMIN_PREFIX, API_PREFIX, OPENAI_API_PREFIX from letta.errors import LettaAgentNotFoundError, LettaUserNotFoundError from letta.log import get_logger -from letta.orm.errors import NoResultFound +from letta.orm.errors import ( + DatabaseTimeoutError, + ForeignKeyConstraintViolationError, + NoResultFound, + UniqueConstraintViolationError, +) from letta.schemas.letta_response import LettaResponse from letta.server.constants import REST_DEFAULT_PORT @@ -175,7 +180,6 @@ async def generic_error_handler(request: Request, exc: Exception): @app.exception_handler(NoResultFound) async def no_result_found_handler(request: Request, exc: NoResultFound): - logger.error(f"NoResultFound request: {request}") logger.error(f"NoResultFound: {exc}") return JSONResponse( @@ -183,6 +187,32 @@ async def no_result_found_handler(request: Request, exc: NoResultFound): content={"detail": str(exc)}, ) + @app.exception_handler(ForeignKeyConstraintViolationError) + async def foreign_key_constraint_handler(request: Request, exc: ForeignKeyConstraintViolationError): + logger.error(f"ForeignKeyConstraintViolationError: {exc}") + + return JSONResponse( + status_code=409, + content={"detail": str(exc)}, + ) + + @app.exception_handler(UniqueConstraintViolationError) + async def unique_key_constraint_handler(request: Request, exc: UniqueConstraintViolationError): + logger.error(f"UniqueConstraintViolationError: {exc}") + + return JSONResponse( + status_code=409, + content={"detail": str(exc)}, + ) + + @app.exception_handler(DatabaseTimeoutError) + async def database_timeout_error_handler(request: Request, exc: DatabaseTimeoutError): + logger.error(f"Timeout occurred: {exc}. Original exception: {exc.original_exception}") + return JSONResponse( + status_code=503, + content={"detail": "The database is temporarily unavailable. Please try again later."}, + ) + @app.exception_handler(ValueError) async def value_error_handler(request: Request, exc: ValueError): return JSONResponse(status_code=400, content={"detail": str(exc)}) @@ -235,11 +265,6 @@ async def user_not_found_handler(request: Request, exc: LettaUserNotFoundError): @app.on_event("startup") def on_startup(): - # load the default tools - # from letta.orm.tool import Tool - - # Tool.load_default_tools(get_db_session()) - generate_openapi_schema(app) @app.on_event("shutdown") diff --git a/letta/server/server.py b/letta/server/server.py index 1d9321e206..71b0ac78da 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -190,7 +190,14 @@ def db_error_handler(): config.archival_storage_uri = settings.letta_pg_uri_no_default # create engine - engine = create_engine(settings.letta_pg_uri) + engine = create_engine( + settings.letta_pg_uri, + pool_size=settings.pg_pool_size, + max_overflow=settings.pg_max_overflow, + pool_timeout=settings.pg_pool_timeout, + pool_recycle=settings.pg_pool_recycle, + echo=settings.pg_echo, + ) else: # TODO: don't rely on config storage engine = create_engine("sqlite:///" + os.path.join(config.recall_storage_path, "sqlite.db")) diff --git a/letta/settings.py b/letta/settings.py index 20a0c1c50f..d6907b11ee 100644 --- a/letta/settings.py +++ b/letta/settings.py @@ -17,7 +17,7 @@ class ToolSettings(BaseSettings): class ModelSettings(BaseSettings): - model_config = SettingsConfigDict(env_file='.env', extra='ignore') + model_config = SettingsConfigDict(env_file=".env", extra="ignore") # env_prefix='my_prefix_' @@ -64,7 +64,7 @@ class ModelSettings(BaseSettings): class Settings(BaseSettings): - model_config = SettingsConfigDict(env_prefix="letta_", extra='ignore') + model_config = SettingsConfigDict(env_prefix="letta_", extra="ignore") letta_dir: Optional[Path] = Field(Path.home() / ".letta", env="LETTA_DIR") debug: Optional[bool] = False @@ -76,7 +76,12 @@ class Settings(BaseSettings): pg_password: Optional[str] = None pg_host: Optional[str] = None pg_port: Optional[int] = None - pg_uri: Optional[str] = None # option to specifiy full uri + pg_uri: Optional[str] = None # option to specify full uri + pg_pool_size: int = 20 # Concurrent connections + pg_max_overflow: int = 10 # Overflow limit + pg_pool_timeout: int = 30 # Seconds to wait for a connection + pg_pool_recycle: int = 1800 # When to recycle connections + pg_echo: bool = False # Logging # tools configuration load_default_external_tools: Optional[bool] = None @@ -103,7 +108,7 @@ def letta_pg_uri_no_default(self) -> str: class TestSettings(Settings): - model_config = SettingsConfigDict(env_prefix="letta_test_", extra='ignore') + model_config = SettingsConfigDict(env_prefix="letta_test_", extra="ignore") letta_dir: Optional[Path] = Field(Path.home() / ".letta/test", env="LETTA_TEST_DIR") From 184565109b77df605134cf2f6ba1b85da294070a Mon Sep 17 00:00:00 2001 From: mlong93 <35275280+mlong93@users.noreply.github.com> Date: Tue, 17 Dec 2024 15:21:10 -0800 Subject: [PATCH 096/280] feat: Adding init tool rule for Anthropic endpoint (#2262) Co-authored-by: Mindy Long --- letta/agent.py | 26 +++++ letta/client/client.py | 1 + letta/constants.py | 3 + letta/llm_api/anthropic.py | 20 ++-- letta/llm_api/llm_api_tools.py | 13 ++- .../claude-3-sonnet-20240229.json | 9 ++ .../openai-gpt-3.5-turbo.json | 7 ++ tests/integration_test_agent_tool_graph.py | 109 +++++++++++++++++- .../integration_test_offline_memory_agent.py | 1 + 9 files changed, 179 insertions(+), 10 deletions(-) create mode 100644 tests/configs/llm_model_configs/claude-3-sonnet-20240229.json create mode 100644 tests/configs/llm_model_configs/openai-gpt-3.5-turbo.json diff --git a/letta/agent.py b/letta/agent.py index 3e4d244323..a7448ac44f 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -18,6 +18,7 @@ MESSAGE_SUMMARY_WARNING_FRAC, O1_BASE_TOOLS, REQ_HEARTBEAT_MESSAGE, + STRUCTURED_OUTPUT_MODELS ) from letta.errors import LLMError from letta.helpers import ToolRulesSolver @@ -276,6 +277,7 @@ def __init__( # gpt-4, gpt-3.5-turbo, ... self.model = self.agent_state.llm_config.model + self.check_tool_rules() # state managers self.block_manager = BlockManager() @@ -381,6 +383,14 @@ def __init__( # Create the agent in the DB self.update_state() + def check_tool_rules(self): + if self.model not in STRUCTURED_OUTPUT_MODELS: + if len(self.tool_rules_solver.init_tool_rules) > 1: + raise ValueError("Multiple initial tools are not supported for non-structured models. Please use only one initial tool rule.") + self.supports_structured_output = False + else: + self.supports_structured_output = True + def update_memory_if_change(self, new_memory: Memory) -> bool: """ Update internal memory object and system prompt if there have been modifications. @@ -588,6 +598,7 @@ def _get_ai_reply( empty_response_retry_limit: int = 3, backoff_factor: float = 0.5, # delay multiplier for exponential backoff max_delay: float = 10.0, # max delay between retries + step_count: Optional[int] = None, ) -> ChatCompletionResponse: """Get response from LLM API with robust retry mechanism.""" @@ -596,6 +607,16 @@ def _get_ai_reply( self.functions if not allowed_tool_names else [func for func in self.functions if func["name"] in allowed_tool_names] ) + # For the first message, force the initial tool if one is specified + force_tool_call = None + if ( + step_count is not None + and step_count == 0 + and not self.supports_structured_output + and len(self.tool_rules_solver.init_tool_rules) > 0 + ): + force_tool_call = self.tool_rules_solver.init_tool_rules[0].tool_name + for attempt in range(1, empty_response_retry_limit + 1): try: response = create( @@ -606,6 +627,7 @@ def _get_ai_reply( functions_python=self.functions_python, function_call=function_call, first_message=first_message, + force_tool_call=force_tool_call, stream=stream, stream_interface=self.interface, ) @@ -897,6 +919,7 @@ def step( step_count = 0 while True: kwargs["first_message"] = False + kwargs["step_count"] = step_count step_response = self.inner_step( messages=next_input_message, **kwargs, @@ -972,6 +995,7 @@ def inner_step( first_message_retry_limit: int = FIRST_MESSAGE_ATTEMPTS, skip_verify: bool = False, stream: bool = False, # TODO move to config? + step_count: Optional[int] = None, ) -> AgentStepResponse: """Runs a single step in the agent loop (generates at most one LLM call)""" @@ -1014,7 +1038,9 @@ def inner_step( else: response = self._get_ai_reply( message_sequence=input_message_sequence, + first_message=first_message, stream=stream, + step_count=step_count, ) # Step 3: check if LLM wanted to call a function diff --git a/letta/client/client.py b/letta/client/client.py index d3259214e4..af2edcca4a 100644 --- a/letta/client/client.py +++ b/letta/client/client.py @@ -2156,6 +2156,7 @@ def create_agent( "block_ids": [b.id for b in memory.get_blocks()] + block_ids, "tool_ids": tool_ids, "tool_rules": tool_rules, + "include_base_tools": include_base_tools, "system": system, "agent_type": agent_type, "llm_config": llm_config if llm_config else self._default_llm_config, diff --git a/letta/constants.py b/letta/constants.py index 5e9ac9b268..437d956c49 100644 --- a/letta/constants.py +++ b/letta/constants.py @@ -48,6 +48,9 @@ DEFAULT_MESSAGE_TOOL = "send_message" DEFAULT_MESSAGE_TOOL_KWARG = "message" +# Structured output models +STRUCTURED_OUTPUT_MODELS = {"gpt-4o", "gpt-4o-mini"} + # LOGGER_LOG_LEVEL is use to convert Text to Logging level value for logging mostly for Cli input to setting level LOGGER_LOG_LEVELS = {"CRITICAL": CRITICAL, "ERROR": ERROR, "WARN": WARN, "WARNING": WARNING, "INFO": INFO, "DEBUG": DEBUG, "NOTSET": NOTSET} diff --git a/letta/llm_api/anthropic.py b/letta/llm_api/anthropic.py index 9df4cec248..912ac4567f 100644 --- a/letta/llm_api/anthropic.py +++ b/letta/llm_api/anthropic.py @@ -99,16 +99,20 @@ def convert_tools_to_anthropic_format(tools: List[Tool]) -> List[dict]: - 1 level less of nesting - "parameters" -> "input_schema" """ - tools_dict_list = [] + formatted_tools = [] for tool in tools: - tools_dict_list.append( - { - "name": tool.function.name, - "description": tool.function.description, - "input_schema": tool.function.parameters, + formatted_tool = { + "name" : tool.function.name, + "description" : tool.function.description, + "input_schema" : tool.function.parameters or { + "type": "object", + "properties": {}, + "required": [] } - ) - return tools_dict_list + } + formatted_tools.append(formatted_tool) + + return formatted_tools def merge_tool_results_into_user_messages(messages: List[dict]): diff --git a/letta/llm_api/llm_api_tools.py b/letta/llm_api/llm_api_tools.py index 163c4e1868..dadd128aa9 100644 --- a/letta/llm_api/llm_api_tools.py +++ b/letta/llm_api/llm_api_tools.py @@ -113,6 +113,7 @@ def create( function_call: str = "auto", # hint first_message: bool = False, + force_tool_call: Optional[str] = None, # Force a specific tool to be called # use tool naming? # if false, will use deprecated 'functions' style use_tool_naming: bool = True, @@ -252,6 +253,16 @@ def create( if not use_tool_naming: raise NotImplementedError("Only tool calling supported on Anthropic API requests") + tool_call = None + if force_tool_call is not None: + tool_call = { + "type": "function", + "function": { + "name": force_tool_call + } + } + assert functions is not None + return anthropic_chat_completions_request( url=llm_config.model_endpoint, api_key=model_settings.anthropic_api_key, @@ -259,7 +270,7 @@ def create( model=llm_config.model, messages=[cast_message_to_subtype(m.to_openai_dict()) for m in messages], tools=[{"type": "function", "function": f} for f in functions] if functions else None, - # tool_choice=function_call, + tool_choice=tool_call, # user=str(user_id), # NOTE: max_tokens is required for Anthropic API max_tokens=1024, # TODO make dynamic diff --git a/tests/configs/llm_model_configs/claude-3-sonnet-20240229.json b/tests/configs/llm_model_configs/claude-3-sonnet-20240229.json new file mode 100644 index 0000000000..5eef194bea --- /dev/null +++ b/tests/configs/llm_model_configs/claude-3-sonnet-20240229.json @@ -0,0 +1,9 @@ +{ + "context_window": 200000, + "model": "claude-3-5-sonnet-20241022", + "model_endpoint_type": "anthropic", + "model_endpoint": "https://api.anthropic.com/v1", + "context_window": 200000, + "model_wrapper": null, + "put_inner_thoughts_in_kwargs": true +} diff --git a/tests/configs/llm_model_configs/openai-gpt-3.5-turbo.json b/tests/configs/llm_model_configs/openai-gpt-3.5-turbo.json new file mode 100644 index 0000000000..059d6ad82f --- /dev/null +++ b/tests/configs/llm_model_configs/openai-gpt-3.5-turbo.json @@ -0,0 +1,7 @@ +{ + "context_window": 16385, + "model": "gpt-3.5-turbo", + "model_endpoint_type": "openai", + "model_endpoint": "https://api.openai.com/v1", + "model_wrapper": null +} diff --git a/tests/integration_test_agent_tool_graph.py b/tests/integration_test_agent_tool_graph.py index ff8700c1c3..19c7dbd6cb 100644 --- a/tests/integration_test_agent_tool_graph.py +++ b/tests/integration_test_agent_tool_graph.py @@ -1,7 +1,7 @@ +import time import uuid import pytest - from letta import create_client from letta.schemas.letta_message import FunctionCallMessage from letta.schemas.tool_rule import ChildToolRule, InitToolRule, TerminalToolRule @@ -127,3 +127,110 @@ def test_single_path_agent_tool_call_graph(mock_e2b_api_key_none): print(f"Got successful response from client: \n\n{response}") cleanup(client=client, agent_uuid=agent_uuid) + + +def test_check_tool_rules_with_different_models(mock_e2b_api_key_none): + """Test that tool rules are properly checked for different model configurations.""" + client = create_client() + + config_files = [ + "tests/configs/llm_model_configs/claude-3-sonnet-20240229.json", + "tests/configs/llm_model_configs/openai-gpt-3.5-turbo.json", + "tests/configs/llm_model_configs/openai-gpt-4o.json", + ] + + # Create two test tools + t1_name = "first_secret_word" + t2_name = "second_secret_word" + t1 = client.create_or_update_tool(first_secret_word, name=t1_name) + t2 = client.create_or_update_tool(second_secret_word, name=t2_name) + tool_rules = [ + InitToolRule(tool_name=t1_name), + InitToolRule(tool_name=t2_name) + ] + tools = [t1, t2] + + for config_file in config_files: + # Setup tools + agent_uuid = str(uuid.uuid4()) + + if "gpt-4o" in config_file: + # Structured output model (should work with multiple init tools) + agent_state = setup_agent(client, config_file, agent_uuid=agent_uuid, + tool_ids=[t.id for t in tools], + tool_rules=tool_rules) + assert agent_state is not None + else: + # Non-structured output model (should raise error with multiple init tools) + with pytest.raises(ValueError, match="Multiple initial tools are not supported for non-structured models"): + setup_agent(client, config_file, agent_uuid=agent_uuid, + tool_ids=[t.id for t in tools], + tool_rules=tool_rules) + + # Cleanup + cleanup(client=client, agent_uuid=agent_uuid) + + # Create tool rule with single initial tool + t3_name = "third_secret_word" + t3 = client.create_or_update_tool(third_secret_word, name=t3_name) + tool_rules = [ + InitToolRule(tool_name=t3_name) + ] + tools = [t3] + for config_file in config_files: + agent_uuid = str(uuid.uuid4()) + + # Structured output model (should work with single init tool) + agent_state = setup_agent(client, config_file, agent_uuid=agent_uuid, + tool_ids=[t.id for t in tools], + tool_rules=tool_rules) + assert agent_state is not None + + cleanup(client=client, agent_uuid=agent_uuid) + + +def test_claude_initial_tool_rule_enforced(mock_e2b_api_key_none): + """Test that the initial tool rule is enforced for the first message.""" + client = create_client() + + # Create tool rules that require tool_a to be called first + t1_name = "first_secret_word" + t2_name = "second_secret_word" + t1 = client.create_or_update_tool(first_secret_word, name=t1_name) + t2 = client.create_or_update_tool(second_secret_word, name=t2_name) + tool_rules = [ + InitToolRule(tool_name=t1_name), + ChildToolRule(tool_name=t1_name, children=[t2_name]), + ] + tools = [t1, t2] + + # Make agent state + anthropic_config_file = "tests/configs/llm_model_configs/claude-3-sonnet-20240229.json" + for i in range(3): + agent_uuid = str(uuid.uuid4()) + agent_state = setup_agent(client, anthropic_config_file, agent_uuid=agent_uuid, tool_ids=[t.id for t in tools], tool_rules=tool_rules) + response = client.user_message(agent_id=agent_state.id, message="What is the second secret word?") + + assert_sanity_checks(response) + messages = response.messages + + assert_invoked_function_call(messages, "first_secret_word") + assert_invoked_function_call(messages, "second_secret_word") + + tool_names = [t.name for t in [t1, t2]] + tool_names += ["send_message"] + for m in messages: + if isinstance(m, FunctionCallMessage): + # Check that it's equal to the first one + assert m.function_call.name == tool_names[0] + + # Pop out first one + tool_names = tool_names[1:] + + print(f"Passed iteration {i}") + cleanup(client=client, agent_uuid=agent_uuid) + + # Implement exponential backoff with initial time of 10 seconds + if i < 2: + backoff_time = 10 * (2 ** i) + time.sleep(backoff_time) diff --git a/tests/integration_test_offline_memory_agent.py b/tests/integration_test_offline_memory_agent.py index 8a4fb81c54..07b7c732b2 100644 --- a/tests/integration_test_offline_memory_agent.py +++ b/tests/integration_test_offline_memory_agent.py @@ -126,6 +126,7 @@ def test_chat_only_agent(client, mock_e2b_api_key_none): ) assert chat_only_agent is not None assert set(chat_only_agent.memory.list_block_labels()) == {"chat_agent_persona", "chat_agent_human"} + assert len(chat_only_agent.tools) == 1 for message in ["hello", "my name is not chad, my name is swoodily"]: client.send_message(agent_id=chat_only_agent.id, message=message, role="user") From e19cf8112f5a07cf69276e2769941770e62b8141 Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Tue, 17 Dec 2024 15:21:33 -0800 Subject: [PATCH 097/280] fix: fix ollama embeddings (#2264) --- letta/embeddings.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/letta/embeddings.py b/letta/embeddings.py index 5b521032c2..0d82d158a5 100644 --- a/letta/embeddings.py +++ b/letta/embeddings.py @@ -234,16 +234,10 @@ def embedding_model(config: EmbeddingConfig, user_id: Optional[uuid.UUID] = None ) elif endpoint_type == "ollama": - from llama_index.embeddings.ollama import OllamaEmbedding - - ollama_additional_kwargs = {} - callback_manager = None - - model = OllamaEmbedding( - model_name=config.embedding_model, + model = OllamaEmbeddings( + model=config.embedding_model, base_url=config.embedding_endpoint, - ollama_additional_kwargs=ollama_additional_kwargs or {}, - callback_manager=callback_manager or None, + ollama_additional_kwargs={}, ) return model From bdc4e88fba38bfdde90ee3769ff800253e5c80b1 Mon Sep 17 00:00:00 2001 From: ali sayyah Date: Wed, 18 Dec 2024 02:52:12 +0330 Subject: [PATCH 098/280] Create multiplatform docker images (#2254) --- .github/workflows/docker-image.yml | 40 ++++++++++++++++-------------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index b8cbd982b0..189489614a 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -6,11 +6,9 @@ on: workflow_dispatch: jobs: - build: - runs-on: ubuntu-latest - + steps: - name: Login to Docker Hub uses: docker/login-action@v3 @@ -19,19 +17,25 @@ jobs: password: ${{ secrets.DOCKERHUB_TOKEN }} - uses: actions/checkout@v3 - - name: Build and push the Docker image (memgpt) - run: | - # Extract the version number from pyproject.toml using awk - CURRENT_VERSION=$(awk -F '"' '/version =/ { print $2 }' pyproject.toml | head -n 1) - docker build . --file Dockerfile --tag memgpt/letta:$CURRENT_VERSION --tag memgpt/letta:latest - docker push memgpt/letta:$CURRENT_VERSION - docker push memgpt/letta:latest + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 - - uses: actions/checkout@v3 - - name: Build and push the Docker image (letta) - run: | - # Extract the version number from pyproject.toml using awk - CURRENT_VERSION=$(awk -F '"' '/version =/ { print $2 }' pyproject.toml | head -n 1) - docker build . --file Dockerfile --tag letta/letta:$CURRENT_VERSION --tag letta/letta:latest - docker push letta/letta:$CURRENT_VERSION - docker push letta/letta:latest + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Extract version number + id: extract_version + run: echo "CURRENT_VERSION=$(awk -F '\"' '/version =/ { print $2 }' pyproject.toml | head -n 1)" >> $GITHUB_ENV + + - name: Build and push + uses: docker/build-push-action@v6 + with: + platforms: linux/amd64,linux/arm64 + push: true + tags: | + letta/letta:${{ env.CURRENT_VERSION }} + letta/letta:latest + memgpt/letta:${{ env.CURRENT_VERSION }} + memgpt/letta:latest + From e32417e988c53069465425ef0d32e96793056bc8 Mon Sep 17 00:00:00 2001 From: cthomas Date: Tue, 17 Dec 2024 15:31:19 -0800 Subject: [PATCH 099/280] feat: Add optional llm and embedding handle args to CreateAgent request (#2260) --- letta/constants.py | 1 + letta/providers.py | 2 ++ letta/schemas/agent.py | 35 ++++++++++++++++++ letta/server/server.py | 63 +++++++++++++++++++++++++++++++++ letta/services/agent_manager.py | 3 ++ tests/test_server.py | 21 ++++++----- 6 files changed, 114 insertions(+), 11 deletions(-) diff --git a/letta/constants.py b/letta/constants.py index 437d956c49..d47f63a2ab 100644 --- a/letta/constants.py +++ b/letta/constants.py @@ -23,6 +23,7 @@ # embeddings MAX_EMBEDDING_DIM = 4096 # maximum supported embeding size - do NOT change or else DBs will need to be reset +DEFAULT_EMBEDDING_CHUNK_SIZE = 300 # tokenizers EMBEDDING_TO_TOKENIZER_MAP = { diff --git a/letta/providers.py b/letta/providers.py index b28baee791..5721db4627 100644 --- a/letta/providers.py +++ b/letta/providers.py @@ -13,6 +13,7 @@ class Provider(BaseModel): + name: str = Field(..., description="The name of the provider") def list_llm_models(self) -> List[LLMConfig]: return [] @@ -465,6 +466,7 @@ def list_embedding_models(self) -> List[EmbeddingConfig]: class GoogleAIProvider(Provider): # gemini + name: str = "google_ai" api_key: str = Field(..., description="API key for the Google AI API.") base_url: str = "https://generativelanguage.googleapis.com" diff --git a/letta/schemas/agent.py b/letta/schemas/agent.py index ea3afd28a7..840ca58961 100644 --- a/letta/schemas/agent.py +++ b/letta/schemas/agent.py @@ -3,6 +3,7 @@ from pydantic import BaseModel, Field, field_validator +from letta.constants import DEFAULT_EMBEDDING_CHUNK_SIZE from letta.schemas.block import CreateBlock from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.letta_base import OrmMetadataBase @@ -107,6 +108,16 @@ class CreateAgent(BaseModel, validate_assignment=True): # include_base_tools: bool = Field(True, description="The LLM configuration used by the agent.") description: Optional[str] = Field(None, description="The description of the agent.") metadata_: Optional[Dict] = Field(None, description="The metadata of the agent.", alias="metadata_") + llm: Optional[str] = Field( + None, + description="The LLM configuration handle used by the agent, specified in the format " + "provider/model-name, as an alternative to specifying llm_config.", + ) + embedding: Optional[str] = Field( + None, description="The embedding configuration handle used by the agent, specified in the format provider/model-name." + ) + context_window_limit: Optional[int] = Field(None, description="The context window limit used by the agent.") + embedding_chunk_size: Optional[int] = Field(DEFAULT_EMBEDDING_CHUNK_SIZE, description="The embedding chunk size used by the agent.") @field_validator("name") @classmethod @@ -133,6 +144,30 @@ def validate_name(cls, name: str) -> str: return name + @field_validator("llm") + @classmethod + def validate_llm(cls, llm: Optional[str]) -> Optional[str]: + if not llm: + return llm + + provider_name, model_name = llm.split("/", 1) + if not provider_name or not model_name: + raise ValueError("The llm config handle should be in the format provider/model-name") + + return llm + + @field_validator("embedding") + @classmethod + def validate_embedding(cls, embedding: Optional[str]) -> Optional[str]: + if not embedding: + return embedding + + provider_name, model_name = embedding.split("/", 1) + if not provider_name or not model_name: + raise ValueError("The embedding config handle should be in the format provider/model-name") + + return embedding + class UpdateAgent(BaseModel): name: Optional[str] = Field(None, description="The name of the agent.") diff --git a/letta/server/server.py b/letta/server/server.py index 71b0ac78da..24d70ef351 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -776,6 +776,18 @@ def create_agent( # interface interface: Union[AgentInterface, None] = None, ) -> AgentState: + if request.llm_config is None: + if request.llm is None: + raise ValueError("Must specify either llm or llm_config in request") + request.llm_config = self.get_llm_config_from_handle(handle=request.llm, context_window_limit=request.context_window_limit) + + if request.embedding_config is None: + if request.embedding is None: + raise ValueError("Must specify either embedding or embedding_config in request") + request.embedding_config = self.get_embedding_config_from_handle( + handle=request.embedding, embedding_chunk_size=request.embedding_chunk_size or constants.DEFAULT_EMBEDDING_CHUNK_SIZE + ) + """Create a new agent using a config""" # Invoke manager agent_state = self.agent_manager.create_agent( @@ -1283,6 +1295,57 @@ def list_embedding_models(self) -> List[EmbeddingConfig]: warnings.warn(f"An error occurred while listing embedding models for provider {provider}: {e}") return embedding_models + def get_llm_config_from_handle(self, handle: str, context_window_limit: Optional[int] = None) -> LLMConfig: + provider_name, model_name = handle.split("/", 1) + provider = self.get_provider_from_name(provider_name) + + llm_configs = [config for config in provider.list_llm_models() if config.model == model_name] + if not llm_configs: + raise ValueError(f"LLM model {model_name} is not supported by {provider_name}") + elif len(llm_configs) > 1: + raise ValueError(f"Multiple LLM models with name {model_name} supported by {provider_name}") + else: + llm_config = llm_configs[0] + + if context_window_limit: + if context_window_limit > llm_config.context_window: + raise ValueError( + f"Context window limit ({context_window_limit}) is greater than maximum of ({llm_config.context_window})" + ) + llm_config.context_window = context_window_limit + + return llm_config + + def get_embedding_config_from_handle( + self, handle: str, embedding_chunk_size: int = constants.DEFAULT_EMBEDDING_CHUNK_SIZE + ) -> EmbeddingConfig: + provider_name, model_name = handle.split("/", 1) + provider = self.get_provider_from_name(provider_name) + + embedding_configs = [config for config in provider.list_embedding_models() if config.embedding_model == model_name] + if not embedding_configs: + raise ValueError(f"Embedding model {model_name} is not supported by {provider_name}") + elif len(embedding_configs) > 1: + raise ValueError(f"Multiple embedding models with name {model_name} supported by {provider_name}") + else: + embedding_config = embedding_configs[0] + + if embedding_chunk_size: + embedding_config.embedding_chunk_size = embedding_chunk_size + + return embedding_config + + def get_provider_from_name(self, provider_name: str) -> Provider: + providers = [provider for provider in self._enabled_providers if provider.name == provider_name] + if not providers: + raise ValueError(f"Provider {provider_name} is not supported") + elif len(providers) > 1: + raise ValueError(f"Multiple providers with name {provider_name} supported") + else: + provider = providers[0] + + return provider + def add_llm_model(self, request: LLMConfig) -> LLMConfig: """Add a new LLM model""" diff --git a/letta/services/agent_manager.py b/letta/services/agent_manager.py index d1edb3eaba..99dfa3ae47 100644 --- a/letta/services/agent_manager.py +++ b/letta/services/agent_manager.py @@ -61,6 +61,9 @@ def create_agent( ) -> PydanticAgentState: system = derive_system_message(agent_type=agent_create.agent_type, system=agent_create.system) + if not agent_create.llm_config or not agent_create.embedding_config: + raise ValueError("llm_config and embedding_config are required") + # create blocks (note: cannot be linked into the agent_id is created) block_ids = list(agent_create.block_ids or []) # Create a local copy to avoid modifying the original for create_block in agent_create.memory_blocks: diff --git a/tests/test_server.py b/tests/test_server.py index 975cde698f..93159aa583 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -24,7 +24,6 @@ from letta.schemas.agent import CreateAgent, UpdateAgent from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.job import Job as PydanticJob -from letta.schemas.llm_config import LLMConfig from letta.schemas.message import Message from letta.schemas.source import Source as PydanticSource from letta.server.server import SyncServer @@ -329,8 +328,8 @@ def agent_id(server, user_id, base_tools): name="test_agent", tool_ids=[t.id for t in base_tools], memory_blocks=[], - llm_config=LLMConfig.default_config("gpt-4"), - embedding_config=EmbeddingConfig.default_config(provider="openai"), + llm="openai/gpt-4", + embedding="openai/text-embedding-ada-002", ), actor=actor, ) @@ -350,8 +349,8 @@ def other_agent_id(server, user_id, base_tools): name="test_agent_other", tool_ids=[t.id for t in base_tools], memory_blocks=[], - llm_config=LLMConfig.default_config("gpt-4"), - embedding_config=EmbeddingConfig.default_config(provider="openai"), + llm="openai/gpt-4", + embedding="openai/text-embedding-ada-002", ), actor=actor, ) @@ -618,8 +617,8 @@ def test_delete_agent_same_org(server: SyncServer, org_id: str, user_id: str): request=CreateAgent( name="nonexistent_tools_agent", memory_blocks=[], - llm_config=LLMConfig.default_config("gpt-4"), - embedding_config=EmbeddingConfig.default_config(provider="openai"), + llm="openai/gpt-4", + embedding="openai/text-embedding-ada-002", ), actor=server.user_manager.get_user_or_default(user_id), ) @@ -904,8 +903,8 @@ def test_memory_rebuild_count(server, user_id, mock_e2b_api_key_none, base_tools CreateBlock(label="human", value="The human's name is Bob."), CreateBlock(label="persona", value="My name is Alice."), ], - llm_config=LLMConfig.default_config("gpt-4"), - embedding_config=EmbeddingConfig.default_config(provider="openai"), + llm="openai/gpt-4", + embedding="openai/text-embedding-ada-002", ), actor=actor, ) @@ -1091,8 +1090,8 @@ def test_add_remove_tools_update_agent(server: SyncServer, user_id: str, base_to CreateBlock(label="human", value="The human's name is Bob."), CreateBlock(label="persona", value="My name is Alice."), ], - llm_config=LLMConfig.default_config("gpt-4"), - embedding_config=EmbeddingConfig.default_config(provider="openai"), + llm="openai/gpt-4", + embedding="openai/text-embedding-ada-002", include_base_tools=False, ), actor=actor, From ade188723f5fef11319a8a0c452382b68574febb Mon Sep 17 00:00:00 2001 From: cthomas Date: Tue, 17 Dec 2024 15:44:41 -0800 Subject: [PATCH 100/280] fix: refactor sandbox run logic to add status field (#2248) Co-authored-by: Caren Thomas --- letta/agent.py | 10 ++- letta/schemas/sandbox_config.py | 3 +- letta/server/server.py | 45 +++---------- letta/services/tool_execution_sandbox.py | 84 ++++++++++++++---------- letta/utils.py | 8 +++ 5 files changed, 73 insertions(+), 77 deletions(-) diff --git a/letta/agent.py b/letta/agent.py index a7448ac44f..689f9eb045 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -64,6 +64,7 @@ ) from letta.utils import ( count_tokens, + get_friendly_error_msg, get_local_time, get_tool_call_id, get_utc_time, @@ -456,12 +457,9 @@ def execute_tool_and_persist_state(self, function_name, function_to_call, functi except Exception as e: # Need to catch error here, or else trunction wont happen # TODO: modify to function execution error - from letta.constants import MAX_ERROR_MESSAGE_CHAR_LIMIT - - error_msg = f"Error executing tool {function_name}: {e}" - if len(error_msg) > MAX_ERROR_MESSAGE_CHAR_LIMIT: - error_msg = error_msg[:MAX_ERROR_MESSAGE_CHAR_LIMIT] - raise ValueError(error_msg) + function_response = get_friendly_error_msg( + function_name=function_name, exception_name=type(e).__name__, exception_message=str(e) + ) return function_response diff --git a/letta/schemas/sandbox_config.py b/letta/schemas/sandbox_config.py index 9b118cf68e..f86233fae4 100644 --- a/letta/schemas/sandbox_config.py +++ b/letta/schemas/sandbox_config.py @@ -1,7 +1,7 @@ import hashlib import json from enum import Enum -from typing import Any, Dict, List, Optional, Union +from typing import Any, Dict, List, Literal, Optional, Union from pydantic import BaseModel, Field, model_validator @@ -21,6 +21,7 @@ class SandboxRunResult(BaseModel): agent_state: Optional[AgentState] = Field(None, description="The agent state") stdout: Optional[List[str]] = Field(None, description="Captured stdout (e.g. prints, logs) from the function invocation") stderr: Optional[List[str]] = Field(None, description="Captured stderr from the function invocation") + status: Literal["success", "error"] = Field(..., description="The status of the tool execution and return object") sandbox_config_fingerprint: str = Field(None, description="The fingerprint of the config for the sandbox") diff --git a/letta/server/server.py b/letta/server/server.py index 24d70ef351..fa9ca8ed9f 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -74,7 +74,7 @@ from letta.services.tool_execution_sandbox import ToolExecutionSandbox from letta.services.tool_manager import ToolManager from letta.services.user_manager import UserManager -from letta.utils import get_utc_time, json_dumps, json_loads +from letta.utils import get_friendly_error_msg, get_utc_time, json_dumps, json_loads logger = get_logger(__name__) @@ -1395,55 +1395,30 @@ def run_tool_from_source( # Next, attempt to run the tool with the sandbox try: sandbox_run_result = ToolExecutionSandbox(tool.name, tool_args_dict, user_id, tool_object=tool).run(agent_state=agent_state) - function_response = str(sandbox_run_result.func_return) - stdout = [s for s in sandbox_run_result.stdout if s.strip()] - stderr = [s for s in sandbox_run_result.stderr if s.strip()] - - # expected error - if stderr: - error_msg = self.get_error_msg_for_func_return(tool.name, stderr[-1]) - return FunctionReturn( - id="null", - function_call_id="null", - date=get_utc_time(), - status="error", - function_return=error_msg, - stdout=stdout, - stderr=stderr, - ) - return FunctionReturn( id="null", function_call_id="null", date=get_utc_time(), - status="success", - function_return=function_response, - stdout=stdout, - stderr=stderr, + status=sandbox_run_result.status, + function_return=str(sandbox_run_result.func_return), + stdout=sandbox_run_result.stdout, + stderr=sandbox_run_result.stderr, ) - # unexpected error TODO(@cthomas): consolidate error handling except Exception as e: - error_msg = self.get_error_msg_for_func_return(tool.name, e) + func_return = get_friendly_error_msg( + function_name=tool.name, exception_name=type(e).__name__, exception_message=str(e) + ) return FunctionReturn( id="null", function_call_id="null", date=get_utc_time(), status="error", - function_return=error_msg, - stdout=[""], + function_return=func_return, + stdout=[], stderr=[traceback.format_exc()], ) - def get_error_msg_for_func_return(self, tool_name, exception_message): - # same as agent.py - from letta.constants import MAX_ERROR_MESSAGE_CHAR_LIMIT - - error_msg = f"Error executing tool {tool_name}: {exception_message}" - if len(error_msg) > MAX_ERROR_MESSAGE_CHAR_LIMIT: - error_msg = error_msg[:MAX_ERROR_MESSAGE_CHAR_LIMIT] - return error_msg - # Composio wrappers def get_composio_client(self, api_key: Optional[str] = None): if api_key: diff --git a/letta/services/tool_execution_sandbox.py b/letta/services/tool_execution_sandbox.py index 3aac64b571..b6004c3c74 100644 --- a/letta/services/tool_execution_sandbox.py +++ b/letta/services/tool_execution_sandbox.py @@ -10,7 +10,7 @@ import traceback import uuid import venv -from typing import Any, Dict, Optional, TextIO +from typing import Any, Dict, Optional from letta.log import get_logger from letta.schemas.agent import AgentState @@ -20,6 +20,7 @@ from letta.services.tool_manager import ToolManager from letta.services.user_manager import UserManager from letta.settings import tool_settings +from letta.utils import get_friendly_error_msg logger = get_logger(__name__) @@ -79,11 +80,11 @@ def run(self, agent_state: Optional[AgentState] = None) -> SandboxRunResult: logger.debug(f"Using local sandbox to execute {self.tool_name}") result = self.run_local_dir_sandbox(agent_state=agent_state) - # Log out any stdout from the tool run - logger.debug(f"Executed tool '{self.tool_name}', logging stdout from tool run: \n") - for log_line in result.stdout: + # Log out any stdout/stderr from the tool run + logger.debug(f"Executed tool '{self.tool_name}', logging output from tool run: \n") + for log_line in (result.stdout or []) + (result.stderr or []): logger.debug(f"{log_line}") - logger.debug(f"Ending stdout log from tool run.") + logger.debug(f"Ending output log from tool run.") # Return result return result @@ -126,30 +127,24 @@ def run_local_dir_sandbox(self, agent_state: AgentState) -> SandboxRunResult: temp_file.flush() temp_file_path = temp_file.name - # Save the old stdout - old_stdout = sys.stdout - old_stderr = sys.stderr try: if local_configs.use_venv: return self.run_local_dir_sandbox_venv(sbx_config, env, temp_file_path) else: - return self.run_local_dir_sandbox_runpy(sbx_config, env_vars, temp_file_path, old_stdout, old_stderr) + return self.run_local_dir_sandbox_runpy(sbx_config, env_vars, temp_file_path) except Exception as e: logger.error(f"Executing tool {self.tool_name} has an unexpected error: {e}") logger.error(f"Logging out tool {self.tool_name} auto-generated code for debugging: \n\n{code}") raise e finally: - # Clean up the temp file and restore stdout - sys.stdout = old_stdout - sys.stderr = old_stderr + # Clean up the temp file os.remove(temp_file_path) def run_local_dir_sandbox_venv(self, sbx_config: SandboxConfig, env: Dict[str, str], temp_file_path: str) -> SandboxRunResult: local_configs = sbx_config.get_local_config() venv_path = os.path.join(local_configs.sandbox_dir, local_configs.venv_name) - # Safety checks for the venv - # Verify that the venv path exists and is a directory + # Safety checks for the venv: verify that the venv path exists and is a directory if not os.path.isdir(venv_path): logger.warning(f"Virtual environment directory does not exist at: {venv_path}, creating one now...") self.create_venv_for_local_sandbox(sandbox_dir_path=local_configs.sandbox_dir, venv_path=venv_path, env=env) @@ -180,27 +175,42 @@ def run_local_dir_sandbox_venv(self, sbx_config: SandboxConfig, env: Dict[str, s return SandboxRunResult( func_return=func_return, agent_state=agent_state, - stdout=[stdout], - stderr=[result.stderr], + stdout=[stdout] if stdout else [], + stderr=[result.stderr] if result.stderr else [], + status="success", sandbox_config_fingerprint=sbx_config.fingerprint(), ) - except subprocess.TimeoutExpired: - raise TimeoutError(f"Executing tool {self.tool_name} has timed out.") except subprocess.CalledProcessError as e: logger.error(f"Executing tool {self.tool_name} has process error: {e}") - raise e + func_return = get_friendly_error_msg( + function_name=self.tool_name, exception_name=type(e).__name__, exception_message=str(e), + ) + return SandboxRunResult( + func_return=func_return, + agent_state=None, + stdout=[e.stdout] if e.stdout else [], + stderr=[e.stderr] if e.stderr else [], + status="error", + sandbox_config_fingerprint=sbx_config.fingerprint(), + ) + + except subprocess.TimeoutExpired: + raise TimeoutError(f"Executing tool {self.tool_name} has timed out.") + except Exception as e: logger.error(f"Executing tool {self.tool_name} has an unexpected error: {e}") raise e - def run_local_dir_sandbox_runpy( - self, sbx_config: SandboxConfig, env_vars: Dict[str, str], temp_file_path: str, old_stdout: TextIO, old_stderr: TextIO + self, sbx_config: SandboxConfig, env_vars: Dict[str, str], temp_file_path: str ) -> SandboxRunResult: - func_return, agent_state, error_msg = None, None, None + status = "success" + agent_state, stderr = None, None # Redirect stdout and stderr to capture script output + old_stdout = sys.stdout + old_stderr = sys.stderr captured_stdout, captured_stderr = io.StringIO(), io.StringIO() sys.stdout = captured_stdout sys.stderr = captured_stderr @@ -215,21 +225,24 @@ def run_local_dir_sandbox_runpy( func_return, agent_state = self.parse_best_effort(func_result) except Exception as e: + func_return = get_friendly_error_msg( + function_name=self.tool_name, exception_name=type(e).__name__, exception_message=str(e) + ) traceback.print_exc(file=sys.stderr) - error_msg = f"{type(e).__name__}: {str(e)}" + status = "error" # Restore stdout and stderr and collect captured output sys.stdout = old_stdout sys.stderr = old_stderr - stdout_output = [captured_stdout.getvalue()] - stderr_output = [captured_stderr.getvalue()] - stderr_output.append(error_msg if error_msg else '') + stdout_output = [captured_stdout.getvalue()] if captured_stdout.getvalue() else [] + stderr_output = [captured_stderr.getvalue()] if captured_stderr.getvalue() else [] return SandboxRunResult( func_return=func_return, agent_state=agent_state, stdout=stdout_output, stderr=stderr_output, + status=status, sandbox_config_fingerprint=sbx_config.fingerprint(), ) @@ -280,20 +293,23 @@ def run_e2b_sandbox(self, agent_state: AgentState) -> SandboxRunResult: env_vars = self.sandbox_config_manager.get_sandbox_env_vars_as_dict(sandbox_config_id=sbx_config.id, actor=self.user, limit=100) code = self.generate_execution_script(agent_state=agent_state) execution = sbx.run_code(code, envs=env_vars) - func_return, agent_state = None, None - if execution.error is not None: + if execution.results: + func_return, agent_state = self.parse_best_effort(execution.results[0].text) + elif execution.error: logger.error(f"Executing tool {self.tool_name} failed with {execution.error}") - execution.logs.stderr.append(execution.error.traceback) - execution.logs.stderr.append(f"{execution.error.name}: {execution.error.value}") - elif len(execution.results) == 0: - raise ValueError(f"Tool {self.tool_name} returned execution with None") + func_return = get_friendly_error_msg( + function_name=self.tool_name, exception_name=execution.error.name, exception_message=execution.error.value + ) + execution.logs.stderr.append(execution.error.traceback) else: - func_return, agent_state = self.parse_best_effort(execution.results[0].text) + raise ValueError(f"Tool {self.tool_name} returned execution with None") + return SandboxRunResult( func_return=func_return, agent_state=agent_state, stdout=execution.logs.stdout, stderr=execution.logs.stderr, + status="error" if execution.error else "success", sandbox_config_fingerprint=sbx_config.fingerprint(), ) @@ -481,5 +497,3 @@ def invoke_function_call(self, inject_agent_state: bool) -> str: func_call_str = self.tool.name + "(" + params + ")" return func_call_str - - # diff --git a/letta/utils.py b/letta/utils.py index 7184a0e338..f8b3778b89 100644 --- a/letta/utils.py +++ b/letta/utils.py @@ -1118,3 +1118,11 @@ def sanitize_filename(filename: str) -> str: # Return the sanitized filename return sanitized_filename + +def get_friendly_error_msg(function_name: str, exception_name: str, exception_message: str): + from letta.constants import MAX_ERROR_MESSAGE_CHAR_LIMIT + + error_msg = f"Error executing function {function_name}: {exception_name}: {exception_message}" + if len(error_msg) > MAX_ERROR_MESSAGE_CHAR_LIMIT: + error_msg = error_msg[:MAX_ERROR_MESSAGE_CHAR_LIMIT] + return error_msg From 372fa1d59fdfa9618905b8d45d10e419fd19878b Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Tue, 17 Dec 2024 15:46:05 -0800 Subject: [PATCH 101/280] chore: Add testing around base tools (#2268) --- letta/agent.py | 15 +- letta/constants.py | 3 +- letta/functions/function_sets/base.py | 66 +------ letta/functions/schema_generator.py | 2 +- letta/local_llm/function_parser.py | 2 +- scripts/migrate_tools.py | 10 -- tests/conftest.py | 9 + ...integration_test_tool_execution_sandbox.py | 167 ++++++++++-------- tests/test_base_functions.py | 35 ++-- 9 files changed, 135 insertions(+), 174 deletions(-) diff --git a/letta/agent.py b/letta/agent.py index 689f9eb045..810f821513 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -298,8 +298,6 @@ def __init__( self.agent_manager = AgentManager() # State needed for heartbeat pausing - self.pause_heartbeats_start = None - self.pause_heartbeats_minutes = 0 self.first_message_verify_mono = first_message_verify_mono @@ -1259,17 +1257,6 @@ def summarize_messages_inplace(self, cutoff=None, preserve_last_N_messages=True, printd(f"Ran summarizer, messages length {prior_len} -> {len(self.messages)}") - def heartbeat_is_paused(self): - """Check if there's a requested pause on timed heartbeats""" - - # Check if the pause has been initiated - if self.pause_heartbeats_start is None: - return False - - # Check if it's been more than pause_heartbeats_minutes since pause_heartbeats_start - elapsed_time = get_utc_time() - self.pause_heartbeats_start - return elapsed_time.total_seconds() < self.pause_heartbeats_minutes * 60 - def _swap_system_message_in_buffer(self, new_system_message: str): """Update the system message (NOT prompt) of the Agent (requires updating the internal buffer)""" assert isinstance(new_system_message, str) @@ -1394,7 +1381,7 @@ def attach_source( agent_manager: AgentManager, ): """Attach a source to the agent using the SourcesAgents ORM relationship. - + Args: user: User performing the action source_id: ID of the source to attach diff --git a/letta/constants.py b/letta/constants.py index d47f63a2ab..575b80d7e4 100644 --- a/letta/constants.py +++ b/letta/constants.py @@ -38,7 +38,8 @@ DEFAULT_PRESET = "memgpt_chat" # Base tools that cannot be edited, as they access agent state directly -BASE_TOOLS = ["send_message", "conversation_search", "conversation_search_date", "archival_memory_insert", "archival_memory_search"] +# Note that we don't include "conversation_search_date" for now +BASE_TOOLS = ["send_message", "conversation_search", "archival_memory_insert", "archival_memory_search"] O1_BASE_TOOLS = ["send_thinking_message", "send_final_message"] # Base memory tools CAN be edited, and are added by default by the server BASE_MEMORY_TOOLS = ["core_memory_append", "core_memory_replace"] diff --git a/letta/functions/function_sets/base.py b/letta/functions/function_sets/base.py index e35739dd64..f559bf4a7d 100644 --- a/letta/functions/function_sets/base.py +++ b/letta/functions/function_sets/base.py @@ -1,16 +1,6 @@ -from datetime import datetime from typing import Optional from letta.agent import Agent -from letta.constants import MAX_PAUSE_HEARTBEATS -from letta.services.agent_manager import AgentManager - -# import math -# from letta.utils import json_dumps - -### Functions / tools the agent can use -# All functions should return a response string (or None) -# If the function fails, throw an exception def send_message(self: "Agent", message: str) -> Optional[str]: @@ -28,36 +18,6 @@ def send_message(self: "Agent", message: str) -> Optional[str]: return None -# Construct the docstring dynamically (since it should use the external constants) -pause_heartbeats_docstring = f""" -Temporarily ignore timed heartbeats. You may still receive messages from manual heartbeats and other events. - -Args: - minutes (int): Number of minutes to ignore heartbeats for. Max value of {MAX_PAUSE_HEARTBEATS} minutes ({MAX_PAUSE_HEARTBEATS // 60} hours). - -Returns: - str: Function status response -""" - - -def pause_heartbeats(self: "Agent", minutes: int) -> Optional[str]: - import datetime - - from letta.constants import MAX_PAUSE_HEARTBEATS - - minutes = min(MAX_PAUSE_HEARTBEATS, minutes) - - # Record the current time - self.pause_heartbeats_start = datetime.datetime.now(datetime.timezone.utc) - # And record how long the pause should go for - self.pause_heartbeats_minutes = int(minutes) - - return f"Pausing timed heartbeats for {minutes} min" - - -pause_heartbeats.__doc__ = pause_heartbeats_docstring - - def conversation_search(self: "Agent", query: str, page: Optional[int] = 0) -> Optional[str]: """ Search prior conversation history using case-insensitive string matching. @@ -84,19 +44,19 @@ def conversation_search(self: "Agent", query: str, page: Optional[int] = 0) -> O count = RETRIEVAL_QUERY_DEFAULT_PAGE_SIZE # TODO: add paging by page number. currently cursor only works with strings. # original: start=page * count - results = self.message_manager.list_user_messages_for_agent( + messages = self.message_manager.list_user_messages_for_agent( agent_id=self.agent_state.id, actor=self.user, query_text=query, limit=count, ) - total = len(results) + total = len(messages) num_pages = math.ceil(total / count) - 1 # 0 index - if len(results) == 0: + if len(messages) == 0: results_str = f"No results found." else: - results_pref = f"Showing {len(results)} of {total} results (page {page}/{num_pages}):" - results_formatted = [f"timestamp: {d['timestamp']}, {d['message']['role']} - {d['message']['content']}" for d in results] + results_pref = f"Showing {len(messages)} of {total} results (page {page}/{num_pages}):" + results_formatted = [message.text for message in messages] results_str = f"{results_pref} {json_dumps(results_formatted)}" return results_str @@ -114,6 +74,7 @@ def conversation_search_date(self: "Agent", start_date: str, end_date: str, page str: Query result string """ import math + from datetime import datetime from letta.constants import RETRIEVAL_QUERY_DEFAULT_PAGE_SIZE from letta.utils import json_dumps @@ -142,7 +103,6 @@ def conversation_search_date(self: "Agent", start_date: str, end_date: str, page start_date=start_datetime, end_date=end_datetime, limit=count, - # start_date=start_date, end_date=end_date, limit=count, start=page * count ) total = len(results) num_pages = math.ceil(total / count) - 1 # 0 index @@ -186,10 +146,8 @@ def archival_memory_search(self: "Agent", query: str, page: Optional[int] = 0, s Returns: str: Query result string """ - import math from letta.constants import RETRIEVAL_QUERY_DEFAULT_PAGE_SIZE - from letta.utils import json_dumps if page is None or (isinstance(page, str) and page.lower().strip() == "none"): page = 0 @@ -198,7 +156,7 @@ def archival_memory_search(self: "Agent", query: str, page: Optional[int] = 0, s except: raise ValueError(f"'page' argument must be an integer") count = RETRIEVAL_QUERY_DEFAULT_PAGE_SIZE - + try: # Get results using passage manager all_results = self.agent_manager.list_passages( @@ -207,7 +165,7 @@ def archival_memory_search(self: "Agent", query: str, page: Optional[int] = 0, s query_text=query, limit=count + start, # Request enough results to handle offset embedding_config=self.agent_state.embedding_config, - embed_query=True + embed_query=True, ) # Apply pagination @@ -215,13 +173,7 @@ def archival_memory_search(self: "Agent", query: str, page: Optional[int] = 0, s paged_results = all_results[start:end] # Format results to match previous implementation - formatted_results = [ - { - "timestamp": str(result.created_at), - "content": result.text - } - for result in paged_results - ] + formatted_results = [{"timestamp": str(result.created_at), "content": result.text} for result in paged_results] return formatted_results, len(formatted_results) diff --git a/letta/functions/schema_generator.py b/letta/functions/schema_generator.py index 170bea3015..89409cb2be 100644 --- a/letta/functions/schema_generator.py +++ b/letta/functions/schema_generator.py @@ -386,7 +386,7 @@ def generate_schema(function, name: Optional[str] = None, description: Optional[ # append the heartbeat # TODO: don't hard-code # TODO: if terminal, don't include this - if function.__name__ not in ["send_message", "pause_heartbeats"]: + if function.__name__ not in ["send_message"]: schema["parameters"]["properties"]["request_heartbeat"] = { "type": "boolean", "description": "Request an immediate heartbeat after function execution. Set to `True` if you want to send a follow-up message or run a follow-up function.", diff --git a/letta/local_llm/function_parser.py b/letta/local_llm/function_parser.py index 6dd788da2a..0cb79edd24 100644 --- a/letta/local_llm/function_parser.py +++ b/letta/local_llm/function_parser.py @@ -3,7 +3,7 @@ from letta.utils import json_dumps, json_loads -NO_HEARTBEAT_FUNCS = ["send_message", "pause_heartbeats"] +NO_HEARTBEAT_FUNCS = ["send_message"] def insert_heartbeat(message): diff --git a/scripts/migrate_tools.py b/scripts/migrate_tools.py index 6ab9ed9e97..7ea6bac1d6 100644 --- a/scripts/migrate_tools.py +++ b/scripts/migrate_tools.py @@ -40,13 +40,3 @@ def deprecated_tool(): ), actor=fake_user, ) - - ToolManager().create_or_update_tool( - Tool( - name="pause_heartbeats", - source_code=source_code, - source_type=source_type, - description=description, - ), - actor=fake_user, - ) diff --git a/tests/conftest.py b/tests/conftest.py index 17ae8ef9c0..eb261d0fcb 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -22,3 +22,12 @@ def mock_e2b_api_key_none(): # Restore the original value of e2b_api_key tool_settings.e2b_api_key = original_api_key + + +@pytest.fixture +def check_e2b_key_is_set(): + from letta.settings import tool_settings + + original_api_key = tool_settings.e2b_api_key + assert original_api_key is not None, "Missing e2b key! Cannot execute these tests." + yield diff --git a/tests/integration_test_tool_execution_sandbox.py b/tests/integration_test_tool_execution_sandbox.py index 37597106a6..1b29073f43 100644 --- a/tests/integration_test_tool_execution_sandbox.py +++ b/tests/integration_test_tool_execution_sandbox.py @@ -8,7 +8,7 @@ from sqlalchemy import delete from letta import create_client -from letta.functions.function_sets.base import core_memory_replace +from letta.functions.function_sets.base import core_memory_append, core_memory_replace from letta.orm import SandboxConfig, SandboxEnvironmentVariable from letta.schemas.agent import AgentState from letta.schemas.embedding_config import EmbeddingConfig @@ -57,13 +57,6 @@ def clear_tables(): Sandbox.connect(sandbox.sandbox_id).kill() -@pytest.fixture -def check_e2b_key_is_set(): - original_api_key = tool_settings.e2b_api_key - assert original_api_key is not None, "Missing e2b key! Cannot execute these tests." - yield - - @pytest.fixture def check_composio_key_set(): original_api_key = tool_settings.composio_api_key @@ -217,13 +210,6 @@ def clear_memory(agent_state: AgentState): yield tool -@pytest.fixture -def core_memory_replace_tool(test_user): - tool = create_tool_from_func(core_memory_replace) - tool = ToolManager().create_or_update_tool(tool, test_user) - yield tool - - @pytest.fixture def external_codebase_tool(test_user): from tests.test_tool_sandbox.restaurant_management_system.adjust_menu_prices import ( @@ -273,6 +259,21 @@ def custom_test_sandbox_config(test_user): return manager, local_sandbox_config +# Tool-specific fixtures +@pytest.fixture +def core_memory_tools(test_user): + """Create all base tools for testing.""" + tools = {} + for func in [ + core_memory_replace, + core_memory_append, + ]: + tool = create_tool_from_func(func) + tool = ToolManager().create_or_update_tool(tool, test_user) + tools[func.__name__] = tool + yield tools + + # Local sandbox tests @@ -303,30 +304,6 @@ def test_local_sandbox_stateful_tool(mock_e2b_api_key_none, clear_core_memory_to assert result.func_return is None -@pytest.mark.local_sandbox -def test_local_sandbox_core_memory_replace(mock_e2b_api_key_none, core_memory_replace_tool, test_user, agent_state): - new_name = "Matt" - args = {"label": "human", "old_content": "Chad", "new_content": new_name} - sandbox = ToolExecutionSandbox(core_memory_replace_tool.name, args, user_id=test_user.id) - - # run the sandbox - result = sandbox.run(agent_state=agent_state) - assert new_name in result.agent_state.memory.get_block("human").value - assert result.func_return is None - - -@pytest.mark.local_sandbox -def test_local_sandbox_core_memory_replace_errors(mock_e2b_api_key_none, core_memory_replace_tool, test_user, agent_state): - nonexistent_name = "Alexander Wang" - args = {"label": "human", "old_content": nonexistent_name, "new_content": "Matt"} - sandbox = ToolExecutionSandbox(core_memory_replace_tool.name, args, user_id=test_user.id) - - # run the sandbox - result = sandbox.run(agent_state=agent_state) - assert len(result.stderr) != 0, "stderr not empty" - assert f"ValueError: Old content '{nonexistent_name}' not found in memory block 'human'" in result.stderr[0], "stderr contains expected error" - - @pytest.mark.local_sandbox def test_local_sandbox_with_list_rv(mock_e2b_api_key_none, list_tool, test_user): sandbox = ToolExecutionSandbox(list_tool.name, {}, user_id=test_user.id) @@ -474,42 +451,6 @@ def test_e2b_sandbox_stateful_tool(check_e2b_key_is_set, clear_core_memory_tool, assert result.func_return is None -@pytest.mark.e2b_sandbox -def test_e2b_sandbox_core_memory_replace(check_e2b_key_is_set, core_memory_replace_tool, test_user, agent_state): - new_name = "Matt" - args = {"label": "human", "old_content": "Chad", "new_content": new_name} - sandbox = ToolExecutionSandbox(core_memory_replace_tool.name, args, user_id=test_user.id) - - # run the sandbox - result = sandbox.run(agent_state=agent_state) - assert new_name in result.agent_state.memory.get_block("human").value - assert result.func_return is None - - -@pytest.mark.e2b_sandbox -def test_e2b_sandbox_escape_strings_in_args(check_e2b_key_is_set, core_memory_replace_tool, test_user, agent_state): - new_name = "Matt" - args = {"label": "human", "old_content": "Chad", "new_content": new_name + "\n"} - sandbox = ToolExecutionSandbox(core_memory_replace_tool.name, args, user_id=test_user.id) - - # run the sandbox - result = sandbox.run(agent_state=agent_state) - assert new_name in result.agent_state.memory.get_block("human").value - assert result.func_return is None - - -@pytest.mark.e2b_sandbox -def test_e2b_sandbox_core_memory_replace_errors(check_e2b_key_is_set, core_memory_replace_tool, test_user, agent_state): - nonexistent_name = "Alexander Wang" - args = {"label": "human", "old_content": nonexistent_name, "new_content": "Matt"} - sandbox = ToolExecutionSandbox(core_memory_replace_tool.name, args, user_id=test_user.id) - - # run the sandbox - result = sandbox.run(agent_state=agent_state) - assert len(result.stderr) != 0, "stderr not empty" - assert f"ValueError: Old content '{nonexistent_name}' not found in memory block 'human'" in result.stderr[0], "stderr contains expected error" - - @pytest.mark.e2b_sandbox def test_e2b_sandbox_inject_env_var_existing_sandbox(check_e2b_key_is_set, get_env_tool, test_user): manager = SandboxConfigManager(tool_settings) @@ -585,3 +526,79 @@ def test_e2b_e2e_composio_star_github(check_e2b_key_is_set, check_composio_key_s result = ToolExecutionSandbox(composio_github_star_tool.name, {"owner": "letta-ai", "repo": "letta"}, user_id=test_user.id).run() assert result.func_return["details"] == "Action executed successfully" + + +# Core memory integration tests +class TestCoreMemoryTools: + """ + Tests for core memory manipulation tools. + Tests run in both local sandbox and e2b environments. + """ + + # Local sandbox tests + @pytest.mark.local_sandbox + def test_core_memory_replace_local(self, mock_e2b_api_key_none, core_memory_tools, test_user, agent_state): + """Test successful replacement of content in core memory - local sandbox.""" + new_name = "Charles" + args = {"label": "human", "old_content": "Chad", "new_content": new_name} + sandbox = ToolExecutionSandbox(core_memory_tools["core_memory_replace"].name, args, user_id=test_user.id) + + result = sandbox.run(agent_state=agent_state) + assert new_name in result.agent_state.memory.get_block("human").value + assert result.func_return is None + + @pytest.mark.local_sandbox + def test_core_memory_append_local(self, mock_e2b_api_key_none, core_memory_tools, test_user, agent_state): + """Test successful appending of content to core memory - local sandbox.""" + append_text = "\nLikes coffee" + args = {"label": "human", "content": append_text} + sandbox = ToolExecutionSandbox(core_memory_tools["core_memory_append"].name, args, user_id=test_user.id) + + result = sandbox.run(agent_state=agent_state) + assert append_text in result.agent_state.memory.get_block("human").value + assert result.func_return is None + + @pytest.mark.local_sandbox + def test_core_memory_replace_error_local(self, mock_e2b_api_key_none, core_memory_tools, test_user, agent_state): + """Test error handling when trying to replace non-existent content - local sandbox.""" + nonexistent_name = "Alexander Wang" + args = {"label": "human", "old_content": nonexistent_name, "new_content": "Charles"} + sandbox = ToolExecutionSandbox(core_memory_tools["core_memory_replace"].name, args, user_id=test_user.id) + + result = sandbox.run(agent_state=agent_state) + assert len(result.stderr) != 0 + assert f"ValueError: Old content '{nonexistent_name}' not found in memory block 'human'" in result.stderr[0] + + # E2B sandbox tests + @pytest.mark.e2b_sandbox + def test_core_memory_replace_e2b(self, check_e2b_key_is_set, core_memory_tools, test_user, agent_state): + """Test successful replacement of content in core memory - e2b sandbox.""" + new_name = "Charles" + args = {"label": "human", "old_content": "Chad", "new_content": new_name} + sandbox = ToolExecutionSandbox(core_memory_tools["core_memory_replace"].name, args, user_id=test_user.id) + + result = sandbox.run(agent_state=agent_state) + assert new_name in result.agent_state.memory.get_block("human").value + assert result.func_return is None + + @pytest.mark.e2b_sandbox + def test_core_memory_append_e2b(self, check_e2b_key_is_set, core_memory_tools, test_user, agent_state): + """Test successful appending of content to core memory - e2b sandbox.""" + append_text = "\nLikes coffee" + args = {"label": "human", "content": append_text} + sandbox = ToolExecutionSandbox(core_memory_tools["core_memory_append"].name, args, user_id=test_user.id) + + result = sandbox.run(agent_state=agent_state) + assert append_text in result.agent_state.memory.get_block("human").value + assert result.func_return is None + + @pytest.mark.e2b_sandbox + def test_core_memory_replace_error_e2b(self, check_e2b_key_is_set, core_memory_tools, test_user, agent_state): + """Test error handling when trying to replace non-existent content - e2b sandbox.""" + nonexistent_name = "Alexander Wang" + args = {"label": "human", "old_content": nonexistent_name, "new_content": "Charles"} + sandbox = ToolExecutionSandbox(core_memory_tools["core_memory_replace"].name, args, user_id=test_user.id) + + result = sandbox.run(agent_state=agent_state) + assert len(result.stderr) != 0 + assert f"ValueError: Old content '{nonexistent_name}' not found in memory block 'human'" in result.stderr[0] diff --git a/tests/test_base_functions.py b/tests/test_base_functions.py index 8144671969..5b5bec6f4f 100644 --- a/tests/test_base_functions.py +++ b/tests/test_base_functions.py @@ -1,28 +1,25 @@ import pytest import letta.functions.function_sets.base as base_functions -from letta import create_client +from letta import LocalClient, create_client from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.llm_config import LLMConfig -from .utils import wipe_config - -# test_agent_id = "test_agent" -client = None - @pytest.fixture(scope="module") -def agent_obj(): - """Create a test agent that we can call functions on""" - wipe_config() - global client +def client(): client = create_client() client.set_default_llm_config(LLMConfig.default_config("gpt-4o-mini")) client.set_default_embedding_config(EmbeddingConfig.default_config(provider="openai")) + yield client + + +@pytest.fixture(scope="module") +def agent_obj(client: LocalClient): + """Create a test agent that we can call functions on""" agent_state = client.create_agent() - global agent_obj agent_obj = client.server.load_agent(agent_id=agent_state.id, actor=client.user) yield agent_obj @@ -88,7 +85,15 @@ def test_archival(agent_obj): pass -def test_recall(agent_obj): - base_functions.conversation_search(agent_obj, "banana") - base_functions.conversation_search(agent_obj, "banana", page=0) - base_functions.conversation_search_date(agent_obj, start_date="2022-01-01", end_date="2022-01-02") +def test_recall(client, agent_obj): + # keyword + keyword = "banana" + + # Send messages to agent + client.send_message(agent_id=agent_obj.agent_state.id, role="user", message="hello") + client.send_message(agent_id=agent_obj.agent_state.id, role="user", message=keyword) + client.send_message(agent_id=agent_obj.agent_state.id, role="user", message="tell me a fun fact") + + # Conversation search + result = base_functions.conversation_search(agent_obj, "banana") + assert keyword in result From c1f7b32001ec7a620fddf057295649eefeecbae3 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Tue, 17 Dec 2024 16:18:11 -0800 Subject: [PATCH 102/280] fix: Deprecate in memory function stores in agent.py (#2271) --- letta/agent.py | 83 ++++++++----------- letta/server/rest_api/routers/v1/tools.py | 2 +- letta/server/server.py | 25 +----- letta/services/tool_execution_sandbox.py | 27 +++--- tests/helpers/endpoints_helper.py | 3 +- ...integration_test_tool_execution_sandbox.py | 52 ++++++------ tests/test_server.py | 27 +++--- 7 files changed, 93 insertions(+), 126 deletions(-) diff --git a/letta/agent.py b/letta/agent.py index 810f821513..532c4e13a7 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -18,7 +18,7 @@ MESSAGE_SUMMARY_WARNING_FRAC, O1_BASE_TOOLS, REQ_HEARTBEAT_MESSAGE, - STRUCTURED_OUTPUT_MODELS + STRUCTURED_OUTPUT_MODELS, ) from letta.errors import LLMError from letta.helpers import ToolRulesSolver @@ -260,9 +260,6 @@ def __init__( self.user = user - # link tools - self.link_tools(agent_state.tools) - # initialize a tool rules solver if agent_state.tool_rules: # if there are tool rules, print out a warning @@ -385,7 +382,9 @@ def __init__( def check_tool_rules(self): if self.model not in STRUCTURED_OUTPUT_MODELS: if len(self.tool_rules_solver.init_tool_rules) > 1: - raise ValueError("Multiple initial tools are not supported for non-structured models. Please use only one initial tool rule.") + raise ValueError( + "Multiple initial tools are not supported for non-structured models. Please use only one initial tool rule." + ) self.supports_structured_output = False else: self.supports_structured_output = True @@ -424,11 +423,21 @@ def update_memory_if_change(self, new_memory: Memory) -> bool: return True return False - def execute_tool_and_persist_state(self, function_name, function_to_call, function_args): + def execute_tool_and_persist_state(self, function_name: str, function_args: dict, target_letta_tool: Tool): """ Execute tool modifications and persist the state of the agent. Note: only some agent state modifications will be persisted, such as data in the AgentState ORM and block data """ + # TODO: Get rid of this. This whole piece is pretty shady, that we exec the function to just get the type hints for args. + env = {} + env.update(globals()) + exec(target_letta_tool.source_code, env) + callable_func = env[target_letta_tool.json_schema["name"]] + spec = inspect.getfullargspec(callable_func).annotations + for name, arg in function_args.items(): + if isinstance(function_args[name], dict): + function_args[name] = spec[name](**function_args[name]) + # TODO: add agent manager here orig_memory_str = self.agent_state.memory.compile() @@ -441,11 +450,11 @@ def execute_tool_and_persist_state(self, function_name, function_to_call, functi if function_name in BASE_TOOLS or function_name in O1_BASE_TOOLS: # base tools are allowed to access the `Agent` object and run on the database function_args["self"] = self # need to attach self to arg since it's dynamically linked - function_response = function_to_call(**function_args) + function_response = callable_func(**function_args) else: # execute tool in a sandbox # TODO: allow agent_state to specify which sandbox to execute tools in - sandbox_run_result = ToolExecutionSandbox(function_name, function_args, self.agent_state.created_by_id).run( + sandbox_run_result = ToolExecutionSandbox(function_name, function_args, self.user).run( agent_state=self.agent_state.__deepcopy__() ) function_response, updated_agent_state = sandbox_run_result.func_return, sandbox_run_result.agent_state @@ -470,27 +479,6 @@ def messages(self) -> List[dict]: def messages(self, value): raise Exception("Modifying message list directly not allowed") - def link_tools(self, tools: List[Tool]): - """Bind a tool object (schema + python function) to the agent object""" - - # Store the functions schemas (this is passed as an argument to ChatCompletion) - self.functions = [] - self.functions_python = {} - env = {} - env.update(globals()) - for tool in tools: - try: - # WARNING: name may not be consistent? - # if tool.module: # execute the whole module - # exec(tool.module, env) - # else: - exec(tool.source_code, env) - self.functions_python[tool.json_schema["name"]] = env[tool.json_schema["name"]] - self.functions.append(tool.json_schema) - except Exception: - warnings.warn(f"WARNING: tool {tool.name} failed to link") - assert all([callable(f) for k, f in self.functions_python.items()]), self.functions_python - def _load_messages_from_recall(self, message_ids: List[str]) -> List[Message]: """Load a list of messages from recall storage""" @@ -599,8 +587,12 @@ def _get_ai_reply( """Get response from LLM API with robust retry mechanism.""" allowed_tool_names = self.tool_rules_solver.get_allowed_tool_names() + agent_state_tool_jsons = [t.json_schema for t in self.agent_state.tools] + allowed_functions = ( - self.functions if not allowed_tool_names else [func for func in self.functions if func["name"] in allowed_tool_names] + agent_state_tool_jsons + if not allowed_tool_names + else [func for func in agent_state_tool_jsons if func["name"] in allowed_tool_names] ) # For the first message, force the initial tool if one is specified @@ -620,7 +612,7 @@ def _get_ai_reply( messages=message_sequence, user_id=self.agent_state.created_by_id, functions=allowed_functions, - functions_python=self.functions_python, + # functions_python=self.functions_python, do we need this? function_call=function_call, first_message=first_message, force_tool_call=force_tool_call, @@ -729,10 +721,13 @@ def _handle_ai_response( function_name = function_call.name printd(f"Request to call function {function_name} with tool_call_id: {tool_call_id}") - # Failure case 1: function name is wrong - try: - function_to_call = self.functions_python[function_name] - except KeyError: + # Failure case 1: function name is wrong (not in agent_state.tools) + target_letta_tool = None + for t in self.agent_state.tools: + if t.name == function_name: + target_letta_tool = t + + if not target_letta_tool: error_msg = f"No function named {function_name}" function_response = package_function_response(False, error_msg) messages.append( @@ -800,14 +795,8 @@ def _handle_ai_response( # this is because the function/tool role message is only created once the function/tool has executed/returned self.interface.function_message(f"Running {function_name}({function_args})", msg_obj=messages[-1]) try: - spec = inspect.getfullargspec(function_to_call).annotations - - for name, arg in function_args.items(): - if isinstance(function_args[name], dict): - function_args[name] = spec[name](**function_args[name]) - # handle tool execution (sandbox) and state updates - function_response = self.execute_tool_and_persist_state(function_name, function_to_call, function_args) + function_response = self.execute_tool_and_persist_state(function_name, function_args, target_letta_tool) # handle trunction if function_name in ["conversation_search", "conversation_search_date", "archival_memory_search"]: @@ -819,8 +808,7 @@ def _handle_ai_response( truncate = True # get the function response limit - tool_obj = [tool for tool in self.agent_state.tools if tool.name == function_name][0] - return_char_limit = tool_obj.return_char_limit + return_char_limit = target_letta_tool.return_char_limit function_response_string = validate_function_response( function_response, return_char_limit=return_char_limit, truncate=truncate ) @@ -1564,9 +1552,10 @@ def get_context_window(self) -> ContextWindowOverview: num_tokens_external_memory_summary = count_tokens(external_memory_summary) # tokens taken up by function definitions - if self.functions: - available_functions_definitions = [ChatCompletionRequestTool(type="function", function=f) for f in self.functions] - num_tokens_available_functions_definitions = num_tokens_from_functions(functions=self.functions, model=self.model) + agent_state_tool_jsons = [t.json_schema for t in self.agent_state.tools] + if agent_state_tool_jsons: + available_functions_definitions = [ChatCompletionRequestTool(type="function", function=f) for f in agent_state_tool_jsons] + num_tokens_available_functions_definitions = num_tokens_from_functions(functions=agent_state_tool_jsons, model=self.model) else: available_functions_definitions = [] num_tokens_available_functions_definitions = 0 diff --git a/letta/server/rest_api/routers/v1/tools.py b/letta/server/rest_api/routers/v1/tools.py index e1eb591951..61b89624d4 100644 --- a/letta/server/rest_api/routers/v1/tools.py +++ b/letta/server/rest_api/routers/v1/tools.py @@ -195,7 +195,7 @@ def run_tool_from_source( tool_source_type=request.source_type, tool_args=request.args, tool_name=request.name, - user_id=actor.id, + actor=actor, ) except LettaToolCreateError as e: # HTTP 400 == Bad Request diff --git a/letta/server/server.py b/letta/server/server.py index fa9ca8ed9f..31c87394d7 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -853,10 +853,6 @@ def update_agent( # then (2) setting the attributes ._messages and .state.message_ids letta_agent.set_message_buffer(message_ids=request.message_ids) - # tools - if request.tool_ids: - letta_agent.link_tools(letta_agent.agent_state.tools) - letta_agent.update_state() return agent_state @@ -882,11 +878,6 @@ def add_tool_to_agent( agent_state = self.agent_manager.attach_tool(agent_id=agent_id, tool_id=tool_id, actor=actor) - # TODO: This is very redundant, and should probably be simplified - # Get the agent object (loaded in memory) - letta_agent = self.load_agent(agent_id=agent_id, actor=actor) - letta_agent.link_tools(agent_state.tools) - return agent_state def remove_tool_from_agent( @@ -900,10 +891,6 @@ def remove_tool_from_agent( actor = self.user_manager.get_user_or_default(user_id=user_id) agent_state = self.agent_manager.detach_tool(agent_id=agent_id, tool_id=tool_id, actor=actor) - # Get the agent object (loaded in memory) - letta_agent = self.load_agent(agent_id=agent_id, actor=actor) - letta_agent.link_tools(agent_state.tools) - return agent_state # convert name->id @@ -1309,9 +1296,7 @@ def get_llm_config_from_handle(self, handle: str, context_window_limit: Optional if context_window_limit: if context_window_limit > llm_config.context_window: - raise ValueError( - f"Context window limit ({context_window_limit}) is greater than maximum of ({llm_config.context_window})" - ) + raise ValueError(f"Context window limit ({context_window_limit}) is greater than maximum of ({llm_config.context_window})") llm_config.context_window = context_window_limit return llm_config @@ -1366,7 +1351,7 @@ def get_agent_context_window( def run_tool_from_source( self, - user_id: str, + actor: User, tool_args: str, tool_source: str, tool_source_type: Optional[str] = None, @@ -1394,7 +1379,7 @@ def run_tool_from_source( # Next, attempt to run the tool with the sandbox try: - sandbox_run_result = ToolExecutionSandbox(tool.name, tool_args_dict, user_id, tool_object=tool).run(agent_state=agent_state) + sandbox_run_result = ToolExecutionSandbox(tool.name, tool_args_dict, actor, tool_object=tool).run(agent_state=agent_state) return FunctionReturn( id="null", function_call_id="null", @@ -1406,9 +1391,7 @@ def run_tool_from_source( ) except Exception as e: - func_return = get_friendly_error_msg( - function_name=tool.name, exception_name=type(e).__name__, exception_message=str(e) - ) + func_return = get_friendly_error_msg(function_name=tool.name, exception_name=type(e).__name__, exception_message=str(e)) return FunctionReturn( id="null", function_call_id="null", diff --git a/letta/services/tool_execution_sandbox.py b/letta/services/tool_execution_sandbox.py index b6004c3c74..fc6e1bdd38 100644 --- a/letta/services/tool_execution_sandbox.py +++ b/letta/services/tool_execution_sandbox.py @@ -16,9 +16,9 @@ from letta.schemas.agent import AgentState from letta.schemas.sandbox_config import SandboxConfig, SandboxRunResult, SandboxType from letta.schemas.tool import Tool +from letta.schemas.user import User from letta.services.sandbox_config_manager import SandboxConfigManager from letta.services.tool_manager import ToolManager -from letta.services.user_manager import UserManager from letta.settings import tool_settings from letta.utils import get_friendly_error_msg @@ -38,14 +38,10 @@ class ToolExecutionSandbox: # We make this a long random string to avoid collisions with any variables in the user's code LOCAL_SANDBOX_RESULT_VAR_NAME = "result_ZQqiequkcFwRwwGQMqkt" - def __init__(self, tool_name: str, args: dict, user_id: str, force_recreate=False, tool_object: Optional[Tool] = None): + def __init__(self, tool_name: str, args: dict, user: User, force_recreate=False, tool_object: Optional[Tool] = None): self.tool_name = tool_name self.args = args - - # Get the user - # This user corresponds to the agent_state's user_id field - # agent_state is the state of the agent that invoked this run - self.user = UserManager().get_user_by_id(user_id=user_id) + self.user = user # If a tool object is provided, we use it directly, otherwise pull via name if tool_object is not None: @@ -184,7 +180,9 @@ def run_local_dir_sandbox_venv(self, sbx_config: SandboxConfig, env: Dict[str, s except subprocess.CalledProcessError as e: logger.error(f"Executing tool {self.tool_name} has process error: {e}") func_return = get_friendly_error_msg( - function_name=self.tool_name, exception_name=type(e).__name__, exception_message=str(e), + function_name=self.tool_name, + exception_name=type(e).__name__, + exception_message=str(e), ) return SandboxRunResult( func_return=func_return, @@ -202,9 +200,7 @@ def run_local_dir_sandbox_venv(self, sbx_config: SandboxConfig, env: Dict[str, s logger.error(f"Executing tool {self.tool_name} has an unexpected error: {e}") raise e - def run_local_dir_sandbox_runpy( - self, sbx_config: SandboxConfig, env_vars: Dict[str, str], temp_file_path: str - ) -> SandboxRunResult: + def run_local_dir_sandbox_runpy(self, sbx_config: SandboxConfig, env_vars: Dict[str, str], temp_file_path: str) -> SandboxRunResult: status = "success" agent_state, stderr = None, None @@ -225,9 +221,7 @@ def run_local_dir_sandbox_runpy( func_return, agent_state = self.parse_best_effort(func_result) except Exception as e: - func_return = get_friendly_error_msg( - function_name=self.tool_name, exception_name=type(e).__name__, exception_message=str(e) - ) + func_return = get_friendly_error_msg(function_name=self.tool_name, exception_name=type(e).__name__, exception_message=str(e)) traceback.print_exc(file=sys.stderr) status = "error" @@ -248,7 +242,7 @@ def run_local_dir_sandbox_runpy( def parse_out_function_results_markers(self, text: str): if self.LOCAL_SANDBOX_RESULT_START_MARKER not in text: - return '', text + return "", text marker_len = len(self.LOCAL_SANDBOX_RESULT_START_MARKER) start_index = text.index(self.LOCAL_SANDBOX_RESULT_START_MARKER) + marker_len end_index = text.index(self.LOCAL_SANDBOX_RESULT_END_MARKER) @@ -293,6 +287,7 @@ def run_e2b_sandbox(self, agent_state: AgentState) -> SandboxRunResult: env_vars = self.sandbox_config_manager.get_sandbox_env_vars_as_dict(sandbox_config_id=sbx_config.id, actor=self.user, limit=100) code = self.generate_execution_script(agent_state=agent_state) execution = sbx.run_code(code, envs=env_vars) + if execution.results: func_return, agent_state = self.parse_best_effort(execution.results[0].text) elif execution.error: @@ -303,7 +298,7 @@ def run_e2b_sandbox(self, agent_state: AgentState) -> SandboxRunResult: execution.logs.stderr.append(execution.error.traceback) else: raise ValueError(f"Tool {self.tool_name} returned execution with None") - + return SandboxRunResult( func_return=func_return, agent_state=agent_state, diff --git a/tests/helpers/endpoints_helper.py b/tests/helpers/endpoints_helper.py index fbe7ffb60b..ddaa1d960d 100644 --- a/tests/helpers/endpoints_helper.py +++ b/tests/helpers/endpoints_helper.py @@ -110,8 +110,7 @@ def check_first_response_is_valid_for_llm_endpoint(filename: str) -> ChatComplet llm_config=agent_state.llm_config, user_id=str(uuid.UUID(int=1)), # dummy user_id messages=agent._messages, - functions=agent.functions, - functions_python=agent.functions_python, + functions=[t.json_schema for t in agent.agent_state.tools], ) # Basic check diff --git a/tests/integration_test_tool_execution_sandbox.py b/tests/integration_test_tool_execution_sandbox.py index 1b29073f43..299e1e967b 100644 --- a/tests/integration_test_tool_execution_sandbox.py +++ b/tests/integration_test_tool_execution_sandbox.py @@ -283,12 +283,12 @@ def test_local_sandbox_default(mock_e2b_api_key_none, add_integers_tool, test_us # Mock and assert correct pathway was invoked with patch.object(ToolExecutionSandbox, "run_local_dir_sandbox") as mock_run_local_dir_sandbox: - sandbox = ToolExecutionSandbox(add_integers_tool.name, args, user_id=test_user.id) + sandbox = ToolExecutionSandbox(add_integers_tool.name, args, user=test_user) sandbox.run() mock_run_local_dir_sandbox.assert_called_once() # Run again to get actual response - sandbox = ToolExecutionSandbox(add_integers_tool.name, args, user_id=test_user.id) + sandbox = ToolExecutionSandbox(add_integers_tool.name, args, user=test_user) result = sandbox.run() assert result.func_return == args["x"] + args["y"] @@ -297,7 +297,7 @@ def test_local_sandbox_default(mock_e2b_api_key_none, add_integers_tool, test_us def test_local_sandbox_stateful_tool(mock_e2b_api_key_none, clear_core_memory_tool, test_user, agent_state): args = {} # Run again to get actual response - sandbox = ToolExecutionSandbox(clear_core_memory_tool.name, args, user_id=test_user.id) + sandbox = ToolExecutionSandbox(clear_core_memory_tool.name, args, user=test_user) result = sandbox.run(agent_state=agent_state) assert result.agent_state.memory.get_block("human").value == "" assert result.agent_state.memory.get_block("persona").value == "" @@ -306,7 +306,7 @@ def test_local_sandbox_stateful_tool(mock_e2b_api_key_none, clear_core_memory_to @pytest.mark.local_sandbox def test_local_sandbox_with_list_rv(mock_e2b_api_key_none, list_tool, test_user): - sandbox = ToolExecutionSandbox(list_tool.name, {}, user_id=test_user.id) + sandbox = ToolExecutionSandbox(list_tool.name, {}, user=test_user) result = sandbox.run() assert len(result.func_return) == 5 @@ -331,7 +331,7 @@ def test_local_sandbox_env(mock_e2b_api_key_none, get_env_tool, test_user): args = {} # Run the custom sandbox - sandbox = ToolExecutionSandbox(get_env_tool.name, args, user_id=test_user.id) + sandbox = ToolExecutionSandbox(get_env_tool.name, args, user=test_user) result = sandbox.run() assert long_random_string in result.func_return @@ -349,7 +349,7 @@ def test_local_sandbox_e2e_composio_star_github(mock_e2b_api_key_none, check_com actor=test_user, ) - result = ToolExecutionSandbox(composio_github_star_tool.name, {"owner": "letta-ai", "repo": "letta"}, user_id=test_user.id).run() + result = ToolExecutionSandbox(composio_github_star_tool.name, {"owner": "letta-ai", "repo": "letta"}, user=test_user).run() assert result.func_return["details"] == "Action executed successfully" @@ -359,7 +359,7 @@ def test_local_sandbox_external_codebase(mock_e2b_api_key_none, custom_test_sand args = {"percentage": 10} # Run again to get actual response - sandbox = ToolExecutionSandbox(external_codebase_tool.name, args, user_id=test_user.id) + sandbox = ToolExecutionSandbox(external_codebase_tool.name, args, user=test_user) result = sandbox.run() # Assert that the function return is correct @@ -371,14 +371,14 @@ def test_local_sandbox_external_codebase(mock_e2b_api_key_none, custom_test_sand def test_local_sandbox_with_venv_and_warnings_does_not_error( mock_e2b_api_key_none, custom_test_sandbox_config, get_warning_tool, test_user ): - sandbox = ToolExecutionSandbox(get_warning_tool.name, {}, user_id=test_user.id) + sandbox = ToolExecutionSandbox(get_warning_tool.name, {}, user=test_user) result = sandbox.run() assert result.func_return == "Hello World" @pytest.mark.e2b_sandbox def test_local_sandbox_with_venv_errors(mock_e2b_api_key_none, custom_test_sandbox_config, always_err_tool, test_user): - sandbox = ToolExecutionSandbox(always_err_tool.name, {}, user_id=test_user.id) + sandbox = ToolExecutionSandbox(always_err_tool.name, {}, user=test_user) # run the sandbox result = sandbox.run() @@ -397,12 +397,12 @@ def test_e2b_sandbox_default(check_e2b_key_is_set, add_integers_tool, test_user) # Mock and assert correct pathway was invoked with patch.object(ToolExecutionSandbox, "run_e2b_sandbox") as mock_run_local_dir_sandbox: - sandbox = ToolExecutionSandbox(add_integers_tool.name, args, user_id=test_user.id) + sandbox = ToolExecutionSandbox(add_integers_tool.name, args, user=test_user) sandbox.run() mock_run_local_dir_sandbox.assert_called_once() # Run again to get actual response - sandbox = ToolExecutionSandbox(add_integers_tool.name, args, user_id=test_user.id) + sandbox = ToolExecutionSandbox(add_integers_tool.name, args, user=test_user) result = sandbox.run() assert int(result.func_return) == args["x"] + args["y"] @@ -420,14 +420,14 @@ def test_e2b_sandbox_pip_installs(check_e2b_key_is_set, cowsay_tool, test_user): SandboxEnvironmentVariableCreate(key=key, value=long_random_string), sandbox_config_id=config.id, actor=test_user ) - sandbox = ToolExecutionSandbox(cowsay_tool.name, {}, user_id=test_user.id) + sandbox = ToolExecutionSandbox(cowsay_tool.name, {}, user=test_user) result = sandbox.run() assert long_random_string in result.stdout[0] @pytest.mark.e2b_sandbox def test_e2b_sandbox_reuses_same_sandbox(check_e2b_key_is_set, list_tool, test_user): - sandbox = ToolExecutionSandbox(list_tool.name, {}, user_id=test_user.id) + sandbox = ToolExecutionSandbox(list_tool.name, {}, user=test_user) # Run the function once result = sandbox.run() @@ -442,7 +442,7 @@ def test_e2b_sandbox_reuses_same_sandbox(check_e2b_key_is_set, list_tool, test_u @pytest.mark.e2b_sandbox def test_e2b_sandbox_stateful_tool(check_e2b_key_is_set, clear_core_memory_tool, test_user, agent_state): - sandbox = ToolExecutionSandbox(clear_core_memory_tool.name, {}, user_id=test_user.id) + sandbox = ToolExecutionSandbox(clear_core_memory_tool.name, {}, user=test_user) # run the sandbox result = sandbox.run(agent_state=agent_state) @@ -458,7 +458,7 @@ def test_e2b_sandbox_inject_env_var_existing_sandbox(check_e2b_key_is_set, get_e config = manager.create_or_update_sandbox_config(config_create, test_user) # Run the custom sandbox once, assert nothing returns because missing env variable - sandbox = ToolExecutionSandbox(get_env_tool.name, {}, user_id=test_user.id, force_recreate=True) + sandbox = ToolExecutionSandbox(get_env_tool.name, {}, user=test_user, force_recreate=True) result = sandbox.run() # response should be None assert result.func_return is None @@ -471,7 +471,7 @@ def test_e2b_sandbox_inject_env_var_existing_sandbox(check_e2b_key_is_set, get_e ) # Assert that the environment variable gets injected correctly, even when the sandbox is NOT refreshed - sandbox = ToolExecutionSandbox(get_env_tool.name, {}, user_id=test_user.id) + sandbox = ToolExecutionSandbox(get_env_tool.name, {}, user=test_user) result = sandbox.run() assert long_random_string in result.func_return @@ -487,7 +487,7 @@ def test_e2b_sandbox_config_change_force_recreates_sandbox(check_e2b_key_is_set, config = manager.create_or_update_sandbox_config(config_create, test_user) # Run the custom sandbox once, assert a failure gets returned because missing environment variable - sandbox = ToolExecutionSandbox(list_tool.name, {}, user_id=test_user.id) + sandbox = ToolExecutionSandbox(list_tool.name, {}, user=test_user) result = sandbox.run() assert len(result.func_return) == 5 old_config_fingerprint = result.sandbox_config_fingerprint @@ -497,7 +497,7 @@ def test_e2b_sandbox_config_change_force_recreates_sandbox(check_e2b_key_is_set, config = manager.update_sandbox_config(config.id, config_update, test_user) # Run again - result = ToolExecutionSandbox(list_tool.name, {}, user_id=test_user.id).run() + result = ToolExecutionSandbox(list_tool.name, {}, user=test_user).run() new_config_fingerprint = result.sandbox_config_fingerprint assert config.fingerprint() == new_config_fingerprint @@ -507,7 +507,7 @@ def test_e2b_sandbox_config_change_force_recreates_sandbox(check_e2b_key_is_set, @pytest.mark.e2b_sandbox def test_e2b_sandbox_with_list_rv(check_e2b_key_is_set, list_tool, test_user): - sandbox = ToolExecutionSandbox(list_tool.name, {}, user_id=test_user.id) + sandbox = ToolExecutionSandbox(list_tool.name, {}, user=test_user) result = sandbox.run() assert len(result.func_return) == 5 @@ -524,7 +524,7 @@ def test_e2b_e2e_composio_star_github(check_e2b_key_is_set, check_composio_key_s actor=test_user, ) - result = ToolExecutionSandbox(composio_github_star_tool.name, {"owner": "letta-ai", "repo": "letta"}, user_id=test_user.id).run() + result = ToolExecutionSandbox(composio_github_star_tool.name, {"owner": "letta-ai", "repo": "letta"}, user=test_user).run() assert result.func_return["details"] == "Action executed successfully" @@ -541,7 +541,7 @@ def test_core_memory_replace_local(self, mock_e2b_api_key_none, core_memory_tool """Test successful replacement of content in core memory - local sandbox.""" new_name = "Charles" args = {"label": "human", "old_content": "Chad", "new_content": new_name} - sandbox = ToolExecutionSandbox(core_memory_tools["core_memory_replace"].name, args, user_id=test_user.id) + sandbox = ToolExecutionSandbox(core_memory_tools["core_memory_replace"].name, args, user=test_user) result = sandbox.run(agent_state=agent_state) assert new_name in result.agent_state.memory.get_block("human").value @@ -552,7 +552,7 @@ def test_core_memory_append_local(self, mock_e2b_api_key_none, core_memory_tools """Test successful appending of content to core memory - local sandbox.""" append_text = "\nLikes coffee" args = {"label": "human", "content": append_text} - sandbox = ToolExecutionSandbox(core_memory_tools["core_memory_append"].name, args, user_id=test_user.id) + sandbox = ToolExecutionSandbox(core_memory_tools["core_memory_append"].name, args, user=test_user) result = sandbox.run(agent_state=agent_state) assert append_text in result.agent_state.memory.get_block("human").value @@ -563,7 +563,7 @@ def test_core_memory_replace_error_local(self, mock_e2b_api_key_none, core_memor """Test error handling when trying to replace non-existent content - local sandbox.""" nonexistent_name = "Alexander Wang" args = {"label": "human", "old_content": nonexistent_name, "new_content": "Charles"} - sandbox = ToolExecutionSandbox(core_memory_tools["core_memory_replace"].name, args, user_id=test_user.id) + sandbox = ToolExecutionSandbox(core_memory_tools["core_memory_replace"].name, args, user=test_user) result = sandbox.run(agent_state=agent_state) assert len(result.stderr) != 0 @@ -575,7 +575,7 @@ def test_core_memory_replace_e2b(self, check_e2b_key_is_set, core_memory_tools, """Test successful replacement of content in core memory - e2b sandbox.""" new_name = "Charles" args = {"label": "human", "old_content": "Chad", "new_content": new_name} - sandbox = ToolExecutionSandbox(core_memory_tools["core_memory_replace"].name, args, user_id=test_user.id) + sandbox = ToolExecutionSandbox(core_memory_tools["core_memory_replace"].name, args, user=test_user) result = sandbox.run(agent_state=agent_state) assert new_name in result.agent_state.memory.get_block("human").value @@ -586,7 +586,7 @@ def test_core_memory_append_e2b(self, check_e2b_key_is_set, core_memory_tools, t """Test successful appending of content to core memory - e2b sandbox.""" append_text = "\nLikes coffee" args = {"label": "human", "content": append_text} - sandbox = ToolExecutionSandbox(core_memory_tools["core_memory_append"].name, args, user_id=test_user.id) + sandbox = ToolExecutionSandbox(core_memory_tools["core_memory_append"].name, args, user=test_user) result = sandbox.run(agent_state=agent_state) assert append_text in result.agent_state.memory.get_block("human").value @@ -597,7 +597,7 @@ def test_core_memory_replace_error_e2b(self, check_e2b_key_is_set, core_memory_t """Test error handling when trying to replace non-existent content - e2b sandbox.""" nonexistent_name = "Alexander Wang" args = {"label": "human", "old_content": nonexistent_name, "new_content": "Charles"} - sandbox = ToolExecutionSandbox(core_memory_tools["core_memory_replace"].name, args, user_id=test_user.id) + sandbox = ToolExecutionSandbox(core_memory_tools["core_memory_replace"].name, args, user=test_user) result = sandbox.run(agent_state=agent_state) assert len(result.stderr) != 0 diff --git a/tests/test_server.py b/tests/test_server.py index 93159aa583..2003c68880 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -288,15 +288,16 @@ def org_id(server): @pytest.fixture(scope="module") -def user_id(server, org_id): - # create user +def user(server, org_id): user = server.user_manager.create_default_user() - print(f"Created user\n{user.id}") + yield user + server.user_manager.delete_user_by_id(user.id) - yield user.id - # cleanup - server.user_manager.delete_user_by_id(user.id) +@pytest.fixture(scope="module") +def user_id(server, user): + # create user + yield user.id @pytest.fixture(scope="module") @@ -789,11 +790,11 @@ def ingest(message: str): ''' -def test_tool_run(server, mock_e2b_api_key_none, user_id, agent_id): +def test_tool_run(server, mock_e2b_api_key_none, user, agent_id): """Test that the server can run tools""" result = server.run_tool_from_source( - user_id=user_id, + actor=user, tool_source=EXAMPLE_TOOL_SOURCE, tool_source_type="python", tool_args=json.dumps({"message": "Hello, world!"}), @@ -806,7 +807,7 @@ def test_tool_run(server, mock_e2b_api_key_none, user_id, agent_id): assert not result.stderr result = server.run_tool_from_source( - user_id=user_id, + actor=user, tool_source=EXAMPLE_TOOL_SOURCE, tool_source_type="python", tool_args=json.dumps({"message": "Well well well"}), @@ -819,7 +820,7 @@ def test_tool_run(server, mock_e2b_api_key_none, user_id, agent_id): assert not result.stderr result = server.run_tool_from_source( - user_id=user_id, + actor=user, tool_source=EXAMPLE_TOOL_SOURCE, tool_source_type="python", tool_args=json.dumps({"bad_arg": "oh no"}), @@ -835,7 +836,7 @@ def test_tool_run(server, mock_e2b_api_key_none, user_id, agent_id): # Test that we can still pull the tool out by default (pulls that last tool in the source) result = server.run_tool_from_source( - user_id=user_id, + actor=user, tool_source=EXAMPLE_TOOL_SOURCE_WITH_DISTRACTOR, tool_source_type="python", tool_args=json.dumps({"message": "Well well well"}), @@ -850,7 +851,7 @@ def test_tool_run(server, mock_e2b_api_key_none, user_id, agent_id): # Test that we can pull the tool out by name result = server.run_tool_from_source( - user_id=user_id, + actor=user, tool_source=EXAMPLE_TOOL_SOURCE_WITH_DISTRACTOR, tool_source_type="python", tool_args=json.dumps({"message": "Well well well"}), @@ -865,7 +866,7 @@ def test_tool_run(server, mock_e2b_api_key_none, user_id, agent_id): # Test that we can pull a different tool out by name result = server.run_tool_from_source( - user_id=user_id, + actor=user, tool_source=EXAMPLE_TOOL_SOURCE_WITH_DISTRACTOR, tool_source_type="python", tool_args=json.dumps({}), From 264068dbb965528163e2966afc07168b79d89b66 Mon Sep 17 00:00:00 2001 From: mlong93 <35275280+mlong93@users.noreply.github.com> Date: Tue, 17 Dec 2024 18:04:26 -0800 Subject: [PATCH 103/280] fix: Allow `ChildToolRule` to work without support for structured outputs (#2270) Co-authored-by: Mindy Long --- letta/agent.py | 3 ++ letta/llm_api/anthropic.py | 31 +++++++++++--- tests/helpers/endpoints_helper.py | 3 +- tests/integration_test_agent_tool_graph.py | 48 ++++++++++++++++++++++ 4 files changed, 79 insertions(+), 6 deletions(-) diff --git a/letta/agent.py b/letta/agent.py index 532c4e13a7..485f2112b9 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -604,6 +604,9 @@ def _get_ai_reply( and len(self.tool_rules_solver.init_tool_rules) > 0 ): force_tool_call = self.tool_rules_solver.init_tool_rules[0].tool_name + # Force a tool call if exactly one tool is specified + elif step_count is not None and step_count > 0 and len(allowed_tool_names) == 1: + force_tool_call = allowed_tool_names[0] for attempt in range(1, empty_response_retry_limit + 1): try: diff --git a/letta/llm_api/anthropic.py b/letta/llm_api/anthropic.py index 912ac4567f..4cca920a5c 100644 --- a/letta/llm_api/anthropic.py +++ b/letta/llm_api/anthropic.py @@ -262,10 +262,24 @@ def convert_anthropic_response_to_chatcompletion( ), ) ] - else: - # Just inner mono - content = strip_xml_tags(string=response_json["content"][0]["text"], tag=inner_thoughts_xml_tag) - tool_calls = None + elif len(response_json["content"]) == 1: + if response_json["content"][0]["type"] == "tool_use": + # function call only + content = None + tool_calls = [ + ToolCall( + id=response_json["content"][0]["id"], + type="function", + function=FunctionCall( + name=response_json["content"][0]["name"], + arguments=json.dumps(response_json["content"][0]["input"], indent=2), + ), + ) + ] + else: + # inner mono only + content = strip_xml_tags(string=response_json["content"][0]["text"], tag=inner_thoughts_xml_tag) + tool_calls = None else: raise RuntimeError("Unexpected type for content in response_json.") @@ -327,6 +341,14 @@ def anthropic_chat_completions_request( if anthropic_tools is not None: data["tools"] = anthropic_tools + # TODO: Add support for other tool_choice options like "auto", "any" + if len(anthropic_tools) == 1: + data["tool_choice"] = { + "type": "tool", # Changed from "function" to "tool" + "name": anthropic_tools[0]["name"], # Directly specify name without nested "function" object + "disable_parallel_tool_use": True # Force single tool use + } + # Move 'system' to the top level # 'messages: Unexpected role "system". The Messages API accepts a top-level `system` parameter, not "system" as an input message role.' assert data["messages"][0]["role"] == "system", f"Expected 'system' role in messages[0]:\n{data['messages'][0]}" @@ -362,7 +384,6 @@ def anthropic_chat_completions_request( data.pop("top_p", None) data.pop("presence_penalty", None) data.pop("user", None) - data.pop("tool_choice", None) response_json = make_post_request(url, headers, data) return convert_anthropic_response_to_chatcompletion(response_json=response_json, inner_thoughts_xml_tag=inner_thoughts_xml_tag) diff --git a/tests/helpers/endpoints_helper.py b/tests/helpers/endpoints_helper.py index ddaa1d960d..8f1aa99c74 100644 --- a/tests/helpers/endpoints_helper.py +++ b/tests/helpers/endpoints_helper.py @@ -64,6 +64,7 @@ def setup_agent( tool_ids: Optional[List[str]] = None, tool_rules: Optional[List[BaseToolRule]] = None, agent_uuid: str = agent_uuid, + include_base_tools: bool = True, ) -> AgentState: config_data = json.load(open(filename, "r")) llm_config = LLMConfig(**config_data) @@ -77,7 +78,7 @@ def setup_agent( memory = ChatMemory(human=memory_human_str, persona=memory_persona_str) agent_state = client.create_agent( - name=agent_uuid, llm_config=llm_config, embedding_config=embedding_config, memory=memory, tool_ids=tool_ids, tool_rules=tool_rules + name=agent_uuid, llm_config=llm_config, embedding_config=embedding_config, memory=memory, tool_ids=tool_ids, tool_rules=tool_rules, include_base_tools=include_base_tools, ) return agent_state diff --git a/tests/integration_test_agent_tool_graph.py b/tests/integration_test_agent_tool_graph.py index 19c7dbd6cb..336777215d 100644 --- a/tests/integration_test_agent_tool_graph.py +++ b/tests/integration_test_agent_tool_graph.py @@ -234,3 +234,51 @@ def test_claude_initial_tool_rule_enforced(mock_e2b_api_key_none): if i < 2: backoff_time = 10 * (2 ** i) time.sleep(backoff_time) + +@pytest.mark.timeout(60) # Sets a 60-second timeout for the test since this could loop infinitely +def test_agent_no_structured_output_with_one_child_tool(mock_e2b_api_key_none): + client = create_client() + cleanup(client=client, agent_uuid=agent_uuid) + + send_message = client.server.tool_manager.get_tool_by_name(tool_name="send_message", actor=client.user) + archival_memory_search = client.server.tool_manager.get_tool_by_name(tool_name="archival_memory_search", actor=client.user) + archival_memory_insert = client.server.tool_manager.get_tool_by_name(tool_name="archival_memory_insert", actor=client.user) + + # Make tool rules + tool_rules = [ + InitToolRule(tool_name="archival_memory_search"), + ChildToolRule(tool_name="archival_memory_search", children=["archival_memory_insert"]), + ChildToolRule(tool_name="archival_memory_insert", children=["send_message"]), + TerminalToolRule(tool_name="send_message"), + ] + tools = [send_message, archival_memory_search, archival_memory_insert] + + config_files = [ + "tests/configs/llm_model_configs/claude-3-sonnet-20240229.json", + "tests/configs/llm_model_configs/openai-gpt-4o.json", + ] + + for config in config_files: + agent_state = setup_agent(client, config, agent_uuid=agent_uuid, tool_ids=[t.id for t in tools], tool_rules=tool_rules) + response = client.user_message(agent_id=agent_state.id, message="hi. run archival memory search") + + # Make checks + assert_sanity_checks(response) + + # Assert the tools were called + assert_invoked_function_call(response.messages, "archival_memory_search") + assert_invoked_function_call(response.messages, "archival_memory_insert") + assert_invoked_function_call(response.messages, "send_message") + + # Check ordering of tool calls + tool_names = [t.name for t in [archival_memory_search, archival_memory_insert, send_message]] + for m in response.messages: + if isinstance(m, FunctionCallMessage): + # Check that it's equal to the first one + assert m.function_call.name == tool_names[0] + + # Pop out first one + tool_names = tool_names[1:] + + print(f"Got successful response from client: \n\n{response}") + cleanup(client=client, agent_uuid=agent_uuid) From 62035602a97f4b8418874f910112a4e1241b2977 Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Tue, 17 Dec 2024 18:25:15 -0800 Subject: [PATCH 104/280] chore: bump version to 0.6.5 (#2275) --- letta/__init__.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/letta/__init__.py b/letta/__init__.py index 3936cbb72b..2aabb1ba2c 100644 --- a/letta/__init__.py +++ b/letta/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.6.4" +__version__ = "0.6.5" # import clients from letta.client.client import LocalClient, RESTClient, create_client diff --git a/pyproject.toml b/pyproject.toml index dc1da5940b..43045b1ba7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "letta" -version = "0.6.4" +version = "0.6.5" packages = [ {include = "letta"} ] From 5163f6bbb437555c79d56e6d41eb2caa0ace79ea Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Wed, 18 Dec 2024 11:10:23 -0800 Subject: [PATCH 105/280] chore: bump composio packages (#2278) --- poetry.lock | 20 ++++++++++---------- pyproject.toml | 4 ++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/poetry.lock b/poetry.lock index 9130cc158c..80453badc6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -726,13 +726,13 @@ test = ["pytest"] [[package]] name = "composio-core" -version = "0.5.51" +version = "0.6.3" description = "Core package to act as a bridge between composio platform and other services." optional = false python-versions = "<4,>=3.9" files = [ - {file = "composio_core-0.5.51-py3-none-any.whl", hash = "sha256:9bde524029967d8ff86a97986ce68cc4797c9b7ad6ea00450844af1238033a83"}, - {file = "composio_core-0.5.51.tar.gz", hash = "sha256:052f8af227d1a8121a2475ddce96ba09d5d556ad34cc091672dfe14b297c6742"}, + {file = "composio_core-0.6.3-py3-none-any.whl", hash = "sha256:981a9856781b791242f947a9685a18974d8a012ac7fab2c09438e1b19610d6a2"}, + {file = "composio_core-0.6.3.tar.gz", hash = "sha256:13098b20d8832e74453ca194889305c935432156fc07be91dfddf76561ad591b"}, ] [package.dependencies] @@ -744,7 +744,7 @@ inflection = ">=0.5.1" jsonref = ">=1.1.0" jsonschema = ">=4.21.1,<5" paramiko = ">=3.4.1" -pydantic = ">=2.6.4,<2.10" +pydantic = ">=2.6.4" pyperclip = ">=1.8.2,<2" pysher = "1.0.8" requests = ">=2.31.0,<3" @@ -754,7 +754,7 @@ sentry-sdk = ">=2.0.0" uvicorn = "*" [package.extras] -all = ["aiohttp", "click", "diskcache", "docker (>=7.1.0)", "e2b (>=0.17.2a37,<1)", "e2b-code-interpreter", "fastapi", "flake8", "gql", "importlib-metadata (>=4.8.1)", "inflection (>=0.5.1)", "jsonref (>=1.1.0)", "jsonschema (>=4.21.1,<5)", "networkx", "paramiko (>=3.4.1)", "pathspec", "pydantic (>=2.6.4,<2.10)", "pygments", "pyperclip (>=1.8.2,<2)", "pysher (==1.0.8)", "requests (>=2.31.0,<3)", "requests_toolbelt", "rich (>=13.7.1,<14)", "ruff", "semver (>=2.13.0)", "sentry-sdk (>=2.0.0)", "transformers", "tree_sitter (==0.21.3)", "tree_sitter_languages", "uvicorn"] +all = ["aiohttp", "click", "diskcache", "docker (>=7.1.0)", "e2b (>=0.17.2a37,<1)", "e2b-code-interpreter", "fastapi", "flake8", "gql", "importlib-metadata (>=4.8.1)", "inflection (>=0.5.1)", "jsonref (>=1.1.0)", "jsonschema (>=4.21.1,<5)", "networkx", "paramiko (>=3.4.1)", "pathspec", "pydantic (>=2.6.4)", "pygments", "pyperclip (>=1.8.2,<2)", "pysher (==1.0.8)", "requests (>=2.31.0,<3)", "requests_toolbelt", "rich (>=13.7.1,<14)", "ruff", "semver (>=2.13.0)", "sentry-sdk (>=2.0.0)", "transformers", "tree_sitter (==0.21.3)", "tree_sitter_languages", "uvicorn"] docker = ["docker (>=7.1.0)"] e2b = ["e2b (>=0.17.2a37,<1)", "e2b-code-interpreter"] flyio = ["gql", "requests_toolbelt"] @@ -762,17 +762,17 @@ tools = ["diskcache", "flake8", "networkx", "pathspec", "pygments", "ruff", "tra [[package]] name = "composio-langchain" -version = "0.5.51" +version = "0.6.3" description = "Use Composio to get an array of tools with your LangChain agent." optional = false python-versions = "<4,>=3.9" files = [ - {file = "composio_langchain-0.5.51-py3-none-any.whl", hash = "sha256:dc0e91b0b890ba5306bc096fcca376c3b0191d649c485300f477c0e5578deaa5"}, - {file = "composio_langchain-0.5.51.tar.gz", hash = "sha256:332bb3482ab293f45acf07ad0cf988e7a101f88caaaec818395663e4a6269432"}, + {file = "composio_langchain-0.6.3-py3-none-any.whl", hash = "sha256:0e749a1603dc0562293412d0a6429f88b75152b01a313cca859732070d762a6b"}, + {file = "composio_langchain-0.6.3.tar.gz", hash = "sha256:2036f94bfe60974b31f2be0bfdb33dd75a1d43435f275141219b3376587bf49d"}, ] [package.dependencies] -composio_core = ">=0.5.50,<=0.5.51" +composio_core = ">=0.5.0,<0.7.0" langchain = ">=0.1.0" langchain-openai = ">=0.0.2.post1" langchainhub = ">=0.1.15" @@ -6246,4 +6246,4 @@ tests = ["wikipedia"] [metadata] lock-version = "2.0" python-versions = "<4.0,>=3.10" -content-hash = "9c623c4d8c98b3fe724518428bb48ae85f8152453f200f767e13f48c59e0fe13" \ No newline at end of file +content-hash = "4a7cf176579d5dc15648979542da152ec98290f1e9f39039cfe9baf73bc1076f" diff --git a/pyproject.toml b/pyproject.toml index 43045b1ba7..1278e9425e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,8 +59,8 @@ nltk = "^3.8.1" jinja2 = "^3.1.4" locust = {version = "^2.31.5", optional = true} wikipedia = {version = "^1.4.0", optional = true} -composio-langchain = "^0.5.28" -composio-core = "^0.5.51" +composio-langchain = "^0.6.3" +composio-core = "^0.6.3" alembic = "^1.13.3" pyhumps = "^3.8.0" psycopg2 = {version = "^2.9.10", optional = true} From b135223e8987c9e6e826be87d4a293d740f1a961 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Wed, 18 Dec 2024 13:47:03 -0800 Subject: [PATCH 106/280] fix: Add index to messages table (#2280) --- ...d_add_composite_index_to_messages_table.py | 29 +++++++++++++++++++ letta/orm/message.py | 3 +- letta/orm/passage.py | 29 +++++++++---------- 3 files changed, 45 insertions(+), 16 deletions(-) create mode 100644 alembic/versions/d6632deac81d_add_composite_index_to_messages_table.py diff --git a/alembic/versions/d6632deac81d_add_composite_index_to_messages_table.py b/alembic/versions/d6632deac81d_add_composite_index_to_messages_table.py new file mode 100644 index 0000000000..68ceec88f5 --- /dev/null +++ b/alembic/versions/d6632deac81d_add_composite_index_to_messages_table.py @@ -0,0 +1,29 @@ +"""Add composite index to messages table + +Revision ID: d6632deac81d +Revises: 54dec07619c4 +Create Date: 2024-12-18 13:38:56.511701 + +""" + +from typing import Sequence, Union + +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = "d6632deac81d" +down_revision: Union[str, None] = "54dec07619c4" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_index("ix_messages_agent_created_at", "messages", ["agent_id", "created_at"], unique=False) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_index("ix_messages_agent_created_at", table_name="messages") + # ### end Alembic commands ### diff --git a/letta/orm/message.py b/letta/orm/message.py index e1d6da7889..a8bbb90017 100644 --- a/letta/orm/message.py +++ b/letta/orm/message.py @@ -1,5 +1,6 @@ from typing import Optional +from sqlalchemy import Index from sqlalchemy.orm import Mapped, mapped_column, relationship from letta.orm.custom_columns import ToolCallColumn @@ -13,7 +14,7 @@ class Message(SqlalchemyBase, OrganizationMixin, AgentMixin): """Defines data model for storing Message objects""" __tablename__ = "messages" - __table_args__ = {"extend_existing": True} + __table_args__ = (Index("ix_messages_agent_created_at", "agent_id", "created_at"),) __pydantic_model__ = PydanticMessage id: Mapped[str] = mapped_column(primary_key=True, doc="Unique message identifier") diff --git a/letta/orm/passage.py b/letta/orm/passage.py index d38878418b..492c602174 100644 --- a/letta/orm/passage.py +++ b/letta/orm/passage.py @@ -1,26 +1,26 @@ from typing import TYPE_CHECKING -from sqlalchemy import Column, JSON, Index -from sqlalchemy.orm import Mapped, mapped_column, relationship, declared_attr -from letta.orm.mixins import FileMixin, OrganizationMixin +from sqlalchemy import JSON, Column, Index +from sqlalchemy.orm import Mapped, declared_attr, mapped_column, relationship + +from letta.config import LettaConfig +from letta.constants import MAX_EMBEDDING_DIM from letta.orm.custom_columns import CommonVector, EmbeddingConfigColumn -from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.orm.mixins import AgentMixin, FileMixin, OrganizationMixin, SourceMixin +from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.schemas.passage import Passage as PydanticPassage from letta.settings import settings -from letta.config import LettaConfig -from letta.constants import MAX_EMBEDDING_DIM - config = LettaConfig() if TYPE_CHECKING: - from letta.orm.organization import Organization from letta.orm.agent import Agent + from letta.orm.organization import Organization class BasePassage(SqlalchemyBase, OrganizationMixin): """Base class for all passage types with common fields""" + __abstract__ = True __pydantic_model__ = PydanticPassage @@ -45,17 +45,15 @@ def organization(cls) -> Mapped["Organization"]: @declared_attr def __table_args__(cls): if settings.letta_pg_uri_no_default: - return ( - Index(f'{cls.__tablename__}_org_idx', 'organization_id'), - {"extend_existing": True} - ) + return (Index(f"{cls.__tablename__}_org_idx", "organization_id"), {"extend_existing": True}) return ({"extend_existing": True},) class SourcePassage(BasePassage, FileMixin, SourceMixin): """Passages derived from external files/sources""" + __tablename__ = "source_passages" - + @declared_attr def file(cls) -> Mapped["FileMetadata"]: """Relationship to file""" @@ -64,7 +62,7 @@ def file(cls) -> Mapped["FileMetadata"]: @declared_attr def organization(cls) -> Mapped["Organization"]: return relationship("Organization", back_populates="source_passages", lazy="selectin") - + @declared_attr def source(cls) -> Mapped["Source"]: """Relationship to source""" @@ -73,8 +71,9 @@ def source(cls) -> Mapped["Source"]: class AgentPassage(BasePassage, AgentMixin): """Passages created by agents as archival memories""" + __tablename__ = "agent_passages" - + @declared_attr def organization(cls) -> Mapped["Organization"]: return relationship("Organization", back_populates="agent_passages", lazy="selectin") From cef408a9fd8ce21c2436b00f993ad7141d729f89 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Wed, 18 Dec 2024 14:33:29 -0800 Subject: [PATCH 107/280] chore: Clean up upserting base tools (#2274) --- letta/client/client.py | 4 +- letta/functions/function_sets/base.py | 54 --------- letta/server/rest_api/routers/v1/tools.py | 21 +--- letta/server/server.py | 2 +- letta/services/agent_manager.py | 78 ++++++------- letta/services/tool_manager.py | 6 +- scripts/migrate_tools.py | 33 +----- tests/test_client_legacy.py | 7 +- tests/test_managers.py | 130 +++++++++++----------- tests/test_v1_routes.py | 6 +- 10 files changed, 113 insertions(+), 228 deletions(-) diff --git a/letta/client/client.py b/letta/client/client.py index af2edcca4a..8a9d3e700a 100644 --- a/letta/client/client.py +++ b/letta/client/client.py @@ -233,7 +233,7 @@ def delete_tool(self, id: str): def get_tool_id(self, name: str) -> Optional[str]: raise NotImplementedError - def add_base_tools(self) -> List[Tool]: + def upsert_base_tools(self) -> List[Tool]: raise NotImplementedError def load_data(self, connector: DataConnector, source_name: str): @@ -1466,7 +1466,7 @@ def get_tool_id(self, tool_name: str): raise ValueError(f"Failed to get tool: {response.text}") return response.json() - def add_base_tools(self) -> List[Tool]: + def upsert_base_tools(self) -> List[Tool]: response = requests.post(f"{self.base_url}/{self.api_prefix}/tools/add-base-tools/", headers=self.headers) if response.status_code != 200: raise ValueError(f"Failed to add base tools: {response.text}") diff --git a/letta/functions/function_sets/base.py b/letta/functions/function_sets/base.py index f559bf4a7d..d3ca097b90 100644 --- a/letta/functions/function_sets/base.py +++ b/letta/functions/function_sets/base.py @@ -61,60 +61,6 @@ def conversation_search(self: "Agent", query: str, page: Optional[int] = 0) -> O return results_str -def conversation_search_date(self: "Agent", start_date: str, end_date: str, page: Optional[int] = 0) -> Optional[str]: - """ - Search prior conversation history using a date range. - - Args: - start_date (str): The start of the date range to search, in the format 'YYYY-MM-DD'. - end_date (str): The end of the date range to search, in the format 'YYYY-MM-DD'. - page (int): Allows you to page through results. Only use on a follow-up query. Defaults to 0 (first page). - - Returns: - str: Query result string - """ - import math - from datetime import datetime - - from letta.constants import RETRIEVAL_QUERY_DEFAULT_PAGE_SIZE - from letta.utils import json_dumps - - if page is None or (isinstance(page, str) and page.lower().strip() == "none"): - page = 0 - try: - page = int(page) - if page < 0: - raise ValueError - except: - raise ValueError(f"'page' argument must be an integer") - - # Convert date strings to datetime objects - try: - start_datetime = datetime.strptime(start_date, "%Y-%m-%d").replace(hour=0, minute=0, second=0, microsecond=0) - end_datetime = datetime.strptime(end_date, "%Y-%m-%d").replace(hour=23, minute=59, second=59, microsecond=999999) - except ValueError: - raise ValueError("Dates must be in the format 'YYYY-MM-DD'") - - count = RETRIEVAL_QUERY_DEFAULT_PAGE_SIZE - results = self.message_manager.list_user_messages_for_agent( - # TODO: add paging by page number. currently cursor only works with strings. - agent_id=self.agent_state.id, - actor=self.user, - start_date=start_datetime, - end_date=end_datetime, - limit=count, - ) - total = len(results) - num_pages = math.ceil(total / count) - 1 # 0 index - if len(results) == 0: - results_str = f"No results found." - else: - results_pref = f"Showing {len(results)} of {total} results (page {page}/{num_pages}):" - results_formatted = [f"timestamp: {d['timestamp']}, {d['message']['role']} - {d['message']['content']}" for d in results] - results_str = f"{results_pref} {json_dumps(results_formatted)}" - return results_str - - def archival_memory_insert(self: "Agent", content: str) -> Optional[str]: """ Add to archival memory. Make sure to phrase the memory contents such that it can be easily queried later. diff --git a/letta/server/rest_api/routers/v1/tools.py b/letta/server/rest_api/routers/v1/tools.py index 61b89624d4..15979346c4 100644 --- a/letta/server/rest_api/routers/v1/tools.py +++ b/letta/server/rest_api/routers/v1/tools.py @@ -152,30 +152,15 @@ def update_tool( @router.post("/add-base-tools", response_model=List[Tool], operation_id="add_base_tools") -def add_base_tools( +def upsert_base_tools( server: SyncServer = Depends(get_letta_server), user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present ): """ - Add base tools + Upsert base tools """ actor = server.user_manager.get_user_or_default(user_id=user_id) - return server.tool_manager.add_base_tools(actor=actor) - - -# NOTE: can re-enable if needed -# @router.post("/{tool_id}/run", response_model=FunctionReturn, operation_id="run_tool") -# def run_tool( -# server: SyncServer = Depends(get_letta_server), -# request: ToolRun = Body(...), -# user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present -# ): -# """ -# Run an existing tool on provided arguments -# """ -# actor = server.user_manager.get_user_or_default(user_id=user_id) - -# return server.run_tool(tool_id=request.tool_id, tool_args=request.tool_args, user_id=actor.id) + return server.tool_manager.upsert_base_tools(actor=actor) @router.post("/run", response_model=FunctionReturn, operation_id="run_tool_from_source") diff --git a/letta/server/server.py b/letta/server/server.py index 31c87394d7..56fea7b342 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -301,7 +301,7 @@ def __init__( self.default_org = self.organization_manager.create_default_organization() self.default_user = self.user_manager.create_default_user() self.block_manager.add_default_blocks(actor=self.default_user) - self.tool_manager.add_base_tools(actor=self.default_user) + self.tool_manager.upsert_base_tools(actor=self.default_user) # If there is a default org/user # This logic may have to change in the future diff --git a/letta/services/agent_manager.py b/letta/services/agent_manager.py index 99dfa3ae47..aacad8ae49 100644 --- a/letta/services/agent_manager.py +++ b/letta/services/agent_manager.py @@ -1,18 +1,18 @@ -from typing import Dict, List, Optional from datetime import datetime -import numpy as np +from typing import Dict, List, Optional -from sqlalchemy import select, union_all, literal, func, Select +import numpy as np +from sqlalchemy import Select, func, literal, select, union_all from letta.constants import BASE_MEMORY_TOOLS, BASE_TOOLS, MAX_EMBEDDING_DIM from letta.embeddings import embedding_model from letta.log import get_logger from letta.orm import Agent as AgentModel +from letta.orm import AgentPassage from letta.orm import Block as BlockModel from letta.orm import Source as SourceModel +from letta.orm import SourcePassage, SourcesAgents from letta.orm import Tool as ToolModel -from letta.orm import AgentPassage, SourcePassage -from letta.orm import SourcesAgents from letta.orm.errors import NoResultFound from letta.orm.sqlite_functions import adapt_array from letta.schemas.agent import AgentState as PydanticAgentState @@ -77,6 +77,8 @@ def create_agent( tool_names.extend(BASE_TOOLS + BASE_MEMORY_TOOLS) if agent_create.tools: tool_names.extend(agent_create.tools) + # Remove duplicates + tool_names = list(set(tool_names)) tool_ids = agent_create.tool_ids or [] for tool_name in tool_names: @@ -431,7 +433,7 @@ def _build_passage_query( agent_only: bool = False, ) -> Select: """Helper function to build the base passage query with all filters applied. - + Returns the query before any limit or count operations are applied. """ embedded_text = None @@ -448,21 +450,14 @@ def _build_passage_query( if not agent_only: # Include source passages if agent_id is not None: source_passages = ( - select( - SourcePassage, - literal(None).label('agent_id') - ) + select(SourcePassage, literal(None).label("agent_id")) .join(SourcesAgents, SourcesAgents.source_id == SourcePassage.source_id) .where(SourcesAgents.agent_id == agent_id) .where(SourcePassage.organization_id == actor.organization_id) ) else: - source_passages = ( - select( - SourcePassage, - literal(None).label('agent_id') - ) - .where(SourcePassage.organization_id == actor.organization_id) + source_passages = select(SourcePassage, literal(None).label("agent_id")).where( + SourcePassage.organization_id == actor.organization_id ) if source_id: @@ -486,9 +481,9 @@ def _build_passage_query( AgentPassage._created_by_id, AgentPassage._last_updated_by_id, AgentPassage.organization_id, - literal(None).label('file_id'), - literal(None).label('source_id'), - AgentPassage.agent_id + literal(None).label("file_id"), + literal(None).label("source_id"), + AgentPassage.agent_id, ) .where(AgentPassage.agent_id == agent_id) .where(AgentPassage.organization_id == actor.organization_id) @@ -496,11 +491,11 @@ def _build_passage_query( # Combine queries if source_passages is not None and agent_passages is not None: - combined_query = union_all(source_passages, agent_passages).cte('combined_passages') + combined_query = union_all(source_passages, agent_passages).cte("combined_passages") elif agent_passages is not None: - combined_query = agent_passages.cte('combined_passages') + combined_query = agent_passages.cte("combined_passages") elif source_passages is not None: - combined_query = source_passages.cte('combined_passages') + combined_query = source_passages.cte("combined_passages") else: raise ValueError("No passages found") @@ -521,9 +516,7 @@ def _build_passage_query( if embedded_text: if settings.letta_pg_uri_no_default: # PostgreSQL with pgvector - main_query = main_query.order_by( - combined_query.c.embedding.cosine_distance(embedded_text).asc() - ) + main_query = main_query.order_by(combined_query.c.embedding.cosine_distance(embedded_text).asc()) else: # SQLite with custom vector type query_embedding_binary = adapt_array(embedded_text) @@ -531,13 +524,13 @@ def _build_passage_query( main_query = main_query.order_by( func.cosine_distance(combined_query.c.embedding, query_embedding_binary).asc(), combined_query.c.created_at.asc(), - combined_query.c.id.asc() + combined_query.c.id.asc(), ) else: main_query = main_query.order_by( func.cosine_distance(combined_query.c.embedding, query_embedding_binary).asc(), combined_query.c.created_at.desc(), - combined_query.c.id.asc() + combined_query.c.id.asc(), ) else: if query_text: @@ -545,18 +538,12 @@ def _build_passage_query( # Handle cursor-based pagination if cursor: - cursor_query = select(combined_query.c.created_at).where( - combined_query.c.id == cursor - ).scalar_subquery() - + cursor_query = select(combined_query.c.created_at).where(combined_query.c.id == cursor).scalar_subquery() + if ascending: - main_query = main_query.where( - combined_query.c.created_at > cursor_query - ) + main_query = main_query.where(combined_query.c.created_at > cursor_query) else: - main_query = main_query.where( - combined_query.c.created_at < cursor_query - ) + main_query = main_query.where(combined_query.c.created_at < cursor_query) # Add ordering if not already ordered by similarity if not embed_query: @@ -588,7 +575,7 @@ def list_passages( embed_query: bool = False, ascending: bool = True, embedding_config: Optional[EmbeddingConfig] = None, - agent_only: bool = False + agent_only: bool = False, ) -> List[PydanticPassage]: """Lists all passages attached to an agent.""" with self.session_maker() as session: @@ -617,19 +604,18 @@ def list_passages( passages = [] for row in results: data = dict(row._mapping) - if data['agent_id'] is not None: + if data["agent_id"] is not None: # This is an AgentPassage - remove source fields - data.pop('source_id', None) - data.pop('file_id', None) + data.pop("source_id", None) + data.pop("file_id", None) passage = AgentPassage(**data) else: # This is a SourcePassage - remove agent field - data.pop('agent_id', None) + data.pop("agent_id", None) passage = SourcePassage(**data) passages.append(passage) - - return [p.to_pydantic() for p in passages] + return [p.to_pydantic() for p in passages] @enforce_types def passage_size( @@ -645,7 +631,7 @@ def passage_size( embed_query: bool = False, ascending: bool = True, embedding_config: Optional[EmbeddingConfig] = None, - agent_only: bool = False + agent_only: bool = False, ) -> int: """Returns the count of passages matching the given criteria.""" with self.session_maker() as session: @@ -663,7 +649,7 @@ def passage_size( embedding_config=embedding_config, agent_only=agent_only, ) - + # Convert to count query count_query = select(func.count()).select_from(main_query.subquery()) return session.scalar(count_query) or 0 diff --git a/letta/services/tool_manager.py b/letta/services/tool_manager.py index 63240930fe..739bfb382c 100644 --- a/letta/services/tool_manager.py +++ b/letta/services/tool_manager.py @@ -3,6 +3,7 @@ import warnings from typing import List, Optional +from letta.constants import BASE_MEMORY_TOOLS, BASE_TOOLS from letta.functions.functions import derive_openai_json_schema, load_function_set # TODO: Remove this once we translate all of these to the ORM @@ -20,7 +21,6 @@ class ToolManager: BASE_TOOL_NAMES = [ "send_message", "conversation_search", - "conversation_search_date", "archival_memory_insert", "archival_memory_search", ] @@ -133,7 +133,7 @@ def delete_tool_by_id(self, tool_id: str, actor: PydanticUser) -> None: raise ValueError(f"Tool with id {tool_id} not found.") @enforce_types - def add_base_tools(self, actor: PydanticUser) -> List[PydanticTool]: + def upsert_base_tools(self, actor: PydanticUser) -> List[PydanticTool]: """Add default tools in base.py""" module_name = "base" full_module_name = f"letta.functions.function_sets.{module_name}" @@ -154,7 +154,7 @@ def add_base_tools(self, actor: PydanticUser) -> List[PydanticTool]: # create tool in db tools = [] for name, schema in functions_to_schema.items(): - if name in self.BASE_TOOL_NAMES + self.BASE_MEMORY_TOOL_NAMES: + if name in BASE_TOOLS + BASE_MEMORY_TOOLS: # print([str(inspect.getsource(line)) for line in schema["imports"]]) source_code = inspect.getsource(schema["python_function"]) tags = [module_name] diff --git a/scripts/migrate_tools.py b/scripts/migrate_tools.py index 7ea6bac1d6..53578c690e 100644 --- a/scripts/migrate_tools.py +++ b/scripts/migrate_tools.py @@ -1,5 +1,5 @@ -from letta.functions.functions import parse_source_code -from letta.schemas.tool import Tool +from tqdm import tqdm + from letta.schemas.user import User from letta.services.organization_manager import OrganizationManager from letta.services.tool_manager import ToolManager @@ -10,33 +10,8 @@ def deprecated_tool(): orgs = OrganizationManager().list_organizations(cursor=None, limit=5000) -for org in orgs: +for org in tqdm(orgs): if org.name != "default": fake_user = User(id="user-00000000-0000-4000-8000-000000000000", name="fake", organization_id=org.id) - ToolManager().add_base_tools(actor=fake_user) - - source_code = parse_source_code(deprecated_tool) - source_type = "python" - description = "deprecated" - tags = ["deprecated"] - - ToolManager().create_or_update_tool( - Tool( - name="core_memory_append", - source_code=source_code, - source_type=source_type, - description=description, - ), - actor=fake_user, - ) - - ToolManager().create_or_update_tool( - Tool( - name="core_memory_replace", - source_code=source_code, - source_type=source_type, - description=description, - ), - actor=fake_user, - ) + ToolManager().upsert_base_tools(actor=fake_user) diff --git a/tests/test_client_legacy.py b/tests/test_client_legacy.py index e0b51255a0..7c634e5fa3 100644 --- a/tests/test_client_legacy.py +++ b/tests/test_client_legacy.py @@ -11,7 +11,7 @@ from letta import create_client from letta.client.client import LocalClient, RESTClient -from letta.constants import DEFAULT_PRESET +from letta.constants import BASE_MEMORY_TOOLS, BASE_TOOLS, DEFAULT_PRESET from letta.orm import FileMetadata, Source from letta.schemas.agent import AgentState from letta.schemas.embedding_config import EmbeddingConfig @@ -30,7 +30,6 @@ from letta.schemas.message import MessageCreate from letta.schemas.usage import LettaUsageStatistics from letta.services.organization_manager import OrganizationManager -from letta.services.tool_manager import ToolManager from letta.services.user_manager import UserManager from letta.settings import model_settings from tests.helpers.client_helper import upload_file_using_client @@ -336,9 +335,9 @@ def test_list_tools_pagination(client: Union[LocalClient, RESTClient]): def test_list_tools(client: Union[LocalClient, RESTClient]): - tools = client.add_base_tools() + tools = client.upsert_base_tools() tool_names = [t.name for t in tools] - expected = ToolManager.BASE_TOOL_NAMES + ToolManager.BASE_MEMORY_TOOL_NAMES + expected = BASE_TOOLS + BASE_MEMORY_TOOLS assert sorted(tool_names) == sorted(expected) diff --git a/tests/test_managers.py b/tests/test_managers.py index dc5f15ad1b..37c6f2ac08 100644 --- a/tests/test_managers.py +++ b/tests/test_managers.py @@ -2,28 +2,27 @@ import time from datetime import datetime, timedelta -from httpx._transports import default -from numpy import source import pytest from sqlalchemy import delete from sqlalchemy.exc import IntegrityError from letta.config import LettaConfig +from letta.constants import BASE_MEMORY_TOOLS, BASE_TOOLS from letta.embeddings import embedding_model from letta.functions.functions import derive_openai_json_schema, parse_source_code from letta.orm import ( Agent, + AgentPassage, Block, BlocksAgents, FileMetadata, Job, Message, Organization, - AgentPassage, - SourcePassage, SandboxConfig, SandboxEnvironmentVariable, Source, + SourcePassage, SourcesAgents, Tool, ToolsAgents, @@ -202,9 +201,9 @@ def agent_passage_fixture(server: SyncServer, default_user, sarah_agent): organization_id=default_user.organization_id, embedding=[0.1], embedding_config=DEFAULT_EMBEDDING_CONFIG, - metadata_={"type": "test"} + metadata_={"type": "test"}, ), - actor=default_user + actor=default_user, ) yield passage @@ -220,9 +219,9 @@ def source_passage_fixture(server: SyncServer, default_user, default_file, defau organization_id=default_user.organization_id, embedding=[0.1], embedding_config=DEFAULT_EMBEDDING_CONFIG, - metadata_={"type": "test"} + metadata_={"type": "test"}, ), - actor=default_user + actor=default_user, ) yield passage @@ -240,9 +239,9 @@ def create_test_passages(server: SyncServer, default_file, default_user, sarah_a organization_id=default_user.organization_id, embedding=[0.1], embedding_config=DEFAULT_EMBEDDING_CONFIG, - metadata_={"type": "test"} + metadata_={"type": "test"}, ), - actor=default_user + actor=default_user, ) passages.append(passage) if USING_SQLITE: @@ -258,9 +257,9 @@ def create_test_passages(server: SyncServer, default_file, default_user, sarah_a organization_id=default_user.organization_id, embedding=[0.1], embedding_config=DEFAULT_EMBEDDING_CONFIG, - metadata_={"type": "test"} + metadata_={"type": "test"}, ), - actor=default_user + actor=default_user, ) passages.append(passage) if USING_SQLITE: @@ -452,7 +451,7 @@ def agent_passages_setup(server, default_source, default_user, sarah_agent): embedding=[0.1], # Default OpenAI embedding size embedding_config=DEFAULT_EMBEDDING_CONFIG, ), - actor=actor + actor=actor, ) source_passages.append(passage) @@ -467,7 +466,7 @@ def agent_passages_setup(server, default_source, default_user, sarah_agent): embedding=[0.1], # Default OpenAI embedding size embedding_config=DEFAULT_EMBEDDING_CONFIG, ), - actor=actor + actor=actor, ) agent_passages.append(passage) @@ -476,6 +475,7 @@ def agent_passages_setup(server, default_source, default_user, sarah_agent): # Cleanup server.source_manager.delete_source(default_source.id, actor=actor) + # ====================================================================================================================== # AgentManager Tests - Basic # ====================================================================================================================== @@ -940,32 +940,33 @@ def test_get_block_with_label(server: SyncServer, sarah_agent, default_block, de # Agent Manager - Passages Tests # ====================================================================================================================== + def test_agent_list_passages_basic(server, default_user, sarah_agent, agent_passages_setup): """Test basic listing functionality of agent passages""" - + all_passages = server.agent_manager.list_passages(actor=default_user, agent_id=sarah_agent.id) assert len(all_passages) == 5 # 3 source + 2 agent passages def test_agent_list_passages_ordering(server, default_user, sarah_agent, agent_passages_setup): - """Test ordering of agent passages""" + """Test ordering of agent passages""" # Test ascending order asc_passages = server.agent_manager.list_passages(actor=default_user, agent_id=sarah_agent.id, ascending=True) assert len(asc_passages) == 5 for i in range(1, len(asc_passages)): - assert asc_passages[i-1].created_at <= asc_passages[i].created_at + assert asc_passages[i - 1].created_at <= asc_passages[i].created_at # Test descending order desc_passages = server.agent_manager.list_passages(actor=default_user, agent_id=sarah_agent.id, ascending=False) assert len(desc_passages) == 5 for i in range(1, len(desc_passages)): - assert desc_passages[i-1].created_at >= desc_passages[i].created_at + assert desc_passages[i - 1].created_at >= desc_passages[i].created_at def test_agent_list_passages_pagination(server, default_user, sarah_agent, agent_passages_setup): """Test pagination of agent passages""" - + # Test limit limited_passages = server.agent_manager.list_passages(actor=default_user, agent_id=sarah_agent.id, limit=3) assert len(limited_passages) == 3 @@ -973,13 +974,9 @@ def test_agent_list_passages_pagination(server, default_user, sarah_agent, agent # Test cursor-based pagination first_page = server.agent_manager.list_passages(actor=default_user, agent_id=sarah_agent.id, limit=2, ascending=True) assert len(first_page) == 2 - + second_page = server.agent_manager.list_passages( - actor=default_user, - agent_id=sarah_agent.id, - cursor=first_page[-1].id, - limit=2, - ascending=True + actor=default_user, agent_id=sarah_agent.id, cursor=first_page[-1].id, limit=2, ascending=True ) assert len(second_page) == 2 assert first_page[-1].id != second_page[0].id @@ -988,57 +985,38 @@ def test_agent_list_passages_pagination(server, default_user, sarah_agent, agent def test_agent_list_passages_text_search(server, default_user, sarah_agent, agent_passages_setup): """Test text search functionality of agent passages""" - + # Test text search for source passages - source_text_passages = server.agent_manager.list_passages( - actor=default_user, - agent_id=sarah_agent.id, - query_text="Source passage" - ) + source_text_passages = server.agent_manager.list_passages(actor=default_user, agent_id=sarah_agent.id, query_text="Source passage") assert len(source_text_passages) == 3 # Test text search for agent passages - agent_text_passages = server.agent_manager.list_passages( - actor=default_user, - agent_id=sarah_agent.id, - query_text="Agent passage" - ) + agent_text_passages = server.agent_manager.list_passages(actor=default_user, agent_id=sarah_agent.id, query_text="Agent passage") assert len(agent_text_passages) == 2 def test_agent_list_passages_agent_only(server, default_user, sarah_agent, agent_passages_setup): """Test text search functionality of agent passages""" - + # Test text search for agent passages - agent_text_passages = server.agent_manager.list_passages( - actor=default_user, - agent_id=sarah_agent.id, - agent_only=True - ) + agent_text_passages = server.agent_manager.list_passages(actor=default_user, agent_id=sarah_agent.id, agent_only=True) assert len(agent_text_passages) == 2 def test_agent_list_passages_filtering(server, default_user, sarah_agent, default_source, agent_passages_setup): """Test filtering functionality of agent passages""" - + # Test source filtering - source_filtered = server.agent_manager.list_passages( - actor=default_user, - agent_id=sarah_agent.id, - source_id=default_source.id - ) + source_filtered = server.agent_manager.list_passages(actor=default_user, agent_id=sarah_agent.id, source_id=default_source.id) assert len(source_filtered) == 3 # Test date filtering now = datetime.utcnow() future_date = now + timedelta(days=1) past_date = now - timedelta(days=1) - + date_filtered = server.agent_manager.list_passages( - actor=default_user, - agent_id=sarah_agent.id, - start_date=past_date, - end_date=future_date + actor=default_user, agent_id=sarah_agent.id, start_date=past_date, end_date=future_date ) assert len(date_filtered) == 5 @@ -1049,7 +1027,7 @@ def test_agent_list_passages_vector_search(server, default_user, sarah_agent, de # Create passages with known embeddings passages = [] - + # Create passages with different embeddings test_passages = [ "I like red", @@ -1058,7 +1036,7 @@ def test_agent_list_passages_vector_search(server, default_user, sarah_agent, de ] server.agent_manager.attach_source(agent_id=sarah_agent.id, source_id=default_source.id, actor=default_user) - + for i, text in enumerate(test_passages): embedding = embed_model.get_text_embedding(text) if i % 2 == 0: @@ -1067,7 +1045,7 @@ def test_agent_list_passages_vector_search(server, default_user, sarah_agent, de organization_id=default_user.organization_id, agent_id=sarah_agent.id, embedding_config=DEFAULT_EMBEDDING_CONFIG, - embedding=embedding + embedding=embedding, ) else: passage = PydanticPassage( @@ -1075,14 +1053,14 @@ def test_agent_list_passages_vector_search(server, default_user, sarah_agent, de organization_id=default_user.organization_id, source_id=default_source.id, embedding_config=DEFAULT_EMBEDDING_CONFIG, - embedding=embedding + embedding=embedding, ) created_passage = server.passage_manager.create_passage(passage, default_user) passages.append(created_passage) # Query vector similar to "red" embedding query_key = "What's my favorite color?" - + # Test vector search with all passages results = server.agent_manager.list_passages( actor=default_user, @@ -1091,7 +1069,7 @@ def test_agent_list_passages_vector_search(server, default_user, sarah_agent, de embedding_config=DEFAULT_EMBEDDING_CONFIG, embed_query=True, ) - + # Verify results are ordered by similarity assert len(results) == 3 assert results[0].text == "I like red" @@ -1105,9 +1083,9 @@ def test_agent_list_passages_vector_search(server, default_user, sarah_agent, de query_text=query_key, embedding_config=DEFAULT_EMBEDDING_CONFIG, embed_query=True, - agent_only=True + agent_only=True, ) - + # Verify agent-only results assert len(agent_only_results) == 2 assert agent_only_results[0].text == "I like red" @@ -1116,7 +1094,7 @@ def test_agent_list_passages_vector_search(server, default_user, sarah_agent, de def test_list_source_passages_only(server: SyncServer, default_user, default_source, agent_passages_setup): """Test listing passages from a source without specifying an agent.""" - + # List passages by source_id without agent_id source_passages = server.agent_manager.list_passages( actor=default_user, @@ -1180,6 +1158,7 @@ def test_list_organizations_pagination(server: SyncServer): # Passage Manager Tests # ====================================================================================================================== + def test_passage_create_agentic(server: SyncServer, agent_passage_fixture, default_user): """Test creating a passage using agent_passage_fixture fixture""" assert agent_passage_fixture.id is not None @@ -1214,7 +1193,7 @@ def test_passage_create_invalid(server: SyncServer, agent_passage_fixture, defau """Test creating an agent passage.""" assert agent_passage_fixture is not None assert agent_passage_fixture.text == "Hello, I am an agent passage" - + # Try to create an invalid passage (with both agent_id and source_id) with pytest.raises(AssertionError): server.passage_manager.create_passage( @@ -1226,7 +1205,7 @@ def test_passage_create_invalid(server: SyncServer, agent_passage_fixture, defau embedding=[0.1] * 1024, embedding_config=DEFAULT_EMBEDDING_CONFIG, ), - actor=default_user + actor=default_user, ) @@ -1243,19 +1222,21 @@ def test_passage_get_by_id(server: SyncServer, agent_passage_fixture, source_pas assert retrieved.text == source_passage_fixture.text -def test_passage_cascade_deletion(server: SyncServer, agent_passage_fixture, source_passage_fixture, default_user, default_source, sarah_agent): +def test_passage_cascade_deletion( + server: SyncServer, agent_passage_fixture, source_passage_fixture, default_user, default_source, sarah_agent +): """Test that passages are deleted when their parent (agent or source) is deleted.""" # Verify passages exist agent_passage = server.passage_manager.get_passage_by_id(agent_passage_fixture.id, default_user) source_passage = server.passage_manager.get_passage_by_id(source_passage_fixture.id, default_user) assert agent_passage is not None assert source_passage is not None - + # Delete agent and verify its passages are deleted server.agent_manager.delete_agent(sarah_agent.id, default_user) agentic_passages = server.agent_manager.list_passages(actor=default_user, agent_id=sarah_agent.id, agent_only=True) assert len(agentic_passages) == 0 - + # Delete source and verify its passages are deleted server.source_manager.delete_source(default_source.id, default_user) with pytest.raises(NoResultFound): @@ -1320,7 +1301,6 @@ def test_create_tool(server: SyncServer, print_tool, default_user, default_organ assert print_tool.organization_id == default_organization.id - @pytest.mark.skipif(USING_SQLITE, reason="Test not applicable when using SQLite.") def test_create_tool_duplicate_name(server: SyncServer, print_tool, default_user, default_organization): data = print_tool.model_dump(exclude=["id"]) @@ -1481,6 +1461,16 @@ def test_delete_tool_by_id(server: SyncServer, print_tool, default_user): assert len(tools) == 0 +def test_upsert_base_tools(server: SyncServer, default_user): + tools = server.tool_manager.upsert_base_tools(actor=default_user) + expected_tool_names = sorted(BASE_TOOLS + BASE_MEMORY_TOOLS) + assert sorted([t.name for t in tools]) == expected_tool_names + + # Call it again to make sure it doesn't create duplicates + tools = server.tool_manager.upsert_base_tools(actor=default_user) + assert sorted([t.name for t in tools]) == expected_tool_names + + # ====================================================================================================================== # Message Manager Tests # ====================================================================================================================== @@ -1889,6 +1879,7 @@ def test_update_source_no_changes(server: SyncServer, default_user): # Source Manager Tests - Files # ====================================================================================================================== + def test_get_file_by_id(server: SyncServer, default_user, default_source): """Test retrieving a file by ID.""" file_metadata = PydanticFileMetadata( @@ -1960,6 +1951,7 @@ def test_delete_file(server: SyncServer, default_user, default_source): # SandboxConfigManager Tests - Sandbox Configs # ====================================================================================================================== + def test_create_or_update_sandbox_config(server: SyncServer, default_user): sandbox_config_create = SandboxConfigCreate( config=E2BSandboxConfig(), @@ -2039,6 +2031,7 @@ def test_list_sandbox_configs(server: SyncServer, default_user): # SandboxConfigManager Tests - Environment Variables # ====================================================================================================================== + def test_create_sandbox_env_var(server: SyncServer, sandbox_config_fixture, default_user): env_var_create = SandboxEnvironmentVariableCreate(key="TEST_VAR", value="test_value", description="A test environment variable.") created_env_var = server.sandbox_config_manager.create_sandbox_env_var( @@ -2111,6 +2104,7 @@ def test_get_sandbox_env_var_by_key(server: SyncServer, sandbox_env_var_fixture, # JobManager Tests # ====================================================================================================================== + def test_create_job(server: SyncServer, default_user): """Test creating a job.""" job_data = PydanticJob( diff --git a/tests/test_v1_routes.py b/tests/test_v1_routes.py index d82bbc11a3..2865bb2ec4 100644 --- a/tests/test_v1_routes.py +++ b/tests/test_v1_routes.py @@ -272,15 +272,15 @@ def test_update_tool(client, mock_sync_server, update_integers_tool, add_integer ) -def test_add_base_tools(client, mock_sync_server, add_integers_tool): - mock_sync_server.tool_manager.add_base_tools.return_value = [add_integers_tool] +def test_upsert_base_tools(client, mock_sync_server, add_integers_tool): + mock_sync_server.tool_manager.upsert_base_tools.return_value = [add_integers_tool] response = client.post("/v1/tools/add-base-tools", headers={"user_id": "test_user"}) assert response.status_code == 200 assert len(response.json()) == 1 assert response.json()[0]["id"] == add_integers_tool.id - mock_sync_server.tool_manager.add_base_tools.assert_called_once_with( + mock_sync_server.tool_manager.upsert_base_tools.assert_called_once_with( actor=mock_sync_server.user_manager.get_user_or_default.return_value ) From e5f230ea6b22a5db96e657699371f6b6554a6679 Mon Sep 17 00:00:00 2001 From: cthomas Date: Wed, 18 Dec 2024 17:15:40 -0800 Subject: [PATCH 108/280] feat: add new RateLimitExceededError (#2277) Co-authored-by: Caren Thomas --- letta/agent.py | 22 +++++++--- letta/errors.py | 73 +++++++++++++++++++++++++--------- letta/llm_api/llm_api_tools.py | 4 +- letta/server/rest_api/utils.py | 45 +++++++++++---------- 4 files changed, 96 insertions(+), 48 deletions(-) diff --git a/letta/agent.py b/letta/agent.py index 485f2112b9..b61dce7641 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -20,7 +20,7 @@ REQ_HEARTBEAT_MESSAGE, STRUCTURED_OUTPUT_MODELS, ) -from letta.errors import LLMError +from letta.errors import ContextWindowExceededError from letta.helpers import ToolRulesSolver from letta.interface import AgentInterface from letta.llm_api.helpers import is_context_overflow_error @@ -1094,6 +1094,7 @@ def inner_step( # If we got a context alert, try trimming the messages length, then try again if is_context_overflow_error(e): + printd(f"context window exceeded with limit {self.agent_state.llm_config.context_window}, running summarizer to trim messages") # A separate API call to run a summarizer self.summarize_messages_inplace() @@ -1169,8 +1170,13 @@ def summarize_messages_inplace(self, cutoff=None, preserve_last_N_messages=True, # If at this point there's nothing to summarize, throw an error if len(candidate_messages_to_summarize) == 0: - raise LLMError( - f"Summarize error: tried to run summarize, but couldn't find enough messages to compress [len={len(self.messages)}, preserve_N={MESSAGE_SUMMARY_TRUNC_KEEP_N_LAST}]" + raise ContextWindowExceededError( + "Not enough messages to compress for summarization", + details={ + "num_candidate_messages": len(candidate_messages_to_summarize), + "num_total_messages": len(self.messages), + "preserve_N": MESSAGE_SUMMARY_TRUNC_KEEP_N_LAST, + }, ) # Walk down the message buffer (front-to-back) until we hit the target token count @@ -1204,8 +1210,13 @@ def summarize_messages_inplace(self, cutoff=None, preserve_last_N_messages=True, message_sequence_to_summarize = self._messages[1:cutoff] # do NOT get rid of the system message if len(message_sequence_to_summarize) <= 1: # This prevents a potential infinite loop of summarizing the same message over and over - raise LLMError( - f"Summarize error: tried to run summarize, but couldn't find enough messages to compress [len={len(message_sequence_to_summarize)} <= 1]" + raise ContextWindowExceededError( + "Not enough messages to compress for summarization after determining cutoff", + details={ + "num_candidate_messages": len(message_sequence_to_summarize), + "num_total_messages": len(self.messages), + "preserve_N": MESSAGE_SUMMARY_TRUNC_KEEP_N_LAST, + }, ) else: printd(f"Attempting to summarize {len(message_sequence_to_summarize)} messages [1:{cutoff}] of {len(self._messages)}") @@ -1218,6 +1229,7 @@ def summarize_messages_inplace(self, cutoff=None, preserve_last_N_messages=True, self.agent_state.llm_config.context_window = ( LLM_MAX_TOKENS[self.model] if (self.model is not None and self.model in LLM_MAX_TOKENS) else LLM_MAX_TOKENS["DEFAULT"] ) + summary = summarize_messages(agent_state=self.agent_state, message_sequence_to_summarize=message_sequence_to_summarize) printd(f"Got summary: {summary}") diff --git a/letta/errors.py b/letta/errors.py index c478ef42fa..0dc7cc9ec0 100644 --- a/letta/errors.py +++ b/letta/errors.py @@ -1,4 +1,5 @@ import json +from enum import Enum from typing import TYPE_CHECKING, List, Optional, Union # Avoid circular imports @@ -6,9 +7,31 @@ from letta.schemas.message import Message +class ErrorCode(Enum): + """Enum for error codes used by client.""" + + INTERNAL_SERVER_ERROR = "INTERNAL_SERVER_ERROR" + CONTEXT_WINDOW_EXCEEDED = "CONTEXT_WINDOW_EXCEEDED" + RATE_LIMIT_EXCEEDED = "RATE_LIMIT_EXCEEDED" + + class LettaError(Exception): """Base class for all Letta related errors.""" + def __init__(self, message: str, code: Optional[ErrorCode] = None, details: dict = {}): + self.message = message + self.code = code + self.details = details + super().__init__(message) + + def __str__(self) -> str: + if self.code: + return f"{self.code.value}: {self.message}" + return self.message + + def __repr__(self) -> str: + return f"{self.__class__.__name__}(message='{self.message}', code='{self.code}', details={self.details})" + class LettaToolCreateError(LettaError): """Error raised when a tool cannot be created.""" @@ -16,10 +39,7 @@ class LettaToolCreateError(LettaError): default_error_message = "Error creating tool." def __init__(self, message=None): - if message is None: - message = self.default_error_message - self.message = message - super().__init__(self.message) + super().__init__(message=message or self.default_error_message) class LettaConfigurationError(LettaError): @@ -27,23 +47,17 @@ class LettaConfigurationError(LettaError): def __init__(self, message: str, missing_fields: Optional[List[str]] = None): self.missing_fields = missing_fields or [] - super().__init__(message) + super().__init__(message=message, details={"missing_fields": self.missing_fields}) class LettaAgentNotFoundError(LettaError): """Error raised when an agent is not found.""" - - def __init__(self, message: str): - self.message = message - super().__init__(self.message) + pass class LettaUserNotFoundError(LettaError): """Error raised when a user is not found.""" - - def __init__(self, message: str): - self.message = message - super().__init__(self.message) + pass class LLMError(LettaError): @@ -54,24 +68,45 @@ class LLMJSONParsingError(LettaError): """Exception raised for errors in the JSON parsing process.""" def __init__(self, message="Error parsing JSON generated by LLM"): - self.message = message - super().__init__(self.message) + super().__init__(message=message) class LocalLLMError(LettaError): """Generic catch-all error for local LLM problems""" def __init__(self, message="Encountered an error while running local LLM"): - self.message = message - super().__init__(self.message) + super().__init__(message=message) class LocalLLMConnectionError(LettaError): """Error for when local LLM cannot be reached with provided IP/port""" def __init__(self, message="Could not connect to local LLM"): - self.message = message - super().__init__(self.message) + super().__init__(message=message) + + +class ContextWindowExceededError(LettaError): + """Error raised when the context window is exceeded but further summarization fails.""" + + def __init__(self, message: str, details: dict = {}): + error_message = f"{message} ({details})" + super().__init__( + message=error_message, + code=ErrorCode.CONTEXT_WINDOW_EXCEEDED, + details=details, + ) + + +class RateLimitExceededError(LettaError): + """Error raised when the llm rate limiter throttles api requests.""" + + def __init__(self, message: str, max_retries: int): + error_message = f"{message} ({max_retries})" + super().__init__( + message=error_message, + code=ErrorCode.RATE_LIMIT_EXCEEDED, + details={"max_retries": max_retries}, + ) class LettaMessageError(LettaError): diff --git a/letta/llm_api/llm_api_tools.py b/letta/llm_api/llm_api_tools.py index dadd128aa9..578779d72b 100644 --- a/letta/llm_api/llm_api_tools.py +++ b/letta/llm_api/llm_api_tools.py @@ -5,7 +5,7 @@ import requests from letta.constants import CLI_WARNING_PREFIX -from letta.errors import LettaConfigurationError +from letta.errors import LettaConfigurationError, RateLimitExceededError from letta.llm_api.anthropic import anthropic_chat_completions_request from letta.llm_api.azure_openai import azure_openai_chat_completions_request from letta.llm_api.google_ai import ( @@ -80,7 +80,7 @@ def wrapper(*args, **kwargs): # Check if max retries has been reached if num_retries > max_retries: - raise Exception(f"Maximum number of retries ({max_retries}) exceeded.") + raise RateLimitExceededError("Maximum number of retries exceeded", max_retries=max_retries) # Increment the delay delay *= exponential_base * (1 + jitter * random.random()) diff --git a/letta/server/rest_api/utils.py b/letta/server/rest_api/utils.py index da8d472cd7..64d46a5d3f 100644 --- a/letta/server/rest_api/utils.py +++ b/letta/server/rest_api/utils.py @@ -8,6 +8,7 @@ from fastapi import Header from pydantic import BaseModel +from letta.errors import ContextWindowExceededError, RateLimitExceededError from letta.schemas.usage import LettaUsageStatistics from letta.server.rest_api.interface import StreamingServerInterface from letta.server.server import SyncServer @@ -61,34 +62,21 @@ async def sse_async_generator( if not isinstance(usage, LettaUsageStatistics): raise ValueError(f"Expected LettaUsageStatistics, got {type(usage)}") yield sse_formatter({"usage": usage.model_dump()}) - except Exception as e: - import traceback - - traceback.print_exc() - warnings.warn(f"SSE stream generator failed: {e}") - # Log the error, since the exception handler upstack (in FastAPI) won't catch it, because this may be a 200 response - # Print the stack trace - if (os.getenv("SENTRY_DSN") is not None) and (os.getenv("SENTRY_DSN") != ""): - import sentry_sdk + except ContextWindowExceededError as e: + log_error_to_sentry(e) + yield sse_formatter({"error": f"Stream failed: {e}", "code": str(e.code.value) if e.code else None}) - sentry_sdk.capture_exception(e) + except RateLimitExceededError as e: + log_error_to_sentry(e) + yield sse_formatter({"error": f"Stream failed: {e}", "code": str(e.code.value) if e.code else None}) + except Exception as e: + log_error_to_sentry(e) yield sse_formatter({"error": f"Stream failed (internal error occured)"}) except Exception as e: - import traceback - - traceback.print_exc() - warnings.warn(f"SSE stream generator failed: {e}") - - # Log the error, since the exception handler upstack (in FastAPI) won't catch it, because this may be a 200 response - # Print the stack trace - if (os.getenv("SENTRY_DSN") is not None) and (os.getenv("SENTRY_DSN") != ""): - import sentry_sdk - - sentry_sdk.capture_exception(e) - + log_error_to_sentry(e) yield sse_formatter({"error": "Stream failed (decoder encountered an error)"}) finally: @@ -113,3 +101,16 @@ def get_user_id(user_id: Optional[str] = Header(None, alias="user_id")) -> Optio def get_current_interface() -> StreamingServerInterface: return StreamingServerInterface + +def log_error_to_sentry(e): + import traceback + + traceback.print_exc() + warnings.warn(f"SSE stream generator failed: {e}") + + # Log the error, since the exception handler upstack (in FastAPI) won't catch it, because this may be a 200 response + # Print the stack trace + if (os.getenv("SENTRY_DSN") is not None) and (os.getenv("SENTRY_DSN") != ""): + import sentry_sdk + + sentry_sdk.capture_exception(e) From f71d9214cdefb39548d6de003a63e76f18acc73d Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Wed, 18 Dec 2024 19:15:00 -0800 Subject: [PATCH 109/280] chore: Add temporary telemetry logs (#2284) --- letta/server/rest_api/routers/v1/agents.py | 11 ++++++++ letta/server/server.py | 33 ++++++++++++++++++++-- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index fc5ce50794..2fe2f9e9ba 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -17,6 +17,7 @@ from pydantic import Field from letta.constants import DEFAULT_MESSAGE_TOOL, DEFAULT_MESSAGE_TOOL_KWARG +from letta.log import get_logger from letta.orm.errors import NoResultFound from letta.schemas.agent import AgentState, CreateAgent, UpdateAgent from letta.schemas.block import ( # , BlockLabelUpdate, BlockLimitUpdate @@ -54,6 +55,8 @@ router = APIRouter(prefix="/agents", tags=["agents"]) +logger = get_logger(__name__) + # TODO: This should be paginated @router.get("/", response_model=List[AgentState], operation_id="list_agents") @@ -453,6 +456,13 @@ def get_agent_messages( """ actor = server.user_manager.get_user_or_default(user_id=user_id) + # TODO: Temporary debugging logs for debugging very slow endpoint + import uuid + + temp_rand_uuid = uuid.uuid4() + + logger.info(f"[{temp_rand_uuid}] RECEIVED GET /messages for agent_id={agent_id} before={before} limit={limit}") + return server.get_agent_recall_cursor( user_id=actor.id, agent_id=agent_id, @@ -462,6 +472,7 @@ def get_agent_messages( return_message_object=msg_object, assistant_message_tool_name=assistant_message_tool_name, assistant_message_tool_kwarg=assistant_message_tool_kwarg, + temp_rand_uuid=temp_rand_uuid, ) diff --git a/letta/server/server.py b/letta/server/server.py index 56fea7b342..0adcb45908 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -979,16 +979,32 @@ def get_agent_recall_cursor( return_message_object: bool = True, assistant_message_tool_name: str = constants.DEFAULT_MESSAGE_TOOL, assistant_message_tool_kwarg: str = constants.DEFAULT_MESSAGE_TOOL_KWARG, + temp_rand_uuid: Optional[str] = None, ) -> Union[List[Message], List[LettaMessage]]: # TODO: Thread actor directly through this function, since the top level caller most likely already retrieved the user + import datetime + + start_time = datetime.datetime.utcnow() + + logger.info( + f"[{temp_rand_uuid}] {datetime.datetime.utcnow()} - Fetching actor for user_id={user_id} (Elapsed: {(datetime.datetime.utcnow() - start_time).total_seconds()}s)" + ) actor = self.user_manager.get_user_or_default(user_id=user_id) - # Get the agent object (loaded in memory) + logger.info( + f"[{temp_rand_uuid}] {datetime.datetime.utcnow()} - Loading agent object for agent_id={agent_id} (Elapsed: {(datetime.datetime.utcnow() - start_time).total_seconds()}s)" + ) letta_agent = self.load_agent(agent_id=agent_id, actor=actor) - # iterate over records + logger.info( + f"[{temp_rand_uuid}] {datetime.datetime.utcnow()} - Resolving start_date and end_date for filtering messages (Elapsed: {(datetime.datetime.utcnow() - start_time).total_seconds()}s)" + ) start_date = self.message_manager.get_message_by_id(after, actor=actor).created_at if after else None end_date = self.message_manager.get_message_by_id(before, actor=actor).created_at if before else None + + logger.info( + f"[{temp_rand_uuid}] {datetime.datetime.utcnow()} - Fetching messages for agent_id={agent_id}, start_date={start_date}, end_date={end_date}, limit={limit}, reverse={reverse} (Elapsed: {(datetime.datetime.utcnow() - start_time).total_seconds()}s)" + ) records = letta_agent.message_manager.list_messages_for_agent( agent_id=agent_id, actor=actor, @@ -998,10 +1014,15 @@ def get_agent_recall_cursor( ascending=not reverse, ) + logger.info( + f"[{temp_rand_uuid}] {datetime.datetime.utcnow()} - Validating message types (Elapsed: {(datetime.datetime.utcnow() - start_time).total_seconds()}s)" + ) assert all(isinstance(m, Message) for m in records) if not return_message_object: - # If we're GETing messages in reverse, we need to reverse the inner list (generated by to_letta_message) + logger.info( + f"[{temp_rand_uuid}] {datetime.datetime.utcnow()} - Converting messages to LettaMessage objects (Elapsed: {(datetime.datetime.utcnow() - start_time).total_seconds()}s)" + ) records = [ msg for m in records @@ -1012,8 +1033,14 @@ def get_agent_recall_cursor( ] if reverse: + logger.info( + f"[{temp_rand_uuid}] {datetime.datetime.utcnow()} - Reversing message order (Elapsed: {(datetime.datetime.utcnow() - start_time).total_seconds()}s)" + ) records = records[::-1] + logger.info( + f"[{temp_rand_uuid}] {datetime.datetime.utcnow()} - Returning {len(records)} messages (Elapsed: {(datetime.datetime.utcnow() - start_time).total_seconds()}s)" + ) return records def get_server_config(self, include_defaults: bool = False) -> dict: From 77f9c4a6811f7a75502a6a2c37e31ca91350eee4 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Thu, 19 Dec 2024 11:33:00 -0800 Subject: [PATCH 110/280] fix: Remove load agent in recall cursor (#2286) --- letta/server/server.py | 12 +----------- letta/services/message_manager.py | 1 + 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/letta/server/server.py b/letta/server/server.py index 0adcb45908..c885b96538 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -991,11 +991,6 @@ def get_agent_recall_cursor( ) actor = self.user_manager.get_user_or_default(user_id=user_id) - logger.info( - f"[{temp_rand_uuid}] {datetime.datetime.utcnow()} - Loading agent object for agent_id={agent_id} (Elapsed: {(datetime.datetime.utcnow() - start_time).total_seconds()}s)" - ) - letta_agent = self.load_agent(agent_id=agent_id, actor=actor) - logger.info( f"[{temp_rand_uuid}] {datetime.datetime.utcnow()} - Resolving start_date and end_date for filtering messages (Elapsed: {(datetime.datetime.utcnow() - start_time).total_seconds()}s)" ) @@ -1005,7 +1000,7 @@ def get_agent_recall_cursor( logger.info( f"[{temp_rand_uuid}] {datetime.datetime.utcnow()} - Fetching messages for agent_id={agent_id}, start_date={start_date}, end_date={end_date}, limit={limit}, reverse={reverse} (Elapsed: {(datetime.datetime.utcnow() - start_time).total_seconds()}s)" ) - records = letta_agent.message_manager.list_messages_for_agent( + records = self.message_manager.list_messages_for_agent( agent_id=agent_id, actor=actor, start_date=start_date, @@ -1014,11 +1009,6 @@ def get_agent_recall_cursor( ascending=not reverse, ) - logger.info( - f"[{temp_rand_uuid}] {datetime.datetime.utcnow()} - Validating message types (Elapsed: {(datetime.datetime.utcnow() - start_time).total_seconds()}s)" - ) - assert all(isinstance(m, Message) for m in records) - if not return_message_object: logger.info( f"[{temp_rand_uuid}] {datetime.datetime.utcnow()} - Converting messages to LettaMessage objects (Elapsed: {(datetime.datetime.utcnow() - start_time).total_seconds()}s)" diff --git a/letta/services/message_manager.py b/letta/services/message_manager.py index b415194420..6c317f6498 100644 --- a/letta/services/message_manager.py +++ b/letta/services/message_manager.py @@ -147,6 +147,7 @@ def list_user_messages_for_agent( limit=limit, filters=message_filters, query_text=query_text, + ascending=ascending, ) @enforce_types From d8be870391fc4aecec14bb02c33a06634c04a28d Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Thu, 19 Dec 2024 11:49:19 -0800 Subject: [PATCH 111/280] chore: Remove debugging logs (#2287) --- letta/server/rest_api/routers/v1/agents.py | 8 -------- letta/server/server.py | 23 ---------------------- 2 files changed, 31 deletions(-) diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index 2fe2f9e9ba..69b97c764e 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -456,13 +456,6 @@ def get_agent_messages( """ actor = server.user_manager.get_user_or_default(user_id=user_id) - # TODO: Temporary debugging logs for debugging very slow endpoint - import uuid - - temp_rand_uuid = uuid.uuid4() - - logger.info(f"[{temp_rand_uuid}] RECEIVED GET /messages for agent_id={agent_id} before={before} limit={limit}") - return server.get_agent_recall_cursor( user_id=actor.id, agent_id=agent_id, @@ -472,7 +465,6 @@ def get_agent_messages( return_message_object=msg_object, assistant_message_tool_name=assistant_message_tool_name, assistant_message_tool_kwarg=assistant_message_tool_kwarg, - temp_rand_uuid=temp_rand_uuid, ) diff --git a/letta/server/server.py b/letta/server/server.py index c885b96538..1b8ff9cdc7 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -979,27 +979,13 @@ def get_agent_recall_cursor( return_message_object: bool = True, assistant_message_tool_name: str = constants.DEFAULT_MESSAGE_TOOL, assistant_message_tool_kwarg: str = constants.DEFAULT_MESSAGE_TOOL_KWARG, - temp_rand_uuid: Optional[str] = None, ) -> Union[List[Message], List[LettaMessage]]: # TODO: Thread actor directly through this function, since the top level caller most likely already retrieved the user - import datetime - start_time = datetime.datetime.utcnow() - - logger.info( - f"[{temp_rand_uuid}] {datetime.datetime.utcnow()} - Fetching actor for user_id={user_id} (Elapsed: {(datetime.datetime.utcnow() - start_time).total_seconds()}s)" - ) actor = self.user_manager.get_user_or_default(user_id=user_id) - - logger.info( - f"[{temp_rand_uuid}] {datetime.datetime.utcnow()} - Resolving start_date and end_date for filtering messages (Elapsed: {(datetime.datetime.utcnow() - start_time).total_seconds()}s)" - ) start_date = self.message_manager.get_message_by_id(after, actor=actor).created_at if after else None end_date = self.message_manager.get_message_by_id(before, actor=actor).created_at if before else None - logger.info( - f"[{temp_rand_uuid}] {datetime.datetime.utcnow()} - Fetching messages for agent_id={agent_id}, start_date={start_date}, end_date={end_date}, limit={limit}, reverse={reverse} (Elapsed: {(datetime.datetime.utcnow() - start_time).total_seconds()}s)" - ) records = self.message_manager.list_messages_for_agent( agent_id=agent_id, actor=actor, @@ -1010,9 +996,6 @@ def get_agent_recall_cursor( ) if not return_message_object: - logger.info( - f"[{temp_rand_uuid}] {datetime.datetime.utcnow()} - Converting messages to LettaMessage objects (Elapsed: {(datetime.datetime.utcnow() - start_time).total_seconds()}s)" - ) records = [ msg for m in records @@ -1023,14 +1006,8 @@ def get_agent_recall_cursor( ] if reverse: - logger.info( - f"[{temp_rand_uuid}] {datetime.datetime.utcnow()} - Reversing message order (Elapsed: {(datetime.datetime.utcnow() - start_time).total_seconds()}s)" - ) records = records[::-1] - logger.info( - f"[{temp_rand_uuid}] {datetime.datetime.utcnow()} - Returning {len(records)} messages (Elapsed: {(datetime.datetime.utcnow() - start_time).total_seconds()}s)" - ) return records def get_server_config(self, include_defaults: bool = False) -> dict: From 87820d931835f9f4acc1f59186a6ee2a4d0b01c2 Mon Sep 17 00:00:00 2001 From: cthomas Date: Thu, 19 Dec 2024 12:12:58 -0800 Subject: [PATCH 112/280] feat: rename function to tool in sdk (#2288) Co-authored-by: Caren Thomas --- examples/helper.py | 12 ++- examples/tool_rule_usage.py | 6 +- letta/client/streaming.py | 12 +-- letta/errors.py | 12 +-- letta/schemas/letta_message.py | 94 ++++++++++++------- letta/schemas/letta_response.py | 8 +- letta/schemas/message.py | 20 ++-- letta/server/rest_api/interface.py | 78 +++++++-------- .../chat_completions/chat_completions.py | 4 +- letta/server/rest_api/routers/v1/tools.py | 4 +- letta/server/server.py | 16 ++-- tests/helpers/endpoints_helper.py | 28 +++--- tests/integration_test_agent_tool_graph.py | 14 +-- tests/test_client.py | 8 +- tests/test_client_legacy.py | 12 +-- tests/test_server.py | 32 +++---- 16 files changed, 199 insertions(+), 161 deletions(-) diff --git a/examples/helper.py b/examples/helper.py index 7fc15bf8b0..f19e8ffb13 100644 --- a/examples/helper.py +++ b/examples/helper.py @@ -75,6 +75,10 @@ def nb_print(messages): return_data = json.loads(msg.function_return) if "message" in return_data and return_data["message"] == "None": continue + if msg.message_type == "tool_return_message": + return_data = json.loads(msg.tool_return) + if "message" in return_data and return_data["message"] == "None": + continue title = msg.message_type.replace("_", " ").upper() html_output += f""" @@ -94,11 +98,17 @@ def get_formatted_content(msg): elif msg.message_type == "function_call": args = format_json(msg.function_call.arguments) return f'
    {html.escape(msg.function_call.name)}({args})
    ' + elif msg.message_type == "tool_call_message": + args = format_json(msg.tool_call.arguments) + return f'
    {html.escape(msg.function_call.name)}({args})
    ' elif msg.message_type == "function_return": - return_value = format_json(msg.function_return) # return f'
    Status: {html.escape(msg.status)}
    {return_value}
    ' return f'
    {return_value}
    ' + elif msg.message_type == "tool_return_message": + return_value = format_json(msg.tool_return) + # return f'
    Status: {html.escape(msg.status)}
    {return_value}
    ' + return f'
    {return_value}
    ' elif msg.message_type == "user_message": if is_json(msg.message): return f'
    {format_json(msg.message)}
    ' diff --git a/examples/tool_rule_usage.py b/examples/tool_rule_usage.py index 45c56ec3eb..7d04df6c5a 100644 --- a/examples/tool_rule_usage.py +++ b/examples/tool_rule_usage.py @@ -2,7 +2,7 @@ import uuid from letta import create_client -from letta.schemas.letta_message import FunctionCallMessage +from letta.schemas.letta_message import ToolCallMessage from letta.schemas.tool_rule import ChildToolRule, InitToolRule, TerminalToolRule from tests.helpers.endpoints_helper import ( assert_invoked_send_message_with_keyword, @@ -116,9 +116,9 @@ def main(): # 6. Here, we thoroughly check the correctness of the response tool_names += ["send_message"] # Add send message because we expect this to be called at the end for m in response.messages: - if isinstance(m, FunctionCallMessage): + if isinstance(m, ToolCallMessage): # Check that it's equal to the first one - assert m.function_call.name == tool_names[0] + assert m.tool_call.name == tool_names[0] # Pop out first one tool_names = tool_names[1:] diff --git a/letta/client/streaming.py b/letta/client/streaming.py index 80a8a814e5..9f57352b73 100644 --- a/letta/client/streaming.py +++ b/letta/client/streaming.py @@ -8,8 +8,8 @@ from letta.errors import LLMError from letta.schemas.enums import MessageStreamStatus from letta.schemas.letta_message import ( - FunctionCallMessage, - FunctionReturn, + ToolCallMessage, + ToolReturnMessage, InternalMonologue, ) from letta.schemas.letta_response import LettaStreamingResponse @@ -55,10 +55,10 @@ def _sse_post(url: str, data: dict, headers: dict) -> Generator[LettaStreamingRe chunk_data = json.loads(sse.data) if "internal_monologue" in chunk_data: yield InternalMonologue(**chunk_data) - elif "function_call" in chunk_data: - yield FunctionCallMessage(**chunk_data) - elif "function_return" in chunk_data: - yield FunctionReturn(**chunk_data) + elif "tool_call" in chunk_data: + yield ToolCallMessage(**chunk_data) + elif "tool_return" in chunk_data: + yield ToolReturnMessage(**chunk_data) elif "usage" in chunk_data: yield LettaUsageStatistics(**chunk_data["usage"]) else: diff --git a/letta/errors.py b/letta/errors.py index 0dc7cc9ec0..4957139bee 100644 --- a/letta/errors.py +++ b/letta/errors.py @@ -131,16 +131,16 @@ def construct_error_message(messages: List[Union["Message", "LettaMessage"]], er return f"{error_msg}\n\n{message_json}" -class MissingFunctionCallError(LettaMessageError): - """Error raised when a message is missing a function call.""" +class MissingToolCallError(LettaMessageError): + """Error raised when a message is missing a tool call.""" - default_error_message = "The message is missing a function call." + default_error_message = "The message is missing a tool call." -class InvalidFunctionCallError(LettaMessageError): - """Error raised when a message uses an invalid function call.""" +class InvalidToolCallError(LettaMessageError): + """Error raised when a message uses an invalid tool call.""" - default_error_message = "The message uses an invalid function call or has improper usage of a function call." + default_error_message = "The message uses an invalid tool call or has improper usage of a tool call." class MissingInnerMonologueError(LettaMessageError): diff --git a/letta/schemas/letta_message.py b/letta/schemas/letta_message.py index 3b2dc73480..424a003844 100644 --- a/letta/schemas/letta_message.py +++ b/letta/schemas/letta_message.py @@ -9,7 +9,7 @@ class LettaMessage(BaseModel): """ - Base class for simplified Letta message response type. This is intended to be used for developers who want the internal monologue, function calls, and function returns in a simplified format that does not include additional information other than the content and timestamp. + Base class for simplified Letta message response type. This is intended to be used for developers who want the internal monologue, tool calls, and tool returns in a simplified format that does not include additional information other than the content and timestamp. Attributes: id (str): The ID of the message @@ -74,18 +74,18 @@ class InternalMonologue(LettaMessage): internal_monologue: str -class FunctionCall(BaseModel): +class ToolCall(BaseModel): name: str arguments: str - function_call_id: str + tool_call_id: str -class FunctionCallDelta(BaseModel): +class ToolCallDelta(BaseModel): name: Optional[str] arguments: Optional[str] - function_call_id: Optional[str] + tool_call_id: Optional[str] # NOTE: this is a workaround to exclude None values from the JSON dump, # since the OpenAI style of returning chunks doesn't include keys with null values @@ -97,67 +97,67 @@ def json(self, *args, **kwargs): return json.dumps(self.model_dump(exclude_none=True), *args, **kwargs) -class FunctionCallMessage(LettaMessage): +class ToolCallMessage(LettaMessage): """ - A message representing a request to call a function (generated by the LLM to trigger function execution). + A message representing a request to call a tool (generated by the LLM to trigger tool execution). Attributes: - function_call (Union[FunctionCall, FunctionCallDelta]): The function call + tool_call (Union[ToolCall, ToolCallDelta]): The tool call id (str): The ID of the message date (datetime): The date the message was created in ISO format """ - message_type: Literal["function_call"] = "function_call" - function_call: Union[FunctionCall, FunctionCallDelta] + message_type: Literal["tool_call_message"] = "tool_call_message" + tool_call: Union[ToolCall, ToolCallDelta] - # NOTE: this is required for the FunctionCallDelta exclude_none to work correctly + # NOTE: this is required for the ToolCallDelta exclude_none to work correctly def model_dump(self, *args, **kwargs): kwargs["exclude_none"] = True data = super().model_dump(*args, **kwargs) - if isinstance(data["function_call"], dict): - data["function_call"] = {k: v for k, v in data["function_call"].items() if v is not None} + if isinstance(data["tool_call"], dict): + data["tool_call"] = {k: v for k, v in data["tool_call"].items() if v is not None} return data class Config: json_encoders = { - FunctionCallDelta: lambda v: v.model_dump(exclude_none=True), - FunctionCall: lambda v: v.model_dump(exclude_none=True), + ToolCallDelta: lambda v: v.model_dump(exclude_none=True), + ToolCall: lambda v: v.model_dump(exclude_none=True), } - # NOTE: this is required to cast dicts into FunctionCallMessage objects + # NOTE: this is required to cast dicts into ToolCallMessage objects # Without this extra validator, Pydantic will throw an error if 'name' or 'arguments' are None - # (instead of properly casting to FunctionCallDelta instead of FunctionCall) - @field_validator("function_call", mode="before") + # (instead of properly casting to ToolCallDelta instead of ToolCall) + @field_validator("tool_call", mode="before") @classmethod - def validate_function_call(cls, v): + def validate_tool_call(cls, v): if isinstance(v, dict): - if "name" in v and "arguments" in v and "function_call_id" in v: - return FunctionCall(name=v["name"], arguments=v["arguments"], function_call_id=v["function_call_id"]) - elif "name" in v or "arguments" in v or "function_call_id" in v: - return FunctionCallDelta(name=v.get("name"), arguments=v.get("arguments"), function_call_id=v.get("function_call_id")) + if "name" in v and "arguments" in v and "tool_call_id" in v: + return ToolCall(name=v["name"], arguments=v["arguments"], tool_call_id=v["tool_call_id"]) + elif "name" in v or "arguments" in v or "tool_call_id" in v: + return ToolCallDelta(name=v.get("name"), arguments=v.get("arguments"), tool_call_id=v.get("tool_call_id")) else: - raise ValueError("function_call must contain either 'name' or 'arguments'") + raise ValueError("tool_call must contain either 'name' or 'arguments'") return v -class FunctionReturn(LettaMessage): +class ToolReturnMessage(LettaMessage): """ - A message representing the return value of a function call (generated by Letta executing the requested function). + A message representing the return value of a tool call (generated by Letta executing the requested tool). Attributes: - function_return (str): The return value of the function - status (Literal["success", "error"]): The status of the function call + tool_return (str): The return value of the tool + status (Literal["success", "error"]): The status of the tool call id (str): The ID of the message date (datetime): The date the message was created in ISO format - function_call_id (str): A unique identifier for the function call that generated this message - stdout (Optional[List(str)]): Captured stdout (e.g. prints, logs) from the function invocation - stderr (Optional[List(str)]): Captured stderr from the function invocation + tool_call_id (str): A unique identifier for the tool call that generated this message + stdout (Optional[List(str)]): Captured stdout (e.g. prints, logs) from the tool invocation + stderr (Optional[List(str)]): Captured stderr from the tool invocation """ - message_type: Literal["function_return"] = "function_return" - function_return: str + message_type: Literal["tool_return_message"] = "tool_return_message" + tool_return: str status: Literal["success", "error"] - function_call_id: str + tool_call_id: str stdout: Optional[List[str]] = None stderr: Optional[List[str]] = None @@ -174,10 +174,32 @@ class LegacyFunctionCallMessage(LettaMessage): function_call: str -LegacyLettaMessage = Union[InternalMonologue, AssistantMessage, LegacyFunctionCallMessage, FunctionReturn] +class LegacyFunctionReturn(LettaMessage): + """ + A message representing the return value of a function call (generated by Letta executing the requested function). + + Attributes: + function_return (str): The return value of the function + status (Literal["success", "error"]): The status of the function call + id (str): The ID of the message + date (datetime): The date the message was created in ISO format + function_call_id (str): A unique identifier for the function call that generated this message + stdout (Optional[List(str)]): Captured stdout (e.g. prints, logs) from the function invocation + stderr (Optional[List(str)]): Captured stderr from the function invocation + """ + + message_type: Literal["function_return"] = "function_return" + function_return: str + status: Literal["success", "error"] + function_call_id: str + stdout: Optional[List[str]] = None + stderr: Optional[List[str]] = None + + +LegacyLettaMessage = Union[InternalMonologue, AssistantMessage, LegacyFunctionCallMessage, LegacyFunctionReturn] LettaMessageUnion = Annotated[ - Union[SystemMessage, UserMessage, InternalMonologue, FunctionCallMessage, FunctionReturn, AssistantMessage], + Union[SystemMessage, UserMessage, InternalMonologue, ToolCallMessage, ToolReturnMessage, AssistantMessage], Field(discriminator="message_type"), ] diff --git a/letta/schemas/letta_response.py b/letta/schemas/letta_response.py index 58dbf42929..990a55cb15 100644 --- a/letta/schemas/letta_response.py +++ b/letta/schemas/letta_response.py @@ -43,11 +43,17 @@ def get_formatted_content(msg): elif msg.message_type == "function_call": args = format_json(msg.function_call.arguments) return f'
    {html.escape(msg.function_call.name)}({args})
    ' + elif msg.message_type == "tool_call_message": + args = format_json(msg.tool_call.arguments) + return f'
    {html.escape(msg.function_call.name)}({args})
    ' elif msg.message_type == "function_return": - return_value = format_json(msg.function_return) # return f'
    Status: {html.escape(msg.status)}
    {return_value}
    ' return f'
    {return_value}
    ' + elif msg.message_type == "tool_return_message": + return_value = format_json(msg.tool_return) + # return f'
    Status: {html.escape(msg.status)}
    {return_value}
    ' + return f'
    {return_value}
    ' elif msg.message_type == "user_message": if is_json(msg.message): return f'
    {format_json(msg.message)}
    ' diff --git a/letta/schemas/message.py b/letta/schemas/message.py index 0d2f77a715..b548ec256a 100644 --- a/letta/schemas/message.py +++ b/letta/schemas/message.py @@ -16,9 +16,9 @@ from letta.schemas.letta_base import OrmMetadataBase from letta.schemas.letta_message import ( AssistantMessage, - FunctionCall, - FunctionCallMessage, - FunctionReturn, + ToolCall as LettaToolCall, + ToolCallMessage, + ToolReturnMessage, InternalMonologue, LettaMessage, SystemMessage, @@ -172,18 +172,18 @@ def to_letta_message( ) else: messages.append( - FunctionCallMessage( + ToolCallMessage( id=self.id, date=self.created_at, - function_call=FunctionCall( + tool_call=LettaToolCall( name=tool_call.function.name, arguments=tool_call.function.arguments, - function_call_id=tool_call.id, + tool_call_id=tool_call.id, ), ) ) elif self.role == MessageRole.tool: - # This is type FunctionReturn + # This is type ToolReturnMessage # Try to interpret the function return, recall that this is how we packaged: # def package_function_response(was_success, response_string, timestamp=None): # formatted_time = get_local_time() if timestamp is None else timestamp @@ -208,12 +208,12 @@ def to_letta_message( messages.append( # TODO make sure this is what the API returns # function_return may not match exactly... - FunctionReturn( + ToolReturnMessage( id=self.id, date=self.created_at, - function_return=self.text, + tool_return=self.text, status=status_enum, - function_call_id=self.tool_call_id, + tool_call_id=self.tool_call_id, ) ) elif self.role == MessageRole.user: diff --git a/letta/server/rest_api/interface.py b/letta/server/rest_api/interface.py index 11843250c7..85248ec3bb 100644 --- a/letta/server/rest_api/interface.py +++ b/letta/server/rest_api/interface.py @@ -12,10 +12,10 @@ from letta.schemas.enums import MessageStreamStatus from letta.schemas.letta_message import ( AssistantMessage, - FunctionCall, - FunctionCallDelta, - FunctionCallMessage, - FunctionReturn, + ToolCall, + ToolCallDelta, + ToolCallMessage, + ToolReturnMessage, InternalMonologue, LegacyFunctionCallMessage, LegacyLettaMessage, @@ -411,7 +411,7 @@ def clear(): def _process_chunk_to_letta_style( self, chunk: ChatCompletionChunkResponse, message_id: str, message_date: datetime - ) -> Optional[Union[InternalMonologue, FunctionCallMessage, AssistantMessage]]: + ) -> Optional[Union[InternalMonologue, ToolCallMessage, AssistantMessage]]: """ Example data from non-streaming response looks like: @@ -442,7 +442,7 @@ def _process_chunk_to_letta_style( if self.inner_thoughts_in_kwargs: raise NotImplementedError("inner_thoughts_in_kwargs with use_assistant_message not yet supported") - # If we just received a chunk with the message in it, we either enter "send_message" mode, or we do standard FunctionCallMessage passthrough mode + # If we just received a chunk with the message in it, we either enter "send_message" mode, or we do standard ToolCallMessage passthrough mode # Track the function name while streaming # If we were previously on a 'send_message', we need to 'toggle' into 'content' mode @@ -474,7 +474,7 @@ def _process_chunk_to_letta_style( assistant_message=cleaned_func_args, ) - # otherwise we just do a regular passthrough of a FunctionCallDelta via a FunctionCallMessage + # otherwise we just do a regular passthrough of a ToolCallDelta via a ToolCallMessage else: tool_call_delta = {} if tool_call.id: @@ -485,13 +485,13 @@ def _process_chunk_to_letta_style( if tool_call.function.name: tool_call_delta["name"] = tool_call.function.name - processed_chunk = FunctionCallMessage( + processed_chunk = ToolCallMessage( id=message_id, date=message_date, - function_call=FunctionCallDelta( + tool_call=ToolCallDelta( name=tool_call_delta.get("name"), arguments=tool_call_delta.get("arguments"), - function_call_id=tool_call_delta.get("id"), + tool_call_id=tool_call_delta.get("id"), ), ) @@ -531,7 +531,7 @@ def _process_chunk_to_letta_style( else: self.function_args_buffer += updates_main_json - # If we have main_json, we should output a FunctionCallMessage + # If we have main_json, we should output a ToolCallMessage elif updates_main_json: # If there's something in the function_name buffer, we should release it first @@ -539,13 +539,13 @@ def _process_chunk_to_letta_style( # however the frontend may expect name first, then args, so to be # safe we'll output name first in a separate chunk if self.function_name_buffer: - processed_chunk = FunctionCallMessage( + processed_chunk = ToolCallMessage( id=message_id, date=message_date, - function_call=FunctionCallDelta( + tool_call=ToolCallDelta( name=self.function_name_buffer, arguments=None, - function_call_id=self.function_id_buffer, + tool_call_id=self.function_id_buffer, ), ) # Clear the buffer @@ -561,20 +561,20 @@ def _process_chunk_to_letta_style( self.function_args_buffer += updates_main_json # If there was nothing in the name buffer, we can proceed to - # output the arguments chunk as a FunctionCallMessage + # output the arguments chunk as a ToolCallMessage else: # There may be a buffer from a previous chunk, for example # if the previous chunk had arguments but we needed to flush name if self.function_args_buffer: # In this case, we should release the buffer + new data at once combined_chunk = self.function_args_buffer + updates_main_json - processed_chunk = FunctionCallMessage( + processed_chunk = ToolCallMessage( id=message_id, date=message_date, - function_call=FunctionCallDelta( + tool_call=ToolCallDelta( name=None, arguments=combined_chunk, - function_call_id=self.function_id_buffer, + tool_call_id=self.function_id_buffer, ), ) # clear buffer @@ -582,13 +582,13 @@ def _process_chunk_to_letta_style( self.function_id_buffer = None else: # If there's no buffer to clear, just output a new chunk with new data - processed_chunk = FunctionCallMessage( + processed_chunk = ToolCallMessage( id=message_id, date=message_date, - function_call=FunctionCallDelta( + tool_call=ToolCallDelta( name=None, arguments=updates_main_json, - function_call_id=self.function_id_buffer, + tool_call_id=self.function_id_buffer, ), ) self.function_id_buffer = None @@ -608,10 +608,10 @@ def _process_chunk_to_letta_style( # # if tool_call.function.name: # # tool_call_delta["name"] = tool_call.function.name - # processed_chunk = FunctionCallMessage( + # processed_chunk = ToolCallMessage( # id=message_id, # date=message_date, - # function_call=FunctionCallDelta(name=tool_call_delta.get("name"), arguments=tool_call_delta.get("arguments")), + # tool_call=ToolCallDelta(name=tool_call_delta.get("name"), arguments=tool_call_delta.get("arguments")), # ) else: @@ -642,10 +642,10 @@ def _process_chunk_to_letta_style( # if tool_call.function.name: # tool_call_delta["name"] = tool_call.function.name - # processed_chunk = FunctionCallMessage( + # processed_chunk = ToolCallMessage( # id=message_id, # date=message_date, - # function_call=FunctionCallDelta(name=tool_call_delta.get("name"), arguments=tool_call_delta.get("arguments")), + # tool_call=ToolCallDelta(name=tool_call_delta.get("name"), arguments=tool_call_delta.get("arguments")), # ) # elif False and self.inner_thoughts_in_kwargs and tool_call.function: @@ -682,13 +682,13 @@ def _process_chunk_to_letta_style( # If it does match, start processing the value (stringified-JSON string # And with each new chunk, output it as a chunk of type InternalMonologue - # If the key doesn't match, then flush the buffer as a single FunctionCallMessage chunk + # If the key doesn't match, then flush the buffer as a single ToolCallMessage chunk # If we're reading a value # If we're reading the inner thoughts value, we output chunks of type InternalMonologue - # Otherwise, do simple chunks of FunctionCallMessage + # Otherwise, do simple chunks of ToolCallMessage else: @@ -701,13 +701,13 @@ def _process_chunk_to_letta_style( if tool_call.function.name: tool_call_delta["name"] = tool_call.function.name - processed_chunk = FunctionCallMessage( + processed_chunk = ToolCallMessage( id=message_id, date=message_date, - function_call=FunctionCallDelta( + tool_call=ToolCallDelta( name=tool_call_delta.get("name"), arguments=tool_call_delta.get("arguments"), - function_call_id=tool_call_delta.get("id"), + tool_call_id=tool_call_delta.get("id"), ), ) @@ -911,13 +911,13 @@ def function_message(self, msg: str, msg_obj: Optional[Message] = None): assistant_message=func_args[self.assistant_message_tool_kwarg], ) else: - processed_chunk = FunctionCallMessage( + processed_chunk = ToolCallMessage( id=msg_obj.id, date=msg_obj.created_at, - function_call=FunctionCall( + tool_call=ToolCall( name=function_call.function.name, arguments=function_call.function.arguments, - function_call_id=function_call.id, + tool_call_id=function_call.id, ), ) @@ -942,24 +942,24 @@ def function_message(self, msg: str, msg_obj: Optional[Message] = None): msg = msg.replace("Success: ", "") # new_message = {"function_return": msg, "status": "success"} assert msg_obj.tool_call_id is not None - new_message = FunctionReturn( + new_message = ToolReturnMessage( id=msg_obj.id, date=msg_obj.created_at, - function_return=msg, + tool_return=msg, status="success", - function_call_id=msg_obj.tool_call_id, + tool_call_id=msg_obj.tool_call_id, ) elif msg.startswith("Error: "): msg = msg.replace("Error: ", "") # new_message = {"function_return": msg, "status": "error"} assert msg_obj.tool_call_id is not None - new_message = FunctionReturn( + new_message = ToolReturnMessage( id=msg_obj.id, date=msg_obj.created_at, - function_return=msg, + tool_return=msg, status="error", - function_call_id=msg_obj.tool_call_id, + tool_call_id=msg_obj.tool_call_id, ) else: diff --git a/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py b/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py index 3dc7916a35..deabcaf5c5 100644 --- a/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py +++ b/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py @@ -4,7 +4,7 @@ from fastapi import APIRouter, Body, Depends, Header, HTTPException from letta.schemas.enums import MessageRole -from letta.schemas.letta_message import FunctionCall, LettaMessage +from letta.schemas.letta_message import ToolCall, LettaMessage from letta.schemas.openai.chat_completion_request import ChatCompletionRequest from letta.schemas.openai.chat_completion_response import ( ChatCompletionResponse, @@ -94,7 +94,7 @@ async def create_chat_completion( created_at = None for letta_msg in response_messages.messages: assert isinstance(letta_msg, LettaMessage) - if isinstance(letta_msg, FunctionCall): + if isinstance(letta_msg, ToolCall): if letta_msg.name and letta_msg.name == "send_message": try: letta_function_call_args = json.loads(letta_msg.arguments) diff --git a/letta/server/rest_api/routers/v1/tools.py b/letta/server/rest_api/routers/v1/tools.py index 15979346c4..500e6fc86e 100644 --- a/letta/server/rest_api/routers/v1/tools.py +++ b/letta/server/rest_api/routers/v1/tools.py @@ -7,7 +7,7 @@ from letta.errors import LettaToolCreateError from letta.orm.errors import UniqueConstraintViolationError -from letta.schemas.letta_message import FunctionReturn +from letta.schemas.letta_message import ToolReturnMessage from letta.schemas.tool import Tool, ToolCreate, ToolRunFromSource, ToolUpdate from letta.schemas.user import User from letta.server.rest_api.utils import get_letta_server @@ -163,7 +163,7 @@ def upsert_base_tools( return server.tool_manager.upsert_base_tools(actor=actor) -@router.post("/run", response_model=FunctionReturn, operation_id="run_tool_from_source") +@router.post("/run", response_model=ToolReturnMessage, operation_id="run_tool_from_source") def run_tool_from_source( server: SyncServer = Depends(get_letta_server), request: ToolRunFromSource = Body(...), diff --git a/letta/server/server.py b/letta/server/server.py index 1b8ff9cdc7..617283345a 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -47,7 +47,7 @@ # openai schemas from letta.schemas.enums import JobStatus from letta.schemas.job import Job, JobUpdate -from letta.schemas.letta_message import FunctionReturn, LettaMessage +from letta.schemas.letta_message import ToolReturnMessage, LettaMessage from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import ( ArchivalMemorySummary, @@ -1350,7 +1350,7 @@ def run_tool_from_source( tool_source: str, tool_source_type: Optional[str] = None, tool_name: Optional[str] = None, - ) -> FunctionReturn: + ) -> ToolReturnMessage: """Run a tool from source code""" try: @@ -1374,24 +1374,24 @@ def run_tool_from_source( # Next, attempt to run the tool with the sandbox try: sandbox_run_result = ToolExecutionSandbox(tool.name, tool_args_dict, actor, tool_object=tool).run(agent_state=agent_state) - return FunctionReturn( + return ToolReturnMessage( id="null", - function_call_id="null", + tool_call_id="null", date=get_utc_time(), status=sandbox_run_result.status, - function_return=str(sandbox_run_result.func_return), + tool_return=str(sandbox_run_result.func_return), stdout=sandbox_run_result.stdout, stderr=sandbox_run_result.stderr, ) except Exception as e: func_return = get_friendly_error_msg(function_name=tool.name, exception_name=type(e).__name__, exception_message=str(e)) - return FunctionReturn( + return ToolReturnMessage( id="null", - function_call_id="null", + tool_call_id="null", date=get_utc_time(), status="error", - function_return=func_return, + tool_return=func_return, stdout=[], stderr=[traceback.format_exc()], ) diff --git a/tests/helpers/endpoints_helper.py b/tests/helpers/endpoints_helper.py index 8f1aa99c74..a526f2315b 100644 --- a/tests/helpers/endpoints_helper.py +++ b/tests/helpers/endpoints_helper.py @@ -15,9 +15,9 @@ from letta.constants import DEFAULT_HUMAN, DEFAULT_PERSONA from letta.embeddings import embedding_model from letta.errors import ( - InvalidFunctionCallError, + InvalidToolCallError, InvalidInnerMonologueError, - MissingFunctionCallError, + MissingToolCallError, MissingInnerMonologueError, ) from letta.llm_api.llm_api_tools import create @@ -25,7 +25,7 @@ from letta.schemas.agent import AgentState from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.letta_message import ( - FunctionCallMessage, + ToolCallMessage, InternalMonologue, LettaMessage, ) @@ -377,23 +377,23 @@ def assert_invoked_send_message_with_keyword(messages: List[LettaMessage], keywo # Find first instance of send_message target_message = None for message in messages: - if isinstance(message, FunctionCallMessage) and message.function_call.name == "send_message": + if isinstance(message, ToolCallMessage) and message.tool_call.name == "send_message": target_message = message break # No messages found with `send_messages` if target_message is None: - raise MissingFunctionCallError(messages=messages, explanation="Missing `send_message` function call") + raise MissingToolCallError(messages=messages, explanation="Missing `send_message` function call") - send_message_function_call = target_message.function_call + send_message_function_call = target_message.tool_call try: arguments = json.loads(send_message_function_call.arguments) except: - raise InvalidFunctionCallError(messages=[target_message], explanation="Function call arguments could not be loaded into JSON") + raise InvalidToolCallError(messages=[target_message], explanation="Function call arguments could not be loaded into JSON") # Message field not in send_message if "message" not in arguments: - raise InvalidFunctionCallError( + raise InvalidToolCallError( messages=[target_message], explanation=f"send_message function call does not have required field `message`" ) @@ -403,16 +403,16 @@ def assert_invoked_send_message_with_keyword(messages: List[LettaMessage], keywo arguments["message"] = arguments["message"].lower() if not keyword in arguments["message"]: - raise InvalidFunctionCallError(messages=[target_message], explanation=f"Message argument did not contain keyword={keyword}") + raise InvalidToolCallError(messages=[target_message], explanation=f"Message argument did not contain keyword={keyword}") def assert_invoked_function_call(messages: List[LettaMessage], function_name: str) -> None: for message in messages: - if isinstance(message, FunctionCallMessage) and message.function_call.name == function_name: + if isinstance(message, ToolCallMessage) and message.tool_call.name == function_name: # Found it, do nothing return - raise MissingFunctionCallError( + raise MissingToolCallError( messages=messages, explanation=f"No messages were found invoking function call with name: {function_name}" ) @@ -446,7 +446,7 @@ def assert_contains_valid_function_call( if (hasattr(message, "function_call") and message.function_call is not None) and ( hasattr(message, "tool_calls") and message.tool_calls is not None ): - raise InvalidFunctionCallError(messages=[message], explanation="Both function_call and tool_calls is present in the message") + raise InvalidToolCallError(messages=[message], explanation="Both function_call and tool_calls is present in the message") elif hasattr(message, "function_call") and message.function_call is not None: function_call = message.function_call elif hasattr(message, "tool_calls") and message.tool_calls is not None: @@ -455,10 +455,10 @@ def assert_contains_valid_function_call( function_call = message.tool_calls[0].function else: # Throw a missing function call error - raise MissingFunctionCallError(messages=[message]) + raise MissingToolCallError(messages=[message]) if function_call_validator and not function_call_validator(function_call): - raise InvalidFunctionCallError(messages=[message], explanation=validation_failure_summary) + raise InvalidToolCallError(messages=[message], explanation=validation_failure_summary) def assert_inner_monologue_is_valid(message: Message) -> None: diff --git a/tests/integration_test_agent_tool_graph.py b/tests/integration_test_agent_tool_graph.py index 336777215d..b013f55cb3 100644 --- a/tests/integration_test_agent_tool_graph.py +++ b/tests/integration_test_agent_tool_graph.py @@ -3,7 +3,7 @@ import pytest from letta import create_client -from letta.schemas.letta_message import FunctionCallMessage +from letta.schemas.letta_message import ToolCallMessage from letta.schemas.tool_rule import ChildToolRule, InitToolRule, TerminalToolRule from tests.helpers.endpoints_helper import ( assert_invoked_function_call, @@ -115,9 +115,9 @@ def test_single_path_agent_tool_call_graph(mock_e2b_api_key_none): tool_names = [t.name for t in [t1, t2, t3, t4]] tool_names += ["send_message"] for m in response.messages: - if isinstance(m, FunctionCallMessage): + if isinstance(m, ToolCallMessage): # Check that it's equal to the first one - assert m.function_call.name == tool_names[0] + assert m.tool_call.name == tool_names[0] # Pop out first one tool_names = tool_names[1:] @@ -220,9 +220,9 @@ def test_claude_initial_tool_rule_enforced(mock_e2b_api_key_none): tool_names = [t.name for t in [t1, t2]] tool_names += ["send_message"] for m in messages: - if isinstance(m, FunctionCallMessage): + if isinstance(m, ToolCallMessage): # Check that it's equal to the first one - assert m.function_call.name == tool_names[0] + assert m.tool_call.name == tool_names[0] # Pop out first one tool_names = tool_names[1:] @@ -273,9 +273,9 @@ def test_agent_no_structured_output_with_one_child_tool(mock_e2b_api_key_none): # Check ordering of tool calls tool_names = [t.name for t in [archival_memory_search, archival_memory_insert, send_message]] for m in response.messages: - if isinstance(m, FunctionCallMessage): + if isinstance(m, ToolCallMessage): # Check that it's equal to the first one - assert m.function_call.name == tool_names[0] + assert m.tool_call.name == tool_names[0] # Pop out first one tool_names = tool_names[1:] diff --git a/tests/test_client.py b/tests/test_client.py index f37fe86267..ec2bb6cb15 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -15,7 +15,7 @@ from letta.schemas.block import CreateBlock from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.job import JobStatus -from letta.schemas.letta_message import FunctionReturn +from letta.schemas.letta_message import ToolReturnMessage from letta.schemas.llm_config import LLMConfig from letta.schemas.sandbox_config import LocalSandboxConfig, SandboxType from letta.utils import create_random_username @@ -365,12 +365,12 @@ def big_return(): response_message = None for message in response.messages: - if isinstance(message, FunctionReturn): + if isinstance(message, ToolReturnMessage): response_message = message break - assert response_message, "FunctionReturn message not found in response" - res = response_message.function_return + assert response_message, "ToolReturnMessage message not found in response" + res = response_message.tool_return assert "function output was truncated " in res # TODO: Re-enable later diff --git a/tests/test_client_legacy.py b/tests/test_client_legacy.py index 7c634e5fa3..30b78c911f 100644 --- a/tests/test_client_legacy.py +++ b/tests/test_client_legacy.py @@ -18,8 +18,8 @@ from letta.schemas.enums import MessageRole, MessageStreamStatus from letta.schemas.letta_message import ( AssistantMessage, - FunctionCallMessage, - FunctionReturn, + ToolCallMessage, + ToolReturnMessage, InternalMonologue, LettaMessage, SystemMessage, @@ -172,8 +172,8 @@ def test_agent_interactions(mock_e2b_api_key_none, client: Union[LocalClient, RE SystemMessage, UserMessage, InternalMonologue, - FunctionCallMessage, - FunctionReturn, + ToolCallMessage, + ToolReturnMessage, AssistantMessage, ], f"Unexpected message type: {type(letta_message)}" @@ -258,7 +258,7 @@ def test_streaming_send_message(mock_e2b_api_key_none, client: RESTClient, agent if isinstance(chunk, InternalMonologue) and chunk.internal_monologue and chunk.internal_monologue != "": inner_thoughts_exist = True inner_thoughts_count += 1 - if isinstance(chunk, FunctionCallMessage) and chunk.function_call and chunk.function_call.name == "send_message": + if isinstance(chunk, ToolCallMessage) and chunk.tool_call and chunk.tool_call.name == "send_message": send_message_ran = True if isinstance(chunk, MessageStreamStatus): if chunk == MessageStreamStatus.done: @@ -534,7 +534,7 @@ def test_message_update(client: Union[LocalClient, RESTClient], agent: AgentStat message_response = client.send_message(agent_id=agent.id, message="Test message", role="user") print("Messages=", message_response) assert isinstance(message_response, LettaResponse) - assert isinstance(message_response.messages[-1], FunctionReturn) + assert isinstance(message_response.messages[-1], ToolReturnMessage) message = message_response.messages[-1] new_text = "This exact string would never show up in the message???" diff --git a/tests/test_server.py b/tests/test_server.py index 2003c68880..fc39d527a5 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -10,8 +10,8 @@ from letta.schemas.block import CreateBlock from letta.schemas.enums import MessageRole from letta.schemas.letta_message import ( - FunctionCallMessage, - FunctionReturn, + ToolCallMessage, + ToolReturnMessage, InternalMonologue, LettaMessage, SystemMessage, @@ -677,14 +677,14 @@ def _test_get_messages_letta_format( print(f"Assistant Message at {i}: {type(letta_message)}") if reverse: - # Reverse handling: FunctionCallMessages come first + # Reverse handling: ToolCallMessage come first if message.tool_calls: for tool_call in message.tool_calls: try: json.loads(tool_call.function.arguments) except json.JSONDecodeError: warnings.warn(f"Invalid JSON in function arguments: {tool_call.function.arguments}") - assert isinstance(letta_message, FunctionCallMessage) + assert isinstance(letta_message, ToolCallMessage) letta_message_index += 1 if letta_message_index >= len(letta_messages): break @@ -710,9 +710,9 @@ def _test_get_messages_letta_format( json.loads(tool_call.function.arguments) except json.JSONDecodeError: warnings.warn(f"Invalid JSON in function arguments: {tool_call.function.arguments}") - assert isinstance(letta_message, FunctionCallMessage) - assert tool_call.function.name == letta_message.function_call.name - assert tool_call.function.arguments == letta_message.function_call.arguments + assert isinstance(letta_message, ToolCallMessage) + assert tool_call.function.name == letta_message.tool_call.name + assert tool_call.function.arguments == letta_message.tool_call.arguments letta_message_index += 1 if letta_message_index >= len(letta_messages): break @@ -729,8 +729,8 @@ def _test_get_messages_letta_format( letta_message_index += 1 elif message.role == MessageRole.tool: - assert isinstance(letta_message, FunctionReturn) - assert message.text == letta_message.function_return + assert isinstance(letta_message, ToolReturnMessage) + assert message.text == letta_message.tool_return letta_message_index += 1 else: @@ -802,7 +802,7 @@ def test_tool_run(server, mock_e2b_api_key_none, user, agent_id): ) print(result) assert result.status == "success" - assert result.function_return == "Ingested message Hello, world!", result.function_return + assert result.tool_return == "Ingested message Hello, world!", result.tool_return assert not result.stdout assert not result.stderr @@ -815,7 +815,7 @@ def test_tool_run(server, mock_e2b_api_key_none, user, agent_id): ) print(result) assert result.status == "success" - assert result.function_return == "Ingested message Well well well", result.function_return + assert result.tool_return == "Ingested message Well well well", result.tool_return assert not result.stdout assert not result.stderr @@ -828,8 +828,8 @@ def test_tool_run(server, mock_e2b_api_key_none, user, agent_id): ) print(result) assert result.status == "error" - assert "Error" in result.function_return, result.function_return - assert "missing 1 required positional argument" in result.function_return, result.function_return + assert "Error" in result.tool_return, result.tool_return + assert "missing 1 required positional argument" in result.tool_return, result.tool_return assert not result.stdout assert result.stderr assert "missing 1 required positional argument" in result.stderr[0] @@ -844,7 +844,7 @@ def test_tool_run(server, mock_e2b_api_key_none, user, agent_id): ) print(result) assert result.status == "success" - assert result.function_return == "Ingested message Well well well", result.function_return + assert result.tool_return == "Ingested message Well well well", result.tool_return assert result.stdout assert "I'm a distractor" in result.stdout[0] assert not result.stderr @@ -859,7 +859,7 @@ def test_tool_run(server, mock_e2b_api_key_none, user, agent_id): ) print(result) assert result.status == "success" - assert result.function_return == "Ingested message Well well well", result.function_return + assert result.tool_return == "Ingested message Well well well", result.tool_return assert result.stdout assert "I'm a distractor" in result.stdout[0] assert not result.stderr @@ -874,7 +874,7 @@ def test_tool_run(server, mock_e2b_api_key_none, user, agent_id): ) print(result) assert result.status == "success" - assert result.function_return == str(None), result.function_return + assert result.tool_return == str(None), result.tool_return assert result.stdout assert "I'm a distractor" in result.stdout[0] assert not result.stderr From a33609205e66fd2726a25c86e535da778affa23e Mon Sep 17 00:00:00 2001 From: "S.Go" <43789832+SwastikGorai@users.noreply.github.com> Date: Fri, 20 Dec 2024 01:43:38 +0530 Subject: [PATCH 113/280] Add support for non pro models (#2285) --- letta/providers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/letta/providers.py b/letta/providers.py index 5721db4627..83069a767f 100644 --- a/letta/providers.py +++ b/letta/providers.py @@ -482,7 +482,8 @@ def list_llm_models(self): model_options = [mo[len("models/") :] if mo.startswith("models/") else mo for mo in model_options] # TODO remove manual filtering for gemini-pro - model_options = [mo for mo in model_options if str(mo).startswith("gemini") and "-pro" in str(mo)] + # Add support for all gemini models + model_options = [mo for mo in model_options if str(mo).startswith("gemini-")] configs = [] for model in model_options: From 8cc6870da9ed68938eb8afd368365b032c1acd0b Mon Sep 17 00:00:00 2001 From: mlong93 <35275280+mlong93@users.noreply.github.com> Date: Thu, 19 Dec 2024 14:54:21 -0800 Subject: [PATCH 114/280] feat: Add ConditionalToolRules (#2279) Co-authored-by: Mindy Long --- letta/agent.py | 21 +- letta/helpers/tool_rule_solver.py | 133 +++--- letta/orm/custom_columns.py | 7 +- letta/schemas/enums.py | 1 + letta/schemas/tool_rule.py | 14 +- tests/helpers/endpoints_helper.py | 6 +- tests/integration_test_agent_tool_graph.py | 398 +++++++++++++++++- .../integration_test_offline_memory_agent.py | 4 +- tests/test_client_legacy.py | 3 +- tests/test_tool_rule_solver.py | 73 +++- 10 files changed, 564 insertions(+), 96 deletions(-) diff --git a/letta/agent.py b/letta/agent.py index b61dce7641..82958acda5 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -1,5 +1,6 @@ import datetime import inspect +import json import time import traceback import warnings @@ -371,6 +372,9 @@ def __init__( self._append_to_messages(added_messages=init_messages_objs) self._validate_message_buffer_is_utc() + # Load last function response from message history + self.last_function_response = self.load_last_function_response() + # Keep track of the total number of messages throughout all time self.messages_total = messages_total if messages_total is not None else (len(self._messages) - 1) # (-system) self.messages_total_init = len(self._messages) - 1 @@ -389,6 +393,19 @@ def check_tool_rules(self): else: self.supports_structured_output = True + def load_last_function_response(self): + """Load the last function response from message history""" + for i in range(len(self._messages) - 1, -1, -1): + msg = self._messages[i] + if msg.role == MessageRole.tool and msg.text: + try: + response_json = json.loads(msg.text) + if response_json.get("message"): + return response_json["message"] + except (json.JSONDecodeError, KeyError): + raise ValueError(f"Invalid JSON format in message: {msg.text}") + return None + def update_memory_if_change(self, new_memory: Memory) -> bool: """ Update internal memory object and system prompt if there have been modifications. @@ -586,7 +603,7 @@ def _get_ai_reply( ) -> ChatCompletionResponse: """Get response from LLM API with robust retry mechanism.""" - allowed_tool_names = self.tool_rules_solver.get_allowed_tool_names() + allowed_tool_names = self.tool_rules_solver.get_allowed_tool_names(last_function_response=self.last_function_response) agent_state_tool_jsons = [t.json_schema for t in self.agent_state.tools] allowed_functions = ( @@ -826,6 +843,7 @@ def _handle_ai_response( error_msg_user = f"{error_msg}\n{traceback.format_exc()}" printd(error_msg_user) function_response = package_function_response(False, error_msg) + self.last_function_response = function_response # TODO: truncate error message somehow messages.append( Message.dict_to_message( @@ -861,6 +879,7 @@ def _handle_ai_response( ) # extend conversation with function response self.interface.function_message(f"Ran {function_name}({function_args})", msg_obj=messages[-1]) self.interface.function_message(f"Success: {function_response_string}", msg_obj=messages[-1]) + self.last_function_response = function_response else: # Standard non-function reply diff --git a/letta/helpers/tool_rule_solver.py b/letta/helpers/tool_rule_solver.py index ef4d9a9b37..02919b2e8a 100644 --- a/letta/helpers/tool_rule_solver.py +++ b/letta/helpers/tool_rule_solver.py @@ -1,4 +1,5 @@ -from typing import Dict, List, Optional, Set +import json +from typing import List, Optional, Union from pydantic import BaseModel, Field @@ -6,6 +7,7 @@ from letta.schemas.tool_rule import ( BaseToolRule, ChildToolRule, + ConditionalToolRule, InitToolRule, TerminalToolRule, ) @@ -22,7 +24,7 @@ class ToolRulesSolver(BaseModel): init_tool_rules: List[InitToolRule] = Field( default_factory=list, description="Initial tool rules to be used at the start of tool execution." ) - tool_rules: List[ChildToolRule] = Field( + tool_rules: List[Union[ChildToolRule, ConditionalToolRule]] = Field( default_factory=list, description="Standard tool rules for controlling execution sequence and allowed transitions." ) terminal_tool_rules: List[TerminalToolRule] = Field( @@ -35,21 +37,25 @@ def __init__(self, tool_rules: List[BaseToolRule], **kwargs): # Separate the provided tool rules into init, standard, and terminal categories for rule in tool_rules: if rule.type == ToolRuleType.run_first: + assert isinstance(rule, InitToolRule) self.init_tool_rules.append(rule) elif rule.type == ToolRuleType.constrain_child_tools: + assert isinstance(rule, ChildToolRule) + self.tool_rules.append(rule) + elif rule.type == ToolRuleType.conditional: + assert isinstance(rule, ConditionalToolRule) + self.validate_conditional_tool(rule) self.tool_rules.append(rule) elif rule.type == ToolRuleType.exit_loop: + assert isinstance(rule, TerminalToolRule) self.terminal_tool_rules.append(rule) - # Validate the tool rules to ensure they form a DAG - if not self.validate_tool_rules(): - raise ToolRuleValidationError("Tool rules contain cycles, which are not allowed in a valid configuration.") def update_tool_usage(self, tool_name: str): """Update the internal state to track the last tool called.""" self.last_tool_name = tool_name - def get_allowed_tool_names(self, error_on_empty: bool = False) -> List[str]: + def get_allowed_tool_names(self, error_on_empty: bool = False, last_function_response: Optional[str] = None) -> List[str]: """Get a list of tool names allowed based on the last tool called.""" if self.last_tool_name is None: # Use initial tool rules if no tool has been called yet @@ -58,18 +64,21 @@ def get_allowed_tool_names(self, error_on_empty: bool = False) -> List[str]: # Find a matching ToolRule for the last tool used current_rule = next((rule for rule in self.tool_rules if rule.tool_name == self.last_tool_name), None) - # Return children which must exist on ToolRule - if current_rule: - return current_rule.children - - # Default to empty if no rule matches - message = "User provided tool rules and execution state resolved to no more possible tool calls." - if error_on_empty: - raise RuntimeError(message) - else: - # warnings.warn(message) + if current_rule is None: + if error_on_empty: + raise ValueError(f"No tool rule found for {self.last_tool_name}") return [] + # If the current rule is a conditional tool rule, use the LLM response to + # determine which child tool to use + if isinstance(current_rule, ConditionalToolRule): + if not last_function_response: + raise ValueError("Conditional tool rule requires an LLM response to determine which child tool to use") + next_tool = self.evaluate_conditional_tool(current_rule, last_function_response) + return [next_tool] if next_tool else [] + + return current_rule.children if current_rule.children else [] + def is_terminal_tool(self, tool_name: str) -> bool: """Check if the tool is defined as a terminal tool in the terminal tool rules.""" return any(rule.tool_name == tool_name for rule in self.terminal_tool_rules) @@ -78,38 +87,60 @@ def has_children_tools(self, tool_name): """Check if the tool has children tools""" return any(rule.tool_name == tool_name for rule in self.tool_rules) - def validate_tool_rules(self) -> bool: - """ - Validate that the tool rules define a directed acyclic graph (DAG). - Returns True if valid (no cycles), otherwise False. - """ - # Build adjacency list for the tool graph - adjacency_list: Dict[str, List[str]] = {rule.tool_name: rule.children for rule in self.tool_rules} - - # Track visited nodes - visited: Set[str] = set() - path_stack: Set[str] = set() - - # Define DFS helper function - def dfs(tool_name: str) -> bool: - if tool_name in path_stack: - return False # Cycle detected - if tool_name in visited: - return True # Already validated - - # Mark the node as visited in the current path - path_stack.add(tool_name) - for child in adjacency_list.get(tool_name, []): - if not dfs(child): - return False # Cycle detected in DFS - path_stack.remove(tool_name) # Remove from current path - visited.add(tool_name) - return True - - # Run DFS from each tool in `tool_rules` - for rule in self.tool_rules: - if rule.tool_name not in visited: - if not dfs(rule.tool_name): - return False # Cycle found, invalid tool rules - - return True # No cycles, valid DAG + def validate_conditional_tool(self, rule: ConditionalToolRule): + ''' + Validate a conditional tool rule + + Args: + rule (ConditionalToolRule): The conditional tool rule to validate + + Raises: + ToolRuleValidationError: If the rule is invalid + ''' + if len(rule.child_output_mapping) == 0: + raise ToolRuleValidationError("Conditional tool rule must have at least one child tool.") + return True + + def evaluate_conditional_tool(self, tool: ConditionalToolRule, last_function_response: str) -> str: + ''' + Parse function response to determine which child tool to use based on the mapping + + Args: + tool (ConditionalToolRule): The conditional tool rule + last_function_response (str): The function response in JSON format + + Returns: + str: The name of the child tool to use next + ''' + json_response = json.loads(last_function_response) + function_output = json_response["message"] + + # Try to match the function output with a mapping key + for key in tool.child_output_mapping: + + # Convert function output to match key type for comparison + if isinstance(key, bool): + typed_output = function_output.lower() == "true" + elif isinstance(key, int): + try: + typed_output = int(function_output) + except (ValueError, TypeError): + continue + elif isinstance(key, float): + try: + typed_output = float(function_output) + except (ValueError, TypeError): + continue + else: # string + if function_output == "True" or function_output == "False": + typed_output = function_output.lower() + elif function_output == "None": + typed_output = None + else: + typed_output = function_output + + if typed_output == key: + return tool.child_output_mapping[key] + + # If no match found, use default + return tool.default_child diff --git a/letta/orm/custom_columns.py b/letta/orm/custom_columns.py index 1d8263e332..f53169d93e 100644 --- a/letta/orm/custom_columns.py +++ b/letta/orm/custom_columns.py @@ -9,7 +9,7 @@ from letta.schemas.enums import ToolRuleType from letta.schemas.llm_config import LLMConfig from letta.schemas.openai.chat_completions import ToolCall, ToolCallFunction -from letta.schemas.tool_rule import ChildToolRule, InitToolRule, TerminalToolRule +from letta.schemas.tool_rule import ChildToolRule, ConditionalToolRule, InitToolRule, TerminalToolRule class EmbeddingConfigColumn(TypeDecorator): @@ -80,7 +80,7 @@ def process_result_value(self, value, dialect) -> List[Union[ChildToolRule, Init return value @staticmethod - def deserialize_tool_rule(data: dict) -> Union[ChildToolRule, InitToolRule, TerminalToolRule]: + def deserialize_tool_rule(data: dict) -> Union[ChildToolRule, InitToolRule, TerminalToolRule, ConditionalToolRule]: """Deserialize a dictionary to the appropriate ToolRule subclass based on the 'type'.""" rule_type = ToolRuleType(data.get("type")) # Remove 'type' field if it exists since it is a class var if rule_type == ToolRuleType.run_first: @@ -90,6 +90,9 @@ def deserialize_tool_rule(data: dict) -> Union[ChildToolRule, InitToolRule, Term elif rule_type == ToolRuleType.constrain_child_tools: rule = ChildToolRule(**data) return rule + elif rule_type == ToolRuleType.conditional: + rule = ConditionalToolRule(**data) + return rule else: raise ValueError(f"Unknown tool rule type: {rule_type}") diff --git a/letta/schemas/enums.py b/letta/schemas/enums.py index 8b74b83732..6183033f54 100644 --- a/letta/schemas/enums.py +++ b/letta/schemas/enums.py @@ -45,5 +45,6 @@ class ToolRuleType(str, Enum): run_first = "InitToolRule" exit_loop = "TerminalToolRule" # reasoning loop should exit continue_loop = "continue_loop" # reasoning loop should continue + conditional = "conditional" constrain_child_tools = "ToolRule" require_parent_tools = "require_parent_tools" diff --git a/letta/schemas/tool_rule.py b/letta/schemas/tool_rule.py index b320917d25..259e5452dc 100644 --- a/letta/schemas/tool_rule.py +++ b/letta/schemas/tool_rule.py @@ -1,4 +1,4 @@ -from typing import List, Union +from typing import Any, Dict, List, Optional, Union from pydantic import Field @@ -21,6 +21,16 @@ class ChildToolRule(BaseToolRule): children: List[str] = Field(..., description="The children tools that can be invoked.") +class ConditionalToolRule(BaseToolRule): + """ + A ToolRule that conditionally maps to different child tools based on the output. + """ + type: ToolRuleType = ToolRuleType.conditional + default_child: Optional[str] = Field(None, description="The default child tool to be called. If None, any tool can be called.") + child_output_mapping: Dict[Any, str] = Field(..., description="The output case to check for mapping") + require_output_mapping: bool = Field(default=False, description="Whether to throw an error when output doesn't match any case") + + class InitToolRule(BaseToolRule): """ Represents the initial tool rule configuration. @@ -37,4 +47,4 @@ class TerminalToolRule(BaseToolRule): type: ToolRuleType = ToolRuleType.exit_loop -ToolRule = Union[ChildToolRule, InitToolRule, TerminalToolRule] +ToolRule = Union[ChildToolRule, InitToolRule, TerminalToolRule, ConditionalToolRule] diff --git a/tests/helpers/endpoints_helper.py b/tests/helpers/endpoints_helper.py index a526f2315b..c9cca1a279 100644 --- a/tests/helpers/endpoints_helper.py +++ b/tests/helpers/endpoints_helper.py @@ -1,7 +1,7 @@ import json import logging import uuid -from typing import Callable, List, Optional, Union +from typing import Callable, List, Optional, Sequence, Union from letta.llm_api.helpers import unpack_inner_thoughts_from_kwargs from letta.schemas.tool_rule import BaseToolRule @@ -373,7 +373,7 @@ def assert_sanity_checks(response: LettaResponse): assert len(response.messages) > 0, response -def assert_invoked_send_message_with_keyword(messages: List[LettaMessage], keyword: str, case_sensitive: bool = False) -> None: +def assert_invoked_send_message_with_keyword(messages: Sequence[LettaMessage], keyword: str, case_sensitive: bool = False) -> None: # Find first instance of send_message target_message = None for message in messages: @@ -406,7 +406,7 @@ def assert_invoked_send_message_with_keyword(messages: List[LettaMessage], keywo raise InvalidToolCallError(messages=[target_message], explanation=f"Message argument did not contain keyword={keyword}") -def assert_invoked_function_call(messages: List[LettaMessage], function_name: str) -> None: +def assert_invoked_function_call(messages: Sequence[LettaMessage], function_name: str) -> None: for message in messages: if isinstance(message, ToolCallMessage) and message.tool_call.name == function_name: # Found it, do nothing diff --git a/tests/integration_test_agent_tool_graph.py b/tests/integration_test_agent_tool_graph.py index b013f55cb3..44aad0d077 100644 --- a/tests/integration_test_agent_tool_graph.py +++ b/tests/integration_test_agent_tool_graph.py @@ -4,7 +4,12 @@ import pytest from letta import create_client from letta.schemas.letta_message import ToolCallMessage -from letta.schemas.tool_rule import ChildToolRule, InitToolRule, TerminalToolRule +from letta.schemas.tool_rule import ( + ChildToolRule, + ConditionalToolRule, + InitToolRule, + TerminalToolRule, +) from tests.helpers.endpoints_helper import ( assert_invoked_function_call, assert_invoked_send_message_with_keyword, @@ -68,6 +73,57 @@ def fourth_secret_word(prev_secret_word: str): return "banana" +def flip_coin(): + """ + Call this to retrieve the password to the secret word, which you will need to output in a send_message later. + If it returns an empty string, try flipping again! + + Returns: + str: The password or an empty string + """ + import random + + # Flip a coin with 50% chance + if random.random() < 0.5: + return "" + return "hj2hwibbqm" + + +def flip_coin_hard(): + """ + Call this to retrieve the password to the secret word, which you will need to output in a send_message later. + If it returns an empty string, try flipping again! + + Returns: + str: The password or an empty string + """ + import random + + # Flip a coin with 50% chance + result = random.random() + if result < 0.5: + return "" + if result < 0.75: + return "START_OVER" + return "hj2hwibbqm" + + +def can_play_game(): + """ + Call this to start the tool chain. + """ + import random + + return random.random() < 0.5 + + +def return_none(): + """ + Really simple function + """ + return None + + def auto_error(): """ If you call this function, it will throw an error automatically. @@ -201,6 +257,7 @@ def test_claude_initial_tool_rule_enforced(mock_e2b_api_key_none): tool_rules = [ InitToolRule(tool_name=t1_name), ChildToolRule(tool_name=t1_name, children=[t2_name]), + TerminalToolRule(tool_name=t2_name) ] tools = [t1, t2] @@ -259,26 +316,331 @@ def test_agent_no_structured_output_with_one_child_tool(mock_e2b_api_key_none): ] for config in config_files: - agent_state = setup_agent(client, config, agent_uuid=agent_uuid, tool_ids=[t.id for t in tools], tool_rules=tool_rules) - response = client.user_message(agent_id=agent_state.id, message="hi. run archival memory search") + max_retries = 3 + last_error = None - # Make checks - assert_sanity_checks(response) + for attempt in range(max_retries): + try: + agent_state = setup_agent(client, config, agent_uuid=agent_uuid, tool_ids=[t.id for t in tools], tool_rules=tool_rules) + response = client.user_message(agent_id=agent_state.id, message="hi. run archival memory search") - # Assert the tools were called - assert_invoked_function_call(response.messages, "archival_memory_search") - assert_invoked_function_call(response.messages, "archival_memory_insert") - assert_invoked_function_call(response.messages, "send_message") + # Make checks + assert_sanity_checks(response) - # Check ordering of tool calls - tool_names = [t.name for t in [archival_memory_search, archival_memory_insert, send_message]] - for m in response.messages: - if isinstance(m, ToolCallMessage): - # Check that it's equal to the first one - assert m.tool_call.name == tool_names[0] + # Assert the tools were called + assert_invoked_function_call(response.messages, "archival_memory_search") + assert_invoked_function_call(response.messages, "archival_memory_insert") + assert_invoked_function_call(response.messages, "send_message") - # Pop out first one - tool_names = tool_names[1:] + # Check ordering of tool calls + tool_names = [t.name for t in [archival_memory_search, archival_memory_insert, send_message]] + for m in response.messages: + if isinstance(m, ToolCallMessage): + # Check that it's equal to the first one + assert m.tool_call.name == tool_names[0] + + # Pop out first one + tool_names = tool_names[1:] + + print(f"Got successful response from client: \n\n{response}") + break # Test passed, exit retry loop + + except AssertionError as e: + last_error = e + print(f"Attempt {attempt + 1} failed, retrying..." if attempt < max_retries - 1 else f"All {max_retries} attempts failed") + cleanup(client=client, agent_uuid=agent_uuid) + continue + + if last_error and attempt == max_retries - 1: + raise last_error # Re-raise the last error if all retries failed - print(f"Got successful response from client: \n\n{response}") cleanup(client=client, agent_uuid=agent_uuid) + + +@pytest.mark.timeout(60) # Sets a 60-second timeout for the test since this could loop infinitely +def test_agent_conditional_tool_easy(mock_e2b_api_key_none): + """ + Test the agent with a conditional tool that has a child tool. + + Tool Flow: + + ------- + | | + | v + -- flip_coin + | + v + reveal_secret_word + """ + + client = create_client() + cleanup(client=client, agent_uuid=agent_uuid) + + coin_flip_name = "flip_coin" + secret_word_tool = "fourth_secret_word" + flip_coin_tool = client.create_or_update_tool(flip_coin, name=coin_flip_name) + reveal_secret = client.create_or_update_tool(fourth_secret_word, name=secret_word_tool) + + # Make tool rules + tool_rules = [ + InitToolRule(tool_name=coin_flip_name), + ConditionalToolRule( + tool_name=coin_flip_name, + default_child=coin_flip_name, + child_output_mapping={ + "hj2hwibbqm": secret_word_tool, + } + ), + TerminalToolRule(tool_name=secret_word_tool), + ] + tools = [flip_coin_tool, reveal_secret] + + config_file = "tests/configs/llm_model_configs/claude-3-sonnet-20240229.json" + agent_state = setup_agent(client, config_file, agent_uuid=agent_uuid, tool_ids=[t.id for t in tools], tool_rules=tool_rules) + response = client.user_message(agent_id=agent_state.id, message="flip a coin until you get the secret word") + + # Make checks + assert_sanity_checks(response) + + # Assert the tools were called + assert_invoked_function_call(response.messages, "flip_coin") + assert_invoked_function_call(response.messages, "fourth_secret_word") + + # Check ordering of tool calls + found_secret_word = False + for m in response.messages: + if isinstance(m, ToolCallMessage): + if m.tool_call.name == secret_word_tool: + # Should be the last tool call + found_secret_word = True + else: + # Before finding secret_word, only flip_coin should be called + assert m.tool_call.name == coin_flip_name + assert not found_secret_word + + # Ensure we found the secret word exactly once + assert found_secret_word + + print(f"Got successful response from client: \n\n{response}") + cleanup(client=client, agent_uuid=agent_uuid) + + + +@pytest.mark.timeout(90) # Longer timeout since this test has more steps +def test_agent_conditional_tool_hard(mock_e2b_api_key_none): + """ + Test the agent with a complex conditional tool graph + + Tool Flow: + + can_play_game <---+ + | | + v | + flip_coin -----+ + | + v + fourth_secret_word + """ + client = create_client() + cleanup(client=client, agent_uuid=agent_uuid) + + # Create tools + play_game = "can_play_game" + coin_flip_name = "flip_coin_hard" + final_tool = "fourth_secret_word" + play_game_tool = client.create_or_update_tool(can_play_game, name=play_game) + flip_coin_tool = client.create_or_update_tool(flip_coin_hard, name=coin_flip_name) + reveal_secret = client.create_or_update_tool(fourth_secret_word, name=final_tool) + + # Make tool rules - chain them together with conditional rules + tool_rules = [ + InitToolRule(tool_name=play_game), + ConditionalToolRule( + tool_name=play_game, + default_child=play_game, # Keep trying if we can't play + child_output_mapping={ + True: coin_flip_name # Only allow access when can_play_game returns True + } + ), + ConditionalToolRule( + tool_name=coin_flip_name, + default_child=coin_flip_name, + child_output_mapping={ + "hj2hwibbqm": final_tool, "START_OVER": play_game + } + ), + TerminalToolRule(tool_name=final_tool), + ] + + # Setup agent with all tools + tools = [play_game_tool, flip_coin_tool, reveal_secret] + config_file = "tests/configs/llm_model_configs/claude-3-sonnet-20240229.json" + agent_state = setup_agent( + client, + config_file, + agent_uuid=agent_uuid, + tool_ids=[t.id for t in tools], + tool_rules=tool_rules + ) + + # Ask agent to try to get all secret words + response = client.user_message(agent_id=agent_state.id, message="hi") + + # Make checks + assert_sanity_checks(response) + + # Assert all tools were called + assert_invoked_function_call(response.messages, play_game) + assert_invoked_function_call(response.messages, final_tool) + + # Check ordering of tool calls + found_words = [] + for m in response.messages: + if isinstance(m, ToolCallMessage): + name = m.tool_call.name + if name in [play_game, coin_flip_name]: + # Before finding secret_word, only can_play_game and flip_coin should be called + assert name in [play_game, coin_flip_name] + else: + # Should find secret words in order + expected_word = final_tool + assert name == expected_word, f"Found {name} but expected {expected_word}" + found_words.append(name) + + # Ensure we found all secret words in order + assert found_words == [final_tool] + + print(f"Got successful response from client: \n\n{response}") + cleanup(client=client, agent_uuid=agent_uuid) + + +@pytest.mark.timeout(60) +def test_agent_conditional_tool_without_default_child(mock_e2b_api_key_none): + """ + Test the agent with a conditional tool that allows any child tool to be called if a function returns None. + + Tool Flow: + + return_none + | + v + any tool... <-- When output doesn't match mapping, agent can call any tool + """ + client = create_client() + cleanup(client=client, agent_uuid=agent_uuid) + + # Create tools - we'll make several available to the agent + tool_name = "return_none" + + tool = client.create_or_update_tool(return_none, name=tool_name) + secret_word = client.create_or_update_tool(first_secret_word, name="first_secret_word") + + # Make tool rules - only map one output, let others be free choice + tool_rules = [ + InitToolRule(tool_name=tool_name), + ConditionalToolRule( + tool_name=tool_name, + default_child=None, # Allow any tool to be called if output doesn't match + child_output_mapping={ + "anything but none": "first_secret_word" + } + ) + ] + tools = [tool, secret_word] + + # Setup agent with all tools + agent_state = setup_agent( + client, + config_file, + agent_uuid=agent_uuid, + tool_ids=[t.id for t in tools], + tool_rules=tool_rules + ) + + # Ask agent to try different tools based on the game output + response = client.user_message( + agent_id=agent_state.id, + message="call a function, any function. then call send_message" + ) + + # Make checks + assert_sanity_checks(response) + + # Assert return_none was called + assert_invoked_function_call(response.messages, tool_name) + + # Assert any base function called afterward + found_any_tool = False + found_return_none = False + for m in response.messages: + if isinstance(m, ToolCallMessage): + if m.tool_call.name == tool_name: + found_return_none = True + elif found_return_none and m.tool_call.name: + found_any_tool = True + break + + assert found_any_tool, "Should have called any tool after return_none" + + print(f"Got successful response from client: \n\n{response}") + cleanup(client=client, agent_uuid=agent_uuid) + + +@pytest.mark.timeout(60) +def test_agent_reload_remembers_function_response(mock_e2b_api_key_none): + """ + Test that when an agent is reloaded, it remembers the last function response for conditional tool chaining. + + Tool Flow: + + flip_coin + | + v + fourth_secret_word <-- Should remember coin flip result after reload + """ + client = create_client() + cleanup(client=client, agent_uuid=agent_uuid) + + # Create tools + flip_coin_name = "flip_coin" + secret_word = "fourth_secret_word" + flip_coin_tool = client.create_or_update_tool(flip_coin, name=flip_coin_name) + secret_word_tool = client.create_or_update_tool(fourth_secret_word, name=secret_word) + + # Make tool rules - map coin flip to fourth_secret_word + tool_rules = [ + InitToolRule(tool_name=flip_coin_name), + ConditionalToolRule( + tool_name=flip_coin_name, + default_child=flip_coin_name, # Allow any tool to be called if output doesn't match + child_output_mapping={ + "hj2hwibbqm": secret_word + } + ), + TerminalToolRule(tool_name=secret_word) + ] + tools = [flip_coin_tool, secret_word_tool] + + # Setup initial agent + agent_state = setup_agent( + client, config_file, agent_uuid=agent_uuid, tool_ids=[t.id for t in tools], tool_rules=tool_rules + ) + + # Call flip_coin first + response = client.user_message(agent_id=agent_state.id, message="flip a coin") + assert_invoked_function_call(response.messages, flip_coin_name) + assert_invoked_function_call(response.messages, secret_word) + found_fourth_secret = False + for m in response.messages: + if isinstance(m, ToolCallMessage) and m.tool_call.name == secret_word: + found_fourth_secret = True + break + + assert found_fourth_secret, "Reloaded agent should remember coin flip result and call fourth_secret_word if True" + + # Reload the agent + reloaded_agent = client.server.load_agent(agent_id=agent_state.id, actor=client.user) + assert reloaded_agent.last_function_response is not None + + print(f"Got successful response from client: \n\n{response}") + cleanup(client=client, agent_uuid=agent_uuid) \ No newline at end of file diff --git a/tests/integration_test_offline_memory_agent.py b/tests/integration_test_offline_memory_agent.py index 07b7c732b2..15d4161d5e 100644 --- a/tests/integration_test_offline_memory_agent.py +++ b/tests/integration_test_offline_memory_agent.py @@ -74,8 +74,8 @@ def test_ripple_edit(client, mock_e2b_api_key_none): assert set(conversation_agent.memory.list_block_labels()) == {"persona", "human", "fact_block", "rethink_memory_block"} - rethink_memory_tool = client.create_tool(rethink_memory) - finish_rethinking_memory_tool = client.create_tool(finish_rethinking_memory) + rethink_memory_tool = client.create_or_update_tool(rethink_memory) + finish_rethinking_memory_tool = client.create_or_update_tool(finish_rethinking_memory) offline_memory_agent = client.create_agent( name="offline_memory_agent", agent_type=AgentType.offline_memory_agent, diff --git a/tests/test_client_legacy.py b/tests/test_client_legacy.py index 30b78c911f..6d13046cd0 100644 --- a/tests/test_client_legacy.py +++ b/tests/test_client_legacy.py @@ -529,6 +529,7 @@ def test_sources(client: Union[LocalClient, RESTClient], agent: AgentState): def test_message_update(client: Union[LocalClient, RESTClient], agent: AgentState): """Test that we can update the details of a message""" + import json # create a message message_response = client.send_message(agent_id=agent.id, message="Test message", role="user") @@ -537,7 +538,7 @@ def test_message_update(client: Union[LocalClient, RESTClient], agent: AgentStat assert isinstance(message_response.messages[-1], ToolReturnMessage) message = message_response.messages[-1] - new_text = "This exact string would never show up in the message???" + new_text = json.dumps({"message": "This exact string would never show up in the message???"}) new_message = client.update_message(message_id=message.id, text=new_text, agent_id=agent.id) assert new_message.text == new_text diff --git a/tests/test_tool_rule_solver.py b/tests/test_tool_rule_solver.py index 9de6a6302b..c524d53a34 100644 --- a/tests/test_tool_rule_solver.py +++ b/tests/test_tool_rule_solver.py @@ -2,7 +2,12 @@ from letta.helpers import ToolRulesSolver from letta.helpers.tool_rule_solver import ToolRuleValidationError -from letta.schemas.tool_rule import ChildToolRule, InitToolRule, TerminalToolRule +from letta.schemas.tool_rule import ( + ChildToolRule, + ConditionalToolRule, + InitToolRule, + TerminalToolRule +) # Constants for tool names used in the tests START_TOOL = "start_tool" @@ -60,7 +65,7 @@ def test_get_allowed_tool_names_no_matching_rule_warning(): # Action: Set last tool to an unrecognized tool and check warnings solver.update_tool_usage(UNRECOGNIZED_TOOL) - # NOTE: removed for now since this warning is getting triggered on every LLM call + # # NOTE: removed for now since this warning is getting triggered on every LLM call # with warnings.catch_warnings(record=True) as w: # allowed_tools = solver.get_allowed_tool_names() @@ -75,9 +80,9 @@ def test_get_allowed_tool_names_no_matching_rule_error(): init_rule = InitToolRule(tool_name=START_TOOL) solver = ToolRulesSolver(init_tool_rules=[init_rule], tool_rules=[], terminal_tool_rules=[]) - # Action & Assert: Set last tool to an unrecognized tool and expect RuntimeError when error_on_empty=True + # Action & Assert: Set last tool to an unrecognized tool and expect ValueError solver.update_tool_usage(UNRECOGNIZED_TOOL) - with pytest.raises(RuntimeError, match="resolved to no more possible tool calls"): + with pytest.raises(ValueError, match=f"No tool rule found for {UNRECOGNIZED_TOOL}"): solver.get_allowed_tool_names(error_on_empty=True) @@ -104,7 +109,46 @@ def test_update_tool_usage_and_get_allowed_tool_names_combined(): assert solver.is_terminal_tool(FINAL_TOOL) is True, "Should recognize 'final_tool' as terminal" -def test_tool_rules_with_cycle_detection(): +def test_conditional_tool_rule(): + # Setup: Define a conditional tool rule + init_rule = InitToolRule(tool_name=START_TOOL) + terminal_rule = TerminalToolRule(tool_name=END_TOOL) + rule = ConditionalToolRule( + tool_name=START_TOOL, + default_child=None, + child_output_mapping={True: END_TOOL, False: START_TOOL} + ) + solver = ToolRulesSolver(tool_rules=[init_rule, rule, terminal_rule]) + + # Action & Assert: Verify the rule properties + # Step 1: Initially allowed tools + assert solver.get_allowed_tool_names() == [START_TOOL], "Initial allowed tool should be 'start_tool'" + + # Step 2: After using 'start_tool' + solver.update_tool_usage(START_TOOL) + assert solver.get_allowed_tool_names(last_function_response='{"message": "true"}') == [END_TOOL], "After 'start_tool' returns true, should allow 'end_tool'" + assert solver.get_allowed_tool_names(last_function_response='{"message": "false"}') == [START_TOOL], "After 'start_tool' returns false, should allow 'start_tool'" + + # Step 3: After using 'end_tool' + assert solver.is_terminal_tool(END_TOOL) is True, "Should recognize 'end_tool' as terminal" + + +def test_invalid_conditional_tool_rule(): + # Setup: Define an invalid conditional tool rule + init_rule = InitToolRule(tool_name=START_TOOL) + terminal_rule = TerminalToolRule(tool_name=END_TOOL) + invalid_rule_1 = ConditionalToolRule( + tool_name=START_TOOL, + default_child=END_TOOL, + child_output_mapping={} + ) + + # Test 1: Missing child output mapping + with pytest.raises(ToolRuleValidationError, match="Conditional tool rule must have at least one child tool."): + ToolRulesSolver(tool_rules=[init_rule, invalid_rule_1, terminal_rule]) + + +def test_tool_rules_with_invalid_path(): # Setup: Define tool rules with both connected, disconnected nodes and a cycle init_rule = InitToolRule(tool_name=START_TOOL) rule_1 = ChildToolRule(tool_name=START_TOOL, children=[NEXT_TOOL]) @@ -113,15 +157,12 @@ def test_tool_rules_with_cycle_detection(): rule_4 = ChildToolRule(tool_name=FINAL_TOOL, children=[END_TOOL]) # Disconnected rule, no cycle here terminal_rule = TerminalToolRule(tool_name=END_TOOL) - # Action & Assert: Attempt to create the ToolRulesSolver with a cycle should raise ValidationError - with pytest.raises(ToolRuleValidationError, match="Tool rules contain cycles"): - ToolRulesSolver(tool_rules=[init_rule, rule_1, rule_2, rule_3, rule_4, terminal_rule]) - - # Extra setup: Define tool rules without a cycle but with hanging nodes - rule_5 = ChildToolRule(tool_name=PREP_TOOL, children=[FINAL_TOOL]) # Hanging node with no connection to start_tool + ToolRulesSolver(tool_rules=[init_rule, rule_1, rule_2, rule_3, rule_4, terminal_rule]) - # Assert that a configuration without cycles does not raise an error - try: - ToolRulesSolver(tool_rules=[init_rule, rule_1, rule_2, rule_4, rule_5, terminal_rule]) - except ToolRuleValidationError: - pytest.fail("ToolRulesSolver raised ValidationError unexpectedly on a valid DAG with hanging nodes") + # Now: add a path from the start tool to the final tool + rule_5 = ConditionalToolRule( + tool_name=HELPER_TOOL, + default_child=FINAL_TOOL, + child_output_mapping={True: START_TOOL, False: FINAL_TOOL}, + ) + ToolRulesSolver(tool_rules=[init_rule, rule_1, rule_2, rule_3, rule_4, rule_5, terminal_rule]) From 1aaca7f597ff8e60d512280e3d9c9bb29a67b2a5 Mon Sep 17 00:00:00 2001 From: cthomas Date: Thu, 19 Dec 2024 15:16:36 -0800 Subject: [PATCH 115/280] feat: rename internal monologue (#2289) --- examples/helper.py | 2 ++ letta/client/streaming.py | 6 +++--- letta/schemas/letta_message.py | 28 +++++++++++++++++++++------- letta/schemas/letta_response.py | 2 ++ letta/schemas/message.py | 6 +++--- letta/server/rest_api/interface.py | 20 ++++++++++---------- tests/helpers/endpoints_helper.py | 4 ++-- tests/test_client_legacy.py | 6 +++--- tests/test_server.py | 6 +++--- 9 files changed, 49 insertions(+), 31 deletions(-) diff --git a/examples/helper.py b/examples/helper.py index f19e8ffb13..18b60cc446 100644 --- a/examples/helper.py +++ b/examples/helper.py @@ -95,6 +95,8 @@ def nb_print(messages): def get_formatted_content(msg): if msg.message_type == "internal_monologue": return f'
    {html.escape(msg.internal_monologue)}
    ' + elif msg.message_type == "reasoning_message": + return f'
    {html.escape(msg.reasoning)}
    ' elif msg.message_type == "function_call": args = format_json(msg.function_call.arguments) return f'
    {html.escape(msg.function_call.name)}({args})
    ' diff --git a/letta/client/streaming.py b/letta/client/streaming.py index 9f57352b73..4a258cdc7a 100644 --- a/letta/client/streaming.py +++ b/letta/client/streaming.py @@ -10,7 +10,7 @@ from letta.schemas.letta_message import ( ToolCallMessage, ToolReturnMessage, - InternalMonologue, + ReasoningMessage, ) from letta.schemas.letta_response import LettaStreamingResponse from letta.schemas.usage import LettaUsageStatistics @@ -53,8 +53,8 @@ def _sse_post(url: str, data: dict, headers: dict) -> Generator[LettaStreamingRe yield MessageStreamStatus(sse.data) else: chunk_data = json.loads(sse.data) - if "internal_monologue" in chunk_data: - yield InternalMonologue(**chunk_data) + if "reasoning" in chunk_data: + yield ReasoningMessage(**chunk_data) elif "tool_call" in chunk_data: yield ToolCallMessage(**chunk_data) elif "tool_return" in chunk_data: diff --git a/letta/schemas/letta_message.py b/letta/schemas/letta_message.py index 424a003844..45fcf36180 100644 --- a/letta/schemas/letta_message.py +++ b/letta/schemas/letta_message.py @@ -60,18 +60,18 @@ class UserMessage(LettaMessage): message: str -class InternalMonologue(LettaMessage): +class ReasoningMessage(LettaMessage): """ - Representation of an agent's internal monologue. + Representation of an agent's internal reasoning. Attributes: - internal_monologue (str): The internal monologue of the agent + reasoning (str): The internal reasoning of the agent id (str): The ID of the message date (datetime): The date the message was created in ISO format """ - message_type: Literal["internal_monologue"] = "internal_monologue" - internal_monologue: str + message_type: Literal["reasoning_message"] = "reasoning_message" + reasoning: str class ToolCall(BaseModel): @@ -196,10 +196,24 @@ class LegacyFunctionReturn(LettaMessage): stderr: Optional[List[str]] = None -LegacyLettaMessage = Union[InternalMonologue, AssistantMessage, LegacyFunctionCallMessage, LegacyFunctionReturn] +class LegacyInternalMonologue(LettaMessage): + """ + Representation of an agent's internal monologue. + + Attributes: + internal_monologue (str): The internal monologue of the agent + id (str): The ID of the message + date (datetime): The date the message was created in ISO format + """ + + message_type: Literal["internal_monologue"] = "internal_monologue" + internal_monologue: str + + +LegacyLettaMessage = Union[LegacyInternalMonologue, AssistantMessage, LegacyFunctionCallMessage, LegacyFunctionReturn] LettaMessageUnion = Annotated[ - Union[SystemMessage, UserMessage, InternalMonologue, ToolCallMessage, ToolReturnMessage, AssistantMessage], + Union[SystemMessage, UserMessage, ReasoningMessage, ToolCallMessage, ToolReturnMessage, AssistantMessage], Field(discriminator="message_type"), ] diff --git a/letta/schemas/letta_response.py b/letta/schemas/letta_response.py index 990a55cb15..c6a1e8be58 100644 --- a/letta/schemas/letta_response.py +++ b/letta/schemas/letta_response.py @@ -40,6 +40,8 @@ def _repr_html_(self): def get_formatted_content(msg): if msg.message_type == "internal_monologue": return f'
    {html.escape(msg.internal_monologue)}
    ' + if msg.message_type == "reasoning_message": + return f'
    {html.escape(msg.reasoning)}
    ' elif msg.message_type == "function_call": args = format_json(msg.function_call.arguments) return f'
    {html.escape(msg.function_call.name)}({args})
    ' diff --git a/letta/schemas/message.py b/letta/schemas/message.py index b548ec256a..74bb813567 100644 --- a/letta/schemas/message.py +++ b/letta/schemas/message.py @@ -19,7 +19,7 @@ ToolCall as LettaToolCall, ToolCallMessage, ToolReturnMessage, - InternalMonologue, + ReasoningMessage, LettaMessage, SystemMessage, UserMessage, @@ -145,10 +145,10 @@ def to_letta_message( if self.text is not None: # This is type InnerThoughts messages.append( - InternalMonologue( + ReasoningMessage( id=self.id, date=self.created_at, - internal_monologue=self.text, + reasoning=self.text, ) ) if self.tool_calls is not None: diff --git a/letta/server/rest_api/interface.py b/letta/server/rest_api/interface.py index 85248ec3bb..b3d344798b 100644 --- a/letta/server/rest_api/interface.py +++ b/letta/server/rest_api/interface.py @@ -16,7 +16,7 @@ ToolCallDelta, ToolCallMessage, ToolReturnMessage, - InternalMonologue, + ReasoningMessage, LegacyFunctionCallMessage, LegacyLettaMessage, LettaMessage, @@ -411,7 +411,7 @@ def clear(): def _process_chunk_to_letta_style( self, chunk: ChatCompletionChunkResponse, message_id: str, message_date: datetime - ) -> Optional[Union[InternalMonologue, ToolCallMessage, AssistantMessage]]: + ) -> Optional[Union[ReasoningMessage, ToolCallMessage, AssistantMessage]]: """ Example data from non-streaming response looks like: @@ -426,10 +426,10 @@ def _process_chunk_to_letta_style( # inner thoughts if message_delta.content is not None: - processed_chunk = InternalMonologue( + processed_chunk = ReasoningMessage( id=message_id, date=message_date, - internal_monologue=message_delta.content, + reasoning=message_delta.content, ) # tool calls @@ -518,10 +518,10 @@ def _process_chunk_to_letta_style( # If we have inner thoughts, we should output them as a chunk if updates_inner_thoughts: - processed_chunk = InternalMonologue( + processed_chunk = ReasoningMessage( id=message_id, date=message_date, - internal_monologue=updates_inner_thoughts, + reasoning=updates_inner_thoughts, ) # Additionally inner thoughts may stream back with a chunk of main JSON # In that case, since we can only return a chunk at a time, we should buffer it @@ -680,13 +680,13 @@ def _process_chunk_to_letta_style( # Once we get a complete key, check if the key matches # If it does match, start processing the value (stringified-JSON string - # And with each new chunk, output it as a chunk of type InternalMonologue + # And with each new chunk, output it as a chunk of type ReasoningMessage # If the key doesn't match, then flush the buffer as a single ToolCallMessage chunk # If we're reading a value - # If we're reading the inner thoughts value, we output chunks of type InternalMonologue + # If we're reading the inner thoughts value, we output chunks of type ReasoningMessage # Otherwise, do simple chunks of ToolCallMessage @@ -823,10 +823,10 @@ def internal_monologue(self, msg: str, msg_obj: Optional[Message] = None): # "id": str(msg_obj.id) if msg_obj is not None else None, # } assert msg_obj is not None, "Internal monologue requires msg_obj references for metadata" - processed_chunk = InternalMonologue( + processed_chunk = ReasoningMessage( id=msg_obj.id, date=msg_obj.created_at, - internal_monologue=msg, + reasoning=msg, ) self._push_to_buffer(processed_chunk) diff --git a/tests/helpers/endpoints_helper.py b/tests/helpers/endpoints_helper.py index c9cca1a279..27a7b1210b 100644 --- a/tests/helpers/endpoints_helper.py +++ b/tests/helpers/endpoints_helper.py @@ -26,7 +26,7 @@ from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.letta_message import ( ToolCallMessage, - InternalMonologue, + ReasoningMessage, LettaMessage, ) from letta.schemas.letta_response import LettaResponse @@ -419,7 +419,7 @@ def assert_invoked_function_call(messages: Sequence[LettaMessage], function_name def assert_inner_monologue_is_present_and_valid(messages: List[LettaMessage]) -> None: for message in messages: - if isinstance(message, InternalMonologue): + if isinstance(message, ReasoningMessage): # Found it, do nothing return diff --git a/tests/test_client_legacy.py b/tests/test_client_legacy.py index 6d13046cd0..16dc1cd6b4 100644 --- a/tests/test_client_legacy.py +++ b/tests/test_client_legacy.py @@ -20,7 +20,7 @@ AssistantMessage, ToolCallMessage, ToolReturnMessage, - InternalMonologue, + ReasoningMessage, LettaMessage, SystemMessage, UserMessage, @@ -171,7 +171,7 @@ def test_agent_interactions(mock_e2b_api_key_none, client: Union[LocalClient, RE assert type(letta_message) in [ SystemMessage, UserMessage, - InternalMonologue, + ReasoningMessage, ToolCallMessage, ToolReturnMessage, AssistantMessage, @@ -255,7 +255,7 @@ def test_streaming_send_message(mock_e2b_api_key_none, client: RESTClient, agent assert response, "Sending message failed" for chunk in response: assert isinstance(chunk, LettaStreamingResponse) - if isinstance(chunk, InternalMonologue) and chunk.internal_monologue and chunk.internal_monologue != "": + if isinstance(chunk, ReasoningMessage) and chunk.reasoning and chunk.reasoning != "": inner_thoughts_exist = True inner_thoughts_count += 1 if isinstance(chunk, ToolCallMessage) and chunk.tool_call and chunk.tool_call.name == "send_message": diff --git a/tests/test_server.py b/tests/test_server.py index fc39d527a5..2209c8bcff 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -12,7 +12,7 @@ from letta.schemas.letta_message import ( ToolCallMessage, ToolReturnMessage, - InternalMonologue, + ReasoningMessage, LettaMessage, SystemMessage, UserMessage, @@ -691,14 +691,14 @@ def _test_get_messages_letta_format( letta_message = letta_messages[letta_message_index] if message.text: - assert isinstance(letta_message, InternalMonologue) + assert isinstance(letta_message, ReasoningMessage) letta_message_index += 1 else: assert message.tool_calls is not None else: # Non-reverse handling if message.text: - assert isinstance(letta_message, InternalMonologue) + assert isinstance(letta_message, ReasoningMessage) letta_message_index += 1 if letta_message_index >= len(letta_messages): break From 3e87fc74aa8d3b81ed5edc62349913558e67fb2b Mon Sep 17 00:00:00 2001 From: cthomas Date: Thu, 19 Dec 2024 15:42:04 -0800 Subject: [PATCH 116/280] feat: add new ContextWindowExceededError (#2272) From 4ab3d91c41b98081768e1da0b10b112ca9c45e21 Mon Sep 17 00:00:00 2001 From: dboyliao Date: Sat, 21 Dec 2024 02:55:41 +0800 Subject: [PATCH 117/280] Fix bug: add required argument `actor` (`load_file_to_source`). (#2292) --- letta/client/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/letta/client/client.py b/letta/client/client.py index 8a9d3e700a..e242bfb264 100644 --- a/letta/client/client.py +++ b/letta/client/client.py @@ -2909,7 +2909,7 @@ def load_file_to_source(self, filename: str, source_id: str, blocking=True): job = self.server.job_manager.create_job(pydantic_job=job, actor=self.user) # TODO: implement blocking vs. non-blocking - self.server.load_file_to_source(source_id=source_id, file_path=filename, job_id=job.id) + self.server.load_file_to_source(source_id=source_id, file_path=filename, job_id=job.id, actor=self.user) return job def delete_file_from_source(self, source_id: str, file_id: str): From 108a460d38cf21d998be59e25ce924e41a91f240 Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Fri, 20 Dec 2024 11:01:22 -0800 Subject: [PATCH 118/280] chore: bump version to 0.6.6 (#2293) --- letta/__init__.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/letta/__init__.py b/letta/__init__.py index 2aabb1ba2c..826b03f991 100644 --- a/letta/__init__.py +++ b/letta/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.6.5" +__version__ = "0.6.6" # import clients from letta.client.client import LocalClient, RESTClient, create_client diff --git a/pyproject.toml b/pyproject.toml index 1278e9425e..0a8c73325b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "letta" -version = "0.6.5" +version = "0.6.6" packages = [ {include = "letta"} ] From 47faa11f59cbc009513d4b56a2664bd69d5c7e7f Mon Sep 17 00:00:00 2001 From: Shubham Naik Date: Fri, 20 Dec 2024 15:40:33 -0800 Subject: [PATCH 119/280] feat: add error codes to composio errors (#2290) Co-authored-by: Shubham Naik --- letta/server/rest_api/routers/v1/tools.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/letta/server/rest_api/routers/v1/tools.py b/letta/server/rest_api/routers/v1/tools.py index 500e6fc86e..d1287bc8b4 100644 --- a/letta/server/rest_api/routers/v1/tools.py +++ b/letta/server/rest_api/routers/v1/tools.py @@ -243,6 +243,7 @@ def add_composio_tool( raise HTTPException( status_code=400, # Bad Request detail={ + "code": "EnumStringNotFound", "message": f"Cannot find composio action with name `{composio_action_name}`.", "composio_action_name": composio_action_name, }, @@ -251,6 +252,7 @@ def add_composio_tool( raise HTTPException( status_code=400, # Bad Request detail={ + "code": "ComposioSDKError", "message": f"No connected account found for tool `{composio_action_name}`. You need to connect the relevant app in Composio order to use the tool.", "composio_action_name": composio_action_name, }, From a6d09997e8b6d16f86def7832932ebefe9714cd4 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Fri, 20 Dec 2024 15:52:04 -0800 Subject: [PATCH 120/280] fix: Remove in-memory `_messages` field on Agent (#2295) --- .github/workflows/tests.yml | 1 - letta/agent.py | 708 ++---------------- letta/chat_only_agent.py | 4 +- letta/client/client.py | 12 +- letta/main.py | 76 -- letta/offline_memory_agent.py | 3 +- letta/server/rest_api/routers/v1/agents.py | 17 +- letta/server/server.py | 207 +---- letta/services/agent_manager.py | 154 +++- .../services/helpers/agent_manager_helper.py | 174 ++++- letta/services/message_manager.py | 15 + tests/helpers/endpoints_helper.py | 25 +- tests/integration_test_summarizer.py | 110 ++- tests/test_client_legacy.py | 17 +- tests/test_local_client.py | 6 +- tests/test_managers.py | 73 +- tests/test_server.py | 79 +- tests/test_summarize.py | 133 ---- 18 files changed, 650 insertions(+), 1164 deletions(-) delete mode 100644 tests/test_summarize.py diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 43e66727ab..e4c46c5e85 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -33,7 +33,6 @@ jobs: - "test_memory.py" - "test_utils.py" - "test_stream_buffer_readers.py" - - "test_summarize.py" services: qdrant: image: qdrant/qdrant diff --git a/letta/agent.py b/letta/agent.py index 82958acda5..4f636938a6 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -1,25 +1,22 @@ -import datetime import inspect import json import time import traceback import warnings from abc import ABC, abstractmethod -from typing import List, Literal, Optional, Tuple, Union +from typing import List, Optional, Tuple, Union from letta.constants import ( BASE_TOOLS, CLI_WARNING_PREFIX, FIRST_MESSAGE_ATTEMPTS, FUNC_FAILED_HEARTBEAT_MESSAGE, - IN_CONTEXT_MEMORY_KEYWORD, LLM_MAX_TOKENS, MESSAGE_SUMMARY_TRUNC_KEEP_N_LAST, MESSAGE_SUMMARY_TRUNC_TOKEN_FRAC, MESSAGE_SUMMARY_WARNING_FRAC, O1_BASE_TOOLS, REQ_HEARTBEAT_MESSAGE, - STRUCTURED_OUTPUT_MODELS, ) from letta.errors import ContextWindowExceededError from letta.helpers import ToolRulesSolver @@ -34,7 +31,7 @@ from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.enums import MessageRole from letta.schemas.memory import ContextWindowOverview, Memory -from letta.schemas.message import Message, MessageUpdate +from letta.schemas.message import Message from letta.schemas.openai.chat_completion_request import ( Tool as ChatCompletionRequestTool, ) @@ -49,6 +46,10 @@ from letta.schemas.user import User as PydanticUser from letta.services.agent_manager import AgentManager from letta.services.block_manager import BlockManager +from letta.services.helpers.agent_manager_helper import ( + check_supports_structured_output, + compile_memory_metadata_block, +) from letta.services.message_manager import MessageManager from letta.services.passage_manager import PassageManager from letta.services.source_manager import SourceManager @@ -56,8 +57,6 @@ from letta.streaming_interface import StreamingRefreshCLIInterface from letta.system import ( get_heartbeat, - get_initial_boot_messages, - get_login_event, get_token_limit_warning, package_function_response, package_summarize_message, @@ -66,166 +65,20 @@ from letta.utils import ( count_tokens, get_friendly_error_msg, - get_local_time, get_tool_call_id, get_utc_time, - is_utc_datetime, json_dumps, json_loads, parse_json, printd, - united_diff, validate_function_response, - verify_first_message_correctness, ) -def compile_memory_metadata_block( - actor: PydanticUser, - agent_id: str, - memory_edit_timestamp: datetime.datetime, - agent_manager: Optional[AgentManager] = None, - message_manager: Optional[MessageManager] = None, -) -> str: - # Put the timestamp in the local timezone (mimicking get_local_time()) - timestamp_str = memory_edit_timestamp.astimezone().strftime("%Y-%m-%d %I:%M:%S %p %Z%z").strip() - - # Create a metadata block of info so the agent knows about the metadata of out-of-context memories - memory_metadata_block = "\n".join( - [ - f"### Memory [last modified: {timestamp_str}]", - f"{message_manager.size(actor=actor, agent_id=agent_id) if message_manager else 0} previous messages between you and the user are stored in recall memory (use functions to access them)", - f"{agent_manager.passage_size(actor=actor, agent_id=agent_id) if agent_manager else 0} total memories you created are stored in archival memory (use functions to access them)", - "\nCore memory shown below (limited in size, additional information stored in archival / recall memory):", - ] - ) - return memory_metadata_block - - -def compile_system_message( - system_prompt: str, - agent_id: str, - in_context_memory: Memory, - in_context_memory_last_edit: datetime.datetime, # TODO move this inside of BaseMemory? - actor: PydanticUser, - agent_manager: Optional[AgentManager] = None, - message_manager: Optional[MessageManager] = None, - user_defined_variables: Optional[dict] = None, - append_icm_if_missing: bool = True, - template_format: Literal["f-string", "mustache", "jinja2"] = "f-string", -) -> str: - """Prepare the final/full system message that will be fed into the LLM API - - The base system message may be templated, in which case we need to render the variables. - - The following are reserved variables: - - CORE_MEMORY: the in-context memory of the LLM - """ - - if user_defined_variables is not None: - # TODO eventually support the user defining their own variables to inject - raise NotImplementedError - else: - variables = {} - - # Add the protected memory variable - if IN_CONTEXT_MEMORY_KEYWORD in variables: - raise ValueError(f"Found protected variable '{IN_CONTEXT_MEMORY_KEYWORD}' in user-defined vars: {str(user_defined_variables)}") - else: - # TODO should this all put into the memory.__repr__ function? - memory_metadata_string = compile_memory_metadata_block( - actor=actor, - agent_id=agent_id, - memory_edit_timestamp=in_context_memory_last_edit, - agent_manager=agent_manager, - message_manager=message_manager, - ) - full_memory_string = memory_metadata_string + "\n" + in_context_memory.compile() - - # Add to the variables list to inject - variables[IN_CONTEXT_MEMORY_KEYWORD] = full_memory_string - - if template_format == "f-string": - - # Catch the special case where the system prompt is unformatted - if append_icm_if_missing: - memory_variable_string = "{" + IN_CONTEXT_MEMORY_KEYWORD + "}" - if memory_variable_string not in system_prompt: - # In this case, append it to the end to make sure memory is still injected - # warnings.warn(f"{IN_CONTEXT_MEMORY_KEYWORD} variable was missing from system prompt, appending instead") - system_prompt += "\n" + memory_variable_string - - # render the variables using the built-in templater - try: - formatted_prompt = system_prompt.format_map(variables) - except Exception as e: - raise ValueError(f"Failed to format system prompt - {str(e)}. System prompt value:\n{system_prompt}") - - else: - # TODO support for mustache and jinja2 - raise NotImplementedError(template_format) - - return formatted_prompt - - -def initialize_message_sequence( - model: str, - system: str, - agent_id: str, - memory: Memory, - actor: PydanticUser, - agent_manager: Optional[AgentManager] = None, - message_manager: Optional[MessageManager] = None, - memory_edit_timestamp: Optional[datetime.datetime] = None, - include_initial_boot_message: bool = True, -) -> List[dict]: - if memory_edit_timestamp is None: - memory_edit_timestamp = get_local_time() - - # full_system_message = construct_system_with_memory( - # system, memory, memory_edit_timestamp, agent_manager=agent_manager, recall_memory=recall_memory - # ) - full_system_message = compile_system_message( - agent_id=agent_id, - system_prompt=system, - in_context_memory=memory, - in_context_memory_last_edit=memory_edit_timestamp, - actor=actor, - agent_manager=agent_manager, - message_manager=message_manager, - user_defined_variables=None, - append_icm_if_missing=True, - ) - first_user_message = get_login_event() # event letting Letta know the user just logged in - - if include_initial_boot_message: - if model is not None and "gpt-3.5" in model: - initial_boot_messages = get_initial_boot_messages("startup_with_send_message_gpt35") - else: - initial_boot_messages = get_initial_boot_messages("startup_with_send_message") - messages = ( - [ - {"role": "system", "content": full_system_message}, - ] - + initial_boot_messages - + [ - {"role": "user", "content": first_user_message}, - ] - ) - - else: - messages = [ - {"role": "system", "content": full_system_message}, - {"role": "user", "content": first_user_message}, - ] - - return messages - - class BaseAgent(ABC): """ Abstract class for all agents. - Only two interfaces are required: step and update_state. + Only one interface is required: step. """ @abstractmethod @@ -238,10 +91,6 @@ def step( """ raise NotImplementedError - @abstractmethod - def update_state(self) -> AgentState: - raise NotImplementedError - class Agent(BaseAgent): def __init__( @@ -250,9 +99,7 @@ def __init__( agent_state: AgentState, # in-memory representation of the agent state (read from multiple tables) user: User, # extras - messages_total: Optional[int] = None, # TODO remove? first_message_verify_mono: bool = True, # TODO move to config? - initial_message_sequence: Optional[List[Message]] = None, ): assert isinstance(agent_state.memory, Memory), f"Memory object is not of type Memory: {type(agent_state.memory)}" # Hold a copy of the state that was used to init the agent @@ -276,7 +123,7 @@ def __init__( # gpt-4, gpt-3.5-turbo, ... self.model = self.agent_state.llm_config.model - self.check_tool_rules() + self.supports_structured_output = check_supports_structured_output(model=self.model, tool_rules=agent_state.tool_rules) # state managers self.block_manager = BlockManager() @@ -304,99 +151,14 @@ def __init__( # When the summarizer is run, set this back to False (to reset) self.agent_alerted_about_memory_pressure = False - self._messages: List[Message] = [] - - # Once the memory object is initialized, use it to "bake" the system message - if self.agent_state.message_ids is not None: - self.set_message_buffer(message_ids=self.agent_state.message_ids) - - else: - printd(f"Agent.__init__ :: creating, state={agent_state.message_ids}") - assert self.agent_state.id is not None and self.agent_state.created_by_id is not None - - # Generate a sequence of initial messages to put in the buffer - init_messages = initialize_message_sequence( - model=self.model, - system=self.agent_state.system, - agent_id=self.agent_state.id, - memory=self.agent_state.memory, - actor=self.user, - agent_manager=None, - message_manager=None, - memory_edit_timestamp=get_utc_time(), - include_initial_boot_message=True, - ) - - if initial_message_sequence is not None: - # We always need the system prompt up front - system_message_obj = Message.dict_to_message( - agent_id=self.agent_state.id, - user_id=self.agent_state.created_by_id, - model=self.model, - openai_message_dict=init_messages[0], - ) - # Don't use anything else in the pregen sequence, instead use the provided sequence - init_messages = [system_message_obj] + initial_message_sequence - - else: - # Basic "more human than human" initial message sequence - init_messages = initialize_message_sequence( - model=self.model, - system=self.agent_state.system, - memory=self.agent_state.memory, - agent_id=self.agent_state.id, - actor=self.user, - agent_manager=None, - message_manager=None, - memory_edit_timestamp=get_utc_time(), - include_initial_boot_message=True, - ) - # Cast to Message objects - init_messages = [ - Message.dict_to_message( - agent_id=self.agent_state.id, user_id=self.agent_state.created_by_id, model=self.model, openai_message_dict=msg - ) - for msg in init_messages - ] - - # Cast the messages to actual Message objects to be synced to the DB - init_messages_objs = [] - for msg in init_messages: - init_messages_objs.append(msg) - for msg in init_messages_objs: - assert isinstance(msg, Message), f"Message object is not of type Message: {type(msg)}" - assert all([isinstance(msg, Message) for msg in init_messages_objs]), (init_messages_objs, init_messages) - - # Put the messages inside the message buffer - self.messages_total = 0 - self._append_to_messages(added_messages=init_messages_objs) - self._validate_message_buffer_is_utc() - # Load last function response from message history self.last_function_response = self.load_last_function_response() - # Keep track of the total number of messages throughout all time - self.messages_total = messages_total if messages_total is not None else (len(self._messages) - 1) # (-system) - self.messages_total_init = len(self._messages) - 1 - printd(f"Agent initialized, self.messages_total={self.messages_total}") - - # Create the agent in the DB - self.update_state() - - def check_tool_rules(self): - if self.model not in STRUCTURED_OUTPUT_MODELS: - if len(self.tool_rules_solver.init_tool_rules) > 1: - raise ValueError( - "Multiple initial tools are not supported for non-structured models. Please use only one initial tool rule." - ) - self.supports_structured_output = False - else: - self.supports_structured_output = True - def load_last_function_response(self): """Load the last function response from message history""" - for i in range(len(self._messages) - 1, -1, -1): - msg = self._messages[i] + in_context_messages = self.agent_manager.get_in_context_messages(agent_id=self.agent_state.id, actor=self.user) + for i in range(len(in_context_messages) - 1, -1, -1): + msg = in_context_messages[i] if msg.role == MessageRole.tool and msg.text: try: response_json = json.loads(msg.text) @@ -435,7 +197,7 @@ def update_memory_if_change(self, new_memory: Memory) -> bool: # NOTE: don't do this since re-buildin the memory is handled at the start of the step # rebuild memory - this records the last edited timestamp of the memory # TODO: pass in update timestamp from block edit time - self.rebuild_system_prompt() + self.agent_state = self.agent_manager.rebuild_system_prompt(agent_id=self.agent_state.id, actor=self.user) return True return False @@ -487,109 +249,6 @@ def execute_tool_and_persist_state(self, function_name: str, function_args: dict return function_response - @property - def messages(self) -> List[dict]: - """Getter method that converts the internal Message list into OpenAI-style dicts""" - return [msg.to_openai_dict() for msg in self._messages] - - @messages.setter - def messages(self, value): - raise Exception("Modifying message list directly not allowed") - - def _load_messages_from_recall(self, message_ids: List[str]) -> List[Message]: - """Load a list of messages from recall storage""" - - # Pull the message objects from the database - message_objs = [] - for msg_id in message_ids: - msg_obj = self.message_manager.get_message_by_id(msg_id, actor=self.user) - if msg_obj: - if isinstance(msg_obj, Message): - message_objs.append(msg_obj) - else: - printd(f"Warning - message ID {msg_id} is not a Message object") - warnings.warn(f"Warning - message ID {msg_id} is not a Message object") - else: - printd(f"Warning - message ID {msg_id} not found in recall storage") - warnings.warn(f"Warning - message ID {msg_id} not found in recall storage") - - return message_objs - - def _validate_message_buffer_is_utc(self): - """Iterate over the message buffer and force all messages to be UTC stamped""" - - for m in self._messages: - # assert is_utc_datetime(m.created_at), f"created_at on message for agent {self.agent_state.name} isn't UTC:\n{vars(m)}" - # TODO eventually do casting via an edit_message function - if m.created_at: - if not is_utc_datetime(m.created_at): - printd(f"Warning - created_at on message for agent {self.agent_state.name} isn't UTC (text='{m.text}')") - m.created_at = m.created_at.replace(tzinfo=datetime.timezone.utc) - - def set_message_buffer(self, message_ids: List[str], force_utc: bool = True): - """Set the messages in the buffer to the message IDs list""" - - message_objs = self._load_messages_from_recall(message_ids=message_ids) - - # set the objects in the buffer - self._messages = message_objs - - # bugfix for old agents that may not have had UTC specified in their timestamps - if force_utc: - self._validate_message_buffer_is_utc() - - # also sync the message IDs attribute - self.agent_state.message_ids = message_ids - - def refresh_message_buffer(self): - """Refresh the message buffer from the database""" - - messages_to_sync = self.agent_state.message_ids - assert messages_to_sync and all([isinstance(msg_id, str) for msg_id in messages_to_sync]) - - self.set_message_buffer(message_ids=messages_to_sync) - - def _trim_messages(self, num): - """Trim messages from the front, not including the system message""" - new_messages = [self._messages[0]] + self._messages[num:] - self._messages = new_messages - - def _prepend_to_messages(self, added_messages: List[Message]): - """Wrapper around self.messages.prepend to allow additional calls to a state/persistence manager""" - assert all([isinstance(msg, Message) for msg in added_messages]) - self.message_manager.create_many_messages(added_messages, actor=self.user) - - new_messages = [self._messages[0]] + added_messages + self._messages[1:] # prepend (no system) - self._messages = new_messages - self.messages_total += len(added_messages) # still should increment the message counter (summaries are additions too) - - def _append_to_messages(self, added_messages: List[Message]): - """Wrapper around self.messages.append to allow additional calls to a state/persistence manager""" - assert all([isinstance(msg, Message) for msg in added_messages]) - self.message_manager.create_many_messages(added_messages, actor=self.user) - - # strip extra metadata if it exists - # for msg in added_messages: - # msg.pop("api_response", None) - # msg.pop("api_args", None) - new_messages = self._messages + added_messages # append - - self._messages = new_messages - self.messages_total += len(added_messages) - - def append_to_messages(self, added_messages: List[dict]): - """An external-facing message append, where dict-like messages are first converted to Message objects""" - added_messages_objs = [ - Message.dict_to_message( - agent_id=self.agent_state.id, - user_id=self.agent_state.created_by_id, - model=self.model, - openai_message_dict=msg, - ) - for msg in added_messages - ] - self._append_to_messages(added_messages_objs) - def _get_ai_reply( self, message_sequence: List[Message], @@ -898,7 +557,7 @@ def _handle_ai_response( # rebuild memory # TODO: @charles please check this - self.rebuild_system_prompt() + self.agent_state = self.agent_manager.rebuild_system_prompt(agent_id=self.agent_state.id, actor=self.user) # Update ToolRulesSolver state with last called function self.tool_rules_solver.update_tool_usage(function_name) @@ -930,6 +589,7 @@ def step( messages=next_input_message, **kwargs, ) + heartbeat_request = step_response.heartbeat_request function_failed = step_response.function_failed token_warning = step_response.in_context_memory_warning @@ -1021,33 +681,19 @@ def inner_step( if not all(isinstance(m, Message) for m in messages): raise ValueError(f"messages should be a Message or a list of Message, got {type(messages)}") - input_message_sequence = self._messages + messages + in_context_messages = self.agent_manager.get_in_context_messages(agent_id=self.agent_state.id, actor=self.user) + input_message_sequence = in_context_messages + messages if len(input_message_sequence) > 1 and input_message_sequence[-1].role != "user": printd(f"{CLI_WARNING_PREFIX}Attempting to run ChatCompletion without user as the last message in the queue") # Step 2: send the conversation and available functions to the LLM - if not skip_verify and (first_message or self.messages_total == self.messages_total_init): - printd(f"This is the first message. Running extra verifier on AI response.") - counter = 0 - while True: - response = self._get_ai_reply( - message_sequence=input_message_sequence, first_message=True, stream=stream # passed through to the prompt formatter - ) - if verify_first_message_correctness(response, require_monologue=self.first_message_verify_mono): - break - - counter += 1 - if counter > first_message_retry_limit: - raise Exception(f"Hit first message retry limit ({first_message_retry_limit})") - - else: - response = self._get_ai_reply( - message_sequence=input_message_sequence, - first_message=first_message, - stream=stream, - step_count=step_count, - ) + response = self._get_ai_reply( + message_sequence=input_message_sequence, + first_message=first_message, + stream=stream, + step_count=step_count, + ) # Step 3: check if LLM wanted to call a function # (if yes) Step 4: call the function @@ -1095,10 +741,9 @@ def inner_step( f"last response total_tokens ({current_total_tokens}) < {MESSAGE_SUMMARY_WARNING_FRAC * int(self.agent_state.llm_config.context_window)}" ) - self._append_to_messages(all_new_messages) - - # update state after each step - self.update_state() + self.agent_state = self.agent_manager.append_to_in_context_messages( + all_new_messages, agent_id=self.agent_state.id, actor=self.user + ) return AgentStepResponse( messages=all_new_messages, @@ -1113,7 +758,9 @@ def inner_step( # If we got a context alert, try trimming the messages length, then try again if is_context_overflow_error(e): - printd(f"context window exceeded with limit {self.agent_state.llm_config.context_window}, running summarizer to trim messages") + printd( + f"context window exceeded with limit {self.agent_state.llm_config.context_window}, running summarizer to trim messages" + ) # A separate API call to run a summarizer self.summarize_messages_inplace() @@ -1165,15 +812,19 @@ def step_user_message(self, user_message_str: str, **kwargs) -> AgentStepRespons return self.inner_step(messages=[user_message], **kwargs) def summarize_messages_inplace(self, cutoff=None, preserve_last_N_messages=True, disallow_tool_as_first=True): - assert self.messages[0]["role"] == "system", f"self.messages[0] should be system (instead got {self.messages[0]})" + in_context_messages = self.agent_manager.get_in_context_messages(agent_id=self.agent_state.id, actor=self.user) + in_context_messages_openai = [m.to_openai_dict() for m in in_context_messages] + + if in_context_messages_openai[0]["role"] != "system": + raise RuntimeError(f"in_context_messages_openai[0] should be system (instead got {in_context_messages_openai[0]})") # Start at index 1 (past the system message), # and collect messages for summarization until we reach the desired truncation token fraction (eg 50%) # Do not allow truncation of the last N messages, since these are needed for in-context examples of function calling - token_counts = [count_tokens(str(msg)) for msg in self.messages] + token_counts = [count_tokens(str(msg)) for msg in in_context_messages_openai] message_buffer_token_count = sum(token_counts[1:]) # no system message desired_token_count_to_summarize = int(message_buffer_token_count * MESSAGE_SUMMARY_TRUNC_TOKEN_FRAC) - candidate_messages_to_summarize = self.messages[1:] + candidate_messages_to_summarize = in_context_messages_openai[1:] token_counts = token_counts[1:] if preserve_last_N_messages: @@ -1193,7 +844,7 @@ def summarize_messages_inplace(self, cutoff=None, preserve_last_N_messages=True, "Not enough messages to compress for summarization", details={ "num_candidate_messages": len(candidate_messages_to_summarize), - "num_total_messages": len(self.messages), + "num_total_messages": len(in_context_messages_openai), "preserve_N": MESSAGE_SUMMARY_TRUNC_KEEP_N_LAST, }, ) @@ -1212,9 +863,9 @@ def summarize_messages_inplace(self, cutoff=None, preserve_last_N_messages=True, # Try to make an assistant message come after the cutoff try: printd(f"Selected cutoff {cutoff} was a 'user', shifting one...") - if self.messages[cutoff]["role"] == "user": + if in_context_messages_openai[cutoff]["role"] == "user": new_cutoff = cutoff + 1 - if self.messages[new_cutoff]["role"] == "user": + if in_context_messages_openai[new_cutoff]["role"] == "user": printd(f"Shifted cutoff {new_cutoff} is still a 'user', ignoring...") cutoff = new_cutoff except IndexError: @@ -1222,23 +873,23 @@ def summarize_messages_inplace(self, cutoff=None, preserve_last_N_messages=True, # Make sure the cutoff isn't on a 'tool' or 'function' if disallow_tool_as_first: - while self.messages[cutoff]["role"] in ["tool", "function"] and cutoff < len(self.messages): + while in_context_messages_openai[cutoff]["role"] in ["tool", "function"] and cutoff < len(in_context_messages_openai): printd(f"Selected cutoff {cutoff} was a 'tool', shifting one...") cutoff += 1 - message_sequence_to_summarize = self._messages[1:cutoff] # do NOT get rid of the system message + message_sequence_to_summarize = in_context_messages[1:cutoff] # do NOT get rid of the system message if len(message_sequence_to_summarize) <= 1: # This prevents a potential infinite loop of summarizing the same message over and over raise ContextWindowExceededError( "Not enough messages to compress for summarization after determining cutoff", details={ "num_candidate_messages": len(message_sequence_to_summarize), - "num_total_messages": len(self.messages), + "num_total_messages": len(in_context_messages_openai), "preserve_N": MESSAGE_SUMMARY_TRUNC_KEEP_N_LAST, }, ) else: - printd(f"Attempting to summarize {len(message_sequence_to_summarize)} messages [1:{cutoff}] of {len(self._messages)}") + printd(f"Attempting to summarize {len(message_sequence_to_summarize)} messages [1:{cutoff}] of {len(in_context_messages)}") # We can't do summarize logic properly if context_window is undefined if self.agent_state.llm_config.context_window is None: @@ -1253,118 +904,33 @@ def summarize_messages_inplace(self, cutoff=None, preserve_last_N_messages=True, printd(f"Got summary: {summary}") # Metadata that's useful for the agent to see - all_time_message_count = self.messages_total - remaining_message_count = len(self.messages[cutoff:]) + all_time_message_count = self.message_manager.size(agent_id=self.agent_state.id, actor=self.user) + remaining_message_count = len(in_context_messages_openai[cutoff:]) hidden_message_count = all_time_message_count - remaining_message_count summary_message_count = len(message_sequence_to_summarize) summary_message = package_summarize_message(summary, summary_message_count, hidden_message_count, all_time_message_count) printd(f"Packaged into message: {summary_message}") - prior_len = len(self.messages) - self._trim_messages(cutoff) + prior_len = len(in_context_messages_openai) + self.agent_state = self.agent_manager.trim_older_in_context_messages(cutoff, agent_id=self.agent_state.id, actor=self.user) packed_summary_message = {"role": "user", "content": summary_message} - self._prepend_to_messages( - [ + self.agent_state = self.agent_manager.prepend_to_in_context_messages( + messages=[ Message.dict_to_message( agent_id=self.agent_state.id, user_id=self.agent_state.created_by_id, model=self.model, openai_message_dict=packed_summary_message, ) - ] - ) - - # reset alert - self.agent_alerted_about_memory_pressure = False - - printd(f"Ran summarizer, messages length {prior_len} -> {len(self.messages)}") - - def _swap_system_message_in_buffer(self, new_system_message: str): - """Update the system message (NOT prompt) of the Agent (requires updating the internal buffer)""" - assert isinstance(new_system_message, str) - new_system_message_obj = Message.dict_to_message( - agent_id=self.agent_state.id, - user_id=self.agent_state.created_by_id, - model=self.model, - openai_message_dict={"role": "system", "content": new_system_message}, - ) - - assert new_system_message_obj.role == "system", new_system_message_obj - assert self._messages[0].role == "system", self._messages - - self.message_manager.create_message(new_system_message_obj, actor=self.user) - - new_messages = [new_system_message_obj] + self._messages[1:] # swap index 0 (system) - self._messages = new_messages - - def rebuild_system_prompt(self, force=False, update_timestamp=True): - """Rebuilds the system message with the latest memory object and any shared memory block updates - - Updates to core memory blocks should trigger a "rebuild", which itself will create a new message object - - Updates to the memory header should *not* trigger a rebuild, since that will simply flood recall storage with excess messages - """ - - curr_system_message = self.messages[0] # this is the system + memory bank, not just the system prompt - - # note: we only update the system prompt if the core memory is changed - # this means that the archival/recall memory statistics may be someout out of date - curr_memory_str = self.agent_state.memory.compile() - if curr_memory_str in curr_system_message["content"] and not force: - # NOTE: could this cause issues if a block is removed? (substring match would still work) - printd(f"Memory hasn't changed, skipping system prompt rebuild") - return - - # If the memory didn't update, we probably don't want to update the timestamp inside - # For example, if we're doing a system prompt swap, this should probably be False - if update_timestamp: - memory_edit_timestamp = get_utc_time() - else: - # NOTE: a bit of a hack - we pull the timestamp from the message created_by - memory_edit_timestamp = self._messages[0].created_at - - # update memory (TODO: potentially update recall/archival stats separately) - new_system_message_str = compile_system_message( + ], agent_id=self.agent_state.id, - system_prompt=self.agent_state.system, - in_context_memory=self.agent_state.memory, - in_context_memory_last_edit=memory_edit_timestamp, actor=self.user, - agent_manager=self.agent_manager, - message_manager=self.message_manager, - user_defined_variables=None, - append_icm_if_missing=True, ) - new_system_message = { - "role": "system", - "content": new_system_message_str, - } - - diff = united_diff(curr_system_message["content"], new_system_message["content"]) - if len(diff) > 0: # there was a diff - printd(f"Rebuilding system with new memory...\nDiff:\n{diff}") - - # Swap the system message out (only if there is a diff) - self._swap_system_message_in_buffer(new_system_message=new_system_message_str) - assert self.messages[0]["content"] == new_system_message["content"], ( - self.messages[0]["content"], - new_system_message["content"], - ) - def update_system_prompt(self, new_system_prompt: str): - """Update the system prompt of the agent (requires rebuilding the memory block if there's a difference)""" - assert isinstance(new_system_prompt, str) - - if new_system_prompt == self.agent_state.system: - return - - self.agent_state.system = new_system_prompt - - # updating the system prompt requires rebuilding the memory block inside the compiled system message - self.rebuild_system_prompt(force=True, update_timestamp=False) + # reset alert + self.agent_alerted_about_memory_pressure = False - # make sure to persist the change - _ = self.update_state() + printd(f"Ran summarizer, messages length {prior_len} -> {len(in_context_messages_openai)}") def add_function(self, function_name: str) -> str: # TODO: refactor @@ -1374,20 +940,6 @@ def remove_function(self, function_name: str) -> str: # TODO: refactor raise NotImplementedError - def update_state(self) -> AgentState: - # TODO: this should be removed and self._messages should be moved into self.agent_state.in_context_messages - message_ids = [msg.id for msg in self._messages] - - # Assert that these are all strings - if any(not isinstance(m_id, str) for m_id in message_ids): - warnings.warn(f"Non-string message IDs found in agent state: {message_ids}") - message_ids = [m_id for m_id in message_ids if isinstance(m_id, str)] - - # override any fields that may have been updated - self.agent_state.message_ids = message_ids - - return self.agent_state - def migrate_embedding(self, embedding_config: EmbeddingConfig): """Migrate the agent to a new embedding""" # TODO: archival memory @@ -1421,123 +973,6 @@ def attach_source( f"Attached data source {source.name} to agent {self.agent_state.name}.", ) - def update_message(self, message_id: str, request: MessageUpdate) -> Message: - """Update the details of a message associated with an agent""" - # Save the updated message - updated_message = self.message_manager.update_message_by_id(message_id=message_id, message_update=request, actor=self.user) - return updated_message - - # TODO(sarah): should we be creating a new message here, or just editing a message? - def rethink_message(self, new_thought: str) -> Message: - """Rethink / update the last message""" - for x in range(len(self.messages) - 1, 0, -1): - msg_obj = self._messages[x] - if msg_obj.role == MessageRole.assistant: - updated_message = self.update_message( - message_id=msg_obj.id, - request=MessageUpdate( - text=new_thought, - ), - ) - self.refresh_message_buffer() - return updated_message - raise ValueError(f"No assistant message found to update") - - # TODO(sarah): should we be creating a new message here, or just editing a message? - def rewrite_message(self, new_text: str) -> Message: - """Rewrite / update the send_message text on the last message""" - - # Walk backwards through the messages until we find an assistant message - for x in range(len(self._messages) - 1, 0, -1): - if self._messages[x].role == MessageRole.assistant: - # Get the current message content - message_obj = self._messages[x] - - # The rewrite target is the output of send_message - if message_obj.tool_calls is not None and len(message_obj.tool_calls) > 0: - - # Check that we hit an assistant send_message call - name_string = message_obj.tool_calls[0].function.name - if name_string is None or name_string != "send_message": - raise ValueError("Assistant missing send_message function call") - - args_string = message_obj.tool_calls[0].function.arguments - if args_string is None: - raise ValueError("Assistant missing send_message function arguments") - - args_json = json_loads(args_string) - if "message" not in args_json: - raise ValueError("Assistant missing send_message message argument") - - # Once we found our target, rewrite it - args_json["message"] = new_text - new_args_string = json_dumps(args_json) - message_obj.tool_calls[0].function.arguments = new_args_string - - # Write the update to the DB - updated_message = self.update_message( - message_id=message_obj.id, - request=MessageUpdate( - tool_calls=message_obj.tool_calls, - ), - ) - self.refresh_message_buffer() - return updated_message - - raise ValueError("No assistant message found to update") - - def pop_message(self, count: int = 1) -> List[Message]: - """Pop the last N messages from the agent's memory""" - n_messages = len(self._messages) - popped_messages = [] - MIN_MESSAGES = 2 - if n_messages <= MIN_MESSAGES: - raise ValueError(f"Agent only has {n_messages} messages in stack, none left to pop") - elif n_messages - count < MIN_MESSAGES: - raise ValueError(f"Agent only has {n_messages} messages in stack, cannot pop more than {n_messages - MIN_MESSAGES}") - else: - # print(f"Popping last {count} messages from stack") - for _ in range(min(count, len(self._messages))): - # remove the message from the internal state of the agent - deleted_message = self._messages.pop() - # then also remove it from recall storage - try: - self.message_manager.delete_message_by_id(deleted_message.id, actor=self.user) - popped_messages.append(deleted_message) - except Exception as e: - warnings.warn(f"Error deleting message {deleted_message.id} from recall memory: {e}") - self._messages.append(deleted_message) - break - - return popped_messages - - def pop_until_user(self) -> List[Message]: - """Pop all messages until the last user message""" - if MessageRole.user not in [msg.role for msg in self._messages]: - raise ValueError("No user message found in buffer") - - popped_messages = [] - while len(self._messages) > 0: - if self._messages[-1].role == MessageRole.user: - # we want to pop up to the last user message - return popped_messages - else: - popped_messages.append(self.pop_message(count=1)) - - raise ValueError("No user message found in buffer") - - def retry_message(self) -> List[Message]: - """Retry / regenerate the last message""" - self.pop_until_user() - user_message = self.pop_message(count=1)[0] - assert user_message.text is not None, "User message text is None" - step_response = self.step_user_message(user_message_str=user_message.text) - messages = step_response.messages - - assert messages is not None - assert all(isinstance(msg, Message) for msg in messages), "step() returned non-Message objects" - return messages - def get_context_window(self) -> ContextWindowOverview: """Get the context window of the agent""" @@ -1546,24 +981,28 @@ def get_context_window(self) -> ContextWindowOverview: core_memory = self.agent_state.memory.compile() num_tokens_core_memory = count_tokens(core_memory) + # Grab the in-context messages # conversion of messages to OpenAI dict format, which is passed to the token counter - messages_openai_format = self.messages + in_context_messages = self.agent_manager.get_in_context_messages(agent_id=self.agent_state.id, actor=self.user) + in_context_messages_openai = [m.to_openai_dict() for m in in_context_messages] # Check if there's a summary message in the message queue if ( - len(self._messages) > 1 - and self._messages[1].role == MessageRole.user - and isinstance(self._messages[1].text, str) + len(in_context_messages) > 1 + and in_context_messages[1].role == MessageRole.user + and isinstance(in_context_messages[1].text, str) # TODO remove hardcoding - and "The following is a summary of the previous " in self._messages[1].text + and "The following is a summary of the previous " in in_context_messages[1].text ): # Summary message exists - assert self._messages[1].text is not None - summary_memory = self._messages[1].text - num_tokens_summary_memory = count_tokens(self._messages[1].text) + assert in_context_messages[1].text is not None + summary_memory = in_context_messages[1].text + num_tokens_summary_memory = count_tokens(in_context_messages[1].text) # with a summary message, the real messages start at index 2 num_tokens_messages = ( - num_tokens_from_messages(messages=messages_openai_format[2:], model=self.model) if len(messages_openai_format) > 2 else 0 + num_tokens_from_messages(messages=in_context_messages_openai[2:], model=self.model) + if len(in_context_messages_openai) > 2 + else 0 ) else: @@ -1571,17 +1010,17 @@ def get_context_window(self) -> ContextWindowOverview: num_tokens_summary_memory = 0 # with no summary message, the real messages start at index 1 num_tokens_messages = ( - num_tokens_from_messages(messages=messages_openai_format[1:], model=self.model) if len(messages_openai_format) > 1 else 0 + num_tokens_from_messages(messages=in_context_messages_openai[1:], model=self.model) + if len(in_context_messages_openai) > 1 + else 0 ) agent_manager_passage_size = self.agent_manager.passage_size(actor=self.user, agent_id=self.agent_state.id) message_manager_size = self.message_manager.size(actor=self.user, agent_id=self.agent_state.id) external_memory_summary = compile_memory_metadata_block( - actor=self.user, - agent_id=self.agent_state.id, - memory_edit_timestamp=get_utc_time(), # dummy timestamp - agent_manager=self.agent_manager, - message_manager=self.message_manager, + memory_edit_timestamp=get_utc_time(), + previous_message_count=self.message_manager.size(actor=self.user, agent_id=self.agent_state.id), + archival_memory_size=self.agent_manager.passage_size(actor=self.user, agent_id=self.agent_state.id), ) num_tokens_external_memory_summary = count_tokens(external_memory_summary) @@ -1606,7 +1045,7 @@ def get_context_window(self) -> ContextWindowOverview: return ContextWindowOverview( # context window breakdown (in messages) - num_messages=len(self._messages), + num_messages=len(in_context_messages), num_archival_memory=agent_manager_passage_size, num_recall_memory=message_manager_size, num_tokens_external_memory_summary=num_tokens_external_memory_summary, @@ -1621,7 +1060,7 @@ def get_context_window(self) -> ContextWindowOverview: num_tokens_summary_memory=num_tokens_summary_memory, summary_memory=summary_memory, num_tokens_messages=num_tokens_messages, - messages=self._messages, + messages=in_context_messages, # related to functions num_tokens_functions_definitions=num_tokens_available_functions_definitions, functions_definitions=available_functions_definitions, @@ -1635,7 +1074,6 @@ def count_tokens(self) -> int: def save_agent(agent: Agent): """Save agent to metadata store""" - agent.update_state() agent_state = agent.agent_state assert isinstance(agent_state.memory, Memory), f"Memory is not a Memory object: {type(agent_state.memory)}" diff --git a/letta/chat_only_agent.py b/letta/chat_only_agent.py index e340673eba..e5f431c550 100644 --- a/letta/chat_only_agent.py +++ b/letta/chat_only_agent.py @@ -63,8 +63,8 @@ def generate_offline_memory_agent(): conversation_persona_block_new = Block( name="chat_agent_persona_new", label="chat_agent_persona_new", value=conversation_persona_block.value, limit=2000 ) - - recent_convo = "".join([str(message) for message in self.messages[3:]])[-self.recent_convo_limit :] + in_context_messages = self.agent_manager.get_in_context_messages(agent_id=self.agent_state.id, actor=self.user) + recent_convo = "".join([str(message) for message in in_context_messages[3:]])[-self.recent_convo_limit :] conversation_messages_block = Block( name="conversation_block", label="conversation_block", value=recent_convo, limit=self.recent_convo_limit ) diff --git a/letta/client/client.py b/letta/client/client.py index e242bfb264..e575979dc0 100644 --- a/letta/client/client.py +++ b/letta/client/client.py @@ -2234,7 +2234,7 @@ def update_agent( """ # TODO: add the abilitty to reset linked block_ids self.interface.clear() - agent_state = self.server.update_agent( + agent_state = self.server.agent_manager.update_agent( agent_id, UpdateAgent( name=name, @@ -2262,7 +2262,7 @@ def get_tools_from_agent(self, agent_id: str) -> List[Tool]: List[Tool]: A list of Tool objs """ self.interface.clear() - return self.server.get_tools_from_agent(agent_id=agent_id, user_id=self.user_id) + return self.server.agent_manager.get_agent_by_id(agent_id=agent_id, actor=self.user).tools def add_tool_to_agent(self, agent_id: str, tool_id: str): """ @@ -2276,7 +2276,7 @@ def add_tool_to_agent(self, agent_id: str, tool_id: str): agent_state (AgentState): State of the updated agent """ self.interface.clear() - agent_state = self.server.add_tool_to_agent(agent_id=agent_id, tool_id=tool_id, user_id=self.user_id) + agent_state = self.server.agent_manager.attach_tool(agent_id=agent_id, tool_id=tool_id, actor=self.user) return agent_state def remove_tool_from_agent(self, agent_id: str, tool_id: str): @@ -2291,7 +2291,7 @@ def remove_tool_from_agent(self, agent_id: str, tool_id: str): agent_state (AgentState): State of the updated agent """ self.interface.clear() - agent_state = self.server.remove_tool_from_agent(agent_id=agent_id, tool_id=tool_id, user_id=self.user_id) + agent_state = self.server.agent_manager.detach_tool(agent_id=agent_id, tool_id=tool_id, actor=self.user) return agent_state def rename_agent(self, agent_id: str, new_name: str): @@ -2426,7 +2426,7 @@ def get_in_context_messages(self, agent_id: str) -> List[Message]: Returns: messages (List[Message]): List of in-context messages """ - return self.server.get_in_context_messages(agent_id=agent_id, actor=self.user) + return self.server.agent_manager.get_in_context_messages(agent_id=agent_id, actor=self.user) # agent interactions @@ -3075,7 +3075,7 @@ def delete_archival_memory(self, agent_id: str, memory_id: str): agent_id (str): ID of the agent memory_id (str): ID of the memory """ - self.server.delete_archival_memory(agent_id=agent_id, memory_id=memory_id, actor=self.user) + self.server.delete_archival_memory(memory_id=memory_id, actor=self.user) def get_archival_memory( self, agent_id: str, before: Optional[str] = None, after: Optional[str] = None, limit: Optional[int] = 1000 diff --git a/letta/main.py b/letta/main.py index c426917092..de1b4028ab 100644 --- a/letta/main.py +++ b/letta/main.py @@ -194,46 +194,6 @@ def run_agent_loop( print(f"Current model: {letta_agent.agent_state.llm_config.model}") continue - elif user_input.lower() == "/pop" or user_input.lower().startswith("/pop "): - # Check if there's an additional argument that's an integer - command = user_input.strip().split() - pop_amount = int(command[1]) if len(command) > 1 and command[1].isdigit() else 3 - try: - popped_messages = letta_agent.pop_message(count=pop_amount) - except ValueError as e: - print(f"Error popping messages: {e}") - continue - - elif user_input.lower() == "/retry": - print(f"Retrying for another answer...") - try: - letta_agent.retry_message() - except Exception as e: - print(f"Error retrying message: {e}") - continue - - elif user_input.lower() == "/rethink" or user_input.lower().startswith("/rethink "): - if len(user_input) < len("/rethink "): - print("Missing text after the command") - continue - try: - letta_agent.rethink_message(new_thought=user_input[len("/rethink ") :].strip()) - except Exception as e: - print(f"Error rethinking message: {e}") - continue - - elif user_input.lower() == "/rewrite" or user_input.lower().startswith("/rewrite "): - if len(user_input) < len("/rewrite "): - print("Missing text after the command") - continue - - text = user_input[len("/rewrite ") :].strip() - try: - letta_agent.rewrite_message(new_text=text) - except Exception as e: - print(f"Error rewriting message: {e}") - continue - elif user_input.lower() == "/summarize": try: letta_agent.summarize_messages_inplace() @@ -319,42 +279,6 @@ def run_agent_loop( questionary.print(cmd, "bold") questionary.print(f" {desc}") continue - - elif user_input.lower().startswith("/systemswap"): - if len(user_input) < len("/systemswap "): - print("Missing new system prompt after the command") - continue - old_system_prompt = letta_agent.system - new_system_prompt = user_input[len("/systemswap ") :].strip() - - # Show warning and prompts to user - typer.secho( - "\nWARNING: You are about to change the system prompt.", - # fg=typer.colors.BRIGHT_YELLOW, - bold=True, - ) - typer.secho( - f"\nOld system prompt:\n{old_system_prompt}", - fg=typer.colors.RED, - bold=True, - ) - typer.secho( - f"\nNew system prompt:\n{new_system_prompt}", - fg=typer.colors.GREEN, - bold=True, - ) - - # Ask for confirmation - confirm = questionary.confirm("Do you want to proceed with the swap?").ask() - - if confirm: - letta_agent.update_system_prompt(new_system_prompt=new_system_prompt) - print("System prompt updated successfully.") - else: - print("System prompt swap cancelled.") - - continue - else: print(f"Unrecognized command: {user_input}") continue diff --git a/letta/offline_memory_agent.py b/letta/offline_memory_agent.py index f4eeec8a83..076e2dc07b 100644 --- a/letta/offline_memory_agent.py +++ b/letta/offline_memory_agent.py @@ -129,9 +129,8 @@ def __init__( # extras first_message_verify_mono: bool = False, max_memory_rethinks: int = 10, - initial_message_sequence: Optional[List[Message]] = None, ): - super().__init__(interface, agent_state, user, initial_message_sequence=initial_message_sequence) + super().__init__(interface, agent_state, user) self.first_message_verify_mono = first_message_verify_mono self.max_memory_rethinks = max_memory_rethinks diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index 69b97c764e..c46a24573a 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -104,7 +104,7 @@ def get_agent_context_window( """ actor = server.user_manager.get_user_or_default(user_id=user_id) - return server.get_agent_context_window(user_id=actor.id, agent_id=agent_id) + return server.get_agent_context_window(agent_id=agent_id, actor=actor) class CreateAgentRequest(CreateAgent): @@ -138,7 +138,7 @@ def update_agent( ): """Update an exsiting agent""" actor = server.user_manager.get_user_or_default(user_id=user_id) - return server.update_agent(agent_id, update_agent, actor=actor) + return server.agent_manager.update_agent(agent_id=agent_id, agent_update=update_agent, actor=actor) @router.get("/{agent_id}/tools", response_model=List[Tool], operation_id="get_tools_from_agent") @@ -149,7 +149,7 @@ def get_tools_from_agent( ): """Get tools from an existing agent""" actor = server.user_manager.get_user_or_default(user_id=user_id) - return server.get_tools_from_agent(agent_id=agent_id, user_id=actor.id) + return server.agent_manager.get_agent_by_id(agent_id=agent_id, actor=actor).tools @router.patch("/{agent_id}/add-tool/{tool_id}", response_model=AgentState, operation_id="add_tool_to_agent") @@ -161,7 +161,7 @@ def add_tool_to_agent( ): """Add tools to an existing agent""" actor = server.user_manager.get_user_or_default(user_id=user_id) - return server.add_tool_to_agent(agent_id=agent_id, tool_id=tool_id, user_id=actor.id) + return server.agent_manager.attach_tool(agent_id=agent_id, tool_id=tool_id, user_id=actor) @router.patch("/{agent_id}/remove-tool/{tool_id}", response_model=AgentState, operation_id="remove_tool_from_agent") @@ -173,7 +173,7 @@ def remove_tool_from_agent( ): """Add tools to an existing agent""" actor = server.user_manager.get_user_or_default(user_id=user_id) - return server.remove_tool_from_agent(agent_id=agent_id, tool_id=tool_id, user_id=actor.id) + return server.agent_manager.detach_tool(agent_id=agent_id, tool_id=tool_id, actor=actor) @router.get("/{agent_id}", response_model=AgentState, operation_id="get_agent") @@ -232,7 +232,7 @@ def get_agent_in_context_messages( Retrieve the messages in the context of a specific agent. """ actor = server.user_manager.get_user_or_default(user_id=user_id) - return server.get_in_context_messages(agent_id=agent_id, actor=actor) + return server.agent_manager.get_in_context_messages(agent_id=agent_id, actor=actor) # TODO: remove? can also get with agent blocks @@ -429,7 +429,7 @@ def delete_agent_archival_memory( """ actor = server.user_manager.get_user_or_default(user_id=user_id) - server.delete_archival_memory(agent_id=agent_id, memory_id=memory_id, actor=actor) + server.delete_archival_memory(memory_id=memory_id, actor=actor) return JSONResponse(status_code=status.HTTP_200_OK, content={"message": f"Memory id={memory_id} successfully deleted"}) @@ -479,8 +479,9 @@ def update_message( """ Update the details of a message associated with an agent. """ + # TODO: Get rid of agent_id here, it's not really relevant actor = server.user_manager.get_user_or_default(user_id=user_id) - return server.update_agent_message(agent_id=agent_id, message_id=message_id, request=request, actor=actor) + return server.message_manager.update_message_by_id(message_id=message_id, message_update=request, actor=actor) @router.post( diff --git a/letta/server/server.py b/letta/server/server.py index 617283345a..9d5dc28dbb 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -40,14 +40,14 @@ VLLMChatCompletionsProvider, VLLMCompletionsProvider, ) -from letta.schemas.agent import AgentState, AgentType, CreateAgent, UpdateAgent +from letta.schemas.agent import AgentState, AgentType, CreateAgent from letta.schemas.block import BlockUpdate from letta.schemas.embedding_config import EmbeddingConfig # openai schemas from letta.schemas.enums import JobStatus from letta.schemas.job import Job, JobUpdate -from letta.schemas.letta_message import ToolReturnMessage, LettaMessage +from letta.schemas.letta_message import LettaMessage, ToolReturnMessage from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import ( ArchivalMemorySummary, @@ -376,25 +376,6 @@ def __init__( ) ) - def initialize_agent(self, agent_id, actor, interface: Union[AgentInterface, None] = None, initial_message_sequence=None) -> Agent: - """Initialize an agent from the database""" - agent_state = self.agent_manager.get_agent_by_id(agent_id=agent_id, actor=actor) - - interface = interface or self.default_interface_factory() - if agent_state.agent_type == AgentType.memgpt_agent: - agent = Agent(agent_state=agent_state, interface=interface, user=actor, initial_message_sequence=initial_message_sequence) - elif agent_state.agent_type == AgentType.offline_memory_agent: - agent = OfflineMemoryAgent( - agent_state=agent_state, interface=interface, user=actor, initial_message_sequence=initial_message_sequence - ) - else: - assert initial_message_sequence is None, f"Initial message sequence is not supported for O1Agents" - agent = O1Agent(agent_state=agent_state, interface=interface, user=actor) - - # Persist to agent - save_agent(agent) - return agent - def load_agent(self, agent_id: str, actor: User, interface: Union[AgentInterface, None] = None) -> Agent: """Updated method to load agents from persisted storage""" agent_lock = self.per_agent_lock_manager.get_lock(agent_id) @@ -413,11 +394,6 @@ def load_agent(self, agent_id: str, actor: User, interface: Union[AgentInterface else: raise ValueError(f"Invalid agent type {agent_state.agent_type}") - # Rebuild the system prompt - may be linked to new blocks now - agent.rebuild_system_prompt() - - # Persist to agent - save_agent(agent) return agent def _step( @@ -456,7 +432,7 @@ def _step( ) # save agent after step - save_agent(letta_agent) + # save_agent(letta_agent) except Exception as e: logger.error(f"Error in server._step: {e}") @@ -790,129 +766,23 @@ def create_agent( """Create a new agent using a config""" # Invoke manager - agent_state = self.agent_manager.create_agent( + return self.agent_manager.create_agent( agent_create=request, actor=actor, ) - # create the agent object - if request.initial_message_sequence is not None: - # init_messages = [Message(user_id=user_id, agent_id=agent_state.id, role=message.role, text=message.text) for message in request.initial_message_sequence] - init_messages = [] - for message in request.initial_message_sequence: - - if message.role == MessageRole.user: - packed_message = system.package_user_message( - user_message=message.text, - ) - elif message.role == MessageRole.system: - packed_message = system.package_system_message( - system_message=message.text, - ) - else: - raise ValueError(f"Invalid message role: {message.role}") - - init_messages.append(Message(role=message.role, text=packed_message, agent_id=agent_state.id)) - # init_messages = [Message.dict_to_message(user_id=user_id, agent_id=agent_state.id, openai_message_dict=message.model_dump()) for message in request.initial_message_sequence] - else: - init_messages = None - - # initialize the agent (generates initial message list with system prompt) - if interface is None: - interface = self.default_interface_factory() - self.initialize_agent(agent_id=agent_state.id, interface=interface, initial_message_sequence=init_messages, actor=actor) - - in_memory_agent_state = self.agent_manager.get_agent_by_id(agent_state.id, actor=actor) - return in_memory_agent_state - - # TODO: This is not good! - # TODO: Ideally, this should ALL be handled by the ORM - # TODO: The main blocker here IS the _message updates - def update_agent( - self, - agent_id: str, - request: UpdateAgent, - actor: User, - ) -> AgentState: - """Update the agents core memory block, return the new state""" - # Update agent state in the db first - agent_state = self.agent_manager.update_agent(agent_id=agent_id, agent_update=request, actor=actor) - - # Get the agent object (loaded in memory) - letta_agent = self.load_agent(agent_id=agent_id, actor=actor) - - # TODO: Everything below needs to get removed, no updating anything in memory - # update the system prompt - if request.system: - letta_agent.update_system_prompt(request.system) - - # update in-context messages - if request.message_ids: - # This means the user is trying to change what messages are in the message buffer - # Internally this requires (1) pulling from recall, - # then (2) setting the attributes ._messages and .state.message_ids - letta_agent.set_message_buffer(message_ids=request.message_ids) - - letta_agent.update_state() - - return agent_state - - def get_tools_from_agent(self, agent_id: str, user_id: Optional[str]) -> List[Tool]: - """Get tools from an existing agent""" - # TODO: Thread actor directly through this function, since the top level caller most likely already retrieved the user - actor = self.user_manager.get_user_or_default(user_id=user_id) - - # Get the agent object (loaded in memory) - letta_agent = self.load_agent(agent_id=agent_id, actor=actor) - return letta_agent.agent_state.tools - - def add_tool_to_agent( - self, - agent_id: str, - tool_id: str, - user_id: str, - ): - """Add tools from an existing agent""" - # TODO: Thread actor directly through this function, since the top level caller most likely already retrieved the user - actor = self.user_manager.get_user_or_default(user_id=user_id) - - agent_state = self.agent_manager.attach_tool(agent_id=agent_id, tool_id=tool_id, actor=actor) - - return agent_state - - def remove_tool_from_agent( - self, - agent_id: str, - tool_id: str, - user_id: str, - ): - """Remove tools from an existing agent""" - # TODO: Thread actor directly through this function, since the top level caller most likely already retrieved the user - actor = self.user_manager.get_user_or_default(user_id=user_id) - agent_state = self.agent_manager.detach_tool(agent_id=agent_id, tool_id=tool_id, actor=actor) - - return agent_state - # convert name->id + # TODO: These can be moved to agent_manager def get_agent_memory(self, agent_id: str, actor: User) -> Memory: """Return the memory of an agent (core memory)""" - agent = self.load_agent(agent_id=agent_id, actor=actor) - return agent.agent_state.memory + return self.agent_manager.get_agent_by_id(agent_id=agent_id, actor=actor).memory def get_archival_memory_summary(self, agent_id: str, actor: User) -> ArchivalMemorySummary: - agent = self.load_agent(agent_id=agent_id, actor=actor) return ArchivalMemorySummary(size=self.agent_manager.passage_size(actor=actor, agent_id=agent_id)) def get_recall_memory_summary(self, agent_id: str, actor: User) -> RecallMemorySummary: - agent = self.load_agent(agent_id=agent_id, actor=actor) - return RecallMemorySummary(size=len(agent.message_manager)) - - def get_in_context_messages(self, agent_id: str, actor: User) -> List[Message]: - """Get the in-context messages in the agent's memory""" - # Get the agent object (loaded in memory) - agent = self.load_agent(agent_id=agent_id, actor=actor) - return agent._messages + return RecallMemorySummary(size=self.message_manager.size(actor=actor, agent_id=agent_id)) def get_agent_archival(self, user_id: str, agent_id: str, cursor: Optional[str] = None, limit: int = 50) -> List[Passage]: """Paginated query of all messages in agent archival memory""" @@ -947,24 +817,17 @@ def get_agent_archival_cursor( def insert_archival_memory(self, agent_id: str, memory_contents: str, actor: User) -> List[Passage]: # Get the agent object (loaded in memory) - letta_agent = self.load_agent(agent_id=agent_id, actor=actor) - + agent_state = self.agent_manager.get_agent_by_id(agent_id=agent_id, actor=actor) # Insert into archival memory - passages = self.passage_manager.insert_passage( - agent_state=letta_agent.agent_state, agent_id=agent_id, text=memory_contents, actor=actor - ) - - save_agent(letta_agent) + # TODO: @mindy look at moving this to agent_manager to avoid above extra call + passages = self.passage_manager.insert_passage(agent_state=agent_state, agent_id=agent_id, text=memory_contents, actor=actor) return passages - def delete_archival_memory(self, agent_id: str, memory_id: str, actor: User): - # Get the agent object (loaded in memory) - letta_agent = self.load_agent(agent_id=agent_id, actor=actor) - - # Delete by ID + def delete_archival_memory(self, memory_id: str, actor: User): # TODO check if it exists first, and throw error if not - letta_agent.passage_manager.delete_passage_by_id(passage_id=memory_id, actor=actor) + # TODO: @mindy make this return the deleted passage instead + self.passage_manager.delete_passage_by_id(passage_id=memory_id, actor=actor) # TODO: return archival memory @@ -1042,9 +905,8 @@ def update_agent_core_memory(self, agent_id: str, label: str, value: str, actor: # update the block self.block_manager.update_block(block_id=block.id, block_update=BlockUpdate(value=value), actor=actor) - # load agent - letta_agent = self.load_agent(agent_id=agent_id, actor=actor) - return letta_agent.agent_state.memory + # rebuild system prompt for agent, potentially changed + return self.agent_manager.rebuild_system_prompt(agent_id=agent_id, actor=actor).memory def delete_source(self, source_id: str, actor: User): """Delete a data source""" @@ -1214,36 +1076,11 @@ def add_default_external_tools(self, actor: User) -> bool: return success - def update_agent_message(self, agent_id: str, message_id: str, request: MessageUpdate, actor: User) -> Message: + def update_agent_message(self, message_id: str, request: MessageUpdate, actor: User) -> Message: """Update the details of a message associated with an agent""" # Get the current message - letta_agent = self.load_agent(agent_id=agent_id, actor=actor) - response = letta_agent.update_message(message_id=message_id, request=request) - save_agent(letta_agent) - return response - - def rewrite_agent_message(self, agent_id: str, new_text: str, actor: User) -> Message: - - # Get the current message - letta_agent = self.load_agent(agent_id=agent_id, actor=actor) - response = letta_agent.rewrite_message(new_text=new_text) - save_agent(letta_agent) - return response - - def rethink_agent_message(self, agent_id: str, new_thought: str, actor: User) -> Message: - # Get the current message - letta_agent = self.load_agent(agent_id=agent_id, actor=actor) - response = letta_agent.rethink_message(new_thought=new_thought) - save_agent(letta_agent) - return response - - def retry_agent_message(self, agent_id: str, actor: User) -> List[Message]: - # Get the current message - letta_agent = self.load_agent(agent_id=agent_id, actor=actor) - response = letta_agent.retry_message() - save_agent(letta_agent) - return response + return self.message_manager.update_message_by_id(message_id=message_id, message_update=request, actor=actor) def get_organization_or_default(self, org_id: Optional[str]) -> Organization: """Get the organization object for org_id if it exists, otherwise return the default organization object""" @@ -1331,15 +1168,7 @@ def add_llm_model(self, request: LLMConfig) -> LLMConfig: def add_embedding_model(self, request: EmbeddingConfig) -> EmbeddingConfig: """Add a new embedding model""" - def get_agent_context_window( - self, - user_id: str, - agent_id: str, - ) -> ContextWindowOverview: - # TODO: Thread actor directly through this function, since the top level caller most likely already retrieved the user - actor = self.user_manager.get_user_or_default(user_id=user_id) - - # Get the current message + def get_agent_context_window(self, agent_id: str, actor: User) -> ContextWindowOverview: letta_agent = self.load_agent(agent_id=agent_id, actor=actor) return letta_agent.get_context_window() diff --git a/letta/services/agent_manager.py b/letta/services/agent_manager.py index aacad8ae49..4e6b80ec5b 100644 --- a/letta/services/agent_manager.py +++ b/letta/services/agent_manager.py @@ -20,6 +20,7 @@ from letta.schemas.block import Block as PydanticBlock from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.llm_config import LLMConfig +from letta.schemas.message import Message as PydanticMessage from letta.schemas.passage import Passage as PydanticPassage from letta.schemas.source import Source as PydanticSource from letta.schemas.tool_rule import ToolRule as PydanticToolRule @@ -28,12 +29,17 @@ from letta.services.helpers.agent_manager_helper import ( _process_relationship, _process_tags, + check_supports_structured_output, + compile_system_message, derive_system_message, + initialize_message_sequence, + package_initial_message_sequence, ) +from letta.services.message_manager import MessageManager from letta.services.source_manager import SourceManager from letta.services.tool_manager import ToolManager from letta.settings import settings -from letta.utils import enforce_types +from letta.utils import enforce_types, get_utc_time, united_diff logger = get_logger(__name__) @@ -49,6 +55,7 @@ def __init__(self): self.block_manager = BlockManager() self.tool_manager = ToolManager() self.source_manager = SourceManager() + self.message_manager = MessageManager() # ====================================================================================================================== # Basic CRUD operations @@ -64,6 +71,10 @@ def create_agent( if not agent_create.llm_config or not agent_create.embedding_config: raise ValueError("llm_config and embedding_config are required") + # Check tool rules are valid + if agent_create.tool_rules: + check_supports_structured_output(model=agent_create.llm_config.model, tool_rules=agent_create.tool_rules) + # create blocks (note: cannot be linked into the agent_id is created) block_ids = list(agent_create.block_ids or []) # Create a local copy to avoid modifying the original for create_block in agent_create.memory_blocks: @@ -88,7 +99,8 @@ def create_agent( # Remove duplicates tool_ids = list(set(tool_ids)) - return self._create_agent( + # Create the agent + agent_state = self._create_agent( name=agent_create.name, system=system, agent_type=agent_create.agent_type, @@ -104,6 +116,35 @@ def create_agent( actor=actor, ) + # TODO: See if we can merge this into the above SQL create call for performance reasons + # Generate a sequence of initial messages to put in the buffer + init_messages = initialize_message_sequence( + agent_state=agent_state, memory_edit_timestamp=get_utc_time(), include_initial_boot_message=True + ) + + if agent_create.initial_message_sequence is not None: + # We always need the system prompt up front + system_message_obj = PydanticMessage.dict_to_message( + agent_id=agent_state.id, + user_id=agent_state.created_by_id, + model=agent_state.llm_config.model, + openai_message_dict=init_messages[0], + ) + # Don't use anything else in the pregen sequence, instead use the provided sequence + init_messages = [system_message_obj] + init_messages.extend( + package_initial_message_sequence(agent_state.id, agent_create.initial_message_sequence, agent_state.llm_config.model, actor) + ) + else: + init_messages = [ + PydanticMessage.dict_to_message( + agent_id=agent_state.id, user_id=agent_state.created_by_id, model=agent_state.llm_config.model, openai_message_dict=msg + ) + for msg in init_messages + ] + + return self.append_to_in_context_messages(init_messages, agent_id=agent_state.id, actor=actor) + @enforce_types def _create_agent( self, @@ -149,6 +190,16 @@ def _create_agent( @enforce_types def update_agent(self, agent_id: str, agent_update: UpdateAgent, actor: PydanticUser) -> PydanticAgentState: + agent_state = self._update_agent(agent_id=agent_id, agent_update=agent_update, actor=actor) + + # Rebuild the system prompt if it's different + if agent_update.system and agent_update.system != agent_state.system: + agent_state = self.rebuild_system_prompt(agent_id=agent_state.id, actor=actor, force=True, update_timestamp=False) + + return agent_state + + @enforce_types + def _update_agent(self, agent_id: str, agent_update: UpdateAgent, actor: PydanticUser) -> PydanticAgentState: """ Update an existing agent. @@ -247,6 +298,105 @@ def delete_agent(self, agent_id: str, actor: PydanticUser) -> PydanticAgentState agent.hard_delete(session) return agent_state + # ====================================================================================================================== + # In Context Messages Management + # ====================================================================================================================== + # TODO: There are several assumptions here that are not explicitly checked + # TODO: 1) These message ids are valid + # TODO: 2) These messages are ordered from oldest to newest + # TODO: This can be fixed by having an actual relationship in the ORM for message_ids + # TODO: This can also be made more efficient, instead of getting, setting, we can do it all in one db session for one query. + @enforce_types + def get_in_context_messages(self, agent_id: str, actor: PydanticUser) -> List[PydanticMessage]: + message_ids = self.get_agent_by_id(agent_id=agent_id, actor=actor).message_ids + return self.message_manager.get_messages_by_ids(message_ids=message_ids, actor=actor) + + @enforce_types + def get_system_message(self, agent_id: str, actor: PydanticUser) -> PydanticMessage: + message_ids = self.get_agent_by_id(agent_id=agent_id, actor=actor).message_ids + return self.message_manager.get_message_by_id(message_id=message_ids[0], actor=actor) + + @enforce_types + def rebuild_system_prompt(self, agent_id: str, actor: PydanticUser, force=False, update_timestamp=True) -> PydanticAgentState: + """Rebuilds the system message with the latest memory object and any shared memory block updates + + Updates to core memory blocks should trigger a "rebuild", which itself will create a new message object + + Updates to the memory header should *not* trigger a rebuild, since that will simply flood recall storage with excess messages + """ + agent_state = self.get_agent_by_id(agent_id=agent_id, actor=actor) + + curr_system_message = self.get_system_message( + agent_id=agent_id, actor=actor + ) # this is the system + memory bank, not just the system prompt + curr_system_message_openai = curr_system_message.to_openai_dict() + + # note: we only update the system prompt if the core memory is changed + # this means that the archival/recall memory statistics may be someout out of date + curr_memory_str = agent_state.memory.compile() + if curr_memory_str in curr_system_message_openai["content"] and not force: + # NOTE: could this cause issues if a block is removed? (substring match would still work) + logger.info( + f"Memory hasn't changed for agent id={agent_id} and actor=({actor.id}, {actor.name}), skipping system prompt rebuild" + ) + return agent_state + + # If the memory didn't update, we probably don't want to update the timestamp inside + # For example, if we're doing a system prompt swap, this should probably be False + if update_timestamp: + memory_edit_timestamp = get_utc_time() + else: + # NOTE: a bit of a hack - we pull the timestamp from the message created_by + memory_edit_timestamp = curr_system_message.created_at + + # update memory (TODO: potentially update recall/archival stats separately) + new_system_message_str = compile_system_message( + system_prompt=agent_state.system, + in_context_memory=agent_state.memory, + in_context_memory_last_edit=memory_edit_timestamp, + ) + + diff = united_diff(curr_system_message_openai["content"], new_system_message_str) + if len(diff) > 0: # there was a diff + logger.info(f"Rebuilding system with new memory...\nDiff:\n{diff}") + + # Swap the system message out (only if there is a diff) + message = PydanticMessage.dict_to_message( + agent_id=agent_id, + user_id=actor.id, + model=agent_state.llm_config.model, + openai_message_dict={"role": "system", "content": new_system_message_str}, + ) + message = self.message_manager.create_message(message, actor=actor) + message_ids = [message.id] + agent_state.message_ids[1:] # swap index 0 (system) + return self.set_in_context_messages(agent_id=agent_id, message_ids=message_ids, actor=actor) + else: + return agent_state + + @enforce_types + def set_in_context_messages(self, agent_id: str, message_ids: List[str], actor: PydanticUser) -> PydanticAgentState: + return self.update_agent(agent_id=agent_id, agent_update=UpdateAgent(message_ids=message_ids), actor=actor) + + @enforce_types + def trim_older_in_context_messages(self, num: int, agent_id: str, actor: PydanticUser) -> PydanticAgentState: + message_ids = self.get_agent_by_id(agent_id=agent_id, actor=actor).message_ids + new_messages = [message_ids[0]] + message_ids[num:] # 0 is system message + return self.set_in_context_messages(agent_id=agent_id, message_ids=new_messages, actor=actor) + + @enforce_types + def prepend_to_in_context_messages(self, messages: List[PydanticMessage], agent_id: str, actor: PydanticUser) -> PydanticAgentState: + message_ids = self.get_agent_by_id(agent_id=agent_id, actor=actor).message_ids + new_messages = self.message_manager.create_many_messages(messages, actor=actor) + message_ids = [message_ids[0]] + [m.id for m in new_messages] + message_ids[1:] + return self.set_in_context_messages(agent_id=agent_id, message_ids=message_ids, actor=actor) + + @enforce_types + def append_to_in_context_messages(self, messages: List[PydanticMessage], agent_id: str, actor: PydanticUser) -> PydanticAgentState: + messages = self.message_manager.create_many_messages(messages, actor=actor) + message_ids = self.get_agent_by_id(agent_id=agent_id, actor=actor).message_ids or [] + message_ids += [m.id for m in messages] + return self.set_in_context_messages(agent_id=agent_id, message_ids=message_ids, actor=actor) + # ====================================================================================================================== # Source Management # ====================================================================================================================== diff --git a/letta/services/helpers/agent_manager_helper.py b/letta/services/helpers/agent_manager_helper.py index 95ad26beeb..2d7ac2805e 100644 --- a/letta/services/helpers/agent_manager_helper.py +++ b/letta/services/helpers/agent_manager_helper.py @@ -1,10 +1,21 @@ -from typing import List, Optional +import datetime +from typing import List, Literal, Optional +from letta import system +from letta.constants import IN_CONTEXT_MEMORY_KEYWORD, STRUCTURED_OUTPUT_MODELS +from letta.helpers import ToolRulesSolver from letta.orm.agent import Agent as AgentModel from letta.orm.agents_tags import AgentsTags from letta.orm.errors import NoResultFound from letta.prompts import gpt_system -from letta.schemas.agent import AgentType +from letta.schemas.agent import AgentState, AgentType +from letta.schemas.enums import MessageRole +from letta.schemas.memory import Memory +from letta.schemas.message import Message, MessageCreate +from letta.schemas.tool_rule import ToolRule +from letta.schemas.user import User +from letta.system import get_initial_boot_messages, get_login_event +from letta.utils import get_local_time # Static methods @@ -88,3 +99,162 @@ def derive_system_message(agent_type: AgentType, system: Optional[str] = None): raise ValueError(f"Invalid agent type: {agent_type}") return system + + +# TODO: This code is kind of wonky and deserves a rewrite +def compile_memory_metadata_block( + memory_edit_timestamp: datetime.datetime, previous_message_count: int = 0, archival_memory_size: int = 0 +) -> str: + # Put the timestamp in the local timezone (mimicking get_local_time()) + timestamp_str = memory_edit_timestamp.astimezone().strftime("%Y-%m-%d %I:%M:%S %p %Z%z").strip() + + # Create a metadata block of info so the agent knows about the metadata of out-of-context memories + memory_metadata_block = "\n".join( + [ + f"### Memory [last modified: {timestamp_str}]", + f"{previous_message_count} previous messages between you and the user are stored in recall memory (use functions to access them)", + f"{archival_memory_size} total memories you created are stored in archival memory (use functions to access them)", + "\nCore memory shown below (limited in size, additional information stored in archival / recall memory):", + ] + ) + return memory_metadata_block + + +def compile_system_message( + system_prompt: str, + in_context_memory: Memory, + in_context_memory_last_edit: datetime.datetime, # TODO move this inside of BaseMemory? + user_defined_variables: Optional[dict] = None, + append_icm_if_missing: bool = True, + template_format: Literal["f-string", "mustache", "jinja2"] = "f-string", + previous_message_count: int = 0, + archival_memory_size: int = 0, +) -> str: + """Prepare the final/full system message that will be fed into the LLM API + + The base system message may be templated, in which case we need to render the variables. + + The following are reserved variables: + - CORE_MEMORY: the in-context memory of the LLM + """ + + if user_defined_variables is not None: + # TODO eventually support the user defining their own variables to inject + raise NotImplementedError + else: + variables = {} + + # Add the protected memory variable + if IN_CONTEXT_MEMORY_KEYWORD in variables: + raise ValueError(f"Found protected variable '{IN_CONTEXT_MEMORY_KEYWORD}' in user-defined vars: {str(user_defined_variables)}") + else: + # TODO should this all put into the memory.__repr__ function? + memory_metadata_string = compile_memory_metadata_block( + memory_edit_timestamp=in_context_memory_last_edit, + previous_message_count=previous_message_count, + archival_memory_size=archival_memory_size, + ) + full_memory_string = memory_metadata_string + "\n" + in_context_memory.compile() + + # Add to the variables list to inject + variables[IN_CONTEXT_MEMORY_KEYWORD] = full_memory_string + + if template_format == "f-string": + + # Catch the special case where the system prompt is unformatted + if append_icm_if_missing: + memory_variable_string = "{" + IN_CONTEXT_MEMORY_KEYWORD + "}" + if memory_variable_string not in system_prompt: + # In this case, append it to the end to make sure memory is still injected + # warnings.warn(f"{IN_CONTEXT_MEMORY_KEYWORD} variable was missing from system prompt, appending instead") + system_prompt += "\n" + memory_variable_string + + # render the variables using the built-in templater + try: + formatted_prompt = system_prompt.format_map(variables) + except Exception as e: + raise ValueError(f"Failed to format system prompt - {str(e)}. System prompt value:\n{system_prompt}") + + else: + # TODO support for mustache and jinja2 + raise NotImplementedError(template_format) + + return formatted_prompt + + +def initialize_message_sequence( + agent_state: AgentState, + memory_edit_timestamp: Optional[datetime.datetime] = None, + include_initial_boot_message: bool = True, + previous_message_count: int = 0, + archival_memory_size: int = 0, +) -> List[dict]: + if memory_edit_timestamp is None: + memory_edit_timestamp = get_local_time() + + full_system_message = compile_system_message( + system_prompt=agent_state.system, + in_context_memory=agent_state.memory, + in_context_memory_last_edit=memory_edit_timestamp, + user_defined_variables=None, + append_icm_if_missing=True, + previous_message_count=previous_message_count, + archival_memory_size=archival_memory_size, + ) + first_user_message = get_login_event() # event letting Letta know the user just logged in + + if include_initial_boot_message: + if agent_state.llm_config.model is not None and "gpt-3.5" in agent_state.llm_config.model: + initial_boot_messages = get_initial_boot_messages("startup_with_send_message_gpt35") + else: + initial_boot_messages = get_initial_boot_messages("startup_with_send_message") + messages = ( + [ + {"role": "system", "content": full_system_message}, + ] + + initial_boot_messages + + [ + {"role": "user", "content": first_user_message}, + ] + ) + + else: + messages = [ + {"role": "system", "content": full_system_message}, + {"role": "user", "content": first_user_message}, + ] + + return messages + + +def package_initial_message_sequence( + agent_id: str, initial_message_sequence: List[MessageCreate], model: str, actor: User +) -> List[Message]: + # create the agent object + init_messages = [] + for message_create in initial_message_sequence: + + if message_create.role == MessageRole.user: + packed_message = system.package_user_message( + user_message=message_create.text, + ) + elif message_create.role == MessageRole.system: + packed_message = system.package_system_message( + system_message=message_create.text, + ) + else: + raise ValueError(f"Invalid message role: {message_create.role}") + + init_messages.append( + Message(role=message_create.role, text=packed_message, organization_id=actor.organization_id, agent_id=agent_id, model=model) + ) + return init_messages + + +def check_supports_structured_output(model: str, tool_rules: List[ToolRule]) -> bool: + if model not in STRUCTURED_OUTPUT_MODELS: + if len(ToolRulesSolver(tool_rules=tool_rules).init_tool_rules) > 1: + raise ValueError("Multiple initial tools are not supported for non-structured models. Please use only one initial tool rule.") + return False + else: + return True diff --git a/letta/services/message_manager.py b/letta/services/message_manager.py index 6c317f6498..c369aa2c75 100644 --- a/letta/services/message_manager.py +++ b/letta/services/message_manager.py @@ -28,6 +28,21 @@ def get_message_by_id(self, message_id: str, actor: PydanticUser) -> Optional[Py except NoResultFound: return None + @enforce_types + def get_messages_by_ids(self, message_ids: List[str], actor: PydanticUser) -> List[PydanticMessage]: + """Fetch messages by ID and return them in the requested order.""" + with self.session_maker() as session: + results = MessageModel.list(db_session=session, id=message_ids, organization_id=actor.organization_id) + + if len(results) != len(message_ids): + raise NoResultFound( + f"Expected {len(message_ids)} messages, but found {len(results)}. Missing ids={set(message_ids) - set([r.id for r in results])}" + ) + + # Sort results directly based on message_ids + result_dict = {msg.id: msg.to_pydantic() for msg in results} + return [result_dict[msg_id] for msg_id in message_ids] + @enforce_types def create_message(self, pydantic_msg: PydanticMessage, actor: PydanticUser) -> PydanticMessage: """Create a new message.""" diff --git a/tests/helpers/endpoints_helper.py b/tests/helpers/endpoints_helper.py index 27a7b1210b..87997aaf7a 100644 --- a/tests/helpers/endpoints_helper.py +++ b/tests/helpers/endpoints_helper.py @@ -15,20 +15,16 @@ from letta.constants import DEFAULT_HUMAN, DEFAULT_PERSONA from letta.embeddings import embedding_model from letta.errors import ( - InvalidToolCallError, InvalidInnerMonologueError, - MissingToolCallError, + InvalidToolCallError, MissingInnerMonologueError, + MissingToolCallError, ) from letta.llm_api.llm_api_tools import create from letta.local_llm.constants import INNER_THOUGHTS_KWARG from letta.schemas.agent import AgentState from letta.schemas.embedding_config import EmbeddingConfig -from letta.schemas.letta_message import ( - ToolCallMessage, - ReasoningMessage, - LettaMessage, -) +from letta.schemas.letta_message import LettaMessage, ReasoningMessage, ToolCallMessage from letta.schemas.letta_response import LettaResponse from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import ChatMemory @@ -78,7 +74,13 @@ def setup_agent( memory = ChatMemory(human=memory_human_str, persona=memory_persona_str) agent_state = client.create_agent( - name=agent_uuid, llm_config=llm_config, embedding_config=embedding_config, memory=memory, tool_ids=tool_ids, tool_rules=tool_rules, include_base_tools=include_base_tools, + name=agent_uuid, + llm_config=llm_config, + embedding_config=embedding_config, + memory=memory, + tool_ids=tool_ids, + tool_rules=tool_rules, + include_base_tools=include_base_tools, ) return agent_state @@ -105,12 +107,13 @@ def check_first_response_is_valid_for_llm_endpoint(filename: str) -> ChatComplet agent_state = setup_agent(client, filename) full_agent_state = client.get_agent(agent_state.id) + messages = client.server.agent_manager.get_in_context_messages(agent_id=full_agent_state.id, actor=client.user) agent = Agent(agent_state=full_agent_state, interface=None, user=client.user) response = create( llm_config=agent_state.llm_config, user_id=str(uuid.UUID(int=1)), # dummy user_id - messages=agent._messages, + messages=messages, functions=[t.json_schema for t in agent.agent_state.tools], ) @@ -412,9 +415,7 @@ def assert_invoked_function_call(messages: Sequence[LettaMessage], function_name # Found it, do nothing return - raise MissingToolCallError( - messages=messages, explanation=f"No messages were found invoking function call with name: {function_name}" - ) + raise MissingToolCallError(messages=messages, explanation=f"No messages were found invoking function call with name: {function_name}") def assert_inner_monologue_is_present_and_valid(messages: List[LettaMessage]) -> None: diff --git a/tests/integration_test_summarizer.py b/tests/integration_test_summarizer.py index 9131797cc5..b4de0043b4 100644 --- a/tests/integration_test_summarizer.py +++ b/tests/integration_test_summarizer.py @@ -1,13 +1,16 @@ import json import os import uuid +from typing import List import pytest from letta import create_client from letta.agent import Agent +from letta.client.client import LocalClient from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.llm_config import LLMConfig +from letta.schemas.message import Message from letta.streaming_interface import StreamingRefreshCLIInterface from tests.helpers.endpoints_helper import EMBEDDING_CONFIG_PATH from tests.helpers.utils import cleanup @@ -16,6 +19,110 @@ LLM_CONFIG_DIR = "tests/configs/llm_model_configs" SUMMARY_KEY_PHRASE = "The following is a summary" +test_agent_name = f"test_client_{str(uuid.uuid4())}" + +# TODO: these tests should include looping through LLM providers, since behavior may vary across providers +# TODO: these tests should add function calls into the summarized message sequence:W + + +@pytest.fixture(scope="module") +def client(): + client = create_client() + # client.set_default_llm_config(LLMConfig.default_config("gpt-4o-mini")) + client.set_default_llm_config(LLMConfig.default_config("gpt-4o-mini")) + client.set_default_embedding_config(EmbeddingConfig.default_config(provider="openai")) + + yield client + + +@pytest.fixture(scope="module") +def agent_state(client): + # Generate uuid for agent name for this example + agent_state = client.create_agent(name=test_agent_name) + yield agent_state + + client.delete_agent(agent_state.id) + + +def test_summarize_messages_inplace(client, agent_state, mock_e2b_api_key_none): + """Test summarization via sending the summarize CLI command or via a direct call to the agent object""" + # First send a few messages (5) + response = client.user_message( + agent_id=agent_state.id, + message="Hey, how's it going? What do you think about this whole shindig", + ).messages + assert response is not None and len(response) > 0 + print(f"test_summarize: response={response}") + + response = client.user_message( + agent_id=agent_state.id, + message="Any thoughts on the meaning of life?", + ).messages + assert response is not None and len(response) > 0 + print(f"test_summarize: response={response}") + + response = client.user_message(agent_id=agent_state.id, message="Does the number 42 ring a bell?").messages + assert response is not None and len(response) > 0 + print(f"test_summarize: response={response}") + + response = client.user_message( + agent_id=agent_state.id, + message="Would you be surprised to learn that you're actually conversing with an AI right now?", + ).messages + assert response is not None and len(response) > 0 + print(f"test_summarize: response={response}") + + # reload agent object + agent_obj = client.server.load_agent(agent_id=agent_state.id, actor=client.user) + + agent_obj.summarize_messages_inplace() + + +def test_auto_summarize(client, mock_e2b_api_key_none): + """Test that the summarizer triggers by itself""" + small_context_llm_config = LLMConfig.default_config("gpt-4o-mini") + small_context_llm_config.context_window = 4000 + + small_agent_state = client.create_agent( + name="small_context_agent", + llm_config=small_context_llm_config, + ) + + try: + + def summarize_message_exists(messages: List[Message]) -> bool: + for message in messages: + if message.text and "The following is a summary of the previous" in message.text: + print(f"Summarize message found after {message_count} messages: \n {message.text}") + return True + return False + + MAX_ATTEMPTS = 10 + message_count = 0 + while True: + + # send a message + response = client.user_message( + agent_id=small_agent_state.id, + message="What is the meaning of life?", + ) + message_count += 1 + + print(f"Message {message_count}: \n\n{response.messages}" + "--------------------------------") + + # check if the summarize message is inside the messages + assert isinstance(client, LocalClient), "Test only works with LocalClient" + in_context_messages = client.server.agent_manager.get_in_context_messages(agent_id=small_agent_state.id, actor=client.user) + print("SUMMARY", summarize_message_exists(in_context_messages)) + if summarize_message_exists(in_context_messages): + break + + if message_count > MAX_ATTEMPTS: + raise Exception(f"Summarize message not found after {message_count} messages") + + finally: + client.delete_agent(small_agent_state.id) + @pytest.mark.parametrize( "config_filename", @@ -69,4 +176,5 @@ def test_summarizer(config_filename): # Invoke a summarize letta_agent.summarize_messages_inplace(preserve_last_N_messages=False) - assert SUMMARY_KEY_PHRASE in letta_agent.messages[1]["content"], f"Test failed for config: {config_filename}" + in_context_messages = client.get_in_context_messages(agent_state.id) + assert SUMMARY_KEY_PHRASE in in_context_messages[1].text, f"Test failed for config: {config_filename}" diff --git a/tests/test_client_legacy.py b/tests/test_client_legacy.py index 16dc1cd6b4..3d907fa373 100644 --- a/tests/test_client_legacy.py +++ b/tests/test_client_legacy.py @@ -18,20 +18,22 @@ from letta.schemas.enums import MessageRole, MessageStreamStatus from letta.schemas.letta_message import ( AssistantMessage, - ToolCallMessage, - ToolReturnMessage, - ReasoningMessage, LettaMessage, + ReasoningMessage, SystemMessage, + ToolCallMessage, + ToolReturnMessage, UserMessage, ) from letta.schemas.letta_response import LettaResponse, LettaStreamingResponse from letta.schemas.llm_config import LLMConfig from letta.schemas.message import MessageCreate from letta.schemas.usage import LettaUsageStatistics +from letta.services.helpers.agent_manager_helper import initialize_message_sequence from letta.services.organization_manager import OrganizationManager from letta.services.user_manager import UserManager from letta.settings import model_settings +from letta.utils import get_utc_time from tests.helpers.client_helper import upload_file_using_client # from tests.utils import create_config @@ -602,18 +604,11 @@ def test_initial_message_sequence(client: Union[LocalClient, RESTClient], agent: If we pass in a non-empty list, we should get that sequence If we pass in an empty list, we should get an empty sequence """ - from letta.agent import initialize_message_sequence - from letta.utils import get_utc_time - # The reference initial message sequence: reference_init_messages = initialize_message_sequence( - model=agent.llm_config.model, - system=agent.system, - agent_id=agent.id, - memory=agent.memory, + agent_state=agent, memory_edit_timestamp=get_utc_time(), include_initial_boot_message=True, - actor=default_user, ) # system, login message, send_message test, send_message receipt diff --git a/tests/test_local_client.py b/tests/test_local_client.py index ea5d04e063..da5e533c5a 100644 --- a/tests/test_local_client.py +++ b/tests/test_local_client.py @@ -259,10 +259,10 @@ def test_recall_memory(client: LocalClient, agent: AgentState): assert exists # get in-context messages - messages = client.get_in_context_messages(agent.id) + in_context_messages = client.get_in_context_messages(agent.id) exists = False - for m in messages: - if message_str in str(m): + for m in in_context_messages: + if message_str in m.text: exists = True assert exists diff --git a/tests/test_managers.py b/tests/test_managers.py index 37c6f2ac08..388d477c60 100644 --- a/tests/test_managers.py +++ b/tests/test_managers.py @@ -370,8 +370,8 @@ def print_other_tool(message: str): @pytest.fixture def sarah_agent(server: SyncServer, default_user, default_organization): """Fixture to create and return a sample agent within the default organization.""" - agent_state = server.create_agent( - request=CreateAgent( + agent_state = server.agent_manager.create_agent( + agent_create=CreateAgent( name="sarah_agent", memory_blocks=[], llm_config=LLMConfig.default_config("gpt-4"), @@ -385,8 +385,8 @@ def sarah_agent(server: SyncServer, default_user, default_organization): @pytest.fixture def charles_agent(server: SyncServer, default_user, default_organization): """Fixture to create and return a sample agent within the default organization.""" - agent_state = server.create_agent( - request=CreateAgent( + agent_state = server.agent_manager.create_agent( + agent_create=CreateAgent( name="charles_agent", memory_blocks=[CreateBlock(label="human", value="Charles"), CreateBlock(label="persona", value="I am a helpful assistant")], llm_config=LLMConfig.default_config("gpt-4"), @@ -503,6 +503,54 @@ def test_create_get_list_agent(server: SyncServer, comprehensive_test_agent_fixt assert len(list_agents) == 0 +def test_create_agent_passed_in_initial_messages(server: SyncServer, default_user, default_block): + memory_blocks = [CreateBlock(label="human", value="BananaBoy"), CreateBlock(label="persona", value="I am a helpful assistant")] + create_agent_request = CreateAgent( + system="test system", + memory_blocks=memory_blocks, + llm_config=LLMConfig.default_config("gpt-4"), + embedding_config=EmbeddingConfig.default_config(provider="openai"), + block_ids=[default_block.id], + tags=["a", "b"], + description="test_description", + initial_message_sequence=[MessageCreate(role=MessageRole.user, text="hello world")], + ) + agent_state = server.agent_manager.create_agent( + create_agent_request, + actor=default_user, + ) + assert server.message_manager.size(agent_id=agent_state.id, actor=default_user) == 2 + init_messages = server.agent_manager.get_in_context_messages(agent_id=agent_state.id, actor=default_user) + # Check that the system appears in the first initial message + assert create_agent_request.system in init_messages[0].text + assert create_agent_request.memory_blocks[0].value in init_messages[0].text + # Check that the second message is the passed in initial message seq + assert create_agent_request.initial_message_sequence[0].role == init_messages[1].role + assert create_agent_request.initial_message_sequence[0].text in init_messages[1].text + + +def test_create_agent_default_initial_message(server: SyncServer, default_user, default_block): + memory_blocks = [CreateBlock(label="human", value="BananaBoy"), CreateBlock(label="persona", value="I am a helpful assistant")] + create_agent_request = CreateAgent( + system="test system", + memory_blocks=memory_blocks, + llm_config=LLMConfig.default_config("gpt-4"), + embedding_config=EmbeddingConfig.default_config(provider="openai"), + block_ids=[default_block.id], + tags=["a", "b"], + description="test_description", + ) + agent_state = server.agent_manager.create_agent( + create_agent_request, + actor=default_user, + ) + assert server.message_manager.size(agent_id=agent_state.id, actor=default_user) == 4 + init_messages = server.agent_manager.get_in_context_messages(agent_id=agent_state.id, actor=default_user) + # Check that the system appears in the first initial message + assert create_agent_request.system in init_messages[0].text + assert create_agent_request.memory_blocks[0].value in init_messages[0].text + + def test_update_agent(server: SyncServer, comprehensive_test_agent_fixture, other_tool, other_source, other_block, default_user): agent, _ = comprehensive_test_agent_fixture update_agent_request = UpdateAgent( @@ -794,8 +842,8 @@ def test_list_agents_by_tags_with_other_filters(server: SyncServer, sarah_agent, def test_list_agents_by_tags_pagination(server: SyncServer, default_user, default_organization): """Test pagination when listing agents by tags.""" # Create first agent - agent1 = server.create_agent( - request=CreateAgent( + agent1 = server.agent_manager.create_agent( + agent_create=CreateAgent( name="agent1", tags=["pagination_test", "tag1"], llm_config=LLMConfig.default_config("gpt-4"), @@ -809,8 +857,8 @@ def test_list_agents_by_tags_pagination(server: SyncServer, default_user, defaul time.sleep(CREATE_DELAY_SQLITE) # Ensure distinct created_at timestamps # Create second agent - agent2 = server.create_agent( - request=CreateAgent( + agent2 = server.agent_manager.create_agent( + agent_create=CreateAgent( name="agent2", tags=["pagination_test", "tag2"], llm_config=LLMConfig.default_config("gpt-4"), @@ -1565,6 +1613,15 @@ def create_test_messages(server: SyncServer, base_message: PydanticMessage, defa return messages +def test_get_messages_by_ids(server: SyncServer, hello_world_message_fixture, default_user, sarah_agent): + """Test basic message listing with limit""" + messages = create_test_messages(server, hello_world_message_fixture, default_user) + message_ids = [m.id for m in messages] + + results = server.message_manager.get_messages_by_ids(message_ids=message_ids, actor=default_user) + assert sorted(message_ids) == sorted([r.id for r in results]) + + def test_message_listing_basic(server: SyncServer, hello_world_message_fixture, default_user, sarah_agent): """Test basic message listing with limit""" create_test_messages(server, hello_world_message_fixture, default_user) diff --git a/tests/test_server.py b/tests/test_server.py index 2209c8bcff..66e192cd64 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -10,11 +10,11 @@ from letta.schemas.block import CreateBlock from letta.schemas.enums import MessageRole from letta.schemas.letta_message import ( - ToolCallMessage, - ToolReturnMessage, - ReasoningMessage, LettaMessage, + ReasoningMessage, SystemMessage, + ToolCallMessage, + ToolReturnMessage, UserMessage, ) from letta.schemas.user import User @@ -507,76 +507,9 @@ def test_get_archival_memory(server, user_id, agent_id): assert len(passage_none) == 0 -def test_agent_rethink_rewrite_retry(server, user_id, agent_id): - """Test the /rethink, /rewrite, and /retry commands in the CLI - - - "rethink" replaces the inner thoughts of the last assistant message - - "rewrite" replaces the text of the last assistant message - - "retry" retries the last assistant message - """ - actor = server.user_manager.get_user_or_default(user_id) - - # Send an initial message - server.user_message(user_id=user_id, agent_id=agent_id, message="Hello?") - - # Grab the raw Agent object - letta_agent = server.load_agent(agent_id=agent_id, actor=actor) - assert letta_agent._messages[-1].role == MessageRole.tool - assert letta_agent._messages[-2].role == MessageRole.assistant - last_agent_message = letta_agent._messages[-2] - - # Try "rethink" - new_thought = "I am thinking about the meaning of life, the universe, and everything. Bananas?" - assert last_agent_message.text is not None and last_agent_message.text != new_thought - server.rethink_agent_message(agent_id=agent_id, new_thought=new_thought, actor=actor) - - # Grab the agent object again (make sure it's live) - letta_agent = server.load_agent(agent_id=agent_id, actor=actor) - assert letta_agent._messages[-1].role == MessageRole.tool - assert letta_agent._messages[-2].role == MessageRole.assistant - last_agent_message = letta_agent._messages[-2] - assert last_agent_message.text == new_thought - - # Try "rewrite" - assert last_agent_message.tool_calls is not None - assert last_agent_message.tool_calls[0].function.name == "send_message" - assert last_agent_message.tool_calls[0].function.arguments is not None - args_json = json.loads(last_agent_message.tool_calls[0].function.arguments) - assert "message" in args_json and args_json["message"] is not None and args_json["message"] != "" - - new_text = "Why hello there my good friend! Is 42 what you're looking for? Bananas?" - server.rewrite_agent_message(agent_id=agent_id, new_text=new_text, actor=actor) - - # Grab the agent object again (make sure it's live) - letta_agent = server.load_agent(agent_id=agent_id, actor=actor) - assert letta_agent._messages[-1].role == MessageRole.tool - assert letta_agent._messages[-2].role == MessageRole.assistant - last_agent_message = letta_agent._messages[-2] - args_json = json.loads(last_agent_message.tool_calls[0].function.arguments) - assert "message" in args_json and args_json["message"] is not None and args_json["message"] == new_text - - # Try retry - server.retry_agent_message(agent_id=agent_id, actor=actor) - - # Grab the agent object again (make sure it's live) - letta_agent = server.load_agent(agent_id=agent_id, actor=actor) - assert letta_agent._messages[-1].role == MessageRole.tool - assert letta_agent._messages[-2].role == MessageRole.assistant - last_agent_message = letta_agent._messages[-2] - - # Make sure the inner thoughts changed - assert last_agent_message.text is not None and last_agent_message.text != new_thought - - # Make sure the message changed - args_json = json.loads(last_agent_message.tool_calls[0].function.arguments) - print(args_json) - assert "message" in args_json and args_json["message"] is not None and args_json["message"] != new_text - - def test_get_context_window_overview(server: SyncServer, user_id: str, agent_id: str): """Test that the context window overview fetch works""" - - overview = server.get_agent_context_window(user_id=user_id, agent_id=agent_id) + overview = server.get_agent_context_window(agent_id=agent_id, actor=server.user_manager.get_user_or_default(user_id)) assert overview is not None # Run some basic checks @@ -1142,10 +1075,10 @@ def test_add_remove_tools_update_agent(server: SyncServer, user_id: str, base_to # Add all the base tools request.tool_ids = [b.id for b in base_tools] - agent_state = server.update_agent(agent_state.id, request=request, actor=actor) + agent_state = server.agent_manager.update_agent(agent_state.id, agent_update=request, actor=actor) assert len(agent_state.tools) == len(base_tools) # Remove one base tool request.tool_ids = [b.id for b in base_tools[:-2]] - agent_state = server.update_agent(agent_state.id, request=request, actor=actor) + agent_state = server.agent_manager.update_agent(agent_state.id, agent_update=request, actor=actor) assert len(agent_state.tools) == len(base_tools) - 2 diff --git a/tests/test_summarize.py b/tests/test_summarize.py deleted file mode 100644 index 8996841347..0000000000 --- a/tests/test_summarize.py +++ /dev/null @@ -1,133 +0,0 @@ -import uuid -from typing import List - -from letta import create_client -from letta.client.client import LocalClient -from letta.schemas.embedding_config import EmbeddingConfig -from letta.schemas.llm_config import LLMConfig -from letta.schemas.message import Message - -from .utils import wipe_config - -# test_agent_id = "test_agent" -test_agent_name = f"test_client_{str(uuid.uuid4())}" -client = None -agent_obj = None - -# TODO: these tests should include looping through LLM providers, since behavior may vary across providers -# TODO: these tests should add function calls into the summarized message sequence:W - - -def create_test_agent(): - """Create a test agent that we can call functions on""" - wipe_config() - - global client - client = create_client() - - client.set_default_llm_config(LLMConfig.default_config("gpt-4")) - client.set_default_embedding_config(EmbeddingConfig.default_config(provider="openai")) - - agent_state = client.create_agent( - name=test_agent_name, - ) - - global agent_obj - agent_obj = client.server.load_agent(agent_id=agent_state.id, actor=client.user) - - -def test_summarize_messages_inplace(mock_e2b_api_key_none): - """Test summarization via sending the summarize CLI command or via a direct call to the agent object""" - global client - global agent_obj - - if agent_obj is None: - create_test_agent() - - assert agent_obj is not None, "Run create_agent test first" - assert client is not None, "Run create_agent test first" - - # First send a few messages (5) - response = client.user_message( - agent_id=agent_obj.agent_state.id, - message="Hey, how's it going? What do you think about this whole shindig", - ).messages - assert response is not None and len(response) > 0 - print(f"test_summarize: response={response}") - - response = client.user_message( - agent_id=agent_obj.agent_state.id, - message="Any thoughts on the meaning of life?", - ).messages - assert response is not None and len(response) > 0 - print(f"test_summarize: response={response}") - - response = client.user_message(agent_id=agent_obj.agent_state.id, message="Does the number 42 ring a bell?").messages - assert response is not None and len(response) > 0 - print(f"test_summarize: response={response}") - - response = client.user_message( - agent_id=agent_obj.agent_state.id, - message="Would you be surprised to learn that you're actually conversing with an AI right now?", - ).messages - assert response is not None and len(response) > 0 - print(f"test_summarize: response={response}") - - # reload agent object - agent_obj = client.server.load_agent(agent_id=agent_obj.agent_state.id, actor=client.user) - - agent_obj.summarize_messages_inplace() - print(f"Summarization succeeded: messages[1] = \n{agent_obj.messages[1]}") - # response = client.run_command(agent_id=agent_obj.agent_state.id, command="summarize") - - -def test_auto_summarize(mock_e2b_api_key_none): - """Test that the summarizer triggers by itself""" - client = create_client() - client.set_default_llm_config(LLMConfig.default_config("gpt-4")) - client.set_default_embedding_config(EmbeddingConfig.default_config(provider="openai")) - - small_context_llm_config = LLMConfig.default_config("gpt-4") - # default system prompt + funcs lead to ~2300 tokens, after one message it's at 2523 tokens - SMALL_CONTEXT_WINDOW = 4000 - small_context_llm_config.context_window = SMALL_CONTEXT_WINDOW - - agent_state = client.create_agent( - name="small_context_agent", - llm_config=small_context_llm_config, - ) - - try: - - def summarize_message_exists(messages: List[Message]) -> bool: - for message in messages: - if message.text and "The following is a summary of the previous" in message.text: - print(f"Summarize message found after {message_count} messages: \n {message.text}") - return True - return False - - MAX_ATTEMPTS = 5 - message_count = 0 - while True: - - # send a message - response = client.user_message( - agent_id=agent_state.id, - message="What is the meaning of life?", - ) - message_count += 1 - - print(f"Message {message_count}: \n\n{response.messages}" + "--------------------------------") - - # check if the summarize message is inside the messages - assert isinstance(client, LocalClient), "Test only works with LocalClient" - agent_obj = client.server.load_agent(agent_id=agent_state.id, actor=client.user) - print("SUMMARY", summarize_message_exists(agent_obj._messages)) - if summarize_message_exists(agent_obj._messages): - break - - if message_count > MAX_ATTEMPTS: - raise Exception(f"Summarize message not found after {message_count} messages") - - finally: - client.delete_agent(agent_state.id) From 50c3e004a8f1f0d6e87a6cabc4793a559e923374 Mon Sep 17 00:00:00 2001 From: cthomas Date: Fri, 20 Dec 2024 16:38:16 -0800 Subject: [PATCH 121/280] fix: propagate error on tool failure (#2281) Co-authored-by: Caren Thomas --- letta/agent.py | 26 +++++++++++++++++++++-- letta/constants.py | 2 ++ letta/server/rest_api/interface.py | 4 ++-- letta/utils.py | 3 ++- tests/test_client.py | 34 ++++++++++++++++++++++++++++++ 5 files changed, 64 insertions(+), 5 deletions(-) diff --git a/letta/agent.py b/letta/agent.py index 4f636938a6..072154a22e 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -9,6 +9,7 @@ from letta.constants import ( BASE_TOOLS, CLI_WARNING_PREFIX, + ERROR_MESSAGE_PREFIX, FIRST_MESSAGE_ATTEMPTS, FUNC_FAILED_HEARTBEAT_MESSAGE, LLM_MAX_TOKENS, @@ -498,7 +499,7 @@ def _handle_ai_response( function_args.pop("self", None) # error_msg = f"Error calling function {function_name} with args {function_args}: {str(e)}" # Less detailed - don't provide full args, idea is that it should be in recent context so no need (just adds noise) - error_msg = f"Error calling function {function_name}: {str(e)}" + error_msg = get_friendly_error_msg(function_name=function_name, exception_name=type(e).__name__, exception_message=str(e)) error_msg_user = f"{error_msg}\n{traceback.format_exc()}" printd(error_msg_user) function_response = package_function_response(False, error_msg) @@ -521,8 +522,29 @@ def _handle_ai_response( self.interface.function_message(f"Error: {error_msg}", msg_obj=messages[-1]) return messages, False, True # force a heartbeat to allow agent to handle error + # Step 4: check if function response is an error + if function_response_string.startswith(ERROR_MESSAGE_PREFIX): + function_response = package_function_response(False, function_response_string) + # TODO: truncate error message somehow + messages.append( + Message.dict_to_message( + agent_id=self.agent_state.id, + user_id=self.agent_state.created_by_id, + model=self.model, + openai_message_dict={ + "role": "tool", + "name": function_name, + "content": function_response, + "tool_call_id": tool_call_id, + }, + ) + ) # extend conversation with function response + self.interface.function_message(f"Ran {function_name}({function_args})", msg_obj=messages[-1]) + self.interface.function_message(f"Error: {function_response_string}", msg_obj=messages[-1]) + return messages, False, True # force a heartbeat to allow agent to handle error + # If no failures happened along the way: ... - # Step 4: send the info on the function call and function response to GPT + # Step 5: send the info on the function call and function response to GPT messages.append( Message.dict_to_message( agent_id=self.agent_state.id, diff --git a/letta/constants.py b/letta/constants.py index 575b80d7e4..942dd0c903 100644 --- a/letta/constants.py +++ b/letta/constants.py @@ -69,6 +69,8 @@ CLI_WARNING_PREFIX = "Warning: " +ERROR_MESSAGE_PREFIX = "Error" + NON_USER_MSG_PREFIX = "[This is an automated system message hidden from the user] " # Constants to do with summarization / conversation length window diff --git a/letta/server/rest_api/interface.py b/letta/server/rest_api/interface.py index b3d344798b..1e68ce6e2d 100644 --- a/letta/server/rest_api/interface.py +++ b/letta/server/rest_api/interface.py @@ -238,7 +238,7 @@ def function_message(self, msg: str, msg_obj: Optional[Message] = None, include_ new_message = {"function_return": msg, "status": "success"} elif msg.startswith("Error: "): - msg = msg.replace("Error: ", "") + msg = msg.replace("Error: ", "", 1) new_message = {"function_return": msg, "status": "error"} else: @@ -951,7 +951,7 @@ def function_message(self, msg: str, msg_obj: Optional[Message] = None): ) elif msg.startswith("Error: "): - msg = msg.replace("Error: ", "") + msg = msg.replace("Error: ", "", 1) # new_message = {"function_return": msg, "status": "error"} assert msg_obj.tool_call_id is not None new_message = ToolReturnMessage( diff --git a/letta/utils.py b/letta/utils.py index f8b3778b89..4be8a543fb 100644 --- a/letta/utils.py +++ b/letta/utils.py @@ -28,6 +28,7 @@ CLI_WARNING_PREFIX, CORE_MEMORY_HUMAN_CHAR_LIMIT, CORE_MEMORY_PERSONA_CHAR_LIMIT, + ERROR_MESSAGE_PREFIX, LETTA_DIR, MAX_FILENAME_LENGTH, TOOL_CALL_ID_MAX_LEN, @@ -1122,7 +1123,7 @@ def sanitize_filename(filename: str) -> str: def get_friendly_error_msg(function_name: str, exception_name: str, exception_message: str): from letta.constants import MAX_ERROR_MESSAGE_CHAR_LIMIT - error_msg = f"Error executing function {function_name}: {exception_name}: {exception_message}" + error_msg = f"{ERROR_MESSAGE_PREFIX} executing function {function_name}: {exception_name}: {exception_message}" if len(error_msg) > MAX_ERROR_MESSAGE_CHAR_LIMIT: error_msg = error_msg[:MAX_ERROR_MESSAGE_CHAR_LIMIT] return error_msg diff --git a/tests/test_client.py b/tests/test_client.py index ec2bb6cb15..1a9b26028a 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -1,4 +1,5 @@ import asyncio +import json import os import threading import time @@ -382,6 +383,39 @@ def big_return(): client.delete_agent(agent_id=agent.id) +def test_function_always_error(client: Union[LocalClient, RESTClient]): + """Test to see if function that errors works correctly""" + + def always_error(): + """ + Always throw an error. + """ + return 5/0 + + tool = client.create_or_update_tool(func=always_error) + agent = client.create_agent(tool_ids=[tool.id]) + # get function response + response = client.send_message(agent_id=agent.id, message="call the always_error function", role="user") + print(response.messages) + + response_message = None + for message in response.messages: + if isinstance(message, FunctionReturn): + response_message = message + break + + assert response_message, "FunctionReturn message not found in response" + assert response_message.status == "error" + if isinstance(client, RESTClient): + assert response_message.function_return == "Error executing function always_error: ZeroDivisionError: division by zero" + else: + response_json = json.loads(response_message.function_return) + assert response_json['status'] == "Failed" + assert response_json['message'] == "Error executing function always_error: ZeroDivisionError: division by zero" + + client.delete_agent(agent_id=agent.id) + + @pytest.mark.asyncio async def test_send_message_parallel(client: Union[LocalClient, RESTClient], agent: AgentState, request): """ From bbe8deaa2921f482b38747257e811e5862a283fa Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Fri, 20 Dec 2024 16:56:53 -0800 Subject: [PATCH 122/280] chore: Clean up `.load_agent` usage (#2298) --- ...0_add_cascading_deletes_for_sources_to_.py | 35 ++++++++ letta/agent.py | 28 ------- letta/client/client.py | 11 ++- letta/orm/source.py | 13 ++- letta/orm/sources_agents.py | 4 +- letta/server/rest_api/routers/v1/sources.py | 11 +-- letta/server/server.py | 79 +------------------ letta/settings.py | 3 - tests/test_model_letta_perfomance.py | 35 +++++++- tests/test_server.py | 77 +++++++++--------- 10 files changed, 133 insertions(+), 163 deletions(-) create mode 100644 alembic/versions/e78b4e82db30_add_cascading_deletes_for_sources_to_.py diff --git a/alembic/versions/e78b4e82db30_add_cascading_deletes_for_sources_to_.py b/alembic/versions/e78b4e82db30_add_cascading_deletes_for_sources_to_.py new file mode 100644 index 0000000000..dd59f2a046 --- /dev/null +++ b/alembic/versions/e78b4e82db30_add_cascading_deletes_for_sources_to_.py @@ -0,0 +1,35 @@ +"""Add cascading deletes for sources to agents + +Revision ID: e78b4e82db30 +Revises: d6632deac81d +Create Date: 2024-12-20 16:30:17.095888 + +""" + +from typing import Sequence, Union + +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = "e78b4e82db30" +down_revision: Union[str, None] = "d6632deac81d" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint("sources_agents_agent_id_fkey", "sources_agents", type_="foreignkey") + op.drop_constraint("sources_agents_source_id_fkey", "sources_agents", type_="foreignkey") + op.create_foreign_key(None, "sources_agents", "sources", ["source_id"], ["id"], ondelete="CASCADE") + op.create_foreign_key(None, "sources_agents", "agents", ["agent_id"], ["id"], ondelete="CASCADE") + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, "sources_agents", type_="foreignkey") + op.drop_constraint(None, "sources_agents", type_="foreignkey") + op.create_foreign_key("sources_agents_source_id_fkey", "sources_agents", "sources", ["source_id"], ["id"]) + op.create_foreign_key("sources_agents_agent_id_fkey", "sources_agents", "agents", ["agent_id"], ["id"]) + # ### end Alembic commands ### diff --git a/letta/agent.py b/letta/agent.py index 072154a22e..a297f5b6ce 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -44,7 +44,6 @@ from letta.schemas.tool import Tool from letta.schemas.tool_rule import TerminalToolRule from letta.schemas.usage import LettaUsageStatistics -from letta.schemas.user import User as PydanticUser from letta.services.agent_manager import AgentManager from letta.services.block_manager import BlockManager from letta.services.helpers.agent_manager_helper import ( @@ -53,7 +52,6 @@ ) from letta.services.message_manager import MessageManager from letta.services.passage_manager import PassageManager -from letta.services.source_manager import SourceManager from letta.services.tool_execution_sandbox import ToolExecutionSandbox from letta.streaming_interface import StreamingRefreshCLIInterface from letta.system import ( @@ -969,32 +967,6 @@ def migrate_embedding(self, embedding_config: EmbeddingConfig): # TODO: recall memory raise NotImplementedError() - def attach_source( - self, - user: PydanticUser, - source_id: str, - source_manager: SourceManager, - agent_manager: AgentManager, - ): - """Attach a source to the agent using the SourcesAgents ORM relationship. - - Args: - user: User performing the action - source_id: ID of the source to attach - source_manager: SourceManager instance to verify source exists - agent_manager: AgentManager instance to manage agent-source relationship - """ - # Verify source exists and user has permission to access it - source = source_manager.get_source_by_id(source_id=source_id, actor=user) - assert source is not None, f"Source {source_id} not found in user's organization ({user.organization_id})" - - # Use the agent_manager to create the relationship - agent_manager.attach_source(agent_id=self.agent_state.id, source_id=source_id, actor=user) - - printd( - f"Attached data source {source.name} to agent {self.agent_state.name}.", - ) - def get_context_window(self) -> ContextWindowOverview: """Get the context window of the agent""" diff --git a/letta/client/client.py b/letta/client/client.py index e575979dc0..bb6d2f0ff8 100644 --- a/letta/client/client.py +++ b/letta/client/client.py @@ -2987,7 +2987,11 @@ def attach_source_to_agent(self, agent_id: str, source_id: Optional[str] = None, source_id (str): ID of the source source_name (str): Name of the source """ - self.server.attach_source_to_agent(source_id=source_id, source_name=source_name, agent_id=agent_id, user_id=self.user_id) + if source_name: + source = self.server.source_manager.get_source_by_id(source_id=source_id, actor=self.user) + source_id = source.id + + self.server.agent_manager.attach_source(source_id=source_id, agent_id=agent_id, actor=self.user) def detach_source_from_agent(self, agent_id: str, source_id: Optional[str] = None, source_name: Optional[str] = None): """ @@ -2999,7 +3003,10 @@ def detach_source_from_agent(self, agent_id: str, source_id: Optional[str] = Non Returns: source (Source): Detached source """ - return self.server.detach_source_from_agent(source_id=source_id, source_name=source_name, agent_id=agent_id, user_id=self.user_id) + if source_name: + source = self.server.source_manager.get_source_by_id(source_id=source_id, actor=self.user) + source_id = source.id + return self.server.agent_manager.detach_source(agent_id=agent_id, source_id=source_id, actor=self.user) def list_sources(self) -> List[Source]: """ diff --git a/letta/orm/source.py b/letta/orm/source.py index 3ecffda6d9..e7443ea67e 100644 --- a/letta/orm/source.py +++ b/letta/orm/source.py @@ -11,10 +11,10 @@ from letta.schemas.source import Source as PydanticSource if TYPE_CHECKING: - from letta.orm.organization import Organization + from letta.orm.agent import Agent from letta.orm.file import FileMetadata + from letta.orm.organization import Organization from letta.orm.passage import SourcePassage - from letta.orm.agent import Agent class Source(SqlalchemyBase, OrganizationMixin): @@ -32,4 +32,11 @@ class Source(SqlalchemyBase, OrganizationMixin): organization: Mapped["Organization"] = relationship("Organization", back_populates="sources") files: Mapped[List["FileMetadata"]] = relationship("FileMetadata", back_populates="source", cascade="all, delete-orphan") passages: Mapped[List["SourcePassage"]] = relationship("SourcePassage", back_populates="source", cascade="all, delete-orphan") - agents: Mapped[List["Agent"]] = relationship("Agent", secondary="sources_agents", back_populates="sources") + agents: Mapped[List["Agent"]] = relationship( + "Agent", + secondary="sources_agents", + back_populates="sources", + lazy="selectin", + cascade="all, delete", # Ensures rows in sources_agents are deleted when the source is deleted + passive_deletes=True, # Allows the database to handle deletion of orphaned rows + ) diff --git a/letta/orm/sources_agents.py b/letta/orm/sources_agents.py index cf502e71f4..ffe8a9d0ea 100644 --- a/letta/orm/sources_agents.py +++ b/letta/orm/sources_agents.py @@ -9,5 +9,5 @@ class SourcesAgents(Base): __tablename__ = "sources_agents" - agent_id: Mapped[String] = mapped_column(String, ForeignKey("agents.id"), primary_key=True) - source_id: Mapped[String] = mapped_column(String, ForeignKey("sources.id"), primary_key=True) + agent_id: Mapped[String] = mapped_column(String, ForeignKey("agents.id", ondelete="CASCADE"), primary_key=True) + source_id: Mapped[String] = mapped_column(String, ForeignKey("sources.id", ondelete="CASCADE"), primary_key=True) diff --git a/letta/server/rest_api/routers/v1/sources.py b/letta/server/rest_api/routers/v1/sources.py index bcc3203dde..fb48d125ca 100644 --- a/letta/server/rest_api/routers/v1/sources.py +++ b/letta/server/rest_api/routers/v1/sources.py @@ -130,11 +130,8 @@ def attach_source_to_agent( Attach a data source to an existing agent. """ actor = server.user_manager.get_user_or_default(user_id=user_id) - - source = server.source_manager.get_source_by_id(source_id=source_id, actor=actor) - assert source is not None, f"Source with id={source_id} not found." - source = server.attach_source_to_agent(source_id=source.id, agent_id=agent_id, user_id=actor.id) - return source + server.agent_manager.attach_source(source_id=source_id, agent_id=agent_id, actor=actor) + return server.source_manager.get_source_by_id(source_id=source_id, actor=actor) @router.post("/{source_id}/detach", response_model=Source, operation_id="detach_agent_from_source") @@ -148,8 +145,8 @@ def detach_source_from_agent( Detach a data source from an existing agent. """ actor = server.user_manager.get_user_or_default(user_id=user_id) - - return server.detach_source_from_agent(source_id=source_id, agent_id=agent_id, user_id=actor.id) + server.agent_manager.detach_source(agent_id=agent_id, source_id=source_id, actor=actor) + return server.source_manager.get_source_by_id(source_id=source_id, actor=actor) @router.post("/{source_id}/upload", response_model=Job, operation_id="upload_file_to_source") diff --git a/letta/server/server.py b/letta/server/server.py index 9d5dc28dbb..85aee52b2c 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -59,7 +59,7 @@ from letta.schemas.organization import Organization from letta.schemas.passage import Passage from letta.schemas.source import Source -from letta.schemas.tool import Tool, ToolCreate +from letta.schemas.tool import Tool from letta.schemas.usage import LettaUsageStatistics from letta.schemas.user import User from letta.services.agent_manager import AgentManager @@ -303,11 +303,6 @@ def __init__( self.block_manager.add_default_blocks(actor=self.default_user) self.tool_manager.upsert_base_tools(actor=self.default_user) - # If there is a default org/user - # This logic may have to change in the future - if settings.load_default_external_tools: - self.add_default_external_tools(actor=self.default_user) - # collect providers (always has Letta as a default) self._enabled_providers: List[Provider] = [LettaProvider()] if model_settings.openai_api_key: @@ -431,9 +426,6 @@ def _step( skip_verify=True, ) - # save agent after step - # save_agent(letta_agent) - except Exception as e: logger.error(f"Error in server._step: {e}") print(traceback.print_exc()) @@ -944,11 +936,10 @@ def load_file_to_source(self, source_id: str, file_path: str, job_id: str, actor agent_states = self.source_manager.list_attached_agents(source_id=source_id, actor=actor) for agent_state in agent_states: agent_id = agent_state.id - agent = self.load_agent(agent_id=agent_id, actor=actor) # Attach source to agent curr_passage_size = self.agent_manager.passage_size(actor=actor, agent_id=agent_id) - agent.attach_source(user=actor, source_id=source_id, source_manager=self.source_manager, agent_manager=self.agent_manager) + self.agent_manager.attach_source(agent_id=agent_state.id, source_id=source_id, actor=actor) new_passage_size = self.agent_manager.passage_size(actor=actor, agent_id=agent_id) assert new_passage_size >= curr_passage_size # in case empty files are added @@ -973,56 +964,6 @@ def load_data( passage_count, document_count = load_data(connector, source, self.passage_manager, self.source_manager, actor=user) return passage_count, document_count - def attach_source_to_agent( - self, - user_id: str, - agent_id: str, - source_id: Optional[str] = None, - source_name: Optional[str] = None, - ) -> Source: - # attach a data source to an agent - # TODO: Thread actor directly through this function, since the top level caller most likely already retrieved the user - actor = self.user_manager.get_user_or_default(user_id=user_id) - if source_id: - data_source = self.source_manager.get_source_by_id(source_id=source_id, actor=actor) - elif source_name: - data_source = self.source_manager.get_source_by_name(source_name=source_name, actor=actor) - else: - raise ValueError(f"Need to provide at least source_id or source_name to find the source.") - - assert data_source, f"Data source with id={source_id} or name={source_name} does not exist" - - # load agent - agent = self.load_agent(agent_id=agent_id, actor=actor) - - # attach source to agent - agent.attach_source(user=actor, source_id=data_source.id, source_manager=self.source_manager, agent_manager=self.agent_manager) - - return data_source - - def detach_source_from_agent( - self, - user_id: str, - agent_id: str, - source_id: Optional[str] = None, - source_name: Optional[str] = None, - ) -> Source: - # TODO: Thread actor directly through this function, since the top level caller most likely already retrieved the user - actor = self.user_manager.get_user_or_default(user_id=user_id) - if source_id: - source = self.source_manager.get_source_by_id(source_id=source_id, actor=actor) - elif source_name: - source = self.source_manager.get_source_by_name(source_name=source_name, actor=actor) - source_id = source.id - else: - raise ValueError(f"Need to provide at least source_id or source_name to find the source.") - - # delete agent-source mapping - self.agent_manager.detach_source(agent_id=agent_id, source_id=source_id, actor=actor) - - # return back source data - return source - def list_data_source_passages(self, user_id: str, source_id: str) -> List[Passage]: warnings.warn("list_data_source_passages is not yet implemented, returning empty list.", category=UserWarning) return [] @@ -1060,22 +1001,6 @@ def list_all_sources(self, actor: User) -> List[Source]: return sources_with_metadata - def add_default_external_tools(self, actor: User) -> bool: - """Add default langchain tools. Return true if successful, false otherwise.""" - success = True - tool_creates = ToolCreate.load_default_langchain_tools() - if tool_settings.composio_api_key: - tool_creates += ToolCreate.load_default_composio_tools() - for tool_create in tool_creates: - try: - self.tool_manager.create_or_update_tool(Tool(**tool_create.model_dump()), actor=actor) - except Exception as e: - warnings.warn(f"An error occurred while creating tool {tool_create}: {e}") - warnings.warn(traceback.format_exc()) - success = False - - return success - def update_agent_message(self, message_id: str, request: MessageUpdate, actor: User) -> Message: """Update the details of a message associated with an agent""" diff --git a/letta/settings.py b/letta/settings.py index d6907b11ee..1b6ba44bbe 100644 --- a/letta/settings.py +++ b/letta/settings.py @@ -83,9 +83,6 @@ class Settings(BaseSettings): pg_pool_recycle: int = 1800 # When to recycle connections pg_echo: bool = False # Logging - # tools configuration - load_default_external_tools: Optional[bool] = None - @property def letta_pg_uri(self) -> str: if self.pg_uri: diff --git a/tests/test_model_letta_perfomance.py b/tests/test_model_letta_perfomance.py index e473d5bb45..d45654eaaa 100644 --- a/tests/test_model_letta_perfomance.py +++ b/tests/test_model_letta_perfomance.py @@ -56,10 +56,35 @@ def wrapper(*args, **kwargs): return decorator_retry +def retry_until_success(max_attempts=10, sleep_time_seconds=4): + """ + Decorator to retry a function until it succeeds or the maximum number of attempts is reached. + + :param max_attempts: Maximum number of attempts to retry the function. + :param sleep_time_seconds: Time to wait between attempts, in seconds. + """ + + def decorator_retry(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + for attempt in range(1, max_attempts + 1): + try: + return func(*args, **kwargs) + except Exception as e: + print(f"\033[93mAttempt {attempt} failed with error:\n{e}\033[0m") + if attempt == max_attempts: + raise + time.sleep(sleep_time_seconds) + + return wrapper + + return decorator_retry + + # ====================================================================================================================== # OPENAI TESTS # ====================================================================================================================== -@retry_until_threshold(threshold=0.75, max_attempts=4) +@retry_until_success(max_attempts=5, sleep_time_seconds=2) def test_openai_gpt_4o_returns_valid_first_message(): filename = os.path.join(llm_config_dir, "openai-gpt-4o.json") response = check_first_response_is_valid_for_llm_endpoint(filename) @@ -67,6 +92,7 @@ def test_openai_gpt_4o_returns_valid_first_message(): print(f"Got successful response from client: \n\n{response}") +@retry_until_success(max_attempts=5, sleep_time_seconds=2) def test_openai_gpt_4o_returns_keyword(): keyword = "banana" filename = os.path.join(llm_config_dir, "openai-gpt-4o.json") @@ -75,6 +101,7 @@ def test_openai_gpt_4o_returns_keyword(): print(f"Got successful response from client: \n\n{response}") +@retry_until_success(max_attempts=5, sleep_time_seconds=2) def test_openai_gpt_4o_uses_external_tool(): filename = os.path.join(llm_config_dir, "openai-gpt-4o.json") response = check_agent_uses_external_tool(filename) @@ -82,6 +109,7 @@ def test_openai_gpt_4o_uses_external_tool(): print(f"Got successful response from client: \n\n{response}") +@retry_until_success(max_attempts=5, sleep_time_seconds=2) def test_openai_gpt_4o_recall_chat_memory(): filename = os.path.join(llm_config_dir, "openai-gpt-4o.json") response = check_agent_recall_chat_memory(filename) @@ -89,6 +117,7 @@ def test_openai_gpt_4o_recall_chat_memory(): print(f"Got successful response from client: \n\n{response}") +@retry_until_success(max_attempts=5, sleep_time_seconds=2) def test_openai_gpt_4o_archival_memory_retrieval(): filename = os.path.join(llm_config_dir, "openai-gpt-4o.json") response = check_agent_archival_memory_retrieval(filename) @@ -96,6 +125,7 @@ def test_openai_gpt_4o_archival_memory_retrieval(): print(f"Got successful response from client: \n\n{response}") +@retry_until_success(max_attempts=5, sleep_time_seconds=2) def test_openai_gpt_4o_archival_memory_insert(): filename = os.path.join(llm_config_dir, "openai-gpt-4o.json") response = check_agent_archival_memory_insert(filename) @@ -103,6 +133,7 @@ def test_openai_gpt_4o_archival_memory_insert(): print(f"Got successful response from client: \n\n{response}") +@retry_until_success(max_attempts=5, sleep_time_seconds=2) def test_openai_gpt_4o_edit_core_memory(): filename = os.path.join(llm_config_dir, "openai-gpt-4o.json") response = check_agent_edit_core_memory(filename) @@ -110,12 +141,14 @@ def test_openai_gpt_4o_edit_core_memory(): print(f"Got successful response from client: \n\n{response}") +@retry_until_success(max_attempts=5, sleep_time_seconds=2) def test_openai_gpt_4o_summarize_memory(): filename = os.path.join(llm_config_dir, "openai-gpt-4o.json") response = check_agent_summarize_memory_simple(filename) print(f"Got successful response from client: \n\n{response}") +@retry_until_success(max_attempts=5, sleep_time_seconds=2) def test_embedding_endpoint_openai(): filename = os.path.join(embedding_config_dir, "openai_embed.json") run_embedding_endpoint(filename) diff --git a/tests/test_server.py b/tests/test_server.py index 66e192cd64..4775ed91f5 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -362,10 +362,10 @@ def other_agent_id(server, user_id, base_tools): server.agent_manager.delete_agent(agent_state.id, actor=actor) -def test_error_on_nonexistent_agent(server, user_id, agent_id): +def test_error_on_nonexistent_agent(server, user, agent_id): try: fake_agent_id = str(uuid.uuid4()) - server.user_message(user_id=user_id, agent_id=fake_agent_id, message="Hello?") + server.user_message(user_id=user.id, agent_id=fake_agent_id, message="Hello?") raise Exception("user_message call should have failed") except (KeyError, ValueError) as e: # Error is expected @@ -375,9 +375,9 @@ def test_error_on_nonexistent_agent(server, user_id, agent_id): @pytest.mark.order(1) -def test_user_message_memory(server, user_id, agent_id): +def test_user_message_memory(server, user, agent_id): try: - server.user_message(user_id=user_id, agent_id=agent_id, message="/memory") + server.user_message(user_id=user.id, agent_id=agent_id, message="/memory") raise Exception("user_message call should have failed") except ValueError as e: # Error is expected @@ -385,13 +385,11 @@ def test_user_message_memory(server, user_id, agent_id): except: raise - server.run_command(user_id=user_id, agent_id=agent_id, command="/memory") + server.run_command(user_id=user.id, agent_id=agent_id, command="/memory") @pytest.mark.order(3) -def test_load_data(server, user_id, agent_id): - user = server.user_manager.get_user_or_default(user_id=user_id) - +def test_load_data(server, user, agent_id): # create source passages_before = server.agent_manager.list_passages(actor=user, agent_id=agent_id, cursor=None, limit=10000) assert len(passages_before) == 0 @@ -409,10 +407,10 @@ def test_load_data(server, user_id, agent_id): "Shishir loves indian food", ] connector = DummyDataConnector(archival_memories) - server.load_data(user_id, connector, source.name) + server.load_data(user.id, connector, source.name) # attach source - server.attach_source_to_agent(user_id=user_id, agent_id=agent_id, source_name="test_source") + server.agent_manager.attach_source(agent_id=agent_id, source_id=source.id, actor=user) # check archival memory size passages_after = server.agent_manager.list_passages(actor=user, agent_id=agent_id, cursor=None, limit=10000) @@ -425,9 +423,9 @@ def test_save_archival_memory(server, user_id, agent_id): @pytest.mark.order(4) -def test_user_message(server, user_id, agent_id): +def test_user_message(server, user, agent_id): # add data into recall memory - server.user_message(user_id=user_id, agent_id=agent_id, message="Hello?") + server.user_message(user_id=user.id, agent_id=agent_id, message="Hello?") # server.user_message(user_id=user_id, agent_id=agent_id, message="Hello?") # server.user_message(user_id=user_id, agent_id=agent_id, message="Hello?") # server.user_message(user_id=user_id, agent_id=agent_id, message="Hello?") @@ -435,21 +433,20 @@ def test_user_message(server, user_id, agent_id): @pytest.mark.order(5) -def test_get_recall_memory(server, org_id, user_id, agent_id): +def test_get_recall_memory(server, org_id, user, agent_id): # test recall memory cursor pagination - actor = server.user_manager.get_user_or_default(user_id=user_id) - messages_1 = server.get_agent_recall_cursor(user_id=user_id, agent_id=agent_id, limit=2) + actor = user + messages_1 = server.get_agent_recall_cursor(user_id=user.id, agent_id=agent_id, limit=2) cursor1 = messages_1[-1].id - messages_2 = server.get_agent_recall_cursor(user_id=user_id, agent_id=agent_id, after=cursor1, limit=1000) - messages_3 = server.get_agent_recall_cursor(user_id=user_id, agent_id=agent_id, limit=1000) + messages_2 = server.get_agent_recall_cursor(user_id=user.id, agent_id=agent_id, after=cursor1, limit=1000) + messages_3 = server.get_agent_recall_cursor(user_id=user.id, agent_id=agent_id, limit=1000) messages_3[-1].id assert messages_3[-1].created_at >= messages_3[0].created_at assert len(messages_3) == len(messages_1) + len(messages_2) - messages_4 = server.get_agent_recall_cursor(user_id=user_id, agent_id=agent_id, reverse=True, before=cursor1) + messages_4 = server.get_agent_recall_cursor(user_id=user.id, agent_id=agent_id, reverse=True, before=cursor1) assert len(messages_4) == 1 # test in-context message ids - # in_context_ids = server.get_in_context_message_ids(agent_id=agent_id) in_context_ids = server.agent_manager.get_agent_by_id(agent_id=agent_id, actor=actor).message_ids message_ids = [m.id for m in messages_3] @@ -458,13 +455,13 @@ def test_get_recall_memory(server, org_id, user_id, agent_id): @pytest.mark.order(6) -def test_get_archival_memory(server, user_id, agent_id): +def test_get_archival_memory(server, user, agent_id): # test archival memory cursor pagination - user = server.user_manager.get_user_by_id(user_id=user_id) + actor = user # List latest 2 passages passages_1 = server.agent_manager.list_passages( - actor=user, + actor=actor, agent_id=agent_id, ascending=False, limit=2, @@ -474,7 +471,7 @@ def test_get_archival_memory(server, user_id, agent_id): # List next 3 passages (earliest 3) cursor1 = passages_1[-1].id passages_2 = server.agent_manager.list_passages( - actor=user, + actor=actor, agent_id=agent_id, ascending=False, cursor=cursor1, @@ -483,7 +480,7 @@ def test_get_archival_memory(server, user_id, agent_id): # List all 5 cursor2 = passages_1[0].created_at passages_3 = server.agent_manager.list_passages( - actor=user, + actor=actor, agent_id=agent_id, ascending=False, end_date=cursor2, @@ -496,20 +493,20 @@ def test_get_archival_memory(server, user_id, agent_id): earliest = passages_2[-1] # test archival memory - passage_1 = server.agent_manager.list_passages(actor=user, agent_id=agent_id, limit=1, ascending=True) + passage_1 = server.agent_manager.list_passages(actor=actor, agent_id=agent_id, limit=1, ascending=True) assert len(passage_1) == 1 assert passage_1[0].text == "alpha" - passage_2 = server.agent_manager.list_passages(actor=user, agent_id=agent_id, cursor=earliest.id, limit=1000, ascending=True) + passage_2 = server.agent_manager.list_passages(actor=actor, agent_id=agent_id, cursor=earliest.id, limit=1000, ascending=True) assert len(passage_2) in [4, 5] # NOTE: exact size seems non-deterministic, so loosen test assert all("alpha" not in passage.text for passage in passage_2) # test safe empty return - passage_none = server.agent_manager.list_passages(actor=user, agent_id=agent_id, cursor=latest.id, limit=1000, ascending=True) + passage_none = server.agent_manager.list_passages(actor=actor, agent_id=agent_id, cursor=latest.id, limit=1000, ascending=True) assert len(passage_none) == 0 -def test_get_context_window_overview(server: SyncServer, user_id: str, agent_id: str): +def test_get_context_window_overview(server: SyncServer, user, agent_id): """Test that the context window overview fetch works""" - overview = server.get_agent_context_window(agent_id=agent_id, actor=server.user_manager.get_user_or_default(user_id)) + overview = server.get_agent_context_window(agent_id=agent_id, actor=user) assert overview is not None # Run some basic checks @@ -546,7 +543,7 @@ def test_get_context_window_overview(server: SyncServer, user_id: str, agent_id: ) -def test_delete_agent_same_org(server: SyncServer, org_id: str, user_id: str): +def test_delete_agent_same_org(server: SyncServer, org_id: str, user: User): agent_state = server.create_agent( request=CreateAgent( name="nonexistent_tools_agent", @@ -554,7 +551,7 @@ def test_delete_agent_same_org(server: SyncServer, org_id: str, user_id: str): llm="openai/gpt-4", embedding="openai/text-embedding-ada-002", ), - actor=server.user_manager.get_user_or_default(user_id), + actor=user, ) # create another user in the same org @@ -566,14 +563,14 @@ def test_delete_agent_same_org(server: SyncServer, org_id: str, user_id: str): def _test_get_messages_letta_format( server, - user_id, + user, agent_id, reverse=False, ): """Test mapping between messages and letta_messages with reverse=False.""" messages = server.get_agent_recall_cursor( - user_id=user_id, + user_id=user.id, agent_id=agent_id, limit=1000, reverse=reverse, @@ -582,7 +579,7 @@ def _test_get_messages_letta_format( assert all(isinstance(m, Message) for m in messages) letta_messages = server.get_agent_recall_cursor( - user_id=user_id, + user_id=user.id, agent_id=agent_id, limit=1000, reverse=reverse, @@ -675,10 +672,10 @@ def _test_get_messages_letta_format( warnings.warn(f"Extra letta_messages found: {len(letta_messages) - letta_message_index}") -def test_get_messages_letta_format(server, user_id, agent_id): +def test_get_messages_letta_format(server, user, agent_id): # for reverse in [False, True]: for reverse in [False]: - _test_get_messages_letta_format(server, user_id, agent_id, reverse=reverse) + _test_get_messages_letta_format(server, user, agent_id, reverse=reverse) EXAMPLE_TOOL_SOURCE = ''' @@ -825,9 +822,9 @@ def test_composio_client_simple(server): assert len(actions) > 0 -def test_memory_rebuild_count(server, user_id, mock_e2b_api_key_none, base_tools, base_memory_tools): +def test_memory_rebuild_count(server, user, mock_e2b_api_key_none, base_tools, base_memory_tools): """Test that the memory rebuild is generating the correct number of role=system messages""" - actor = server.user_manager.get_user_or_default(user_id) + actor = user # create agent agent_state = server.create_agent( request=CreateAgent( @@ -848,7 +845,7 @@ def count_system_messages_in_recall() -> Tuple[int, List[LettaMessage]]: # At this stage, there should only be 1 system message inside of recall storage letta_messages = server.get_agent_recall_cursor( - user_id=user_id, + user_id=user.id, agent_id=agent_state.id, limit=1000, # reverse=reverse, @@ -870,7 +867,7 @@ def count_system_messages_in_recall() -> Tuple[int, List[LettaMessage]]: assert num_system_messages == 1, (num_system_messages, all_messages) # Assuming core memory append actually ran correctly, at this point there should be 2 messages - server.user_message(user_id=user_id, agent_id=agent_state.id, message="Append 'banana' to your core memory") + server.user_message(user_id=user.id, agent_id=agent_state.id, message="Append 'banana' to your core memory") # At this stage, there should be 2 system message inside of recall storage num_system_messages, all_messages = count_system_messages_in_recall() From 803833e97ecc74dbc48db208e5d521e781cdf3be Mon Sep 17 00:00:00 2001 From: cthomas Date: Fri, 20 Dec 2024 16:58:03 -0800 Subject: [PATCH 123/280] feat: add back template id field for create agent req (#2300) Co-authored-by: Caren Thomas Co-authored-by: Sarah Wooders --- letta/schemas/agent.py | 1 + 1 file changed, 1 insertion(+) diff --git a/letta/schemas/agent.py b/letta/schemas/agent.py index 840ca58961..03d40350e1 100644 --- a/letta/schemas/agent.py +++ b/letta/schemas/agent.py @@ -118,6 +118,7 @@ class CreateAgent(BaseModel, validate_assignment=True): # ) context_window_limit: Optional[int] = Field(None, description="The context window limit used by the agent.") embedding_chunk_size: Optional[int] = Field(DEFAULT_EMBEDDING_CHUNK_SIZE, description="The embedding chunk size used by the agent.") + from_template: Optional[str] = Field(None, description="The template id used to configure the agent") @field_validator("name") @classmethod From b9b77fdc022c1db8818abdb0f09e0792fe53d210 Mon Sep 17 00:00:00 2001 From: cthomas Date: Fri, 20 Dec 2024 17:13:56 -0800 Subject: [PATCH 124/280] feat: add message type literal to usage stats (#2297) Co-authored-by: Caren Thomas --- letta/client/streaming.py | 4 ++-- letta/schemas/usage.py | 3 ++- letta/server/rest_api/utils.py | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/letta/client/streaming.py b/letta/client/streaming.py index 4a258cdc7a..a364ada6f0 100644 --- a/letta/client/streaming.py +++ b/letta/client/streaming.py @@ -59,8 +59,8 @@ def _sse_post(url: str, data: dict, headers: dict) -> Generator[LettaStreamingRe yield ToolCallMessage(**chunk_data) elif "tool_return" in chunk_data: yield ToolReturnMessage(**chunk_data) - elif "usage" in chunk_data: - yield LettaUsageStatistics(**chunk_data["usage"]) + elif "step_count" in chunk_data: + yield LettaUsageStatistics(**chunk_data) else: raise ValueError(f"Unknown message type in chunk_data: {chunk_data}") diff --git a/letta/schemas/usage.py b/letta/schemas/usage.py index 804d63831d..53cda8b25a 100644 --- a/letta/schemas/usage.py +++ b/letta/schemas/usage.py @@ -1,3 +1,4 @@ +from typing import Literal from pydantic import BaseModel, Field @@ -11,7 +12,7 @@ class LettaUsageStatistics(BaseModel): total_tokens (int): The total number of tokens processed by the agent. step_count (int): The number of steps taken by the agent. """ - + message_type: Literal["usage_statistics"] = "usage_statistics" completion_tokens: int = Field(0, description="The number of tokens generated by the agent.") prompt_tokens: int = Field(0, description="The number of tokens in the prompt.") total_tokens: int = Field(0, description="The total number of tokens processed by the agent.") diff --git a/letta/server/rest_api/utils.py b/letta/server/rest_api/utils.py index 64d46a5d3f..86a8899043 100644 --- a/letta/server/rest_api/utils.py +++ b/letta/server/rest_api/utils.py @@ -61,7 +61,7 @@ async def sse_async_generator( # Double-check the type if not isinstance(usage, LettaUsageStatistics): raise ValueError(f"Expected LettaUsageStatistics, got {type(usage)}") - yield sse_formatter({"usage": usage.model_dump()}) + yield sse_formatter(usage.model_dump()) except ContextWindowExceededError as e: log_error_to_sentry(e) From 2fc9b54f048ef2ee6557c215fea683eb8e6e8952 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Fri, 20 Dec 2024 17:33:53 -0800 Subject: [PATCH 125/280] fix: Fix limit for get_messages_by_ids (#2301) --- letta/services/message_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/letta/services/message_manager.py b/letta/services/message_manager.py index c369aa2c75..48851f58c5 100644 --- a/letta/services/message_manager.py +++ b/letta/services/message_manager.py @@ -32,7 +32,7 @@ def get_message_by_id(self, message_id: str, actor: PydanticUser) -> Optional[Py def get_messages_by_ids(self, message_ids: List[str], actor: PydanticUser) -> List[PydanticMessage]: """Fetch messages by ID and return them in the requested order.""" with self.session_maker() as session: - results = MessageModel.list(db_session=session, id=message_ids, organization_id=actor.organization_id) + results = MessageModel.list(db_session=session, id=message_ids, organization_id=actor.organization_id, limit=len(message_ids)) if len(results) != len(message_ids): raise NoResultFound( From 160aef5613867195cade6bf90461d31aec0b3c0a Mon Sep 17 00:00:00 2001 From: cthomas Date: Fri, 20 Dec 2024 17:37:42 -0800 Subject: [PATCH 126/280] feat: store handle in configs (#2299) Co-authored-by: Caren Thomas --- letta/providers.py | 23 ++++++++++++++++++++--- letta/schemas/embedding_config.py | 1 + letta/schemas/llm_config.py | 1 + 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/letta/providers.py b/letta/providers.py index 83069a767f..e8ebadfa70 100644 --- a/letta/providers.py +++ b/letta/providers.py @@ -27,6 +27,10 @@ def get_model_context_window(self, model_name: str) -> Optional[int]: def provider_tag(self) -> str: """String representation of the provider for display purposes""" raise NotImplementedError + + def get_handle(self, model_name: str) -> str: + return f"{self.name}/{model_name}" + class LettaProvider(Provider): @@ -40,6 +44,7 @@ def list_llm_models(self) -> List[LLMConfig]: model_endpoint_type="openai", model_endpoint="https://inference.memgpt.ai", context_window=16384, + handle=self.get_handle("letta-free") ) ] @@ -51,6 +56,7 @@ def list_embedding_models(self): embedding_endpoint="https://embeddings.memgpt.ai", embedding_dim=1024, embedding_chunk_size=300, + handle=self.get_handle("letta-free") ) ] @@ -115,7 +121,7 @@ def list_llm_models(self) -> List[LLMConfig]: # continue configs.append( - LLMConfig(model=model_name, model_endpoint_type="openai", model_endpoint=self.base_url, context_window=context_window_size) + LLMConfig(model=model_name, model_endpoint_type="openai", model_endpoint=self.base_url, context_window=context_window_size, handle=self.get_handle(model_name)) ) # for OpenAI, sort in reverse order @@ -135,6 +141,7 @@ def list_embedding_models(self) -> List[EmbeddingConfig]: embedding_endpoint="https://api.openai.com/v1", embedding_dim=1536, embedding_chunk_size=300, + handle=self.get_handle("text-embedding-ada-002") ) ] @@ -163,6 +170,7 @@ def list_llm_models(self) -> List[LLMConfig]: model_endpoint_type="anthropic", model_endpoint=self.base_url, context_window=model["context_window"], + handle=self.get_handle(model["name"]) ) ) return configs @@ -195,6 +203,7 @@ def list_llm_models(self) -> List[LLMConfig]: model_endpoint_type="openai", model_endpoint=self.base_url, context_window=model["max_context_length"], + handle=self.get_handle(model["id"]) ) ) @@ -250,6 +259,7 @@ def list_llm_models(self) -> List[LLMConfig]: model_endpoint=self.base_url, model_wrapper=self.default_prompt_formatter, context_window=context_window, + handle=self.get_handle(model["name"]) ) ) return configs @@ -325,6 +335,7 @@ def list_embedding_models(self) -> List[EmbeddingConfig]: embedding_endpoint=self.base_url, embedding_dim=embedding_dim, embedding_chunk_size=300, + handle=self.get_handle(model["name"]) ) ) return configs @@ -345,7 +356,7 @@ def list_llm_models(self) -> List[LLMConfig]: continue configs.append( LLMConfig( - model=model["id"], model_endpoint_type="groq", model_endpoint=self.base_url, context_window=model["context_window"] + model=model["id"], model_endpoint_type="groq", model_endpoint=self.base_url, context_window=model["context_window"], handle=self.get_handle(model["id"]) ) ) return configs @@ -413,6 +424,7 @@ def list_llm_models(self) -> List[LLMConfig]: model_endpoint=self.base_url, model_wrapper=self.default_prompt_formatter, context_window=context_window_size, + handle=self.get_handle(model_name) ) ) @@ -493,6 +505,7 @@ def list_llm_models(self): model_endpoint_type="google_ai", model_endpoint=self.base_url, context_window=self.get_model_context_window(model), + handle=self.get_handle(model) ) ) return configs @@ -516,6 +529,7 @@ def list_embedding_models(self): embedding_endpoint=self.base_url, embedding_dim=768, embedding_chunk_size=300, # NOTE: max is 2048 + handle=self.get_handle(model) ) ) return configs @@ -556,7 +570,7 @@ def list_llm_models(self) -> List[LLMConfig]: context_window_size = self.get_model_context_window(model_name) model_endpoint = get_azure_chat_completions_endpoint(self.base_url, model_name, self.api_version) configs.append( - LLMConfig(model=model_name, model_endpoint_type="azure", model_endpoint=model_endpoint, context_window=context_window_size) + LLMConfig(model=model_name, model_endpoint_type="azure", model_endpoint=model_endpoint, context_window=context_window_size), handle=self.get_handle(model_name) ) return configs @@ -577,6 +591,7 @@ def list_embedding_models(self) -> List[EmbeddingConfig]: embedding_endpoint=model_endpoint, embedding_dim=768, embedding_chunk_size=300, # NOTE: max is 2048 + handle=self.get_handle(model_name) ) ) return configs @@ -610,6 +625,7 @@ def list_llm_models(self) -> List[LLMConfig]: model_endpoint_type="openai", model_endpoint=self.base_url, context_window=model["max_model_len"], + handle=self.get_handle(model["id"]) ) ) return configs @@ -642,6 +658,7 @@ def list_llm_models(self) -> List[LLMConfig]: model_endpoint=self.base_url, model_wrapper=self.default_prompt_formatter, context_window=model["max_model_len"], + handle=self.get_handle(model["id"]) ) ) return configs diff --git a/letta/schemas/embedding_config.py b/letta/schemas/embedding_config.py index dcd80c0fdd..7a8236c379 100644 --- a/letta/schemas/embedding_config.py +++ b/letta/schemas/embedding_config.py @@ -43,6 +43,7 @@ class EmbeddingConfig(BaseModel): embedding_model: str = Field(..., description="The model for the embedding.") embedding_dim: int = Field(..., description="The dimension of the embedding.") embedding_chunk_size: Optional[int] = Field(300, description="The chunk size of the embedding.") + handle: Optional[str] = Field(None, description="The handle for this config, in the format provider/model-name.") # azure only azure_endpoint: Optional[str] = Field(None, description="The Azure endpoint for the model.") diff --git a/letta/schemas/llm_config.py b/letta/schemas/llm_config.py index ed63e766b5..0be4f81887 100644 --- a/letta/schemas/llm_config.py +++ b/letta/schemas/llm_config.py @@ -44,6 +44,7 @@ class LLMConfig(BaseModel): True, description="Puts 'inner_thoughts' as a kwarg in the function call if this is set to True. This helps with function calling performance and also the generation of inner thoughts.", ) + handle: Optional[str] = Field(None, description="The handle for this config, in the format provider/model-name.") # FIXME hack to silence pydantic protected namespace warning model_config = ConfigDict(protected_namespaces=()) From ec55e03cd992fe9d34614401990bcc30571ec4c9 Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Fri, 20 Dec 2024 19:36:14 -0800 Subject: [PATCH 127/280] fix: hotfix (#2302) --- letta/server/rest_api/routers/v1/agents.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index c46a24573a..405ab1cf17 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -161,7 +161,7 @@ def add_tool_to_agent( ): """Add tools to an existing agent""" actor = server.user_manager.get_user_or_default(user_id=user_id) - return server.agent_manager.attach_tool(agent_id=agent_id, tool_id=tool_id, user_id=actor) + return server.agent_manager.attach_tool(agent_id=agent_id, tool_id=tool_id, actor=actor) @router.patch("/{agent_id}/remove-tool/{tool_id}", response_model=AgentState, operation_id="remove_tool_from_agent") From 3b94b45cbb88aad6acea0547f23831e1232d90ba Mon Sep 17 00:00:00 2001 From: cthomas Date: Sun, 22 Dec 2024 11:30:01 -0800 Subject: [PATCH 128/280] fix: add underlying error message for Retries Exhausted error (#2308) --- letta/agent.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/letta/agent.py b/letta/agent.py index a297f5b6ce..0cbaff6884 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -282,7 +282,6 @@ def _get_ai_reply( # Force a tool call if exactly one tool is specified elif step_count is not None and step_count > 0 and len(allowed_tool_names) == 1: force_tool_call = allowed_tool_names[0] - for attempt in range(1, empty_response_retry_limit + 1): try: response = create( @@ -314,7 +313,7 @@ def _get_ai_reply( except ValueError as ve: if attempt >= empty_response_retry_limit: warnings.warn(f"Retry limit reached. Final error: {ve}") - break + raise Exception(f"Retries exhausted and no valid response received. Final error: {ve}") else: delay = min(backoff_factor * (2 ** (attempt - 1)), max_delay) warnings.warn(f"Attempt {attempt} failed: {ve}. Retrying in {delay} seconds...") From 69e376406ec8b0368eb02baa12308c8a4d142c4e Mon Sep 17 00:00:00 2001 From: cthomas Date: Sun, 22 Dec 2024 11:31:03 -0800 Subject: [PATCH 129/280] fix: deprecate function return in new test (#2309) --- tests/test_client.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_client.py b/tests/test_client.py index 1a9b26028a..ac0f4f1876 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -400,16 +400,16 @@ def always_error(): response_message = None for message in response.messages: - if isinstance(message, FunctionReturn): + if isinstance(message, ToolReturnMessage): response_message = message break - assert response_message, "FunctionReturn message not found in response" + assert response_message, "ToolReturnMessage message not found in response" assert response_message.status == "error" if isinstance(client, RESTClient): - assert response_message.function_return == "Error executing function always_error: ZeroDivisionError: division by zero" + assert response_message.tool_return == "Error executing function always_error: ZeroDivisionError: division by zero" else: - response_json = json.loads(response_message.function_return) + response_json = json.loads(response_message.tool_return) assert response_json['status'] == "Failed" assert response_json['message'] == "Error executing function always_error: ZeroDivisionError: division by zero" From ea2a7395f4023f5b9fab03e6273db3b64a1181d5 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Sun, 22 Dec 2024 11:40:16 -0800 Subject: [PATCH 130/280] feat: Make composio error catching more verbose and granular (#2303) --- letta/server/rest_api/routers/v1/tools.py | 57 +++++++++++++++++++++-- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/letta/server/rest_api/routers/v1/tools.py b/letta/server/rest_api/routers/v1/tools.py index d1287bc8b4..ffc2b2124c 100644 --- a/letta/server/rest_api/routers/v1/tools.py +++ b/letta/server/rest_api/routers/v1/tools.py @@ -1,8 +1,10 @@ from typing import List, Optional +from composio.client import ComposioClientError, HTTPError, NoItemsFound from composio.client.collections import ActionModel, AppModel from composio.client.enums.base import EnumStringNotFound -from composio.exceptions import ComposioSDKError +from composio.exceptions import ApiKeyNotProvidedError, ComposioSDKError +from composio.tools.base.abs import InvalidClassDefinition from fastapi import APIRouter, Body, Depends, Header, HTTPException from letta.errors import LettaToolCreateError @@ -239,21 +241,66 @@ def add_composio_tool( try: tool_create = ToolCreate.from_composio(action_name=composio_action_name, api_key=composio_api_key) return server.tool_manager.create_or_update_tool(pydantic_tool=Tool(**tool_create.model_dump()), actor=actor) - except EnumStringNotFound: + except EnumStringNotFound as e: raise HTTPException( status_code=400, # Bad Request detail={ "code": "EnumStringNotFound", - "message": f"Cannot find composio action with name `{composio_action_name}`.", + "message": str(e), "composio_action_name": composio_action_name, }, ) - except ComposioSDKError: + except HTTPError as e: + raise HTTPException( + status_code=400, # Bad Request + detail={ + "code": "HTTPError", + "message": str(e), + "composio_action_name": composio_action_name, + }, + ) + except NoItemsFound as e: + raise HTTPException( + status_code=400, # Bad Request + detail={ + "code": "NoItemsFound", + "message": str(e), + "composio_action_name": composio_action_name, + }, + ) + except ComposioClientError as e: + raise HTTPException( + status_code=400, # Bad Request + detail={ + "code": "ComposioClientError", + "message": str(e), + "composio_action_name": composio_action_name, + }, + ) + except ApiKeyNotProvidedError as e: + raise HTTPException( + status_code=400, # Bad Request + detail={ + "code": "ApiKeyNotProvidedError", + "message": str(e), + "composio_action_name": composio_action_name, + }, + ) + except InvalidClassDefinition as e: + raise HTTPException( + status_code=400, # Bad Request + detail={ + "code": "InvalidClassDefinition", + "message": str(e), + "composio_action_name": composio_action_name, + }, + ) + except ComposioSDKError as e: raise HTTPException( status_code=400, # Bad Request detail={ "code": "ComposioSDKError", - "message": f"No connected account found for tool `{composio_action_name}`. You need to connect the relevant app in Composio order to use the tool.", + "message": str(e), "composio_action_name": composio_action_name, }, ) From c8f5dc3d18c528a0f5502bc7aad9ec7fa3c06a8a Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Sun, 22 Dec 2024 21:04:29 -0800 Subject: [PATCH 131/280] fix: patch bug in inner thoughts unpacker (#2311) --- letta/agent.py | 6 +- letta/llm_api/helpers.py | 10 ++- letta/llm_api/llm_api_tools.py | 18 ++-- letta/services/agent_manager.py | 2 +- tests/helpers/endpoints_helper.py | 6 +- tests/integration_test_agent_tool_graph.py | 97 +++++++--------------- 6 files changed, 59 insertions(+), 80 deletions(-) diff --git a/letta/agent.py b/letta/agent.py index 0cbaff6884..1096668e37 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -237,8 +237,8 @@ def execute_tool_and_persist_state(self, function_name: str, function_args: dict ) function_response, updated_agent_state = sandbox_run_result.func_return, sandbox_run_result.agent_state assert orig_memory_str == self.agent_state.memory.compile(), "Memory should not be modified in a sandbox tool" - - self.update_memory_if_change(updated_agent_state.memory) + if updated_agent_state is not None: + self.update_memory_if_change(updated_agent_state.memory) except Exception as e: # Need to catch error here, or else trunction wont happen # TODO: modify to function execution error @@ -251,7 +251,7 @@ def execute_tool_and_persist_state(self, function_name: str, function_args: dict def _get_ai_reply( self, message_sequence: List[Message], - function_call: str = "auto", + function_call: Optional[str] = None, first_message: bool = False, stream: bool = False, # TODO move to config? empty_response_retry_limit: int = 3, diff --git a/letta/llm_api/helpers.py b/letta/llm_api/helpers.py index 1244b6ffe7..7c99bbcdbc 100644 --- a/letta/llm_api/helpers.py +++ b/letta/llm_api/helpers.py @@ -250,6 +250,8 @@ def unpack_all_inner_thoughts_from_kwargs( def unpack_inner_thoughts_from_kwargs(choice: Choice, inner_thoughts_key: str) -> Choice: message = choice.message + rewritten_choice = choice # inner thoughts unpacked out of the function + if message.role == "assistant" and message.tool_calls and len(message.tool_calls) >= 1: if len(message.tool_calls) > 1: warnings.warn(f"Unpacking inner thoughts from more than one tool call ({len(message.tool_calls)}) is not supported") @@ -271,14 +273,18 @@ def unpack_inner_thoughts_from_kwargs(choice: Choice, inner_thoughts_key: str) - warnings.warn(f"Overwriting existing inner monologue ({new_choice.message.content}) with kwarg ({inner_thoughts})") new_choice.message.content = inner_thoughts - return new_choice + # update the choice object + rewritten_choice = new_choice else: warnings.warn(f"Did not find inner thoughts in tool call: {str(tool_call)}") - return choice except json.JSONDecodeError as e: warnings.warn(f"Failed to strip inner thoughts from kwargs: {e}") raise e + else: + warnings.warn(f"Did not find tool call in message: {str(message)}") + + return rewritten_choice def is_context_overflow_error(exception: Union[requests.exceptions.RequestException, Exception]) -> bool: diff --git a/letta/llm_api/llm_api_tools.py b/letta/llm_api/llm_api_tools.py index 578779d72b..146c1209ad 100644 --- a/letta/llm_api/llm_api_tools.py +++ b/letta/llm_api/llm_api_tools.py @@ -110,7 +110,7 @@ def create( user_id: Optional[str] = None, # option UUID to associate request with functions: Optional[list] = None, functions_python: Optional[dict] = None, - function_call: str = "auto", + function_call: Optional[str] = None, # see: https://platform.openai.com/docs/api-reference/chat/create#chat-create-tool_choice # hint first_message: bool = False, force_tool_call: Optional[str] = None, # Force a specific tool to be called @@ -148,10 +148,19 @@ def create( # openai if llm_config.model_endpoint_type == "openai": + if model_settings.openai_api_key is None and llm_config.model_endpoint == "https://api.openai.com/v1": # only is a problem if we are *not* using an openai proxy raise LettaConfigurationError(message="OpenAI key is missing from letta config file", missing_fields=["openai_api_key"]) + if function_call is None and functions is not None and len(functions) > 0: + # force function calling for reliability, see https://platform.openai.com/docs/api-reference/chat/create#chat-create-tool_choice + # TODO(matt) move into LLMConfig + if llm_config.model_endpoint == "https://inference.memgpt.ai": + function_call = "auto" # TODO change to "required" once proxy supports it + else: + function_call = "required" + data = build_openai_chat_completions_request(llm_config, messages, user_id, functions, function_call, use_tool_naming, max_tokens) if stream: # Client requested token streaming data.stream = True @@ -255,12 +264,7 @@ def create( tool_call = None if force_tool_call is not None: - tool_call = { - "type": "function", - "function": { - "name": force_tool_call - } - } + tool_call = {"type": "function", "function": {"name": force_tool_call}} assert functions is not None return anthropic_chat_completions_request( diff --git a/letta/services/agent_manager.py b/letta/services/agent_manager.py index 4e6b80ec5b..8f23e42a93 100644 --- a/letta/services/agent_manager.py +++ b/letta/services/agent_manager.py @@ -336,7 +336,7 @@ def rebuild_system_prompt(self, agent_id: str, actor: PydanticUser, force=False, curr_memory_str = agent_state.memory.compile() if curr_memory_str in curr_system_message_openai["content"] and not force: # NOTE: could this cause issues if a block is removed? (substring match would still work) - logger.info( + logger.debug( f"Memory hasn't changed for agent id={agent_id} and actor=({actor.id}, {actor.name}), skipping system prompt rebuild" ) return agent_state diff --git a/tests/helpers/endpoints_helper.py b/tests/helpers/endpoints_helper.py index 87997aaf7a..eb55aaedac 100644 --- a/tests/helpers/endpoints_helper.py +++ b/tests/helpers/endpoints_helper.py @@ -127,7 +127,11 @@ def check_first_response_is_valid_for_llm_endpoint(filename: str) -> ChatComplet choice = response.choices[0] # Ensure that the first message returns a "send_message" - validator_func = lambda function_call: function_call.name == "send_message" or function_call.name == "archival_memory_search" + validator_func = ( + lambda function_call: function_call.name == "send_message" + or function_call.name == "archival_memory_search" + or function_call.name == "core_memory_append" + ) assert_contains_valid_function_call(choice.message, validator_func) # Assert that the message has an inner monologue diff --git a/tests/integration_test_agent_tool_graph.py b/tests/integration_test_agent_tool_graph.py index 44aad0d077..bec040771b 100644 --- a/tests/integration_test_agent_tool_graph.py +++ b/tests/integration_test_agent_tool_graph.py @@ -2,6 +2,7 @@ import uuid import pytest + from letta import create_client from letta.schemas.letta_message import ToolCallMessage from letta.schemas.tool_rule import ( @@ -42,7 +43,7 @@ def second_secret_word(prev_secret_word: str): prev_secret_word (str): The secret word retrieved from calling first_secret_word. """ if prev_secret_word != "v0iq020i0g": - raise RuntimeError(f"Expected secret {"v0iq020i0g"}, got {prev_secret_word}") + raise RuntimeError(f"Expected secret {'v0iq020i0g'}, got {prev_secret_word}") return "4rwp2b4gxq" @@ -55,7 +56,7 @@ def third_secret_word(prev_secret_word: str): prev_secret_word (str): The secret word retrieved from calling second_secret_word. """ if prev_secret_word != "4rwp2b4gxq": - raise RuntimeError(f"Expected secret {"4rwp2b4gxq"}, got {prev_secret_word}") + raise RuntimeError(f'Expected secret "4rwp2b4gxq", got {prev_secret_word}') return "hj2hwibbqm" @@ -68,7 +69,7 @@ def fourth_secret_word(prev_secret_word: str): prev_secret_word (str): The secret word retrieved from calling third_secret_word. """ if prev_secret_word != "hj2hwibbqm": - raise RuntimeError(f"Expected secret {"hj2hwibbqm"}, got {prev_secret_word}") + raise RuntimeError(f"Expected secret {'hj2hwibbqm'}, got {prev_secret_word}") return "banana" @@ -194,16 +195,13 @@ def test_check_tool_rules_with_different_models(mock_e2b_api_key_none): "tests/configs/llm_model_configs/openai-gpt-3.5-turbo.json", "tests/configs/llm_model_configs/openai-gpt-4o.json", ] - + # Create two test tools t1_name = "first_secret_word" t2_name = "second_secret_word" t1 = client.create_or_update_tool(first_secret_word, name=t1_name) t2 = client.create_or_update_tool(second_secret_word, name=t2_name) - tool_rules = [ - InitToolRule(tool_name=t1_name), - InitToolRule(tool_name=t2_name) - ] + tool_rules = [InitToolRule(tool_name=t1_name), InitToolRule(tool_name=t2_name)] tools = [t1, t2] for config_file in config_files: @@ -212,34 +210,26 @@ def test_check_tool_rules_with_different_models(mock_e2b_api_key_none): if "gpt-4o" in config_file: # Structured output model (should work with multiple init tools) - agent_state = setup_agent(client, config_file, agent_uuid=agent_uuid, - tool_ids=[t.id for t in tools], - tool_rules=tool_rules) + agent_state = setup_agent(client, config_file, agent_uuid=agent_uuid, tool_ids=[t.id for t in tools], tool_rules=tool_rules) assert agent_state is not None else: # Non-structured output model (should raise error with multiple init tools) with pytest.raises(ValueError, match="Multiple initial tools are not supported for non-structured models"): - setup_agent(client, config_file, agent_uuid=agent_uuid, - tool_ids=[t.id for t in tools], - tool_rules=tool_rules) - + setup_agent(client, config_file, agent_uuid=agent_uuid, tool_ids=[t.id for t in tools], tool_rules=tool_rules) + # Cleanup cleanup(client=client, agent_uuid=agent_uuid) # Create tool rule with single initial tool t3_name = "third_secret_word" t3 = client.create_or_update_tool(third_secret_word, name=t3_name) - tool_rules = [ - InitToolRule(tool_name=t3_name) - ] + tool_rules = [InitToolRule(tool_name=t3_name)] tools = [t3] for config_file in config_files: agent_uuid = str(uuid.uuid4()) # Structured output model (should work with single init tool) - agent_state = setup_agent(client, config_file, agent_uuid=agent_uuid, - tool_ids=[t.id for t in tools], - tool_rules=tool_rules) + agent_state = setup_agent(client, config_file, agent_uuid=agent_uuid, tool_ids=[t.id for t in tools], tool_rules=tool_rules) assert agent_state is not None cleanup(client=client, agent_uuid=agent_uuid) @@ -257,7 +247,7 @@ def test_claude_initial_tool_rule_enforced(mock_e2b_api_key_none): tool_rules = [ InitToolRule(tool_name=t1_name), ChildToolRule(tool_name=t1_name, children=[t2_name]), - TerminalToolRule(tool_name=t2_name) + TerminalToolRule(tool_name=t2_name), ] tools = [t1, t2] @@ -265,7 +255,9 @@ def test_claude_initial_tool_rule_enforced(mock_e2b_api_key_none): anthropic_config_file = "tests/configs/llm_model_configs/claude-3-sonnet-20240229.json" for i in range(3): agent_uuid = str(uuid.uuid4()) - agent_state = setup_agent(client, anthropic_config_file, agent_uuid=agent_uuid, tool_ids=[t.id for t in tools], tool_rules=tool_rules) + agent_state = setup_agent( + client, anthropic_config_file, agent_uuid=agent_uuid, tool_ids=[t.id for t in tools], tool_rules=tool_rules + ) response = client.user_message(agent_id=agent_state.id, message="What is the second secret word?") assert_sanity_checks(response) @@ -289,9 +281,10 @@ def test_claude_initial_tool_rule_enforced(mock_e2b_api_key_none): # Implement exponential backoff with initial time of 10 seconds if i < 2: - backoff_time = 10 * (2 ** i) + backoff_time = 10 * (2**i) time.sleep(backoff_time) + @pytest.mark.timeout(60) # Sets a 60-second timeout for the test since this could loop infinitely def test_agent_no_structured_output_with_one_child_tool(mock_e2b_api_key_none): client = create_client() @@ -389,7 +382,7 @@ def test_agent_conditional_tool_easy(mock_e2b_api_key_none): default_child=coin_flip_name, child_output_mapping={ "hj2hwibbqm": secret_word_tool, - } + }, ), TerminalToolRule(tool_name=secret_word_tool), ] @@ -425,7 +418,6 @@ def test_agent_conditional_tool_easy(mock_e2b_api_key_none): cleanup(client=client, agent_uuid=agent_uuid) - @pytest.mark.timeout(90) # Longer timeout since this test has more steps def test_agent_conditional_tool_hard(mock_e2b_api_key_none): """ @@ -450,7 +442,7 @@ def test_agent_conditional_tool_hard(mock_e2b_api_key_none): final_tool = "fourth_secret_word" play_game_tool = client.create_or_update_tool(can_play_game, name=play_game) flip_coin_tool = client.create_or_update_tool(flip_coin_hard, name=coin_flip_name) - reveal_secret = client.create_or_update_tool(fourth_secret_word, name=final_tool) + reveal_secret = client.create_or_update_tool(fourth_secret_word, name=final_tool) # Make tool rules - chain them together with conditional rules tool_rules = [ @@ -458,16 +450,10 @@ def test_agent_conditional_tool_hard(mock_e2b_api_key_none): ConditionalToolRule( tool_name=play_game, default_child=play_game, # Keep trying if we can't play - child_output_mapping={ - True: coin_flip_name # Only allow access when can_play_game returns True - } + child_output_mapping={True: coin_flip_name}, # Only allow access when can_play_game returns True ), ConditionalToolRule( - tool_name=coin_flip_name, - default_child=coin_flip_name, - child_output_mapping={ - "hj2hwibbqm": final_tool, "START_OVER": play_game - } + tool_name=coin_flip_name, default_child=coin_flip_name, child_output_mapping={"hj2hwibbqm": final_tool, "START_OVER": play_game} ), TerminalToolRule(tool_name=final_tool), ] @@ -475,13 +461,7 @@ def test_agent_conditional_tool_hard(mock_e2b_api_key_none): # Setup agent with all tools tools = [play_game_tool, flip_coin_tool, reveal_secret] config_file = "tests/configs/llm_model_configs/claude-3-sonnet-20240229.json" - agent_state = setup_agent( - client, - config_file, - agent_uuid=agent_uuid, - tool_ids=[t.id for t in tools], - tool_rules=tool_rules - ) + agent_state = setup_agent(client, config_file, agent_uuid=agent_uuid, tool_ids=[t.id for t in tools], tool_rules=tool_rules) # Ask agent to try to get all secret words response = client.user_message(agent_id=agent_state.id, message="hi") @@ -520,7 +500,7 @@ def test_agent_conditional_tool_without_default_child(mock_e2b_api_key_none): Test the agent with a conditional tool that allows any child tool to be called if a function returns None. Tool Flow: - + return_none | v @@ -541,27 +521,16 @@ def test_agent_conditional_tool_without_default_child(mock_e2b_api_key_none): ConditionalToolRule( tool_name=tool_name, default_child=None, # Allow any tool to be called if output doesn't match - child_output_mapping={ - "anything but none": "first_secret_word" - } - ) + child_output_mapping={"anything but none": "first_secret_word"}, + ), ] tools = [tool, secret_word] # Setup agent with all tools - agent_state = setup_agent( - client, - config_file, - agent_uuid=agent_uuid, - tool_ids=[t.id for t in tools], - tool_rules=tool_rules - ) + agent_state = setup_agent(client, config_file, agent_uuid=agent_uuid, tool_ids=[t.id for t in tools], tool_rules=tool_rules) # Ask agent to try different tools based on the game output - response = client.user_message( - agent_id=agent_state.id, - message="call a function, any function. then call send_message" - ) + response = client.user_message(agent_id=agent_state.id, message="call a function, any function. then call send_message") # Make checks assert_sanity_checks(response) @@ -613,18 +582,14 @@ def test_agent_reload_remembers_function_response(mock_e2b_api_key_none): ConditionalToolRule( tool_name=flip_coin_name, default_child=flip_coin_name, # Allow any tool to be called if output doesn't match - child_output_mapping={ - "hj2hwibbqm": secret_word - } + child_output_mapping={"hj2hwibbqm": secret_word}, ), - TerminalToolRule(tool_name=secret_word) + TerminalToolRule(tool_name=secret_word), ] tools = [flip_coin_tool, secret_word_tool] # Setup initial agent - agent_state = setup_agent( - client, config_file, agent_uuid=agent_uuid, tool_ids=[t.id for t in tools], tool_rules=tool_rules - ) + agent_state = setup_agent(client, config_file, agent_uuid=agent_uuid, tool_ids=[t.id for t in tools], tool_rules=tool_rules) # Call flip_coin first response = client.user_message(agent_id=agent_state.id, message="flip a coin") @@ -643,4 +608,4 @@ def test_agent_reload_remembers_function_response(mock_e2b_api_key_none): assert reloaded_agent.last_function_response is not None print(f"Got successful response from client: \n\n{response}") - cleanup(client=client, agent_uuid=agent_uuid) \ No newline at end of file + cleanup(client=client, agent_uuid=agent_uuid) From e09fd52b4a312b433ef345922b797ea161bbd85f Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Mon, 23 Dec 2024 02:27:01 -0800 Subject: [PATCH 132/280] fix: record the external memory summary inside of the context viewer (#2306) --- letta/agent.py | 1 + letta/schemas/memory.py | 3 +++ tests/test_server.py | 1 + 3 files changed, 5 insertions(+) diff --git a/letta/agent.py b/letta/agent.py index 1096668e37..2b7441e345 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -1042,6 +1042,7 @@ def get_context_window(self) -> ContextWindowOverview: num_archival_memory=agent_manager_passage_size, num_recall_memory=message_manager_size, num_tokens_external_memory_summary=num_tokens_external_memory_summary, + external_memory_summary=external_memory_summary, # top-level information context_window_size_max=self.agent_state.llm_config.context_window, context_window_size_current=num_tokens_used_total, diff --git a/letta/schemas/memory.py b/letta/schemas/memory.py index 797eac576e..ab877949a3 100644 --- a/letta/schemas/memory.py +++ b/letta/schemas/memory.py @@ -30,6 +30,9 @@ class ContextWindowOverview(BaseModel): num_tokens_external_memory_summary: int = Field( ..., description="The number of tokens in the external memory summary (archival + recall metadata)." ) + external_memory_summary: str = Field( + ..., description="The metadata summary of the external memory sources (archival + recall metadata)." + ) # context window breakdown (in tokens) # this should all add up to context_window_size_current diff --git a/tests/test_server.py b/tests/test_server.py index 4775ed91f5..c2b77ea883 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -515,6 +515,7 @@ def test_get_context_window_overview(server: SyncServer, user, agent_id): assert overview.num_archival_memory is not None assert overview.num_recall_memory is not None assert overview.num_tokens_external_memory_summary is not None + assert overview.external_memory_summary is not None assert overview.num_tokens_system is not None assert overview.system_prompt is not None assert overview.num_tokens_core_memory is not None From 2ee4f842dc73bea12dbaa2b126ef7a5c9fd7e995 Mon Sep 17 00:00:00 2001 From: dboyliao Date: Mon, 23 Dec 2024 18:29:02 +0800 Subject: [PATCH 133/280] fix: fix attribute error in `_repr_html_` method for `LettaResponse` (#2313) --- letta/schemas/letta_response.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/letta/schemas/letta_response.py b/letta/schemas/letta_response.py index c6a1e8be58..5c60027249 100644 --- a/letta/schemas/letta_response.py +++ b/letta/schemas/letta_response.py @@ -47,7 +47,7 @@ def get_formatted_content(msg): return f'
    {html.escape(msg.function_call.name)}({args})
    ' elif msg.message_type == "tool_call_message": args = format_json(msg.tool_call.arguments) - return f'
    {html.escape(msg.function_call.name)}({args})
    ' + return f'
    {html.escape(msg.tool_call.name)}({args})
    ' elif msg.message_type == "function_return": return_value = format_json(msg.function_return) # return f'
    Status: {html.escape(msg.status)}
    {return_value}
    ' From 4d91c6fd763d5bd85b330e2ba0127486eaa2648b Mon Sep 17 00:00:00 2001 From: Shubham Naik Date: Mon, 23 Dec 2024 10:04:58 -0800 Subject: [PATCH 134/280] chore: docs update --- .../workflows/letta-web-openapi-saftey.yml | 42 ------------------- 1 file changed, 42 deletions(-) delete mode 100644 .github/workflows/letta-web-openapi-saftey.yml diff --git a/.github/workflows/letta-web-openapi-saftey.yml b/.github/workflows/letta-web-openapi-saftey.yml deleted file mode 100644 index 786d5e9b11..0000000000 --- a/.github/workflows/letta-web-openapi-saftey.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: "Letta Web OpenAPI Compatibility Checker" - - -on: - push: - branches: [ main ] - pull_request: - branches: [ main ] - - -jobs: - validate-openapi: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: "Setup Python, Poetry and Dependencies" - uses: packetcoders/action-setup-cache-python-poetry@main - with: - python-version: "3.12" - poetry-version: "1.8.2" - install-args: "-E dev" - - name: Checkout letta web - uses: actions/checkout@v4 - with: - repository: letta-ai/letta-web - token: ${{ secrets.PULLER_TOKEN }} - path: letta-web - - name: Run OpenAPI schema generation - run: | - bash ./letta/server/generate_openapi_schema.sh - - name: Setup letta-web - working-directory: letta-web - run: npm ci - - name: Copy OpenAPI schema - working-directory: . - run: cp openapi_letta.json letta-web/libs/letta-agents-api/letta-agents-openapi.json - - name: Validate OpenAPI schema - working-directory: letta-web - run: | - npm run agents-api:generate - npm run type-check From b4be44bc2eef23dc214d5cec4f7f3c37a2df4f87 Mon Sep 17 00:00:00 2001 From: Shubham Naik Date: Mon, 23 Dec 2024 11:57:23 -0800 Subject: [PATCH 135/280] add: helpful commands to justfile --- project.json | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 project.json diff --git a/project.json b/project.json new file mode 100644 index 0000000000..9fbcd3a965 --- /dev/null +++ b/project.json @@ -0,0 +1,75 @@ +{ + "name": "core", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "application", + "sourceRoot": "apps/core", + "targets": { + "lock": { + "executor": "@nxlv/python:run-commands", + "options": { + "command": "poetry lock --no-update", + "cwd": "apps/core" + } + }, + "add": { + "executor": "@nxlv/python:add", + "options": {} + }, + "update": { + "executor": "@nxlv/python:update", + "options": {} + }, + "remove": { + "executor": "@nxlv/python:remove", + "options": {} + }, + "dev": { + "executor": "@nxlv/python:run-commands", + "options": { + "command": "poetry run letta server", + "cwd": "apps/core" + } + }, + "build": { + "executor": "@nxlv/python:build", + "outputs": ["{projectRoot}/dist"], + "options": { + "outputPath": "apps/core/dist", + "publish": false, + "lockedVersions": true, + "bundleLocalDependencies": true + } + }, + "install": { + "executor": "@nxlv/python:run-commands", + "options": { + "command": "poetry install --all-extras", + "cwd": "apps/core" + } + }, + "database:migrate": { + "executor": "@nxlv/python:run-commands", + "options": { + "command": "poetry run alembic upgrade head", + "cwd": "apps/core" + } + }, + "test": { + "executor": "@nxlv/python:run-commands", + "outputs": [ + "{workspaceRoot}/reports/apps/core/unittests", + "{workspaceRoot}/coverage/apps/core" + ], + "options": { + "command": "poetry run pytest tests/", + "cwd": "apps/core" + } + } + }, + "tags": [], + "release": { + "version": { + "generator": "@nxlv/python:release-version" + } + } +} From aef012b87a1808fec9c1c2c2c885d652f128bd44 Mon Sep 17 00:00:00 2001 From: Matt Zhou Date: Mon, 23 Dec 2024 14:19:30 -0800 Subject: [PATCH 136/280] Try force rebuilding system prompt on block update --- letta/server/rest_api/routers/v1/agents.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index 405ab1cf17..9a3ffef6b4 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -343,7 +343,12 @@ def update_agent_memory_block( actor = server.user_manager.get_user_or_default(user_id=user_id) block = server.agent_manager.get_block_with_label(agent_id=agent_id, block_label=block_label, actor=actor) - return server.block_manager.update_block(block.id, block_update=block_update, actor=actor) + block = server.block_manager.update_block(block.id, block_update=block_update, actor=actor) + + # This should also trigger a system prompt change in the agent + server.agent_manager.rebuild_system_prompt(agent_id=agent_id, actor=actor, force=True, update_timestamp=False) + + return block @router.get("/{agent_id}/memory/recall", response_model=RecallMemorySummary, operation_id="get_agent_recall_memory_summary") From 9ab394e78d5e3482c60adc80d8aff75a53927d90 Mon Sep 17 00:00:00 2001 From: Matt Zhou Date: Mon, 23 Dec 2024 14:20:08 -0800 Subject: [PATCH 137/280] Run lint --- letta/server/rest_api/routers/v1/agents.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index 9a3ffef6b4..640a17d354 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -762,3 +762,6 @@ async def send_message_to_agent( traceback.print_exc() raise HTTPException(status_code=500, detail=f"{e}") + + + From 87772d11e198923b993a4c5bc2982b0a4fd27c0f Mon Sep 17 00:00:00 2001 From: Shubham Naik Date: Mon, 23 Dec 2024 14:42:53 -0800 Subject: [PATCH 138/280] chore: next --- project.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/project.json b/project.json index 9fbcd3a965..18b70617bf 100644 --- a/project.json +++ b/project.json @@ -47,6 +47,13 @@ "cwd": "apps/core" } }, + "lint": { + "executor": "@nxlv/python:run-commands", + "options": { + "command": "poetry run isort --profile black . && poetry run black . && poetry run autoflake --remove-all-unused-imports --remove-unused-variables --in-place --recursive --ignore-init-module-imports .", + "cwd": "apps/core" + } + }, "database:migrate": { "executor": "@nxlv/python:run-commands", "options": { From c79eeacd2061b6deab11bee9426d027c9ad473a8 Mon Sep 17 00:00:00 2001 From: Shubham Naik Date: Mon, 23 Dec 2024 14:44:08 -0800 Subject: [PATCH 139/280] fix: add tests to cypress --- alembic/env.py | 3 +- .../08b2f8225812_adding_toolsagents_orm.py | 42 ++--- ...1ee_make_an_blocks_agents_mapping_table.py | 1 - .../3c683a662c82_migrate_jobs_to_the_orm.py | 3 +- ...88e702f85e_drop_api_tokens_table_in_oss.py | 1 - ...54dec07619c4_divide_passage_table_into_.py | 152 +++++++++--------- .../5987401b40ae_refactor_agent_memory.py | 3 +- ...5badb46fdf9_migrate_messages_to_the_orm.py | 3 +- ...505cc7eca9_create_a_baseline_migrations.py | 5 +- ...f_add_column_to_tools_table_to_contain_.py | 1 - .../b6d7ca024aa9_add_agents_tags_table.py | 1 - ..._add_passages_orm_drop_legacy_passages_.py | 77 ++++----- .../c85a3d07c028_move_files_to_orm.py | 1 - .../cda66b6cb0d6_move_sources_to_orm.py | 3 +- .../d05669b60ebe_migrate_agents_to_orm.py | 3 +- ...c_move_organizations_users_tools_to_orm.py | 5 +- ...dbf_tweak_created_at_field_for_messages.py | 3 +- ...7507eab4bb9_migrate_blocks_to_orm_model.py | 1 - ..._create_sandbox_config_and_sandbox_env_.py | 1 - examples/swarm/simple.py | 3 +- examples/swarm/swarm.py | 1 - examples/tool_rule_usage.py | 4 +- letta/benchmark/benchmark.py | 1 - letta/cli/cli.py | 3 +- letta/cli/cli_config.py | 3 +- letta/cli/cli_load.py | 1 - letta/client/client.py | 3 +- letta/client/streaming.py | 3 +- letta/client/utils.py | 3 +- letta/data_sources/connectors.py | 2 +- letta/embeddings.py | 1 - letta/errors.py | 2 - letta/functions/function_sets/extras.py | 1 - letta/helpers/tool_rule_solver.py | 12 +- letta/interface.py | 1 - letta/llm_api/anthropic.py | 12 +- letta/llm_api/azure_openai.py | 1 - letta/llm_api/cohere.py | 1 - letta/llm_api/google_ai.py | 1 - letta/llm_api/helpers.py | 1 - letta/llm_api/llm_api_tools.py | 8 +- letta/llm_api/mistral.py | 1 - letta/llm_api/openai.py | 1 - letta/local_llm/chat_completion_proxy.py | 1 - .../grammars/gbnf_grammar_generator.py | 3 +- .../configurable_wrapper.py | 1 - letta/local_llm/utils.py | 5 +- letta/main.py | 9 +- letta/orm/__init__.py | 2 +- letta/orm/agent.py | 5 +- letta/orm/agents_tags.py | 3 +- letta/orm/block.py | 5 +- letta/orm/blocks_agents.py | 3 +- letta/orm/custom_columns.py | 12 +- letta/orm/file.py | 14 +- letta/orm/job.py | 5 +- letta/orm/message.py | 5 +- letta/orm/mixins.py | 5 +- letta/orm/organization.py | 15 +- letta/orm/passage.py | 5 +- letta/orm/sandbox_config.py | 9 +- letta/orm/source.py | 5 +- letta/orm/sources_agents.py | 3 +- letta/orm/sqlalchemy_base.py | 7 +- letta/orm/sqlite_functions.py | 58 +++---- letta/orm/tool.py | 5 +- letta/orm/tools_agents.py | 3 +- letta/orm/user.py | 3 +- letta/providers.py | 49 +++--- letta/schemas/agent.py | 3 +- letta/schemas/block.py | 5 +- letta/schemas/file.py | 3 +- letta/schemas/job.py | 3 +- letta/schemas/letta_request.py | 3 +- letta/schemas/letta_response.py | 3 +- letta/schemas/message.py | 11 +- letta/schemas/organization.py | 3 +- letta/schemas/passage.py | 3 +- letta/schemas/sandbox_config.py | 3 +- letta/schemas/source.py | 3 +- letta/schemas/tool.py | 3 +- letta/schemas/tool_rule.py | 4 +- letta/schemas/usage.py | 2 + letta/schemas/user.py | 3 +- letta/server/rest_api/app.py | 5 +- letta/server/rest_api/auth/index.py | 3 +- letta/server/rest_api/auth_token.py | 1 - letta/server/rest_api/interface.py | 8 +- .../routers/openai/assistants/assistants.py | 1 - .../routers/openai/assistants/schemas.py | 3 +- .../chat_completions/chat_completions.py | 3 +- letta/server/rest_api/routers/v1/agents.py | 3 +- letta/server/rest_api/routers/v1/blocks.py | 1 - letta/server/rest_api/routers/v1/health.py | 1 - letta/server/rest_api/routers/v1/jobs.py | 1 - letta/server/rest_api/routers/v1/llms.py | 1 - .../rest_api/routers/v1/organizations.py | 1 - .../rest_api/routers/v1/sandbox_configs.py | 1 - letta/server/rest_api/routers/v1/sources.py | 1 - letta/server/rest_api/routers/v1/tools.py | 1 - letta/server/rest_api/routers/v1/users.py | 1 - letta/server/rest_api/utils.py | 4 +- letta/server/server.py | 16 +- letta/server/ws_api/example_client.py | 3 +- letta/server/ws_api/server.py | 3 +- letta/services/agent_manager.py | 3 +- letta/services/passage_manager.py | 8 +- letta/settings.py | 3 +- letta/streaming_interface.py | 10 +- letta/utils.py | 6 +- locust_test.py | 3 +- paper_experiments/doc_qa_task/doc_qa.py | 5 +- .../doc_qa_task/llm_judge_doc_qa.py | 3 +- .../doc_qa_task/load_wikipedia_embeddings.py | 3 +- paper_experiments/nested_kv_task/nested_kv.py | 3 +- scripts/migrate_tools.py | 3 +- tests/integration_test_agent_tool_graph.py | 90 ++++------- .../integration_test_offline_memory_agent.py | 1 - tests/integration_test_summarizer.py | 1 - ...integration_test_tool_execution_sandbox.py | 3 +- tests/test_base_functions.py | 3 +- tests/test_cli.py | 1 - tests/test_client.py | 13 +- tests/test_client_legacy.py | 3 +- tests/test_local_client.py | 1 - tests/test_managers.py | 5 +- tests/test_server.py | 3 +- tests/test_stream_buffer_readers.py | 1 - tests/test_tool_rule_solver.py | 23 ++- tests/test_tool_schema_parsing.py | 1 - tests/test_utils.py | 1 - tests/test_v1_routes.py | 1 - tests/test_vector_embeddings.py | 1 - tests/utils.py | 1 - 134 files changed, 387 insertions(+), 552 deletions(-) diff --git a/alembic/env.py b/alembic/env.py index 767b7bbdbf..e7dfe71c61 100644 --- a/alembic/env.py +++ b/alembic/env.py @@ -1,12 +1,11 @@ import os from logging.config import fileConfig -from sqlalchemy import engine_from_config, pool - from alembic import context from letta.config import LettaConfig from letta.orm import Base from letta.settings import settings +from sqlalchemy import engine_from_config, pool letta_config = LettaConfig.load() diff --git a/alembic/versions/08b2f8225812_adding_toolsagents_orm.py b/alembic/versions/08b2f8225812_adding_toolsagents_orm.py index 902225ab19..d0e2cac868 100644 --- a/alembic/versions/08b2f8225812_adding_toolsagents_orm.py +++ b/alembic/versions/08b2f8225812_adding_toolsagents_orm.py @@ -5,40 +5,44 @@ Create Date: 2024-12-05 16:46:51.258831 """ + from typing import Sequence, Union -from alembic import op import sqlalchemy as sa - +from alembic import op # revision identifiers, used by Alembic. -revision: str = '08b2f8225812' -down_revision: Union[str, None] = '3c683a662c82' +revision: str = "08b2f8225812" +down_revision: Union[str, None] = "3c683a662c82" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - op.create_table('tools_agents', - sa.Column('agent_id', sa.String(), nullable=False), - sa.Column('tool_id', sa.String(), nullable=False), - sa.Column('tool_name', sa.String(), nullable=False), - sa.Column('id', sa.String(), nullable=False), - sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), - sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), - sa.Column('is_deleted', sa.Boolean(), server_default=sa.text('FALSE'), nullable=False), - sa.Column('_created_by_id', sa.String(), nullable=True), - sa.Column('_last_updated_by_id', sa.String(), nullable=True), - sa.ForeignKeyConstraint(['agent_id'], ['agents.id'], ), - sa.ForeignKeyConstraint(['tool_id'], ['tools.id'], name='fk_tool_id'), - sa.PrimaryKeyConstraint('agent_id', 'tool_id', 'tool_name', 'id'), - sa.UniqueConstraint('agent_id', 'tool_name', name='unique_tool_per_agent') + op.create_table( + "tools_agents", + sa.Column("agent_id", sa.String(), nullable=False), + sa.Column("tool_id", sa.String(), nullable=False), + sa.Column("tool_name", sa.String(), nullable=False), + sa.Column("id", sa.String(), nullable=False), + sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=True), + sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=True), + sa.Column("is_deleted", sa.Boolean(), server_default=sa.text("FALSE"), nullable=False), + sa.Column("_created_by_id", sa.String(), nullable=True), + sa.Column("_last_updated_by_id", sa.String(), nullable=True), + sa.ForeignKeyConstraint( + ["agent_id"], + ["agents.id"], + ), + sa.ForeignKeyConstraint(["tool_id"], ["tools.id"], name="fk_tool_id"), + sa.PrimaryKeyConstraint("agent_id", "tool_id", "tool_name", "id"), + sa.UniqueConstraint("agent_id", "tool_name", name="unique_tool_per_agent"), ) # ### end Alembic commands ### def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - op.drop_table('tools_agents') + op.drop_table("tools_agents") # ### end Alembic commands ### diff --git a/alembic/versions/1c8880d671ee_make_an_blocks_agents_mapping_table.py b/alembic/versions/1c8880d671ee_make_an_blocks_agents_mapping_table.py index ffcb0b6715..6890e0ed7e 100644 --- a/alembic/versions/1c8880d671ee_make_an_blocks_agents_mapping_table.py +++ b/alembic/versions/1c8880d671ee_make_an_blocks_agents_mapping_table.py @@ -9,7 +9,6 @@ from typing import Sequence, Union import sqlalchemy as sa - from alembic import op # revision identifiers, used by Alembic. diff --git a/alembic/versions/3c683a662c82_migrate_jobs_to_the_orm.py b/alembic/versions/3c683a662c82_migrate_jobs_to_the_orm.py index 4f9b746d5c..62b97e9d7b 100644 --- a/alembic/versions/3c683a662c82_migrate_jobs_to_the_orm.py +++ b/alembic/versions/3c683a662c82_migrate_jobs_to_the_orm.py @@ -9,9 +9,8 @@ from typing import Sequence, Union import sqlalchemy as sa -from sqlalchemy.dialects import postgresql - from alembic import op +from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. revision: str = "3c683a662c82" diff --git a/alembic/versions/4e88e702f85e_drop_api_tokens_table_in_oss.py b/alembic/versions/4e88e702f85e_drop_api_tokens_table_in_oss.py index 75a90445a0..b692e8556d 100644 --- a/alembic/versions/4e88e702f85e_drop_api_tokens_table_in_oss.py +++ b/alembic/versions/4e88e702f85e_drop_api_tokens_table_in_oss.py @@ -9,7 +9,6 @@ from typing import Sequence, Union import sqlalchemy as sa - from alembic import op # revision identifiers, used by Alembic. diff --git a/alembic/versions/54dec07619c4_divide_passage_table_into_.py b/alembic/versions/54dec07619c4_divide_passage_table_into_.py index afe9d41850..ead70ec649 100644 --- a/alembic/versions/54dec07619c4_divide_passage_table_into_.py +++ b/alembic/versions/54dec07619c4_divide_passage_table_into_.py @@ -5,18 +5,18 @@ Create Date: 2024-12-14 17:23:08.772554 """ + from typing import Sequence, Union +import sqlalchemy as sa from alembic import op +from letta.orm.custom_columns import EmbeddingConfigColumn from pgvector.sqlalchemy import Vector -import sqlalchemy as sa from sqlalchemy.dialects import postgresql -from letta.orm.custom_columns import EmbeddingConfigColumn - # revision identifiers, used by Alembic. -revision: str = '54dec07619c4' -down_revision: Union[str, None] = '4e88e702f85e' +revision: str = "54dec07619c4" +down_revision: Union[str, None] = "4e88e702f85e" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None @@ -24,82 +24,88 @@ def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### op.create_table( - 'agent_passages', - sa.Column('id', sa.String(), nullable=False), - sa.Column('text', sa.String(), nullable=False), - sa.Column('embedding_config', EmbeddingConfigColumn(), nullable=False), - sa.Column('metadata_', sa.JSON(), nullable=False), - sa.Column('embedding', Vector(dim=4096), nullable=True), - sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), - sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), - sa.Column('is_deleted', sa.Boolean(), server_default=sa.text('FALSE'), nullable=False), - sa.Column('_created_by_id', sa.String(), nullable=True), - sa.Column('_last_updated_by_id', sa.String(), nullable=True), - sa.Column('organization_id', sa.String(), nullable=False), - sa.Column('agent_id', sa.String(), nullable=False), - sa.ForeignKeyConstraint(['agent_id'], ['agents.id'], ondelete='CASCADE'), - sa.ForeignKeyConstraint(['organization_id'], ['organizations.id'], ), - sa.PrimaryKeyConstraint('id') + "agent_passages", + sa.Column("id", sa.String(), nullable=False), + sa.Column("text", sa.String(), nullable=False), + sa.Column("embedding_config", EmbeddingConfigColumn(), nullable=False), + sa.Column("metadata_", sa.JSON(), nullable=False), + sa.Column("embedding", Vector(dim=4096), nullable=True), + sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=True), + sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=True), + sa.Column("is_deleted", sa.Boolean(), server_default=sa.text("FALSE"), nullable=False), + sa.Column("_created_by_id", sa.String(), nullable=True), + sa.Column("_last_updated_by_id", sa.String(), nullable=True), + sa.Column("organization_id", sa.String(), nullable=False), + sa.Column("agent_id", sa.String(), nullable=False), + sa.ForeignKeyConstraint(["agent_id"], ["agents.id"], ondelete="CASCADE"), + sa.ForeignKeyConstraint( + ["organization_id"], + ["organizations.id"], + ), + sa.PrimaryKeyConstraint("id"), ) - op.create_index('agent_passages_org_idx', 'agent_passages', ['organization_id'], unique=False) + op.create_index("agent_passages_org_idx", "agent_passages", ["organization_id"], unique=False) op.create_table( - 'source_passages', - sa.Column('id', sa.String(), nullable=False), - sa.Column('text', sa.String(), nullable=False), - sa.Column('embedding_config', EmbeddingConfigColumn(), nullable=False), - sa.Column('metadata_', sa.JSON(), nullable=False), - sa.Column('embedding', Vector(dim=4096), nullable=True), - sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), - sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), - sa.Column('is_deleted', sa.Boolean(), server_default=sa.text('FALSE'), nullable=False), - sa.Column('_created_by_id', sa.String(), nullable=True), - sa.Column('_last_updated_by_id', sa.String(), nullable=True), - sa.Column('organization_id', sa.String(), nullable=False), - sa.Column('file_id', sa.String(), nullable=True), - sa.Column('source_id', sa.String(), nullable=False), - sa.ForeignKeyConstraint(['file_id'], ['files.id'], ondelete='CASCADE'), - sa.ForeignKeyConstraint(['organization_id'], ['organizations.id'], ), - sa.ForeignKeyConstraint(['source_id'], ['sources.id'], ondelete='CASCADE'), - sa.PrimaryKeyConstraint('id') + "source_passages", + sa.Column("id", sa.String(), nullable=False), + sa.Column("text", sa.String(), nullable=False), + sa.Column("embedding_config", EmbeddingConfigColumn(), nullable=False), + sa.Column("metadata_", sa.JSON(), nullable=False), + sa.Column("embedding", Vector(dim=4096), nullable=True), + sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=True), + sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=True), + sa.Column("is_deleted", sa.Boolean(), server_default=sa.text("FALSE"), nullable=False), + sa.Column("_created_by_id", sa.String(), nullable=True), + sa.Column("_last_updated_by_id", sa.String(), nullable=True), + sa.Column("organization_id", sa.String(), nullable=False), + sa.Column("file_id", sa.String(), nullable=True), + sa.Column("source_id", sa.String(), nullable=False), + sa.ForeignKeyConstraint(["file_id"], ["files.id"], ondelete="CASCADE"), + sa.ForeignKeyConstraint( + ["organization_id"], + ["organizations.id"], + ), + sa.ForeignKeyConstraint(["source_id"], ["sources.id"], ondelete="CASCADE"), + sa.PrimaryKeyConstraint("id"), ) - op.create_index('source_passages_org_idx', 'source_passages', ['organization_id'], unique=False) - op.drop_table('passages') - op.drop_constraint('files_source_id_fkey', 'files', type_='foreignkey') - op.create_foreign_key(None, 'files', 'sources', ['source_id'], ['id'], ondelete='CASCADE') - op.drop_constraint('messages_agent_id_fkey', 'messages', type_='foreignkey') - op.create_foreign_key(None, 'messages', 'agents', ['agent_id'], ['id'], ondelete='CASCADE') + op.create_index("source_passages_org_idx", "source_passages", ["organization_id"], unique=False) + op.drop_table("passages") + op.drop_constraint("files_source_id_fkey", "files", type_="foreignkey") + op.create_foreign_key(None, "files", "sources", ["source_id"], ["id"], ondelete="CASCADE") + op.drop_constraint("messages_agent_id_fkey", "messages", type_="foreignkey") + op.create_foreign_key(None, "messages", "agents", ["agent_id"], ["id"], ondelete="CASCADE") # ### end Alembic commands ### def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - op.drop_constraint(None, 'messages', type_='foreignkey') - op.create_foreign_key('messages_agent_id_fkey', 'messages', 'agents', ['agent_id'], ['id']) - op.drop_constraint(None, 'files', type_='foreignkey') - op.create_foreign_key('files_source_id_fkey', 'files', 'sources', ['source_id'], ['id']) + op.drop_constraint(None, "messages", type_="foreignkey") + op.create_foreign_key("messages_agent_id_fkey", "messages", "agents", ["agent_id"], ["id"]) + op.drop_constraint(None, "files", type_="foreignkey") + op.create_foreign_key("files_source_id_fkey", "files", "sources", ["source_id"], ["id"]) op.create_table( - 'passages', - sa.Column('id', sa.VARCHAR(), autoincrement=False, nullable=False), - sa.Column('text', sa.VARCHAR(), autoincrement=False, nullable=False), - sa.Column('file_id', sa.VARCHAR(), autoincrement=False, nullable=True), - sa.Column('agent_id', sa.VARCHAR(), autoincrement=False, nullable=True), - sa.Column('source_id', sa.VARCHAR(), autoincrement=False, nullable=True), - sa.Column('embedding', Vector(dim=4096), autoincrement=False, nullable=True), - sa.Column('embedding_config', postgresql.JSON(astext_type=sa.Text()), autoincrement=False, nullable=False), - sa.Column('metadata_', postgresql.JSON(astext_type=sa.Text()), autoincrement=False, nullable=False), - sa.Column('created_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=False), - sa.Column('updated_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=True), - sa.Column('is_deleted', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=False), - sa.Column('_created_by_id', sa.VARCHAR(), autoincrement=False, nullable=True), - sa.Column('_last_updated_by_id', sa.VARCHAR(), autoincrement=False, nullable=True), - sa.Column('organization_id', sa.VARCHAR(), autoincrement=False, nullable=False), - sa.ForeignKeyConstraint(['agent_id'], ['agents.id'], name='passages_agent_id_fkey'), - sa.ForeignKeyConstraint(['file_id'], ['files.id'], name='passages_file_id_fkey', ondelete='CASCADE'), - sa.ForeignKeyConstraint(['organization_id'], ['organizations.id'], name='passages_organization_id_fkey'), - sa.PrimaryKeyConstraint('id', name='passages_pkey') + "passages", + sa.Column("id", sa.VARCHAR(), autoincrement=False, nullable=False), + sa.Column("text", sa.VARCHAR(), autoincrement=False, nullable=False), + sa.Column("file_id", sa.VARCHAR(), autoincrement=False, nullable=True), + sa.Column("agent_id", sa.VARCHAR(), autoincrement=False, nullable=True), + sa.Column("source_id", sa.VARCHAR(), autoincrement=False, nullable=True), + sa.Column("embedding", Vector(dim=4096), autoincrement=False, nullable=True), + sa.Column("embedding_config", postgresql.JSON(astext_type=sa.Text()), autoincrement=False, nullable=False), + sa.Column("metadata_", postgresql.JSON(astext_type=sa.Text()), autoincrement=False, nullable=False), + sa.Column("created_at", postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=False), + sa.Column("updated_at", postgresql.TIMESTAMP(timezone=True), server_default=sa.text("now()"), autoincrement=False, nullable=True), + sa.Column("is_deleted", sa.BOOLEAN(), server_default=sa.text("false"), autoincrement=False, nullable=False), + sa.Column("_created_by_id", sa.VARCHAR(), autoincrement=False, nullable=True), + sa.Column("_last_updated_by_id", sa.VARCHAR(), autoincrement=False, nullable=True), + sa.Column("organization_id", sa.VARCHAR(), autoincrement=False, nullable=False), + sa.ForeignKeyConstraint(["agent_id"], ["agents.id"], name="passages_agent_id_fkey"), + sa.ForeignKeyConstraint(["file_id"], ["files.id"], name="passages_file_id_fkey", ondelete="CASCADE"), + sa.ForeignKeyConstraint(["organization_id"], ["organizations.id"], name="passages_organization_id_fkey"), + sa.PrimaryKeyConstraint("id", name="passages_pkey"), ) - op.drop_index('source_passages_org_idx', table_name='source_passages') - op.drop_table('source_passages') - op.drop_index('agent_passages_org_idx', table_name='agent_passages') - op.drop_table('agent_passages') + op.drop_index("source_passages_org_idx", table_name="source_passages") + op.drop_table("source_passages") + op.drop_index("agent_passages_org_idx", table_name="agent_passages") + op.drop_table("agent_passages") # ### end Alembic commands ### diff --git a/alembic/versions/5987401b40ae_refactor_agent_memory.py b/alembic/versions/5987401b40ae_refactor_agent_memory.py index 889e9425b5..84e4ebe2d3 100644 --- a/alembic/versions/5987401b40ae_refactor_agent_memory.py +++ b/alembic/versions/5987401b40ae_refactor_agent_memory.py @@ -9,9 +9,8 @@ from typing import Sequence, Union import sqlalchemy as sa -from sqlalchemy.dialects import postgresql - from alembic import op +from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. revision: str = "5987401b40ae" diff --git a/alembic/versions/95badb46fdf9_migrate_messages_to_the_orm.py b/alembic/versions/95badb46fdf9_migrate_messages_to_the_orm.py index 73254e39ea..f200e65e86 100644 --- a/alembic/versions/95badb46fdf9_migrate_messages_to_the_orm.py +++ b/alembic/versions/95badb46fdf9_migrate_messages_to_the_orm.py @@ -9,9 +9,8 @@ from typing import Sequence, Union import sqlalchemy as sa -from sqlalchemy.dialects import postgresql - from alembic import op +from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. revision: str = "95badb46fdf9" diff --git a/alembic/versions/9a505cc7eca9_create_a_baseline_migrations.py b/alembic/versions/9a505cc7eca9_create_a_baseline_migrations.py index 21f6a39613..6ef44d476e 100644 --- a/alembic/versions/9a505cc7eca9_create_a_baseline_migrations.py +++ b/alembic/versions/9a505cc7eca9_create_a_baseline_migrations.py @@ -8,12 +8,11 @@ from typing import Sequence, Union +import letta.orm import pgvector import sqlalchemy as sa -from sqlalchemy.dialects import postgresql - -import letta.orm from alembic import op +from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. revision: str = "9a505cc7eca9" diff --git a/alembic/versions/a91994b9752f_add_column_to_tools_table_to_contain_.py b/alembic/versions/a91994b9752f_add_column_to_tools_table_to_contain_.py index f8da3856bd..157e87ef33 100644 --- a/alembic/versions/a91994b9752f_add_column_to_tools_table_to_contain_.py +++ b/alembic/versions/a91994b9752f_add_column_to_tools_table_to_contain_.py @@ -9,7 +9,6 @@ from typing import Sequence, Union import sqlalchemy as sa - from alembic import op from letta.constants import FUNCTION_RETURN_CHAR_LIMIT diff --git a/alembic/versions/b6d7ca024aa9_add_agents_tags_table.py b/alembic/versions/b6d7ca024aa9_add_agents_tags_table.py index 2aec8a09fb..638bc5b5c9 100644 --- a/alembic/versions/b6d7ca024aa9_add_agents_tags_table.py +++ b/alembic/versions/b6d7ca024aa9_add_agents_tags_table.py @@ -9,7 +9,6 @@ from typing import Sequence, Union import sqlalchemy as sa - from alembic import op # revision identifiers, used by Alembic. diff --git a/alembic/versions/c5d964280dff_add_passages_orm_drop_legacy_passages_.py b/alembic/versions/c5d964280dff_add_passages_orm_drop_legacy_passages_.py index a16fdae444..fb0eafab66 100644 --- a/alembic/versions/c5d964280dff_add_passages_orm_drop_legacy_passages_.py +++ b/alembic/versions/c5d964280dff_add_passages_orm_drop_legacy_passages_.py @@ -5,25 +5,26 @@ Create Date: 2024-12-10 15:05:32.335519 """ + from typing import Sequence, Union -from alembic import op import sqlalchemy as sa +from alembic import op from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. -revision: str = 'c5d964280dff' -down_revision: Union[str, None] = 'a91994b9752f' +revision: str = "c5d964280dff" +down_revision: Union[str, None] = "a91994b9752f" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - op.add_column('passages', sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True)) - op.add_column('passages', sa.Column('is_deleted', sa.Boolean(), server_default=sa.text('FALSE'), nullable=False)) - op.add_column('passages', sa.Column('_created_by_id', sa.String(), nullable=True)) - op.add_column('passages', sa.Column('_last_updated_by_id', sa.String(), nullable=True)) + op.add_column("passages", sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=True)) + op.add_column("passages", sa.Column("is_deleted", sa.Boolean(), server_default=sa.text("FALSE"), nullable=False)) + op.add_column("passages", sa.Column("_created_by_id", sa.String(), nullable=True)) + op.add_column("passages", sa.Column("_last_updated_by_id", sa.String(), nullable=True)) # Data migration step: op.add_column("passages", sa.Column("organization_id", sa.String(), nullable=True)) @@ -41,48 +42,32 @@ def upgrade() -> None: # Set `organization_id` as non-nullable after population op.alter_column("passages", "organization_id", nullable=False) - op.alter_column('passages', 'text', - existing_type=sa.VARCHAR(), - nullable=False) - op.alter_column('passages', 'embedding_config', - existing_type=postgresql.JSON(astext_type=sa.Text()), - nullable=False) - op.alter_column('passages', 'metadata_', - existing_type=postgresql.JSON(astext_type=sa.Text()), - nullable=False) - op.alter_column('passages', 'created_at', - existing_type=postgresql.TIMESTAMP(timezone=True), - nullable=False) - op.drop_index('passage_idx_user', table_name='passages') - op.create_foreign_key(None, 'passages', 'organizations', ['organization_id'], ['id']) - op.create_foreign_key(None, 'passages', 'agents', ['agent_id'], ['id']) - op.create_foreign_key(None, 'passages', 'files', ['file_id'], ['id'], ondelete='CASCADE') - op.drop_column('passages', 'user_id') + op.alter_column("passages", "text", existing_type=sa.VARCHAR(), nullable=False) + op.alter_column("passages", "embedding_config", existing_type=postgresql.JSON(astext_type=sa.Text()), nullable=False) + op.alter_column("passages", "metadata_", existing_type=postgresql.JSON(astext_type=sa.Text()), nullable=False) + op.alter_column("passages", "created_at", existing_type=postgresql.TIMESTAMP(timezone=True), nullable=False) + op.drop_index("passage_idx_user", table_name="passages") + op.create_foreign_key(None, "passages", "organizations", ["organization_id"], ["id"]) + op.create_foreign_key(None, "passages", "agents", ["agent_id"], ["id"]) + op.create_foreign_key(None, "passages", "files", ["file_id"], ["id"], ondelete="CASCADE") + op.drop_column("passages", "user_id") # ### end Alembic commands ### def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - op.add_column('passages', sa.Column('user_id', sa.VARCHAR(), autoincrement=False, nullable=False)) - op.drop_constraint(None, 'passages', type_='foreignkey') - op.drop_constraint(None, 'passages', type_='foreignkey') - op.drop_constraint(None, 'passages', type_='foreignkey') - op.create_index('passage_idx_user', 'passages', ['user_id', 'agent_id', 'file_id'], unique=False) - op.alter_column('passages', 'created_at', - existing_type=postgresql.TIMESTAMP(timezone=True), - nullable=True) - op.alter_column('passages', 'metadata_', - existing_type=postgresql.JSON(astext_type=sa.Text()), - nullable=True) - op.alter_column('passages', 'embedding_config', - existing_type=postgresql.JSON(astext_type=sa.Text()), - nullable=True) - op.alter_column('passages', 'text', - existing_type=sa.VARCHAR(), - nullable=True) - op.drop_column('passages', 'organization_id') - op.drop_column('passages', '_last_updated_by_id') - op.drop_column('passages', '_created_by_id') - op.drop_column('passages', 'is_deleted') - op.drop_column('passages', 'updated_at') + op.add_column("passages", sa.Column("user_id", sa.VARCHAR(), autoincrement=False, nullable=False)) + op.drop_constraint(None, "passages", type_="foreignkey") + op.drop_constraint(None, "passages", type_="foreignkey") + op.drop_constraint(None, "passages", type_="foreignkey") + op.create_index("passage_idx_user", "passages", ["user_id", "agent_id", "file_id"], unique=False) + op.alter_column("passages", "created_at", existing_type=postgresql.TIMESTAMP(timezone=True), nullable=True) + op.alter_column("passages", "metadata_", existing_type=postgresql.JSON(astext_type=sa.Text()), nullable=True) + op.alter_column("passages", "embedding_config", existing_type=postgresql.JSON(astext_type=sa.Text()), nullable=True) + op.alter_column("passages", "text", existing_type=sa.VARCHAR(), nullable=True) + op.drop_column("passages", "organization_id") + op.drop_column("passages", "_last_updated_by_id") + op.drop_column("passages", "_created_by_id") + op.drop_column("passages", "is_deleted") + op.drop_column("passages", "updated_at") # ### end Alembic commands ### diff --git a/alembic/versions/c85a3d07c028_move_files_to_orm.py b/alembic/versions/c85a3d07c028_move_files_to_orm.py index b05d793031..7d853e6a8b 100644 --- a/alembic/versions/c85a3d07c028_move_files_to_orm.py +++ b/alembic/versions/c85a3d07c028_move_files_to_orm.py @@ -9,7 +9,6 @@ from typing import Sequence, Union import sqlalchemy as sa - from alembic import op # revision identifiers, used by Alembic. diff --git a/alembic/versions/cda66b6cb0d6_move_sources_to_orm.py b/alembic/versions/cda66b6cb0d6_move_sources_to_orm.py index f46bef6b4d..ae10edbd04 100644 --- a/alembic/versions/cda66b6cb0d6_move_sources_to_orm.py +++ b/alembic/versions/cda66b6cb0d6_move_sources_to_orm.py @@ -9,9 +9,8 @@ from typing import Sequence, Union import sqlalchemy as sa -from sqlalchemy.dialects import postgresql - from alembic import op +from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. revision: str = "cda66b6cb0d6" diff --git a/alembic/versions/d05669b60ebe_migrate_agents_to_orm.py b/alembic/versions/d05669b60ebe_migrate_agents_to_orm.py index d03652c85f..61b24f5edd 100644 --- a/alembic/versions/d05669b60ebe_migrate_agents_to_orm.py +++ b/alembic/versions/d05669b60ebe_migrate_agents_to_orm.py @@ -9,9 +9,8 @@ from typing import Sequence, Union import sqlalchemy as sa -from sqlalchemy.dialects import postgresql - from alembic import op +from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. revision: str = "d05669b60ebe" diff --git a/alembic/versions/d14ae606614c_move_organizations_users_tools_to_orm.py b/alembic/versions/d14ae606614c_move_organizations_users_tools_to_orm.py index e8733313f5..5c0dab1943 100644 --- a/alembic/versions/d14ae606614c_move_organizations_users_tools_to_orm.py +++ b/alembic/versions/d14ae606614c_move_organizations_users_tools_to_orm.py @@ -8,11 +8,10 @@ from typing import Sequence, Union -import sqlalchemy as sa -from sqlalchemy.dialects import postgresql - import letta +import sqlalchemy as sa from alembic import op +from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. revision: str = "d14ae606614c" diff --git a/alembic/versions/e1a625072dbf_tweak_created_at_field_for_messages.py b/alembic/versions/e1a625072dbf_tweak_created_at_field_for_messages.py index fb425db317..4fd8abd2d2 100644 --- a/alembic/versions/e1a625072dbf_tweak_created_at_field_for_messages.py +++ b/alembic/versions/e1a625072dbf_tweak_created_at_field_for_messages.py @@ -8,9 +8,8 @@ from typing import Sequence, Union -from sqlalchemy.dialects import postgresql - from alembic import op +from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. revision: str = "e1a625072dbf" diff --git a/alembic/versions/f7507eab4bb9_migrate_blocks_to_orm_model.py b/alembic/versions/f7507eab4bb9_migrate_blocks_to_orm_model.py index 9e7fa270c6..37a67d88e6 100644 --- a/alembic/versions/f7507eab4bb9_migrate_blocks_to_orm_model.py +++ b/alembic/versions/f7507eab4bb9_migrate_blocks_to_orm_model.py @@ -9,7 +9,6 @@ from typing import Sequence, Union import sqlalchemy as sa - from alembic import op # revision identifiers, used by Alembic. diff --git a/alembic/versions/f81ceea2c08d_create_sandbox_config_and_sandbox_env_.py b/alembic/versions/f81ceea2c08d_create_sandbox_config_and_sandbox_env_.py index 55332bfc15..32a1b6779c 100644 --- a/alembic/versions/f81ceea2c08d_create_sandbox_config_and_sandbox_env_.py +++ b/alembic/versions/f81ceea2c08d_create_sandbox_config_and_sandbox_env_.py @@ -9,7 +9,6 @@ from typing import Sequence, Union import sqlalchemy as sa - from alembic import op # revision identifiers, used by Alembic. diff --git a/examples/swarm/simple.py b/examples/swarm/simple.py index 8e10c486df..7bedb03290 100644 --- a/examples/swarm/simple.py +++ b/examples/swarm/simple.py @@ -1,7 +1,6 @@ import typer -from swarm import Swarm - from letta import EmbeddingConfig, LLMConfig +from swarm import Swarm """ This is an example of how to implement the basic example provided by OpenAI for tranferring a conversation between two agents: diff --git a/examples/swarm/swarm.py b/examples/swarm/swarm.py index ef080806d2..40552997b5 100644 --- a/examples/swarm/swarm.py +++ b/examples/swarm/swarm.py @@ -2,7 +2,6 @@ from typing import List, Optional import typer - from letta import AgentState, EmbeddingConfig, LLMConfig, create_client from letta.schemas.agent import AgentType from letta.schemas.memory import BasicBlockMemory, Block diff --git a/examples/tool_rule_usage.py b/examples/tool_rule_usage.py index 7d04df6c5a..4e0193f8f9 100644 --- a/examples/tool_rule_usage.py +++ b/examples/tool_rule_usage.py @@ -5,8 +5,8 @@ from letta.schemas.letta_message import ToolCallMessage from letta.schemas.tool_rule import ChildToolRule, InitToolRule, TerminalToolRule from tests.helpers.endpoints_helper import ( - assert_invoked_send_message_with_keyword, - setup_agent, + assert_invoked_send_message_with_keyword, + setup_agent, ) from tests.helpers.utils import cleanup from tests.test_model_letta_perfomance import llm_config_dir diff --git a/letta/benchmark/benchmark.py b/letta/benchmark/benchmark.py index 7109210e9e..b7c01ab7e9 100644 --- a/letta/benchmark/benchmark.py +++ b/letta/benchmark/benchmark.py @@ -5,7 +5,6 @@ from typing import Annotated, Union import typer - from letta import LocalClient, RESTClient, create_client from letta.benchmark.constants import HUMAN, PERSONA, PROMPTS, TRIES from letta.config import LettaConfig diff --git a/letta/cli/cli.py b/letta/cli/cli.py index e5a649f7ce..efd58df750 100644 --- a/letta/cli/cli.py +++ b/letta/cli/cli.py @@ -3,10 +3,9 @@ from enum import Enum from typing import Annotated, Optional +import letta.utils as utils import questionary import typer - -import letta.utils as utils from letta import create_client from letta.agent import Agent, save_agent from letta.config import LettaConfig diff --git a/letta/cli/cli_config.py b/letta/cli/cli_config.py index 8278d55317..f70b466b23 100644 --- a/letta/cli/cli_config.py +++ b/letta/cli/cli_config.py @@ -5,11 +5,10 @@ import questionary import typer +from letta import utils from prettytable.colortable import ColorTable, Themes from tqdm import tqdm -from letta import utils - app = typer.Typer() diff --git a/letta/cli/cli_load.py b/letta/cli/cli_load.py index b27da4d81a..e1d7b1b8ce 100644 --- a/letta/cli/cli_load.py +++ b/letta/cli/cli_load.py @@ -13,7 +13,6 @@ import questionary import typer - from letta import create_client from letta.data_sources.connectors import DirectoryConnector diff --git a/letta/client/client.py b/letta/client/client.py index bb6d2f0ff8..af81a5626a 100644 --- a/letta/client/client.py +++ b/letta/client/client.py @@ -2,9 +2,8 @@ import time from typing import Callable, Dict, Generator, List, Optional, Union -import requests - import letta.utils +import requests from letta.constants import ( ADMIN_PREFIX, BASE_MEMORY_TOOLS, diff --git a/letta/client/streaming.py b/letta/client/streaming.py index a364ada6f0..7d7e11292f 100644 --- a/letta/client/streaming.py +++ b/letta/client/streaming.py @@ -3,14 +3,13 @@ import httpx from httpx_sse import SSEError, connect_sse - from letta.constants import OPENAI_CONTEXT_WINDOW_ERROR_SUBSTRING from letta.errors import LLMError from letta.schemas.enums import MessageStreamStatus from letta.schemas.letta_message import ( + ReasoningMessage, ToolCallMessage, ToolReturnMessage, - ReasoningMessage, ) from letta.schemas.letta_response import LettaStreamingResponse from letta.schemas.usage import LettaUsageStatistics diff --git a/letta/client/utils.py b/letta/client/utils.py index 1ff28f8c9c..871269c7c4 100644 --- a/letta/client/utils.py +++ b/letta/client/utils.py @@ -3,12 +3,11 @@ from typing import Optional from IPython.display import HTML, display -from sqlalchemy.testing.plugin.plugin_base import warnings - from letta.local_llm.constants import ( ASSISTANT_MESSAGE_CLI_SYMBOL, INNER_THOUGHTS_CLI_SYMBOL, ) +from sqlalchemy.testing.plugin.plugin_base import warnings def pprint(messages): diff --git a/letta/data_sources/connectors.py b/letta/data_sources/connectors.py index f9fdd26160..3d5778104d 100644 --- a/letta/data_sources/connectors.py +++ b/letta/data_sources/connectors.py @@ -1,7 +1,6 @@ from typing import Dict, Iterator, List, Tuple import typer - from letta.data_sources.connectors_helper import ( assert_all_files_exist_locally, extract_metadata_from_files, @@ -14,6 +13,7 @@ from letta.services.passage_manager import PassageManager from letta.services.source_manager import SourceManager + class DataConnector: """ Base class for data connectors that can be extended to generate files and passages from a custom data source. diff --git a/letta/embeddings.py b/letta/embeddings.py index 0d82d158a5..e27ee1addd 100644 --- a/letta/embeddings.py +++ b/letta/embeddings.py @@ -3,7 +3,6 @@ import numpy as np import tiktoken - from letta.constants import ( EMBEDDING_TO_TOKENIZER_DEFAULT, EMBEDDING_TO_TOKENIZER_MAP, diff --git a/letta/errors.py b/letta/errors.py index 4957139bee..2c4703c0dd 100644 --- a/letta/errors.py +++ b/letta/errors.py @@ -52,12 +52,10 @@ def __init__(self, message: str, missing_fields: Optional[List[str]] = None): class LettaAgentNotFoundError(LettaError): """Error raised when an agent is not found.""" - pass class LettaUserNotFoundError(LettaError): """Error raised when a user is not found.""" - pass class LLMError(LettaError): diff --git a/letta/functions/function_sets/extras.py b/letta/functions/function_sets/extras.py index f29f85ba49..c911ffca1e 100644 --- a/letta/functions/function_sets/extras.py +++ b/letta/functions/function_sets/extras.py @@ -3,7 +3,6 @@ from typing import Optional import requests - from letta.constants import ( MESSAGE_CHATGPT_FUNCTION_MODEL, MESSAGE_CHATGPT_FUNCTION_SYSTEM_MESSAGE, diff --git a/letta/helpers/tool_rule_solver.py b/letta/helpers/tool_rule_solver.py index 02919b2e8a..24eff3075b 100644 --- a/letta/helpers/tool_rule_solver.py +++ b/letta/helpers/tool_rule_solver.py @@ -1,8 +1,6 @@ import json from typing import List, Optional, Union -from pydantic import BaseModel, Field - from letta.schemas.enums import ToolRuleType from letta.schemas.tool_rule import ( BaseToolRule, @@ -11,6 +9,7 @@ InitToolRule, TerminalToolRule, ) +from pydantic import BaseModel, Field class ToolRuleValidationError(Exception): @@ -50,7 +49,6 @@ def __init__(self, tool_rules: List[BaseToolRule], **kwargs): assert isinstance(rule, TerminalToolRule) self.terminal_tool_rules.append(rule) - def update_tool_usage(self, tool_name: str): """Update the internal state to track the last tool called.""" self.last_tool_name = tool_name @@ -88,7 +86,7 @@ def has_children_tools(self, tool_name): return any(rule.tool_name == tool_name for rule in self.tool_rules) def validate_conditional_tool(self, rule: ConditionalToolRule): - ''' + """ Validate a conditional tool rule Args: @@ -96,13 +94,13 @@ def validate_conditional_tool(self, rule: ConditionalToolRule): Raises: ToolRuleValidationError: If the rule is invalid - ''' + """ if len(rule.child_output_mapping) == 0: raise ToolRuleValidationError("Conditional tool rule must have at least one child tool.") return True def evaluate_conditional_tool(self, tool: ConditionalToolRule, last_function_response: str) -> str: - ''' + """ Parse function response to determine which child tool to use based on the mapping Args: @@ -111,7 +109,7 @@ def evaluate_conditional_tool(self, tool: ConditionalToolRule, last_function_res Returns: str: The name of the child tool to use next - ''' + """ json_response = json.loads(last_function_response) function_output = json_response["message"] diff --git a/letta/interface.py b/letta/interface.py index aac10453f1..41276b17a7 100644 --- a/letta/interface.py +++ b/letta/interface.py @@ -3,7 +3,6 @@ from typing import List, Optional from colorama import Fore, Style, init - from letta.constants import CLI_WARNING_PREFIX from letta.local_llm.constants import ( ASSISTANT_MESSAGE_CLI_SYMBOL, diff --git a/letta/llm_api/anthropic.py b/letta/llm_api/anthropic.py index 4cca920a5c..78980d520c 100644 --- a/letta/llm_api/anthropic.py +++ b/letta/llm_api/anthropic.py @@ -102,13 +102,9 @@ def convert_tools_to_anthropic_format(tools: List[Tool]) -> List[dict]: formatted_tools = [] for tool in tools: formatted_tool = { - "name" : tool.function.name, - "description" : tool.function.description, - "input_schema" : tool.function.parameters or { - "type": "object", - "properties": {}, - "required": [] - } + "name": tool.function.name, + "description": tool.function.description, + "input_schema": tool.function.parameters or {"type": "object", "properties": {}, "required": []}, } formatted_tools.append(formatted_tool) @@ -346,7 +342,7 @@ def anthropic_chat_completions_request( data["tool_choice"] = { "type": "tool", # Changed from "function" to "tool" "name": anthropic_tools[0]["name"], # Directly specify name without nested "function" object - "disable_parallel_tool_use": True # Force single tool use + "disable_parallel_tool_use": True, # Force single tool use } # Move 'system' to the top level diff --git a/letta/llm_api/azure_openai.py b/letta/llm_api/azure_openai.py index e60b547be7..047f2f86b2 100644 --- a/letta/llm_api/azure_openai.py +++ b/letta/llm_api/azure_openai.py @@ -1,7 +1,6 @@ from collections import defaultdict import requests - from letta.llm_api.helpers import make_post_request from letta.schemas.llm_config import LLMConfig from letta.schemas.openai.chat_completion_response import ChatCompletionResponse diff --git a/letta/llm_api/cohere.py b/letta/llm_api/cohere.py index 1e8b5fd6ce..844e618f4c 100644 --- a/letta/llm_api/cohere.py +++ b/letta/llm_api/cohere.py @@ -3,7 +3,6 @@ from typing import List, Optional, Union import requests - from letta.local_llm.utils import count_tokens from letta.schemas.message import Message from letta.schemas.openai.chat_completion_request import ChatCompletionRequest, Tool diff --git a/letta/llm_api/google_ai.py b/letta/llm_api/google_ai.py index 57071a2396..f16fc447cc 100644 --- a/letta/llm_api/google_ai.py +++ b/letta/llm_api/google_ai.py @@ -2,7 +2,6 @@ from typing import List, Optional, Tuple import requests - from letta.constants import NON_USER_MSG_PREFIX from letta.llm_api.helpers import make_post_request from letta.local_llm.json_parser import clean_json_string_extra_backslash diff --git a/letta/llm_api/helpers.py b/letta/llm_api/helpers.py index 1244b6ffe7..25f77e2445 100644 --- a/letta/llm_api/helpers.py +++ b/letta/llm_api/helpers.py @@ -5,7 +5,6 @@ from typing import Any, List, Union import requests - from letta.constants import OPENAI_CONTEXT_WINDOW_ERROR_SUBSTRING from letta.schemas.openai.chat_completion_response import ChatCompletionResponse, Choice from letta.utils import json_dumps, printd diff --git a/letta/llm_api/llm_api_tools.py b/letta/llm_api/llm_api_tools.py index 578779d72b..7b39b31aec 100644 --- a/letta/llm_api/llm_api_tools.py +++ b/letta/llm_api/llm_api_tools.py @@ -3,7 +3,6 @@ from typing import List, Optional, Union import requests - from letta.constants import CLI_WARNING_PREFIX from letta.errors import LettaConfigurationError, RateLimitExceededError from letta.llm_api.anthropic import anthropic_chat_completions_request @@ -255,12 +254,7 @@ def create( tool_call = None if force_tool_call is not None: - tool_call = { - "type": "function", - "function": { - "name": force_tool_call - } - } + tool_call = {"type": "function", "function": {"name": force_tool_call}} assert functions is not None return anthropic_chat_completions_request( diff --git a/letta/llm_api/mistral.py b/letta/llm_api/mistral.py index 932cf87484..b53d76edb8 100644 --- a/letta/llm_api/mistral.py +++ b/letta/llm_api/mistral.py @@ -1,5 +1,4 @@ import requests - from letta.utils import printd, smart_urljoin diff --git a/letta/llm_api/openai.py b/letta/llm_api/openai.py index 813ae68d59..407ac6aeca 100644 --- a/letta/llm_api/openai.py +++ b/letta/llm_api/openai.py @@ -6,7 +6,6 @@ import requests from httpx_sse import connect_sse from httpx_sse._exceptions import SSEError - from letta.constants import OPENAI_CONTEXT_WINDOW_ERROR_SUBSTRING from letta.errors import LLMError from letta.llm_api.helpers import ( diff --git a/letta/local_llm/chat_completion_proxy.py b/letta/local_llm/chat_completion_proxy.py index c6dbd4a16f..9eba5ca85a 100644 --- a/letta/local_llm/chat_completion_proxy.py +++ b/letta/local_llm/chat_completion_proxy.py @@ -3,7 +3,6 @@ import uuid import requests - from letta.constants import CLI_WARNING_PREFIX from letta.errors import LocalLLMConnectionError, LocalLLMError from letta.local_llm.constants import DEFAULT_WRAPPER diff --git a/letta/local_llm/grammars/gbnf_grammar_generator.py b/letta/local_llm/grammars/gbnf_grammar_generator.py index ddd628175a..1cb793ef1b 100644 --- a/letta/local_llm/grammars/gbnf_grammar_generator.py +++ b/letta/local_llm/grammars/gbnf_grammar_generator.py @@ -19,9 +19,8 @@ ) from docstring_parser import parse -from pydantic import BaseModel, create_model - from letta.utils import json_dumps +from pydantic import BaseModel, create_model class PydanticDataType(Enum): diff --git a/letta/local_llm/llm_chat_completion_wrappers/configurable_wrapper.py b/letta/local_llm/llm_chat_completion_wrappers/configurable_wrapper.py index 19f2566856..4b41d7a574 100644 --- a/letta/local_llm/llm_chat_completion_wrappers/configurable_wrapper.py +++ b/letta/local_llm/llm_chat_completion_wrappers/configurable_wrapper.py @@ -1,5 +1,4 @@ import yaml - from letta.utils import json_dumps, json_loads from ...errors import LLMJSONParsingError diff --git a/letta/local_llm/utils.py b/letta/local_llm/utils.py index b0529c358a..796b3c57a1 100644 --- a/letta/local_llm/utils.py +++ b/letta/local_llm/utils.py @@ -2,15 +2,14 @@ import warnings from typing import List, Union -import requests -import tiktoken - import letta.local_llm.llm_chat_completion_wrappers.airoboros as airoboros import letta.local_llm.llm_chat_completion_wrappers.chatml as chatml import letta.local_llm.llm_chat_completion_wrappers.configurable_wrapper as configurable_wrapper import letta.local_llm.llm_chat_completion_wrappers.dolphin as dolphin import letta.local_llm.llm_chat_completion_wrappers.llama3 as llama3 import letta.local_llm.llm_chat_completion_wrappers.zephyr as zephyr +import requests +import tiktoken from letta.schemas.openai.chat_completion_request import Tool, ToolCall diff --git a/letta/main.py b/letta/main.py index de1b4028ab..bbcd56e594 100644 --- a/letta/main.py +++ b/letta/main.py @@ -2,14 +2,12 @@ import sys import traceback -import questionary -import requests -import typer -from rich.console import Console - import letta.agent as agent import letta.errors as errors import letta.system as system +import questionary +import requests +import typer # import benchmark from letta import create_client @@ -22,6 +20,7 @@ # from letta.interface import CLIInterface as interface # for printing to terminal from letta.streaming_interface import AgentRefreshStreamingInterface +from rich.console import Console # interface = interface() diff --git a/letta/orm/__init__.py b/letta/orm/__init__.py index 8a0f0c7779..e083efce2c 100644 --- a/letta/orm/__init__.py +++ b/letta/orm/__init__.py @@ -7,7 +7,7 @@ from letta.orm.job import Job from letta.orm.message import Message from letta.orm.organization import Organization -from letta.orm.passage import BasePassage, AgentPassage, SourcePassage +from letta.orm.passage import AgentPassage, BasePassage, SourcePassage from letta.orm.sandbox_config import SandboxConfig, SandboxEnvironmentVariable from letta.orm.source import Source from letta.orm.sources_agents import SourcesAgents diff --git a/letta/orm/agent.py b/letta/orm/agent.py index c4645c3ed2..de9dd5ce0e 100644 --- a/letta/orm/agent.py +++ b/letta/orm/agent.py @@ -1,9 +1,6 @@ import uuid from typing import TYPE_CHECKING, List, Optional -from sqlalchemy import JSON, String, UniqueConstraint -from sqlalchemy.orm import Mapped, mapped_column, relationship - from letta.orm.block import Block from letta.orm.custom_columns import ( EmbeddingConfigColumn, @@ -20,6 +17,8 @@ from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import Memory from letta.schemas.tool_rule import ToolRule +from sqlalchemy import JSON, String, UniqueConstraint +from sqlalchemy.orm import Mapped, mapped_column, relationship if TYPE_CHECKING: from letta.orm.agents_tags import AgentsTags diff --git a/letta/orm/agents_tags.py b/letta/orm/agents_tags.py index 76ff90110c..5041f629c1 100644 --- a/letta/orm/agents_tags.py +++ b/letta/orm/agents_tags.py @@ -1,8 +1,7 @@ +from letta.orm.base import Base from sqlalchemy import ForeignKey, String, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column, relationship -from letta.orm.base import Base - class AgentsTags(Base): __tablename__ = "agents_tags" diff --git a/letta/orm/block.py b/letta/orm/block.py index 99cfa29b2e..6759596da1 100644 --- a/letta/orm/block.py +++ b/letta/orm/block.py @@ -1,14 +1,13 @@ from typing import TYPE_CHECKING, Optional, Type -from sqlalchemy import JSON, BigInteger, Integer, UniqueConstraint, event -from sqlalchemy.orm import Mapped, attributes, mapped_column, relationship - from letta.constants import CORE_MEMORY_BLOCK_CHAR_LIMIT from letta.orm.blocks_agents import BlocksAgents from letta.orm.mixins import OrganizationMixin from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.schemas.block import Block as PydanticBlock from letta.schemas.block import Human, Persona +from sqlalchemy import JSON, BigInteger, Integer, UniqueConstraint, event +from sqlalchemy.orm import Mapped, attributes, mapped_column, relationship if TYPE_CHECKING: from letta.orm import Organization diff --git a/letta/orm/blocks_agents.py b/letta/orm/blocks_agents.py index 4774783b59..86a75e9a10 100644 --- a/letta/orm/blocks_agents.py +++ b/letta/orm/blocks_agents.py @@ -1,8 +1,7 @@ +from letta.orm.base import Base from sqlalchemy import ForeignKey, ForeignKeyConstraint, String, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column -from letta.orm.base import Base - class BlocksAgents(Base): """Agents must have one or many blocks to make up their core memory.""" diff --git a/letta/orm/custom_columns.py b/letta/orm/custom_columns.py index f53169d93e..b20760f987 100644 --- a/letta/orm/custom_columns.py +++ b/letta/orm/custom_columns.py @@ -2,14 +2,18 @@ from typing import List, Union import numpy as np -from sqlalchemy import JSON -from sqlalchemy.types import BINARY, TypeDecorator - from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.enums import ToolRuleType from letta.schemas.llm_config import LLMConfig from letta.schemas.openai.chat_completions import ToolCall, ToolCallFunction -from letta.schemas.tool_rule import ChildToolRule, ConditionalToolRule, InitToolRule, TerminalToolRule +from letta.schemas.tool_rule import ( + ChildToolRule, + ConditionalToolRule, + InitToolRule, + TerminalToolRule, +) +from sqlalchemy import JSON +from sqlalchemy.types import BINARY, TypeDecorator class EmbeddingConfigColumn(TypeDecorator): diff --git a/letta/orm/file.py b/letta/orm/file.py index 45470c6c96..4216a01a42 100644 --- a/letta/orm/file.py +++ b/letta/orm/file.py @@ -1,16 +1,16 @@ -from typing import TYPE_CHECKING, Optional, List - -from sqlalchemy import Integer, String -from sqlalchemy.orm import Mapped, mapped_column, relationship +from typing import TYPE_CHECKING, List, Optional from letta.orm.mixins import OrganizationMixin, SourceMixin from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.schemas.file import FileMetadata as PydanticFileMetadata +from sqlalchemy import Integer, String +from sqlalchemy.orm import Mapped, mapped_column, relationship if TYPE_CHECKING: from letta.orm.organization import Organization - from letta.orm.source import Source from letta.orm.passage import SourcePassage + from letta.orm.source import Source + class FileMetadata(SqlalchemyBase, OrganizationMixin, SourceMixin): """Represents metadata for an uploaded file.""" @@ -28,4 +28,6 @@ class FileMetadata(SqlalchemyBase, OrganizationMixin, SourceMixin): # relationships organization: Mapped["Organization"] = relationship("Organization", back_populates="files", lazy="selectin") source: Mapped["Source"] = relationship("Source", back_populates="files", lazy="selectin") - source_passages: Mapped[List["SourcePassage"]] = relationship("SourcePassage", back_populates="file", lazy="selectin", cascade="all, delete-orphan") + source_passages: Mapped[List["SourcePassage"]] = relationship( + "SourcePassage", back_populates="file", lazy="selectin", cascade="all, delete-orphan" + ) diff --git a/letta/orm/job.py b/letta/orm/job.py index d95abe443f..fabdb9188e 100644 --- a/letta/orm/job.py +++ b/letta/orm/job.py @@ -1,13 +1,12 @@ from datetime import datetime from typing import TYPE_CHECKING, Optional -from sqlalchemy import JSON, String -from sqlalchemy.orm import Mapped, mapped_column, relationship - from letta.orm.mixins import UserMixin from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.schemas.enums import JobStatus from letta.schemas.job import Job as PydanticJob +from sqlalchemy import JSON, String +from sqlalchemy.orm import Mapped, mapped_column, relationship if TYPE_CHECKING: from letta.orm.user import User diff --git a/letta/orm/message.py b/letta/orm/message.py index a8bbb90017..6e2194f5ca 100644 --- a/letta/orm/message.py +++ b/letta/orm/message.py @@ -1,13 +1,12 @@ from typing import Optional -from sqlalchemy import Index -from sqlalchemy.orm import Mapped, mapped_column, relationship - from letta.orm.custom_columns import ToolCallColumn from letta.orm.mixins import AgentMixin, OrganizationMixin from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.schemas.message import Message as PydanticMessage from letta.schemas.openai.chat_completions import ToolCall +from sqlalchemy import Index +from sqlalchemy.orm import Mapped, mapped_column, relationship class Message(SqlalchemyBase, OrganizationMixin, AgentMixin): diff --git a/letta/orm/mixins.py b/letta/orm/mixins.py index 328772d7e4..3e82f4d690 100644 --- a/letta/orm/mixins.py +++ b/letta/orm/mixins.py @@ -1,11 +1,10 @@ from typing import Optional from uuid import UUID +from letta.orm.base import Base from sqlalchemy import ForeignKey, String from sqlalchemy.orm import Mapped, mapped_column -from letta.orm.base import Base - def is_valid_uuid4(uuid_string: str) -> bool: """Check if a string is a valid UUID4.""" @@ -31,6 +30,7 @@ class UserMixin(Base): user_id: Mapped[str] = mapped_column(String, ForeignKey("users.id")) + class AgentMixin(Base): """Mixin for models that belong to an agent.""" @@ -38,6 +38,7 @@ class AgentMixin(Base): agent_id: Mapped[str] = mapped_column(String, ForeignKey("agents.id", ondelete="CASCADE")) + class FileMixin(Base): """Mixin for models that belong to a file.""" diff --git a/letta/orm/organization.py b/letta/orm/organization.py index 9a71a09b7e..9bcc09b2a5 100644 --- a/letta/orm/organization.py +++ b/letta/orm/organization.py @@ -1,9 +1,8 @@ from typing import TYPE_CHECKING, List, Union -from sqlalchemy.orm import Mapped, mapped_column, relationship - from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.schemas.organization import Organization as PydanticOrganization +from sqlalchemy.orm import Mapped, mapped_column, relationship if TYPE_CHECKING: @@ -38,19 +37,11 @@ class Organization(SqlalchemyBase): agents: Mapped[List["Agent"]] = relationship("Agent", back_populates="organization", cascade="all, delete-orphan") messages: Mapped[List["Message"]] = relationship("Message", back_populates="organization", cascade="all, delete-orphan") source_passages: Mapped[List["SourcePassage"]] = relationship( - "SourcePassage", - back_populates="organization", - cascade="all, delete-orphan" - ) - agent_passages: Mapped[List["AgentPassage"]] = relationship( - "AgentPassage", - back_populates="organization", - cascade="all, delete-orphan" + "SourcePassage", back_populates="organization", cascade="all, delete-orphan" ) + agent_passages: Mapped[List["AgentPassage"]] = relationship("AgentPassage", back_populates="organization", cascade="all, delete-orphan") @property def passages(self) -> List[Union["SourcePassage", "AgentPassage"]]: """Convenience property to get all passages""" return self.source_passages + self.agent_passages - - diff --git a/letta/orm/passage.py b/letta/orm/passage.py index 492c602174..8237ed612a 100644 --- a/letta/orm/passage.py +++ b/letta/orm/passage.py @@ -1,8 +1,5 @@ from typing import TYPE_CHECKING -from sqlalchemy import JSON, Column, Index -from sqlalchemy.orm import Mapped, declared_attr, mapped_column, relationship - from letta.config import LettaConfig from letta.constants import MAX_EMBEDDING_DIM from letta.orm.custom_columns import CommonVector, EmbeddingConfigColumn @@ -10,6 +7,8 @@ from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.schemas.passage import Passage as PydanticPassage from letta.settings import settings +from sqlalchemy import JSON, Column, Index +from sqlalchemy.orm import Mapped, declared_attr, mapped_column, relationship config = LettaConfig() diff --git a/letta/orm/sandbox_config.py b/letta/orm/sandbox_config.py index aa8e07dc93..0b0cad17fb 100644 --- a/letta/orm/sandbox_config.py +++ b/letta/orm/sandbox_config.py @@ -1,10 +1,5 @@ from typing import TYPE_CHECKING, Dict, List, Optional -from sqlalchemy import JSON -from sqlalchemy import Enum as SqlEnum -from sqlalchemy import String, UniqueConstraint -from sqlalchemy.orm import Mapped, mapped_column, relationship - from letta.orm.mixins import OrganizationMixin, SandboxConfigMixin from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.schemas.sandbox_config import SandboxConfig as PydanticSandboxConfig @@ -12,6 +7,10 @@ SandboxEnvironmentVariable as PydanticSandboxEnvironmentVariable, ) from letta.schemas.sandbox_config import SandboxType +from sqlalchemy import JSON +from sqlalchemy import Enum as SqlEnum +from sqlalchemy import String, UniqueConstraint +from sqlalchemy.orm import Mapped, mapped_column, relationship if TYPE_CHECKING: from letta.orm.organization import Organization diff --git a/letta/orm/source.py b/letta/orm/source.py index e7443ea67e..838f4c78da 100644 --- a/letta/orm/source.py +++ b/letta/orm/source.py @@ -1,14 +1,13 @@ from typing import TYPE_CHECKING, List, Optional -from sqlalchemy import JSON -from sqlalchemy.orm import Mapped, mapped_column, relationship - from letta.orm import FileMetadata from letta.orm.custom_columns import EmbeddingConfigColumn from letta.orm.mixins import OrganizationMixin from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.source import Source as PydanticSource +from sqlalchemy import JSON +from sqlalchemy.orm import Mapped, mapped_column, relationship if TYPE_CHECKING: from letta.orm.agent import Agent diff --git a/letta/orm/sources_agents.py b/letta/orm/sources_agents.py index ffe8a9d0ea..2da5003f4b 100644 --- a/letta/orm/sources_agents.py +++ b/letta/orm/sources_agents.py @@ -1,8 +1,7 @@ +from letta.orm.base import Base from sqlalchemy import ForeignKey, String from sqlalchemy.orm import Mapped, mapped_column -from letta.orm.base import Base - class SourcesAgents(Base): """Agents can have zero to many sources""" diff --git a/letta/orm/sqlalchemy_base.py b/letta/orm/sqlalchemy_base.py index 6879c74b4b..857d099025 100644 --- a/letta/orm/sqlalchemy_base.py +++ b/letta/orm/sqlalchemy_base.py @@ -3,10 +3,6 @@ from functools import wraps from typing import TYPE_CHECKING, List, Literal, Optional -from sqlalchemy import String, desc, func, or_, select -from sqlalchemy.exc import DBAPIError, IntegrityError, TimeoutError -from sqlalchemy.orm import Mapped, Session, mapped_column - from letta.log import get_logger from letta.orm.base import Base, CommonSqlalchemyMetaMixins from letta.orm.errors import ( @@ -16,6 +12,9 @@ UniqueConstraintViolationError, ) from letta.orm.sqlite_functions import adapt_array +from sqlalchemy import String, desc, func, or_, select +from sqlalchemy.exc import DBAPIError, IntegrityError, TimeoutError +from sqlalchemy.orm import Mapped, Session, mapped_column if TYPE_CHECKING: from pydantic import BaseModel diff --git a/letta/orm/sqlite_functions.py b/letta/orm/sqlite_functions.py index a5b741aa51..50c257a082 100644 --- a/letta/orm/sqlite_functions.py +++ b/letta/orm/sqlite_functions.py @@ -1,12 +1,12 @@ +import base64 +import sqlite3 from typing import Optional, Union -import base64 import numpy as np +from letta.constants import MAX_EMBEDDING_DIM from sqlalchemy import event from sqlalchemy.engine import Engine -import sqlite3 -from letta.constants import MAX_EMBEDDING_DIM def adapt_array(arr): """ @@ -19,12 +19,13 @@ def adapt_array(arr): arr = np.array(arr, dtype=np.float32) elif not isinstance(arr, np.ndarray): raise ValueError(f"Unsupported type: {type(arr)}") - + # Convert to bytes and then base64 encode bytes_data = arr.tobytes() base64_data = base64.b64encode(bytes_data) return sqlite3.Binary(base64_data) + def convert_array(text): """ Converts binary back to numpy array @@ -38,23 +39,24 @@ def convert_array(text): # Handle both bytes and sqlite3.Binary binary_data = bytes(text) if isinstance(text, sqlite3.Binary) else text - + try: # First decode base64 decoded_data = base64.b64decode(binary_data) # Then convert to numpy array return np.frombuffer(decoded_data, dtype=np.float32) - except Exception as e: + except Exception: return None + def verify_embedding_dimension(embedding: np.ndarray, expected_dim: int = MAX_EMBEDDING_DIM) -> bool: """ Verifies that an embedding has the expected dimension - + Args: embedding: Input embedding array expected_dim: Expected embedding dimension (default: 4096) - + Returns: bool: True if dimension matches, False otherwise """ @@ -62,28 +64,27 @@ def verify_embedding_dimension(embedding: np.ndarray, expected_dim: int = MAX_EM return False return embedding.shape[0] == expected_dim + def validate_and_transform_embedding( - embedding: Union[bytes, sqlite3.Binary, list, np.ndarray], - expected_dim: int = MAX_EMBEDDING_DIM, - dtype: np.dtype = np.float32 + embedding: Union[bytes, sqlite3.Binary, list, np.ndarray], expected_dim: int = MAX_EMBEDDING_DIM, dtype: np.dtype = np.float32 ) -> Optional[np.ndarray]: """ Validates and transforms embeddings to ensure correct dimensionality. - + Args: embedding: Input embedding in various possible formats expected_dim: Expected embedding dimension (default 4096) dtype: NumPy dtype for the embedding (default float32) - + Returns: np.ndarray: Validated and transformed embedding - + Raises: ValueError: If embedding dimension doesn't match expected dimension """ if embedding is None: return None - + # Convert to numpy array based on input type if isinstance(embedding, (bytes, sqlite3.Binary)): vec = convert_array(embedding) @@ -93,48 +94,49 @@ def validate_and_transform_embedding( vec = embedding.astype(dtype) else: raise ValueError(f"Unsupported embedding type: {type(embedding)}") - + # Validate dimension if vec.shape[0] != expected_dim: - raise ValueError( - f"Invalid embedding dimension: got {vec.shape[0]}, expected {expected_dim}" - ) - + raise ValueError(f"Invalid embedding dimension: got {vec.shape[0]}, expected {expected_dim}") + return vec + def cosine_distance(embedding1, embedding2, expected_dim=MAX_EMBEDDING_DIM): """ Calculate cosine distance between two embeddings - + Args: embedding1: First embedding embedding2: Second embedding expected_dim: Expected embedding dimension (default 4096) - + Returns: float: Cosine distance """ - + if embedding1 is None or embedding2 is None: return 0.0 # Maximum distance if either embedding is None - + try: vec1 = validate_and_transform_embedding(embedding1, expected_dim) vec2 = validate_and_transform_embedding(embedding2, expected_dim) - except ValueError as e: + except ValueError: return 0.0 - + similarity = np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2)) distance = float(1.0 - similarity) - + return distance + @event.listens_for(Engine, "connect") def register_functions(dbapi_connection, connection_record): """Register SQLite functions""" if isinstance(dbapi_connection, sqlite3.Connection): dbapi_connection.create_function("cosine_distance", 2, cosine_distance) - + + # Register adapters and converters for numpy arrays sqlite3.register_adapter(np.ndarray, adapt_array) sqlite3.register_converter("ARRAY", convert_array) diff --git a/letta/orm/tool.py b/letta/orm/tool.py index a25c7ebb00..50d4750623 100644 --- a/letta/orm/tool.py +++ b/letta/orm/tool.py @@ -1,13 +1,12 @@ from typing import TYPE_CHECKING, List, Optional -from sqlalchemy import JSON, String, UniqueConstraint -from sqlalchemy.orm import Mapped, mapped_column, relationship - # TODO everything in functions should live in this model from letta.orm.enums import ToolSourceType from letta.orm.mixins import OrganizationMixin from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.schemas.tool import Tool as PydanticTool +from sqlalchemy import JSON, String, UniqueConstraint +from sqlalchemy.orm import Mapped, mapped_column, relationship if TYPE_CHECKING: from letta.orm.organization import Organization diff --git a/letta/orm/tools_agents.py b/letta/orm/tools_agents.py index 52c1e0a1e2..50668d940a 100644 --- a/letta/orm/tools_agents.py +++ b/letta/orm/tools_agents.py @@ -1,8 +1,7 @@ +from letta.orm import Base from sqlalchemy import ForeignKey, String, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column -from letta.orm import Base - class ToolsAgents(Base): """Agents can have one or many tools associated with them.""" diff --git a/letta/orm/user.py b/letta/orm/user.py index 9f626b104d..23c2b268a7 100644 --- a/letta/orm/user.py +++ b/letta/orm/user.py @@ -1,10 +1,9 @@ from typing import TYPE_CHECKING, List -from sqlalchemy.orm import Mapped, mapped_column, relationship - from letta.orm.mixins import OrganizationMixin from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.schemas.user import User as PydanticUser +from sqlalchemy.orm import Mapped, mapped_column, relationship if TYPE_CHECKING: from letta.orm import Job, Organization diff --git a/letta/providers.py b/letta/providers.py index e8ebadfa70..cb7bf72b7c 100644 --- a/letta/providers.py +++ b/letta/providers.py @@ -1,7 +1,5 @@ from typing import List, Optional -from pydantic import BaseModel, Field, model_validator - from letta.constants import LLM_MAX_TOKENS, MIN_CONTEXT_WINDOW from letta.llm_api.azure_openai import ( get_azure_chat_completions_endpoint, @@ -10,6 +8,7 @@ from letta.llm_api.azure_openai_constants import AZURE_MODEL_TO_CONTEXT_LENGTH from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.llm_config import LLMConfig +from pydantic import BaseModel, Field, model_validator class Provider(BaseModel): @@ -27,12 +26,11 @@ def get_model_context_window(self, model_name: str) -> Optional[int]: def provider_tag(self) -> str: """String representation of the provider for display purposes""" raise NotImplementedError - + def get_handle(self, model_name: str) -> str: return f"{self.name}/{model_name}" - class LettaProvider(Provider): name: str = "letta" @@ -44,7 +42,7 @@ def list_llm_models(self) -> List[LLMConfig]: model_endpoint_type="openai", model_endpoint="https://inference.memgpt.ai", context_window=16384, - handle=self.get_handle("letta-free") + handle=self.get_handle("letta-free"), ) ] @@ -56,7 +54,7 @@ def list_embedding_models(self): embedding_endpoint="https://embeddings.memgpt.ai", embedding_dim=1024, embedding_chunk_size=300, - handle=self.get_handle("letta-free") + handle=self.get_handle("letta-free"), ) ] @@ -121,7 +119,13 @@ def list_llm_models(self) -> List[LLMConfig]: # continue configs.append( - LLMConfig(model=model_name, model_endpoint_type="openai", model_endpoint=self.base_url, context_window=context_window_size, handle=self.get_handle(model_name)) + LLMConfig( + model=model_name, + model_endpoint_type="openai", + model_endpoint=self.base_url, + context_window=context_window_size, + handle=self.get_handle(model_name), + ) ) # for OpenAI, sort in reverse order @@ -141,7 +145,7 @@ def list_embedding_models(self) -> List[EmbeddingConfig]: embedding_endpoint="https://api.openai.com/v1", embedding_dim=1536, embedding_chunk_size=300, - handle=self.get_handle("text-embedding-ada-002") + handle=self.get_handle("text-embedding-ada-002"), ) ] @@ -170,7 +174,7 @@ def list_llm_models(self) -> List[LLMConfig]: model_endpoint_type="anthropic", model_endpoint=self.base_url, context_window=model["context_window"], - handle=self.get_handle(model["name"]) + handle=self.get_handle(model["name"]), ) ) return configs @@ -203,7 +207,7 @@ def list_llm_models(self) -> List[LLMConfig]: model_endpoint_type="openai", model_endpoint=self.base_url, context_window=model["max_context_length"], - handle=self.get_handle(model["id"]) + handle=self.get_handle(model["id"]), ) ) @@ -259,7 +263,7 @@ def list_llm_models(self) -> List[LLMConfig]: model_endpoint=self.base_url, model_wrapper=self.default_prompt_formatter, context_window=context_window, - handle=self.get_handle(model["name"]) + handle=self.get_handle(model["name"]), ) ) return configs @@ -335,7 +339,7 @@ def list_embedding_models(self) -> List[EmbeddingConfig]: embedding_endpoint=self.base_url, embedding_dim=embedding_dim, embedding_chunk_size=300, - handle=self.get_handle(model["name"]) + handle=self.get_handle(model["name"]), ) ) return configs @@ -356,7 +360,11 @@ def list_llm_models(self) -> List[LLMConfig]: continue configs.append( LLMConfig( - model=model["id"], model_endpoint_type="groq", model_endpoint=self.base_url, context_window=model["context_window"], handle=self.get_handle(model["id"]) + model=model["id"], + model_endpoint_type="groq", + model_endpoint=self.base_url, + context_window=model["context_window"], + handle=self.get_handle(model["id"]), ) ) return configs @@ -424,7 +432,7 @@ def list_llm_models(self) -> List[LLMConfig]: model_endpoint=self.base_url, model_wrapper=self.default_prompt_formatter, context_window=context_window_size, - handle=self.get_handle(model_name) + handle=self.get_handle(model_name), ) ) @@ -505,7 +513,7 @@ def list_llm_models(self): model_endpoint_type="google_ai", model_endpoint=self.base_url, context_window=self.get_model_context_window(model), - handle=self.get_handle(model) + handle=self.get_handle(model), ) ) return configs @@ -529,7 +537,7 @@ def list_embedding_models(self): embedding_endpoint=self.base_url, embedding_dim=768, embedding_chunk_size=300, # NOTE: max is 2048 - handle=self.get_handle(model) + handle=self.get_handle(model), ) ) return configs @@ -570,7 +578,8 @@ def list_llm_models(self) -> List[LLMConfig]: context_window_size = self.get_model_context_window(model_name) model_endpoint = get_azure_chat_completions_endpoint(self.base_url, model_name, self.api_version) configs.append( - LLMConfig(model=model_name, model_endpoint_type="azure", model_endpoint=model_endpoint, context_window=context_window_size), handle=self.get_handle(model_name) + LLMConfig(model=model_name, model_endpoint_type="azure", model_endpoint=model_endpoint, context_window=context_window_size), + handle=self.get_handle(model_name), ) return configs @@ -591,7 +600,7 @@ def list_embedding_models(self) -> List[EmbeddingConfig]: embedding_endpoint=model_endpoint, embedding_dim=768, embedding_chunk_size=300, # NOTE: max is 2048 - handle=self.get_handle(model_name) + handle=self.get_handle(model_name), ) ) return configs @@ -625,7 +634,7 @@ def list_llm_models(self) -> List[LLMConfig]: model_endpoint_type="openai", model_endpoint=self.base_url, context_window=model["max_model_len"], - handle=self.get_handle(model["id"]) + handle=self.get_handle(model["id"]), ) ) return configs @@ -658,7 +667,7 @@ def list_llm_models(self) -> List[LLMConfig]: model_endpoint=self.base_url, model_wrapper=self.default_prompt_formatter, context_window=model["max_model_len"], - handle=self.get_handle(model["id"]) + handle=self.get_handle(model["id"]), ) ) return configs diff --git a/letta/schemas/agent.py b/letta/schemas/agent.py index 03d40350e1..06fe586000 100644 --- a/letta/schemas/agent.py +++ b/letta/schemas/agent.py @@ -1,8 +1,6 @@ from enum import Enum from typing import Dict, List, Optional -from pydantic import BaseModel, Field, field_validator - from letta.constants import DEFAULT_EMBEDDING_CHUNK_SIZE from letta.schemas.block import CreateBlock from letta.schemas.embedding_config import EmbeddingConfig @@ -15,6 +13,7 @@ from letta.schemas.tool import Tool from letta.schemas.tool_rule import ToolRule from letta.utils import create_random_username +from pydantic import BaseModel, Field, field_validator class AgentType(str, Enum): diff --git a/letta/schemas/block.py b/letta/schemas/block.py index 25e84b7da6..bd905bd2d9 100644 --- a/letta/schemas/block.py +++ b/letta/schemas/block.py @@ -1,10 +1,9 @@ from typing import Optional -from pydantic import BaseModel, Field, model_validator -from typing_extensions import Self - from letta.constants import CORE_MEMORY_BLOCK_CHAR_LIMIT from letta.schemas.letta_base import LettaBase +from pydantic import BaseModel, Field, model_validator +from typing_extensions import Self # block of the LLM context diff --git a/letta/schemas/file.py b/letta/schemas/file.py index b43eb64c38..0671bc3ebf 100644 --- a/letta/schemas/file.py +++ b/letta/schemas/file.py @@ -1,9 +1,8 @@ from datetime import datetime from typing import Optional -from pydantic import Field - from letta.schemas.letta_base import LettaBase +from pydantic import Field class FileMetadataBase(LettaBase): diff --git a/letta/schemas/job.py b/letta/schemas/job.py index 17c2b98dad..b767b56718 100644 --- a/letta/schemas/job.py +++ b/letta/schemas/job.py @@ -1,10 +1,9 @@ from datetime import datetime from typing import Optional -from pydantic import Field - from letta.schemas.enums import JobStatus from letta.schemas.letta_base import OrmMetadataBase +from pydantic import Field class JobBase(OrmMetadataBase): diff --git a/letta/schemas/letta_request.py b/letta/schemas/letta_request.py index 123d817cf2..73f956ff52 100644 --- a/letta/schemas/letta_request.py +++ b/letta/schemas/letta_request.py @@ -1,9 +1,8 @@ from typing import List -from pydantic import BaseModel, Field - from letta.constants import DEFAULT_MESSAGE_TOOL, DEFAULT_MESSAGE_TOOL_KWARG from letta.schemas.message import MessageCreate +from pydantic import BaseModel, Field class LettaRequest(BaseModel): diff --git a/letta/schemas/letta_response.py b/letta/schemas/letta_response.py index c6a1e8be58..7084c3ba09 100644 --- a/letta/schemas/letta_response.py +++ b/letta/schemas/letta_response.py @@ -3,12 +3,11 @@ import re from typing import List, Union -from pydantic import BaseModel, Field - from letta.schemas.enums import MessageStreamStatus from letta.schemas.letta_message import LettaMessage, LettaMessageUnion from letta.schemas.usage import LettaUsageStatistics from letta.utils import json_dumps +from pydantic import BaseModel, Field # TODO: consider moving into own file diff --git a/letta/schemas/message.py b/letta/schemas/message.py index 74bb813567..24022ece55 100644 --- a/letta/schemas/message.py +++ b/letta/schemas/message.py @@ -4,8 +4,6 @@ from datetime import datetime, timezone from typing import List, Literal, Optional -from pydantic import BaseModel, Field, field_validator - from letta.constants import ( DEFAULT_MESSAGE_TOOL, DEFAULT_MESSAGE_TOOL_KWARG, @@ -16,16 +14,15 @@ from letta.schemas.letta_base import OrmMetadataBase from letta.schemas.letta_message import ( AssistantMessage, - ToolCall as LettaToolCall, - ToolCallMessage, - ToolReturnMessage, - ReasoningMessage, LettaMessage, + ReasoningMessage, SystemMessage, - UserMessage, ) +from letta.schemas.letta_message import ToolCall as LettaToolCall +from letta.schemas.letta_message import ToolCallMessage, ToolReturnMessage, UserMessage from letta.schemas.openai.chat_completions import ToolCall, ToolCallFunction from letta.utils import get_utc_time, is_utc_datetime, json_dumps +from pydantic import BaseModel, Field, field_validator def add_inner_thoughts_to_tool_call( diff --git a/letta/schemas/organization.py b/letta/schemas/organization.py index 35784ad0db..6220b987a8 100644 --- a/letta/schemas/organization.py +++ b/letta/schemas/organization.py @@ -1,10 +1,9 @@ from datetime import datetime from typing import Optional -from pydantic import Field - from letta.schemas.letta_base import LettaBase from letta.utils import create_random_username, get_utc_time +from pydantic import Field class OrganizationBase(LettaBase): diff --git a/letta/schemas/passage.py b/letta/schemas/passage.py index c1ec13bec4..c613c2e1b1 100644 --- a/letta/schemas/passage.py +++ b/letta/schemas/passage.py @@ -1,12 +1,11 @@ from datetime import datetime from typing import Dict, List, Optional -from pydantic import Field, field_validator - from letta.constants import MAX_EMBEDDING_DIM from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.letta_base import OrmMetadataBase from letta.utils import get_utc_time +from pydantic import Field, field_validator class PassageBase(OrmMetadataBase): diff --git a/letta/schemas/sandbox_config.py b/letta/schemas/sandbox_config.py index f86233fae4..993711cc50 100644 --- a/letta/schemas/sandbox_config.py +++ b/letta/schemas/sandbox_config.py @@ -3,11 +3,10 @@ from enum import Enum from typing import Any, Dict, List, Literal, Optional, Union -from pydantic import BaseModel, Field, model_validator - from letta.schemas.agent import AgentState from letta.schemas.letta_base import LettaBase, OrmMetadataBase from letta.settings import tool_settings +from pydantic import BaseModel, Field, model_validator # Sandbox Config diff --git a/letta/schemas/source.py b/letta/schemas/source.py index 0a458dfded..d6a14d79f5 100644 --- a/letta/schemas/source.py +++ b/letta/schemas/source.py @@ -1,10 +1,9 @@ from datetime import datetime from typing import Optional -from pydantic import Field - from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.letta_base import LettaBase +from pydantic import Field class BaseSource(LettaBase): diff --git a/letta/schemas/tool.py b/letta/schemas/tool.py index 997965ab5e..2837ee7fec 100644 --- a/letta/schemas/tool.py +++ b/letta/schemas/tool.py @@ -1,7 +1,5 @@ from typing import Dict, List, Optional -from pydantic import Field, model_validator - from letta.constants import FUNCTION_RETURN_CHAR_LIMIT from letta.functions.functions import derive_openai_json_schema from letta.functions.helpers import ( @@ -11,6 +9,7 @@ from letta.functions.schema_generator import generate_schema_from_args_schema_v2 from letta.schemas.letta_base import LettaBase from letta.schemas.openai.chat_completions import ToolCall +from pydantic import Field, model_validator class BaseTool(LettaBase): diff --git a/letta/schemas/tool_rule.py b/letta/schemas/tool_rule.py index 259e5452dc..e88ff2904d 100644 --- a/letta/schemas/tool_rule.py +++ b/letta/schemas/tool_rule.py @@ -1,9 +1,8 @@ from typing import Any, Dict, List, Optional, Union -from pydantic import Field - from letta.schemas.enums import ToolRuleType from letta.schemas.letta_base import LettaBase +from pydantic import Field class BaseToolRule(LettaBase): @@ -25,6 +24,7 @@ class ConditionalToolRule(BaseToolRule): """ A ToolRule that conditionally maps to different child tools based on the output. """ + type: ToolRuleType = ToolRuleType.conditional default_child: Optional[str] = Field(None, description="The default child tool to be called. If None, any tool can be called.") child_output_mapping: Dict[Any, str] = Field(..., description="The output case to check for mapping") diff --git a/letta/schemas/usage.py b/letta/schemas/usage.py index 53cda8b25a..d317cc5b12 100644 --- a/letta/schemas/usage.py +++ b/letta/schemas/usage.py @@ -1,4 +1,5 @@ from typing import Literal + from pydantic import BaseModel, Field @@ -12,6 +13,7 @@ class LettaUsageStatistics(BaseModel): total_tokens (int): The total number of tokens processed by the agent. step_count (int): The number of steps taken by the agent. """ + message_type: Literal["usage_statistics"] = "usage_statistics" completion_tokens: int = Field(0, description="The number of tokens generated by the agent.") prompt_tokens: int = Field(0, description="The number of tokens in the prompt.") diff --git a/letta/schemas/user.py b/letta/schemas/user.py index 59a4594e07..b2bcb93377 100644 --- a/letta/schemas/user.py +++ b/letta/schemas/user.py @@ -1,10 +1,9 @@ from datetime import datetime from typing import Optional -from pydantic import Field - from letta.schemas.letta_base import LettaBase from letta.services.organization_manager import OrganizationManager +from pydantic import Field class UserBase(LettaBase): diff --git a/letta/server/rest_api/app.py b/letta/server/rest_api/app.py index 8cb9b27e64..425d9bad7f 100644 --- a/letta/server/rest_api/app.py +++ b/letta/server/rest_api/app.py @@ -8,9 +8,6 @@ import uvicorn from fastapi import FastAPI, Request from fastapi.responses import JSONResponse -from starlette.middleware.base import BaseHTTPMiddleware -from starlette.middleware.cors import CORSMiddleware - from letta.__init__ import __version__ from letta.constants import ADMIN_PREFIX, API_PREFIX, OPENAI_API_PREFIX from letta.errors import LettaAgentNotFoundError, LettaUserNotFoundError @@ -47,6 +44,8 @@ from letta.server.rest_api.static_files import mount_static_files from letta.server.server import SyncServer from letta.settings import settings +from starlette.middleware.base import BaseHTTPMiddleware +from starlette.middleware.cors import CORSMiddleware # TODO(ethan) # NOTE(charles): @ethan I had to add this to get the global as the bottom to work diff --git a/letta/server/rest_api/auth/index.py b/letta/server/rest_api/auth/index.py index 28d22435b4..7a29f6b4e7 100644 --- a/letta/server/rest_api/auth/index.py +++ b/letta/server/rest_api/auth/index.py @@ -2,11 +2,10 @@ from uuid import UUID from fastapi import APIRouter -from pydantic import BaseModel, Field - from letta.log import get_logger from letta.server.rest_api.interface import QueuingInterface from letta.server.server import SyncServer +from pydantic import BaseModel, Field logger = get_logger(__name__) router = APIRouter() diff --git a/letta/server/rest_api/auth_token.py b/letta/server/rest_api/auth_token.py index 40e26d805e..72387bbdb6 100644 --- a/letta/server/rest_api/auth_token.py +++ b/letta/server/rest_api/auth_token.py @@ -2,7 +2,6 @@ from fastapi import Depends, HTTPException from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer - from letta.server.server import SyncServer security = HTTPBearer() diff --git a/letta/server/rest_api/interface.py b/letta/server/rest_api/interface.py index 1e68ce6e2d..ba06e1d6a5 100644 --- a/letta/server/rest_api/interface.py +++ b/letta/server/rest_api/interface.py @@ -12,14 +12,14 @@ from letta.schemas.enums import MessageStreamStatus from letta.schemas.letta_message import ( AssistantMessage, + LegacyFunctionCallMessage, + LegacyLettaMessage, + LettaMessage, + ReasoningMessage, ToolCall, ToolCallDelta, ToolCallMessage, ToolReturnMessage, - ReasoningMessage, - LegacyFunctionCallMessage, - LegacyLettaMessage, - LettaMessage, ) from letta.schemas.message import Message from letta.schemas.openai.chat_completion_response import ChatCompletionChunkResponse diff --git a/letta/server/rest_api/routers/openai/assistants/assistants.py b/letta/server/rest_api/routers/openai/assistants/assistants.py index 2b646f931c..59e57cdfe4 100644 --- a/letta/server/rest_api/routers/openai/assistants/assistants.py +++ b/letta/server/rest_api/routers/openai/assistants/assistants.py @@ -1,7 +1,6 @@ from typing import List from fastapi import APIRouter, Body, HTTPException, Path, Query - from letta.constants import DEFAULT_PRESET from letta.schemas.openai.openai import AssistantFile, OpenAIAssistant from letta.server.rest_api.routers.openai.assistants.schemas import ( diff --git a/letta/server/rest_api/routers/openai/assistants/schemas.py b/letta/server/rest_api/routers/openai/assistants/schemas.py index b3cbf389c5..5a6649ebea 100644 --- a/letta/server/rest_api/routers/openai/assistants/schemas.py +++ b/letta/server/rest_api/routers/openai/assistants/schemas.py @@ -1,7 +1,5 @@ from typing import List, Optional -from pydantic import BaseModel, Field - from letta.schemas.openai.openai import ( MessageRoleType, OpenAIMessage, @@ -9,6 +7,7 @@ ToolCall, ToolCallOutput, ) +from pydantic import BaseModel, Field class CreateAssistantRequest(BaseModel): diff --git a/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py b/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py index deabcaf5c5..72b647db0d 100644 --- a/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py +++ b/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py @@ -2,9 +2,8 @@ from typing import TYPE_CHECKING, Optional from fastapi import APIRouter, Body, Depends, Header, HTTPException - from letta.schemas.enums import MessageRole -from letta.schemas.letta_message import ToolCall, LettaMessage +from letta.schemas.letta_message import LettaMessage, ToolCall from letta.schemas.openai.chat_completion_request import ChatCompletionRequest from letta.schemas.openai.chat_completion_response import ( ChatCompletionResponse, diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index 405ab1cf17..a69c4fce90 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -14,8 +14,6 @@ status, ) from fastapi.responses import JSONResponse, StreamingResponse -from pydantic import Field - from letta.constants import DEFAULT_MESSAGE_TOOL, DEFAULT_MESSAGE_TOOL_KWARG from letta.log import get_logger from letta.orm.errors import NoResultFound @@ -49,6 +47,7 @@ from letta.server.rest_api.interface import StreamingServerInterface from letta.server.rest_api.utils import get_letta_server, sse_async_generator from letta.server.server import SyncServer +from pydantic import Field # These can be forward refs, but because Fastapi needs them at runtime the must be imported normally diff --git a/letta/server/rest_api/routers/v1/blocks.py b/letta/server/rest_api/routers/v1/blocks.py index d921323343..9d2a937d18 100644 --- a/letta/server/rest_api/routers/v1/blocks.py +++ b/letta/server/rest_api/routers/v1/blocks.py @@ -1,7 +1,6 @@ from typing import TYPE_CHECKING, List, Optional from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query, Response - from letta.orm.errors import NoResultFound from letta.schemas.block import Block, BlockUpdate, CreateBlock from letta.server.rest_api.utils import get_letta_server diff --git a/letta/server/rest_api/routers/v1/health.py b/letta/server/rest_api/routers/v1/health.py index 99fce66d4e..81bb41e058 100644 --- a/letta/server/rest_api/routers/v1/health.py +++ b/letta/server/rest_api/routers/v1/health.py @@ -1,7 +1,6 @@ from typing import TYPE_CHECKING from fastapi import APIRouter - from letta.cli.cli import version from letta.schemas.health import Health diff --git a/letta/server/rest_api/routers/v1/jobs.py b/letta/server/rest_api/routers/v1/jobs.py index 4245d2f989..bec226251c 100644 --- a/letta/server/rest_api/routers/v1/jobs.py +++ b/letta/server/rest_api/routers/v1/jobs.py @@ -1,7 +1,6 @@ from typing import List, Optional from fastapi import APIRouter, Depends, Header, HTTPException, Query - from letta.orm.errors import NoResultFound from letta.schemas.enums import JobStatus from letta.schemas.job import Job diff --git a/letta/server/rest_api/routers/v1/llms.py b/letta/server/rest_api/routers/v1/llms.py index 4536ae4981..f0bf9f425a 100644 --- a/letta/server/rest_api/routers/v1/llms.py +++ b/letta/server/rest_api/routers/v1/llms.py @@ -1,7 +1,6 @@ from typing import TYPE_CHECKING, List from fastapi import APIRouter, Depends - from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.llm_config import LLMConfig from letta.server.rest_api.utils import get_letta_server diff --git a/letta/server/rest_api/routers/v1/organizations.py b/letta/server/rest_api/routers/v1/organizations.py index 2f4cdb1b51..8fbead6d9f 100644 --- a/letta/server/rest_api/routers/v1/organizations.py +++ b/letta/server/rest_api/routers/v1/organizations.py @@ -1,7 +1,6 @@ from typing import TYPE_CHECKING, List, Optional from fastapi import APIRouter, Body, Depends, HTTPException, Query - from letta.schemas.organization import Organization, OrganizationCreate from letta.server.rest_api.utils import get_letta_server diff --git a/letta/server/rest_api/routers/v1/sandbox_configs.py b/letta/server/rest_api/routers/v1/sandbox_configs.py index bf06bae740..17dcbb4f3a 100644 --- a/letta/server/rest_api/routers/v1/sandbox_configs.py +++ b/letta/server/rest_api/routers/v1/sandbox_configs.py @@ -1,7 +1,6 @@ from typing import List, Optional from fastapi import APIRouter, Depends, Query - from letta.schemas.sandbox_config import SandboxConfig as PydanticSandboxConfig from letta.schemas.sandbox_config import SandboxConfigCreate, SandboxConfigUpdate from letta.schemas.sandbox_config import SandboxEnvironmentVariable as PydanticEnvVar diff --git a/letta/server/rest_api/routers/v1/sources.py b/letta/server/rest_api/routers/v1/sources.py index fb48d125ca..c51fee687a 100644 --- a/letta/server/rest_api/routers/v1/sources.py +++ b/letta/server/rest_api/routers/v1/sources.py @@ -11,7 +11,6 @@ Query, UploadFile, ) - from letta.schemas.file import FileMetadata from letta.schemas.job import Job from letta.schemas.passage import Passage diff --git a/letta/server/rest_api/routers/v1/tools.py b/letta/server/rest_api/routers/v1/tools.py index ffc2b2124c..bb297a36e2 100644 --- a/letta/server/rest_api/routers/v1/tools.py +++ b/letta/server/rest_api/routers/v1/tools.py @@ -6,7 +6,6 @@ from composio.exceptions import ApiKeyNotProvidedError, ComposioSDKError from composio.tools.base.abs import InvalidClassDefinition from fastapi import APIRouter, Body, Depends, Header, HTTPException - from letta.errors import LettaToolCreateError from letta.orm.errors import UniqueConstraintViolationError from letta.schemas.letta_message import ToolReturnMessage diff --git a/letta/server/rest_api/routers/v1/users.py b/letta/server/rest_api/routers/v1/users.py index 27a2feeb03..2dfeb06b10 100644 --- a/letta/server/rest_api/routers/v1/users.py +++ b/letta/server/rest_api/routers/v1/users.py @@ -1,7 +1,6 @@ from typing import TYPE_CHECKING, List, Optional from fastapi import APIRouter, Body, Depends, HTTPException, Query - from letta.schemas.user import User, UserCreate, UserUpdate from letta.server.rest_api.utils import get_letta_server diff --git a/letta/server/rest_api/utils.py b/letta/server/rest_api/utils.py index 86a8899043..650f0e3e49 100644 --- a/letta/server/rest_api/utils.py +++ b/letta/server/rest_api/utils.py @@ -6,12 +6,11 @@ from typing import AsyncGenerator, Optional, Union from fastapi import Header -from pydantic import BaseModel - from letta.errors import ContextWindowExceededError, RateLimitExceededError from letta.schemas.usage import LettaUsageStatistics from letta.server.rest_api.interface import StreamingServerInterface from letta.server.server import SyncServer +from pydantic import BaseModel # from letta.orm.user import User # from letta.orm.utilities import get_db_session @@ -102,6 +101,7 @@ def get_user_id(user_id: Optional[str] = Header(None, alias="user_id")) -> Optio def get_current_interface() -> StreamingServerInterface: return StreamingServerInterface + def log_error_to_sentry(e): import traceback diff --git a/letta/server/server.py b/letta/server/server.py index 85aee52b2c..17bc5771b2 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -7,13 +7,12 @@ from datetime import datetime from typing import Callable, List, Optional, Tuple, Union -from composio.client import Composio -from composio.client.collections import ActionModel, AppModel -from fastapi import HTTPException - import letta.constants as constants import letta.server.utils as server_utils import letta.system as system +from composio.client import Composio +from composio.client.collections import ActionModel, AppModel +from fastapi import HTTPException from letta.agent import Agent, save_agent from letta.chat_only_agent import ChatOnlyAgent from letta.credentials import LettaCredentials @@ -139,17 +138,16 @@ def run_command(self, user_id: str, agent_id: str, command: str) -> Union[str, N from contextlib import contextmanager +from letta.config import LettaConfig + +# NOTE: hack to see if single session management works +from letta.settings import model_settings, settings, tool_settings from rich.console import Console from rich.panel import Panel from rich.text import Text from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker -from letta.config import LettaConfig - -# NOTE: hack to see if single session management works -from letta.settings import model_settings, settings, tool_settings - config = LettaConfig.load() diff --git a/letta/server/ws_api/example_client.py b/letta/server/ws_api/example_client.py index a7fc57b524..fdfdd66059 100644 --- a/letta/server/ws_api/example_client.py +++ b/letta/server/ws_api/example_client.py @@ -1,8 +1,7 @@ import asyncio -import websockets - import letta.server.ws_api.protocol as protocol +import websockets from letta.server.constants import WS_CLIENT_TIMEOUT, WS_DEFAULT_PORT from letta.server.utils import condition_to_stop_receiving, print_server_response diff --git a/letta/server/ws_api/server.py b/letta/server/ws_api/server.py index e2408ddaa6..b3dcc2ba1e 100644 --- a/letta/server/ws_api/server.py +++ b/letta/server/ws_api/server.py @@ -3,9 +3,8 @@ import sys import traceback -import websockets - import letta.server.ws_api.protocol as protocol +import websockets from letta.server.constants import WS_DEFAULT_PORT from letta.server.server import SyncServer from letta.server.ws_api.interface import SyncWebSocketInterface diff --git a/letta/services/agent_manager.py b/letta/services/agent_manager.py index 4e6b80ec5b..b1040f3130 100644 --- a/letta/services/agent_manager.py +++ b/letta/services/agent_manager.py @@ -2,8 +2,6 @@ from typing import Dict, List, Optional import numpy as np -from sqlalchemy import Select, func, literal, select, union_all - from letta.constants import BASE_MEMORY_TOOLS, BASE_TOOLS, MAX_EMBEDDING_DIM from letta.embeddings import embedding_model from letta.log import get_logger @@ -40,6 +38,7 @@ from letta.services.tool_manager import ToolManager from letta.settings import settings from letta.utils import enforce_types, get_utc_time, united_diff +from sqlalchemy import Select, func, literal, select, union_all logger = get_logger(__name__) diff --git a/letta/services/passage_manager.py b/letta/services/passage_manager.py index d8554063b3..f80e016023 100644 --- a/letta/services/passage_manager.py +++ b/letta/services/passage_manager.py @@ -1,21 +1,15 @@ -from typing import List, Optional from datetime import datetime -import numpy as np - -from sqlalchemy import select, union_all, literal +from typing import List, Optional -from letta.constants import MAX_EMBEDDING_DIM from letta.embeddings import embedding_model, parse_and_chunk_text from letta.orm.errors import NoResultFound from letta.orm.passage import AgentPassage, SourcePassage from letta.schemas.agent import AgentState -from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.passage import Passage as PydanticPassage from letta.schemas.user import User as PydanticUser from letta.utils import enforce_types - class PassageManager: """Manager class to handle business logic related to Passages.""" diff --git a/letta/settings.py b/letta/settings.py index 1b6ba44bbe..3b9af80187 100644 --- a/letta/settings.py +++ b/letta/settings.py @@ -1,11 +1,10 @@ from pathlib import Path from typing import Optional +from letta.local_llm.constants import DEFAULT_WRAPPER_NAME from pydantic import Field from pydantic_settings import BaseSettings, SettingsConfigDict -from letta.local_llm.constants import DEFAULT_WRAPPER_NAME - class ToolSettings(BaseSettings): composio_api_key: Optional[str] = None diff --git a/letta/streaming_interface.py b/letta/streaming_interface.py index e21e5e73e1..f798653094 100644 --- a/letta/streaming_interface.py +++ b/letta/streaming_interface.py @@ -3,11 +3,6 @@ from datetime import datetime from typing import List, Optional -# from colorama import Fore, Style, init -from rich.console import Console -from rich.live import Live -from rich.markup import escape - from letta.interface import CLIInterface from letta.local_llm.constants import ( ASSISTANT_MESSAGE_CLI_SYMBOL, @@ -19,6 +14,11 @@ ChatCompletionResponse, ) +# from colorama import Fore, Style, init +from rich.console import Console +from rich.live import Live +from rich.markup import escape + # init(autoreset=True) # DEBUG = True # puts full message outputs in the terminal diff --git a/letta/utils.py b/letta/utils.py index 4be8a543fb..f801596447 100644 --- a/letta/utils.py +++ b/letta/utils.py @@ -19,11 +19,9 @@ from urllib.parse import urljoin, urlparse import demjson3 as demjson +import letta import pytz import tiktoken -from pathvalidate import sanitize_filename as pathvalidate_sanitize_filename - -import letta from letta.constants import ( CLI_WARNING_PREFIX, CORE_MEMORY_HUMAN_CHAR_LIMIT, @@ -34,6 +32,7 @@ TOOL_CALL_ID_MAX_LEN, ) from letta.schemas.openai.chat_completion_response import ChatCompletionResponse +from pathvalidate import sanitize_filename as pathvalidate_sanitize_filename DEBUG = False if "LOG_LEVEL" in os.environ: @@ -1120,6 +1119,7 @@ def sanitize_filename(filename: str) -> str: # Return the sanitized filename return sanitized_filename + def get_friendly_error_msg(function_name: str, exception_name: str, exception_message: str): from letta.constants import MAX_ERROR_MESSAGE_CHAR_LIMIT diff --git a/locust_test.py b/locust_test.py index 570e6eef47..bf32fb4896 100644 --- a/locust_test.py +++ b/locust_test.py @@ -1,8 +1,6 @@ import random import string -from locust import HttpUser, between, task - from letta.constants import BASE_TOOLS, DEFAULT_HUMAN, DEFAULT_PERSONA from letta.schemas.agent import AgentState, CreateAgent from letta.schemas.letta_request import LettaRequest @@ -10,6 +8,7 @@ from letta.schemas.memory import ChatMemory from letta.schemas.message import MessageCreate, MessageRole from letta.utils import get_human_text, get_persona_text +from locust import HttpUser, between, task class LettaUser(HttpUser): diff --git a/paper_experiments/doc_qa_task/doc_qa.py b/paper_experiments/doc_qa_task/doc_qa.py index e07060d1a5..205fa0d016 100644 --- a/paper_experiments/doc_qa_task/doc_qa.py +++ b/paper_experiments/doc_qa_task/doc_qa.py @@ -23,9 +23,6 @@ from typing import List from icml_experiments.utils import get_experiment_config, load_gzipped_file -from openai import OpenAI -from tqdm import tqdm - from letta import utils from letta.agent_store.storage import StorageConnector, TableType from letta.cli.cli_config import delete @@ -33,6 +30,8 @@ from letta.credentials import LettaCredentials from letta.embeddings import embedding_model from letta.utils import count_tokens +from openai import OpenAI +from tqdm import tqdm DATA_SOURCE_NAME = "wikipedia" DOC_QA_PERSONA = "You are Letta DOC-QA bot. Your job is to answer questions about documents that are stored in your archival memory. The answer to the users question will ALWAYS be in your archival memory, so remember to keep searching if you can't find the answer. Answer the questions as if though the year is 2018." # TODO decide on a good persona/human diff --git a/paper_experiments/doc_qa_task/llm_judge_doc_qa.py b/paper_experiments/doc_qa_task/llm_judge_doc_qa.py index c6ff6cfee5..18d907a369 100644 --- a/paper_experiments/doc_qa_task/llm_judge_doc_qa.py +++ b/paper_experiments/doc_qa_task/llm_judge_doc_qa.py @@ -2,11 +2,10 @@ import json import re +from letta.credentials import LettaCredentials from openai import OpenAI from tqdm import tqdm -from letta.credentials import LettaCredentials - # Note: did not end up using since no cases of cheating were observed # CHEATING_PROMPT = \ # """ diff --git a/paper_experiments/doc_qa_task/load_wikipedia_embeddings.py b/paper_experiments/doc_qa_task/load_wikipedia_embeddings.py index 94b9814376..e80e7e9bcc 100644 --- a/paper_experiments/doc_qa_task/load_wikipedia_embeddings.py +++ b/paper_experiments/doc_qa_task/load_wikipedia_embeddings.py @@ -8,11 +8,10 @@ from absl import app, flags from icml_experiments.utils import get_experiment_config -from tqdm import tqdm - from letta.agent_store.storage import StorageConnector, TableType from letta.cli.cli_config import delete from letta.data_types import Passage +from tqdm import tqdm # Create an empty list to store the JSON objects source_name = "wikipedia" diff --git a/paper_experiments/nested_kv_task/nested_kv.py b/paper_experiments/nested_kv_task/nested_kv.py index 04c95ac548..64fa06a26a 100644 --- a/paper_experiments/nested_kv_task/nested_kv.py +++ b/paper_experiments/nested_kv_task/nested_kv.py @@ -29,11 +29,10 @@ import openai from icml_experiments.utils import get_experiment_config, load_gzipped_file -from tqdm import tqdm - from letta import utils from letta.cli.cli_config import delete from letta.config import LettaConfig +from tqdm import tqdm # TODO: update personas NESTED_PERSONA = "You are Letta DOC-QA bot. Your job is to answer questions about documents that are stored in your archival memory. The answer to the users question will ALWAYS be in your archival memory, so remember to keep searching if you can't find the answer. DO NOT STOP SEARCHING UNTIL YOU VERIFY THAT THE VALUE IS NOT A KEY. Do not stop making nested lookups until this condition is met." # TODO decide on a good persona/human diff --git a/scripts/migrate_tools.py b/scripts/migrate_tools.py index 53578c690e..91e16071eb 100644 --- a/scripts/migrate_tools.py +++ b/scripts/migrate_tools.py @@ -1,8 +1,7 @@ -from tqdm import tqdm - from letta.schemas.user import User from letta.services.organization_manager import OrganizationManager from letta.services.tool_manager import ToolManager +from tqdm import tqdm def deprecated_tool(): diff --git a/tests/integration_test_agent_tool_graph.py b/tests/integration_test_agent_tool_graph.py index 44aad0d077..289b023a58 100644 --- a/tests/integration_test_agent_tool_graph.py +++ b/tests/integration_test_agent_tool_graph.py @@ -194,16 +194,13 @@ def test_check_tool_rules_with_different_models(mock_e2b_api_key_none): "tests/configs/llm_model_configs/openai-gpt-3.5-turbo.json", "tests/configs/llm_model_configs/openai-gpt-4o.json", ] - + # Create two test tools t1_name = "first_secret_word" t2_name = "second_secret_word" t1 = client.create_or_update_tool(first_secret_word, name=t1_name) t2 = client.create_or_update_tool(second_secret_word, name=t2_name) - tool_rules = [ - InitToolRule(tool_name=t1_name), - InitToolRule(tool_name=t2_name) - ] + tool_rules = [InitToolRule(tool_name=t1_name), InitToolRule(tool_name=t2_name)] tools = [t1, t2] for config_file in config_files: @@ -212,34 +209,26 @@ def test_check_tool_rules_with_different_models(mock_e2b_api_key_none): if "gpt-4o" in config_file: # Structured output model (should work with multiple init tools) - agent_state = setup_agent(client, config_file, agent_uuid=agent_uuid, - tool_ids=[t.id for t in tools], - tool_rules=tool_rules) + agent_state = setup_agent(client, config_file, agent_uuid=agent_uuid, tool_ids=[t.id for t in tools], tool_rules=tool_rules) assert agent_state is not None else: # Non-structured output model (should raise error with multiple init tools) with pytest.raises(ValueError, match="Multiple initial tools are not supported for non-structured models"): - setup_agent(client, config_file, agent_uuid=agent_uuid, - tool_ids=[t.id for t in tools], - tool_rules=tool_rules) - + setup_agent(client, config_file, agent_uuid=agent_uuid, tool_ids=[t.id for t in tools], tool_rules=tool_rules) + # Cleanup cleanup(client=client, agent_uuid=agent_uuid) # Create tool rule with single initial tool t3_name = "third_secret_word" t3 = client.create_or_update_tool(third_secret_word, name=t3_name) - tool_rules = [ - InitToolRule(tool_name=t3_name) - ] + tool_rules = [InitToolRule(tool_name=t3_name)] tools = [t3] for config_file in config_files: agent_uuid = str(uuid.uuid4()) # Structured output model (should work with single init tool) - agent_state = setup_agent(client, config_file, agent_uuid=agent_uuid, - tool_ids=[t.id for t in tools], - tool_rules=tool_rules) + agent_state = setup_agent(client, config_file, agent_uuid=agent_uuid, tool_ids=[t.id for t in tools], tool_rules=tool_rules) assert agent_state is not None cleanup(client=client, agent_uuid=agent_uuid) @@ -257,7 +246,7 @@ def test_claude_initial_tool_rule_enforced(mock_e2b_api_key_none): tool_rules = [ InitToolRule(tool_name=t1_name), ChildToolRule(tool_name=t1_name, children=[t2_name]), - TerminalToolRule(tool_name=t2_name) + TerminalToolRule(tool_name=t2_name), ] tools = [t1, t2] @@ -265,7 +254,9 @@ def test_claude_initial_tool_rule_enforced(mock_e2b_api_key_none): anthropic_config_file = "tests/configs/llm_model_configs/claude-3-sonnet-20240229.json" for i in range(3): agent_uuid = str(uuid.uuid4()) - agent_state = setup_agent(client, anthropic_config_file, agent_uuid=agent_uuid, tool_ids=[t.id for t in tools], tool_rules=tool_rules) + agent_state = setup_agent( + client, anthropic_config_file, agent_uuid=agent_uuid, tool_ids=[t.id for t in tools], tool_rules=tool_rules + ) response = client.user_message(agent_id=agent_state.id, message="What is the second secret word?") assert_sanity_checks(response) @@ -289,9 +280,10 @@ def test_claude_initial_tool_rule_enforced(mock_e2b_api_key_none): # Implement exponential backoff with initial time of 10 seconds if i < 2: - backoff_time = 10 * (2 ** i) + backoff_time = 10 * (2**i) time.sleep(backoff_time) + @pytest.mark.timeout(60) # Sets a 60-second timeout for the test since this could loop infinitely def test_agent_no_structured_output_with_one_child_tool(mock_e2b_api_key_none): client = create_client() @@ -389,7 +381,7 @@ def test_agent_conditional_tool_easy(mock_e2b_api_key_none): default_child=coin_flip_name, child_output_mapping={ "hj2hwibbqm": secret_word_tool, - } + }, ), TerminalToolRule(tool_name=secret_word_tool), ] @@ -425,7 +417,6 @@ def test_agent_conditional_tool_easy(mock_e2b_api_key_none): cleanup(client=client, agent_uuid=agent_uuid) - @pytest.mark.timeout(90) # Longer timeout since this test has more steps def test_agent_conditional_tool_hard(mock_e2b_api_key_none): """ @@ -450,7 +441,7 @@ def test_agent_conditional_tool_hard(mock_e2b_api_key_none): final_tool = "fourth_secret_word" play_game_tool = client.create_or_update_tool(can_play_game, name=play_game) flip_coin_tool = client.create_or_update_tool(flip_coin_hard, name=coin_flip_name) - reveal_secret = client.create_or_update_tool(fourth_secret_word, name=final_tool) + reveal_secret = client.create_or_update_tool(fourth_secret_word, name=final_tool) # Make tool rules - chain them together with conditional rules tool_rules = [ @@ -458,16 +449,10 @@ def test_agent_conditional_tool_hard(mock_e2b_api_key_none): ConditionalToolRule( tool_name=play_game, default_child=play_game, # Keep trying if we can't play - child_output_mapping={ - True: coin_flip_name # Only allow access when can_play_game returns True - } + child_output_mapping={True: coin_flip_name}, # Only allow access when can_play_game returns True ), ConditionalToolRule( - tool_name=coin_flip_name, - default_child=coin_flip_name, - child_output_mapping={ - "hj2hwibbqm": final_tool, "START_OVER": play_game - } + tool_name=coin_flip_name, default_child=coin_flip_name, child_output_mapping={"hj2hwibbqm": final_tool, "START_OVER": play_game} ), TerminalToolRule(tool_name=final_tool), ] @@ -475,13 +460,7 @@ def test_agent_conditional_tool_hard(mock_e2b_api_key_none): # Setup agent with all tools tools = [play_game_tool, flip_coin_tool, reveal_secret] config_file = "tests/configs/llm_model_configs/claude-3-sonnet-20240229.json" - agent_state = setup_agent( - client, - config_file, - agent_uuid=agent_uuid, - tool_ids=[t.id for t in tools], - tool_rules=tool_rules - ) + agent_state = setup_agent(client, config_file, agent_uuid=agent_uuid, tool_ids=[t.id for t in tools], tool_rules=tool_rules) # Ask agent to try to get all secret words response = client.user_message(agent_id=agent_state.id, message="hi") @@ -520,7 +499,7 @@ def test_agent_conditional_tool_without_default_child(mock_e2b_api_key_none): Test the agent with a conditional tool that allows any child tool to be called if a function returns None. Tool Flow: - + return_none | v @@ -541,27 +520,16 @@ def test_agent_conditional_tool_without_default_child(mock_e2b_api_key_none): ConditionalToolRule( tool_name=tool_name, default_child=None, # Allow any tool to be called if output doesn't match - child_output_mapping={ - "anything but none": "first_secret_word" - } - ) + child_output_mapping={"anything but none": "first_secret_word"}, + ), ] tools = [tool, secret_word] # Setup agent with all tools - agent_state = setup_agent( - client, - config_file, - agent_uuid=agent_uuid, - tool_ids=[t.id for t in tools], - tool_rules=tool_rules - ) + agent_state = setup_agent(client, config_file, agent_uuid=agent_uuid, tool_ids=[t.id for t in tools], tool_rules=tool_rules) # Ask agent to try different tools based on the game output - response = client.user_message( - agent_id=agent_state.id, - message="call a function, any function. then call send_message" - ) + response = client.user_message(agent_id=agent_state.id, message="call a function, any function. then call send_message") # Make checks assert_sanity_checks(response) @@ -613,18 +581,14 @@ def test_agent_reload_remembers_function_response(mock_e2b_api_key_none): ConditionalToolRule( tool_name=flip_coin_name, default_child=flip_coin_name, # Allow any tool to be called if output doesn't match - child_output_mapping={ - "hj2hwibbqm": secret_word - } + child_output_mapping={"hj2hwibbqm": secret_word}, ), - TerminalToolRule(tool_name=secret_word) + TerminalToolRule(tool_name=secret_word), ] tools = [flip_coin_tool, secret_word_tool] # Setup initial agent - agent_state = setup_agent( - client, config_file, agent_uuid=agent_uuid, tool_ids=[t.id for t in tools], tool_rules=tool_rules - ) + agent_state = setup_agent(client, config_file, agent_uuid=agent_uuid, tool_ids=[t.id for t in tools], tool_rules=tool_rules) # Call flip_coin first response = client.user_message(agent_id=agent_state.id, message="flip a coin") @@ -643,4 +607,4 @@ def test_agent_reload_remembers_function_response(mock_e2b_api_key_none): assert reloaded_agent.last_function_response is not None print(f"Got successful response from client: \n\n{response}") - cleanup(client=client, agent_uuid=agent_uuid) \ No newline at end of file + cleanup(client=client, agent_uuid=agent_uuid) diff --git a/tests/integration_test_offline_memory_agent.py b/tests/integration_test_offline_memory_agent.py index 15d4161d5e..5803e82051 100644 --- a/tests/integration_test_offline_memory_agent.py +++ b/tests/integration_test_offline_memory_agent.py @@ -1,5 +1,4 @@ import pytest - from letta import BasicBlockMemory from letta.client.client import Block, create_client from letta.constants import DEFAULT_HUMAN, DEFAULT_PERSONA diff --git a/tests/integration_test_summarizer.py b/tests/integration_test_summarizer.py index b4de0043b4..ce6c41b254 100644 --- a/tests/integration_test_summarizer.py +++ b/tests/integration_test_summarizer.py @@ -4,7 +4,6 @@ from typing import List import pytest - from letta import create_client from letta.agent import Agent from letta.client.client import LocalClient diff --git a/tests/integration_test_tool_execution_sandbox.py b/tests/integration_test_tool_execution_sandbox.py index 299e1e967b..0938fdc871 100644 --- a/tests/integration_test_tool_execution_sandbox.py +++ b/tests/integration_test_tool_execution_sandbox.py @@ -5,8 +5,6 @@ from unittest.mock import patch import pytest -from sqlalchemy import delete - from letta import create_client from letta.functions.function_sets.base import core_memory_append, core_memory_replace from letta.orm import SandboxConfig, SandboxEnvironmentVariable @@ -31,6 +29,7 @@ from letta.services.tool_manager import ToolManager from letta.services.user_manager import UserManager from letta.settings import tool_settings +from sqlalchemy import delete from tests.helpers.utils import create_tool_from_func # Constants diff --git a/tests/test_base_functions.py b/tests/test_base_functions.py index 5b5bec6f4f..007d2bf9c5 100644 --- a/tests/test_base_functions.py +++ b/tests/test_base_functions.py @@ -1,6 +1,5 @@ -import pytest - import letta.functions.function_sets.base as base_functions +import pytest from letta import LocalClient, create_client from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.llm_config import LLMConfig diff --git a/tests/test_cli.py b/tests/test_cli.py index 7b2ffae107..54faa804a0 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -4,7 +4,6 @@ import pexpect import pytest - from letta.local_llm.constants import ( ASSISTANT_MESSAGE_CLI_SYMBOL, INNER_THOUGHTS_CLI_SYMBOL, diff --git a/tests/test_client.py b/tests/test_client.py index ac0f4f1876..71f7216c13 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -8,8 +8,6 @@ import pytest from dotenv import load_dotenv -from sqlalchemy import delete - from letta import LocalClient, RESTClient, create_client from letta.orm import SandboxConfig, SandboxEnvironmentVariable from letta.schemas.agent import AgentState @@ -20,6 +18,7 @@ from letta.schemas.llm_config import LLMConfig from letta.schemas.sandbox_config import LocalSandboxConfig, SandboxType from letta.utils import create_random_username +from sqlalchemy import delete # Constants SERVER_PORT = 8283 @@ -341,7 +340,9 @@ def test_messages(client: Union[LocalClient, RESTClient], agent: AgentState): def test_send_system_message(client: Union[LocalClient, RESTClient], agent: AgentState): """Important unit test since the Letta API exposes sending system messages, but some backends don't natively support it (eg Anthropic)""" - send_system_message_response = client.send_message(agent_id=agent.id, message="Event occurred: The user just logged off.", role="system") + send_system_message_response = client.send_message( + agent_id=agent.id, message="Event occurred: The user just logged off.", role="system" + ) assert send_system_message_response, "Sending message failed" @@ -390,7 +391,7 @@ def always_error(): """ Always throw an error. """ - return 5/0 + return 5 / 0 tool = client.create_or_update_tool(func=always_error) agent = client.create_agent(tool_ids=[tool.id]) @@ -410,8 +411,8 @@ def always_error(): assert response_message.tool_return == "Error executing function always_error: ZeroDivisionError: division by zero" else: response_json = json.loads(response_message.tool_return) - assert response_json['status'] == "Failed" - assert response_json['message'] == "Error executing function always_error: ZeroDivisionError: division by zero" + assert response_json["status"] == "Failed" + assert response_json["message"] == "Error executing function always_error: ZeroDivisionError: division by zero" client.delete_agent(agent_id=agent.id) diff --git a/tests/test_client_legacy.py b/tests/test_client_legacy.py index 3d907fa373..a635a28e39 100644 --- a/tests/test_client_legacy.py +++ b/tests/test_client_legacy.py @@ -7,8 +7,6 @@ import pytest from dotenv import load_dotenv -from sqlalchemy import delete - from letta import create_client from letta.client.client import LocalClient, RESTClient from letta.constants import BASE_MEMORY_TOOLS, BASE_TOOLS, DEFAULT_PRESET @@ -34,6 +32,7 @@ from letta.services.user_manager import UserManager from letta.settings import model_settings from letta.utils import get_utc_time +from sqlalchemy import delete from tests.helpers.client_helper import upload_file_using_client # from tests.utils import create_config diff --git a/tests/test_local_client.py b/tests/test_local_client.py index da5e533c5a..8b0c761786 100644 --- a/tests/test_local_client.py +++ b/tests/test_local_client.py @@ -1,7 +1,6 @@ import uuid import pytest - from letta import create_client from letta.client.client import LocalClient from letta.schemas.agent import AgentState diff --git a/tests/test_managers.py b/tests/test_managers.py index 388d477c60..5dac4c8936 100644 --- a/tests/test_managers.py +++ b/tests/test_managers.py @@ -3,9 +3,6 @@ from datetime import datetime, timedelta import pytest -from sqlalchemy import delete -from sqlalchemy.exc import IntegrityError - from letta.config import LettaConfig from letta.constants import BASE_MEMORY_TOOLS, BASE_TOOLS from letta.embeddings import embedding_model @@ -63,6 +60,8 @@ from letta.services.block_manager import BlockManager from letta.services.organization_manager import OrganizationManager from letta.settings import tool_settings +from sqlalchemy import delete +from sqlalchemy.exc import IntegrityError from tests.helpers.utils import comprehensive_agent_checks DEFAULT_EMBEDDING_CONFIG = EmbeddingConfig( diff --git a/tests/test_server.py b/tests/test_server.py index 4775ed91f5..631ec1f387 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -3,9 +3,8 @@ import warnings from typing import List, Tuple -import pytest - import letta.utils as utils +import pytest from letta.constants import BASE_MEMORY_TOOLS, BASE_TOOLS from letta.schemas.block import CreateBlock from letta.schemas.enums import MessageRole diff --git a/tests/test_stream_buffer_readers.py b/tests/test_stream_buffer_readers.py index 9a0bb5e850..92335cc704 100644 --- a/tests/test_stream_buffer_readers.py +++ b/tests/test_stream_buffer_readers.py @@ -1,7 +1,6 @@ import json import pytest - from letta.streaming_utils import JSONInnerThoughtsExtractor diff --git a/tests/test_tool_rule_solver.py b/tests/test_tool_rule_solver.py index c524d53a34..3504ed98d5 100644 --- a/tests/test_tool_rule_solver.py +++ b/tests/test_tool_rule_solver.py @@ -1,12 +1,11 @@ import pytest - from letta.helpers import ToolRulesSolver from letta.helpers.tool_rule_solver import ToolRuleValidationError from letta.schemas.tool_rule import ( ChildToolRule, ConditionalToolRule, InitToolRule, - TerminalToolRule + TerminalToolRule, ) # Constants for tool names used in the tests @@ -113,11 +112,7 @@ def test_conditional_tool_rule(): # Setup: Define a conditional tool rule init_rule = InitToolRule(tool_name=START_TOOL) terminal_rule = TerminalToolRule(tool_name=END_TOOL) - rule = ConditionalToolRule( - tool_name=START_TOOL, - default_child=None, - child_output_mapping={True: END_TOOL, False: START_TOOL} - ) + rule = ConditionalToolRule(tool_name=START_TOOL, default_child=None, child_output_mapping={True: END_TOOL, False: START_TOOL}) solver = ToolRulesSolver(tool_rules=[init_rule, rule, terminal_rule]) # Action & Assert: Verify the rule properties @@ -126,8 +121,12 @@ def test_conditional_tool_rule(): # Step 2: After using 'start_tool' solver.update_tool_usage(START_TOOL) - assert solver.get_allowed_tool_names(last_function_response='{"message": "true"}') == [END_TOOL], "After 'start_tool' returns true, should allow 'end_tool'" - assert solver.get_allowed_tool_names(last_function_response='{"message": "false"}') == [START_TOOL], "After 'start_tool' returns false, should allow 'start_tool'" + assert solver.get_allowed_tool_names(last_function_response='{"message": "true"}') == [ + END_TOOL + ], "After 'start_tool' returns true, should allow 'end_tool'" + assert solver.get_allowed_tool_names(last_function_response='{"message": "false"}') == [ + START_TOOL + ], "After 'start_tool' returns false, should allow 'start_tool'" # Step 3: After using 'end_tool' assert solver.is_terminal_tool(END_TOOL) is True, "Should recognize 'end_tool' as terminal" @@ -137,11 +136,7 @@ def test_invalid_conditional_tool_rule(): # Setup: Define an invalid conditional tool rule init_rule = InitToolRule(tool_name=START_TOOL) terminal_rule = TerminalToolRule(tool_name=END_TOOL) - invalid_rule_1 = ConditionalToolRule( - tool_name=START_TOOL, - default_child=END_TOOL, - child_output_mapping={} - ) + invalid_rule_1 = ConditionalToolRule(tool_name=START_TOOL, default_child=END_TOOL, child_output_mapping={}) # Test 1: Missing child output mapping with pytest.raises(ToolRuleValidationError, match="Conditional tool rule must have at least one child tool."): diff --git a/tests/test_tool_schema_parsing.py b/tests/test_tool_schema_parsing.py index f6738a06f0..6eed18f19a 100644 --- a/tests/test_tool_schema_parsing.py +++ b/tests/test_tool_schema_parsing.py @@ -2,7 +2,6 @@ import os import pytest - from letta.functions.functions import derive_openai_json_schema from letta.llm_api.helpers import convert_to_structured_output, make_post_request diff --git a/tests/test_utils.py b/tests/test_utils.py index 904e903e74..f8fd42ddb6 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,5 +1,4 @@ import pytest - from letta.constants import MAX_FILENAME_LENGTH from letta.utils import sanitize_filename diff --git a/tests/test_v1_routes.py b/tests/test_v1_routes.py index 2865bb2ec4..266d8dcbdf 100644 --- a/tests/test_v1_routes.py +++ b/tests/test_v1_routes.py @@ -8,7 +8,6 @@ AppModel, ) from fastapi.testclient import TestClient - from letta.schemas.tool import ToolCreate, ToolUpdate from letta.server.rest_api.app import app from letta.server.rest_api.utils import get_letta_server diff --git a/tests/test_vector_embeddings.py b/tests/test_vector_embeddings.py index e65e6b9b1d..8640f628fe 100644 --- a/tests/test_vector_embeddings.py +++ b/tests/test_vector_embeddings.py @@ -1,5 +1,4 @@ import numpy as np - from letta.orm.sqlalchemy_base import adapt_array from letta.orm.sqlite_functions import convert_array, verify_embedding_dimension diff --git a/tests/utils.py b/tests/utils.py index 19a05a090a..3ce1cb62be 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -5,7 +5,6 @@ from typing import Dict, Iterator, List, Tuple import requests - from letta.config import LettaConfig from letta.data_sources.connectors import DataConnector from letta.schemas.file import FileMetadata From 966d33b9a9db00bb9422200732290633ad55f42b Mon Sep 17 00:00:00 2001 From: Shubham Naik Date: Thu, 26 Dec 2024 15:04:20 -0800 Subject: [PATCH 140/280] feat: update nx to latest --- letta/server/rest_api/routers/v1/agents.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index 2b7f780489..d66cb193ef 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -761,6 +761,3 @@ async def send_message_to_agent( traceback.print_exc() raise HTTPException(status_code=500, detail=f"{e}") - - - From c452bd82f74f0dacacf2ce65a7223a05d9d9d178 Mon Sep 17 00:00:00 2001 From: Caren Thomas Date: Thu, 26 Dec 2024 19:27:09 -0800 Subject: [PATCH 141/280] run isort on apps/core --- letta/__init__.py | 10 ++-- letta/agent.py | 58 +++++++++---------- letta/cli/cli.py | 10 ++-- letta/client/client.py | 38 ++++++------ letta/client/streaming.py | 6 +- letta/client/utils.py | 4 +- letta/config.py | 12 ++-- letta/data_sources/connectors.py | 6 +- letta/embeddings.py | 6 +- letta/functions/function_sets/extras.py | 4 +- letta/helpers/tool_rule_solver.py | 10 ++-- letta/interface.py | 4 +- letta/llm_api/anthropic.py | 8 +-- letta/llm_api/cohere.py | 12 ++-- letta/llm_api/google_ai.py | 16 ++--- letta/llm_api/llm_api_tools.py | 28 ++++----- letta/llm_api/openai.py | 36 ++++++------ letta/local_llm/chat_completion_proxy.py | 16 ++--- letta/local_llm/constants.py | 2 +- .../grammars/gbnf_grammar_generator.py | 20 +++---- .../llm_chat_completion_wrappers/chatml.py | 6 +- .../llm_chat_completion_wrappers/llama3.py | 6 +- letta/local_llm/settings/settings.py | 2 +- letta/orm/agent.py | 6 +- letta/orm/base.py | 10 ++-- letta/orm/custom_columns.py | 8 +-- letta/orm/sandbox_config.py | 2 +- letta/orm/sqlalchemy_base.py | 8 +-- letta/providers.py | 6 +- letta/schemas/message.py | 14 ++--- letta/schemas/tool.py | 4 +- letta/server/rest_api/app.py | 18 +++--- letta/server/rest_api/interface.py | 22 +++---- .../routers/openai/assistants/assistants.py | 8 +-- .../routers/openai/assistants/schemas.py | 10 ++-- .../chat_completions/chat_completions.py | 8 +-- letta/server/rest_api/routers/v1/__init__.py | 2 +- letta/server/rest_api/routers/v1/agents.py | 38 ++++++------ .../rest_api/routers/v1/sandbox_configs.py | 6 +- letta/server/rest_api/routers/v1/sources.py | 14 ++--- letta/server/server.py | 30 +++++----- letta/services/agent_manager.py | 14 ++--- letta/services/sandbox_config_manager.py | 6 +- letta/streaming_interface.py | 8 +-- letta/system.py | 8 +-- letta/utils.py | 14 ++--- tests/helpers/endpoints_helper.py | 16 ++--- tests/integration_test_agent_tool_graph.py | 16 ++--- .../integration_test_offline_memory_agent.py | 10 ++-- ...integration_test_tool_execution_sandbox.py | 14 ++--- tests/test_cli.py | 4 +- tests/test_client_legacy.py | 14 ++--- tests/test_managers.py | 46 +++++++-------- tests/test_model_letta_perfomance.py | 18 +++--- tests/test_providers.py | 16 ++--- tests/test_server.py | 12 ++-- tests/test_tool_rule_solver.py | 8 +-- tests/test_v1_routes.py | 8 +-- 58 files changed, 383 insertions(+), 383 deletions(-) diff --git a/letta/__init__.py b/letta/__init__.py index 826b03f991..d7911ff5ef 100644 --- a/letta/__init__.py +++ b/letta/__init__.py @@ -13,11 +13,11 @@ from letta.schemas.letta_message import LettaMessage from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import ( - ArchivalMemorySummary, - BasicBlockMemory, - ChatMemory, - Memory, - RecallMemorySummary, + ArchivalMemorySummary, + BasicBlockMemory, + ChatMemory, + Memory, + RecallMemorySummary, ) from letta.schemas.message import Message from letta.schemas.openai.chat_completion_response import UsageStatistics diff --git a/letta/agent.py b/letta/agent.py index 0cbaff6884..12515ebacb 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -7,17 +7,17 @@ from typing import List, Optional, Tuple, Union from letta.constants import ( - BASE_TOOLS, - CLI_WARNING_PREFIX, - ERROR_MESSAGE_PREFIX, - FIRST_MESSAGE_ATTEMPTS, - FUNC_FAILED_HEARTBEAT_MESSAGE, - LLM_MAX_TOKENS, - MESSAGE_SUMMARY_TRUNC_KEEP_N_LAST, - MESSAGE_SUMMARY_TRUNC_TOKEN_FRAC, - MESSAGE_SUMMARY_WARNING_FRAC, - O1_BASE_TOOLS, - REQ_HEARTBEAT_MESSAGE, + BASE_TOOLS, + CLI_WARNING_PREFIX, + ERROR_MESSAGE_PREFIX, + FIRST_MESSAGE_ATTEMPTS, + FUNC_FAILED_HEARTBEAT_MESSAGE, + LLM_MAX_TOKENS, + MESSAGE_SUMMARY_TRUNC_KEEP_N_LAST, + MESSAGE_SUMMARY_TRUNC_TOKEN_FRAC, + MESSAGE_SUMMARY_WARNING_FRAC, + O1_BASE_TOOLS, + REQ_HEARTBEAT_MESSAGE, ) from letta.errors import ContextWindowExceededError from letta.helpers import ToolRulesSolver @@ -34,11 +34,11 @@ from letta.schemas.memory import ContextWindowOverview, Memory from letta.schemas.message import Message from letta.schemas.openai.chat_completion_request import ( - Tool as ChatCompletionRequestTool, + Tool as ChatCompletionRequestTool, ) from letta.schemas.openai.chat_completion_response import ChatCompletionResponse from letta.schemas.openai.chat_completion_response import ( - Message as ChatCompletionMessage, + Message as ChatCompletionMessage, ) from letta.schemas.openai.chat_completion_response import UsageStatistics from letta.schemas.tool import Tool @@ -47,30 +47,30 @@ from letta.services.agent_manager import AgentManager from letta.services.block_manager import BlockManager from letta.services.helpers.agent_manager_helper import ( - check_supports_structured_output, - compile_memory_metadata_block, + check_supports_structured_output, + compile_memory_metadata_block, ) from letta.services.message_manager import MessageManager from letta.services.passage_manager import PassageManager from letta.services.tool_execution_sandbox import ToolExecutionSandbox from letta.streaming_interface import StreamingRefreshCLIInterface from letta.system import ( - get_heartbeat, - get_token_limit_warning, - package_function_response, - package_summarize_message, - package_user_message, + get_heartbeat, + get_token_limit_warning, + package_function_response, + package_summarize_message, + package_user_message, ) from letta.utils import ( - count_tokens, - get_friendly_error_msg, - get_tool_call_id, - get_utc_time, - json_dumps, - json_loads, - parse_json, - printd, - validate_function_response, + count_tokens, + get_friendly_error_msg, + get_tool_call_id, + get_utc_time, + json_dumps, + json_loads, + parse_json, + printd, + validate_function_response, ) diff --git a/letta/cli/cli.py b/letta/cli/cli.py index efd58df750..b385a01ca9 100644 --- a/letta/cli/cli.py +++ b/letta/cli/cli.py @@ -10,10 +10,10 @@ from letta.agent import Agent, save_agent from letta.config import LettaConfig from letta.constants import ( - CLI_WARNING_PREFIX, - CORE_MEMORY_BLOCK_CHAR_LIMIT, - LETTA_DIR, - MIN_CONTEXT_WINDOW, + CLI_WARNING_PREFIX, + CORE_MEMORY_BLOCK_CHAR_LIMIT, + LETTA_DIR, + MIN_CONTEXT_WINDOW, ) from letta.local_llm.constants import ASSISTANT_MESSAGE_CLI_SYMBOL from letta.log import get_logger @@ -23,7 +23,7 @@ # from letta.interface import CLIInterface as interface # for printing to terminal from letta.streaming_interface import ( - StreamingRefreshCLIInterface as interface, # for printing to terminal + StreamingRefreshCLIInterface as interface, # for printing to terminal ) from letta.utils import open_folder_in_explorer, printd diff --git a/letta/client/client.py b/letta/client/client.py index af81a5626a..eb1b906f7e 100644 --- a/letta/client/client.py +++ b/letta/client/client.py @@ -5,12 +5,12 @@ import letta.utils import requests from letta.constants import ( - ADMIN_PREFIX, - BASE_MEMORY_TOOLS, - BASE_TOOLS, - DEFAULT_HUMAN, - DEFAULT_PERSONA, - FUNCTION_RETURN_CHAR_LIMIT, + ADMIN_PREFIX, + BASE_MEMORY_TOOLS, + BASE_TOOLS, + DEFAULT_HUMAN, + DEFAULT_PERSONA, + FUNCTION_RETURN_CHAR_LIMIT, ) from letta.data_sources.connectors import DataConnector from letta.functions.functions import parse_source_code @@ -27,25 +27,25 @@ from letta.schemas.letta_response import LettaResponse, LettaStreamingResponse from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import ( - ArchivalMemorySummary, - ChatMemory, - CreateArchivalMemory, - Memory, - RecallMemorySummary, + ArchivalMemorySummary, + ChatMemory, + CreateArchivalMemory, + Memory, + RecallMemorySummary, ) from letta.schemas.message import Message, MessageCreate, MessageUpdate from letta.schemas.openai.chat_completions import ToolCall from letta.schemas.organization import Organization from letta.schemas.passage import Passage from letta.schemas.sandbox_config import ( - E2BSandboxConfig, - LocalSandboxConfig, - SandboxConfig, - SandboxConfigCreate, - SandboxConfigUpdate, - SandboxEnvironmentVariable, - SandboxEnvironmentVariableCreate, - SandboxEnvironmentVariableUpdate, + E2BSandboxConfig, + LocalSandboxConfig, + SandboxConfig, + SandboxConfigCreate, + SandboxConfigUpdate, + SandboxEnvironmentVariable, + SandboxEnvironmentVariableCreate, + SandboxEnvironmentVariableUpdate, ) from letta.schemas.source import Source, SourceCreate, SourceUpdate from letta.schemas.tool import Tool, ToolCreate, ToolUpdate diff --git a/letta/client/streaming.py b/letta/client/streaming.py index 7d7e11292f..130e8ef2c8 100644 --- a/letta/client/streaming.py +++ b/letta/client/streaming.py @@ -7,9 +7,9 @@ from letta.errors import LLMError from letta.schemas.enums import MessageStreamStatus from letta.schemas.letta_message import ( - ReasoningMessage, - ToolCallMessage, - ToolReturnMessage, + ReasoningMessage, + ToolCallMessage, + ToolReturnMessage, ) from letta.schemas.letta_response import LettaStreamingResponse from letta.schemas.usage import LettaUsageStatistics diff --git a/letta/client/utils.py b/letta/client/utils.py index 871269c7c4..1588f7d13b 100644 --- a/letta/client/utils.py +++ b/letta/client/utils.py @@ -4,8 +4,8 @@ from IPython.display import HTML, display from letta.local_llm.constants import ( - ASSISTANT_MESSAGE_CLI_SYMBOL, - INNER_THOUGHTS_CLI_SYMBOL, + ASSISTANT_MESSAGE_CLI_SYMBOL, + INNER_THOUGHTS_CLI_SYMBOL, ) from sqlalchemy.testing.plugin.plugin_base import warnings diff --git a/letta/config.py b/letta/config.py index ed9e8668e6..a50154a60b 100644 --- a/letta/config.py +++ b/letta/config.py @@ -5,12 +5,12 @@ import letta from letta.constants import ( - CORE_MEMORY_HUMAN_CHAR_LIMIT, - CORE_MEMORY_PERSONA_CHAR_LIMIT, - DEFAULT_HUMAN, - DEFAULT_PERSONA, - DEFAULT_PRESET, - LETTA_DIR, + CORE_MEMORY_HUMAN_CHAR_LIMIT, + CORE_MEMORY_PERSONA_CHAR_LIMIT, + DEFAULT_HUMAN, + DEFAULT_PERSONA, + DEFAULT_PRESET, + LETTA_DIR, ) from letta.log import get_logger from letta.schemas.embedding_config import EmbeddingConfig diff --git a/letta/data_sources/connectors.py b/letta/data_sources/connectors.py index 3d5778104d..274e252420 100644 --- a/letta/data_sources/connectors.py +++ b/letta/data_sources/connectors.py @@ -2,9 +2,9 @@ import typer from letta.data_sources.connectors_helper import ( - assert_all_files_exist_locally, - extract_metadata_from_files, - get_filenames_in_dir, + assert_all_files_exist_locally, + extract_metadata_from_files, + get_filenames_in_dir, ) from letta.embeddings import embedding_model from letta.schemas.file import FileMetadata diff --git a/letta/embeddings.py b/letta/embeddings.py index e27ee1addd..56f0163143 100644 --- a/letta/embeddings.py +++ b/letta/embeddings.py @@ -4,9 +4,9 @@ import numpy as np import tiktoken from letta.constants import ( - EMBEDDING_TO_TOKENIZER_DEFAULT, - EMBEDDING_TO_TOKENIZER_MAP, - MAX_EMBEDDING_DIM, + EMBEDDING_TO_TOKENIZER_DEFAULT, + EMBEDDING_TO_TOKENIZER_MAP, + MAX_EMBEDDING_DIM, ) from letta.schemas.embedding_config import EmbeddingConfig from letta.utils import is_valid_url, printd diff --git a/letta/functions/function_sets/extras.py b/letta/functions/function_sets/extras.py index c911ffca1e..c8edc93cb3 100644 --- a/letta/functions/function_sets/extras.py +++ b/letta/functions/function_sets/extras.py @@ -4,8 +4,8 @@ import requests from letta.constants import ( - MESSAGE_CHATGPT_FUNCTION_MODEL, - MESSAGE_CHATGPT_FUNCTION_SYSTEM_MESSAGE, + MESSAGE_CHATGPT_FUNCTION_MODEL, + MESSAGE_CHATGPT_FUNCTION_SYSTEM_MESSAGE, ) from letta.llm_api.llm_api_tools import create from letta.schemas.message import Message diff --git a/letta/helpers/tool_rule_solver.py b/letta/helpers/tool_rule_solver.py index 24eff3075b..b9370bf7f7 100644 --- a/letta/helpers/tool_rule_solver.py +++ b/letta/helpers/tool_rule_solver.py @@ -3,11 +3,11 @@ from letta.schemas.enums import ToolRuleType from letta.schemas.tool_rule import ( - BaseToolRule, - ChildToolRule, - ConditionalToolRule, - InitToolRule, - TerminalToolRule, + BaseToolRule, + ChildToolRule, + ConditionalToolRule, + InitToolRule, + TerminalToolRule, ) from pydantic import BaseModel, Field diff --git a/letta/interface.py b/letta/interface.py index 41276b17a7..22e9678c53 100644 --- a/letta/interface.py +++ b/letta/interface.py @@ -5,8 +5,8 @@ from colorama import Fore, Style, init from letta.constants import CLI_WARNING_PREFIX from letta.local_llm.constants import ( - ASSISTANT_MESSAGE_CLI_SYMBOL, - INNER_THOUGHTS_CLI_SYMBOL, + ASSISTANT_MESSAGE_CLI_SYMBOL, + INNER_THOUGHTS_CLI_SYMBOL, ) from letta.schemas.message import Message from letta.utils import json_loads, printd diff --git a/letta/llm_api/anthropic.py b/letta/llm_api/anthropic.py index 78980d520c..059c088151 100644 --- a/letta/llm_api/anthropic.py +++ b/letta/llm_api/anthropic.py @@ -6,12 +6,12 @@ from letta.schemas.message import Message from letta.schemas.openai.chat_completion_request import ChatCompletionRequest, Tool from letta.schemas.openai.chat_completion_response import ( - ChatCompletionResponse, - Choice, - FunctionCall, + ChatCompletionResponse, + Choice, + FunctionCall, ) from letta.schemas.openai.chat_completion_response import ( - Message as ChoiceMessage, # NOTE: avoid conflict with our own Letta Message datatype + Message as ChoiceMessage, # NOTE: avoid conflict with our own Letta Message datatype ) from letta.schemas.openai.chat_completion_response import ToolCall, UsageStatistics from letta.utils import get_utc_time, smart_urljoin diff --git a/letta/llm_api/cohere.py b/letta/llm_api/cohere.py index 844e618f4c..7ea633e084 100644 --- a/letta/llm_api/cohere.py +++ b/letta/llm_api/cohere.py @@ -7,12 +7,12 @@ from letta.schemas.message import Message from letta.schemas.openai.chat_completion_request import ChatCompletionRequest, Tool from letta.schemas.openai.chat_completion_response import ( - ChatCompletionResponse, - Choice, - FunctionCall, + ChatCompletionResponse, + Choice, + FunctionCall, ) from letta.schemas.openai.chat_completion_response import ( - Message as ChoiceMessage, # NOTE: avoid conflict with our own Letta Message datatype + Message as ChoiceMessage, # NOTE: avoid conflict with our own Letta Message datatype ) from letta.schemas.openai.chat_completion_response import ToolCall, UsageStatistics from letta.utils import get_tool_call_id, get_utc_time, json_dumps, smart_urljoin @@ -276,8 +276,8 @@ def convert_tools_to_cohere_format(tools: List[Tool], inner_thoughts_in_kwargs: # NOTE: since Cohere doesn't allow "text" in the response when a tool call happens, if we want # a simultaneous CoT + tool call we need to put it inside a kwarg from letta.local_llm.constants import ( - INNER_THOUGHTS_KWARG, - INNER_THOUGHTS_KWARG_DESCRIPTION, + INNER_THOUGHTS_KWARG, + INNER_THOUGHTS_KWARG_DESCRIPTION, ) for cohere_tool in tools_dict_list: diff --git a/letta/llm_api/google_ai.py b/letta/llm_api/google_ai.py index f16fc447cc..483a319f15 100644 --- a/letta/llm_api/google_ai.py +++ b/letta/llm_api/google_ai.py @@ -8,12 +8,12 @@ from letta.local_llm.utils import count_tokens from letta.schemas.openai.chat_completion_request import Tool from letta.schemas.openai.chat_completion_response import ( - ChatCompletionResponse, - Choice, - FunctionCall, - Message, - ToolCall, - UsageStatistics, + ChatCompletionResponse, + Choice, + FunctionCall, + Message, + ToolCall, + UsageStatistics, ) from letta.utils import get_tool_call_id, get_utc_time, json_dumps @@ -230,8 +230,8 @@ def convert_tools_to_google_ai_format(tools: List[Tool], inner_thoughts_in_kwarg # Add inner thoughts if inner_thoughts_in_kwargs: from letta.local_llm.constants import ( - INNER_THOUGHTS_KWARG, - INNER_THOUGHTS_KWARG_DESCRIPTION, + INNER_THOUGHTS_KWARG, + INNER_THOUGHTS_KWARG_DESCRIPTION, ) func["parameters"]["properties"][INNER_THOUGHTS_KWARG] = { diff --git a/letta/llm_api/llm_api_tools.py b/letta/llm_api/llm_api_tools.py index 7b39b31aec..9acb1f0177 100644 --- a/letta/llm_api/llm_api_tools.py +++ b/letta/llm_api/llm_api_tools.py @@ -8,36 +8,36 @@ from letta.llm_api.anthropic import anthropic_chat_completions_request from letta.llm_api.azure_openai import azure_openai_chat_completions_request from letta.llm_api.google_ai import ( - convert_tools_to_google_ai_format, - google_ai_chat_completions_request, + convert_tools_to_google_ai_format, + google_ai_chat_completions_request, ) from letta.llm_api.helpers import ( - add_inner_thoughts_to_functions, - unpack_all_inner_thoughts_from_kwargs, + add_inner_thoughts_to_functions, + unpack_all_inner_thoughts_from_kwargs, ) from letta.llm_api.openai import ( - build_openai_chat_completions_request, - openai_chat_completions_process_stream, - openai_chat_completions_request, + build_openai_chat_completions_request, + openai_chat_completions_process_stream, + openai_chat_completions_request, ) from letta.local_llm.chat_completion_proxy import get_chat_completion from letta.local_llm.constants import ( - INNER_THOUGHTS_KWARG, - INNER_THOUGHTS_KWARG_DESCRIPTION, + INNER_THOUGHTS_KWARG, + INNER_THOUGHTS_KWARG_DESCRIPTION, ) from letta.local_llm.utils import num_tokens_from_functions, num_tokens_from_messages from letta.schemas.llm_config import LLMConfig from letta.schemas.message import Message from letta.schemas.openai.chat_completion_request import ( - ChatCompletionRequest, - Tool, - cast_message_to_subtype, + ChatCompletionRequest, + Tool, + cast_message_to_subtype, ) from letta.schemas.openai.chat_completion_response import ChatCompletionResponse from letta.settings import ModelSettings from letta.streaming_interface import ( - AgentChunkStreamingInterface, - AgentRefreshStreamingInterface, + AgentChunkStreamingInterface, + AgentRefreshStreamingInterface, ) LLM_API_PROVIDER_OPTIONS = ["openai", "azure", "anthropic", "google_ai", "cohere", "local", "groq"] diff --git a/letta/llm_api/openai.py b/letta/llm_api/openai.py index 407ac6aeca..3ad3cf2a3f 100644 --- a/letta/llm_api/openai.py +++ b/letta/llm_api/openai.py @@ -9,13 +9,13 @@ from letta.constants import OPENAI_CONTEXT_WINDOW_ERROR_SUBSTRING from letta.errors import LLMError from letta.llm_api.helpers import ( - add_inner_thoughts_to_functions, - convert_to_structured_output, - make_post_request, + add_inner_thoughts_to_functions, + convert_to_structured_output, + make_post_request, ) from letta.local_llm.constants import ( - INNER_THOUGHTS_KWARG, - INNER_THOUGHTS_KWARG_DESCRIPTION, + INNER_THOUGHTS_KWARG, + INNER_THOUGHTS_KWARG_DESCRIPTION, ) from letta.local_llm.utils import num_tokens_from_functions, num_tokens_from_messages from letta.schemas.llm_config import LLMConfig @@ -23,26 +23,26 @@ from letta.schemas.message import MessageRole as _MessageRole from letta.schemas.openai.chat_completion_request import ChatCompletionRequest from letta.schemas.openai.chat_completion_request import ( - FunctionCall as ToolFunctionChoiceFunctionCall, + FunctionCall as ToolFunctionChoiceFunctionCall, ) from letta.schemas.openai.chat_completion_request import ( - Tool, - ToolFunctionChoice, - cast_message_to_subtype, + Tool, + ToolFunctionChoice, + cast_message_to_subtype, ) from letta.schemas.openai.chat_completion_response import ( - ChatCompletionChunkResponse, - ChatCompletionResponse, - Choice, - FunctionCall, - Message, - ToolCall, - UsageStatistics, + ChatCompletionChunkResponse, + ChatCompletionResponse, + Choice, + FunctionCall, + Message, + ToolCall, + UsageStatistics, ) from letta.schemas.openai.embedding_response import EmbeddingResponse from letta.streaming_interface import ( - AgentChunkStreamingInterface, - AgentRefreshStreamingInterface, + AgentChunkStreamingInterface, + AgentRefreshStreamingInterface, ) from letta.utils import get_tool_call_id, smart_urljoin diff --git a/letta/local_llm/chat_completion_proxy.py b/letta/local_llm/chat_completion_proxy.py index 9eba5ca85a..aa1731819a 100644 --- a/letta/local_llm/chat_completion_proxy.py +++ b/letta/local_llm/chat_completion_proxy.py @@ -8,8 +8,8 @@ from letta.local_llm.constants import DEFAULT_WRAPPER from letta.local_llm.function_parser import patch_function from letta.local_llm.grammars.gbnf_grammar_generator import ( - create_dynamic_model_from_function, - generate_gbnf_grammar_and_documentation, + create_dynamic_model_from_function, + generate_gbnf_grammar_and_documentation, ) from letta.local_llm.koboldcpp.api import get_koboldcpp_completion from letta.local_llm.llamacpp.api import get_llamacpp_completion @@ -20,15 +20,15 @@ from letta.local_llm.vllm.api import get_vllm_completion from letta.local_llm.webui.api import get_webui_completion from letta.local_llm.webui.legacy_api import ( - get_webui_completion as get_webui_completion_legacy, + get_webui_completion as get_webui_completion_legacy, ) from letta.prompts.gpt_summarize import SYSTEM as SUMMARIZE_SYSTEM_MESSAGE from letta.schemas.openai.chat_completion_response import ( - ChatCompletionResponse, - Choice, - Message, - ToolCall, - UsageStatistics, + ChatCompletionResponse, + Choice, + Message, + ToolCall, + UsageStatistics, ) from letta.utils import get_tool_call_id, get_utc_time, json_dumps diff --git a/letta/local_llm/constants.py b/letta/local_llm/constants.py index ed07f4f1fe..4552f10391 100644 --- a/letta/local_llm/constants.py +++ b/letta/local_llm/constants.py @@ -1,6 +1,6 @@ # import letta.local_llm.llm_chat_completion_wrappers.airoboros as airoboros from letta.local_llm.llm_chat_completion_wrappers.chatml import ( - ChatMLInnerMonologueWrapper, + ChatMLInnerMonologueWrapper, ) DEFAULT_ENDPOINTS = { diff --git a/letta/local_llm/grammars/gbnf_grammar_generator.py b/letta/local_llm/grammars/gbnf_grammar_generator.py index 1cb793ef1b..ce3ace7392 100644 --- a/letta/local_llm/grammars/gbnf_grammar_generator.py +++ b/letta/local_llm/grammars/gbnf_grammar_generator.py @@ -6,16 +6,16 @@ from inspect import getdoc, isclass from types import NoneType from typing import ( - Any, - Callable, - List, - Optional, - Tuple, - Type, - Union, - _GenericAlias, - get_args, - get_origin, + Any, + Callable, + List, + Optional, + Tuple, + Type, + Union, + _GenericAlias, + get_args, + get_origin, ) from docstring_parser import parse diff --git a/letta/local_llm/llm_chat_completion_wrappers/chatml.py b/letta/local_llm/llm_chat_completion_wrappers/chatml.py index baa1592324..583b77b990 100644 --- a/letta/local_llm/llm_chat_completion_wrappers/chatml.py +++ b/letta/local_llm/llm_chat_completion_wrappers/chatml.py @@ -1,7 +1,7 @@ from letta.errors import LLMJSONParsingError from letta.local_llm.json_parser import clean_json from letta.local_llm.llm_chat_completion_wrappers.wrapper_base import ( - LLMChatCompletionWrapper, + LLMChatCompletionWrapper, ) from letta.schemas.enums import MessageRole from letta.utils import json_dumps, json_loads @@ -76,8 +76,8 @@ def _compile_function_description(self, schema, add_inner_thoughts=True) -> str: func_str += f"\n params:" if add_inner_thoughts: from letta.local_llm.constants import ( - INNER_THOUGHTS_KWARG, - INNER_THOUGHTS_KWARG_DESCRIPTION, + INNER_THOUGHTS_KWARG, + INNER_THOUGHTS_KWARG_DESCRIPTION, ) func_str += f"\n {INNER_THOUGHTS_KWARG}: {INNER_THOUGHTS_KWARG_DESCRIPTION}" diff --git a/letta/local_llm/llm_chat_completion_wrappers/llama3.py b/letta/local_llm/llm_chat_completion_wrappers/llama3.py index fa417b7df1..43174dd549 100644 --- a/letta/local_llm/llm_chat_completion_wrappers/llama3.py +++ b/letta/local_llm/llm_chat_completion_wrappers/llama3.py @@ -1,7 +1,7 @@ from letta.errors import LLMJSONParsingError from letta.local_llm.json_parser import clean_json from letta.local_llm.llm_chat_completion_wrappers.wrapper_base import ( - LLMChatCompletionWrapper, + LLMChatCompletionWrapper, ) from letta.utils import json_dumps, json_loads @@ -75,8 +75,8 @@ def _compile_function_description(self, schema, add_inner_thoughts=True) -> str: func_str += "\n params:" if add_inner_thoughts: from letta.local_llm.constants import ( - INNER_THOUGHTS_KWARG, - INNER_THOUGHTS_KWARG_DESCRIPTION, + INNER_THOUGHTS_KWARG, + INNER_THOUGHTS_KWARG_DESCRIPTION, ) func_str += f"\n {INNER_THOUGHTS_KWARG}: {INNER_THOUGHTS_KWARG_DESCRIPTION}" diff --git a/letta/local_llm/settings/settings.py b/letta/local_llm/settings/settings.py index b4c67a9ed5..8a3fcbe8d2 100644 --- a/letta/local_llm/settings/settings.py +++ b/letta/local_llm/settings/settings.py @@ -3,7 +3,7 @@ from letta.constants import LETTA_DIR from letta.local_llm.settings.deterministic_mirostat import ( - settings as det_miro_settings, + settings as det_miro_settings, ) from letta.local_llm.settings.simple import settings as simple_settings diff --git a/letta/orm/agent.py b/letta/orm/agent.py index de9dd5ce0e..b8c541e2d1 100644 --- a/letta/orm/agent.py +++ b/letta/orm/agent.py @@ -3,9 +3,9 @@ from letta.orm.block import Block from letta.orm.custom_columns import ( - EmbeddingConfigColumn, - LLMConfigColumn, - ToolRulesColumn, + EmbeddingConfigColumn, + LLMConfigColumn, + ToolRulesColumn, ) from letta.orm.message import Message from letta.orm.mixins import OrganizationMixin diff --git a/letta/orm/base.py b/letta/orm/base.py index e9491c4199..f740ef45d4 100644 --- a/letta/orm/base.py +++ b/letta/orm/base.py @@ -3,11 +3,11 @@ from sqlalchemy import Boolean, DateTime, String, func, text from sqlalchemy.orm import ( - DeclarativeBase, - Mapped, - declarative_mixin, - declared_attr, - mapped_column, + DeclarativeBase, + Mapped, + declarative_mixin, + declared_attr, + mapped_column, ) diff --git a/letta/orm/custom_columns.py b/letta/orm/custom_columns.py index b20760f987..05113a6a51 100644 --- a/letta/orm/custom_columns.py +++ b/letta/orm/custom_columns.py @@ -7,10 +7,10 @@ from letta.schemas.llm_config import LLMConfig from letta.schemas.openai.chat_completions import ToolCall, ToolCallFunction from letta.schemas.tool_rule import ( - ChildToolRule, - ConditionalToolRule, - InitToolRule, - TerminalToolRule, + ChildToolRule, + ConditionalToolRule, + InitToolRule, + TerminalToolRule, ) from sqlalchemy import JSON from sqlalchemy.types import BINARY, TypeDecorator diff --git a/letta/orm/sandbox_config.py b/letta/orm/sandbox_config.py index 0b0cad17fb..600e0c8a88 100644 --- a/letta/orm/sandbox_config.py +++ b/letta/orm/sandbox_config.py @@ -4,7 +4,7 @@ from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.schemas.sandbox_config import SandboxConfig as PydanticSandboxConfig from letta.schemas.sandbox_config import ( - SandboxEnvironmentVariable as PydanticSandboxEnvironmentVariable, + SandboxEnvironmentVariable as PydanticSandboxEnvironmentVariable, ) from letta.schemas.sandbox_config import SandboxType from sqlalchemy import JSON diff --git a/letta/orm/sqlalchemy_base.py b/letta/orm/sqlalchemy_base.py index 857d099025..3e307bc4a3 100644 --- a/letta/orm/sqlalchemy_base.py +++ b/letta/orm/sqlalchemy_base.py @@ -6,10 +6,10 @@ from letta.log import get_logger from letta.orm.base import Base, CommonSqlalchemyMetaMixins from letta.orm.errors import ( - DatabaseTimeoutError, - ForeignKeyConstraintViolationError, - NoResultFound, - UniqueConstraintViolationError, + DatabaseTimeoutError, + ForeignKeyConstraintViolationError, + NoResultFound, + UniqueConstraintViolationError, ) from letta.orm.sqlite_functions import adapt_array from sqlalchemy import String, desc, func, or_, select diff --git a/letta/providers.py b/letta/providers.py index cb7bf72b7c..23964c6286 100644 --- a/letta/providers.py +++ b/letta/providers.py @@ -2,8 +2,8 @@ from letta.constants import LLM_MAX_TOKENS, MIN_CONTEXT_WINDOW from letta.llm_api.azure_openai import ( - get_azure_chat_completions_endpoint, - get_azure_embeddings_endpoint, + get_azure_chat_completions_endpoint, + get_azure_embeddings_endpoint, ) from letta.llm_api.azure_openai_constants import AZURE_MODEL_TO_CONTEXT_LENGTH from letta.schemas.embedding_config import EmbeddingConfig @@ -568,7 +568,7 @@ def set_default_api_version(cls, values): def list_llm_models(self) -> List[LLMConfig]: from letta.llm_api.azure_openai import ( - azure_openai_get_chat_completion_model_list, + azure_openai_get_chat_completion_model_list, ) model_options = azure_openai_get_chat_completion_model_list(self.base_url, api_key=self.api_key, api_version=self.api_version) diff --git a/letta/schemas/message.py b/letta/schemas/message.py index 24022ece55..9697b550e3 100644 --- a/letta/schemas/message.py +++ b/letta/schemas/message.py @@ -5,18 +5,18 @@ from typing import List, Literal, Optional from letta.constants import ( - DEFAULT_MESSAGE_TOOL, - DEFAULT_MESSAGE_TOOL_KWARG, - TOOL_CALL_ID_MAX_LEN, + DEFAULT_MESSAGE_TOOL, + DEFAULT_MESSAGE_TOOL_KWARG, + TOOL_CALL_ID_MAX_LEN, ) from letta.local_llm.constants import INNER_THOUGHTS_KWARG from letta.schemas.enums import MessageRole from letta.schemas.letta_base import OrmMetadataBase from letta.schemas.letta_message import ( - AssistantMessage, - LettaMessage, - ReasoningMessage, - SystemMessage, + AssistantMessage, + LettaMessage, + ReasoningMessage, + SystemMessage, ) from letta.schemas.letta_message import ToolCall as LettaToolCall from letta.schemas.letta_message import ToolCallMessage, ToolReturnMessage, UserMessage diff --git a/letta/schemas/tool.py b/letta/schemas/tool.py index 2837ee7fec..cee04fefa7 100644 --- a/letta/schemas/tool.py +++ b/letta/schemas/tool.py @@ -3,8 +3,8 @@ from letta.constants import FUNCTION_RETURN_CHAR_LIMIT from letta.functions.functions import derive_openai_json_schema from letta.functions.helpers import ( - generate_composio_tool_wrapper, - generate_langchain_tool_wrapper, + generate_composio_tool_wrapper, + generate_langchain_tool_wrapper, ) from letta.functions.schema_generator import generate_schema_from_args_schema_v2 from letta.schemas.letta_base import LettaBase diff --git a/letta/server/rest_api/app.py b/letta/server/rest_api/app.py index 425d9bad7f..bb1839359b 100644 --- a/letta/server/rest_api/app.py +++ b/letta/server/rest_api/app.py @@ -13,33 +13,33 @@ from letta.errors import LettaAgentNotFoundError, LettaUserNotFoundError from letta.log import get_logger from letta.orm.errors import ( - DatabaseTimeoutError, - ForeignKeyConstraintViolationError, - NoResultFound, - UniqueConstraintViolationError, + DatabaseTimeoutError, + ForeignKeyConstraintViolationError, + NoResultFound, + UniqueConstraintViolationError, ) from letta.schemas.letta_response import LettaResponse from letta.server.constants import REST_DEFAULT_PORT # NOTE(charles): these are extra routes that are not part of v1 but we still need to mount to pass tests from letta.server.rest_api.auth.index import ( - setup_auth_router, # TODO: probably remove right? + setup_auth_router, # TODO: probably remove right? ) from letta.server.rest_api.interface import StreamingServerInterface from letta.server.rest_api.routers.openai.assistants.assistants import ( - router as openai_assistants_router, + router as openai_assistants_router, ) from letta.server.rest_api.routers.openai.chat_completions.chat_completions import ( - router as openai_chat_completions_router, + router as openai_chat_completions_router, ) # from letta.orm.utilities import get_db_session # TODO(ethan) reenable once we merge ORM from letta.server.rest_api.routers.v1 import ROUTERS as v1_routes from letta.server.rest_api.routers.v1.organizations import ( - router as organizations_router, + router as organizations_router, ) from letta.server.rest_api.routers.v1.users import ( - router as users_router, # TODO: decide on admin + router as users_router, # TODO: decide on admin ) from letta.server.rest_api.static_files import mount_static_files from letta.server.server import SyncServer diff --git a/letta/server/rest_api/interface.py b/letta/server/rest_api/interface.py index ba06e1d6a5..ffc46edd3c 100644 --- a/letta/server/rest_api/interface.py +++ b/letta/server/rest_api/interface.py @@ -11,22 +11,22 @@ from letta.local_llm.constants import INNER_THOUGHTS_KWARG from letta.schemas.enums import MessageStreamStatus from letta.schemas.letta_message import ( - AssistantMessage, - LegacyFunctionCallMessage, - LegacyLettaMessage, - LettaMessage, - ReasoningMessage, - ToolCall, - ToolCallDelta, - ToolCallMessage, - ToolReturnMessage, + AssistantMessage, + LegacyFunctionCallMessage, + LegacyLettaMessage, + LettaMessage, + ReasoningMessage, + ToolCall, + ToolCallDelta, + ToolCallMessage, + ToolReturnMessage, ) from letta.schemas.message import Message from letta.schemas.openai.chat_completion_response import ChatCompletionChunkResponse from letta.streaming_interface import AgentChunkStreamingInterface from letta.streaming_utils import ( - FunctionArgumentsStreamHandler, - JSONInnerThoughtsExtractor, + FunctionArgumentsStreamHandler, + JSONInnerThoughtsExtractor, ) from letta.utils import is_utc_datetime diff --git a/letta/server/rest_api/routers/openai/assistants/assistants.py b/letta/server/rest_api/routers/openai/assistants/assistants.py index 59e57cdfe4..95f8f01e9f 100644 --- a/letta/server/rest_api/routers/openai/assistants/assistants.py +++ b/letta/server/rest_api/routers/openai/assistants/assistants.py @@ -4,10 +4,10 @@ from letta.constants import DEFAULT_PRESET from letta.schemas.openai.openai import AssistantFile, OpenAIAssistant from letta.server.rest_api.routers.openai.assistants.schemas import ( - CreateAssistantFileRequest, - CreateAssistantRequest, - DeleteAssistantFileResponse, - DeleteAssistantResponse, + CreateAssistantFileRequest, + CreateAssistantRequest, + DeleteAssistantFileResponse, + DeleteAssistantResponse, ) from letta.utils import get_utc_time diff --git a/letta/server/rest_api/routers/openai/assistants/schemas.py b/letta/server/rest_api/routers/openai/assistants/schemas.py index 5a6649ebea..069a4d97fb 100644 --- a/letta/server/rest_api/routers/openai/assistants/schemas.py +++ b/letta/server/rest_api/routers/openai/assistants/schemas.py @@ -1,11 +1,11 @@ from typing import List, Optional from letta.schemas.openai.openai import ( - MessageRoleType, - OpenAIMessage, - OpenAIThread, - ToolCall, - ToolCallOutput, + MessageRoleType, + OpenAIMessage, + OpenAIThread, + ToolCall, + ToolCallOutput, ) from pydantic import BaseModel, Field diff --git a/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py b/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py index 72b647db0d..9127787f91 100644 --- a/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py +++ b/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py @@ -6,10 +6,10 @@ from letta.schemas.letta_message import LettaMessage, ToolCall from letta.schemas.openai.chat_completion_request import ChatCompletionRequest from letta.schemas.openai.chat_completion_response import ( - ChatCompletionResponse, - Choice, - Message, - UsageStatistics, + ChatCompletionResponse, + Choice, + Message, + UsageStatistics, ) # TODO this belongs in a controller! diff --git a/letta/server/rest_api/routers/v1/__init__.py b/letta/server/rest_api/routers/v1/__init__.py index 764a78a3e2..bcebeb26c5 100644 --- a/letta/server/rest_api/routers/v1/__init__.py +++ b/letta/server/rest_api/routers/v1/__init__.py @@ -4,7 +4,7 @@ from letta.server.rest_api.routers.v1.jobs import router as jobs_router from letta.server.rest_api.routers.v1.llms import router as llm_router from letta.server.rest_api.routers.v1.sandbox_configs import ( - router as sandbox_configs_router, + router as sandbox_configs_router, ) from letta.server.rest_api.routers.v1.sources import router as sources_router from letta.server.rest_api.routers.v1.tools import router as tools_router diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index d66cb193ef..a116265383 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -4,14 +4,14 @@ from typing import List, Optional, Union from fastapi import ( - APIRouter, - BackgroundTasks, - Body, - Depends, - Header, - HTTPException, - Query, - status, + APIRouter, + BackgroundTasks, + Body, + Depends, + Header, + HTTPException, + Query, + status, ) from fastapi.responses import JSONResponse, StreamingResponse from letta.constants import DEFAULT_MESSAGE_TOOL, DEFAULT_MESSAGE_TOOL_KWARG @@ -19,25 +19,25 @@ from letta.orm.errors import NoResultFound from letta.schemas.agent import AgentState, CreateAgent, UpdateAgent from letta.schemas.block import ( # , BlockLabelUpdate, BlockLimitUpdate - Block, - BlockUpdate, - CreateBlock, + Block, + BlockUpdate, + CreateBlock, ) from letta.schemas.enums import MessageStreamStatus from letta.schemas.job import Job, JobStatus, JobUpdate from letta.schemas.letta_message import ( - LegacyLettaMessage, - LettaMessage, - LettaMessageUnion, + LegacyLettaMessage, + LettaMessage, + LettaMessageUnion, ) from letta.schemas.letta_request import LettaRequest, LettaStreamingRequest from letta.schemas.letta_response import LettaResponse from letta.schemas.memory import ( - ArchivalMemorySummary, - ContextWindowOverview, - CreateArchivalMemory, - Memory, - RecallMemorySummary, + ArchivalMemorySummary, + ContextWindowOverview, + CreateArchivalMemory, + Memory, + RecallMemorySummary, ) from letta.schemas.message import Message, MessageCreate, MessageUpdate from letta.schemas.passage import Passage diff --git a/letta/server/rest_api/routers/v1/sandbox_configs.py b/letta/server/rest_api/routers/v1/sandbox_configs.py index 17dcbb4f3a..822ca4f5d5 100644 --- a/letta/server/rest_api/routers/v1/sandbox_configs.py +++ b/letta/server/rest_api/routers/v1/sandbox_configs.py @@ -5,9 +5,9 @@ from letta.schemas.sandbox_config import SandboxConfigCreate, SandboxConfigUpdate from letta.schemas.sandbox_config import SandboxEnvironmentVariable as PydanticEnvVar from letta.schemas.sandbox_config import ( - SandboxEnvironmentVariableCreate, - SandboxEnvironmentVariableUpdate, - SandboxType, + SandboxEnvironmentVariableCreate, + SandboxEnvironmentVariableUpdate, + SandboxType, ) from letta.server.rest_api.utils import get_letta_server, get_user_id from letta.server.server import SyncServer diff --git a/letta/server/rest_api/routers/v1/sources.py b/letta/server/rest_api/routers/v1/sources.py index c51fee687a..399942da6d 100644 --- a/letta/server/rest_api/routers/v1/sources.py +++ b/letta/server/rest_api/routers/v1/sources.py @@ -3,13 +3,13 @@ from typing import List, Optional from fastapi import ( - APIRouter, - BackgroundTasks, - Depends, - Header, - HTTPException, - Query, - UploadFile, + APIRouter, + BackgroundTasks, + Depends, + Header, + HTTPException, + Query, + UploadFile, ) from letta.schemas.file import FileMetadata from letta.schemas.job import Job diff --git a/letta/server/server.py b/letta/server/server.py index 17bc5771b2..226d8d84bb 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -27,17 +27,17 @@ from letta.orm import Base from letta.orm.errors import NoResultFound from letta.providers import ( - AnthropicProvider, - AzureProvider, - GoogleAIProvider, - GroqProvider, - LettaProvider, - OllamaProvider, - OpenAIProvider, - Provider, - TogetherProvider, - VLLMChatCompletionsProvider, - VLLMCompletionsProvider, + AnthropicProvider, + AzureProvider, + GoogleAIProvider, + GroqProvider, + LettaProvider, + OllamaProvider, + OpenAIProvider, + Provider, + TogetherProvider, + VLLMChatCompletionsProvider, + VLLMCompletionsProvider, ) from letta.schemas.agent import AgentState, AgentType, CreateAgent from letta.schemas.block import BlockUpdate @@ -49,10 +49,10 @@ from letta.schemas.letta_message import LettaMessage, ToolReturnMessage from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import ( - ArchivalMemorySummary, - ContextWindowOverview, - Memory, - RecallMemorySummary, + ArchivalMemorySummary, + ContextWindowOverview, + Memory, + RecallMemorySummary, ) from letta.schemas.message import Message, MessageCreate, MessageRole, MessageUpdate from letta.schemas.organization import Organization diff --git a/letta/services/agent_manager.py b/letta/services/agent_manager.py index b1040f3130..9697339135 100644 --- a/letta/services/agent_manager.py +++ b/letta/services/agent_manager.py @@ -25,13 +25,13 @@ from letta.schemas.user import User as PydanticUser from letta.services.block_manager import BlockManager from letta.services.helpers.agent_manager_helper import ( - _process_relationship, - _process_tags, - check_supports_structured_output, - compile_system_message, - derive_system_message, - initialize_message_sequence, - package_initial_message_sequence, + _process_relationship, + _process_tags, + check_supports_structured_output, + compile_system_message, + derive_system_message, + initialize_message_sequence, + package_initial_message_sequence, ) from letta.services.message_manager import MessageManager from letta.services.source_manager import SourceManager diff --git a/letta/services/sandbox_config_manager.py b/letta/services/sandbox_config_manager.py index 010ae400c8..270b1761b9 100644 --- a/letta/services/sandbox_config_manager.py +++ b/letta/services/sandbox_config_manager.py @@ -10,9 +10,9 @@ from letta.schemas.sandbox_config import SandboxConfigCreate, SandboxConfigUpdate from letta.schemas.sandbox_config import SandboxEnvironmentVariable as PydanticEnvVar from letta.schemas.sandbox_config import ( - SandboxEnvironmentVariableCreate, - SandboxEnvironmentVariableUpdate, - SandboxType, + SandboxEnvironmentVariableCreate, + SandboxEnvironmentVariableUpdate, + SandboxType, ) from letta.schemas.user import User as PydanticUser from letta.utils import enforce_types, printd diff --git a/letta/streaming_interface.py b/letta/streaming_interface.py index f798653094..9dfcfd4618 100644 --- a/letta/streaming_interface.py +++ b/letta/streaming_interface.py @@ -5,13 +5,13 @@ from letta.interface import CLIInterface from letta.local_llm.constants import ( - ASSISTANT_MESSAGE_CLI_SYMBOL, - INNER_THOUGHTS_CLI_SYMBOL, + ASSISTANT_MESSAGE_CLI_SYMBOL, + INNER_THOUGHTS_CLI_SYMBOL, ) from letta.schemas.message import Message from letta.schemas.openai.chat_completion_response import ( - ChatCompletionChunkResponse, - ChatCompletionResponse, + ChatCompletionChunkResponse, + ChatCompletionResponse, ) # from colorama import Fore, Style, init diff --git a/letta/system.py b/letta/system.py index d903bf1fed..89755c3185 100644 --- a/letta/system.py +++ b/letta/system.py @@ -3,10 +3,10 @@ from typing import Optional from .constants import ( - INITIAL_BOOT_MESSAGE, - INITIAL_BOOT_MESSAGE_SEND_MESSAGE_FIRST_MSG, - INITIAL_BOOT_MESSAGE_SEND_MESSAGE_THOUGHT, - MESSAGE_SUMMARY_WARNING_STR, + INITIAL_BOOT_MESSAGE, + INITIAL_BOOT_MESSAGE_SEND_MESSAGE_FIRST_MSG, + INITIAL_BOOT_MESSAGE_SEND_MESSAGE_THOUGHT, + MESSAGE_SUMMARY_WARNING_STR, ) from .utils import get_local_time, json_dumps diff --git a/letta/utils.py b/letta/utils.py index f801596447..4e7771c9ce 100644 --- a/letta/utils.py +++ b/letta/utils.py @@ -23,13 +23,13 @@ import pytz import tiktoken from letta.constants import ( - CLI_WARNING_PREFIX, - CORE_MEMORY_HUMAN_CHAR_LIMIT, - CORE_MEMORY_PERSONA_CHAR_LIMIT, - ERROR_MESSAGE_PREFIX, - LETTA_DIR, - MAX_FILENAME_LENGTH, - TOOL_CALL_ID_MAX_LEN, + CLI_WARNING_PREFIX, + CORE_MEMORY_HUMAN_CHAR_LIMIT, + CORE_MEMORY_PERSONA_CHAR_LIMIT, + ERROR_MESSAGE_PREFIX, + LETTA_DIR, + MAX_FILENAME_LENGTH, + TOOL_CALL_ID_MAX_LEN, ) from letta.schemas.openai.chat_completion_response import ChatCompletionResponse from pathvalidate import sanitize_filename as pathvalidate_sanitize_filename diff --git a/tests/helpers/endpoints_helper.py b/tests/helpers/endpoints_helper.py index 87997aaf7a..4ed801468f 100644 --- a/tests/helpers/endpoints_helper.py +++ b/tests/helpers/endpoints_helper.py @@ -15,10 +15,10 @@ from letta.constants import DEFAULT_HUMAN, DEFAULT_PERSONA from letta.embeddings import embedding_model from letta.errors import ( - InvalidInnerMonologueError, - InvalidToolCallError, - MissingInnerMonologueError, - MissingToolCallError, + InvalidInnerMonologueError, + InvalidToolCallError, + MissingInnerMonologueError, + MissingToolCallError, ) from letta.llm_api.llm_api_tools import create from letta.local_llm.constants import INNER_THOUGHTS_KWARG @@ -29,10 +29,10 @@ from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import ChatMemory from letta.schemas.openai.chat_completion_response import ( - ChatCompletionResponse, - Choice, - FunctionCall, - Message, + ChatCompletionResponse, + Choice, + FunctionCall, + Message, ) from letta.utils import get_human_text, get_persona_text, json_dumps from tests.helpers.utils import cleanup diff --git a/tests/integration_test_agent_tool_graph.py b/tests/integration_test_agent_tool_graph.py index 289b023a58..4144c34776 100644 --- a/tests/integration_test_agent_tool_graph.py +++ b/tests/integration_test_agent_tool_graph.py @@ -5,16 +5,16 @@ from letta import create_client from letta.schemas.letta_message import ToolCallMessage from letta.schemas.tool_rule import ( - ChildToolRule, - ConditionalToolRule, - InitToolRule, - TerminalToolRule, + ChildToolRule, + ConditionalToolRule, + InitToolRule, + TerminalToolRule, ) from tests.helpers.endpoints_helper import ( - assert_invoked_function_call, - assert_invoked_send_message_with_keyword, - assert_sanity_checks, - setup_agent, + assert_invoked_function_call, + assert_invoked_send_message_with_keyword, + assert_sanity_checks, + setup_agent, ) from tests.helpers.utils import cleanup diff --git a/tests/integration_test_offline_memory_agent.py b/tests/integration_test_offline_memory_agent.py index 5803e82051..01b04693d3 100644 --- a/tests/integration_test_offline_memory_agent.py +++ b/tests/integration_test_offline_memory_agent.py @@ -3,11 +3,11 @@ from letta.client.client import Block, create_client from letta.constants import DEFAULT_HUMAN, DEFAULT_PERSONA from letta.offline_memory_agent import ( - finish_rethinking_memory, - finish_rethinking_memory_convo, - rethink_memory, - rethink_memory_convo, - trigger_rethink_memory, + finish_rethinking_memory, + finish_rethinking_memory_convo, + rethink_memory, + rethink_memory_convo, + trigger_rethink_memory, ) from letta.prompts import gpt_system from letta.schemas.agent import AgentType diff --git a/tests/integration_test_tool_execution_sandbox.py b/tests/integration_test_tool_execution_sandbox.py index 0938fdc871..699185c9f9 100644 --- a/tests/integration_test_tool_execution_sandbox.py +++ b/tests/integration_test_tool_execution_sandbox.py @@ -14,12 +14,12 @@ from letta.schemas.memory import ChatMemory from letta.schemas.organization import Organization from letta.schemas.sandbox_config import ( - E2BSandboxConfig, - LocalSandboxConfig, - SandboxConfigCreate, - SandboxConfigUpdate, - SandboxEnvironmentVariableCreate, - SandboxType, + E2BSandboxConfig, + LocalSandboxConfig, + SandboxConfigCreate, + SandboxConfigUpdate, + SandboxEnvironmentVariableCreate, + SandboxType, ) from letta.schemas.tool import Tool, ToolCreate from letta.schemas.user import User @@ -212,7 +212,7 @@ def clear_memory(agent_state: AgentState): @pytest.fixture def external_codebase_tool(test_user): from tests.test_tool_sandbox.restaurant_management_system.adjust_menu_prices import ( - adjust_menu_prices, + adjust_menu_prices, ) tool = create_tool_from_func(adjust_menu_prices) diff --git a/tests/test_cli.py b/tests/test_cli.py index 54faa804a0..c5595a004e 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -5,8 +5,8 @@ import pexpect import pytest from letta.local_llm.constants import ( - ASSISTANT_MESSAGE_CLI_SYMBOL, - INNER_THOUGHTS_CLI_SYMBOL, + ASSISTANT_MESSAGE_CLI_SYMBOL, + INNER_THOUGHTS_CLI_SYMBOL, ) original_letta_path = os.path.expanduser("~/.letta") diff --git a/tests/test_client_legacy.py b/tests/test_client_legacy.py index a635a28e39..b578d847ef 100644 --- a/tests/test_client_legacy.py +++ b/tests/test_client_legacy.py @@ -15,13 +15,13 @@ from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.enums import MessageRole, MessageStreamStatus from letta.schemas.letta_message import ( - AssistantMessage, - LettaMessage, - ReasoningMessage, - SystemMessage, - ToolCallMessage, - ToolReturnMessage, - UserMessage, + AssistantMessage, + LettaMessage, + ReasoningMessage, + SystemMessage, + ToolCallMessage, + ToolReturnMessage, + UserMessage, ) from letta.schemas.letta_response import LettaResponse, LettaStreamingResponse from letta.schemas.llm_config import LLMConfig diff --git a/tests/test_managers.py b/tests/test_managers.py index 5dac4c8936..052a1819ec 100644 --- a/tests/test_managers.py +++ b/tests/test_managers.py @@ -8,22 +8,22 @@ from letta.embeddings import embedding_model from letta.functions.functions import derive_openai_json_schema, parse_source_code from letta.orm import ( - Agent, - AgentPassage, - Block, - BlocksAgents, - FileMetadata, - Job, - Message, - Organization, - SandboxConfig, - SandboxEnvironmentVariable, - Source, - SourcePassage, - SourcesAgents, - Tool, - ToolsAgents, - User, + Agent, + AgentPassage, + Block, + BlocksAgents, + FileMetadata, + Job, + Message, + Organization, + SandboxConfig, + SandboxEnvironmentVariable, + Source, + SourcePassage, + SourcesAgents, + Tool, + ToolsAgents, + User, ) from letta.orm.agents_tags import AgentsTags from letta.orm.errors import NoResultFound, UniqueConstraintViolationError @@ -41,13 +41,13 @@ from letta.schemas.organization import Organization as PydanticOrganization from letta.schemas.passage import Passage as PydanticPassage from letta.schemas.sandbox_config import ( - E2BSandboxConfig, - LocalSandboxConfig, - SandboxConfigCreate, - SandboxConfigUpdate, - SandboxEnvironmentVariableCreate, - SandboxEnvironmentVariableUpdate, - SandboxType, + E2BSandboxConfig, + LocalSandboxConfig, + SandboxConfigCreate, + SandboxConfigUpdate, + SandboxEnvironmentVariableCreate, + SandboxEnvironmentVariableUpdate, + SandboxType, ) from letta.schemas.source import Source as PydanticSource from letta.schemas.source import SourceUpdate diff --git a/tests/test_model_letta_perfomance.py b/tests/test_model_letta_perfomance.py index d45654eaaa..59bc90af4a 100644 --- a/tests/test_model_letta_perfomance.py +++ b/tests/test_model_letta_perfomance.py @@ -3,15 +3,15 @@ import time from tests.helpers.endpoints_helper import ( - check_agent_archival_memory_insert, - check_agent_archival_memory_retrieval, - check_agent_edit_core_memory, - check_agent_recall_chat_memory, - check_agent_summarize_memory_simple, - check_agent_uses_external_tool, - check_first_response_is_valid_for_llm_endpoint, - check_response_contains_keyword, - run_embedding_endpoint, + check_agent_archival_memory_insert, + check_agent_archival_memory_retrieval, + check_agent_edit_core_memory, + check_agent_recall_chat_memory, + check_agent_summarize_memory_simple, + check_agent_uses_external_tool, + check_first_response_is_valid_for_llm_endpoint, + check_response_contains_keyword, + run_embedding_endpoint, ) # directories diff --git a/tests/test_providers.py b/tests/test_providers.py index 228e33525b..8e4ea5cc7e 100644 --- a/tests/test_providers.py +++ b/tests/test_providers.py @@ -1,14 +1,14 @@ import os from letta.providers import ( - AnthropicProvider, - AzureProvider, - GoogleAIProvider, - GroqProvider, - MistralProvider, - OllamaProvider, - OpenAIProvider, - TogetherProvider, + AnthropicProvider, + AzureProvider, + GoogleAIProvider, + GroqProvider, + MistralProvider, + OllamaProvider, + OpenAIProvider, + TogetherProvider, ) from letta.settings import model_settings diff --git a/tests/test_server.py b/tests/test_server.py index 631ec1f387..e0d51ffcb1 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -9,12 +9,12 @@ from letta.schemas.block import CreateBlock from letta.schemas.enums import MessageRole from letta.schemas.letta_message import ( - LettaMessage, - ReasoningMessage, - SystemMessage, - ToolCallMessage, - ToolReturnMessage, - UserMessage, + LettaMessage, + ReasoningMessage, + SystemMessage, + ToolCallMessage, + ToolReturnMessage, + UserMessage, ) from letta.schemas.user import User diff --git a/tests/test_tool_rule_solver.py b/tests/test_tool_rule_solver.py index 3504ed98d5..8a9e93537c 100644 --- a/tests/test_tool_rule_solver.py +++ b/tests/test_tool_rule_solver.py @@ -2,10 +2,10 @@ from letta.helpers import ToolRulesSolver from letta.helpers.tool_rule_solver import ToolRuleValidationError from letta.schemas.tool_rule import ( - ChildToolRule, - ConditionalToolRule, - InitToolRule, - TerminalToolRule, + ChildToolRule, + ConditionalToolRule, + InitToolRule, + TerminalToolRule, ) # Constants for tool names used in the tests diff --git a/tests/test_v1_routes.py b/tests/test_v1_routes.py index 266d8dcbdf..6877031c69 100644 --- a/tests/test_v1_routes.py +++ b/tests/test_v1_routes.py @@ -2,10 +2,10 @@ import pytest from composio.client.collections import ( - ActionModel, - ActionParametersModel, - ActionResponseModel, - AppModel, + ActionModel, + ActionParametersModel, + ActionResponseModel, + AppModel, ) from fastapi.testclient import TestClient from letta.schemas.tool import ToolCreate, ToolUpdate From 461ad00ca64cf799988f9cdf23b40a8fa12de830 Mon Sep 17 00:00:00 2001 From: Caren Thomas Date: Thu, 26 Dec 2024 19:43:11 -0800 Subject: [PATCH 142/280] run black, add isort config to pyproject.toml --- alembic/env.py | 3 +- .../08b2f8225812_adding_toolsagents_orm.py | 1 + ...1ee_make_an_blocks_agents_mapping_table.py | 1 + .../3c683a662c82_migrate_jobs_to_the_orm.py | 3 +- ...88e702f85e_drop_api_tokens_table_in_oss.py | 1 + ...54dec07619c4_divide_passage_table_into_.py | 5 +- .../5987401b40ae_refactor_agent_memory.py | 3 +- ...5badb46fdf9_migrate_messages_to_the_orm.py | 3 +- ...505cc7eca9_create_a_baseline_migrations.py | 5 +- ...f_add_column_to_tools_table_to_contain_.py | 1 + .../b6d7ca024aa9_add_agents_tags_table.py | 1 + ..._add_passages_orm_drop_legacy_passages_.py | 3 +- .../c85a3d07c028_move_files_to_orm.py | 1 + .../cda66b6cb0d6_move_sources_to_orm.py | 3 +- .../d05669b60ebe_migrate_agents_to_orm.py | 3 +- ...c_move_organizations_users_tools_to_orm.py | 5 +- ...dbf_tweak_created_at_field_for_messages.py | 3 +- ...7507eab4bb9_migrate_blocks_to_orm_model.py | 1 + ..._create_sandbox_config_and_sandbox_env_.py | 1 + examples/swarm/simple.py | 3 +- examples/swarm/swarm.py | 1 + examples/tool_rule_usage.py | 5 +- letta/__init__.py | 8 +-- letta/agent.py | 61 ++++++++----------- letta/benchmark/benchmark.py | 1 + letta/cli/cli.py | 14 ++--- letta/cli/cli_config.py | 3 +- letta/cli/cli_load.py | 1 + letta/client/client.py | 36 ++++------- letta/client/streaming.py | 7 +-- letta/client/utils.py | 6 +- letta/config.py | 12 ++-- letta/data_sources/connectors.py | 7 +-- letta/embeddings.py | 7 +-- letta/functions/function_sets/extras.py | 6 +- letta/helpers/tool_rule_solver.py | 11 +--- letta/interface.py | 6 +- letta/llm_api/anthropic.py | 8 +-- letta/llm_api/azure_openai.py | 1 + letta/llm_api/cohere.py | 14 ++--- letta/llm_api/google_ai.py | 15 +---- letta/llm_api/helpers.py | 1 + letta/llm_api/llm_api_tools.py | 33 +++------- letta/llm_api/mistral.py | 1 + letta/llm_api/openai.py | 41 ++++--------- letta/local_llm/chat_completion_proxy.py | 18 ++---- letta/local_llm/constants.py | 4 +- .../grammars/gbnf_grammar_generator.py | 16 +---- .../llm_chat_completion_wrappers/chatml.py | 9 +-- .../configurable_wrapper.py | 1 + .../llm_chat_completion_wrappers/llama3.py | 9 +-- letta/local_llm/settings/settings.py | 4 +- letta/local_llm/utils.py | 5 +- letta/main.py | 9 +-- letta/orm/agent.py | 11 ++-- letta/orm/agents_tags.py | 3 +- letta/orm/base.py | 8 +-- letta/orm/block.py | 5 +- letta/orm/blocks_agents.py | 3 +- letta/orm/custom_columns.py | 12 ++-- letta/orm/file.py | 5 +- letta/orm/job.py | 5 +- letta/orm/message.py | 5 +- letta/orm/mixins.py | 3 +- letta/orm/organization.py | 3 +- letta/orm/passage.py | 5 +- letta/orm/sandbox_config.py | 13 ++-- letta/orm/source.py | 5 +- letta/orm/sources_agents.py | 3 +- letta/orm/sqlalchemy_base.py | 14 ++--- letta/orm/sqlite_functions.py | 3 +- letta/orm/tool.py | 5 +- letta/orm/tools_agents.py | 3 +- letta/orm/user.py | 3 +- letta/providers.py | 12 ++-- letta/schemas/agent.py | 3 +- letta/schemas/block.py | 5 +- letta/schemas/file.py | 3 +- letta/schemas/job.py | 3 +- letta/schemas/letta_request.py | 3 +- letta/schemas/letta_response.py | 3 +- letta/schemas/message.py | 16 ++--- letta/schemas/organization.py | 3 +- letta/schemas/passage.py | 3 +- letta/schemas/sandbox_config.py | 3 +- letta/schemas/source.py | 3 +- letta/schemas/tool.py | 8 +-- letta/schemas/tool_rule.py | 3 +- letta/schemas/user.py | 3 +- letta/server/rest_api/app.py | 32 +++------- letta/server/rest_api/auth/index.py | 3 +- letta/server/rest_api/auth_token.py | 1 + letta/server/rest_api/interface.py | 23 +++---- .../routers/openai/assistants/assistants.py | 9 +-- .../routers/openai/assistants/schemas.py | 9 +-- .../chat_completions/chat_completions.py | 8 +-- letta/server/rest_api/routers/v1/__init__.py | 4 +- letta/server/rest_api/routers/v1/agents.py | 34 ++--------- letta/server/rest_api/routers/v1/blocks.py | 1 + letta/server/rest_api/routers/v1/health.py | 1 + letta/server/rest_api/routers/v1/jobs.py | 1 + letta/server/rest_api/routers/v1/llms.py | 1 + .../rest_api/routers/v1/organizations.py | 1 + .../rest_api/routers/v1/sandbox_configs.py | 7 +-- letta/server/rest_api/routers/v1/sources.py | 11 +--- letta/server/rest_api/routers/v1/tools.py | 1 + letta/server/rest_api/routers/v1/users.py | 1 + letta/server/rest_api/utils.py | 3 +- letta/server/server.py | 45 +++++++------- letta/server/ws_api/example_client.py | 3 +- letta/server/ws_api/server.py | 3 +- letta/services/agent_manager.py | 17 +++--- letta/services/sandbox_config_manager.py | 6 +- letta/settings.py | 3 +- letta/streaming_interface.py | 16 ++--- letta/system.py | 8 +-- letta/utils.py | 19 +++--- locust_test.py | 3 +- paper_experiments/doc_qa_task/doc_qa.py | 5 +- .../doc_qa_task/llm_judge_doc_qa.py | 3 +- .../doc_qa_task/load_wikipedia_embeddings.py | 3 +- paper_experiments/nested_kv_task/nested_kv.py | 3 +- pyproject.toml | 8 +++ scripts/migrate_tools.py | 3 +- tests/helpers/endpoints_helper.py | 14 +---- tests/integration_test_agent_tool_graph.py | 16 ++--- .../integration_test_offline_memory_agent.py | 11 ++-- tests/integration_test_summarizer.py | 1 + ...integration_test_tool_execution_sandbox.py | 19 +++--- tests/test_base_functions.py | 3 +- tests/test_cli.py | 6 +- tests/test_client.py | 3 +- tests/test_client_legacy.py | 17 +++--- tests/test_local_client.py | 1 + tests/test_managers.py | 51 ++++++++-------- tests/test_model_letta_perfomance.py | 18 +++--- tests/test_providers.py | 16 ++--- tests/test_server.py | 12 +--- tests/test_stream_buffer_readers.py | 1 + tests/test_tool_rule_solver.py | 8 +-- .../adjust_menu_prices.py | 1 + tests/test_tool_schema_parsing.py | 1 + tests/test_utils.py | 1 + tests/test_v1_routes.py | 8 +-- tests/test_vector_embeddings.py | 1 + tests/utils.py | 1 + 146 files changed, 476 insertions(+), 655 deletions(-) diff --git a/alembic/env.py b/alembic/env.py index e7dfe71c61..767b7bbdbf 100644 --- a/alembic/env.py +++ b/alembic/env.py @@ -1,11 +1,12 @@ import os from logging.config import fileConfig +from sqlalchemy import engine_from_config, pool + from alembic import context from letta.config import LettaConfig from letta.orm import Base from letta.settings import settings -from sqlalchemy import engine_from_config, pool letta_config = LettaConfig.load() diff --git a/alembic/versions/08b2f8225812_adding_toolsagents_orm.py b/alembic/versions/08b2f8225812_adding_toolsagents_orm.py index d0e2cac868..0da80aae56 100644 --- a/alembic/versions/08b2f8225812_adding_toolsagents_orm.py +++ b/alembic/versions/08b2f8225812_adding_toolsagents_orm.py @@ -9,6 +9,7 @@ from typing import Sequence, Union import sqlalchemy as sa + from alembic import op # revision identifiers, used by Alembic. diff --git a/alembic/versions/1c8880d671ee_make_an_blocks_agents_mapping_table.py b/alembic/versions/1c8880d671ee_make_an_blocks_agents_mapping_table.py index 6890e0ed7e..ffcb0b6715 100644 --- a/alembic/versions/1c8880d671ee_make_an_blocks_agents_mapping_table.py +++ b/alembic/versions/1c8880d671ee_make_an_blocks_agents_mapping_table.py @@ -9,6 +9,7 @@ from typing import Sequence, Union import sqlalchemy as sa + from alembic import op # revision identifiers, used by Alembic. diff --git a/alembic/versions/3c683a662c82_migrate_jobs_to_the_orm.py b/alembic/versions/3c683a662c82_migrate_jobs_to_the_orm.py index 62b97e9d7b..4f9b746d5c 100644 --- a/alembic/versions/3c683a662c82_migrate_jobs_to_the_orm.py +++ b/alembic/versions/3c683a662c82_migrate_jobs_to_the_orm.py @@ -9,9 +9,10 @@ from typing import Sequence, Union import sqlalchemy as sa -from alembic import op from sqlalchemy.dialects import postgresql +from alembic import op + # revision identifiers, used by Alembic. revision: str = "3c683a662c82" down_revision: Union[str, None] = "5987401b40ae" diff --git a/alembic/versions/4e88e702f85e_drop_api_tokens_table_in_oss.py b/alembic/versions/4e88e702f85e_drop_api_tokens_table_in_oss.py index b692e8556d..75a90445a0 100644 --- a/alembic/versions/4e88e702f85e_drop_api_tokens_table_in_oss.py +++ b/alembic/versions/4e88e702f85e_drop_api_tokens_table_in_oss.py @@ -9,6 +9,7 @@ from typing import Sequence, Union import sqlalchemy as sa + from alembic import op # revision identifiers, used by Alembic. diff --git a/alembic/versions/54dec07619c4_divide_passage_table_into_.py b/alembic/versions/54dec07619c4_divide_passage_table_into_.py index ead70ec649..e164a997b5 100644 --- a/alembic/versions/54dec07619c4_divide_passage_table_into_.py +++ b/alembic/versions/54dec07619c4_divide_passage_table_into_.py @@ -9,11 +9,12 @@ from typing import Sequence, Union import sqlalchemy as sa -from alembic import op -from letta.orm.custom_columns import EmbeddingConfigColumn from pgvector.sqlalchemy import Vector from sqlalchemy.dialects import postgresql +from alembic import op +from letta.orm.custom_columns import EmbeddingConfigColumn + # revision identifiers, used by Alembic. revision: str = "54dec07619c4" down_revision: Union[str, None] = "4e88e702f85e" diff --git a/alembic/versions/5987401b40ae_refactor_agent_memory.py b/alembic/versions/5987401b40ae_refactor_agent_memory.py index 84e4ebe2d3..889e9425b5 100644 --- a/alembic/versions/5987401b40ae_refactor_agent_memory.py +++ b/alembic/versions/5987401b40ae_refactor_agent_memory.py @@ -9,9 +9,10 @@ from typing import Sequence, Union import sqlalchemy as sa -from alembic import op from sqlalchemy.dialects import postgresql +from alembic import op + # revision identifiers, used by Alembic. revision: str = "5987401b40ae" down_revision: Union[str, None] = "1c8880d671ee" diff --git a/alembic/versions/95badb46fdf9_migrate_messages_to_the_orm.py b/alembic/versions/95badb46fdf9_migrate_messages_to_the_orm.py index f200e65e86..73254e39ea 100644 --- a/alembic/versions/95badb46fdf9_migrate_messages_to_the_orm.py +++ b/alembic/versions/95badb46fdf9_migrate_messages_to_the_orm.py @@ -9,9 +9,10 @@ from typing import Sequence, Union import sqlalchemy as sa -from alembic import op from sqlalchemy.dialects import postgresql +from alembic import op + # revision identifiers, used by Alembic. revision: str = "95badb46fdf9" down_revision: Union[str, None] = "08b2f8225812" diff --git a/alembic/versions/9a505cc7eca9_create_a_baseline_migrations.py b/alembic/versions/9a505cc7eca9_create_a_baseline_migrations.py index 6ef44d476e..21f6a39613 100644 --- a/alembic/versions/9a505cc7eca9_create_a_baseline_migrations.py +++ b/alembic/versions/9a505cc7eca9_create_a_baseline_migrations.py @@ -8,12 +8,13 @@ from typing import Sequence, Union -import letta.orm import pgvector import sqlalchemy as sa -from alembic import op from sqlalchemy.dialects import postgresql +import letta.orm +from alembic import op + # revision identifiers, used by Alembic. revision: str = "9a505cc7eca9" down_revision: Union[str, None] = None diff --git a/alembic/versions/a91994b9752f_add_column_to_tools_table_to_contain_.py b/alembic/versions/a91994b9752f_add_column_to_tools_table_to_contain_.py index 157e87ef33..f8da3856bd 100644 --- a/alembic/versions/a91994b9752f_add_column_to_tools_table_to_contain_.py +++ b/alembic/versions/a91994b9752f_add_column_to_tools_table_to_contain_.py @@ -9,6 +9,7 @@ from typing import Sequence, Union import sqlalchemy as sa + from alembic import op from letta.constants import FUNCTION_RETURN_CHAR_LIMIT diff --git a/alembic/versions/b6d7ca024aa9_add_agents_tags_table.py b/alembic/versions/b6d7ca024aa9_add_agents_tags_table.py index 638bc5b5c9..2aec8a09fb 100644 --- a/alembic/versions/b6d7ca024aa9_add_agents_tags_table.py +++ b/alembic/versions/b6d7ca024aa9_add_agents_tags_table.py @@ -9,6 +9,7 @@ from typing import Sequence, Union import sqlalchemy as sa + from alembic import op # revision identifiers, used by Alembic. diff --git a/alembic/versions/c5d964280dff_add_passages_orm_drop_legacy_passages_.py b/alembic/versions/c5d964280dff_add_passages_orm_drop_legacy_passages_.py index fb0eafab66..b6d2e6ba82 100644 --- a/alembic/versions/c5d964280dff_add_passages_orm_drop_legacy_passages_.py +++ b/alembic/versions/c5d964280dff_add_passages_orm_drop_legacy_passages_.py @@ -9,9 +9,10 @@ from typing import Sequence, Union import sqlalchemy as sa -from alembic import op from sqlalchemy.dialects import postgresql +from alembic import op + # revision identifiers, used by Alembic. revision: str = "c5d964280dff" down_revision: Union[str, None] = "a91994b9752f" diff --git a/alembic/versions/c85a3d07c028_move_files_to_orm.py b/alembic/versions/c85a3d07c028_move_files_to_orm.py index 7d853e6a8b..b05d793031 100644 --- a/alembic/versions/c85a3d07c028_move_files_to_orm.py +++ b/alembic/versions/c85a3d07c028_move_files_to_orm.py @@ -9,6 +9,7 @@ from typing import Sequence, Union import sqlalchemy as sa + from alembic import op # revision identifiers, used by Alembic. diff --git a/alembic/versions/cda66b6cb0d6_move_sources_to_orm.py b/alembic/versions/cda66b6cb0d6_move_sources_to_orm.py index ae10edbd04..f46bef6b4d 100644 --- a/alembic/versions/cda66b6cb0d6_move_sources_to_orm.py +++ b/alembic/versions/cda66b6cb0d6_move_sources_to_orm.py @@ -9,9 +9,10 @@ from typing import Sequence, Union import sqlalchemy as sa -from alembic import op from sqlalchemy.dialects import postgresql +from alembic import op + # revision identifiers, used by Alembic. revision: str = "cda66b6cb0d6" down_revision: Union[str, None] = "b6d7ca024aa9" diff --git a/alembic/versions/d05669b60ebe_migrate_agents_to_orm.py b/alembic/versions/d05669b60ebe_migrate_agents_to_orm.py index 61b24f5edd..d03652c85f 100644 --- a/alembic/versions/d05669b60ebe_migrate_agents_to_orm.py +++ b/alembic/versions/d05669b60ebe_migrate_agents_to_orm.py @@ -9,9 +9,10 @@ from typing import Sequence, Union import sqlalchemy as sa -from alembic import op from sqlalchemy.dialects import postgresql +from alembic import op + # revision identifiers, used by Alembic. revision: str = "d05669b60ebe" down_revision: Union[str, None] = "c5d964280dff" diff --git a/alembic/versions/d14ae606614c_move_organizations_users_tools_to_orm.py b/alembic/versions/d14ae606614c_move_organizations_users_tools_to_orm.py index 5c0dab1943..e8733313f5 100644 --- a/alembic/versions/d14ae606614c_move_organizations_users_tools_to_orm.py +++ b/alembic/versions/d14ae606614c_move_organizations_users_tools_to_orm.py @@ -8,11 +8,12 @@ from typing import Sequence, Union -import letta import sqlalchemy as sa -from alembic import op from sqlalchemy.dialects import postgresql +import letta +from alembic import op + # revision identifiers, used by Alembic. revision: str = "d14ae606614c" down_revision: Union[str, None] = "9a505cc7eca9" diff --git a/alembic/versions/e1a625072dbf_tweak_created_at_field_for_messages.py b/alembic/versions/e1a625072dbf_tweak_created_at_field_for_messages.py index 4fd8abd2d2..fb425db317 100644 --- a/alembic/versions/e1a625072dbf_tweak_created_at_field_for_messages.py +++ b/alembic/versions/e1a625072dbf_tweak_created_at_field_for_messages.py @@ -8,9 +8,10 @@ from typing import Sequence, Union -from alembic import op from sqlalchemy.dialects import postgresql +from alembic import op + # revision identifiers, used by Alembic. revision: str = "e1a625072dbf" down_revision: Union[str, None] = "95badb46fdf9" diff --git a/alembic/versions/f7507eab4bb9_migrate_blocks_to_orm_model.py b/alembic/versions/f7507eab4bb9_migrate_blocks_to_orm_model.py index 37a67d88e6..9e7fa270c6 100644 --- a/alembic/versions/f7507eab4bb9_migrate_blocks_to_orm_model.py +++ b/alembic/versions/f7507eab4bb9_migrate_blocks_to_orm_model.py @@ -9,6 +9,7 @@ from typing import Sequence, Union import sqlalchemy as sa + from alembic import op # revision identifiers, used by Alembic. diff --git a/alembic/versions/f81ceea2c08d_create_sandbox_config_and_sandbox_env_.py b/alembic/versions/f81ceea2c08d_create_sandbox_config_and_sandbox_env_.py index 32a1b6779c..55332bfc15 100644 --- a/alembic/versions/f81ceea2c08d_create_sandbox_config_and_sandbox_env_.py +++ b/alembic/versions/f81ceea2c08d_create_sandbox_config_and_sandbox_env_.py @@ -9,6 +9,7 @@ from typing import Sequence, Union import sqlalchemy as sa + from alembic import op # revision identifiers, used by Alembic. diff --git a/examples/swarm/simple.py b/examples/swarm/simple.py index 7bedb03290..8e10c486df 100644 --- a/examples/swarm/simple.py +++ b/examples/swarm/simple.py @@ -1,7 +1,8 @@ import typer -from letta import EmbeddingConfig, LLMConfig from swarm import Swarm +from letta import EmbeddingConfig, LLMConfig + """ This is an example of how to implement the basic example provided by OpenAI for tranferring a conversation between two agents: https://github.com/openai/swarm/tree/main?tab=readme-ov-file#usage diff --git a/examples/swarm/swarm.py b/examples/swarm/swarm.py index 40552997b5..ef080806d2 100644 --- a/examples/swarm/swarm.py +++ b/examples/swarm/swarm.py @@ -2,6 +2,7 @@ from typing import List, Optional import typer + from letta import AgentState, EmbeddingConfig, LLMConfig, create_client from letta.schemas.agent import AgentType from letta.schemas.memory import BasicBlockMemory, Block diff --git a/examples/tool_rule_usage.py b/examples/tool_rule_usage.py index 4e0193f8f9..54e051e2d7 100644 --- a/examples/tool_rule_usage.py +++ b/examples/tool_rule_usage.py @@ -4,10 +4,7 @@ from letta import create_client from letta.schemas.letta_message import ToolCallMessage from letta.schemas.tool_rule import ChildToolRule, InitToolRule, TerminalToolRule -from tests.helpers.endpoints_helper import ( - assert_invoked_send_message_with_keyword, - setup_agent, -) +from tests.helpers.endpoints_helper import assert_invoked_send_message_with_keyword, setup_agent from tests.helpers.utils import cleanup from tests.test_model_letta_perfomance import llm_config_dir diff --git a/letta/__init__.py b/letta/__init__.py index d7911ff5ef..46390abe5a 100644 --- a/letta/__init__.py +++ b/letta/__init__.py @@ -12,13 +12,7 @@ from letta.schemas.job import Job from letta.schemas.letta_message import LettaMessage from letta.schemas.llm_config import LLMConfig -from letta.schemas.memory import ( - ArchivalMemorySummary, - BasicBlockMemory, - ChatMemory, - Memory, - RecallMemorySummary, -) +from letta.schemas.memory import ArchivalMemorySummary, BasicBlockMemory, ChatMemory, Memory, RecallMemorySummary from letta.schemas.message import Message from letta.schemas.openai.chat_completion_response import UsageStatistics from letta.schemas.organization import Organization diff --git a/letta/agent.py b/letta/agent.py index 12515ebacb..f61ace904c 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -7,17 +7,17 @@ from typing import List, Optional, Tuple, Union from letta.constants import ( - BASE_TOOLS, - CLI_WARNING_PREFIX, - ERROR_MESSAGE_PREFIX, - FIRST_MESSAGE_ATTEMPTS, - FUNC_FAILED_HEARTBEAT_MESSAGE, - LLM_MAX_TOKENS, - MESSAGE_SUMMARY_TRUNC_KEEP_N_LAST, - MESSAGE_SUMMARY_TRUNC_TOKEN_FRAC, - MESSAGE_SUMMARY_WARNING_FRAC, - O1_BASE_TOOLS, - REQ_HEARTBEAT_MESSAGE, + BASE_TOOLS, + CLI_WARNING_PREFIX, + ERROR_MESSAGE_PREFIX, + FIRST_MESSAGE_ATTEMPTS, + FUNC_FAILED_HEARTBEAT_MESSAGE, + LLM_MAX_TOKENS, + MESSAGE_SUMMARY_TRUNC_KEEP_N_LAST, + MESSAGE_SUMMARY_TRUNC_TOKEN_FRAC, + MESSAGE_SUMMARY_WARNING_FRAC, + O1_BASE_TOOLS, + REQ_HEARTBEAT_MESSAGE, ) from letta.errors import ContextWindowExceededError from letta.helpers import ToolRulesSolver @@ -33,44 +33,31 @@ from letta.schemas.enums import MessageRole from letta.schemas.memory import ContextWindowOverview, Memory from letta.schemas.message import Message -from letta.schemas.openai.chat_completion_request import ( - Tool as ChatCompletionRequestTool, -) +from letta.schemas.openai.chat_completion_request import Tool as ChatCompletionRequestTool from letta.schemas.openai.chat_completion_response import ChatCompletionResponse -from letta.schemas.openai.chat_completion_response import ( - Message as ChatCompletionMessage, -) +from letta.schemas.openai.chat_completion_response import Message as ChatCompletionMessage from letta.schemas.openai.chat_completion_response import UsageStatistics from letta.schemas.tool import Tool from letta.schemas.tool_rule import TerminalToolRule from letta.schemas.usage import LettaUsageStatistics from letta.services.agent_manager import AgentManager from letta.services.block_manager import BlockManager -from letta.services.helpers.agent_manager_helper import ( - check_supports_structured_output, - compile_memory_metadata_block, -) +from letta.services.helpers.agent_manager_helper import check_supports_structured_output, compile_memory_metadata_block from letta.services.message_manager import MessageManager from letta.services.passage_manager import PassageManager from letta.services.tool_execution_sandbox import ToolExecutionSandbox from letta.streaming_interface import StreamingRefreshCLIInterface -from letta.system import ( - get_heartbeat, - get_token_limit_warning, - package_function_response, - package_summarize_message, - package_user_message, -) +from letta.system import get_heartbeat, get_token_limit_warning, package_function_response, package_summarize_message, package_user_message from letta.utils import ( - count_tokens, - get_friendly_error_msg, - get_tool_call_id, - get_utc_time, - json_dumps, - json_loads, - parse_json, - printd, - validate_function_response, + count_tokens, + get_friendly_error_msg, + get_tool_call_id, + get_utc_time, + json_dumps, + json_loads, + parse_json, + printd, + validate_function_response, ) diff --git a/letta/benchmark/benchmark.py b/letta/benchmark/benchmark.py index b7c01ab7e9..7109210e9e 100644 --- a/letta/benchmark/benchmark.py +++ b/letta/benchmark/benchmark.py @@ -5,6 +5,7 @@ from typing import Annotated, Union import typer + from letta import LocalClient, RESTClient, create_client from letta.benchmark.constants import HUMAN, PERSONA, PROMPTS, TRIES from letta.config import LettaConfig diff --git a/letta/cli/cli.py b/letta/cli/cli.py index b385a01ca9..4441190b2c 100644 --- a/letta/cli/cli.py +++ b/letta/cli/cli.py @@ -3,18 +3,14 @@ from enum import Enum from typing import Annotated, Optional -import letta.utils as utils import questionary import typer + +import letta.utils as utils from letta import create_client from letta.agent import Agent, save_agent from letta.config import LettaConfig -from letta.constants import ( - CLI_WARNING_PREFIX, - CORE_MEMORY_BLOCK_CHAR_LIMIT, - LETTA_DIR, - MIN_CONTEXT_WINDOW, -) +from letta.constants import CLI_WARNING_PREFIX, CORE_MEMORY_BLOCK_CHAR_LIMIT, LETTA_DIR, MIN_CONTEXT_WINDOW from letta.local_llm.constants import ASSISTANT_MESSAGE_CLI_SYMBOL from letta.log import get_logger from letta.schemas.enums import OptionState @@ -22,9 +18,7 @@ from letta.server.server import logger as server_logger # from letta.interface import CLIInterface as interface # for printing to terminal -from letta.streaming_interface import ( - StreamingRefreshCLIInterface as interface, # for printing to terminal -) +from letta.streaming_interface import StreamingRefreshCLIInterface as interface # for printing to terminal from letta.utils import open_folder_in_explorer, printd logger = get_logger(__name__) diff --git a/letta/cli/cli_config.py b/letta/cli/cli_config.py index f70b466b23..8278d55317 100644 --- a/letta/cli/cli_config.py +++ b/letta/cli/cli_config.py @@ -5,10 +5,11 @@ import questionary import typer -from letta import utils from prettytable.colortable import ColorTable, Themes from tqdm import tqdm +from letta import utils + app = typer.Typer() diff --git a/letta/cli/cli_load.py b/letta/cli/cli_load.py index e1d7b1b8ce..b27da4d81a 100644 --- a/letta/cli/cli_load.py +++ b/letta/cli/cli_load.py @@ -13,6 +13,7 @@ import questionary import typer + from letta import create_client from letta.data_sources.connectors import DirectoryConnector diff --git a/letta/client/client.py b/letta/client/client.py index eb1b906f7e..9931628cd7 100644 --- a/letta/client/client.py +++ b/letta/client/client.py @@ -2,16 +2,10 @@ import time from typing import Callable, Dict, Generator, List, Optional, Union -import letta.utils import requests -from letta.constants import ( - ADMIN_PREFIX, - BASE_MEMORY_TOOLS, - BASE_TOOLS, - DEFAULT_HUMAN, - DEFAULT_PERSONA, - FUNCTION_RETURN_CHAR_LIMIT, -) + +import letta.utils +from letta.constants import ADMIN_PREFIX, BASE_MEMORY_TOOLS, BASE_TOOLS, DEFAULT_HUMAN, DEFAULT_PERSONA, FUNCTION_RETURN_CHAR_LIMIT from letta.data_sources.connectors import DataConnector from letta.functions.functions import parse_source_code from letta.orm.errors import NoResultFound @@ -26,26 +20,20 @@ from letta.schemas.letta_request import LettaRequest, LettaStreamingRequest from letta.schemas.letta_response import LettaResponse, LettaStreamingResponse from letta.schemas.llm_config import LLMConfig -from letta.schemas.memory import ( - ArchivalMemorySummary, - ChatMemory, - CreateArchivalMemory, - Memory, - RecallMemorySummary, -) +from letta.schemas.memory import ArchivalMemorySummary, ChatMemory, CreateArchivalMemory, Memory, RecallMemorySummary from letta.schemas.message import Message, MessageCreate, MessageUpdate from letta.schemas.openai.chat_completions import ToolCall from letta.schemas.organization import Organization from letta.schemas.passage import Passage from letta.schemas.sandbox_config import ( - E2BSandboxConfig, - LocalSandboxConfig, - SandboxConfig, - SandboxConfigCreate, - SandboxConfigUpdate, - SandboxEnvironmentVariable, - SandboxEnvironmentVariableCreate, - SandboxEnvironmentVariableUpdate, + E2BSandboxConfig, + LocalSandboxConfig, + SandboxConfig, + SandboxConfigCreate, + SandboxConfigUpdate, + SandboxEnvironmentVariable, + SandboxEnvironmentVariableCreate, + SandboxEnvironmentVariableUpdate, ) from letta.schemas.source import Source, SourceCreate, SourceUpdate from letta.schemas.tool import Tool, ToolCreate, ToolUpdate diff --git a/letta/client/streaming.py b/letta/client/streaming.py index 130e8ef2c8..86be5c41a3 100644 --- a/letta/client/streaming.py +++ b/letta/client/streaming.py @@ -3,14 +3,11 @@ import httpx from httpx_sse import SSEError, connect_sse + from letta.constants import OPENAI_CONTEXT_WINDOW_ERROR_SUBSTRING from letta.errors import LLMError from letta.schemas.enums import MessageStreamStatus -from letta.schemas.letta_message import ( - ReasoningMessage, - ToolCallMessage, - ToolReturnMessage, -) +from letta.schemas.letta_message import ReasoningMessage, ToolCallMessage, ToolReturnMessage from letta.schemas.letta_response import LettaStreamingResponse from letta.schemas.usage import LettaUsageStatistics diff --git a/letta/client/utils.py b/letta/client/utils.py index 1588f7d13b..f823ee87fe 100644 --- a/letta/client/utils.py +++ b/letta/client/utils.py @@ -3,12 +3,10 @@ from typing import Optional from IPython.display import HTML, display -from letta.local_llm.constants import ( - ASSISTANT_MESSAGE_CLI_SYMBOL, - INNER_THOUGHTS_CLI_SYMBOL, -) from sqlalchemy.testing.plugin.plugin_base import warnings +from letta.local_llm.constants import ASSISTANT_MESSAGE_CLI_SYMBOL, INNER_THOUGHTS_CLI_SYMBOL + def pprint(messages): """Utility function for pretty-printing the output of client.send_message in notebooks""" diff --git a/letta/config.py b/letta/config.py index a50154a60b..ed9e8668e6 100644 --- a/letta/config.py +++ b/letta/config.py @@ -5,12 +5,12 @@ import letta from letta.constants import ( - CORE_MEMORY_HUMAN_CHAR_LIMIT, - CORE_MEMORY_PERSONA_CHAR_LIMIT, - DEFAULT_HUMAN, - DEFAULT_PERSONA, - DEFAULT_PRESET, - LETTA_DIR, + CORE_MEMORY_HUMAN_CHAR_LIMIT, + CORE_MEMORY_PERSONA_CHAR_LIMIT, + DEFAULT_HUMAN, + DEFAULT_PERSONA, + DEFAULT_PRESET, + LETTA_DIR, ) from letta.log import get_logger from letta.schemas.embedding_config import EmbeddingConfig diff --git a/letta/data_sources/connectors.py b/letta/data_sources/connectors.py index 274e252420..8ae67f8818 100644 --- a/letta/data_sources/connectors.py +++ b/letta/data_sources/connectors.py @@ -1,11 +1,8 @@ from typing import Dict, Iterator, List, Tuple import typer -from letta.data_sources.connectors_helper import ( - assert_all_files_exist_locally, - extract_metadata_from_files, - get_filenames_in_dir, -) + +from letta.data_sources.connectors_helper import assert_all_files_exist_locally, extract_metadata_from_files, get_filenames_in_dir from letta.embeddings import embedding_model from letta.schemas.file import FileMetadata from letta.schemas.passage import Passage diff --git a/letta/embeddings.py b/letta/embeddings.py index 56f0163143..e588f17ab8 100644 --- a/letta/embeddings.py +++ b/letta/embeddings.py @@ -3,11 +3,8 @@ import numpy as np import tiktoken -from letta.constants import ( - EMBEDDING_TO_TOKENIZER_DEFAULT, - EMBEDDING_TO_TOKENIZER_MAP, - MAX_EMBEDDING_DIM, -) + +from letta.constants import EMBEDDING_TO_TOKENIZER_DEFAULT, EMBEDDING_TO_TOKENIZER_MAP, MAX_EMBEDDING_DIM from letta.schemas.embedding_config import EmbeddingConfig from letta.utils import is_valid_url, printd diff --git a/letta/functions/function_sets/extras.py b/letta/functions/function_sets/extras.py index c8edc93cb3..d5d21644fb 100644 --- a/letta/functions/function_sets/extras.py +++ b/letta/functions/function_sets/extras.py @@ -3,10 +3,8 @@ from typing import Optional import requests -from letta.constants import ( - MESSAGE_CHATGPT_FUNCTION_MODEL, - MESSAGE_CHATGPT_FUNCTION_SYSTEM_MESSAGE, -) + +from letta.constants import MESSAGE_CHATGPT_FUNCTION_MODEL, MESSAGE_CHATGPT_FUNCTION_SYSTEM_MESSAGE from letta.llm_api.llm_api_tools import create from letta.schemas.message import Message from letta.utils import json_dumps, json_loads diff --git a/letta/helpers/tool_rule_solver.py b/letta/helpers/tool_rule_solver.py index b9370bf7f7..cba8a0ca4e 100644 --- a/letta/helpers/tool_rule_solver.py +++ b/letta/helpers/tool_rule_solver.py @@ -1,16 +1,11 @@ import json from typing import List, Optional, Union -from letta.schemas.enums import ToolRuleType -from letta.schemas.tool_rule import ( - BaseToolRule, - ChildToolRule, - ConditionalToolRule, - InitToolRule, - TerminalToolRule, -) from pydantic import BaseModel, Field +from letta.schemas.enums import ToolRuleType +from letta.schemas.tool_rule import BaseToolRule, ChildToolRule, ConditionalToolRule, InitToolRule, TerminalToolRule + class ToolRuleValidationError(Exception): """Custom exception for tool rule validation errors in ToolRulesSolver.""" diff --git a/letta/interface.py b/letta/interface.py index 22e9678c53..28cb0264fd 100644 --- a/letta/interface.py +++ b/letta/interface.py @@ -3,11 +3,9 @@ from typing import List, Optional from colorama import Fore, Style, init + from letta.constants import CLI_WARNING_PREFIX -from letta.local_llm.constants import ( - ASSISTANT_MESSAGE_CLI_SYMBOL, - INNER_THOUGHTS_CLI_SYMBOL, -) +from letta.local_llm.constants import ASSISTANT_MESSAGE_CLI_SYMBOL, INNER_THOUGHTS_CLI_SYMBOL from letta.schemas.message import Message from letta.utils import json_loads, printd diff --git a/letta/llm_api/anthropic.py b/letta/llm_api/anthropic.py index 059c088151..fb42e696e1 100644 --- a/letta/llm_api/anthropic.py +++ b/letta/llm_api/anthropic.py @@ -5,13 +5,9 @@ from letta.llm_api.helpers import make_post_request from letta.schemas.message import Message from letta.schemas.openai.chat_completion_request import ChatCompletionRequest, Tool +from letta.schemas.openai.chat_completion_response import ChatCompletionResponse, Choice, FunctionCall from letta.schemas.openai.chat_completion_response import ( - ChatCompletionResponse, - Choice, - FunctionCall, -) -from letta.schemas.openai.chat_completion_response import ( - Message as ChoiceMessage, # NOTE: avoid conflict with our own Letta Message datatype + Message as ChoiceMessage, # NOTE: avoid conflict with our own Letta Message datatype ) from letta.schemas.openai.chat_completion_response import ToolCall, UsageStatistics from letta.utils import get_utc_time, smart_urljoin diff --git a/letta/llm_api/azure_openai.py b/letta/llm_api/azure_openai.py index 047f2f86b2..e60b547be7 100644 --- a/letta/llm_api/azure_openai.py +++ b/letta/llm_api/azure_openai.py @@ -1,6 +1,7 @@ from collections import defaultdict import requests + from letta.llm_api.helpers import make_post_request from letta.schemas.llm_config import LLMConfig from letta.schemas.openai.chat_completion_response import ChatCompletionResponse diff --git a/letta/llm_api/cohere.py b/letta/llm_api/cohere.py index 7ea633e084..0259f6feb5 100644 --- a/letta/llm_api/cohere.py +++ b/letta/llm_api/cohere.py @@ -3,16 +3,13 @@ from typing import List, Optional, Union import requests + from letta.local_llm.utils import count_tokens from letta.schemas.message import Message from letta.schemas.openai.chat_completion_request import ChatCompletionRequest, Tool +from letta.schemas.openai.chat_completion_response import ChatCompletionResponse, Choice, FunctionCall from letta.schemas.openai.chat_completion_response import ( - ChatCompletionResponse, - Choice, - FunctionCall, -) -from letta.schemas.openai.chat_completion_response import ( - Message as ChoiceMessage, # NOTE: avoid conflict with our own Letta Message datatype + Message as ChoiceMessage, # NOTE: avoid conflict with our own Letta Message datatype ) from letta.schemas.openai.chat_completion_response import ToolCall, UsageStatistics from letta.utils import get_tool_call_id, get_utc_time, json_dumps, smart_urljoin @@ -275,10 +272,7 @@ def convert_tools_to_cohere_format(tools: List[Tool], inner_thoughts_in_kwargs: if inner_thoughts_in_kwargs: # NOTE: since Cohere doesn't allow "text" in the response when a tool call happens, if we want # a simultaneous CoT + tool call we need to put it inside a kwarg - from letta.local_llm.constants import ( - INNER_THOUGHTS_KWARG, - INNER_THOUGHTS_KWARG_DESCRIPTION, - ) + from letta.local_llm.constants import INNER_THOUGHTS_KWARG, INNER_THOUGHTS_KWARG_DESCRIPTION for cohere_tool in tools_dict_list: cohere_tool["parameter_definitions"][INNER_THOUGHTS_KWARG] = { diff --git a/letta/llm_api/google_ai.py b/letta/llm_api/google_ai.py index 483a319f15..1eec3eaae3 100644 --- a/letta/llm_api/google_ai.py +++ b/letta/llm_api/google_ai.py @@ -2,19 +2,13 @@ from typing import List, Optional, Tuple import requests + from letta.constants import NON_USER_MSG_PREFIX from letta.llm_api.helpers import make_post_request from letta.local_llm.json_parser import clean_json_string_extra_backslash from letta.local_llm.utils import count_tokens from letta.schemas.openai.chat_completion_request import Tool -from letta.schemas.openai.chat_completion_response import ( - ChatCompletionResponse, - Choice, - FunctionCall, - Message, - ToolCall, - UsageStatistics, -) +from letta.schemas.openai.chat_completion_response import ChatCompletionResponse, Choice, FunctionCall, Message, ToolCall, UsageStatistics from letta.utils import get_tool_call_id, get_utc_time, json_dumps @@ -229,10 +223,7 @@ def convert_tools_to_google_ai_format(tools: List[Tool], inner_thoughts_in_kwarg param_fields["type"] = param_fields["type"].upper() # Add inner thoughts if inner_thoughts_in_kwargs: - from letta.local_llm.constants import ( - INNER_THOUGHTS_KWARG, - INNER_THOUGHTS_KWARG_DESCRIPTION, - ) + from letta.local_llm.constants import INNER_THOUGHTS_KWARG, INNER_THOUGHTS_KWARG_DESCRIPTION func["parameters"]["properties"][INNER_THOUGHTS_KWARG] = { "type": "STRING", diff --git a/letta/llm_api/helpers.py b/letta/llm_api/helpers.py index 25f77e2445..1244b6ffe7 100644 --- a/letta/llm_api/helpers.py +++ b/letta/llm_api/helpers.py @@ -5,6 +5,7 @@ from typing import Any, List, Union import requests + from letta.constants import OPENAI_CONTEXT_WINDOW_ERROR_SUBSTRING from letta.schemas.openai.chat_completion_response import ChatCompletionResponse, Choice from letta.utils import json_dumps, printd diff --git a/letta/llm_api/llm_api_tools.py b/letta/llm_api/llm_api_tools.py index 9acb1f0177..030d7375c4 100644 --- a/letta/llm_api/llm_api_tools.py +++ b/letta/llm_api/llm_api_tools.py @@ -3,42 +3,27 @@ from typing import List, Optional, Union import requests + from letta.constants import CLI_WARNING_PREFIX from letta.errors import LettaConfigurationError, RateLimitExceededError from letta.llm_api.anthropic import anthropic_chat_completions_request from letta.llm_api.azure_openai import azure_openai_chat_completions_request -from letta.llm_api.google_ai import ( - convert_tools_to_google_ai_format, - google_ai_chat_completions_request, -) -from letta.llm_api.helpers import ( - add_inner_thoughts_to_functions, - unpack_all_inner_thoughts_from_kwargs, -) +from letta.llm_api.google_ai import convert_tools_to_google_ai_format, google_ai_chat_completions_request +from letta.llm_api.helpers import add_inner_thoughts_to_functions, unpack_all_inner_thoughts_from_kwargs from letta.llm_api.openai import ( - build_openai_chat_completions_request, - openai_chat_completions_process_stream, - openai_chat_completions_request, + build_openai_chat_completions_request, + openai_chat_completions_process_stream, + openai_chat_completions_request, ) from letta.local_llm.chat_completion_proxy import get_chat_completion -from letta.local_llm.constants import ( - INNER_THOUGHTS_KWARG, - INNER_THOUGHTS_KWARG_DESCRIPTION, -) +from letta.local_llm.constants import INNER_THOUGHTS_KWARG, INNER_THOUGHTS_KWARG_DESCRIPTION from letta.local_llm.utils import num_tokens_from_functions, num_tokens_from_messages from letta.schemas.llm_config import LLMConfig from letta.schemas.message import Message -from letta.schemas.openai.chat_completion_request import ( - ChatCompletionRequest, - Tool, - cast_message_to_subtype, -) +from letta.schemas.openai.chat_completion_request import ChatCompletionRequest, Tool, cast_message_to_subtype from letta.schemas.openai.chat_completion_response import ChatCompletionResponse from letta.settings import ModelSettings -from letta.streaming_interface import ( - AgentChunkStreamingInterface, - AgentRefreshStreamingInterface, -) +from letta.streaming_interface import AgentChunkStreamingInterface, AgentRefreshStreamingInterface LLM_API_PROVIDER_OPTIONS = ["openai", "azure", "anthropic", "google_ai", "cohere", "local", "groq"] diff --git a/letta/llm_api/mistral.py b/letta/llm_api/mistral.py index b53d76edb8..932cf87484 100644 --- a/letta/llm_api/mistral.py +++ b/letta/llm_api/mistral.py @@ -1,4 +1,5 @@ import requests + from letta.utils import printd, smart_urljoin diff --git a/letta/llm_api/openai.py b/letta/llm_api/openai.py index 3ad3cf2a3f..bb3557568a 100644 --- a/letta/llm_api/openai.py +++ b/letta/llm_api/openai.py @@ -6,44 +6,29 @@ import requests from httpx_sse import connect_sse from httpx_sse._exceptions import SSEError + from letta.constants import OPENAI_CONTEXT_WINDOW_ERROR_SUBSTRING from letta.errors import LLMError -from letta.llm_api.helpers import ( - add_inner_thoughts_to_functions, - convert_to_structured_output, - make_post_request, -) -from letta.local_llm.constants import ( - INNER_THOUGHTS_KWARG, - INNER_THOUGHTS_KWARG_DESCRIPTION, -) +from letta.llm_api.helpers import add_inner_thoughts_to_functions, convert_to_structured_output, make_post_request +from letta.local_llm.constants import INNER_THOUGHTS_KWARG, INNER_THOUGHTS_KWARG_DESCRIPTION from letta.local_llm.utils import num_tokens_from_functions, num_tokens_from_messages from letta.schemas.llm_config import LLMConfig from letta.schemas.message import Message as _Message from letta.schemas.message import MessageRole as _MessageRole from letta.schemas.openai.chat_completion_request import ChatCompletionRequest -from letta.schemas.openai.chat_completion_request import ( - FunctionCall as ToolFunctionChoiceFunctionCall, -) -from letta.schemas.openai.chat_completion_request import ( - Tool, - ToolFunctionChoice, - cast_message_to_subtype, -) +from letta.schemas.openai.chat_completion_request import FunctionCall as ToolFunctionChoiceFunctionCall +from letta.schemas.openai.chat_completion_request import Tool, ToolFunctionChoice, cast_message_to_subtype from letta.schemas.openai.chat_completion_response import ( - ChatCompletionChunkResponse, - ChatCompletionResponse, - Choice, - FunctionCall, - Message, - ToolCall, - UsageStatistics, + ChatCompletionChunkResponse, + ChatCompletionResponse, + Choice, + FunctionCall, + Message, + ToolCall, + UsageStatistics, ) from letta.schemas.openai.embedding_response import EmbeddingResponse -from letta.streaming_interface import ( - AgentChunkStreamingInterface, - AgentRefreshStreamingInterface, -) +from letta.streaming_interface import AgentChunkStreamingInterface, AgentRefreshStreamingInterface from letta.utils import get_tool_call_id, smart_urljoin OPENAI_SSE_DONE = "[DONE]" diff --git a/letta/local_llm/chat_completion_proxy.py b/letta/local_llm/chat_completion_proxy.py index aa1731819a..184489c8de 100644 --- a/letta/local_llm/chat_completion_proxy.py +++ b/letta/local_llm/chat_completion_proxy.py @@ -3,14 +3,12 @@ import uuid import requests + from letta.constants import CLI_WARNING_PREFIX from letta.errors import LocalLLMConnectionError, LocalLLMError from letta.local_llm.constants import DEFAULT_WRAPPER from letta.local_llm.function_parser import patch_function -from letta.local_llm.grammars.gbnf_grammar_generator import ( - create_dynamic_model_from_function, - generate_gbnf_grammar_and_documentation, -) +from letta.local_llm.grammars.gbnf_grammar_generator import create_dynamic_model_from_function, generate_gbnf_grammar_and_documentation from letta.local_llm.koboldcpp.api import get_koboldcpp_completion from letta.local_llm.llamacpp.api import get_llamacpp_completion from letta.local_llm.llm_chat_completion_wrappers import simple_summary_wrapper @@ -19,17 +17,9 @@ from letta.local_llm.utils import count_tokens, get_available_wrappers from letta.local_llm.vllm.api import get_vllm_completion from letta.local_llm.webui.api import get_webui_completion -from letta.local_llm.webui.legacy_api import ( - get_webui_completion as get_webui_completion_legacy, -) +from letta.local_llm.webui.legacy_api import get_webui_completion as get_webui_completion_legacy from letta.prompts.gpt_summarize import SYSTEM as SUMMARIZE_SYSTEM_MESSAGE -from letta.schemas.openai.chat_completion_response import ( - ChatCompletionResponse, - Choice, - Message, - ToolCall, - UsageStatistics, -) +from letta.schemas.openai.chat_completion_response import ChatCompletionResponse, Choice, Message, ToolCall, UsageStatistics from letta.utils import get_tool_call_id, get_utc_time, json_dumps has_shown_warning = False diff --git a/letta/local_llm/constants.py b/letta/local_llm/constants.py index 4552f10391..03abcc81d9 100644 --- a/letta/local_llm/constants.py +++ b/letta/local_llm/constants.py @@ -1,7 +1,5 @@ # import letta.local_llm.llm_chat_completion_wrappers.airoboros as airoboros -from letta.local_llm.llm_chat_completion_wrappers.chatml import ( - ChatMLInnerMonologueWrapper, -) +from letta.local_llm.llm_chat_completion_wrappers.chatml import ChatMLInnerMonologueWrapper DEFAULT_ENDPOINTS = { # Local diff --git a/letta/local_llm/grammars/gbnf_grammar_generator.py b/letta/local_llm/grammars/gbnf_grammar_generator.py index ce3ace7392..402b21bfdd 100644 --- a/letta/local_llm/grammars/gbnf_grammar_generator.py +++ b/letta/local_llm/grammars/gbnf_grammar_generator.py @@ -5,23 +5,13 @@ from enum import Enum from inspect import getdoc, isclass from types import NoneType -from typing import ( - Any, - Callable, - List, - Optional, - Tuple, - Type, - Union, - _GenericAlias, - get_args, - get_origin, -) +from typing import Any, Callable, List, Optional, Tuple, Type, Union, _GenericAlias, get_args, get_origin from docstring_parser import parse -from letta.utils import json_dumps from pydantic import BaseModel, create_model +from letta.utils import json_dumps + class PydanticDataType(Enum): """ diff --git a/letta/local_llm/llm_chat_completion_wrappers/chatml.py b/letta/local_llm/llm_chat_completion_wrappers/chatml.py index 583b77b990..2c1ebaf7f7 100644 --- a/letta/local_llm/llm_chat_completion_wrappers/chatml.py +++ b/letta/local_llm/llm_chat_completion_wrappers/chatml.py @@ -1,8 +1,6 @@ from letta.errors import LLMJSONParsingError from letta.local_llm.json_parser import clean_json -from letta.local_llm.llm_chat_completion_wrappers.wrapper_base import ( - LLMChatCompletionWrapper, -) +from letta.local_llm.llm_chat_completion_wrappers.wrapper_base import LLMChatCompletionWrapper from letta.schemas.enums import MessageRole from letta.utils import json_dumps, json_loads @@ -75,10 +73,7 @@ def _compile_function_description(self, schema, add_inner_thoughts=True) -> str: func_str += f"\n description: {schema['description']}" func_str += f"\n params:" if add_inner_thoughts: - from letta.local_llm.constants import ( - INNER_THOUGHTS_KWARG, - INNER_THOUGHTS_KWARG_DESCRIPTION, - ) + from letta.local_llm.constants import INNER_THOUGHTS_KWARG, INNER_THOUGHTS_KWARG_DESCRIPTION func_str += f"\n {INNER_THOUGHTS_KWARG}: {INNER_THOUGHTS_KWARG_DESCRIPTION}" for param_k, param_v in schema["parameters"]["properties"].items(): diff --git a/letta/local_llm/llm_chat_completion_wrappers/configurable_wrapper.py b/letta/local_llm/llm_chat_completion_wrappers/configurable_wrapper.py index 4b41d7a574..19f2566856 100644 --- a/letta/local_llm/llm_chat_completion_wrappers/configurable_wrapper.py +++ b/letta/local_llm/llm_chat_completion_wrappers/configurable_wrapper.py @@ -1,4 +1,5 @@ import yaml + from letta.utils import json_dumps, json_loads from ...errors import LLMJSONParsingError diff --git a/letta/local_llm/llm_chat_completion_wrappers/llama3.py b/letta/local_llm/llm_chat_completion_wrappers/llama3.py index 43174dd549..804e90db72 100644 --- a/letta/local_llm/llm_chat_completion_wrappers/llama3.py +++ b/letta/local_llm/llm_chat_completion_wrappers/llama3.py @@ -1,8 +1,6 @@ from letta.errors import LLMJSONParsingError from letta.local_llm.json_parser import clean_json -from letta.local_llm.llm_chat_completion_wrappers.wrapper_base import ( - LLMChatCompletionWrapper, -) +from letta.local_llm.llm_chat_completion_wrappers.wrapper_base import LLMChatCompletionWrapper from letta.utils import json_dumps, json_loads PREFIX_HINT = """# Reminders: @@ -74,10 +72,7 @@ def _compile_function_description(self, schema, add_inner_thoughts=True) -> str: func_str += f"\n description: {schema['description']}" func_str += "\n params:" if add_inner_thoughts: - from letta.local_llm.constants import ( - INNER_THOUGHTS_KWARG, - INNER_THOUGHTS_KWARG_DESCRIPTION, - ) + from letta.local_llm.constants import INNER_THOUGHTS_KWARG, INNER_THOUGHTS_KWARG_DESCRIPTION func_str += f"\n {INNER_THOUGHTS_KWARG}: {INNER_THOUGHTS_KWARG_DESCRIPTION}" for param_k, param_v in schema["parameters"]["properties"].items(): diff --git a/letta/local_llm/settings/settings.py b/letta/local_llm/settings/settings.py index 8a3fcbe8d2..9efbcf6ac5 100644 --- a/letta/local_llm/settings/settings.py +++ b/letta/local_llm/settings/settings.py @@ -2,9 +2,7 @@ import os from letta.constants import LETTA_DIR -from letta.local_llm.settings.deterministic_mirostat import ( - settings as det_miro_settings, -) +from letta.local_llm.settings.deterministic_mirostat import settings as det_miro_settings from letta.local_llm.settings.simple import settings as simple_settings DEFAULT = "simple" diff --git a/letta/local_llm/utils.py b/letta/local_llm/utils.py index 796b3c57a1..b0529c358a 100644 --- a/letta/local_llm/utils.py +++ b/letta/local_llm/utils.py @@ -2,14 +2,15 @@ import warnings from typing import List, Union +import requests +import tiktoken + import letta.local_llm.llm_chat_completion_wrappers.airoboros as airoboros import letta.local_llm.llm_chat_completion_wrappers.chatml as chatml import letta.local_llm.llm_chat_completion_wrappers.configurable_wrapper as configurable_wrapper import letta.local_llm.llm_chat_completion_wrappers.dolphin as dolphin import letta.local_llm.llm_chat_completion_wrappers.llama3 as llama3 import letta.local_llm.llm_chat_completion_wrappers.zephyr as zephyr -import requests -import tiktoken from letta.schemas.openai.chat_completion_request import Tool, ToolCall diff --git a/letta/main.py b/letta/main.py index bbcd56e594..de1b4028ab 100644 --- a/letta/main.py +++ b/letta/main.py @@ -2,12 +2,14 @@ import sys import traceback -import letta.agent as agent -import letta.errors as errors -import letta.system as system import questionary import requests import typer +from rich.console import Console + +import letta.agent as agent +import letta.errors as errors +import letta.system as system # import benchmark from letta import create_client @@ -20,7 +22,6 @@ # from letta.interface import CLIInterface as interface # for printing to terminal from letta.streaming_interface import AgentRefreshStreamingInterface -from rich.console import Console # interface = interface() diff --git a/letta/orm/agent.py b/letta/orm/agent.py index b8c541e2d1..353d4fe783 100644 --- a/letta/orm/agent.py +++ b/letta/orm/agent.py @@ -1,12 +1,11 @@ import uuid from typing import TYPE_CHECKING, List, Optional +from sqlalchemy import JSON, String, UniqueConstraint +from sqlalchemy.orm import Mapped, mapped_column, relationship + from letta.orm.block import Block -from letta.orm.custom_columns import ( - EmbeddingConfigColumn, - LLMConfigColumn, - ToolRulesColumn, -) +from letta.orm.custom_columns import EmbeddingConfigColumn, LLMConfigColumn, ToolRulesColumn from letta.orm.message import Message from letta.orm.mixins import OrganizationMixin from letta.orm.organization import Organization @@ -17,8 +16,6 @@ from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import Memory from letta.schemas.tool_rule import ToolRule -from sqlalchemy import JSON, String, UniqueConstraint -from sqlalchemy.orm import Mapped, mapped_column, relationship if TYPE_CHECKING: from letta.orm.agents_tags import AgentsTags diff --git a/letta/orm/agents_tags.py b/letta/orm/agents_tags.py index 5041f629c1..76ff90110c 100644 --- a/letta/orm/agents_tags.py +++ b/letta/orm/agents_tags.py @@ -1,7 +1,8 @@ -from letta.orm.base import Base from sqlalchemy import ForeignKey, String, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column, relationship +from letta.orm.base import Base + class AgentsTags(Base): __tablename__ = "agents_tags" diff --git a/letta/orm/base.py b/letta/orm/base.py index f740ef45d4..62951741f2 100644 --- a/letta/orm/base.py +++ b/letta/orm/base.py @@ -2,13 +2,7 @@ from typing import Optional from sqlalchemy import Boolean, DateTime, String, func, text -from sqlalchemy.orm import ( - DeclarativeBase, - Mapped, - declarative_mixin, - declared_attr, - mapped_column, -) +from sqlalchemy.orm import DeclarativeBase, Mapped, declarative_mixin, declared_attr, mapped_column class Base(DeclarativeBase): diff --git a/letta/orm/block.py b/letta/orm/block.py index 6759596da1..99cfa29b2e 100644 --- a/letta/orm/block.py +++ b/letta/orm/block.py @@ -1,13 +1,14 @@ from typing import TYPE_CHECKING, Optional, Type +from sqlalchemy import JSON, BigInteger, Integer, UniqueConstraint, event +from sqlalchemy.orm import Mapped, attributes, mapped_column, relationship + from letta.constants import CORE_MEMORY_BLOCK_CHAR_LIMIT from letta.orm.blocks_agents import BlocksAgents from letta.orm.mixins import OrganizationMixin from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.schemas.block import Block as PydanticBlock from letta.schemas.block import Human, Persona -from sqlalchemy import JSON, BigInteger, Integer, UniqueConstraint, event -from sqlalchemy.orm import Mapped, attributes, mapped_column, relationship if TYPE_CHECKING: from letta.orm import Organization diff --git a/letta/orm/blocks_agents.py b/letta/orm/blocks_agents.py index 86a75e9a10..4774783b59 100644 --- a/letta/orm/blocks_agents.py +++ b/letta/orm/blocks_agents.py @@ -1,7 +1,8 @@ -from letta.orm.base import Base from sqlalchemy import ForeignKey, ForeignKeyConstraint, String, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column +from letta.orm.base import Base + class BlocksAgents(Base): """Agents must have one or many blocks to make up their core memory.""" diff --git a/letta/orm/custom_columns.py b/letta/orm/custom_columns.py index 05113a6a51..f53169d93e 100644 --- a/letta/orm/custom_columns.py +++ b/letta/orm/custom_columns.py @@ -2,18 +2,14 @@ from typing import List, Union import numpy as np +from sqlalchemy import JSON +from sqlalchemy.types import BINARY, TypeDecorator + from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.enums import ToolRuleType from letta.schemas.llm_config import LLMConfig from letta.schemas.openai.chat_completions import ToolCall, ToolCallFunction -from letta.schemas.tool_rule import ( - ChildToolRule, - ConditionalToolRule, - InitToolRule, - TerminalToolRule, -) -from sqlalchemy import JSON -from sqlalchemy.types import BINARY, TypeDecorator +from letta.schemas.tool_rule import ChildToolRule, ConditionalToolRule, InitToolRule, TerminalToolRule class EmbeddingConfigColumn(TypeDecorator): diff --git a/letta/orm/file.py b/letta/orm/file.py index 4216a01a42..88342700e4 100644 --- a/letta/orm/file.py +++ b/letta/orm/file.py @@ -1,10 +1,11 @@ from typing import TYPE_CHECKING, List, Optional +from sqlalchemy import Integer, String +from sqlalchemy.orm import Mapped, mapped_column, relationship + from letta.orm.mixins import OrganizationMixin, SourceMixin from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.schemas.file import FileMetadata as PydanticFileMetadata -from sqlalchemy import Integer, String -from sqlalchemy.orm import Mapped, mapped_column, relationship if TYPE_CHECKING: from letta.orm.organization import Organization diff --git a/letta/orm/job.py b/letta/orm/job.py index fabdb9188e..d95abe443f 100644 --- a/letta/orm/job.py +++ b/letta/orm/job.py @@ -1,12 +1,13 @@ from datetime import datetime from typing import TYPE_CHECKING, Optional +from sqlalchemy import JSON, String +from sqlalchemy.orm import Mapped, mapped_column, relationship + from letta.orm.mixins import UserMixin from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.schemas.enums import JobStatus from letta.schemas.job import Job as PydanticJob -from sqlalchemy import JSON, String -from sqlalchemy.orm import Mapped, mapped_column, relationship if TYPE_CHECKING: from letta.orm.user import User diff --git a/letta/orm/message.py b/letta/orm/message.py index 6e2194f5ca..a8bbb90017 100644 --- a/letta/orm/message.py +++ b/letta/orm/message.py @@ -1,12 +1,13 @@ from typing import Optional +from sqlalchemy import Index +from sqlalchemy.orm import Mapped, mapped_column, relationship + from letta.orm.custom_columns import ToolCallColumn from letta.orm.mixins import AgentMixin, OrganizationMixin from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.schemas.message import Message as PydanticMessage from letta.schemas.openai.chat_completions import ToolCall -from sqlalchemy import Index -from sqlalchemy.orm import Mapped, mapped_column, relationship class Message(SqlalchemyBase, OrganizationMixin, AgentMixin): diff --git a/letta/orm/mixins.py b/letta/orm/mixins.py index 3e82f4d690..febf84de28 100644 --- a/letta/orm/mixins.py +++ b/letta/orm/mixins.py @@ -1,10 +1,11 @@ from typing import Optional from uuid import UUID -from letta.orm.base import Base from sqlalchemy import ForeignKey, String from sqlalchemy.orm import Mapped, mapped_column +from letta.orm.base import Base + def is_valid_uuid4(uuid_string: str) -> bool: """Check if a string is a valid UUID4.""" diff --git a/letta/orm/organization.py b/letta/orm/organization.py index 9bcc09b2a5..335a15d0f4 100644 --- a/letta/orm/organization.py +++ b/letta/orm/organization.py @@ -1,8 +1,9 @@ from typing import TYPE_CHECKING, List, Union +from sqlalchemy.orm import Mapped, mapped_column, relationship + from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.schemas.organization import Organization as PydanticOrganization -from sqlalchemy.orm import Mapped, mapped_column, relationship if TYPE_CHECKING: diff --git a/letta/orm/passage.py b/letta/orm/passage.py index 8237ed612a..492c602174 100644 --- a/letta/orm/passage.py +++ b/letta/orm/passage.py @@ -1,5 +1,8 @@ from typing import TYPE_CHECKING +from sqlalchemy import JSON, Column, Index +from sqlalchemy.orm import Mapped, declared_attr, mapped_column, relationship + from letta.config import LettaConfig from letta.constants import MAX_EMBEDDING_DIM from letta.orm.custom_columns import CommonVector, EmbeddingConfigColumn @@ -7,8 +10,6 @@ from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.schemas.passage import Passage as PydanticPassage from letta.settings import settings -from sqlalchemy import JSON, Column, Index -from sqlalchemy.orm import Mapped, declared_attr, mapped_column, relationship config = LettaConfig() diff --git a/letta/orm/sandbox_config.py b/letta/orm/sandbox_config.py index 600e0c8a88..9058657f62 100644 --- a/letta/orm/sandbox_config.py +++ b/letta/orm/sandbox_config.py @@ -1,17 +1,16 @@ from typing import TYPE_CHECKING, Dict, List, Optional -from letta.orm.mixins import OrganizationMixin, SandboxConfigMixin -from letta.orm.sqlalchemy_base import SqlalchemyBase -from letta.schemas.sandbox_config import SandboxConfig as PydanticSandboxConfig -from letta.schemas.sandbox_config import ( - SandboxEnvironmentVariable as PydanticSandboxEnvironmentVariable, -) -from letta.schemas.sandbox_config import SandboxType from sqlalchemy import JSON from sqlalchemy import Enum as SqlEnum from sqlalchemy import String, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column, relationship +from letta.orm.mixins import OrganizationMixin, SandboxConfigMixin +from letta.orm.sqlalchemy_base import SqlalchemyBase +from letta.schemas.sandbox_config import SandboxConfig as PydanticSandboxConfig +from letta.schemas.sandbox_config import SandboxEnvironmentVariable as PydanticSandboxEnvironmentVariable +from letta.schemas.sandbox_config import SandboxType + if TYPE_CHECKING: from letta.orm.organization import Organization diff --git a/letta/orm/source.py b/letta/orm/source.py index 838f4c78da..e7443ea67e 100644 --- a/letta/orm/source.py +++ b/letta/orm/source.py @@ -1,13 +1,14 @@ from typing import TYPE_CHECKING, List, Optional +from sqlalchemy import JSON +from sqlalchemy.orm import Mapped, mapped_column, relationship + from letta.orm import FileMetadata from letta.orm.custom_columns import EmbeddingConfigColumn from letta.orm.mixins import OrganizationMixin from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.source import Source as PydanticSource -from sqlalchemy import JSON -from sqlalchemy.orm import Mapped, mapped_column, relationship if TYPE_CHECKING: from letta.orm.agent import Agent diff --git a/letta/orm/sources_agents.py b/letta/orm/sources_agents.py index 2da5003f4b..ffe8a9d0ea 100644 --- a/letta/orm/sources_agents.py +++ b/letta/orm/sources_agents.py @@ -1,7 +1,8 @@ -from letta.orm.base import Base from sqlalchemy import ForeignKey, String from sqlalchemy.orm import Mapped, mapped_column +from letta.orm.base import Base + class SourcesAgents(Base): """Agents can have zero to many sources""" diff --git a/letta/orm/sqlalchemy_base.py b/letta/orm/sqlalchemy_base.py index 3e307bc4a3..c5240f3c16 100644 --- a/letta/orm/sqlalchemy_base.py +++ b/letta/orm/sqlalchemy_base.py @@ -3,19 +3,15 @@ from functools import wraps from typing import TYPE_CHECKING, List, Literal, Optional -from letta.log import get_logger -from letta.orm.base import Base, CommonSqlalchemyMetaMixins -from letta.orm.errors import ( - DatabaseTimeoutError, - ForeignKeyConstraintViolationError, - NoResultFound, - UniqueConstraintViolationError, -) -from letta.orm.sqlite_functions import adapt_array from sqlalchemy import String, desc, func, or_, select from sqlalchemy.exc import DBAPIError, IntegrityError, TimeoutError from sqlalchemy.orm import Mapped, Session, mapped_column +from letta.log import get_logger +from letta.orm.base import Base, CommonSqlalchemyMetaMixins +from letta.orm.errors import DatabaseTimeoutError, ForeignKeyConstraintViolationError, NoResultFound, UniqueConstraintViolationError +from letta.orm.sqlite_functions import adapt_array + if TYPE_CHECKING: from pydantic import BaseModel from sqlalchemy.orm import Session diff --git a/letta/orm/sqlite_functions.py b/letta/orm/sqlite_functions.py index 50c257a082..f5957cd6c7 100644 --- a/letta/orm/sqlite_functions.py +++ b/letta/orm/sqlite_functions.py @@ -3,10 +3,11 @@ from typing import Optional, Union import numpy as np -from letta.constants import MAX_EMBEDDING_DIM from sqlalchemy import event from sqlalchemy.engine import Engine +from letta.constants import MAX_EMBEDDING_DIM + def adapt_array(arr): """ diff --git a/letta/orm/tool.py b/letta/orm/tool.py index 50d4750623..a25c7ebb00 100644 --- a/letta/orm/tool.py +++ b/letta/orm/tool.py @@ -1,12 +1,13 @@ from typing import TYPE_CHECKING, List, Optional +from sqlalchemy import JSON, String, UniqueConstraint +from sqlalchemy.orm import Mapped, mapped_column, relationship + # TODO everything in functions should live in this model from letta.orm.enums import ToolSourceType from letta.orm.mixins import OrganizationMixin from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.schemas.tool import Tool as PydanticTool -from sqlalchemy import JSON, String, UniqueConstraint -from sqlalchemy.orm import Mapped, mapped_column, relationship if TYPE_CHECKING: from letta.orm.organization import Organization diff --git a/letta/orm/tools_agents.py b/letta/orm/tools_agents.py index 50668d940a..52c1e0a1e2 100644 --- a/letta/orm/tools_agents.py +++ b/letta/orm/tools_agents.py @@ -1,7 +1,8 @@ -from letta.orm import Base from sqlalchemy import ForeignKey, String, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column +from letta.orm import Base + class ToolsAgents(Base): """Agents can have one or many tools associated with them.""" diff --git a/letta/orm/user.py b/letta/orm/user.py index 23c2b268a7..9f626b104d 100644 --- a/letta/orm/user.py +++ b/letta/orm/user.py @@ -1,9 +1,10 @@ from typing import TYPE_CHECKING, List +from sqlalchemy.orm import Mapped, mapped_column, relationship + from letta.orm.mixins import OrganizationMixin from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.schemas.user import User as PydanticUser -from sqlalchemy.orm import Mapped, mapped_column, relationship if TYPE_CHECKING: from letta.orm import Job, Organization diff --git a/letta/providers.py b/letta/providers.py index 23964c6286..87a7557db1 100644 --- a/letta/providers.py +++ b/letta/providers.py @@ -1,14 +1,12 @@ from typing import List, Optional +from pydantic import BaseModel, Field, model_validator + from letta.constants import LLM_MAX_TOKENS, MIN_CONTEXT_WINDOW -from letta.llm_api.azure_openai import ( - get_azure_chat_completions_endpoint, - get_azure_embeddings_endpoint, -) +from letta.llm_api.azure_openai import get_azure_chat_completions_endpoint, get_azure_embeddings_endpoint from letta.llm_api.azure_openai_constants import AZURE_MODEL_TO_CONTEXT_LENGTH from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.llm_config import LLMConfig -from pydantic import BaseModel, Field, model_validator class Provider(BaseModel): @@ -567,9 +565,7 @@ def set_default_api_version(cls, values): return values def list_llm_models(self) -> List[LLMConfig]: - from letta.llm_api.azure_openai import ( - azure_openai_get_chat_completion_model_list, - ) + from letta.llm_api.azure_openai import azure_openai_get_chat_completion_model_list model_options = azure_openai_get_chat_completion_model_list(self.base_url, api_key=self.api_key, api_version=self.api_version) configs = [] diff --git a/letta/schemas/agent.py b/letta/schemas/agent.py index 06fe586000..03d40350e1 100644 --- a/letta/schemas/agent.py +++ b/letta/schemas/agent.py @@ -1,6 +1,8 @@ from enum import Enum from typing import Dict, List, Optional +from pydantic import BaseModel, Field, field_validator + from letta.constants import DEFAULT_EMBEDDING_CHUNK_SIZE from letta.schemas.block import CreateBlock from letta.schemas.embedding_config import EmbeddingConfig @@ -13,7 +15,6 @@ from letta.schemas.tool import Tool from letta.schemas.tool_rule import ToolRule from letta.utils import create_random_username -from pydantic import BaseModel, Field, field_validator class AgentType(str, Enum): diff --git a/letta/schemas/block.py b/letta/schemas/block.py index bd905bd2d9..25e84b7da6 100644 --- a/letta/schemas/block.py +++ b/letta/schemas/block.py @@ -1,10 +1,11 @@ from typing import Optional -from letta.constants import CORE_MEMORY_BLOCK_CHAR_LIMIT -from letta.schemas.letta_base import LettaBase from pydantic import BaseModel, Field, model_validator from typing_extensions import Self +from letta.constants import CORE_MEMORY_BLOCK_CHAR_LIMIT +from letta.schemas.letta_base import LettaBase + # block of the LLM context diff --git a/letta/schemas/file.py b/letta/schemas/file.py index 0671bc3ebf..b43eb64c38 100644 --- a/letta/schemas/file.py +++ b/letta/schemas/file.py @@ -1,9 +1,10 @@ from datetime import datetime from typing import Optional -from letta.schemas.letta_base import LettaBase from pydantic import Field +from letta.schemas.letta_base import LettaBase + class FileMetadataBase(LettaBase): """Base class for FileMetadata schemas""" diff --git a/letta/schemas/job.py b/letta/schemas/job.py index b767b56718..17c2b98dad 100644 --- a/letta/schemas/job.py +++ b/letta/schemas/job.py @@ -1,9 +1,10 @@ from datetime import datetime from typing import Optional +from pydantic import Field + from letta.schemas.enums import JobStatus from letta.schemas.letta_base import OrmMetadataBase -from pydantic import Field class JobBase(OrmMetadataBase): diff --git a/letta/schemas/letta_request.py b/letta/schemas/letta_request.py index 73f956ff52..123d817cf2 100644 --- a/letta/schemas/letta_request.py +++ b/letta/schemas/letta_request.py @@ -1,8 +1,9 @@ from typing import List +from pydantic import BaseModel, Field + from letta.constants import DEFAULT_MESSAGE_TOOL, DEFAULT_MESSAGE_TOOL_KWARG from letta.schemas.message import MessageCreate -from pydantic import BaseModel, Field class LettaRequest(BaseModel): diff --git a/letta/schemas/letta_response.py b/letta/schemas/letta_response.py index 7084c3ba09..c6a1e8be58 100644 --- a/letta/schemas/letta_response.py +++ b/letta/schemas/letta_response.py @@ -3,11 +3,12 @@ import re from typing import List, Union +from pydantic import BaseModel, Field + from letta.schemas.enums import MessageStreamStatus from letta.schemas.letta_message import LettaMessage, LettaMessageUnion from letta.schemas.usage import LettaUsageStatistics from letta.utils import json_dumps -from pydantic import BaseModel, Field # TODO: consider moving into own file diff --git a/letta/schemas/message.py b/letta/schemas/message.py index 9697b550e3..ea46f3f870 100644 --- a/letta/schemas/message.py +++ b/letta/schemas/message.py @@ -4,25 +4,17 @@ from datetime import datetime, timezone from typing import List, Literal, Optional -from letta.constants import ( - DEFAULT_MESSAGE_TOOL, - DEFAULT_MESSAGE_TOOL_KWARG, - TOOL_CALL_ID_MAX_LEN, -) +from pydantic import BaseModel, Field, field_validator + +from letta.constants import DEFAULT_MESSAGE_TOOL, DEFAULT_MESSAGE_TOOL_KWARG, TOOL_CALL_ID_MAX_LEN from letta.local_llm.constants import INNER_THOUGHTS_KWARG from letta.schemas.enums import MessageRole from letta.schemas.letta_base import OrmMetadataBase -from letta.schemas.letta_message import ( - AssistantMessage, - LettaMessage, - ReasoningMessage, - SystemMessage, -) +from letta.schemas.letta_message import AssistantMessage, LettaMessage, ReasoningMessage, SystemMessage from letta.schemas.letta_message import ToolCall as LettaToolCall from letta.schemas.letta_message import ToolCallMessage, ToolReturnMessage, UserMessage from letta.schemas.openai.chat_completions import ToolCall, ToolCallFunction from letta.utils import get_utc_time, is_utc_datetime, json_dumps -from pydantic import BaseModel, Field, field_validator def add_inner_thoughts_to_tool_call( diff --git a/letta/schemas/organization.py b/letta/schemas/organization.py index 6220b987a8..35784ad0db 100644 --- a/letta/schemas/organization.py +++ b/letta/schemas/organization.py @@ -1,9 +1,10 @@ from datetime import datetime from typing import Optional +from pydantic import Field + from letta.schemas.letta_base import LettaBase from letta.utils import create_random_username, get_utc_time -from pydantic import Field class OrganizationBase(LettaBase): diff --git a/letta/schemas/passage.py b/letta/schemas/passage.py index c613c2e1b1..c1ec13bec4 100644 --- a/letta/schemas/passage.py +++ b/letta/schemas/passage.py @@ -1,11 +1,12 @@ from datetime import datetime from typing import Dict, List, Optional +from pydantic import Field, field_validator + from letta.constants import MAX_EMBEDDING_DIM from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.letta_base import OrmMetadataBase from letta.utils import get_utc_time -from pydantic import Field, field_validator class PassageBase(OrmMetadataBase): diff --git a/letta/schemas/sandbox_config.py b/letta/schemas/sandbox_config.py index 993711cc50..f86233fae4 100644 --- a/letta/schemas/sandbox_config.py +++ b/letta/schemas/sandbox_config.py @@ -3,10 +3,11 @@ from enum import Enum from typing import Any, Dict, List, Literal, Optional, Union +from pydantic import BaseModel, Field, model_validator + from letta.schemas.agent import AgentState from letta.schemas.letta_base import LettaBase, OrmMetadataBase from letta.settings import tool_settings -from pydantic import BaseModel, Field, model_validator # Sandbox Config diff --git a/letta/schemas/source.py b/letta/schemas/source.py index d6a14d79f5..0a458dfded 100644 --- a/letta/schemas/source.py +++ b/letta/schemas/source.py @@ -1,9 +1,10 @@ from datetime import datetime from typing import Optional +from pydantic import Field + from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.letta_base import LettaBase -from pydantic import Field class BaseSource(LettaBase): diff --git a/letta/schemas/tool.py b/letta/schemas/tool.py index cee04fefa7..8066f9b2c8 100644 --- a/letta/schemas/tool.py +++ b/letta/schemas/tool.py @@ -1,15 +1,13 @@ from typing import Dict, List, Optional +from pydantic import Field, model_validator + from letta.constants import FUNCTION_RETURN_CHAR_LIMIT from letta.functions.functions import derive_openai_json_schema -from letta.functions.helpers import ( - generate_composio_tool_wrapper, - generate_langchain_tool_wrapper, -) +from letta.functions.helpers import generate_composio_tool_wrapper, generate_langchain_tool_wrapper from letta.functions.schema_generator import generate_schema_from_args_schema_v2 from letta.schemas.letta_base import LettaBase from letta.schemas.openai.chat_completions import ToolCall -from pydantic import Field, model_validator class BaseTool(LettaBase): diff --git a/letta/schemas/tool_rule.py b/letta/schemas/tool_rule.py index e88ff2904d..1ab313a7e2 100644 --- a/letta/schemas/tool_rule.py +++ b/letta/schemas/tool_rule.py @@ -1,8 +1,9 @@ from typing import Any, Dict, List, Optional, Union +from pydantic import Field + from letta.schemas.enums import ToolRuleType from letta.schemas.letta_base import LettaBase -from pydantic import Field class BaseToolRule(LettaBase): diff --git a/letta/schemas/user.py b/letta/schemas/user.py index b2bcb93377..59a4594e07 100644 --- a/letta/schemas/user.py +++ b/letta/schemas/user.py @@ -1,9 +1,10 @@ from datetime import datetime from typing import Optional +from pydantic import Field + from letta.schemas.letta_base import LettaBase from letta.services.organization_manager import OrganizationManager -from pydantic import Field class UserBase(LettaBase): diff --git a/letta/server/rest_api/app.py b/letta/server/rest_api/app.py index bb1839359b..8e2b7fb742 100644 --- a/letta/server/rest_api/app.py +++ b/letta/server/rest_api/app.py @@ -8,44 +8,30 @@ import uvicorn from fastapi import FastAPI, Request from fastapi.responses import JSONResponse +from starlette.middleware.base import BaseHTTPMiddleware +from starlette.middleware.cors import CORSMiddleware + from letta.__init__ import __version__ from letta.constants import ADMIN_PREFIX, API_PREFIX, OPENAI_API_PREFIX from letta.errors import LettaAgentNotFoundError, LettaUserNotFoundError from letta.log import get_logger -from letta.orm.errors import ( - DatabaseTimeoutError, - ForeignKeyConstraintViolationError, - NoResultFound, - UniqueConstraintViolationError, -) +from letta.orm.errors import DatabaseTimeoutError, ForeignKeyConstraintViolationError, NoResultFound, UniqueConstraintViolationError from letta.schemas.letta_response import LettaResponse from letta.server.constants import REST_DEFAULT_PORT # NOTE(charles): these are extra routes that are not part of v1 but we still need to mount to pass tests -from letta.server.rest_api.auth.index import ( - setup_auth_router, # TODO: probably remove right? -) +from letta.server.rest_api.auth.index import setup_auth_router # TODO: probably remove right? from letta.server.rest_api.interface import StreamingServerInterface -from letta.server.rest_api.routers.openai.assistants.assistants import ( - router as openai_assistants_router, -) -from letta.server.rest_api.routers.openai.chat_completions.chat_completions import ( - router as openai_chat_completions_router, -) +from letta.server.rest_api.routers.openai.assistants.assistants import router as openai_assistants_router +from letta.server.rest_api.routers.openai.chat_completions.chat_completions import router as openai_chat_completions_router # from letta.orm.utilities import get_db_session # TODO(ethan) reenable once we merge ORM from letta.server.rest_api.routers.v1 import ROUTERS as v1_routes -from letta.server.rest_api.routers.v1.organizations import ( - router as organizations_router, -) -from letta.server.rest_api.routers.v1.users import ( - router as users_router, # TODO: decide on admin -) +from letta.server.rest_api.routers.v1.organizations import router as organizations_router +from letta.server.rest_api.routers.v1.users import router as users_router # TODO: decide on admin from letta.server.rest_api.static_files import mount_static_files from letta.server.server import SyncServer from letta.settings import settings -from starlette.middleware.base import BaseHTTPMiddleware -from starlette.middleware.cors import CORSMiddleware # TODO(ethan) # NOTE(charles): @ethan I had to add this to get the global as the bottom to work diff --git a/letta/server/rest_api/auth/index.py b/letta/server/rest_api/auth/index.py index 7a29f6b4e7..28d22435b4 100644 --- a/letta/server/rest_api/auth/index.py +++ b/letta/server/rest_api/auth/index.py @@ -2,10 +2,11 @@ from uuid import UUID from fastapi import APIRouter +from pydantic import BaseModel, Field + from letta.log import get_logger from letta.server.rest_api.interface import QueuingInterface from letta.server.server import SyncServer -from pydantic import BaseModel, Field logger = get_logger(__name__) router = APIRouter() diff --git a/letta/server/rest_api/auth_token.py b/letta/server/rest_api/auth_token.py index 72387bbdb6..40e26d805e 100644 --- a/letta/server/rest_api/auth_token.py +++ b/letta/server/rest_api/auth_token.py @@ -2,6 +2,7 @@ from fastapi import Depends, HTTPException from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer + from letta.server.server import SyncServer security = HTTPBearer() diff --git a/letta/server/rest_api/interface.py b/letta/server/rest_api/interface.py index ffc46edd3c..9fd8fb1cd2 100644 --- a/letta/server/rest_api/interface.py +++ b/letta/server/rest_api/interface.py @@ -11,23 +11,20 @@ from letta.local_llm.constants import INNER_THOUGHTS_KWARG from letta.schemas.enums import MessageStreamStatus from letta.schemas.letta_message import ( - AssistantMessage, - LegacyFunctionCallMessage, - LegacyLettaMessage, - LettaMessage, - ReasoningMessage, - ToolCall, - ToolCallDelta, - ToolCallMessage, - ToolReturnMessage, + AssistantMessage, + LegacyFunctionCallMessage, + LegacyLettaMessage, + LettaMessage, + ReasoningMessage, + ToolCall, + ToolCallDelta, + ToolCallMessage, + ToolReturnMessage, ) from letta.schemas.message import Message from letta.schemas.openai.chat_completion_response import ChatCompletionChunkResponse from letta.streaming_interface import AgentChunkStreamingInterface -from letta.streaming_utils import ( - FunctionArgumentsStreamHandler, - JSONInnerThoughtsExtractor, -) +from letta.streaming_utils import FunctionArgumentsStreamHandler, JSONInnerThoughtsExtractor from letta.utils import is_utc_datetime diff --git a/letta/server/rest_api/routers/openai/assistants/assistants.py b/letta/server/rest_api/routers/openai/assistants/assistants.py index 95f8f01e9f..2b646f931c 100644 --- a/letta/server/rest_api/routers/openai/assistants/assistants.py +++ b/letta/server/rest_api/routers/openai/assistants/assistants.py @@ -1,13 +1,14 @@ from typing import List from fastapi import APIRouter, Body, HTTPException, Path, Query + from letta.constants import DEFAULT_PRESET from letta.schemas.openai.openai import AssistantFile, OpenAIAssistant from letta.server.rest_api.routers.openai.assistants.schemas import ( - CreateAssistantFileRequest, - CreateAssistantRequest, - DeleteAssistantFileResponse, - DeleteAssistantResponse, + CreateAssistantFileRequest, + CreateAssistantRequest, + DeleteAssistantFileResponse, + DeleteAssistantResponse, ) from letta.utils import get_utc_time diff --git a/letta/server/rest_api/routers/openai/assistants/schemas.py b/letta/server/rest_api/routers/openai/assistants/schemas.py index 069a4d97fb..07263ff2d4 100644 --- a/letta/server/rest_api/routers/openai/assistants/schemas.py +++ b/letta/server/rest_api/routers/openai/assistants/schemas.py @@ -1,14 +1,9 @@ from typing import List, Optional -from letta.schemas.openai.openai import ( - MessageRoleType, - OpenAIMessage, - OpenAIThread, - ToolCall, - ToolCallOutput, -) from pydantic import BaseModel, Field +from letta.schemas.openai.openai import MessageRoleType, OpenAIMessage, OpenAIThread, ToolCall, ToolCallOutput + class CreateAssistantRequest(BaseModel): model: str = Field(..., description="The model to use for the assistant.") diff --git a/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py b/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py index 9127787f91..4809fa19df 100644 --- a/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py +++ b/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py @@ -2,15 +2,11 @@ from typing import TYPE_CHECKING, Optional from fastapi import APIRouter, Body, Depends, Header, HTTPException + from letta.schemas.enums import MessageRole from letta.schemas.letta_message import LettaMessage, ToolCall from letta.schemas.openai.chat_completion_request import ChatCompletionRequest -from letta.schemas.openai.chat_completion_response import ( - ChatCompletionResponse, - Choice, - Message, - UsageStatistics, -) +from letta.schemas.openai.chat_completion_response import ChatCompletionResponse, Choice, Message, UsageStatistics # TODO this belongs in a controller! from letta.server.rest_api.routers.v1.agents import send_message_to_agent diff --git a/letta/server/rest_api/routers/v1/__init__.py b/letta/server/rest_api/routers/v1/__init__.py index bcebeb26c5..0617f4a94b 100644 --- a/letta/server/rest_api/routers/v1/__init__.py +++ b/letta/server/rest_api/routers/v1/__init__.py @@ -3,9 +3,7 @@ from letta.server.rest_api.routers.v1.health import router as health_router from letta.server.rest_api.routers.v1.jobs import router as jobs_router from letta.server.rest_api.routers.v1.llms import router as llm_router -from letta.server.rest_api.routers.v1.sandbox_configs import ( - router as sandbox_configs_router, -) +from letta.server.rest_api.routers.v1.sandbox_configs import router as sandbox_configs_router from letta.server.rest_api.routers.v1.sources import router as sources_router from letta.server.rest_api.routers.v1.tools import router as tools_router diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index a116265383..6f78fbfad9 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -3,42 +3,21 @@ from datetime import datetime from typing import List, Optional, Union -from fastapi import ( - APIRouter, - BackgroundTasks, - Body, - Depends, - Header, - HTTPException, - Query, - status, -) +from fastapi import APIRouter, BackgroundTasks, Body, Depends, Header, HTTPException, Query, status from fastapi.responses import JSONResponse, StreamingResponse +from pydantic import Field + from letta.constants import DEFAULT_MESSAGE_TOOL, DEFAULT_MESSAGE_TOOL_KWARG from letta.log import get_logger from letta.orm.errors import NoResultFound from letta.schemas.agent import AgentState, CreateAgent, UpdateAgent -from letta.schemas.block import ( # , BlockLabelUpdate, BlockLimitUpdate - Block, - BlockUpdate, - CreateBlock, -) +from letta.schemas.block import Block, BlockUpdate, CreateBlock # , BlockLabelUpdate, BlockLimitUpdate from letta.schemas.enums import MessageStreamStatus from letta.schemas.job import Job, JobStatus, JobUpdate -from letta.schemas.letta_message import ( - LegacyLettaMessage, - LettaMessage, - LettaMessageUnion, -) +from letta.schemas.letta_message import LegacyLettaMessage, LettaMessage, LettaMessageUnion from letta.schemas.letta_request import LettaRequest, LettaStreamingRequest from letta.schemas.letta_response import LettaResponse -from letta.schemas.memory import ( - ArchivalMemorySummary, - ContextWindowOverview, - CreateArchivalMemory, - Memory, - RecallMemorySummary, -) +from letta.schemas.memory import ArchivalMemorySummary, ContextWindowOverview, CreateArchivalMemory, Memory, RecallMemorySummary from letta.schemas.message import Message, MessageCreate, MessageUpdate from letta.schemas.passage import Passage from letta.schemas.source import Source @@ -47,7 +26,6 @@ from letta.server.rest_api.interface import StreamingServerInterface from letta.server.rest_api.utils import get_letta_server, sse_async_generator from letta.server.server import SyncServer -from pydantic import Field # These can be forward refs, but because Fastapi needs them at runtime the must be imported normally diff --git a/letta/server/rest_api/routers/v1/blocks.py b/letta/server/rest_api/routers/v1/blocks.py index 9d2a937d18..d921323343 100644 --- a/letta/server/rest_api/routers/v1/blocks.py +++ b/letta/server/rest_api/routers/v1/blocks.py @@ -1,6 +1,7 @@ from typing import TYPE_CHECKING, List, Optional from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query, Response + from letta.orm.errors import NoResultFound from letta.schemas.block import Block, BlockUpdate, CreateBlock from letta.server.rest_api.utils import get_letta_server diff --git a/letta/server/rest_api/routers/v1/health.py b/letta/server/rest_api/routers/v1/health.py index 81bb41e058..99fce66d4e 100644 --- a/letta/server/rest_api/routers/v1/health.py +++ b/letta/server/rest_api/routers/v1/health.py @@ -1,6 +1,7 @@ from typing import TYPE_CHECKING from fastapi import APIRouter + from letta.cli.cli import version from letta.schemas.health import Health diff --git a/letta/server/rest_api/routers/v1/jobs.py b/letta/server/rest_api/routers/v1/jobs.py index bec226251c..4245d2f989 100644 --- a/letta/server/rest_api/routers/v1/jobs.py +++ b/letta/server/rest_api/routers/v1/jobs.py @@ -1,6 +1,7 @@ from typing import List, Optional from fastapi import APIRouter, Depends, Header, HTTPException, Query + from letta.orm.errors import NoResultFound from letta.schemas.enums import JobStatus from letta.schemas.job import Job diff --git a/letta/server/rest_api/routers/v1/llms.py b/letta/server/rest_api/routers/v1/llms.py index f0bf9f425a..4536ae4981 100644 --- a/letta/server/rest_api/routers/v1/llms.py +++ b/letta/server/rest_api/routers/v1/llms.py @@ -1,6 +1,7 @@ from typing import TYPE_CHECKING, List from fastapi import APIRouter, Depends + from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.llm_config import LLMConfig from letta.server.rest_api.utils import get_letta_server diff --git a/letta/server/rest_api/routers/v1/organizations.py b/letta/server/rest_api/routers/v1/organizations.py index 8fbead6d9f..2f4cdb1b51 100644 --- a/letta/server/rest_api/routers/v1/organizations.py +++ b/letta/server/rest_api/routers/v1/organizations.py @@ -1,6 +1,7 @@ from typing import TYPE_CHECKING, List, Optional from fastapi import APIRouter, Body, Depends, HTTPException, Query + from letta.schemas.organization import Organization, OrganizationCreate from letta.server.rest_api.utils import get_letta_server diff --git a/letta/server/rest_api/routers/v1/sandbox_configs.py b/letta/server/rest_api/routers/v1/sandbox_configs.py index 822ca4f5d5..436d9b8e8e 100644 --- a/letta/server/rest_api/routers/v1/sandbox_configs.py +++ b/letta/server/rest_api/routers/v1/sandbox_configs.py @@ -1,14 +1,11 @@ from typing import List, Optional from fastapi import APIRouter, Depends, Query + from letta.schemas.sandbox_config import SandboxConfig as PydanticSandboxConfig from letta.schemas.sandbox_config import SandboxConfigCreate, SandboxConfigUpdate from letta.schemas.sandbox_config import SandboxEnvironmentVariable as PydanticEnvVar -from letta.schemas.sandbox_config import ( - SandboxEnvironmentVariableCreate, - SandboxEnvironmentVariableUpdate, - SandboxType, -) +from letta.schemas.sandbox_config import SandboxEnvironmentVariableCreate, SandboxEnvironmentVariableUpdate, SandboxType from letta.server.rest_api.utils import get_letta_server, get_user_id from letta.server.server import SyncServer diff --git a/letta/server/rest_api/routers/v1/sources.py b/letta/server/rest_api/routers/v1/sources.py index 399942da6d..59b933cfcb 100644 --- a/letta/server/rest_api/routers/v1/sources.py +++ b/letta/server/rest_api/routers/v1/sources.py @@ -2,15 +2,8 @@ import tempfile from typing import List, Optional -from fastapi import ( - APIRouter, - BackgroundTasks, - Depends, - Header, - HTTPException, - Query, - UploadFile, -) +from fastapi import APIRouter, BackgroundTasks, Depends, Header, HTTPException, Query, UploadFile + from letta.schemas.file import FileMetadata from letta.schemas.job import Job from letta.schemas.passage import Passage diff --git a/letta/server/rest_api/routers/v1/tools.py b/letta/server/rest_api/routers/v1/tools.py index bb297a36e2..ffc2b2124c 100644 --- a/letta/server/rest_api/routers/v1/tools.py +++ b/letta/server/rest_api/routers/v1/tools.py @@ -6,6 +6,7 @@ from composio.exceptions import ApiKeyNotProvidedError, ComposioSDKError from composio.tools.base.abs import InvalidClassDefinition from fastapi import APIRouter, Body, Depends, Header, HTTPException + from letta.errors import LettaToolCreateError from letta.orm.errors import UniqueConstraintViolationError from letta.schemas.letta_message import ToolReturnMessage diff --git a/letta/server/rest_api/routers/v1/users.py b/letta/server/rest_api/routers/v1/users.py index 2dfeb06b10..27a2feeb03 100644 --- a/letta/server/rest_api/routers/v1/users.py +++ b/letta/server/rest_api/routers/v1/users.py @@ -1,6 +1,7 @@ from typing import TYPE_CHECKING, List, Optional from fastapi import APIRouter, Body, Depends, HTTPException, Query + from letta.schemas.user import User, UserCreate, UserUpdate from letta.server.rest_api.utils import get_letta_server diff --git a/letta/server/rest_api/utils.py b/letta/server/rest_api/utils.py index 650f0e3e49..bb5dc03407 100644 --- a/letta/server/rest_api/utils.py +++ b/letta/server/rest_api/utils.py @@ -6,11 +6,12 @@ from typing import AsyncGenerator, Optional, Union from fastapi import Header +from pydantic import BaseModel + from letta.errors import ContextWindowExceededError, RateLimitExceededError from letta.schemas.usage import LettaUsageStatistics from letta.server.rest_api.interface import StreamingServerInterface from letta.server.server import SyncServer -from pydantic import BaseModel # from letta.orm.user import User # from letta.orm.utilities import get_db_session diff --git a/letta/server/server.py b/letta/server/server.py index 226d8d84bb..03604a89d1 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -7,12 +7,13 @@ from datetime import datetime from typing import Callable, List, Optional, Tuple, Union -import letta.constants as constants -import letta.server.utils as server_utils -import letta.system as system from composio.client import Composio from composio.client.collections import ActionModel, AppModel from fastapi import HTTPException + +import letta.constants as constants +import letta.server.utils as server_utils +import letta.system as system from letta.agent import Agent, save_agent from letta.chat_only_agent import ChatOnlyAgent from letta.credentials import LettaCredentials @@ -27,17 +28,17 @@ from letta.orm import Base from letta.orm.errors import NoResultFound from letta.providers import ( - AnthropicProvider, - AzureProvider, - GoogleAIProvider, - GroqProvider, - LettaProvider, - OllamaProvider, - OpenAIProvider, - Provider, - TogetherProvider, - VLLMChatCompletionsProvider, - VLLMCompletionsProvider, + AnthropicProvider, + AzureProvider, + GoogleAIProvider, + GroqProvider, + LettaProvider, + OllamaProvider, + OpenAIProvider, + Provider, + TogetherProvider, + VLLMChatCompletionsProvider, + VLLMCompletionsProvider, ) from letta.schemas.agent import AgentState, AgentType, CreateAgent from letta.schemas.block import BlockUpdate @@ -48,12 +49,7 @@ from letta.schemas.job import Job, JobUpdate from letta.schemas.letta_message import LettaMessage, ToolReturnMessage from letta.schemas.llm_config import LLMConfig -from letta.schemas.memory import ( - ArchivalMemorySummary, - ContextWindowOverview, - Memory, - RecallMemorySummary, -) +from letta.schemas.memory import ArchivalMemorySummary, ContextWindowOverview, Memory, RecallMemorySummary from letta.schemas.message import Message, MessageCreate, MessageRole, MessageUpdate from letta.schemas.organization import Organization from letta.schemas.passage import Passage @@ -138,16 +134,17 @@ def run_command(self, user_id: str, agent_id: str, command: str) -> Union[str, N from contextlib import contextmanager -from letta.config import LettaConfig - -# NOTE: hack to see if single session management works -from letta.settings import model_settings, settings, tool_settings from rich.console import Console from rich.panel import Panel from rich.text import Text from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker +from letta.config import LettaConfig + +# NOTE: hack to see if single session management works +from letta.settings import model_settings, settings, tool_settings + config = LettaConfig.load() diff --git a/letta/server/ws_api/example_client.py b/letta/server/ws_api/example_client.py index fdfdd66059..a7fc57b524 100644 --- a/letta/server/ws_api/example_client.py +++ b/letta/server/ws_api/example_client.py @@ -1,7 +1,8 @@ import asyncio -import letta.server.ws_api.protocol as protocol import websockets + +import letta.server.ws_api.protocol as protocol from letta.server.constants import WS_CLIENT_TIMEOUT, WS_DEFAULT_PORT from letta.server.utils import condition_to_stop_receiving, print_server_response diff --git a/letta/server/ws_api/server.py b/letta/server/ws_api/server.py index b3dcc2ba1e..e2408ddaa6 100644 --- a/letta/server/ws_api/server.py +++ b/letta/server/ws_api/server.py @@ -3,8 +3,9 @@ import sys import traceback -import letta.server.ws_api.protocol as protocol import websockets + +import letta.server.ws_api.protocol as protocol from letta.server.constants import WS_DEFAULT_PORT from letta.server.server import SyncServer from letta.server.ws_api.interface import SyncWebSocketInterface diff --git a/letta/services/agent_manager.py b/letta/services/agent_manager.py index 9697339135..4e6b80ec5b 100644 --- a/letta/services/agent_manager.py +++ b/letta/services/agent_manager.py @@ -2,6 +2,8 @@ from typing import Dict, List, Optional import numpy as np +from sqlalchemy import Select, func, literal, select, union_all + from letta.constants import BASE_MEMORY_TOOLS, BASE_TOOLS, MAX_EMBEDDING_DIM from letta.embeddings import embedding_model from letta.log import get_logger @@ -25,20 +27,19 @@ from letta.schemas.user import User as PydanticUser from letta.services.block_manager import BlockManager from letta.services.helpers.agent_manager_helper import ( - _process_relationship, - _process_tags, - check_supports_structured_output, - compile_system_message, - derive_system_message, - initialize_message_sequence, - package_initial_message_sequence, + _process_relationship, + _process_tags, + check_supports_structured_output, + compile_system_message, + derive_system_message, + initialize_message_sequence, + package_initial_message_sequence, ) from letta.services.message_manager import MessageManager from letta.services.source_manager import SourceManager from letta.services.tool_manager import ToolManager from letta.settings import settings from letta.utils import enforce_types, get_utc_time, united_diff -from sqlalchemy import Select, func, literal, select, union_all logger = get_logger(__name__) diff --git a/letta/services/sandbox_config_manager.py b/letta/services/sandbox_config_manager.py index 270b1761b9..9e47612ee0 100644 --- a/letta/services/sandbox_config_manager.py +++ b/letta/services/sandbox_config_manager.py @@ -9,11 +9,7 @@ from letta.schemas.sandbox_config import SandboxConfig as PydanticSandboxConfig from letta.schemas.sandbox_config import SandboxConfigCreate, SandboxConfigUpdate from letta.schemas.sandbox_config import SandboxEnvironmentVariable as PydanticEnvVar -from letta.schemas.sandbox_config import ( - SandboxEnvironmentVariableCreate, - SandboxEnvironmentVariableUpdate, - SandboxType, -) +from letta.schemas.sandbox_config import SandboxEnvironmentVariableCreate, SandboxEnvironmentVariableUpdate, SandboxType from letta.schemas.user import User as PydanticUser from letta.utils import enforce_types, printd diff --git a/letta/settings.py b/letta/settings.py index 3b9af80187..1b6ba44bbe 100644 --- a/letta/settings.py +++ b/letta/settings.py @@ -1,10 +1,11 @@ from pathlib import Path from typing import Optional -from letta.local_llm.constants import DEFAULT_WRAPPER_NAME from pydantic import Field from pydantic_settings import BaseSettings, SettingsConfigDict +from letta.local_llm.constants import DEFAULT_WRAPPER_NAME + class ToolSettings(BaseSettings): composio_api_key: Optional[str] = None diff --git a/letta/streaming_interface.py b/letta/streaming_interface.py index 9dfcfd4618..2949b94e4c 100644 --- a/letta/streaming_interface.py +++ b/letta/streaming_interface.py @@ -3,22 +3,16 @@ from datetime import datetime from typing import List, Optional -from letta.interface import CLIInterface -from letta.local_llm.constants import ( - ASSISTANT_MESSAGE_CLI_SYMBOL, - INNER_THOUGHTS_CLI_SYMBOL, -) -from letta.schemas.message import Message -from letta.schemas.openai.chat_completion_response import ( - ChatCompletionChunkResponse, - ChatCompletionResponse, -) - # from colorama import Fore, Style, init from rich.console import Console from rich.live import Live from rich.markup import escape +from letta.interface import CLIInterface +from letta.local_llm.constants import ASSISTANT_MESSAGE_CLI_SYMBOL, INNER_THOUGHTS_CLI_SYMBOL +from letta.schemas.message import Message +from letta.schemas.openai.chat_completion_response import ChatCompletionChunkResponse, ChatCompletionResponse + # init(autoreset=True) # DEBUG = True # puts full message outputs in the terminal diff --git a/letta/system.py b/letta/system.py index 89755c3185..d903bf1fed 100644 --- a/letta/system.py +++ b/letta/system.py @@ -3,10 +3,10 @@ from typing import Optional from .constants import ( - INITIAL_BOOT_MESSAGE, - INITIAL_BOOT_MESSAGE_SEND_MESSAGE_FIRST_MSG, - INITIAL_BOOT_MESSAGE_SEND_MESSAGE_THOUGHT, - MESSAGE_SUMMARY_WARNING_STR, + INITIAL_BOOT_MESSAGE, + INITIAL_BOOT_MESSAGE_SEND_MESSAGE_FIRST_MSG, + INITIAL_BOOT_MESSAGE_SEND_MESSAGE_THOUGHT, + MESSAGE_SUMMARY_WARNING_STR, ) from .utils import get_local_time, json_dumps diff --git a/letta/utils.py b/letta/utils.py index 4e7771c9ce..5d2eb51393 100644 --- a/letta/utils.py +++ b/letta/utils.py @@ -19,20 +19,21 @@ from urllib.parse import urljoin, urlparse import demjson3 as demjson -import letta import pytz import tiktoken +from pathvalidate import sanitize_filename as pathvalidate_sanitize_filename + +import letta from letta.constants import ( - CLI_WARNING_PREFIX, - CORE_MEMORY_HUMAN_CHAR_LIMIT, - CORE_MEMORY_PERSONA_CHAR_LIMIT, - ERROR_MESSAGE_PREFIX, - LETTA_DIR, - MAX_FILENAME_LENGTH, - TOOL_CALL_ID_MAX_LEN, + CLI_WARNING_PREFIX, + CORE_MEMORY_HUMAN_CHAR_LIMIT, + CORE_MEMORY_PERSONA_CHAR_LIMIT, + ERROR_MESSAGE_PREFIX, + LETTA_DIR, + MAX_FILENAME_LENGTH, + TOOL_CALL_ID_MAX_LEN, ) from letta.schemas.openai.chat_completion_response import ChatCompletionResponse -from pathvalidate import sanitize_filename as pathvalidate_sanitize_filename DEBUG = False if "LOG_LEVEL" in os.environ: diff --git a/locust_test.py b/locust_test.py index bf32fb4896..570e6eef47 100644 --- a/locust_test.py +++ b/locust_test.py @@ -1,6 +1,8 @@ import random import string +from locust import HttpUser, between, task + from letta.constants import BASE_TOOLS, DEFAULT_HUMAN, DEFAULT_PERSONA from letta.schemas.agent import AgentState, CreateAgent from letta.schemas.letta_request import LettaRequest @@ -8,7 +10,6 @@ from letta.schemas.memory import ChatMemory from letta.schemas.message import MessageCreate, MessageRole from letta.utils import get_human_text, get_persona_text -from locust import HttpUser, between, task class LettaUser(HttpUser): diff --git a/paper_experiments/doc_qa_task/doc_qa.py b/paper_experiments/doc_qa_task/doc_qa.py index 205fa0d016..e07060d1a5 100644 --- a/paper_experiments/doc_qa_task/doc_qa.py +++ b/paper_experiments/doc_qa_task/doc_qa.py @@ -23,6 +23,9 @@ from typing import List from icml_experiments.utils import get_experiment_config, load_gzipped_file +from openai import OpenAI +from tqdm import tqdm + from letta import utils from letta.agent_store.storage import StorageConnector, TableType from letta.cli.cli_config import delete @@ -30,8 +33,6 @@ from letta.credentials import LettaCredentials from letta.embeddings import embedding_model from letta.utils import count_tokens -from openai import OpenAI -from tqdm import tqdm DATA_SOURCE_NAME = "wikipedia" DOC_QA_PERSONA = "You are Letta DOC-QA bot. Your job is to answer questions about documents that are stored in your archival memory. The answer to the users question will ALWAYS be in your archival memory, so remember to keep searching if you can't find the answer. Answer the questions as if though the year is 2018." # TODO decide on a good persona/human diff --git a/paper_experiments/doc_qa_task/llm_judge_doc_qa.py b/paper_experiments/doc_qa_task/llm_judge_doc_qa.py index 18d907a369..c6ff6cfee5 100644 --- a/paper_experiments/doc_qa_task/llm_judge_doc_qa.py +++ b/paper_experiments/doc_qa_task/llm_judge_doc_qa.py @@ -2,10 +2,11 @@ import json import re -from letta.credentials import LettaCredentials from openai import OpenAI from tqdm import tqdm +from letta.credentials import LettaCredentials + # Note: did not end up using since no cases of cheating were observed # CHEATING_PROMPT = \ # """ diff --git a/paper_experiments/doc_qa_task/load_wikipedia_embeddings.py b/paper_experiments/doc_qa_task/load_wikipedia_embeddings.py index e80e7e9bcc..94b9814376 100644 --- a/paper_experiments/doc_qa_task/load_wikipedia_embeddings.py +++ b/paper_experiments/doc_qa_task/load_wikipedia_embeddings.py @@ -8,10 +8,11 @@ from absl import app, flags from icml_experiments.utils import get_experiment_config +from tqdm import tqdm + from letta.agent_store.storage import StorageConnector, TableType from letta.cli.cli_config import delete from letta.data_types import Passage -from tqdm import tqdm # Create an empty list to store the JSON objects source_name = "wikipedia" diff --git a/paper_experiments/nested_kv_task/nested_kv.py b/paper_experiments/nested_kv_task/nested_kv.py index 64fa06a26a..04c95ac548 100644 --- a/paper_experiments/nested_kv_task/nested_kv.py +++ b/paper_experiments/nested_kv_task/nested_kv.py @@ -29,10 +29,11 @@ import openai from icml_experiments.utils import get_experiment_config, load_gzipped_file +from tqdm import tqdm + from letta import utils from letta.cli.cli_config import delete from letta.config import LettaConfig -from tqdm import tqdm # TODO: update personas NESTED_PERSONA = "You are Letta DOC-QA bot. Your job is to answer questions about documents that are stored in your archival memory. The answer to the users question will ALWAYS be in your archival memory, so remember to keep searching if you can't find the answer. DO NOT STOP SEARCHING UNTIL YOU VERIFY THAT THE VALUE IS NOT A KEY. Do not stop making nested lookups until this condition is met." # TODO decide on a good persona/human diff --git a/pyproject.toml b/pyproject.toml index 0a8c73325b..5aa60a0f14 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -100,3 +100,11 @@ extend-exclude = "examples/*" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" + +[tool.isort] +profile = "black" +line_length = 140 +multi_line_output = 3 +include_trailing_comma = true +force_grid_wrap = 0 +use_parentheses = true \ No newline at end of file diff --git a/scripts/migrate_tools.py b/scripts/migrate_tools.py index 91e16071eb..53578c690e 100644 --- a/scripts/migrate_tools.py +++ b/scripts/migrate_tools.py @@ -1,7 +1,8 @@ +from tqdm import tqdm + from letta.schemas.user import User from letta.services.organization_manager import OrganizationManager from letta.services.tool_manager import ToolManager -from tqdm import tqdm def deprecated_tool(): diff --git a/tests/helpers/endpoints_helper.py b/tests/helpers/endpoints_helper.py index 4ed801468f..82b2ed1c79 100644 --- a/tests/helpers/endpoints_helper.py +++ b/tests/helpers/endpoints_helper.py @@ -14,12 +14,7 @@ from letta.config import LettaConfig from letta.constants import DEFAULT_HUMAN, DEFAULT_PERSONA from letta.embeddings import embedding_model -from letta.errors import ( - InvalidInnerMonologueError, - InvalidToolCallError, - MissingInnerMonologueError, - MissingToolCallError, -) +from letta.errors import InvalidInnerMonologueError, InvalidToolCallError, MissingInnerMonologueError, MissingToolCallError from letta.llm_api.llm_api_tools import create from letta.local_llm.constants import INNER_THOUGHTS_KWARG from letta.schemas.agent import AgentState @@ -28,12 +23,7 @@ from letta.schemas.letta_response import LettaResponse from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import ChatMemory -from letta.schemas.openai.chat_completion_response import ( - ChatCompletionResponse, - Choice, - FunctionCall, - Message, -) +from letta.schemas.openai.chat_completion_response import ChatCompletionResponse, Choice, FunctionCall, Message from letta.utils import get_human_text, get_persona_text, json_dumps from tests.helpers.utils import cleanup diff --git a/tests/integration_test_agent_tool_graph.py b/tests/integration_test_agent_tool_graph.py index 4144c34776..64486ad336 100644 --- a/tests/integration_test_agent_tool_graph.py +++ b/tests/integration_test_agent_tool_graph.py @@ -2,19 +2,15 @@ import uuid import pytest + from letta import create_client from letta.schemas.letta_message import ToolCallMessage -from letta.schemas.tool_rule import ( - ChildToolRule, - ConditionalToolRule, - InitToolRule, - TerminalToolRule, -) +from letta.schemas.tool_rule import ChildToolRule, ConditionalToolRule, InitToolRule, TerminalToolRule from tests.helpers.endpoints_helper import ( - assert_invoked_function_call, - assert_invoked_send_message_with_keyword, - assert_sanity_checks, - setup_agent, + assert_invoked_function_call, + assert_invoked_send_message_with_keyword, + assert_sanity_checks, + setup_agent, ) from tests.helpers.utils import cleanup diff --git a/tests/integration_test_offline_memory_agent.py b/tests/integration_test_offline_memory_agent.py index 01b04693d3..15d4161d5e 100644 --- a/tests/integration_test_offline_memory_agent.py +++ b/tests/integration_test_offline_memory_agent.py @@ -1,13 +1,14 @@ import pytest + from letta import BasicBlockMemory from letta.client.client import Block, create_client from letta.constants import DEFAULT_HUMAN, DEFAULT_PERSONA from letta.offline_memory_agent import ( - finish_rethinking_memory, - finish_rethinking_memory_convo, - rethink_memory, - rethink_memory_convo, - trigger_rethink_memory, + finish_rethinking_memory, + finish_rethinking_memory_convo, + rethink_memory, + rethink_memory_convo, + trigger_rethink_memory, ) from letta.prompts import gpt_system from letta.schemas.agent import AgentType diff --git a/tests/integration_test_summarizer.py b/tests/integration_test_summarizer.py index ce6c41b254..b4de0043b4 100644 --- a/tests/integration_test_summarizer.py +++ b/tests/integration_test_summarizer.py @@ -4,6 +4,7 @@ from typing import List import pytest + from letta import create_client from letta.agent import Agent from letta.client.client import LocalClient diff --git a/tests/integration_test_tool_execution_sandbox.py b/tests/integration_test_tool_execution_sandbox.py index 699185c9f9..97346021b9 100644 --- a/tests/integration_test_tool_execution_sandbox.py +++ b/tests/integration_test_tool_execution_sandbox.py @@ -5,6 +5,8 @@ from unittest.mock import patch import pytest +from sqlalchemy import delete + from letta import create_client from letta.functions.function_sets.base import core_memory_append, core_memory_replace from letta.orm import SandboxConfig, SandboxEnvironmentVariable @@ -14,12 +16,12 @@ from letta.schemas.memory import ChatMemory from letta.schemas.organization import Organization from letta.schemas.sandbox_config import ( - E2BSandboxConfig, - LocalSandboxConfig, - SandboxConfigCreate, - SandboxConfigUpdate, - SandboxEnvironmentVariableCreate, - SandboxType, + E2BSandboxConfig, + LocalSandboxConfig, + SandboxConfigCreate, + SandboxConfigUpdate, + SandboxEnvironmentVariableCreate, + SandboxType, ) from letta.schemas.tool import Tool, ToolCreate from letta.schemas.user import User @@ -29,7 +31,6 @@ from letta.services.tool_manager import ToolManager from letta.services.user_manager import UserManager from letta.settings import tool_settings -from sqlalchemy import delete from tests.helpers.utils import create_tool_from_func # Constants @@ -211,9 +212,7 @@ def clear_memory(agent_state: AgentState): @pytest.fixture def external_codebase_tool(test_user): - from tests.test_tool_sandbox.restaurant_management_system.adjust_menu_prices import ( - adjust_menu_prices, - ) + from tests.test_tool_sandbox.restaurant_management_system.adjust_menu_prices import adjust_menu_prices tool = create_tool_from_func(adjust_menu_prices) tool = ToolManager().create_or_update_tool(tool, test_user) diff --git a/tests/test_base_functions.py b/tests/test_base_functions.py index 007d2bf9c5..5b5bec6f4f 100644 --- a/tests/test_base_functions.py +++ b/tests/test_base_functions.py @@ -1,5 +1,6 @@ -import letta.functions.function_sets.base as base_functions import pytest + +import letta.functions.function_sets.base as base_functions from letta import LocalClient, create_client from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.llm_config import LLMConfig diff --git a/tests/test_cli.py b/tests/test_cli.py index c5595a004e..c6497f5017 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -4,10 +4,8 @@ import pexpect import pytest -from letta.local_llm.constants import ( - ASSISTANT_MESSAGE_CLI_SYMBOL, - INNER_THOUGHTS_CLI_SYMBOL, -) + +from letta.local_llm.constants import ASSISTANT_MESSAGE_CLI_SYMBOL, INNER_THOUGHTS_CLI_SYMBOL original_letta_path = os.path.expanduser("~/.letta") backup_letta_path = os.path.expanduser("~/.letta_backup") diff --git a/tests/test_client.py b/tests/test_client.py index 71f7216c13..cc39123538 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -8,6 +8,8 @@ import pytest from dotenv import load_dotenv +from sqlalchemy import delete + from letta import LocalClient, RESTClient, create_client from letta.orm import SandboxConfig, SandboxEnvironmentVariable from letta.schemas.agent import AgentState @@ -18,7 +20,6 @@ from letta.schemas.llm_config import LLMConfig from letta.schemas.sandbox_config import LocalSandboxConfig, SandboxType from letta.utils import create_random_username -from sqlalchemy import delete # Constants SERVER_PORT = 8283 diff --git a/tests/test_client_legacy.py b/tests/test_client_legacy.py index b578d847ef..3d907fa373 100644 --- a/tests/test_client_legacy.py +++ b/tests/test_client_legacy.py @@ -7,6 +7,8 @@ import pytest from dotenv import load_dotenv +from sqlalchemy import delete + from letta import create_client from letta.client.client import LocalClient, RESTClient from letta.constants import BASE_MEMORY_TOOLS, BASE_TOOLS, DEFAULT_PRESET @@ -15,13 +17,13 @@ from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.enums import MessageRole, MessageStreamStatus from letta.schemas.letta_message import ( - AssistantMessage, - LettaMessage, - ReasoningMessage, - SystemMessage, - ToolCallMessage, - ToolReturnMessage, - UserMessage, + AssistantMessage, + LettaMessage, + ReasoningMessage, + SystemMessage, + ToolCallMessage, + ToolReturnMessage, + UserMessage, ) from letta.schemas.letta_response import LettaResponse, LettaStreamingResponse from letta.schemas.llm_config import LLMConfig @@ -32,7 +34,6 @@ from letta.services.user_manager import UserManager from letta.settings import model_settings from letta.utils import get_utc_time -from sqlalchemy import delete from tests.helpers.client_helper import upload_file_using_client # from tests.utils import create_config diff --git a/tests/test_local_client.py b/tests/test_local_client.py index 8b0c761786..da5e533c5a 100644 --- a/tests/test_local_client.py +++ b/tests/test_local_client.py @@ -1,6 +1,7 @@ import uuid import pytest + from letta import create_client from letta.client.client import LocalClient from letta.schemas.agent import AgentState diff --git a/tests/test_managers.py b/tests/test_managers.py index 052a1819ec..388d477c60 100644 --- a/tests/test_managers.py +++ b/tests/test_managers.py @@ -3,27 +3,30 @@ from datetime import datetime, timedelta import pytest +from sqlalchemy import delete +from sqlalchemy.exc import IntegrityError + from letta.config import LettaConfig from letta.constants import BASE_MEMORY_TOOLS, BASE_TOOLS from letta.embeddings import embedding_model from letta.functions.functions import derive_openai_json_schema, parse_source_code from letta.orm import ( - Agent, - AgentPassage, - Block, - BlocksAgents, - FileMetadata, - Job, - Message, - Organization, - SandboxConfig, - SandboxEnvironmentVariable, - Source, - SourcePassage, - SourcesAgents, - Tool, - ToolsAgents, - User, + Agent, + AgentPassage, + Block, + BlocksAgents, + FileMetadata, + Job, + Message, + Organization, + SandboxConfig, + SandboxEnvironmentVariable, + Source, + SourcePassage, + SourcesAgents, + Tool, + ToolsAgents, + User, ) from letta.orm.agents_tags import AgentsTags from letta.orm.errors import NoResultFound, UniqueConstraintViolationError @@ -41,13 +44,13 @@ from letta.schemas.organization import Organization as PydanticOrganization from letta.schemas.passage import Passage as PydanticPassage from letta.schemas.sandbox_config import ( - E2BSandboxConfig, - LocalSandboxConfig, - SandboxConfigCreate, - SandboxConfigUpdate, - SandboxEnvironmentVariableCreate, - SandboxEnvironmentVariableUpdate, - SandboxType, + E2BSandboxConfig, + LocalSandboxConfig, + SandboxConfigCreate, + SandboxConfigUpdate, + SandboxEnvironmentVariableCreate, + SandboxEnvironmentVariableUpdate, + SandboxType, ) from letta.schemas.source import Source as PydanticSource from letta.schemas.source import SourceUpdate @@ -60,8 +63,6 @@ from letta.services.block_manager import BlockManager from letta.services.organization_manager import OrganizationManager from letta.settings import tool_settings -from sqlalchemy import delete -from sqlalchemy.exc import IntegrityError from tests.helpers.utils import comprehensive_agent_checks DEFAULT_EMBEDDING_CONFIG = EmbeddingConfig( diff --git a/tests/test_model_letta_perfomance.py b/tests/test_model_letta_perfomance.py index 59bc90af4a..d45654eaaa 100644 --- a/tests/test_model_letta_perfomance.py +++ b/tests/test_model_letta_perfomance.py @@ -3,15 +3,15 @@ import time from tests.helpers.endpoints_helper import ( - check_agent_archival_memory_insert, - check_agent_archival_memory_retrieval, - check_agent_edit_core_memory, - check_agent_recall_chat_memory, - check_agent_summarize_memory_simple, - check_agent_uses_external_tool, - check_first_response_is_valid_for_llm_endpoint, - check_response_contains_keyword, - run_embedding_endpoint, + check_agent_archival_memory_insert, + check_agent_archival_memory_retrieval, + check_agent_edit_core_memory, + check_agent_recall_chat_memory, + check_agent_summarize_memory_simple, + check_agent_uses_external_tool, + check_first_response_is_valid_for_llm_endpoint, + check_response_contains_keyword, + run_embedding_endpoint, ) # directories diff --git a/tests/test_providers.py b/tests/test_providers.py index 8e4ea5cc7e..228e33525b 100644 --- a/tests/test_providers.py +++ b/tests/test_providers.py @@ -1,14 +1,14 @@ import os from letta.providers import ( - AnthropicProvider, - AzureProvider, - GoogleAIProvider, - GroqProvider, - MistralProvider, - OllamaProvider, - OpenAIProvider, - TogetherProvider, + AnthropicProvider, + AzureProvider, + GoogleAIProvider, + GroqProvider, + MistralProvider, + OllamaProvider, + OpenAIProvider, + TogetherProvider, ) from letta.settings import model_settings diff --git a/tests/test_server.py b/tests/test_server.py index e0d51ffcb1..2f205a7e7c 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -3,19 +3,13 @@ import warnings from typing import List, Tuple -import letta.utils as utils import pytest + +import letta.utils as utils from letta.constants import BASE_MEMORY_TOOLS, BASE_TOOLS from letta.schemas.block import CreateBlock from letta.schemas.enums import MessageRole -from letta.schemas.letta_message import ( - LettaMessage, - ReasoningMessage, - SystemMessage, - ToolCallMessage, - ToolReturnMessage, - UserMessage, -) +from letta.schemas.letta_message import LettaMessage, ReasoningMessage, SystemMessage, ToolCallMessage, ToolReturnMessage, UserMessage from letta.schemas.user import User utils.DEBUG = True diff --git a/tests/test_stream_buffer_readers.py b/tests/test_stream_buffer_readers.py index 92335cc704..9a0bb5e850 100644 --- a/tests/test_stream_buffer_readers.py +++ b/tests/test_stream_buffer_readers.py @@ -1,6 +1,7 @@ import json import pytest + from letta.streaming_utils import JSONInnerThoughtsExtractor diff --git a/tests/test_tool_rule_solver.py b/tests/test_tool_rule_solver.py index 8a9e93537c..dcb66e1b12 100644 --- a/tests/test_tool_rule_solver.py +++ b/tests/test_tool_rule_solver.py @@ -1,12 +1,8 @@ import pytest + from letta.helpers import ToolRulesSolver from letta.helpers.tool_rule_solver import ToolRuleValidationError -from letta.schemas.tool_rule import ( - ChildToolRule, - ConditionalToolRule, - InitToolRule, - TerminalToolRule, -) +from letta.schemas.tool_rule import ChildToolRule, ConditionalToolRule, InitToolRule, TerminalToolRule # Constants for tool names used in the tests START_TOOL = "start_tool" diff --git a/tests/test_tool_sandbox/restaurant_management_system/adjust_menu_prices.py b/tests/test_tool_sandbox/restaurant_management_system/adjust_menu_prices.py index 1e5c090e6b..57adc16395 100644 --- a/tests/test_tool_sandbox/restaurant_management_system/adjust_menu_prices.py +++ b/tests/test_tool_sandbox/restaurant_management_system/adjust_menu_prices.py @@ -8,6 +8,7 @@ def adjust_menu_prices(percentage: float) -> str: str: A formatted string summarizing the price adjustments. """ import cowsay + from core.menu import Menu, MenuItem # Import a class from the codebase from core.utils import format_currency # Use a utility function to test imports diff --git a/tests/test_tool_schema_parsing.py b/tests/test_tool_schema_parsing.py index 6eed18f19a..f6738a06f0 100644 --- a/tests/test_tool_schema_parsing.py +++ b/tests/test_tool_schema_parsing.py @@ -2,6 +2,7 @@ import os import pytest + from letta.functions.functions import derive_openai_json_schema from letta.llm_api.helpers import convert_to_structured_output, make_post_request diff --git a/tests/test_utils.py b/tests/test_utils.py index f8fd42ddb6..904e903e74 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,4 +1,5 @@ import pytest + from letta.constants import MAX_FILENAME_LENGTH from letta.utils import sanitize_filename diff --git a/tests/test_v1_routes.py b/tests/test_v1_routes.py index 6877031c69..5093fe93b3 100644 --- a/tests/test_v1_routes.py +++ b/tests/test_v1_routes.py @@ -1,13 +1,9 @@ from unittest.mock import MagicMock, Mock, patch import pytest -from composio.client.collections import ( - ActionModel, - ActionParametersModel, - ActionResponseModel, - AppModel, -) +from composio.client.collections import ActionModel, ActionParametersModel, ActionResponseModel, AppModel from fastapi.testclient import TestClient + from letta.schemas.tool import ToolCreate, ToolUpdate from letta.server.rest_api.app import app from letta.server.rest_api.utils import get_letta_server diff --git a/tests/test_vector_embeddings.py b/tests/test_vector_embeddings.py index 8640f628fe..e65e6b9b1d 100644 --- a/tests/test_vector_embeddings.py +++ b/tests/test_vector_embeddings.py @@ -1,4 +1,5 @@ import numpy as np + from letta.orm.sqlalchemy_base import adapt_array from letta.orm.sqlite_functions import convert_array, verify_embedding_dimension diff --git a/tests/utils.py b/tests/utils.py index 3ce1cb62be..19a05a090a 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -5,6 +5,7 @@ from typing import Dict, Iterator, List, Tuple import requests + from letta.config import LettaConfig from letta.data_sources.connectors import DataConnector from letta.schemas.file import FileMetadata From 4417c5624af51afe626f9e05ff29a3613ea6e915 Mon Sep 17 00:00:00 2001 From: Caren Thomas Date: Thu, 26 Dec 2024 12:06:01 -0800 Subject: [PATCH 143/280] change delete agent return type to none --- letta/server/rest_api/routers/v1/agents.py | 5 +++-- letta/services/agent_manager.py | 7 +++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index 6f78fbfad9..79f35afff5 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -170,7 +170,7 @@ def get_agent_state( raise HTTPException(status_code=404, detail=str(e)) -@router.delete("/{agent_id}", response_model=AgentState, operation_id="delete_agent") +@router.delete("/{agent_id}", response_model=None, operation_id="delete_agent") def delete_agent( agent_id: str, server: "SyncServer" = Depends(get_letta_server), @@ -181,7 +181,8 @@ def delete_agent( """ actor = server.user_manager.get_user_or_default(user_id=user_id) try: - return server.agent_manager.delete_agent(agent_id=agent_id, actor=actor) + server.agent_manager.delete_agent(agent_id=agent_id, actor=actor) + return JSONResponse(status_code=status.HTTP_200_OK) except NoResultFound: raise HTTPException(status_code=404, detail=f"Agent agent_id={agent_id} not found for user_id={actor.id}.") diff --git a/letta/services/agent_manager.py b/letta/services/agent_manager.py index 4e6b80ec5b..26ce034ad3 100644 --- a/letta/services/agent_manager.py +++ b/letta/services/agent_manager.py @@ -279,7 +279,7 @@ def get_agent_by_name(self, agent_name: str, actor: PydanticUser) -> PydanticAge return agent.to_pydantic() @enforce_types - def delete_agent(self, agent_id: str, actor: PydanticUser) -> PydanticAgentState: + def delete_agent(self, agent_id: str, actor: PydanticUser) -> None: """ Deletes an agent and its associated relationships. Ensures proper permission checks and cascades where applicable. @@ -288,15 +288,14 @@ def delete_agent(self, agent_id: str, actor: PydanticUser) -> PydanticAgentState agent_id: ID of the agent to be deleted. actor: User performing the action. - Returns: - PydanticAgentState: The deleted agent state + Raises: + NoResultFound: If agent doesn't exist """ with self.session_maker() as session: # Retrieve the agent agent = AgentModel.read(db_session=session, identifier=agent_id, actor=actor) agent_state = agent.to_pydantic() agent.hard_delete(session) - return agent_state # ====================================================================================================================== # In Context Messages Management From 6c6faf9b26e1a570e2ede23f8fd42d184ae278af Mon Sep 17 00:00:00 2001 From: Caren Thomas Date: Thu, 26 Dec 2024 14:22:10 -0800 Subject: [PATCH 144/280] remove lettaresponse spec hardcode and add references to pydantic --- letta/schemas/letta_response.py | 28 ++++++++++++++++++++++++++-- letta/server/rest_api/app.py | 3 --- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/letta/schemas/letta_response.py b/letta/schemas/letta_response.py index c6a1e8be58..d12b2dc7ae 100644 --- a/letta/schemas/letta_response.py +++ b/letta/schemas/letta_response.py @@ -23,8 +23,32 @@ class LettaResponse(BaseModel): usage (LettaUsageStatistics): The usage statistics """ - messages: List[LettaMessageUnion] = Field(..., description="The messages returned by the agent.") - usage: LettaUsageStatistics = Field(..., description="The usage statistics of the agent.") + messages: List[LettaMessageUnion] = Field( + ..., + description="The messages returned by the agent.", + json_schema_extra={ + "items": { + "oneOf": [ + {"x-ref-name": "SystemMessage"}, + {"x-ref-name": "UserMessage"}, + {"x-ref-name": "ReasoningMessage"}, + {"x-ref-name": "ToolCallMessage"}, + {"x-ref-name": "ToolReturnMessage"}, + {"x-ref-name": "AssistantMessage"} + ], + "discriminator": { + "propertyName": "message_type" + } + } + } + ) + usage: LettaUsageStatistics = Field( + ..., + description="The usage statistics of the agent.", + json_schema_extra={ + "x-ref-name": "LettaUsageStatistics" + } + ) def __str__(self): return json_dumps( diff --git a/letta/server/rest_api/app.py b/letta/server/rest_api/app.py index 8e2b7fb742..a8d31df492 100644 --- a/letta/server/rest_api/app.py +++ b/letta/server/rest_api/app.py @@ -68,9 +68,6 @@ def generate_openapi_schema(app: FastAPI): openai_docs["info"]["title"] = "OpenAI Assistants API" letta_docs["paths"] = {k: v for k, v in letta_docs["paths"].items() if not k.startswith("/openai")} letta_docs["info"]["title"] = "Letta API" - letta_docs["components"]["schemas"]["LettaResponse"] = { - "properties": LettaResponse.model_json_schema(ref_template="#/components/schemas/LettaResponse/properties/{model}")["$defs"] - } # Split the API docs into Letta API, and OpenAI Assistants compatible API for name, docs in [ From 6a6dab0aa571f158fbef8fda8c76d1f37541321e Mon Sep 17 00:00:00 2001 From: Caren Thomas Date: Thu, 26 Dec 2024 20:09:19 -0800 Subject: [PATCH 145/280] rebase, run formatter --- letta/schemas/letta_response.py | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/letta/schemas/letta_response.py b/letta/schemas/letta_response.py index d12b2dc7ae..10a1b38006 100644 --- a/letta/schemas/letta_response.py +++ b/letta/schemas/letta_response.py @@ -24,7 +24,7 @@ class LettaResponse(BaseModel): """ messages: List[LettaMessageUnion] = Field( - ..., + ..., description="The messages returned by the agent.", json_schema_extra={ "items": { @@ -34,20 +34,14 @@ class LettaResponse(BaseModel): {"x-ref-name": "ReasoningMessage"}, {"x-ref-name": "ToolCallMessage"}, {"x-ref-name": "ToolReturnMessage"}, - {"x-ref-name": "AssistantMessage"} + {"x-ref-name": "AssistantMessage"}, ], - "discriminator": { - "propertyName": "message_type" - } + "discriminator": {"propertyName": "message_type"}, } - } + }, ) usage: LettaUsageStatistics = Field( - ..., - description="The usage statistics of the agent.", - json_schema_extra={ - "x-ref-name": "LettaUsageStatistics" - } + ..., description="The usage statistics of the agent.", json_schema_extra={"x-ref-name": "LettaUsageStatistics"} ) def __str__(self): From eae74f0f53bef2fbf281d8645f23bcdb20a96fba Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Fri, 27 Dec 2024 11:28:00 +0400 Subject: [PATCH 146/280] fix example --- .env.example | 29 +++-------------------------- 1 file changed, 3 insertions(+), 26 deletions(-) diff --git a/.env.example b/.env.example index 48cbd7303e..c788793d8a 100644 --- a/.env.example +++ b/.env.example @@ -2,43 +2,20 @@ Example enviornment variable configurations for the Letta Docker container. Un-coment the sections you want to configure with. - -Hint: You don't need to have the same LLM and -Embedding model backends (can mix and match). ########################################################## ########################################################## OpenAI configuration ########################################################## -## LLM Model -#LETTA_LLM_ENDPOINT_TYPE=openai -#LETTA_LLM_MODEL=gpt-4o-mini -## Embeddings -#LETTA_EMBEDDING_ENDPOINT_TYPE=openai -#LETTA_EMBEDDING_MODEL=text-embedding-ada-002 - +# OPENAI_API_KEY=sk-... ########################################################## Ollama configuration ########################################################## -## LLM Model -#LETTA_LLM_ENDPOINT=http://host.docker.internal:11434 -#LETTA_LLM_ENDPOINT_TYPE=ollama -#LETTA_LLM_MODEL=dolphin2.2-mistral:7b-q6_K -#LETTA_LLM_CONTEXT_WINDOW=8192 -## Embeddings -#LETTA_EMBEDDING_ENDPOINT=http://host.docker.internal:11434 -#LETTA_EMBEDDING_ENDPOINT_TYPE=ollama -#LETTA_EMBEDDING_MODEL=mxbai-embed-large -#LETTA_EMBEDDING_DIM=512 - +# OLLAMA_BASE_URL="http://host.docker.internal:11434" ########################################################## vLLM configuration ########################################################## -## LLM Model -#LETTA_LLM_ENDPOINT=http://host.docker.internal:8000 -#LETTA_LLM_ENDPOINT_TYPE=vllm -#LETTA_LLM_MODEL=ehartford/dolphin-2.2.1-mistral-7b -#LETTA_LLM_CONTEXT_WINDOW=8192 +# VLLM_API_BASE="http://host.docker.internal:8000" From 63ecbee5045772ae08299c2a4c8e4431a5d9b87a Mon Sep 17 00:00:00 2001 From: Caren Thomas Date: Thu, 26 Dec 2024 19:59:28 -0800 Subject: [PATCH 147/280] add e2b envs for unit test yml --- .github/workflows/tests.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index e4c46c5e85..90bb399681 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -6,6 +6,8 @@ env: ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }} GROQ_API_KEY: ${{ secrets.GROQ_API_KEY }} + E2B_API_KEY: ${{ secrets.E2B_API_KEY }} + E2B_SANDBOX_TEMPLATE_ID: ${{ secrets.E2B_SANDBOX_TEMPLATE_ID }} on: push: From 7a2c266c8006aaff9ced5dd2b4e585af8b51e791 Mon Sep 17 00:00:00 2001 From: Caren Thomas Date: Fri, 27 Dec 2024 09:20:23 -0800 Subject: [PATCH 148/280] update install args in yml --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 90bb399681..b56e9db129 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -63,7 +63,7 @@ jobs: with: python-version: "3.12" poetry-version: "1.8.2" - install-args: "-E dev -E postgres -E external-tools -E tests" + install-args: "-E dev -E postgres -E external-tools -E tests -E cloud-tool-sandbox" - name: Migrate database env: LETTA_PG_PORT: 5432 From 67b0525bab2d889ff28be9c97d91bd30cb5aeee7 Mon Sep 17 00:00:00 2001 From: Caren Thomas Date: Fri, 27 Dec 2024 09:51:23 -0800 Subject: [PATCH 149/280] fix response args --- letta/server/rest_api/routers/v1/agents.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index 79f35afff5..986c8512f6 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -182,7 +182,7 @@ def delete_agent( actor = server.user_manager.get_user_or_default(user_id=user_id) try: server.agent_manager.delete_agent(agent_id=agent_id, actor=actor) - return JSONResponse(status_code=status.HTTP_200_OK) + return JSONResponse(status_code=status.HTTP_200_OK, content={"message": f"Agent id={agent_id} successfully deleted"}) except NoResultFound: raise HTTPException(status_code=404, detail=f"Agent agent_id={agent_id} not found for user_id={actor.id}.") From 6b82b402894bad6af93ed05a3d9cc9ab040646ac Mon Sep 17 00:00:00 2001 From: Shubham Naik Date: Fri, 27 Dec 2024 13:33:09 -0800 Subject: [PATCH 150/280] feat: add desktop ui app --- letta/server/rest_api/app.py | 1 - letta/services/agent_manager.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/letta/server/rest_api/app.py b/letta/server/rest_api/app.py index a8d31df492..63ff9b8b72 100644 --- a/letta/server/rest_api/app.py +++ b/letta/server/rest_api/app.py @@ -16,7 +16,6 @@ from letta.errors import LettaAgentNotFoundError, LettaUserNotFoundError from letta.log import get_logger from letta.orm.errors import DatabaseTimeoutError, ForeignKeyConstraintViolationError, NoResultFound, UniqueConstraintViolationError -from letta.schemas.letta_response import LettaResponse from letta.server.constants import REST_DEFAULT_PORT # NOTE(charles): these are extra routes that are not part of v1 but we still need to mount to pass tests diff --git a/letta/services/agent_manager.py b/letta/services/agent_manager.py index 26ce034ad3..3c81241488 100644 --- a/letta/services/agent_manager.py +++ b/letta/services/agent_manager.py @@ -294,7 +294,7 @@ def delete_agent(self, agent_id: str, actor: PydanticUser) -> None: with self.session_maker() as session: # Retrieve the agent agent = AgentModel.read(db_session=session, identifier=agent_id, actor=actor) - agent_state = agent.to_pydantic() + agent.to_pydantic() agent.hard_delete(session) # ====================================================================================================================== From cff2e7d4557c44885f0879fd7a1417fbf54c8753 Mon Sep 17 00:00:00 2001 From: Shubham Naik Date: Fri, 27 Dec 2024 15:45:06 -0800 Subject: [PATCH 151/280] chore: init --- letta/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/letta/settings.py b/letta/settings.py index 1b6ba44bbe..4b8bd70824 100644 --- a/letta/settings.py +++ b/letta/settings.py @@ -60,7 +60,7 @@ class ModelSettings(BaseSettings): openllm_api_key: Optional[str] = None -cors_origins = ["http://letta.localhost", "http://localhost:8283", "http://localhost:8083", "http://localhost:3000"] +cors_origins = ["http://letta.localhost", "http://localhost:8283", "http://localhost:8083", "http://localhost:3000", "http://localhost:4200"] class Settings(BaseSettings): From 46d2150ee07b9edb33170ae9a30fda597d9134a9 Mon Sep 17 00:00:00 2001 From: Shubham Naik Date: Fri, 27 Dec 2024 15:46:57 -0800 Subject: [PATCH 152/280] chore: I did not change those --- letta/server/rest_api/app.py | 1 + letta/services/agent_manager.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/letta/server/rest_api/app.py b/letta/server/rest_api/app.py index 63ff9b8b72..a8d31df492 100644 --- a/letta/server/rest_api/app.py +++ b/letta/server/rest_api/app.py @@ -16,6 +16,7 @@ from letta.errors import LettaAgentNotFoundError, LettaUserNotFoundError from letta.log import get_logger from letta.orm.errors import DatabaseTimeoutError, ForeignKeyConstraintViolationError, NoResultFound, UniqueConstraintViolationError +from letta.schemas.letta_response import LettaResponse from letta.server.constants import REST_DEFAULT_PORT # NOTE(charles): these are extra routes that are not part of v1 but we still need to mount to pass tests diff --git a/letta/services/agent_manager.py b/letta/services/agent_manager.py index 3c81241488..26ce034ad3 100644 --- a/letta/services/agent_manager.py +++ b/letta/services/agent_manager.py @@ -294,7 +294,7 @@ def delete_agent(self, agent_id: str, actor: PydanticUser) -> None: with self.session_maker() as session: # Retrieve the agent agent = AgentModel.read(db_session=session, identifier=agent_id, actor=actor) - agent.to_pydantic() + agent_state = agent.to_pydantic() agent.hard_delete(session) # ====================================================================================================================== From a2decd5003b4fdf33882ff4538cedb0cee0aca26 Mon Sep 17 00:00:00 2001 From: Caren Thomas Date: Sat, 28 Dec 2024 14:26:34 -0800 Subject: [PATCH 153/280] make docs generation idempotent --- letta/schemas/organization.py | 2 +- letta/server/rest_api/app.py | 1 - letta/services/agent_manager.py | 1 - letta/settings.py | 8 +++++++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/letta/schemas/organization.py b/letta/schemas/organization.py index 35784ad0db..f8fc789a37 100644 --- a/letta/schemas/organization.py +++ b/letta/schemas/organization.py @@ -13,7 +13,7 @@ class OrganizationBase(LettaBase): class Organization(OrganizationBase): id: str = OrganizationBase.generate_id_field() - name: str = Field(create_random_username(), description="The name of the organization.") + name: str = Field(create_random_username(), description="The name of the organization.", json_schema_extra={"default": "SincereYogurt"}) created_at: Optional[datetime] = Field(default_factory=get_utc_time, description="The creation date of the organization.") diff --git a/letta/server/rest_api/app.py b/letta/server/rest_api/app.py index a8d31df492..63ff9b8b72 100644 --- a/letta/server/rest_api/app.py +++ b/letta/server/rest_api/app.py @@ -16,7 +16,6 @@ from letta.errors import LettaAgentNotFoundError, LettaUserNotFoundError from letta.log import get_logger from letta.orm.errors import DatabaseTimeoutError, ForeignKeyConstraintViolationError, NoResultFound, UniqueConstraintViolationError -from letta.schemas.letta_response import LettaResponse from letta.server.constants import REST_DEFAULT_PORT # NOTE(charles): these are extra routes that are not part of v1 but we still need to mount to pass tests diff --git a/letta/services/agent_manager.py b/letta/services/agent_manager.py index 26ce034ad3..a51a5faca8 100644 --- a/letta/services/agent_manager.py +++ b/letta/services/agent_manager.py @@ -294,7 +294,6 @@ def delete_agent(self, agent_id: str, actor: PydanticUser) -> None: with self.session_maker() as session: # Retrieve the agent agent = AgentModel.read(db_session=session, identifier=agent_id, actor=actor) - agent_state = agent.to_pydantic() agent.hard_delete(session) # ====================================================================================================================== diff --git a/letta/settings.py b/letta/settings.py index 4b8bd70824..03c6f86dc1 100644 --- a/letta/settings.py +++ b/letta/settings.py @@ -60,7 +60,13 @@ class ModelSettings(BaseSettings): openllm_api_key: Optional[str] = None -cors_origins = ["http://letta.localhost", "http://localhost:8283", "http://localhost:8083", "http://localhost:3000", "http://localhost:4200"] +cors_origins = [ + "http://letta.localhost", + "http://localhost:8283", + "http://localhost:8083", + "http://localhost:3000", + "http://localhost:4200", +] class Settings(BaseSettings): From 52f804992b378f6f4683011824ed541ac70e70ff Mon Sep 17 00:00:00 2001 From: Caren Thomas Date: Sat, 28 Dec 2024 20:12:28 -0800 Subject: [PATCH 154/280] add project id to create agent request --- letta/schemas/agent.py | 1 + 1 file changed, 1 insertion(+) diff --git a/letta/schemas/agent.py b/letta/schemas/agent.py index 03d40350e1..56b2168eff 100644 --- a/letta/schemas/agent.py +++ b/letta/schemas/agent.py @@ -119,6 +119,7 @@ class CreateAgent(BaseModel, validate_assignment=True): # context_window_limit: Optional[int] = Field(None, description="The context window limit used by the agent.") embedding_chunk_size: Optional[int] = Field(DEFAULT_EMBEDDING_CHUNK_SIZE, description="The embedding chunk size used by the agent.") from_template: Optional[str] = Field(None, description="The template id used to configure the agent") + project_id: Optional[str] = Field(None, description="The project id that the agent will be associated with.") @field_validator("name") @classmethod From c858c804f42bc3b33f45ea8a290e92fc329c8bf6 Mon Sep 17 00:00:00 2001 From: Matt Zhou Date: Sun, 29 Dec 2024 17:47:46 -0800 Subject: [PATCH 155/280] Finish --- letta/server/server.py | 12 +++++++ letta/services/tool_execution_sandbox.py | 8 ++--- tests/integration_test_composio.py | 32 +++++++++++++++++++ ...integration_test_tool_execution_sandbox.py | 6 ++++ 4 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 tests/integration_test_composio.py diff --git a/letta/server/server.py b/letta/server/server.py index 03604a89d1..c4699eb37e 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -53,6 +53,7 @@ from letta.schemas.message import Message, MessageCreate, MessageRole, MessageUpdate from letta.schemas.organization import Organization from letta.schemas.passage import Passage +from letta.schemas.sandbox_config import SandboxType, SandboxEnvironmentVariableCreate from letta.schemas.source import Source from letta.schemas.tool import Tool from letta.schemas.usage import LettaUsageStatistics @@ -298,6 +299,17 @@ def __init__( self.block_manager.add_default_blocks(actor=self.default_user) self.tool_manager.upsert_base_tools(actor=self.default_user) + # Add composio keys to the tool sandbox env vars of the org + if tool_settings.composio_api_key: + manager = SandboxConfigManager(tool_settings) + sandbox_config = manager.get_or_create_default_sandbox_config(sandbox_type=SandboxType.LOCAL, actor=self.default_user) + + manager.create_sandbox_env_var( + SandboxEnvironmentVariableCreate(key="COMPOSIO_API_KEY", value=tool_settings.composio_api_key), + sandbox_config_id=sandbox_config.id, + actor=self.default_user, + ) + # collect providers (always has Letta as a default) self._enabled_providers: List[Provider] = [LettaProvider()] if model_settings.openai_api_key: diff --git a/letta/services/tool_execution_sandbox.py b/letta/services/tool_execution_sandbox.py index fc6e1bdd38..b05b6ce235 100644 --- a/letta/services/tool_execution_sandbox.py +++ b/letta/services/tool_execution_sandbox.py @@ -127,7 +127,7 @@ def run_local_dir_sandbox(self, agent_state: AgentState) -> SandboxRunResult: if local_configs.use_venv: return self.run_local_dir_sandbox_venv(sbx_config, env, temp_file_path) else: - return self.run_local_dir_sandbox_runpy(sbx_config, env_vars, temp_file_path) + return self.run_local_dir_sandbox_runpy(sbx_config, env, temp_file_path) except Exception as e: logger.error(f"Executing tool {self.tool_name} has an unexpected error: {e}") logger.error(f"Logging out tool {self.tool_name} auto-generated code for debugging: \n\n{code}") @@ -200,7 +200,7 @@ def run_local_dir_sandbox_venv(self, sbx_config: SandboxConfig, env: Dict[str, s logger.error(f"Executing tool {self.tool_name} has an unexpected error: {e}") raise e - def run_local_dir_sandbox_runpy(self, sbx_config: SandboxConfig, env_vars: Dict[str, str], temp_file_path: str) -> SandboxRunResult: + def run_local_dir_sandbox_runpy(self, sbx_config: SandboxConfig, env: Dict[str, str], temp_file_path: str) -> SandboxRunResult: status = "success" agent_state, stderr = None, None @@ -213,8 +213,8 @@ def run_local_dir_sandbox_runpy(self, sbx_config: SandboxConfig, env_vars: Dict[ try: # Execute the temp file - with self.temporary_env_vars(env_vars): - result = runpy.run_path(temp_file_path, init_globals=env_vars) + with self.temporary_env_vars(env): + result = runpy.run_path(temp_file_path, init_globals=env) # Fetch the result func_result = result.get(self.LOCAL_SANDBOX_RESULT_VAR_NAME) diff --git a/tests/integration_test_composio.py b/tests/integration_test_composio.py new file mode 100644 index 0000000000..7caf33250e --- /dev/null +++ b/tests/integration_test_composio.py @@ -0,0 +1,32 @@ +import pytest +from fastapi.testclient import TestClient + +from letta.server.rest_api.app import app + + +@pytest.fixture +def client(): + return TestClient(app) + +def test_list_composio_apps(client): + response = client.get( + "/v1/tools/composio/apps" + ) + assert response.status_code == 200 + assert isinstance(response.json(), list) + +def test_list_composio_actions_by_app(client): + response = client.get( + "/v1/tools/composio/apps/github/actions" + ) + assert response.status_code == 200 + assert isinstance(response.json(), list) + +def test_add_composio_tool(client): + response = client.post( + "/v1/tools/composio/GITHUB_STAR_A_REPOSITORY_FOR_THE_AUTHENTICATED_USER" + ) + assert response.status_code == 200 + assert "id" in response.json() + assert "name" in response.json() + diff --git a/tests/integration_test_tool_execution_sandbox.py b/tests/integration_test_tool_execution_sandbox.py index 97346021b9..b84bcd51ac 100644 --- a/tests/integration_test_tool_execution_sandbox.py +++ b/tests/integration_test_tool_execution_sandbox.py @@ -351,6 +351,12 @@ def test_local_sandbox_e2e_composio_star_github(mock_e2b_api_key_none, check_com assert result.func_return["details"] == "Action executed successfully" +@pytest.mark.local_sandbox +def test_local_sandbox_e2e_composio_star_github_without_setting_db_env_vars(mock_e2b_api_key_none, check_composio_key_set, composio_github_star_tool, test_user): + result = ToolExecutionSandbox(composio_github_star_tool.name, {"owner": "letta-ai", "repo": "letta"}, user=test_user).run() + assert result.func_return["details"] == "Action executed successfully" + + @pytest.mark.local_sandbox def test_local_sandbox_external_codebase(mock_e2b_api_key_none, custom_test_sandbox_config, external_codebase_tool, test_user): # Set the args From 828aaeba7d70e22a5c4027473c2997870c380815 Mon Sep 17 00:00:00 2001 From: Nuno Rocha Date: Mon, 30 Dec 2024 14:39:37 +0100 Subject: [PATCH 156/280] fix: upgrade dependencies with security warnings (python-multipart, setuptools, jinja2). --- poetry.lock | 74 +++++++++++++++++++++++++++++++++++++------------- pyproject.toml | 6 ++-- 2 files changed, 58 insertions(+), 22 deletions(-) diff --git a/poetry.lock b/poetry.lock index 80453badc6..ebc37774ac 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" @@ -392,6 +392,10 @@ files = [ {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a37b8f0391212d29b3a91a799c8e4a2855e0576911cdfb2515487e30e322253d"}, {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e84799f09591700a4154154cab9787452925578841a94321d5ee8fb9a9a328f0"}, {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f66b5337fa213f1da0d9000bc8dc0cb5b896b726eefd9c6046f699b169c41b9e"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5dab0844f2cf82be357a0eb11a9087f70c5430b2c241493fc122bb6f2bb0917c"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e4fe605b917c70283db7dfe5ada75e04561479075761a0b3866c081d035b01c1"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1e9a65b5736232e7a7f91ff3d02277f11d339bf34099a56cdab6a8b3410a02b2"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:58d4b711689366d4a03ac7957ab8c28890415e267f9b6589969e74b6e42225ec"}, {file = "Brotli-1.1.0-cp310-cp310-win32.whl", hash = "sha256:be36e3d172dc816333f33520154d708a2657ea63762ec16b62ece02ab5e4daf2"}, {file = "Brotli-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:0c6244521dda65ea562d5a69b9a26120769b7a9fb3db2fe9545935ed6735b128"}, {file = "Brotli-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a3daabb76a78f829cafc365531c972016e4aa8d5b4bf60660ad8ecee19df7ccc"}, @@ -404,8 +408,14 @@ files = [ {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:19c116e796420b0cee3da1ccec3b764ed2952ccfcc298b55a10e5610ad7885f9"}, {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:510b5b1bfbe20e1a7b3baf5fed9e9451873559a976c1a78eebaa3b86c57b4265"}, {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a1fd8a29719ccce974d523580987b7f8229aeace506952fa9ce1d53a033873c8"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c247dd99d39e0338a604f8c2b3bc7061d5c2e9e2ac7ba9cc1be5a69cb6cd832f"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1b2c248cd517c222d89e74669a4adfa5577e06ab68771a529060cf5a156e9757"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2a24c50840d89ded6c9a8fdc7b6ed3692ed4e86f1c4a4a938e1e92def92933e0"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f31859074d57b4639318523d6ffdca586ace54271a73ad23ad021acd807eb14b"}, {file = "Brotli-1.1.0-cp311-cp311-win32.whl", hash = "sha256:39da8adedf6942d76dc3e46653e52df937a3c4d6d18fdc94a7c29d263b1f5b50"}, {file = "Brotli-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:aac0411d20e345dc0920bdec5548e438e999ff68d77564d5e9463a7ca9d3e7b1"}, + {file = "Brotli-1.1.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:32d95b80260d79926f5fab3c41701dbb818fde1c9da590e77e571eefd14abe28"}, + {file = "Brotli-1.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b760c65308ff1e462f65d69c12e4ae085cff3b332d894637f6273a12a482d09f"}, {file = "Brotli-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:316cc9b17edf613ac76b1f1f305d2a748f1b976b033b049a6ecdfd5612c70409"}, {file = "Brotli-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:caf9ee9a5775f3111642d33b86237b05808dafcd6268faa492250e9b78046eb2"}, {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70051525001750221daa10907c77830bc889cb6d865cc0b813d9db7fefc21451"}, @@ -416,8 +426,24 @@ files = [ {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4093c631e96fdd49e0377a9c167bfd75b6d0bad2ace734c6eb20b348bc3ea180"}, {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e4c4629ddad63006efa0ef968c8e4751c5868ff0b1c5c40f76524e894c50248"}, {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:861bf317735688269936f755fa136a99d1ed526883859f86e41a5d43c61d8966"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:87a3044c3a35055527ac75e419dfa9f4f3667a1e887ee80360589eb8c90aabb9"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c5529b34c1c9d937168297f2c1fde7ebe9ebdd5e121297ff9c043bdb2ae3d6fb"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ca63e1890ede90b2e4454f9a65135a4d387a4585ff8282bb72964fab893f2111"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e79e6520141d792237c70bcd7a3b122d00f2613769ae0cb61c52e89fd3443839"}, {file = "Brotli-1.1.0-cp312-cp312-win32.whl", hash = "sha256:5f4d5ea15c9382135076d2fb28dde923352fe02951e66935a9efaac8f10e81b0"}, {file = "Brotli-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:906bc3a79de8c4ae5b86d3d75a8b77e44404b0f4261714306e3ad248d8ab0951"}, + {file = "Brotli-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8bf32b98b75c13ec7cf774164172683d6e7891088f6316e54425fde1efc276d5"}, + {file = "Brotli-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7bc37c4d6b87fb1017ea28c9508b36bbcb0c3d18b4260fcdf08b200c74a6aee8"}, + {file = "Brotli-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c0ef38c7a7014ffac184db9e04debe495d317cc9c6fb10071f7fefd93100a4f"}, + {file = "Brotli-1.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91d7cc2a76b5567591d12c01f019dd7afce6ba8cba6571187e21e2fc418ae648"}, + {file = "Brotli-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a93dde851926f4f2678e704fadeb39e16c35d8baebd5252c9fd94ce8ce68c4a0"}, + {file = "Brotli-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0db75f47be8b8abc8d9e31bc7aad0547ca26f24a54e6fd10231d623f183d089"}, + {file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6967ced6730aed543b8673008b5a391c3b1076d834ca438bbd70635c73775368"}, + {file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7eedaa5d036d9336c95915035fb57422054014ebdeb6f3b42eac809928e40d0c"}, + {file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d487f5432bf35b60ed625d7e1b448e2dc855422e87469e3f450aa5552b0eb284"}, + {file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:832436e59afb93e1836081a20f324cb185836c617659b07b129141a8426973c7"}, + {file = "Brotli-1.1.0-cp313-cp313-win32.whl", hash = "sha256:43395e90523f9c23a3d5bdf004733246fba087f2948f87ab28015f12359ca6a0"}, + {file = "Brotli-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:9011560a466d2eb3f5a6e4929cf4a09be405c64154e12df0dd72713f6500e32b"}, {file = "Brotli-1.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a090ca607cbb6a34b0391776f0cb48062081f5f60ddcce5d11838e67a01928d1"}, {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de9d02f5bda03d27ede52e8cfe7b865b066fa49258cbab568720aa5be80a47d"}, {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2333e30a5e00fe0fe55903c8832e08ee9c3b1382aacf4db26664a16528d51b4b"}, @@ -427,6 +453,10 @@ files = [ {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:fd5f17ff8f14003595ab414e45fce13d073e0762394f957182e69035c9f3d7c2"}, {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:069a121ac97412d1fe506da790b3e69f52254b9df4eb665cd42460c837193354"}, {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e93dfc1a1165e385cc8239fab7c036fb2cd8093728cbd85097b284d7b99249a2"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:aea440a510e14e818e67bfc4027880e2fb500c2ccb20ab21c7a7c8b5b4703d75"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:6974f52a02321b36847cd19d1b8e381bf39939c21efd6ee2fc13a28b0d99348c"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:a7e53012d2853a07a4a79c00643832161a910674a893d296c9f1259859a289d2"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:d7702622a8b40c49bffb46e1e3ba2e81268d5c04a34f460978c6b5517a34dd52"}, {file = "Brotli-1.1.0-cp36-cp36m-win32.whl", hash = "sha256:a599669fd7c47233438a56936988a2478685e74854088ef5293802123b5b2460"}, {file = "Brotli-1.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d143fd47fad1db3d7c27a1b1d66162e855b5d50a89666af46e1679c496e8e579"}, {file = "Brotli-1.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:11d00ed0a83fa22d29bc6b64ef636c4552ebafcef57154b4ddd132f5638fbd1c"}, @@ -438,6 +468,10 @@ files = [ {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:919e32f147ae93a09fe064d77d5ebf4e35502a8df75c29fb05788528e330fe74"}, {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:23032ae55523cc7bccb4f6a0bf368cd25ad9bcdcc1990b64a647e7bbcce9cb5b"}, {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:224e57f6eac61cc449f498cc5f0e1725ba2071a3d4f48d5d9dffba42db196438"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:cb1dac1770878ade83f2ccdf7d25e494f05c9165f5246b46a621cc849341dc01"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:3ee8a80d67a4334482d9712b8e83ca6b1d9bc7e351931252ebef5d8f7335a547"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:5e55da2c8724191e5b557f8e18943b1b4839b8efc3ef60d65985bcf6f587dd38"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:d342778ef319e1026af243ed0a07c97acf3bad33b9f29e7ae6a1f68fd083e90c"}, {file = "Brotli-1.1.0-cp37-cp37m-win32.whl", hash = "sha256:587ca6d3cef6e4e868102672d3bd9dc9698c309ba56d41c2b9c85bbb903cdb95"}, {file = "Brotli-1.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2954c1c23f81c2eaf0b0717d9380bd348578a94161a65b3a2afc62c86467dd68"}, {file = "Brotli-1.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:efa8b278894b14d6da122a72fefcebc28445f2d3f880ac59d46c90f4c13be9a3"}, @@ -450,6 +484,10 @@ files = [ {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ab4fbee0b2d9098c74f3057b2bc055a8bd92ccf02f65944a241b4349229185a"}, {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:141bd4d93984070e097521ed07e2575b46f817d08f9fa42b16b9b5f27b5ac088"}, {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fce1473f3ccc4187f75b4690cfc922628aed4d3dd013d047f95a9b3919a86596"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d2b35ca2c7f81d173d2fadc2f4f31e88cc5f7a39ae5b6db5513cf3383b0e0ec7"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:af6fa6817889314555aede9a919612b23739395ce767fe7fcbea9a80bf140fe5"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:2feb1d960f760a575dbc5ab3b1c00504b24caaf6986e2dc2b01c09c87866a943"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4410f84b33374409552ac9b6903507cdb31cd30d2501fc5ca13d18f73548444a"}, {file = "Brotli-1.1.0-cp38-cp38-win32.whl", hash = "sha256:db85ecf4e609a48f4b29055f1e144231b90edc90af7481aa731ba2d059226b1b"}, {file = "Brotli-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3d7954194c36e304e1523f55d7042c59dc53ec20dd4e9ea9d151f1b62b4415c0"}, {file = "Brotli-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5fb2ce4b8045c78ebbc7b8f3c15062e435d47e7393cc57c25115cfd49883747a"}, @@ -462,6 +500,10 @@ files = [ {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:949f3b7c29912693cee0afcf09acd6ebc04c57af949d9bf77d6101ebb61e388c"}, {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:89f4988c7203739d48c6f806f1e87a1d96e0806d44f0fba61dba81392c9e474d"}, {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:de6551e370ef19f8de1807d0a9aa2cdfdce2e85ce88b122fe9f6b2b076837e59"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0737ddb3068957cf1b054899b0883830bb1fec522ec76b1098f9b6e0f02d9419"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4f3607b129417e111e30637af1b56f24f7a49e64763253bbc275c75fa887d4b2"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:6c6e0c425f22c1c719c42670d561ad682f7bfeeef918edea971a79ac5252437f"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:494994f807ba0b92092a163a0a283961369a65f6cbe01e8891132b7a320e61eb"}, {file = "Brotli-1.1.0-cp39-cp39-win32.whl", hash = "sha256:f0d8a7a6b5983c2496e364b969f0e526647a06b075d034f3297dc66f3b360c64"}, {file = "Brotli-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cdad5b9014d83ca68c25d2e9444e28e967ef16e80f6b436918c700c117a85467"}, {file = "Brotli-1.1.0.tar.gz", hash = "sha256:81de08ac11bcb85841e440c13611c00b67d3bf82698314928d0b676362546724"}, @@ -806,7 +848,6 @@ files = [ {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb"}, {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b"}, {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543"}, - {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:60eb32934076fa07e4316b7b2742fa52cbb190b42c2df2863dbc4230a0a9b385"}, {file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e"}, {file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e"}, {file = "cryptography-44.0.0-cp37-abi3-win32.whl", hash = "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053"}, @@ -817,7 +858,6 @@ files = [ {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289"}, {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7"}, {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c"}, - {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9abcc2e083cbe8dde89124a47e5e53ec38751f0d7dfd36801008f316a127d7ba"}, {file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64"}, {file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285"}, {file = "cryptography-44.0.0-cp39-abi3-win32.whl", hash = "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417"}, @@ -2106,13 +2146,13 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] [[package]] name = "jinja2" -version = "3.1.4" +version = "3.1.5" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, - {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, + {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, + {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, ] [package.dependencies] @@ -4500,18 +4540,15 @@ cli = ["click (>=5.0)"] [[package]] name = "python-multipart" -version = "0.0.9" +version = "0.0.19" description = "A streaming multipart parser for Python" optional = false python-versions = ">=3.8" files = [ - {file = "python_multipart-0.0.9-py3-none-any.whl", hash = "sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215"}, - {file = "python_multipart-0.0.9.tar.gz", hash = "sha256:03f54688c663f1b7977105f021043b0793151e4cb1c1a9d4a11fc13d622c4026"}, + {file = "python_multipart-0.0.19-py3-none-any.whl", hash = "sha256:f8d5b0b9c618575bf9df01c684ded1d94a338839bdd8223838afacfb4bb2082d"}, + {file = "python_multipart-0.0.19.tar.gz", hash = "sha256:905502ef39050557b7a6af411f454bc19526529ca46ae6831508438890ce12cc"}, ] -[package.extras] -dev = ["atomicwrites (==1.4.1)", "attrs (==23.2.0)", "coverage (==7.4.1)", "hatch", "invoke (==2.2.0)", "more-itertools (==10.2.0)", "pbr (==6.0.0)", "pluggy (==1.4.0)", "py (==1.11.0)", "pytest (==8.0.0)", "pytest-cov (==4.1.0)", "pytest-timeout (==2.2.0)", "pyyaml (==6.0.1)", "ruff (==0.2.1)"] - [[package]] name = "pytz" version = "2023.4" @@ -5140,19 +5177,18 @@ tornado = ["tornado (>=6)"] [[package]] name = "setuptools" -version = "68.2.2" +version = "70.3.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, - {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, + {file = "setuptools-70.3.0-py3-none-any.whl", hash = "sha256:fe384da74336c398e0d956d1cae0669bc02eed936cdb1d49b57de1990dc11ffc"}, + {file = "setuptools-70.3.0.tar.gz", hash = "sha256:f171bab1dfbc86b132997f26a119f6056a57950d058587841a0082e8830f9dc5"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "shellingham" @@ -6246,4 +6282,4 @@ tests = ["wikipedia"] [metadata] lock-version = "2.0" python-versions = "<4.0,>=3.10" -content-hash = "4a7cf176579d5dc15648979542da152ec98290f1e9f39039cfe9baf73bc1076f" +content-hash = "a50c8aa4afa909ac560f9531e46cfa293115309214bc2925a9d1a131e056cb5c" diff --git a/pyproject.toml b/pyproject.toml index 0a8c73325b..7d6798cf41 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,7 +21,7 @@ questionary = "^2.0.1" pytz = "^2023.3.post1" tqdm = "^4.66.1" black = {extras = ["jupyter"], version = "^24.2.0"} -setuptools = "^68.2.2" +setuptools = "^70" datasets = { version = "^2.14.6", optional = true} prettytable = "^3.9.0" pgvector = { version = "^0.2.3", optional = true } @@ -47,7 +47,7 @@ qdrant-client = {version="^1.9.1", optional = true} python-box = "^7.1.1" sqlmodel = "^0.0.16" autoflake = {version = "^2.3.0", optional = true} -python-multipart = "^0.0.9" +python-multipart = "^0.0.19" sqlalchemy-utils = "^0.41.2" pytest-order = {version = "^1.2.0", optional = true} pytest-asyncio = {version = "^0.23.2", optional = true} @@ -56,7 +56,7 @@ httpx-sse = "^0.4.0" isort = { version = "^5.13.2", optional = true } docker = {version = "^7.1.0", optional = true} nltk = "^3.8.1" -jinja2 = "^3.1.4" +jinja2 = "^3.1.5" locust = {version = "^2.31.5", optional = true} wikipedia = {version = "^1.4.0", optional = true} composio-langchain = "^0.6.3" From 3205a71e754e4fa12e447bba0d07b229b23cd9f5 Mon Sep 17 00:00:00 2001 From: cpacker Date: Mon, 30 Dec 2024 20:41:41 +0100 Subject: [PATCH 157/280] fix: patch bug in json generator for composio --- letta/functions/schema_generator.py | 53 ++--------------------------- letta/schemas/tool.py | 1 + tests/test_tool_schema_parsing.py | 24 +++++++++++-- 3 files changed, 25 insertions(+), 53 deletions(-) diff --git a/letta/functions/schema_generator.py b/letta/functions/schema_generator.py index 89409cb2be..6f5bb52f9d 100644 --- a/letta/functions/schema_generator.py +++ b/letta/functions/schema_generator.py @@ -396,44 +396,6 @@ def generate_schema(function, name: Optional[str] = None, description: Optional[ return schema -def generate_schema_from_args_schema_v1( - args_schema: Type[V1BaseModel], name: Optional[str] = None, description: Optional[str] = None, append_heartbeat: bool = True -) -> Dict[str, Any]: - properties = {} - required = [] - for field_name, field in args_schema.__fields__.items(): - if field.type_ == str: - field_type = "string" - elif field.type_ == int: - field_type = "integer" - elif field.type_ == bool: - field_type = "boolean" - else: - field_type = field.type_.__name__ - - properties[field_name] = { - "type": field_type, - "description": field.field_info.description, - } - if field.required: - required.append(field_name) - - function_call_json = { - "name": name, - "description": description, - "parameters": {"type": "object", "properties": properties, "required": required}, - } - - if append_heartbeat: - function_call_json["parameters"]["properties"]["request_heartbeat"] = { - "type": "boolean", - "description": "Request an immediate heartbeat after function execution. Set to `True` if you want to send a follow-up message or run a follow-up function.", - } - function_call_json["parameters"]["required"].append("request_heartbeat") - - return function_call_json - - def generate_schema_from_args_schema_v2( args_schema: Type[BaseModel], name: Optional[str] = None, description: Optional[str] = None, append_heartbeat: bool = True ) -> Dict[str, Any]: @@ -441,19 +403,8 @@ def generate_schema_from_args_schema_v2( required = [] for field_name, field in args_schema.model_fields.items(): field_type_annotation = field.annotation - if field_type_annotation == str: - field_type = "string" - elif field_type_annotation == int: - field_type = "integer" - elif field_type_annotation == bool: - field_type = "boolean" - else: - field_type = field_type_annotation.__name__ - - properties[field_name] = { - "type": field_type, - "description": field.description, - } + properties[field_name] = type_to_json_schema_type(field_type_annotation) + properties[field_name]["description"] = field.description if field.is_required(): required.append(field_name) diff --git a/letta/schemas/tool.py b/letta/schemas/tool.py index 8066f9b2c8..4870356c11 100644 --- a/letta/schemas/tool.py +++ b/letta/schemas/tool.py @@ -127,6 +127,7 @@ def from_composio(cls, action_name: str, api_key: Optional[str] = None) -> "Tool source_type = "python" tags = ["composio"] wrapper_func_name, wrapper_function_str = generate_composio_tool_wrapper(action_name) + print("composio_tool.args_schema", str(composio_tool.args_schema)) json_schema = generate_schema_from_args_schema_v2(composio_tool.args_schema, name=wrapper_func_name, description=description) return cls( diff --git a/tests/test_tool_schema_parsing.py b/tests/test_tool_schema_parsing.py index f6738a06f0..e6afdc2901 100644 --- a/tests/test_tool_schema_parsing.py +++ b/tests/test_tool_schema_parsing.py @@ -5,6 +5,7 @@ from letta.functions.functions import derive_openai_json_schema from letta.llm_api.helpers import convert_to_structured_output, make_post_request +from letta.schemas.tool import ToolCreate def _clean_diff(d1, d2): @@ -154,8 +155,10 @@ def _load_schema_from_source_filename(filename: str) -> dict: # @pytest.mark.parametrize("openai_model", ["gpt-4o-mini"]) # @pytest.mark.parametrize("structured_output", [True]) -@pytest.mark.parametrize("openai_model", ["gpt-4", "gpt-4o"]) -@pytest.mark.parametrize("structured_output", [True, False]) +# @pytest.mark.parametrize("openai_model", ["gpt-4", "gpt-4o"]) +# @pytest.mark.parametrize("structured_output", [True, False]) +@pytest.mark.parametrize("openai_model", ["gpt-4o-mini"]) +@pytest.mark.parametrize("structured_output", [True]) def test_valid_schemas_via_openai(openai_model: str, structured_output: bool): """Test that we can send the schemas to OpenAI and get a tool call back.""" @@ -176,3 +179,20 @@ def test_valid_schemas_via_openai(openai_model: str, structured_output: bool): _openai_payload(openai_model, schema, structured_output) else: _openai_payload(openai_model, schema, structured_output) + + +@pytest.mark.parametrize("openai_model", ["gpt-4o-mini"]) +@pytest.mark.parametrize("structured_output", [True]) +def test_composio_tool_schema_generation(openai_model: str, structured_output: bool): + """Test that we can generate the schemas for some Composio tools.""" + + assert os.getenv("COMPOSIO_API_KEY") is not None, "COMPOSIO_API_KEY must be set" + + for action_name in [ + "CAL_GET_AVAILABLE_SLOTS_INFO", # has an array arg, needs to be converted properly + ]: + tool_create = ToolCreate.from_composio(action_name=action_name) + print(tool_create) + + schema = tool_create.json_schema + _openai_payload(openai_model, schema, structured_output) From 3d5fd03ccb491367ac663be169dbf9d81b0fe289 Mon Sep 17 00:00:00 2001 From: cpacker Date: Mon, 30 Dec 2024 20:46:06 +0100 Subject: [PATCH 158/280] fix: strip print --- letta/schemas/tool.py | 1 - 1 file changed, 1 deletion(-) diff --git a/letta/schemas/tool.py b/letta/schemas/tool.py index 4870356c11..8066f9b2c8 100644 --- a/letta/schemas/tool.py +++ b/letta/schemas/tool.py @@ -127,7 +127,6 @@ def from_composio(cls, action_name: str, api_key: Optional[str] = None) -> "Tool source_type = "python" tags = ["composio"] wrapper_func_name, wrapper_function_str = generate_composio_tool_wrapper(action_name) - print("composio_tool.args_schema", str(composio_tool.args_schema)) json_schema = generate_schema_from_args_schema_v2(composio_tool.args_schema, name=wrapper_func_name, description=description) return cls( From 87d039b099401ba1f02b8ce93f965ffd7a03794d Mon Sep 17 00:00:00 2001 From: cpacker Date: Mon, 30 Dec 2024 20:47:13 +0100 Subject: [PATCH 159/280] chore: convert testing back --- tests/test_tool_schema_parsing.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/test_tool_schema_parsing.py b/tests/test_tool_schema_parsing.py index e6afdc2901..09d1d31601 100644 --- a/tests/test_tool_schema_parsing.py +++ b/tests/test_tool_schema_parsing.py @@ -155,10 +155,8 @@ def _load_schema_from_source_filename(filename: str) -> dict: # @pytest.mark.parametrize("openai_model", ["gpt-4o-mini"]) # @pytest.mark.parametrize("structured_output", [True]) -# @pytest.mark.parametrize("openai_model", ["gpt-4", "gpt-4o"]) -# @pytest.mark.parametrize("structured_output", [True, False]) -@pytest.mark.parametrize("openai_model", ["gpt-4o-mini"]) -@pytest.mark.parametrize("structured_output", [True]) +@pytest.mark.parametrize("openai_model", ["gpt-4", "gpt-4o"]) +@pytest.mark.parametrize("structured_output", [True, False]) def test_valid_schemas_via_openai(openai_model: str, structured_output: bool): """Test that we can send the schemas to OpenAI and get a tool call back.""" @@ -186,7 +184,8 @@ def test_valid_schemas_via_openai(openai_model: str, structured_output: bool): def test_composio_tool_schema_generation(openai_model: str, structured_output: bool): """Test that we can generate the schemas for some Composio tools.""" - assert os.getenv("COMPOSIO_API_KEY") is not None, "COMPOSIO_API_KEY must be set" + if not os.getenv("COMPOSIO_API_KEY"): + pytest.skip("COMPOSIO_API_KEY not set") for action_name in [ "CAL_GET_AVAILABLE_SLOTS_INFO", # has an array arg, needs to be converted properly From 141e5e2f0de92a64df3128f1b62b312fc442172f Mon Sep 17 00:00:00 2001 From: cpacker Date: Mon, 30 Dec 2024 20:53:45 +0100 Subject: [PATCH 160/280] fix: test --- tests/test_tool_schema_parsing.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/tests/test_tool_schema_parsing.py b/tests/test_tool_schema_parsing.py index 09d1d31601..3c7b7884e2 100644 --- a/tests/test_tool_schema_parsing.py +++ b/tests/test_tool_schema_parsing.py @@ -187,10 +187,23 @@ def test_composio_tool_schema_generation(openai_model: str, structured_output: b if not os.getenv("COMPOSIO_API_KEY"): pytest.skip("COMPOSIO_API_KEY not set") + try: + import composio + except ImportError: + pytest.skip("Composio not installed") + for action_name in [ "CAL_GET_AVAILABLE_SLOTS_INFO", # has an array arg, needs to be converted properly ]: - tool_create = ToolCreate.from_composio(action_name=action_name) + try: + tool_create = ToolCreate.from_composio(action_name=action_name) + except composio.exceptions.ComposioSDKError: + # e.g. "composio.exceptions.ComposioSDKError: No connected account found for app `CAL`; Run `composio add cal` to fix this" + if "No connected account found for app" in str(composio.exceptions.ComposioSDKError): + pytest.skip(f"Composio account not figured to use action_name {action_name}") + else: + raise + print(tool_create) schema = tool_create.json_schema From 36805b70dd1a15bbcaf2cc1da954319b0a7b6534 Mon Sep 17 00:00:00 2001 From: cpacker Date: Mon, 30 Dec 2024 21:14:18 +0100 Subject: [PATCH 161/280] fix: test --- tests/test_tool_schema_parsing.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/test_tool_schema_parsing.py b/tests/test_tool_schema_parsing.py index 3c7b7884e2..151329c0c9 100644 --- a/tests/test_tool_schema_parsing.py +++ b/tests/test_tool_schema_parsing.py @@ -199,10 +199,7 @@ def test_composio_tool_schema_generation(openai_model: str, structured_output: b tool_create = ToolCreate.from_composio(action_name=action_name) except composio.exceptions.ComposioSDKError: # e.g. "composio.exceptions.ComposioSDKError: No connected account found for app `CAL`; Run `composio add cal` to fix this" - if "No connected account found for app" in str(composio.exceptions.ComposioSDKError): - pytest.skip(f"Composio account not figured to use action_name {action_name}") - else: - raise + pytest.skip(f"Composio account not configured to use action_name {action_name}") print(tool_create) From b6321b1a067a02cbcb311762960f24c37757351e Mon Sep 17 00:00:00 2001 From: Matt Zhou Date: Mon, 30 Dec 2024 12:17:44 -0800 Subject: [PATCH 162/280] Run lint --- letta/server/server.py | 18 +++++++++--------- tests/integration_test_composio.py | 16 ++++++---------- .../integration_test_tool_execution_sandbox.py | 4 +++- 3 files changed, 18 insertions(+), 20 deletions(-) diff --git a/letta/server/server.py b/letta/server/server.py index c4699eb37e..a619463ab3 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -53,7 +53,7 @@ from letta.schemas.message import Message, MessageCreate, MessageRole, MessageUpdate from letta.schemas.organization import Organization from letta.schemas.passage import Passage -from letta.schemas.sandbox_config import SandboxType, SandboxEnvironmentVariableCreate +from letta.schemas.sandbox_config import SandboxEnvironmentVariableCreate, SandboxType from letta.schemas.source import Source from letta.schemas.tool import Tool from letta.schemas.usage import LettaUsageStatistics @@ -301,14 +301,14 @@ def __init__( # Add composio keys to the tool sandbox env vars of the org if tool_settings.composio_api_key: - manager = SandboxConfigManager(tool_settings) - sandbox_config = manager.get_or_create_default_sandbox_config(sandbox_type=SandboxType.LOCAL, actor=self.default_user) - - manager.create_sandbox_env_var( - SandboxEnvironmentVariableCreate(key="COMPOSIO_API_KEY", value=tool_settings.composio_api_key), - sandbox_config_id=sandbox_config.id, - actor=self.default_user, - ) + manager = SandboxConfigManager(tool_settings) + sandbox_config = manager.get_or_create_default_sandbox_config(sandbox_type=SandboxType.LOCAL, actor=self.default_user) + + manager.create_sandbox_env_var( + SandboxEnvironmentVariableCreate(key="COMPOSIO_API_KEY", value=tool_settings.composio_api_key), + sandbox_config_id=sandbox_config.id, + actor=self.default_user, + ) # collect providers (always has Letta as a default) self._enabled_providers: List[Provider] = [LettaProvider()] diff --git a/tests/integration_test_composio.py b/tests/integration_test_composio.py index 7caf33250e..1b2c2e3f8a 100644 --- a/tests/integration_test_composio.py +++ b/tests/integration_test_composio.py @@ -8,25 +8,21 @@ def client(): return TestClient(app) + def test_list_composio_apps(client): - response = client.get( - "/v1/tools/composio/apps" - ) + response = client.get("/v1/tools/composio/apps") assert response.status_code == 200 assert isinstance(response.json(), list) + def test_list_composio_actions_by_app(client): - response = client.get( - "/v1/tools/composio/apps/github/actions" - ) + response = client.get("/v1/tools/composio/apps/github/actions") assert response.status_code == 200 assert isinstance(response.json(), list) + def test_add_composio_tool(client): - response = client.post( - "/v1/tools/composio/GITHUB_STAR_A_REPOSITORY_FOR_THE_AUTHENTICATED_USER" - ) + response = client.post("/v1/tools/composio/GITHUB_STAR_A_REPOSITORY_FOR_THE_AUTHENTICATED_USER") assert response.status_code == 200 assert "id" in response.json() assert "name" in response.json() - diff --git a/tests/integration_test_tool_execution_sandbox.py b/tests/integration_test_tool_execution_sandbox.py index b84bcd51ac..ad3d2ebb2d 100644 --- a/tests/integration_test_tool_execution_sandbox.py +++ b/tests/integration_test_tool_execution_sandbox.py @@ -352,7 +352,9 @@ def test_local_sandbox_e2e_composio_star_github(mock_e2b_api_key_none, check_com @pytest.mark.local_sandbox -def test_local_sandbox_e2e_composio_star_github_without_setting_db_env_vars(mock_e2b_api_key_none, check_composio_key_set, composio_github_star_tool, test_user): +def test_local_sandbox_e2e_composio_star_github_without_setting_db_env_vars( + mock_e2b_api_key_none, check_composio_key_set, composio_github_star_tool, test_user +): result = ToolExecutionSandbox(composio_github_star_tool.name, {"owner": "letta-ai", "repo": "letta"}, user=test_user).run() assert result.func_return["details"] == "Action executed successfully" From 7a799c260f6f81114382c213f8a2c01064121d6c Mon Sep 17 00:00:00 2001 From: cpacker Date: Mon, 30 Dec 2024 21:49:35 +0100 Subject: [PATCH 163/280] fix: added extra asserts to tests to make clear what the expected behavior is --- tests/test_tool_schema_parsing.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/test_tool_schema_parsing.py b/tests/test_tool_schema_parsing.py index 151329c0c9..fd35be5f25 100644 --- a/tests/test_tool_schema_parsing.py +++ b/tests/test_tool_schema_parsing.py @@ -203,5 +203,12 @@ def test_composio_tool_schema_generation(openai_model: str, structured_output: b print(tool_create) + assert tool_create.json_schema schema = tool_create.json_schema - _openai_payload(openai_model, schema, structured_output) + + try: + _openai_payload(openai_model, schema, structured_output) + print(f"Successfully called OpenAI using schema {schema} generated from {action_name}") + except: + print(f"Failed to call OpenAI using schema {schema} generated from {action_name}") + raise From 6557981d38fbf47d73f7774a174c3f7687b58287 Mon Sep 17 00:00:00 2001 From: Matt Zhou Date: Mon, 30 Dec 2024 14:29:35 -0800 Subject: [PATCH 164/280] Mock e2b api none for test_function_return_limit --- tests/test_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_client.py b/tests/test_client.py index cc39123538..f0952bd8fa 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -347,7 +347,7 @@ def test_send_system_message(client: Union[LocalClient, RESTClient], agent: Agen assert send_system_message_response, "Sending message failed" -def test_function_return_limit(client: Union[LocalClient, RESTClient]): +def test_function_return_limit(mock_e2b_api_key_none, client: Union[LocalClient, RESTClient]): """Test to see if the function return limit works""" def big_return(): From 09dd49eb2b16bc2c902ffd1d810dcbed15160782 Mon Sep 17 00:00:00 2001 From: Matt Zhou Date: Mon, 30 Dec 2024 15:04:08 -0800 Subject: [PATCH 165/280] Mock more e2b none --- tests/test_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_client.py b/tests/test_client.py index f0952bd8fa..e29c9116b5 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -385,7 +385,7 @@ def big_return(): client.delete_agent(agent_id=agent.id) -def test_function_always_error(client: Union[LocalClient, RESTClient]): +def test_function_always_error(mock_e2b_api_key_none, client: Union[LocalClient, RESTClient]): """Test to see if function that errors works correctly""" def always_error(): From 397dd7a16e26a0fcb034323c2f5a677af2833730 Mon Sep 17 00:00:00 2001 From: Matt Zhou Date: Mon, 30 Dec 2024 16:03:45 -0800 Subject: [PATCH 166/280] wip debug --- tests/test_client.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/test_client.py b/tests/test_client.py index e29c9116b5..c3e507ae33 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -42,8 +42,8 @@ def run_server(): @pytest.fixture( - params=[{"server": False}, {"server": True}], # whether to use REST API server - # params=[{"server": True}], # whether to use REST API server + # params=[{"server": False}, {"server": True}], # whether to use REST API server + params=[{"server": False}], # whether to use REST API server scope="module", ) def client(request): @@ -408,6 +408,8 @@ def always_error(): assert response_message, "ToolReturnMessage message not found in response" assert response_message.status == "error" + + import ipdb;ipdb.set_trace() if isinstance(client, RESTClient): assert response_message.tool_return == "Error executing function always_error: ZeroDivisionError: division by zero" else: From 00c3ab5d424b9be81fd47793f7d610c5dfbb0dbf Mon Sep 17 00:00:00 2001 From: Matt Zhou Date: Mon, 30 Dec 2024 16:07:35 -0800 Subject: [PATCH 167/280] Update --- poetry.lock | 14 +++++++------- pyproject.toml | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/poetry.lock b/poetry.lock index 80453badc6..944859c0fe 100644 --- a/poetry.lock +++ b/poetry.lock @@ -726,13 +726,13 @@ test = ["pytest"] [[package]] name = "composio-core" -version = "0.6.3" +version = "0.6.7" description = "Core package to act as a bridge between composio platform and other services." optional = false python-versions = "<4,>=3.9" files = [ - {file = "composio_core-0.6.3-py3-none-any.whl", hash = "sha256:981a9856781b791242f947a9685a18974d8a012ac7fab2c09438e1b19610d6a2"}, - {file = "composio_core-0.6.3.tar.gz", hash = "sha256:13098b20d8832e74453ca194889305c935432156fc07be91dfddf76561ad591b"}, + {file = "composio_core-0.6.7-py3-none-any.whl", hash = "sha256:03cedeffe417b919d1021c1bc4751f54bd05829b52ff3285f7984e14bdf91efe"}, + {file = "composio_core-0.6.7.tar.gz", hash = "sha256:b87f0b804d87945b4eae556468b9efc75f751d256bbf2c20fb8ae5b6a31a2818"}, ] [package.dependencies] @@ -762,13 +762,13 @@ tools = ["diskcache", "flake8", "networkx", "pathspec", "pygments", "ruff", "tra [[package]] name = "composio-langchain" -version = "0.6.3" +version = "0.6.7" description = "Use Composio to get an array of tools with your LangChain agent." optional = false python-versions = "<4,>=3.9" files = [ - {file = "composio_langchain-0.6.3-py3-none-any.whl", hash = "sha256:0e749a1603dc0562293412d0a6429f88b75152b01a313cca859732070d762a6b"}, - {file = "composio_langchain-0.6.3.tar.gz", hash = "sha256:2036f94bfe60974b31f2be0bfdb33dd75a1d43435f275141219b3376587bf49d"}, + {file = "composio_langchain-0.6.7-py3-none-any.whl", hash = "sha256:f8653b6a7e6b03a61b679a096e278744d3009ebaf3741d7e24e5120a364f212e"}, + {file = "composio_langchain-0.6.7.tar.gz", hash = "sha256:adeab3a87b0e6eb7e96048cef6b988dbe699b6a493a82fac2d371ab940e7e54e"}, ] [package.dependencies] @@ -6246,4 +6246,4 @@ tests = ["wikipedia"] [metadata] lock-version = "2.0" python-versions = "<4.0,>=3.10" -content-hash = "4a7cf176579d5dc15648979542da152ec98290f1e9f39039cfe9baf73bc1076f" +content-hash = "1c52219049a4470dd54a45318b22495a4cafa29e93a1c5369a0d54da71990adb" diff --git a/pyproject.toml b/pyproject.toml index 5aa60a0f14..074bd2569e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,8 +59,8 @@ nltk = "^3.8.1" jinja2 = "^3.1.4" locust = {version = "^2.31.5", optional = true} wikipedia = {version = "^1.4.0", optional = true} -composio-langchain = "^0.6.3" -composio-core = "^0.6.3" +composio-langchain = "^0.6.7" +composio-core = "^0.6.7" alembic = "^1.13.3" pyhumps = "^3.8.0" psycopg2 = {version = "^2.9.10", optional = true} @@ -85,7 +85,7 @@ qdrant = ["qdrant-client"] cloud-tool-sandbox = ["e2b-code-interpreter"] external-tools = ["docker", "langchain", "wikipedia", "langchain-community"] tests = ["wikipedia"] -all = ["pgvector", "pg8000", "psycopg2-binary", "psycopg2", "pytest", "pytest-asyncio", "pexpect", "black", "pre-commit", "datasets", "pyright", "pytest-order", "autoflake", "isort", "websockets", "fastapi", "uvicorn", "llama-index-embeddings-ollama", "docker", "langchain", "wikipedia", "langchain-community", "locust"] +all = ["pgvector", "pg8000", "psycopg2-binary", "psycopg2", "pytest", "pytest-asyncio", "pexpect", "black", "pre-commit", "datasets", "pyright", "pytest-order", "autoflake", "isort", "websockets", "fastapi", "uvicorn", "docker", "langchain", "wikipedia", "langchain-community", "locust"] [tool.poetry.group.dev.dependencies] black = "^24.4.2" @@ -107,4 +107,4 @@ line_length = 140 multi_line_output = 3 include_trailing_comma = true force_grid_wrap = 0 -use_parentheses = true \ No newline at end of file +use_parentheses = true From d3d7d5717b204e8403a284fe923c4a72c721bbee Mon Sep 17 00:00:00 2001 From: Matt Zhou Date: Mon, 30 Dec 2024 16:27:08 -0800 Subject: [PATCH 168/280] Log out sandbox details for e2b --- letta/services/tool_execution_sandbox.py | 6 ++++++ tests/integration_test_tool_execution_sandbox.py | 2 +- tests/test_client.py | 7 +++---- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/letta/services/tool_execution_sandbox.py b/letta/services/tool_execution_sandbox.py index b05b6ce235..1060af43db 100644 --- a/letta/services/tool_execution_sandbox.py +++ b/letta/services/tool_execution_sandbox.py @@ -277,6 +277,10 @@ def run_e2b_sandbox(self, agent_state: AgentState) -> SandboxRunResult: sbx_config = self.sandbox_config_manager.get_or_create_default_sandbox_config(sandbox_type=SandboxType.E2B, actor=self.user) sbx = self.get_running_e2b_sandbox_with_same_state(sbx_config) if not sbx or self.force_recreate: + if not sbx: + logger.info(f"No running e2b sandbox found with the same state: {sbx_config}") + else: + logger.info(f"Force recreated e2b sandbox with state: {sbx_config}") sbx = self.create_e2b_sandbox_with_metadata_hash(sandbox_config=sbx_config) # Since this sandbox was used, we extend its lifecycle by the timeout @@ -292,6 +296,8 @@ def run_e2b_sandbox(self, agent_state: AgentState) -> SandboxRunResult: func_return, agent_state = self.parse_best_effort(execution.results[0].text) elif execution.error: logger.error(f"Executing tool {self.tool_name} failed with {execution.error}") + logger.error(f"E2B Sandbox configurations: {sbx_config}") + logger.error(f"E2B Sandbox ID: {sbx.sandbox_id}") func_return = get_friendly_error_msg( function_name=self.tool_name, exception_name=execution.error.name, exception_message=execution.error.value ) diff --git a/tests/integration_test_tool_execution_sandbox.py b/tests/integration_test_tool_execution_sandbox.py index ad3d2ebb2d..3f64b28740 100644 --- a/tests/integration_test_tool_execution_sandbox.py +++ b/tests/integration_test_tool_execution_sandbox.py @@ -464,7 +464,7 @@ def test_e2b_sandbox_inject_env_var_existing_sandbox(check_e2b_key_is_set, get_e config = manager.create_or_update_sandbox_config(config_create, test_user) # Run the custom sandbox once, assert nothing returns because missing env variable - sandbox = ToolExecutionSandbox(get_env_tool.name, {}, user=test_user, force_recreate=True) + sandbox = ToolExecutionSandbox(get_env_tool.name, {}, user=test_user) result = sandbox.run() # response should be None assert result.func_return is None diff --git a/tests/test_client.py b/tests/test_client.py index c3e507ae33..532d8058f5 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -42,8 +42,8 @@ def run_server(): @pytest.fixture( - # params=[{"server": False}, {"server": True}], # whether to use REST API server - params=[{"server": False}], # whether to use REST API server + params=[{"server": False}, {"server": True}], # whether to use REST API server + # params=[{"server": False}], # whether to use REST API server scope="module", ) def client(request): @@ -385,7 +385,7 @@ def big_return(): client.delete_agent(agent_id=agent.id) -def test_function_always_error(mock_e2b_api_key_none, client: Union[LocalClient, RESTClient]): +def test_function_always_error(client: Union[LocalClient, RESTClient]): """Test to see if function that errors works correctly""" def always_error(): @@ -409,7 +409,6 @@ def always_error(): assert response_message, "ToolReturnMessage message not found in response" assert response_message.status == "error" - import ipdb;ipdb.set_trace() if isinstance(client, RESTClient): assert response_message.tool_return == "Error executing function always_error: ZeroDivisionError: division by zero" else: From e8a1c6d6835651653ae91a7f68da22eb3807b046 Mon Sep 17 00:00:00 2001 From: Matt Zhou Date: Mon, 30 Dec 2024 16:33:59 -0800 Subject: [PATCH 169/280] Add back more e2b --- tests/test_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_client.py b/tests/test_client.py index 532d8058f5..5db67157f1 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -347,7 +347,7 @@ def test_send_system_message(client: Union[LocalClient, RESTClient], agent: Agen assert send_system_message_response, "Sending message failed" -def test_function_return_limit(mock_e2b_api_key_none, client: Union[LocalClient, RESTClient]): +def test_function_return_limit(client: Union[LocalClient, RESTClient]): """Test to see if the function return limit works""" def big_return(): From 0cb31a2f725c1d29f4f2e9424600d4ced35f6423 Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Tue, 31 Dec 2024 10:53:33 +0400 Subject: [PATCH 170/280] feat: various fixes (#2320) Co-authored-by: Shubham Naik Co-authored-by: Matt Zhou Co-authored-by: Shubham Naik Co-authored-by: Caren Thomas Co-authored-by: cpacker --- .env.example | 29 +--- .../workflows/letta-web-openapi-saftey.yml | 42 ----- .github/workflows/tests.yml | 4 +- .../08b2f8225812_adding_toolsagents_orm.py | 41 ++--- ...54dec07619c4_divide_passage_table_into_.py | 151 +++++++++--------- ..._add_passages_orm_drop_legacy_passages_.py | 78 ++++----- examples/tool_rule_usage.py | 5 +- letta/__init__.py | 8 +- letta/agent.py | 21 +-- letta/cli/cli.py | 11 +- letta/client/client.py | 17 +- letta/client/streaming.py | 6 +- letta/client/utils.py | 5 +- letta/data_sources/connectors.py | 7 +- letta/embeddings.py | 6 +- letta/errors.py | 2 - letta/functions/function_sets/extras.py | 5 +- letta/functions/schema_generator.py | 53 +----- letta/helpers/tool_rule_solver.py | 17 +- letta/interface.py | 5 +- letta/llm_api/anthropic.py | 18 +-- letta/llm_api/cohere.py | 11 +- letta/llm_api/google_ai.py | 14 +- letta/llm_api/llm_api_tools.py | 26 +-- letta/llm_api/openai.py | 26 +-- letta/local_llm/chat_completion_proxy.py | 17 +- letta/local_llm/constants.py | 4 +- .../grammars/gbnf_grammar_generator.py | 13 +- .../llm_chat_completion_wrappers/chatml.py | 9 +- .../llm_chat_completion_wrappers/llama3.py | 9 +- letta/local_llm/settings/settings.py | 4 +- letta/orm/__init__.py | 2 +- letta/orm/agent.py | 6 +- letta/orm/base.py | 8 +- letta/orm/file.py | 9 +- letta/orm/mixins.py | 2 + letta/orm/organization.py | 12 +- letta/orm/sandbox_config.py | 4 +- letta/orm/sqlalchemy_base.py | 7 +- letta/orm/sqlite_functions.py | 57 +++---- letta/providers.py | 55 ++++--- letta/schemas/agent.py | 1 + letta/schemas/letta_response.py | 22 ++- letta/schemas/message.py | 19 +-- letta/schemas/organization.py | 2 +- letta/schemas/tool.py | 5 +- letta/schemas/tool_rule.py | 1 + letta/schemas/usage.py | 2 + letta/server/rest_api/app.py | 31 +--- letta/server/rest_api/interface.py | 13 +- .../routers/openai/assistants/schemas.py | 8 +- .../chat_completions/chat_completions.py | 9 +- letta/server/rest_api/routers/v1/__init__.py | 4 +- letta/server/rest_api/routers/v1/agents.py | 43 ++--- .../rest_api/routers/v1/sandbox_configs.py | 6 +- letta/server/rest_api/routers/v1/sources.py | 10 +- letta/server/rest_api/utils.py | 1 + letta/server/server.py | 19 ++- letta/services/agent_manager.py | 8 +- letta/services/passage_manager.py | 8 +- letta/services/sandbox_config_manager.py | 6 +- letta/services/tool_execution_sandbox.py | 14 +- letta/settings.py | 8 +- letta/streaming_interface.py | 10 +- letta/utils.py | 1 + poetry.lock | 14 +- project.json | 82 ++++++++++ pyproject.toml | 14 +- tests/helpers/endpoints_helper.py | 14 +- tests/integration_test_agent_tool_graph.py | 7 +- tests/integration_test_composio.py | 28 ++++ ...integration_test_tool_execution_sandbox.py | 14 +- tests/test_cli.py | 5 +- tests/test_client.py | 13 +- tests/test_server.py | 9 +- tests/test_tool_rule_solver.py | 27 ++-- .../adjust_menu_prices.py | 1 + tests/test_tool_schema_parsing.py | 36 +++++ tests/test_v1_routes.py | 7 +- 79 files changed, 565 insertions(+), 783 deletions(-) delete mode 100644 .github/workflows/letta-web-openapi-saftey.yml create mode 100644 project.json create mode 100644 tests/integration_test_composio.py diff --git a/.env.example b/.env.example index 48cbd7303e..c788793d8a 100644 --- a/.env.example +++ b/.env.example @@ -2,43 +2,20 @@ Example enviornment variable configurations for the Letta Docker container. Un-coment the sections you want to configure with. - -Hint: You don't need to have the same LLM and -Embedding model backends (can mix and match). ########################################################## ########################################################## OpenAI configuration ########################################################## -## LLM Model -#LETTA_LLM_ENDPOINT_TYPE=openai -#LETTA_LLM_MODEL=gpt-4o-mini -## Embeddings -#LETTA_EMBEDDING_ENDPOINT_TYPE=openai -#LETTA_EMBEDDING_MODEL=text-embedding-ada-002 - +# OPENAI_API_KEY=sk-... ########################################################## Ollama configuration ########################################################## -## LLM Model -#LETTA_LLM_ENDPOINT=http://host.docker.internal:11434 -#LETTA_LLM_ENDPOINT_TYPE=ollama -#LETTA_LLM_MODEL=dolphin2.2-mistral:7b-q6_K -#LETTA_LLM_CONTEXT_WINDOW=8192 -## Embeddings -#LETTA_EMBEDDING_ENDPOINT=http://host.docker.internal:11434 -#LETTA_EMBEDDING_ENDPOINT_TYPE=ollama -#LETTA_EMBEDDING_MODEL=mxbai-embed-large -#LETTA_EMBEDDING_DIM=512 - +# OLLAMA_BASE_URL="http://host.docker.internal:11434" ########################################################## vLLM configuration ########################################################## -## LLM Model -#LETTA_LLM_ENDPOINT=http://host.docker.internal:8000 -#LETTA_LLM_ENDPOINT_TYPE=vllm -#LETTA_LLM_MODEL=ehartford/dolphin-2.2.1-mistral-7b -#LETTA_LLM_CONTEXT_WINDOW=8192 +# VLLM_API_BASE="http://host.docker.internal:8000" diff --git a/.github/workflows/letta-web-openapi-saftey.yml b/.github/workflows/letta-web-openapi-saftey.yml deleted file mode 100644 index 786d5e9b11..0000000000 --- a/.github/workflows/letta-web-openapi-saftey.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: "Letta Web OpenAPI Compatibility Checker" - - -on: - push: - branches: [ main ] - pull_request: - branches: [ main ] - - -jobs: - validate-openapi: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: "Setup Python, Poetry and Dependencies" - uses: packetcoders/action-setup-cache-python-poetry@main - with: - python-version: "3.12" - poetry-version: "1.8.2" - install-args: "-E dev" - - name: Checkout letta web - uses: actions/checkout@v4 - with: - repository: letta-ai/letta-web - token: ${{ secrets.PULLER_TOKEN }} - path: letta-web - - name: Run OpenAPI schema generation - run: | - bash ./letta/server/generate_openapi_schema.sh - - name: Setup letta-web - working-directory: letta-web - run: npm ci - - name: Copy OpenAPI schema - working-directory: . - run: cp openapi_letta.json letta-web/libs/letta-agents-api/letta-agents-openapi.json - - name: Validate OpenAPI schema - working-directory: letta-web - run: | - npm run agents-api:generate - npm run type-check diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index e4c46c5e85..b56e9db129 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -6,6 +6,8 @@ env: ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }} GROQ_API_KEY: ${{ secrets.GROQ_API_KEY }} + E2B_API_KEY: ${{ secrets.E2B_API_KEY }} + E2B_SANDBOX_TEMPLATE_ID: ${{ secrets.E2B_SANDBOX_TEMPLATE_ID }} on: push: @@ -61,7 +63,7 @@ jobs: with: python-version: "3.12" poetry-version: "1.8.2" - install-args: "-E dev -E postgres -E external-tools -E tests" + install-args: "-E dev -E postgres -E external-tools -E tests -E cloud-tool-sandbox" - name: Migrate database env: LETTA_PG_PORT: 5432 diff --git a/alembic/versions/08b2f8225812_adding_toolsagents_orm.py b/alembic/versions/08b2f8225812_adding_toolsagents_orm.py index 902225ab19..0da80aae56 100644 --- a/alembic/versions/08b2f8225812_adding_toolsagents_orm.py +++ b/alembic/versions/08b2f8225812_adding_toolsagents_orm.py @@ -5,40 +5,45 @@ Create Date: 2024-12-05 16:46:51.258831 """ + from typing import Sequence, Union -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. -revision: str = '08b2f8225812' -down_revision: Union[str, None] = '3c683a662c82' +revision: str = "08b2f8225812" +down_revision: Union[str, None] = "3c683a662c82" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - op.create_table('tools_agents', - sa.Column('agent_id', sa.String(), nullable=False), - sa.Column('tool_id', sa.String(), nullable=False), - sa.Column('tool_name', sa.String(), nullable=False), - sa.Column('id', sa.String(), nullable=False), - sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), - sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), - sa.Column('is_deleted', sa.Boolean(), server_default=sa.text('FALSE'), nullable=False), - sa.Column('_created_by_id', sa.String(), nullable=True), - sa.Column('_last_updated_by_id', sa.String(), nullable=True), - sa.ForeignKeyConstraint(['agent_id'], ['agents.id'], ), - sa.ForeignKeyConstraint(['tool_id'], ['tools.id'], name='fk_tool_id'), - sa.PrimaryKeyConstraint('agent_id', 'tool_id', 'tool_name', 'id'), - sa.UniqueConstraint('agent_id', 'tool_name', name='unique_tool_per_agent') + op.create_table( + "tools_agents", + sa.Column("agent_id", sa.String(), nullable=False), + sa.Column("tool_id", sa.String(), nullable=False), + sa.Column("tool_name", sa.String(), nullable=False), + sa.Column("id", sa.String(), nullable=False), + sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=True), + sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=True), + sa.Column("is_deleted", sa.Boolean(), server_default=sa.text("FALSE"), nullable=False), + sa.Column("_created_by_id", sa.String(), nullable=True), + sa.Column("_last_updated_by_id", sa.String(), nullable=True), + sa.ForeignKeyConstraint( + ["agent_id"], + ["agents.id"], + ), + sa.ForeignKeyConstraint(["tool_id"], ["tools.id"], name="fk_tool_id"), + sa.PrimaryKeyConstraint("agent_id", "tool_id", "tool_name", "id"), + sa.UniqueConstraint("agent_id", "tool_name", name="unique_tool_per_agent"), ) # ### end Alembic commands ### def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - op.drop_table('tools_agents') + op.drop_table("tools_agents") # ### end Alembic commands ### diff --git a/alembic/versions/54dec07619c4_divide_passage_table_into_.py b/alembic/versions/54dec07619c4_divide_passage_table_into_.py index afe9d41850..e164a997b5 100644 --- a/alembic/versions/54dec07619c4_divide_passage_table_into_.py +++ b/alembic/versions/54dec07619c4_divide_passage_table_into_.py @@ -5,18 +5,19 @@ Create Date: 2024-12-14 17:23:08.772554 """ + from typing import Sequence, Union -from alembic import op -from pgvector.sqlalchemy import Vector import sqlalchemy as sa +from pgvector.sqlalchemy import Vector from sqlalchemy.dialects import postgresql +from alembic import op from letta.orm.custom_columns import EmbeddingConfigColumn # revision identifiers, used by Alembic. -revision: str = '54dec07619c4' -down_revision: Union[str, None] = '4e88e702f85e' +revision: str = "54dec07619c4" +down_revision: Union[str, None] = "4e88e702f85e" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None @@ -24,82 +25,88 @@ def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### op.create_table( - 'agent_passages', - sa.Column('id', sa.String(), nullable=False), - sa.Column('text', sa.String(), nullable=False), - sa.Column('embedding_config', EmbeddingConfigColumn(), nullable=False), - sa.Column('metadata_', sa.JSON(), nullable=False), - sa.Column('embedding', Vector(dim=4096), nullable=True), - sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), - sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), - sa.Column('is_deleted', sa.Boolean(), server_default=sa.text('FALSE'), nullable=False), - sa.Column('_created_by_id', sa.String(), nullable=True), - sa.Column('_last_updated_by_id', sa.String(), nullable=True), - sa.Column('organization_id', sa.String(), nullable=False), - sa.Column('agent_id', sa.String(), nullable=False), - sa.ForeignKeyConstraint(['agent_id'], ['agents.id'], ondelete='CASCADE'), - sa.ForeignKeyConstraint(['organization_id'], ['organizations.id'], ), - sa.PrimaryKeyConstraint('id') + "agent_passages", + sa.Column("id", sa.String(), nullable=False), + sa.Column("text", sa.String(), nullable=False), + sa.Column("embedding_config", EmbeddingConfigColumn(), nullable=False), + sa.Column("metadata_", sa.JSON(), nullable=False), + sa.Column("embedding", Vector(dim=4096), nullable=True), + sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=True), + sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=True), + sa.Column("is_deleted", sa.Boolean(), server_default=sa.text("FALSE"), nullable=False), + sa.Column("_created_by_id", sa.String(), nullable=True), + sa.Column("_last_updated_by_id", sa.String(), nullable=True), + sa.Column("organization_id", sa.String(), nullable=False), + sa.Column("agent_id", sa.String(), nullable=False), + sa.ForeignKeyConstraint(["agent_id"], ["agents.id"], ondelete="CASCADE"), + sa.ForeignKeyConstraint( + ["organization_id"], + ["organizations.id"], + ), + sa.PrimaryKeyConstraint("id"), ) - op.create_index('agent_passages_org_idx', 'agent_passages', ['organization_id'], unique=False) + op.create_index("agent_passages_org_idx", "agent_passages", ["organization_id"], unique=False) op.create_table( - 'source_passages', - sa.Column('id', sa.String(), nullable=False), - sa.Column('text', sa.String(), nullable=False), - sa.Column('embedding_config', EmbeddingConfigColumn(), nullable=False), - sa.Column('metadata_', sa.JSON(), nullable=False), - sa.Column('embedding', Vector(dim=4096), nullable=True), - sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), - sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), - sa.Column('is_deleted', sa.Boolean(), server_default=sa.text('FALSE'), nullable=False), - sa.Column('_created_by_id', sa.String(), nullable=True), - sa.Column('_last_updated_by_id', sa.String(), nullable=True), - sa.Column('organization_id', sa.String(), nullable=False), - sa.Column('file_id', sa.String(), nullable=True), - sa.Column('source_id', sa.String(), nullable=False), - sa.ForeignKeyConstraint(['file_id'], ['files.id'], ondelete='CASCADE'), - sa.ForeignKeyConstraint(['organization_id'], ['organizations.id'], ), - sa.ForeignKeyConstraint(['source_id'], ['sources.id'], ondelete='CASCADE'), - sa.PrimaryKeyConstraint('id') + "source_passages", + sa.Column("id", sa.String(), nullable=False), + sa.Column("text", sa.String(), nullable=False), + sa.Column("embedding_config", EmbeddingConfigColumn(), nullable=False), + sa.Column("metadata_", sa.JSON(), nullable=False), + sa.Column("embedding", Vector(dim=4096), nullable=True), + sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=True), + sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=True), + sa.Column("is_deleted", sa.Boolean(), server_default=sa.text("FALSE"), nullable=False), + sa.Column("_created_by_id", sa.String(), nullable=True), + sa.Column("_last_updated_by_id", sa.String(), nullable=True), + sa.Column("organization_id", sa.String(), nullable=False), + sa.Column("file_id", sa.String(), nullable=True), + sa.Column("source_id", sa.String(), nullable=False), + sa.ForeignKeyConstraint(["file_id"], ["files.id"], ondelete="CASCADE"), + sa.ForeignKeyConstraint( + ["organization_id"], + ["organizations.id"], + ), + sa.ForeignKeyConstraint(["source_id"], ["sources.id"], ondelete="CASCADE"), + sa.PrimaryKeyConstraint("id"), ) - op.create_index('source_passages_org_idx', 'source_passages', ['organization_id'], unique=False) - op.drop_table('passages') - op.drop_constraint('files_source_id_fkey', 'files', type_='foreignkey') - op.create_foreign_key(None, 'files', 'sources', ['source_id'], ['id'], ondelete='CASCADE') - op.drop_constraint('messages_agent_id_fkey', 'messages', type_='foreignkey') - op.create_foreign_key(None, 'messages', 'agents', ['agent_id'], ['id'], ondelete='CASCADE') + op.create_index("source_passages_org_idx", "source_passages", ["organization_id"], unique=False) + op.drop_table("passages") + op.drop_constraint("files_source_id_fkey", "files", type_="foreignkey") + op.create_foreign_key(None, "files", "sources", ["source_id"], ["id"], ondelete="CASCADE") + op.drop_constraint("messages_agent_id_fkey", "messages", type_="foreignkey") + op.create_foreign_key(None, "messages", "agents", ["agent_id"], ["id"], ondelete="CASCADE") # ### end Alembic commands ### def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - op.drop_constraint(None, 'messages', type_='foreignkey') - op.create_foreign_key('messages_agent_id_fkey', 'messages', 'agents', ['agent_id'], ['id']) - op.drop_constraint(None, 'files', type_='foreignkey') - op.create_foreign_key('files_source_id_fkey', 'files', 'sources', ['source_id'], ['id']) + op.drop_constraint(None, "messages", type_="foreignkey") + op.create_foreign_key("messages_agent_id_fkey", "messages", "agents", ["agent_id"], ["id"]) + op.drop_constraint(None, "files", type_="foreignkey") + op.create_foreign_key("files_source_id_fkey", "files", "sources", ["source_id"], ["id"]) op.create_table( - 'passages', - sa.Column('id', sa.VARCHAR(), autoincrement=False, nullable=False), - sa.Column('text', sa.VARCHAR(), autoincrement=False, nullable=False), - sa.Column('file_id', sa.VARCHAR(), autoincrement=False, nullable=True), - sa.Column('agent_id', sa.VARCHAR(), autoincrement=False, nullable=True), - sa.Column('source_id', sa.VARCHAR(), autoincrement=False, nullable=True), - sa.Column('embedding', Vector(dim=4096), autoincrement=False, nullable=True), - sa.Column('embedding_config', postgresql.JSON(astext_type=sa.Text()), autoincrement=False, nullable=False), - sa.Column('metadata_', postgresql.JSON(astext_type=sa.Text()), autoincrement=False, nullable=False), - sa.Column('created_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=False), - sa.Column('updated_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=True), - sa.Column('is_deleted', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=False), - sa.Column('_created_by_id', sa.VARCHAR(), autoincrement=False, nullable=True), - sa.Column('_last_updated_by_id', sa.VARCHAR(), autoincrement=False, nullable=True), - sa.Column('organization_id', sa.VARCHAR(), autoincrement=False, nullable=False), - sa.ForeignKeyConstraint(['agent_id'], ['agents.id'], name='passages_agent_id_fkey'), - sa.ForeignKeyConstraint(['file_id'], ['files.id'], name='passages_file_id_fkey', ondelete='CASCADE'), - sa.ForeignKeyConstraint(['organization_id'], ['organizations.id'], name='passages_organization_id_fkey'), - sa.PrimaryKeyConstraint('id', name='passages_pkey') + "passages", + sa.Column("id", sa.VARCHAR(), autoincrement=False, nullable=False), + sa.Column("text", sa.VARCHAR(), autoincrement=False, nullable=False), + sa.Column("file_id", sa.VARCHAR(), autoincrement=False, nullable=True), + sa.Column("agent_id", sa.VARCHAR(), autoincrement=False, nullable=True), + sa.Column("source_id", sa.VARCHAR(), autoincrement=False, nullable=True), + sa.Column("embedding", Vector(dim=4096), autoincrement=False, nullable=True), + sa.Column("embedding_config", postgresql.JSON(astext_type=sa.Text()), autoincrement=False, nullable=False), + sa.Column("metadata_", postgresql.JSON(astext_type=sa.Text()), autoincrement=False, nullable=False), + sa.Column("created_at", postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=False), + sa.Column("updated_at", postgresql.TIMESTAMP(timezone=True), server_default=sa.text("now()"), autoincrement=False, nullable=True), + sa.Column("is_deleted", sa.BOOLEAN(), server_default=sa.text("false"), autoincrement=False, nullable=False), + sa.Column("_created_by_id", sa.VARCHAR(), autoincrement=False, nullable=True), + sa.Column("_last_updated_by_id", sa.VARCHAR(), autoincrement=False, nullable=True), + sa.Column("organization_id", sa.VARCHAR(), autoincrement=False, nullable=False), + sa.ForeignKeyConstraint(["agent_id"], ["agents.id"], name="passages_agent_id_fkey"), + sa.ForeignKeyConstraint(["file_id"], ["files.id"], name="passages_file_id_fkey", ondelete="CASCADE"), + sa.ForeignKeyConstraint(["organization_id"], ["organizations.id"], name="passages_organization_id_fkey"), + sa.PrimaryKeyConstraint("id", name="passages_pkey"), ) - op.drop_index('source_passages_org_idx', table_name='source_passages') - op.drop_table('source_passages') - op.drop_index('agent_passages_org_idx', table_name='agent_passages') - op.drop_table('agent_passages') + op.drop_index("source_passages_org_idx", table_name="source_passages") + op.drop_table("source_passages") + op.drop_index("agent_passages_org_idx", table_name="agent_passages") + op.drop_table("agent_passages") # ### end Alembic commands ### diff --git a/alembic/versions/c5d964280dff_add_passages_orm_drop_legacy_passages_.py b/alembic/versions/c5d964280dff_add_passages_orm_drop_legacy_passages_.py index a16fdae444..b6d2e6ba82 100644 --- a/alembic/versions/c5d964280dff_add_passages_orm_drop_legacy_passages_.py +++ b/alembic/versions/c5d964280dff_add_passages_orm_drop_legacy_passages_.py @@ -5,25 +5,27 @@ Create Date: 2024-12-10 15:05:32.335519 """ + from typing import Sequence, Union -from alembic import op import sqlalchemy as sa from sqlalchemy.dialects import postgresql +from alembic import op + # revision identifiers, used by Alembic. -revision: str = 'c5d964280dff' -down_revision: Union[str, None] = 'a91994b9752f' +revision: str = "c5d964280dff" +down_revision: Union[str, None] = "a91994b9752f" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - op.add_column('passages', sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True)) - op.add_column('passages', sa.Column('is_deleted', sa.Boolean(), server_default=sa.text('FALSE'), nullable=False)) - op.add_column('passages', sa.Column('_created_by_id', sa.String(), nullable=True)) - op.add_column('passages', sa.Column('_last_updated_by_id', sa.String(), nullable=True)) + op.add_column("passages", sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=True)) + op.add_column("passages", sa.Column("is_deleted", sa.Boolean(), server_default=sa.text("FALSE"), nullable=False)) + op.add_column("passages", sa.Column("_created_by_id", sa.String(), nullable=True)) + op.add_column("passages", sa.Column("_last_updated_by_id", sa.String(), nullable=True)) # Data migration step: op.add_column("passages", sa.Column("organization_id", sa.String(), nullable=True)) @@ -41,48 +43,32 @@ def upgrade() -> None: # Set `organization_id` as non-nullable after population op.alter_column("passages", "organization_id", nullable=False) - op.alter_column('passages', 'text', - existing_type=sa.VARCHAR(), - nullable=False) - op.alter_column('passages', 'embedding_config', - existing_type=postgresql.JSON(astext_type=sa.Text()), - nullable=False) - op.alter_column('passages', 'metadata_', - existing_type=postgresql.JSON(astext_type=sa.Text()), - nullable=False) - op.alter_column('passages', 'created_at', - existing_type=postgresql.TIMESTAMP(timezone=True), - nullable=False) - op.drop_index('passage_idx_user', table_name='passages') - op.create_foreign_key(None, 'passages', 'organizations', ['organization_id'], ['id']) - op.create_foreign_key(None, 'passages', 'agents', ['agent_id'], ['id']) - op.create_foreign_key(None, 'passages', 'files', ['file_id'], ['id'], ondelete='CASCADE') - op.drop_column('passages', 'user_id') + op.alter_column("passages", "text", existing_type=sa.VARCHAR(), nullable=False) + op.alter_column("passages", "embedding_config", existing_type=postgresql.JSON(astext_type=sa.Text()), nullable=False) + op.alter_column("passages", "metadata_", existing_type=postgresql.JSON(astext_type=sa.Text()), nullable=False) + op.alter_column("passages", "created_at", existing_type=postgresql.TIMESTAMP(timezone=True), nullable=False) + op.drop_index("passage_idx_user", table_name="passages") + op.create_foreign_key(None, "passages", "organizations", ["organization_id"], ["id"]) + op.create_foreign_key(None, "passages", "agents", ["agent_id"], ["id"]) + op.create_foreign_key(None, "passages", "files", ["file_id"], ["id"], ondelete="CASCADE") + op.drop_column("passages", "user_id") # ### end Alembic commands ### def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - op.add_column('passages', sa.Column('user_id', sa.VARCHAR(), autoincrement=False, nullable=False)) - op.drop_constraint(None, 'passages', type_='foreignkey') - op.drop_constraint(None, 'passages', type_='foreignkey') - op.drop_constraint(None, 'passages', type_='foreignkey') - op.create_index('passage_idx_user', 'passages', ['user_id', 'agent_id', 'file_id'], unique=False) - op.alter_column('passages', 'created_at', - existing_type=postgresql.TIMESTAMP(timezone=True), - nullable=True) - op.alter_column('passages', 'metadata_', - existing_type=postgresql.JSON(astext_type=sa.Text()), - nullable=True) - op.alter_column('passages', 'embedding_config', - existing_type=postgresql.JSON(astext_type=sa.Text()), - nullable=True) - op.alter_column('passages', 'text', - existing_type=sa.VARCHAR(), - nullable=True) - op.drop_column('passages', 'organization_id') - op.drop_column('passages', '_last_updated_by_id') - op.drop_column('passages', '_created_by_id') - op.drop_column('passages', 'is_deleted') - op.drop_column('passages', 'updated_at') + op.add_column("passages", sa.Column("user_id", sa.VARCHAR(), autoincrement=False, nullable=False)) + op.drop_constraint(None, "passages", type_="foreignkey") + op.drop_constraint(None, "passages", type_="foreignkey") + op.drop_constraint(None, "passages", type_="foreignkey") + op.create_index("passage_idx_user", "passages", ["user_id", "agent_id", "file_id"], unique=False) + op.alter_column("passages", "created_at", existing_type=postgresql.TIMESTAMP(timezone=True), nullable=True) + op.alter_column("passages", "metadata_", existing_type=postgresql.JSON(astext_type=sa.Text()), nullable=True) + op.alter_column("passages", "embedding_config", existing_type=postgresql.JSON(astext_type=sa.Text()), nullable=True) + op.alter_column("passages", "text", existing_type=sa.VARCHAR(), nullable=True) + op.drop_column("passages", "organization_id") + op.drop_column("passages", "_last_updated_by_id") + op.drop_column("passages", "_created_by_id") + op.drop_column("passages", "is_deleted") + op.drop_column("passages", "updated_at") # ### end Alembic commands ### diff --git a/examples/tool_rule_usage.py b/examples/tool_rule_usage.py index 7d04df6c5a..54e051e2d7 100644 --- a/examples/tool_rule_usage.py +++ b/examples/tool_rule_usage.py @@ -4,10 +4,7 @@ from letta import create_client from letta.schemas.letta_message import ToolCallMessage from letta.schemas.tool_rule import ChildToolRule, InitToolRule, TerminalToolRule -from tests.helpers.endpoints_helper import ( - assert_invoked_send_message_with_keyword, - setup_agent, -) +from tests.helpers.endpoints_helper import assert_invoked_send_message_with_keyword, setup_agent from tests.helpers.utils import cleanup from tests.test_model_letta_perfomance import llm_config_dir diff --git a/letta/__init__.py b/letta/__init__.py index 826b03f991..46390abe5a 100644 --- a/letta/__init__.py +++ b/letta/__init__.py @@ -12,13 +12,7 @@ from letta.schemas.job import Job from letta.schemas.letta_message import LettaMessage from letta.schemas.llm_config import LLMConfig -from letta.schemas.memory import ( - ArchivalMemorySummary, - BasicBlockMemory, - ChatMemory, - Memory, - RecallMemorySummary, -) +from letta.schemas.memory import ArchivalMemorySummary, BasicBlockMemory, ChatMemory, Memory, RecallMemorySummary from letta.schemas.message import Message from letta.schemas.openai.chat_completion_response import UsageStatistics from letta.schemas.organization import Organization diff --git a/letta/agent.py b/letta/agent.py index 2b7441e345..483d3cb81d 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -33,34 +33,21 @@ from letta.schemas.enums import MessageRole from letta.schemas.memory import ContextWindowOverview, Memory from letta.schemas.message import Message -from letta.schemas.openai.chat_completion_request import ( - Tool as ChatCompletionRequestTool, -) +from letta.schemas.openai.chat_completion_request import Tool as ChatCompletionRequestTool from letta.schemas.openai.chat_completion_response import ChatCompletionResponse -from letta.schemas.openai.chat_completion_response import ( - Message as ChatCompletionMessage, -) +from letta.schemas.openai.chat_completion_response import Message as ChatCompletionMessage from letta.schemas.openai.chat_completion_response import UsageStatistics from letta.schemas.tool import Tool from letta.schemas.tool_rule import TerminalToolRule from letta.schemas.usage import LettaUsageStatistics from letta.services.agent_manager import AgentManager from letta.services.block_manager import BlockManager -from letta.services.helpers.agent_manager_helper import ( - check_supports_structured_output, - compile_memory_metadata_block, -) +from letta.services.helpers.agent_manager_helper import check_supports_structured_output, compile_memory_metadata_block from letta.services.message_manager import MessageManager from letta.services.passage_manager import PassageManager from letta.services.tool_execution_sandbox import ToolExecutionSandbox from letta.streaming_interface import StreamingRefreshCLIInterface -from letta.system import ( - get_heartbeat, - get_token_limit_warning, - package_function_response, - package_summarize_message, - package_user_message, -) +from letta.system import get_heartbeat, get_token_limit_warning, package_function_response, package_summarize_message, package_user_message from letta.utils import ( count_tokens, get_friendly_error_msg, diff --git a/letta/cli/cli.py b/letta/cli/cli.py index e5a649f7ce..4441190b2c 100644 --- a/letta/cli/cli.py +++ b/letta/cli/cli.py @@ -10,12 +10,7 @@ from letta import create_client from letta.agent import Agent, save_agent from letta.config import LettaConfig -from letta.constants import ( - CLI_WARNING_PREFIX, - CORE_MEMORY_BLOCK_CHAR_LIMIT, - LETTA_DIR, - MIN_CONTEXT_WINDOW, -) +from letta.constants import CLI_WARNING_PREFIX, CORE_MEMORY_BLOCK_CHAR_LIMIT, LETTA_DIR, MIN_CONTEXT_WINDOW from letta.local_llm.constants import ASSISTANT_MESSAGE_CLI_SYMBOL from letta.log import get_logger from letta.schemas.enums import OptionState @@ -23,9 +18,7 @@ from letta.server.server import logger as server_logger # from letta.interface import CLIInterface as interface # for printing to terminal -from letta.streaming_interface import ( - StreamingRefreshCLIInterface as interface, # for printing to terminal -) +from letta.streaming_interface import StreamingRefreshCLIInterface as interface # for printing to terminal from letta.utils import open_folder_in_explorer, printd logger = get_logger(__name__) diff --git a/letta/client/client.py b/letta/client/client.py index bb6d2f0ff8..9931628cd7 100644 --- a/letta/client/client.py +++ b/letta/client/client.py @@ -5,14 +5,7 @@ import requests import letta.utils -from letta.constants import ( - ADMIN_PREFIX, - BASE_MEMORY_TOOLS, - BASE_TOOLS, - DEFAULT_HUMAN, - DEFAULT_PERSONA, - FUNCTION_RETURN_CHAR_LIMIT, -) +from letta.constants import ADMIN_PREFIX, BASE_MEMORY_TOOLS, BASE_TOOLS, DEFAULT_HUMAN, DEFAULT_PERSONA, FUNCTION_RETURN_CHAR_LIMIT from letta.data_sources.connectors import DataConnector from letta.functions.functions import parse_source_code from letta.orm.errors import NoResultFound @@ -27,13 +20,7 @@ from letta.schemas.letta_request import LettaRequest, LettaStreamingRequest from letta.schemas.letta_response import LettaResponse, LettaStreamingResponse from letta.schemas.llm_config import LLMConfig -from letta.schemas.memory import ( - ArchivalMemorySummary, - ChatMemory, - CreateArchivalMemory, - Memory, - RecallMemorySummary, -) +from letta.schemas.memory import ArchivalMemorySummary, ChatMemory, CreateArchivalMemory, Memory, RecallMemorySummary from letta.schemas.message import Message, MessageCreate, MessageUpdate from letta.schemas.openai.chat_completions import ToolCall from letta.schemas.organization import Organization diff --git a/letta/client/streaming.py b/letta/client/streaming.py index a364ada6f0..86be5c41a3 100644 --- a/letta/client/streaming.py +++ b/letta/client/streaming.py @@ -7,11 +7,7 @@ from letta.constants import OPENAI_CONTEXT_WINDOW_ERROR_SUBSTRING from letta.errors import LLMError from letta.schemas.enums import MessageStreamStatus -from letta.schemas.letta_message import ( - ToolCallMessage, - ToolReturnMessage, - ReasoningMessage, -) +from letta.schemas.letta_message import ReasoningMessage, ToolCallMessage, ToolReturnMessage from letta.schemas.letta_response import LettaStreamingResponse from letta.schemas.usage import LettaUsageStatistics diff --git a/letta/client/utils.py b/letta/client/utils.py index 1ff28f8c9c..f823ee87fe 100644 --- a/letta/client/utils.py +++ b/letta/client/utils.py @@ -5,10 +5,7 @@ from IPython.display import HTML, display from sqlalchemy.testing.plugin.plugin_base import warnings -from letta.local_llm.constants import ( - ASSISTANT_MESSAGE_CLI_SYMBOL, - INNER_THOUGHTS_CLI_SYMBOL, -) +from letta.local_llm.constants import ASSISTANT_MESSAGE_CLI_SYMBOL, INNER_THOUGHTS_CLI_SYMBOL def pprint(messages): diff --git a/letta/data_sources/connectors.py b/letta/data_sources/connectors.py index f9fdd26160..8ae67f8818 100644 --- a/letta/data_sources/connectors.py +++ b/letta/data_sources/connectors.py @@ -2,11 +2,7 @@ import typer -from letta.data_sources.connectors_helper import ( - assert_all_files_exist_locally, - extract_metadata_from_files, - get_filenames_in_dir, -) +from letta.data_sources.connectors_helper import assert_all_files_exist_locally, extract_metadata_from_files, get_filenames_in_dir from letta.embeddings import embedding_model from letta.schemas.file import FileMetadata from letta.schemas.passage import Passage @@ -14,6 +10,7 @@ from letta.services.passage_manager import PassageManager from letta.services.source_manager import SourceManager + class DataConnector: """ Base class for data connectors that can be extended to generate files and passages from a custom data source. diff --git a/letta/embeddings.py b/letta/embeddings.py index 0d82d158a5..e588f17ab8 100644 --- a/letta/embeddings.py +++ b/letta/embeddings.py @@ -4,11 +4,7 @@ import numpy as np import tiktoken -from letta.constants import ( - EMBEDDING_TO_TOKENIZER_DEFAULT, - EMBEDDING_TO_TOKENIZER_MAP, - MAX_EMBEDDING_DIM, -) +from letta.constants import EMBEDDING_TO_TOKENIZER_DEFAULT, EMBEDDING_TO_TOKENIZER_MAP, MAX_EMBEDDING_DIM from letta.schemas.embedding_config import EmbeddingConfig from letta.utils import is_valid_url, printd diff --git a/letta/errors.py b/letta/errors.py index 4957139bee..2c4703c0dd 100644 --- a/letta/errors.py +++ b/letta/errors.py @@ -52,12 +52,10 @@ def __init__(self, message: str, missing_fields: Optional[List[str]] = None): class LettaAgentNotFoundError(LettaError): """Error raised when an agent is not found.""" - pass class LettaUserNotFoundError(LettaError): """Error raised when a user is not found.""" - pass class LLMError(LettaError): diff --git a/letta/functions/function_sets/extras.py b/letta/functions/function_sets/extras.py index f29f85ba49..d5d21644fb 100644 --- a/letta/functions/function_sets/extras.py +++ b/letta/functions/function_sets/extras.py @@ -4,10 +4,7 @@ import requests -from letta.constants import ( - MESSAGE_CHATGPT_FUNCTION_MODEL, - MESSAGE_CHATGPT_FUNCTION_SYSTEM_MESSAGE, -) +from letta.constants import MESSAGE_CHATGPT_FUNCTION_MODEL, MESSAGE_CHATGPT_FUNCTION_SYSTEM_MESSAGE from letta.llm_api.llm_api_tools import create from letta.schemas.message import Message from letta.utils import json_dumps, json_loads diff --git a/letta/functions/schema_generator.py b/letta/functions/schema_generator.py index 89409cb2be..6f5bb52f9d 100644 --- a/letta/functions/schema_generator.py +++ b/letta/functions/schema_generator.py @@ -396,44 +396,6 @@ def generate_schema(function, name: Optional[str] = None, description: Optional[ return schema -def generate_schema_from_args_schema_v1( - args_schema: Type[V1BaseModel], name: Optional[str] = None, description: Optional[str] = None, append_heartbeat: bool = True -) -> Dict[str, Any]: - properties = {} - required = [] - for field_name, field in args_schema.__fields__.items(): - if field.type_ == str: - field_type = "string" - elif field.type_ == int: - field_type = "integer" - elif field.type_ == bool: - field_type = "boolean" - else: - field_type = field.type_.__name__ - - properties[field_name] = { - "type": field_type, - "description": field.field_info.description, - } - if field.required: - required.append(field_name) - - function_call_json = { - "name": name, - "description": description, - "parameters": {"type": "object", "properties": properties, "required": required}, - } - - if append_heartbeat: - function_call_json["parameters"]["properties"]["request_heartbeat"] = { - "type": "boolean", - "description": "Request an immediate heartbeat after function execution. Set to `True` if you want to send a follow-up message or run a follow-up function.", - } - function_call_json["parameters"]["required"].append("request_heartbeat") - - return function_call_json - - def generate_schema_from_args_schema_v2( args_schema: Type[BaseModel], name: Optional[str] = None, description: Optional[str] = None, append_heartbeat: bool = True ) -> Dict[str, Any]: @@ -441,19 +403,8 @@ def generate_schema_from_args_schema_v2( required = [] for field_name, field in args_schema.model_fields.items(): field_type_annotation = field.annotation - if field_type_annotation == str: - field_type = "string" - elif field_type_annotation == int: - field_type = "integer" - elif field_type_annotation == bool: - field_type = "boolean" - else: - field_type = field_type_annotation.__name__ - - properties[field_name] = { - "type": field_type, - "description": field.description, - } + properties[field_name] = type_to_json_schema_type(field_type_annotation) + properties[field_name]["description"] = field.description if field.is_required(): required.append(field_name) diff --git a/letta/helpers/tool_rule_solver.py b/letta/helpers/tool_rule_solver.py index 02919b2e8a..cba8a0ca4e 100644 --- a/letta/helpers/tool_rule_solver.py +++ b/letta/helpers/tool_rule_solver.py @@ -4,13 +4,7 @@ from pydantic import BaseModel, Field from letta.schemas.enums import ToolRuleType -from letta.schemas.tool_rule import ( - BaseToolRule, - ChildToolRule, - ConditionalToolRule, - InitToolRule, - TerminalToolRule, -) +from letta.schemas.tool_rule import BaseToolRule, ChildToolRule, ConditionalToolRule, InitToolRule, TerminalToolRule class ToolRuleValidationError(Exception): @@ -50,7 +44,6 @@ def __init__(self, tool_rules: List[BaseToolRule], **kwargs): assert isinstance(rule, TerminalToolRule) self.terminal_tool_rules.append(rule) - def update_tool_usage(self, tool_name: str): """Update the internal state to track the last tool called.""" self.last_tool_name = tool_name @@ -88,7 +81,7 @@ def has_children_tools(self, tool_name): return any(rule.tool_name == tool_name for rule in self.tool_rules) def validate_conditional_tool(self, rule: ConditionalToolRule): - ''' + """ Validate a conditional tool rule Args: @@ -96,13 +89,13 @@ def validate_conditional_tool(self, rule: ConditionalToolRule): Raises: ToolRuleValidationError: If the rule is invalid - ''' + """ if len(rule.child_output_mapping) == 0: raise ToolRuleValidationError("Conditional tool rule must have at least one child tool.") return True def evaluate_conditional_tool(self, tool: ConditionalToolRule, last_function_response: str) -> str: - ''' + """ Parse function response to determine which child tool to use based on the mapping Args: @@ -111,7 +104,7 @@ def evaluate_conditional_tool(self, tool: ConditionalToolRule, last_function_res Returns: str: The name of the child tool to use next - ''' + """ json_response = json.loads(last_function_response) function_output = json_response["message"] diff --git a/letta/interface.py b/letta/interface.py index aac10453f1..28cb0264fd 100644 --- a/letta/interface.py +++ b/letta/interface.py @@ -5,10 +5,7 @@ from colorama import Fore, Style, init from letta.constants import CLI_WARNING_PREFIX -from letta.local_llm.constants import ( - ASSISTANT_MESSAGE_CLI_SYMBOL, - INNER_THOUGHTS_CLI_SYMBOL, -) +from letta.local_llm.constants import ASSISTANT_MESSAGE_CLI_SYMBOL, INNER_THOUGHTS_CLI_SYMBOL from letta.schemas.message import Message from letta.utils import json_loads, printd diff --git a/letta/llm_api/anthropic.py b/letta/llm_api/anthropic.py index 4cca920a5c..fb42e696e1 100644 --- a/letta/llm_api/anthropic.py +++ b/letta/llm_api/anthropic.py @@ -5,11 +5,7 @@ from letta.llm_api.helpers import make_post_request from letta.schemas.message import Message from letta.schemas.openai.chat_completion_request import ChatCompletionRequest, Tool -from letta.schemas.openai.chat_completion_response import ( - ChatCompletionResponse, - Choice, - FunctionCall, -) +from letta.schemas.openai.chat_completion_response import ChatCompletionResponse, Choice, FunctionCall from letta.schemas.openai.chat_completion_response import ( Message as ChoiceMessage, # NOTE: avoid conflict with our own Letta Message datatype ) @@ -102,13 +98,9 @@ def convert_tools_to_anthropic_format(tools: List[Tool]) -> List[dict]: formatted_tools = [] for tool in tools: formatted_tool = { - "name" : tool.function.name, - "description" : tool.function.description, - "input_schema" : tool.function.parameters or { - "type": "object", - "properties": {}, - "required": [] - } + "name": tool.function.name, + "description": tool.function.description, + "input_schema": tool.function.parameters or {"type": "object", "properties": {}, "required": []}, } formatted_tools.append(formatted_tool) @@ -346,7 +338,7 @@ def anthropic_chat_completions_request( data["tool_choice"] = { "type": "tool", # Changed from "function" to "tool" "name": anthropic_tools[0]["name"], # Directly specify name without nested "function" object - "disable_parallel_tool_use": True # Force single tool use + "disable_parallel_tool_use": True, # Force single tool use } # Move 'system' to the top level diff --git a/letta/llm_api/cohere.py b/letta/llm_api/cohere.py index 1e8b5fd6ce..0259f6feb5 100644 --- a/letta/llm_api/cohere.py +++ b/letta/llm_api/cohere.py @@ -7,11 +7,7 @@ from letta.local_llm.utils import count_tokens from letta.schemas.message import Message from letta.schemas.openai.chat_completion_request import ChatCompletionRequest, Tool -from letta.schemas.openai.chat_completion_response import ( - ChatCompletionResponse, - Choice, - FunctionCall, -) +from letta.schemas.openai.chat_completion_response import ChatCompletionResponse, Choice, FunctionCall from letta.schemas.openai.chat_completion_response import ( Message as ChoiceMessage, # NOTE: avoid conflict with our own Letta Message datatype ) @@ -276,10 +272,7 @@ def convert_tools_to_cohere_format(tools: List[Tool], inner_thoughts_in_kwargs: if inner_thoughts_in_kwargs: # NOTE: since Cohere doesn't allow "text" in the response when a tool call happens, if we want # a simultaneous CoT + tool call we need to put it inside a kwarg - from letta.local_llm.constants import ( - INNER_THOUGHTS_KWARG, - INNER_THOUGHTS_KWARG_DESCRIPTION, - ) + from letta.local_llm.constants import INNER_THOUGHTS_KWARG, INNER_THOUGHTS_KWARG_DESCRIPTION for cohere_tool in tools_dict_list: cohere_tool["parameter_definitions"][INNER_THOUGHTS_KWARG] = { diff --git a/letta/llm_api/google_ai.py b/letta/llm_api/google_ai.py index 57071a2396..1eec3eaae3 100644 --- a/letta/llm_api/google_ai.py +++ b/letta/llm_api/google_ai.py @@ -8,14 +8,7 @@ from letta.local_llm.json_parser import clean_json_string_extra_backslash from letta.local_llm.utils import count_tokens from letta.schemas.openai.chat_completion_request import Tool -from letta.schemas.openai.chat_completion_response import ( - ChatCompletionResponse, - Choice, - FunctionCall, - Message, - ToolCall, - UsageStatistics, -) +from letta.schemas.openai.chat_completion_response import ChatCompletionResponse, Choice, FunctionCall, Message, ToolCall, UsageStatistics from letta.utils import get_tool_call_id, get_utc_time, json_dumps @@ -230,10 +223,7 @@ def convert_tools_to_google_ai_format(tools: List[Tool], inner_thoughts_in_kwarg param_fields["type"] = param_fields["type"].upper() # Add inner thoughts if inner_thoughts_in_kwargs: - from letta.local_llm.constants import ( - INNER_THOUGHTS_KWARG, - INNER_THOUGHTS_KWARG_DESCRIPTION, - ) + from letta.local_llm.constants import INNER_THOUGHTS_KWARG, INNER_THOUGHTS_KWARG_DESCRIPTION func["parameters"]["properties"][INNER_THOUGHTS_KWARG] = { "type": "STRING", diff --git a/letta/llm_api/llm_api_tools.py b/letta/llm_api/llm_api_tools.py index 146c1209ad..d83e8699e6 100644 --- a/letta/llm_api/llm_api_tools.py +++ b/letta/llm_api/llm_api_tools.py @@ -8,38 +8,22 @@ from letta.errors import LettaConfigurationError, RateLimitExceededError from letta.llm_api.anthropic import anthropic_chat_completions_request from letta.llm_api.azure_openai import azure_openai_chat_completions_request -from letta.llm_api.google_ai import ( - convert_tools_to_google_ai_format, - google_ai_chat_completions_request, -) -from letta.llm_api.helpers import ( - add_inner_thoughts_to_functions, - unpack_all_inner_thoughts_from_kwargs, -) +from letta.llm_api.google_ai import convert_tools_to_google_ai_format, google_ai_chat_completions_request +from letta.llm_api.helpers import add_inner_thoughts_to_functions, unpack_all_inner_thoughts_from_kwargs from letta.llm_api.openai import ( build_openai_chat_completions_request, openai_chat_completions_process_stream, openai_chat_completions_request, ) from letta.local_llm.chat_completion_proxy import get_chat_completion -from letta.local_llm.constants import ( - INNER_THOUGHTS_KWARG, - INNER_THOUGHTS_KWARG_DESCRIPTION, -) +from letta.local_llm.constants import INNER_THOUGHTS_KWARG, INNER_THOUGHTS_KWARG_DESCRIPTION from letta.local_llm.utils import num_tokens_from_functions, num_tokens_from_messages from letta.schemas.llm_config import LLMConfig from letta.schemas.message import Message -from letta.schemas.openai.chat_completion_request import ( - ChatCompletionRequest, - Tool, - cast_message_to_subtype, -) +from letta.schemas.openai.chat_completion_request import ChatCompletionRequest, Tool, cast_message_to_subtype from letta.schemas.openai.chat_completion_response import ChatCompletionResponse from letta.settings import ModelSettings -from letta.streaming_interface import ( - AgentChunkStreamingInterface, - AgentRefreshStreamingInterface, -) +from letta.streaming_interface import AgentChunkStreamingInterface, AgentRefreshStreamingInterface LLM_API_PROVIDER_OPTIONS = ["openai", "azure", "anthropic", "google_ai", "cohere", "local", "groq"] diff --git a/letta/llm_api/openai.py b/letta/llm_api/openai.py index 813ae68d59..bb3557568a 100644 --- a/letta/llm_api/openai.py +++ b/letta/llm_api/openai.py @@ -9,28 +9,15 @@ from letta.constants import OPENAI_CONTEXT_WINDOW_ERROR_SUBSTRING from letta.errors import LLMError -from letta.llm_api.helpers import ( - add_inner_thoughts_to_functions, - convert_to_structured_output, - make_post_request, -) -from letta.local_llm.constants import ( - INNER_THOUGHTS_KWARG, - INNER_THOUGHTS_KWARG_DESCRIPTION, -) +from letta.llm_api.helpers import add_inner_thoughts_to_functions, convert_to_structured_output, make_post_request +from letta.local_llm.constants import INNER_THOUGHTS_KWARG, INNER_THOUGHTS_KWARG_DESCRIPTION from letta.local_llm.utils import num_tokens_from_functions, num_tokens_from_messages from letta.schemas.llm_config import LLMConfig from letta.schemas.message import Message as _Message from letta.schemas.message import MessageRole as _MessageRole from letta.schemas.openai.chat_completion_request import ChatCompletionRequest -from letta.schemas.openai.chat_completion_request import ( - FunctionCall as ToolFunctionChoiceFunctionCall, -) -from letta.schemas.openai.chat_completion_request import ( - Tool, - ToolFunctionChoice, - cast_message_to_subtype, -) +from letta.schemas.openai.chat_completion_request import FunctionCall as ToolFunctionChoiceFunctionCall +from letta.schemas.openai.chat_completion_request import Tool, ToolFunctionChoice, cast_message_to_subtype from letta.schemas.openai.chat_completion_response import ( ChatCompletionChunkResponse, ChatCompletionResponse, @@ -41,10 +28,7 @@ UsageStatistics, ) from letta.schemas.openai.embedding_response import EmbeddingResponse -from letta.streaming_interface import ( - AgentChunkStreamingInterface, - AgentRefreshStreamingInterface, -) +from letta.streaming_interface import AgentChunkStreamingInterface, AgentRefreshStreamingInterface from letta.utils import get_tool_call_id, smart_urljoin OPENAI_SSE_DONE = "[DONE]" diff --git a/letta/local_llm/chat_completion_proxy.py b/letta/local_llm/chat_completion_proxy.py index c6dbd4a16f..184489c8de 100644 --- a/letta/local_llm/chat_completion_proxy.py +++ b/letta/local_llm/chat_completion_proxy.py @@ -8,10 +8,7 @@ from letta.errors import LocalLLMConnectionError, LocalLLMError from letta.local_llm.constants import DEFAULT_WRAPPER from letta.local_llm.function_parser import patch_function -from letta.local_llm.grammars.gbnf_grammar_generator import ( - create_dynamic_model_from_function, - generate_gbnf_grammar_and_documentation, -) +from letta.local_llm.grammars.gbnf_grammar_generator import create_dynamic_model_from_function, generate_gbnf_grammar_and_documentation from letta.local_llm.koboldcpp.api import get_koboldcpp_completion from letta.local_llm.llamacpp.api import get_llamacpp_completion from letta.local_llm.llm_chat_completion_wrappers import simple_summary_wrapper @@ -20,17 +17,9 @@ from letta.local_llm.utils import count_tokens, get_available_wrappers from letta.local_llm.vllm.api import get_vllm_completion from letta.local_llm.webui.api import get_webui_completion -from letta.local_llm.webui.legacy_api import ( - get_webui_completion as get_webui_completion_legacy, -) +from letta.local_llm.webui.legacy_api import get_webui_completion as get_webui_completion_legacy from letta.prompts.gpt_summarize import SYSTEM as SUMMARIZE_SYSTEM_MESSAGE -from letta.schemas.openai.chat_completion_response import ( - ChatCompletionResponse, - Choice, - Message, - ToolCall, - UsageStatistics, -) +from letta.schemas.openai.chat_completion_response import ChatCompletionResponse, Choice, Message, ToolCall, UsageStatistics from letta.utils import get_tool_call_id, get_utc_time, json_dumps has_shown_warning = False diff --git a/letta/local_llm/constants.py b/letta/local_llm/constants.py index ed07f4f1fe..03abcc81d9 100644 --- a/letta/local_llm/constants.py +++ b/letta/local_llm/constants.py @@ -1,7 +1,5 @@ # import letta.local_llm.llm_chat_completion_wrappers.airoboros as airoboros -from letta.local_llm.llm_chat_completion_wrappers.chatml import ( - ChatMLInnerMonologueWrapper, -) +from letta.local_llm.llm_chat_completion_wrappers.chatml import ChatMLInnerMonologueWrapper DEFAULT_ENDPOINTS = { # Local diff --git a/letta/local_llm/grammars/gbnf_grammar_generator.py b/letta/local_llm/grammars/gbnf_grammar_generator.py index ddd628175a..402b21bfdd 100644 --- a/letta/local_llm/grammars/gbnf_grammar_generator.py +++ b/letta/local_llm/grammars/gbnf_grammar_generator.py @@ -5,18 +5,7 @@ from enum import Enum from inspect import getdoc, isclass from types import NoneType -from typing import ( - Any, - Callable, - List, - Optional, - Tuple, - Type, - Union, - _GenericAlias, - get_args, - get_origin, -) +from typing import Any, Callable, List, Optional, Tuple, Type, Union, _GenericAlias, get_args, get_origin from docstring_parser import parse from pydantic import BaseModel, create_model diff --git a/letta/local_llm/llm_chat_completion_wrappers/chatml.py b/letta/local_llm/llm_chat_completion_wrappers/chatml.py index baa1592324..2c1ebaf7f7 100644 --- a/letta/local_llm/llm_chat_completion_wrappers/chatml.py +++ b/letta/local_llm/llm_chat_completion_wrappers/chatml.py @@ -1,8 +1,6 @@ from letta.errors import LLMJSONParsingError from letta.local_llm.json_parser import clean_json -from letta.local_llm.llm_chat_completion_wrappers.wrapper_base import ( - LLMChatCompletionWrapper, -) +from letta.local_llm.llm_chat_completion_wrappers.wrapper_base import LLMChatCompletionWrapper from letta.schemas.enums import MessageRole from letta.utils import json_dumps, json_loads @@ -75,10 +73,7 @@ def _compile_function_description(self, schema, add_inner_thoughts=True) -> str: func_str += f"\n description: {schema['description']}" func_str += f"\n params:" if add_inner_thoughts: - from letta.local_llm.constants import ( - INNER_THOUGHTS_KWARG, - INNER_THOUGHTS_KWARG_DESCRIPTION, - ) + from letta.local_llm.constants import INNER_THOUGHTS_KWARG, INNER_THOUGHTS_KWARG_DESCRIPTION func_str += f"\n {INNER_THOUGHTS_KWARG}: {INNER_THOUGHTS_KWARG_DESCRIPTION}" for param_k, param_v in schema["parameters"]["properties"].items(): diff --git a/letta/local_llm/llm_chat_completion_wrappers/llama3.py b/letta/local_llm/llm_chat_completion_wrappers/llama3.py index fa417b7df1..804e90db72 100644 --- a/letta/local_llm/llm_chat_completion_wrappers/llama3.py +++ b/letta/local_llm/llm_chat_completion_wrappers/llama3.py @@ -1,8 +1,6 @@ from letta.errors import LLMJSONParsingError from letta.local_llm.json_parser import clean_json -from letta.local_llm.llm_chat_completion_wrappers.wrapper_base import ( - LLMChatCompletionWrapper, -) +from letta.local_llm.llm_chat_completion_wrappers.wrapper_base import LLMChatCompletionWrapper from letta.utils import json_dumps, json_loads PREFIX_HINT = """# Reminders: @@ -74,10 +72,7 @@ def _compile_function_description(self, schema, add_inner_thoughts=True) -> str: func_str += f"\n description: {schema['description']}" func_str += "\n params:" if add_inner_thoughts: - from letta.local_llm.constants import ( - INNER_THOUGHTS_KWARG, - INNER_THOUGHTS_KWARG_DESCRIPTION, - ) + from letta.local_llm.constants import INNER_THOUGHTS_KWARG, INNER_THOUGHTS_KWARG_DESCRIPTION func_str += f"\n {INNER_THOUGHTS_KWARG}: {INNER_THOUGHTS_KWARG_DESCRIPTION}" for param_k, param_v in schema["parameters"]["properties"].items(): diff --git a/letta/local_llm/settings/settings.py b/letta/local_llm/settings/settings.py index b4c67a9ed5..9efbcf6ac5 100644 --- a/letta/local_llm/settings/settings.py +++ b/letta/local_llm/settings/settings.py @@ -2,9 +2,7 @@ import os from letta.constants import LETTA_DIR -from letta.local_llm.settings.deterministic_mirostat import ( - settings as det_miro_settings, -) +from letta.local_llm.settings.deterministic_mirostat import settings as det_miro_settings from letta.local_llm.settings.simple import settings as simple_settings DEFAULT = "simple" diff --git a/letta/orm/__init__.py b/letta/orm/__init__.py index 8a0f0c7779..e083efce2c 100644 --- a/letta/orm/__init__.py +++ b/letta/orm/__init__.py @@ -7,7 +7,7 @@ from letta.orm.job import Job from letta.orm.message import Message from letta.orm.organization import Organization -from letta.orm.passage import BasePassage, AgentPassage, SourcePassage +from letta.orm.passage import AgentPassage, BasePassage, SourcePassage from letta.orm.sandbox_config import SandboxConfig, SandboxEnvironmentVariable from letta.orm.source import Source from letta.orm.sources_agents import SourcesAgents diff --git a/letta/orm/agent.py b/letta/orm/agent.py index c4645c3ed2..353d4fe783 100644 --- a/letta/orm/agent.py +++ b/letta/orm/agent.py @@ -5,11 +5,7 @@ from sqlalchemy.orm import Mapped, mapped_column, relationship from letta.orm.block import Block -from letta.orm.custom_columns import ( - EmbeddingConfigColumn, - LLMConfigColumn, - ToolRulesColumn, -) +from letta.orm.custom_columns import EmbeddingConfigColumn, LLMConfigColumn, ToolRulesColumn from letta.orm.message import Message from letta.orm.mixins import OrganizationMixin from letta.orm.organization import Organization diff --git a/letta/orm/base.py b/letta/orm/base.py index e9491c4199..62951741f2 100644 --- a/letta/orm/base.py +++ b/letta/orm/base.py @@ -2,13 +2,7 @@ from typing import Optional from sqlalchemy import Boolean, DateTime, String, func, text -from sqlalchemy.orm import ( - DeclarativeBase, - Mapped, - declarative_mixin, - declared_attr, - mapped_column, -) +from sqlalchemy.orm import DeclarativeBase, Mapped, declarative_mixin, declared_attr, mapped_column class Base(DeclarativeBase): diff --git a/letta/orm/file.py b/letta/orm/file.py index 45470c6c96..88342700e4 100644 --- a/letta/orm/file.py +++ b/letta/orm/file.py @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING, Optional, List +from typing import TYPE_CHECKING, List, Optional from sqlalchemy import Integer, String from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -9,8 +9,9 @@ if TYPE_CHECKING: from letta.orm.organization import Organization - from letta.orm.source import Source from letta.orm.passage import SourcePassage + from letta.orm.source import Source + class FileMetadata(SqlalchemyBase, OrganizationMixin, SourceMixin): """Represents metadata for an uploaded file.""" @@ -28,4 +29,6 @@ class FileMetadata(SqlalchemyBase, OrganizationMixin, SourceMixin): # relationships organization: Mapped["Organization"] = relationship("Organization", back_populates="files", lazy="selectin") source: Mapped["Source"] = relationship("Source", back_populates="files", lazy="selectin") - source_passages: Mapped[List["SourcePassage"]] = relationship("SourcePassage", back_populates="file", lazy="selectin", cascade="all, delete-orphan") + source_passages: Mapped[List["SourcePassage"]] = relationship( + "SourcePassage", back_populates="file", lazy="selectin", cascade="all, delete-orphan" + ) diff --git a/letta/orm/mixins.py b/letta/orm/mixins.py index 328772d7e4..febf84de28 100644 --- a/letta/orm/mixins.py +++ b/letta/orm/mixins.py @@ -31,6 +31,7 @@ class UserMixin(Base): user_id: Mapped[str] = mapped_column(String, ForeignKey("users.id")) + class AgentMixin(Base): """Mixin for models that belong to an agent.""" @@ -38,6 +39,7 @@ class AgentMixin(Base): agent_id: Mapped[str] = mapped_column(String, ForeignKey("agents.id", ondelete="CASCADE")) + class FileMixin(Base): """Mixin for models that belong to a file.""" diff --git a/letta/orm/organization.py b/letta/orm/organization.py index 9a71a09b7e..335a15d0f4 100644 --- a/letta/orm/organization.py +++ b/letta/orm/organization.py @@ -38,19 +38,11 @@ class Organization(SqlalchemyBase): agents: Mapped[List["Agent"]] = relationship("Agent", back_populates="organization", cascade="all, delete-orphan") messages: Mapped[List["Message"]] = relationship("Message", back_populates="organization", cascade="all, delete-orphan") source_passages: Mapped[List["SourcePassage"]] = relationship( - "SourcePassage", - back_populates="organization", - cascade="all, delete-orphan" - ) - agent_passages: Mapped[List["AgentPassage"]] = relationship( - "AgentPassage", - back_populates="organization", - cascade="all, delete-orphan" + "SourcePassage", back_populates="organization", cascade="all, delete-orphan" ) + agent_passages: Mapped[List["AgentPassage"]] = relationship("AgentPassage", back_populates="organization", cascade="all, delete-orphan") @property def passages(self) -> List[Union["SourcePassage", "AgentPassage"]]: """Convenience property to get all passages""" return self.source_passages + self.agent_passages - - diff --git a/letta/orm/sandbox_config.py b/letta/orm/sandbox_config.py index aa8e07dc93..9058657f62 100644 --- a/letta/orm/sandbox_config.py +++ b/letta/orm/sandbox_config.py @@ -8,9 +8,7 @@ from letta.orm.mixins import OrganizationMixin, SandboxConfigMixin from letta.orm.sqlalchemy_base import SqlalchemyBase from letta.schemas.sandbox_config import SandboxConfig as PydanticSandboxConfig -from letta.schemas.sandbox_config import ( - SandboxEnvironmentVariable as PydanticSandboxEnvironmentVariable, -) +from letta.schemas.sandbox_config import SandboxEnvironmentVariable as PydanticSandboxEnvironmentVariable from letta.schemas.sandbox_config import SandboxType if TYPE_CHECKING: diff --git a/letta/orm/sqlalchemy_base.py b/letta/orm/sqlalchemy_base.py index 6879c74b4b..c5240f3c16 100644 --- a/letta/orm/sqlalchemy_base.py +++ b/letta/orm/sqlalchemy_base.py @@ -9,12 +9,7 @@ from letta.log import get_logger from letta.orm.base import Base, CommonSqlalchemyMetaMixins -from letta.orm.errors import ( - DatabaseTimeoutError, - ForeignKeyConstraintViolationError, - NoResultFound, - UniqueConstraintViolationError, -) +from letta.orm.errors import DatabaseTimeoutError, ForeignKeyConstraintViolationError, NoResultFound, UniqueConstraintViolationError from letta.orm.sqlite_functions import adapt_array if TYPE_CHECKING: diff --git a/letta/orm/sqlite_functions.py b/letta/orm/sqlite_functions.py index a5b741aa51..f5957cd6c7 100644 --- a/letta/orm/sqlite_functions.py +++ b/letta/orm/sqlite_functions.py @@ -1,13 +1,14 @@ +import base64 +import sqlite3 from typing import Optional, Union -import base64 import numpy as np from sqlalchemy import event from sqlalchemy.engine import Engine -import sqlite3 from letta.constants import MAX_EMBEDDING_DIM + def adapt_array(arr): """ Converts numpy array to binary for SQLite storage @@ -19,12 +20,13 @@ def adapt_array(arr): arr = np.array(arr, dtype=np.float32) elif not isinstance(arr, np.ndarray): raise ValueError(f"Unsupported type: {type(arr)}") - + # Convert to bytes and then base64 encode bytes_data = arr.tobytes() base64_data = base64.b64encode(bytes_data) return sqlite3.Binary(base64_data) + def convert_array(text): """ Converts binary back to numpy array @@ -38,23 +40,24 @@ def convert_array(text): # Handle both bytes and sqlite3.Binary binary_data = bytes(text) if isinstance(text, sqlite3.Binary) else text - + try: # First decode base64 decoded_data = base64.b64decode(binary_data) # Then convert to numpy array return np.frombuffer(decoded_data, dtype=np.float32) - except Exception as e: + except Exception: return None + def verify_embedding_dimension(embedding: np.ndarray, expected_dim: int = MAX_EMBEDDING_DIM) -> bool: """ Verifies that an embedding has the expected dimension - + Args: embedding: Input embedding array expected_dim: Expected embedding dimension (default: 4096) - + Returns: bool: True if dimension matches, False otherwise """ @@ -62,28 +65,27 @@ def verify_embedding_dimension(embedding: np.ndarray, expected_dim: int = MAX_EM return False return embedding.shape[0] == expected_dim + def validate_and_transform_embedding( - embedding: Union[bytes, sqlite3.Binary, list, np.ndarray], - expected_dim: int = MAX_EMBEDDING_DIM, - dtype: np.dtype = np.float32 + embedding: Union[bytes, sqlite3.Binary, list, np.ndarray], expected_dim: int = MAX_EMBEDDING_DIM, dtype: np.dtype = np.float32 ) -> Optional[np.ndarray]: """ Validates and transforms embeddings to ensure correct dimensionality. - + Args: embedding: Input embedding in various possible formats expected_dim: Expected embedding dimension (default 4096) dtype: NumPy dtype for the embedding (default float32) - + Returns: np.ndarray: Validated and transformed embedding - + Raises: ValueError: If embedding dimension doesn't match expected dimension """ if embedding is None: return None - + # Convert to numpy array based on input type if isinstance(embedding, (bytes, sqlite3.Binary)): vec = convert_array(embedding) @@ -93,48 +95,49 @@ def validate_and_transform_embedding( vec = embedding.astype(dtype) else: raise ValueError(f"Unsupported embedding type: {type(embedding)}") - + # Validate dimension if vec.shape[0] != expected_dim: - raise ValueError( - f"Invalid embedding dimension: got {vec.shape[0]}, expected {expected_dim}" - ) - + raise ValueError(f"Invalid embedding dimension: got {vec.shape[0]}, expected {expected_dim}") + return vec + def cosine_distance(embedding1, embedding2, expected_dim=MAX_EMBEDDING_DIM): """ Calculate cosine distance between two embeddings - + Args: embedding1: First embedding embedding2: Second embedding expected_dim: Expected embedding dimension (default 4096) - + Returns: float: Cosine distance """ - + if embedding1 is None or embedding2 is None: return 0.0 # Maximum distance if either embedding is None - + try: vec1 = validate_and_transform_embedding(embedding1, expected_dim) vec2 = validate_and_transform_embedding(embedding2, expected_dim) - except ValueError as e: + except ValueError: return 0.0 - + similarity = np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2)) distance = float(1.0 - similarity) - + return distance + @event.listens_for(Engine, "connect") def register_functions(dbapi_connection, connection_record): """Register SQLite functions""" if isinstance(dbapi_connection, sqlite3.Connection): dbapi_connection.create_function("cosine_distance", 2, cosine_distance) - + + # Register adapters and converters for numpy arrays sqlite3.register_adapter(np.ndarray, adapt_array) sqlite3.register_converter("ARRAY", convert_array) diff --git a/letta/providers.py b/letta/providers.py index e8ebadfa70..87a7557db1 100644 --- a/letta/providers.py +++ b/letta/providers.py @@ -3,10 +3,7 @@ from pydantic import BaseModel, Field, model_validator from letta.constants import LLM_MAX_TOKENS, MIN_CONTEXT_WINDOW -from letta.llm_api.azure_openai import ( - get_azure_chat_completions_endpoint, - get_azure_embeddings_endpoint, -) +from letta.llm_api.azure_openai import get_azure_chat_completions_endpoint, get_azure_embeddings_endpoint from letta.llm_api.azure_openai_constants import AZURE_MODEL_TO_CONTEXT_LENGTH from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.llm_config import LLMConfig @@ -27,12 +24,11 @@ def get_model_context_window(self, model_name: str) -> Optional[int]: def provider_tag(self) -> str: """String representation of the provider for display purposes""" raise NotImplementedError - + def get_handle(self, model_name: str) -> str: return f"{self.name}/{model_name}" - class LettaProvider(Provider): name: str = "letta" @@ -44,7 +40,7 @@ def list_llm_models(self) -> List[LLMConfig]: model_endpoint_type="openai", model_endpoint="https://inference.memgpt.ai", context_window=16384, - handle=self.get_handle("letta-free") + handle=self.get_handle("letta-free"), ) ] @@ -56,7 +52,7 @@ def list_embedding_models(self): embedding_endpoint="https://embeddings.memgpt.ai", embedding_dim=1024, embedding_chunk_size=300, - handle=self.get_handle("letta-free") + handle=self.get_handle("letta-free"), ) ] @@ -121,7 +117,13 @@ def list_llm_models(self) -> List[LLMConfig]: # continue configs.append( - LLMConfig(model=model_name, model_endpoint_type="openai", model_endpoint=self.base_url, context_window=context_window_size, handle=self.get_handle(model_name)) + LLMConfig( + model=model_name, + model_endpoint_type="openai", + model_endpoint=self.base_url, + context_window=context_window_size, + handle=self.get_handle(model_name), + ) ) # for OpenAI, sort in reverse order @@ -141,7 +143,7 @@ def list_embedding_models(self) -> List[EmbeddingConfig]: embedding_endpoint="https://api.openai.com/v1", embedding_dim=1536, embedding_chunk_size=300, - handle=self.get_handle("text-embedding-ada-002") + handle=self.get_handle("text-embedding-ada-002"), ) ] @@ -170,7 +172,7 @@ def list_llm_models(self) -> List[LLMConfig]: model_endpoint_type="anthropic", model_endpoint=self.base_url, context_window=model["context_window"], - handle=self.get_handle(model["name"]) + handle=self.get_handle(model["name"]), ) ) return configs @@ -203,7 +205,7 @@ def list_llm_models(self) -> List[LLMConfig]: model_endpoint_type="openai", model_endpoint=self.base_url, context_window=model["max_context_length"], - handle=self.get_handle(model["id"]) + handle=self.get_handle(model["id"]), ) ) @@ -259,7 +261,7 @@ def list_llm_models(self) -> List[LLMConfig]: model_endpoint=self.base_url, model_wrapper=self.default_prompt_formatter, context_window=context_window, - handle=self.get_handle(model["name"]) + handle=self.get_handle(model["name"]), ) ) return configs @@ -335,7 +337,7 @@ def list_embedding_models(self) -> List[EmbeddingConfig]: embedding_endpoint=self.base_url, embedding_dim=embedding_dim, embedding_chunk_size=300, - handle=self.get_handle(model["name"]) + handle=self.get_handle(model["name"]), ) ) return configs @@ -356,7 +358,11 @@ def list_llm_models(self) -> List[LLMConfig]: continue configs.append( LLMConfig( - model=model["id"], model_endpoint_type="groq", model_endpoint=self.base_url, context_window=model["context_window"], handle=self.get_handle(model["id"]) + model=model["id"], + model_endpoint_type="groq", + model_endpoint=self.base_url, + context_window=model["context_window"], + handle=self.get_handle(model["id"]), ) ) return configs @@ -424,7 +430,7 @@ def list_llm_models(self) -> List[LLMConfig]: model_endpoint=self.base_url, model_wrapper=self.default_prompt_formatter, context_window=context_window_size, - handle=self.get_handle(model_name) + handle=self.get_handle(model_name), ) ) @@ -505,7 +511,7 @@ def list_llm_models(self): model_endpoint_type="google_ai", model_endpoint=self.base_url, context_window=self.get_model_context_window(model), - handle=self.get_handle(model) + handle=self.get_handle(model), ) ) return configs @@ -529,7 +535,7 @@ def list_embedding_models(self): embedding_endpoint=self.base_url, embedding_dim=768, embedding_chunk_size=300, # NOTE: max is 2048 - handle=self.get_handle(model) + handle=self.get_handle(model), ) ) return configs @@ -559,9 +565,7 @@ def set_default_api_version(cls, values): return values def list_llm_models(self) -> List[LLMConfig]: - from letta.llm_api.azure_openai import ( - azure_openai_get_chat_completion_model_list, - ) + from letta.llm_api.azure_openai import azure_openai_get_chat_completion_model_list model_options = azure_openai_get_chat_completion_model_list(self.base_url, api_key=self.api_key, api_version=self.api_version) configs = [] @@ -570,7 +574,8 @@ def list_llm_models(self) -> List[LLMConfig]: context_window_size = self.get_model_context_window(model_name) model_endpoint = get_azure_chat_completions_endpoint(self.base_url, model_name, self.api_version) configs.append( - LLMConfig(model=model_name, model_endpoint_type="azure", model_endpoint=model_endpoint, context_window=context_window_size), handle=self.get_handle(model_name) + LLMConfig(model=model_name, model_endpoint_type="azure", model_endpoint=model_endpoint, context_window=context_window_size), + handle=self.get_handle(model_name), ) return configs @@ -591,7 +596,7 @@ def list_embedding_models(self) -> List[EmbeddingConfig]: embedding_endpoint=model_endpoint, embedding_dim=768, embedding_chunk_size=300, # NOTE: max is 2048 - handle=self.get_handle(model_name) + handle=self.get_handle(model_name), ) ) return configs @@ -625,7 +630,7 @@ def list_llm_models(self) -> List[LLMConfig]: model_endpoint_type="openai", model_endpoint=self.base_url, context_window=model["max_model_len"], - handle=self.get_handle(model["id"]) + handle=self.get_handle(model["id"]), ) ) return configs @@ -658,7 +663,7 @@ def list_llm_models(self) -> List[LLMConfig]: model_endpoint=self.base_url, model_wrapper=self.default_prompt_formatter, context_window=model["max_model_len"], - handle=self.get_handle(model["id"]) + handle=self.get_handle(model["id"]), ) ) return configs diff --git a/letta/schemas/agent.py b/letta/schemas/agent.py index 03d40350e1..56b2168eff 100644 --- a/letta/schemas/agent.py +++ b/letta/schemas/agent.py @@ -119,6 +119,7 @@ class CreateAgent(BaseModel, validate_assignment=True): # context_window_limit: Optional[int] = Field(None, description="The context window limit used by the agent.") embedding_chunk_size: Optional[int] = Field(DEFAULT_EMBEDDING_CHUNK_SIZE, description="The embedding chunk size used by the agent.") from_template: Optional[str] = Field(None, description="The template id used to configure the agent") + project_id: Optional[str] = Field(None, description="The project id that the agent will be associated with.") @field_validator("name") @classmethod diff --git a/letta/schemas/letta_response.py b/letta/schemas/letta_response.py index 5c60027249..1a1c0b64f5 100644 --- a/letta/schemas/letta_response.py +++ b/letta/schemas/letta_response.py @@ -23,8 +23,26 @@ class LettaResponse(BaseModel): usage (LettaUsageStatistics): The usage statistics """ - messages: List[LettaMessageUnion] = Field(..., description="The messages returned by the agent.") - usage: LettaUsageStatistics = Field(..., description="The usage statistics of the agent.") + messages: List[LettaMessageUnion] = Field( + ..., + description="The messages returned by the agent.", + json_schema_extra={ + "items": { + "oneOf": [ + {"x-ref-name": "SystemMessage"}, + {"x-ref-name": "UserMessage"}, + {"x-ref-name": "ReasoningMessage"}, + {"x-ref-name": "ToolCallMessage"}, + {"x-ref-name": "ToolReturnMessage"}, + {"x-ref-name": "AssistantMessage"}, + ], + "discriminator": {"propertyName": "message_type"}, + } + }, + ) + usage: LettaUsageStatistics = Field( + ..., description="The usage statistics of the agent.", json_schema_extra={"x-ref-name": "LettaUsageStatistics"} + ) def __str__(self): return json_dumps( diff --git a/letta/schemas/message.py b/letta/schemas/message.py index 74bb813567..ea46f3f870 100644 --- a/letta/schemas/message.py +++ b/letta/schemas/message.py @@ -6,24 +6,13 @@ from pydantic import BaseModel, Field, field_validator -from letta.constants import ( - DEFAULT_MESSAGE_TOOL, - DEFAULT_MESSAGE_TOOL_KWARG, - TOOL_CALL_ID_MAX_LEN, -) +from letta.constants import DEFAULT_MESSAGE_TOOL, DEFAULT_MESSAGE_TOOL_KWARG, TOOL_CALL_ID_MAX_LEN from letta.local_llm.constants import INNER_THOUGHTS_KWARG from letta.schemas.enums import MessageRole from letta.schemas.letta_base import OrmMetadataBase -from letta.schemas.letta_message import ( - AssistantMessage, - ToolCall as LettaToolCall, - ToolCallMessage, - ToolReturnMessage, - ReasoningMessage, - LettaMessage, - SystemMessage, - UserMessage, -) +from letta.schemas.letta_message import AssistantMessage, LettaMessage, ReasoningMessage, SystemMessage +from letta.schemas.letta_message import ToolCall as LettaToolCall +from letta.schemas.letta_message import ToolCallMessage, ToolReturnMessage, UserMessage from letta.schemas.openai.chat_completions import ToolCall, ToolCallFunction from letta.utils import get_utc_time, is_utc_datetime, json_dumps diff --git a/letta/schemas/organization.py b/letta/schemas/organization.py index 35784ad0db..f8fc789a37 100644 --- a/letta/schemas/organization.py +++ b/letta/schemas/organization.py @@ -13,7 +13,7 @@ class OrganizationBase(LettaBase): class Organization(OrganizationBase): id: str = OrganizationBase.generate_id_field() - name: str = Field(create_random_username(), description="The name of the organization.") + name: str = Field(create_random_username(), description="The name of the organization.", json_schema_extra={"default": "SincereYogurt"}) created_at: Optional[datetime] = Field(default_factory=get_utc_time, description="The creation date of the organization.") diff --git a/letta/schemas/tool.py b/letta/schemas/tool.py index 997965ab5e..8066f9b2c8 100644 --- a/letta/schemas/tool.py +++ b/letta/schemas/tool.py @@ -4,10 +4,7 @@ from letta.constants import FUNCTION_RETURN_CHAR_LIMIT from letta.functions.functions import derive_openai_json_schema -from letta.functions.helpers import ( - generate_composio_tool_wrapper, - generate_langchain_tool_wrapper, -) +from letta.functions.helpers import generate_composio_tool_wrapper, generate_langchain_tool_wrapper from letta.functions.schema_generator import generate_schema_from_args_schema_v2 from letta.schemas.letta_base import LettaBase from letta.schemas.openai.chat_completions import ToolCall diff --git a/letta/schemas/tool_rule.py b/letta/schemas/tool_rule.py index 259e5452dc..1ab313a7e2 100644 --- a/letta/schemas/tool_rule.py +++ b/letta/schemas/tool_rule.py @@ -25,6 +25,7 @@ class ConditionalToolRule(BaseToolRule): """ A ToolRule that conditionally maps to different child tools based on the output. """ + type: ToolRuleType = ToolRuleType.conditional default_child: Optional[str] = Field(None, description="The default child tool to be called. If None, any tool can be called.") child_output_mapping: Dict[Any, str] = Field(..., description="The output case to check for mapping") diff --git a/letta/schemas/usage.py b/letta/schemas/usage.py index 53cda8b25a..d317cc5b12 100644 --- a/letta/schemas/usage.py +++ b/letta/schemas/usage.py @@ -1,4 +1,5 @@ from typing import Literal + from pydantic import BaseModel, Field @@ -12,6 +13,7 @@ class LettaUsageStatistics(BaseModel): total_tokens (int): The total number of tokens processed by the agent. step_count (int): The number of steps taken by the agent. """ + message_type: Literal["usage_statistics"] = "usage_statistics" completion_tokens: int = Field(0, description="The number of tokens generated by the agent.") prompt_tokens: int = Field(0, description="The number of tokens in the prompt.") diff --git a/letta/server/rest_api/app.py b/letta/server/rest_api/app.py index 8cb9b27e64..63ff9b8b72 100644 --- a/letta/server/rest_api/app.py +++ b/letta/server/rest_api/app.py @@ -15,35 +15,19 @@ from letta.constants import ADMIN_PREFIX, API_PREFIX, OPENAI_API_PREFIX from letta.errors import LettaAgentNotFoundError, LettaUserNotFoundError from letta.log import get_logger -from letta.orm.errors import ( - DatabaseTimeoutError, - ForeignKeyConstraintViolationError, - NoResultFound, - UniqueConstraintViolationError, -) -from letta.schemas.letta_response import LettaResponse +from letta.orm.errors import DatabaseTimeoutError, ForeignKeyConstraintViolationError, NoResultFound, UniqueConstraintViolationError from letta.server.constants import REST_DEFAULT_PORT # NOTE(charles): these are extra routes that are not part of v1 but we still need to mount to pass tests -from letta.server.rest_api.auth.index import ( - setup_auth_router, # TODO: probably remove right? -) +from letta.server.rest_api.auth.index import setup_auth_router # TODO: probably remove right? from letta.server.rest_api.interface import StreamingServerInterface -from letta.server.rest_api.routers.openai.assistants.assistants import ( - router as openai_assistants_router, -) -from letta.server.rest_api.routers.openai.chat_completions.chat_completions import ( - router as openai_chat_completions_router, -) +from letta.server.rest_api.routers.openai.assistants.assistants import router as openai_assistants_router +from letta.server.rest_api.routers.openai.chat_completions.chat_completions import router as openai_chat_completions_router # from letta.orm.utilities import get_db_session # TODO(ethan) reenable once we merge ORM from letta.server.rest_api.routers.v1 import ROUTERS as v1_routes -from letta.server.rest_api.routers.v1.organizations import ( - router as organizations_router, -) -from letta.server.rest_api.routers.v1.users import ( - router as users_router, # TODO: decide on admin -) +from letta.server.rest_api.routers.v1.organizations import router as organizations_router +from letta.server.rest_api.routers.v1.users import router as users_router # TODO: decide on admin from letta.server.rest_api.static_files import mount_static_files from letta.server.server import SyncServer from letta.settings import settings @@ -83,9 +67,6 @@ def generate_openapi_schema(app: FastAPI): openai_docs["info"]["title"] = "OpenAI Assistants API" letta_docs["paths"] = {k: v for k, v in letta_docs["paths"].items() if not k.startswith("/openai")} letta_docs["info"]["title"] = "Letta API" - letta_docs["components"]["schemas"]["LettaResponse"] = { - "properties": LettaResponse.model_json_schema(ref_template="#/components/schemas/LettaResponse/properties/{model}")["$defs"] - } # Split the API docs into Letta API, and OpenAI Assistants compatible API for name, docs in [ diff --git a/letta/server/rest_api/interface.py b/letta/server/rest_api/interface.py index 1e68ce6e2d..9fd8fb1cd2 100644 --- a/letta/server/rest_api/interface.py +++ b/letta/server/rest_api/interface.py @@ -12,22 +12,19 @@ from letta.schemas.enums import MessageStreamStatus from letta.schemas.letta_message import ( AssistantMessage, + LegacyFunctionCallMessage, + LegacyLettaMessage, + LettaMessage, + ReasoningMessage, ToolCall, ToolCallDelta, ToolCallMessage, ToolReturnMessage, - ReasoningMessage, - LegacyFunctionCallMessage, - LegacyLettaMessage, - LettaMessage, ) from letta.schemas.message import Message from letta.schemas.openai.chat_completion_response import ChatCompletionChunkResponse from letta.streaming_interface import AgentChunkStreamingInterface -from letta.streaming_utils import ( - FunctionArgumentsStreamHandler, - JSONInnerThoughtsExtractor, -) +from letta.streaming_utils import FunctionArgumentsStreamHandler, JSONInnerThoughtsExtractor from letta.utils import is_utc_datetime diff --git a/letta/server/rest_api/routers/openai/assistants/schemas.py b/letta/server/rest_api/routers/openai/assistants/schemas.py index b3cbf389c5..07263ff2d4 100644 --- a/letta/server/rest_api/routers/openai/assistants/schemas.py +++ b/letta/server/rest_api/routers/openai/assistants/schemas.py @@ -2,13 +2,7 @@ from pydantic import BaseModel, Field -from letta.schemas.openai.openai import ( - MessageRoleType, - OpenAIMessage, - OpenAIThread, - ToolCall, - ToolCallOutput, -) +from letta.schemas.openai.openai import MessageRoleType, OpenAIMessage, OpenAIThread, ToolCall, ToolCallOutput class CreateAssistantRequest(BaseModel): diff --git a/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py b/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py index deabcaf5c5..4809fa19df 100644 --- a/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py +++ b/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py @@ -4,14 +4,9 @@ from fastapi import APIRouter, Body, Depends, Header, HTTPException from letta.schemas.enums import MessageRole -from letta.schemas.letta_message import ToolCall, LettaMessage +from letta.schemas.letta_message import LettaMessage, ToolCall from letta.schemas.openai.chat_completion_request import ChatCompletionRequest -from letta.schemas.openai.chat_completion_response import ( - ChatCompletionResponse, - Choice, - Message, - UsageStatistics, -) +from letta.schemas.openai.chat_completion_response import ChatCompletionResponse, Choice, Message, UsageStatistics # TODO this belongs in a controller! from letta.server.rest_api.routers.v1.agents import send_message_to_agent diff --git a/letta/server/rest_api/routers/v1/__init__.py b/letta/server/rest_api/routers/v1/__init__.py index 764a78a3e2..0617f4a94b 100644 --- a/letta/server/rest_api/routers/v1/__init__.py +++ b/letta/server/rest_api/routers/v1/__init__.py @@ -3,9 +3,7 @@ from letta.server.rest_api.routers.v1.health import router as health_router from letta.server.rest_api.routers.v1.jobs import router as jobs_router from letta.server.rest_api.routers.v1.llms import router as llm_router -from letta.server.rest_api.routers.v1.sandbox_configs import ( - router as sandbox_configs_router, -) +from letta.server.rest_api.routers.v1.sandbox_configs import router as sandbox_configs_router from letta.server.rest_api.routers.v1.sources import router as sources_router from letta.server.rest_api.routers.v1.tools import router as tools_router diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index 405ab1cf17..986c8512f6 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -3,16 +3,7 @@ from datetime import datetime from typing import List, Optional, Union -from fastapi import ( - APIRouter, - BackgroundTasks, - Body, - Depends, - Header, - HTTPException, - Query, - status, -) +from fastapi import APIRouter, BackgroundTasks, Body, Depends, Header, HTTPException, Query, status from fastapi.responses import JSONResponse, StreamingResponse from pydantic import Field @@ -20,27 +11,13 @@ from letta.log import get_logger from letta.orm.errors import NoResultFound from letta.schemas.agent import AgentState, CreateAgent, UpdateAgent -from letta.schemas.block import ( # , BlockLabelUpdate, BlockLimitUpdate - Block, - BlockUpdate, - CreateBlock, -) +from letta.schemas.block import Block, BlockUpdate, CreateBlock # , BlockLabelUpdate, BlockLimitUpdate from letta.schemas.enums import MessageStreamStatus from letta.schemas.job import Job, JobStatus, JobUpdate -from letta.schemas.letta_message import ( - LegacyLettaMessage, - LettaMessage, - LettaMessageUnion, -) +from letta.schemas.letta_message import LegacyLettaMessage, LettaMessage, LettaMessageUnion from letta.schemas.letta_request import LettaRequest, LettaStreamingRequest from letta.schemas.letta_response import LettaResponse -from letta.schemas.memory import ( - ArchivalMemorySummary, - ContextWindowOverview, - CreateArchivalMemory, - Memory, - RecallMemorySummary, -) +from letta.schemas.memory import ArchivalMemorySummary, ContextWindowOverview, CreateArchivalMemory, Memory, RecallMemorySummary from letta.schemas.message import Message, MessageCreate, MessageUpdate from letta.schemas.passage import Passage from letta.schemas.source import Source @@ -193,7 +170,7 @@ def get_agent_state( raise HTTPException(status_code=404, detail=str(e)) -@router.delete("/{agent_id}", response_model=AgentState, operation_id="delete_agent") +@router.delete("/{agent_id}", response_model=None, operation_id="delete_agent") def delete_agent( agent_id: str, server: "SyncServer" = Depends(get_letta_server), @@ -204,7 +181,8 @@ def delete_agent( """ actor = server.user_manager.get_user_or_default(user_id=user_id) try: - return server.agent_manager.delete_agent(agent_id=agent_id, actor=actor) + server.agent_manager.delete_agent(agent_id=agent_id, actor=actor) + return JSONResponse(status_code=status.HTTP_200_OK, content={"message": f"Agent id={agent_id} successfully deleted"}) except NoResultFound: raise HTTPException(status_code=404, detail=f"Agent agent_id={agent_id} not found for user_id={actor.id}.") @@ -343,7 +321,12 @@ def update_agent_memory_block( actor = server.user_manager.get_user_or_default(user_id=user_id) block = server.agent_manager.get_block_with_label(agent_id=agent_id, block_label=block_label, actor=actor) - return server.block_manager.update_block(block.id, block_update=block_update, actor=actor) + block = server.block_manager.update_block(block.id, block_update=block_update, actor=actor) + + # This should also trigger a system prompt change in the agent + server.agent_manager.rebuild_system_prompt(agent_id=agent_id, actor=actor, force=True, update_timestamp=False) + + return block @router.get("/{agent_id}/memory/recall", response_model=RecallMemorySummary, operation_id="get_agent_recall_memory_summary") diff --git a/letta/server/rest_api/routers/v1/sandbox_configs.py b/letta/server/rest_api/routers/v1/sandbox_configs.py index bf06bae740..436d9b8e8e 100644 --- a/letta/server/rest_api/routers/v1/sandbox_configs.py +++ b/letta/server/rest_api/routers/v1/sandbox_configs.py @@ -5,11 +5,7 @@ from letta.schemas.sandbox_config import SandboxConfig as PydanticSandboxConfig from letta.schemas.sandbox_config import SandboxConfigCreate, SandboxConfigUpdate from letta.schemas.sandbox_config import SandboxEnvironmentVariable as PydanticEnvVar -from letta.schemas.sandbox_config import ( - SandboxEnvironmentVariableCreate, - SandboxEnvironmentVariableUpdate, - SandboxType, -) +from letta.schemas.sandbox_config import SandboxEnvironmentVariableCreate, SandboxEnvironmentVariableUpdate, SandboxType from letta.server.rest_api.utils import get_letta_server, get_user_id from letta.server.server import SyncServer diff --git a/letta/server/rest_api/routers/v1/sources.py b/letta/server/rest_api/routers/v1/sources.py index fb48d125ca..59b933cfcb 100644 --- a/letta/server/rest_api/routers/v1/sources.py +++ b/letta/server/rest_api/routers/v1/sources.py @@ -2,15 +2,7 @@ import tempfile from typing import List, Optional -from fastapi import ( - APIRouter, - BackgroundTasks, - Depends, - Header, - HTTPException, - Query, - UploadFile, -) +from fastapi import APIRouter, BackgroundTasks, Depends, Header, HTTPException, Query, UploadFile from letta.schemas.file import FileMetadata from letta.schemas.job import Job diff --git a/letta/server/rest_api/utils.py b/letta/server/rest_api/utils.py index 86a8899043..bb5dc03407 100644 --- a/letta/server/rest_api/utils.py +++ b/letta/server/rest_api/utils.py @@ -102,6 +102,7 @@ def get_user_id(user_id: Optional[str] = Header(None, alias="user_id")) -> Optio def get_current_interface() -> StreamingServerInterface: return StreamingServerInterface + def log_error_to_sentry(e): import traceback diff --git a/letta/server/server.py b/letta/server/server.py index 85aee52b2c..a619463ab3 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -49,15 +49,11 @@ from letta.schemas.job import Job, JobUpdate from letta.schemas.letta_message import LettaMessage, ToolReturnMessage from letta.schemas.llm_config import LLMConfig -from letta.schemas.memory import ( - ArchivalMemorySummary, - ContextWindowOverview, - Memory, - RecallMemorySummary, -) +from letta.schemas.memory import ArchivalMemorySummary, ContextWindowOverview, Memory, RecallMemorySummary from letta.schemas.message import Message, MessageCreate, MessageRole, MessageUpdate from letta.schemas.organization import Organization from letta.schemas.passage import Passage +from letta.schemas.sandbox_config import SandboxEnvironmentVariableCreate, SandboxType from letta.schemas.source import Source from letta.schemas.tool import Tool from letta.schemas.usage import LettaUsageStatistics @@ -303,6 +299,17 @@ def __init__( self.block_manager.add_default_blocks(actor=self.default_user) self.tool_manager.upsert_base_tools(actor=self.default_user) + # Add composio keys to the tool sandbox env vars of the org + if tool_settings.composio_api_key: + manager = SandboxConfigManager(tool_settings) + sandbox_config = manager.get_or_create_default_sandbox_config(sandbox_type=SandboxType.LOCAL, actor=self.default_user) + + manager.create_sandbox_env_var( + SandboxEnvironmentVariableCreate(key="COMPOSIO_API_KEY", value=tool_settings.composio_api_key), + sandbox_config_id=sandbox_config.id, + actor=self.default_user, + ) + # collect providers (always has Letta as a default) self._enabled_providers: List[Provider] = [LettaProvider()] if model_settings.openai_api_key: diff --git a/letta/services/agent_manager.py b/letta/services/agent_manager.py index 8f23e42a93..adad82fdbe 100644 --- a/letta/services/agent_manager.py +++ b/letta/services/agent_manager.py @@ -279,7 +279,7 @@ def get_agent_by_name(self, agent_name: str, actor: PydanticUser) -> PydanticAge return agent.to_pydantic() @enforce_types - def delete_agent(self, agent_id: str, actor: PydanticUser) -> PydanticAgentState: + def delete_agent(self, agent_id: str, actor: PydanticUser) -> None: """ Deletes an agent and its associated relationships. Ensures proper permission checks and cascades where applicable. @@ -288,15 +288,13 @@ def delete_agent(self, agent_id: str, actor: PydanticUser) -> PydanticAgentState agent_id: ID of the agent to be deleted. actor: User performing the action. - Returns: - PydanticAgentState: The deleted agent state + Raises: + NoResultFound: If agent doesn't exist """ with self.session_maker() as session: # Retrieve the agent agent = AgentModel.read(db_session=session, identifier=agent_id, actor=actor) - agent_state = agent.to_pydantic() agent.hard_delete(session) - return agent_state # ====================================================================================================================== # In Context Messages Management diff --git a/letta/services/passage_manager.py b/letta/services/passage_manager.py index d8554063b3..f80e016023 100644 --- a/letta/services/passage_manager.py +++ b/letta/services/passage_manager.py @@ -1,21 +1,15 @@ -from typing import List, Optional from datetime import datetime -import numpy as np - -from sqlalchemy import select, union_all, literal +from typing import List, Optional -from letta.constants import MAX_EMBEDDING_DIM from letta.embeddings import embedding_model, parse_and_chunk_text from letta.orm.errors import NoResultFound from letta.orm.passage import AgentPassage, SourcePassage from letta.schemas.agent import AgentState -from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.passage import Passage as PydanticPassage from letta.schemas.user import User as PydanticUser from letta.utils import enforce_types - class PassageManager: """Manager class to handle business logic related to Passages.""" diff --git a/letta/services/sandbox_config_manager.py b/letta/services/sandbox_config_manager.py index 010ae400c8..9e47612ee0 100644 --- a/letta/services/sandbox_config_manager.py +++ b/letta/services/sandbox_config_manager.py @@ -9,11 +9,7 @@ from letta.schemas.sandbox_config import SandboxConfig as PydanticSandboxConfig from letta.schemas.sandbox_config import SandboxConfigCreate, SandboxConfigUpdate from letta.schemas.sandbox_config import SandboxEnvironmentVariable as PydanticEnvVar -from letta.schemas.sandbox_config import ( - SandboxEnvironmentVariableCreate, - SandboxEnvironmentVariableUpdate, - SandboxType, -) +from letta.schemas.sandbox_config import SandboxEnvironmentVariableCreate, SandboxEnvironmentVariableUpdate, SandboxType from letta.schemas.user import User as PydanticUser from letta.utils import enforce_types, printd diff --git a/letta/services/tool_execution_sandbox.py b/letta/services/tool_execution_sandbox.py index fc6e1bdd38..1060af43db 100644 --- a/letta/services/tool_execution_sandbox.py +++ b/letta/services/tool_execution_sandbox.py @@ -127,7 +127,7 @@ def run_local_dir_sandbox(self, agent_state: AgentState) -> SandboxRunResult: if local_configs.use_venv: return self.run_local_dir_sandbox_venv(sbx_config, env, temp_file_path) else: - return self.run_local_dir_sandbox_runpy(sbx_config, env_vars, temp_file_path) + return self.run_local_dir_sandbox_runpy(sbx_config, env, temp_file_path) except Exception as e: logger.error(f"Executing tool {self.tool_name} has an unexpected error: {e}") logger.error(f"Logging out tool {self.tool_name} auto-generated code for debugging: \n\n{code}") @@ -200,7 +200,7 @@ def run_local_dir_sandbox_venv(self, sbx_config: SandboxConfig, env: Dict[str, s logger.error(f"Executing tool {self.tool_name} has an unexpected error: {e}") raise e - def run_local_dir_sandbox_runpy(self, sbx_config: SandboxConfig, env_vars: Dict[str, str], temp_file_path: str) -> SandboxRunResult: + def run_local_dir_sandbox_runpy(self, sbx_config: SandboxConfig, env: Dict[str, str], temp_file_path: str) -> SandboxRunResult: status = "success" agent_state, stderr = None, None @@ -213,8 +213,8 @@ def run_local_dir_sandbox_runpy(self, sbx_config: SandboxConfig, env_vars: Dict[ try: # Execute the temp file - with self.temporary_env_vars(env_vars): - result = runpy.run_path(temp_file_path, init_globals=env_vars) + with self.temporary_env_vars(env): + result = runpy.run_path(temp_file_path, init_globals=env) # Fetch the result func_result = result.get(self.LOCAL_SANDBOX_RESULT_VAR_NAME) @@ -277,6 +277,10 @@ def run_e2b_sandbox(self, agent_state: AgentState) -> SandboxRunResult: sbx_config = self.sandbox_config_manager.get_or_create_default_sandbox_config(sandbox_type=SandboxType.E2B, actor=self.user) sbx = self.get_running_e2b_sandbox_with_same_state(sbx_config) if not sbx or self.force_recreate: + if not sbx: + logger.info(f"No running e2b sandbox found with the same state: {sbx_config}") + else: + logger.info(f"Force recreated e2b sandbox with state: {sbx_config}") sbx = self.create_e2b_sandbox_with_metadata_hash(sandbox_config=sbx_config) # Since this sandbox was used, we extend its lifecycle by the timeout @@ -292,6 +296,8 @@ def run_e2b_sandbox(self, agent_state: AgentState) -> SandboxRunResult: func_return, agent_state = self.parse_best_effort(execution.results[0].text) elif execution.error: logger.error(f"Executing tool {self.tool_name} failed with {execution.error}") + logger.error(f"E2B Sandbox configurations: {sbx_config}") + logger.error(f"E2B Sandbox ID: {sbx.sandbox_id}") func_return = get_friendly_error_msg( function_name=self.tool_name, exception_name=execution.error.name, exception_message=execution.error.value ) diff --git a/letta/settings.py b/letta/settings.py index 1b6ba44bbe..03c6f86dc1 100644 --- a/letta/settings.py +++ b/letta/settings.py @@ -60,7 +60,13 @@ class ModelSettings(BaseSettings): openllm_api_key: Optional[str] = None -cors_origins = ["http://letta.localhost", "http://localhost:8283", "http://localhost:8083", "http://localhost:3000"] +cors_origins = [ + "http://letta.localhost", + "http://localhost:8283", + "http://localhost:8083", + "http://localhost:3000", + "http://localhost:4200", +] class Settings(BaseSettings): diff --git a/letta/streaming_interface.py b/letta/streaming_interface.py index e21e5e73e1..2949b94e4c 100644 --- a/letta/streaming_interface.py +++ b/letta/streaming_interface.py @@ -9,15 +9,9 @@ from rich.markup import escape from letta.interface import CLIInterface -from letta.local_llm.constants import ( - ASSISTANT_MESSAGE_CLI_SYMBOL, - INNER_THOUGHTS_CLI_SYMBOL, -) +from letta.local_llm.constants import ASSISTANT_MESSAGE_CLI_SYMBOL, INNER_THOUGHTS_CLI_SYMBOL from letta.schemas.message import Message -from letta.schemas.openai.chat_completion_response import ( - ChatCompletionChunkResponse, - ChatCompletionResponse, -) +from letta.schemas.openai.chat_completion_response import ChatCompletionChunkResponse, ChatCompletionResponse # init(autoreset=True) diff --git a/letta/utils.py b/letta/utils.py index 4be8a543fb..5d2eb51393 100644 --- a/letta/utils.py +++ b/letta/utils.py @@ -1120,6 +1120,7 @@ def sanitize_filename(filename: str) -> str: # Return the sanitized filename return sanitized_filename + def get_friendly_error_msg(function_name: str, exception_name: str, exception_message: str): from letta.constants import MAX_ERROR_MESSAGE_CHAR_LIMIT diff --git a/poetry.lock b/poetry.lock index 80453badc6..944859c0fe 100644 --- a/poetry.lock +++ b/poetry.lock @@ -726,13 +726,13 @@ test = ["pytest"] [[package]] name = "composio-core" -version = "0.6.3" +version = "0.6.7" description = "Core package to act as a bridge between composio platform and other services." optional = false python-versions = "<4,>=3.9" files = [ - {file = "composio_core-0.6.3-py3-none-any.whl", hash = "sha256:981a9856781b791242f947a9685a18974d8a012ac7fab2c09438e1b19610d6a2"}, - {file = "composio_core-0.6.3.tar.gz", hash = "sha256:13098b20d8832e74453ca194889305c935432156fc07be91dfddf76561ad591b"}, + {file = "composio_core-0.6.7-py3-none-any.whl", hash = "sha256:03cedeffe417b919d1021c1bc4751f54bd05829b52ff3285f7984e14bdf91efe"}, + {file = "composio_core-0.6.7.tar.gz", hash = "sha256:b87f0b804d87945b4eae556468b9efc75f751d256bbf2c20fb8ae5b6a31a2818"}, ] [package.dependencies] @@ -762,13 +762,13 @@ tools = ["diskcache", "flake8", "networkx", "pathspec", "pygments", "ruff", "tra [[package]] name = "composio-langchain" -version = "0.6.3" +version = "0.6.7" description = "Use Composio to get an array of tools with your LangChain agent." optional = false python-versions = "<4,>=3.9" files = [ - {file = "composio_langchain-0.6.3-py3-none-any.whl", hash = "sha256:0e749a1603dc0562293412d0a6429f88b75152b01a313cca859732070d762a6b"}, - {file = "composio_langchain-0.6.3.tar.gz", hash = "sha256:2036f94bfe60974b31f2be0bfdb33dd75a1d43435f275141219b3376587bf49d"}, + {file = "composio_langchain-0.6.7-py3-none-any.whl", hash = "sha256:f8653b6a7e6b03a61b679a096e278744d3009ebaf3741d7e24e5120a364f212e"}, + {file = "composio_langchain-0.6.7.tar.gz", hash = "sha256:adeab3a87b0e6eb7e96048cef6b988dbe699b6a493a82fac2d371ab940e7e54e"}, ] [package.dependencies] @@ -6246,4 +6246,4 @@ tests = ["wikipedia"] [metadata] lock-version = "2.0" python-versions = "<4.0,>=3.10" -content-hash = "4a7cf176579d5dc15648979542da152ec98290f1e9f39039cfe9baf73bc1076f" +content-hash = "1c52219049a4470dd54a45318b22495a4cafa29e93a1c5369a0d54da71990adb" diff --git a/project.json b/project.json new file mode 100644 index 0000000000..18b70617bf --- /dev/null +++ b/project.json @@ -0,0 +1,82 @@ +{ + "name": "core", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "application", + "sourceRoot": "apps/core", + "targets": { + "lock": { + "executor": "@nxlv/python:run-commands", + "options": { + "command": "poetry lock --no-update", + "cwd": "apps/core" + } + }, + "add": { + "executor": "@nxlv/python:add", + "options": {} + }, + "update": { + "executor": "@nxlv/python:update", + "options": {} + }, + "remove": { + "executor": "@nxlv/python:remove", + "options": {} + }, + "dev": { + "executor": "@nxlv/python:run-commands", + "options": { + "command": "poetry run letta server", + "cwd": "apps/core" + } + }, + "build": { + "executor": "@nxlv/python:build", + "outputs": ["{projectRoot}/dist"], + "options": { + "outputPath": "apps/core/dist", + "publish": false, + "lockedVersions": true, + "bundleLocalDependencies": true + } + }, + "install": { + "executor": "@nxlv/python:run-commands", + "options": { + "command": "poetry install --all-extras", + "cwd": "apps/core" + } + }, + "lint": { + "executor": "@nxlv/python:run-commands", + "options": { + "command": "poetry run isort --profile black . && poetry run black . && poetry run autoflake --remove-all-unused-imports --remove-unused-variables --in-place --recursive --ignore-init-module-imports .", + "cwd": "apps/core" + } + }, + "database:migrate": { + "executor": "@nxlv/python:run-commands", + "options": { + "command": "poetry run alembic upgrade head", + "cwd": "apps/core" + } + }, + "test": { + "executor": "@nxlv/python:run-commands", + "outputs": [ + "{workspaceRoot}/reports/apps/core/unittests", + "{workspaceRoot}/coverage/apps/core" + ], + "options": { + "command": "poetry run pytest tests/", + "cwd": "apps/core" + } + } + }, + "tags": [], + "release": { + "version": { + "generator": "@nxlv/python:release-version" + } + } +} diff --git a/pyproject.toml b/pyproject.toml index 0a8c73325b..074bd2569e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,8 +59,8 @@ nltk = "^3.8.1" jinja2 = "^3.1.4" locust = {version = "^2.31.5", optional = true} wikipedia = {version = "^1.4.0", optional = true} -composio-langchain = "^0.6.3" -composio-core = "^0.6.3" +composio-langchain = "^0.6.7" +composio-core = "^0.6.7" alembic = "^1.13.3" pyhumps = "^3.8.0" psycopg2 = {version = "^2.9.10", optional = true} @@ -85,7 +85,7 @@ qdrant = ["qdrant-client"] cloud-tool-sandbox = ["e2b-code-interpreter"] external-tools = ["docker", "langchain", "wikipedia", "langchain-community"] tests = ["wikipedia"] -all = ["pgvector", "pg8000", "psycopg2-binary", "psycopg2", "pytest", "pytest-asyncio", "pexpect", "black", "pre-commit", "datasets", "pyright", "pytest-order", "autoflake", "isort", "websockets", "fastapi", "uvicorn", "llama-index-embeddings-ollama", "docker", "langchain", "wikipedia", "langchain-community", "locust"] +all = ["pgvector", "pg8000", "psycopg2-binary", "psycopg2", "pytest", "pytest-asyncio", "pexpect", "black", "pre-commit", "datasets", "pyright", "pytest-order", "autoflake", "isort", "websockets", "fastapi", "uvicorn", "docker", "langchain", "wikipedia", "langchain-community", "locust"] [tool.poetry.group.dev.dependencies] black = "^24.4.2" @@ -100,3 +100,11 @@ extend-exclude = "examples/*" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" + +[tool.isort] +profile = "black" +line_length = 140 +multi_line_output = 3 +include_trailing_comma = true +force_grid_wrap = 0 +use_parentheses = true diff --git a/tests/helpers/endpoints_helper.py b/tests/helpers/endpoints_helper.py index eb55aaedac..8001490393 100644 --- a/tests/helpers/endpoints_helper.py +++ b/tests/helpers/endpoints_helper.py @@ -14,12 +14,7 @@ from letta.config import LettaConfig from letta.constants import DEFAULT_HUMAN, DEFAULT_PERSONA from letta.embeddings import embedding_model -from letta.errors import ( - InvalidInnerMonologueError, - InvalidToolCallError, - MissingInnerMonologueError, - MissingToolCallError, -) +from letta.errors import InvalidInnerMonologueError, InvalidToolCallError, MissingInnerMonologueError, MissingToolCallError from letta.llm_api.llm_api_tools import create from letta.local_llm.constants import INNER_THOUGHTS_KWARG from letta.schemas.agent import AgentState @@ -28,12 +23,7 @@ from letta.schemas.letta_response import LettaResponse from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import ChatMemory -from letta.schemas.openai.chat_completion_response import ( - ChatCompletionResponse, - Choice, - FunctionCall, - Message, -) +from letta.schemas.openai.chat_completion_response import ChatCompletionResponse, Choice, FunctionCall, Message from letta.utils import get_human_text, get_persona_text, json_dumps from tests.helpers.utils import cleanup diff --git a/tests/integration_test_agent_tool_graph.py b/tests/integration_test_agent_tool_graph.py index bec040771b..654d4a9e91 100644 --- a/tests/integration_test_agent_tool_graph.py +++ b/tests/integration_test_agent_tool_graph.py @@ -5,12 +5,7 @@ from letta import create_client from letta.schemas.letta_message import ToolCallMessage -from letta.schemas.tool_rule import ( - ChildToolRule, - ConditionalToolRule, - InitToolRule, - TerminalToolRule, -) +from letta.schemas.tool_rule import ChildToolRule, ConditionalToolRule, InitToolRule, TerminalToolRule from tests.helpers.endpoints_helper import ( assert_invoked_function_call, assert_invoked_send_message_with_keyword, diff --git a/tests/integration_test_composio.py b/tests/integration_test_composio.py new file mode 100644 index 0000000000..1b2c2e3f8a --- /dev/null +++ b/tests/integration_test_composio.py @@ -0,0 +1,28 @@ +import pytest +from fastapi.testclient import TestClient + +from letta.server.rest_api.app import app + + +@pytest.fixture +def client(): + return TestClient(app) + + +def test_list_composio_apps(client): + response = client.get("/v1/tools/composio/apps") + assert response.status_code == 200 + assert isinstance(response.json(), list) + + +def test_list_composio_actions_by_app(client): + response = client.get("/v1/tools/composio/apps/github/actions") + assert response.status_code == 200 + assert isinstance(response.json(), list) + + +def test_add_composio_tool(client): + response = client.post("/v1/tools/composio/GITHUB_STAR_A_REPOSITORY_FOR_THE_AUTHENTICATED_USER") + assert response.status_code == 200 + assert "id" in response.json() + assert "name" in response.json() diff --git a/tests/integration_test_tool_execution_sandbox.py b/tests/integration_test_tool_execution_sandbox.py index 299e1e967b..3f64b28740 100644 --- a/tests/integration_test_tool_execution_sandbox.py +++ b/tests/integration_test_tool_execution_sandbox.py @@ -212,9 +212,7 @@ def clear_memory(agent_state: AgentState): @pytest.fixture def external_codebase_tool(test_user): - from tests.test_tool_sandbox.restaurant_management_system.adjust_menu_prices import ( - adjust_menu_prices, - ) + from tests.test_tool_sandbox.restaurant_management_system.adjust_menu_prices import adjust_menu_prices tool = create_tool_from_func(adjust_menu_prices) tool = ToolManager().create_or_update_tool(tool, test_user) @@ -353,6 +351,14 @@ def test_local_sandbox_e2e_composio_star_github(mock_e2b_api_key_none, check_com assert result.func_return["details"] == "Action executed successfully" +@pytest.mark.local_sandbox +def test_local_sandbox_e2e_composio_star_github_without_setting_db_env_vars( + mock_e2b_api_key_none, check_composio_key_set, composio_github_star_tool, test_user +): + result = ToolExecutionSandbox(composio_github_star_tool.name, {"owner": "letta-ai", "repo": "letta"}, user=test_user).run() + assert result.func_return["details"] == "Action executed successfully" + + @pytest.mark.local_sandbox def test_local_sandbox_external_codebase(mock_e2b_api_key_none, custom_test_sandbox_config, external_codebase_tool, test_user): # Set the args @@ -458,7 +464,7 @@ def test_e2b_sandbox_inject_env_var_existing_sandbox(check_e2b_key_is_set, get_e config = manager.create_or_update_sandbox_config(config_create, test_user) # Run the custom sandbox once, assert nothing returns because missing env variable - sandbox = ToolExecutionSandbox(get_env_tool.name, {}, user=test_user, force_recreate=True) + sandbox = ToolExecutionSandbox(get_env_tool.name, {}, user=test_user) result = sandbox.run() # response should be None assert result.func_return is None diff --git a/tests/test_cli.py b/tests/test_cli.py index 7b2ffae107..c6497f5017 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -5,10 +5,7 @@ import pexpect import pytest -from letta.local_llm.constants import ( - ASSISTANT_MESSAGE_CLI_SYMBOL, - INNER_THOUGHTS_CLI_SYMBOL, -) +from letta.local_llm.constants import ASSISTANT_MESSAGE_CLI_SYMBOL, INNER_THOUGHTS_CLI_SYMBOL original_letta_path = os.path.expanduser("~/.letta") backup_letta_path = os.path.expanduser("~/.letta_backup") diff --git a/tests/test_client.py b/tests/test_client.py index ac0f4f1876..5db67157f1 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -43,7 +43,7 @@ def run_server(): @pytest.fixture( params=[{"server": False}, {"server": True}], # whether to use REST API server - # params=[{"server": True}], # whether to use REST API server + # params=[{"server": False}], # whether to use REST API server scope="module", ) def client(request): @@ -341,7 +341,9 @@ def test_messages(client: Union[LocalClient, RESTClient], agent: AgentState): def test_send_system_message(client: Union[LocalClient, RESTClient], agent: AgentState): """Important unit test since the Letta API exposes sending system messages, but some backends don't natively support it (eg Anthropic)""" - send_system_message_response = client.send_message(agent_id=agent.id, message="Event occurred: The user just logged off.", role="system") + send_system_message_response = client.send_message( + agent_id=agent.id, message="Event occurred: The user just logged off.", role="system" + ) assert send_system_message_response, "Sending message failed" @@ -390,7 +392,7 @@ def always_error(): """ Always throw an error. """ - return 5/0 + return 5 / 0 tool = client.create_or_update_tool(func=always_error) agent = client.create_agent(tool_ids=[tool.id]) @@ -406,12 +408,13 @@ def always_error(): assert response_message, "ToolReturnMessage message not found in response" assert response_message.status == "error" + if isinstance(client, RESTClient): assert response_message.tool_return == "Error executing function always_error: ZeroDivisionError: division by zero" else: response_json = json.loads(response_message.tool_return) - assert response_json['status'] == "Failed" - assert response_json['message'] == "Error executing function always_error: ZeroDivisionError: division by zero" + assert response_json["status"] == "Failed" + assert response_json["message"] == "Error executing function always_error: ZeroDivisionError: division by zero" client.delete_agent(agent_id=agent.id) diff --git a/tests/test_server.py b/tests/test_server.py index c2b77ea883..fe0fcdc441 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -9,14 +9,7 @@ from letta.constants import BASE_MEMORY_TOOLS, BASE_TOOLS from letta.schemas.block import CreateBlock from letta.schemas.enums import MessageRole -from letta.schemas.letta_message import ( - LettaMessage, - ReasoningMessage, - SystemMessage, - ToolCallMessage, - ToolReturnMessage, - UserMessage, -) +from letta.schemas.letta_message import LettaMessage, ReasoningMessage, SystemMessage, ToolCallMessage, ToolReturnMessage, UserMessage from letta.schemas.user import User utils.DEBUG = True diff --git a/tests/test_tool_rule_solver.py b/tests/test_tool_rule_solver.py index c524d53a34..dcb66e1b12 100644 --- a/tests/test_tool_rule_solver.py +++ b/tests/test_tool_rule_solver.py @@ -2,12 +2,7 @@ from letta.helpers import ToolRulesSolver from letta.helpers.tool_rule_solver import ToolRuleValidationError -from letta.schemas.tool_rule import ( - ChildToolRule, - ConditionalToolRule, - InitToolRule, - TerminalToolRule -) +from letta.schemas.tool_rule import ChildToolRule, ConditionalToolRule, InitToolRule, TerminalToolRule # Constants for tool names used in the tests START_TOOL = "start_tool" @@ -113,11 +108,7 @@ def test_conditional_tool_rule(): # Setup: Define a conditional tool rule init_rule = InitToolRule(tool_name=START_TOOL) terminal_rule = TerminalToolRule(tool_name=END_TOOL) - rule = ConditionalToolRule( - tool_name=START_TOOL, - default_child=None, - child_output_mapping={True: END_TOOL, False: START_TOOL} - ) + rule = ConditionalToolRule(tool_name=START_TOOL, default_child=None, child_output_mapping={True: END_TOOL, False: START_TOOL}) solver = ToolRulesSolver(tool_rules=[init_rule, rule, terminal_rule]) # Action & Assert: Verify the rule properties @@ -126,8 +117,12 @@ def test_conditional_tool_rule(): # Step 2: After using 'start_tool' solver.update_tool_usage(START_TOOL) - assert solver.get_allowed_tool_names(last_function_response='{"message": "true"}') == [END_TOOL], "After 'start_tool' returns true, should allow 'end_tool'" - assert solver.get_allowed_tool_names(last_function_response='{"message": "false"}') == [START_TOOL], "After 'start_tool' returns false, should allow 'start_tool'" + assert solver.get_allowed_tool_names(last_function_response='{"message": "true"}') == [ + END_TOOL + ], "After 'start_tool' returns true, should allow 'end_tool'" + assert solver.get_allowed_tool_names(last_function_response='{"message": "false"}') == [ + START_TOOL + ], "After 'start_tool' returns false, should allow 'start_tool'" # Step 3: After using 'end_tool' assert solver.is_terminal_tool(END_TOOL) is True, "Should recognize 'end_tool' as terminal" @@ -137,11 +132,7 @@ def test_invalid_conditional_tool_rule(): # Setup: Define an invalid conditional tool rule init_rule = InitToolRule(tool_name=START_TOOL) terminal_rule = TerminalToolRule(tool_name=END_TOOL) - invalid_rule_1 = ConditionalToolRule( - tool_name=START_TOOL, - default_child=END_TOOL, - child_output_mapping={} - ) + invalid_rule_1 = ConditionalToolRule(tool_name=START_TOOL, default_child=END_TOOL, child_output_mapping={}) # Test 1: Missing child output mapping with pytest.raises(ToolRuleValidationError, match="Conditional tool rule must have at least one child tool."): diff --git a/tests/test_tool_sandbox/restaurant_management_system/adjust_menu_prices.py b/tests/test_tool_sandbox/restaurant_management_system/adjust_menu_prices.py index 1e5c090e6b..57adc16395 100644 --- a/tests/test_tool_sandbox/restaurant_management_system/adjust_menu_prices.py +++ b/tests/test_tool_sandbox/restaurant_management_system/adjust_menu_prices.py @@ -8,6 +8,7 @@ def adjust_menu_prices(percentage: float) -> str: str: A formatted string summarizing the price adjustments. """ import cowsay + from core.menu import Menu, MenuItem # Import a class from the codebase from core.utils import format_currency # Use a utility function to test imports diff --git a/tests/test_tool_schema_parsing.py b/tests/test_tool_schema_parsing.py index f6738a06f0..fd35be5f25 100644 --- a/tests/test_tool_schema_parsing.py +++ b/tests/test_tool_schema_parsing.py @@ -5,6 +5,7 @@ from letta.functions.functions import derive_openai_json_schema from letta.llm_api.helpers import convert_to_structured_output, make_post_request +from letta.schemas.tool import ToolCreate def _clean_diff(d1, d2): @@ -176,3 +177,38 @@ def test_valid_schemas_via_openai(openai_model: str, structured_output: bool): _openai_payload(openai_model, schema, structured_output) else: _openai_payload(openai_model, schema, structured_output) + + +@pytest.mark.parametrize("openai_model", ["gpt-4o-mini"]) +@pytest.mark.parametrize("structured_output", [True]) +def test_composio_tool_schema_generation(openai_model: str, structured_output: bool): + """Test that we can generate the schemas for some Composio tools.""" + + if not os.getenv("COMPOSIO_API_KEY"): + pytest.skip("COMPOSIO_API_KEY not set") + + try: + import composio + except ImportError: + pytest.skip("Composio not installed") + + for action_name in [ + "CAL_GET_AVAILABLE_SLOTS_INFO", # has an array arg, needs to be converted properly + ]: + try: + tool_create = ToolCreate.from_composio(action_name=action_name) + except composio.exceptions.ComposioSDKError: + # e.g. "composio.exceptions.ComposioSDKError: No connected account found for app `CAL`; Run `composio add cal` to fix this" + pytest.skip(f"Composio account not configured to use action_name {action_name}") + + print(tool_create) + + assert tool_create.json_schema + schema = tool_create.json_schema + + try: + _openai_payload(openai_model, schema, structured_output) + print(f"Successfully called OpenAI using schema {schema} generated from {action_name}") + except: + print(f"Failed to call OpenAI using schema {schema} generated from {action_name}") + raise diff --git a/tests/test_v1_routes.py b/tests/test_v1_routes.py index 2865bb2ec4..5093fe93b3 100644 --- a/tests/test_v1_routes.py +++ b/tests/test_v1_routes.py @@ -1,12 +1,7 @@ from unittest.mock import MagicMock, Mock, patch import pytest -from composio.client.collections import ( - ActionModel, - ActionParametersModel, - ActionResponseModel, - AppModel, -) +from composio.client.collections import ActionModel, ActionParametersModel, ActionResponseModel, AppModel from fastapi.testclient import TestClient from letta.schemas.tool import ToolCreate, ToolUpdate From 7af4140edada37aeb700007c99116b8c38cd7141 Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Tue, 31 Dec 2024 12:02:01 +0400 Subject: [PATCH 171/280] chore: bump version to 0.6.7 (#2321) --- letta/__init__.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/letta/__init__.py b/letta/__init__.py index 46390abe5a..e67194c6f6 100644 --- a/letta/__init__.py +++ b/letta/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.6.6" +__version__ = "0.6.7" # import clients from letta.client.client import LocalClient, RESTClient, create_client diff --git a/pyproject.toml b/pyproject.toml index 074bd2569e..8a487c1e65 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "letta" -version = "0.6.6" +version = "0.6.7" packages = [ {include = "letta"} ] From 593c23901825d0f14d44805857a73dd0d2ccd06d Mon Sep 17 00:00:00 2001 From: Nuno Rocha Date: Wed, 1 Jan 2025 12:22:30 +0100 Subject: [PATCH 172/280] Upgrade typer --- poetry.lock | 23 ++++++++--------------- pyproject.toml | 4 ++-- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/poetry.lock b/poetry.lock index ebc37774ac..28c0e69dbe 100644 --- a/poetry.lock +++ b/poetry.lock @@ -5608,28 +5608,21 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, [[package]] name = "typer" -version = "0.9.4" +version = "0.15.1" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "typer-0.9.4-py3-none-any.whl", hash = "sha256:aa6c4a4e2329d868b80ecbaf16f807f2b54e192209d7ac9dd42691d63f7a54eb"}, - {file = "typer-0.9.4.tar.gz", hash = "sha256:f714c2d90afae3a7929fcd72a3abb08df305e1ff61719381384211c4070af57f"}, + {file = "typer-0.15.1-py3-none-any.whl", hash = "sha256:7994fb7b8155b64d3402518560648446072864beefd44aa2dc36972a5972e847"}, + {file = "typer-0.15.1.tar.gz", hash = "sha256:a0588c0a7fa68a1978a069818657778f86abe6ff5ea6abf472f940a08bfe4f0a"}, ] [package.dependencies] -click = ">=7.1.1,<9.0.0" -colorama = {version = ">=0.4.3,<0.5.0", optional = true, markers = "extra == \"all\""} -rich = {version = ">=10.11.0,<14.0.0", optional = true, markers = "extra == \"all\""} -shellingham = {version = ">=1.3.0,<2.0.0", optional = true, markers = "extra == \"all\""} +click = ">=8.0.0" +rich = ">=10.11.0" +shellingham = ">=1.3.0" typing-extensions = ">=3.7.4.3" -[package.extras] -all = ["colorama (>=0.4.3,<0.5.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] -dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2.17.0,<3.0.0)"] -doc = ["cairosvg (>=2.5.2,<3.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pillow (>=9.3.0,<10.0.0)"] -test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.971)", "pytest (>=4.4.0,<8.0.0)", "pytest-cov (>=2.10.0,<5.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<4.0.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] - [[package]] name = "types-requests" version = "2.32.0.20241016" @@ -6282,4 +6275,4 @@ tests = ["wikipedia"] [metadata] lock-version = "2.0" python-versions = "<4.0,>=3.10" -content-hash = "a50c8aa4afa909ac560f9531e46cfa293115309214bc2925a9d1a131e056cb5c" +content-hash = "b541d02c21ef05a664f69ab853c4bc7daa693525f5a232a822429093042739d7" diff --git a/pyproject.toml b/pyproject.toml index 7d6798cf41..0cc2095360 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "letta" -version = "0.6.6" +version = "0.6.7.dev0" packages = [ {include = "letta"} ] @@ -16,7 +16,7 @@ letta = "letta.main:app" [tool.poetry.dependencies] python = "<4.0,>=3.10" -typer = {extras = ["all"], version = "^0.9.0"} +typer = ">=0.12,<1.0" questionary = "^2.0.1" pytz = "^2023.3.post1" tqdm = "^4.66.1" From 191e4ad30cac8fb7cd9c5a66260f7a0edc9f519b Mon Sep 17 00:00:00 2001 From: cthomas Date: Thu, 2 Jan 2025 14:12:24 -0800 Subject: [PATCH 173/280] fix: comment out done_gen and done_step tokens (#504) --- letta/schemas/enums.py | 4 ++-- letta/server/rest_api/interface.py | 14 +++++++------- letta/services/tool_execution_sandbox.py | 4 ++-- tests/test_client_legacy.py | 20 ++++++++++---------- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/letta/schemas/enums.py b/letta/schemas/enums.py index 6183033f54..e0bb485edf 100644 --- a/letta/schemas/enums.py +++ b/letta/schemas/enums.py @@ -30,8 +30,8 @@ class JobStatus(str, Enum): class MessageStreamStatus(str, Enum): - done_generation = "[DONE_GEN]" - done_step = "[DONE_STEP]" + # done_generation = "[DONE_GEN]" + # done_step = "[DONE_STEP]" done = "[DONE]" diff --git a/letta/server/rest_api/interface.py b/letta/server/rest_api/interface.py index 9fd8fb1cd2..6fbb00bef8 100644 --- a/letta/server/rest_api/interface.py +++ b/letta/server/rest_api/interface.py @@ -292,8 +292,8 @@ def __init__( # if multi_step = True, the stream ends when the agent yields # if multi_step = False, the stream ends when the step ends self.multi_step = multi_step - self.multi_step_indicator = MessageStreamStatus.done_step - self.multi_step_gen_indicator = MessageStreamStatus.done_generation + # self.multi_step_indicator = MessageStreamStatus.done_step + # self.multi_step_gen_indicator = MessageStreamStatus.done_generation # Support for AssistantMessage self.use_assistant_message = False # TODO: Remove this @@ -378,8 +378,8 @@ def stream_end(self): """Clean up the stream by deactivating and clearing chunks.""" self.streaming_chat_completion_mode_function_name = None - if not self.streaming_chat_completion_mode and not self.nonstreaming_legacy_mode: - self._push_to_buffer(self.multi_step_gen_indicator) + # if not self.streaming_chat_completion_mode and not self.nonstreaming_legacy_mode: + # self._push_to_buffer(self.multi_step_gen_indicator) # Wipe the inner thoughts buffers self._reset_inner_thoughts_json_reader() @@ -390,9 +390,9 @@ def step_complete(self): # end the stream self._active = False self._event.set() # Unblock the generator if it's waiting to allow it to complete - elif not self.streaming_chat_completion_mode and not self.nonstreaming_legacy_mode: - # signal that a new step has started in the stream - self._push_to_buffer(self.multi_step_indicator) + # elif not self.streaming_chat_completion_mode and not self.nonstreaming_legacy_mode: + # # signal that a new step has started in the stream + # self._push_to_buffer(self.multi_step_indicator) # Wipe the inner thoughts buffers self._reset_inner_thoughts_json_reader() diff --git a/letta/services/tool_execution_sandbox.py b/letta/services/tool_execution_sandbox.py index 1060af43db..c586a483ca 100644 --- a/letta/services/tool_execution_sandbox.py +++ b/letta/services/tool_execution_sandbox.py @@ -278,9 +278,9 @@ def run_e2b_sandbox(self, agent_state: AgentState) -> SandboxRunResult: sbx = self.get_running_e2b_sandbox_with_same_state(sbx_config) if not sbx or self.force_recreate: if not sbx: - logger.info(f"No running e2b sandbox found with the same state: {sbx_config}") + logger.info(f"No running e2b sandbox found with the same state: {sbx_config}") else: - logger.info(f"Force recreated e2b sandbox with state: {sbx_config}") + logger.info(f"Force recreated e2b sandbox with state: {sbx_config}") sbx = self.create_e2b_sandbox_with_metadata_hash(sandbox_config=sbx_config) # Since this sandbox was used, we extend its lifecycle by the timeout diff --git a/tests/test_client_legacy.py b/tests/test_client_legacy.py index 3d907fa373..202adf17f5 100644 --- a/tests/test_client_legacy.py +++ b/tests/test_client_legacy.py @@ -249,8 +249,8 @@ def test_streaming_send_message(mock_e2b_api_key_none, client: RESTClient, agent send_message_ran = False # 3. Check that we get all the start/stop/end tokens we want # This includes all of the MessageStreamStatus enums - done_gen = False - done_step = False + # done_gen = False + # done_step = False done = False # print(response) @@ -266,12 +266,12 @@ def test_streaming_send_message(mock_e2b_api_key_none, client: RESTClient, agent if chunk == MessageStreamStatus.done: assert not done, "Message stream already done" done = True - elif chunk == MessageStreamStatus.done_step: - assert not done_step, "Message stream already done step" - done_step = True - elif chunk == MessageStreamStatus.done_generation: - assert not done_gen, "Message stream already done generation" - done_gen = True + # elif chunk == MessageStreamStatus.done_step: + # assert not done_step, "Message stream already done step" + # done_step = True + # elif chunk == MessageStreamStatus.done_generation: + # assert not done_gen, "Message stream already done generation" + # done_gen = True if isinstance(chunk, LettaUsageStatistics): # Some rough metrics for a reasonable usage pattern assert chunk.step_count == 1 @@ -284,8 +284,8 @@ def test_streaming_send_message(mock_e2b_api_key_none, client: RESTClient, agent assert inner_thoughts_exist, "No inner thoughts found" assert send_message_ran, "send_message function call not found" assert done, "Message stream not done" - assert done_step, "Message stream not done step" - assert done_gen, "Message stream not done generation" + # assert done_step, "Message stream not done step" + # assert done_gen, "Message stream not done generation" def test_humans_personas(client: Union[LocalClient, RESTClient], agent: AgentState): From 4400cdbee7f4b0aa700257b2dd9cf234011dfb12 Mon Sep 17 00:00:00 2001 From: Matt Zhou Date: Thu, 2 Jan 2025 18:48:35 -0800 Subject: [PATCH 174/280] Remove extraneous print --- letta/cli/cli_config.py | 1 - 1 file changed, 1 deletion(-) diff --git a/letta/cli/cli_config.py b/letta/cli/cli_config.py index 8278d55317..87e43567ce 100644 --- a/letta/cli/cli_config.py +++ b/letta/cli/cli_config.py @@ -60,7 +60,6 @@ def list(arg: Annotated[ListChoice, typer.Argument]): table.field_names = ["Name", "Text"] for human in client.list_humans(): table.add_row([human.template_name, human.value.replace("\n", "")[:100]]) - print(table) elif arg == ListChoice.personas: """List all personas""" table.field_names = ["Name", "Text"] From 68096a10e044100042927814a23c4887ef5b6019 Mon Sep 17 00:00:00 2001 From: Matt Zhou Date: Fri, 3 Jan 2025 12:42:52 -0800 Subject: [PATCH 175/280] chore: Remove commented out print --- letta/client/streaming.py | 1 - 1 file changed, 1 deletion(-) diff --git a/letta/client/streaming.py b/letta/client/streaming.py index 86be5c41a3..c872253401 100644 --- a/letta/client/streaming.py +++ b/letta/client/streaming.py @@ -45,7 +45,6 @@ def _sse_post(url: str, data: dict, headers: dict) -> Generator[LettaStreamingRe # break if sse.data in [status.value for status in MessageStreamStatus]: # break - # print("sse.data::", sse.data) yield MessageStreamStatus(sse.data) else: chunk_data = json.loads(sse.data) From e292bd224cf18abbb662d732f6c08fd5faaf9583 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Sun, 5 Jan 2025 19:06:38 -1000 Subject: [PATCH 176/280] feat: Allow per-agent tool execution environment variables (#509) --- ...bf0_add_per_agent_environment_variables.py | 51 +++++++++++++++ examples/composio_tool_usage.py | 3 +- letta/client/client.py | 16 ++--- letta/orm/agent.py | 10 ++- letta/orm/organization.py | 4 ++ letta/orm/sandbox_config.py | 24 ++++++- letta/schemas/agent.py | 10 +++ letta/schemas/environment_variables.py | 62 +++++++++++++++++++ letta/schemas/sandbox_config.py | 28 --------- .../rest_api/routers/v1/sandbox_configs.py | 6 +- letta/server/server.py | 3 +- letta/services/agent_manager.py | 54 ++++++++++++++++ letta/services/sandbox_config_manager.py | 6 +- tests/helpers/utils.py | 10 ++- ...integration_test_tool_execution_sandbox.py | 12 +--- tests/test_managers.py | 23 +++---- 16 files changed, 249 insertions(+), 73 deletions(-) create mode 100644 alembic/versions/400501b04bf0_add_per_agent_environment_variables.py create mode 100644 letta/schemas/environment_variables.py diff --git a/alembic/versions/400501b04bf0_add_per_agent_environment_variables.py b/alembic/versions/400501b04bf0_add_per_agent_environment_variables.py new file mode 100644 index 0000000000..584e1e4c8f --- /dev/null +++ b/alembic/versions/400501b04bf0_add_per_agent_environment_variables.py @@ -0,0 +1,51 @@ +"""Add per agent environment variables + +Revision ID: 400501b04bf0 +Revises: e78b4e82db30 +Create Date: 2025-01-04 20:45:28.024690 + +""" + +from typing import Sequence, Union + +import sqlalchemy as sa + +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = "400501b04bf0" +down_revision: Union[str, None] = "e78b4e82db30" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table( + "agent_environment_variables", + sa.Column("id", sa.String(), nullable=False), + sa.Column("key", sa.String(), nullable=False), + sa.Column("value", sa.String(), nullable=False), + sa.Column("description", sa.String(), nullable=True), + sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=True), + sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=True), + sa.Column("is_deleted", sa.Boolean(), server_default=sa.text("FALSE"), nullable=False), + sa.Column("_created_by_id", sa.String(), nullable=True), + sa.Column("_last_updated_by_id", sa.String(), nullable=True), + sa.Column("organization_id", sa.String(), nullable=False), + sa.Column("agent_id", sa.String(), nullable=False), + sa.ForeignKeyConstraint(["agent_id"], ["agents.id"], ondelete="CASCADE"), + sa.ForeignKeyConstraint( + ["organization_id"], + ["organizations.id"], + ), + sa.PrimaryKeyConstraint("id"), + sa.UniqueConstraint("key", "agent_id", name="uix_key_agent"), + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table("agent_environment_variables") + # ### end Alembic commands ### diff --git a/examples/composio_tool_usage.py b/examples/composio_tool_usage.py index c3c8189581..fc6c3c1203 100644 --- a/examples/composio_tool_usage.py +++ b/examples/composio_tool_usage.py @@ -4,9 +4,10 @@ from letta import create_client from letta.schemas.embedding_config import EmbeddingConfig +from letta.schemas.environment_variables import SandboxEnvironmentVariableCreate from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import ChatMemory -from letta.schemas.sandbox_config import SandboxEnvironmentVariableCreate, SandboxType +from letta.schemas.sandbox_config import SandboxType from letta.services.sandbox_config_manager import SandboxConfigManager from letta.settings import tool_settings diff --git a/letta/client/client.py b/letta/client/client.py index 9931628cd7..ae75e9eb1b 100644 --- a/letta/client/client.py +++ b/letta/client/client.py @@ -15,6 +15,11 @@ # new schemas from letta.schemas.enums import JobStatus, MessageRole +from letta.schemas.environment_variables import ( + SandboxEnvironmentVariable, + SandboxEnvironmentVariableCreate, + SandboxEnvironmentVariableUpdate, +) from letta.schemas.file import FileMetadata from letta.schemas.job import Job from letta.schemas.letta_request import LettaRequest, LettaStreamingRequest @@ -25,16 +30,7 @@ from letta.schemas.openai.chat_completions import ToolCall from letta.schemas.organization import Organization from letta.schemas.passage import Passage -from letta.schemas.sandbox_config import ( - E2BSandboxConfig, - LocalSandboxConfig, - SandboxConfig, - SandboxConfigCreate, - SandboxConfigUpdate, - SandboxEnvironmentVariable, - SandboxEnvironmentVariableCreate, - SandboxEnvironmentVariableUpdate, -) +from letta.schemas.sandbox_config import E2BSandboxConfig, LocalSandboxConfig, SandboxConfig, SandboxConfigCreate, SandboxConfigUpdate from letta.schemas.source import Source, SourceCreate, SourceUpdate from letta.schemas.tool import Tool, ToolCreate, ToolUpdate from letta.schemas.tool_rule import BaseToolRule diff --git a/letta/orm/agent.py b/letta/orm/agent.py index 353d4fe783..271527c6e9 100644 --- a/letta/orm/agent.py +++ b/letta/orm/agent.py @@ -31,7 +31,7 @@ class Agent(SqlalchemyBase, OrganizationMixin): # agent generates its own id # TODO: We want to migrate all the ORM models to do this, so we will need to move this to the SqlalchemyBase - # TODO: Move this in this PR? at the very end? + # TODO: Some still rely on the Pydantic object to do this id: Mapped[str] = mapped_column(String, primary_key=True, default=lambda: f"agent-{uuid.uuid4()}") # Descriptor fields @@ -61,6 +61,13 @@ class Agent(SqlalchemyBase, OrganizationMixin): # relationships organization: Mapped["Organization"] = relationship("Organization", back_populates="agents") + tool_exec_environment_variables: Mapped[List["AgentEnvironmentVariable"]] = relationship( + "AgentEnvironmentVariable", + back_populates="agent", + cascade="all, delete-orphan", + lazy="selectin", + doc="Environment variables associated with this agent.", + ) tools: Mapped[List["Tool"]] = relationship("Tool", secondary="tools_agents", lazy="selectin", passive_deletes=True) sources: Mapped[List["Source"]] = relationship("Source", secondary="sources_agents", lazy="selectin") core_memory: Mapped[List["Block"]] = relationship("Block", secondary="blocks_agents", lazy="selectin") @@ -119,5 +126,6 @@ def to_pydantic(self) -> PydanticAgentState: "last_updated_by_id": self.last_updated_by_id, "created_at": self.created_at, "updated_at": self.updated_at, + "tool_exec_environment_variables": self.tool_exec_environment_variables, } return self.__pydantic_model__(**state) diff --git a/letta/orm/organization.py b/letta/orm/organization.py index 335a15d0f4..486cfcc425 100644 --- a/letta/orm/organization.py +++ b/letta/orm/organization.py @@ -9,6 +9,7 @@ from letta.orm.agent import Agent from letta.orm.file import FileMetadata + from letta.orm.sandbox_config import AgentEnvironmentVariable from letta.orm.tool import Tool from letta.orm.user import User @@ -33,6 +34,9 @@ class Organization(SqlalchemyBase): sandbox_environment_variables: Mapped[List["SandboxEnvironmentVariable"]] = relationship( "SandboxEnvironmentVariable", back_populates="organization", cascade="all, delete-orphan" ) + agent_environment_variables: Mapped[List["AgentEnvironmentVariable"]] = relationship( + "AgentEnvironmentVariable", back_populates="organization", cascade="all, delete-orphan" + ) # relationships agents: Mapped[List["Agent"]] = relationship("Agent", back_populates="organization", cascade="all, delete-orphan") diff --git a/letta/orm/sandbox_config.py b/letta/orm/sandbox_config.py index 9058657f62..164814c51a 100644 --- a/letta/orm/sandbox_config.py +++ b/letta/orm/sandbox_config.py @@ -1,3 +1,4 @@ +import uuid from typing import TYPE_CHECKING, Dict, List, Optional from sqlalchemy import JSON @@ -5,13 +6,14 @@ from sqlalchemy import String, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column, relationship -from letta.orm.mixins import OrganizationMixin, SandboxConfigMixin +from letta.orm.mixins import AgentMixin, OrganizationMixin, SandboxConfigMixin from letta.orm.sqlalchemy_base import SqlalchemyBase +from letta.schemas.environment_variables import SandboxEnvironmentVariable as PydanticSandboxEnvironmentVariable from letta.schemas.sandbox_config import SandboxConfig as PydanticSandboxConfig -from letta.schemas.sandbox_config import SandboxEnvironmentVariable as PydanticSandboxEnvironmentVariable from letta.schemas.sandbox_config import SandboxType if TYPE_CHECKING: + from letta.orm.agent import Agent from letta.orm.organization import Organization @@ -52,3 +54,21 @@ class SandboxEnvironmentVariable(SqlalchemyBase, OrganizationMixin, SandboxConfi # relationships organization: Mapped["Organization"] = relationship("Organization", back_populates="sandbox_environment_variables") sandbox_config: Mapped["SandboxConfig"] = relationship("SandboxConfig", back_populates="sandbox_environment_variables") + + +class AgentEnvironmentVariable(SqlalchemyBase, OrganizationMixin, AgentMixin): + """ORM model for environment variables associated with agents.""" + + __tablename__ = "agent_environment_variables" + # We cannot have duplicate key names for the same agent, the env var would get overwritten + __table_args__ = (UniqueConstraint("key", "agent_id", name="uix_key_agent"),) + + # agent_env_var generates its own id + # TODO: We want to migrate all the ORM models to do this, so we will need to move this to the SqlalchemyBase + id: Mapped[str] = mapped_column(String, primary_key=True, default=lambda: f"agent-env-{uuid.uuid4()}") + key: Mapped[str] = mapped_column(String, nullable=False, doc="The name of the environment variable.") + value: Mapped[str] = mapped_column(String, nullable=False, doc="The value of the environment variable.") + description: Mapped[Optional[str]] = mapped_column(String, nullable=True, doc="An optional description of the environment variable.") + + organization: Mapped["Organization"] = relationship("Organization", back_populates="agent_environment_variables") + agent: Mapped[List["Agent"]] = relationship("Agent", back_populates="tool_exec_environment_variables") diff --git a/letta/schemas/agent.py b/letta/schemas/agent.py index 56b2168eff..57268645fa 100644 --- a/letta/schemas/agent.py +++ b/letta/schemas/agent.py @@ -6,6 +6,7 @@ from letta.constants import DEFAULT_EMBEDDING_CHUNK_SIZE from letta.schemas.block import CreateBlock from letta.schemas.embedding_config import EmbeddingConfig +from letta.schemas.environment_variables import AgentEnvironmentVariable from letta.schemas.letta_base import OrmMetadataBase from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import Memory @@ -78,6 +79,9 @@ class AgentState(OrmMetadataBase, validate_assignment=True): tools: List[Tool] = Field(..., description="The tools used by the agent.") sources: List[Source] = Field(..., description="The sources used by the agent.") tags: List[str] = Field(..., description="The tags associated with the agent.") + tool_exec_environment_variables: List[AgentEnvironmentVariable] = Field( + ..., description="The environment variables for tool execution specific to this agent." + ) class CreateAgent(BaseModel, validate_assignment=True): # @@ -120,6 +124,9 @@ class CreateAgent(BaseModel, validate_assignment=True): # embedding_chunk_size: Optional[int] = Field(DEFAULT_EMBEDDING_CHUNK_SIZE, description="The embedding chunk size used by the agent.") from_template: Optional[str] = Field(None, description="The template id used to configure the agent") project_id: Optional[str] = Field(None, description="The project id that the agent will be associated with.") + tool_exec_environment_variables: Optional[Dict[str, str]] = Field( + None, description="The environment variables for tool execution specific to this agent." + ) @field_validator("name") @classmethod @@ -184,6 +191,9 @@ class UpdateAgent(BaseModel): message_ids: Optional[List[str]] = Field(None, description="The ids of the messages in the agent's in-context memory.") description: Optional[str] = Field(None, description="The description of the agent.") metadata_: Optional[Dict] = Field(None, description="The metadata of the agent.", alias="metadata_") + tool_exec_environment_variables: Optional[Dict[str, str]] = Field( + None, description="The environment variables for tool execution specific to this agent." + ) class Config: extra = "ignore" # Ignores extra fields diff --git a/letta/schemas/environment_variables.py b/letta/schemas/environment_variables.py new file mode 100644 index 0000000000..9f482c1c4f --- /dev/null +++ b/letta/schemas/environment_variables.py @@ -0,0 +1,62 @@ +from typing import Optional + +from pydantic import Field + +from letta.schemas.letta_base import LettaBase, OrmMetadataBase + + +# Base Environment Variable +class EnvironmentVariableBase(OrmMetadataBase): + id: str = Field(..., description="The unique identifier for the environment variable.") + key: str = Field(..., description="The name of the environment variable.") + value: str = Field(..., description="The value of the environment variable.") + description: Optional[str] = Field(None, description="An optional description of the environment variable.") + organization_id: Optional[str] = Field(None, description="The ID of the organization this environment variable belongs to.") + + +class EnvironmentVariableCreateBase(LettaBase): + key: str = Field(..., description="The name of the environment variable.") + value: str = Field(..., description="The value of the environment variable.") + description: Optional[str] = Field(None, description="An optional description of the environment variable.") + + +class EnvironmentVariableUpdateBase(LettaBase): + key: Optional[str] = Field(None, description="The name of the environment variable.") + value: Optional[str] = Field(None, description="The value of the environment variable.") + description: Optional[str] = Field(None, description="An optional description of the environment variable.") + + +# Sandbox-Specific Environment Variable +class SandboxEnvironmentVariableBase(EnvironmentVariableBase): + __id_prefix__ = "sandbox-env" + sandbox_config_id: str = Field(..., description="The ID of the sandbox config this environment variable belongs to.") + + +class SandboxEnvironmentVariable(SandboxEnvironmentVariableBase): + id: str = SandboxEnvironmentVariableBase.generate_id_field() + + +class SandboxEnvironmentVariableCreate(EnvironmentVariableCreateBase): + pass + + +class SandboxEnvironmentVariableUpdate(EnvironmentVariableUpdateBase): + pass + + +# Agent-Specific Environment Variable +class AgentEnvironmentVariableBase(EnvironmentVariableBase): + __id_prefix__ = "agent-env" + agent_id: str = Field(..., description="The ID of the agent this environment variable belongs to.") + + +class AgentEnvironmentVariable(AgentEnvironmentVariableBase): + id: str = AgentEnvironmentVariableBase.generate_id_field() + + +class AgentEnvironmentVariableCreate(EnvironmentVariableCreateBase): + pass + + +class AgentEnvironmentVariableUpdate(EnvironmentVariableUpdateBase): + pass diff --git a/letta/schemas/sandbox_config.py b/letta/schemas/sandbox_config.py index f86233fae4..bc5698e9db 100644 --- a/letta/schemas/sandbox_config.py +++ b/letta/schemas/sandbox_config.py @@ -102,31 +102,3 @@ class SandboxConfigUpdate(LettaBase): """Pydantic model for updating SandboxConfig fields.""" config: Union[LocalSandboxConfig, E2BSandboxConfig] = Field(None, description="The JSON configuration data for the sandbox.") - - -# Environment Variable -class SandboxEnvironmentVariableBase(OrmMetadataBase): - __id_prefix__ = "sandbox-env" - - -class SandboxEnvironmentVariable(SandboxEnvironmentVariableBase): - id: str = SandboxEnvironmentVariableBase.generate_id_field() - key: str = Field(..., description="The name of the environment variable.") - value: str = Field(..., description="The value of the environment variable.") - description: Optional[str] = Field(None, description="An optional description of the environment variable.") - sandbox_config_id: str = Field(..., description="The ID of the sandbox config this environment variable belongs to.") - organization_id: Optional[str] = Field(None, description="The ID of the organization this environment variable belongs to.") - - -class SandboxEnvironmentVariableCreate(LettaBase): - key: str = Field(..., description="The name of the environment variable.") - value: str = Field(..., description="The value of the environment variable.") - description: Optional[str] = Field(None, description="An optional description of the environment variable.") - - -class SandboxEnvironmentVariableUpdate(LettaBase): - """Pydantic model for updating SandboxEnvironmentVariable fields.""" - - key: Optional[str] = Field(None, description="The name of the environment variable.") - value: Optional[str] = Field(None, description="The value of the environment variable.") - description: Optional[str] = Field(None, description="An optional description of the environment variable.") diff --git a/letta/server/rest_api/routers/v1/sandbox_configs.py b/letta/server/rest_api/routers/v1/sandbox_configs.py index 436d9b8e8e..d5c16c04a0 100644 --- a/letta/server/rest_api/routers/v1/sandbox_configs.py +++ b/letta/server/rest_api/routers/v1/sandbox_configs.py @@ -2,10 +2,10 @@ from fastapi import APIRouter, Depends, Query +from letta.schemas.environment_variables import SandboxEnvironmentVariable as PydanticEnvVar +from letta.schemas.environment_variables import SandboxEnvironmentVariableCreate, SandboxEnvironmentVariableUpdate from letta.schemas.sandbox_config import SandboxConfig as PydanticSandboxConfig -from letta.schemas.sandbox_config import SandboxConfigCreate, SandboxConfigUpdate -from letta.schemas.sandbox_config import SandboxEnvironmentVariable as PydanticEnvVar -from letta.schemas.sandbox_config import SandboxEnvironmentVariableCreate, SandboxEnvironmentVariableUpdate, SandboxType +from letta.schemas.sandbox_config import SandboxConfigCreate, SandboxConfigUpdate, SandboxType from letta.server.rest_api.utils import get_letta_server, get_user_id from letta.server.server import SyncServer diff --git a/letta/server/server.py b/letta/server/server.py index a619463ab3..9d6dd85928 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -46,6 +46,7 @@ # openai schemas from letta.schemas.enums import JobStatus +from letta.schemas.environment_variables import SandboxEnvironmentVariableCreate from letta.schemas.job import Job, JobUpdate from letta.schemas.letta_message import LettaMessage, ToolReturnMessage from letta.schemas.llm_config import LLMConfig @@ -53,7 +54,7 @@ from letta.schemas.message import Message, MessageCreate, MessageRole, MessageUpdate from letta.schemas.organization import Organization from letta.schemas.passage import Passage -from letta.schemas.sandbox_config import SandboxEnvironmentVariableCreate, SandboxType +from letta.schemas.sandbox_config import SandboxType from letta.schemas.source import Source from letta.schemas.tool import Tool from letta.schemas.usage import LettaUsageStatistics diff --git a/letta/services/agent_manager.py b/letta/services/agent_manager.py index a51a5faca8..5c92f59e62 100644 --- a/letta/services/agent_manager.py +++ b/letta/services/agent_manager.py @@ -14,6 +14,7 @@ from letta.orm import SourcePassage, SourcesAgents from letta.orm import Tool as ToolModel from letta.orm.errors import NoResultFound +from letta.orm.sandbox_config import AgentEnvironmentVariable as AgentEnvironmentVariableModel from letta.orm.sqlite_functions import adapt_array from letta.schemas.agent import AgentState as PydanticAgentState from letta.schemas.agent import AgentType, CreateAgent, UpdateAgent @@ -116,6 +117,14 @@ def create_agent( actor=actor, ) + # If there are provided environment variables, add them in + if agent_create.tool_exec_environment_variables: + agent_state = self._set_environment_variables( + agent_id=agent_state.id, + env_vars=agent_create.tool_exec_environment_variables, + actor=actor, + ) + # TODO: See if we can merge this into the above SQL create call for performance reasons # Generate a sequence of initial messages to put in the buffer init_messages = initialize_message_sequence( @@ -192,6 +201,14 @@ def _create_agent( def update_agent(self, agent_id: str, agent_update: UpdateAgent, actor: PydanticUser) -> PydanticAgentState: agent_state = self._update_agent(agent_id=agent_id, agent_update=agent_update, actor=actor) + # If there are provided environment variables, add them in + if agent_update.tool_exec_environment_variables: + agent_state = self._set_environment_variables( + agent_id=agent_state.id, + env_vars=agent_update.tool_exec_environment_variables, + actor=actor, + ) + # Rebuild the system prompt if it's different if agent_update.system and agent_update.system != agent_state.system: agent_state = self.rebuild_system_prompt(agent_id=agent_state.id, actor=actor, force=True, update_timestamp=False) @@ -296,6 +313,43 @@ def delete_agent(self, agent_id: str, actor: PydanticUser) -> None: agent = AgentModel.read(db_session=session, identifier=agent_id, actor=actor) agent.hard_delete(session) + # ====================================================================================================================== + # Per Agent Environment Variable Management + # ====================================================================================================================== + @enforce_types + def _set_environment_variables( + self, + agent_id: str, + env_vars: Dict[str, str], + actor: PydanticUser, + ) -> PydanticAgentState: + """ + Adds or replaces the environment variables for the specified agent. + + Args: + agent_id: The agent id. + env_vars: A dictionary of environment variable key-value pairs. + actor: The user performing the action. + + Returns: + PydanticAgentState: The updated agent as a Pydantic model. + """ + with self.session_maker() as session: + # Retrieve the agent + agent = AgentModel.read(db_session=session, identifier=agent_id, actor=actor) + + # Replace the environment variables + agent.tool_exec_environment_variables = [ + AgentEnvironmentVariableModel(key=key, value=value, agent_id=agent_id, organization_id=actor.organization_id) + for key, value in env_vars.items() + ] + + # Update the agent in the database + agent.update(session, actor=actor) + + # Return the updated agent state + return agent.to_pydantic() + # ====================================================================================================================== # In Context Messages Management # ====================================================================================================================== diff --git a/letta/services/sandbox_config_manager.py b/letta/services/sandbox_config_manager.py index 9e47612ee0..0511d3ec63 100644 --- a/letta/services/sandbox_config_manager.py +++ b/letta/services/sandbox_config_manager.py @@ -5,11 +5,11 @@ from letta.orm.errors import NoResultFound from letta.orm.sandbox_config import SandboxConfig as SandboxConfigModel from letta.orm.sandbox_config import SandboxEnvironmentVariable as SandboxEnvVarModel +from letta.schemas.environment_variables import SandboxEnvironmentVariable as PydanticEnvVar +from letta.schemas.environment_variables import SandboxEnvironmentVariableCreate, SandboxEnvironmentVariableUpdate from letta.schemas.sandbox_config import LocalSandboxConfig from letta.schemas.sandbox_config import SandboxConfig as PydanticSandboxConfig -from letta.schemas.sandbox_config import SandboxConfigCreate, SandboxConfigUpdate -from letta.schemas.sandbox_config import SandboxEnvironmentVariable as PydanticEnvVar -from letta.schemas.sandbox_config import SandboxEnvironmentVariableCreate, SandboxEnvironmentVariableUpdate, SandboxType +from letta.schemas.sandbox_config import SandboxConfigCreate, SandboxConfigUpdate, SandboxType from letta.schemas.user import User as PydanticUser from letta.utils import enforce_types, printd diff --git a/tests/helpers/utils.py b/tests/helpers/utils.py index 803fc98c76..a1f1382030 100644 --- a/tests/helpers/utils.py +++ b/tests/helpers/utils.py @@ -5,6 +5,7 @@ from letta.functions.schema_generator import generate_schema from letta.schemas.agent import AgentState, CreateAgent, UpdateAgent from letta.schemas.tool import Tool +from letta.schemas.user import User as PydanticUser def cleanup(client: Union[LocalClient, RESTClient], agent_uuid: str): @@ -27,12 +28,19 @@ def create_tool_from_func(func: callable): ) -def comprehensive_agent_checks(agent: AgentState, request: Union[CreateAgent, UpdateAgent]): +def comprehensive_agent_checks(agent: AgentState, request: Union[CreateAgent, UpdateAgent], actor: PydanticUser): # Assert scalar fields assert agent.system == request.system, f"System prompt mismatch: {agent.system} != {request.system}" assert agent.description == request.description, f"Description mismatch: {agent.description} != {request.description}" assert agent.metadata_ == request.metadata_, f"Metadata mismatch: {agent.metadata_} != {request.metadata_}" + # Assert agent env vars + if hasattr(request, "tool_exec_environment_variables"): + for agent_env_var in agent.tool_exec_environment_variables: + assert agent_env_var.key in request.tool_exec_environment_variables + assert request.tool_exec_environment_variables[agent_env_var.key] == agent_env_var.value + assert agent_env_var.organization_id == actor.organization_id + # Assert agent type if hasattr(request, "agent_type"): assert agent.agent_type == request.agent_type, f"Agent type mismatch: {agent.agent_type} != {request.agent_type}" diff --git a/tests/integration_test_tool_execution_sandbox.py b/tests/integration_test_tool_execution_sandbox.py index 3f64b28740..e7824673c4 100644 --- a/tests/integration_test_tool_execution_sandbox.py +++ b/tests/integration_test_tool_execution_sandbox.py @@ -9,20 +9,14 @@ from letta import create_client from letta.functions.function_sets.base import core_memory_append, core_memory_replace -from letta.orm import SandboxConfig, SandboxEnvironmentVariable +from letta.orm.sandbox_config import SandboxConfig, SandboxEnvironmentVariable from letta.schemas.agent import AgentState from letta.schemas.embedding_config import EmbeddingConfig +from letta.schemas.environment_variables import SandboxEnvironmentVariableCreate from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import ChatMemory from letta.schemas.organization import Organization -from letta.schemas.sandbox_config import ( - E2BSandboxConfig, - LocalSandboxConfig, - SandboxConfigCreate, - SandboxConfigUpdate, - SandboxEnvironmentVariableCreate, - SandboxType, -) +from letta.schemas.sandbox_config import E2BSandboxConfig, LocalSandboxConfig, SandboxConfigCreate, SandboxConfigUpdate, SandboxType from letta.schemas.tool import Tool, ToolCreate from letta.schemas.user import User from letta.services.organization_manager import OrganizationManager diff --git a/tests/test_managers.py b/tests/test_managers.py index 388d477c60..2b0ff7517a 100644 --- a/tests/test_managers.py +++ b/tests/test_managers.py @@ -35,6 +35,7 @@ from letta.schemas.block import BlockUpdate, CreateBlock from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.enums import JobStatus, MessageRole +from letta.schemas.environment_variables import SandboxEnvironmentVariableCreate, SandboxEnvironmentVariableUpdate from letta.schemas.file import FileMetadata as PydanticFileMetadata from letta.schemas.job import Job as PydanticJob from letta.schemas.job import JobUpdate @@ -43,15 +44,7 @@ from letta.schemas.message import MessageCreate, MessageUpdate from letta.schemas.organization import Organization as PydanticOrganization from letta.schemas.passage import Passage as PydanticPassage -from letta.schemas.sandbox_config import ( - E2BSandboxConfig, - LocalSandboxConfig, - SandboxConfigCreate, - SandboxConfigUpdate, - SandboxEnvironmentVariableCreate, - SandboxEnvironmentVariableUpdate, - SandboxType, -) +from letta.schemas.sandbox_config import E2BSandboxConfig, LocalSandboxConfig, SandboxConfigCreate, SandboxConfigUpdate, SandboxType from letta.schemas.source import Source as PydanticSource from letta.schemas.source import SourceUpdate from letta.schemas.tool import Tool as PydanticTool @@ -413,6 +406,7 @@ def comprehensive_test_agent_fixture(server: SyncServer, default_user, print_too metadata_={"test_key": "test_value"}, tool_rules=[InitToolRule(tool_name=print_tool.name)], initial_message_sequence=[MessageCreate(role=MessageRole.user, text="hello world")], + tool_exec_environment_variables={"test_env_var_key_a": "test_env_var_value_a", "test_env_var_key_b": "test_env_var_value_b"}, ) created_agent = server.agent_manager.create_agent( create_agent_request, @@ -482,20 +476,20 @@ def agent_passages_setup(server, default_source, default_user, sarah_agent): def test_create_get_list_agent(server: SyncServer, comprehensive_test_agent_fixture, default_user): # Test agent creation created_agent, create_agent_request = comprehensive_test_agent_fixture - comprehensive_agent_checks(created_agent, create_agent_request) + comprehensive_agent_checks(created_agent, create_agent_request, actor=default_user) # Test get agent get_agent = server.agent_manager.get_agent_by_id(agent_id=created_agent.id, actor=default_user) - comprehensive_agent_checks(get_agent, create_agent_request) + comprehensive_agent_checks(get_agent, create_agent_request, actor=default_user) # Test get agent name get_agent_name = server.agent_manager.get_agent_by_name(agent_name=created_agent.name, actor=default_user) - comprehensive_agent_checks(get_agent_name, create_agent_request) + comprehensive_agent_checks(get_agent_name, create_agent_request, actor=default_user) # Test list agent list_agents = server.agent_manager.list_agents(actor=default_user) assert len(list_agents) == 1 - comprehensive_agent_checks(list_agents[0], create_agent_request) + comprehensive_agent_checks(list_agents[0], create_agent_request, actor=default_user) # Test deleting the agent server.agent_manager.delete_agent(get_agent.id, default_user) @@ -566,10 +560,11 @@ def test_update_agent(server: SyncServer, comprehensive_test_agent_fixture, othe embedding_config=EmbeddingConfig.default_config(model_name="letta"), message_ids=["10", "20"], metadata_={"train_key": "train_value"}, + tool_exec_environment_variables={"new_tool_exec_key": "new_tool_exec_value"}, ) updated_agent = server.agent_manager.update_agent(agent.id, update_agent_request, actor=default_user) - comprehensive_agent_checks(updated_agent, update_agent_request) + comprehensive_agent_checks(updated_agent, update_agent_request, actor=default_user) assert updated_agent.message_ids == update_agent_request.message_ids From 9ad8557f7a062d4f6779baa3d515c9d4de21ab6b Mon Sep 17 00:00:00 2001 From: cthomas Date: Mon, 6 Jan 2025 10:05:03 -0800 Subject: [PATCH 177/280] fix: add message union type ref for LettaResponse (#507) --- letta/schemas/letta_response.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/letta/schemas/letta_response.py b/letta/schemas/letta_response.py index 10a1b38006..d7019280b9 100644 --- a/letta/schemas/letta_response.py +++ b/letta/schemas/letta_response.py @@ -29,19 +29,20 @@ class LettaResponse(BaseModel): json_schema_extra={ "items": { "oneOf": [ - {"x-ref-name": "SystemMessage"}, - {"x-ref-name": "UserMessage"}, - {"x-ref-name": "ReasoningMessage"}, - {"x-ref-name": "ToolCallMessage"}, - {"x-ref-name": "ToolReturnMessage"}, - {"x-ref-name": "AssistantMessage"}, + {"$ref": "#/components/schemas/SystemMessage-Output"}, + {"$ref": "#/components/schemas/UserMessage-Output"}, + {"$ref": "#/components/schemas/ReasoningMessage"}, + {"$ref": "#/components/schemas/ToolCallMessage"}, + {"$ref": "#/components/schemas/ToolReturnMessage"}, + {"$ref": "#/components/schemas/AssistantMessage-Output"}, ], "discriminator": {"propertyName": "message_type"}, } }, ) usage: LettaUsageStatistics = Field( - ..., description="The usage statistics of the agent.", json_schema_extra={"x-ref-name": "LettaUsageStatistics"} + ..., + description="The usage statistics of the agent.", ) def __str__(self): From f388e8f8ec6f03d63406d282ac8f224c137f627a Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Mon, 6 Jan 2025 08:28:47 -1000 Subject: [PATCH 178/280] chore: Move logs out of error so always log sandbox ID (#510) --- letta/services/tool_execution_sandbox.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/letta/services/tool_execution_sandbox.py b/letta/services/tool_execution_sandbox.py index c586a483ca..d0a6f4069a 100644 --- a/letta/services/tool_execution_sandbox.py +++ b/letta/services/tool_execution_sandbox.py @@ -283,6 +283,9 @@ def run_e2b_sandbox(self, agent_state: AgentState) -> SandboxRunResult: logger.info(f"Force recreated e2b sandbox with state: {sbx_config}") sbx = self.create_e2b_sandbox_with_metadata_hash(sandbox_config=sbx_config) + logger.info(f"E2B Sandbox configurations: {sbx_config}") + logger.info(f"E2B Sandbox ID: {sbx.sandbox_id}") + # Since this sandbox was used, we extend its lifecycle by the timeout sbx.set_timeout(sbx_config.get_e2b_config().timeout) @@ -296,8 +299,6 @@ def run_e2b_sandbox(self, agent_state: AgentState) -> SandboxRunResult: func_return, agent_state = self.parse_best_effort(execution.results[0].text) elif execution.error: logger.error(f"Executing tool {self.tool_name} failed with {execution.error}") - logger.error(f"E2B Sandbox configurations: {sbx_config}") - logger.error(f"E2B Sandbox ID: {sbx.sandbox_id}") func_return = get_friendly_error_msg( function_name=self.tool_name, exception_name=execution.error.name, exception_message=execution.error.value ) From c3cc35d5052039b747f92c41fed9ef192d52ef42 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Mon, 6 Jan 2025 08:46:53 -1000 Subject: [PATCH 179/280] chore: Merge OSS (#512) --- letta/__init__.py | 2 +- letta/agent.py | 7 ++++--- letta/cli/cli_config.py | 1 - letta/llm_api/helpers.py | 10 ++++++++-- letta/llm_api/llm_api_tools.py | 11 ++++++++++- letta/schemas/letta_response.py | 2 +- letta/schemas/memory.py | 3 +++ letta/services/agent_manager.py | 2 +- pyproject.toml | 2 +- tests/helpers/endpoints_helper.py | 6 +++++- tests/integration_test_agent_tool_graph.py | 6 +++--- tests/test_server.py | 1 + 12 files changed, 38 insertions(+), 15 deletions(-) diff --git a/letta/__init__.py b/letta/__init__.py index 46390abe5a..e67194c6f6 100644 --- a/letta/__init__.py +++ b/letta/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.6.6" +__version__ = "0.6.7" # import clients from letta.client.client import LocalClient, RESTClient, create_client diff --git a/letta/agent.py b/letta/agent.py index f61ace904c..483d3cb81d 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -224,8 +224,8 @@ def execute_tool_and_persist_state(self, function_name: str, function_args: dict ) function_response, updated_agent_state = sandbox_run_result.func_return, sandbox_run_result.agent_state assert orig_memory_str == self.agent_state.memory.compile(), "Memory should not be modified in a sandbox tool" - - self.update_memory_if_change(updated_agent_state.memory) + if updated_agent_state is not None: + self.update_memory_if_change(updated_agent_state.memory) except Exception as e: # Need to catch error here, or else trunction wont happen # TODO: modify to function execution error @@ -238,7 +238,7 @@ def execute_tool_and_persist_state(self, function_name: str, function_args: dict def _get_ai_reply( self, message_sequence: List[Message], - function_call: str = "auto", + function_call: Optional[str] = None, first_message: bool = False, stream: bool = False, # TODO move to config? empty_response_retry_limit: int = 3, @@ -1029,6 +1029,7 @@ def get_context_window(self) -> ContextWindowOverview: num_archival_memory=agent_manager_passage_size, num_recall_memory=message_manager_size, num_tokens_external_memory_summary=num_tokens_external_memory_summary, + external_memory_summary=external_memory_summary, # top-level information context_window_size_max=self.agent_state.llm_config.context_window, context_window_size_current=num_tokens_used_total, diff --git a/letta/cli/cli_config.py b/letta/cli/cli_config.py index 8278d55317..87e43567ce 100644 --- a/letta/cli/cli_config.py +++ b/letta/cli/cli_config.py @@ -60,7 +60,6 @@ def list(arg: Annotated[ListChoice, typer.Argument]): table.field_names = ["Name", "Text"] for human in client.list_humans(): table.add_row([human.template_name, human.value.replace("\n", "")[:100]]) - print(table) elif arg == ListChoice.personas: """List all personas""" table.field_names = ["Name", "Text"] diff --git a/letta/llm_api/helpers.py b/letta/llm_api/helpers.py index 1244b6ffe7..7c99bbcdbc 100644 --- a/letta/llm_api/helpers.py +++ b/letta/llm_api/helpers.py @@ -250,6 +250,8 @@ def unpack_all_inner_thoughts_from_kwargs( def unpack_inner_thoughts_from_kwargs(choice: Choice, inner_thoughts_key: str) -> Choice: message = choice.message + rewritten_choice = choice # inner thoughts unpacked out of the function + if message.role == "assistant" and message.tool_calls and len(message.tool_calls) >= 1: if len(message.tool_calls) > 1: warnings.warn(f"Unpacking inner thoughts from more than one tool call ({len(message.tool_calls)}) is not supported") @@ -271,14 +273,18 @@ def unpack_inner_thoughts_from_kwargs(choice: Choice, inner_thoughts_key: str) - warnings.warn(f"Overwriting existing inner monologue ({new_choice.message.content}) with kwarg ({inner_thoughts})") new_choice.message.content = inner_thoughts - return new_choice + # update the choice object + rewritten_choice = new_choice else: warnings.warn(f"Did not find inner thoughts in tool call: {str(tool_call)}") - return choice except json.JSONDecodeError as e: warnings.warn(f"Failed to strip inner thoughts from kwargs: {e}") raise e + else: + warnings.warn(f"Did not find tool call in message: {str(message)}") + + return rewritten_choice def is_context_overflow_error(exception: Union[requests.exceptions.RequestException, Exception]) -> bool: diff --git a/letta/llm_api/llm_api_tools.py b/letta/llm_api/llm_api_tools.py index 030d7375c4..d83e8699e6 100644 --- a/letta/llm_api/llm_api_tools.py +++ b/letta/llm_api/llm_api_tools.py @@ -94,7 +94,7 @@ def create( user_id: Optional[str] = None, # option UUID to associate request with functions: Optional[list] = None, functions_python: Optional[dict] = None, - function_call: str = "auto", + function_call: Optional[str] = None, # see: https://platform.openai.com/docs/api-reference/chat/create#chat-create-tool_choice # hint first_message: bool = False, force_tool_call: Optional[str] = None, # Force a specific tool to be called @@ -132,10 +132,19 @@ def create( # openai if llm_config.model_endpoint_type == "openai": + if model_settings.openai_api_key is None and llm_config.model_endpoint == "https://api.openai.com/v1": # only is a problem if we are *not* using an openai proxy raise LettaConfigurationError(message="OpenAI key is missing from letta config file", missing_fields=["openai_api_key"]) + if function_call is None and functions is not None and len(functions) > 0: + # force function calling for reliability, see https://platform.openai.com/docs/api-reference/chat/create#chat-create-tool_choice + # TODO(matt) move into LLMConfig + if llm_config.model_endpoint == "https://inference.memgpt.ai": + function_call = "auto" # TODO change to "required" once proxy supports it + else: + function_call = "required" + data = build_openai_chat_completions_request(llm_config, messages, user_id, functions, function_call, use_tool_naming, max_tokens) if stream: # Client requested token streaming data.stream = True diff --git a/letta/schemas/letta_response.py b/letta/schemas/letta_response.py index d7019280b9..fc969d666f 100644 --- a/letta/schemas/letta_response.py +++ b/letta/schemas/letta_response.py @@ -66,7 +66,7 @@ def get_formatted_content(msg): return f'
    {html.escape(msg.function_call.name)}({args})
    ' elif msg.message_type == "tool_call_message": args = format_json(msg.tool_call.arguments) - return f'
    {html.escape(msg.function_call.name)}({args})
    ' + return f'
    {html.escape(msg.tool_call.name)}({args})
    ' elif msg.message_type == "function_return": return_value = format_json(msg.function_return) # return f'
    Status: {html.escape(msg.status)}
    {return_value}
    ' diff --git a/letta/schemas/memory.py b/letta/schemas/memory.py index 797eac576e..ab877949a3 100644 --- a/letta/schemas/memory.py +++ b/letta/schemas/memory.py @@ -30,6 +30,9 @@ class ContextWindowOverview(BaseModel): num_tokens_external_memory_summary: int = Field( ..., description="The number of tokens in the external memory summary (archival + recall metadata)." ) + external_memory_summary: str = Field( + ..., description="The metadata summary of the external memory sources (archival + recall metadata)." + ) # context window breakdown (in tokens) # this should all add up to context_window_size_current diff --git a/letta/services/agent_manager.py b/letta/services/agent_manager.py index 5c92f59e62..92044a0cbc 100644 --- a/letta/services/agent_manager.py +++ b/letta/services/agent_manager.py @@ -388,7 +388,7 @@ def rebuild_system_prompt(self, agent_id: str, actor: PydanticUser, force=False, curr_memory_str = agent_state.memory.compile() if curr_memory_str in curr_system_message_openai["content"] and not force: # NOTE: could this cause issues if a block is removed? (substring match would still work) - logger.info( + logger.debug( f"Memory hasn't changed for agent id={agent_id} and actor=({actor.id}, {actor.name}), skipping system prompt rebuild" ) return agent_state diff --git a/pyproject.toml b/pyproject.toml index 074bd2569e..8a487c1e65 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "letta" -version = "0.6.6" +version = "0.6.7" packages = [ {include = "letta"} ] diff --git a/tests/helpers/endpoints_helper.py b/tests/helpers/endpoints_helper.py index 82b2ed1c79..8001490393 100644 --- a/tests/helpers/endpoints_helper.py +++ b/tests/helpers/endpoints_helper.py @@ -117,7 +117,11 @@ def check_first_response_is_valid_for_llm_endpoint(filename: str) -> ChatComplet choice = response.choices[0] # Ensure that the first message returns a "send_message" - validator_func = lambda function_call: function_call.name == "send_message" or function_call.name == "archival_memory_search" + validator_func = ( + lambda function_call: function_call.name == "send_message" + or function_call.name == "archival_memory_search" + or function_call.name == "core_memory_append" + ) assert_contains_valid_function_call(choice.message, validator_func) # Assert that the message has an inner monologue diff --git a/tests/integration_test_agent_tool_graph.py b/tests/integration_test_agent_tool_graph.py index 64486ad336..654d4a9e91 100644 --- a/tests/integration_test_agent_tool_graph.py +++ b/tests/integration_test_agent_tool_graph.py @@ -38,7 +38,7 @@ def second_secret_word(prev_secret_word: str): prev_secret_word (str): The secret word retrieved from calling first_secret_word. """ if prev_secret_word != "v0iq020i0g": - raise RuntimeError(f"Expected secret {"v0iq020i0g"}, got {prev_secret_word}") + raise RuntimeError(f"Expected secret {'v0iq020i0g'}, got {prev_secret_word}") return "4rwp2b4gxq" @@ -51,7 +51,7 @@ def third_secret_word(prev_secret_word: str): prev_secret_word (str): The secret word retrieved from calling second_secret_word. """ if prev_secret_word != "4rwp2b4gxq": - raise RuntimeError(f"Expected secret {"4rwp2b4gxq"}, got {prev_secret_word}") + raise RuntimeError(f'Expected secret "4rwp2b4gxq", got {prev_secret_word}') return "hj2hwibbqm" @@ -64,7 +64,7 @@ def fourth_secret_word(prev_secret_word: str): prev_secret_word (str): The secret word retrieved from calling third_secret_word. """ if prev_secret_word != "hj2hwibbqm": - raise RuntimeError(f"Expected secret {"hj2hwibbqm"}, got {prev_secret_word}") + raise RuntimeError(f"Expected secret {'hj2hwibbqm'}, got {prev_secret_word}") return "banana" diff --git a/tests/test_server.py b/tests/test_server.py index 2f205a7e7c..fe0fcdc441 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -508,6 +508,7 @@ def test_get_context_window_overview(server: SyncServer, user, agent_id): assert overview.num_archival_memory is not None assert overview.num_recall_memory is not None assert overview.num_tokens_external_memory_summary is not None + assert overview.external_memory_summary is not None assert overview.num_tokens_system is not None assert overview.system_prompt is not None assert overview.num_tokens_core_memory is not None From 18bd1d4f60d995ce455d94410b4b11b5fdc58b51 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Mon, 6 Jan 2025 09:25:50 -1000 Subject: [PATCH 180/280] chore: Improved sandboxing support (#2333) Co-authored-by: Shubham Naik Co-authored-by: Shubham Naik Co-authored-by: Caren Thomas Co-authored-by: Sarah Wooders Co-authored-by: cpacker --- ...bf0_add_per_agent_environment_variables.py | 51 +++++++++++++++ examples/composio_tool_usage.py | 3 +- letta/client/client.py | 16 ++--- letta/client/streaming.py | 1 - letta/orm/agent.py | 10 ++- letta/orm/organization.py | 4 ++ letta/orm/sandbox_config.py | 24 ++++++- letta/schemas/agent.py | 10 +++ letta/schemas/enums.py | 4 +- letta/schemas/environment_variables.py | 62 +++++++++++++++++++ letta/schemas/letta_response.py | 15 ++--- letta/schemas/sandbox_config.py | 28 --------- letta/server/rest_api/interface.py | 14 ++--- .../rest_api/routers/v1/sandbox_configs.py | 6 +- letta/server/server.py | 3 +- letta/services/agent_manager.py | 54 ++++++++++++++++ letta/services/sandbox_config_manager.py | 6 +- letta/services/tool_execution_sandbox.py | 7 ++- tests/helpers/utils.py | 10 ++- ...integration_test_tool_execution_sandbox.py | 12 +--- tests/test_client_legacy.py | 20 +++--- tests/test_managers.py | 23 +++---- 22 files changed, 281 insertions(+), 102 deletions(-) create mode 100644 alembic/versions/400501b04bf0_add_per_agent_environment_variables.py create mode 100644 letta/schemas/environment_variables.py diff --git a/alembic/versions/400501b04bf0_add_per_agent_environment_variables.py b/alembic/versions/400501b04bf0_add_per_agent_environment_variables.py new file mode 100644 index 0000000000..584e1e4c8f --- /dev/null +++ b/alembic/versions/400501b04bf0_add_per_agent_environment_variables.py @@ -0,0 +1,51 @@ +"""Add per agent environment variables + +Revision ID: 400501b04bf0 +Revises: e78b4e82db30 +Create Date: 2025-01-04 20:45:28.024690 + +""" + +from typing import Sequence, Union + +import sqlalchemy as sa + +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = "400501b04bf0" +down_revision: Union[str, None] = "e78b4e82db30" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table( + "agent_environment_variables", + sa.Column("id", sa.String(), nullable=False), + sa.Column("key", sa.String(), nullable=False), + sa.Column("value", sa.String(), nullable=False), + sa.Column("description", sa.String(), nullable=True), + sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=True), + sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=True), + sa.Column("is_deleted", sa.Boolean(), server_default=sa.text("FALSE"), nullable=False), + sa.Column("_created_by_id", sa.String(), nullable=True), + sa.Column("_last_updated_by_id", sa.String(), nullable=True), + sa.Column("organization_id", sa.String(), nullable=False), + sa.Column("agent_id", sa.String(), nullable=False), + sa.ForeignKeyConstraint(["agent_id"], ["agents.id"], ondelete="CASCADE"), + sa.ForeignKeyConstraint( + ["organization_id"], + ["organizations.id"], + ), + sa.PrimaryKeyConstraint("id"), + sa.UniqueConstraint("key", "agent_id", name="uix_key_agent"), + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table("agent_environment_variables") + # ### end Alembic commands ### diff --git a/examples/composio_tool_usage.py b/examples/composio_tool_usage.py index c3c8189581..fc6c3c1203 100644 --- a/examples/composio_tool_usage.py +++ b/examples/composio_tool_usage.py @@ -4,9 +4,10 @@ from letta import create_client from letta.schemas.embedding_config import EmbeddingConfig +from letta.schemas.environment_variables import SandboxEnvironmentVariableCreate from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import ChatMemory -from letta.schemas.sandbox_config import SandboxEnvironmentVariableCreate, SandboxType +from letta.schemas.sandbox_config import SandboxType from letta.services.sandbox_config_manager import SandboxConfigManager from letta.settings import tool_settings diff --git a/letta/client/client.py b/letta/client/client.py index 9931628cd7..ae75e9eb1b 100644 --- a/letta/client/client.py +++ b/letta/client/client.py @@ -15,6 +15,11 @@ # new schemas from letta.schemas.enums import JobStatus, MessageRole +from letta.schemas.environment_variables import ( + SandboxEnvironmentVariable, + SandboxEnvironmentVariableCreate, + SandboxEnvironmentVariableUpdate, +) from letta.schemas.file import FileMetadata from letta.schemas.job import Job from letta.schemas.letta_request import LettaRequest, LettaStreamingRequest @@ -25,16 +30,7 @@ from letta.schemas.openai.chat_completions import ToolCall from letta.schemas.organization import Organization from letta.schemas.passage import Passage -from letta.schemas.sandbox_config import ( - E2BSandboxConfig, - LocalSandboxConfig, - SandboxConfig, - SandboxConfigCreate, - SandboxConfigUpdate, - SandboxEnvironmentVariable, - SandboxEnvironmentVariableCreate, - SandboxEnvironmentVariableUpdate, -) +from letta.schemas.sandbox_config import E2BSandboxConfig, LocalSandboxConfig, SandboxConfig, SandboxConfigCreate, SandboxConfigUpdate from letta.schemas.source import Source, SourceCreate, SourceUpdate from letta.schemas.tool import Tool, ToolCreate, ToolUpdate from letta.schemas.tool_rule import BaseToolRule diff --git a/letta/client/streaming.py b/letta/client/streaming.py index 86be5c41a3..c872253401 100644 --- a/letta/client/streaming.py +++ b/letta/client/streaming.py @@ -45,7 +45,6 @@ def _sse_post(url: str, data: dict, headers: dict) -> Generator[LettaStreamingRe # break if sse.data in [status.value for status in MessageStreamStatus]: # break - # print("sse.data::", sse.data) yield MessageStreamStatus(sse.data) else: chunk_data = json.loads(sse.data) diff --git a/letta/orm/agent.py b/letta/orm/agent.py index 353d4fe783..271527c6e9 100644 --- a/letta/orm/agent.py +++ b/letta/orm/agent.py @@ -31,7 +31,7 @@ class Agent(SqlalchemyBase, OrganizationMixin): # agent generates its own id # TODO: We want to migrate all the ORM models to do this, so we will need to move this to the SqlalchemyBase - # TODO: Move this in this PR? at the very end? + # TODO: Some still rely on the Pydantic object to do this id: Mapped[str] = mapped_column(String, primary_key=True, default=lambda: f"agent-{uuid.uuid4()}") # Descriptor fields @@ -61,6 +61,13 @@ class Agent(SqlalchemyBase, OrganizationMixin): # relationships organization: Mapped["Organization"] = relationship("Organization", back_populates="agents") + tool_exec_environment_variables: Mapped[List["AgentEnvironmentVariable"]] = relationship( + "AgentEnvironmentVariable", + back_populates="agent", + cascade="all, delete-orphan", + lazy="selectin", + doc="Environment variables associated with this agent.", + ) tools: Mapped[List["Tool"]] = relationship("Tool", secondary="tools_agents", lazy="selectin", passive_deletes=True) sources: Mapped[List["Source"]] = relationship("Source", secondary="sources_agents", lazy="selectin") core_memory: Mapped[List["Block"]] = relationship("Block", secondary="blocks_agents", lazy="selectin") @@ -119,5 +126,6 @@ def to_pydantic(self) -> PydanticAgentState: "last_updated_by_id": self.last_updated_by_id, "created_at": self.created_at, "updated_at": self.updated_at, + "tool_exec_environment_variables": self.tool_exec_environment_variables, } return self.__pydantic_model__(**state) diff --git a/letta/orm/organization.py b/letta/orm/organization.py index 335a15d0f4..486cfcc425 100644 --- a/letta/orm/organization.py +++ b/letta/orm/organization.py @@ -9,6 +9,7 @@ from letta.orm.agent import Agent from letta.orm.file import FileMetadata + from letta.orm.sandbox_config import AgentEnvironmentVariable from letta.orm.tool import Tool from letta.orm.user import User @@ -33,6 +34,9 @@ class Organization(SqlalchemyBase): sandbox_environment_variables: Mapped[List["SandboxEnvironmentVariable"]] = relationship( "SandboxEnvironmentVariable", back_populates="organization", cascade="all, delete-orphan" ) + agent_environment_variables: Mapped[List["AgentEnvironmentVariable"]] = relationship( + "AgentEnvironmentVariable", back_populates="organization", cascade="all, delete-orphan" + ) # relationships agents: Mapped[List["Agent"]] = relationship("Agent", back_populates="organization", cascade="all, delete-orphan") diff --git a/letta/orm/sandbox_config.py b/letta/orm/sandbox_config.py index 9058657f62..164814c51a 100644 --- a/letta/orm/sandbox_config.py +++ b/letta/orm/sandbox_config.py @@ -1,3 +1,4 @@ +import uuid from typing import TYPE_CHECKING, Dict, List, Optional from sqlalchemy import JSON @@ -5,13 +6,14 @@ from sqlalchemy import String, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column, relationship -from letta.orm.mixins import OrganizationMixin, SandboxConfigMixin +from letta.orm.mixins import AgentMixin, OrganizationMixin, SandboxConfigMixin from letta.orm.sqlalchemy_base import SqlalchemyBase +from letta.schemas.environment_variables import SandboxEnvironmentVariable as PydanticSandboxEnvironmentVariable from letta.schemas.sandbox_config import SandboxConfig as PydanticSandboxConfig -from letta.schemas.sandbox_config import SandboxEnvironmentVariable as PydanticSandboxEnvironmentVariable from letta.schemas.sandbox_config import SandboxType if TYPE_CHECKING: + from letta.orm.agent import Agent from letta.orm.organization import Organization @@ -52,3 +54,21 @@ class SandboxEnvironmentVariable(SqlalchemyBase, OrganizationMixin, SandboxConfi # relationships organization: Mapped["Organization"] = relationship("Organization", back_populates="sandbox_environment_variables") sandbox_config: Mapped["SandboxConfig"] = relationship("SandboxConfig", back_populates="sandbox_environment_variables") + + +class AgentEnvironmentVariable(SqlalchemyBase, OrganizationMixin, AgentMixin): + """ORM model for environment variables associated with agents.""" + + __tablename__ = "agent_environment_variables" + # We cannot have duplicate key names for the same agent, the env var would get overwritten + __table_args__ = (UniqueConstraint("key", "agent_id", name="uix_key_agent"),) + + # agent_env_var generates its own id + # TODO: We want to migrate all the ORM models to do this, so we will need to move this to the SqlalchemyBase + id: Mapped[str] = mapped_column(String, primary_key=True, default=lambda: f"agent-env-{uuid.uuid4()}") + key: Mapped[str] = mapped_column(String, nullable=False, doc="The name of the environment variable.") + value: Mapped[str] = mapped_column(String, nullable=False, doc="The value of the environment variable.") + description: Mapped[Optional[str]] = mapped_column(String, nullable=True, doc="An optional description of the environment variable.") + + organization: Mapped["Organization"] = relationship("Organization", back_populates="agent_environment_variables") + agent: Mapped[List["Agent"]] = relationship("Agent", back_populates="tool_exec_environment_variables") diff --git a/letta/schemas/agent.py b/letta/schemas/agent.py index 56b2168eff..57268645fa 100644 --- a/letta/schemas/agent.py +++ b/letta/schemas/agent.py @@ -6,6 +6,7 @@ from letta.constants import DEFAULT_EMBEDDING_CHUNK_SIZE from letta.schemas.block import CreateBlock from letta.schemas.embedding_config import EmbeddingConfig +from letta.schemas.environment_variables import AgentEnvironmentVariable from letta.schemas.letta_base import OrmMetadataBase from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import Memory @@ -78,6 +79,9 @@ class AgentState(OrmMetadataBase, validate_assignment=True): tools: List[Tool] = Field(..., description="The tools used by the agent.") sources: List[Source] = Field(..., description="The sources used by the agent.") tags: List[str] = Field(..., description="The tags associated with the agent.") + tool_exec_environment_variables: List[AgentEnvironmentVariable] = Field( + ..., description="The environment variables for tool execution specific to this agent." + ) class CreateAgent(BaseModel, validate_assignment=True): # @@ -120,6 +124,9 @@ class CreateAgent(BaseModel, validate_assignment=True): # embedding_chunk_size: Optional[int] = Field(DEFAULT_EMBEDDING_CHUNK_SIZE, description="The embedding chunk size used by the agent.") from_template: Optional[str] = Field(None, description="The template id used to configure the agent") project_id: Optional[str] = Field(None, description="The project id that the agent will be associated with.") + tool_exec_environment_variables: Optional[Dict[str, str]] = Field( + None, description="The environment variables for tool execution specific to this agent." + ) @field_validator("name") @classmethod @@ -184,6 +191,9 @@ class UpdateAgent(BaseModel): message_ids: Optional[List[str]] = Field(None, description="The ids of the messages in the agent's in-context memory.") description: Optional[str] = Field(None, description="The description of the agent.") metadata_: Optional[Dict] = Field(None, description="The metadata of the agent.", alias="metadata_") + tool_exec_environment_variables: Optional[Dict[str, str]] = Field( + None, description="The environment variables for tool execution specific to this agent." + ) class Config: extra = "ignore" # Ignores extra fields diff --git a/letta/schemas/enums.py b/letta/schemas/enums.py index 6183033f54..e0bb485edf 100644 --- a/letta/schemas/enums.py +++ b/letta/schemas/enums.py @@ -30,8 +30,8 @@ class JobStatus(str, Enum): class MessageStreamStatus(str, Enum): - done_generation = "[DONE_GEN]" - done_step = "[DONE_STEP]" + # done_generation = "[DONE_GEN]" + # done_step = "[DONE_STEP]" done = "[DONE]" diff --git a/letta/schemas/environment_variables.py b/letta/schemas/environment_variables.py new file mode 100644 index 0000000000..9f482c1c4f --- /dev/null +++ b/letta/schemas/environment_variables.py @@ -0,0 +1,62 @@ +from typing import Optional + +from pydantic import Field + +from letta.schemas.letta_base import LettaBase, OrmMetadataBase + + +# Base Environment Variable +class EnvironmentVariableBase(OrmMetadataBase): + id: str = Field(..., description="The unique identifier for the environment variable.") + key: str = Field(..., description="The name of the environment variable.") + value: str = Field(..., description="The value of the environment variable.") + description: Optional[str] = Field(None, description="An optional description of the environment variable.") + organization_id: Optional[str] = Field(None, description="The ID of the organization this environment variable belongs to.") + + +class EnvironmentVariableCreateBase(LettaBase): + key: str = Field(..., description="The name of the environment variable.") + value: str = Field(..., description="The value of the environment variable.") + description: Optional[str] = Field(None, description="An optional description of the environment variable.") + + +class EnvironmentVariableUpdateBase(LettaBase): + key: Optional[str] = Field(None, description="The name of the environment variable.") + value: Optional[str] = Field(None, description="The value of the environment variable.") + description: Optional[str] = Field(None, description="An optional description of the environment variable.") + + +# Sandbox-Specific Environment Variable +class SandboxEnvironmentVariableBase(EnvironmentVariableBase): + __id_prefix__ = "sandbox-env" + sandbox_config_id: str = Field(..., description="The ID of the sandbox config this environment variable belongs to.") + + +class SandboxEnvironmentVariable(SandboxEnvironmentVariableBase): + id: str = SandboxEnvironmentVariableBase.generate_id_field() + + +class SandboxEnvironmentVariableCreate(EnvironmentVariableCreateBase): + pass + + +class SandboxEnvironmentVariableUpdate(EnvironmentVariableUpdateBase): + pass + + +# Agent-Specific Environment Variable +class AgentEnvironmentVariableBase(EnvironmentVariableBase): + __id_prefix__ = "agent-env" + agent_id: str = Field(..., description="The ID of the agent this environment variable belongs to.") + + +class AgentEnvironmentVariable(AgentEnvironmentVariableBase): + id: str = AgentEnvironmentVariableBase.generate_id_field() + + +class AgentEnvironmentVariableCreate(EnvironmentVariableCreateBase): + pass + + +class AgentEnvironmentVariableUpdate(EnvironmentVariableUpdateBase): + pass diff --git a/letta/schemas/letta_response.py b/letta/schemas/letta_response.py index 1a1c0b64f5..fc969d666f 100644 --- a/letta/schemas/letta_response.py +++ b/letta/schemas/letta_response.py @@ -29,19 +29,20 @@ class LettaResponse(BaseModel): json_schema_extra={ "items": { "oneOf": [ - {"x-ref-name": "SystemMessage"}, - {"x-ref-name": "UserMessage"}, - {"x-ref-name": "ReasoningMessage"}, - {"x-ref-name": "ToolCallMessage"}, - {"x-ref-name": "ToolReturnMessage"}, - {"x-ref-name": "AssistantMessage"}, + {"$ref": "#/components/schemas/SystemMessage-Output"}, + {"$ref": "#/components/schemas/UserMessage-Output"}, + {"$ref": "#/components/schemas/ReasoningMessage"}, + {"$ref": "#/components/schemas/ToolCallMessage"}, + {"$ref": "#/components/schemas/ToolReturnMessage"}, + {"$ref": "#/components/schemas/AssistantMessage-Output"}, ], "discriminator": {"propertyName": "message_type"}, } }, ) usage: LettaUsageStatistics = Field( - ..., description="The usage statistics of the agent.", json_schema_extra={"x-ref-name": "LettaUsageStatistics"} + ..., + description="The usage statistics of the agent.", ) def __str__(self): diff --git a/letta/schemas/sandbox_config.py b/letta/schemas/sandbox_config.py index f86233fae4..bc5698e9db 100644 --- a/letta/schemas/sandbox_config.py +++ b/letta/schemas/sandbox_config.py @@ -102,31 +102,3 @@ class SandboxConfigUpdate(LettaBase): """Pydantic model for updating SandboxConfig fields.""" config: Union[LocalSandboxConfig, E2BSandboxConfig] = Field(None, description="The JSON configuration data for the sandbox.") - - -# Environment Variable -class SandboxEnvironmentVariableBase(OrmMetadataBase): - __id_prefix__ = "sandbox-env" - - -class SandboxEnvironmentVariable(SandboxEnvironmentVariableBase): - id: str = SandboxEnvironmentVariableBase.generate_id_field() - key: str = Field(..., description="The name of the environment variable.") - value: str = Field(..., description="The value of the environment variable.") - description: Optional[str] = Field(None, description="An optional description of the environment variable.") - sandbox_config_id: str = Field(..., description="The ID of the sandbox config this environment variable belongs to.") - organization_id: Optional[str] = Field(None, description="The ID of the organization this environment variable belongs to.") - - -class SandboxEnvironmentVariableCreate(LettaBase): - key: str = Field(..., description="The name of the environment variable.") - value: str = Field(..., description="The value of the environment variable.") - description: Optional[str] = Field(None, description="An optional description of the environment variable.") - - -class SandboxEnvironmentVariableUpdate(LettaBase): - """Pydantic model for updating SandboxEnvironmentVariable fields.""" - - key: Optional[str] = Field(None, description="The name of the environment variable.") - value: Optional[str] = Field(None, description="The value of the environment variable.") - description: Optional[str] = Field(None, description="An optional description of the environment variable.") diff --git a/letta/server/rest_api/interface.py b/letta/server/rest_api/interface.py index 9fd8fb1cd2..6fbb00bef8 100644 --- a/letta/server/rest_api/interface.py +++ b/letta/server/rest_api/interface.py @@ -292,8 +292,8 @@ def __init__( # if multi_step = True, the stream ends when the agent yields # if multi_step = False, the stream ends when the step ends self.multi_step = multi_step - self.multi_step_indicator = MessageStreamStatus.done_step - self.multi_step_gen_indicator = MessageStreamStatus.done_generation + # self.multi_step_indicator = MessageStreamStatus.done_step + # self.multi_step_gen_indicator = MessageStreamStatus.done_generation # Support for AssistantMessage self.use_assistant_message = False # TODO: Remove this @@ -378,8 +378,8 @@ def stream_end(self): """Clean up the stream by deactivating and clearing chunks.""" self.streaming_chat_completion_mode_function_name = None - if not self.streaming_chat_completion_mode and not self.nonstreaming_legacy_mode: - self._push_to_buffer(self.multi_step_gen_indicator) + # if not self.streaming_chat_completion_mode and not self.nonstreaming_legacy_mode: + # self._push_to_buffer(self.multi_step_gen_indicator) # Wipe the inner thoughts buffers self._reset_inner_thoughts_json_reader() @@ -390,9 +390,9 @@ def step_complete(self): # end the stream self._active = False self._event.set() # Unblock the generator if it's waiting to allow it to complete - elif not self.streaming_chat_completion_mode and not self.nonstreaming_legacy_mode: - # signal that a new step has started in the stream - self._push_to_buffer(self.multi_step_indicator) + # elif not self.streaming_chat_completion_mode and not self.nonstreaming_legacy_mode: + # # signal that a new step has started in the stream + # self._push_to_buffer(self.multi_step_indicator) # Wipe the inner thoughts buffers self._reset_inner_thoughts_json_reader() diff --git a/letta/server/rest_api/routers/v1/sandbox_configs.py b/letta/server/rest_api/routers/v1/sandbox_configs.py index 436d9b8e8e..d5c16c04a0 100644 --- a/letta/server/rest_api/routers/v1/sandbox_configs.py +++ b/letta/server/rest_api/routers/v1/sandbox_configs.py @@ -2,10 +2,10 @@ from fastapi import APIRouter, Depends, Query +from letta.schemas.environment_variables import SandboxEnvironmentVariable as PydanticEnvVar +from letta.schemas.environment_variables import SandboxEnvironmentVariableCreate, SandboxEnvironmentVariableUpdate from letta.schemas.sandbox_config import SandboxConfig as PydanticSandboxConfig -from letta.schemas.sandbox_config import SandboxConfigCreate, SandboxConfigUpdate -from letta.schemas.sandbox_config import SandboxEnvironmentVariable as PydanticEnvVar -from letta.schemas.sandbox_config import SandboxEnvironmentVariableCreate, SandboxEnvironmentVariableUpdate, SandboxType +from letta.schemas.sandbox_config import SandboxConfigCreate, SandboxConfigUpdate, SandboxType from letta.server.rest_api.utils import get_letta_server, get_user_id from letta.server.server import SyncServer diff --git a/letta/server/server.py b/letta/server/server.py index a619463ab3..9d6dd85928 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -46,6 +46,7 @@ # openai schemas from letta.schemas.enums import JobStatus +from letta.schemas.environment_variables import SandboxEnvironmentVariableCreate from letta.schemas.job import Job, JobUpdate from letta.schemas.letta_message import LettaMessage, ToolReturnMessage from letta.schemas.llm_config import LLMConfig @@ -53,7 +54,7 @@ from letta.schemas.message import Message, MessageCreate, MessageRole, MessageUpdate from letta.schemas.organization import Organization from letta.schemas.passage import Passage -from letta.schemas.sandbox_config import SandboxEnvironmentVariableCreate, SandboxType +from letta.schemas.sandbox_config import SandboxType from letta.schemas.source import Source from letta.schemas.tool import Tool from letta.schemas.usage import LettaUsageStatistics diff --git a/letta/services/agent_manager.py b/letta/services/agent_manager.py index adad82fdbe..92044a0cbc 100644 --- a/letta/services/agent_manager.py +++ b/letta/services/agent_manager.py @@ -14,6 +14,7 @@ from letta.orm import SourcePassage, SourcesAgents from letta.orm import Tool as ToolModel from letta.orm.errors import NoResultFound +from letta.orm.sandbox_config import AgentEnvironmentVariable as AgentEnvironmentVariableModel from letta.orm.sqlite_functions import adapt_array from letta.schemas.agent import AgentState as PydanticAgentState from letta.schemas.agent import AgentType, CreateAgent, UpdateAgent @@ -116,6 +117,14 @@ def create_agent( actor=actor, ) + # If there are provided environment variables, add them in + if agent_create.tool_exec_environment_variables: + agent_state = self._set_environment_variables( + agent_id=agent_state.id, + env_vars=agent_create.tool_exec_environment_variables, + actor=actor, + ) + # TODO: See if we can merge this into the above SQL create call for performance reasons # Generate a sequence of initial messages to put in the buffer init_messages = initialize_message_sequence( @@ -192,6 +201,14 @@ def _create_agent( def update_agent(self, agent_id: str, agent_update: UpdateAgent, actor: PydanticUser) -> PydanticAgentState: agent_state = self._update_agent(agent_id=agent_id, agent_update=agent_update, actor=actor) + # If there are provided environment variables, add them in + if agent_update.tool_exec_environment_variables: + agent_state = self._set_environment_variables( + agent_id=agent_state.id, + env_vars=agent_update.tool_exec_environment_variables, + actor=actor, + ) + # Rebuild the system prompt if it's different if agent_update.system and agent_update.system != agent_state.system: agent_state = self.rebuild_system_prompt(agent_id=agent_state.id, actor=actor, force=True, update_timestamp=False) @@ -296,6 +313,43 @@ def delete_agent(self, agent_id: str, actor: PydanticUser) -> None: agent = AgentModel.read(db_session=session, identifier=agent_id, actor=actor) agent.hard_delete(session) + # ====================================================================================================================== + # Per Agent Environment Variable Management + # ====================================================================================================================== + @enforce_types + def _set_environment_variables( + self, + agent_id: str, + env_vars: Dict[str, str], + actor: PydanticUser, + ) -> PydanticAgentState: + """ + Adds or replaces the environment variables for the specified agent. + + Args: + agent_id: The agent id. + env_vars: A dictionary of environment variable key-value pairs. + actor: The user performing the action. + + Returns: + PydanticAgentState: The updated agent as a Pydantic model. + """ + with self.session_maker() as session: + # Retrieve the agent + agent = AgentModel.read(db_session=session, identifier=agent_id, actor=actor) + + # Replace the environment variables + agent.tool_exec_environment_variables = [ + AgentEnvironmentVariableModel(key=key, value=value, agent_id=agent_id, organization_id=actor.organization_id) + for key, value in env_vars.items() + ] + + # Update the agent in the database + agent.update(session, actor=actor) + + # Return the updated agent state + return agent.to_pydantic() + # ====================================================================================================================== # In Context Messages Management # ====================================================================================================================== diff --git a/letta/services/sandbox_config_manager.py b/letta/services/sandbox_config_manager.py index 9e47612ee0..0511d3ec63 100644 --- a/letta/services/sandbox_config_manager.py +++ b/letta/services/sandbox_config_manager.py @@ -5,11 +5,11 @@ from letta.orm.errors import NoResultFound from letta.orm.sandbox_config import SandboxConfig as SandboxConfigModel from letta.orm.sandbox_config import SandboxEnvironmentVariable as SandboxEnvVarModel +from letta.schemas.environment_variables import SandboxEnvironmentVariable as PydanticEnvVar +from letta.schemas.environment_variables import SandboxEnvironmentVariableCreate, SandboxEnvironmentVariableUpdate from letta.schemas.sandbox_config import LocalSandboxConfig from letta.schemas.sandbox_config import SandboxConfig as PydanticSandboxConfig -from letta.schemas.sandbox_config import SandboxConfigCreate, SandboxConfigUpdate -from letta.schemas.sandbox_config import SandboxEnvironmentVariable as PydanticEnvVar -from letta.schemas.sandbox_config import SandboxEnvironmentVariableCreate, SandboxEnvironmentVariableUpdate, SandboxType +from letta.schemas.sandbox_config import SandboxConfigCreate, SandboxConfigUpdate, SandboxType from letta.schemas.user import User as PydanticUser from letta.utils import enforce_types, printd diff --git a/letta/services/tool_execution_sandbox.py b/letta/services/tool_execution_sandbox.py index 1060af43db..4be6766192 100644 --- a/letta/services/tool_execution_sandbox.py +++ b/letta/services/tool_execution_sandbox.py @@ -278,11 +278,14 @@ def run_e2b_sandbox(self, agent_state: AgentState) -> SandboxRunResult: sbx = self.get_running_e2b_sandbox_with_same_state(sbx_config) if not sbx or self.force_recreate: if not sbx: - logger.info(f"No running e2b sandbox found with the same state: {sbx_config}") + logger.info(f"No running e2b sandbox found with the same state: {sbx_config}") else: - logger.info(f"Force recreated e2b sandbox with state: {sbx_config}") + logger.info(f"Force recreated e2b sandbox with state: {sbx_config}") sbx = self.create_e2b_sandbox_with_metadata_hash(sandbox_config=sbx_config) + logger.info(f"E2B Sandbox configurations: {sbx_config}") + logger.info(f"E2B Sandbox ID: {sbx.sandbox_id}") + # Since this sandbox was used, we extend its lifecycle by the timeout sbx.set_timeout(sbx_config.get_e2b_config().timeout) diff --git a/tests/helpers/utils.py b/tests/helpers/utils.py index 803fc98c76..a1f1382030 100644 --- a/tests/helpers/utils.py +++ b/tests/helpers/utils.py @@ -5,6 +5,7 @@ from letta.functions.schema_generator import generate_schema from letta.schemas.agent import AgentState, CreateAgent, UpdateAgent from letta.schemas.tool import Tool +from letta.schemas.user import User as PydanticUser def cleanup(client: Union[LocalClient, RESTClient], agent_uuid: str): @@ -27,12 +28,19 @@ def create_tool_from_func(func: callable): ) -def comprehensive_agent_checks(agent: AgentState, request: Union[CreateAgent, UpdateAgent]): +def comprehensive_agent_checks(agent: AgentState, request: Union[CreateAgent, UpdateAgent], actor: PydanticUser): # Assert scalar fields assert agent.system == request.system, f"System prompt mismatch: {agent.system} != {request.system}" assert agent.description == request.description, f"Description mismatch: {agent.description} != {request.description}" assert agent.metadata_ == request.metadata_, f"Metadata mismatch: {agent.metadata_} != {request.metadata_}" + # Assert agent env vars + if hasattr(request, "tool_exec_environment_variables"): + for agent_env_var in agent.tool_exec_environment_variables: + assert agent_env_var.key in request.tool_exec_environment_variables + assert request.tool_exec_environment_variables[agent_env_var.key] == agent_env_var.value + assert agent_env_var.organization_id == actor.organization_id + # Assert agent type if hasattr(request, "agent_type"): assert agent.agent_type == request.agent_type, f"Agent type mismatch: {agent.agent_type} != {request.agent_type}" diff --git a/tests/integration_test_tool_execution_sandbox.py b/tests/integration_test_tool_execution_sandbox.py index 3f64b28740..e7824673c4 100644 --- a/tests/integration_test_tool_execution_sandbox.py +++ b/tests/integration_test_tool_execution_sandbox.py @@ -9,20 +9,14 @@ from letta import create_client from letta.functions.function_sets.base import core_memory_append, core_memory_replace -from letta.orm import SandboxConfig, SandboxEnvironmentVariable +from letta.orm.sandbox_config import SandboxConfig, SandboxEnvironmentVariable from letta.schemas.agent import AgentState from letta.schemas.embedding_config import EmbeddingConfig +from letta.schemas.environment_variables import SandboxEnvironmentVariableCreate from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import ChatMemory from letta.schemas.organization import Organization -from letta.schemas.sandbox_config import ( - E2BSandboxConfig, - LocalSandboxConfig, - SandboxConfigCreate, - SandboxConfigUpdate, - SandboxEnvironmentVariableCreate, - SandboxType, -) +from letta.schemas.sandbox_config import E2BSandboxConfig, LocalSandboxConfig, SandboxConfigCreate, SandboxConfigUpdate, SandboxType from letta.schemas.tool import Tool, ToolCreate from letta.schemas.user import User from letta.services.organization_manager import OrganizationManager diff --git a/tests/test_client_legacy.py b/tests/test_client_legacy.py index 3d907fa373..202adf17f5 100644 --- a/tests/test_client_legacy.py +++ b/tests/test_client_legacy.py @@ -249,8 +249,8 @@ def test_streaming_send_message(mock_e2b_api_key_none, client: RESTClient, agent send_message_ran = False # 3. Check that we get all the start/stop/end tokens we want # This includes all of the MessageStreamStatus enums - done_gen = False - done_step = False + # done_gen = False + # done_step = False done = False # print(response) @@ -266,12 +266,12 @@ def test_streaming_send_message(mock_e2b_api_key_none, client: RESTClient, agent if chunk == MessageStreamStatus.done: assert not done, "Message stream already done" done = True - elif chunk == MessageStreamStatus.done_step: - assert not done_step, "Message stream already done step" - done_step = True - elif chunk == MessageStreamStatus.done_generation: - assert not done_gen, "Message stream already done generation" - done_gen = True + # elif chunk == MessageStreamStatus.done_step: + # assert not done_step, "Message stream already done step" + # done_step = True + # elif chunk == MessageStreamStatus.done_generation: + # assert not done_gen, "Message stream already done generation" + # done_gen = True if isinstance(chunk, LettaUsageStatistics): # Some rough metrics for a reasonable usage pattern assert chunk.step_count == 1 @@ -284,8 +284,8 @@ def test_streaming_send_message(mock_e2b_api_key_none, client: RESTClient, agent assert inner_thoughts_exist, "No inner thoughts found" assert send_message_ran, "send_message function call not found" assert done, "Message stream not done" - assert done_step, "Message stream not done step" - assert done_gen, "Message stream not done generation" + # assert done_step, "Message stream not done step" + # assert done_gen, "Message stream not done generation" def test_humans_personas(client: Union[LocalClient, RESTClient], agent: AgentState): diff --git a/tests/test_managers.py b/tests/test_managers.py index 388d477c60..2b0ff7517a 100644 --- a/tests/test_managers.py +++ b/tests/test_managers.py @@ -35,6 +35,7 @@ from letta.schemas.block import BlockUpdate, CreateBlock from letta.schemas.embedding_config import EmbeddingConfig from letta.schemas.enums import JobStatus, MessageRole +from letta.schemas.environment_variables import SandboxEnvironmentVariableCreate, SandboxEnvironmentVariableUpdate from letta.schemas.file import FileMetadata as PydanticFileMetadata from letta.schemas.job import Job as PydanticJob from letta.schemas.job import JobUpdate @@ -43,15 +44,7 @@ from letta.schemas.message import MessageCreate, MessageUpdate from letta.schemas.organization import Organization as PydanticOrganization from letta.schemas.passage import Passage as PydanticPassage -from letta.schemas.sandbox_config import ( - E2BSandboxConfig, - LocalSandboxConfig, - SandboxConfigCreate, - SandboxConfigUpdate, - SandboxEnvironmentVariableCreate, - SandboxEnvironmentVariableUpdate, - SandboxType, -) +from letta.schemas.sandbox_config import E2BSandboxConfig, LocalSandboxConfig, SandboxConfigCreate, SandboxConfigUpdate, SandboxType from letta.schemas.source import Source as PydanticSource from letta.schemas.source import SourceUpdate from letta.schemas.tool import Tool as PydanticTool @@ -413,6 +406,7 @@ def comprehensive_test_agent_fixture(server: SyncServer, default_user, print_too metadata_={"test_key": "test_value"}, tool_rules=[InitToolRule(tool_name=print_tool.name)], initial_message_sequence=[MessageCreate(role=MessageRole.user, text="hello world")], + tool_exec_environment_variables={"test_env_var_key_a": "test_env_var_value_a", "test_env_var_key_b": "test_env_var_value_b"}, ) created_agent = server.agent_manager.create_agent( create_agent_request, @@ -482,20 +476,20 @@ def agent_passages_setup(server, default_source, default_user, sarah_agent): def test_create_get_list_agent(server: SyncServer, comprehensive_test_agent_fixture, default_user): # Test agent creation created_agent, create_agent_request = comprehensive_test_agent_fixture - comprehensive_agent_checks(created_agent, create_agent_request) + comprehensive_agent_checks(created_agent, create_agent_request, actor=default_user) # Test get agent get_agent = server.agent_manager.get_agent_by_id(agent_id=created_agent.id, actor=default_user) - comprehensive_agent_checks(get_agent, create_agent_request) + comprehensive_agent_checks(get_agent, create_agent_request, actor=default_user) # Test get agent name get_agent_name = server.agent_manager.get_agent_by_name(agent_name=created_agent.name, actor=default_user) - comprehensive_agent_checks(get_agent_name, create_agent_request) + comprehensive_agent_checks(get_agent_name, create_agent_request, actor=default_user) # Test list agent list_agents = server.agent_manager.list_agents(actor=default_user) assert len(list_agents) == 1 - comprehensive_agent_checks(list_agents[0], create_agent_request) + comprehensive_agent_checks(list_agents[0], create_agent_request, actor=default_user) # Test deleting the agent server.agent_manager.delete_agent(get_agent.id, default_user) @@ -566,10 +560,11 @@ def test_update_agent(server: SyncServer, comprehensive_test_agent_fixture, othe embedding_config=EmbeddingConfig.default_config(model_name="letta"), message_ids=["10", "20"], metadata_={"train_key": "train_value"}, + tool_exec_environment_variables={"new_tool_exec_key": "new_tool_exec_value"}, ) updated_agent = server.agent_manager.update_agent(agent.id, update_agent_request, actor=default_user) - comprehensive_agent_checks(updated_agent, update_agent_request) + comprehensive_agent_checks(updated_agent, update_agent_request, actor=default_user) assert updated_agent.message_ids == update_agent_request.message_ids From b9345f62891f4ba76f1b9b7f63b358fad1de6091 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Mon, 6 Jan 2025 11:50:37 -1000 Subject: [PATCH 181/280] fix: Fix flakiness in tests relying on e2b (#513) --- tests/integration_test_tool_execution_sandbox.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tests/integration_test_tool_execution_sandbox.py b/tests/integration_test_tool_execution_sandbox.py index e7824673c4..4a497d8e09 100644 --- a/tests/integration_test_tool_execution_sandbox.py +++ b/tests/integration_test_tool_execution_sandbox.py @@ -44,12 +44,6 @@ def clear_tables(): session.execute(delete(SandboxConfig)) session.commit() # Commit the deletion - # Kill all sandboxes - from e2b_code_interpreter import Sandbox - - for sandbox in Sandbox.list(): - Sandbox.connect(sandbox.sandbox_id).kill() - @pytest.fixture def check_composio_key_set(): From efa44380cea05f1eb2dcab2123a21f9ee7572bad Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Mon, 6 Jan 2025 13:04:17 -1000 Subject: [PATCH 182/280] feat: Inject per agent environment variables into sandbox (#514) --- letta/schemas/agent.py | 7 ++ letta/services/tool_execution_sandbox.py | 12 ++- ...integration_test_tool_execution_sandbox.py | 75 ++++++++++++++++++- 3 files changed, 90 insertions(+), 4 deletions(-) diff --git a/letta/schemas/agent.py b/letta/schemas/agent.py index 57268645fa..cbd9e2041b 100644 --- a/letta/schemas/agent.py +++ b/letta/schemas/agent.py @@ -83,6 +83,13 @@ class AgentState(OrmMetadataBase, validate_assignment=True): ..., description="The environment variables for tool execution specific to this agent." ) + def get_agent_env_vars_as_dict(self) -> Dict[str, str]: + # Get environment variables for this agent specifically + per_agent_env_vars = {} + for agent_env_var_obj in self.tool_exec_environment_variables: + per_agent_env_vars[agent_env_var_obj.key] = agent_env_var_obj.value + return per_agent_env_vars + class CreateAgent(BaseModel, validate_assignment=True): # # all optional as server can generate defaults diff --git a/letta/services/tool_execution_sandbox.py b/letta/services/tool_execution_sandbox.py index d0a6f4069a..9eca9fcbfa 100644 --- a/letta/services/tool_execution_sandbox.py +++ b/letta/services/tool_execution_sandbox.py @@ -98,7 +98,7 @@ def temporary_env_vars(self, env_vars: dict): os.environ.clear() os.environ.update(original_env) # Restore original environment variables - def run_local_dir_sandbox(self, agent_state: AgentState) -> SandboxRunResult: + def run_local_dir_sandbox(self, agent_state: Optional[AgentState] = None) -> SandboxRunResult: sbx_config = self.sandbox_config_manager.get_or_create_default_sandbox_config(sandbox_type=SandboxType.LOCAL, actor=self.user) local_configs = sbx_config.get_local_config() @@ -107,6 +107,10 @@ def run_local_dir_sandbox(self, agent_state: AgentState) -> SandboxRunResult: env = os.environ.copy() env.update(env_vars) + # Get environment variables for this agent specifically + if agent_state: + env.update(agent_state.get_agent_env_vars_as_dict()) + # Safety checks if not os.path.isdir(local_configs.sandbox_dir): raise FileNotFoundError(f"Sandbox directory does not exist: {local_configs.sandbox_dir}") @@ -273,7 +277,7 @@ def create_venv_for_local_sandbox(self, sandbox_dir_path: str, venv_path: str, e # e2b sandbox specific functions - def run_e2b_sandbox(self, agent_state: AgentState) -> SandboxRunResult: + def run_e2b_sandbox(self, agent_state: Optional[AgentState] = None) -> SandboxRunResult: sbx_config = self.sandbox_config_manager.get_or_create_default_sandbox_config(sandbox_type=SandboxType.E2B, actor=self.user) sbx = self.get_running_e2b_sandbox_with_same_state(sbx_config) if not sbx or self.force_recreate: @@ -292,6 +296,10 @@ def run_e2b_sandbox(self, agent_state: AgentState) -> SandboxRunResult: # Get environment variables for the sandbox # TODO: We set limit to 100 here, but maybe we want it uncapped? Realistically this should be fine. env_vars = self.sandbox_config_manager.get_sandbox_env_vars_as_dict(sandbox_config_id=sbx_config.id, actor=self.user, limit=100) + # Get environment variables for this agent specifically + if agent_state: + env_vars.update(agent_state.get_agent_env_vars_as_dict()) + code = self.generate_execution_script(agent_state=agent_state) execution = sbx.run_code(code, envs=env_vars) diff --git a/tests/integration_test_tool_execution_sandbox.py b/tests/integration_test_tool_execution_sandbox.py index 4a497d8e09..04785c64b3 100644 --- a/tests/integration_test_tool_execution_sandbox.py +++ b/tests/integration_test_tool_execution_sandbox.py @@ -12,7 +12,7 @@ from letta.orm.sandbox_config import SandboxConfig, SandboxEnvironmentVariable from letta.schemas.agent import AgentState from letta.schemas.embedding_config import EmbeddingConfig -from letta.schemas.environment_variables import SandboxEnvironmentVariableCreate +from letta.schemas.environment_variables import AgentEnvironmentVariable, SandboxEnvironmentVariableCreate from letta.schemas.llm_config import LLMConfig from letta.schemas.memory import ChatMemory from letta.schemas.organization import Organization @@ -323,6 +323,41 @@ def test_local_sandbox_env(mock_e2b_api_key_none, get_env_tool, test_user): assert long_random_string in result.func_return +@pytest.mark.local_sandbox +def test_local_sandbox_per_agent_env(mock_e2b_api_key_none, get_env_tool, agent_state, test_user): + manager = SandboxConfigManager(tool_settings) + key = "secret_word" + + # Make a custom local sandbox config + sandbox_dir = str(Path(__file__).parent / "test_tool_sandbox") + config_create = SandboxConfigCreate(config=LocalSandboxConfig(sandbox_dir=sandbox_dir).model_dump()) + config = manager.create_or_update_sandbox_config(config_create, test_user) + + # Make a environment variable with a long random string + # Note: This has an overlapping key with agent state's environment variables + # We expect that the agent's env var supersedes this + wrong_long_random_string = "".join(secrets.choice(string.ascii_letters + string.digits) for _ in range(20)) + manager.create_sandbox_env_var( + SandboxEnvironmentVariableCreate(key=key, value=wrong_long_random_string), sandbox_config_id=config.id, actor=test_user + ) + + # Make a environment variable with a long random string and put into agent state + correct_long_random_string = "".join(secrets.choice(string.ascii_letters + string.digits) for _ in range(20)) + agent_state.tool_exec_environment_variables = [ + AgentEnvironmentVariable(key=key, value=correct_long_random_string, agent_id=agent_state.id) + ] + + # Create tool and args + args = {} + + # Run the custom sandbox + sandbox = ToolExecutionSandbox(get_env_tool.name, args, user=test_user) + result = sandbox.run(agent_state=agent_state) + + assert wrong_long_random_string not in result.func_return + assert correct_long_random_string in result.func_return + + @pytest.mark.local_sandbox def test_local_sandbox_e2e_composio_star_github(mock_e2b_api_key_none, check_composio_key_set, composio_github_star_tool, test_user): # Add the composio key @@ -470,6 +505,42 @@ def test_e2b_sandbox_inject_env_var_existing_sandbox(check_e2b_key_is_set, get_e assert long_random_string in result.func_return +# TODO: There is a near dupe of this test above for local sandbox - we should try to make it parameterized tests to minimize code bloat +@pytest.mark.e2b_sandbox +def test_e2b_sandbox_per_agent_env(check_e2b_key_is_set, get_env_tool, agent_state, test_user): + manager = SandboxConfigManager(tool_settings) + key = "secret_word" + + # Make a custom local sandbox config + sandbox_dir = str(Path(__file__).parent / "test_tool_sandbox") + config_create = SandboxConfigCreate(config=LocalSandboxConfig(sandbox_dir=sandbox_dir).model_dump()) + config = manager.create_or_update_sandbox_config(config_create, test_user) + + # Make a environment variable with a long random string + # Note: This has an overlapping key with agent state's environment variables + # We expect that the agent's env var supersedes this + wrong_long_random_string = "".join(secrets.choice(string.ascii_letters + string.digits) for _ in range(20)) + manager.create_sandbox_env_var( + SandboxEnvironmentVariableCreate(key=key, value=wrong_long_random_string), sandbox_config_id=config.id, actor=test_user + ) + + # Make a environment variable with a long random string and put into agent state + correct_long_random_string = "".join(secrets.choice(string.ascii_letters + string.digits) for _ in range(20)) + agent_state.tool_exec_environment_variables = [ + AgentEnvironmentVariable(key=key, value=correct_long_random_string, agent_id=agent_state.id) + ] + + # Create tool and args + args = {} + + # Run the custom sandbox + sandbox = ToolExecutionSandbox(get_env_tool.name, args, user=test_user) + result = sandbox.run(agent_state=agent_state) + + assert wrong_long_random_string not in result.func_return + assert correct_long_random_string in result.func_return + + @pytest.mark.e2b_sandbox def test_e2b_sandbox_config_change_force_recreates_sandbox(check_e2b_key_is_set, list_tool, test_user): manager = SandboxConfigManager(tool_settings) @@ -506,7 +577,7 @@ def test_e2b_sandbox_with_list_rv(check_e2b_key_is_set, list_tool, test_user): assert len(result.func_return) == 5 -@pytest.mark.e2b_sandboxfunc +@pytest.mark.e2b_sandbox def test_e2b_e2e_composio_star_github(check_e2b_key_is_set, check_composio_key_set, composio_github_star_tool, test_user): # Add the composio key manager = SandboxConfigManager(tool_settings) From 2e65688eeb221f7734d1a808637ac694dafd5ff6 Mon Sep 17 00:00:00 2001 From: cthomas Date: Mon, 6 Jan 2025 16:04:32 -0800 Subject: [PATCH 183/280] chore: auto run formatting on core pre-commit (#516) --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 626308cc21..a92299fc44 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -19,14 +19,14 @@ repos: args: ['--remove-all-unused-imports', '--remove-unused-variables', '--in-place', '--recursive', '--ignore-init-module-imports'] - id: isort name: isort - entry: poetry run isort + entry: bash -c 'cd apps/core && poetry run isort .' language: system types: [python] args: ['--profile', 'black'] exclude: ^docs/ - id: black name: black - entry: poetry run black + entry: bash -c 'cd apps/core && poetry run black .' language: system types: [python] args: ['--line-length', '140', '--target-version', 'py310', '--target-version', 'py311'] From 0241931c8a3cfe22396b9f84a3d86a2b5fee2b0f Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Mon, 6 Jan 2025 16:53:25 -0800 Subject: [PATCH 184/280] feat: add pagination for listing agents (#517) --- letta/server/rest_api/routers/v1/agents.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index 986c8512f6..96d29777b5 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -46,6 +46,8 @@ def list_agents( ), server: "SyncServer" = Depends(get_letta_server), user_id: Optional[str] = Header(None, alias="user_id"), + cursor: Optional[int] = Query(None, description="Cursor for pagination"), + limit: Optional[int] = Query(None, description="Limit for pagination"), # Extract user_id from header, default to None if not present ): """ @@ -66,7 +68,7 @@ def list_agents( } # Call list_agents with the dynamic kwargs - agents = server.agent_manager.list_agents(actor=actor, **kwargs) + agents = server.agent_manager.list_agents(actor=actor, cursor=cursor, limit=limit, **kwargs) return agents From b4741336fec0fd65beabaf841d8a94040b9e6c45 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Mon, 6 Jan 2025 15:05:30 -1000 Subject: [PATCH 185/280] fix: Update `save_agent` to also save the per-agent environment variables (#519) --- letta/agent.py | 1 + 1 file changed, 1 insertion(+) diff --git a/letta/agent.py b/letta/agent.py index 483d3cb81d..4c1bc4e0cf 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -1075,6 +1075,7 @@ def save_agent(agent: Agent): message_ids=agent_state.message_ids, description=agent_state.description, metadata_=agent_state.metadata_, + tool_exec_environment_variables=agent_state.get_agent_env_vars_as_dict(), ) agent_manager.update_agent(agent_id=agent_state.id, agent_update=update_agent, actor=agent.user) From ab749a2067a55b5d812ad4d51bf6d224b02be09e Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Mon, 6 Jan 2025 15:08:49 -1000 Subject: [PATCH 186/280] fix: Export AgentEnvironmentVariable in __init__.py of ORM subdirectory (#520) --- letta/orm/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/letta/orm/__init__.py b/letta/orm/__init__.py index e083efce2c..4bf7e44c19 100644 --- a/letta/orm/__init__.py +++ b/letta/orm/__init__.py @@ -8,7 +8,7 @@ from letta.orm.message import Message from letta.orm.organization import Organization from letta.orm.passage import AgentPassage, BasePassage, SourcePassage -from letta.orm.sandbox_config import SandboxConfig, SandboxEnvironmentVariable +from letta.orm.sandbox_config import SandboxConfig, SandboxEnvironmentVariable, AgentEnvironmentVariable from letta.orm.source import Source from letta.orm.sources_agents import SourcesAgents from letta.orm.tool import Tool From f0ec7ace9d18ed7d2c59f0b8771f48cf2d9066a2 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Mon, 6 Jan 2025 16:27:02 -1000 Subject: [PATCH 187/280] fix: Temporarily disable `save_agent` from updating `tool_exec_environment_variables` (#523) --- letta/agent.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/letta/agent.py b/letta/agent.py index 4c1bc4e0cf..91db2e8a37 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -1075,7 +1075,8 @@ def save_agent(agent: Agent): message_ids=agent_state.message_ids, description=agent_state.description, metadata_=agent_state.metadata_, - tool_exec_environment_variables=agent_state.get_agent_env_vars_as_dict(), + # TODO: Add this back in later + # tool_exec_environment_variables=agent_state.get_agent_env_vars_as_dict(), ) agent_manager.update_agent(agent_id=agent_state.id, agent_update=update_agent, actor=agent.user) From 16a4c36770f5fcb7b4901690af6bf1e6c5acad4f Mon Sep 17 00:00:00 2001 From: cthomas Date: Tue, 7 Jan 2025 11:18:58 -0800 Subject: [PATCH 188/280] fix: use bash for pre-commit hook (#530) --- .pre-commit-config.yaml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a92299fc44..a375dacd19 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -13,21 +13,18 @@ repos: hooks: - id: autoflake name: autoflake - entry: poetry run autoflake + entry: bash -c 'cd apps/core && poetry run autoflake --remove-all-unused-imports --remove-unused-variables --in-place --recursive --ignore-init-module-imports .' language: system types: [python] - args: ['--remove-all-unused-imports', '--remove-unused-variables', '--in-place', '--recursive', '--ignore-init-module-imports'] - id: isort name: isort - entry: bash -c 'cd apps/core && poetry run isort .' + entry: bash -c 'cd apps/core && poetry run isort --profile black .' language: system types: [python] - args: ['--profile', 'black'] exclude: ^docs/ - id: black name: black - entry: bash -c 'cd apps/core && poetry run black .' + entry: bash -c 'cd apps/core && poetry run black --line-length 140 --target-version py310 --target-version py311 .' language: system types: [python] - args: ['--line-length', '140', '--target-version', 'py310', '--target-version', 'py311'] exclude: ^docs/ From f311c4aba156f5758f56e20e59490a2d29df7f91 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Tue, 7 Jan 2025 09:19:31 -1000 Subject: [PATCH 189/280] fix: Fix per-agent environment variable updates (#527) --- letta/orm/__init__.py | 2 +- letta/services/agent_manager.py | 29 ++++++++++++++++++++++++----- tests/test_managers.py | 2 +- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/letta/orm/__init__.py b/letta/orm/__init__.py index 4bf7e44c19..437956a55d 100644 --- a/letta/orm/__init__.py +++ b/letta/orm/__init__.py @@ -8,7 +8,7 @@ from letta.orm.message import Message from letta.orm.organization import Organization from letta.orm.passage import AgentPassage, BasePassage, SourcePassage -from letta.orm.sandbox_config import SandboxConfig, SandboxEnvironmentVariable, AgentEnvironmentVariable +from letta.orm.sandbox_config import AgentEnvironmentVariable, SandboxConfig, SandboxEnvironmentVariable from letta.orm.source import Source from letta.orm.sources_agents import SourcesAgents from letta.orm.tool import Tool diff --git a/letta/services/agent_manager.py b/letta/services/agent_manager.py index 92044a0cbc..9ec76b233f 100644 --- a/letta/services/agent_manager.py +++ b/letta/services/agent_manager.py @@ -338,11 +338,30 @@ def _set_environment_variables( # Retrieve the agent agent = AgentModel.read(db_session=session, identifier=agent_id, actor=actor) - # Replace the environment variables - agent.tool_exec_environment_variables = [ - AgentEnvironmentVariableModel(key=key, value=value, agent_id=agent_id, organization_id=actor.organization_id) - for key, value in env_vars.items() - ] + # Fetch existing environment variables as a dictionary + existing_vars = {var.key: var for var in agent.tool_exec_environment_variables} + + # Update or create environment variables + updated_vars = [] + for key, value in env_vars.items(): + if key in existing_vars: + # Update existing variable + existing_vars[key].value = value + updated_vars.append(existing_vars[key]) + else: + # Create new variable + updated_vars.append( + AgentEnvironmentVariableModel( + key=key, + value=value, + agent_id=agent_id, + organization_id=actor.organization_id, + ) + ) + + # Remove stale variables + stale_keys = set(existing_vars) - set(env_vars) + agent.tool_exec_environment_variables = [var for var in updated_vars if var.key not in stale_keys] # Update the agent in the database agent.update(session, actor=actor) diff --git a/tests/test_managers.py b/tests/test_managers.py index 2b0ff7517a..f1b2c621eb 100644 --- a/tests/test_managers.py +++ b/tests/test_managers.py @@ -560,7 +560,7 @@ def test_update_agent(server: SyncServer, comprehensive_test_agent_fixture, othe embedding_config=EmbeddingConfig.default_config(model_name="letta"), message_ids=["10", "20"], metadata_={"train_key": "train_value"}, - tool_exec_environment_variables={"new_tool_exec_key": "new_tool_exec_value"}, + tool_exec_environment_variables={"test_env_var_key_a": "a", "new_tool_exec_key": "n"}, ) updated_agent = server.agent_manager.update_agent(agent.id, update_agent_request, actor=default_user) From 6b706513c7707b13d707065bfa326eb75d8641d9 Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Tue, 7 Jan 2025 09:19:45 -1000 Subject: [PATCH 190/280] fix: Give default for `tool_exec_environment_variables` on `AgentState` (#531) --- letta/schemas/agent.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/letta/schemas/agent.py b/letta/schemas/agent.py index cbd9e2041b..896419e116 100644 --- a/letta/schemas/agent.py +++ b/letta/schemas/agent.py @@ -80,7 +80,7 @@ class AgentState(OrmMetadataBase, validate_assignment=True): sources: List[Source] = Field(..., description="The sources used by the agent.") tags: List[str] = Field(..., description="The tags associated with the agent.") tool_exec_environment_variables: List[AgentEnvironmentVariable] = Field( - ..., description="The environment variables for tool execution specific to this agent." + default_factory=list, description="The environment variables for tool execution specific to this agent." ) def get_agent_env_vars_as_dict(self) -> Dict[str, str]: From e60acf5b13bd21eb35a7fdd711f4edad4a1dc783 Mon Sep 17 00:00:00 2001 From: Shubham Naik Date: Tue, 7 Jan 2025 12:10:05 -0800 Subject: [PATCH 191/280] feat: new desktop (#508) Co-authored-by: Shubham Naik --- alembic/env.py | 1 - letta/__init__.py | 2 +- letta/client/client.py | 3 +- letta/functions/schema_generator.py | 1 - letta/server/server.py | 1 + letta/server/static_files/index.html | 4 +- poetry.lock | 1381 +++++++++++++------------- pyproject.toml | 4 +- 8 files changed, 675 insertions(+), 722 deletions(-) diff --git a/alembic/env.py b/alembic/env.py index 767b7bbdbf..8b60f2d474 100644 --- a/alembic/env.py +++ b/alembic/env.py @@ -20,7 +20,6 @@ else: config.set_main_option("sqlalchemy.url", "sqlite:///" + os.path.join(letta_config.recall_storage_path, "sqlite.db")) -print(f"Using database: ", settings.letta_pg_uri, settings.letta_pg_uri_no_default) # Interpret the config file for Python logging. # This line sets up loggers basically. if config.config_file_name is not None: diff --git a/letta/__init__.py b/letta/__init__.py index e67194c6f6..388f3a668c 100644 --- a/letta/__init__.py +++ b/letta/__init__.py @@ -3,7 +3,7 @@ # import clients from letta.client.client import LocalClient, RESTClient, create_client -# imports for easier access +# # imports for easier access from letta.schemas.agent import AgentState from letta.schemas.block import Block from letta.schemas.embedding_config import EmbeddingConfig diff --git a/letta/client/client.py b/letta/client/client.py index ae75e9eb1b..2657b8db49 100644 --- a/letta/client/client.py +++ b/letta/client/client.py @@ -35,7 +35,6 @@ from letta.schemas.tool import Tool, ToolCreate, ToolUpdate from letta.schemas.tool_rule import BaseToolRule from letta.server.rest_api.interface import QueuingInterface -from letta.server.server import SyncServer from letta.utils import get_human_text, get_persona_text @@ -2010,6 +2009,8 @@ def __init__( debug (bool): Whether to print debug information. """ + from letta.server.server import SyncServer + # set logging levels letta.utils.DEBUG = debug logging.getLogger().setLevel(logging.CRITICAL) diff --git a/letta/functions/schema_generator.py b/letta/functions/schema_generator.py index 6f5bb52f9d..5ba9d2bfdc 100644 --- a/letta/functions/schema_generator.py +++ b/letta/functions/schema_generator.py @@ -3,7 +3,6 @@ from docstring_parser import parse from pydantic import BaseModel -from pydantic.v1 import BaseModel as V1BaseModel def is_optional(annotation): diff --git a/letta/server/server.py b/letta/server/server.py index 9d6dd85928..932e3c2c44 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -180,6 +180,7 @@ def db_error_handler(): exit(1) +print("Creating engine", settings.letta_pg_uri) if settings.letta_pg_uri_no_default: config.recall_storage_type = "postgres" config.recall_storage_uri = settings.letta_pg_uri_no_default diff --git a/letta/server/static_files/index.html b/letta/server/static_files/index.html index 8819c00c28..c7fb2c379f 100644 --- a/letta/server/static_files/index.html +++ b/letta/server/static_files/index.html @@ -7,7 +7,7 @@ - +

    Maz@; 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 z13%0A+%st?kRpwdVt%ig`YxiME@%jNdDO_XEwR@ z4hJhZG8InMa^HMdnoMuE^MDjWMSCd=2?#P6IU23&Ikx8mE?eZHxTMUqN$S)d)?FB5 ztPc4!pmvx1WyKMmvgP;+)r)tSW!RmA@dIX(>dK*B%9Z-Y|KyOK{r{xCV-6uX9m>KcVMAT z#DKCy#|*zm0;GqSTTvkHRV&Co?z-1f(839uqmsWg;O^or(2cTVdd2Okry|P1O8z{s z(hVx4f_|GeS5lZN`W515-{@u%g*mMC4QZ(xee?lF-0|7nuoskhnuuAoz$CY29s)2C zjV0I01RhNJVQ0g~>Z0D;HgL&&g~EH#5{7ma2t1}AQuReX{W~n#?Nquj`J;o7%-)}f zjg)Rhz`ej-qdpy2geXd$`V-N@?0rM5afmuhLur!_tGZhJ(ywK{++-tiVVn_U?~vIS z5K*dzN5Z?pdA77A;1~DNQvnq22w2V!2vofmKjn zmVm8&cs48eo9M$LrqgDRYSl${B}Ul8FA#q8)IGclREH+f4J2imB+5wCIm|Bc0hNaF3O%NEW| z#EW;FeJrSl3+_bpKcnPsfuyRuI!JwQ#kUKA1aYF^Gq5sy_dDjNdS>4!DVGYR&Z2Y% zK6i__y}2e78u1+VYP6I*JCf`2Uqak(C-hbmSzZZf+L44VFt{0Qa z*cKnHImY_GDvAWrn2Bnz^@Cfv@!n^}x=GnQKdTvO2(*)YPL23Qm9#I+`_SzCa5!QL zCp2%SKB@Vpz;^4I3hc}z&VfJP_SGkjJ($(J_9=9LX(Q0D$s)269P(1Y&3+T5h(?i>wFEc|cHox4`^)vNYJ!1NK)>UnUl5@0Yy}miO^g0U+lQ8F- zSxU&XSFV{OmwjY$yFsFRb2{0ZHv(Nbj#;ey^O4bXEDFV8WQARnwf|m9{m7_n_%pYL z*qJdEe0C4yvd`)2R(MD9oY$4XkU&q7xF_wBnUp+imwfyvUuuJt#Gl*O;q(^5FKYn)(*#r9`*wjJ0z+$lD;i{7(E^ zNf#HA01A((LO+IX7=biRjYxZ#^%Gg$-rhhxc4g2S&c|<@H*?ewb$4w6EVMYrQ4gs8 z3U^Wa;l6+^p!1S7k;mp^qO)IvChYjE-t8Bdl?d<%x0CMWy+UnqV}Nm6zeCTAj-8P^ z|LCgHTr+O>bY31CCm<20!wDn8C96beBXx=I6`AEk;2raSb=Sjm|n?kB6 zjlYpu!MnPqY4eJ;U1zORnE3D0UHj~#q(XQa!P)hhrF&CZ8l7<=)8w;pqL!}nXb)vu zuKF8M;(b=7iDSuQ^UgD9PMJhN+8bgwn!;*gX2k#vn!4LrKU$OjI(2cp>qD4VZjwL< zgM{EAasx|qvD||vC6Mww*&inoW0ahugXOop92x+jNOQ-ENwOwT&&1{JcSOiWD(21Z znswvKsV6|sE+s%oAW+FK9K}z)Il6y&HFx)0K86zhClWzcaHhKrv6_(=aC8SAyb_^TZP zM+>d8Ro;ay8uZImJFIuRJ8(XbSdts8V-)N#tXauT==gOLN2!-VU7)AQVT>VXaaZTV$=^p!eX zOm>a}{CfZYYH950X5<3bj)_Xa5a1533%GIi29P|%S5s1`c^uVu$51?YHyG;cWlLkjEz% zYr1W#^Eg=|H-$J-TtCLPd78>F{Dgh^kQgza%Yj;I-6F7l(40yQCVXPwJiY-7=m|2Kc9H{WeEg z?+2aL|jWmt^pt(SGHI2}64ax^a7il?9-uVIz(I|R4lAX>_A@R+n z*-W8glm8%%IC49$JuNbEd((VyGlL{1ZW~}%C=2>R8rACqa7c`$YaWz5puSTOgD*=& zWB&CsqO)-R%>Sm&Pm749C^o{n%X>IlV?rYR-##4MyCdNnr6*<^Z z(X-h<@?E%U>J!DE1o%O3p%BYmjCu2Q)w54S=x6*lOP|F7irgCk%ej#XF5WwH_TyXU zD(Gxhd(vM{baLqMbJ|jnFpu2@*>USzyn2dC>v83a!e_)0?PdeE^CFcl(eP$g&!box z|J+-}N;}_T4>96T2BHp{1eD+J=*XSK{*^P7D&5Xf3>uX4l17wWW zEu~;M|EtZ>Nd3NK{PxQ+9-2s}aT$VE;JMS)2@-jzV#(DKIaxZX-O4b+thI%!452; znzOO5)X;%oV7TNC-TeHa(5|K5?cx4&s_l$%m1 zNJ^!IblSl!gwGgCf6!U9(OkV_r|H_k8MdII0w0pLKw zcTK&hmt_i+;nkOH1cYa#p}f_A?GtzAik68`A~d9O6iP$qiJ1~Wig?|)hkMnY#-0v0 z;VxDHdjL$@R<%y-?DM#mq?f7V{I|~}6^IH0my2wxU z=32qzAuyiyp&`@B%=uLHJQ}Urs38H1Okz0?w?Pl7#nd-%^*`OD(T}QA7Lrtu;|;&M z+BSJZd)KUBUwz?$+(}DXkH9~rM-7GBF6LQGkR+Tsuf46aOeqJIS8o`Zqox7YIsS}m z)1gQ^Ay}Lnha-;@7X-x zZ*(|p!ZF15#Z8T8MB8+t8c3qTQ%Wfq12Z>p72Z9+V2)O=APWe=e+POm(5ruq@;}t2 zx9obvx^EJY(9qx#syd^Wnm~^|)!n=(*?+UN2_~UW1iOPP*F?@ zU%P)jgfuzpV`jh;t=>;VzmV{H&UG{`E(rkQ&5{ofn%r z66*@8mQq)`E8s(zC5g}Y6aWtyRxIKZO@Yb1>V{f3ne)tY)N+FQkOAp7`%h@W*KF_} zfsbe91btm|IT3deuNeAPDR5;t4Zk>+x{zx;x>tw6{5*2r%ObKu7LyjikOucP+hV*& z_Kgt7iP?A96}U>2FU>Yk2`?&l`<_7$S!LH**equ+m{48inc}2LmJod2C~2dwF5FRJ z2Or&M82T>>(X)1EHA*~qFjvAr3}8bX*ZF$9-F z?;86k@7>A#5%y6X>NG_dNj|T86nK$ii@ddl8nJ;RljMDIG0LdGzSA%*z zKF^az&xEukRJwlfeeeU<=()Z;z z?Hg&+k$B%cQhpGYG)GFpK&oNg^$w@wN$A9K*h>IPRc^+sPhy)u6TY4k| zDiT{GvT}_htr@Atx`0w=E*6D#-P?8(sIy6k!iV2d1FZ}%x6c#0Yp;}5ZmNgn_f_#F4%EYaw8OLD z*C_PMACcNuL>vx1IVWpGgq=|8bG&jgaOuPCLXTd_!QKRXWq=&m*##klf*CjX6gS47 zrmX>&`c74C&Q8u9gnV!Ih`6)yG~;+hV)zu4WG3;LHjgrKqL&NYb@furK1uQ?PG%+z zbAslEq0P`^!Wmy2djGmh(YGrMG24eac>2VqgR%SGqbiuLRkxQ^4a^z~h;Iv`eiYN0 zdgnS`81$t+seggeiUGzPAL^$K?m3gb2T-aDgoF4dL8Tm@l`>ns#|KAF$FOG&KnNl8 zPpvPMT21B=Pe%}8RzP^=HXEe!hCKK|+RF=o>A-zW8)*$$v`ZK_1;j4WGCX+Xo;j}N zKX2W+L7WmmA=w{z=^0Q`WzJ%OrI8lH*6mCm@+B!n{cU$Jm zT21S{r(c0k#JBW~&DyK;{hXiFH}&o@VVp{h#c=a_GXH_m)V(A#b%riP})v| zRD3z>hk#PEjrrHzydBRngEQ=Zz%f3fd6H#6`w8<8ua0QEC6@Hn8gZnV*|}F}xRa4W zo5I19(hxn(@swXR*9KAv>!O5S0Bj#3s>yJDlK_fA(!3edl;wFU5d~yT$(@k1d=SWb zez#vd93B^2a4vP2wPDdn4)iIoCEO3J>;()XCaFdXGGFyvTxVx#{6;!QU~-=ED#Jvg z;2~iFdq(H{D49J_8D0T(SZ}?I{fMeVM?+T#oL4;-eUEz=P4NwWH1RGV-_S1ba?59) z^!}A>LO*_O9n1F+d7dtPT<5}qjarQb$$AU#$F2-|V@2fL@~qW;IqxGuu4ex3RPyZk z*-v4N6JBG$ajHXWW2u(tub44&hDuB{ed{PSa_lxVBak&}$Kot-JtatvaJd824W1AQ zHl}lmwyzV)L4~5Lj4bleUHB}KYN#6O-0`=)447wa%9e}P~8xn*MEPRnQQ2NoaDTM!~7Szt^s?aBMT zeU^uRjn;FgG@`-A`{(lkx*s>si;nQPR;uRJE^&ETX2h-Um%FfI&J?ZY1i}moA=F-5 z;T<`t=}ZrIdZv2RtWiC+EOqiA*#dl+c0hKXl&l94{+@Pnm(#D594R zN%zaw&jj%{Kpv1ZqBxwrOE?Wd>yP`%iX3j2r;Z?6T1-3MOW09i8pQ!O$meiQrqQFB zZ+&Rk<~hw`&k0Ic=NX8PY5aH>W`pmNNvpHhHRs{Y41VSQ;FoyCAd3Jc)-s+qSrxA` zbi}{xr{6)0)#Z+7qx&YfxP7EKV57y!;+fg0J`<5Xnxiu3<7PRG;@F|xzKyz?mwE{B zER+KS1rkwfnqYbL2-woEjW`%StsI&MV0F2+4gk-7nc}yNSDh)<`ZDlw>W42@T8eLv!P$y*=aP9DkwZ())Tgl1O@DYj&DV}Z??m}(l-Z;3CGLeqz$ySVb+ko3B z7c{#0P6$rOC_vu#+w85IUZy|P+;)3jWnQn+q3?;rZyiWTT`|<8@$Yf^fO!Msu@W|J z&e?J7mo%OW%Y5I@O`Iutv+6=dINr~EzyTW$t&zIK?UNzE$+Jqk6JF=0=um|ak@k1% ze6|X3zlH2<%nFePc{M^rnp=W2!$zk^8N?A4e$Kjh0IUDAArKohmT6Z)y#>I}zeszH;7Mj1x@X`x>gZKGC}k%f$_btk7O z*DDw!`$i#i-dMsjpSX(Ru5_n(+m`}^{95xDj$ibyxZ9m`)qClg)TBCTtLvj)(Wb>I ztY+1jiNp^)sIu7d3gkCPBMNNryhmCt4-Gd9L0O9r&T*}briZ$eIWJSPDAPD#F=+^H) zFXbyM&8jZMu2|~TjHD=n9W=o+<&ki;tNeG(VQ3zNbubc{#ESGui1lqZQ5S_HIuP6jY__;IF6sFmp7&(mo`y54v9I|44xs%h%bm-y9p52A5?U3C1Lj@}%=rUjXGo+rm<$+VI^p12u$w{v%ggj~4ym&4#uaPT%u*c+fbu`E5{0&vdVAHx3r>l~z&*(1H zf|jqLt$aRuvmis%)WrsBkGQVi{l^X0O!LUv3INyy$_-KNdm5&QTHiJJZ&-Ap{+B}t z$WqQXNPI4q7{?N-$TFul7qly{q@Q7B$OFG`bFBSwoP9ljk@NxTTZ{ODWLc!=Wo2qBL^?^$^ zaDlsfoJy!MG#hcVV17x=^&xkJPdFx=ERJo!FitdJh0O|~)zB%BI3x;H|SA3*hl&-POR@c=u0ET*&gjuFwK@H56hx?fB zOh$b!;+|wzhbXscUT08;0txTImnwra!Pe(;o+f?K<4N0B~!fEj{* zOMDVB=?ZUmTrNlBpDB?%Ln;Wb9=8w@ea6c!Sryk0xUueB-y~FbC9EGCq9PV+q?L2k z(r;xr10y;7@$QkGLm) zPmc<{>~+rsf17`F^+P2uB|=9Jeu}K>ma*Hby{g*IFCG$H8N26$7}`k48zMhaWkagM}uqFS!4C&gjg zzqKbn>bTmIQ2Qie8WgI0{_DqNNyosPtAtG}5i@R)nCz3y)1}Y#BizxqlgM7JvA8)- z@sPazi`%UN5K3N4^R1F_2U~zF#&|yvfl*DqQX1a8DVR=BU#g}(&;fY_br?FeYa$?x z_0t2aW5Eh%fh>!fm955jD}Dl^z*%b};IGBmB1tf%<_*vlMit;r(@a#%%8qWJ52MC- zuK~glY1g@59i=?-*dn645RM@Ra*{X}rT~+HgaXhb=TmzaSpl$PT4Kp-tR*cTV(J*y z@J`uHmr47+rI9)4p(BnwWntzx=faFDEAWFsYgqc-rb@Sur`vUZ8t(de`?(A2=(vgC zKefAWbxE>Z3pL|^(D6%&N`+mJDhpO=zw?rYyW1^6Pr3|;vqqVqOINpeD$!?MyKnz&gLZ3EQ;{`VQSG{<< z`3ScM9Mc>%Yu73D%O8PBRAgwI-lKGoQ~tKNuna~}%TkNsC4P1_l?!`lMg(EsY@YG9 z%r@#7)=}!aSxZ)iPshr~y8gLbzn?cHohlrnd9HMdMhr!nWL>*hYnOVdG0izlS;&=} ztxnO5-oXq}bs|iE)pUbyXii@4!Jiw1)hA4LEixT6+lHBORD+5!Mb1Vz%@*;Ikz>|~ z0tem-O}Laj`ejEoilM^$qEg2)MO1OJ8k78G;}tOB2(!uvHQMhC?DvizRjzyA;&R*o zyMiC_UTy?Y7-VutLuMx07D(2X>|Q4IGq|PRjB>f%0X4X+Xvgrier%4utW`$?`kbB7 zKZ)I1dPfc0xx&R-1CJSibe&2CbB`#{B8QYail2z^+E|k2mshAN-nFSLVyHP$rQT)q zoLhxEReeTzyTJJ{6Ey)d#X8$&^o4bjjw9=WvmSoQFn)i@!X&Ui#rJw)7xA6UVV@k^ zy3PdHidp-`B%Lu--gR%EF}UlxcS=H8yVMN-JI27?D3WTSY`KNMdqTWVi)rz5-DNaM zde+FZ72VRg!mBV%psGc3y12mmkc*navx%+YY(?^?X*({%FZZ^3GMn~2Wf?n^ycM{l zD{PT-@hPsxYT^f3qZ&mH8w~gMzQvyFiFs}~SKA@-U@XvE24-2?E62K4p*bVW89XD zJ%i9^v6Fgh#(6hz9h!mm6>GrwL6<~kc{QaofF5qM)}_B;U0f zuBlgp&Qt!6LW^>z2c6#>fzN^~>UYwL!yM~NQetHP;5S$mKN)0j(QOvc%$-{*uw<9# zA+rl1<=2|2UmhEq*wB<<-w~RJ2&46cm?jypLRFunloU1)RBo){X$az`ZS7HqQQ2{~ z+5X|&**7Rze&2p=t!>u(wp7>=RrhXNk*awl6Y?u*^6RcMIl7b&bp`~tu>kojf$_wXX0N&s}t@`5=Quoj$W--PG63#9`N8MG3 z*#zGa&l8MHFaLmvKZm}no0vB!6k)nv1sFUOTei;jBNR`b2>C7I5JoVW51)#4>w?&V zz4Ge2-(d3y2Un&qW5@YRcqAo9!%J_eM8gZXETFDN4al&J|9+H zaf+TlK&1-ECOR)DIE*YDUU@r6n>MMu+gcUur_@F>Rg2+(8y8#!pVg0~0WDOq8a%CFF2FuR9>%(=&DO#zVqDR`|yhqxa?_+Z~UnJa|z&i~2X`w$8x-gD>E5~Hv{FaA= zD+xe55I;8XJ?yNA7&$CZVra1LG3c4Uu*l5kW&LZ^tF!xXwEV05d>~Uf4IHf)Gu)7^BarQ1y%gOa0ovra85)#1bJ{QaN2UaoZy$q#SDldNx=6XA5 zXD<^#K>E0>XKuz$vngW~fqsu)8?UY^8Knc7HLdB#Z?V0?Lti76Zb*9|7mO|lVa(l_ zqiRULM_{QLd)%owJnu_Z$S$Z4d*IGLL_3~bKWK1t$hYh|czuA(+UrZiXRz{)M^dZt zjLz4lK-0)5F=X;>+#aEg4ya_)!`bFlJ*H0WFaln%u~B>dtCfFP0Z)YNt2S0LyFB3FZOq zV(!|BbzsK*3I%B3ruexyxVO+GUQpqVa$ajpJr1^fJq#6X%Tk*~ z!}XMU3-_vhsK`7paRtF*PDqYO-dNA36(*9eJlqi<7+rX+f=$yp2$#BF@-@N-{X;$dWIqD&Fh+5OzE*N1epcOU8~ey zbbbgM$(RaN#u;EJlbN#auLD-3R z(*Q8&B(}_$>T}}U-GhX!>cIwEvgjjTRH^PnKL*mVF`M36Y^=|21@kIQ-9{e=S0b;9lOwqh6hb&dypJ zR+MbN%)aynwTEwC?TK9qAt|vn&((%Y3dgaUV)k7I60VJ0FXshmq%73!W6zS*(WMPI zmdy;RR#u8(id>CJcOe?%RdF$XcbXy~aO>cy^3M;LCGVCupMRMh*o zP~g_(*Q6?<%Vn8=)GsD#TANEf5qhdyMuBW{aU7|iTqunJ>s(636^=`SFcNs?!D4{a z(yau7C4eHMumU>D0n6O+na|fwwFoWROoR_b8G?KPX(WOubhM#JGw)5r$b&`Zz(zJP zAh+{5`uWpy1#S-JWCLA1&r4~}2H}u-0Vx}pxiAGDR=WEn*iRHZHGWTp*|}_d9gbj4A3X4Iu_~d1WMz)Xa;A~ zm)*t#Jfd%ajvtmM{lGAgj{mXOqnPhtFXd>S$U#NJPQRB==EP(cIM_LAdASU?$KyR% z6(@~CZ16U7B)YT@w_y(F(s2=6Yqg{?=#qVWz1IH!e*gCj{Pzs}Kb(Pn)P;U{-BpjV V4TeSzi|fFb?gf4A9Ie~W{|9)}Z0P_1 literal 0 HcmV?d00001 From 65702c8c9339d159cd58c0ecd986f2a53244acdf Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Tue, 10 Dec 2024 19:23:48 -0800 Subject: [PATCH 067/280] feat: add print for sqlite error (#2221) --- letta/server/server.py | 75 +++++++++++++++++++++++++++++++++++++++--- poetry.lock | 2 +- pyproject.toml | 1 + 3 files changed, 72 insertions(+), 6 deletions(-) diff --git a/letta/server/server.py b/letta/server/server.py index 1a5de01e96..8f87e611a0 100644 --- a/letta/server/server.py +++ b/letta/server/server.py @@ -156,6 +156,11 @@ def run_command(self, user_id: str, agent_id: str, command: str) -> Union[str, N raise NotImplementedError +from contextlib import contextmanager + +from rich.console import Console +from rich.panel import Panel +from rich.text import Text from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker @@ -166,6 +171,37 @@ def run_command(self, user_id: str, agent_id: str, command: str) -> Union[str, N config = LettaConfig.load() + +def print_sqlite_schema_error(): + """Print a formatted error message for SQLite schema issues""" + console = Console() + error_text = Text() + error_text.append("Existing SQLite DB schema is invalid, and schema migrations are not supported for SQLite. ", style="bold red") + error_text.append("To have migrations supported between Letta versions, please run Letta with Docker (", style="white") + error_text.append("https://docs.letta.com/server/docker", style="blue underline") + error_text.append(") or use Postgres by setting ", style="white") + error_text.append("LETTA_PG_URI", style="yellow") + error_text.append(".\n\n", style="white") + error_text.append("If you wish to keep using SQLite, you can reset your database by removing the DB file with ", style="white") + error_text.append("rm ~/.letta/sqlite.db", style="yellow") + error_text.append(" or downgrade to your previous version of Letta.", style="white") + + console.print(Panel(error_text, border_style="red")) + + +@contextmanager +def db_error_handler(): + """Context manager for handling database errors""" + try: + yield + except Exception as e: + # Handle other SQLAlchemy errors + print(e) + print_sqlite_schema_error() + # raise ValueError(f"SQLite DB error: {str(e)}") + exit(1) + + if settings.letta_pg_uri_no_default: config.recall_storage_type = "postgres" config.recall_storage_uri = settings.letta_pg_uri_no_default @@ -178,6 +214,30 @@ def run_command(self, user_id: str, agent_id: str, command: str) -> Union[str, N # TODO: don't rely on config storage engine = create_engine("sqlite:///" + os.path.join(config.recall_storage_path, "sqlite.db")) + # Store the original connect method + original_connect = engine.connect + + def wrapped_connect(*args, **kwargs): + with db_error_handler(): + # Get the connection + connection = original_connect(*args, **kwargs) + + # Store the original execution method + original_execute = connection.execute + + # Wrap the execute method of the connection + def wrapped_execute(*args, **kwargs): + with db_error_handler(): + return original_execute(*args, **kwargs) + + # Replace the connection's execute method + connection.execute = wrapped_execute + + return connection + + # Replace the engine's connect method + engine.connect = wrapped_connect + Base.metadata.create_all(bind=engine) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) @@ -379,7 +439,9 @@ def initialize_agent(self, agent_id, interface: Union[AgentInterface, None] = No if agent_state.agent_type == AgentType.memgpt_agent: agent = Agent(agent_state=agent_state, interface=interface, user=actor, initial_message_sequence=initial_message_sequence) elif agent_state.agent_type == AgentType.offline_memory_agent: - agent = OfflineMemoryAgent(agent_state=agent_state, interface=interface, user=actor, initial_message_sequence=initial_message_sequence) + agent = OfflineMemoryAgent( + agent_state=agent_state, interface=interface, user=actor, initial_message_sequence=initial_message_sequence + ) else: assert initial_message_sequence is None, f"Initial message sequence is not supported for O1Agents" agent = O1Agent(agent_state=agent_state, interface=interface, user=actor) @@ -500,8 +562,8 @@ def _command(self, user_id: str, agent_id: str, command: str) -> LettaUsageStati letta_agent.attach_source( user=self.user_manager.get_user_by_id(user_id=user_id), source_id=data_source, - source_manager=letta_agent.source_manager, - ms=self.ms + source_manager=letta_agent.source_manager, + ms=self.ms, ) elif command.lower() == "dump" or command.lower().startswith("dump "): @@ -1267,7 +1329,10 @@ def get_agent_archival_cursor( # iterate over records records = letta_agent.passage_manager.list_passages( - actor=self.default_user, agent_id=agent_id, cursor=cursor, limit=limit, + actor=self.default_user, + agent_id=agent_id, + cursor=cursor, + limit=limit, ) return records @@ -1914,7 +1979,7 @@ def run_tool_from_source( date=get_utc_time(), status="error", function_return=error_msg, - stdout=[''], + stdout=[""], stderr=[traceback.format_exc()], ) diff --git a/poetry.lock b/poetry.lock index e6cf38e0dd..dda0b0bac7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -6222,4 +6222,4 @@ tests = ["wikipedia"] [metadata] lock-version = "2.0" python-versions = "<4.0,>=3.10" -content-hash = "78621cd10122e3b41658020d0711b61ffa379b251e2a012854f8a92cc37ff3c0" +content-hash = "9c623c4d8c98b3fe724518428bb48ae85f8152453f200f767e13f48c59e0fe13" diff --git a/pyproject.toml b/pyproject.toml index a0eb14abbe..e0531b10c4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -69,6 +69,7 @@ pathvalidate = "^3.2.1" langchain-community = {version = "^0.3.7", optional = true} langchain = {version = "^0.3.7", optional = true} sentry-sdk = {extras = ["fastapi"], version = "2.19.1"} +rich = "^13.9.4" brotli = "^1.1.0" grpcio = "^1.68.1" grpcio-tools = "^1.68.1" From ff6000000225847e44f170dfd0c55c2c3b1dd840 Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Tue, 10 Dec 2024 19:23:58 -0800 Subject: [PATCH 068/280] chore: bump version to 0.6.3 (#2225) --- letta/__init__.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/letta/__init__.py b/letta/__init__.py index 1ca57b875d..a9d3f60639 100644 --- a/letta/__init__.py +++ b/letta/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.6.2" +__version__ = "0.6.3" # import clients from letta.client.client import LocalClient, RESTClient, create_client diff --git a/pyproject.toml b/pyproject.toml index e0531b10c4..8d0a4d912f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "letta" -version = "0.6.2" +version = "0.6.3" packages = [ {include = "letta"} ] From fd80131bc505a2b490f42fae40692ea3b3248b5d Mon Sep 17 00:00:00 2001 From: Sarah Wooders Date: Tue, 10 Dec 2024 21:43:45 -0800 Subject: [PATCH 069/280] feat: fix message create/update schemas to simply schema (#2223) --- letta/schemas/message.py | 6 +++--- tests/test_client_legacy.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/letta/schemas/message.py b/letta/schemas/message.py index 0e58bacf33..0d2f77a715 100644 --- a/letta/schemas/message.py +++ b/letta/schemas/message.py @@ -4,7 +4,7 @@ from datetime import datetime, timezone from typing import List, Literal, Optional -from pydantic import Field, field_validator +from pydantic import BaseModel, Field, field_validator from letta.constants import ( DEFAULT_MESSAGE_TOOL, @@ -54,7 +54,7 @@ class BaseMessage(OrmMetadataBase): __id_prefix__ = "message" -class MessageCreate(BaseMessage): +class MessageCreate(BaseModel): """Request to create a message""" # In the simplified format, only allow simple roles @@ -66,7 +66,7 @@ class MessageCreate(BaseMessage): name: Optional[str] = Field(None, description="The name of the participant.") -class MessageUpdate(BaseMessage): +class MessageUpdate(BaseModel): """Request to update a message""" role: Optional[MessageRole] = Field(None, description="The role of the participant.") diff --git a/tests/test_client_legacy.py b/tests/test_client_legacy.py index fff0e466cf..2ee9229337 100644 --- a/tests/test_client_legacy.py +++ b/tests/test_client_legacy.py @@ -15,7 +15,7 @@ from letta.orm import FileMetadata, Source from letta.schemas.agent import AgentState from letta.schemas.embedding_config import EmbeddingConfig -from letta.schemas.enums import MessageStreamStatus +from letta.schemas.enums import MessageRole, MessageStreamStatus from letta.schemas.letta_message import ( AssistantMessage, FunctionCallMessage, @@ -27,7 +27,7 @@ ) from letta.schemas.letta_response import LettaResponse, LettaStreamingResponse from letta.schemas.llm_config import LLMConfig -from letta.schemas.message import Message +from letta.schemas.message import MessageCreate from letta.schemas.usage import LettaUsageStatistics from letta.services.organization_manager import OrganizationManager from letta.services.tool_manager import ToolManager @@ -671,7 +671,7 @@ def test_initial_message_sequence(client: Union[LocalClient, RESTClient], agent: empty_agent_state = client.create_agent(name="test-empty-message-sequence", initial_message_sequence=[]) cleanup_agents.append(empty_agent_state.id) - custom_sequence = [Message(**{"text": "Hello, how are you?", "role": "user"})] + custom_sequence = [MessageCreate(**{"text": "Hello, how are you?", "role": MessageRole.user})] custom_agent_state = client.create_agent(name="test-custom-message-sequence", initial_message_sequence=custom_sequence) cleanup_agents.append(custom_agent_state.id) assert custom_agent_state.message_ids is not None From d063ee675f699f12e9546735aed21d52fcd730aa Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Wed, 11 Dec 2024 13:39:40 -0800 Subject: [PATCH 070/280] fix: Update README.md asset URLs to be absolute (#2227) --- README.md | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 877e5d0a1b..b73622f6a9 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@

    M!&9|9mm&W0*^!Ij?hgT;?y6?{|<{F(w6{ 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�*0V8fQWUS|E9iel0421m>OiDyKg2Xek_i<{(hSg3z_2r^|EHc+aZ zzFm0HTdj-(Ii!=LMj~cu@horY(7QidmnvuV@Got|GxWe1sza59uU7c}sV{>ltdhnr zft01X|4RY>V_NTXIOS}XKOJlDTJPHf3%hX*=j91wF}+$z`Oe>@DUbypUNKL>%c$v< zlA_Eb^WhqKgE5#)n8mD~tp{$UMx)(K5PQCqq!AV-wV+a<#Ie;25y^S;3F+Vdp&|7@ zwQE(HNiu!21)kcRSN_neD*EUuXG_&aKq5sr0)Vu&I7tczT--0}S1{0##x>%72{1t6 z{6inHxQlnt0v%IANHxB4ew(aOl^)lZ~A10ul}!MWhH@Y#U=ir8^Kj5SZG?k&CT=B`*N%JF{nv(S0v)c5}6 zQ-#5Zkx*tSjfRFUB}|hAF(0R&F@)y++q`I-q>^1Biq3dJ;SEPQ4(LI41fC#P}4C{S96GJ#hx;IPt%jiU7-`n10_4Lt|l~~-}7U~(8|8d zQjin|=IXC9=Y26`XPt+`O!rgKx*BVPX?Lm22b!(d$aa@wJno))YNc-n0s&jAVA-p! zES5wYK=RMG5mUgrbPu~U%k#^2bQh?jHU0a4q7y6110o zo^3Z9@vWRqcl2J4uP+8?aLQ(s!g+Vp&3SL!xopJiBP4LqXH}kurdkGFhh3#gzrB1< zXzthhCFT7G{1@z8gwr)D(B|bvb{CTo4X5-T=d27;)pQqjwsjx3O|)=65*!jijdBKk z?V7RXh1+L%6#0_bd|<5}Fa3OTtWHlQL=Uo5J3*`F;BgIDloTe>yd?$G`ZxOZ;j;3h zs=a9L#cv5kG`1Q|poZAKWgbfu(hJP*oGSp$b91j-WT&IHK~Qlv*@A!EgnNiPb(f!E z4>G|Fctv;l5Xzm>BWsL49sFaz=`YR*BjHY==OIxf2CGIS&%Ho3r zj?Bbz{Vd++44M`1^U!(aAKSyX=`}skDc()ARXaPtBOY{0H%tX~m}di`nlOa3?Gek3 z+kspyH5l=Dn)2zQe)FjBW`_WyRbr_lX&+Cl9Kt}jv&x~fKd0~?`lovToTR5_icrvD zgYA+;Kh@av;s}*buTiDg!>!t_8=#qlv1?k2Z#wKzs~MoqR&1(#}VWm{nNtX!8J@y z{EwY7jkEskeAasmEYpRhzOs(zf=|0NsBePD2+jC z|I#CA@Rnxh)2iH6%re(pC7y@xZM&>q)b1E09B>8Gj^HF5>u%L><uGQQJ1@RB;s_B

  • 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 e-*wWf^8Nv-h5vJ$tQnt!pg|ziOnz%6y8MhK7b! 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ί>PS4YCtIBv;VBv1F^J6}IoY3TDc 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

    VtKtA)0{7jn6i3_Mglv;Fp zPrTFjmP|Ml5k(4qIYlfAVnbOe1RIgbJ!dOoC9(K5s(EF8>@c5~>NlPt?NxILHeS|Ql1qobr87qlST7eRtQO)s z#y!4t1B#0CZr*ZpJ)25%c3cz#bVKjCOJFxnvskT%WJ^pek2SdB&o0@YQZV0_ZsONk z#M9!ZM*{Z@kV(Em+9D+&a6-CPLGQYcPm5p|2V1abCg}tDP89gkJY1}Lo8_SiJMro5 z&onJ=Jx-61$v1fEKce7+zOcqEHZo>5- zWjK-$`!j7+z}z=6MC=RTI!u~LtxXlzBY6V&Fe4ncVU*Ew+XYvdx%Wn=x}(A?p*U_q zGPIz%9dfSZq~uYn{+s}4tmx`{)J7=>5^C^AO7Cl}pW5Snx12eCE0kHRRZDIQ_v_Q8 zZLWZfj|c8_evF7ffBN%ozPLX1AKC)ro4{4slzXU|$8N_Z_ywtVKh;1FQPCWg7~+JV zV_-nXPol|4b-et59k@(6k`8BQcA~#ccK_p)PY9@CoJk@cUs|~@q6&fQQ6u%x22ry~ zuy~p6Iq1YxzitBa2-5z(9<5~1^6gILGB4k=!A}195Z~`h2DDYm^PnH(-e_?*s0>{% z0^c45z5N44MIyhyFlpMfG2pe}oTj zUPK--ip4x6BEPD{iF;<|vz)5ni$X(tNC|YoDJ7dc9e8_VF_6$>?x4X#^FLMuv>%{? zNP&MVaN9-k10=D96@+Fq-GD{ZY2c;bRgK4*L94gNwdkoy7ISi`#w9sqU`4Sxx(Q+= z|Dn<)6ovEyxQ;i8U#z)0{h%(Mg$JnX$<^`3qN*g-np0o2EPl$}%= z@{t5APAdagh(OVM7VLQzE42SP%wjrAc!c^}{LNCt7O5gVP?zd8tz+sIlIw9V=428~ ze)EC6gpYekAl^QsfGfk?1%xA>7YMT~pMlZ_<&*PV{~7>S?YzEw4}aH)MJCXAdrsj< zNJU zn$an5%y#^}WgE)ml1mDfDk+V8bOry>9X{aUtd?hiB^wq_8d~%~RCdTQE3_2jTo-m# zW3dCCPrSV)l@tDcSlB>A%SDoS4e1)2{|&X$`*l)>NlSgfoUA%3)r!$rA>$|T{zPlt z_oL4SN7+tC*`9-m*ax`MW6>SezCx{(lcMvW!n=~x^2w9cF^H_XH2nZVqWJhgiHM~z z4Y9(911q1wPRBb4&l~D;A9zB`d6jW4+a!yC+bpxnq(o8-q#DN=WquCAk5tKt62x7g zo(0m6D*kYc61fN$MDv6$S$2GOj^eoB9u5JXZ{;f1=Nevogz*&^k5FX(n1}sH`5I#X>ukU7GJQ~GFN7h+^SoE zM&7W_-auD7UNTDb zr4awz0HGfschA|KGXASAaq>jK1+3tqfeMT)Ry);AR)ZtpmVJ{B4dZ?qAiwU2F7oX4 zT)n1KUXSY3*mWd-340x?cCl%j+;7@((*|d=_)kMATm+{c6%9VbJO>en@7f(P&6t9U z{l_~zbKh*Lj!Mz}H2aU4c9s!^C_^N3Q;Ladw2peu{E2JBVuwSUq=aYDF?s%*Nd8~s zTLFFVPZwOSHUx))h~MC?VpFOoVz*KMh$)OL%}&t?4_dtfvRhU|Bmwg4o0yNvnI0tP zBy+H)^g@F2{LOSlHj4p32{S56{+%!>h!h)x=E=dH21=5^u_Z%}_#^zy5~bEU&44*< z@%Ng2xd%E*7u%*X^ixHS?*x|-6-3T2YUIUc2IZ~pARf;cDJzMk!Wy}k^cvA-A1Qbn zJN4voz5Dq8xoQ7Vk!7_p9>KsDJVM`6-o*fwEwFtn!)Yt%>T+K1RTMURv3^B1Px$el zMvEJab<{`CTCczUl}0Z#!n2MpV#Mme5Q|ZJy5*Vsz#s}H2m73ok$)cG4;Bi!<`EcK zoF|m8>t@XFxUm5JysILwnZ4Ivis>TFy;FG9?#fP^)3QII(**}$OH`mpDj#vKTByk$ z*9{!86>gfUrAa?mFW2j^N?7BNQuO64+2w(0cVMnX(WqQ9XP?n3kXA%pkk8l{<1jdq zxL}oPx=Mf+QwnNkYpzZV8T@U=B)EH+8&*9edhm$T&9Iv~! zy-^8j#6nuXiH|tto&Yw}#^Y@kgeDD* zq34S^qKkayg#cYIOIn%@M!sHO`#k)&Y@PIC#GgfVzZY-WN_%DWp4lq(Y2l&rM6$glQQ2ot8JK$M1A%BcEY$zDljFlQfmaolxyPCMf|MG_%JTu8Vg6HTInC19mD%kVOladCxP^5>fKlc;n=Si+ z{skeWXS@Z~%_VRLGR25a_$&f$9&#c+)58UT&YG)9zd{;3x~k+E8|=AbSh+@eQgT(Z zj(xpW0OZ_&y}rF&Vp{z>b@erRjzbQS@Eo^TNlEA(@C&?32QK!A+nKhO3_;uAo3%6O zV&FHdrl!6rw-t5`6<;bKsr$3Oku-l*t8fDhuxbS_HbE$bF5RDYCkpMEZ|a*ivZ$pt z_#CzlwOn8VqgaAe~FxmTQ~CcoZT(XF8#50-*eirt`6phkTY4d#$QujPBP#&qA& zdB^pOfZG!`L~EQJxXHEV26!COxqc9u)6z&ry)!V-{m77ZC<$qBv0q%LZn(YPs~|i| zUCE{8NBX`a?VBovUp`Af&AG72@!Mrp&m`V{8BJnjSZ~V)H{?8`A(_C0&zI;ei$)L# z*u3WPP*WW+f6_^MqhDnWoGA4N3d#HK^>`TAIp5O(+IL}vkh*j> zbfSSsyZ9lG)OZFjHg}cH0S^?vkKS(u9vX?Lyj46!U#)HbcmTStM!tL{+#O#$(9W3I zeR^osV~b(Qe1&@cHu`9vG7}tU6r?ci2)l^A!l za5j3h8c<5fg5WY^%%8?qXqAZ5g~c7z&5sgLQbStJ-;rL>^otL>w^-iX=_Cl{pJ@=f z0YZo0gI+#o8!E2Sek&T{$S1JlZbirXMGv>5wufvgG2eIcBFLtD8elX5>y-+(9@uR{ zDn-pJrA3%?&Z5{-ZBi0^k2vUAT4HP^0ML+10L}2;XXt~s%)p%-_>D=#9S5hr|IhK7 z)mdkZ~DefyRq!B&ko_r z96Rn_xxYcbM*QMDHExEY33MuSnGMZHUh#1cv!M zy9$anT7Gm+yxXUsUKwuW>|5q3G`>>s60 z@90^gcGddw8T`fxZOhrlhpiHa^+*Nt#jQ|Yhjy^P6W2a14$&abJO;0Z{vZehaW4z^?$v4cFQGB3k{cWS2X7p_xl{#@MEtTny?6I_JuV z{Z0pS%~f)jCcsaCwWwiw1FT4CD3OFm{*y*8TN<%0&=Z6#+v#lcVfItL?x6 zu{?u0^Ea^0NcaYgFg-c2Qqp9dawS0Gcc6qsNE~JAgw7OtBXJnkve=o$`@aIAa~B)_ z4yjO*VBtPMr}$sM;!!*jSG>##=bK1$&UUm^JBIVPUiV+DGCuk4ogMy!q<;EFS!`i*A4fURyoBmFzQ;xgN# z_GDeEfLwXNt_@eaRnQ7B?f_N87xXqV*QEp3!(7&Ta-Cf^8VnXN0z zZYI>Q$WFqH5_~ug*b<3(M&st-`y}CXd>vG9g#v zUY2PDr)@MQat}x`Ez|kd^SnO?XSfcPw{jiir!U-u5#XG9-OZce8(*Ahts5PPh?Twh z`L&IQ<>6NxoAdMsF!Tira%t)$`CPp40GMX%hjDz7J*ge%zy^~XXvv+IOPR0d+zDd^ zmDL^H07+a(8Qq2#w?V_DnQXG^+lu??TKlCJdX;Ul$``Gh$@=#hRVF29hm#jR5jW`W z$ALjPj}S#^I0#W-gy=s0aR@kbTsdka+1zvS(5xK|gvBZ1BJav*Bs}2Vem`a)f)Ee93)+DND zC{MRUw};5ChmCV^?b!bHzu^{KBoP#--T0V~c=10xlZRbutPaUd0@AkuCD@IxX2-*p z7#sKC^YE+kv~H;~^wT9KZa;wp&~ga{H69{9>(ao=K|rM!u%;+Mn^7mwu9E zq=z{TG3Wq-;k%~XAeoZbVal<|G3V0I8Z4hiE3P6d`}s69VwaENY40mBs}iNOVEIh` zmwUF$b2)XTJ5kq&=!raXZ2Bb}**wfDPxILcYCPO^6vgL3rUfPv!sN4w?Xeozq`CJ9OJmD#PuFi3a}uQH!g`5()~tRK)AW0=#uG{do` zdJk^Ayk1e7a%x5PO5M-+B6c||M4ML_{^A93mo`d-d#g%xcv0B&oLq)=!=w12?b!6peh}j7+}Ox}DNDZ4z1b1QNg%>3!8Rv_Hep zaHfeQubhKVP%y$oOad0`f5=QLcs8u|W;Dym$B(k0qodzN9VdnByKI%1oPFQ>GjAj6 zUreYLg2g5(*|JNt_*G!(riS}ET0?wRJwuw)s8;!QM8pJCMicYAqBK&5V?mfh(k32`QQ?h#Y6*cH8QM~xCe zGiWNJUg~oGSw73?K_@77xYU4omx<;f44QU!aE}ddJa{;I;7{j(D27I3i#i$P;FLA^CUtb+A7CDjd|DGla|0^Y|z?%*nO?LHoGVU%% zzR4oKKgPT3b;J`?<5MY{% zCC6$niLzy6(dg)M_a>-d$WiR)^BwSbzLF^gInl9Hpc2p|_I!JWtnF(6KHKKW@|#B7 zt{2g6mkKAj6*)Q$0wYXD4aZZ?+H+R`>_C?k9$6=6oy`b1;C0AJ0(qrI*z{#2y9jDU ziuH|!*DOG}Rc_?X8Wj4)wY-4Xh-_Y{It{GrDAOIf&OnqQwW@Z(AhyfA6* zH=F4^loRIx5Bc`(H6{#!jHSU-ENN_Kv~HVIxV`8`cq3xcCc2B|<7_p=6UA#Q_55Y#4smgC>VNG?5!!%q@* zSEBnXA-BnTB%R*xxFa0n`T9`D~^g*U=MRuqFIi=uOCw71?jy zH_v1^57oP%8T-Ad(am(;uxi6FER2I5S?WHr4-v=qp$uM4H*WY{deS$y0@2nq9F3-c z?Ucxer~eI0{ulXIm>unl{8-G%?=Nk}4Z_b5SZJaFa9YW?93)4gOGV}{on%INA0#xy z^l81C&Ha&Z7w3lYJGHB$S%1+COG5^5MS(ACi3?_uZ9^+I@Yg%T|`NAmg47tgA5ZQhDg0+-z!^pQ^IHBw`lvgaGboSA5?jW8O7u znNadOpPDmG(@ip4{jZ!!D-=|J@*W9JnUtfp0Ci2-hm*bwOEDV8r54blyGV}F?-j3+ zXXXdzfr5QReV#=R+#5*ziQ99EY8sPp21B_jiBgsI-21Qy*(7s~{XpVus+S?iSeea% zbD>ZBdtroBhX6`KiytYNy+^Y3r`3TIn@`{cJkzJu)8}Y&`HO6d4`74;)ss~*hc1Yr zI=acX03k`|$V45!LS#@0IK|*vx_Yp-L-;oQmA}X77A;6VFCHW$+KtbK)(oWCV3^ct zcZOVY)h}$Rq{fNdT(tEY^IK|ZnKDHsf+QRa>(4`FN7%ZD_T!ak4y43J8`m8{bI+rL z*QVFJ=zchcUph#lin1r+oCH z<#u{IL@Lzfsq{QxcXmF2YW^`dn|a{7`0G#0?>1Atj#ri;zt*{D^_>9zuyh>Fm6|n&rv`-m6BXPst*3A zJm%Cryq6z5$YmRZYwTT844W)f&yk43i z;P|co(SncQj)G)_DUj#kzeqqM+{t&CYU0f&$7YHvMVAjAcaN1A1$EUnYIk)Xkvuwn z^Vbl`B%J1HCv0m%)TXg@N9gcZQO+6058`0f7qz9PUuq;H$_Cv zT>@sPmTW)v&>oj=rS@JNwcczs)j7=j2~Q(2i+ISj+&Fdu8RofVE45$4w_$m8)H&Gzs*Y=EJfCV;x5o59GKt07&ZD3Bg4;=ovuEe9cRn>(n2V zC0>KKq%UZft$b}aA*e{0drwi6MIDFPwVn-F$jWlJL!8BVW~F>GQ>Q&;=N)F74bT{3 zeIuNWM-PiRdc7pI&Zx_FvpQ&GcV|kyAQV5lW+_nPNaQ+cM0MVAkJvqYc zcD!J~pjAvV(_?Q!th6w;+z=K`>!vrTAeA_|jg<1nlGylABbpmvswqnZih!Rg66|3^ z0{+rG*j&Qh1!ElhE*;JsB?FaKt<|Bgk44pThzq)4y`wgusUHoK>!IHKhs_omaTO#H zdw!dgXF#;gO9@r-!&kb z4)y63tG4-zB0uG$WiQ`bZlH3)@&C5(uOX;{_-+w%v7CmI2U$w$u}PU|im_@Yemzdi zo{w`JMawF`EP7a20~Of+{N)5Cm|?!+)Hw8YmUk%;G6eOWC6y3wLOXs(zy=#Zb4+oV zxLC*^4|ok=e`<#Jf5vXeeS^ycN73gz^`97 z@X@e_zjh-0h0eU~ydgF=);4BS-eZP4dfNf|`iSA%WzK3}WEFk3L$?t5_Ms8PejaxZ zB0<^U7kc44$FxFnjN^$RiAIYW8>mDtf$><<;YS2pYg57?5C=}M>NtN?^*AlEqV}=N za}`yydy!km_{W<$YBww+0q`fuGSEh6XY)`4HI3u~GUb~&z7Xw&sR_9uhI;|g(*cDs zHuZ?Oip_4Za}1VGH~%y(d%KPniIwtfo42*>hKF-%=2c({=wQyaP4FkFl!BD@lYXTP z2mY(nTPKeE=4n9g95$P z^ff_GZtt7|R2US)se*7yU7OYo)X!A;yF(x`Vhcnj+c~NU==5pNPe`FZiI<5zp5jm` zHXIls`(!XI3;pk~8(zuzUXoWfJn z4;RG^8Cwif?5JH`6ARTH+<&XUzhv{b!~mIq(AuG>z2~-EMrM)K^X*B`6T5nZ%f;h- z^+u(O0)Jma18$A0nG~YPbi{fafNw2;VBa=&M7(Ot^{+F{ zv-Qr;-5W0E-_g7%Y!{oW%qpB*;B@`aS&2 zq^2$~*Sr=+vCg~ZN;C{S>Q9n=vRzJY*p_U*(LaiQqIqjZ@jN@vz%U;0Dw+=)wrg=R zsJOp}wawfX%NT`>WQfc%_M7UJ=tjQb^e|bV9J%`A<^|1eK?{E0&?R%fikS8+vbYgO zoh>RjoONEFEo^+t^E%5B6qL&?@geFNzcd79$wd4Ii;$Aqrx@FLZXZ?=Fm~P_7k-~B z%Lu^#jcG5!m~hUluOiuIJ+GigiCAWjl%8zYAa+@NrGr2xdCi*h7*E6}~<_y%_DUzTpXI z<)|7;c>lmFziuKsBgM7rFTrE`uKmv2&=r<3ah3M7V7js&Z%sf7O@em{EU%FvV9R zwCPq}JzZf4P(HFnfjQ5=#Q4xUKGXztU&MkhV>M>(Ra$lkJZ>1veU;g}whZ==LzY84Eft5y`mgfS4U}FeH z^Bxm%mG1i*QQdqj=;n^)R@6=k^KfiYxS$Gg>*Nl+dLO`e)#eu#8r{0{1A>jh$Q&et zK)Vwx#R3YwgxoGw>+??KsER#bpQ<658fgxKK`k3TIP$8 zIXzaGmJnY?y}PU$8kxc4t_dRp+5l(S^WadjS_#=PWkM2<8ZDxZqZj@X2kv=Z%ALe< zY0$Wj$>f;|uvc%9=aZUD?!rz>)En!+_*A7M=*@3xJOC3$k64%yR&g6y0qP@dHF@} zi-o+$u{_^pWVS=x#83MVrw#ol3rAis;D(TAnLZ6Yr)6m@<1udfOpu=bpxPnz)KZ+} z@TArbmL5hxg+;rNwI)St3%%(+5A|^$8oWId2bXrXbe@B zs^^rrSKZe(pPb5cYEZFdiN3H%c+((rgRUzokhYaxs+;VC8}y+FqV>^0)OWk%W+V_5 zmmgH5ku{<~BpsJ04{_pt|2-kKqI;O)1p2A>ZZ({aa{3E8p(y=!0!{F{qk)iqQTMsm z)$g*Ent5Ed-LA8GzJ-W4DxTK9g}Y`08c$1Jd(Z(sf0pu=Elck8#_E=?bkuk2kVW6H~PyqG!*XB-w6dif>{d&%WaB6?kNtmxpyG<3quAKo%g8J&9(l>vMJZ7Cfa$9tuJglj4*Iu{W zP}?oz=1Jq3f24yu2M*>$REJF}{ydCG9H77F!Xop{`Jo8$z5F_N$7O7YB&Wg(BQG#N zFHIPgHFn2Qo3C~4OR>xJ`XS*FL(VsNoE6E5Sa35Plz3!iHIyu*DJ?aihqsn`w*~9H z+aEy4U$+oq9qdTEVMiB44tv?AkQ4q9At#Qa7Mfd-IWZxvw+r-NCf3&w0iU2a_?-N| z7UyqG=%+(F6)-}zF>Hk<6gXFd9-$f=^_<fnO8N`zWUH+xJRFF)6(k)LAHy@$Lc?P6lgb5B|Zd(E|N**(l~MyH z+c%+MdS?Ou?BD)}g2yg|bBkzus9buBd>ydblUhJdoGD^mM#GkK;sm+a`Y?>Gt3kX? zZ|nC0V^UZ<7jkRQxHny{UP@RQ zvxkG)W|prQbQtP$RLMNRS#e#>@>rphoYmw~lwQS*++~PMr0}AKRxssNfm~NukO$O6 zDMSBRGi|}QuYbb<=^vi`%y94$e^Z`f``s20d+eq^E?)J@^xc?aLMX}tMTr>*>~kuX7upb8F^H} zYgq4Ci}k))=2blIqzAe7_t;wT)Uz@@hz4)E{zf)b(TLGZdg&McfzRoNiuJ-5GAa+w zwY$SweX{RC=-9J%FR4gb7wiUy&Il)%5sJ&C*A)1lBtVCciBEZ-eN8lS{!@2)aywq< zit9B>hR8Yz*#N)QzDwP>4(H>riNgJ1=aIyl`|NdaVP00{81d5PT;0~@_ ztNF$AUJ3nAcrh5uC9N*CqSDyyqHSafW@HC3t~75ns47@#;a+^FI$x_QGW~jpH+0pF zE62%8sXIRCFhZG1$nL2x>mT7o5bMa~@mLC%4nEGpqWhIJD_yWzd%re;gAO^$LYuYx z4{JV3WgF4R!Yty?WaHfw--SEn22jToqmGI(~I9+s+1aHUZH~u_2sN*zhcM2 zcHe-nlj0R)wQk;U`?22T=O1V&B}#c)d8TkxU!8|o&Q(0$>4{HM{`*QvHzWs=jtr*^z?)KwUkYAN{dqp-WbvixFh zVGHk1L8q*}ZtTpkpTqvgsQ5pWnq!AAu+cUn z0CwoAZvJmyW|MCM@nojH4CQmr!pro)MyLZ+Z%#73&bYKkg=kUSq6q0nfW>9L2U)~t z8sEzuo1L!?X$g?7&^jtvHc{>iL1 z)+2CzKmH#bUBZ&|hUw>N5C*fhX0ALsmbOM9JyoYe-I^NO{Q+(x^YGJad$q4D{AG&_ zpL5_!dkpntk*2_oauNj*tKzt^eu@$H`d<`hO@1v|AD5QUnEF zpjQ6u_3j(E08~R*Wa+b-Y6goJwD5D%tGsoya6=}ZlHZ9TKHLU^iOIW5K1Zb6PV-G% z5q+=DDHOcE_~BLfIC>dTH3AtA2e;WdZ`N1{c_Mri!tn+36|+A@TP^UJQ@d{&*km;F z@WdTwUiAvF5A?my+Vg6H{4RT6%O5iSta#%lt0Z^xyb_zXK}IX^T@1cDC7RshMMlWo zaZCa1qMKB+PMqAlMDnWrWprU^Ls9AOn%0J3c3t_x*V=!7Tr=Xl36lji}aU zIz-}2uP&6GstaY&I4}#x{{|ux!6yri+RY0+L4lBIk&V~ccRu`Q&jxD2lCDLDY8|EeetaX!GmGVuL2{tKSKj@#a_+Cc3nvfl&n|@{R%mP?#4laG13S7 z9`_K5xYui#ZOzts#<^W8Zh4QWS<+d-n}NA2s955GirK;NIyqYJC^dH$%9z8QxFf7k*4$w$rK0_sC5*rFWRj2G9EC#^ZT5>UD$m8@jhPbQE z8V5=0?@pJ(S((<8Iq5#0$y|MK`{CM87AGP~?@mA|*^N)j-(6!nIlUIr*GE<~!n@e? z`D;&!R=zF2@S_t=O!UaMTO^0NVwlxXihxh@@{lj*dKBbs{8Kf#EkJl~UBTBK)Fn~J z>H5;sNU^^7Y+vR>t{9@3uTE-53IHgm=s@Xg|ckijD4oI)#eBFaa{1Ar+_B`zm)fRO@k{}vLvP$ z0`RhU)HMIw%#RpmM+d~^8KDQNtAy|(#L%=^vWoleK8vT7jhA`ty3oD3dR`P$gLoNY z`LG{++HaxxJ+a%3>&+X4ebX6x3H}k1!)a)g7otEvSXIZXKbxG#K5oo8cC+0T`{-An z6gJ-T6j?=WzqZDYKg{|bZHy@xrYCBO>3N9mSb#9sZUZj%9;!_yAAAmk3}V3r)4Rn% zFSFo`Vj>sU3-Y4`UEQx)mXCDPF2A|FDA3vRgMkI2r-8tgs>3`JQ<*@Hf z)RuD1RavRc)#~l_ebE-(Izy7eoV1ZhZ<{D_nFB}xtj%yUEgEjM)H18GI%|_HyuX{f zcfwf(A%`*~`}$fBz}-Y>JjAVm$w?9o7vnI;GiP<>E)bgJ&JsF&cL@1*zzs6>M_R>e zRc64D7NeCCIJNP{!Re7Ao*t^R&0f_891x3(<>hv^CvD&J{Q~4;y ze|5=a`mRM>Y8qWo(0Svy9MBoluvyJvos_*CxcF<1E3R+G8EiuN+J8|QvGuN5Uh*X^E~`k zfDouT-%>|fgmI#-vZ|KyB2uRs2{0=Bw^4m~druHcHiTjYkwPy--%5IDdS9m1Ts+^f z`}w)b7kQf70L(yN`j_Q?Pz~63;n(*%#wrLB3@OQnhUSjAckea&(0y@Nu@PqrCz5$y z?7xZ$&zP;Y!L${b_^B4GwX^l}o73`rB+J>)$#MQsJS1;dmiXA>CNX*kGu6&=KwwY2 z`0%)lvAdO}J5IYctW$5)%Fh5|?LO9R7EY&KfGW4xbWtX~q+sxkq+f`m{LAZ}7~EGX z+Mzvpqe8|v>qo6aw*VYO~%d5buuG#|o8{{rH)$AoW{#+|gIit=YWaI0G zRGalh3B4xh9S*-diBK+%6&dHi*-_ZugH3Fm{7cB)DCEFzAafQFKj6PCPiV6FCU6W; z{L{tUOsdqIFShd51e5g^0e;#X_zv6VgX~zN8|sdIS6Hx(%UhZhG%Nha6-}p)d}N>9 zbUoFdbGO<4ZT1Bx?3L7>Xja1eQh_g@de3(}Qkl+UMb{$A@Nq6TB%Ug|bcN-7Bq+xs zqWHuMRxrw+!6iMc1lXJqbZi2`X>giAk>R56{Q&HYEm4eA=+L)SK(V&Mi>2lMBnCNG zT9K}iB|#N6eD#9QdidSJ(gL&MICx_n7;hv&i+tA&!0`ieR0yihafuBmyEPCv5DT1saw+Q_wK4iZij8mPbQJVIP&*3u0X%b_6LJaqAzi&{m zFmRcIX@i7&F*v~EC|*fslI@OICjT+;t74(vRHxm!Do5dL)RW}lhM@ZE%(J+dfz%?_ zuezPk9;=!>d6=j8al?e?(xjc;bUK8q7b|+}8cN5dOSdE@K9T=)PD?JF-yzj^POipS z1bp{H({l)I=hpO@^w@bnvU7u9&SA>0pJ&kT z>qxi+OFY(A+tpOmY0n1-=ik`{cUzPz`b z59e@t+NX`LBYtumI-+pCeNjJ49H^A#(Nyx}5l_?AguGXp_4!`TlHK(&DIU(Brk?Bd zSea*n0n@WK*eAs}1wVgH+5k4d0r@QbN;^rGOXGd#gz0^5x1-+|2{qyunZKUO#xP*h z8m(^tq5|BnCdRzWy|c9_<{N&bbokAr*s23KmI%{_T{2*785AIqN^QC9gugN~fOte} zYi`g;&|334N04sKpc6@%9|jzo?XgH{RCJ$_n*Ov}906ns#D5x3H3M+hwBwgrZoa2g z!_$ZSL5(cxiaQ@os<&`s(~a^)*HJ%*gR44Kl~QU&63I0b{b-(F0UGPQ(lyXuD<&zi0R4o&?ocY z03*mMGP|f>^45`zlqR>_^Hkf-CJ-NF=oA3$e|I}rJ$w|epktut1~7G|$mt<&#B#Q8QPWYYPe`T7Nnfdb=0$jxj_$E!`O#y26TM?; z371X`y#d4T6>v>fH`Y&MNMD<%Po`%ceb=Ca0PytTFiYy~iy0Q%o6CbR_t}4T1~8h8 zSfBq|nYPDLp+?1sIKCzi=*qVp<2|7<1lt^l`!#&9zlFCO&4cz>@Numn2EsApfwYbc z%SDR;%NS0QE5U2)|29Rd0yH@Dxt>GxDm>KX_|(L0?zK)>O7U_15Uc3Iabr2Hnc#!O zPG%&lL-pgWtN?C@CYj?7kj-}-%TwReW!qF?l2Pi7`S;K#2}&zH|GIDeuS>O`GRTF@#Qu;rz^O8pN&Knj?5Hf8SgRpK3r@!o(Vvg}lU!P`uvH)1GA&hN<5OE!U&X9upMWrX z5K98m5vII{dCFA+5UNbiiGd)Kx_H1h-7wfkx5f04T!UFxSY5;-@k|hE&`Q&02$4Ot z{2kJw4_E*ag--P4c+Po;g){ptAu*RUyP8;%tzoFibG3GMf-K$rs|jiWDG6k$f#+l_ z`+rchAFqmQWC&07a_WQac{M&R{|G_uE#H&uYkk1WlJVSmi##3T5lR=s!?NSI&w@WT_>B@W;=ZSvbAU$oVJ%Cn<$@J%xs~ zjt=0v<%_EMmqL7l6kOSPlQK7Hi2l}_-o)cHiJp_S`y)Frf%0)(^#+}XMC0LgaIMwg zS>oba%}K2EJv;l++(AEmwut5no3H>?ury?S0?zilGD=SFMR_>J5uyjF(XO@1~vo^vezz8s=9Yd0hEvf&_;$6H0 z44ATfv^GWB?u^UE`)!M2g|Df*ig72rZBt2@6yGyF_n00BWfk-7z3(~`c#$T#=h63` zhE`v+#c@$Qqo?U9LZhR42bB8I@uB&=kMqHjQuveZK8Ry$w_m$x)`s#Z30Q%mU5|DU zqW1?Epcc%>P`)Z5RKy}**f2c3xE-(@eHksad=#ba7gsMaEfbXs;G)*yf$}iGqqxt0GXuIXPRzorxbvrNLhmV8ZjLNTh ze=*{69456z`l?hyzc{Gl6OKJK>tx|4z2x$6oO}Gx#}p@~P2Y2la zqmnm9hHc+G+0U!s#2=@cqABPNM`NYW_CI9POy11YpwH>-p@js0?r-Ty*;^n|!CS6b z=i>U(1h#@?yTrt?d4}nhBrU#w|9;d@GkQHjBTL;SR!YcY`R|(exJz!ujX}EgVvAAY zgWtpT-(_jQ#$Sc*a1U9un(qno5#X63v}ELgJVNKWCD?4C2&SN2zG%7oDr4kW=eS6T zf`+u2EDRM9?ymy43}yiH*m0mYjv6YtXD_hXV_R8pp8JE5k$7Qt*I1>T*bW$Tmz8he zGwE@rP-(l*s+=+p$e(i8z#dHqwB#527ohYrQK-2q-!I|a?Abx(qvVG@ZF?}*vH`t1 z?k^9c2EwhyCS>5Vh*1A6<+RGp@=@BWYRu7vc=Q26lSO=;(O< zHE+?#vb&3*nGU$)H6hd-M-Oqhvp;1wgRogY2|9@KsE}K8w+bSxAZ{o}kK^i+HxS{= zrjFmgDNCGKO9Ly;$-QlhvJTW7eW;XEl-JsT&FiAktdLgj#)kGT_qfIk#sR05iv z=JiWM2dU!*r!{ns@F2x#s(DH9jm*7!?IN!H@^dmCe+l06h`rHrBRyv`v{^Ua5@($2g zI6U;>x*&Qp94n8eGqH2bCI@shrJg>KIX|{|ex1BgEe-rMkTr7lzL#s$sRA1UxQ}aF zGlh5md|1jB+46OREh64`Iv5}wi@y4Df1t?}wy4u~+T>~G?U4k4%Duj8m}FwzvI2%ML?Mu z!5%H*=4FRv;C_J)b%&=0?lO5~rEs?NH9q7}K!%(R0{!qZoR`hi$2}-I^^cSt74(D% z8nVM*Q8@D5>KzP}3b+eS%C5Y+x*e&el^1m*q-MwpVS?&mpvO;c(jpo90p=_V zZij=rYjF1 z?note^BE)w2~9O@JKY35*^=0mHivKd4Zf0Z9hY8PXG3_=heo*bPh4^~=}%1FE)2}t za|;+}-2Bs{^(N58C@N?$;U8ZP zqkntYlEWAc(uTo-^>`^dt>r6sy}~tjPcI&oI)ii*Mx=yEUo{!xKfJo#o~=Sdp$qJ0 z=U&6TkNz2c6c=tM&Hee|ReO*S_Z~H*o)J~?G3SXN;MNd1!_#X^==?o+B3}xmz6oiR zKFhJ~0WCBV8H$ey1>q_gFGCCDncGrVTHuX=Tzx6%CNyZAFQ~AIHnBOW7D!#t1Mzkh z`aj)V+FRS>V{VjxW3@9X&R1>^-yCNoV#JVvWPh|DqYv_?YEh6{6f!nH z1}h`n|AKJ4?56b?FHGTcFtS;E6s{(BdP1TXKFYZR@QY+1I;PWNrJBByEGbIWm2`R0 z3Wr?n;hVtSm!IUB>Sfw^OqFKR!c+dud&t58Wtw#}0{3@09r0sU&bFICIvl%He`Fh< zPUrFY=3+H|KEZV_9ur*}igB?mCWzlbV3-4I!}A-@X@k8nu}8N`XGD?jPf<iwK)-Kz=W)4$Ald-pPmuEPRs7^+729U}pf$ zs@r9FlF;!dxet@%6Uz^udME?-YnGaxR(>8lc`e=gz2rHEio@z-ZZ21D`(k$;wKE{_ zZ8GQ}CiHvrB>{S6WnrYy)1QG6A>@}dKBu3~P7smmrqh-4o24r2<3M#^^7%e(8ztT1 z3m``+8DB>llK>0nsGFNuCDY06cbg60q9Ad|Q-q+Ba7>+*t|L$D%`>%um7X7)ZqrA+n}>Y_esu;0P$T(BGpU$q}wjyD|K{U(&M9iR~6?AY}`nc-(h4|cWMKvt`_?h;! z?T8JN2J;Bm#2YTij&0VoZjf0Shu2hQ&d^%@c2(QsP}VY-PjIq^)LaPB2uw{2|Df48 z#bLHEH5!V-+}Lg7xBEu&lffuIU5atZ$ukZeoTP}LE2-t%=J>On{-x7DrH&S^ON(;x z%_iUbcfXLl5y>+S*YhaQLyi-EeX{2js^Smp=7eWjVxBK$PQBdEkxULGa~@uy!d&5Z zWcvK$*Q(R1d*9QBNdhiW=PA=;`2IpkisMncdvAm)iQc-~Cb(DxU@97Vm)s7I!SZ?> zURd6PYu?Z7H=QG?ngAwxmV}CZM`ac!CNE@L?`*q(YR;l0jv7W8C54pU9*9PYdsLsv z#~h;66Gk{WGOo|!m-?ryO|Tl&m9WiEe3Ar$%i&AMC=Oh*2brU%JFnOLyeVton-0pR zKA8uNiXTe2_vIMTkiKk>scQt1fKXS?X1Yl!*LGV8K`OGACa+%Ze^lc8>Z7yqK)<4N7&+orbeW2h?IO-XwotkLjQ@LvA9 zUmPPjC*nYFENHi@xxpSeZTV=v>WC<3tUfRrp4lHaH0kF*ugq2je>HV;ol7U+%6zNk zlo-m?N`3bd>$tfYi41-}QGvMwNMfz&O(*qkOaFe8{7?2+gbVQ~_Eh0EdKGrfV90ab zPK%RVg&8$_x|JmbY05eZK2b3e zP;jCclv|26!S-yaxQ)4v9~R&nkzt&>$Hk>pBKiD~(`QB+JU!eh7qz4nYVGgE^Z9#x zdeB8^sjEJ+uD_Q<4PS=8Q~HIvT`Q*VBCE>$ivT(ZK0ktIB-L#Yk@6F@fLq+g`b%aY zJiU8&|D;M70uLpa(kqeI;!fsNj}NBsVAgE!H0 zFE(sREKbnT^jb)zzz#V>M>*_hsHAb5gFp!m5^`*bL`V~9U2p0k?D6?0H$CK zBXzP3nH5oIRv*4uEQ|KmB{C8ac}%@k5_Czr93{t>$>w=T6jEMcpMZEhV2+-H$^E&v z@85L-)-ApyM^8l%yRsm@cyWDfA?LhMJfmHjI`wooEtzR(~EQ}`t zzKQ-=(dGi}a}bX+3%;W>s&|1diqpS$d{CHK(TF)2zK)WdLgvk zS0a>nf~zd8s~#yVd!J{WvU)@M@4$U^pG>Kn6Z`0a`f3gMu|r$Q$|$PyudAnin;)Qs zN=Zio`&Vx7gy`)_%I0OWb6bF2@js~?0^HWyMctwu8Kn;fgG*pw57B67n4S)Uo8SK% zaeVz@whKh7`8NHWm+&N&$0A6B#nXeO3_>?OmI1P!=@4phCG0=6^&zuI?jpf!(UHcl zX)QM{Z{0&DTL=iK#<+LiDx@=4lSLHj8(4s)XOm@-?&aSeP8#3-ZW2KN^ZNPZ&|&v? z<0pR%6eaa-)ee?}#virS4YzYnM|o3W=+)Cv4pO zK_-oo26y1~`U>N&hig%-cPBMFyw{7XPYa*J=4`WgZY`9||DfL=r4)6SP&U*i$h2Jc zC9nlLh#SA!q4fB_uq>`?bA~c;O=w=IUj%wD4Dm|r5}3*fxnP>>(j+h?8Qd2$}f&s zBOl)U2ps~?)DIqymYUrpdRm|9dOBFi$1*S{`$sO@|i9=8ku-o>LG&Ni6 z-=^38`d1;ec-a++8KrPT_RSGT((eUqux*Z&Tnik^xlCnT& z)XhtfaBxI-?$XxwbV0u;yv!6MJ7s801ICV$F_EJ3?2nn;MNuIFx?qdHOB=NKWI;DJ zf!(b)H~S*-OO}2aMNd7IT6CPyydsJ$JYQRTm=Jp$j(pky7CyGxaPmI|rAPT;J!Fq% z_=w21-A(u*$c^4kzq#D*%W*npLhTFX{_)(AZ27v=%)$RA`g@Ie3j3%4UB9c|py6dJ zWQ389+NOD{XqK*Zxb-I4GwBRNQ#=5j`(w8XQD>wb5VzfuxEn~ea58^LpqW69nC^06TV>njA{QYn*$mSqUo<}|R zMmPm3eh1vJFE>+a)t7AiAih0+y5fjSAIq)__I4`7+v`J_Y8K7d+G>%qwl0~4xH&OO zjgrY-Ol?XEFQ2w##IRkuO0*40P9OTNgk}zw9s4Z(1rBfV$}Eo;ovOE=?)cmnzKTne zk!}90=e0tye}ZKt(&x6DM0=IHhh~VO^#ll(Z#6VxFwPgjo#~E~HA;0>g7yo0>;|g6 ztL{<@X`l2NU)qs7ZyCEh)xk!3CUM!_Y1}y7D#!2|85`6~3S8!9wzK}QMPDoUKkUuT z_4sMM{ic3?!wWepZ};-q6<6Y)@Eh|7Z~lEPbV(cZm*X7&X+R((KK$NEzTeXEELu+sRFn)(#V9Y^^t9poHFenXc%<%m;Ej;SUcJnunW&>61Uu6}CIQxgCPHv+aDTAI|O&7P|W7sMU+I=ajkabJ!bJp%Y6% z%bYIGMEdmB$>WDSOH#<1_YB1aCTnWhS2N*x+hf=&hyBN$npy230&~kDH0J=P{fTMp zMWAAra<`hxPFuB1dzr}201+L@%935UsGt8l1ds7J!lRh=J_=y{7it1Y zUsz<@?cHdV)ml*wX?e(|a{>u?-KZ{&l9Fh4Q;*%XmagA`&~b7W0PTPA)Q$jQ<(gd( zBTQ(n2kP{0b-?Luv9*$RZD^<8V?vsmP|Pwu0qm-`Ayr$;k)8d*e(>o7OKE#O9nN}l zbXF{eE)LZ58_ zvYzv7H^nX9HrZC@$mER`x~*36m6Ct&cN5HWvTiCu>a}u{1ignh-S1x(jn3x_do(h~EID`Dr_0>Vf<4R|A-i%mZWZ zPwSW7(+@q*!_j5CR!a5vc99~sSp8S7X`in{_{nru|4-BP(-h{PF-@11o^8QMGC{s| zDB1qk?QRyR7sF0zFGcA!qalqGE|66PW_x=3fy8+mqqCTo!|&al zoTB5LgrDzOg{h3B3RAlYDY9XyMv?3lOX>3HM1geHUflt4X;@mbD;awV7yShcN*9+( zWcaMwF=wTW>Ub5YMH<5=fCt>y*$FR*iB2+X+0iA)?1icJ`vg4_GRnliNFBb7?C6t4 z8;)opz6J38Pt|`5joqQzQ>>X#`?DZyk6SU3$LKKcNx+bNF?cvZS2CO_G@Lr1BEjl( zlIfz0TX^`=Ky~hYPB7#^-C1`7uFCz9j_ck(s!PXh-B}L28_0hkF7mClxE+Ng{YLeq z;Zfe#i4zVZ97B+0++{-eZY}vnDhJT{fv^xBbP!$^Y`za zU=p}2^S_jO9rf|K>>k%Gq;c1mu?8@j!TJdGky(c$2;ou9pUETNz{z%yE8H=^!SBH6 zpgO~m(v2c;DipAJl?XS+9gTPT9s%0!!l(<@JDIfGS`c#+T%kM7fao-fVbMet^2#=e z7;nFiI7@;WTPB%DmV{T)aqA$PpZSs>$$k5I=dE_~dHbshX7i-|mK;Tq@a2`tO}~1| zLIkG>o-b(_SXPWhVy$0|C8B-OL1`r~^haI&p`7ihX7jzlAKW@(QKijUyOULVmGoJ| z8NFBN;4wD0)2PC8s5Fa(>T!XG{w|H%e7yRIsA^tW<@!;Q2HDorc~D3xr{4?+q=vLhw_c^cS4&sF#h^^NR?PUiv|X+;nw9G4 zfVth)MY8MlUPiEv={|S-7uv)^JT{|Dj_)5XzClO2FG(}w=Q8orj*rShfC2&SUQ_j-SjW8y!&JVC)- zd~bQU_Mg&J7wA;y0*Wfi$-0E+n&+{xDZy`Pu8BEVfXHf=X}>+>VB6~h)fszDAf5Be zyq(cVf{vS+VArRbt}p1e#Mm4wb$2iX6DP@>Mfyndkm@p({0K{{>ECf&-3IDZ=K-p= zZ6UQn)NKV7o4iHYkPN9amz+-gOQwOJZb2I~`xO|)#K3$;)DMjgIp1(QLk7i)FqBfw z78{p*H$HX0sWp^DT!EC!(oLIBmAk8zx@C5_;-nv+t4XzB)LF`@bH1N6SKD0kMWY@7 zcD07MM#<;T#o^K9`nn*UWEa72df!B?C&@)^ss8APV4ake+d|y~J0}J#6e8&S zPeHh(XF%v6Ox_OxUG`{CiYjG{bG@rf zkFzE+Ig){hGmo0qcf|;p8`*wbll?8SwTXBp>9)d`WWFNs%A3#=0tkS0FFqv;6h$0WDLQqm-xmOC zG79nvR!mZ}&Ih+m$H%8&mm4!JwDVH+Kqndv&qP;9lEFu9T1o3qf=z|_V+$tfE)!vV z�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